=============================================================================== 0010d6d8 : #define MAXSYMLINK 5 int IMFS_Set_handlers( rtems_filesystem_location_info_t *loc ) { 10d6d8: 55 push %ebp 10d6d9: 89 e5 mov %esp,%ebp 10d6db: 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; 10d6de: 8b 50 10 mov 0x10(%eax),%edx 10d6e1: 8b 52 34 mov 0x34(%edx),%edx switch( node->type ) { 10d6e4: 8b 08 mov (%eax),%ecx 10d6e6: 8b 49 4c mov 0x4c(%ecx),%ecx 10d6e9: 49 dec %ecx 10d6ea: 83 f9 06 cmp $0x6,%ecx 10d6ed: 77 29 ja 10d718 <== NEVER TAKEN 10d6ef: ff 24 8d 2c f3 11 00 jmp *0x11f32c(,%ecx,4) case IMFS_DIRECTORY: loc->handlers = fs_info->directory_handlers; 10d6f6: 8b 52 0c mov 0xc(%edx),%edx 10d6f9: eb 1a jmp 10d715 break; case IMFS_DEVICE: loc->handlers = &IMFS_device_handlers; 10d6fb: c7 40 08 50 f3 11 00 movl $0x11f350,0x8(%eax) break; 10d702: eb 14 jmp 10d718 case IMFS_SYM_LINK: case IMFS_HARD_LINK: loc->handlers = &IMFS_link_handlers; 10d704: c7 40 08 c0 f3 11 00 movl $0x11f3c0,0x8(%eax) break; 10d70b: eb 0b jmp 10d718 case IMFS_LINEAR_FILE: loc->handlers = fs_info->memfile_handlers; break; case IMFS_MEMORY_FILE: loc->handlers = fs_info->memfile_handlers; 10d70d: 8b 52 08 mov 0x8(%edx),%edx 10d710: eb 03 jmp 10d715 break; case IMFS_FIFO: loc->handlers = fs_info->fifo_handlers; 10d712: 8b 52 10 mov 0x10(%edx),%edx 10d715: 89 50 08 mov %edx,0x8(%eax) break; } return 0; } 10d718: 31 c0 xor %eax,%eax 10d71a: c9 leave 10d71b: c3 ret =============================================================================== 0010d58b : IMFS_jnode_types_t type, const char *name, mode_t mode, const IMFS_types_union *info ) { 10d58b: 55 push %ebp 10d58c: 89 e5 mov %esp,%ebp 10d58e: 57 push %edi 10d58f: 56 push %esi 10d590: 53 push %ebx 10d591: 83 ec 1c sub $0x1c,%esp 10d594: 8b 4d 08 mov 0x8(%ebp),%ecx 10d597: 8b 5d 0c mov 0xc(%ebp),%ebx 10d59a: 8b 75 18 mov 0x18(%ebp),%esi /* * MUST have a parent node to call this routine. */ if ( parent_loc == NULL ) return NULL; 10d59d: 31 c0 xor %eax,%eax IMFS_fs_info_t *fs_info; /* * MUST have a parent node to call this routine. */ if ( parent_loc == NULL ) 10d59f: 85 c9 test %ecx,%ecx 10d5a1: 0f 84 f4 00 00 00 je 10d69b <== NEVER TAKEN return NULL; parent = parent_loc->node_access; 10d5a7: 8b 11 mov (%ecx),%edx fs_info = parent_loc->mt_entry->fs_info; 10d5a9: 8b 49 10 mov 0x10(%ecx),%ecx 10d5ac: 8b 79 34 mov 0x34(%ecx),%edi /* * Reject creation of FIFOs if support is disabled. */ if ( type == IMFS_FIFO && 10d5af: 83 fb 07 cmp $0x7,%ebx 10d5b2: 75 0d jne 10d5c1 10d5b4: 81 7f 10 c4 f2 11 00 cmpl $0x11f2c4,0x10(%edi) 10d5bb: 0f 84 da 00 00 00 je 10d69b return NULL; /* * Allocate filesystem node and fill in basic information */ node = IMFS_allocate_node( type, name, mode & ~rtems_filesystem_umask ); 10d5c1: 50 push %eax 10d5c2: a1 80 30 12 00 mov 0x123080,%eax 10d5c7: 8b 40 2c mov 0x2c(%eax),%eax 10d5ca: f7 d0 not %eax 10d5cc: 23 45 14 and 0x14(%ebp),%eax 10d5cf: 50 push %eax 10d5d0: ff 75 10 pushl 0x10(%ebp) 10d5d3: 53 push %ebx 10d5d4: 89 55 e4 mov %edx,-0x1c(%ebp) 10d5d7: e8 40 ff ff ff call 10d51c if ( !node ) 10d5dc: 83 c4 10 add $0x10,%esp 10d5df: 85 c0 test %eax,%eax 10d5e1: 8b 55 e4 mov -0x1c(%ebp),%edx 10d5e4: 0f 84 b1 00 00 00 je 10d69b return NULL; /* * Set the type specific information */ if ( type == IMFS_DIRECTORY ) { 10d5ea: 83 fb 01 cmp $0x1,%ebx 10d5ed: 75 15 jne 10d604 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 ); 10d5ef: 8d 48 54 lea 0x54(%eax),%ecx 10d5f2: 89 48 50 mov %ecx,0x50(%eax) head->next = tail; head->previous = NULL; 10d5f5: 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 ); 10d5fc: 8d 48 50 lea 0x50(%eax),%ecx 10d5ff: 89 48 58 mov %ecx,0x58(%eax) 10d602: eb 75 jmp 10d679 rtems_chain_initialize_empty(&node->info.directory.Entries); } else if ( type == IMFS_HARD_LINK ) { 10d604: 83 fb 03 cmp $0x3,%ebx 10d607: 74 05 je 10d60e node->info.hard_link.link_node = info->hard_link.link_node; } else if ( type == IMFS_SYM_LINK ) { 10d609: 83 fb 04 cmp $0x4,%ebx 10d60c: 75 07 jne 10d615 node->info.sym_link.name = info->sym_link.name; 10d60e: 8b 0e mov (%esi),%ecx 10d610: 89 48 50 mov %ecx,0x50(%eax) 10d613: eb 64 jmp 10d679 } else if ( type == IMFS_DEVICE ) { 10d615: 83 fb 02 cmp $0x2,%ebx 10d618: 75 0d jne 10d627 node->info.device.major = info->device.major; 10d61a: 8b 0e mov (%esi),%ecx 10d61c: 89 48 50 mov %ecx,0x50(%eax) node->info.device.minor = info->device.minor; 10d61f: 8b 4e 04 mov 0x4(%esi),%ecx 10d622: 89 48 54 mov %ecx,0x54(%eax) 10d625: eb 52 jmp 10d679 } else if ( type == IMFS_LINEAR_FILE ) { 10d627: 83 fb 06 cmp $0x6,%ebx 10d62a: 75 17 jne 10d643 node->info.linearfile.size = 0; 10d62c: c7 40 50 00 00 00 00 movl $0x0,0x50(%eax) 10d633: c7 40 54 00 00 00 00 movl $0x0,0x54(%eax) node->info.linearfile.direct = 0; 10d63a: c7 40 58 00 00 00 00 movl $0x0,0x58(%eax) 10d641: eb 36 jmp 10d679 } else if ( type == IMFS_MEMORY_FILE ) { 10d643: 83 fb 05 cmp $0x5,%ebx 10d646: 75 25 jne 10d66d node->info.file.size = 0; 10d648: c7 40 50 00 00 00 00 movl $0x0,0x50(%eax) 10d64f: c7 40 54 00 00 00 00 movl $0x0,0x54(%eax) node->info.file.indirect = 0; 10d656: c7 40 58 00 00 00 00 movl $0x0,0x58(%eax) node->info.file.doubly_indirect = 0; 10d65d: c7 40 5c 00 00 00 00 movl $0x0,0x5c(%eax) node->info.file.triply_indirect = 0; 10d664: c7 40 60 00 00 00 00 movl $0x0,0x60(%eax) 10d66b: eb 0c jmp 10d679 } else if ( type == IMFS_FIFO ) { 10d66d: 83 fb 07 cmp $0x7,%ebx 10d670: 75 07 jne 10d679 <== NEVER TAKEN node->info.fifo.pipe = NULL; 10d672: 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; 10d679: 89 50 08 mov %edx,0x8(%eax) node->st_ino = ++fs_info->ino_count; 10d67c: 8b 4f 04 mov 0x4(%edi),%ecx 10d67f: 41 inc %ecx 10d680: 89 4f 04 mov %ecx,0x4(%edi) 10d683: 89 48 38 mov %ecx,0x38(%eax) 10d686: 53 push %ebx 10d687: 53 push %ebx 10d688: 50 push %eax rtems_chain_append( &parent->info.directory.Entries, &node->Node ); 10d689: 83 c2 50 add $0x50,%edx 10d68c: 52 push %edx 10d68d: 89 45 e4 mov %eax,-0x1c(%ebp) 10d690: e8 4b d3 ff ff call 10a9e0 <_Chain_Append> return node; 10d695: 83 c4 10 add $0x10,%esp 10d698: 8b 45 e4 mov -0x1c(%ebp),%eax } 10d69b: 8d 65 f4 lea -0xc(%ebp),%esp 10d69e: 5b pop %ebx 10d69f: 5e pop %esi 10d6a0: 5f pop %edi 10d6a1: c9 leave 10d6a2: c3 ret =============================================================================== 0010d7b9 : const char *pathname, /* IN */ size_t pathnamelen, /* IN */ int flags, /* IN */ rtems_filesystem_location_info_t *pathloc /* IN/OUT */ ) { 10d7b9: 55 push %ebp 10d7ba: 89 e5 mov %esp,%ebp 10d7bc: 57 push %edi 10d7bd: 56 push %esi 10d7be: 53 push %ebx 10d7bf: 83 ec 5c sub $0x5c,%esp 10d7c2: 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 ) ) { 10d7c5: f7 45 10 f8 ff ff ff testl $0xfffffff8,0x10(%ebp) 10d7cc: 74 0d je 10d7db <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EIO ); 10d7ce: e8 f9 38 00 00 call 1110cc <__errno> <== NOT EXECUTED 10d7d3: c7 00 05 00 00 00 movl $0x5,(%eax) <== NOT EXECUTED 10d7d9: eb 42 jmp 10d81d <== NOT EXECUTED /* * This was filled in by the caller and is valid in the * mount table. */ node = pathloc->node_access; 10d7db: 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; 10d7dd: 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; 10d7e2: 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) ) { 10d7e9: e9 29 01 00 00 jmp 10d917 type = IMFS_get_token( &pathname[i], pathnamelen, token, &len ); 10d7ee: 8d 45 e4 lea -0x1c(%ebp),%eax 10d7f1: 50 push %eax 10d7f2: 8d 4d af lea -0x51(%ebp),%ecx 10d7f5: 51 push %ecx 10d7f6: ff 75 0c pushl 0xc(%ebp) 10d7f9: 8b 45 08 mov 0x8(%ebp),%eax 10d7fc: 03 45 a4 add -0x5c(%ebp),%eax 10d7ff: 50 push %eax 10d800: e8 b3 05 00 00 call 10ddb8 10d805: 89 c6 mov %eax,%esi pathnamelen -= len; 10d807: 8b 55 e4 mov -0x1c(%ebp),%edx i += len; if ( !pathloc->node_access ) 10d80a: 83 c4 10 add $0x10,%esp 10d80d: 83 3b 00 cmpl $0x0,(%ebx) 10d810: 75 13 jne 10d825 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( ENOENT ); 10d812: e8 b5 38 00 00 call 1110cc <__errno> 10d817: c7 00 02 00 00 00 movl $0x2,(%eax) 10d81d: 83 cf ff or $0xffffffff,%edi 10d820: e9 75 01 00 00 jmp 10d99a /* * I cannot move out of this directory without execute permission. */ if ( type != IMFS_NO_MORE_PATH ) 10d825: 85 c0 test %eax,%eax 10d827: 74 21 je 10d84a if ( node->type == IMFS_DIRECTORY ) 10d829: 83 7f 4c 01 cmpl $0x1,0x4c(%edi) 10d82d: 75 1b jne 10d84a if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) ) 10d82f: 57 push %edi 10d830: 57 push %edi 10d831: 6a 01 push $0x1 10d833: 53 push %ebx 10d834: 89 55 a0 mov %edx,-0x60(%ebp) 10d837: e8 e0 fe ff ff call 10d71c 10d83c: 83 c4 10 add $0x10,%esp 10d83f: 85 c0 test %eax,%eax 10d841: 8b 55 a0 mov -0x60(%ebp),%edx 10d844: 0f 84 3e 01 00 00 je 10d988 */ while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) { type = IMFS_get_token( &pathname[i], pathnamelen, token, &len ); pathnamelen -= len; 10d84a: 29 55 0c sub %edx,0xc(%ebp) i += len; 10d84d: 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; 10d850: 8b 3b mov (%ebx),%edi switch( type ) { 10d852: 83 fe 03 cmp $0x3,%esi 10d855: 74 38 je 10d88f 10d857: 83 fe 04 cmp $0x4,%esi 10d85a: 0f 84 a7 00 00 00 je 10d907 10d860: 83 fe 02 cmp $0x2,%esi 10d863: 0f 85 ae 00 00 00 jne 10d917 case IMFS_UP_DIR: /* * Am I at the root of all filesystems? (chroot'ed?) */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) 10d869: a1 80 30 12 00 mov 0x123080,%eax 10d86e: 3b 78 18 cmp 0x18(%eax),%edi 10d871: 0f 84 a0 00 00 00 je 10d917 <== NEVER TAKEN /* * Am I at the root of this mounted filesystem? */ if (pathloc->node_access == pathloc->mt_entry->mt_fs_root.node_access) { 10d877: 8b 43 10 mov 0x10(%ebx),%eax /* * Am I at the root of this mounted filesystem? */ if (pathloc->node_access == 10d87a: 3b 78 1c cmp 0x1c(%eax),%edi 10d87d: 75 0b jne 10d88a */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) { break; /* Throw out the .. in this case */ } else { newloc = pathloc->mt_entry->mt_point_node; 10d87f: 8d 7d d0 lea -0x30(%ebp),%edi 10d882: 8d 70 08 lea 0x8(%eax),%esi 10d885: e9 ad 00 00 00 jmp 10d937 pathnamelen+len, flags,pathloc); } } else { if ( !node->Parent ) 10d88a: 8b 7f 08 mov 0x8(%edi),%edi 10d88d: eb 6c jmp 10d8fb case IMFS_NAME: /* * If we are at a link follow it. */ if ( node->type == IMFS_HARD_LINK ) { 10d88f: 8b 47 4c mov 0x4c(%edi),%eax 10d892: 83 f8 03 cmp $0x3,%eax 10d895: 75 11 jne 10d8a8 IMFS_evaluate_hard_link( pathloc, 0 ); 10d897: 51 push %ecx 10d898: 51 push %ecx 10d899: 6a 00 push $0x0 10d89b: 53 push %ebx 10d89c: e8 d9 fe ff ff call 10d77a node = pathloc->node_access; 10d8a1: 8b 3b mov (%ebx),%edi 10d8a3: 83 c4 10 add $0x10,%esp 10d8a6: eb 1d jmp 10d8c5 * It would be a design error if we evaluated the link and * was broken. */ IMFS_assert( node ); } else if ( node->type == IMFS_SYM_LINK ) { 10d8a8: 83 f8 04 cmp $0x4,%eax 10d8ab: 75 18 jne 10d8c5 result = IMFS_evaluate_sym_link( pathloc, 0 ); 10d8ad: 52 push %edx 10d8ae: 52 push %edx 10d8af: 6a 00 push $0x0 10d8b1: 53 push %ebx 10d8b2: e8 ed 00 00 00 call 10d9a4 /* * In contrast to a hard link, it is possible to have a broken * symbolic link. */ node = pathloc->node_access; 10d8b7: 8b 3b mov (%ebx),%edi if ( result == -1 ) 10d8b9: 83 c4 10 add $0x10,%esp 10d8bc: 83 f8 ff cmp $0xffffffff,%eax 10d8bf: 0f 84 d3 00 00 00 je 10d998 <== NEVER TAKEN } /* * Only a directory can be decended into. */ if ( node->type != IMFS_DIRECTORY ) 10d8c5: 83 7f 4c 01 cmpl $0x1,0x4c(%edi) 10d8c9: 74 10 je 10d8db rtems_set_errno_and_return_minus_one( ENOTDIR ); 10d8cb: e8 fc 37 00 00 call 1110cc <__errno> 10d8d0: c7 00 14 00 00 00 movl $0x14,(%eax) 10d8d6: e9 42 ff ff ff jmp 10d81d /* * 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 ) { 10d8db: 8b 47 5c mov 0x5c(%edi),%eax 10d8de: 85 c0 test %eax,%eax 10d8e0: 74 08 je 10d8ea newloc = node->info.directory.mt_fs->mt_fs_root; 10d8e2: 8d 7d d0 lea -0x30(%ebp),%edi 10d8e5: 8d 70 1c lea 0x1c(%eax),%esi 10d8e8: eb 4d jmp 10d937 } /* * Otherwise find the token name in the present location. */ node = IMFS_find_match_in_dir( node, token ); 10d8ea: 50 push %eax 10d8eb: 50 push %eax 10d8ec: 8d 45 af lea -0x51(%ebp),%eax 10d8ef: 50 push %eax 10d8f0: 57 push %edi 10d8f1: e8 56 04 00 00 call 10dd4c 10d8f6: 89 c7 mov %eax,%edi if ( !node ) 10d8f8: 83 c4 10 add $0x10,%esp 10d8fb: 85 ff test %edi,%edi 10d8fd: 0f 84 0f ff ff ff je 10d812 /* * Set the node access to the point we have found. */ pathloc->node_access = node; 10d903: 89 3b mov %edi,(%ebx) 10d905: eb 10 jmp 10d917 case IMFS_NO_MORE_PATH: case IMFS_CURRENT_DIR: break; case IMFS_INVALID_TOKEN: rtems_set_errno_and_return_minus_one( ENAMETOOLONG ); 10d907: e8 c0 37 00 00 call 1110cc <__errno> 10d90c: c7 00 5b 00 00 00 movl $0x5b,(%eax) 10d912: e9 06 ff ff ff jmp 10d81d /* * Evaluate all tokens until we are done or an error occurs. */ while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) { 10d917: 83 fe 04 cmp $0x4,%esi 10d91a: 74 08 je 10d924 <== NEVER TAKEN 10d91c: 85 f6 test %esi,%esi 10d91e: 0f 85 ca fe ff ff jne 10d7ee * 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 ) { 10d924: 83 7f 4c 01 cmpl $0x1,0x4c(%edi) 10d928: 75 41 jne 10d96b if ( node->info.directory.mt_fs != NULL ) { 10d92a: 8b 77 5c mov 0x5c(%edi),%esi 10d92d: 85 f6 test %esi,%esi 10d92f: 74 3a je 10d96b newloc = node->info.directory.mt_fs->mt_fs_root; 10d931: 8d 7d d0 lea -0x30(%ebp),%edi 10d934: 83 c6 1c add $0x1c,%esi 10d937: b9 05 00 00 00 mov $0x5,%ecx 10d93c: f3 a5 rep movsl %ds:(%esi),%es:(%edi) *pathloc = newloc; 10d93e: 8d 75 d0 lea -0x30(%ebp),%esi 10d941: b1 05 mov $0x5,%cl 10d943: 89 df mov %ebx,%edi 10d945: f3 a5 rep movsl %ds:(%esi),%es:(%edi) return (*pathloc->ops->evalpath_h)( &pathname[i-len], 10d947: 8b 45 e4 mov -0x1c(%ebp),%eax 10d94a: 8b 53 0c mov 0xc(%ebx),%edx 10d94d: 53 push %ebx 10d94e: ff 75 10 pushl 0x10(%ebp) 10d951: 8b 4d 0c mov 0xc(%ebp),%ecx 10d954: 01 c1 add %eax,%ecx 10d956: 51 push %ecx 10d957: 8b 4d a4 mov -0x5c(%ebp),%ecx 10d95a: 29 c1 sub %eax,%ecx 10d95c: 8b 45 08 mov 0x8(%ebp),%eax 10d95f: 01 c8 add %ecx,%eax 10d961: 50 push %eax 10d962: ff 12 call *(%edx) 10d964: 89 c7 mov %eax,%edi 10d966: 83 c4 10 add $0x10,%esp 10d969: eb 2f jmp 10d99a flags, pathloc ); } else { result = IMFS_Set_handlers( pathloc ); } } else { result = IMFS_Set_handlers( pathloc ); 10d96b: 83 ec 0c sub $0xc,%esp 10d96e: 53 push %ebx 10d96f: e8 64 fd ff ff call 10d6d8 10d974: 89 c7 mov %eax,%edi 10d976: 5a pop %edx 10d977: 59 pop %ecx /* * Verify we have the correct permissions for this node. */ if ( !IMFS_evaluate_permission( pathloc, flags ) ) 10d978: ff 75 10 pushl 0x10(%ebp) 10d97b: 53 push %ebx 10d97c: e8 9b fd ff ff call 10d71c 10d981: 83 c4 10 add $0x10,%esp 10d984: 85 c0 test %eax,%eax 10d986: 75 12 jne 10d99a rtems_set_errno_and_return_minus_one( EACCES ); 10d988: e8 3f 37 00 00 call 1110cc <__errno> 10d98d: c7 00 0d 00 00 00 movl $0xd,(%eax) 10d993: e9 85 fe ff ff jmp 10d81d 10d998: 89 c7 mov %eax,%edi <== NOT EXECUTED return result; } 10d99a: 89 f8 mov %edi,%eax 10d99c: 8d 65 f4 lea -0xc(%ebp),%esp 10d99f: 5b pop %ebx 10d9a0: 5e pop %esi 10d9a1: 5f pop %edi 10d9a2: c9 leave 10d9a3: c3 ret =============================================================================== 0010da98 : int IMFS_evaluate_for_make( const char *path, /* IN */ rtems_filesystem_location_info_t *pathloc, /* IN/OUT */ const char **name /* OUT */ ) { 10da98: 55 push %ebp 10da99: 89 e5 mov %esp,%ebp 10da9b: 57 push %edi 10da9c: 56 push %esi 10da9d: 53 push %ebx 10da9e: 83 ec 5c sub $0x5c,%esp 10daa1: 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; 10daa4: 8b 1a mov (%edx),%ebx /* * Get the path length. */ pathlen = strlen( path ); 10daa6: 31 c0 xor %eax,%eax 10daa8: 83 c9 ff or $0xffffffff,%ecx 10daab: 8b 7d 08 mov 0x8(%ebp),%edi 10daae: f2 ae repnz scas %es:(%edi),%al 10dab0: f7 d1 not %ecx 10dab2: 49 dec %ecx 10dab3: 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; 10dab6: 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 ); 10dabd: 8d 7d af lea -0x51(%ebp),%edi 10dac0: 89 d6 mov %edx,%esi 10dac2: 8d 45 e4 lea -0x1c(%ebp),%eax 10dac5: 50 push %eax 10dac6: 57 push %edi 10dac7: ff 75 a0 pushl -0x60(%ebp) 10daca: 8b 45 08 mov 0x8(%ebp),%eax 10dacd: 03 45 a4 add -0x5c(%ebp),%eax 10dad0: 50 push %eax 10dad1: e8 e2 02 00 00 call 10ddb8 10dad6: 89 c2 mov %eax,%edx pathlen -= len; 10dad8: 8b 4d e4 mov -0x1c(%ebp),%ecx 10dadb: 29 4d a0 sub %ecx,-0x60(%ebp) i += len; if ( !pathloc->node_access ) 10dade: 83 c4 10 add $0x10,%esp 10dae1: 83 3e 00 cmpl $0x0,(%esi) 10dae4: 0f 84 79 01 00 00 je 10dc63 <== NEVER TAKEN /* * I cannot move out of this directory without execute permission. */ if ( type != IMFS_NO_MORE_PATH ) 10daea: 85 c0 test %eax,%eax 10daec: 74 36 je 10db24 if ( node->type == IMFS_DIRECTORY ) 10daee: 83 7b 4c 01 cmpl $0x1,0x4c(%ebx) 10daf2: 75 30 jne 10db24 if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) ) 10daf4: 53 push %ebx 10daf5: 53 push %ebx 10daf6: 6a 01 push $0x1 10daf8: 56 push %esi 10daf9: 89 45 9c mov %eax,-0x64(%ebp) 10dafc: 89 4d 98 mov %ecx,-0x68(%ebp) 10daff: e8 18 fc ff ff call 10d71c 10db04: 83 c4 10 add $0x10,%esp 10db07: 85 c0 test %eax,%eax 10db09: 8b 55 9c mov -0x64(%ebp),%edx 10db0c: 8b 4d 98 mov -0x68(%ebp),%ecx 10db0f: 75 13 jne 10db24 rtems_set_errno_and_return_minus_one( EACCES ); 10db11: e8 b6 35 00 00 call 1110cc <__errno> 10db16: c7 00 0d 00 00 00 movl $0xd,(%eax) 10db1c: 83 cb ff or $0xffffffff,%ebx 10db1f: e9 99 01 00 00 jmp 10dcbd while( !done ) { type = IMFS_get_token( &path[i], pathlen, token, &len ); pathlen -= len; i += len; 10db24: 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; 10db27: 8b 1e mov (%esi),%ebx switch( type ) { 10db29: 83 fa 02 cmp $0x2,%edx 10db2c: 74 1f je 10db4d 10db2e: 77 0a ja 10db3a 10db30: 85 d2 test %edx,%edx 10db32: 0f 84 d9 00 00 00 je 10dc11 10db38: eb 88 jmp 10dac2 10db3a: 83 fa 03 cmp $0x3,%edx 10db3d: 74 40 je 10db7f 10db3f: 83 fa 04 cmp $0x4,%edx 10db42: 0f 85 7a ff ff ff jne 10dac2 <== NEVER TAKEN 10db48: e9 d4 00 00 00 jmp 10dc21 case IMFS_UP_DIR: /* * Am I at the root of all filesystems? (chroot'ed?) */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) 10db4d: a1 80 30 12 00 mov 0x123080,%eax 10db52: 3b 58 18 cmp 0x18(%eax),%ebx 10db55: 0f 84 67 ff ff ff je 10dac2 /* * Am I at the root of this mounted filesystem? */ if (pathloc->node_access == pathloc->mt_entry->mt_fs_root.node_access){ 10db5b: 8b 46 10 mov 0x10(%esi),%eax 10db5e: 3b 58 1c cmp 0x1c(%eax),%ebx 10db61: 75 0c jne 10db6f 10db63: 89 f2 mov %esi,%edx 10db65: 89 c6 mov %eax,%esi if ( pathloc->node_access == rtems_filesystem_root.node_access ) { break; } else { newloc = pathloc->mt_entry->mt_point_node; 10db67: 8d 7d d0 lea -0x30(%ebp),%edi 10db6a: 83 c6 08 add $0x8,%esi 10db6d: eb 5a jmp 10dbc9 *pathloc = newloc; return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name ); } } else { if ( !node->Parent ) 10db6f: 8b 5b 08 mov 0x8(%ebx),%ebx 10db72: 85 db test %ebx,%ebx 10db74: 0f 85 90 00 00 00 jne 10dc0a 10db7a: e9 e4 00 00 00 jmp 10dc63 pathloc->node_access = node; break; case IMFS_NAME: if ( node->type == IMFS_HARD_LINK ) { 10db7f: 8b 43 4c mov 0x4c(%ebx),%eax 10db82: 83 f8 03 cmp $0x3,%eax 10db85: 74 05 je 10db8c result = IMFS_evaluate_link( pathloc, 0 ); if ( result == -1 ) return -1; } else if ( node->type == IMFS_SYM_LINK ) { 10db87: 83 f8 04 cmp $0x4,%eax 10db8a: 75 16 jne 10dba2 result = IMFS_evaluate_link( pathloc, 0 ); 10db8c: 50 push %eax 10db8d: 50 push %eax 10db8e: 6a 00 push $0x0 10db90: 56 push %esi 10db91: e8 7f fe ff ff call 10da15 if ( result == -1 ) 10db96: 83 c4 10 add $0x10,%esp 10db99: 83 f8 ff cmp $0xffffffff,%eax 10db9c: 0f 84 19 01 00 00 je 10dcbb <== NEVER TAKEN return -1; } node = pathloc->node_access; 10dba2: 8b 06 mov (%esi),%eax if ( !node ) 10dba4: 85 c0 test %eax,%eax 10dba6: 0f 84 e9 00 00 00 je 10dc95 <== NEVER TAKEN /* * Only a directory can be decended into. */ if ( node->type != IMFS_DIRECTORY ) 10dbac: 83 78 4c 01 cmpl $0x1,0x4c(%eax) 10dbb0: 0f 85 df 00 00 00 jne 10dc95 /* * 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 ) { 10dbb6: 8b 50 5c mov 0x5c(%eax),%edx 10dbb9: 85 d2 test %edx,%edx 10dbbb: 74 3b je 10dbf8 10dbbd: 89 f0 mov %esi,%eax 10dbbf: 89 d6 mov %edx,%esi 10dbc1: 89 c2 mov %eax,%edx newloc = node->info.directory.mt_fs->mt_fs_root; 10dbc3: 8d 7d d0 lea -0x30(%ebp),%edi 10dbc6: 83 c6 1c add $0x1c,%esi 10dbc9: b9 05 00 00 00 mov $0x5,%ecx 10dbce: f3 a5 rep movsl %ds:(%esi),%es:(%edi) *pathloc = newloc; 10dbd0: 8d 75 d0 lea -0x30(%ebp),%esi 10dbd3: b1 05 mov $0x5,%cl 10dbd5: 89 d7 mov %edx,%edi 10dbd7: f3 a5 rep movsl %ds:(%esi),%es:(%edi) return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name ); 10dbd9: 56 push %esi 10dbda: 8b 42 0c mov 0xc(%edx),%eax 10dbdd: ff 75 10 pushl 0x10(%ebp) 10dbe0: 52 push %edx 10dbe1: 8b 55 a4 mov -0x5c(%ebp),%edx 10dbe4: 2b 55 e4 sub -0x1c(%ebp),%edx 10dbe7: 03 55 08 add 0x8(%ebp),%edx 10dbea: 52 push %edx 10dbeb: ff 50 04 call *0x4(%eax) 10dbee: 89 c3 mov %eax,%ebx 10dbf0: 83 c4 10 add $0x10,%esp 10dbf3: e9 c5 00 00 00 jmp 10dcbd /* * Otherwise find the token name in the present location. */ node = IMFS_find_match_in_dir( node, token ); 10dbf8: 53 push %ebx 10dbf9: 53 push %ebx 10dbfa: 57 push %edi 10dbfb: 50 push %eax 10dbfc: e8 4b 01 00 00 call 10dd4c 10dc01: 89 c3 mov %eax,%ebx /* * If there is no node we have found the name of the node we * wish to create. */ if ( ! node ) 10dc03: 83 c4 10 add $0x10,%esp 10dc06: 85 c0 test %eax,%eax 10dc08: 74 27 je 10dc31 done = true; else pathloc->node_access = node; 10dc0a: 89 1e mov %ebx,(%esi) 10dc0c: e9 b1 fe ff ff jmp 10dac2 break; case IMFS_NO_MORE_PATH: rtems_set_errno_and_return_minus_one( EEXIST ); 10dc11: e8 b6 34 00 00 call 1110cc <__errno> 10dc16: c7 00 11 00 00 00 movl $0x11,(%eax) 10dc1c: e9 fb fe ff ff jmp 10db1c break; case IMFS_INVALID_TOKEN: rtems_set_errno_and_return_minus_one( ENAMETOOLONG ); 10dc21: e8 a6 34 00 00 call 1110cc <__errno> 10dc26: c7 00 5b 00 00 00 movl $0x5b,(%eax) 10dc2c: e9 eb fe ff ff jmp 10db1c 10dc31: 89 f2 mov %esi,%edx case IMFS_CURRENT_DIR: break; } } *name = &path[ i - len ]; 10dc33: 8b 45 a4 mov -0x5c(%ebp),%eax 10dc36: 2b 45 e4 sub -0x1c(%ebp),%eax 10dc39: 03 45 08 add 0x8(%ebp),%eax 10dc3c: 8b 4d 10 mov 0x10(%ebp),%ecx 10dc3f: 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( 10dc41: 8b 5d 08 mov 0x8(%ebp),%ebx 10dc44: 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++) { 10dc47: eb 2a jmp 10dc73 if ( !IMFS_is_separator( path[ i ] ) ) 10dc49: 83 ec 0c sub $0xc,%esp 10dc4c: 0f be c0 movsbl %al,%eax 10dc4f: 50 push %eax 10dc50: 89 55 9c mov %edx,-0x64(%ebp) 10dc53: e8 a8 a3 ff ff call 108000 10dc58: 43 inc %ebx 10dc59: 83 c4 10 add $0x10,%esp 10dc5c: 85 c0 test %eax,%eax 10dc5e: 8b 55 9c mov -0x64(%ebp),%edx 10dc61: 75 10 jne 10dc73 rtems_set_errno_and_return_minus_one( ENOENT ); 10dc63: e8 64 34 00 00 call 1110cc <__errno> 10dc68: c7 00 02 00 00 00 movl $0x2,(%eax) 10dc6e: e9 a9 fe ff ff jmp 10db1c /* * 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++) { 10dc73: 8a 03 mov (%ebx),%al 10dc75: 84 c0 test %al,%al 10dc77: 75 d0 jne 10dc49 /* * Verify we can execute and write to this directory. */ result = IMFS_Set_handlers( pathloc ); 10dc79: 83 ec 0c sub $0xc,%esp 10dc7c: 52 push %edx 10dc7d: 89 55 9c mov %edx,-0x64(%ebp) 10dc80: e8 53 fa ff ff call 10d6d8 10dc85: 89 c3 mov %eax,%ebx /* * The returned node must be a directory */ node = pathloc->node_access; if ( node->type != IMFS_DIRECTORY ) 10dc87: 8b 55 9c mov -0x64(%ebp),%edx 10dc8a: 8b 02 mov (%edx),%eax 10dc8c: 83 c4 10 add $0x10,%esp 10dc8f: 83 78 4c 01 cmpl $0x1,0x4c(%eax) 10dc93: 74 10 je 10dca5 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( ENOTDIR ); 10dc95: e8 32 34 00 00 call 1110cc <__errno> 10dc9a: c7 00 14 00 00 00 movl $0x14,(%eax) 10dca0: e9 77 fe ff ff jmp 10db1c /* * We must have Write and execute permission on the returned node. */ if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_WX ) ) 10dca5: 51 push %ecx 10dca6: 51 push %ecx 10dca7: 6a 03 push $0x3 10dca9: 52 push %edx 10dcaa: e8 6d fa ff ff call 10d71c 10dcaf: 83 c4 10 add $0x10,%esp 10dcb2: 85 c0 test %eax,%eax 10dcb4: 75 07 jne 10dcbd 10dcb6: e9 56 fe ff ff jmp 10db11 10dcbb: 89 c3 mov %eax,%ebx <== NOT EXECUTED rtems_set_errno_and_return_minus_one( EACCES ); return result; } 10dcbd: 89 d8 mov %ebx,%eax 10dcbf: 8d 65 f4 lea -0xc(%ebp),%esp 10dcc2: 5b pop %ebx 10dcc3: 5e pop %esi 10dcc4: 5f pop %edi 10dcc5: c9 leave 10dcc6: c3 ret =============================================================================== 0010d71c : */ int IMFS_evaluate_permission( rtems_filesystem_location_info_t *node, int flags ) { 10d71c: 55 push %ebp 10d71d: 89 e5 mov %esp,%ebp 10d71f: 57 push %edi 10d720: 56 push %esi 10d721: 53 push %ebx 10d722: 83 ec 0c sub $0xc,%esp 10d725: 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 ) ) 10d728: f7 c6 f8 ff ff ff test $0xfffffff8,%esi 10d72e: 74 10 je 10d740 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EPERM ); 10d730: e8 97 39 00 00 call 1110cc <__errno> <== NOT EXECUTED 10d735: c7 00 01 00 00 00 movl $0x1,(%eax) <== NOT EXECUTED 10d73b: 83 c8 ff or $0xffffffff,%eax <== NOT EXECUTED 10d73e: eb 32 jmp 10d772 <== NOT EXECUTED jnode = node->node_access; 10d740: 8b 45 08 mov 0x8(%ebp),%eax 10d743: 8b 18 mov (%eax),%ebx #if defined(RTEMS_POSIX_API) st_uid = geteuid(); 10d745: e8 2e 0a 00 00 call 10e178 10d74a: 89 c7 mov %eax,%edi st_gid = getegid(); 10d74c: e8 17 0a 00 00 call 10e168 * Check if I am owner or a group member or someone else. */ flags_to_test = flags; if ( st_uid == jnode->st_uid ) 10d751: 66 3b 7b 3c cmp 0x3c(%ebx),%di 10d755: 75 05 jne 10d75c flags_to_test <<= 6; 10d757: c1 e6 06 shl $0x6,%esi 10d75a: eb 09 jmp 10d765 else if ( st_gid == jnode->st_gid ) 10d75c: 66 3b 43 3e cmp 0x3e(%ebx),%ax 10d760: 75 03 jne 10d765 <== NEVER TAKEN flags_to_test <<= 3; 10d762: 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 ) 10d765: 8b 43 30 mov 0x30(%ebx),%eax 10d768: 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 ); 10d76a: 39 f0 cmp %esi,%eax 10d76c: 0f 94 c0 sete %al 10d76f: 0f b6 c0 movzbl %al,%eax */ if ( ( flags_to_test & jnode->st_mode) == flags_to_test ) return 1; return 0; } 10d772: 83 c4 0c add $0xc,%esp 10d775: 5b pop %ebx 10d776: 5e pop %esi 10d777: 5f pop %edi 10d778: c9 leave 10d779: c3 ret =============================================================================== 00107b68 : rtems_off64_t IMFS_fifo_lseek( rtems_libio_t *iop, rtems_off64_t offset, int whence ) { 107b68: 55 push %ebp 107b69: 89 e5 mov %esp,%ebp 107b6b: 53 push %ebx 107b6c: 83 ec 10 sub $0x10,%esp 107b6f: 8b 45 08 mov 0x8(%ebp),%eax off_t err = pipe_lseek(LIBIO2PIPE(iop), offset, whence, iop); 107b72: 50 push %eax 107b73: ff 75 14 pushl 0x14(%ebp) 107b76: ff 75 10 pushl 0x10(%ebp) 107b79: ff 75 0c pushl 0xc(%ebp) 107b7c: 8b 40 18 mov 0x18(%eax),%eax 107b7f: ff 70 50 pushl 0x50(%eax) 107b82: e8 ca 86 00 00 call 110251 107b87: 89 c3 mov %eax,%ebx IMFS_FIFO_RETURN(err); 107b89: 83 c4 20 add $0x20,%esp 107b8c: 99 cltd 107b8d: 85 d2 test %edx,%edx 107b8f: 79 0e jns 107b9f <== NEVER TAKEN 107b91: e8 56 b3 00 00 call 112eec <__errno> 107b96: f7 db neg %ebx 107b98: 89 18 mov %ebx,(%eax) 107b9a: 83 c8 ff or $0xffffffff,%eax 107b9d: 89 c2 mov %eax,%edx } 107b9f: 8b 5d fc mov -0x4(%ebp),%ebx 107ba2: c9 leave 107ba3: c3 ret =============================================================================== 00107c04 : ssize_t IMFS_fifo_write( rtems_libio_t *iop, const void *buffer, size_t count ) { 107c04: 55 push %ebp 107c05: 89 e5 mov %esp,%ebp 107c07: 56 push %esi 107c08: 53 push %ebx 107c09: 83 ec 10 sub $0x10,%esp 107c0c: 8b 45 08 mov 0x8(%ebp),%eax IMFS_jnode_t *jnode = iop->pathinfo.node_access; 107c0f: 8b 70 18 mov 0x18(%eax),%esi int err = pipe_write(JNODE2PIPE(jnode), buffer, count, iop); 107c12: 50 push %eax 107c13: ff 75 10 pushl 0x10(%ebp) 107c16: ff 75 0c pushl 0xc(%ebp) 107c19: ff 76 50 pushl 0x50(%esi) 107c1c: e8 2c 84 00 00 call 11004d 107c21: 89 c3 mov %eax,%ebx if (err > 0) { 107c23: 83 c4 10 add $0x10,%esp 107c26: 83 f8 00 cmp $0x0,%eax 107c29: 7e 1d jle 107c48 IMFS_mtime_ctime_update(jnode); 107c2b: 50 push %eax 107c2c: 50 push %eax 107c2d: 6a 00 push $0x0 107c2f: 8d 45 f0 lea -0x10(%ebp),%eax 107c32: 50 push %eax 107c33: e8 ec 0d 00 00 call 108a24 107c38: 8b 45 f0 mov -0x10(%ebp),%eax 107c3b: 89 46 44 mov %eax,0x44(%esi) 107c3e: 89 46 48 mov %eax,0x48(%esi) 107c41: 83 c4 10 add $0x10,%esp 107c44: 89 d8 mov %ebx,%eax 107c46: eb 13 jmp 107c5b } IMFS_FIFO_RETURN(err); 107c48: b8 00 00 00 00 mov $0x0,%eax 107c4d: 74 0c je 107c5b <== NEVER TAKEN 107c4f: e8 98 b2 00 00 call 112eec <__errno> 107c54: f7 db neg %ebx 107c56: 89 18 mov %ebx,(%eax) 107c58: 83 c8 ff or $0xffffffff,%eax } 107c5b: 8d 65 f8 lea -0x8(%ebp),%esp 107c5e: 5b pop %ebx 107c5f: 5e pop %esi 107c60: c9 leave 107c61: c3 ret =============================================================================== 0010dd4c : IMFS_jnode_t *IMFS_find_match_in_dir( IMFS_jnode_t *directory, char *name ) { 10dd4c: 55 push %ebp 10dd4d: 89 e5 mov %esp,%ebp 10dd4f: 57 push %edi 10dd50: 56 push %esi 10dd51: 53 push %ebx 10dd52: 83 ec 14 sub $0x14,%esp 10dd55: 8b 5d 08 mov 0x8(%ebp),%ebx 10dd58: 8b 7d 0c mov 0xc(%ebp),%edi /* * Check for "." and ".." */ if ( !strcmp( name, dotname ) ) 10dd5b: 68 48 f3 11 00 push $0x11f348 10dd60: 57 push %edi 10dd61: e8 26 40 00 00 call 111d8c 10dd66: 83 c4 10 add $0x10,%esp 10dd69: 85 c0 test %eax,%eax 10dd6b: 74 40 je 10ddad <== NEVER TAKEN return directory; if ( !strcmp( name, dotdotname ) ) 10dd6d: 51 push %ecx 10dd6e: 51 push %ecx 10dd6f: 68 4a f3 11 00 push $0x11f34a 10dd74: 57 push %edi 10dd75: e8 12 40 00 00 call 111d8c 10dd7a: 83 c4 10 add $0x10,%esp 10dd7d: 85 c0 test %eax,%eax 10dd7f: 75 05 jne 10dd86 <== ALWAYS TAKEN return directory->Parent; 10dd81: 8b 5b 08 mov 0x8(%ebx),%ebx <== NOT EXECUTED 10dd84: eb 27 jmp 10ddad <== NOT EXECUTED if ( !strcmp( name, the_jnode->name ) ) return the_jnode; } return 0; } 10dd86: 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)); 10dd89: 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 ); 10dd8c: eb 15 jmp 10dda3 !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 ) ) 10dd8e: 8d 46 0c lea 0xc(%esi),%eax 10dd91: 52 push %edx 10dd92: 52 push %edx 10dd93: 50 push %eax 10dd94: 57 push %edi 10dd95: e8 f2 3f 00 00 call 111d8c 10dd9a: 83 c4 10 add $0x10,%esp 10dd9d: 85 c0 test %eax,%eax 10dd9f: 74 0a je 10ddab 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 ) { 10dda1: 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 ); 10dda3: 39 de cmp %ebx,%esi 10dda5: 75 e7 jne 10dd8e if ( !strcmp( name, the_jnode->name ) ) return the_jnode; } return 0; 10dda7: 31 db xor %ebx,%ebx 10dda9: eb 02 jmp 10ddad 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; 10ddab: 89 f3 mov %esi,%ebx if ( !strcmp( name, the_jnode->name ) ) return the_jnode; } return 0; } 10ddad: 89 d8 mov %ebx,%eax 10ddaf: 8d 65 f4 lea -0xc(%ebp),%esp 10ddb2: 5b pop %ebx 10ddb3: 5e pop %esi 10ddb4: 5f pop %edi 10ddb5: c9 leave 10ddb6: c3 ret =============================================================================== 0010dcc8 : ((IMFS_jnode_t *)( rtems_chain_head( jnode_get_control( jnode ) )->next)) int IMFS_fsunmount( rtems_filesystem_mount_table_entry_t *temp_mt_entry ) { 10dcc8: 55 push %ebp 10dcc9: 89 e5 mov %esp,%ebp 10dccb: 57 push %edi 10dccc: 56 push %esi 10dccd: 53 push %ebx 10dcce: 83 ec 2c sub $0x2c,%esp 10dcd1: 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; 10dcd4: 8b 58 1c mov 0x1c(%eax),%ebx loc = temp_mt_entry->mt_fs_root; 10dcd7: 8d 7d d4 lea -0x2c(%ebp),%edi 10dcda: 8d 70 1c lea 0x1c(%eax),%esi 10dcdd: b9 05 00 00 00 mov $0x5,%ecx 10dce2: 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; 10dce4: c7 40 1c 00 00 00 00 movl $0x0,0x1c(%eax) do { next = jnode->Parent; loc.node_access = (void *)jnode; IMFS_Set_handlers( &loc ); 10dceb: 8d 75 d4 lea -0x2c(%ebp),%esi */ temp_mt_entry->mt_fs_root.node_access = NULL; do { next = jnode->Parent; 10dcee: 8b 7b 08 mov 0x8(%ebx),%edi loc.node_access = (void *)jnode; 10dcf1: 89 5d d4 mov %ebx,-0x2c(%ebp) IMFS_Set_handlers( &loc ); 10dcf4: 83 ec 0c sub $0xc,%esp 10dcf7: 56 push %esi 10dcf8: e8 db f9 ff ff call 10d6d8 if ( jnode->type != IMFS_DIRECTORY ) { 10dcfd: 83 c4 10 add $0x10,%esp 10dd00: 83 7b 4c 01 cmpl $0x1,0x4c(%ebx) 10dd04: 75 08 jne 10dd0e RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); 10dd06: 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 ) ) { 10dd09: 39 43 50 cmp %eax,0x50(%ebx) 10dd0c: 75 13 jne 10dd21 result = IMFS_unlink( NULL, &loc ); 10dd0e: 50 push %eax 10dd0f: 50 push %eax 10dd10: 56 push %esi 10dd11: 6a 00 push $0x0 10dd13: e8 cc 91 ff ff call 106ee4 if (result != 0) 10dd18: 83 c4 10 add $0x10,%esp 10dd1b: 85 c0 test %eax,%eax 10dd1d: 75 1e jne 10dd3d <== NEVER TAKEN return -1; jnode = next; 10dd1f: 89 fb mov %edi,%ebx } if ( jnode != NULL ) { 10dd21: 85 db test %ebx,%ebx 10dd23: 74 1d je 10dd42 if ( jnode->type == IMFS_DIRECTORY ) { 10dd25: 83 7b 4c 01 cmpl $0x1,0x4c(%ebx) 10dd29: 75 c3 jne 10dcee <== NEVER TAKEN } } } while (jnode != NULL); return 0; } 10dd2b: 8b 43 50 mov 0x50(%ebx),%eax 10dd2e: 8d 53 54 lea 0x54(%ebx),%edx return -1; jnode = next; } if ( jnode != NULL ) { if ( jnode->type == IMFS_DIRECTORY ) { if ( jnode_has_children( jnode ) ) 10dd31: 39 d0 cmp %edx,%eax 10dd33: 74 b9 je 10dcee jnode = jnode_get_first_child( jnode ); 10dd35: 89 c3 mov %eax,%ebx } } } while (jnode != NULL); 10dd37: 85 c0 test %eax,%eax 10dd39: 75 b3 jne 10dcee <== ALWAYS TAKEN 10dd3b: eb 05 jmp 10dd42 return -1; jnode = next; } else if ( jnode_has_no_children( jnode ) ) { result = IMFS_unlink( NULL, &loc ); if (result != 0) return -1; 10dd3d: 83 c8 ff or $0xffffffff,%eax <== NOT EXECUTED 10dd40: eb 02 jmp 10dd44 <== NOT EXECUTED jnode = jnode_get_first_child( jnode ); } } } while (jnode != NULL); return 0; 10dd42: 31 c0 xor %eax,%eax } 10dd44: 8d 65 f4 lea -0xc(%ebp),%esp 10dd47: 5b pop %ebx 10dd48: 5e pop %esi 10dd49: 5f pop %edi 10dd4a: c9 leave 10dd4b: c3 ret =============================================================================== 0010ddb8 : const char *path, int pathlen, char *token, int *token_len ) { 10ddb8: 55 push %ebp 10ddb9: 89 e5 mov %esp,%ebp 10ddbb: 57 push %edi 10ddbc: 56 push %esi 10ddbd: 53 push %ebx 10ddbe: 83 ec 1c sub $0x1c,%esp 10ddc1: 8b 7d 08 mov 0x8(%ebp),%edi 10ddc4: 8b 75 10 mov 0x10(%ebp),%esi register char c; /* * Copy a name into token. (Remember NULL is a token.) */ c = path[i]; 10ddc7: 8a 17 mov (%edi),%dl int pathlen, char *token, int *token_len ) { register int i = 0; 10ddc9: 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) ) { 10ddcb: eb 10 jmp 10dddd token[i] = c; 10ddcd: 88 14 1e mov %dl,(%esi,%ebx,1) if ( i == IMFS_NAME_MAX ) 10ddd0: 83 fb 20 cmp $0x20,%ebx 10ddd3: 0f 84 86 00 00 00 je 10de5f return IMFS_INVALID_TOKEN; if ( !IMFS_is_valid_name_char(c) ) type = IMFS_INVALID_TOKEN; c = path [++i]; 10ddd9: 43 inc %ebx 10ddda: 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) ) { 10dddd: 83 ec 0c sub $0xc,%esp 10dde0: 0f be c2 movsbl %dl,%eax 10dde3: 50 push %eax 10dde4: 88 55 e4 mov %dl,-0x1c(%ebp) 10dde7: e8 14 a2 ff ff call 108000 10ddec: 83 c4 10 add $0x10,%esp 10ddef: 85 c0 test %eax,%eax 10ddf1: 8a 55 e4 mov -0x1c(%ebp),%dl 10ddf4: 75 05 jne 10ddfb 10ddf6: 3b 5d 0c cmp 0xc(%ebp),%ebx 10ddf9: 7c d2 jl 10ddcd /* * Copy a seperator into token. */ if ( i == 0 ) { 10ddfb: 85 db test %ebx,%ebx 10ddfd: 75 10 jne 10de0f token[i] = c; 10ddff: 88 16 mov %dl,(%esi) if ( (token[i] != '\0') && pathlen ) { 10de01: 84 d2 test %dl,%dl 10de03: 74 06 je 10de0b 10de05: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) 10de09: 75 16 jne 10de21 i++; type = IMFS_CURRENT_DIR; } else { type = IMFS_NO_MORE_PATH; 10de0b: 31 ff xor %edi,%edi 10de0d: eb 1c jmp 10de2b char *token, int *token_len ) { register int i = 0; IMFS_token_types type = IMFS_NAME; 10de0f: 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') { 10de14: 80 7c 1e ff 00 cmpb $0x0,-0x1(%esi,%ebx,1) 10de19: 74 10 je 10de2b <== NEVER TAKEN token[i] = '\0'; 10de1b: c6 04 1e 00 movb $0x0,(%esi,%ebx,1) 10de1f: eb 0a jmp 10de2b if ( i == 0 ) { token[i] = c; if ( (token[i] != '\0') && pathlen ) { i++; type = IMFS_CURRENT_DIR; 10de21: bf 01 00 00 00 mov $0x1,%edi if ( i == 0 ) { token[i] = c; if ( (token[i] != '\0') && pathlen ) { i++; 10de26: bb 01 00 00 00 mov $0x1,%ebx /* * Set token_len to the number of characters copied. */ *token_len = i; 10de2b: 8b 45 14 mov 0x14(%ebp),%eax 10de2e: 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 ) { 10de30: 83 ff 03 cmp $0x3,%edi 10de33: 75 3d jne 10de72 if ( strcmp( token, "..") == 0 ) 10de35: 52 push %edx 10de36: 52 push %edx 10de37: 68 4d f3 11 00 push $0x11f34d 10de3c: 56 push %esi 10de3d: e8 4a 3f 00 00 call 111d8c 10de42: 83 c4 10 add $0x10,%esp 10de45: 85 c0 test %eax,%eax 10de47: 74 1d je 10de66 type = IMFS_UP_DIR; else if ( strcmp( token, "." ) == 0 ) 10de49: 50 push %eax 10de4a: 50 push %eax 10de4b: 68 4e f3 11 00 push $0x11f34e 10de50: 56 push %esi 10de51: e8 36 3f 00 00 call 111d8c 10de56: 83 c4 10 add $0x10,%esp 10de59: 85 c0 test %eax,%eax 10de5b: 74 10 je 10de6d 10de5d: eb 13 jmp 10de72 while ( (!IMFS_is_separator(c)) && (i < pathlen) && (i <= IMFS_NAME_MAX) ) { token[i] = c; if ( i == IMFS_NAME_MAX ) return IMFS_INVALID_TOKEN; 10de5f: bf 04 00 00 00 mov $0x4,%edi 10de64: eb 0c jmp 10de72 * it was a special name. */ if ( type == IMFS_NAME ) { if ( strcmp( token, "..") == 0 ) type = IMFS_UP_DIR; 10de66: bf 02 00 00 00 mov $0x2,%edi 10de6b: eb 05 jmp 10de72 else if ( strcmp( token, "." ) == 0 ) type = IMFS_CURRENT_DIR; 10de6d: bf 01 00 00 00 mov $0x1,%edi } return type; } 10de72: 89 f8 mov %edi,%eax 10de74: 8d 65 f4 lea -0xc(%ebp),%esp 10de77: 5b pop %ebx 10de78: 5e pop %esi 10de79: 5f pop %edi 10de7a: c9 leave 10de7b: c3 ret =============================================================================== 00106b7c : 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 ) { 106b7c: 55 push %ebp 106b7d: 89 e5 mov %esp,%ebp 106b7f: 57 push %edi 106b80: 56 push %esi 106b81: 53 push %ebx 106b82: 83 ec 1c sub $0x1c,%esp 106b85: 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, 106b88: a1 48 11 12 00 mov 0x121148,%eax 106b8d: 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) { 106b92: ba 10 00 00 00 mov $0x10,%edx if (bit_mask == requested_bytes_per_block) { 106b97: 39 c2 cmp %eax,%edx 106b99: 74 0c je 106ba7 is_valid = true; break; } if(bit_mask > requested_bytes_per_block) 106b9b: 7f 05 jg 106ba2 int bit_mask; /* * check, whether requested bytes per block is valid */ for (bit_mask = 16; !is_valid && (bit_mask <= 512); bit_mask <<= 1) { 106b9d: d1 e2 shl %edx 106b9f: 49 dec %ecx 106ba0: 75 f5 jne 106b97 <== ALWAYS TAKEN if(bit_mask > requested_bytes_per_block) break; } *dest_bytes_per_block = ((is_valid) ? requested_bytes_per_block : default_bytes_per_block); 106ba2: b8 80 00 00 00 mov $0x80,%eax break; } if(bit_mask > requested_bytes_per_block) break; } *dest_bytes_per_block = ((is_valid) 106ba7: 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(); 106bac: e8 f2 6a 00 00 call 10d6a3 106bb1: 89 c2 mov %eax,%edx 106bb3: 89 43 1c mov %eax,0x1c(%ebx) temp_mt_entry->mt_fs_root.handlers = directory_handlers; 106bb6: 8b 45 14 mov 0x14(%ebp),%eax 106bb9: 89 43 24 mov %eax,0x24(%ebx) temp_mt_entry->mt_fs_root.ops = op_table; 106bbc: 8b 45 0c mov 0xc(%ebp),%eax 106bbf: 89 43 28 mov %eax,0x28(%ebx) temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS; 106bc2: 8d 7b 38 lea 0x38(%ebx),%edi 106bc5: be fc f2 11 00 mov $0x11f2fc,%esi 106bca: b9 0c 00 00 00 mov $0xc,%ecx 106bcf: f3 a5 rep movsl %ds:(%esi),%es:(%edi) /* * Create custom file system data. */ fs_info = calloc( 1, sizeof( IMFS_fs_info_t ) ); 106bd1: 50 push %eax 106bd2: 50 push %eax 106bd3: 6a 14 push $0x14 106bd5: 6a 01 push $0x1 106bd7: 89 55 e4 mov %edx,-0x1c(%ebp) 106bda: e8 fd 05 00 00 call 1071dc if ( !fs_info ) { 106bdf: 83 c4 10 add $0x10,%esp 106be2: 85 c0 test %eax,%eax 106be4: 8b 55 e4 mov -0x1c(%ebp),%edx 106be7: 75 1c jne 106c05 free(temp_mt_entry->mt_fs_root.node_access); 106be9: 83 ec 0c sub $0xc,%esp 106bec: 52 push %edx 106bed: e8 56 07 00 00 call 107348 rtems_set_errno_and_return_minus_one(ENOMEM); 106bf2: e8 d5 a4 00 00 call 1110cc <__errno> 106bf7: c7 00 0c 00 00 00 movl $0xc,(%eax) 106bfd: 83 c4 10 add $0x10,%esp 106c00: 83 c8 ff or $0xffffffff,%eax 106c03: eb 34 jmp 106c39 } temp_mt_entry->fs_info = fs_info; 106c05: 89 43 34 mov %eax,0x34(%ebx) /* * Set st_ino for the root to 1. */ fs_info->instance = imfs_instance++; 106c08: 8b 0d f0 4e 12 00 mov 0x124ef0,%ecx 106c0e: 89 08 mov %ecx,(%eax) 106c10: 41 inc %ecx 106c11: 89 0d f0 4e 12 00 mov %ecx,0x124ef0 fs_info->ino_count = 1; 106c17: c7 40 04 01 00 00 00 movl $0x1,0x4(%eax) fs_info->memfile_handlers = memfile_handlers; 106c1e: 8b 4d 10 mov 0x10(%ebp),%ecx 106c21: 89 48 08 mov %ecx,0x8(%eax) fs_info->directory_handlers = directory_handlers; 106c24: 8b 4d 14 mov 0x14(%ebp),%ecx 106c27: 89 48 0c mov %ecx,0xc(%eax) fs_info->fifo_handlers = fifo_handlers; 106c2a: 8b 4d 18 mov 0x18(%ebp),%ecx 106c2d: 89 48 10 mov %ecx,0x10(%eax) jnode = temp_mt_entry->mt_fs_root.node_access; jnode->st_ino = fs_info->ino_count; 106c30: c7 42 38 01 00 00 00 movl $0x1,0x38(%edx) return 0; 106c37: 31 c0 xor %eax,%eax } 106c39: 8d 65 f4 lea -0xc(%ebp),%esp 106c3c: 5b pop %ebx 106c3d: 5e pop %esi 106c3e: 5f pop %edi 106c3f: c9 leave 106c40: c3 ret =============================================================================== 00110096 : */ MEMFILE_STATIC int IMFS_memfile_extend( IMFS_jnode_t *the_jnode, off_t new_length ) { 110096: 55 push %ebp 110097: 89 e5 mov %esp,%ebp 110099: 57 push %edi 11009a: 56 push %esi 11009b: 53 push %ebx 11009c: 83 ec 2c sub $0x2c,%esp 11009f: 8b 7d 08 mov 0x8(%ebp),%edi 1100a2: 8b 5d 0c mov 0xc(%ebp),%ebx 1100a5: 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 ) 1100a8: a1 ec 4e 12 00 mov 0x124eec,%eax 1100ad: 89 c1 mov %eax,%ecx 1100af: c1 e9 02 shr $0x2,%ecx 1100b2: 8d 51 01 lea 0x1(%ecx),%edx 1100b5: 0f af d1 imul %ecx,%edx 1100b8: 42 inc %edx 1100b9: 0f af d1 imul %ecx,%edx 1100bc: 4a dec %edx 1100bd: 0f af d0 imul %eax,%edx 1100c0: 83 fe 00 cmp $0x0,%esi 1100c3: 7c 16 jl 1100db <== NEVER TAKEN 1100c5: 7f 04 jg 1100cb <== NEVER TAKEN 1100c7: 39 d3 cmp %edx,%ebx 1100c9: 72 10 jb 1100db rtems_set_errno_and_return_minus_one( EINVAL ); 1100cb: e8 fc 0f 00 00 call 1110cc <__errno> 1100d0: c7 00 16 00 00 00 movl $0x16,(%eax) 1100d6: e9 92 00 00 00 jmp 11016d /* * Verify new file size is actually larger than current size */ if ( new_length <= the_jnode->info.file.size ) 1100db: 8b 57 50 mov 0x50(%edi),%edx 1100de: 8b 4f 54 mov 0x54(%edi),%ecx 1100e1: 89 55 e0 mov %edx,-0x20(%ebp) 1100e4: 89 4d e4 mov %ecx,-0x1c(%ebp) 1100e7: 39 ce cmp %ecx,%esi 1100e9: 0f 8c 8f 00 00 00 jl 11017e <== NEVER TAKEN 1100ef: 7f 08 jg 1100f9 <== NEVER TAKEN 1100f1: 39 d3 cmp %edx,%ebx 1100f3: 0f 86 85 00 00 00 jbe 11017e return 0; /* * Calculate the number of range of blocks to allocate */ new_blocks = new_length / IMFS_MEMFILE_BYTES_PER_BLOCK; 1100f9: 89 45 d8 mov %eax,-0x28(%ebp) 1100fc: 89 c1 mov %eax,%ecx 1100fe: c1 f9 1f sar $0x1f,%ecx 110101: 89 4d dc mov %ecx,-0x24(%ebp) 110104: ff 75 dc pushl -0x24(%ebp) 110107: ff 75 d8 pushl -0x28(%ebp) 11010a: 56 push %esi 11010b: 53 push %ebx 11010c: e8 3f c8 00 00 call 11c950 <__divdi3> 110111: 83 c4 10 add $0x10,%esp 110114: 89 45 d4 mov %eax,-0x2c(%ebp) old_blocks = the_jnode->info.file.size / IMFS_MEMFILE_BYTES_PER_BLOCK; 110117: ff 75 dc pushl -0x24(%ebp) 11011a: ff 75 d8 pushl -0x28(%ebp) 11011d: ff 75 e4 pushl -0x1c(%ebp) 110120: ff 75 e0 pushl -0x20(%ebp) 110123: e8 28 c8 00 00 call 11c950 <__divdi3> 110128: 83 c4 10 add $0x10,%esp 11012b: 89 45 e0 mov %eax,-0x20(%ebp) /* * Now allocate each of those blocks. */ for ( block=old_blocks ; block<=new_blocks ; block++ ) { 11012e: 89 c2 mov %eax,%edx 110130: eb 41 jmp 110173 if ( IMFS_memfile_addblock( the_jnode, block ) ) { 110132: 51 push %ecx 110133: 51 push %ecx 110134: 52 push %edx 110135: 57 push %edi 110136: 89 55 d0 mov %edx,-0x30(%ebp) 110139: e8 99 fd ff ff call 10fed7 11013e: 83 c4 10 add $0x10,%esp 110141: 85 c0 test %eax,%eax 110143: 8b 55 d0 mov -0x30(%ebp),%edx 110146: 74 2a je 110172 110148: eb 13 jmp 11015d for ( ; block>=old_blocks ; block-- ) { IMFS_memfile_remove_block( the_jnode, block ); 11014a: 50 push %eax 11014b: 50 push %eax 11014c: 52 push %edx 11014d: 57 push %edi 11014e: 89 55 d0 mov %edx,-0x30(%ebp) 110151: e8 16 ff ff ff call 11006c /* * 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-- ) { 110156: 8b 55 d0 mov -0x30(%ebp),%edx 110159: 4a dec %edx 11015a: 83 c4 10 add $0x10,%esp 11015d: 3b 55 e0 cmp -0x20(%ebp),%edx 110160: 73 e8 jae 11014a IMFS_memfile_remove_block( the_jnode, block ); } rtems_set_errno_and_return_minus_one( ENOSPC ); 110162: e8 65 0f 00 00 call 1110cc <__errno> 110167: c7 00 1c 00 00 00 movl $0x1c,(%eax) 11016d: 83 c8 ff or $0xffffffff,%eax 110170: eb 0e jmp 110180 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++ ) { 110172: 42 inc %edx 110173: 3b 55 d4 cmp -0x2c(%ebp),%edx 110176: 76 ba jbe 110132 } /* * Set the new length of the file. */ the_jnode->info.file.size = new_length; 110178: 89 5f 50 mov %ebx,0x50(%edi) 11017b: 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; 11017e: 31 c0 xor %eax,%eax /* * Set the new length of the file. */ the_jnode->info.file.size = new_length; return 0; } 110180: 8d 65 f4 lea -0xc(%ebp),%esp 110183: 5b pop %ebx 110184: 5e pop %esi 110185: 5f pop %edi 110186: c9 leave 110187: c3 ret =============================================================================== 0010fbdc : #endif IMFS_jnode_t *the_jnode, unsigned int block, int malloc_it ) { 10fbdc: 55 push %ebp 10fbdd: 89 e5 mov %esp,%ebp 10fbdf: 57 push %edi 10fbe0: 56 push %esi 10fbe1: 53 push %ebx 10fbe2: 83 ec 1c sub $0x1c,%esp 10fbe5: 8b 75 08 mov 0x8(%ebp),%esi 10fbe8: 8b 7d 0c mov 0xc(%ebp),%edi my_block = block; /* * Is the block number in the simple indirect portion? */ if ( my_block <= LAST_INDIRECT ) { 10fbeb: 8b 0d ec 4e 12 00 mov 0x124eec,%ecx 10fbf1: c1 e9 02 shr $0x2,%ecx 10fbf4: 8d 41 ff lea -0x1(%ecx),%eax 10fbf7: 39 c7 cmp %eax,%edi 10fbf9: 77 40 ja 10fc3b p = info->indirect; 10fbfb: 8b 46 58 mov 0x58(%esi),%eax if ( malloc_it ) { 10fbfe: 83 7d 10 00 cmpl $0x0,0x10(%ebp) 10fc02: 74 25 je 10fc29 if ( !p ) { 10fc04: 85 c0 test %eax,%eax 10fc06: 75 12 jne 10fc1a p = memfile_alloc_block(); 10fc08: e8 ad ff ff ff call 10fbba if ( !p ) return 0; 10fc0d: 31 db xor %ebx,%ebx if ( malloc_it ) { if ( !p ) { p = memfile_alloc_block(); if ( !p ) 10fc0f: 85 c0 test %eax,%eax 10fc11: 0f 84 f7 00 00 00 je 10fd0e <== NEVER TAKEN return 0; info->indirect = p; 10fc17: 89 46 58 mov %eax,0x58(%esi) } return &info->indirect[ my_block ]; 10fc1a: 8d 1c bd 00 00 00 00 lea 0x0(,%edi,4),%ebx 10fc21: 03 5e 58 add 0x58(%esi),%ebx 10fc24: e9 e5 00 00 00 jmp 10fd0e } if ( !p ) return 0; 10fc29: 31 db xor %ebx,%ebx info->indirect = p; } return &info->indirect[ my_block ]; } if ( !p ) 10fc2b: 85 c0 test %eax,%eax 10fc2d: 0f 84 db 00 00 00 je 10fd0e <== NEVER TAKEN return 0; return &info->indirect[ my_block ]; 10fc33: 8d 1c b8 lea (%eax,%edi,4),%ebx 10fc36: e9 d3 00 00 00 jmp 10fd0e /* * Is the block number in the doubly indirect portion? */ if ( my_block <= LAST_DOUBLY_INDIRECT ) { 10fc3b: 8d 41 01 lea 0x1(%ecx),%eax 10fc3e: 0f af c1 imul %ecx,%eax 10fc41: 8d 50 ff lea -0x1(%eax),%edx 10fc44: 39 d7 cmp %edx,%edi 10fc46: 77 40 ja 10fc88 my_block -= FIRST_DOUBLY_INDIRECT; 10fc48: 29 cf sub %ecx,%edi singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; 10fc4a: 89 f8 mov %edi,%eax 10fc4c: 31 d2 xor %edx,%edx 10fc4e: f7 f1 div %ecx 10fc50: 89 55 e4 mov %edx,-0x1c(%ebp) 10fc53: 89 c7 mov %eax,%edi doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; p = info->doubly_indirect; 10fc55: 8b 46 5c mov 0x5c(%esi),%eax if ( malloc_it ) { 10fc58: 83 7d 10 00 cmpl $0x0,0x10(%ebp) 10fc5c: 74 1b je 10fc79 if ( !p ) { 10fc5e: 85 c0 test %eax,%eax 10fc60: 75 12 jne 10fc74 p = memfile_alloc_block(); 10fc62: e8 53 ff ff ff call 10fbba if ( !p ) return 0; 10fc67: 31 db xor %ebx,%ebx p = info->doubly_indirect; if ( malloc_it ) { if ( !p ) { p = memfile_alloc_block(); if ( !p ) 10fc69: 85 c0 test %eax,%eax 10fc6b: 0f 84 9d 00 00 00 je 10fd0e <== NEVER TAKEN return 0; info->doubly_indirect = p; 10fc71: 89 46 5c mov %eax,0x5c(%esi) } p1 = (block_p *)p[ doubly ]; 10fc74: 8d 34 b8 lea (%eax,%edi,4),%esi 10fc77: eb 65 jmp 10fcde return (block_p *)&p1[ singly ]; } if ( !p ) return 0; 10fc79: 31 db xor %ebx,%ebx } return (block_p *)&p1[ singly ]; } if ( !p ) 10fc7b: 85 c0 test %eax,%eax 10fc7d: 0f 84 8b 00 00 00 je 10fd0e <== NEVER TAKEN return 0; p = (block_p *)p[ doubly ]; 10fc83: 8b 04 b8 mov (%eax,%edi,4),%eax 10fc86: eb 7c jmp 10fd04 } /* * Is the block number in the triply indirect portion? */ if ( my_block <= LAST_TRIPLY_INDIRECT ) { 10fc88: 8d 50 01 lea 0x1(%eax),%edx 10fc8b: 0f af d1 imul %ecx,%edx 10fc8e: 4a dec %edx } /* * This means the requested block number is out of range. */ return 0; 10fc8f: 31 db xor %ebx,%ebx } /* * Is the block number in the triply indirect portion? */ if ( my_block <= LAST_TRIPLY_INDIRECT ) { 10fc91: 39 d7 cmp %edx,%edi 10fc93: 77 79 ja 10fd0e <== NEVER TAKEN my_block -= FIRST_TRIPLY_INDIRECT; 10fc95: 29 c7 sub %eax,%edi 10fc97: 89 f8 mov %edi,%eax singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; 10fc99: 31 d2 xor %edx,%edx 10fc9b: f7 f1 div %ecx 10fc9d: 89 55 e4 mov %edx,-0x1c(%ebp) doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS; 10fca0: 31 d2 xor %edx,%edx 10fca2: f7 f1 div %ecx 10fca4: 89 55 e0 mov %edx,-0x20(%ebp) 10fca7: 89 c7 mov %eax,%edi doubly %= IMFS_MEMFILE_BLOCK_SLOTS; p = info->triply_indirect; 10fca9: 8b 46 60 mov 0x60(%esi),%eax if ( malloc_it ) { 10fcac: 83 7d 10 00 cmpl $0x0,0x10(%ebp) 10fcb0: 74 41 je 10fcf3 if ( !p ) { 10fcb2: 85 c0 test %eax,%eax 10fcb4: 75 0c jne 10fcc2 p = memfile_alloc_block(); 10fcb6: e8 ff fe ff ff call 10fbba if ( !p ) 10fcbb: 85 c0 test %eax,%eax 10fcbd: 74 4f je 10fd0e <== NEVER TAKEN return 0; info->triply_indirect = p; 10fcbf: 89 46 60 mov %eax,0x60(%esi) } p1 = (block_p *) p[ triply ]; 10fcc2: 8d 34 b8 lea (%eax,%edi,4),%esi 10fcc5: 8b 06 mov (%esi),%eax if ( !p1 ) { 10fcc7: 85 c0 test %eax,%eax 10fcc9: 75 0d jne 10fcd8 p1 = memfile_alloc_block(); 10fccb: e8 ea fe ff ff call 10fbba if ( !p1 ) return 0; 10fcd0: 31 db xor %ebx,%ebx } p1 = (block_p *) p[ triply ]; if ( !p1 ) { p1 = memfile_alloc_block(); if ( !p1 ) 10fcd2: 85 c0 test %eax,%eax 10fcd4: 74 38 je 10fd0e <== NEVER TAKEN return 0; p[ triply ] = (block_p) p1; 10fcd6: 89 06 mov %eax,(%esi) } p2 = (block_p *)p1[ doubly ]; 10fcd8: 8b 55 e0 mov -0x20(%ebp),%edx 10fcdb: 8d 34 90 lea (%eax,%edx,4),%esi 10fcde: 8b 06 mov (%esi),%eax if ( !p2 ) { 10fce0: 85 c0 test %eax,%eax 10fce2: 75 24 jne 10fd08 p2 = memfile_alloc_block(); 10fce4: e8 d1 fe ff ff call 10fbba if ( !p2 ) return 0; 10fce9: 31 db xor %ebx,%ebx } p2 = (block_p *)p1[ doubly ]; if ( !p2 ) { p2 = memfile_alloc_block(); if ( !p2 ) 10fceb: 85 c0 test %eax,%eax 10fced: 74 1f je 10fd0e <== NEVER TAKEN return 0; p1[ doubly ] = (block_p) p2; 10fcef: 89 06 mov %eax,(%esi) 10fcf1: eb 15 jmp 10fd08 } return (block_p *)&p2[ singly ]; } if ( !p ) 10fcf3: 85 c0 test %eax,%eax 10fcf5: 74 17 je 10fd0e <== NEVER TAKEN return 0; p1 = (block_p *) p[ triply ]; 10fcf7: 8b 04 b8 mov (%eax,%edi,4),%eax if ( !p1 ) 10fcfa: 85 c0 test %eax,%eax 10fcfc: 74 10 je 10fd0e <== NEVER TAKEN return 0; p2 = (block_p *)p1[ doubly ]; 10fcfe: 8b 55 e0 mov -0x20(%ebp),%edx 10fd01: 8b 04 90 mov (%eax,%edx,4),%eax if ( !p2 ) 10fd04: 85 c0 test %eax,%eax 10fd06: 74 06 je 10fd0e <== NEVER TAKEN return 0; return (block_p *)&p2[ singly ]; 10fd08: 8b 55 e4 mov -0x1c(%ebp),%edx 10fd0b: 8d 1c 90 lea (%eax,%edx,4),%ebx /* * This means the requested block number is out of range. */ return 0; } 10fd0e: 89 d8 mov %ebx,%eax 10fd10: 83 c4 1c add $0x1c,%esp 10fd13: 5b pop %ebx 10fd14: 5e pop %esi 10fd15: 5f pop %edi 10fd16: c9 leave 10fd17: c3 ret =============================================================================== 0010fd18 : IMFS_jnode_t *the_jnode, off_t start, unsigned char *destination, unsigned int length ) { 10fd18: 55 push %ebp 10fd19: 89 e5 mov %esp,%ebp 10fd1b: 57 push %edi 10fd1c: 56 push %esi 10fd1d: 53 push %ebx 10fd1e: 83 ec 4c sub $0x4c,%esp 10fd21: 8b 75 0c mov 0xc(%ebp),%esi 10fd24: 8b 7d 10 mov 0x10(%ebp),%edi 10fd27: 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) { 10fd2a: 8b 45 08 mov 0x8(%ebp),%eax 10fd2d: 83 78 4c 06 cmpl $0x6,0x4c(%eax) 10fd31: 75 3f jne 10fd72 unsigned char *file_ptr; file_ptr = (unsigned char *)the_jnode->info.linearfile.direct; 10fd33: 8b 48 58 mov 0x58(%eax),%ecx if (my_length > (the_jnode->info.linearfile.size - start)) 10fd36: 89 c2 mov %eax,%edx 10fd38: 8b 40 50 mov 0x50(%eax),%eax 10fd3b: 8b 52 54 mov 0x54(%edx),%edx 10fd3e: 89 45 b0 mov %eax,-0x50(%ebp) 10fd41: 89 55 b4 mov %edx,-0x4c(%ebp) 10fd44: 29 f0 sub %esi,%eax 10fd46: 19 fa sbb %edi,%edx 10fd48: 89 45 d0 mov %eax,-0x30(%ebp) 10fd4b: 89 55 d4 mov %edx,-0x2c(%ebp) 10fd4e: 31 c0 xor %eax,%eax 10fd50: 39 d0 cmp %edx,%eax 10fd52: 7c 0e jl 10fd62 <== NEVER TAKEN 10fd54: 7f 05 jg 10fd5b <== NEVER TAKEN 10fd56: 3b 5d d0 cmp -0x30(%ebp),%ebx 10fd59: 76 07 jbe 10fd62 <== NEVER TAKEN my_length = the_jnode->info.linearfile.size - start; 10fd5b: 8b 55 b0 mov -0x50(%ebp),%edx 10fd5e: 29 f2 sub %esi,%edx 10fd60: eb 02 jmp 10fd64 /* * Linear files (as created from a tar file are easier to handle * than block files). */ my_length = length; 10fd62: 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); 10fd64: 01 ce add %ecx,%esi 10fd66: 8b 7d 14 mov 0x14(%ebp),%edi 10fd69: 89 d1 mov %edx,%ecx 10fd6b: f3 a4 rep movsb %ds:(%esi),%es:(%edi) 10fd6d: e9 1d 01 00 00 jmp 10fe8f /* * 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; 10fd72: 89 f0 mov %esi,%eax if ( last_byte > the_jnode->info.file.size ) 10fd74: 8b 55 08 mov 0x8(%ebp),%edx 10fd77: 8b 52 50 mov 0x50(%edx),%edx 10fd7a: 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; 10fd7d: 8d 0c 33 lea (%ebx,%esi,1),%ecx 10fd80: 89 4d d0 mov %ecx,-0x30(%ebp) if ( last_byte > the_jnode->info.file.size ) 10fd83: 31 c9 xor %ecx,%ecx 10fd85: 8b 55 08 mov 0x8(%ebp),%edx 10fd88: 3b 4a 54 cmp 0x54(%edx),%ecx 10fd8b: 7c 14 jl 10fda1 <== NEVER TAKEN 10fd8d: 7f 08 jg 10fd97 <== NEVER TAKEN 10fd8f: 8b 4d cc mov -0x34(%ebp),%ecx 10fd92: 39 4d d0 cmp %ecx,-0x30(%ebp) 10fd95: 76 0a jbe 10fda1 my_length = the_jnode->info.file.size - start; 10fd97: 8b 55 cc mov -0x34(%ebp),%edx 10fd9a: 29 c2 sub %eax,%edx 10fd9c: 89 55 d0 mov %edx,-0x30(%ebp) 10fd9f: eb 03 jmp 10fda4 /* * Linear files (as created from a tar file are easier to handle * than block files). */ my_length = length; 10fda1: 89 5d d0 mov %ebx,-0x30(%ebp) */ /* * Phase 1: possibly the last part of one block */ start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK; 10fda4: 8b 0d ec 4e 12 00 mov 0x124eec,%ecx 10fdaa: 89 4d c4 mov %ecx,-0x3c(%ebp) 10fdad: 89 c8 mov %ecx,%eax 10fdaf: 99 cltd 10fdb0: 89 d3 mov %edx,%ebx 10fdb2: 52 push %edx 10fdb3: 51 push %ecx 10fdb4: 57 push %edi 10fdb5: 56 push %esi 10fdb6: 89 4d c0 mov %ecx,-0x40(%ebp) 10fdb9: e8 de cc 00 00 call 11ca9c <__moddi3> 10fdbe: 83 c4 10 add $0x10,%esp 10fdc1: 89 45 cc mov %eax,-0x34(%ebp) block = start / IMFS_MEMFILE_BYTES_PER_BLOCK; 10fdc4: 8b 4d c0 mov -0x40(%ebp),%ecx 10fdc7: 53 push %ebx 10fdc8: 51 push %ecx 10fdc9: 57 push %edi 10fdca: 56 push %esi 10fdcb: e8 80 cb 00 00 call 11c950 <__divdi3> 10fdd0: 83 c4 10 add $0x10,%esp 10fdd3: 89 c3 mov %eax,%ebx if ( start_offset ) { 10fdd5: 83 7d cc 00 cmpl $0x0,-0x34(%ebp) 10fdd9: 74 3d je 10fe18 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 ); 10fddb: 57 push %edi 10fddc: 6a 00 push $0x0 10fdde: 50 push %eax 10fddf: ff 75 08 pushl 0x8(%ebp) 10fde2: e8 f5 fd ff ff call 10fbdc if ( !block_ptr ) 10fde7: 83 c4 10 add $0x10,%esp return copied; 10fdea: 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 ) 10fdec: 85 c0 test %eax,%eax 10fdee: 0f 84 ba 00 00 00 je 10feae <== 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; 10fdf4: 8b 4d c4 mov -0x3c(%ebp),%ecx 10fdf7: 2b 4d cc sub -0x34(%ebp),%ecx 10fdfa: 8b 55 d0 mov -0x30(%ebp),%edx 10fdfd: 39 ca cmp %ecx,%edx 10fdff: 76 02 jbe 10fe03 10fe01: 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 ); 10fe03: 8b 75 cc mov -0x34(%ebp),%esi 10fe06: 03 30 add (%eax),%esi dest += to_copy; 10fe08: 8b 7d 14 mov 0x14(%ebp),%edi 10fe0b: 89 d1 mov %edx,%ecx 10fe0d: f3 a4 rep movsb %ds:(%esi),%es:(%edi) 10fe0f: 89 7d cc mov %edi,-0x34(%ebp) block++; 10fe12: 43 inc %ebx my_length -= to_copy; 10fe13: 29 55 d0 sub %edx,-0x30(%ebp) 10fe16: eb 08 jmp 10fe20 unsigned int last_byte; unsigned int copied; unsigned int start_offset; unsigned char *dest; dest = destination; 10fe18: 8b 45 14 mov 0x14(%ebp),%eax 10fe1b: 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; 10fe1e: 31 d2 xor %edx,%edx } /* * Phase 2: all of zero of more blocks */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; 10fe20: 8b 0d ec 4e 12 00 mov 0x124eec,%ecx 10fe26: 89 4d c8 mov %ecx,-0x38(%ebp) while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { 10fe29: eb 2f jmp 10fe5a block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); 10fe2b: 56 push %esi 10fe2c: 6a 00 push $0x0 10fe2e: 53 push %ebx 10fe2f: ff 75 08 pushl 0x8(%ebp) 10fe32: 89 55 c0 mov %edx,-0x40(%ebp) 10fe35: e8 a2 fd ff ff call 10fbdc if ( !block_ptr ) 10fe3a: 83 c4 10 add $0x10,%esp 10fe3d: 85 c0 test %eax,%eax 10fe3f: 8b 55 c0 mov -0x40(%ebp),%edx 10fe42: 74 6a je 10feae <== NEVER TAKEN return copied; memcpy( dest, &(*block_ptr)[ 0 ], to_copy ); 10fe44: 8b 30 mov (%eax),%esi 10fe46: 8b 7d cc mov -0x34(%ebp),%edi 10fe49: 8b 4d c8 mov -0x38(%ebp),%ecx 10fe4c: f3 a4 rep movsb %ds:(%esi),%es:(%edi) dest += to_copy; 10fe4e: 89 7d cc mov %edi,-0x34(%ebp) block++; 10fe51: 43 inc %ebx my_length -= to_copy; 10fe52: 8b 7d c8 mov -0x38(%ebp),%edi 10fe55: 29 7d d0 sub %edi,-0x30(%ebp) copied += to_copy; 10fe58: 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 ) { 10fe5a: 8b 45 d0 mov -0x30(%ebp),%eax 10fe5d: 3b 05 ec 4e 12 00 cmp 0x124eec,%eax 10fe63: 73 c6 jae 10fe2b /* * Phase 3: possibly the first part of one block */ IMFS_assert( my_length < IMFS_MEMFILE_BYTES_PER_BLOCK ); if ( my_length ) { 10fe65: 85 c0 test %eax,%eax 10fe67: 74 26 je 10fe8f block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); 10fe69: 51 push %ecx 10fe6a: 6a 00 push $0x0 10fe6c: 53 push %ebx 10fe6d: ff 75 08 pushl 0x8(%ebp) 10fe70: 89 55 c0 mov %edx,-0x40(%ebp) 10fe73: e8 64 fd ff ff call 10fbdc if ( !block_ptr ) 10fe78: 83 c4 10 add $0x10,%esp 10fe7b: 85 c0 test %eax,%eax 10fe7d: 8b 55 c0 mov -0x40(%ebp),%edx 10fe80: 74 2c je 10feae <== NEVER TAKEN return copied; memcpy( dest, &(*block_ptr)[ 0 ], my_length ); 10fe82: 8b 30 mov (%eax),%esi 10fe84: 8b 7d cc mov -0x34(%ebp),%edi 10fe87: 8b 4d d0 mov -0x30(%ebp),%ecx 10fe8a: f3 a4 rep movsb %ds:(%esi),%es:(%edi) copied += my_length; 10fe8c: 03 55 d0 add -0x30(%ebp),%edx } IMFS_update_atime( the_jnode ); 10fe8f: 50 push %eax 10fe90: 50 push %eax 10fe91: 6a 00 push $0x0 10fe93: 8d 45 e0 lea -0x20(%ebp),%eax 10fe96: 50 push %eax 10fe97: 89 55 c0 mov %edx,-0x40(%ebp) 10fe9a: e8 21 75 ff ff call 1073c0 10fe9f: 8b 45 e0 mov -0x20(%ebp),%eax 10fea2: 8b 4d 08 mov 0x8(%ebp),%ecx 10fea5: 89 41 40 mov %eax,0x40(%ecx) return copied; 10fea8: 8b 55 c0 mov -0x40(%ebp),%edx 10feab: 83 c4 10 add $0x10,%esp } 10feae: 89 d0 mov %edx,%eax 10feb0: 8d 65 f4 lea -0xc(%ebp),%esp 10feb3: 5b pop %ebx 10feb4: 5e pop %esi 10feb5: 5f pop %edi 10feb6: c9 leave 10feb7: c3 ret =============================================================================== 0010ff76 : * is better to stick to simple, easy to understand algorithms. */ int IMFS_memfile_remove( IMFS_jnode_t *the_jnode ) { 10ff76: 55 push %ebp 10ff77: 89 e5 mov %esp,%ebp 10ff79: 57 push %edi 10ff7a: 56 push %esi 10ff7b: 53 push %ebx 10ff7c: 83 ec 1c sub $0x1c,%esp 10ff7f: 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; 10ff82: 8b 35 ec 4e 12 00 mov 0x124eec,%esi 10ff88: c1 ee 02 shr $0x2,%esi * + doubly indirect * + triply indirect */ info = &the_jnode->info.file; if ( info->indirect ) { 10ff8b: 83 7b 58 00 cmpl $0x0,0x58(%ebx) 10ff8f: 74 0f je 10ffa0 memfile_free_blocks_in_table( &info->indirect, to_free ); 10ff91: 57 push %edi 10ff92: 57 push %edi 10ff93: 56 push %esi 10ff94: 8d 43 58 lea 0x58(%ebx),%eax 10ff97: 50 push %eax 10ff98: e8 8c ff ff ff call 10ff29 10ff9d: 83 c4 10 add $0x10,%esp } if ( info->doubly_indirect ) { 10ffa0: 83 7b 5c 00 cmpl $0x0,0x5c(%ebx) 10ffa4: 74 3e je 10ffe4 10ffa6: 31 ff xor %edi,%edi 10ffa8: eb 1f jmp 10ffc9 for ( i=0 ; idoubly_indirect[i] ) { 10ffaa: 8b 43 5c mov 0x5c(%ebx),%eax 10ffad: 8d 14 bd 00 00 00 00 lea 0x0(,%edi,4),%edx 10ffb4: 83 3c b8 00 cmpl $0x0,(%eax,%edi,4) 10ffb8: 74 0e je 10ffc8 <== NEVER TAKEN memfile_free_blocks_in_table( 10ffba: 51 push %ecx 10ffbb: 51 push %ecx 10ffbc: 56 push %esi 10ffbd: 01 d0 add %edx,%eax 10ffbf: 50 push %eax 10ffc0: e8 64 ff ff ff call 10ff29 10ffc5: 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 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 ); 10ffd5: 57 push %edi 10ffd6: 57 push %edi 10ffd7: 56 push %esi 10ffd8: 8d 43 5c lea 0x5c(%ebx),%eax 10ffdb: 50 push %eax 10ffdc: e8 48 ff ff ff call 10ff29 10ffe1: 83 c4 10 add $0x10,%esp } if ( info->triply_indirect ) { 10ffe4: 83 7b 60 00 cmpl $0x0,0x60(%ebx) 10ffe8: 74 78 je 110062 10ffea: 31 ff xor %edi,%edi 10ffec: eb 59 jmp 110047 10ffee: 8d 04 bd 00 00 00 00 lea 0x0(,%edi,4),%eax 10fff5: 89 45 e4 mov %eax,-0x1c(%ebp) for ( i=0 ; itriply_indirect[i]; 10fff8: 8b 43 60 mov 0x60(%ebx),%eax 10fffb: 8b 04 b8 mov (%eax,%edi,4),%eax if ( !p ) /* ensure we have a valid pointer */ 10fffe: 85 c0 test %eax,%eax 110000: 74 51 je 110053 <== NEVER TAKEN 110002: 31 d2 xor %edx,%edx 110004: eb 21 jmp 110027 break; for ( j=0 ; j<== NEVER TAKEN memfile_free_blocks_in_table( (block_p **)&p[j], to_free); 11000b: 51 push %ecx 11000c: 51 push %ecx 11000d: 56 push %esi 11000e: 50 push %eax 11000f: 89 45 dc mov %eax,-0x24(%ebp) 110012: 89 55 e0 mov %edx,-0x20(%ebp) 110015: e8 0f ff ff ff call 10ff29 11001a: 83 c4 10 add $0x10,%esp 11001d: 8b 55 e0 mov -0x20(%ebp),%edx 110020: 8b 45 dc mov -0x24(%ebp),%eax if ( info->triply_indirect ) { for ( i=0 ; itriply_indirect[i]; if ( !p ) /* ensure we have a valid pointer */ break; for ( j=0 ; j if ( p[j] ) { memfile_free_blocks_in_table( (block_p **)&p[j], to_free); } } memfile_free_blocks_in_table( 110034: 52 push %edx 110035: 52 push %edx 110036: 56 push %esi 110037: 8b 45 e4 mov -0x1c(%ebp),%eax 11003a: 03 43 60 add 0x60(%ebx),%eax 11003d: 50 push %eax 11003e: e8 e6 fe ff ff call 10ff29 memfile_free_blocks_in_table( &info->doubly_indirect, to_free ); } if ( info->triply_indirect ) { for ( i=0 ; i } } memfile_free_blocks_in_table( (block_p **)&info->triply_indirect[i], to_free ); } memfile_free_blocks_in_table( 110053: 50 push %eax 110054: 50 push %eax 110055: 56 push %esi (block_p **)&info->triply_indirect, to_free ); 110056: 83 c3 60 add $0x60,%ebx } } memfile_free_blocks_in_table( (block_p **)&info->triply_indirect[i], to_free ); } memfile_free_blocks_in_table( 110059: 53 push %ebx 11005a: e8 ca fe ff ff call 10ff29 11005f: 83 c4 10 add $0x10,%esp (block_p **)&info->triply_indirect, to_free ); } return 0; } 110062: 31 c0 xor %eax,%eax 110064: 8d 65 f4 lea -0xc(%ebp),%esp 110067: 5b pop %ebx 110068: 5e pop %esi 110069: 5f pop %edi 11006a: c9 leave 11006b: c3 ret =============================================================================== 00110188 : IMFS_jnode_t *the_jnode, off_t start, const unsigned char *source, unsigned int length ) { 110188: 55 push %ebp 110189: 89 e5 mov %esp,%ebp 11018b: 57 push %edi 11018c: 56 push %esi 11018d: 53 push %ebx 11018e: 83 ec 2c sub $0x2c,%esp 110191: 8b 75 0c mov 0xc(%ebp),%esi 110194: 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; 110197: 8b 4d 18 mov 0x18(%ebp),%ecx 11019a: 01 f1 add %esi,%ecx if ( last_byte > the_jnode->info.file.size ) { 11019c: 89 c8 mov %ecx,%eax 11019e: 31 d2 xor %edx,%edx 1101a0: 8b 5d 08 mov 0x8(%ebp),%ebx 1101a3: 3b 53 54 cmp 0x54(%ebx),%edx 1101a6: 7c 2c jl 1101d4 <== NEVER TAKEN 1101a8: 7f 05 jg 1101af <== NEVER TAKEN 1101aa: 3b 4b 50 cmp 0x50(%ebx),%ecx 1101ad: 76 25 jbe 1101d4 <== NEVER TAKEN status = IMFS_memfile_extend( the_jnode, last_byte ); 1101af: 51 push %ecx 1101b0: 52 push %edx 1101b1: 50 push %eax 1101b2: ff 75 08 pushl 0x8(%ebp) 1101b5: e8 dc fe ff ff call 110096 if ( status ) 1101ba: 83 c4 10 add $0x10,%esp 1101bd: 85 c0 test %eax,%eax 1101bf: 74 13 je 1101d4 rtems_set_errno_and_return_minus_one( ENOSPC ); 1101c1: e8 06 0f 00 00 call 1110cc <__errno> 1101c6: c7 00 1c 00 00 00 movl $0x1c,(%eax) 1101cc: 83 c9 ff or $0xffffffff,%ecx 1101cf: e9 0f 01 00 00 jmp 1102e3 */ /* * Phase 1: possibly the last part of one block */ start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK; 1101d4: a1 ec 4e 12 00 mov 0x124eec,%eax 1101d9: 89 45 cc mov %eax,-0x34(%ebp) 1101dc: 99 cltd 1101dd: 89 d3 mov %edx,%ebx 1101df: 52 push %edx 1101e0: 50 push %eax 1101e1: 57 push %edi 1101e2: 56 push %esi 1101e3: 89 45 c8 mov %eax,-0x38(%ebp) 1101e6: e8 b1 c8 00 00 call 11ca9c <__moddi3> 1101eb: 83 c4 10 add $0x10,%esp 1101ee: 89 45 d0 mov %eax,-0x30(%ebp) block = start / IMFS_MEMFILE_BYTES_PER_BLOCK; 1101f1: 8b 4d c8 mov -0x38(%ebp),%ecx 1101f4: 53 push %ebx 1101f5: 51 push %ecx 1101f6: 57 push %edi 1101f7: 56 push %esi 1101f8: e8 53 c7 00 00 call 11c950 <__divdi3> 1101fd: 83 c4 10 add $0x10,%esp 110200: 89 c3 mov %eax,%ebx if ( start_offset ) { 110202: 83 7d d0 00 cmpl $0x0,-0x30(%ebp) 110206: 74 40 je 110248 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 ); 110208: 52 push %edx 110209: 6a 00 push $0x0 11020b: 53 push %ebx 11020c: ff 75 08 pushl 0x8(%ebp) 11020f: e8 c8 f9 ff ff call 10fbdc if ( !block_ptr ) 110214: 83 c4 10 add $0x10,%esp return copied; 110217: 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 ) 110219: 85 c0 test %eax,%eax 11021b: 0f 84 c2 00 00 00 je 1102e3 <== 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; 110221: 8b 55 cc mov -0x34(%ebp),%edx 110224: 2b 55 d0 sub -0x30(%ebp),%edx 110227: 3b 55 18 cmp 0x18(%ebp),%edx 11022a: 76 03 jbe 11022f 11022c: 8b 55 18 mov 0x18(%ebp),%edx block, to_copy, src ); #endif memcpy( &(*block_ptr)[ start_offset ], src, to_copy ); 11022f: 8b 00 mov (%eax),%eax 110231: 03 45 d0 add -0x30(%ebp),%eax src += to_copy; 110234: 89 c7 mov %eax,%edi 110236: 8b 75 14 mov 0x14(%ebp),%esi 110239: 89 d1 mov %edx,%ecx 11023b: f3 a4 rep movsb %ds:(%esi),%es:(%edi) block++; 11023d: 43 inc %ebx my_length -= to_copy; 11023e: 8b 4d 18 mov 0x18(%ebp),%ecx 110241: 29 d1 sub %edx,%ecx 110243: 89 4d d4 mov %ecx,-0x2c(%ebp) 110246: eb 0b jmp 110253 unsigned int last_byte; unsigned int start_offset; int copied; const unsigned char *src; src = source; 110248: 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 ) { 11024b: 8b 45 18 mov 0x18(%ebp),%eax 11024e: 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; 110251: 31 d2 xor %edx,%edx /* * Phase 2: all of zero of more blocks */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; 110253: 8b 0d ec 4e 12 00 mov 0x124eec,%ecx 110259: 89 4d d0 mov %ecx,-0x30(%ebp) while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { 11025c: eb 2b jmp 110289 block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); 11025e: 50 push %eax 11025f: 6a 00 push $0x0 110261: 53 push %ebx 110262: ff 75 08 pushl 0x8(%ebp) 110265: 89 55 c8 mov %edx,-0x38(%ebp) 110268: e8 6f f9 ff ff call 10fbdc if ( !block_ptr ) 11026d: 83 c4 10 add $0x10,%esp 110270: 85 c0 test %eax,%eax 110272: 8b 55 c8 mov -0x38(%ebp),%edx 110275: 74 6a je 1102e1 <== 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 ); 110277: 8b 00 mov (%eax),%eax src += to_copy; 110279: 89 c7 mov %eax,%edi 11027b: 8b 4d d0 mov -0x30(%ebp),%ecx 11027e: f3 a4 rep movsb %ds:(%esi),%es:(%edi) block++; 110280: 43 inc %ebx my_length -= to_copy; 110281: 8b 45 d0 mov -0x30(%ebp),%eax 110284: 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( 110287: 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 ) { 110289: 8b 4d d4 mov -0x2c(%ebp),%ecx 11028c: 3b 0d ec 4e 12 00 cmp 0x124eec,%ecx 110292: 73 ca jae 11025e * 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 ) { 110294: 85 c9 test %ecx,%ecx 110296: 74 27 je 1102bf block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); 110298: 57 push %edi 110299: 6a 00 push $0x0 11029b: 53 push %ebx 11029c: ff 75 08 pushl 0x8(%ebp) 11029f: 89 55 c8 mov %edx,-0x38(%ebp) 1102a2: e8 35 f9 ff ff call 10fbdc if ( !block_ptr ) 1102a7: 83 c4 10 add $0x10,%esp 1102aa: 8b 55 c8 mov -0x38(%ebp),%edx 1102ad: 89 d1 mov %edx,%ecx 1102af: 85 c0 test %eax,%eax 1102b1: 74 30 je 1102e3 <== 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 ); 1102b3: 8b 00 mov (%eax),%eax 1102b5: 89 c7 mov %eax,%edi 1102b7: 8b 4d d4 mov -0x2c(%ebp),%ecx 1102ba: f3 a4 rep movsb %ds:(%esi),%es:(%edi) my_length = 0; copied += to_copy; 1102bc: 03 55 d4 add -0x2c(%ebp),%edx } IMFS_mtime_ctime_update( the_jnode ); 1102bf: 53 push %ebx 1102c0: 53 push %ebx 1102c1: 6a 00 push $0x0 1102c3: 8d 45 e0 lea -0x20(%ebp),%eax 1102c6: 50 push %eax 1102c7: 89 55 c8 mov %edx,-0x38(%ebp) 1102ca: e8 f1 70 ff ff call 1073c0 1102cf: 8b 45 e0 mov -0x20(%ebp),%eax 1102d2: 8b 5d 08 mov 0x8(%ebp),%ebx 1102d5: 89 43 44 mov %eax,0x44(%ebx) 1102d8: 89 43 48 mov %eax,0x48(%ebx) return copied; 1102db: 83 c4 10 add $0x10,%esp 1102de: 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 ) 1102e1: 89 d1 mov %edx,%ecx } IMFS_mtime_ctime_update( the_jnode ); return copied; } 1102e3: 89 c8 mov %ecx,%eax 1102e5: 8d 65 f4 lea -0xc(%ebp),%esp 1102e8: 5b pop %ebx 1102e9: 5e pop %esi 1102ea: 5f pop %edi 1102eb: c9 leave 1102ec: c3 ret =============================================================================== 00106d90 : #include int IMFS_mount( rtems_filesystem_mount_table_entry_t *mt_entry ) { 106d90: 55 push %ebp 106d91: 89 e5 mov %esp,%ebp 106d93: 83 ec 08 sub $0x8,%esp 106d96: 8b 55 08 mov 0x8(%ebp),%edx IMFS_jnode_t *node; node = mt_entry->mt_point_node.node_access; 106d99: 8b 42 08 mov 0x8(%edx),%eax /* * Is the node that we are mounting onto a directory node ? */ if ( node->type != IMFS_DIRECTORY ) 106d9c: 83 78 4c 01 cmpl $0x1,0x4c(%eax) 106da0: 74 10 je 106db2 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( ENOTDIR ); 106da2: e8 25 a3 00 00 call 1110cc <__errno> <== NOT EXECUTED 106da7: c7 00 14 00 00 00 movl $0x14,(%eax) <== NOT EXECUTED 106dad: 83 c8 ff or $0xffffffff,%eax <== NOT EXECUTED 106db0: eb 05 jmp 106db7 <== 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; 106db2: 89 50 5c mov %edx,0x5c(%eax) return 0; 106db5: 31 c0 xor %eax,%eax } 106db7: c9 leave 106db8: c3 ret =============================================================================== 00109528 : * This routine prints the contents of the specified jnode. */ void IMFS_print_jnode( IMFS_jnode_t *the_jnode ) { 109528: 55 push %ebp 109529: 89 e5 mov %esp,%ebp 10952b: 53 push %ebx 10952c: 83 ec 0c sub $0xc,%esp 10952f: 8b 5d 08 mov 0x8(%ebp),%ebx IMFS_assert( the_jnode ); fprintf(stdout, "%s", the_jnode->name ); 109532: a1 40 98 12 00 mov 0x129840,%eax 109537: ff 70 08 pushl 0x8(%eax) 10953a: 8d 43 0c lea 0xc(%ebx),%eax 10953d: 50 push %eax 10953e: e8 ed bd 00 00 call 115330 switch( the_jnode->type ) { 109543: 8b 43 4c mov 0x4c(%ebx),%eax 109546: 83 c4 10 add $0x10,%esp 109549: 8d 50 ff lea -0x1(%eax),%edx 10954c: 83 fa 06 cmp $0x6,%edx 10954f: 77 75 ja 1095c6 <== NEVER TAKEN 109551: a1 40 98 12 00 mov 0x129840,%eax 109556: ff 24 95 70 48 12 00 jmp *0x124870(,%edx,4) case IMFS_DIRECTORY: fprintf(stdout, "/" ); 10955d: 51 push %ecx 10955e: 51 push %ecx 10955f: ff 70 08 pushl 0x8(%eax) 109562: 6a 2f push $0x2f 109564: e8 1b bd 00 00 call 115284 109569: eb 2b jmp 109596 break; case IMFS_DEVICE: fprintf(stdout, " (device %" PRId32 ", %" PRId32 ")", 10956b: ff 73 54 pushl 0x54(%ebx) 10956e: ff 73 50 pushl 0x50(%ebx) 109571: 68 95 47 12 00 push $0x124795 109576: eb 16 jmp 10958e the_jnode->info.device.major, the_jnode->info.device.minor ); break; case IMFS_LINEAR_FILE: fprintf(stdout, " (file %" PRId32 " %p)", 109578: ff 73 58 pushl 0x58(%ebx) 10957b: ff 73 50 pushl 0x50(%ebx) 10957e: 68 a8 47 12 00 push $0x1247a8 109583: eb 09 jmp 10958e the_jnode->info.file.indirect, the_jnode->info.file.doubly_indirect, the_jnode->info.file.triply_indirect ); #else fprintf(stdout, " (file %" PRId32 ")", 109585: 52 push %edx 109586: ff 73 50 pushl 0x50(%ebx) 109589: 68 b7 47 12 00 push $0x1247b7 10958e: ff 70 08 pushl 0x8(%eax) 109591: e8 8e bc 00 00 call 115224 (uint32_t)the_jnode->info.file.size ); #endif break; 109596: 83 c4 10 add $0x10,%esp default: fprintf(stdout, " bad type %d\n", the_jnode->type ); return; } puts(""); 109599: c7 45 08 a1 4a 12 00 movl $0x124aa1,0x8(%ebp) } 1095a0: 8b 5d fc mov -0x4(%ebp),%ebx 1095a3: c9 leave default: fprintf(stdout, " bad type %d\n", the_jnode->type ); return; } puts(""); 1095a4: e9 4f d5 00 00 jmp 116af8 case IMFS_HARD_LINK: fprintf(stdout, " links not printed\n" ); return; case IMFS_SYM_LINK: fprintf(stdout, " links not printed\n" ); 1095a9: 53 push %ebx 1095aa: 53 push %ebx 1095ab: ff 70 08 pushl 0x8(%eax) 1095ae: 68 c3 47 12 00 push $0x1247c3 1095b3: eb 0a jmp 1095bf return; case IMFS_FIFO: fprintf(stdout, " FIFO not printed\n" ); 1095b5: 51 push %ecx 1095b6: 51 push %ecx 1095b7: ff 70 08 pushl 0x8(%eax) 1095ba: 68 d7 47 12 00 push $0x1247d7 1095bf: e8 6c bd 00 00 call 115330 1095c4: eb 14 jmp 1095da return; default: fprintf(stdout, " bad type %d\n", the_jnode->type ); 1095c6: 52 push %edx <== NOT EXECUTED 1095c7: 50 push %eax <== NOT EXECUTED 1095c8: 68 ea 47 12 00 push $0x1247ea <== NOT EXECUTED 1095cd: a1 40 98 12 00 mov 0x129840,%eax <== NOT EXECUTED 1095d2: ff 70 08 pushl 0x8(%eax) <== NOT EXECUTED 1095d5: e8 4a bc 00 00 call 115224 <== NOT EXECUTED return; 1095da: 83 c4 10 add $0x10,%esp } puts(""); } 1095dd: 8b 5d fc mov -0x4(%ebp),%ebx 1095e0: c9 leave 1095e1: c3 ret =============================================================================== 00106df8 : 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 */ ) { 106df8: 55 push %ebp 106df9: 89 e5 mov %esp,%ebp 106dfb: 53 push %ebx 106dfc: 83 ec 18 sub $0x18,%esp IMFS_jnode_t *the_jnode; IMFS_jnode_t *new_parent; the_jnode = old_loc->node_access; 106dff: 8b 45 0c mov 0xc(%ebp),%eax 106e02: 8b 18 mov (%eax),%ebx strncpy( the_jnode->name, new_name, IMFS_NAME_MAX ); 106e04: 6a 20 push $0x20 106e06: ff 75 14 pushl 0x14(%ebp) 106e09: 8d 43 0c lea 0xc(%ebx),%eax 106e0c: 50 push %eax 106e0d: e8 8a b1 00 00 call 111f9c if ( the_jnode->Parent != NULL ) 106e12: 83 c4 10 add $0x10,%esp 106e15: 83 7b 08 00 cmpl $0x0,0x8(%ebx) 106e19: 74 0c je 106e27 <== NEVER TAKEN */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); 106e1b: 83 ec 0c sub $0xc,%esp 106e1e: 53 push %ebx 106e1f: e8 e0 3b 00 00 call 10aa04 <_Chain_Extract> 106e24: 83 c4 10 add $0x10,%esp rtems_chain_extract( (rtems_chain_node *) the_jnode ); new_parent = new_parent_loc->node_access; 106e27: 8b 45 10 mov 0x10(%ebp),%eax 106e2a: 8b 00 mov (%eax),%eax the_jnode->Parent = new_parent; 106e2c: 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 ); 106e2f: 51 push %ecx 106e30: 51 push %ecx 106e31: 53 push %ebx rtems_chain_append( &new_parent->info.directory.Entries, &the_jnode->Node ); 106e32: 83 c0 50 add $0x50,%eax 106e35: 50 push %eax 106e36: e8 a5 3b 00 00 call 10a9e0 <_Chain_Append> /* * Update the time. */ IMFS_update_ctime( the_jnode ); 106e3b: 58 pop %eax 106e3c: 5a pop %edx 106e3d: 6a 00 push $0x0 106e3f: 8d 45 f0 lea -0x10(%ebp),%eax 106e42: 50 push %eax 106e43: e8 78 05 00 00 call 1073c0 106e48: 8b 45 f0 mov -0x10(%ebp),%eax 106e4b: 89 43 48 mov %eax,0x48(%ebx) return 0; } 106e4e: 31 c0 xor %eax,%eax 106e50: 8b 5d fc mov -0x4(%ebp),%ebx 106e53: c9 leave 106e54: c3 ret =============================================================================== 0010df48 : int IMFS_stat( rtems_filesystem_location_info_t *loc, struct stat *buf ) { 10df48: 55 push %ebp 10df49: 89 e5 mov %esp,%ebp 10df4b: 56 push %esi 10df4c: 53 push %ebx 10df4d: 8b 4d 08 mov 0x8(%ebp),%ecx 10df50: 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; 10df53: 8b 11 mov (%ecx),%edx switch ( the_jnode->type ) { 10df55: 8b 5a 4c mov 0x4c(%edx),%ebx 10df58: 83 eb 02 sub $0x2,%ebx 10df5b: 83 fb 05 cmp $0x5,%ebx 10df5e: 77 33 ja 10df93 <== NEVER TAKEN 10df60: ff 24 9d 30 f4 11 00 jmp *0x11f430(,%ebx,4) case IMFS_DEVICE: io = &the_jnode->info.device; buf->st_rdev = rtems_filesystem_make_dev_t( io->major, io->minor ); 10df67: 8b 5a 54 mov 0x54(%edx),%ebx rtems_device_minor_number _minor ) { union __rtems_dev_t temp; temp.__overlay.major = _major; 10df6a: 8b 72 50 mov 0x50(%edx),%esi 10df6d: 89 70 18 mov %esi,0x18(%eax) 10df70: 89 58 1c mov %ebx,0x1c(%eax) break; 10df73: eb 2e jmp 10dfa3 case IMFS_LINEAR_FILE: case IMFS_MEMORY_FILE: buf->st_size = the_jnode->info.file.size; 10df75: 8b 5a 50 mov 0x50(%edx),%ebx 10df78: 8b 72 54 mov 0x54(%edx),%esi 10df7b: 89 58 20 mov %ebx,0x20(%eax) 10df7e: 89 70 24 mov %esi,0x24(%eax) break; 10df81: eb 20 jmp 10dfa3 case IMFS_SYM_LINK: buf->st_size = 0; break; case IMFS_FIFO: buf->st_size = 0; 10df83: c7 40 20 00 00 00 00 movl $0x0,0x20(%eax) 10df8a: c7 40 24 00 00 00 00 movl $0x0,0x24(%eax) break; 10df91: eb 10 jmp 10dfa3 default: rtems_set_errno_and_return_minus_one( ENOTSUP ); 10df93: e8 34 31 00 00 call 1110cc <__errno> 10df98: c7 00 86 00 00 00 movl $0x86,(%eax) 10df9e: 83 c8 ff or $0xffffffff,%eax 10dfa1: eb 47 jmp 10dfea /* * The device number of the IMFS is the major number and the minor is the * instance. */ fs_info = loc->mt_entry->fs_info; 10dfa3: 8b 49 10 mov 0x10(%ecx),%ecx buf->st_dev = rtems_filesystem_make_dev_t( IMFS_DEVICE_MAJOR_NUMBER, fs_info->instance ); 10dfa6: 8b 49 34 mov 0x34(%ecx),%ecx 10dfa9: 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 = 10dfab: c7 00 fe ff 00 00 movl $0xfffe,(%eax) 10dfb1: 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; 10dfb4: 8b 4a 30 mov 0x30(%edx),%ecx 10dfb7: 89 48 0c mov %ecx,0xc(%eax) buf->st_nlink = the_jnode->st_nlink; 10dfba: 8b 4a 34 mov 0x34(%edx),%ecx 10dfbd: 66 89 48 10 mov %cx,0x10(%eax) buf->st_ino = the_jnode->st_ino; 10dfc1: 8b 4a 38 mov 0x38(%edx),%ecx 10dfc4: 89 48 08 mov %ecx,0x8(%eax) buf->st_uid = the_jnode->st_uid; 10dfc7: 8b 4a 3c mov 0x3c(%edx),%ecx 10dfca: 66 89 48 12 mov %cx,0x12(%eax) buf->st_gid = the_jnode->st_gid; 10dfce: 66 8b 4a 3e mov 0x3e(%edx),%cx 10dfd2: 66 89 48 14 mov %cx,0x14(%eax) buf->st_atime = the_jnode->stat_atime; 10dfd6: 8b 4a 40 mov 0x40(%edx),%ecx 10dfd9: 89 48 28 mov %ecx,0x28(%eax) buf->st_mtime = the_jnode->stat_mtime; 10dfdc: 8b 4a 44 mov 0x44(%edx),%ecx 10dfdf: 89 48 30 mov %ecx,0x30(%eax) buf->st_ctime = the_jnode->stat_ctime; 10dfe2: 8b 52 48 mov 0x48(%edx),%edx 10dfe5: 89 50 38 mov %edx,0x38(%eax) return 0; 10dfe8: 31 c0 xor %eax,%eax } 10dfea: 5b pop %ebx 10dfeb: 5e pop %esi 10dfec: c9 leave 10dfed: c3 ret =============================================================================== 00106ee4 : int IMFS_unlink( rtems_filesystem_location_info_t *parentloc, /* IN */ rtems_filesystem_location_info_t *loc /* IN */ ) { 106ee4: 55 push %ebp 106ee5: 89 e5 mov %esp,%ebp 106ee7: 57 push %edi 106ee8: 56 push %esi 106ee9: 53 push %ebx 106eea: 83 ec 2c sub $0x2c,%esp IMFS_jnode_t *node; rtems_filesystem_location_info_t the_link; int result = 0; node = loc->node_access; 106eed: 8b 45 0c mov 0xc(%ebp),%eax 106ef0: 8b 18 mov (%eax),%ebx /* * If this is the last last pointer to the node * free the node. */ if ( node->type == IMFS_HARD_LINK ) { 106ef2: 83 7b 4c 03 cmpl $0x3,0x4c(%ebx) 106ef6: 75 7a jne 106f72 if ( !node->info.hard_link.link_node ) 106ef8: 8b 43 50 mov 0x50(%ebx),%eax 106efb: 85 c0 test %eax,%eax 106efd: 75 10 jne 106f0f <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); 106eff: e8 c8 a1 00 00 call 1110cc <__errno> <== NOT EXECUTED 106f04: c7 00 16 00 00 00 movl $0x16,(%eax) <== NOT EXECUTED 106f0a: 83 c8 ff or $0xffffffff,%eax <== NOT EXECUTED 106f0d: eb 75 jmp 106f84 <== NOT EXECUTED the_link = *loc; 106f0f: 8d 7d cc lea -0x34(%ebp),%edi 106f12: b9 05 00 00 00 mov $0x5,%ecx 106f17: 8b 75 0c mov 0xc(%ebp),%esi 106f1a: f3 a5 rep movsl %ds:(%esi),%es:(%edi) the_link.node_access = node->info.hard_link.link_node; 106f1c: 89 45 cc mov %eax,-0x34(%ebp) IMFS_Set_handlers( &the_link ); 106f1f: 83 ec 0c sub $0xc,%esp 106f22: 8d 75 cc lea -0x34(%ebp),%esi 106f25: 56 push %esi 106f26: e8 ad 67 00 00 call 10d6d8 /* * 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) 106f2b: 8b 43 50 mov 0x50(%ebx),%eax 106f2e: 8b 50 34 mov 0x34(%eax),%edx 106f31: 83 c4 10 add $0x10,%esp 106f34: 66 83 fa 01 cmp $0x1,%dx 106f38: 75 1a jne 106f54 { result = (*the_link.handlers->rmnod_h)( parentloc, &the_link ); 106f3a: 51 push %ecx 106f3b: 51 push %ecx 106f3c: 56 push %esi 106f3d: ff 75 08 pushl 0x8(%ebp) 106f40: 8b 45 d4 mov -0x2c(%ebp),%eax 106f43: ff 50 34 call *0x34(%eax) 106f46: 89 c2 mov %eax,%edx if ( result != 0 ) 106f48: 83 c4 10 add $0x10,%esp return -1; 106f4b: 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 ) 106f4e: 85 d2 test %edx,%edx 106f50: 74 20 je 106f72 106f52: eb 30 jmp 106f84 return -1; } else { node->info.hard_link.link_node->st_nlink --; 106f54: 4a dec %edx 106f55: 66 89 50 34 mov %dx,0x34(%eax) IMFS_update_ctime( node->info.hard_link.link_node ); 106f59: 52 push %edx 106f5a: 52 push %edx 106f5b: 6a 00 push $0x0 106f5d: 8d 45 e0 lea -0x20(%ebp),%eax 106f60: 50 push %eax 106f61: e8 5a 04 00 00 call 1073c0 106f66: 8b 43 50 mov 0x50(%ebx),%eax 106f69: 8b 55 e0 mov -0x20(%ebp),%edx 106f6c: 89 50 48 mov %edx,0x48(%eax) 106f6f: 83 c4 10 add $0x10,%esp /* * Now actually free the node we were asked to free. */ result = (*loc->handlers->rmnod_h)( parentloc, loc ); 106f72: 50 push %eax 106f73: 50 push %eax 106f74: 8b 55 0c mov 0xc(%ebp),%edx 106f77: 8b 42 08 mov 0x8(%edx),%eax 106f7a: 52 push %edx 106f7b: ff 75 08 pushl 0x8(%ebp) 106f7e: ff 50 34 call *0x34(%eax) return result; 106f81: 83 c4 10 add $0x10,%esp } 106f84: 8d 65 f4 lea -0xc(%ebp),%esp 106f87: 5b pop %ebx 106f88: 5e pop %esi 106f89: 5f pop %edi 106f8a: c9 leave 106f8b: c3 ret =============================================================================== 00106f8c : #include int IMFS_unmount( rtems_filesystem_mount_table_entry_t *mt_entry ) { 106f8c: 55 push %ebp 106f8d: 89 e5 mov %esp,%ebp 106f8f: 83 ec 08 sub $0x8,%esp IMFS_jnode_t *node; node = mt_entry->mt_point_node.node_access; 106f92: 8b 45 08 mov 0x8(%ebp),%eax 106f95: 8b 40 08 mov 0x8(%eax),%eax /* * Is the node that we are mounting onto a directory node ? */ if ( node->type != IMFS_DIRECTORY ) 106f98: 83 78 4c 01 cmpl $0x1,0x4c(%eax) 106f9c: 74 0d je 106fab <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( ENOTDIR ); 106f9e: e8 29 a1 00 00 call 1110cc <__errno> <== NOT EXECUTED 106fa3: c7 00 14 00 00 00 movl $0x14,(%eax) <== NOT EXECUTED 106fa9: eb 11 jmp 106fbc <== NOT EXECUTED /* * Did the node indicate that there was a directory mounted here? */ if ( node->info.directory.mt_fs == NULL ) 106fab: 83 78 5c 00 cmpl $0x0,0x5c(%eax) 106faf: 75 10 jne 106fc1 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); /* XXX */ 106fb1: e8 16 a1 00 00 call 1110cc <__errno> <== NOT EXECUTED 106fb6: c7 00 16 00 00 00 movl $0x16,(%eax) <== NOT EXECUTED 106fbc: 83 c8 ff or $0xffffffff,%eax <== NOT EXECUTED 106fbf: eb 09 jmp 106fca <== 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; 106fc1: c7 40 5c 00 00 00 00 movl $0x0,0x5c(%eax) return 0; 106fc8: 31 c0 xor %eax,%eax } 106fca: c9 leave 106fcb: c3 ret =============================================================================== 00107108 : static rtems_printk_plugin_t print_handler; void Stack_check_Dump_threads_usage( Thread_Control *the_thread ) { 107108: 55 push %ebp <== NOT EXECUTED 107109: 89 e5 mov %esp,%ebp <== NOT EXECUTED 10710b: 57 push %edi <== NOT EXECUTED 10710c: 56 push %esi <== NOT EXECUTED 10710d: 53 push %ebx <== NOT EXECUTED 10710e: 83 ec 2c sub $0x2c,%esp <== NOT EXECUTED 107111: 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) { 107114: 83 fb ff cmp $0xffffffff,%ebx <== NOT EXECUTED 107117: 75 1d jne 107136 <== NOT EXECUTED if (!Stack_check_Interrupt_stack.area) 107119: 83 3d 3c 72 12 00 00 cmpl $0x0,0x12723c <== NOT EXECUTED 107120: 0f 84 f5 00 00 00 je 10721b <== NOT EXECUTED return; stack = &Stack_check_Interrupt_stack; 107126: ba 38 72 12 00 mov $0x127238,%edx <== NOT EXECUTED the_thread = 0; current = 0; 10712b: 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; 107132: 31 db xor %ebx,%ebx <== NOT EXECUTED 107134: eb 0f jmp 107145 <== NOT EXECUTED current = 0; } else #endif { stack = &the_thread->Start.Initial_stack; 107136: 8d 93 b8 00 00 00 lea 0xb8(%ebx),%edx <== NOT EXECUTED current = (void *)_CPU_Context_Get_SP( &the_thread->Registers ); 10713c: 8b 83 cc 00 00 00 mov 0xcc(%ebx),%eax <== NOT EXECUTED 107142: 89 45 d0 mov %eax,-0x30(%ebp) <== NOT EXECUTED } low = Stack_check_usable_stack_start(stack); 107145: 8b 42 04 mov 0x4(%edx),%eax <== NOT EXECUTED 107148: 8d 48 10 lea 0x10(%eax),%ecx <== NOT EXECUTED size = Stack_check_usable_stack_size(stack); 10714b: 8b 32 mov (%edx),%esi <== NOT EXECUTED 10714d: 83 ee 10 sub $0x10,%esi <== NOT EXECUTED 107150: 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; 107153: 83 c0 20 add $0x20,%eax <== NOT EXECUTED for (ebase = base + length; base < ebase; base++) 107156: 83 e6 fc and $0xfffffffc,%esi <== NOT EXECUTED 107159: 8d 34 30 lea (%eax,%esi,1),%esi <== NOT EXECUTED 10715c: eb 0b jmp 107169 <== NOT EXECUTED if (*base != U32_PATTERN) 10715e: 81 38 a5 a5 a5 a5 cmpl $0xa5a5a5a5,(%eax) <== NOT EXECUTED 107164: 75 0b jne 107171 <== 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++) 107166: 83 c0 04 add $0x4,%eax <== NOT EXECUTED 107169: 39 f0 cmp %esi,%eax <== NOT EXECUTED 10716b: 72 f1 jb 10715e <== 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; 10716d: 31 ff xor %edi,%edi <== NOT EXECUTED 10716f: eb 0e jmp 10717f <== NOT EXECUTED 107171: 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 ) 107173: 85 c0 test %eax,%eax <== NOT EXECUTED 107175: 74 08 je 10717f <== NOT EXECUTED used = Stack_check_Calculate_used( low, size, high_water_mark ); 107177: 8b 7d d4 mov -0x2c(%ebp),%edi <== NOT EXECUTED 10717a: 8d 3c 39 lea (%ecx,%edi,1),%edi <== NOT EXECUTED 10717d: 29 c7 sub %eax,%edi <== NOT EXECUTED else used = 0; #if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) if ( the_thread ) 10717f: 85 db test %ebx,%ebx <== NOT EXECUTED 107181: 8b 35 14 6f 12 00 mov 0x126f14,%esi <== NOT EXECUTED 107187: 74 28 je 1071b1 <== NOT EXECUTED #endif { (*print_handler)( 107189: 50 push %eax <== NOT EXECUTED 10718a: 8d 45 e3 lea -0x1d(%ebp),%eax <== NOT EXECUTED 10718d: 50 push %eax <== NOT EXECUTED 10718e: 6a 05 push $0x5 <== NOT EXECUTED 107190: ff 73 08 pushl 0x8(%ebx) <== NOT EXECUTED 107193: 89 55 cc mov %edx,-0x34(%ebp) <== NOT EXECUTED 107196: e8 b1 53 00 00 call 10c54c <== NOT EXECUTED 10719b: 50 push %eax <== NOT EXECUTED 10719c: ff 73 08 pushl 0x8(%ebx) <== NOT EXECUTED 10719f: 68 ab 15 12 00 push $0x1215ab <== NOT EXECUTED 1071a4: ff 35 10 6f 12 00 pushl 0x126f10 <== NOT EXECUTED 1071aa: ff d6 call *%esi <== NOT EXECUTED 1071ac: 83 c4 20 add $0x20,%esp <== NOT EXECUTED 1071af: eb 16 jmp 1071c7 <== 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 ); 1071b1: 53 push %ebx <== NOT EXECUTED 1071b2: 6a ff push $0xffffffff <== NOT EXECUTED 1071b4: 68 b8 15 12 00 push $0x1215b8 <== NOT EXECUTED 1071b9: ff 35 10 6f 12 00 pushl 0x126f10 <== NOT EXECUTED 1071bf: 89 55 cc mov %edx,-0x34(%ebp) <== NOT EXECUTED 1071c2: ff d6 call *%esi <== NOT EXECUTED 1071c4: 83 c4 10 add $0x10,%esp <== NOT EXECUTED 1071c7: 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, 1071ca: 8b 42 04 mov 0x4(%edx),%eax <== NOT EXECUTED else { (*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 ); } #endif (*print_handler)( 1071cd: 51 push %ecx <== NOT EXECUTED 1071ce: 51 push %ecx <== NOT EXECUTED 1071cf: ff 75 d4 pushl -0x2c(%ebp) <== NOT EXECUTED 1071d2: ff 75 d0 pushl -0x30(%ebp) <== NOT EXECUTED print_context, " %010p - %010p %010p %8" PRId32 " ", stack->area, stack->area + stack->size - 1, 1071d5: 8b 12 mov (%edx),%edx <== NOT EXECUTED else { (*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 ); } #endif (*print_handler)( 1071d7: 8d 54 10 ff lea -0x1(%eax,%edx,1),%edx <== NOT EXECUTED 1071db: 52 push %edx <== NOT EXECUTED 1071dc: 50 push %eax <== NOT EXECUTED 1071dd: 68 c6 15 12 00 push $0x1215c6 <== NOT EXECUTED 1071e2: ff 35 10 6f 12 00 pushl 0x126f10 <== NOT EXECUTED 1071e8: ff 15 14 6f 12 00 call *0x126f14 <== NOT EXECUTED stack->area + stack->size - 1, current, size ); if (Stack_check_Initialized == 0) { 1071ee: 83 c4 20 add $0x20,%esp <== NOT EXECUTED 1071f1: 83 3d 18 6f 12 00 00 cmpl $0x0,0x126f18 <== NOT EXECUTED 1071f8: 8b 35 14 6f 12 00 mov 0x126f14,%esi <== NOT EXECUTED 1071fe: 75 09 jne 107209 <== NOT EXECUTED (*print_handler)( print_context, "Unavailable\n" ); 107200: 52 push %edx <== NOT EXECUTED 107201: 52 push %edx <== NOT EXECUTED 107202: 68 e4 15 12 00 push $0x1215e4 <== NOT EXECUTED 107207: eb 07 jmp 107210 <== NOT EXECUTED } else { (*print_handler)( print_context, "%8" PRId32 "\n", used ); 107209: 50 push %eax <== NOT EXECUTED 10720a: 57 push %edi <== NOT EXECUTED 10720b: 68 f1 15 12 00 push $0x1215f1 <== NOT EXECUTED 107210: ff 35 10 6f 12 00 pushl 0x126f10 <== NOT EXECUTED 107216: ff d6 call *%esi <== NOT EXECUTED 107218: 83 c4 10 add $0x10,%esp <== NOT EXECUTED } } 10721b: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED 10721e: 5b pop %ebx <== NOT EXECUTED 10721f: 5e pop %esi <== NOT EXECUTED 107220: 5f pop %edi <== NOT EXECUTED 107221: c9 leave <== NOT EXECUTED 107222: c3 ret <== NOT EXECUTED =============================================================================== 00107223 : /* * Stack_check_Initialize */ void Stack_check_Initialize( void ) { 107223: 55 push %ebp 107224: 89 e5 mov %esp,%ebp 107226: 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 ) 107227: 83 3d 18 6f 12 00 00 cmpl $0x0,0x126f18 10722e: 75 5a jne 10728a /* * Dope the pattern and fill areas */ p = Stack_check_Pattern.pattern; for ( i = 0; i < PATTERN_SIZE_WORDS; i++ ) { p[i] = pattern[ i%4 ]; 107230: c7 05 28 72 12 00 0d movl $0xfeedf00d,0x127228 107237: f0 ed fe 10723a: c7 05 2c 72 12 00 06 movl $0xbad0d06,0x12722c 107241: 0d ad 0b 107244: c7 05 30 72 12 00 0d movl $0xdeadf00d,0x127230 10724b: f0 ad de 10724e: c7 05 34 72 12 00 06 movl $0x600d0d06,0x127234 107255: 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) { 107258: 8b 15 10 79 12 00 mov 0x127910,%edx 10725e: 85 d2 test %edx,%edx 107260: 74 1e je 107280 <== NEVER TAKEN 107262: 8b 0d 14 79 12 00 mov 0x127914,%ecx 107268: 85 c9 test %ecx,%ecx 10726a: 74 14 je 107280 <== NEVER TAKEN Stack_check_Interrupt_stack.area = _CPU_Interrupt_stack_low; 10726c: 89 15 3c 72 12 00 mov %edx,0x12723c Stack_check_Interrupt_stack.size = (char *) _CPU_Interrupt_stack_high - 107272: 29 d1 sub %edx,%ecx 107274: 89 0d 38 72 12 00 mov %ecx,0x127238 (char *) _CPU_Interrupt_stack_low; Stack_check_Dope_stack(&Stack_check_Interrupt_stack); 10727a: b0 a5 mov $0xa5,%al 10727c: 89 d7 mov %edx,%edi 10727e: f3 aa rep stos %al,%es:(%edi) } #endif Stack_check_Initialized = 1; 107280: c7 05 18 6f 12 00 01 movl $0x1,0x126f18 107287: 00 00 00 } 10728a: 5f pop %edi 10728b: c9 leave 10728c: c3 ret =============================================================================== 001072db : Thread_Control *running, bool pattern_ok ) RTEMS_COMPILER_NO_RETURN_ATTRIBUTE; void Stack_check_report_blown_task(Thread_Control *running, bool pattern_ok) { 1072db: 55 push %ebp <== NOT EXECUTED 1072dc: 89 e5 mov %esp,%ebp <== NOT EXECUTED 1072de: 56 push %esi <== NOT EXECUTED 1072df: 53 push %ebx <== NOT EXECUTED 1072e0: 83 ec 3c sub $0x3c,%esp <== NOT EXECUTED 1072e3: 8b 5d 08 mov 0x8(%ebp),%ebx <== NOT EXECUTED 1072e6: 8a 55 0c mov 0xc(%ebp),%dl <== NOT EXECUTED Stack_Control *stack = &running->Start.Initial_stack; void *pattern_area = Stack_check_Get_pattern(stack); 1072e9: 8b b3 bc 00 00 00 mov 0xbc(%ebx),%esi <== NOT EXECUTED char name[32]; printk("BLOWN STACK!!!\n"); 1072ef: 68 f7 15 12 00 push $0x1215f7 <== NOT EXECUTED 1072f4: 88 55 d4 mov %dl,-0x2c(%ebp) <== NOT EXECUTED 1072f7: e8 08 19 00 00 call 108c04 <== NOT EXECUTED printk("task control block: 0x%08" PRIxPTR "\n", running); 1072fc: 5a pop %edx <== NOT EXECUTED 1072fd: 59 pop %ecx <== NOT EXECUTED 1072fe: 53 push %ebx <== NOT EXECUTED 1072ff: 68 07 16 12 00 push $0x121607 <== NOT EXECUTED 107304: e8 fb 18 00 00 call 108c04 <== NOT EXECUTED printk("task ID: 0x%08lx\n", (unsigned long) running->Object.id); 107309: 59 pop %ecx <== NOT EXECUTED 10730a: 58 pop %eax <== NOT EXECUTED 10730b: ff 73 08 pushl 0x8(%ebx) <== NOT EXECUTED 10730e: 68 24 16 12 00 push $0x121624 <== NOT EXECUTED 107313: e8 ec 18 00 00 call 108c04 <== NOT EXECUTED printk( 107318: 58 pop %eax <== NOT EXECUTED 107319: 5a pop %edx <== NOT EXECUTED 10731a: ff 73 0c pushl 0xc(%ebx) <== NOT EXECUTED 10731d: 68 36 16 12 00 push $0x121636 <== NOT EXECUTED 107322: e8 dd 18 00 00 call 108c04 <== NOT EXECUTED "task name: 0x%08" PRIx32 "\n", running->Object.name.name_u32 ); printk( 107327: 83 c4 0c add $0xc,%esp <== NOT EXECUTED 10732a: 8d 45 d8 lea -0x28(%ebp),%eax <== NOT EXECUTED 10732d: 50 push %eax <== NOT EXECUTED 10732e: 6a 20 push $0x20 <== NOT EXECUTED 107330: ff 73 08 pushl 0x8(%ebx) <== NOT EXECUTED 107333: e8 14 52 00 00 call 10c54c <== NOT EXECUTED 107338: 5a pop %edx <== NOT EXECUTED 107339: 59 pop %ecx <== NOT EXECUTED 10733a: 50 push %eax <== NOT EXECUTED 10733b: 68 4a 16 12 00 push $0x12164a <== NOT EXECUTED 107340: e8 bf 18 00 00 call 108c04 <== 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) 107345: 8b 8b bc 00 00 00 mov 0xbc(%ebx),%ecx <== NOT EXECUTED 10734b: 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( 107351: 8d 1c 01 lea (%ecx,%eax,1),%ebx <== NOT EXECUTED 107354: 53 push %ebx <== NOT EXECUTED 107355: 51 push %ecx <== NOT EXECUTED 107356: 50 push %eax <== NOT EXECUTED 107357: 68 60 16 12 00 push $0x121660 <== NOT EXECUTED 10735c: e8 a3 18 00 00 call 108c04 <== 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) { 107361: 83 c4 20 add $0x20,%esp <== NOT EXECUTED 107364: 8a 55 d4 mov -0x2c(%ebp),%dl <== NOT EXECUTED 107367: 84 d2 test %dl,%dl <== NOT EXECUTED 107369: 75 17 jne 107382 <== 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); 10736b: 8d 46 08 lea 0x8(%esi),%eax <== NOT EXECUTED (unsigned long) stack->size, stack->area, ((char *) stack->area + stack->size) ); if (!pattern_ok) { printk( 10736e: 83 c6 18 add $0x18,%esi <== NOT EXECUTED 107371: 56 push %esi <== NOT EXECUTED 107372: 50 push %eax <== NOT EXECUTED 107373: 6a 10 push $0x10 <== NOT EXECUTED 107375: 68 91 16 12 00 push $0x121691 <== NOT EXECUTED 10737a: e8 85 18 00 00 call 108c04 <== NOT EXECUTED 10737f: 83 c4 10 add $0x10,%esp <== NOT EXECUTED rtems_configuration_get_user_multiprocessing_table()->node ); } #endif rtems_fatal_error_occurred(0x81); 107382: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 107385: 68 81 00 00 00 push $0x81 <== NOT EXECUTED 10738a: e8 05 59 00 00 call 10cc94 <== NOT EXECUTED =============================================================================== 0010ce0c <_CORE_RWLock_Release>: */ CORE_RWLock_Status _CORE_RWLock_Release( CORE_RWLock_Control *the_rwlock ) { 10ce0c: 55 push %ebp 10ce0d: 89 e5 mov %esp,%ebp 10ce0f: 53 push %ebx 10ce10: 83 ec 04 sub $0x4,%esp 10ce13: 8b 5d 08 mov 0x8(%ebp),%ebx ISR_Level level; Thread_Control *executing = _Thread_Executing; 10ce16: 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 ); 10ce1c: 9c pushf 10ce1d: fa cli 10ce1e: 58 pop %eax if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){ 10ce1f: 8b 4b 44 mov 0x44(%ebx),%ecx 10ce22: 85 c9 test %ecx,%ecx 10ce24: 75 0b jne 10ce31 <_CORE_RWLock_Release+0x25> _ISR_Enable( level ); 10ce26: 50 push %eax 10ce27: 9d popf executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE; 10ce28: c7 42 34 02 00 00 00 movl $0x2,0x34(%edx) return CORE_RWLOCK_SUCCESSFUL; 10ce2f: eb 72 jmp 10cea3 <_CORE_RWLock_Release+0x97> } if ( the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_READING ) { 10ce31: 49 dec %ecx 10ce32: 75 0f jne 10ce43 <_CORE_RWLock_Release+0x37> the_rwlock->number_of_readers -= 1; 10ce34: 8b 4b 48 mov 0x48(%ebx),%ecx 10ce37: 49 dec %ecx 10ce38: 89 4b 48 mov %ecx,0x48(%ebx) if ( the_rwlock->number_of_readers != 0 ) { 10ce3b: 85 c9 test %ecx,%ecx 10ce3d: 74 04 je 10ce43 <_CORE_RWLock_Release+0x37> /* must be unlocked again */ _ISR_Enable( level ); 10ce3f: 50 push %eax 10ce40: 9d popf return CORE_RWLOCK_SUCCESSFUL; 10ce41: eb 60 jmp 10cea3 <_CORE_RWLock_Release+0x97> } } /* CORE_RWLOCK_LOCKED_FOR_WRITING or READING with readers */ executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL; 10ce43: 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; 10ce4a: c7 43 44 00 00 00 00 movl $0x0,0x44(%ebx) _ISR_Enable( level ); 10ce51: 50 push %eax 10ce52: 9d popf next = _Thread_queue_Dequeue( &the_rwlock->Wait_queue ); 10ce53: 83 ec 0c sub $0xc,%esp 10ce56: 53 push %ebx 10ce57: e8 e0 17 00 00 call 10e63c <_Thread_queue_Dequeue> if ( next ) { 10ce5c: 83 c4 10 add $0x10,%esp 10ce5f: 85 c0 test %eax,%eax 10ce61: 74 40 je 10cea3 <_CORE_RWLock_Release+0x97> if ( next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) { 10ce63: 83 78 30 01 cmpl $0x1,0x30(%eax) 10ce67: 75 09 jne 10ce72 <_CORE_RWLock_Release+0x66> the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_WRITING; 10ce69: c7 43 44 02 00 00 00 movl $0x2,0x44(%ebx) return CORE_RWLOCK_SUCCESSFUL; 10ce70: eb 31 jmp 10cea3 <_CORE_RWLock_Release+0x97> } /* * Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING */ the_rwlock->number_of_readers += 1; 10ce72: ff 43 48 incl 0x48(%ebx) the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING; 10ce75: 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 ); 10ce7c: 83 ec 0c sub $0xc,%esp 10ce7f: 53 push %ebx 10ce80: e8 af 1b 00 00 call 10ea34 <_Thread_queue_First> if ( !next || 10ce85: 83 c4 10 add $0x10,%esp 10ce88: 85 c0 test %eax,%eax 10ce8a: 74 17 je 10cea3 <_CORE_RWLock_Release+0x97> 10ce8c: 83 78 30 01 cmpl $0x1,0x30(%eax) 10ce90: 74 11 je 10cea3 <_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; 10ce92: ff 43 48 incl 0x48(%ebx) _Thread_queue_Extract( &the_rwlock->Wait_queue, next ); 10ce95: 52 push %edx 10ce96: 52 push %edx 10ce97: 50 push %eax 10ce98: 53 push %ebx 10ce99: e8 86 1a 00 00 call 10e924 <_Thread_queue_Extract> } 10ce9e: 83 c4 10 add $0x10,%esp 10cea1: eb d9 jmp 10ce7c <_CORE_RWLock_Release+0x70> } /* indentation is to match _ISR_Disable at top */ return CORE_RWLOCK_SUCCESSFUL; } 10cea3: 31 c0 xor %eax,%eax 10cea5: 8b 5d fc mov -0x4(%ebp),%ebx 10cea8: c9 leave 10cea9: c3 ret =============================================================================== 0010ceac <_CORE_RWLock_Timeout>: void _CORE_RWLock_Timeout( Objects_Id id, void *ignored ) { 10ceac: 55 push %ebp 10cead: 89 e5 mov %esp,%ebp 10ceaf: 83 ec 20 sub $0x20,%esp Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); 10ceb2: 8d 45 f4 lea -0xc(%ebp),%eax 10ceb5: 50 push %eax 10ceb6: ff 75 08 pushl 0x8(%ebp) 10ceb9: e8 66 14 00 00 call 10e324 <_Thread_Get> switch ( location ) { 10cebe: 83 c4 10 add $0x10,%esp 10cec1: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) 10cec5: 75 17 jne 10cede <_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 ); 10cec7: 83 ec 0c sub $0xc,%esp 10ceca: 50 push %eax 10cecb: e8 30 1c 00 00 call 10eb00 <_Thread_queue_Process_timeout> */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; 10ced0: a1 50 83 12 00 mov 0x128350,%eax 10ced5: 48 dec %eax 10ced6: a3 50 83 12 00 mov %eax,0x128350 10cedb: 83 c4 10 add $0x10,%esp _Thread_Unnest_dispatch(); break; } } 10cede: c9 leave 10cedf: c3 ret =============================================================================== 0011736c <_CORE_message_queue_Broadcast>: Objects_Id id __attribute__((unused)), CORE_message_queue_API_mp_support_callout api_message_queue_mp_support __attribute__((unused)), #endif uint32_t *count ) { 11736c: 55 push %ebp 11736d: 89 e5 mov %esp,%ebp 11736f: 57 push %edi 117370: 56 push %esi 117371: 53 push %ebx 117372: 83 ec 1c sub $0x1c,%esp 117375: 8b 5d 08 mov 0x8(%ebp),%ebx Thread_Control *the_thread; uint32_t number_broadcasted; Thread_Wait_information *waitp; if ( size > the_message_queue->maximum_message_size ) { return CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE; 117378: b8 01 00 00 00 mov $0x1,%eax { Thread_Control *the_thread; uint32_t number_broadcasted; Thread_Wait_information *waitp; if ( size > the_message_queue->maximum_message_size ) { 11737d: 8b 55 10 mov 0x10(%ebp),%edx 117380: 3b 53 4c cmp 0x4c(%ebx),%edx 117383: 77 4e ja 1173d3 <_CORE_message_queue_Broadcast+0x67><== NEVER TAKEN * NOTE: This check is critical because threads can block on * send and receive and this ensures that we are broadcasting * the message to threads waiting to receive -- not to send. */ if ( the_message_queue->number_of_pending_messages != 0 ) { 117385: 83 7b 48 00 cmpl $0x0,0x48(%ebx) 117389: 75 09 jne 117394 <_CORE_message_queue_Broadcast+0x28> 11738b: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) 117392: eb 23 jmp 1173b7 <_CORE_message_queue_Broadcast+0x4b> *count = 0; 117394: 8b 45 1c mov 0x1c(%ebp),%eax 117397: c7 00 00 00 00 00 movl $0x0,(%eax) 11739d: eb 32 jmp 1173d1 <_CORE_message_queue_Broadcast+0x65> */ number_broadcasted = 0; while ((the_thread = _Thread_queue_Dequeue(&the_message_queue->Wait_queue))) { waitp = &the_thread->Wait; number_broadcasted += 1; 11739f: ff 45 e4 incl -0x1c(%ebp) const void *source, void *destination, size_t size ) { memcpy(destination, source, size); 1173a2: 8b 42 2c mov 0x2c(%edx),%eax 1173a5: 89 c7 mov %eax,%edi 1173a7: 8b 75 0c mov 0xc(%ebp),%esi 1173aa: 8b 4d 10 mov 0x10(%ebp),%ecx 1173ad: f3 a4 rep movsb %ds:(%esi),%es:(%edi) buffer, waitp->return_argument_second.mutable_object, size ); *(size_t *) the_thread->Wait.return_argument = size; 1173af: 8b 42 28 mov 0x28(%edx),%eax 1173b2: 8b 55 10 mov 0x10(%ebp),%edx 1173b5: 89 10 mov %edx,(%eax) /* * There must be no pending messages if there is a thread waiting to * receive a message. */ number_broadcasted = 0; while ((the_thread = 1173b7: 83 ec 0c sub $0xc,%esp 1173ba: 53 push %ebx 1173bb: e8 0c 25 00 00 call 1198cc <_Thread_queue_Dequeue> 1173c0: 89 c2 mov %eax,%edx 1173c2: 83 c4 10 add $0x10,%esp 1173c5: 85 c0 test %eax,%eax 1173c7: 75 d6 jne 11739f <_CORE_message_queue_Broadcast+0x33> if ( !_Objects_Is_local_id( the_thread->Object.id ) ) (*api_message_queue_mp_support) ( the_thread, id ); #endif } *count = number_broadcasted; 1173c9: 8b 55 e4 mov -0x1c(%ebp),%edx 1173cc: 8b 45 1c mov 0x1c(%ebp),%eax 1173cf: 89 10 mov %edx,(%eax) return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL; 1173d1: 31 c0 xor %eax,%eax } 1173d3: 8d 65 f4 lea -0xc(%ebp),%esp 1173d6: 5b pop %ebx 1173d7: 5e pop %esi 1173d8: 5f pop %edi 1173d9: c9 leave 1173da: c3 ret =============================================================================== 00112220 <_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 ) { 112220: 55 push %ebp 112221: 89 e5 mov %esp,%ebp 112223: 57 push %edi 112224: 56 push %esi 112225: 53 push %ebx 112226: 83 ec 1c sub $0x1c,%esp 112229: 8b 5d 08 mov 0x8(%ebp),%ebx 11222c: 8b 7d 10 mov 0x10(%ebp),%edi 11222f: 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; 112232: 89 7b 44 mov %edi,0x44(%ebx) the_message_queue->number_of_pending_messages = 0; 112235: c7 43 48 00 00 00 00 movl $0x0,0x48(%ebx) the_message_queue->maximum_message_size = maximum_message_size; 11223c: 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; 11223f: c7 43 60 00 00 00 00 movl $0x0,0x60(%ebx) the_message_queue->notify_argument = the_argument; 112246: 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)) { 11224d: 89 d0 mov %edx,%eax 11224f: f6 c2 03 test $0x3,%dl 112252: 74 0c je 112260 <_CORE_message_queue_Initialize+0x40> allocated_message_size += sizeof(uint32_t); 112254: 83 c0 04 add $0x4,%eax allocated_message_size &= ~(sizeof(uint32_t) - 1); 112257: 83 e0 fc and $0xfffffffc,%eax } if (allocated_message_size < maximum_message_size) return false; 11225a: 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) 11225c: 39 d0 cmp %edx,%eax 11225e: 72 68 jb 1122c8 <_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)); 112260: 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 * 112263: 89 d1 mov %edx,%ecx 112265: 0f af cf imul %edi,%ecx (allocated_message_size + sizeof(CORE_message_queue_Buffer_control)); if (message_buffering_required < allocated_message_size) return false; 112268: 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) 11226a: 39 c1 cmp %eax,%ecx 11226c: 72 5a jb 1122c8 <_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 ); 11226e: 83 ec 0c sub $0xc,%esp 112271: 51 push %ecx 112272: 89 55 e4 mov %edx,-0x1c(%ebp) 112275: e8 a4 27 00 00 call 114a1e <_Workspace_Allocate> return false; /* * Attempt to allocate the message memory */ the_message_queue->message_buffers = (CORE_message_queue_Buffer *) 11227a: 89 43 5c mov %eax,0x5c(%ebx) _Workspace_Allocate( message_buffering_required ); if (the_message_queue->message_buffers == 0) 11227d: 83 c4 10 add $0x10,%esp 112280: 85 c0 test %eax,%eax 112282: 8b 55 e4 mov -0x1c(%ebp),%edx 112285: 74 41 je 1122c8 <_CORE_message_queue_Initialize+0xa8> /* * Initialize the pool of inactive messages, pending messages, * and set of waiting threads. */ _Chain_Initialize ( 112287: 52 push %edx 112288: 57 push %edi 112289: 50 push %eax 11228a: 8d 43 68 lea 0x68(%ebx),%eax 11228d: 50 push %eax 11228e: e8 e9 4a 00 00 call 116d7c <_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 ); 112293: 8d 43 54 lea 0x54(%ebx),%eax 112296: 89 43 50 mov %eax,0x50(%ebx) head->next = tail; head->previous = NULL; 112299: 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 ); 1122a0: 8d 43 50 lea 0x50(%ebx),%eax 1122a3: 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( 1122a6: 6a 06 push $0x6 1122a8: 68 80 00 00 00 push $0x80 1122ad: 8b 45 0c mov 0xc(%ebp),%eax 1122b0: 83 38 01 cmpl $0x1,(%eax) 1122b3: 0f 94 c0 sete %al 1122b6: 0f b6 c0 movzbl %al,%eax 1122b9: 50 push %eax 1122ba: 53 push %ebx 1122bb: e8 84 1f 00 00 call 114244 <_Thread_queue_Initialize> THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO, STATES_WAITING_FOR_MESSAGE, CORE_MESSAGE_QUEUE_STATUS_TIMEOUT ); return true; 1122c0: 83 c4 20 add $0x20,%esp 1122c3: be 01 00 00 00 mov $0x1,%esi } 1122c8: 89 f0 mov %esi,%eax 1122ca: 8d 65 f4 lea -0xc(%ebp),%esp 1122cd: 5b pop %ebx 1122ce: 5e pop %esi 1122cf: 5f pop %edi 1122d0: c9 leave 1122d1: c3 ret =============================================================================== 001122d4 <_CORE_message_queue_Seize>: void *buffer, size_t *size_p, bool wait, Watchdog_Interval timeout ) { 1122d4: 55 push %ebp 1122d5: 89 e5 mov %esp,%ebp 1122d7: 57 push %edi 1122d8: 56 push %esi 1122d9: 53 push %ebx 1122da: 83 ec 2c sub $0x2c,%esp 1122dd: 8b 55 08 mov 0x8(%ebp),%edx 1122e0: 8b 45 0c mov 0xc(%ebp),%eax 1122e3: 89 45 dc mov %eax,-0x24(%ebp) 1122e6: 8b 5d 10 mov 0x10(%ebp),%ebx 1122e9: 89 5d e0 mov %ebx,-0x20(%ebp) 1122ec: 8b 4d 14 mov 0x14(%ebp),%ecx 1122ef: 8b 75 1c mov 0x1c(%ebp),%esi 1122f2: 89 75 d4 mov %esi,-0x2c(%ebp) 1122f5: 8a 45 18 mov 0x18(%ebp),%al 1122f8: 88 45 db mov %al,-0x25(%ebp) ISR_Level level; CORE_message_queue_Buffer_control *the_message; Thread_Control *executing; executing = _Thread_Executing; 1122fb: a1 f0 d9 12 00 mov 0x12d9f0,%eax executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL; 112300: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax) _ISR_Disable( level ); 112307: 9c pushf 112308: fa cli 112309: 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 ); } 11230c: 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 ); 11230f: 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)) 112312: 39 f3 cmp %esi,%ebx 112314: 0f 84 8a 00 00 00 je 1123a4 <_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; 11231a: 8b 33 mov (%ebx),%esi head->next = new_first; 11231c: 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 ); 11231f: 8d 7a 50 lea 0x50(%edx),%edi 112322: 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 ) { 112325: 85 db test %ebx,%ebx 112327: 74 7b je 1123a4 <_CORE_message_queue_Seize+0xd0><== NEVER TAKEN the_message_queue->number_of_pending_messages -= 1; 112329: ff 4a 48 decl 0x48(%edx) _ISR_Enable( level ); 11232c: ff 75 e4 pushl -0x1c(%ebp) 11232f: 9d popf *size_p = the_message->Contents.size; 112330: 8b 43 0c mov 0xc(%ebx),%eax 112333: 89 01 mov %eax,(%ecx) _Thread_Executing->Wait.count = 112335: 8b 73 08 mov 0x8(%ebx),%esi 112338: a1 f0 d9 12 00 mov 0x12d9f0,%eax 11233d: 89 70 24 mov %esi,0x24(%eax) _CORE_message_queue_Get_message_priority( the_message ); _CORE_message_queue_Copy_buffer( the_message->Contents.buffer, 112340: 8d 73 10 lea 0x10(%ebx),%esi 112343: 89 75 e4 mov %esi,-0x1c(%ebp) const void *source, void *destination, size_t size ) { memcpy(destination, source, size); 112346: 8b 09 mov (%ecx),%ecx 112348: 8b 7d e0 mov -0x20(%ebp),%edi 11234b: 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 ); 11234d: 83 ec 0c sub $0xc,%esp 112350: 52 push %edx 112351: 89 55 d0 mov %edx,-0x30(%ebp) 112354: e8 b3 1b 00 00 call 113f0c <_Thread_queue_Dequeue> if ( !the_thread ) { 112359: 83 c4 10 add $0x10,%esp 11235c: 85 c0 test %eax,%eax 11235e: 8b 55 d0 mov -0x30(%ebp),%edx 112361: 75 15 jne 112378 <_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 ); 112363: 89 5d 0c mov %ebx,0xc(%ebp) 112366: 83 c2 68 add $0x68,%edx 112369: 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 ); } 11236c: 8d 65 f4 lea -0xc(%ebp),%esp 11236f: 5b pop %ebx 112370: 5e pop %esi 112371: 5f pop %edi 112372: c9 leave 112373: e9 28 fe ff ff jmp 1121a0 <_Chain_Append> CORE_message_queue_Buffer_control *the_message, int priority ) { #if defined(RTEMS_SCORE_COREMSG_ENABLE_MESSAGE_PRIORITY) the_message->priority = priority; 112378: 8b 48 24 mov 0x24(%eax),%ecx 11237b: 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; 11237e: 8b 48 30 mov 0x30(%eax),%ecx 112381: 89 4b 0c mov %ecx,0xc(%ebx) const void *source, void *destination, size_t size ) { memcpy(destination, source, size); 112384: 8b 70 2c mov 0x2c(%eax),%esi 112387: 8b 7d e4 mov -0x1c(%ebp),%edi 11238a: 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( 11238c: 8b 43 08 mov 0x8(%ebx),%eax 11238f: 89 45 10 mov %eax,0x10(%ebp) 112392: 89 5d 0c mov %ebx,0xc(%ebp) 112395: 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 ); } 112398: 8d 65 f4 lea -0xc(%ebp),%esp 11239b: 5b pop %ebx 11239c: 5e pop %esi 11239d: 5f pop %edi 11239e: c9 leave the_thread->Wait.return_argument_second.immutable_object, the_message->Contents.buffer, the_message->Contents.size ); _CORE_message_queue_Insert_message( 11239f: e9 10 4a 00 00 jmp 116db4 <_CORE_message_queue_Insert_message> return; } #endif } if ( !wait ) { 1123a4: 80 7d db 00 cmpb $0x0,-0x25(%ebp) 1123a8: 75 13 jne 1123bd <_CORE_message_queue_Seize+0xe9> _ISR_Enable( level ); 1123aa: ff 75 e4 pushl -0x1c(%ebp) 1123ad: 9d popf executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT; 1123ae: 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 ); } 1123b5: 8d 65 f4 lea -0xc(%ebp),%esp 1123b8: 5b pop %ebx 1123b9: 5e pop %esi 1123ba: 5f pop %edi 1123bb: c9 leave 1123bc: 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; 1123bd: 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; 1123c4: 89 50 44 mov %edx,0x44(%eax) executing->Wait.id = id; 1123c7: 8b 5d dc mov -0x24(%ebp),%ebx 1123ca: 89 58 20 mov %ebx,0x20(%eax) executing->Wait.return_argument_second.mutable_object = buffer; 1123cd: 8b 75 e0 mov -0x20(%ebp),%esi 1123d0: 89 70 2c mov %esi,0x2c(%eax) executing->Wait.return_argument = size_p; 1123d3: 89 48 28 mov %ecx,0x28(%eax) /* Wait.count will be filled in with the message priority */ _ISR_Enable( level ); 1123d6: ff 75 e4 pushl -0x1c(%ebp) 1123d9: 9d popf _Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout ); 1123da: c7 45 10 f4 42 11 00 movl $0x1142f4,0x10(%ebp) 1123e1: 8b 45 d4 mov -0x2c(%ebp),%eax 1123e4: 89 45 0c mov %eax,0xc(%ebp) 1123e7: 89 55 08 mov %edx,0x8(%ebp) } 1123ea: 8d 65 f4 lea -0xc(%ebp),%esp 1123ed: 5b pop %ebx 1123ee: 5e pop %esi 1123ef: 5f pop %edi 1123f0: 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 ); 1123f1: e9 22 1c 00 00 jmp 114018 <_Thread_queue_Enqueue_with_handler> =============================================================================== 0010ac2d <_CORE_mutex_Seize>: Objects_Id _id, bool _wait, Watchdog_Interval _timeout, ISR_Level _level ) { 10ac2d: 55 push %ebp 10ac2e: 89 e5 mov %esp,%ebp 10ac30: 53 push %ebx 10ac31: 83 ec 14 sub $0x14,%esp 10ac34: 8b 5d 08 mov 0x8(%ebp),%ebx 10ac37: 8a 55 10 mov 0x10(%ebp),%dl _CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level ); 10ac3a: a1 40 53 12 00 mov 0x125340,%eax 10ac3f: 85 c0 test %eax,%eax 10ac41: 74 19 je 10ac5c <_CORE_mutex_Seize+0x2f> 10ac43: 84 d2 test %dl,%dl 10ac45: 74 15 je 10ac5c <_CORE_mutex_Seize+0x2f><== NEVER TAKEN 10ac47: 83 3d 9c 54 12 00 01 cmpl $0x1,0x12549c 10ac4e: 76 0c jbe 10ac5c <_CORE_mutex_Seize+0x2f> 10ac50: 53 push %ebx 10ac51: 6a 12 push $0x12 10ac53: 6a 00 push $0x0 10ac55: 6a 00 push $0x0 10ac57: e8 dc 05 00 00 call 10b238 <_Internal_error_Occurred> 10ac5c: 51 push %ecx 10ac5d: 51 push %ecx 10ac5e: 8d 45 18 lea 0x18(%ebp),%eax 10ac61: 50 push %eax 10ac62: 53 push %ebx 10ac63: 88 55 f4 mov %dl,-0xc(%ebp) 10ac66: e8 c9 47 00 00 call 10f434 <_CORE_mutex_Seize_interrupt_trylock> 10ac6b: 83 c4 10 add $0x10,%esp 10ac6e: 85 c0 test %eax,%eax 10ac70: 8a 55 f4 mov -0xc(%ebp),%dl 10ac73: 74 48 je 10acbd <_CORE_mutex_Seize+0x90> 10ac75: 84 d2 test %dl,%dl 10ac77: 75 12 jne 10ac8b <_CORE_mutex_Seize+0x5e> 10ac79: ff 75 18 pushl 0x18(%ebp) 10ac7c: 9d popf 10ac7d: a1 68 58 12 00 mov 0x125868,%eax 10ac82: c7 40 34 01 00 00 00 movl $0x1,0x34(%eax) 10ac89: eb 32 jmp 10acbd <_CORE_mutex_Seize+0x90> 10ac8b: c7 43 30 01 00 00 00 movl $0x1,0x30(%ebx) 10ac92: a1 68 58 12 00 mov 0x125868,%eax 10ac97: 89 58 44 mov %ebx,0x44(%eax) 10ac9a: 8b 55 0c mov 0xc(%ebp),%edx 10ac9d: 89 50 20 mov %edx,0x20(%eax) 10aca0: a1 40 53 12 00 mov 0x125340,%eax 10aca5: 40 inc %eax 10aca6: a3 40 53 12 00 mov %eax,0x125340 10acab: ff 75 18 pushl 0x18(%ebp) 10acae: 9d popf 10acaf: 50 push %eax 10acb0: 50 push %eax 10acb1: ff 75 14 pushl 0x14(%ebp) 10acb4: 53 push %ebx 10acb5: e8 26 ff ff ff call 10abe0 <_CORE_mutex_Seize_interrupt_blocking> 10acba: 83 c4 10 add $0x10,%esp } 10acbd: 8b 5d fc mov -0x4(%ebp),%ebx 10acc0: c9 leave 10acc1: c3 ret =============================================================================== 0010ade8 <_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 ) { 10ade8: 55 push %ebp 10ade9: 89 e5 mov %esp,%ebp 10adeb: 53 push %ebx 10adec: 83 ec 10 sub $0x10,%esp 10adef: 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)) ) { 10adf2: 53 push %ebx 10adf3: e8 dc 16 00 00 call 10c4d4 <_Thread_queue_Dequeue> 10adf8: 89 c2 mov %eax,%edx 10adfa: 83 c4 10 add $0x10,%esp { Thread_Control *the_thread; ISR_Level level; CORE_semaphore_Status status; status = CORE_SEMAPHORE_STATUS_SUCCESSFUL; 10adfd: 31 c0 xor %eax,%eax if ( (the_thread = _Thread_queue_Dequeue(&the_semaphore->Wait_queue)) ) { 10adff: 85 d2 test %edx,%edx 10ae01: 75 15 jne 10ae18 <_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 ); 10ae03: 9c pushf 10ae04: fa cli 10ae05: 59 pop %ecx if ( the_semaphore->count < the_semaphore->Attributes.maximum_count ) 10ae06: 8b 53 48 mov 0x48(%ebx),%edx the_semaphore->count += 1; else status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED; 10ae09: 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 ) 10ae0b: 3b 53 40 cmp 0x40(%ebx),%edx 10ae0e: 73 06 jae 10ae16 <_CORE_semaphore_Surrender+0x2e><== NEVER TAKEN the_semaphore->count += 1; 10ae10: 42 inc %edx 10ae11: 89 53 48 mov %edx,0x48(%ebx) { Thread_Control *the_thread; ISR_Level level; CORE_semaphore_Status status; status = CORE_SEMAPHORE_STATUS_SUCCESSFUL; 10ae14: 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 ); 10ae16: 51 push %ecx 10ae17: 9d popf } return status; } 10ae18: 8b 5d fc mov -0x4(%ebp),%ebx 10ae1b: c9 leave 10ae1c: c3 ret =============================================================================== 00109d4c <_Event_Surrender>: */ void _Event_Surrender( Thread_Control *the_thread ) { 109d4c: 55 push %ebp 109d4d: 89 e5 mov %esp,%ebp 109d4f: 57 push %edi 109d50: 56 push %esi 109d51: 53 push %ebx 109d52: 83 ec 2c sub $0x2c,%esp 109d55: 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 ]; 109d58: 8b bb e8 00 00 00 mov 0xe8(%ebx),%edi option_set = (rtems_option) the_thread->Wait.option; 109d5e: 8b 43 30 mov 0x30(%ebx),%eax 109d61: 89 45 e0 mov %eax,-0x20(%ebp) _ISR_Disable( level ); 109d64: 9c pushf 109d65: fa cli 109d66: 58 pop %eax pending_events = api->pending_events; 109d67: 8b 17 mov (%edi),%edx 109d69: 89 55 d4 mov %edx,-0x2c(%ebp) event_condition = (rtems_event_set) the_thread->Wait.count; 109d6c: 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 ) ) { 109d6f: 21 f2 and %esi,%edx 109d71: 75 07 jne 109d7a <_Event_Surrender+0x2e> _ISR_Enable( level ); 109d73: 50 push %eax 109d74: 9d popf return; 109d75: e9 af 00 00 00 jmp 109e29 <_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() && 109d7a: 83 3d 64 58 12 00 00 cmpl $0x0,0x125864 109d81: 74 49 je 109dcc <_Event_Surrender+0x80> 109d83: 3b 1d 68 58 12 00 cmp 0x125868,%ebx 109d89: 75 41 jne 109dcc <_Event_Surrender+0x80> _Thread_Is_executing( the_thread ) && ((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) || 109d8b: 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 ) && 109d91: 83 f9 02 cmp $0x2,%ecx 109d94: 74 09 je 109d9f <_Event_Surrender+0x53> <== NEVER TAKEN ((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) || (_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) { 109d96: 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) || 109d9c: 49 dec %ecx 109d9d: 75 2d jne 109dcc <_Event_Surrender+0x80> (_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) { if ( seized_events == event_condition || _Options_Is_any(option_set) ) { 109d9f: 39 f2 cmp %esi,%edx 109da1: 74 06 je 109da9 <_Event_Surrender+0x5d> 109da3: f6 45 e0 02 testb $0x2,-0x20(%ebp) 109da7: 74 1f je 109dc8 <_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) ); 109da9: 89 d6 mov %edx,%esi 109dab: f7 d6 not %esi 109dad: 23 75 d4 and -0x2c(%ebp),%esi 109db0: 89 37 mov %esi,(%edi) api->pending_events = _Event_sets_Clear( pending_events,seized_events ); the_thread->Wait.count = 0; 109db2: c7 43 24 00 00 00 00 movl $0x0,0x24(%ebx) *(rtems_event_set *)the_thread->Wait.return_argument = seized_events; 109db9: 8b 4b 28 mov 0x28(%ebx),%ecx 109dbc: 89 11 mov %edx,(%ecx) _Event_Sync_state = THREAD_BLOCKING_OPERATION_SATISFIED; 109dbe: c7 05 3c 5c 12 00 03 movl $0x3,0x125c3c 109dc5: 00 00 00 } _ISR_Enable( level ); 109dc8: 50 push %eax 109dc9: 9d popf return; 109dca: eb 5d jmp 109e29 <_Event_Surrender+0xdd> } /* * Otherwise, this is a normal send to another thread */ if ( _States_Is_waiting_for_event( the_thread->current_state ) ) { 109dcc: f6 43 11 01 testb $0x1,0x11(%ebx) 109dd0: 74 55 je 109e27 <_Event_Surrender+0xdb> if ( seized_events == event_condition || _Options_Is_any( option_set ) ) { 109dd2: 39 f2 cmp %esi,%edx 109dd4: 74 06 je 109ddc <_Event_Surrender+0x90> 109dd6: f6 45 e0 02 testb $0x2,-0x20(%ebp) 109dda: 74 4b je 109e27 <_Event_Surrender+0xdb> <== NEVER TAKEN 109ddc: 89 d6 mov %edx,%esi 109dde: f7 d6 not %esi 109de0: 23 75 d4 and -0x2c(%ebp),%esi 109de3: 89 37 mov %esi,(%edi) api->pending_events = _Event_sets_Clear( pending_events, seized_events ); the_thread->Wait.count = 0; 109de5: c7 43 24 00 00 00 00 movl $0x0,0x24(%ebx) *(rtems_event_set *)the_thread->Wait.return_argument = seized_events; 109dec: 8b 4b 28 mov 0x28(%ebx),%ecx 109def: 89 11 mov %edx,(%ecx) _ISR_Flash( level ); 109df1: 50 push %eax 109df2: 9d popf 109df3: fa cli if ( !_Watchdog_Is_active( &the_thread->Timer ) ) { 109df4: 83 7b 50 02 cmpl $0x2,0x50(%ebx) 109df8: 74 06 je 109e00 <_Event_Surrender+0xb4> _ISR_Enable( level ); 109dfa: 50 push %eax 109dfb: 9d popf RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); 109dfc: 51 push %ecx 109dfd: 51 push %ecx 109dfe: eb 17 jmp 109e17 <_Event_Surrender+0xcb> RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate( Watchdog_Control *the_watchdog ) { the_watchdog->state = WATCHDOG_REMOVE_IT; 109e00: c7 43 50 03 00 00 00 movl $0x3,0x50(%ebx) _Thread_Unblock( the_thread ); } else { _Watchdog_Deactivate( &the_thread->Timer ); _ISR_Enable( level ); 109e07: 50 push %eax 109e08: 9d popf (void) _Watchdog_Remove( &the_thread->Timer ); 109e09: 83 ec 0c sub $0xc,%esp 109e0c: 8d 43 48 lea 0x48(%ebx),%eax 109e0f: 50 push %eax 109e10: e8 b7 30 00 00 call 10cecc <_Watchdog_Remove> 109e15: 58 pop %eax 109e16: 5a pop %edx 109e17: 68 f8 ff 03 10 push $0x1003fff8 109e1c: 53 push %ebx 109e1d: e8 62 20 00 00 call 10be84 <_Thread_Clear_state> 109e22: 83 c4 10 add $0x10,%esp 109e25: eb 02 jmp 109e29 <_Event_Surrender+0xdd> _Thread_Unblock( the_thread ); } return; } } _ISR_Enable( level ); 109e27: 50 push %eax 109e28: 9d popf } 109e29: 8d 65 f4 lea -0xc(%ebp),%esp 109e2c: 5b pop %ebx 109e2d: 5e pop %esi 109e2e: 5f pop %edi 109e2f: c9 leave 109e30: c3 ret =============================================================================== 00109e34 <_Event_Timeout>: void _Event_Timeout( Objects_Id id, void *ignored ) { 109e34: 55 push %ebp 109e35: 89 e5 mov %esp,%ebp 109e37: 83 ec 20 sub $0x20,%esp Thread_Control *the_thread; Objects_Locations location; ISR_Level level; the_thread = _Thread_Get( id, &location ); 109e3a: 8d 45 f4 lea -0xc(%ebp),%eax 109e3d: 50 push %eax 109e3e: ff 75 08 pushl 0x8(%ebp) 109e41: e8 76 23 00 00 call 10c1bc <_Thread_Get> switch ( location ) { 109e46: 83 c4 10 add $0x10,%esp 109e49: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) 109e4d: 75 49 jne 109e98 <_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 ); 109e4f: 9c pushf 109e50: fa cli 109e51: 5a pop %edx _ISR_Enable( level ); return; } #endif the_thread->Wait.count = 0; 109e52: c7 40 24 00 00 00 00 movl $0x0,0x24(%eax) if ( _Thread_Is_executing( the_thread ) ) { 109e59: 3b 05 68 58 12 00 cmp 0x125868,%eax 109e5f: 75 13 jne 109e74 <_Event_Timeout+0x40> if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) 109e61: 8b 0d 3c 5c 12 00 mov 0x125c3c,%ecx 109e67: 49 dec %ecx 109e68: 75 0a jne 109e74 <_Event_Timeout+0x40> _Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT; 109e6a: c7 05 3c 5c 12 00 02 movl $0x2,0x125c3c 109e71: 00 00 00 } the_thread->Wait.return_code = RTEMS_TIMEOUT; 109e74: c7 40 34 06 00 00 00 movl $0x6,0x34(%eax) _ISR_Enable( level ); 109e7b: 52 push %edx 109e7c: 9d popf 109e7d: 52 push %edx 109e7e: 52 push %edx 109e7f: 68 f8 ff 03 10 push $0x1003fff8 109e84: 50 push %eax 109e85: e8 fa 1f 00 00 call 10be84 <_Thread_Clear_state> */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; 109e8a: a1 40 53 12 00 mov 0x125340,%eax 109e8f: 48 dec %eax 109e90: a3 40 53 12 00 mov %eax,0x125340 _Thread_Unblock( the_thread ); _Thread_Unnest_dispatch(); break; 109e95: 83 c4 10 add $0x10,%esp case OBJECTS_REMOTE: /* impossible */ #endif case OBJECTS_ERROR: break; } } 109e98: c9 leave 109e99: c3 ret =============================================================================== 0010fa7b <_Heap_Extend>: Heap_Control *heap, void *extend_area_begin_ptr, uintptr_t extend_area_size, uintptr_t *extended_size_ptr ) { 10fa7b: 55 push %ebp 10fa7c: 89 e5 mov %esp,%ebp 10fa7e: 57 push %edi 10fa7f: 56 push %esi 10fa80: 53 push %ebx 10fa81: 83 ec 4c sub $0x4c,%esp 10fa84: 8b 5d 08 mov 0x8(%ebp),%ebx 10fa87: 8b 4d 10 mov 0x10(%ebp),%ecx Heap_Statistics *const stats = &heap->stats; Heap_Block *const first_block = heap->first_block; 10fa8a: 8b 43 20 mov 0x20(%ebx),%eax 10fa8d: 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; 10fa90: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) Heap_Block *extend_last_block = NULL; 10fa97: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp) uintptr_t const page_size = heap->page_size; 10fa9e: 8b 53 10 mov 0x10(%ebx),%edx 10faa1: 89 55 c4 mov %edx,-0x3c(%ebp) uintptr_t const min_block_size = heap->min_block_size; 10faa4: 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; 10faa7: 8b 7b 30 mov 0x30(%ebx),%edi 10faaa: 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; 10faad: 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 ) { 10faaf: 8b 7d 0c mov 0xc(%ebp),%edi 10fab2: 01 cf add %ecx,%edi 10fab4: 0f 82 d4 01 00 00 jb 10fc8e <_Heap_Extend+0x213> return false; } extend_area_ok = _Heap_Get_first_and_last_block( 10faba: 52 push %edx 10fabb: 52 push %edx 10fabc: 8d 55 e0 lea -0x20(%ebp),%edx 10fabf: 52 push %edx 10fac0: 8d 55 e4 lea -0x1c(%ebp),%edx 10fac3: 52 push %edx 10fac4: 50 push %eax 10fac5: ff 75 c4 pushl -0x3c(%ebp) 10fac8: 51 push %ecx 10fac9: ff 75 0c pushl 0xc(%ebp) 10facc: e8 8a b8 ff ff call 10b35b <_Heap_Get_first_and_last_block> page_size, min_block_size, &extend_first_block, &extend_last_block ); if (!extend_area_ok ) { 10fad1: 83 c4 20 add $0x20,%esp 10fad4: 84 c0 test %al,%al 10fad6: 0f 84 b2 01 00 00 je 10fc8e <_Heap_Extend+0x213> 10fadc: 8b 4d c0 mov -0x40(%ebp),%ecx 10fadf: c7 45 cc 00 00 00 00 movl $0x0,-0x34(%ebp) 10fae6: c7 45 c8 00 00 00 00 movl $0x0,-0x38(%ebp) 10faed: 31 f6 xor %esi,%esi 10faef: 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; 10faf6: 8b 43 18 mov 0x18(%ebx),%eax 10faf9: 89 5d b8 mov %ebx,-0x48(%ebp) 10fafc: eb 02 jmp 10fb00 <_Heap_Extend+0x85> 10fafe: 89 c8 mov %ecx,%eax uintptr_t const sub_area_end = start_block->prev_size; 10fb00: 8b 19 mov (%ecx),%ebx Heap_Block *const end_block = _Heap_Block_of_alloc_area( sub_area_end, page_size ); if ( 10fb02: 39 c7 cmp %eax,%edi 10fb04: 76 09 jbe 10fb0f <_Heap_Extend+0x94> 10fb06: 39 5d 0c cmp %ebx,0xc(%ebp) 10fb09: 0f 82 7d 01 00 00 jb 10fc8c <_Heap_Extend+0x211> sub_area_end > extend_area_begin && extend_area_end > sub_area_begin ) { return false; } if ( extend_area_end == sub_area_begin ) { 10fb0f: 39 c7 cmp %eax,%edi 10fb11: 74 06 je 10fb19 <_Heap_Extend+0x9e> merge_below_block = start_block; } else if ( extend_area_end < sub_area_end ) { 10fb13: 39 df cmp %ebx,%edi 10fb15: 72 07 jb 10fb1e <_Heap_Extend+0xa3> 10fb17: eb 08 jmp 10fb21 <_Heap_Extend+0xa6> sub_area_end > extend_area_begin && extend_area_end > sub_area_begin ) { return false; } if ( extend_area_end == sub_area_begin ) { 10fb19: 89 4d d0 mov %ecx,-0x30(%ebp) 10fb1c: eb 03 jmp 10fb21 <_Heap_Extend+0xa6> merge_below_block = start_block; } else if ( extend_area_end < sub_area_end ) { 10fb1e: 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); 10fb21: 8d 43 f8 lea -0x8(%ebx),%eax 10fb24: 89 45 d4 mov %eax,-0x2c(%ebp) 10fb27: 89 d8 mov %ebx,%eax 10fb29: 31 d2 xor %edx,%edx 10fb2b: 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); 10fb2e: 29 55 d4 sub %edx,-0x2c(%ebp) link_below_block = start_block; } if ( sub_area_end == extend_area_begin ) { 10fb31: 3b 5d 0c cmp 0xc(%ebp),%ebx 10fb34: 75 07 jne 10fb3d <_Heap_Extend+0xc2> start_block->prev_size = extend_area_end; 10fb36: 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 ) 10fb38: 8b 75 d4 mov -0x2c(%ebp),%esi 10fb3b: eb 08 jmp 10fb45 <_Heap_Extend+0xca> merge_above_block = end_block; } else if ( sub_area_end < extend_area_begin ) { 10fb3d: 73 06 jae 10fb45 <_Heap_Extend+0xca> 10fb3f: 8b 55 d4 mov -0x2c(%ebp),%edx 10fb42: 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; 10fb45: 8b 45 d4 mov -0x2c(%ebp),%eax 10fb48: 8b 48 04 mov 0x4(%eax),%ecx 10fb4b: 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); 10fb4e: 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 ); 10fb50: 3b 4d c0 cmp -0x40(%ebp),%ecx 10fb53: 75 a9 jne 10fafe <_Heap_Extend+0x83> 10fb55: 8b 5d b8 mov -0x48(%ebp),%ebx if ( extend_area_begin < heap->area_begin ) { 10fb58: 8b 55 0c mov 0xc(%ebp),%edx 10fb5b: 3b 53 18 cmp 0x18(%ebx),%edx 10fb5e: 73 05 jae 10fb65 <_Heap_Extend+0xea> heap->area_begin = extend_area_begin; 10fb60: 89 53 18 mov %edx,0x18(%ebx) 10fb63: eb 08 jmp 10fb6d <_Heap_Extend+0xf2> } else if ( heap->area_end < extend_area_end ) { 10fb65: 39 7b 1c cmp %edi,0x1c(%ebx) 10fb68: 73 03 jae 10fb6d <_Heap_Extend+0xf2> heap->area_end = extend_area_end; 10fb6a: 89 7b 1c mov %edi,0x1c(%ebx) } extend_first_block_size = (uintptr_t) extend_last_block - (uintptr_t) extend_first_block; 10fb6d: 8b 45 e0 mov -0x20(%ebp),%eax 10fb70: 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 = 10fb73: 89 c1 mov %eax,%ecx 10fb75: 29 d1 sub %edx,%ecx 10fb77: 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; 10fb7a: 89 3a mov %edi,(%edx) extend_first_block->size_and_flag = extend_first_block_size | HEAP_PREV_BLOCK_USED; 10fb7c: 83 c9 01 or $0x1,%ecx 10fb7f: 89 4a 04 mov %ecx,0x4(%edx) _Heap_Protection_block_initialize( heap, extend_first_block ); extend_last_block->prev_size = extend_first_block_size; 10fb82: 8b 4d d4 mov -0x2c(%ebp),%ecx 10fb85: 89 08 mov %ecx,(%eax) extend_last_block->size_and_flag = 0; 10fb87: 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 ) { 10fb8e: 39 53 20 cmp %edx,0x20(%ebx) 10fb91: 76 05 jbe 10fb98 <_Heap_Extend+0x11d> heap->first_block = extend_first_block; 10fb93: 89 53 20 mov %edx,0x20(%ebx) 10fb96: eb 08 jmp 10fba0 <_Heap_Extend+0x125> } else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) { 10fb98: 39 43 24 cmp %eax,0x24(%ebx) 10fb9b: 73 03 jae 10fba0 <_Heap_Extend+0x125> heap->last_block = extend_last_block; 10fb9d: 89 43 24 mov %eax,0x24(%ebx) } if ( merge_below_block != NULL ) { 10fba0: 83 7d d0 00 cmpl $0x0,-0x30(%ebp) 10fba4: 74 3b je 10fbe1 <_Heap_Extend+0x166> Heap_Control *heap, uintptr_t extend_area_begin, Heap_Block *first_block ) { uintptr_t const page_size = heap->page_size; 10fba6: 8b 43 10 mov 0x10(%ebx),%eax 10fba9: 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 ); 10fbac: 8b 4d 0c mov 0xc(%ebp),%ecx 10fbaf: 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; 10fbb2: 89 c8 mov %ecx,%eax 10fbb4: 31 d2 xor %edx,%edx 10fbb6: f7 75 d4 divl -0x2c(%ebp) if ( remainder != 0 ) { 10fbb9: 85 d2 test %edx,%edx 10fbbb: 74 05 je 10fbc2 <_Heap_Extend+0x147> <== ALWAYS TAKEN return value - remainder + alignment; 10fbbd: 03 4d d4 add -0x2c(%ebp),%ecx <== NOT EXECUTED 10fbc0: 29 d1 sub %edx,%ecx <== NOT EXECUTED uintptr_t const new_first_block_begin = 10fbc2: 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; 10fbc5: 8b 45 d0 mov -0x30(%ebp),%eax 10fbc8: 8b 00 mov (%eax),%eax 10fbca: 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 = 10fbcd: 8b 45 d0 mov -0x30(%ebp),%eax 10fbd0: 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; 10fbd2: 83 c8 01 or $0x1,%eax 10fbd5: 89 42 04 mov %eax,0x4(%edx) _Heap_Free_block( heap, new_first_block ); 10fbd8: 89 d8 mov %ebx,%eax 10fbda: e8 81 fe ff ff call 10fa60 <_Heap_Free_block> 10fbdf: eb 14 jmp 10fbf5 <_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 ) { 10fbe1: 83 7d c8 00 cmpl $0x0,-0x38(%ebp) 10fbe5: 74 0e je 10fbf5 <_Heap_Extend+0x17a> _Heap_Link_below( 10fbe7: 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; 10fbea: 8b 45 c8 mov -0x38(%ebp),%eax 10fbed: 29 d0 sub %edx,%eax 10fbef: 83 c8 01 or $0x1,%eax 10fbf2: 89 42 04 mov %eax,0x4(%edx) link_below_block, extend_last_block ); } if ( merge_above_block != NULL ) { 10fbf5: 85 f6 test %esi,%esi 10fbf7: 74 30 je 10fc29 <_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, 10fbf9: 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( 10fbfc: 29 f7 sub %esi,%edi RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down( uintptr_t value, uintptr_t alignment ) { return value - (value % alignment); 10fbfe: 89 f8 mov %edi,%eax 10fc00: 31 d2 xor %edx,%edx 10fc02: f7 73 10 divl 0x10(%ebx) 10fc05: 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) 10fc07: 8b 46 04 mov 0x4(%esi),%eax 10fc0a: 29 f8 sub %edi,%eax | HEAP_PREV_BLOCK_USED; 10fc0c: 83 c8 01 or $0x1,%eax 10fc0f: 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; 10fc13: 8b 46 04 mov 0x4(%esi),%eax 10fc16: 83 e0 01 and $0x1,%eax block->size_and_flag = size | flag; 10fc19: 09 f8 or %edi,%eax 10fc1b: 89 46 04 mov %eax,0x4(%esi) _Heap_Block_set_size( last_block, last_block_new_size ); _Heap_Free_block( heap, last_block ); 10fc1e: 89 f2 mov %esi,%edx 10fc20: 89 d8 mov %ebx,%eax 10fc22: e8 39 fe ff ff call 10fa60 <_Heap_Free_block> 10fc27: eb 21 jmp 10fc4a <_Heap_Extend+0x1cf> ); } if ( merge_above_block != NULL ) { _Heap_Merge_above( heap, merge_above_block, extend_area_end ); } else if ( link_above_block != NULL ) { 10fc29: 83 7d cc 00 cmpl $0x0,-0x34(%ebp) 10fc2d: 74 1b je 10fc4a <_Heap_Extend+0x1cf> _Heap_Link_above( 10fc2f: 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 ); 10fc32: 8b 45 e4 mov -0x1c(%ebp),%eax 10fc35: 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; 10fc38: 8b 7d cc mov -0x34(%ebp),%edi 10fc3b: 8b 57 04 mov 0x4(%edi),%edx 10fc3e: 83 e2 01 and $0x1,%edx block->size_and_flag = size | flag; 10fc41: 09 d0 or %edx,%eax 10fc43: 89 47 04 mov %eax,0x4(%edi) last_block->size_and_flag |= HEAP_PREV_BLOCK_USED; 10fc46: 83 49 04 01 orl $0x1,0x4(%ecx) extend_first_block, extend_last_block ); } if ( merge_below_block == NULL && merge_above_block == NULL ) { 10fc4a: 85 f6 test %esi,%esi 10fc4c: 75 10 jne 10fc5e <_Heap_Extend+0x1e3> 10fc4e: 83 7d d0 00 cmpl $0x0,-0x30(%ebp) 10fc52: 75 0a jne 10fc5e <_Heap_Extend+0x1e3> _Heap_Free_block( heap, extend_first_block ); 10fc54: 8b 55 e4 mov -0x1c(%ebp),%edx 10fc57: 89 d8 mov %ebx,%eax 10fc59: e8 02 fe ff ff call 10fa60 <_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 10fc5e: 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( 10fc61: 8b 43 20 mov 0x20(%ebx),%eax 10fc64: 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; 10fc66: 8b 4a 04 mov 0x4(%edx),%ecx 10fc69: 83 e1 01 and $0x1,%ecx block->size_and_flag = size | flag; 10fc6c: 09 c8 or %ecx,%eax 10fc6e: 89 42 04 mov %eax,0x4(%edx) } _Heap_Set_last_block_size( heap ); extended_size = stats->free_size - free_size; 10fc71: 8b 43 30 mov 0x30(%ebx),%eax 10fc74: 2b 45 bc sub -0x44(%ebp),%eax /* Statistics */ stats->size += extended_size; 10fc77: 01 43 2c add %eax,0x2c(%ebx) if ( extended_size_ptr != NULL ) *extended_size_ptr = extended_size; return true; 10fc7a: 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 ) 10fc7f: 83 7d 14 00 cmpl $0x0,0x14(%ebp) 10fc83: 74 09 je 10fc8e <_Heap_Extend+0x213> <== NEVER TAKEN *extended_size_ptr = extended_size; 10fc85: 8b 55 14 mov 0x14(%ebp),%edx 10fc88: 89 02 mov %eax,(%edx) 10fc8a: eb 02 jmp 10fc8e <_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; 10fc8c: 31 f6 xor %esi,%esi if ( extended_size_ptr != NULL ) *extended_size_ptr = extended_size; return true; } 10fc8e: 89 f0 mov %esi,%eax 10fc90: 8d 65 f4 lea -0xc(%ebp),%esp 10fc93: 5b pop %ebx 10fc94: 5e pop %esi 10fc95: 5f pop %edi 10fc96: c9 leave 10fc97: c3 ret =============================================================================== 0010f6d0 <_Heap_Free>: return do_free; } #endif bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr ) { 10f6d0: 55 push %ebp 10f6d1: 89 e5 mov %esp,%ebp 10f6d3: 57 push %edi 10f6d4: 56 push %esi 10f6d5: 53 push %ebx 10f6d6: 83 ec 14 sub $0x14,%esp 10f6d9: 8b 4d 08 mov 0x8(%ebp),%ecx 10f6dc: 8b 45 0c mov 0xc(%ebp),%eax 10f6df: 8d 58 f8 lea -0x8(%eax),%ebx 10f6e2: 31 d2 xor %edx,%edx 10f6e4: 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); 10f6e7: 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 10f6e9: 8b 41 20 mov 0x20(%ecx),%eax 10f6ec: 89 45 ec mov %eax,-0x14(%ebp) && (uintptr_t) block <= (uintptr_t) heap->last_block; 10f6ef: 31 d2 xor %edx,%edx 10f6f1: 39 c3 cmp %eax,%ebx 10f6f3: 72 08 jb 10f6fd <_Heap_Free+0x2d> 10f6f5: 31 d2 xor %edx,%edx 10f6f7: 39 59 24 cmp %ebx,0x24(%ecx) 10f6fa: 0f 93 c2 setae %dl bool next_is_free = false; _Heap_Protection_block_check( heap, block ); if ( !_Heap_Is_block_in_heap( heap, block ) ) { return false; 10f6fd: 31 c0 xor %eax,%eax uintptr_t next_block_size = 0; bool next_is_free = false; _Heap_Protection_block_check( heap, block ); if ( !_Heap_Is_block_in_heap( heap, block ) ) { 10f6ff: 85 d2 test %edx,%edx 10f701: 0f 84 21 01 00 00 je 10f828 <_Heap_Free+0x158> --stats->used_blocks; ++stats->frees; stats->free_size += block_size; return( true ); } 10f707: 8b 43 04 mov 0x4(%ebx),%eax 10f70a: 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; 10f70d: 89 c6 mov %eax,%esi 10f70f: 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); 10f712: 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; 10f715: 31 ff xor %edi,%edi 10f717: 3b 55 ec cmp -0x14(%ebp),%edx 10f71a: 72 0a jb 10f726 <_Heap_Free+0x56> <== NEVER TAKEN 10f71c: 31 c0 xor %eax,%eax 10f71e: 39 51 24 cmp %edx,0x24(%ecx) 10f721: 0f 93 c0 setae %al 10f724: 89 c7 mov %eax,%edi _Heap_Protection_block_check( heap, next_block ); if ( !_Heap_Is_block_in_heap( heap, next_block ) ) { _HAssert( false ); return false; 10f726: 31 c0 xor %eax,%eax block_size = _Heap_Block_size( block ); next_block = _Heap_Block_at( block, block_size ); _Heap_Protection_block_check( heap, next_block ); if ( !_Heap_Is_block_in_heap( heap, next_block ) ) { 10f728: 85 ff test %edi,%edi 10f72a: 0f 84 f8 00 00 00 je 10f828 <_Heap_Free+0x158> <== NEVER TAKEN --stats->used_blocks; ++stats->frees; stats->free_size += block_size; return( true ); } 10f730: 8b 7a 04 mov 0x4(%edx),%edi if ( !_Heap_Is_block_in_heap( heap, next_block ) ) { _HAssert( false ); return false; } if ( !_Heap_Is_prev_used( next_block ) ) { 10f733: f7 c7 01 00 00 00 test $0x1,%edi 10f739: 0f 84 e9 00 00 00 je 10f828 <_Heap_Free+0x158> <== 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; 10f73f: 83 e7 fe and $0xfffffffe,%edi 10f742: 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 10f745: 8b 41 24 mov 0x24(%ecx),%eax 10f748: 89 45 e4 mov %eax,-0x1c(%ebp) && !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size )); 10f74b: 31 c0 xor %eax,%eax 10f74d: 3b 55 e4 cmp -0x1c(%ebp),%edx 10f750: 74 0a je 10f75c <_Heap_Free+0x8c> 10f752: 31 c0 xor %eax,%eax 10f754: f6 44 3a 04 01 testb $0x1,0x4(%edx,%edi,1) 10f759: 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 10f75c: 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 ) ) { 10f75f: f6 45 f0 01 testb $0x1,-0x10(%ebp) 10f763: 75 62 jne 10f7c7 <_Heap_Free+0xf7> uintptr_t const prev_size = block->prev_size; 10f765: 8b 03 mov (%ebx),%eax 10f767: 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); 10f76a: 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; 10f76c: 31 ff xor %edi,%edi 10f76e: 3b 5d ec cmp -0x14(%ebp),%ebx 10f771: 72 0a jb 10f77d <_Heap_Free+0xad> <== NEVER TAKEN 10f773: 31 c0 xor %eax,%eax 10f775: 39 5d e4 cmp %ebx,-0x1c(%ebp) 10f778: 0f 93 c0 setae %al 10f77b: 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 ); 10f77d: 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 ) ) { 10f77f: 85 ff test %edi,%edi 10f781: 0f 84 a1 00 00 00 je 10f828 <_Heap_Free+0x158> <== 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) ) { 10f787: f6 43 04 01 testb $0x1,0x4(%ebx) 10f78b: 0f 84 97 00 00 00 je 10f828 <_Heap_Free+0x158> <== NEVER TAKEN _HAssert( false ); return( false ); } if ( next_is_free ) { /* coalesce both */ 10f791: 80 7d e3 00 cmpb $0x0,-0x1d(%ebp) 10f795: 74 1a je 10f7b1 <_Heap_Free+0xe1> uintptr_t const size = block_size + prev_size + next_block_size; 10f797: 8b 45 e8 mov -0x18(%ebp),%eax 10f79a: 8d 04 06 lea (%esi,%eax,1),%eax 10f79d: 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; 10f7a0: 8b 7a 08 mov 0x8(%edx),%edi Heap_Block *prev = block->prev; 10f7a3: 8b 52 0c mov 0xc(%edx),%edx prev->next = next; 10f7a6: 89 7a 08 mov %edi,0x8(%edx) next->prev = prev; 10f7a9: 89 57 0c mov %edx,0xc(%edi) _Heap_Free_list_remove( next_block ); stats->free_blocks -= 1; 10f7ac: ff 49 38 decl 0x38(%ecx) 10f7af: eb 33 jmp 10f7e4 <_Heap_Free+0x114> 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; 10f7b1: 8b 45 f0 mov -0x10(%ebp),%eax 10f7b4: 8d 04 06 lea (%esi,%eax,1),%eax prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED; 10f7b7: 89 c7 mov %eax,%edi 10f7b9: 83 cf 01 or $0x1,%edi 10f7bc: 89 7b 04 mov %edi,0x4(%ebx) next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED; 10f7bf: 83 62 04 fe andl $0xfffffffe,0x4(%edx) next_block->prev_size = size; 10f7c3: 89 02 mov %eax,(%edx) 10f7c5: eb 56 jmp 10f81d <_Heap_Free+0x14d> } } else if ( next_is_free ) { /* coalesce next */ 10f7c7: 80 7d e3 00 cmpb $0x0,-0x1d(%ebp) 10f7cb: 74 24 je 10f7f1 <_Heap_Free+0x121> uintptr_t const size = block_size + next_block_size; 10f7cd: 8b 45 e8 mov -0x18(%ebp),%eax 10f7d0: 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; 10f7d2: 8b 7a 08 mov 0x8(%edx),%edi Heap_Block *prev = old_block->prev; 10f7d5: 8b 52 0c mov 0xc(%edx),%edx new_block->next = next; 10f7d8: 89 7b 08 mov %edi,0x8(%ebx) new_block->prev = prev; 10f7db: 89 53 0c mov %edx,0xc(%ebx) next->prev = new_block; 10f7de: 89 5f 0c mov %ebx,0xc(%edi) prev->next = new_block; 10f7e1: 89 5a 08 mov %ebx,0x8(%edx) _Heap_Free_list_replace( next_block, block ); block->size_and_flag = size | HEAP_PREV_BLOCK_USED; 10f7e4: 89 c2 mov %eax,%edx 10f7e6: 83 ca 01 or $0x1,%edx 10f7e9: 89 53 04 mov %edx,0x4(%ebx) next_block = _Heap_Block_at( block, size ); next_block->prev_size = size; 10f7ec: 89 04 03 mov %eax,(%ebx,%eax,1) 10f7ef: eb 2c jmp 10f81d <_Heap_Free+0x14d> RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_after( Heap_Block *block_before, Heap_Block *new_block ) { Heap_Block *next = block_before->next; 10f7f1: 8b 41 08 mov 0x8(%ecx),%eax new_block->next = next; 10f7f4: 89 43 08 mov %eax,0x8(%ebx) new_block->prev = block_before; 10f7f7: 89 4b 0c mov %ecx,0xc(%ebx) block_before->next = new_block; 10f7fa: 89 59 08 mov %ebx,0x8(%ecx) next->prev = new_block; 10f7fd: 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; 10f800: 89 f0 mov %esi,%eax 10f802: 83 c8 01 or $0x1,%eax 10f805: 89 43 04 mov %eax,0x4(%ebx) next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED; 10f808: 83 62 04 fe andl $0xfffffffe,0x4(%edx) next_block->prev_size = block_size; 10f80c: 89 32 mov %esi,(%edx) /* Statistics */ ++stats->free_blocks; 10f80e: 8b 41 38 mov 0x38(%ecx),%eax 10f811: 40 inc %eax 10f812: 89 41 38 mov %eax,0x38(%ecx) if ( stats->max_free_blocks < stats->free_blocks ) { 10f815: 39 41 3c cmp %eax,0x3c(%ecx) 10f818: 73 03 jae 10f81d <_Heap_Free+0x14d> stats->max_free_blocks = stats->free_blocks; 10f81a: 89 41 3c mov %eax,0x3c(%ecx) } } /* Statistics */ --stats->used_blocks; 10f81d: ff 49 40 decl 0x40(%ecx) ++stats->frees; 10f820: ff 41 50 incl 0x50(%ecx) stats->free_size += block_size; 10f823: 01 71 30 add %esi,0x30(%ecx) return( true ); 10f826: b0 01 mov $0x1,%al } 10f828: 83 c4 14 add $0x14,%esp 10f82b: 5b pop %ebx 10f82c: 5e pop %esi 10f82d: 5f pop %edi 10f82e: c9 leave 10f82f: c3 ret =============================================================================== 0011d470 <_Heap_Size_of_alloc_area>: bool _Heap_Size_of_alloc_area( Heap_Control *heap, void *alloc_begin_ptr, uintptr_t *alloc_size ) { 11d470: 55 push %ebp 11d471: 89 e5 mov %esp,%ebp 11d473: 57 push %edi 11d474: 56 push %esi 11d475: 53 push %ebx 11d476: 8b 5d 08 mov 0x8(%ebp),%ebx 11d479: 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); 11d47c: 8d 4e f8 lea -0x8(%esi),%ecx 11d47f: 89 f0 mov %esi,%eax 11d481: 31 d2 xor %edx,%edx 11d483: 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); 11d486: 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 11d488: 8b 53 20 mov 0x20(%ebx),%edx && (uintptr_t) block <= (uintptr_t) heap->last_block; 11d48b: 31 ff xor %edi,%edi 11d48d: 39 d1 cmp %edx,%ecx 11d48f: 72 0a jb 11d49b <_Heap_Size_of_alloc_area+0x2b> 11d491: 31 c0 xor %eax,%eax 11d493: 39 4b 24 cmp %ecx,0x24(%ebx) 11d496: 0f 93 c0 setae %al 11d499: 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; 11d49b: 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 ) ) { 11d49d: 85 ff test %edi,%edi 11d49f: 74 30 je 11d4d1 <_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; 11d4a1: 8b 41 04 mov 0x4(%ecx),%eax 11d4a4: 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); 11d4a7: 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; 11d4a9: 31 ff xor %edi,%edi 11d4ab: 39 d1 cmp %edx,%ecx 11d4ad: 72 0a jb 11d4b9 <_Heap_Size_of_alloc_area+0x49><== NEVER TAKEN 11d4af: 31 c0 xor %eax,%eax 11d4b1: 39 4b 24 cmp %ecx,0x24(%ebx) 11d4b4: 0f 93 c0 setae %al 11d4b7: 89 c7 mov %eax,%edi if ( !_Heap_Is_block_in_heap( heap, next_block ) || !_Heap_Is_prev_used( next_block ) ) { return false; 11d4b9: 31 c0 xor %eax,%eax } block_size = _Heap_Block_size( block ); next_block = _Heap_Block_at( block, block_size ); if ( 11d4bb: 85 ff test %edi,%edi 11d4bd: 74 12 je 11d4d1 <_Heap_Size_of_alloc_area+0x61><== NEVER TAKEN !_Heap_Is_block_in_heap( heap, next_block ) || !_Heap_Is_prev_used( next_block ) 11d4bf: f6 41 04 01 testb $0x1,0x4(%ecx) 11d4c3: 74 0c je 11d4d1 <_Heap_Size_of_alloc_area+0x61><== NEVER TAKEN ) { return false; } *alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin; 11d4c5: 29 f1 sub %esi,%ecx 11d4c7: 8d 51 04 lea 0x4(%ecx),%edx 11d4ca: 8b 45 10 mov 0x10(%ebp),%eax 11d4cd: 89 10 mov %edx,(%eax) return true; 11d4cf: b0 01 mov $0x1,%al } 11d4d1: 5b pop %ebx 11d4d2: 5e pop %esi 11d4d3: 5f pop %edi 11d4d4: c9 leave 11d4d5: c3 ret =============================================================================== 0010bc16 <_Heap_Walk>: bool _Heap_Walk( Heap_Control *heap, int source, bool dump ) { 10bc16: 55 push %ebp 10bc17: 89 e5 mov %esp,%ebp 10bc19: 57 push %edi 10bc1a: 56 push %esi 10bc1b: 53 push %ebx 10bc1c: 83 ec 4c sub $0x4c,%esp 10bc1f: 8b 75 08 mov 0x8(%ebp),%esi 10bc22: 8b 5d 0c mov 0xc(%ebp),%ebx uintptr_t const page_size = heap->page_size; 10bc25: 8b 46 10 mov 0x10(%esi),%eax 10bc28: 89 45 d8 mov %eax,-0x28(%ebp) uintptr_t const min_block_size = heap->min_block_size; 10bc2b: 8b 4e 14 mov 0x14(%esi),%ecx 10bc2e: 89 4d d4 mov %ecx,-0x2c(%ebp) Heap_Block *const first_block = heap->first_block; 10bc31: 8b 46 20 mov 0x20(%esi),%eax 10bc34: 89 45 d0 mov %eax,-0x30(%ebp) Heap_Block *const last_block = heap->last_block; 10bc37: 8b 4e 24 mov 0x24(%esi),%ecx 10bc3a: 89 4d c8 mov %ecx,-0x38(%ebp) Heap_Block *block = first_block; Heap_Walk_printer printer = dump ? _Heap_Walk_print : _Heap_Walk_print_nothing; 10bc3d: c7 45 e4 d8 bb 10 00 movl $0x10bbd8,-0x1c(%ebp) 10bc44: 80 7d 10 00 cmpb $0x0,0x10(%ebp) 10bc48: 74 07 je 10bc51 <_Heap_Walk+0x3b> 10bc4a: c7 45 e4 dd bb 10 00 movl $0x10bbdd,-0x1c(%ebp) if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; 10bc51: 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() ) ) { 10bc53: 83 3d 24 75 12 00 03 cmpl $0x3,0x127524 10bc5a: 0f 85 e8 02 00 00 jne 10bf48 <_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)( 10bc60: 52 push %edx 10bc61: ff 76 0c pushl 0xc(%esi) 10bc64: ff 76 08 pushl 0x8(%esi) 10bc67: ff 75 c8 pushl -0x38(%ebp) 10bc6a: ff 75 d0 pushl -0x30(%ebp) 10bc6d: ff 76 1c pushl 0x1c(%esi) 10bc70: ff 76 18 pushl 0x18(%esi) 10bc73: ff 75 d4 pushl -0x2c(%ebp) 10bc76: ff 75 d8 pushl -0x28(%ebp) 10bc79: 68 d9 ff 11 00 push $0x11ffd9 10bc7e: 6a 00 push $0x0 10bc80: 53 push %ebx 10bc81: 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 ) { 10bc84: 83 c4 30 add $0x30,%esp 10bc87: 83 7d d8 00 cmpl $0x0,-0x28(%ebp) 10bc8b: 75 0b jne 10bc98 <_Heap_Walk+0x82> (*printer)( source, true, "page size is zero\n" ); 10bc8d: 50 push %eax 10bc8e: 68 6a 00 12 00 push $0x12006a 10bc93: e9 6b 02 00 00 jmp 10bf03 <_Heap_Walk+0x2ed> return false; } if ( !_Addresses_Is_aligned( (void *) page_size ) ) { 10bc98: f6 45 d8 03 testb $0x3,-0x28(%ebp) 10bc9c: 74 0d je 10bcab <_Heap_Walk+0x95> (*printer)( 10bc9e: ff 75 d8 pushl -0x28(%ebp) 10bca1: 68 7d 00 12 00 push $0x12007d 10bca6: e9 58 02 00 00 jmp 10bf03 <_Heap_Walk+0x2ed> RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment ) { return (value % alignment) == 0; 10bcab: 8b 45 d4 mov -0x2c(%ebp),%eax 10bcae: 31 d2 xor %edx,%edx 10bcb0: f7 75 d8 divl -0x28(%ebp) ); return false; } if ( !_Heap_Is_aligned( min_block_size, page_size ) ) { 10bcb3: 85 d2 test %edx,%edx 10bcb5: 74 0d je 10bcc4 <_Heap_Walk+0xae> (*printer)( 10bcb7: ff 75 d4 pushl -0x2c(%ebp) 10bcba: 68 9b 00 12 00 push $0x12009b 10bcbf: e9 3f 02 00 00 jmp 10bf03 <_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; 10bcc4: 8b 45 d0 mov -0x30(%ebp),%eax 10bcc7: 83 c0 08 add $0x8,%eax RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment ) { return (value % alignment) == 0; 10bcca: 31 d2 xor %edx,%edx 10bccc: f7 75 d8 divl -0x28(%ebp) ); return false; } if ( 10bccf: 85 d2 test %edx,%edx 10bcd1: 74 0d je 10bce0 <_Heap_Walk+0xca> !_Heap_Is_aligned( _Heap_Alloc_area_of_block( first_block ), page_size ) ) { (*printer)( 10bcd3: ff 75 d0 pushl -0x30(%ebp) 10bcd6: 68 bf 00 12 00 push $0x1200bf 10bcdb: e9 23 02 00 00 jmp 10bf03 <_Heap_Walk+0x2ed> ); return false; } if ( !_Heap_Is_prev_used( first_block ) ) { 10bce0: 8b 45 d0 mov -0x30(%ebp),%eax 10bce3: f6 40 04 01 testb $0x1,0x4(%eax) 10bce7: 75 0b jne 10bcf4 <_Heap_Walk+0xde> (*printer)( 10bce9: 57 push %edi 10bcea: 68 f0 00 12 00 push $0x1200f0 10bcef: e9 0f 02 00 00 jmp 10bf03 <_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; 10bcf4: 8b 4d c8 mov -0x38(%ebp),%ecx 10bcf7: 8b 79 04 mov 0x4(%ecx),%edi 10bcfa: 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); 10bcfd: 01 cf add %ecx,%edi ); return false; } if ( _Heap_Is_free( last_block ) ) { 10bcff: f6 47 04 01 testb $0x1,0x4(%edi) 10bd03: 75 0b jne 10bd10 <_Heap_Walk+0xfa> (*printer)( 10bd05: 56 push %esi 10bd06: 68 1e 01 12 00 push $0x12011e 10bd0b: e9 f3 01 00 00 jmp 10bf03 <_Heap_Walk+0x2ed> ); return false; } if ( 10bd10: 3b 7d d0 cmp -0x30(%ebp),%edi 10bd13: 74 0b je 10bd20 <_Heap_Walk+0x10a> <== ALWAYS TAKEN _Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block ) { (*printer)( 10bd15: 51 push %ecx <== NOT EXECUTED 10bd16: 68 33 01 12 00 push $0x120133 <== NOT EXECUTED 10bd1b: e9 e3 01 00 00 jmp 10bf03 <_Heap_Walk+0x2ed> <== NOT EXECUTED int source, Heap_Walk_printer printer, Heap_Control *heap ) { uintptr_t const page_size = heap->page_size; 10bd20: 8b 46 10 mov 0x10(%esi),%eax 10bd23: 89 45 e0 mov %eax,-0x20(%ebp) block = next_block; } while ( block != first_block ); return true; } 10bd26: 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 ); 10bd29: 89 75 dc mov %esi,-0x24(%ebp) 10bd2c: eb 75 jmp 10bda3 <_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; 10bd2e: 31 c0 xor %eax,%eax 10bd30: 39 4e 20 cmp %ecx,0x20(%esi) 10bd33: 77 08 ja 10bd3d <_Heap_Walk+0x127> 10bd35: 31 c0 xor %eax,%eax 10bd37: 39 4e 24 cmp %ecx,0x24(%esi) 10bd3a: 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 ) ) { 10bd3d: 85 c0 test %eax,%eax 10bd3f: 75 0b jne 10bd4c <_Heap_Walk+0x136> (*printer)( 10bd41: 51 push %ecx 10bd42: 68 62 01 12 00 push $0x120162 10bd47: e9 b7 01 00 00 jmp 10bf03 <_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; 10bd4c: 8d 41 08 lea 0x8(%ecx),%eax RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment ) { return (value % alignment) == 0; 10bd4f: 31 d2 xor %edx,%edx 10bd51: f7 75 e0 divl -0x20(%ebp) ); return false; } if ( 10bd54: 85 d2 test %edx,%edx 10bd56: 74 0b je 10bd63 <_Heap_Walk+0x14d> !_Heap_Is_aligned( _Heap_Alloc_area_of_block( free_block ), page_size ) ) { (*printer)( 10bd58: 51 push %ecx 10bd59: 68 82 01 12 00 push $0x120182 10bd5e: e9 a0 01 00 00 jmp 10bf03 <_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; 10bd63: 8b 41 04 mov 0x4(%ecx),%eax 10bd66: 83 e0 fe and $0xfffffffe,%eax ); return false; } if ( _Heap_Is_used( free_block ) ) { 10bd69: f6 44 01 04 01 testb $0x1,0x4(%ecx,%eax,1) 10bd6e: 74 0b je 10bd7b <_Heap_Walk+0x165> (*printer)( 10bd70: 51 push %ecx 10bd71: 68 b2 01 12 00 push $0x1201b2 10bd76: e9 88 01 00 00 jmp 10bf03 <_Heap_Walk+0x2ed> ); return false; } if ( free_block->prev != prev_block ) { 10bd7b: 8b 41 0c mov 0xc(%ecx),%eax 10bd7e: 3b 45 dc cmp -0x24(%ebp),%eax 10bd81: 74 1a je 10bd9d <_Heap_Walk+0x187> (*printer)( 10bd83: 83 ec 0c sub $0xc,%esp 10bd86: 50 push %eax 10bd87: 51 push %ecx 10bd88: 68 ce 01 12 00 push $0x1201ce 10bd8d: 6a 01 push $0x1 10bd8f: 53 push %ebx 10bd90: ff 55 e4 call *-0x1c(%ebp) 10bd93: 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; 10bd96: 31 c0 xor %eax,%eax 10bd98: e9 ab 01 00 00 jmp 10bf48 <_Heap_Walk+0x332> return false; } prev_block = free_block; free_block = free_block->next; 10bd9d: 89 4d dc mov %ecx,-0x24(%ebp) 10bda0: 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 ) { 10bda3: 39 f1 cmp %esi,%ecx 10bda5: 75 87 jne 10bd2e <_Heap_Walk+0x118> 10bda7: 89 5d dc mov %ebx,-0x24(%ebp) 10bdaa: eb 02 jmp 10bdae <_Heap_Walk+0x198> block->prev_size ); } block = next_block; } while ( block != first_block ); 10bdac: 89 df mov %ebx,%edi return true; } 10bdae: 8b 4f 04 mov 0x4(%edi),%ecx 10bdb1: 89 4d cc mov %ecx,-0x34(%ebp) 10bdb4: 83 e1 fe and $0xfffffffe,%ecx 10bdb7: 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); 10bdba: 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; 10bdbd: 31 c0 xor %eax,%eax 10bdbf: 39 5e 20 cmp %ebx,0x20(%esi) 10bdc2: 77 08 ja 10bdcc <_Heap_Walk+0x1b6> <== NEVER TAKEN 10bdc4: 31 c0 xor %eax,%eax 10bdc6: 39 5e 24 cmp %ebx,0x24(%esi) 10bdc9: 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 ) ) { 10bdcc: 85 c0 test %eax,%eax 10bdce: 75 11 jne 10bde1 <_Heap_Walk+0x1cb> 10bdd0: 89 d9 mov %ebx,%ecx 10bdd2: 8b 5d dc mov -0x24(%ebp),%ebx (*printer)( 10bdd5: 83 ec 0c sub $0xc,%esp 10bdd8: 51 push %ecx 10bdd9: 57 push %edi 10bdda: 68 00 02 12 00 push $0x120200 10bddf: eb ac jmp 10bd8d <_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; 10bde1: 3b 7d c8 cmp -0x38(%ebp),%edi 10bde4: 0f 95 c1 setne %cl RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment ) { return (value % alignment) == 0; 10bde7: 8b 45 e0 mov -0x20(%ebp),%eax 10bdea: 31 d2 xor %edx,%edx 10bdec: f7 75 d8 divl -0x28(%ebp) ); return false; } if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) { 10bdef: 85 d2 test %edx,%edx 10bdf1: 74 15 je 10be08 <_Heap_Walk+0x1f2> 10bdf3: 84 c9 test %cl,%cl 10bdf5: 74 11 je 10be08 <_Heap_Walk+0x1f2> 10bdf7: 8b 5d dc mov -0x24(%ebp),%ebx (*printer)( 10bdfa: 83 ec 0c sub $0xc,%esp 10bdfd: ff 75 e0 pushl -0x20(%ebp) 10be00: 57 push %edi 10be01: 68 2d 02 12 00 push $0x12022d 10be06: eb 85 jmp 10bd8d <_Heap_Walk+0x177> ); return false; } if ( block_size < min_block_size && is_not_last_block ) { 10be08: 8b 45 d4 mov -0x2c(%ebp),%eax 10be0b: 39 45 e0 cmp %eax,-0x20(%ebp) 10be0e: 73 18 jae 10be28 <_Heap_Walk+0x212> 10be10: 84 c9 test %cl,%cl 10be12: 74 14 je 10be28 <_Heap_Walk+0x212> <== NEVER TAKEN 10be14: 8b 5d dc mov -0x24(%ebp),%ebx (*printer)( 10be17: 52 push %edx 10be18: 52 push %edx 10be19: 50 push %eax 10be1a: ff 75 e0 pushl -0x20(%ebp) 10be1d: 57 push %edi 10be1e: 68 5b 02 12 00 push $0x12025b 10be23: e9 65 ff ff ff jmp 10bd8d <_Heap_Walk+0x177> ); return false; } if ( next_block_begin <= block_begin && is_not_last_block ) { 10be28: 39 fb cmp %edi,%ebx 10be2a: 77 18 ja 10be44 <_Heap_Walk+0x22e> 10be2c: 84 c9 test %cl,%cl 10be2e: 74 14 je 10be44 <_Heap_Walk+0x22e> 10be30: 89 d9 mov %ebx,%ecx 10be32: 8b 5d dc mov -0x24(%ebp),%ebx (*printer)( 10be35: 83 ec 0c sub $0xc,%esp 10be38: 51 push %ecx 10be39: 57 push %edi 10be3a: 68 86 02 12 00 push $0x120286 10be3f: e9 49 ff ff ff jmp 10bd8d <_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; 10be44: 8b 4d cc mov -0x34(%ebp),%ecx 10be47: 83 e1 01 and $0x1,%ecx 10be4a: 89 4d c4 mov %ecx,-0x3c(%ebp) ); return false; } if ( !_Heap_Is_prev_used( next_block ) ) { 10be4d: f6 43 04 01 testb $0x1,0x4(%ebx) 10be51: 0f 85 ba 00 00 00 jne 10bf11 <_Heap_Walk+0x2fb> block = next_block; } while ( block != first_block ); return true; } 10be57: 8b 46 08 mov 0x8(%esi),%eax 10be5a: 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 ? 10be5d: 8b 4f 08 mov 0x8(%edi),%ecx 10be60: 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)( 10be63: ba a6 ff 11 00 mov $0x11ffa6,%edx 10be68: 3b 4e 0c cmp 0xc(%esi),%ecx 10be6b: 74 0e je 10be7b <_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)" : "") 10be6d: ba ed fe 11 00 mov $0x11feed,%edx 10be72: 39 f1 cmp %esi,%ecx 10be74: 75 05 jne 10be7b <_Heap_Walk+0x265> 10be76: ba b5 ff 11 00 mov $0x11ffb5,%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 ? 10be7b: 8b 47 0c mov 0xc(%edi),%eax 10be7e: 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)( 10be81: b8 bf ff 11 00 mov $0x11ffbf,%eax 10be86: 8b 4d c0 mov -0x40(%ebp),%ecx 10be89: 39 4d cc cmp %ecx,-0x34(%ebp) 10be8c: 74 0f je 10be9d <_Heap_Walk+0x287> block, block_size, block->prev, block->prev == first_free_block ? " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), 10be8e: b8 ed fe 11 00 mov $0x11feed,%eax 10be93: 39 75 cc cmp %esi,-0x34(%ebp) 10be96: 75 05 jne 10be9d <_Heap_Walk+0x287> 10be98: b8 cf ff 11 00 mov $0x11ffcf,%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)( 10be9d: 83 ec 0c sub $0xc,%esp 10bea0: 52 push %edx 10bea1: ff 75 b4 pushl -0x4c(%ebp) 10bea4: 50 push %eax 10bea5: ff 75 cc pushl -0x34(%ebp) 10bea8: ff 75 e0 pushl -0x20(%ebp) 10beab: 57 push %edi 10beac: 68 ba 02 12 00 push $0x1202ba 10beb1: 6a 00 push $0x0 10beb3: ff 75 dc pushl -0x24(%ebp) 10beb6: 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 ) { 10beb9: 8b 03 mov (%ebx),%eax 10bebb: 83 c4 30 add $0x30,%esp 10bebe: 39 45 e0 cmp %eax,-0x20(%ebp) 10bec1: 74 16 je 10bed9 <_Heap_Walk+0x2c3> 10bec3: 89 d9 mov %ebx,%ecx 10bec5: 8b 5d dc mov -0x24(%ebp),%ebx (*printer)( 10bec8: 56 push %esi 10bec9: 51 push %ecx 10beca: 50 push %eax 10becb: ff 75 e0 pushl -0x20(%ebp) 10bece: 57 push %edi 10becf: 68 ef 02 12 00 push $0x1202ef 10bed4: e9 b4 fe ff ff jmp 10bd8d <_Heap_Walk+0x177> ); return false; } if ( !prev_used ) { 10bed9: 83 7d c4 00 cmpl $0x0,-0x3c(%ebp) 10bedd: 75 0b jne 10beea <_Heap_Walk+0x2d4> 10bedf: 8b 5d dc mov -0x24(%ebp),%ebx (*printer)( 10bee2: 57 push %edi 10bee3: 68 28 03 12 00 push $0x120328 10bee8: eb 19 jmp 10bf03 <_Heap_Walk+0x2ed> block = next_block; } while ( block != first_block ); return true; } 10beea: 8b 46 08 mov 0x8(%esi),%eax 10beed: eb 07 jmp 10bef6 <_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 ) { 10beef: 39 f8 cmp %edi,%eax 10bef1: 74 4a je 10bf3d <_Heap_Walk+0x327> return true; } free_block = free_block->next; 10bef3: 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 ) { 10bef6: 39 f0 cmp %esi,%eax 10bef8: 75 f5 jne 10beef <_Heap_Walk+0x2d9> 10befa: 8b 5d dc mov -0x24(%ebp),%ebx return false; } if ( !_Heap_Walk_is_in_free_list( heap, block ) ) { (*printer)( 10befd: 57 push %edi 10befe: 68 93 03 12 00 push $0x120393 10bf03: 6a 01 push $0x1 10bf05: 53 push %ebx 10bf06: ff 55 e4 call *-0x1c(%ebp) 10bf09: 83 c4 10 add $0x10,%esp 10bf0c: e9 85 fe ff ff jmp 10bd96 <_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) { 10bf11: 83 7d c4 00 cmpl $0x0,-0x3c(%ebp) 10bf15: 74 0e je 10bf25 <_Heap_Walk+0x30f> (*printer)( 10bf17: 83 ec 0c sub $0xc,%esp 10bf1a: ff 75 e0 pushl -0x20(%ebp) 10bf1d: 57 push %edi 10bf1e: 68 57 03 12 00 push $0x120357 10bf23: eb 0d jmp 10bf32 <_Heap_Walk+0x31c> "block 0x%08x: size %u\n", block, block_size ); } else { (*printer)( 10bf25: 51 push %ecx 10bf26: 51 push %ecx 10bf27: ff 37 pushl (%edi) 10bf29: ff 75 e0 pushl -0x20(%ebp) 10bf2c: 57 push %edi 10bf2d: 68 6e 03 12 00 push $0x12036e 10bf32: 6a 00 push $0x0 10bf34: ff 75 dc pushl -0x24(%ebp) 10bf37: ff 55 e4 call *-0x1c(%ebp) 10bf3a: 83 c4 20 add $0x20,%esp block->prev_size ); } block = next_block; } while ( block != first_block ); 10bf3d: 3b 5d d0 cmp -0x30(%ebp),%ebx 10bf40: 0f 85 66 fe ff ff jne 10bdac <_Heap_Walk+0x196> return true; 10bf46: b0 01 mov $0x1,%al } 10bf48: 8d 65 f4 lea -0xc(%ebp),%esp 10bf4b: 5b pop %ebx 10bf4c: 5e pop %esi 10bf4d: 5f pop %edi 10bf4e: c9 leave 10bf4f: c3 ret =============================================================================== 0010b238 <_Internal_error_Occurred>: void _Internal_error_Occurred( Internal_errors_Source the_source, bool is_internal, Internal_errors_t the_error ) { 10b238: 55 push %ebp 10b239: 89 e5 mov %esp,%ebp 10b23b: 53 push %ebx 10b23c: 83 ec 08 sub $0x8,%esp 10b23f: 8b 45 08 mov 0x8(%ebp),%eax 10b242: 8b 55 0c mov 0xc(%ebp),%edx 10b245: 8b 5d 10 mov 0x10(%ebp),%ebx _Internal_errors_What_happened.the_source = the_source; 10b248: a3 d8 53 12 00 mov %eax,0x1253d8 _Internal_errors_What_happened.is_internal = is_internal; 10b24d: 88 15 dc 53 12 00 mov %dl,0x1253dc _Internal_errors_What_happened.the_error = the_error; 10b253: 89 1d e0 53 12 00 mov %ebx,0x1253e0 _User_extensions_Fatal( the_source, is_internal, the_error ); 10b259: 53 push %ebx 10b25a: 0f b6 d2 movzbl %dl,%edx 10b25d: 52 push %edx 10b25e: 50 push %eax 10b25f: e8 27 1a 00 00 call 10cc8b <_User_extensions_Fatal> RTEMS_INLINE_ROUTINE void _System_state_Set ( System_state_Codes state ) { _System_state_Current = state; 10b264: c7 05 9c 54 12 00 05 movl $0x5,0x12549c <== NOT EXECUTED 10b26b: 00 00 00 _System_state_Set( SYSTEM_STATE_FAILED ); _CPU_Fatal_halt( the_error ); 10b26e: fa cli <== NOT EXECUTED 10b26f: 89 d8 mov %ebx,%eax <== NOT EXECUTED 10b271: f4 hlt <== NOT EXECUTED 10b272: 83 c4 10 add $0x10,%esp <== NOT EXECUTED 10b275: eb fe jmp 10b275 <_Internal_error_Occurred+0x3d><== NOT EXECUTED =============================================================================== 0010b2c8 <_Objects_Allocate>: */ Objects_Control *_Objects_Allocate( Objects_Information *information ) { 10b2c8: 55 push %ebp 10b2c9: 89 e5 mov %esp,%ebp 10b2cb: 56 push %esi 10b2cc: 53 push %ebx 10b2cd: 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; 10b2d0: 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 ) 10b2d2: 83 7b 18 00 cmpl $0x0,0x18(%ebx) 10b2d6: 74 53 je 10b32b <_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 ); 10b2d8: 8d 73 20 lea 0x20(%ebx),%esi 10b2db: 83 ec 0c sub $0xc,%esp 10b2de: 56 push %esi 10b2df: e8 38 f7 ff ff call 10aa1c <_Chain_Get> 10b2e4: 89 c1 mov %eax,%ecx if ( information->auto_extend ) { 10b2e6: 83 c4 10 add $0x10,%esp 10b2e9: 80 7b 12 00 cmpb $0x0,0x12(%ebx) 10b2ed: 74 3c je 10b32b <_Objects_Allocate+0x63> /* * If the list is empty then we are out of objects and need to * extend information base. */ if ( !the_object ) { 10b2ef: 85 c0 test %eax,%eax 10b2f1: 75 1a jne 10b30d <_Objects_Allocate+0x45> _Objects_Extend_information( information ); 10b2f3: 83 ec 0c sub $0xc,%esp 10b2f6: 53 push %ebx 10b2f7: e8 60 00 00 00 call 10b35c <_Objects_Extend_information> the_object = (Objects_Control *) _Chain_Get( &information->Inactive ); 10b2fc: 89 34 24 mov %esi,(%esp) 10b2ff: e8 18 f7 ff ff call 10aa1c <_Chain_Get> 10b304: 89 c1 mov %eax,%ecx } if ( the_object ) { 10b306: 83 c4 10 add $0x10,%esp 10b309: 85 c0 test %eax,%eax 10b30b: 74 1e je 10b32b <_Objects_Allocate+0x63> uint32_t block; block = (uint32_t) _Objects_Get_index( the_object->id ) - 10b30d: 0f b7 41 08 movzwl 0x8(%ecx),%eax 10b311: 0f b7 53 08 movzwl 0x8(%ebx),%edx 10b315: 29 d0 sub %edx,%eax _Objects_Get_index( information->minimum_id ); block /= information->allocation_size; 10b317: 0f b7 73 14 movzwl 0x14(%ebx),%esi 10b31b: 31 d2 xor %edx,%edx 10b31d: f7 f6 div %esi information->inactive_per_block[ block ]--; 10b31f: c1 e0 02 shl $0x2,%eax 10b322: 03 43 30 add 0x30(%ebx),%eax 10b325: ff 08 decl (%eax) information->inactive--; 10b327: 66 ff 4b 2c decw 0x2c(%ebx) ); } #endif return the_object; } 10b32b: 89 c8 mov %ecx,%eax 10b32d: 8d 65 f8 lea -0x8(%ebp),%esp 10b330: 5b pop %ebx 10b331: 5e pop %esi 10b332: c9 leave 10b333: c3 ret =============================================================================== 0010b64c <_Objects_Get_information>: Objects_Information *_Objects_Get_information( Objects_APIs the_api, uint16_t the_class ) { 10b64c: 55 push %ebp 10b64d: 89 e5 mov %esp,%ebp 10b64f: 57 push %edi 10b650: 56 push %esi 10b651: 53 push %ebx 10b652: 83 ec 0c sub $0xc,%esp 10b655: 8b 75 08 mov 0x8(%ebp),%esi 10b658: 8b 7d 0c mov 0xc(%ebp),%edi Objects_Information *info; int the_class_api_maximum; if ( !the_class ) return NULL; 10b65b: 31 db xor %ebx,%ebx ) { Objects_Information *info; int the_class_api_maximum; if ( !the_class ) 10b65d: 66 85 ff test %di,%di 10b660: 74 37 je 10b699 <_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 ); 10b662: 83 ec 0c sub $0xc,%esp 10b665: 56 push %esi 10b666: e8 c5 41 00 00 call 10f830 <_Objects_API_maximum_class> if ( the_class_api_maximum == 0 ) 10b66b: 83 c4 10 add $0x10,%esp 10b66e: 85 c0 test %eax,%eax 10b670: 74 27 je 10b699 <_Objects_Get_information+0x4d> return NULL; if ( the_class > (uint32_t) the_class_api_maximum ) 10b672: 0f b7 ff movzwl %di,%edi 10b675: 39 c7 cmp %eax,%edi 10b677: 77 20 ja 10b699 <_Objects_Get_information+0x4d> return NULL; if ( !_Objects_Information_table[ the_api ] ) 10b679: 8b 04 b5 18 53 12 00 mov 0x125318(,%esi,4),%eax 10b680: 85 c0 test %eax,%eax 10b682: 74 15 je 10b699 <_Objects_Get_information+0x4d><== NEVER TAKEN return NULL; info = _Objects_Information_table[ the_api ][ the_class ]; 10b684: 8b 1c b8 mov (%eax,%edi,4),%ebx if ( !info ) 10b687: 85 db test %ebx,%ebx 10b689: 74 0e je 10b699 <_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; 10b68b: 31 c0 xor %eax,%eax 10b68d: 66 83 7b 10 00 cmpw $0x0,0x10(%ebx) 10b692: 0f 95 c0 setne %al 10b695: f7 d8 neg %eax 10b697: 21 c3 and %eax,%ebx #endif return info; } 10b699: 89 d8 mov %ebx,%eax 10b69b: 8d 65 f4 lea -0xc(%ebp),%esp 10b69e: 5b pop %ebx 10b69f: 5e pop %esi 10b6a0: 5f pop %edi 10b6a1: c9 leave 10b6a2: c3 ret =============================================================================== 00118ab0 <_Objects_Get_no_protection>: Objects_Control *_Objects_Get_no_protection( Objects_Information *information, Objects_Id id, Objects_Locations *location ) { 118ab0: 55 push %ebp 118ab1: 89 e5 mov %esp,%ebp 118ab3: 53 push %ebx 118ab4: 8b 55 08 mov 0x8(%ebp),%edx 118ab7: 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; 118aba: b8 01 00 00 00 mov $0x1,%eax 118abf: 2b 42 08 sub 0x8(%edx),%eax 118ac2: 03 45 0c add 0xc(%ebp),%eax if ( information->maximum >= index ) { 118ac5: 0f b7 5a 10 movzwl 0x10(%edx),%ebx 118ac9: 39 c3 cmp %eax,%ebx 118acb: 72 12 jb 118adf <_Objects_Get_no_protection+0x2f> if ( (the_object = information->local_table[ index ]) != NULL ) { 118acd: 8b 52 1c mov 0x1c(%edx),%edx 118ad0: 8b 04 82 mov (%edx,%eax,4),%eax 118ad3: 85 c0 test %eax,%eax 118ad5: 74 08 je 118adf <_Objects_Get_no_protection+0x2f><== NEVER TAKEN *location = OBJECTS_LOCAL; 118ad7: c7 01 00 00 00 00 movl $0x0,(%ecx) return the_object; 118add: eb 08 jmp 118ae7 <_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; 118adf: c7 01 01 00 00 00 movl $0x1,(%ecx) return NULL; 118ae5: 31 c0 xor %eax,%eax } 118ae7: 5b pop %ebx 118ae8: c9 leave 118ae9: c3 ret =============================================================================== 0010c868 <_Objects_Id_to_name>: */ Objects_Name_or_id_lookup_errors _Objects_Id_to_name ( Objects_Id id, Objects_Name *name ) { 10c868: 55 push %ebp 10c869: 89 e5 mov %esp,%ebp 10c86b: 53 push %ebx 10c86c: 83 ec 14 sub $0x14,%esp /* * Caller is trusted for name != NULL. */ tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id; 10c86f: 8b 45 08 mov 0x8(%ebp),%eax 10c872: 85 c0 test %eax,%eax 10c874: 75 08 jne 10c87e <_Objects_Id_to_name+0x16> 10c876: a1 d4 78 12 00 mov 0x1278d4,%eax 10c87b: 8b 40 08 mov 0x8(%eax),%eax 10c87e: 89 c2 mov %eax,%edx 10c880: c1 ea 18 shr $0x18,%edx 10c883: 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 ) 10c886: 8d 4a ff lea -0x1(%edx),%ecx the_api = _Objects_Get_API( tmpId ); if ( !_Objects_Is_api_valid( the_api ) ) return OBJECTS_INVALID_ID; 10c889: bb 03 00 00 00 mov $0x3,%ebx 10c88e: 83 f9 02 cmp $0x2,%ecx 10c891: 77 36 ja 10c8c9 <_Objects_Id_to_name+0x61> 10c893: eb 3b jmp 10c8d0 <_Objects_Id_to_name+0x68> */ RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class( Objects_Id id ) { return (uint32_t) 10c895: 89 c1 mov %eax,%ecx 10c897: 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 ]; 10c89a: 8b 14 8a mov (%edx,%ecx,4),%edx if ( !information ) 10c89d: 85 d2 test %edx,%edx 10c89f: 74 28 je 10c8c9 <_Objects_Id_to_name+0x61><== NEVER TAKEN return OBJECTS_INVALID_ID; #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) if ( information->is_string ) 10c8a1: 80 7a 38 00 cmpb $0x0,0x38(%edx) 10c8a5: 75 22 jne 10c8c9 <_Objects_Id_to_name+0x61><== NEVER TAKEN return OBJECTS_INVALID_ID; #endif the_object = _Objects_Get( information, tmpId, &ignored_location ); 10c8a7: 51 push %ecx 10c8a8: 8d 4d f4 lea -0xc(%ebp),%ecx 10c8ab: 51 push %ecx 10c8ac: 50 push %eax 10c8ad: 52 push %edx 10c8ae: e8 5d ff ff ff call 10c810 <_Objects_Get> if ( !the_object ) 10c8b3: 83 c4 10 add $0x10,%esp 10c8b6: 85 c0 test %eax,%eax 10c8b8: 74 0f je 10c8c9 <_Objects_Id_to_name+0x61> return OBJECTS_INVALID_ID; *name = the_object->name; 10c8ba: 8b 50 0c mov 0xc(%eax),%edx 10c8bd: 8b 45 0c mov 0xc(%ebp),%eax 10c8c0: 89 10 mov %edx,(%eax) _Thread_Enable_dispatch(); 10c8c2: e8 67 0a 00 00 call 10d32e <_Thread_Enable_dispatch> return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL; 10c8c7: 31 db xor %ebx,%ebx } 10c8c9: 89 d8 mov %ebx,%eax 10c8cb: 8b 5d fc mov -0x4(%ebp),%ebx 10c8ce: c9 leave 10c8cf: 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 ] ) 10c8d0: 8b 14 95 84 73 12 00 mov 0x127384(,%edx,4),%edx 10c8d7: 85 d2 test %edx,%edx 10c8d9: 75 ba jne 10c895 <_Objects_Id_to_name+0x2d> 10c8db: eb ec jmp 10c8c9 <_Objects_Id_to_name+0x61> =============================================================================== 0010e2bc <_POSIX_Message_queue_Receive_support>: size_t msg_len, unsigned int *msg_prio, bool wait, Watchdog_Interval timeout ) { 10e2bc: 55 push %ebp 10e2bd: 89 e5 mov %esp,%ebp 10e2bf: 57 push %edi 10e2c0: 56 push %esi 10e2c1: 53 push %ebx 10e2c2: 83 ec 30 sub $0x30,%esp 10e2c5: 8b 75 08 mov 0x8(%ebp),%esi 10e2c8: 8b 5d 14 mov 0x14(%ebp),%ebx 10e2cb: 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 ); 10e2ce: 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( 10e2d1: 50 push %eax 10e2d2: 56 push %esi 10e2d3: 68 70 e2 12 00 push $0x12e270 10e2d8: 88 55 d4 mov %dl,-0x2c(%ebp) 10e2db: e8 f0 2a 00 00 call 110dd0 <_Objects_Get> switch ( location ) { 10e2e0: 83 c4 10 add $0x10,%esp 10e2e3: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) 10e2e7: 8a 55 d4 mov -0x2c(%ebp),%dl 10e2ea: 0f 85 aa 00 00 00 jne 10e39a <_POSIX_Message_queue_Receive_support+0xde> case OBJECTS_LOCAL: if ( (the_mq_fd->oflag & O_ACCMODE) == O_WRONLY ) { 10e2f0: 8b 78 14 mov 0x14(%eax),%edi 10e2f3: 89 f9 mov %edi,%ecx 10e2f5: 83 e1 03 and $0x3,%ecx 10e2f8: 49 dec %ecx 10e2f9: 75 0a jne 10e305 <_POSIX_Message_queue_Receive_support+0x49> _Thread_Enable_dispatch(); 10e2fb: e8 ea 35 00 00 call 1118ea <_Thread_Enable_dispatch> 10e300: e9 95 00 00 00 jmp 10e39a <_POSIX_Message_queue_Receive_support+0xde> rtems_set_errno_and_return_minus_one( EBADF ); } the_mq = the_mq_fd->Queue; 10e305: 8b 40 10 mov 0x10(%eax),%eax if ( msg_len < the_mq->Message_queue.maximum_message_size ) { 10e308: 8b 48 68 mov 0x68(%eax),%ecx 10e30b: 39 4d 10 cmp %ecx,0x10(%ebp) 10e30e: 73 15 jae 10e325 <_POSIX_Message_queue_Receive_support+0x69> _Thread_Enable_dispatch(); 10e310: e8 d5 35 00 00 call 1118ea <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one( EMSGSIZE ); 10e315: e8 da 8a 00 00 call 116df4 <__errno> 10e31a: c7 00 7a 00 00 00 movl $0x7a,(%eax) 10e320: e9 80 00 00 00 jmp 10e3a5 <_POSIX_Message_queue_Receive_support+0xe9> /* * Now if something goes wrong, we return a "length" of -1 * to indicate an error. */ length_out = -1; 10e325: 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 ) 10e32c: 31 c9 xor %ecx,%ecx 10e32e: 84 d2 test %dl,%dl 10e330: 74 09 je 10e33b <_POSIX_Message_queue_Receive_support+0x7f><== NEVER TAKEN do_wait = (the_mq_fd->oflag & O_NONBLOCK) ? false : true; 10e332: 81 e7 00 40 00 00 and $0x4000,%edi 10e338: 0f 94 c1 sete %cl do_wait = wait; /* * Now perform the actual message receive */ _CORE_message_queue_Seize( 10e33b: 52 push %edx 10e33c: 52 push %edx 10e33d: ff 75 1c pushl 0x1c(%ebp) 10e340: 0f b6 c9 movzbl %cl,%ecx 10e343: 51 push %ecx 10e344: 8d 55 e0 lea -0x20(%ebp),%edx 10e347: 52 push %edx 10e348: ff 75 0c pushl 0xc(%ebp) 10e34b: 56 push %esi 10e34c: 83 c0 1c add $0x1c,%eax 10e34f: 50 push %eax 10e350: e8 7f 1c 00 00 call 10ffd4 <_CORE_message_queue_Seize> &length_out, do_wait, timeout ); _Thread_Enable_dispatch(); 10e355: 83 c4 20 add $0x20,%esp 10e358: e8 8d 35 00 00 call 1118ea <_Thread_Enable_dispatch> *msg_prio = _POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count); 10e35d: a1 e8 e2 12 00 mov 0x12e2e8,%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); 10e362: 8b 50 24 mov 0x24(%eax),%edx 10e365: c1 fa 1f sar $0x1f,%edx 10e368: 8b 48 24 mov 0x24(%eax),%ecx 10e36b: 31 d1 xor %edx,%ecx 10e36d: 89 0b mov %ecx,(%ebx) 10e36f: 29 13 sub %edx,(%ebx) if ( !_Thread_Executing->Wait.return_code ) 10e371: 83 78 34 00 cmpl $0x0,0x34(%eax) 10e375: 75 05 jne 10e37c <_POSIX_Message_queue_Receive_support+0xc0> return length_out; 10e377: 8b 45 e0 mov -0x20(%ebp),%eax 10e37a: eb 2c jmp 10e3a8 <_POSIX_Message_queue_Receive_support+0xec> rtems_set_errno_and_return_minus_one( 10e37c: e8 73 8a 00 00 call 116df4 <__errno> 10e381: 89 c3 mov %eax,%ebx 10e383: 83 ec 0c sub $0xc,%esp 10e386: a1 e8 e2 12 00 mov 0x12e2e8,%eax 10e38b: ff 70 34 pushl 0x34(%eax) 10e38e: e8 ed 01 00 00 call 10e580 <_POSIX_Message_queue_Translate_core_message_queue_return_code> 10e393: 89 03 mov %eax,(%ebx) 10e395: 83 c4 10 add $0x10,%esp 10e398: eb 0b jmp 10e3a5 <_POSIX_Message_queue_Receive_support+0xe9> #endif case OBJECTS_ERROR: break; } rtems_set_errno_and_return_minus_one( EBADF ); 10e39a: e8 55 8a 00 00 call 116df4 <__errno> 10e39f: c7 00 09 00 00 00 movl $0x9,(%eax) 10e3a5: 83 c8 ff or $0xffffffff,%eax } 10e3a8: 8d 65 f4 lea -0xc(%ebp),%esp 10e3ab: 5b pop %ebx 10e3ac: 5e pop %esi 10e3ad: 5f pop %edi 10e3ae: c9 leave 10e3af: c3 ret =============================================================================== 0010e97c <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch>: #include void _POSIX_Thread_Evaluate_cancellation_and_enable_dispatch( Thread_Control *the_thread ) { 10e97c: 55 push %ebp 10e97d: 89 e5 mov %esp,%ebp 10e97f: 83 ec 08 sub $0x8,%esp 10e982: 8b 55 08 mov 0x8(%ebp),%edx POSIX_API_Control *thread_support; thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ]; 10e985: 8b 82 ec 00 00 00 mov 0xec(%edx),%eax if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE && 10e98b: 83 b8 d8 00 00 00 00 cmpl $0x0,0xd8(%eax) 10e992: 75 2c jne 10e9c0 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x44><== NEVER TAKEN 10e994: 83 b8 dc 00 00 00 01 cmpl $0x1,0xdc(%eax) 10e99b: 75 23 jne 10e9c0 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x44> thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS && 10e99d: 83 b8 e0 00 00 00 00 cmpl $0x0,0xe0(%eax) 10e9a4: 74 1a je 10e9c0 <_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; 10e9a6: a1 50 63 12 00 mov 0x126350,%eax 10e9ab: 48 dec %eax 10e9ac: a3 50 63 12 00 mov %eax,0x126350 thread_support->cancelation_requested ) { _Thread_Unnest_dispatch(); _POSIX_Thread_Exit( the_thread, PTHREAD_CANCELED ); 10e9b1: 50 push %eax 10e9b2: 50 push %eax 10e9b3: 6a ff push $0xffffffff 10e9b5: 52 push %edx 10e9b6: e8 51 08 00 00 call 10f20c <_POSIX_Thread_Exit> 10e9bb: 83 c4 10 add $0x10,%esp } else _Thread_Enable_dispatch(); } 10e9be: c9 leave 10e9bf: c3 ret 10e9c0: 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(); 10e9c1: e9 7c db ff ff jmp 10c542 <_Thread_Enable_dispatch> =============================================================================== 0010fc04 <_POSIX_Thread_Translate_sched_param>: int policy, struct sched_param *param, Thread_CPU_budget_algorithms *budget_algorithm, Thread_CPU_budget_algorithm_callout *budget_callout ) { 10fc04: 55 push %ebp 10fc05: 89 e5 mov %esp,%ebp 10fc07: 57 push %edi 10fc08: 56 push %esi 10fc09: 53 push %ebx 10fc0a: 83 ec 28 sub $0x28,%esp 10fc0d: 8b 55 08 mov 0x8(%ebp),%edx 10fc10: 8b 5d 0c mov 0xc(%ebp),%ebx 10fc13: 8b 7d 10 mov 0x10(%ebp),%edi if ( !_POSIX_Priority_Is_valid( param->sched_priority ) ) 10fc16: ff 33 pushl (%ebx) 10fc18: 89 55 e0 mov %edx,-0x20(%ebp) 10fc1b: e8 c4 ff ff ff call 10fbe4 <_POSIX_Priority_Is_valid> 10fc20: 83 c4 10 add $0x10,%esp return EINVAL; 10fc23: 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 ) ) 10fc28: 84 c0 test %al,%al 10fc2a: 8b 55 e0 mov -0x20(%ebp),%edx 10fc2d: 0f 84 a4 00 00 00 je 10fcd7 <_POSIX_Thread_Translate_sched_param+0xd3><== NEVER TAKEN return EINVAL; *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; 10fc33: c7 07 00 00 00 00 movl $0x0,(%edi) *budget_callout = NULL; 10fc39: 8b 45 14 mov 0x14(%ebp),%eax 10fc3c: c7 00 00 00 00 00 movl $0x0,(%eax) if ( policy == SCHED_OTHER ) { 10fc42: 85 d2 test %edx,%edx 10fc44: 75 0b jne 10fc51 <_POSIX_Thread_Translate_sched_param+0x4d> *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; 10fc46: c7 07 01 00 00 00 movl $0x1,(%edi) 10fc4c: e9 83 00 00 00 jmp 10fcd4 <_POSIX_Thread_Translate_sched_param+0xd0> return 0; } if ( policy == SCHED_FIFO ) { *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; return 0; 10fc51: 31 f6 xor %esi,%esi if ( policy == SCHED_OTHER ) { *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; return 0; } if ( policy == SCHED_FIFO ) { 10fc53: 83 fa 01 cmp $0x1,%edx 10fc56: 74 7f je 10fcd7 <_POSIX_Thread_Translate_sched_param+0xd3> *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; return 0; } if ( policy == SCHED_RR ) { 10fc58: 83 fa 02 cmp $0x2,%edx 10fc5b: 75 08 jne 10fc65 <_POSIX_Thread_Translate_sched_param+0x61> *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE; 10fc5d: c7 07 02 00 00 00 movl $0x2,(%edi) return 0; 10fc63: eb 72 jmp 10fcd7 <_POSIX_Thread_Translate_sched_param+0xd3> *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT; *budget_callout = _POSIX_Threads_Sporadic_budget_callout; return 0; } return EINVAL; 10fc65: 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 ) { 10fc6a: 83 fa 04 cmp $0x4,%edx 10fc6d: 75 68 jne 10fcd7 <_POSIX_Thread_Translate_sched_param+0xd3> if ( (param->sched_ss_repl_period.tv_sec == 0) && 10fc6f: 83 7b 08 00 cmpl $0x0,0x8(%ebx) 10fc73: 75 06 jne 10fc7b <_POSIX_Thread_Translate_sched_param+0x77> 10fc75: 83 7b 0c 00 cmpl $0x0,0xc(%ebx) 10fc79: 74 5c je 10fcd7 <_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) && 10fc7b: 83 7b 10 00 cmpl $0x0,0x10(%ebx) 10fc7f: 75 0b jne 10fc8c <_POSIX_Thread_Translate_sched_param+0x88> (param->sched_ss_init_budget.tv_nsec == 0) ) return EINVAL; 10fc81: 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) && 10fc86: 83 7b 14 00 cmpl $0x0,0x14(%ebx) 10fc8a: 74 4b je 10fcd7 <_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 ) < 10fc8c: 83 ec 0c sub $0xc,%esp 10fc8f: 8d 43 08 lea 0x8(%ebx),%eax 10fc92: 50 push %eax 10fc93: e8 0c de ff ff call 10daa4 <_Timespec_To_ticks> 10fc98: 89 45 e4 mov %eax,-0x1c(%ebp) _Timespec_To_ticks( ¶m->sched_ss_init_budget ) ) 10fc9b: 8d 43 10 lea 0x10(%ebx),%eax 10fc9e: 89 04 24 mov %eax,(%esp) 10fca1: e8 fe dd ff ff call 10daa4 <_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 ) < 10fca6: 83 c4 10 add $0x10,%esp _Timespec_To_ticks( ¶m->sched_ss_init_budget ) ) return EINVAL; 10fca9: 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 ) < 10fcae: 39 45 e4 cmp %eax,-0x1c(%ebp) 10fcb1: 72 24 jb 10fcd7 <_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 ) ) 10fcb3: 83 ec 0c sub $0xc,%esp 10fcb6: ff 73 04 pushl 0x4(%ebx) 10fcb9: e8 26 ff ff ff call 10fbe4 <_POSIX_Priority_Is_valid> 10fcbe: 83 c4 10 add $0x10,%esp 10fcc1: 84 c0 test %al,%al 10fcc3: 74 12 je 10fcd7 <_POSIX_Thread_Translate_sched_param+0xd3> return EINVAL; *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT; 10fcc5: c7 07 03 00 00 00 movl $0x3,(%edi) *budget_callout = _POSIX_Threads_Sporadic_budget_callout; 10fccb: 8b 45 14 mov 0x14(%ebp),%eax 10fcce: c7 00 ed a7 10 00 movl $0x10a7ed,(%eax) return 0; 10fcd4: 66 31 f6 xor %si,%si } return EINVAL; } 10fcd7: 89 f0 mov %esi,%eax 10fcd9: 8d 65 f4 lea -0xc(%ebp),%esp 10fcdc: 5b pop %ebx 10fcdd: 5e pop %esi 10fcde: 5f pop %edi 10fcdf: c9 leave 10fce0: c3 ret =============================================================================== 0010a4f0 <_POSIX_Threads_Initialize_user_threads_body>: * * Output parameters: NONE */ void _POSIX_Threads_Initialize_user_threads_body(void) { 10a4f0: 55 push %ebp 10a4f1: 89 e5 mov %esp,%ebp 10a4f3: 57 push %edi 10a4f4: 56 push %esi 10a4f5: 53 push %ebx 10a4f6: 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; 10a4f9: 8b 3d 40 22 12 00 mov 0x122240,%edi maximum = Configuration_POSIX_API.number_of_initialization_threads; 10a4ff: 8b 15 3c 22 12 00 mov 0x12223c,%edx if ( !user_threads || maximum == 0 ) 10a505: 85 d2 test %edx,%edx 10a507: 74 54 je 10a55d <_POSIX_Threads_Initialize_user_threads_body+0x6d><== NEVER TAKEN 10a509: 85 ff test %edi,%edi 10a50b: 74 50 je 10a55d <_POSIX_Threads_Initialize_user_threads_body+0x6d><== NEVER TAKEN 10a50d: 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 ); 10a50f: 8d 75 a4 lea -0x5c(%ebp),%esi 10a512: 83 ec 0c sub $0xc,%esp 10a515: 56 push %esi 10a516: 89 55 94 mov %edx,-0x6c(%ebp) 10a519: e8 c6 57 00 00 call 10fce4 (void) pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED ); 10a51e: 5a pop %edx 10a51f: 59 pop %ecx 10a520: 6a 02 push $0x2 10a522: 56 push %esi 10a523: e8 e4 57 00 00 call 10fd0c (void) pthread_attr_setstacksize(&attr, user_threads[ index ].stack_size); 10a528: 59 pop %ecx 10a529: 58 pop %eax 10a52a: ff 74 df 04 pushl 0x4(%edi,%ebx,8) 10a52e: 56 push %esi 10a52f: e8 04 58 00 00 call 10fd38 status = pthread_create( 10a534: 6a 00 push $0x0 10a536: ff 34 df pushl (%edi,%ebx,8) 10a539: 56 push %esi 10a53a: 8d 45 e4 lea -0x1c(%ebp),%eax 10a53d: 50 push %eax 10a53e: e8 e5 fc ff ff call 10a228 &thread_id, &attr, user_threads[ index ].thread_entry, NULL ); if ( status ) 10a543: 83 c4 20 add $0x20,%esp 10a546: 85 c0 test %eax,%eax 10a548: 8b 55 94 mov -0x6c(%ebp),%edx 10a54b: 74 0b je 10a558 <_POSIX_Threads_Initialize_user_threads_body+0x68> _Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status ); 10a54d: 52 push %edx 10a54e: 50 push %eax 10a54f: 6a 01 push $0x1 10a551: 6a 02 push $0x2 10a553: e8 e8 1b 00 00 call 10c140 <_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++ ) { 10a558: 43 inc %ebx 10a559: 39 d3 cmp %edx,%ebx 10a55b: 72 b5 jb 10a512 <_POSIX_Threads_Initialize_user_threads_body+0x22><== NEVER TAKEN NULL ); if ( status ) _Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status ); } } 10a55d: 8d 65 f4 lea -0xc(%ebp),%esp 10a560: 5b pop %ebx 10a561: 5e pop %esi 10a562: 5f pop %edi 10a563: c9 leave 10a564: c3 ret =============================================================================== 0010ed6f <_POSIX_Threads_Sporadic_budget_TSR>: */ void _POSIX_Threads_Sporadic_budget_TSR( Objects_Id id __attribute__((unused)), void *argument ) { 10ed6f: 55 push %ebp 10ed70: 89 e5 mov %esp,%ebp 10ed72: 56 push %esi 10ed73: 53 push %ebx 10ed74: 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 ]; 10ed77: 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 ); 10ed7d: 83 ec 0c sub $0xc,%esp 10ed80: 8d 86 98 00 00 00 lea 0x98(%esi),%eax 10ed86: 50 push %eax 10ed87: e8 7c 0d 00 00 call 10fb08 <_Timespec_To_ticks> the_thread->cpu_time_budget = ticks; 10ed8c: 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); 10ed8f: 0f b6 05 24 12 12 00 movzbl 0x121224,%eax 10ed96: 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; 10ed9c: 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 ) { 10ed9f: 83 c4 10 add $0x10,%esp 10eda2: 83 7b 1c 00 cmpl $0x0,0x1c(%ebx) 10eda6: 75 12 jne 10edba <_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 ) { 10eda8: 39 43 14 cmp %eax,0x14(%ebx) 10edab: 76 0d jbe 10edba <_POSIX_Threads_Sporadic_budget_TSR+0x4b> _Thread_Change_priority( the_thread, new_priority, true ); 10edad: 52 push %edx 10edae: 6a 01 push $0x1 10edb0: 50 push %eax 10edb1: 53 push %ebx 10edb2: e8 0d d0 ff ff call 10bdc4 <_Thread_Change_priority> 10edb7: 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 ); 10edba: 83 ec 0c sub $0xc,%esp 10edbd: 8d 86 90 00 00 00 lea 0x90(%esi),%eax 10edc3: 50 push %eax 10edc4: e8 3f 0d 00 00 call 10fb08 <_Timespec_To_ticks> Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 10edc9: 89 86 b4 00 00 00 mov %eax,0xb4(%esi) _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 10edcf: 83 c4 10 add $0x10,%esp _Watchdog_Insert_ticks( &api->Sporadic_timer, ticks ); 10edd2: 81 c6 a8 00 00 00 add $0xa8,%esi 10edd8: 89 75 0c mov %esi,0xc(%ebp) 10eddb: c7 45 08 04 54 12 00 movl $0x125404,0x8(%ebp) } 10ede2: 8d 65 f8 lea -0x8(%ebp),%esp 10ede5: 5b pop %ebx 10ede6: 5e pop %esi 10ede7: c9 leave 10ede8: e9 bf df ff ff jmp 10cdac <_Watchdog_Insert> =============================================================================== 0010eded <_POSIX_Threads_Sporadic_budget_callout>: * _POSIX_Threads_Sporadic_budget_callout */ void _POSIX_Threads_Sporadic_budget_callout( Thread_Control *the_thread ) { 10eded: 55 push %ebp 10edee: 89 e5 mov %esp,%ebp 10edf0: 83 ec 08 sub $0x8,%esp 10edf3: 8b 45 08 mov 0x8(%ebp),%eax POSIX_API_Control *api; uint32_t new_priority; api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 10edf6: 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 */ 10edfc: c7 40 78 ff ff ff ff movl $0xffffffff,0x78(%eax) 10ee03: 0f b6 15 24 12 12 00 movzbl 0x121224,%edx 10ee0a: 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; 10ee10: 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 ) { 10ee13: 83 78 1c 00 cmpl $0x0,0x1c(%eax) 10ee17: 75 12 jne 10ee2b <_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 ) { 10ee19: 39 50 14 cmp %edx,0x14(%eax) 10ee1c: 73 0d jae 10ee2b <_POSIX_Threads_Sporadic_budget_callout+0x3e><== NEVER TAKEN _Thread_Change_priority( the_thread, new_priority, true ); 10ee1e: 51 push %ecx 10ee1f: 6a 01 push $0x1 10ee21: 52 push %edx 10ee22: 50 push %eax 10ee23: e8 9c cf ff ff call 10bdc4 <_Thread_Change_priority> 10ee28: 83 c4 10 add $0x10,%esp #if 0 printk( "lower priority\n" ); #endif } } } 10ee2b: c9 leave 10ee2c: c3 ret =============================================================================== 0010a2b0 <_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) { 10a2b0: 55 push %ebp 10a2b1: 89 e5 mov %esp,%ebp 10a2b3: 53 push %ebx 10a2b4: 83 ec 04 sub $0x4,%esp 10a2b7: 8b 5d 0c mov 0xc(%ebp),%ebx bool activated; ptimer = (POSIX_Timer_Control *)data; /* Increment the number of expirations. */ ptimer->overrun = ptimer->overrun + 1; 10a2ba: ff 43 68 incl 0x68(%ebx) /* The timer must be reprogrammed */ if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) || 10a2bd: 83 7b 54 00 cmpl $0x0,0x54(%ebx) 10a2c1: 75 06 jne 10a2c9 <_POSIX_Timer_TSR+0x19> 10a2c3: 83 7b 58 00 cmpl $0x0,0x58(%ebx) 10a2c7: 74 34 je 10a2fd <_POSIX_Timer_TSR+0x4d> <== NEVER TAKEN ( ptimer->timer_data.it_interval.tv_nsec != 0 ) ) { activated = _POSIX_Timer_Insert_helper( 10a2c9: 83 ec 0c sub $0xc,%esp 10a2cc: 53 push %ebx 10a2cd: 68 b0 a2 10 00 push $0x10a2b0 10a2d2: ff 73 08 pushl 0x8(%ebx) 10a2d5: ff 73 64 pushl 0x64(%ebx) 10a2d8: 8d 43 10 lea 0x10(%ebx),%eax 10a2db: 50 push %eax 10a2dc: e8 df 56 00 00 call 10f9c0 <_POSIX_Timer_Insert_helper> ptimer->ticks, ptimer->Object.id, _POSIX_Timer_TSR, ptimer ); if ( !activated ) 10a2e1: 83 c4 20 add $0x20,%esp 10a2e4: 84 c0 test %al,%al 10a2e6: 74 30 je 10a318 <_POSIX_Timer_TSR+0x68> <== NEVER TAKEN return; /* Store the time when the timer was started again */ _TOD_Get( &ptimer->time ); 10a2e8: 83 ec 0c sub $0xc,%esp 10a2eb: 8d 43 6c lea 0x6c(%ebx),%eax 10a2ee: 50 push %eax 10a2ef: e8 5c 14 00 00 call 10b750 <_TOD_Get> /* The state really did not change but just to be safe */ ptimer->state = POSIX_TIMER_STATE_CREATE_RUN; 10a2f4: c6 43 3c 03 movb $0x3,0x3c(%ebx) 10a2f8: 83 c4 10 add $0x10,%esp 10a2fb: eb 04 jmp 10a301 <_POSIX_Timer_TSR+0x51> } else { /* Indicates that the timer is stopped */ ptimer->state = POSIX_TIMER_STATE_CREATE_STOP; 10a2fd: 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 ) ) { 10a301: 50 push %eax 10a302: 50 push %eax 10a303: ff 73 44 pushl 0x44(%ebx) 10a306: ff 73 38 pushl 0x38(%ebx) 10a309: e8 86 52 00 00 call 10f594 } /* After the signal handler returns, the count of expirations of the * timer must be set to 0. */ ptimer->overrun = 0; 10a30e: c7 43 68 00 00 00 00 movl $0x0,0x68(%ebx) 10a315: 83 c4 10 add $0x10,%esp } 10a318: 8b 5d fc mov -0x4(%ebp),%ebx 10a31b: c9 leave 10a31c: c3 ret =============================================================================== 00110ae8 <_POSIX_signals_Check_signal>: bool _POSIX_signals_Check_signal( POSIX_API_Control *api, int signo, bool is_global ) { 110ae8: 55 push %ebp 110ae9: 89 e5 mov %esp,%ebp 110aeb: 57 push %edi 110aec: 56 push %esi 110aed: 53 push %ebx 110aee: 83 ec 68 sub $0x68,%esp 110af1: 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, 110af4: 6a 01 push $0x1 110af6: 0f b6 45 10 movzbl 0x10(%ebp),%eax 110afa: 50 push %eax 110afb: 8d 45 dc lea -0x24(%ebp),%eax 110afe: 50 push %eax 110aff: 53 push %ebx 110b00: ff 75 08 pushl 0x8(%ebp) 110b03: e8 8c 00 00 00 call 110b94 <_POSIX_signals_Clear_signals> 110b08: 83 c4 20 add $0x20,%esp is_global, true ) ) return false; 110b0b: 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, 110b0d: 84 c0 test %al,%al 110b0f: 74 78 je 110b89 <_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 ) 110b11: 6b d3 0c imul $0xc,%ebx,%edx 110b14: 8b 82 a4 58 12 00 mov 0x1258a4(%edx),%eax 110b1a: 83 f8 01 cmp $0x1,%eax 110b1d: 74 6a je 110b89 <_POSIX_signals_Check_signal+0xa1><== NEVER TAKEN return false; /* * Block the signals requested in sa_mask */ saved_signals_blocked = api->signals_blocked; 110b1f: 8b 4d 08 mov 0x8(%ebp),%ecx 110b22: 8b 89 d0 00 00 00 mov 0xd0(%ecx),%ecx 110b28: 89 4d a4 mov %ecx,-0x5c(%ebp) api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask; 110b2b: 0b 8a a0 58 12 00 or 0x1258a0(%edx),%ecx 110b31: 8b 75 08 mov 0x8(%ebp),%esi 110b34: 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, 110b3a: 8d 7d b4 lea -0x4c(%ebp),%edi 110b3d: 8b 35 68 58 12 00 mov 0x125868,%esi 110b43: 83 c6 20 add $0x20,%esi 110b46: b9 0a 00 00 00 mov $0xa,%ecx 110b4b: 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 ) { 110b4d: 83 ba 9c 58 12 00 02 cmpl $0x2,0x12589c(%edx) 110b54: 75 09 jne 110b5f <_POSIX_signals_Check_signal+0x77> case SA_SIGINFO: (*_POSIX_signals_Vectors[ signo ].sa_sigaction)( 110b56: 52 push %edx 110b57: 6a 00 push $0x0 110b59: 8d 55 dc lea -0x24(%ebp),%edx 110b5c: 52 push %edx 110b5d: eb 03 jmp 110b62 <_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 ); 110b5f: 83 ec 0c sub $0xc,%esp 110b62: 53 push %ebx 110b63: ff d0 call *%eax break; 110b65: 83 c4 10 add $0x10,%esp } /* * Restore the blocking information */ memcpy( &_Thread_Executing->Wait, &stored_thread_wait_information, 110b68: 8b 3d 68 58 12 00 mov 0x125868,%edi 110b6e: 83 c7 20 add $0x20,%edi 110b71: 8d 75 b4 lea -0x4c(%ebp),%esi 110b74: b9 0a 00 00 00 mov $0xa,%ecx 110b79: 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; 110b7b: 8b 75 a4 mov -0x5c(%ebp),%esi 110b7e: 8b 4d 08 mov 0x8(%ebp),%ecx 110b81: 89 b1 d0 00 00 00 mov %esi,0xd0(%ecx) return true; 110b87: b1 01 mov $0x1,%cl } 110b89: 88 c8 mov %cl,%al 110b8b: 8d 65 f4 lea -0xc(%ebp),%esp 110b8e: 5b pop %ebx 110b8f: 5e pop %esi 110b90: 5f pop %edi 110b91: c9 leave 110b92: c3 ret =============================================================================== 0011107c <_POSIX_signals_Clear_process_signals>: */ void _POSIX_signals_Clear_process_signals( int signo ) { 11107c: 55 push %ebp 11107d: 89 e5 mov %esp,%ebp 11107f: 53 push %ebx 111080: 8b 4d 08 mov 0x8(%ebp),%ecx clear_signal = true; mask = signo_to_mask( signo ); ISR_Level level; _ISR_Disable( level ); 111083: 9c pushf 111084: fa cli 111085: 5a pop %edx if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) { 111086: 6b c1 0c imul $0xc,%ecx,%eax 111089: 83 b8 9c 58 12 00 02 cmpl $0x2,0x12589c(%eax) 111090: 75 0e jne 1110a0 <_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 ); 111092: 8d 98 98 5a 12 00 lea 0x125a98(%eax),%ebx if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) ) 111098: 39 98 94 5a 12 00 cmp %ebx,0x125a94(%eax) 11109e: 75 0e jne 1110ae <_POSIX_signals_Clear_process_signals+0x32><== NEVER TAKEN 1110a0: 49 dec %ecx 1110a1: b8 fe ff ff ff mov $0xfffffffe,%eax clear_signal = false; } if ( clear_signal ) { _POSIX_signals_Pending &= ~mask; 1110a6: d3 c0 rol %cl,%eax 1110a8: 21 05 90 5a 12 00 and %eax,0x125a90 } _ISR_Enable( level ); 1110ae: 52 push %edx 1110af: 9d popf } 1110b0: 5b pop %ebx 1110b1: c9 leave 1110b2: c3 ret =============================================================================== 0010ab58 <_POSIX_signals_Get_lowest>: #include int _POSIX_signals_Get_lowest( sigset_t set ) { 10ab58: 55 push %ebp 10ab59: 89 e5 mov %esp,%ebp 10ab5b: 56 push %esi 10ab5c: 53 push %ebx 10ab5d: 8b 55 08 mov 0x8(%ebp),%edx int signo; for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { 10ab60: b8 1b 00 00 00 mov $0x1b,%eax 10ab65: bb 01 00 00 00 mov $0x1,%ebx #include #include #include #include int _POSIX_signals_Get_lowest( 10ab6a: 8d 48 ff lea -0x1(%eax),%ecx 10ab6d: 89 de mov %ebx,%esi 10ab6f: d3 e6 shl %cl,%esi ) { int signo; for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { if ( set & signo_to_mask( signo ) ) { 10ab71: 85 d6 test %edx,%esi 10ab73: 75 1e jne 10ab93 <_POSIX_signals_Get_lowest+0x3b><== NEVER TAKEN sigset_t set ) { int signo; for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { 10ab75: 40 inc %eax 10ab76: 83 f8 20 cmp $0x20,%eax 10ab79: 75 ef jne 10ab6a <_POSIX_signals_Get_lowest+0x12> 10ab7b: b0 01 mov $0x1,%al 10ab7d: bb 01 00 00 00 mov $0x1,%ebx #include #include #include #include int _POSIX_signals_Get_lowest( 10ab82: 8d 48 ff lea -0x1(%eax),%ecx 10ab85: 89 de mov %ebx,%esi 10ab87: 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 ) ) { 10ab89: 85 d6 test %edx,%esi 10ab8b: 75 06 jne 10ab93 <_POSIX_signals_Get_lowest+0x3b> */ #if (SIGHUP != 1) #error "Assumption that SIGHUP==1 violated!!" #endif for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) { 10ab8d: 40 inc %eax 10ab8e: 83 f8 1b cmp $0x1b,%eax 10ab91: 75 ef jne 10ab82 <_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; } 10ab93: 5b pop %ebx 10ab94: 5e pop %esi 10ab95: c9 leave 10ab96: c3 ret =============================================================================== 00122140 <_POSIX_signals_Unblock_thread>: bool _POSIX_signals_Unblock_thread( Thread_Control *the_thread, int signo, siginfo_t *info ) { 122140: 55 push %ebp 122141: 89 e5 mov %esp,%ebp 122143: 57 push %edi 122144: 56 push %esi 122145: 53 push %ebx 122146: 83 ec 0c sub $0xc,%esp 122149: 8b 5d 08 mov 0x8(%ebp),%ebx 12214c: 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 ]; 12214f: 8b 83 ec 00 00 00 mov 0xec(%ebx),%eax 122155: 8d 4e ff lea -0x1(%esi),%ecx 122158: ba 01 00 00 00 mov $0x1,%edx 12215d: d3 e2 shl %cl,%edx /* * Is the thread is specifically waiting for a signal? */ if ( _States_Is_interruptible_signal( the_thread->current_state ) ) { 12215f: 8b 4b 10 mov 0x10(%ebx),%ecx 122162: 89 cf mov %ecx,%edi 122164: 81 e7 00 80 00 10 and $0x10008000,%edi 12216a: 81 ff 00 80 00 10 cmp $0x10008000,%edi 122170: 75 58 jne 1221ca <_POSIX_signals_Unblock_thread+0x8a> if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) { 122172: 85 53 30 test %edx,0x30(%ebx) 122175: 75 12 jne 122189 <_POSIX_signals_Unblock_thread+0x49> 122177: 8b 80 d0 00 00 00 mov 0xd0(%eax),%eax 12217d: f7 d0 not %eax /* * This should only be reached via pthread_kill(). */ return false; 12217f: 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) ) { 122181: 85 c2 test %eax,%edx 122183: 0f 84 b0 00 00 00 je 122239 <_POSIX_signals_Unblock_thread+0xf9> the_thread->Wait.return_code = EINTR; 122189: c7 43 34 04 00 00 00 movl $0x4,0x34(%ebx) the_info = (siginfo_t *) the_thread->Wait.return_argument; 122190: 8b 43 28 mov 0x28(%ebx),%eax if ( !info ) { 122193: 83 7d 10 00 cmpl $0x0,0x10(%ebp) 122197: 75 12 jne 1221ab <_POSIX_signals_Unblock_thread+0x6b> the_info->si_signo = signo; 122199: 89 30 mov %esi,(%eax) the_info->si_code = SI_USER; 12219b: c7 40 04 01 00 00 00 movl $0x1,0x4(%eax) the_info->si_value.sival_int = 0; 1221a2: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax) 1221a9: eb 0c jmp 1221b7 <_POSIX_signals_Unblock_thread+0x77> } else { *the_info = *info; 1221ab: b9 03 00 00 00 mov $0x3,%ecx 1221b0: 89 c7 mov %eax,%edi 1221b2: 8b 75 10 mov 0x10(%ebp),%esi 1221b5: f3 a5 rep movsl %ds:(%esi),%es:(%edi) } _Thread_queue_Extract_with_proxy( the_thread ); 1221b7: 83 ec 0c sub $0xc,%esp 1221ba: 53 push %ebx 1221bb: e8 bc ed fe ff call 110f7c <_Thread_queue_Extract_with_proxy> return true; 1221c0: 83 c4 10 add $0x10,%esp 1221c3: bf 01 00 00 00 mov $0x1,%edi 1221c8: eb 6f jmp 122239 <_POSIX_signals_Unblock_thread+0xf9> } /* * Thread is not waiting due to a sigwait. */ if ( ~api->signals_blocked & mask ) { 1221ca: 8b 80 d0 00 00 00 mov 0xd0(%eax),%eax 1221d0: 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; 1221d2: 31 ff xor %edi,%edi } /* * Thread is not waiting due to a sigwait. */ if ( ~api->signals_blocked & mask ) { 1221d4: 85 c2 test %eax,%edx 1221d6: 74 61 je 122239 <_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 ) ) { 1221d8: f7 c1 00 00 00 10 test $0x10000000,%ecx 1221de: 74 3d je 12221d <_POSIX_signals_Unblock_thread+0xdd> the_thread->Wait.return_code = EINTR; 1221e0: 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) ) 1221e7: f7 c1 e0 be 03 00 test $0x3bee0,%ecx 1221ed: 74 0b je 1221fa <_POSIX_signals_Unblock_thread+0xba> _Thread_queue_Extract_with_proxy( the_thread ); 1221ef: 83 ec 0c sub $0xc,%esp 1221f2: 53 push %ebx 1221f3: e8 84 ed fe ff call 110f7c <_Thread_queue_Extract_with_proxy> 1221f8: eb 1e jmp 122218 <_POSIX_signals_Unblock_thread+0xd8> else if ( _States_Is_delaying(the_thread->current_state) ) { 1221fa: 80 e1 08 and $0x8,%cl 1221fd: 74 3a je 122239 <_POSIX_signals_Unblock_thread+0xf9><== NEVER TAKEN (void) _Watchdog_Remove( &the_thread->Timer ); 1221ff: 83 ec 0c sub $0xc,%esp 122202: 8d 43 48 lea 0x48(%ebx),%eax 122205: 50 push %eax 122206: e8 81 f4 fe ff call 11168c <_Watchdog_Remove> RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); 12220b: 58 pop %eax 12220c: 5a pop %edx 12220d: 68 f8 ff 03 10 push $0x1003fff8 122212: 53 push %ebx 122213: e8 2c e4 fe ff call 110644 <_Thread_Clear_state> 122218: 83 c4 10 add $0x10,%esp 12221b: eb 1c jmp 122239 <_POSIX_signals_Unblock_thread+0xf9> _Thread_Unblock( the_thread ); } } else if ( the_thread->current_state == STATES_READY ) { 12221d: 85 c9 test %ecx,%ecx 12221f: 75 18 jne 122239 <_POSIX_signals_Unblock_thread+0xf9><== NEVER TAKEN if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) ) 122221: 83 3d d8 b9 12 00 00 cmpl $0x0,0x12b9d8 122228: 74 0f je 122239 <_POSIX_signals_Unblock_thread+0xf9> 12222a: 3b 1d dc b9 12 00 cmp 0x12b9dc,%ebx 122230: 75 07 jne 122239 <_POSIX_signals_Unblock_thread+0xf9><== NEVER TAKEN _Thread_Dispatch_necessary = true; 122232: c6 05 e8 b9 12 00 01 movb $0x1,0x12b9e8 } } return false; } 122239: 89 f8 mov %edi,%eax 12223b: 8d 65 f4 lea -0xc(%ebp),%esp 12223e: 5b pop %ebx 12223f: 5e pop %esi 122240: 5f pop %edi 122241: c9 leave 122242: c3 ret =============================================================================== 0010b3a8 <_Rate_monotonic_Timeout>: void _Rate_monotonic_Timeout( Objects_Id id, void *ignored ) { 10b3a8: 55 push %ebp 10b3a9: 89 e5 mov %esp,%ebp 10b3ab: 53 push %ebx 10b3ac: 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 ); 10b3af: 8d 45 f4 lea -0xc(%ebp),%eax 10b3b2: 50 push %eax 10b3b3: ff 75 08 pushl 0x8(%ebp) 10b3b6: 68 74 83 12 00 push $0x128374 10b3bb: e8 c8 1a 00 00 call 10ce88 <_Objects_Get> 10b3c0: 89 c3 mov %eax,%ebx switch ( location ) { 10b3c2: 83 c4 10 add $0x10,%esp 10b3c5: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) 10b3c9: 75 64 jne 10b42f <_Rate_monotonic_Timeout+0x87><== NEVER TAKEN case OBJECTS_LOCAL: the_thread = the_period->owner; 10b3cb: 8b 40 40 mov 0x40(%eax),%eax if ( _States_Is_waiting_for_period( the_thread->current_state ) && 10b3ce: f6 40 11 40 testb $0x40,0x11(%eax) 10b3d2: 74 18 je 10b3ec <_Rate_monotonic_Timeout+0x44> 10b3d4: 8b 53 08 mov 0x8(%ebx),%edx 10b3d7: 39 50 20 cmp %edx,0x20(%eax) 10b3da: 75 10 jne 10b3ec <_Rate_monotonic_Timeout+0x44> RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); 10b3dc: 52 push %edx 10b3dd: 52 push %edx 10b3de: 68 f8 ff 03 10 push $0x1003fff8 10b3e3: 50 push %eax 10b3e4: e8 2f 22 00 00 call 10d618 <_Thread_Clear_state> the_thread->Wait.id == the_period->Object.id ) { _Thread_Unblock( the_thread ); _Rate_monotonic_Initiate_statistics( the_period ); 10b3e9: 59 pop %ecx 10b3ea: eb 10 jmp 10b3fc <_Rate_monotonic_Timeout+0x54> _Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length ); } else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) { 10b3ec: 83 7b 38 01 cmpl $0x1,0x38(%ebx) 10b3f0: 75 2b jne 10b41d <_Rate_monotonic_Timeout+0x75> the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING; 10b3f2: c7 43 38 03 00 00 00 movl $0x3,0x38(%ebx) _Rate_monotonic_Initiate_statistics( the_period ); 10b3f9: 83 ec 0c sub $0xc,%esp 10b3fc: 53 push %ebx 10b3fd: e8 ec fa ff ff call 10aeee <_Rate_monotonic_Initiate_statistics> Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 10b402: 8b 43 3c mov 0x3c(%ebx),%eax 10b405: 89 43 1c mov %eax,0x1c(%ebx) _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 10b408: 58 pop %eax 10b409: 5a pop %edx _Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length ); 10b40a: 83 c3 10 add $0x10,%ebx 10b40d: 53 push %ebx 10b40e: 68 28 85 12 00 push $0x128528 10b413: e8 24 32 00 00 call 10e63c <_Watchdog_Insert> 10b418: 83 c4 10 add $0x10,%esp 10b41b: eb 07 jmp 10b424 <_Rate_monotonic_Timeout+0x7c> } else the_period->state = RATE_MONOTONIC_EXPIRED; 10b41d: 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; 10b424: a1 64 84 12 00 mov 0x128464,%eax 10b429: 48 dec %eax 10b42a: a3 64 84 12 00 mov %eax,0x128464 case OBJECTS_REMOTE: /* impossible */ #endif case OBJECTS_ERROR: break; } } 10b42f: 8b 5d fc mov -0x4(%ebp),%ebx 10b432: c9 leave 10b433: c3 ret =============================================================================== 0010ba0c <_Scheduler_priority_Block>: #include void _Scheduler_priority_Block( Thread_Control *the_thread ) { 10ba0c: 55 push %ebp 10ba0d: 89 e5 mov %esp,%ebp 10ba0f: 56 push %esi 10ba10: 53 push %ebx 10ba11: 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; 10ba14: 8b 8a 8c 00 00 00 mov 0x8c(%edx),%ecx ready = sched_info->ready_chain; 10ba1a: 8b 01 mov (%ecx),%eax if ( _Chain_Has_only_one_node( ready ) ) { 10ba1c: 8b 58 08 mov 0x8(%eax),%ebx 10ba1f: 39 18 cmp %ebx,(%eax) 10ba21: 75 32 jne 10ba55 <_Scheduler_priority_Block+0x49> Chain_Node *tail = _Chain_Tail( the_chain ); 10ba23: 8d 58 04 lea 0x4(%eax),%ebx 10ba26: 89 18 mov %ebx,(%eax) head->next = tail; head->previous = NULL; 10ba28: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax) tail->previous = head; 10ba2f: 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; 10ba32: 8b 59 04 mov 0x4(%ecx),%ebx 10ba35: 66 8b 03 mov (%ebx),%ax 10ba38: 66 23 41 0e and 0xe(%ecx),%ax 10ba3c: 66 89 03 mov %ax,(%ebx) if ( *the_priority_map->minor == 0 ) 10ba3f: 66 85 c0 test %ax,%ax 10ba42: 75 1b jne 10ba5f <_Scheduler_priority_Block+0x53> _Priority_Major_bit_map &= the_priority_map->block_major; 10ba44: 66 a1 78 58 12 00 mov 0x125878,%ax 10ba4a: 23 41 0c and 0xc(%ecx),%eax 10ba4d: 66 a3 78 58 12 00 mov %ax,0x125878 10ba53: eb 0a jmp 10ba5f <_Scheduler_priority_Block+0x53> ) { Chain_Node *next; Chain_Node *previous; next = the_node->next; 10ba55: 8b 0a mov (%edx),%ecx previous = the_node->previous; 10ba57: 8b 42 04 mov 0x4(%edx),%eax next->previous = previous; 10ba5a: 89 41 04 mov %eax,0x4(%ecx) previous->next = next; 10ba5d: 89 08 mov %ecx,(%eax) _Scheduler_priority_Ready_queue_extract( the_thread ); /* TODO: flash critical section? */ if ( _Thread_Is_heir( the_thread ) ) 10ba5f: 3b 15 6c 58 12 00 cmp 0x12586c,%edx 10ba65: 75 43 jne 10baaa <_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 ); 10ba67: 66 8b 35 78 58 12 00 mov 0x125878,%si 10ba6e: 31 c9 xor %ecx,%ecx 10ba70: 89 cb mov %ecx,%ebx 10ba72: 66 0f bc de bsf %si,%bx _Bitfield_Find_first_bit( _Priority_Bit_map[major], minor ); 10ba76: 0f b7 db movzwl %bx,%ebx 10ba79: 66 8b b4 1b 7c 58 12 mov 0x12587c(%ebx,%ebx,1),%si 10ba80: 00 10ba81: 66 0f bc ce bsf %si,%cx return (_Priority_Bits_index( major ) << 4) + 10ba85: c1 e3 04 shl $0x4,%ebx 10ba88: 0f b7 c9 movzwl %cx,%ecx 10ba8b: 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 ] ) ) 10ba8e: 6b c0 0c imul $0xc,%eax,%eax 10ba91: 03 05 50 11 12 00 add 0x121150,%eax _Scheduler_priority_Schedule_body(); if ( _Thread_Is_executing( the_thread ) ) _Thread_Dispatch_necessary = true; } 10ba97: 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 ); 10ba99: 83 c0 04 add $0x4,%eax return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] ); return NULL; 10ba9c: 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 ] ) ) 10ba9e: 39 c3 cmp %eax,%ebx 10baa0: 74 02 je 10baa4 <_Scheduler_priority_Block+0x98><== NEVER TAKEN return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] ); 10baa2: 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( 10baa4: 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 ) ) 10baaa: 3b 15 68 58 12 00 cmp 0x125868,%edx 10bab0: 75 07 jne 10bab9 <_Scheduler_priority_Block+0xad> _Thread_Dispatch_necessary = true; 10bab2: c6 05 74 58 12 00 01 movb $0x1,0x125874 } 10bab9: 5b pop %ebx 10baba: 5e pop %esi 10babb: c9 leave 10babc: c3 ret =============================================================================== 0010bc0c <_Scheduler_priority_Schedule>: #include #include #include void _Scheduler_priority_Schedule(void) { 10bc0c: 55 push %ebp 10bc0d: 89 e5 mov %esp,%ebp 10bc0f: 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 ); 10bc10: 66 8b 1d 78 58 12 00 mov 0x125878,%bx 10bc17: 31 d2 xor %edx,%edx 10bc19: 89 d1 mov %edx,%ecx 10bc1b: 66 0f bc cb bsf %bx,%cx _Bitfield_Find_first_bit( _Priority_Bit_map[major], minor ); 10bc1f: 0f b7 c9 movzwl %cx,%ecx 10bc22: 66 8b 9c 09 7c 58 12 mov 0x12587c(%ecx,%ecx,1),%bx 10bc29: 00 10bc2a: 66 0f bc d3 bsf %bx,%dx return (_Priority_Bits_index( major ) << 4) + 10bc2e: c1 e1 04 shl $0x4,%ecx 10bc31: 0f b7 d2 movzwl %dx,%edx 10bc34: 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 ] ) ) 10bc37: 6b c0 0c imul $0xc,%eax,%eax 10bc3a: 03 05 50 11 12 00 add 0x121150,%eax _Scheduler_priority_Schedule_body(); } 10bc40: 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 ); 10bc42: 83 c0 04 add $0x4,%eax return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] ); return NULL; 10bc45: 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 ] ) ) 10bc47: 39 c1 cmp %eax,%ecx 10bc49: 74 02 je 10bc4d <_Scheduler_priority_Schedule+0x41><== NEVER TAKEN return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] ); 10bc4b: 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( 10bc4d: 89 15 6c 58 12 00 mov %edx,0x12586c 10bc53: 5b pop %ebx 10bc54: c9 leave 10bc55: c3 ret =============================================================================== 0010acb8 <_TOD_Validate>: */ bool _TOD_Validate( const rtems_time_of_day *the_tod ) { 10acb8: 55 push %ebp 10acb9: 89 e5 mov %esp,%ebp 10acbb: 56 push %esi 10acbc: 53 push %ebx 10acbd: 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(); 10acc0: 8b 35 b4 4a 12 00 mov 0x124ab4,%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; 10acc6: 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) || 10acc8: 85 c9 test %ecx,%ecx 10acca: 74 57 je 10ad23 <_TOD_Validate+0x6b> <== NEVER TAKEN ) { uint32_t days_in_month; uint32_t ticks_per_second; ticks_per_second = TOD_MICROSECONDS_PER_SECOND / 10accc: b8 40 42 0f 00 mov $0xf4240,%eax 10acd1: 31 d2 xor %edx,%edx 10acd3: f7 f6 div %esi rtems_configuration_get_microseconds_per_tick(); if ((!the_tod) || 10acd5: 39 41 18 cmp %eax,0x18(%ecx) 10acd8: 73 49 jae 10ad23 <_TOD_Validate+0x6b> (the_tod->ticks >= ticks_per_second) || 10acda: 83 79 14 3b cmpl $0x3b,0x14(%ecx) 10acde: 77 43 ja 10ad23 <_TOD_Validate+0x6b> (the_tod->second >= TOD_SECONDS_PER_MINUTE) || 10ace0: 83 79 10 3b cmpl $0x3b,0x10(%ecx) 10ace4: 77 3d ja 10ad23 <_TOD_Validate+0x6b> (the_tod->minute >= TOD_MINUTES_PER_HOUR) || 10ace6: 83 79 0c 17 cmpl $0x17,0xc(%ecx) 10acea: 77 37 ja 10ad23 <_TOD_Validate+0x6b> (the_tod->hour >= TOD_HOURS_PER_DAY) || (the_tod->month == 0) || 10acec: 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) || 10acef: 85 c0 test %eax,%eax 10acf1: 74 30 je 10ad23 <_TOD_Validate+0x6b> <== NEVER TAKEN (the_tod->month == 0) || 10acf3: 83 f8 0c cmp $0xc,%eax 10acf6: 77 2b ja 10ad23 <_TOD_Validate+0x6b> (the_tod->month > TOD_MONTHS_PER_YEAR) || (the_tod->year < TOD_BASE_YEAR) || 10acf8: 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) || 10acfa: 81 fe c3 07 00 00 cmp $0x7c3,%esi 10ad00: 76 21 jbe 10ad23 <_TOD_Validate+0x6b> (the_tod->year < TOD_BASE_YEAR) || (the_tod->day == 0) ) 10ad02: 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) || 10ad05: 85 d2 test %edx,%edx 10ad07: 74 1a je 10ad23 <_TOD_Validate+0x6b> <== NEVER TAKEN (the_tod->day == 0) ) return false; if ( (the_tod->year % 4) == 0 ) 10ad09: 83 e6 03 and $0x3,%esi 10ad0c: 75 09 jne 10ad17 <_TOD_Validate+0x5f> days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ]; 10ad0e: 8b 04 85 a4 1c 12 00 mov 0x121ca4(,%eax,4),%eax 10ad15: eb 07 jmp 10ad1e <_TOD_Validate+0x66> else days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ]; 10ad17: 8b 04 85 70 1c 12 00 mov 0x121c70(,%eax,4),%eax * false - if the the_tod is invalid * * NOTE: This routine only works for leap-years through 2099. */ bool _TOD_Validate( 10ad1e: 39 c2 cmp %eax,%edx 10ad20: 0f 96 c3 setbe %bl if ( the_tod->day > days_in_month ) return false; return true; } 10ad23: 88 d8 mov %bl,%al 10ad25: 5b pop %ebx 10ad26: 5e pop %esi 10ad27: c9 leave 10ad28: c3 ret =============================================================================== 0010bdc4 <_Thread_Change_priority>: void _Thread_Change_priority( Thread_Control *the_thread, Priority_Control new_priority, bool prepend_it ) { 10bdc4: 55 push %ebp 10bdc5: 89 e5 mov %esp,%ebp 10bdc7: 57 push %edi 10bdc8: 56 push %esi 10bdc9: 53 push %ebx 10bdca: 83 ec 28 sub $0x28,%esp 10bdcd: 8b 5d 08 mov 0x8(%ebp),%ebx 10bdd0: 8b 75 0c mov 0xc(%ebp),%esi 10bdd3: 8a 45 10 mov 0x10(%ebp),%al 10bdd6: 88 45 e7 mov %al,-0x19(%ebp) States_Control state, original_state; /* * Save original state */ original_state = the_thread->current_state; 10bdd9: 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 ); 10bddc: 53 push %ebx 10bddd: e8 5e 0b 00 00 call 10c940 <_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 ) 10bde2: 83 c4 10 add $0x10,%esp 10bde5: 39 73 14 cmp %esi,0x14(%ebx) 10bde8: 74 0c je 10bdf6 <_Thread_Change_priority+0x32> _Thread_Set_priority( the_thread, new_priority ); 10bdea: 50 push %eax 10bdeb: 50 push %eax 10bdec: 56 push %esi 10bded: 53 push %ebx 10bdee: e8 fd 0a 00 00 call 10c8f0 <_Thread_Set_priority> 10bdf3: 83 c4 10 add $0x10,%esp _ISR_Disable( level ); 10bdf6: 9c pushf 10bdf7: fa cli 10bdf8: 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; 10bdf9: 8b 43 10 mov 0x10(%ebx),%eax if ( state != STATES_TRANSIENT ) { 10bdfc: 83 f8 04 cmp $0x4,%eax 10bdff: 74 2b je 10be2c <_Thread_Change_priority+0x68> /* Only clear the transient state if it wasn't set already */ if ( ! _States_Is_transient( original_state ) ) 10be01: 83 e7 04 and $0x4,%edi 10be04: 75 08 jne 10be0e <_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); 10be06: 89 c2 mov %eax,%edx 10be08: 83 e2 fb and $0xfffffffb,%edx 10be0b: 89 53 10 mov %edx,0x10(%ebx) the_thread->current_state = _States_Clear( STATES_TRANSIENT, state ); _ISR_Enable( level ); 10be0e: 56 push %esi 10be0f: 9d popf if ( _States_Is_waiting_on_thread_queue( state ) ) { 10be10: a9 e0 be 03 00 test $0x3bee0,%eax 10be15: 74 65 je 10be7c <_Thread_Change_priority+0xb8> _Thread_queue_Requeue( the_thread->Wait.queue, the_thread ); 10be17: 89 5d 0c mov %ebx,0xc(%ebp) 10be1a: 8b 43 44 mov 0x44(%ebx),%eax 10be1d: 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 ); } 10be20: 8d 65 f4 lea -0xc(%ebp),%esp 10be23: 5b pop %ebx 10be24: 5e pop %esi 10be25: 5f pop %edi 10be26: 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 ); 10be27: e9 3c 0a 00 00 jmp 10c868 <_Thread_queue_Requeue> } return; } /* Only clear the transient state if it wasn't set already */ if ( ! _States_Is_transient( original_state ) ) { 10be2c: 83 e7 04 and $0x4,%edi 10be2f: 75 26 jne 10be57 <_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 ); 10be31: c7 43 10 00 00 00 00 movl $0x0,0x10(%ebx) if ( prepend_it ) 10be38: 80 7d e7 00 cmpb $0x0,-0x19(%ebp) 10be3c: 74 0c je 10be4a <_Thread_Change_priority+0x86> */ RTEMS_INLINE_ROUTINE void _Scheduler_Enqueue_first( Thread_Control *the_thread ) { _Scheduler.Operations.enqueue_first( the_thread ); 10be3e: 83 ec 0c sub $0xc,%esp 10be41: 53 push %ebx 10be42: ff 15 78 11 12 00 call *0x121178 10be48: eb 0a jmp 10be54 <_Thread_Change_priority+0x90> */ RTEMS_INLINE_ROUTINE void _Scheduler_Enqueue( Thread_Control *the_thread ) { _Scheduler.Operations.enqueue( the_thread ); 10be4a: 83 ec 0c sub $0xc,%esp 10be4d: 53 push %ebx 10be4e: ff 15 74 11 12 00 call *0x121174 10be54: 83 c4 10 add $0x10,%esp _Scheduler_Enqueue_first( the_thread ); else _Scheduler_Enqueue( the_thread ); } _ISR_Flash( level ); 10be57: 56 push %esi 10be58: 9d popf 10be59: 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(); 10be5a: 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 ); 10be60: 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() && 10be65: 3b 05 6c 58 12 00 cmp 0x12586c,%eax 10be6b: 74 0d je 10be7a <_Thread_Change_priority+0xb6> 10be6d: 80 78 74 00 cmpb $0x0,0x74(%eax) 10be71: 74 07 je 10be7a <_Thread_Change_priority+0xb6> _Thread_Executing->is_preemptible ) _Thread_Dispatch_necessary = true; 10be73: c6 05 74 58 12 00 01 movb $0x1,0x125874 _ISR_Enable( level ); 10be7a: 56 push %esi 10be7b: 9d popf } 10be7c: 8d 65 f4 lea -0xc(%ebp),%esp 10be7f: 5b pop %ebx 10be80: 5e pop %esi 10be81: 5f pop %edi 10be82: c9 leave 10be83: c3 ret =============================================================================== 0010c028 <_Thread_Delay_ended>: void _Thread_Delay_ended( Objects_Id id, void *ignored __attribute__((unused)) ) { 10c028: 55 push %ebp 10c029: 89 e5 mov %esp,%ebp 10c02b: 83 ec 20 sub $0x20,%esp Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); 10c02e: 8d 45 f4 lea -0xc(%ebp),%eax 10c031: 50 push %eax 10c032: ff 75 08 pushl 0x8(%ebp) 10c035: e8 82 01 00 00 call 10c1bc <_Thread_Get> switch ( location ) { 10c03a: 83 c4 10 add $0x10,%esp 10c03d: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) 10c041: 75 1b jne 10c05e <_Thread_Delay_ended+0x36><== NEVER TAKEN #if defined(RTEMS_MULTIPROCESSING) case OBJECTS_REMOTE: /* impossible */ #endif break; case OBJECTS_LOCAL: _Thread_Clear_state( 10c043: 52 push %edx 10c044: 52 push %edx 10c045: 68 18 00 00 10 push $0x10000018 10c04a: 50 push %eax 10c04b: e8 34 fe ff ff call 10be84 <_Thread_Clear_state> 10c050: a1 40 53 12 00 mov 0x125340,%eax 10c055: 48 dec %eax 10c056: a3 40 53 12 00 mov %eax,0x125340 10c05b: 83 c4 10 add $0x10,%esp | STATES_INTERRUPTIBLE_BY_SIGNAL ); _Thread_Unnest_dispatch(); break; } } 10c05e: c9 leave 10c05f: c3 ret =============================================================================== 0010c060 <_Thread_Dispatch>: * dispatch thread * no dispatch thread */ void _Thread_Dispatch( void ) { 10c060: 55 push %ebp 10c061: 89 e5 mov %esp,%ebp 10c063: 57 push %edi 10c064: 56 push %esi 10c065: 53 push %ebx 10c066: 83 ec 1c sub $0x1c,%esp Thread_Control *executing; Thread_Control *heir; ISR_Level level; executing = _Thread_Executing; 10c069: 8b 1d 68 58 12 00 mov 0x125868,%ebx _ISR_Disable( level ); 10c06f: 9c pushf 10c070: fa cli 10c071: 58 pop %eax #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ { Timestamp_Control uptime, ran; _TOD_Get_uptime( &uptime ); _Timestamp_Subtract( 10c072: 8d 7d d8 lea -0x28(%ebp),%edi Thread_Control *heir; ISR_Level level; executing = _Thread_Executing; _ISR_Disable( level ); while ( _Thread_Dispatch_necessary == true ) { 10c075: e9 f9 00 00 00 jmp 10c173 <_Thread_Dispatch+0x113> heir = _Thread_Heir; 10c07a: 8b 35 6c 58 12 00 mov 0x12586c,%esi _Thread_Dispatch_disable_level = 1; 10c080: c7 05 40 53 12 00 01 movl $0x1,0x125340 10c087: 00 00 00 _Thread_Dispatch_necessary = false; 10c08a: c6 05 74 58 12 00 00 movb $0x0,0x125874 _Thread_Executing = heir; 10c091: 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 ) 10c097: 39 de cmp %ebx,%esi 10c099: 0f 84 e2 00 00 00 je 10c181 <_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 ) 10c09f: 83 7e 7c 01 cmpl $0x1,0x7c(%esi) 10c0a3: 75 09 jne 10c0ae <_Thread_Dispatch+0x4e> heir->cpu_time_budget = _Thread_Ticks_per_timeslice; 10c0a5: 8b 15 10 53 12 00 mov 0x125310,%edx 10c0ab: 89 56 78 mov %edx,0x78(%esi) _ISR_Enable( level ); 10c0ae: 50 push %eax 10c0af: 9d popf #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ { Timestamp_Control uptime, ran; _TOD_Get_uptime( &uptime ); 10c0b0: 83 ec 0c sub $0xc,%esp 10c0b3: 8d 45 e0 lea -0x20(%ebp),%eax 10c0b6: 50 push %eax 10c0b7: e8 5c 34 00 00 call 10f518 <_TOD_Get_uptime> _Timestamp_Subtract( 10c0bc: 83 c4 0c add $0xc,%esp 10c0bf: 57 push %edi 10c0c0: 8d 45 e0 lea -0x20(%ebp),%eax 10c0c3: 50 push %eax 10c0c4: 68 f0 53 12 00 push $0x1253f0 10c0c9: e8 72 0a 00 00 call 10cb40 <_Timespec_Subtract> &_Thread_Time_of_last_context_switch, &uptime, &ran ); _Timestamp_Add_to( &executing->cpu_time_used, &ran ); 10c0ce: 58 pop %eax 10c0cf: 5a pop %edx 10c0d0: 57 push %edi 10c0d1: 8d 83 84 00 00 00 lea 0x84(%ebx),%eax 10c0d7: 50 push %eax 10c0d8: e8 33 0a 00 00 call 10cb10 <_Timespec_Add_to> _Thread_Time_of_last_context_switch = uptime; 10c0dd: 8b 45 e0 mov -0x20(%ebp),%eax 10c0e0: 8b 55 e4 mov -0x1c(%ebp),%edx 10c0e3: a3 f0 53 12 00 mov %eax,0x1253f0 10c0e8: 89 15 f4 53 12 00 mov %edx,0x1253f4 #endif /* * Switch libc's task specific data. */ if ( _Thread_libc_reent ) { 10c0ee: a1 c8 53 12 00 mov 0x1253c8,%eax 10c0f3: 83 c4 10 add $0x10,%esp 10c0f6: 85 c0 test %eax,%eax 10c0f8: 74 10 je 10c10a <_Thread_Dispatch+0xaa> <== NEVER TAKEN executing->libc_reent = *_Thread_libc_reent; 10c0fa: 8b 10 mov (%eax),%edx 10c0fc: 89 93 e4 00 00 00 mov %edx,0xe4(%ebx) *_Thread_libc_reent = heir->libc_reent; 10c102: 8b 96 e4 00 00 00 mov 0xe4(%esi),%edx 10c108: 89 10 mov %edx,(%eax) } _User_extensions_Thread_switch( executing, heir ); 10c10a: 51 push %ecx 10c10b: 51 push %ecx 10c10c: 56 push %esi 10c10d: 53 push %ebx 10c10e: e8 65 0c 00 00 call 10cd78 <_User_extensions_Thread_switch> if ( executing->fp_context != NULL ) _Context_Save_fp( &executing->fp_context ); #endif #endif _Context_Switch( &executing->Registers, &heir->Registers ); 10c113: 58 pop %eax 10c114: 5a pop %edx 10c115: 81 c6 c8 00 00 00 add $0xc8,%esi 10c11b: 56 push %esi 10c11c: 8d 83 c8 00 00 00 lea 0xc8(%ebx),%eax 10c122: 50 push %eax 10c123: e8 28 0f 00 00 call 10d050 <_CPU_Context_switch> #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) #if ( CPU_USE_DEFERRED_FP_SWITCH == TRUE ) if ( (executing->fp_context != NULL) && 10c128: 83 c4 10 add $0x10,%esp 10c12b: 83 bb e0 00 00 00 00 cmpl $0x0,0xe0(%ebx) 10c132: 74 36 je 10c16a <_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 ); 10c134: a1 c4 53 12 00 mov 0x1253c4,%eax 10c139: 39 c3 cmp %eax,%ebx 10c13b: 74 2d je 10c16a <_Thread_Dispatch+0x10a> !_Thread_Is_allocated_fp( executing ) ) { if ( _Thread_Allocated_fp != NULL ) 10c13d: 85 c0 test %eax,%eax 10c13f: 74 11 je 10c152 <_Thread_Dispatch+0xf2> _Context_Save_fp( &_Thread_Allocated_fp->fp_context ); 10c141: 83 ec 0c sub $0xc,%esp 10c144: 05 e0 00 00 00 add $0xe0,%eax 10c149: 50 push %eax 10c14a: e8 35 0f 00 00 call 10d084 <_CPU_Context_save_fp> 10c14f: 83 c4 10 add $0x10,%esp _Context_Restore_fp( &executing->fp_context ); 10c152: 83 ec 0c sub $0xc,%esp 10c155: 8d 83 e0 00 00 00 lea 0xe0(%ebx),%eax 10c15b: 50 push %eax 10c15c: e8 2d 0f 00 00 call 10d08e <_CPU_Context_restore_fp> _Thread_Allocated_fp = executing; 10c161: 89 1d c4 53 12 00 mov %ebx,0x1253c4 10c167: 83 c4 10 add $0x10,%esp if ( executing->fp_context != NULL ) _Context_Restore_fp( &executing->fp_context ); #endif #endif executing = _Thread_Executing; 10c16a: 8b 1d 68 58 12 00 mov 0x125868,%ebx _ISR_Disable( level ); 10c170: 9c pushf 10c171: fa cli 10c172: 58 pop %eax Thread_Control *heir; ISR_Level level; executing = _Thread_Executing; _ISR_Disable( level ); while ( _Thread_Dispatch_necessary == true ) { 10c173: 8a 15 74 58 12 00 mov 0x125874,%dl 10c179: 84 d2 test %dl,%dl 10c17b: 0f 85 f9 fe ff ff jne 10c07a <_Thread_Dispatch+0x1a> _ISR_Disable( level ); } post_switch: _Thread_Dispatch_disable_level = 0; 10c181: c7 05 40 53 12 00 00 movl $0x0,0x125340 10c188: 00 00 00 _ISR_Enable( level ); 10c18b: 50 push %eax 10c18c: 9d popf _API_extensions_Run_postswitch(); 10c18d: e8 49 e7 ff ff call 10a8db <_API_extensions_Run_postswitch> } 10c192: 8d 65 f4 lea -0xc(%ebp),%esp 10c195: 5b pop %ebx 10c196: 5e pop %esi 10c197: 5f pop %edi 10c198: c9 leave 10c199: c3 ret =============================================================================== 00110f30 <_Thread_Handler>: * * Output parameters: NONE */ void _Thread_Handler( void ) { 110f30: 55 push %ebp 110f31: 89 e5 mov %esp,%ebp 110f33: 53 push %ebx 110f34: 83 ec 14 sub $0x14,%esp #if defined(EXECUTE_GLOBAL_CONSTRUCTORS) static char doneConstructors; char doneCons; #endif executing = _Thread_Executing; 110f37: 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; 110f3d: 8b 83 ac 00 00 00 mov 0xac(%ebx),%eax _ISR_Set_level(level); 110f43: 85 c0 test %eax,%eax 110f45: 74 03 je 110f4a <_Thread_Handler+0x1a> 110f47: fa cli 110f48: eb 01 jmp 110f4b <_Thread_Handler+0x1b> 110f4a: fb sti #if defined(EXECUTE_GLOBAL_CONSTRUCTORS) doneCons = doneConstructors; 110f4b: a0 00 50 12 00 mov 0x125000,%al 110f50: 88 45 f7 mov %al,-0x9(%ebp) doneConstructors = 1; 110f53: 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) && 110f5a: 83 bb e0 00 00 00 00 cmpl $0x0,0xe0(%ebx) 110f61: 74 24 je 110f87 <_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 ); 110f63: a1 c4 53 12 00 mov 0x1253c4,%eax 110f68: 39 c3 cmp %eax,%ebx 110f6a: 74 1b je 110f87 <_Thread_Handler+0x57> !_Thread_Is_allocated_fp( executing ) ) { if ( _Thread_Allocated_fp != NULL ) 110f6c: 85 c0 test %eax,%eax 110f6e: 74 11 je 110f81 <_Thread_Handler+0x51> _Context_Save_fp( &_Thread_Allocated_fp->fp_context ); 110f70: 83 ec 0c sub $0xc,%esp 110f73: 05 e0 00 00 00 add $0xe0,%eax 110f78: 50 push %eax 110f79: e8 06 c1 ff ff call 10d084 <_CPU_Context_save_fp> 110f7e: 83 c4 10 add $0x10,%esp _Thread_Allocated_fp = executing; 110f81: 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 ); 110f87: 83 ec 0c sub $0xc,%esp 110f8a: 53 push %ebx 110f8b: e8 98 bc ff ff call 10cc28 <_User_extensions_Thread_begin> /* * At this point, the dispatch disable level BETTER be 1. */ _Thread_Enable_dispatch(); 110f90: e8 05 b2 ff ff call 10c19a <_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) */ { 110f95: 83 c4 10 add $0x10,%esp 110f98: 80 7d f7 00 cmpb $0x0,-0x9(%ebp) 110f9c: 75 05 jne 110fa3 <_Thread_Handler+0x73> INIT_NAME (); 110f9e: e8 2d c7 00 00 call 11d6d0 <__start_set_sysctl_set> } #endif if ( executing->Start.prototype == THREAD_START_NUMERIC ) { 110fa3: 8b 83 94 00 00 00 mov 0x94(%ebx),%eax 110fa9: 85 c0 test %eax,%eax 110fab: 75 0b jne 110fb8 <_Thread_Handler+0x88> executing->Wait.return_argument = (*(Thread_Entry_numeric) executing->Start.entry_point)( 110fad: 83 ec 0c sub $0xc,%esp 110fb0: ff b3 9c 00 00 00 pushl 0x9c(%ebx) 110fb6: eb 0c jmp 110fc4 <_Thread_Handler+0x94> executing->Start.numeric_argument ); } #if defined(RTEMS_POSIX_API) else if ( executing->Start.prototype == THREAD_START_POINTER ) { 110fb8: 48 dec %eax 110fb9: 75 15 jne 110fd0 <_Thread_Handler+0xa0> <== NEVER TAKEN executing->Wait.return_argument = (*(Thread_Entry_pointer) executing->Start.entry_point)( 110fbb: 83 ec 0c sub $0xc,%esp 110fbe: ff b3 98 00 00 00 pushl 0x98(%ebx) 110fc4: 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 = 110fca: 89 43 28 mov %eax,0x28(%ebx) 110fcd: 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 ); 110fd0: 83 ec 0c sub $0xc,%esp 110fd3: 53 push %ebx 110fd4: e8 80 bc ff ff call 10cc59 <_User_extensions_Thread_exitted> _Internal_error_Occurred( 110fd9: 83 c4 0c add $0xc,%esp 110fdc: 6a 05 push $0x5 110fde: 6a 01 push $0x1 110fe0: 6a 00 push $0x0 110fe2: e8 51 a2 ff ff call 10b238 <_Internal_error_Occurred> =============================================================================== 0010c22c <_Thread_Initialize>: Thread_CPU_budget_algorithms budget_algorithm, Thread_CPU_budget_algorithm_callout budget_callout, uint32_t isr_level, Objects_Name name ) { 10c22c: 55 push %ebp 10c22d: 89 e5 mov %esp,%ebp 10c22f: 57 push %edi 10c230: 56 push %esi 10c231: 53 push %ebx 10c232: 83 ec 1c sub $0x1c,%esp 10c235: 8b 5d 0c mov 0xc(%ebp),%ebx 10c238: 8b 4d 10 mov 0x10(%ebp),%ecx 10c23b: 8b 75 14 mov 0x14(%ebp),%esi 10c23e: 8a 55 18 mov 0x18(%ebp),%dl 10c241: 8a 45 20 mov 0x20(%ebp),%al 10c244: 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; 10c247: c7 83 e8 00 00 00 00 movl $0x0,0xe8(%ebx) 10c24e: 00 00 00 10c251: c7 83 ec 00 00 00 00 movl $0x0,0xec(%ebx) 10c258: 00 00 00 extensions_area = NULL; the_thread->libc_reent = NULL; 10c25b: c7 83 e4 00 00 00 00 movl $0x0,0xe4(%ebx) 10c262: 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 ) { 10c265: 85 c9 test %ecx,%ecx 10c267: 75 31 jne 10c29a <_Thread_Initialize+0x6e> actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size ); 10c269: 57 push %edi 10c26a: 57 push %edi 10c26b: 56 push %esi 10c26c: 53 push %ebx 10c26d: 88 55 e0 mov %dl,-0x20(%ebp) 10c270: e8 fb 06 00 00 call 10c970 <_Thread_Stack_Allocate> if ( !actual_stack_size || actual_stack_size < stack_size ) 10c275: 83 c4 10 add $0x10,%esp 10c278: 39 f0 cmp %esi,%eax 10c27a: 8a 55 e0 mov -0x20(%ebp),%dl 10c27d: 0f 82 bf 01 00 00 jb 10c442 <_Thread_Initialize+0x216> 10c283: 85 c0 test %eax,%eax 10c285: 0f 84 b7 01 00 00 je 10c442 <_Thread_Initialize+0x216><== NEVER TAKEN return false; /* stack allocation failed */ stack = the_thread->Start.stack; 10c28b: 8b 8b c4 00 00 00 mov 0xc4(%ebx),%ecx the_thread->Start.core_allocated_stack = true; 10c291: c6 83 b4 00 00 00 01 movb $0x1,0xb4(%ebx) 10c298: eb 09 jmp 10c2a3 <_Thread_Initialize+0x77> } else { stack = stack_area; actual_stack_size = stack_size; the_thread->Start.core_allocated_stack = false; 10c29a: c6 83 b4 00 00 00 00 movb $0x0,0xb4(%ebx) 10c2a1: 89 f0 mov %esi,%eax Stack_Control *the_stack, void *starting_address, size_t size ) { the_stack->area = starting_address; 10c2a3: 89 8b bc 00 00 00 mov %ecx,0xbc(%ebx) the_stack->size = size; 10c2a9: 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; 10c2af: 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 ) { 10c2b1: 84 d2 test %dl,%dl 10c2b3: 74 17 je 10c2cc <_Thread_Initialize+0xa0> fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE ); 10c2b5: 83 ec 0c sub $0xc,%esp 10c2b8: 6a 6c push $0x6c 10c2ba: e8 27 0d 00 00 call 10cfe6 <_Workspace_Allocate> 10c2bf: 89 c7 mov %eax,%edi if ( !fp_area ) 10c2c1: 83 c4 10 add $0x10,%esp 10c2c4: 85 c0 test %eax,%eax 10c2c6: 0f 84 23 01 00 00 je 10c3ef <_Thread_Initialize+0x1c3> goto failed; fp_area = _Context_Fp_start( fp_area, 0 ); } the_thread->fp_context = fp_area; 10c2cc: 89 bb e0 00 00 00 mov %edi,0xe0(%ebx) the_thread->Start.fp_context = fp_area; 10c2d2: 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; 10c2d8: c7 43 50 00 00 00 00 movl $0x0,0x50(%ebx) the_watchdog->routine = routine; 10c2df: c7 43 64 00 00 00 00 movl $0x0,0x64(%ebx) the_watchdog->id = id; 10c2e6: c7 43 68 00 00 00 00 movl $0x0,0x68(%ebx) the_watchdog->user_data = user_data; 10c2ed: c7 43 6c 00 00 00 00 movl $0x0,0x6c(%ebx) #endif /* * Allocate the extensions area for this thread */ if ( _Thread_Maximum_extensions ) { 10c2f4: 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; 10c2f9: 31 f6 xor %esi,%esi #endif /* * Allocate the extensions area for this thread */ if ( _Thread_Maximum_extensions ) { 10c2fb: 85 c0 test %eax,%eax 10c2fd: 74 1d je 10c31c <_Thread_Initialize+0xf0> extensions_area = _Workspace_Allocate( 10c2ff: 83 ec 0c sub $0xc,%esp 10c302: 8d 04 85 04 00 00 00 lea 0x4(,%eax,4),%eax 10c309: 50 push %eax 10c30a: e8 d7 0c 00 00 call 10cfe6 <_Workspace_Allocate> 10c30f: 89 c6 mov %eax,%esi (_Thread_Maximum_extensions + 1) * sizeof( void * ) ); if ( !extensions_area ) 10c311: 83 c4 10 add $0x10,%esp 10c314: 85 c0 test %eax,%eax 10c316: 0f 84 d5 00 00 00 je 10c3f1 <_Thread_Initialize+0x1c5> goto failed; } the_thread->extensions = (void **) extensions_area; 10c31c: 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 ) { 10c322: 85 f6 test %esi,%esi 10c324: 74 16 je 10c33c <_Thread_Initialize+0x110> for ( i = 0; i <= _Thread_Maximum_extensions ; i++ ) 10c326: 8b 15 d4 53 12 00 mov 0x1253d4,%edx 10c32c: 31 c0 xor %eax,%eax 10c32e: eb 08 jmp 10c338 <_Thread_Initialize+0x10c> the_thread->extensions[i] = NULL; 10c330: 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++ ) 10c337: 40 inc %eax 10c338: 39 d0 cmp %edx,%eax 10c33a: 76 f4 jbe 10c330 <_Thread_Initialize+0x104> /* * General initialization */ the_thread->Start.is_preemptible = is_preemptible; 10c33c: 8a 45 e7 mov -0x19(%ebp),%al 10c33f: 88 83 a0 00 00 00 mov %al,0xa0(%ebx) the_thread->Start.budget_algorithm = budget_algorithm; 10c345: 8b 45 24 mov 0x24(%ebp),%eax 10c348: 89 83 a4 00 00 00 mov %eax,0xa4(%ebx) the_thread->Start.budget_callout = budget_callout; 10c34e: 8b 45 28 mov 0x28(%ebp),%eax 10c351: 89 83 a8 00 00 00 mov %eax,0xa8(%ebx) switch ( budget_algorithm ) { 10c357: 83 7d 24 02 cmpl $0x2,0x24(%ebp) 10c35b: 75 08 jne 10c365 <_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; 10c35d: a1 10 53 12 00 mov 0x125310,%eax 10c362: 89 43 78 mov %eax,0x78(%ebx) case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT: break; #endif } the_thread->Start.isr_level = isr_level; 10c365: 8b 45 2c mov 0x2c(%ebp),%eax 10c368: 89 83 ac 00 00 00 mov %eax,0xac(%ebx) the_thread->current_state = STATES_DORMANT; 10c36e: c7 43 10 01 00 00 00 movl $0x1,0x10(%ebx) the_thread->Wait.queue = NULL; 10c375: c7 43 44 00 00 00 00 movl $0x0,0x44(%ebx) the_thread->resource_count = 0; 10c37c: c7 43 1c 00 00 00 00 movl $0x0,0x1c(%ebx) the_thread->real_priority = priority; 10c383: 8b 45 1c mov 0x1c(%ebp),%eax 10c386: 89 43 18 mov %eax,0x18(%ebx) the_thread->Start.initial_priority = priority; 10c389: 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 ); 10c38f: 83 ec 0c sub $0xc,%esp 10c392: 53 push %ebx 10c393: ff 15 68 11 12 00 call *0x121168 10c399: 89 c2 mov %eax,%edx sched =_Scheduler_Allocate( the_thread ); if ( !sched ) 10c39b: 83 c4 10 add $0x10,%esp 10c39e: 85 c0 test %eax,%eax 10c3a0: 74 51 je 10c3f3 <_Thread_Initialize+0x1c7> goto failed; _Thread_Set_priority( the_thread, priority ); 10c3a2: 51 push %ecx 10c3a3: 51 push %ecx 10c3a4: ff 75 1c pushl 0x1c(%ebp) 10c3a7: 53 push %ebx 10c3a8: 89 45 e0 mov %eax,-0x20(%ebp) 10c3ab: e8 40 05 00 00 call 10c8f0 <_Thread_Set_priority> /* * Initialize the CPU usage statistics */ #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ _Timestamp_Set_to_zero( &the_thread->cpu_time_used ); 10c3b0: c7 83 84 00 00 00 00 movl $0x0,0x84(%ebx) 10c3b7: 00 00 00 10c3ba: c7 83 88 00 00 00 00 movl $0x0,0x88(%ebx) 10c3c1: 00 00 00 _Workspace_Free( sched ); _Thread_Stack_Free( the_thread ); return false; } 10c3c4: 8b 45 08 mov 0x8(%ebp),%eax 10c3c7: 8b 40 1c mov 0x1c(%eax),%eax Objects_Information *information, Objects_Control *the_object, Objects_Name name ) { _Objects_Set_local_object( 10c3ca: 0f b7 4b 08 movzwl 0x8(%ebx),%ecx #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 10c3ce: 89 1c 88 mov %ebx,(%eax,%ecx,4) information, _Objects_Get_index( the_object->id ), the_object ); the_object->name = name; 10c3d1: 8b 45 30 mov 0x30(%ebp),%eax 10c3d4: 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 ); 10c3d7: 89 1c 24 mov %ebx,(%esp) 10c3da: e8 e9 08 00 00 call 10ccc8 <_User_extensions_Thread_create> 10c3df: 88 c1 mov %al,%cl if ( extension_status ) 10c3e1: 83 c4 10 add $0x10,%esp return true; 10c3e4: 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 ) 10c3e6: 84 c9 test %cl,%cl 10c3e8: 8b 55 e0 mov -0x20(%ebp),%edx 10c3eb: 74 06 je 10c3f3 <_Thread_Initialize+0x1c7> 10c3ed: eb 55 jmp 10c444 <_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; 10c3ef: 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; 10c3f1: 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 ); 10c3f3: 83 ec 0c sub $0xc,%esp 10c3f6: ff b3 e4 00 00 00 pushl 0xe4(%ebx) 10c3fc: 89 55 e0 mov %edx,-0x20(%ebp) 10c3ff: e8 fb 0b 00 00 call 10cfff <_Workspace_Free> for ( i=0 ; i <= THREAD_API_LAST ; i++ ) _Workspace_Free( the_thread->API_Extensions[i] ); 10c404: 5a pop %edx 10c405: ff b3 e8 00 00 00 pushl 0xe8(%ebx) 10c40b: e8 ef 0b 00 00 call 10cfff <_Workspace_Free> 10c410: 58 pop %eax 10c411: ff b3 ec 00 00 00 pushl 0xec(%ebx) 10c417: e8 e3 0b 00 00 call 10cfff <_Workspace_Free> _Workspace_Free( extensions_area ); 10c41c: 89 34 24 mov %esi,(%esp) 10c41f: e8 db 0b 00 00 call 10cfff <_Workspace_Free> #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) _Workspace_Free( fp_area ); 10c424: 89 3c 24 mov %edi,(%esp) 10c427: e8 d3 0b 00 00 call 10cfff <_Workspace_Free> #endif _Workspace_Free( sched ); 10c42c: 8b 55 e0 mov -0x20(%ebp),%edx 10c42f: 89 14 24 mov %edx,(%esp) 10c432: e8 c8 0b 00 00 call 10cfff <_Workspace_Free> _Thread_Stack_Free( the_thread ); 10c437: 89 1c 24 mov %ebx,(%esp) 10c43a: e8 81 05 00 00 call 10c9c0 <_Thread_Stack_Free> return false; 10c43f: 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 */ 10c442: 31 c0 xor %eax,%eax _Workspace_Free( sched ); _Thread_Stack_Free( the_thread ); return false; } 10c444: 8d 65 f4 lea -0xc(%ebp),%esp 10c447: 5b pop %ebx 10c448: 5e pop %esi 10c449: 5f pop %edi 10c44a: c9 leave 10c44b: c3 ret =============================================================================== 0010f678 <_Thread_Resume>: */ void _Thread_Resume( Thread_Control *the_thread, bool force ) { 10f678: 55 push %ebp 10f679: 89 e5 mov %esp,%ebp 10f67b: 53 push %ebx 10f67c: 83 ec 04 sub $0x4,%esp 10f67f: 8b 45 08 mov 0x8(%ebp),%eax ISR_Level level; States_Control current_state; _ISR_Disable( level ); 10f682: 9c pushf 10f683: fa cli 10f684: 5b pop %ebx current_state = the_thread->current_state; 10f685: 8b 50 10 mov 0x10(%eax),%edx if ( current_state & STATES_SUSPENDED ) { 10f688: f6 c2 02 test $0x2,%dl 10f68b: 74 17 je 10f6a4 <_Thread_Resume+0x2c> <== NEVER TAKEN 10f68d: 83 e2 fd and $0xfffffffd,%edx current_state = the_thread->current_state = _States_Clear(STATES_SUSPENDED, current_state); 10f690: 89 50 10 mov %edx,0x10(%eax) if ( _States_Is_ready( current_state ) ) { 10f693: 85 d2 test %edx,%edx 10f695: 75 0d jne 10f6a4 <_Thread_Resume+0x2c> */ RTEMS_INLINE_ROUTINE void _Scheduler_Unblock( Thread_Control *the_thread ) { _Scheduler.Operations.unblock( the_thread ); 10f697: 83 ec 0c sub $0xc,%esp 10f69a: 50 push %eax 10f69b: ff 15 64 41 12 00 call *0x124164 10f6a1: 83 c4 10 add $0x10,%esp _Scheduler_Unblock( the_thread ); } } _ISR_Enable( level ); 10f6a4: 53 push %ebx 10f6a5: 9d popf } 10f6a6: 8b 5d fc mov -0x4(%ebp),%ebx 10f6a9: c9 leave 10f6aa: c3 ret =============================================================================== 0010caa8 <_Thread_Tickle_timeslice>: * * Output parameters: NONE */ void _Thread_Tickle_timeslice( void ) { 10caa8: 55 push %ebp 10caa9: 89 e5 mov %esp,%ebp 10caab: 53 push %ebx 10caac: 83 ec 04 sub $0x4,%esp Thread_Control *executing; executing = _Thread_Executing; 10caaf: 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 ) 10cab5: 80 7b 74 00 cmpb $0x0,0x74(%ebx) 10cab9: 74 4d je 10cb08 <_Thread_Tickle_timeslice+0x60> return; if ( !_States_Is_ready( executing->current_state ) ) 10cabb: 83 7b 10 00 cmpl $0x0,0x10(%ebx) 10cabf: 75 47 jne 10cb08 <_Thread_Tickle_timeslice+0x60> /* * The cpu budget algorithm determines what happens next. */ switch ( executing->budget_algorithm ) { 10cac1: 8b 43 7c mov 0x7c(%ebx),%eax 10cac4: 83 f8 01 cmp $0x1,%eax 10cac7: 72 3f jb 10cb08 <_Thread_Tickle_timeslice+0x60> 10cac9: 83 f8 02 cmp $0x2,%eax 10cacc: 76 07 jbe 10cad5 <_Thread_Tickle_timeslice+0x2d> 10cace: 83 f8 03 cmp $0x3,%eax 10cad1: 75 35 jne 10cb08 <_Thread_Tickle_timeslice+0x60><== NEVER TAKEN 10cad3: eb 1b jmp 10caf0 <_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 ) { 10cad5: 8b 43 78 mov 0x78(%ebx),%eax 10cad8: 48 dec %eax 10cad9: 89 43 78 mov %eax,0x78(%ebx) 10cadc: 85 c0 test %eax,%eax 10cade: 7f 28 jg 10cb08 <_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(); 10cae0: 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; 10cae6: a1 10 53 12 00 mov 0x125310,%eax 10caeb: 89 43 78 mov %eax,0x78(%ebx) 10caee: eb 18 jmp 10cb08 <_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 ) 10caf0: 8b 43 78 mov 0x78(%ebx),%eax 10caf3: 48 dec %eax 10caf4: 89 43 78 mov %eax,0x78(%ebx) 10caf7: 85 c0 test %eax,%eax 10caf9: 75 0d jne 10cb08 <_Thread_Tickle_timeslice+0x60> (*executing->budget_callout)( executing ); 10cafb: 83 ec 0c sub $0xc,%esp 10cafe: 53 push %ebx 10caff: ff 93 80 00 00 00 call *0x80(%ebx) 10cb05: 83 c4 10 add $0x10,%esp break; #endif } } 10cb08: 8b 5d fc mov -0x4(%ebp),%ebx 10cb0b: c9 leave 10cb0c: c3 ret =============================================================================== 0010fa60 <_Thread_queue_Process_timeout>: #include void _Thread_queue_Process_timeout( Thread_Control *the_thread ) { 10fa60: 55 push %ebp 10fa61: 89 e5 mov %esp,%ebp 10fa63: 83 ec 08 sub $0x8,%esp 10fa66: 8b 55 08 mov 0x8(%ebp),%edx Thread_queue_Control *the_thread_queue = the_thread->Wait.queue; 10fa69: 8b 42 44 mov 0x44(%edx),%eax * 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. */ if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SYNCHRONIZED && 10fa6c: 8b 48 30 mov 0x30(%eax),%ecx 10fa6f: 85 c9 test %ecx,%ecx 10fa71: 74 1c je 10fa8f <_Thread_queue_Process_timeout+0x2f> 10fa73: 3b 15 68 58 12 00 cmp 0x125868,%edx 10fa79: 75 14 jne 10fa8f <_Thread_queue_Process_timeout+0x2f> _Thread_Is_executing( the_thread ) ) { if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SATISFIED ) { 10fa7b: 83 f9 03 cmp $0x3,%ecx 10fa7e: 74 21 je 10faa1 <_Thread_queue_Process_timeout+0x41><== NEVER TAKEN the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status; 10fa80: 8b 48 3c mov 0x3c(%eax),%ecx 10fa83: 89 4a 34 mov %ecx,0x34(%edx) the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT; 10fa86: c7 40 30 02 00 00 00 movl $0x2,0x30(%eax) 10fa8d: eb 12 jmp 10faa1 <_Thread_queue_Process_timeout+0x41> } } else { the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status; 10fa8f: 8b 48 3c mov 0x3c(%eax),%ecx 10fa92: 89 4a 34 mov %ecx,0x34(%edx) _Thread_queue_Extract( the_thread->Wait.queue, the_thread ); 10fa95: 51 push %ecx 10fa96: 51 push %ecx 10fa97: 52 push %edx 10fa98: 50 push %eax 10fa99: e8 da fe ff ff call 10f978 <_Thread_queue_Extract> 10fa9e: 83 c4 10 add $0x10,%esp } } 10faa1: c9 leave 10faa2: c3 ret =============================================================================== 0010c868 <_Thread_queue_Requeue>: void _Thread_queue_Requeue( Thread_queue_Control *the_thread_queue, Thread_Control *the_thread ) { 10c868: 55 push %ebp 10c869: 89 e5 mov %esp,%ebp 10c86b: 57 push %edi 10c86c: 56 push %esi 10c86d: 53 push %ebx 10c86e: 83 ec 1c sub $0x1c,%esp 10c871: 8b 75 08 mov 0x8(%ebp),%esi 10c874: 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 ) 10c877: 85 f6 test %esi,%esi 10c879: 74 36 je 10c8b1 <_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 ) { 10c87b: 83 7e 34 01 cmpl $0x1,0x34(%esi) 10c87f: 75 30 jne 10c8b1 <_Thread_queue_Requeue+0x49><== NEVER TAKEN Thread_queue_Control *tq = the_thread_queue; ISR_Level level; ISR_Level level_ignored; _ISR_Disable( level ); 10c881: 9c pushf 10c882: fa cli 10c883: 5b pop %ebx if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) { 10c884: f7 47 10 e0 be 03 00 testl $0x3bee0,0x10(%edi) 10c88b: 74 22 je 10c8af <_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; 10c88d: 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 ); 10c894: 50 push %eax 10c895: 6a 01 push $0x1 10c897: 57 push %edi 10c898: 56 push %esi 10c899: e8 0a 31 00 00 call 10f9a8 <_Thread_queue_Extract_priority_helper> (void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored ); 10c89e: 83 c4 0c add $0xc,%esp 10c8a1: 8d 45 e4 lea -0x1c(%ebp),%eax 10c8a4: 50 push %eax 10c8a5: 57 push %edi 10c8a6: 56 push %esi 10c8a7: e8 c0 fd ff ff call 10c66c <_Thread_queue_Enqueue_priority> 10c8ac: 83 c4 10 add $0x10,%esp } _ISR_Enable( level ); 10c8af: 53 push %ebx 10c8b0: 9d popf } } 10c8b1: 8d 65 f4 lea -0xc(%ebp),%esp 10c8b4: 5b pop %ebx 10c8b5: 5e pop %esi 10c8b6: 5f pop %edi 10c8b7: c9 leave 10c8b8: c3 ret =============================================================================== 0010c8bc <_Thread_queue_Timeout>: void _Thread_queue_Timeout( Objects_Id id, void *ignored __attribute__((unused)) ) { 10c8bc: 55 push %ebp 10c8bd: 89 e5 mov %esp,%ebp 10c8bf: 83 ec 20 sub $0x20,%esp Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); 10c8c2: 8d 45 f4 lea -0xc(%ebp),%eax 10c8c5: 50 push %eax 10c8c6: ff 75 08 pushl 0x8(%ebp) 10c8c9: e8 ee f8 ff ff call 10c1bc <_Thread_Get> switch ( location ) { 10c8ce: 83 c4 10 add $0x10,%esp 10c8d1: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) 10c8d5: 75 17 jne 10c8ee <_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 ); 10c8d7: 83 ec 0c sub $0xc,%esp 10c8da: 50 push %eax 10c8db: e8 80 31 00 00 call 10fa60 <_Thread_queue_Process_timeout> */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; 10c8e0: a1 40 53 12 00 mov 0x125340,%eax 10c8e5: 48 dec %eax 10c8e6: a3 40 53 12 00 mov %eax,0x125340 10c8eb: 83 c4 10 add $0x10,%esp _Thread_Unnest_dispatch(); break; } } 10c8ee: c9 leave 10c8ef: c3 ret =============================================================================== 00116970 <_Timer_server_Body>: * @a arg points to the corresponding timer server control block. */ static rtems_task _Timer_server_Body( rtems_task_argument arg ) { 116970: 55 push %ebp 116971: 89 e5 mov %esp,%ebp 116973: 57 push %edi 116974: 56 push %esi 116975: 53 push %ebx 116976: 83 ec 4c sub $0x4c,%esp 116979: 8b 5d 08 mov 0x8(%ebp),%ebx ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; 11697c: 8d 55 dc lea -0x24(%ebp),%edx 11697f: 8d 45 e0 lea -0x20(%ebp),%eax 116982: 89 45 dc mov %eax,-0x24(%ebp) head->previous = NULL; 116985: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp) tail->previous = head; 11698c: 89 55 e4 mov %edx,-0x1c(%ebp) ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; 11698f: 8d 7d d0 lea -0x30(%ebp),%edi 116992: 8d 4d d4 lea -0x2c(%ebp),%ecx 116995: 89 4d d0 mov %ecx,-0x30(%ebp) head->previous = NULL; 116998: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp) tail->previous = head; 11699f: 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 ); 1169a2: 8d 53 30 lea 0x30(%ebx),%edx 1169a5: 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 ); 1169a8: 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; 1169ab: 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; 1169ae: 8d 4d dc lea -0x24(%ebp),%ecx 1169b1: 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; 1169b4: a1 28 f0 13 00 mov 0x13f028,%eax /* * We assume adequate unsigned arithmetic here. */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; 1169b9: 8b 53 3c mov 0x3c(%ebx),%edx watchdogs->last_snapshot = snapshot; 1169bc: 89 43 3c mov %eax,0x3c(%ebx) _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 1169bf: 51 push %ecx 1169c0: 57 push %edi Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot; /* * We assume adequate unsigned arithmetic here. */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; 1169c1: 29 d0 sub %edx,%eax watchdogs->last_snapshot = snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 1169c3: 50 push %eax 1169c4: ff 75 c0 pushl -0x40(%ebp) 1169c7: e8 b8 39 00 00 call 11a384 <_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(); 1169cc: a1 a0 ef 13 00 mov 0x13efa0,%eax 1169d1: 89 45 c4 mov %eax,-0x3c(%ebp) Watchdog_Interval last_snapshot = watchdogs->last_snapshot; 1169d4: 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 ) { 1169d7: 83 c4 10 add $0x10,%esp 1169da: 39 45 c4 cmp %eax,-0x3c(%ebp) 1169dd: 76 10 jbe 1169ef <_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 ); 1169df: 52 push %edx 1169e0: 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; 1169e1: 8b 55 c4 mov -0x3c(%ebp),%edx 1169e4: 29 c2 sub %eax,%edx _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 1169e6: 52 push %edx 1169e7: 56 push %esi 1169e8: e8 97 39 00 00 call 11a384 <_Watchdog_Adjust_to_chain> 1169ed: eb 0f jmp 1169fe <_Timer_server_Body+0x8e> } else if ( snapshot < last_snapshot ) { 1169ef: 73 10 jae 116a01 <_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 ); 1169f1: 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; 1169f2: 2b 45 c4 sub -0x3c(%ebp),%eax _Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta ); 1169f5: 50 push %eax 1169f6: 6a 01 push $0x1 1169f8: 56 push %esi 1169f9: e8 1a 39 00 00 call 11a318 <_Watchdog_Adjust> 1169fe: 83 c4 10 add $0x10,%esp } watchdogs->last_snapshot = snapshot; 116a01: 8b 4d c4 mov -0x3c(%ebp),%ecx 116a04: 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 ); 116a07: 8b 43 78 mov 0x78(%ebx),%eax 116a0a: 83 ec 0c sub $0xc,%esp 116a0d: 50 push %eax 116a0e: e8 fd 08 00 00 call 117310 <_Chain_Get> if ( timer == NULL ) { 116a13: 83 c4 10 add $0x10,%esp 116a16: 85 c0 test %eax,%eax 116a18: 74 29 je 116a43 <_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 ) { 116a1a: 8b 50 38 mov 0x38(%eax),%edx <== NOT EXECUTED 116a1d: 83 fa 01 cmp $0x1,%edx <== NOT EXECUTED 116a20: 75 0b jne 116a2d <_Timer_server_Body+0xbd><== NOT EXECUTED _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); 116a22: 52 push %edx <== NOT EXECUTED 116a23: 52 push %edx <== NOT EXECUTED 116a24: 83 c0 10 add $0x10,%eax <== NOT EXECUTED 116a27: 50 push %eax <== NOT EXECUTED 116a28: ff 75 c0 pushl -0x40(%ebp) <== NOT EXECUTED 116a2b: eb 0c jmp 116a39 <_Timer_server_Body+0xc9><== NOT EXECUTED } else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) { 116a2d: 83 fa 03 cmp $0x3,%edx <== NOT EXECUTED 116a30: 75 d5 jne 116a07 <_Timer_server_Body+0x97><== NOT EXECUTED _Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker ); 116a32: 51 push %ecx <== NOT EXECUTED 116a33: 51 push %ecx <== NOT EXECUTED 116a34: 83 c0 10 add $0x10,%eax <== NOT EXECUTED 116a37: 50 push %eax <== NOT EXECUTED 116a38: 56 push %esi <== NOT EXECUTED 116a39: e8 ce 39 00 00 call 11a40c <_Watchdog_Insert> <== NOT EXECUTED 116a3e: 83 c4 10 add $0x10,%esp <== NOT EXECUTED 116a41: eb c4 jmp 116a07 <_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 ); 116a43: 9c pushf 116a44: fa cli 116a45: 5a pop %edx tmp = ts->insert_chain; 116a46: 8b 43 78 mov 0x78(%ebx),%eax if ( _Chain_Is_empty( insert_chain ) ) { 116a49: b0 01 mov $0x1,%al 116a4b: 8b 4d b4 mov -0x4c(%ebp),%ecx 116a4e: 39 4d dc cmp %ecx,-0x24(%ebp) 116a51: 75 09 jne 116a5c <_Timer_server_Body+0xec><== NEVER TAKEN ts->insert_chain = NULL; 116a53: c7 43 78 00 00 00 00 movl $0x0,0x78(%ebx) do_loop = false; 116a5a: 31 c0 xor %eax,%eax } _ISR_Enable( level ); 116a5c: 52 push %edx 116a5d: 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 ) { 116a5e: 84 c0 test %al,%al 116a60: 0f 85 4e ff ff ff jne 1169b4 <_Timer_server_Body+0x44><== NEVER TAKEN 116a66: 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 ) ) { 116a69: 39 45 d0 cmp %eax,-0x30(%ebp) 116a6c: 74 3a je 116aa8 <_Timer_server_Body+0x138> 116a6e: 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 ); 116a71: 9c pushf 116a72: fa cli 116a73: 59 pop %ecx initialized = false; } #endif return status; } 116a74: 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)) 116a77: 3b 45 b0 cmp -0x50(%ebp),%eax 116a7a: 74 25 je 116aa1 <_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; 116a7c: 8b 10 mov (%eax),%edx head->next = new_first; 116a7e: 89 55 d0 mov %edx,-0x30(%ebp) new_first->previous = head; 116a81: 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 ) { 116a84: 85 c0 test %eax,%eax 116a86: 74 19 je 116aa1 <_Timer_server_Body+0x131><== NEVER TAKEN watchdog->state = WATCHDOG_INACTIVE; 116a88: c7 40 08 00 00 00 00 movl $0x0,0x8(%eax) _ISR_Enable( level ); 116a8f: 51 push %ecx 116a90: 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 ); 116a91: 52 push %edx 116a92: 52 push %edx 116a93: ff 70 24 pushl 0x24(%eax) 116a96: ff 70 20 pushl 0x20(%eax) 116a99: ff 50 1c call *0x1c(%eax) } 116a9c: 83 c4 10 add $0x10,%esp 116a9f: eb d0 jmp 116a71 <_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 ); 116aa1: 51 push %ecx 116aa2: 9d popf 116aa3: e9 06 ff ff ff jmp 1169ae <_Timer_server_Body+0x3e> * the active flag of the timer server is true. */ (*watchdog->routine)( watchdog->id, watchdog->user_data ); } } else { ts->active = false; 116aa8: c6 43 7c 00 movb $0x0,0x7c(%ebx) /* * Block until there is something to do. */ _Thread_Disable_dispatch(); 116aac: e8 23 fe ff ff call 1168d4 <_Thread_Disable_dispatch> _Thread_Set_state( ts->thread, STATES_DELAYING ); 116ab1: 51 push %ecx 116ab2: 51 push %ecx 116ab3: 6a 08 push $0x8 116ab5: ff 33 pushl (%ebx) 116ab7: e8 fc 32 00 00 call 119db8 <_Thread_Set_state> _Timer_server_Reset_interval_system_watchdog( ts ); 116abc: 89 d8 mov %ebx,%eax 116abe: e8 21 fe ff ff call 1168e4 <_Timer_server_Reset_interval_system_watchdog> _Timer_server_Reset_tod_system_watchdog( ts ); 116ac3: 89 d8 mov %ebx,%eax 116ac5: e8 60 fe ff ff call 11692a <_Timer_server_Reset_tod_system_watchdog> _Thread_Enable_dispatch(); 116aca: e8 c3 2a 00 00 call 119592 <_Thread_Enable_dispatch> ts->active = true; 116acf: 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 ); 116ad3: 8d 43 08 lea 0x8(%ebx),%eax 116ad6: 89 04 24 mov %eax,(%esp) 116ad9: e8 4e 3a 00 00 call 11a52c <_Watchdog_Remove> static void _Timer_server_Stop_tod_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog ); 116ade: 8d 43 40 lea 0x40(%ebx),%eax 116ae1: 89 04 24 mov %eax,(%esp) 116ae4: e8 43 3a 00 00 call 11a52c <_Watchdog_Remove> 116ae9: 83 c4 10 add $0x10,%esp 116aec: e9 bd fe ff ff jmp 1169ae <_Timer_server_Body+0x3e> =============================================================================== 00116af1 <_Timer_server_Schedule_operation_method>: static void _Timer_server_Schedule_operation_method( Timer_server_Control *ts, Timer_Control *timer ) { 116af1: 55 push %ebp 116af2: 89 e5 mov %esp,%ebp 116af4: 57 push %edi 116af5: 56 push %esi 116af6: 53 push %ebx 116af7: 83 ec 2c sub $0x2c,%esp 116afa: 8b 5d 08 mov 0x8(%ebp),%ebx 116afd: 8b 75 0c mov 0xc(%ebp),%esi if ( ts->insert_chain == NULL ) { 116b00: 8b 43 78 mov 0x78(%ebx),%eax 116b03: 85 c0 test %eax,%eax 116b05: 0f 85 de 00 00 00 jne 116be9 <_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(); 116b0b: e8 c4 fd ff ff call 1168d4 <_Thread_Disable_dispatch> if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) { 116b10: 8b 46 38 mov 0x38(%esi),%eax 116b13: 83 f8 01 cmp $0x1,%eax 116b16: 75 5a jne 116b72 <_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 ); 116b18: 9c pushf 116b19: fa cli 116b1a: 8f 45 e0 popl -0x20(%ebp) snapshot = _Watchdog_Ticks_since_boot; 116b1d: 8b 15 28 f0 13 00 mov 0x13f028,%edx last_snapshot = ts->Interval_watchdogs.last_snapshot; 116b23: 8b 4b 3c mov 0x3c(%ebx),%ecx initialized = false; } #endif return status; } 116b26: 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 ); 116b29: 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 ) ) { 116b2c: 39 f8 cmp %edi,%eax 116b2e: 74 19 je 116b49 <_Timer_server_Schedule_operation_method+0x58> first_watchdog = _Watchdog_First( &ts->Interval_watchdogs.Chain ); /* * We assume adequate unsigned arithmetic here. */ delta = snapshot - last_snapshot; 116b30: 89 d7 mov %edx,%edi 116b32: 29 cf sub %ecx,%edi 116b34: 89 7d e4 mov %edi,-0x1c(%ebp) delta_interval = first_watchdog->delta_interval; 116b37: 8b 78 10 mov 0x10(%eax),%edi if (delta_interval > delta) { delta_interval -= delta; } else { delta_interval = 0; 116b3a: 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) { 116b3c: 3b 7d e4 cmp -0x1c(%ebp),%edi 116b3f: 76 05 jbe 116b46 <_Timer_server_Schedule_operation_method+0x55> delta_interval -= delta; 116b41: 89 f9 mov %edi,%ecx 116b43: 2b 4d e4 sub -0x1c(%ebp),%ecx } else { delta_interval = 0; } first_watchdog->delta_interval = delta_interval; 116b46: 89 48 10 mov %ecx,0x10(%eax) } ts->Interval_watchdogs.last_snapshot = snapshot; 116b49: 89 53 3c mov %edx,0x3c(%ebx) _ISR_Enable( level ); 116b4c: ff 75 e0 pushl -0x20(%ebp) 116b4f: 9d popf _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); 116b50: 50 push %eax 116b51: 50 push %eax 116b52: 83 c6 10 add $0x10,%esi 116b55: 56 push %esi 116b56: 8d 43 30 lea 0x30(%ebx),%eax 116b59: 50 push %eax 116b5a: e8 ad 38 00 00 call 11a40c <_Watchdog_Insert> if ( !ts->active ) { 116b5f: 8a 43 7c mov 0x7c(%ebx),%al 116b62: 83 c4 10 add $0x10,%esp 116b65: 84 c0 test %al,%al 116b67: 75 74 jne 116bdd <_Timer_server_Schedule_operation_method+0xec> _Timer_server_Reset_interval_system_watchdog( ts ); 116b69: 89 d8 mov %ebx,%eax 116b6b: e8 74 fd ff ff call 1168e4 <_Timer_server_Reset_interval_system_watchdog> 116b70: eb 6b jmp 116bdd <_Timer_server_Schedule_operation_method+0xec> } } else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) { 116b72: 83 f8 03 cmp $0x3,%eax 116b75: 75 66 jne 116bdd <_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 ); 116b77: 9c pushf 116b78: fa cli 116b79: 8f 45 e0 popl -0x20(%ebp) snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch(); 116b7c: 8b 15 a0 ef 13 00 mov 0x13efa0,%edx last_snapshot = ts->TOD_watchdogs.last_snapshot; 116b82: 8b 43 74 mov 0x74(%ebx),%eax initialized = false; } #endif return status; } 116b85: 8b 4b 68 mov 0x68(%ebx),%ecx 116b88: 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 ) ) { 116b8b: 39 f9 cmp %edi,%ecx 116b8d: 74 27 je 116bb6 <_Timer_server_Schedule_operation_method+0xc5> first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain ); delta_interval = first_watchdog->delta_interval; 116b8f: 8b 79 10 mov 0x10(%ecx),%edi 116b92: 89 7d d4 mov %edi,-0x2c(%ebp) if ( snapshot > last_snapshot ) { 116b95: 39 c2 cmp %eax,%edx 116b97: 76 15 jbe 116bae <_Timer_server_Schedule_operation_method+0xbd> /* * We advanced in time. */ delta = snapshot - last_snapshot; 116b99: 89 d7 mov %edx,%edi 116b9b: 29 c7 sub %eax,%edi 116b9d: 89 7d e4 mov %edi,-0x1c(%ebp) if (delta_interval > delta) { delta_interval -= delta; } else { delta_interval = 0; 116ba0: 31 c0 xor %eax,%eax if ( snapshot > last_snapshot ) { /* * We advanced in time. */ delta = snapshot - last_snapshot; if (delta_interval > delta) { 116ba2: 39 7d d4 cmp %edi,-0x2c(%ebp) 116ba5: 76 0c jbe 116bb3 <_Timer_server_Schedule_operation_method+0xc2><== NEVER TAKEN delta_interval -= delta; 116ba7: 8b 45 d4 mov -0x2c(%ebp),%eax 116baa: 29 f8 sub %edi,%eax 116bac: eb 05 jmp 116bb3 <_Timer_server_Schedule_operation_method+0xc2> } } else { /* * Someone put us in the past. */ delta = last_snapshot - snapshot; 116bae: 03 45 d4 add -0x2c(%ebp),%eax delta_interval += delta; 116bb1: 29 d0 sub %edx,%eax } first_watchdog->delta_interval = delta_interval; 116bb3: 89 41 10 mov %eax,0x10(%ecx) } ts->TOD_watchdogs.last_snapshot = snapshot; 116bb6: 89 53 74 mov %edx,0x74(%ebx) _ISR_Enable( level ); 116bb9: ff 75 e0 pushl -0x20(%ebp) 116bbc: 9d popf _Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker ); 116bbd: 57 push %edi 116bbe: 57 push %edi 116bbf: 83 c6 10 add $0x10,%esi 116bc2: 56 push %esi 116bc3: 8d 43 68 lea 0x68(%ebx),%eax 116bc6: 50 push %eax 116bc7: e8 40 38 00 00 call 11a40c <_Watchdog_Insert> if ( !ts->active ) { 116bcc: 8a 43 7c mov 0x7c(%ebx),%al 116bcf: 83 c4 10 add $0x10,%esp 116bd2: 84 c0 test %al,%al 116bd4: 75 07 jne 116bdd <_Timer_server_Schedule_operation_method+0xec> _Timer_server_Reset_tod_system_watchdog( ts ); 116bd6: 89 d8 mov %ebx,%eax 116bd8: e8 4d fd ff ff call 11692a <_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 ); } } 116bdd: 8d 65 f4 lea -0xc(%ebp),%esp 116be0: 5b pop %ebx 116be1: 5e pop %esi 116be2: 5f pop %edi 116be3: c9 leave if ( !ts->active ) { _Timer_server_Reset_tod_system_watchdog( ts ); } } _Thread_Enable_dispatch(); 116be4: e9 a9 29 00 00 jmp 119592 <_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 ); 116be9: 8b 43 78 mov 0x78(%ebx),%eax <== NOT EXECUTED 116bec: 89 75 0c mov %esi,0xc(%ebp) <== NOT EXECUTED 116bef: 89 45 08 mov %eax,0x8(%ebp) <== NOT EXECUTED } } 116bf2: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED 116bf5: 5b pop %ebx <== NOT EXECUTED 116bf6: 5e pop %esi <== NOT EXECUTED 116bf7: 5f pop %edi <== NOT EXECUTED 116bf8: 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 ); 116bf9: e9 d6 06 00 00 jmp 1172d4 <_Chain_Append> <== NOT EXECUTED =============================================================================== 0010cc8b <_User_extensions_Fatal>: void _User_extensions_Fatal ( Internal_errors_Source the_source, bool is_internal, Internal_errors_t the_error ) { 10cc8b: 55 push %ebp 10cc8c: 89 e5 mov %esp,%ebp 10cc8e: 57 push %edi 10cc8f: 56 push %esi 10cc90: 53 push %ebx 10cc91: 83 ec 0c sub $0xc,%esp 10cc94: 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 ); } } 10cc97: 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 ); 10cc9d: 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 ); 10cca1: eb 15 jmp 10ccb8 <_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 ) 10cca3: 8b 43 30 mov 0x30(%ebx),%eax 10cca6: 85 c0 test %eax,%eax 10cca8: 74 0b je 10ccb5 <_User_extensions_Fatal+0x2a> (*the_extension->Callouts.fatal)( the_source, is_internal, the_error ); 10ccaa: 52 push %edx 10ccab: 57 push %edi 10ccac: 56 push %esi 10ccad: ff 75 08 pushl 0x8(%ebp) 10ccb0: ff d0 call *%eax 10ccb2: 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 ) { 10ccb5: 8b 5b 04 mov 0x4(%ebx),%ebx ) { Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _Chain_Last( &_User_extensions_List ); 10ccb8: 81 fb 0c 55 12 00 cmp $0x12550c,%ebx 10ccbe: 75 e3 jne 10cca3 <_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 ); } } 10ccc0: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED 10ccc3: 5b pop %ebx <== NOT EXECUTED 10ccc4: 5e pop %esi <== NOT EXECUTED 10ccc5: 5f pop %edi <== NOT EXECUTED 10ccc6: c9 leave <== NOT EXECUTED 10ccc7: c3 ret <== NOT EXECUTED =============================================================================== 0010cb74 <_User_extensions_Handler_initialization>: #include #include #include void _User_extensions_Handler_initialization(void) { 10cb74: 55 push %ebp 10cb75: 89 e5 mov %esp,%ebp 10cb77: 57 push %edi 10cb78: 56 push %esi 10cb79: 53 push %ebx 10cb7a: 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; 10cb7d: a1 60 12 12 00 mov 0x121260,%eax 10cb82: 89 45 e4 mov %eax,-0x1c(%ebp) initial_extensions = Configuration.User_extension_table; 10cb85: 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; 10cb8b: c7 05 0c 55 12 00 10 movl $0x125510,0x12550c 10cb92: 55 12 00 head->previous = NULL; 10cb95: c7 05 10 55 12 00 00 movl $0x0,0x125510 10cb9c: 00 00 00 tail->previous = head; 10cb9f: c7 05 14 55 12 00 0c movl $0x12550c,0x125514 10cba6: 55 12 00 ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; 10cba9: c7 05 44 53 12 00 48 movl $0x125348,0x125344 10cbb0: 53 12 00 head->previous = NULL; 10cbb3: c7 05 48 53 12 00 00 movl $0x0,0x125348 10cbba: 00 00 00 tail->previous = head; 10cbbd: c7 05 4c 53 12 00 44 movl $0x125344,0x12534c 10cbc4: 53 12 00 _Chain_Initialize_empty( &_User_extensions_List ); _Chain_Initialize_empty( &_User_extensions_Switches_list ); if ( initial_extensions ) { 10cbc7: 85 f6 test %esi,%esi 10cbc9: 74 53 je 10cc1e <_User_extensions_Handler_initialization+0xaa><== NEVER TAKEN extension = (User_extensions_Control *) _Workspace_Allocate_or_fatal_error( 10cbcb: 6b c8 34 imul $0x34,%eax,%ecx 10cbce: 83 ec 0c sub $0xc,%esp 10cbd1: 51 push %ecx 10cbd2: 89 4d e0 mov %ecx,-0x20(%ebp) 10cbd5: e8 3d 04 00 00 call 10d017 <_Workspace_Allocate_or_fatal_error> 10cbda: 89 c3 mov %eax,%ebx number_of_extensions * sizeof( User_extensions_Control ) ); memset ( 10cbdc: 31 c0 xor %eax,%eax 10cbde: 8b 4d e0 mov -0x20(%ebp),%ecx 10cbe1: 89 df mov %ebx,%edi 10cbe3: f3 aa rep stos %al,%es:(%edi) 10cbe5: 89 f0 mov %esi,%eax extension, 0, number_of_extensions * sizeof( User_extensions_Control ) ); for ( i = 0 ; i < number_of_extensions ; i++ ) { 10cbe7: 83 c4 10 add $0x10,%esp 10cbea: 31 d2 xor %edx,%edx 10cbec: eb 2b jmp 10cc19 <_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; 10cbee: 8d 7b 14 lea 0x14(%ebx),%edi 10cbf1: 89 c6 mov %eax,%esi 10cbf3: b9 08 00 00 00 mov $0x8,%ecx 10cbf8: f3 a5 rep movsl %ds:(%esi),%es:(%edi) _User_extensions_Add_set( extension ); 10cbfa: 83 ec 0c sub $0xc,%esp 10cbfd: 53 push %ebx 10cbfe: 89 45 dc mov %eax,-0x24(%ebp) 10cc01: 89 55 e0 mov %edx,-0x20(%ebp) 10cc04: e8 3f 2f 00 00 call 10fb48 <_User_extensions_Add_set> _User_extensions_Add_set_with_table (extension, &initial_extensions[i]); extension++; 10cc09: 83 c3 34 add $0x34,%ebx extension, 0, number_of_extensions * sizeof( User_extensions_Control ) ); for ( i = 0 ; i < number_of_extensions ; i++ ) { 10cc0c: 8b 55 e0 mov -0x20(%ebp),%edx 10cc0f: 42 inc %edx 10cc10: 8b 45 dc mov -0x24(%ebp),%eax 10cc13: 83 c0 20 add $0x20,%eax 10cc16: 83 c4 10 add $0x10,%esp 10cc19: 3b 55 e4 cmp -0x1c(%ebp),%edx 10cc1c: 72 d0 jb 10cbee <_User_extensions_Handler_initialization+0x7a> _User_extensions_Add_set_with_table (extension, &initial_extensions[i]); extension++; } } } 10cc1e: 8d 65 f4 lea -0xc(%ebp),%esp 10cc21: 5b pop %ebx 10cc22: 5e pop %esi 10cc23: 5f pop %edi 10cc24: c9 leave 10cc25: c3 ret =============================================================================== 0010e4cc <_Watchdog_Adjust>: void _Watchdog_Adjust( Chain_Control *header, Watchdog_Adjust_directions direction, Watchdog_Interval units ) { 10e4cc: 55 push %ebp 10e4cd: 89 e5 mov %esp,%ebp 10e4cf: 57 push %edi 10e4d0: 56 push %esi 10e4d1: 53 push %ebx 10e4d2: 83 ec 1c sub $0x1c,%esp 10e4d5: 8b 75 08 mov 0x8(%ebp),%esi 10e4d8: 8b 7d 0c mov 0xc(%ebp),%edi 10e4db: 8b 5d 10 mov 0x10(%ebp),%ebx ISR_Level level; _ISR_Disable( level ); 10e4de: 9c pushf 10e4df: fa cli 10e4e0: 58 pop %eax } } _ISR_Enable( level ); } 10e4e1: 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 ); 10e4e3: 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 ) ) { 10e4e6: 39 ca cmp %ecx,%edx 10e4e8: 74 44 je 10e52e <_Watchdog_Adjust+0x62> switch ( direction ) { 10e4ea: 85 ff test %edi,%edi 10e4ec: 74 3c je 10e52a <_Watchdog_Adjust+0x5e> 10e4ee: 4f dec %edi 10e4ef: 75 3d jne 10e52e <_Watchdog_Adjust+0x62> <== NEVER TAKEN case WATCHDOG_BACKWARD: _Watchdog_First( header )->delta_interval += units; 10e4f1: 01 5a 10 add %ebx,0x10(%edx) break; 10e4f4: eb 38 jmp 10e52e <_Watchdog_Adjust+0x62> RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First( Chain_Control *header ) { return ( (Watchdog_Control *) _Chain_First( header ) ); 10e4f6: 8b 16 mov (%esi),%edx case WATCHDOG_FORWARD: while ( units ) { if ( units < _Watchdog_First( header )->delta_interval ) { 10e4f8: 8b 7a 10 mov 0x10(%edx),%edi 10e4fb: 39 fb cmp %edi,%ebx 10e4fd: 73 07 jae 10e506 <_Watchdog_Adjust+0x3a> _Watchdog_First( header )->delta_interval -= units; 10e4ff: 29 df sub %ebx,%edi 10e501: 89 7a 10 mov %edi,0x10(%edx) break; 10e504: eb 28 jmp 10e52e <_Watchdog_Adjust+0x62> } else { units -= _Watchdog_First( header )->delta_interval; _Watchdog_First( header )->delta_interval = 1; 10e506: c7 42 10 01 00 00 00 movl $0x1,0x10(%edx) _ISR_Enable( level ); 10e50d: 50 push %eax 10e50e: 9d popf _Watchdog_Tickle( header ); 10e50f: 83 ec 0c sub $0xc,%esp 10e512: 56 push %esi 10e513: 89 4d e4 mov %ecx,-0x1c(%ebp) 10e516: e8 a5 01 00 00 call 10e6c0 <_Watchdog_Tickle> _ISR_Disable( level ); 10e51b: 9c pushf 10e51c: fa cli 10e51d: 58 pop %eax if ( _Chain_Is_empty( header ) ) 10e51e: 83 c4 10 add $0x10,%esp 10e521: 8b 4d e4 mov -0x1c(%ebp),%ecx 10e524: 39 0e cmp %ecx,(%esi) 10e526: 74 06 je 10e52e <_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; 10e528: 29 fb sub %edi,%ebx switch ( direction ) { case WATCHDOG_BACKWARD: _Watchdog_First( header )->delta_interval += units; break; case WATCHDOG_FORWARD: while ( units ) { 10e52a: 85 db test %ebx,%ebx 10e52c: 75 c8 jne 10e4f6 <_Watchdog_Adjust+0x2a> <== ALWAYS TAKEN } break; } } _ISR_Enable( level ); 10e52e: 50 push %eax 10e52f: 9d popf } 10e530: 8d 65 f4 lea -0xc(%ebp),%esp 10e533: 5b pop %ebx 10e534: 5e pop %esi 10e535: 5f pop %edi 10e536: c9 leave 10e537: c3 ret =============================================================================== 0010cecc <_Watchdog_Remove>: */ Watchdog_States _Watchdog_Remove( Watchdog_Control *the_watchdog ) { 10cecc: 55 push %ebp 10cecd: 89 e5 mov %esp,%ebp 10cecf: 56 push %esi 10ced0: 53 push %ebx 10ced1: 8b 55 08 mov 0x8(%ebp),%edx ISR_Level level; Watchdog_States previous_state; Watchdog_Control *next_watchdog; _ISR_Disable( level ); 10ced4: 9c pushf 10ced5: fa cli 10ced6: 5e pop %esi previous_state = the_watchdog->state; 10ced7: 8b 42 08 mov 0x8(%edx),%eax switch ( previous_state ) { 10ceda: 83 f8 01 cmp $0x1,%eax 10cedd: 74 09 je 10cee8 <_Watchdog_Remove+0x1c> 10cedf: 72 42 jb 10cf23 <_Watchdog_Remove+0x57> 10cee1: 83 f8 03 cmp $0x3,%eax 10cee4: 77 3d ja 10cf23 <_Watchdog_Remove+0x57> <== NEVER TAKEN 10cee6: eb 09 jmp 10cef1 <_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; 10cee8: c7 42 08 00 00 00 00 movl $0x0,0x8(%edx) break; 10ceef: eb 32 jmp 10cf23 <_Watchdog_Remove+0x57> case WATCHDOG_ACTIVE: case WATCHDOG_REMOVE_IT: the_watchdog->state = WATCHDOG_INACTIVE; 10cef1: 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 ); } 10cef8: 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) ) 10cefa: 83 39 00 cmpl $0x0,(%ecx) 10cefd: 74 06 je 10cf05 <_Watchdog_Remove+0x39> next_watchdog->delta_interval += the_watchdog->delta_interval; 10ceff: 8b 5a 10 mov 0x10(%edx),%ebx 10cf02: 01 59 10 add %ebx,0x10(%ecx) if ( _Watchdog_Sync_count ) 10cf05: 8b 1d 50 54 12 00 mov 0x125450,%ebx 10cf0b: 85 db test %ebx,%ebx 10cf0d: 74 0c je 10cf1b <_Watchdog_Remove+0x4f> _Watchdog_Sync_level = _ISR_Nest_level; 10cf0f: 8b 1d 64 58 12 00 mov 0x125864,%ebx 10cf15: 89 1d e8 53 12 00 mov %ebx,0x1253e8 { Chain_Node *next; Chain_Node *previous; next = the_node->next; previous = the_node->previous; 10cf1b: 8b 5a 04 mov 0x4(%edx),%ebx next->previous = previous; 10cf1e: 89 59 04 mov %ebx,0x4(%ecx) previous->next = next; 10cf21: 89 0b mov %ecx,(%ebx) _Chain_Extract_unprotected( &the_watchdog->Node ); break; } the_watchdog->stop_time = _Watchdog_Ticks_since_boot; 10cf23: 8b 0d 54 54 12 00 mov 0x125454,%ecx 10cf29: 89 4a 18 mov %ecx,0x18(%edx) _ISR_Enable( level ); 10cf2c: 56 push %esi 10cf2d: 9d popf return( previous_state ); } 10cf2e: 5b pop %ebx 10cf2f: 5e pop %esi 10cf30: c9 leave 10cf31: c3 ret =============================================================================== 0010e058 <_Watchdog_Report_chain>: void _Watchdog_Report_chain( const char *name, Chain_Control *header ) { 10e058: 55 push %ebp 10e059: 89 e5 mov %esp,%ebp 10e05b: 57 push %edi 10e05c: 56 push %esi 10e05d: 53 push %ebx 10e05e: 83 ec 20 sub $0x20,%esp 10e061: 8b 7d 08 mov 0x8(%ebp),%edi 10e064: 8b 75 0c mov 0xc(%ebp),%esi ISR_Level level; Chain_Node *node; _ISR_Disable( level ); 10e067: 9c pushf 10e068: fa cli 10e069: 8f 45 e4 popl -0x1c(%ebp) printk( "Watchdog Chain: %s %p\n", name, header ); 10e06c: 56 push %esi 10e06d: 57 push %edi 10e06e: 68 f0 17 12 00 push $0x1217f0 10e073: e8 60 aa ff ff call 108ad8 printk( "== end of %s \n", name ); } else { printk( "Chain is empty\n" ); } _ISR_Enable( level ); } 10e078: 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 ); 10e07a: 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 ) ) { 10e07d: 83 c4 10 add $0x10,%esp 10e080: 39 f3 cmp %esi,%ebx 10e082: 74 1d je 10e0a1 <_Watchdog_Report_chain+0x49> node != _Chain_Tail(header) ; node = node->next ) { Watchdog_Control *watch = (Watchdog_Control *) node; _Watchdog_Report( NULL, watch ); 10e084: 52 push %edx 10e085: 52 push %edx 10e086: 53 push %ebx 10e087: 6a 00 push $0x0 10e089: e8 32 00 00 00 call 10e0c0 <_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 ) 10e08e: 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 ) ; 10e090: 83 c4 10 add $0x10,%esp 10e093: 39 f3 cmp %esi,%ebx 10e095: 75 ed jne 10e084 <_Watchdog_Report_chain+0x2c><== NEVER TAKEN { Watchdog_Control *watch = (Watchdog_Control *) node; _Watchdog_Report( NULL, watch ); } printk( "== end of %s \n", name ); 10e097: 50 push %eax 10e098: 50 push %eax 10e099: 57 push %edi 10e09a: 68 07 18 12 00 push $0x121807 10e09f: eb 08 jmp 10e0a9 <_Watchdog_Report_chain+0x51> } else { printk( "Chain is empty\n" ); 10e0a1: 83 ec 0c sub $0xc,%esp 10e0a4: 68 16 18 12 00 push $0x121816 10e0a9: e8 2a aa ff ff call 108ad8 10e0ae: 83 c4 10 add $0x10,%esp } _ISR_Enable( level ); 10e0b1: ff 75 e4 pushl -0x1c(%ebp) 10e0b4: 9d popf } 10e0b5: 8d 65 f4 lea -0xc(%ebp),%esp 10e0b8: 5b pop %ebx 10e0b9: 5e pop %esi 10e0ba: 5f pop %edi 10e0bb: c9 leave 10e0bc: c3 ret =============================================================================== 0010b1c8 <_rename_r>: int _rename_r( struct _reent *ptr __attribute__((unused)), const char *old, const char *new ) { 10b1c8: 55 push %ebp 10b1c9: 89 e5 mov %esp,%ebp 10b1cb: 57 push %edi 10b1cc: 56 push %esi 10b1cd: 53 push %ebx 10b1ce: 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 ); 10b1d1: ff 75 0c pushl 0xc(%ebp) 10b1d4: e8 5e ed ff ff call 109f37 10b1d9: 89 45 94 mov %eax,-0x6c(%ebp) if ( old_parent_pathlen == 0 ) 10b1dc: 83 c4 10 add $0x10,%esp 10b1df: 85 c0 test %eax,%eax 10b1e1: 8d 45 b8 lea -0x48(%ebp),%eax 10b1e4: 75 15 jne 10b1fb <_rename_r+0x33> rtems_filesystem_get_start_loc( old, &i, &old_parent_loc ); 10b1e6: 51 push %ecx 10b1e7: 50 push %eax 10b1e8: 8d 45 e4 lea -0x1c(%ebp),%eax 10b1eb: 50 push %eax 10b1ec: ff 75 0c pushl 0xc(%ebp) 10b1ef: e8 48 03 00 00 call 10b53c 10b1f4: 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; 10b1f7: 31 db xor %ebx,%ebx 10b1f9: eb 23 jmp 10b21e <_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, 10b1fb: 83 ec 0c sub $0xc,%esp 10b1fe: 6a 00 push $0x0 10b200: 50 push %eax 10b201: 6a 02 push $0x2 10b203: ff 75 94 pushl -0x6c(%ebp) 10b206: ff 75 0c pushl 0xc(%ebp) 10b209: e8 e8 ec ff ff call 109ef6 RTEMS_LIBIO_PERMS_WRITE, &old_parent_loc, false ); if ( result != 0 ) 10b20e: 83 c4 20 add $0x20,%esp return -1; 10b211: 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 ) 10b214: 85 c0 test %eax,%eax 10b216: 0f 85 50 01 00 00 jne 10b36c <_rename_r+0x1a4> <== NEVER TAKEN return -1; free_old_parentloc = true; 10b21c: b3 01 mov $0x1,%bl /* * Start from the parent to find the node that should be under it. */ old_loc = old_parent_loc; 10b21e: 8d 7d cc lea -0x34(%ebp),%edi 10b221: 8d 75 b8 lea -0x48(%ebp),%esi 10b224: b9 05 00 00 00 mov $0x5,%ecx 10b229: f3 a5 rep movsl %ds:(%esi),%es:(%edi) name = old + old_parent_pathlen; 10b22b: 8b 75 0c mov 0xc(%ebp),%esi 10b22e: 03 75 94 add -0x6c(%ebp),%esi 10b231: 89 75 e0 mov %esi,-0x20(%ebp) name += rtems_filesystem_prefix_separators( name, strlen( name ) ); 10b234: 83 c9 ff or $0xffffffff,%ecx 10b237: 89 f7 mov %esi,%edi 10b239: 31 c0 xor %eax,%eax 10b23b: f2 ae repnz scas %es:(%edi),%al 10b23d: f7 d1 not %ecx 10b23f: 49 dec %ecx 10b240: 52 push %edx 10b241: 52 push %edx 10b242: 51 push %ecx 10b243: 56 push %esi 10b244: e8 2d ed ff ff call 109f76 10b249: 01 c6 add %eax,%esi 10b24b: 89 75 e0 mov %esi,-0x20(%ebp) result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), 10b24e: 83 c9 ff or $0xffffffff,%ecx 10b251: 89 f7 mov %esi,%edi 10b253: 31 c0 xor %eax,%eax 10b255: f2 ae repnz scas %es:(%edi),%al 10b257: f7 d1 not %ecx 10b259: 49 dec %ecx 10b25a: c7 04 24 00 00 00 00 movl $0x0,(%esp) 10b261: 8d 7d cc lea -0x34(%ebp),%edi 10b264: 57 push %edi 10b265: 6a 00 push $0x0 10b267: 51 push %ecx 10b268: 56 push %esi 10b269: e8 2a ec ff ff call 109e98 0, &old_loc, false ); if ( result != 0 ) { 10b26e: 83 c4 20 add $0x20,%esp 10b271: 85 c0 test %eax,%eax 10b273: 74 16 je 10b28b <_rename_r+0xc3> if ( free_old_parentloc ) rtems_filesystem_freenode( &old_parent_loc ); return -1; 10b275: 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 ) 10b278: 84 db test %bl,%bl 10b27a: 0f 84 ec 00 00 00 je 10b36c <_rename_r+0x1a4> <== NEVER TAKEN rtems_filesystem_freenode( &old_parent_loc ); 10b280: 83 ec 0c sub $0xc,%esp 10b283: 8d 45 b8 lea -0x48(%ebp),%eax 10b286: e9 d8 00 00 00 jmp 10b363 <_rename_r+0x19b> /* * Get the parent of the new node we are renaming to. */ rtems_filesystem_get_start_loc( new, &i, &new_parent_loc ); 10b28b: 50 push %eax 10b28c: 8d 75 a4 lea -0x5c(%ebp),%esi 10b28f: 56 push %esi 10b290: 8d 45 e4 lea -0x1c(%ebp),%eax 10b293: 50 push %eax 10b294: ff 75 10 pushl 0x10(%ebp) 10b297: e8 a0 02 00 00 call 10b53c result = (*new_parent_loc.ops->evalformake_h)( &new[i], &new_parent_loc, &name ); 10b29c: 83 c4 0c add $0xc,%esp 10b29f: 8d 45 e0 lea -0x20(%ebp),%eax 10b2a2: 50 push %eax 10b2a3: 56 push %esi 10b2a4: 8b 45 10 mov 0x10(%ebp),%eax 10b2a7: 03 45 e4 add -0x1c(%ebp),%eax 10b2aa: 50 push %eax 10b2ab: 8b 45 b0 mov -0x50(%ebp),%eax 10b2ae: ff 50 04 call *0x4(%eax) if ( result != 0 ) { 10b2b1: 83 c4 10 add $0x10,%esp 10b2b4: 85 c0 test %eax,%eax 10b2b6: 74 2d je 10b2e5 <_rename_r+0x11d> rtems_filesystem_freenode( &new_parent_loc ); 10b2b8: 83 ec 0c sub $0xc,%esp 10b2bb: 56 push %esi 10b2bc: e8 43 ee ff ff call 10a104 if ( free_old_parentloc ) 10b2c1: 83 c4 10 add $0x10,%esp 10b2c4: 84 db test %bl,%bl 10b2c6: 74 0f je 10b2d7 <_rename_r+0x10f> <== NEVER TAKEN rtems_filesystem_freenode( &old_parent_loc ); 10b2c8: 83 ec 0c sub $0xc,%esp 10b2cb: 8d 45 b8 lea -0x48(%ebp),%eax 10b2ce: 50 push %eax 10b2cf: e8 30 ee ff ff call 10a104 10b2d4: 83 c4 10 add $0x10,%esp rtems_filesystem_freenode( &old_loc ); 10b2d7: 83 ec 0c sub $0xc,%esp 10b2da: 8d 45 cc lea -0x34(%ebp),%eax 10b2dd: 50 push %eax 10b2de: e8 21 ee ff ff call 10a104 10b2e3: eb 3e jmp 10b323 <_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 ) { 10b2e5: 8b 45 b4 mov -0x4c(%ebp),%eax 10b2e8: 39 45 c8 cmp %eax,-0x38(%ebp) 10b2eb: 74 3e je 10b32b <_rename_r+0x163> rtems_filesystem_freenode( &new_parent_loc ); 10b2ed: 83 ec 0c sub $0xc,%esp 10b2f0: 56 push %esi 10b2f1: e8 0e ee ff ff call 10a104 if ( free_old_parentloc ) 10b2f6: 83 c4 10 add $0x10,%esp 10b2f9: 84 db test %bl,%bl 10b2fb: 74 0f je 10b30c <_rename_r+0x144> rtems_filesystem_freenode( &old_parent_loc ); 10b2fd: 83 ec 0c sub $0xc,%esp 10b300: 8d 45 b8 lea -0x48(%ebp),%eax 10b303: 50 push %eax 10b304: e8 fb ed ff ff call 10a104 10b309: 83 c4 10 add $0x10,%esp rtems_filesystem_freenode( &old_loc ); 10b30c: 83 ec 0c sub $0xc,%esp 10b30f: 8d 45 cc lea -0x34(%ebp),%eax 10b312: 50 push %eax 10b313: e8 ec ed ff ff call 10a104 rtems_set_errno_and_return_minus_one( EXDEV ); 10b318: e8 37 95 00 00 call 114854 <__errno> 10b31d: c7 00 12 00 00 00 movl $0x12,(%eax) 10b323: 83 c4 10 add $0x10,%esp 10b326: 83 cf ff or $0xffffffff,%edi 10b329: eb 41 jmp 10b36c <_rename_r+0x1a4> } result = (*new_parent_loc.ops->rename_h)( &old_parent_loc, &old_loc, &new_parent_loc, name ); 10b32b: ff 75 e0 pushl -0x20(%ebp) 10b32e: 56 push %esi 10b32f: 57 push %edi 10b330: 8d 55 b8 lea -0x48(%ebp),%edx 10b333: 52 push %edx 10b334: 8b 45 b0 mov -0x50(%ebp),%eax 10b337: 89 55 90 mov %edx,-0x70(%ebp) 10b33a: ff 50 40 call *0x40(%eax) 10b33d: 89 c7 mov %eax,%edi rtems_filesystem_freenode( &new_parent_loc ); 10b33f: 89 34 24 mov %esi,(%esp) 10b342: e8 bd ed ff ff call 10a104 if ( free_old_parentloc ) 10b347: 83 c4 10 add $0x10,%esp 10b34a: 84 db test %bl,%bl 10b34c: 8b 55 90 mov -0x70(%ebp),%edx 10b34f: 74 0c je 10b35d <_rename_r+0x195> rtems_filesystem_freenode( &old_parent_loc ); 10b351: 83 ec 0c sub $0xc,%esp 10b354: 52 push %edx 10b355: e8 aa ed ff ff call 10a104 10b35a: 83 c4 10 add $0x10,%esp rtems_filesystem_freenode( &old_loc ); 10b35d: 83 ec 0c sub $0xc,%esp 10b360: 8d 45 cc lea -0x34(%ebp),%eax 10b363: 50 push %eax 10b364: e8 9b ed ff ff call 10a104 return result; 10b369: 83 c4 10 add $0x10,%esp } 10b36c: 89 f8 mov %edi,%eax 10b36e: 8d 65 f4 lea -0xc(%ebp),%esp 10b371: 5b pop %ebx 10b372: 5e pop %esi 10b373: 5f pop %edi 10b374: c9 leave 10b375: c3 ret =============================================================================== 0010a7b4 : * operation(s) cannot be canceled */ int aio_cancel(int fildes, struct aiocb *aiocbp) { 10a7b4: 55 push %ebp 10a7b5: 89 e5 mov %esp,%ebp 10a7b7: 57 push %edi 10a7b8: 56 push %esi 10a7b9: 53 push %ebx 10a7ba: 83 ec 18 sub $0x18,%esp 10a7bd: 8b 75 08 mov 0x8(%ebp),%esi 10a7c0: 8b 5d 0c mov 0xc(%ebp),%ebx rtems_aio_request_chain *r_chain; int result; pthread_mutex_lock (&aio_request_queue.mutex); 10a7c3: 68 d8 72 12 00 push $0x1272d8 10a7c8: e8 2f 10 00 00 call 10b7fc if (fcntl (fildes, F_GETFD) < 0) { 10a7cd: 5f pop %edi 10a7ce: 58 pop %eax 10a7cf: 6a 01 push $0x1 10a7d1: 56 push %esi 10a7d2: e8 e5 60 00 00 call 1108bc 10a7d7: 83 c4 10 add $0x10,%esp 10a7da: 85 c0 test %eax,%eax 10a7dc: 79 1d jns 10a7fb pthread_mutex_unlock(&aio_request_queue.mutex); 10a7de: 83 ec 0c sub $0xc,%esp 10a7e1: 68 d8 72 12 00 push $0x1272d8 10a7e6: e8 91 10 00 00 call 10b87c rtems_set_errno_and_return_minus_one (EBADF); 10a7eb: e8 7c 8e 00 00 call 11366c <__errno> 10a7f0: c7 00 09 00 00 00 movl $0x9,(%eax) 10a7f6: e9 e3 00 00 00 jmp 10a8de } /* if aiocbp is NULL remove all request for given file descriptor */ if (aiocbp == NULL) { 10a7fb: 85 db test %ebx,%ebx 10a7fd: 0f 85 bd 00 00 00 jne 10a8c0 AIO_printf ("Cancel all requests\n"); r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0); 10a803: 51 push %ecx 10a804: 6a 00 push $0x0 10a806: 56 push %esi 10a807: 68 20 73 12 00 push $0x127320 10a80c: e8 27 03 00 00 call 10ab38 10a811: 89 c3 mov %eax,%ebx if (r_chain == NULL) { 10a813: 83 c4 10 add $0x10,%esp 10a816: 85 c0 test %eax,%eax 10a818: 75 6c jne 10a886 AIO_printf ("Request chain not on [WQ]\n"); if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) { 10a81a: 81 3d 2c 73 12 00 30 cmpl $0x127330,0x12732c 10a821: 73 12 00 10a824: 0f 84 07 01 00 00 je 10a931 <== NEVER TAKEN r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0); 10a82a: 52 push %edx 10a82b: 6a 00 push $0x0 10a82d: 56 push %esi 10a82e: 68 2c 73 12 00 push $0x12732c 10a833: e8 00 03 00 00 call 10ab38 10a838: 89 c3 mov %eax,%ebx if (r_chain == NULL) { 10a83a: 83 c4 10 add $0x10,%esp 10a83d: 85 c0 test %eax,%eax 10a83f: 75 17 jne 10a858 pthread_mutex_unlock(&aio_request_queue.mutex); 10a841: 83 ec 0c sub $0xc,%esp 10a844: 68 d8 72 12 00 push $0x1272d8 10a849: e8 2e 10 00 00 call 10b87c return AIO_ALLDONE; 10a84e: 83 c4 10 add $0x10,%esp 10a851: b3 02 mov $0x2,%bl 10a853: e9 21 01 00 00 jmp 10a979 */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); 10a858: 83 ec 0c sub $0xc,%esp 10a85b: 50 push %eax 10a85c: e8 03 27 00 00 call 10cf64 <_Chain_Extract> } AIO_printf ("Request chain on [IQ]\n"); rtems_chain_extract (&r_chain->next_fd); rtems_aio_remove_fd (r_chain); 10a861: 89 1c 24 mov %ebx,(%esp) 10a864: e8 12 06 00 00 call 10ae7b pthread_mutex_destroy (&r_chain->mutex); 10a869: 8d 73 1c lea 0x1c(%ebx),%esi 10a86c: 89 34 24 mov %esi,(%esp) 10a86f: e8 68 0d 00 00 call 10b5dc pthread_cond_destroy (&r_chain->mutex); 10a874: 89 34 24 mov %esi,(%esp) 10a877: e8 6c 0a 00 00 call 10b2e8 free (r_chain); 10a87c: 89 1c 24 mov %ebx,(%esp) 10a87f: e8 ac d4 ff ff call 107d30 10a884: eb 24 jmp 10a8aa return AIO_ALLDONE; } AIO_printf ("Request chain on [WQ]\n"); pthread_mutex_lock (&r_chain->mutex); 10a886: 8d 70 1c lea 0x1c(%eax),%esi 10a889: 83 ec 0c sub $0xc,%esp 10a88c: 56 push %esi 10a88d: e8 6a 0f 00 00 call 10b7fc 10a892: 89 1c 24 mov %ebx,(%esp) 10a895: e8 ca 26 00 00 call 10cf64 <_Chain_Extract> rtems_chain_extract (&r_chain->next_fd); rtems_aio_remove_fd (r_chain); 10a89a: 89 1c 24 mov %ebx,(%esp) 10a89d: e8 d9 05 00 00 call 10ae7b pthread_mutex_unlock (&r_chain->mutex); 10a8a2: 89 34 24 mov %esi,(%esp) 10a8a5: e8 d2 0f 00 00 call 10b87c pthread_mutex_unlock (&aio_request_queue.mutex); 10a8aa: c7 04 24 d8 72 12 00 movl $0x1272d8,(%esp) 10a8b1: e8 c6 0f 00 00 call 10b87c return AIO_CANCELED; 10a8b6: 83 c4 10 add $0x10,%esp 10a8b9: 31 db xor %ebx,%ebx 10a8bb: e9 b9 00 00 00 jmp 10a979 } else { AIO_printf ("Cancel request\n"); if (aiocbp->aio_fildes != fildes) { 10a8c0: 8b 3b mov (%ebx),%edi 10a8c2: 39 f7 cmp %esi,%edi 10a8c4: 74 23 je 10a8e9 pthread_mutex_unlock (&aio_request_queue.mutex); 10a8c6: 83 ec 0c sub $0xc,%esp 10a8c9: 68 d8 72 12 00 push $0x1272d8 10a8ce: e8 a9 0f 00 00 call 10b87c rtems_set_errno_and_return_minus_one (EINVAL); 10a8d3: e8 94 8d 00 00 call 11366c <__errno> 10a8d8: c7 00 16 00 00 00 movl $0x16,(%eax) 10a8de: 83 c4 10 add $0x10,%esp 10a8e1: 83 cb ff or $0xffffffff,%ebx 10a8e4: e9 90 00 00 00 jmp 10a979 } r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0); 10a8e9: 50 push %eax 10a8ea: 6a 00 push $0x0 10a8ec: 57 push %edi 10a8ed: 68 20 73 12 00 push $0x127320 10a8f2: e8 41 02 00 00 call 10ab38 10a8f7: 89 c6 mov %eax,%esi if (r_chain == NULL) { 10a8f9: 83 c4 10 add $0x10,%esp 10a8fc: 85 c0 test %eax,%eax 10a8fe: 75 48 jne 10a948 if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) { 10a900: 81 3d 2c 73 12 00 30 cmpl $0x127330,0x12732c 10a907: 73 12 00 10a90a: 74 25 je 10a931 <== NEVER TAKEN r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0); 10a90c: 56 push %esi 10a90d: 6a 00 push $0x0 10a90f: 57 push %edi 10a910: 68 2c 73 12 00 push $0x12732c 10a915: e8 1e 02 00 00 call 10ab38 if (r_chain == NULL) { 10a91a: 83 c4 10 add $0x10,%esp 10a91d: 85 c0 test %eax,%eax 10a91f: 74 a5 je 10a8c6 rtems_set_errno_and_return_minus_one (EINVAL); } AIO_printf ("Request on [IQ]\n"); result = rtems_aio_remove_req (&r_chain->perfd, aiocbp); 10a921: 51 push %ecx 10a922: 51 push %ecx 10a923: 53 push %ebx 10a924: 83 c0 08 add $0x8,%eax 10a927: 50 push %eax 10a928: e8 97 05 00 00 call 10aec4 10a92d: 89 c3 mov %eax,%ebx 10a92f: eb 39 jmp 10a96a pthread_mutex_unlock (&aio_request_queue.mutex); return result; } else { pthread_mutex_unlock (&aio_request_queue.mutex); 10a931: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 10a934: 68 d8 72 12 00 push $0x1272d8 <== NOT EXECUTED 10a939: e8 3e 0f 00 00 call 10b87c <== NOT EXECUTED return AIO_ALLDONE; 10a93e: 83 c4 10 add $0x10,%esp <== NOT EXECUTED 10a941: bb 02 00 00 00 mov $0x2,%ebx <== NOT EXECUTED 10a946: eb 31 jmp 10a979 <== NOT EXECUTED } } AIO_printf ("Request on [WQ]\n"); pthread_mutex_lock (&r_chain->mutex); 10a948: 8d 78 1c lea 0x1c(%eax),%edi 10a94b: 83 ec 0c sub $0xc,%esp 10a94e: 57 push %edi 10a94f: e8 a8 0e 00 00 call 10b7fc result = rtems_aio_remove_req (&r_chain->perfd, aiocbp); 10a954: 58 pop %eax 10a955: 5a pop %edx 10a956: 53 push %ebx 10a957: 83 c6 08 add $0x8,%esi 10a95a: 56 push %esi 10a95b: e8 64 05 00 00 call 10aec4 10a960: 89 c3 mov %eax,%ebx pthread_mutex_unlock (&r_chain->mutex); 10a962: 89 3c 24 mov %edi,(%esp) 10a965: e8 12 0f 00 00 call 10b87c pthread_mutex_unlock (&aio_request_queue.mutex); 10a96a: c7 04 24 d8 72 12 00 movl $0x1272d8,(%esp) 10a971: e8 06 0f 00 00 call 10b87c return result; 10a976: 83 c4 10 add $0x10,%esp } return AIO_ALLDONE; } 10a979: 89 d8 mov %ebx,%eax 10a97b: 8d 65 f4 lea -0xc(%ebp),%esp 10a97e: 5b pop %ebx 10a97f: 5e pop %esi 10a980: 5f pop %edi 10a981: c9 leave 10a982: c3 ret =============================================================================== 0010a990 : int aio_fsync( int op, struct aiocb *aiocbp ) { 10a990: 55 push %ebp 10a991: 89 e5 mov %esp,%ebp 10a993: 53 push %ebx 10a994: 83 ec 04 sub $0x4,%esp 10a997: 8b 5d 0c mov 0xc(%ebp),%ebx rtems_aio_request *req; int mode; if (op != O_SYNC) 10a99a: 81 7d 08 00 20 00 00 cmpl $0x2000,0x8(%ebp) 10a9a1: 74 1b je 10a9be rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); 10a9a3: c7 43 30 16 00 00 00 movl $0x16,0x30(%ebx) 10a9aa: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) 10a9b1: e8 b6 8c 00 00 call 11366c <__errno> 10a9b6: c7 00 16 00 00 00 movl $0x16,(%eax) 10a9bc: eb 74 jmp 10aa32 mode = fcntl (aiocbp->aio_fildes, F_GETFL); 10a9be: 50 push %eax 10a9bf: 50 push %eax 10a9c0: 6a 03 push $0x3 10a9c2: ff 33 pushl (%ebx) 10a9c4: e8 f3 5e 00 00 call 1108bc if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR))) 10a9c9: 83 e0 03 and $0x3,%eax 10a9cc: 48 dec %eax 10a9cd: 83 c4 10 add $0x10,%esp 10a9d0: 83 f8 01 cmp $0x1,%eax 10a9d3: 76 1b jbe 10a9f0 rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); 10a9d5: c7 43 30 09 00 00 00 movl $0x9,0x30(%ebx) 10a9dc: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) 10a9e3: e8 84 8c 00 00 call 11366c <__errno> 10a9e8: c7 00 09 00 00 00 movl $0x9,(%eax) 10a9ee: eb 42 jmp 10aa32 req = malloc (sizeof (rtems_aio_request)); 10a9f0: 83 ec 0c sub $0xc,%esp 10a9f3: 6a 18 push $0x18 10a9f5: e8 ba d7 ff ff call 1081b4 if (req == NULL) 10a9fa: 83 c4 10 add $0x10,%esp 10a9fd: 85 c0 test %eax,%eax 10a9ff: 75 1b jne 10aa1c <== ALWAYS TAKEN rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); 10aa01: c7 43 30 0b 00 00 00 movl $0xb,0x30(%ebx) <== NOT EXECUTED 10aa08: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) <== NOT EXECUTED 10aa0f: e8 58 8c 00 00 call 11366c <__errno> <== NOT EXECUTED 10aa14: c7 00 0b 00 00 00 movl $0xb,(%eax) <== NOT EXECUTED 10aa1a: eb 16 jmp 10aa32 <== NOT EXECUTED req->aiocbp = aiocbp; 10aa1c: 89 58 14 mov %ebx,0x14(%eax) req->aiocbp->aio_lio_opcode = LIO_SYNC; 10aa1f: c7 43 2c 03 00 00 00 movl $0x3,0x2c(%ebx) return rtems_aio_enqueue (req); 10aa26: 89 45 08 mov %eax,0x8(%ebp) } 10aa29: 8b 5d fc mov -0x4(%ebp),%ebx 10aa2c: 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); 10aa2d: e9 ef 04 00 00 jmp 10af21 } 10aa32: 83 c8 ff or $0xffffffff,%eax 10aa35: 8b 5d fc mov -0x4(%ebp),%ebx 10aa38: c9 leave 10aa39: c3 ret =============================================================================== 0010b124 : * 0 - otherwise */ int aio_read (struct aiocb *aiocbp) { 10b124: 55 push %ebp 10b125: 89 e5 mov %esp,%ebp 10b127: 53 push %ebx 10b128: 83 ec 0c sub $0xc,%esp 10b12b: 8b 5d 08 mov 0x8(%ebp),%ebx rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); 10b12e: 6a 03 push $0x3 10b130: ff 33 pushl (%ebx) 10b132: e8 85 57 00 00 call 1108bc if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR))) 10b137: 83 e0 03 and $0x3,%eax 10b13a: 83 c4 10 add $0x10,%esp 10b13d: 83 f8 02 cmp $0x2,%eax 10b140: 74 1f je 10b161 10b142: 85 c0 test %eax,%eax 10b144: 74 1b je 10b161 <== NEVER TAKEN rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); 10b146: c7 43 30 09 00 00 00 movl $0x9,0x30(%ebx) 10b14d: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) 10b154: e8 13 85 00 00 call 11366c <__errno> 10b159: c7 00 09 00 00 00 movl $0x9,(%eax) 10b15f: eb 69 jmp 10b1ca if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX) 10b161: 83 7b 14 00 cmpl $0x0,0x14(%ebx) 10b165: 75 06 jne 10b16d rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); if (aiocbp->aio_offset < 0) 10b167: 83 7b 08 00 cmpl $0x0,0x8(%ebx) 10b16b: 79 1b jns 10b188 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); 10b16d: c7 43 30 16 00 00 00 movl $0x16,0x30(%ebx) 10b174: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) 10b17b: e8 ec 84 00 00 call 11366c <__errno> 10b180: c7 00 16 00 00 00 movl $0x16,(%eax) 10b186: eb 42 jmp 10b1ca req = malloc (sizeof (rtems_aio_request)); 10b188: 83 ec 0c sub $0xc,%esp 10b18b: 6a 18 push $0x18 10b18d: e8 22 d0 ff ff call 1081b4 if (req == NULL) 10b192: 83 c4 10 add $0x10,%esp 10b195: 85 c0 test %eax,%eax 10b197: 75 1b jne 10b1b4 <== ALWAYS TAKEN rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); 10b199: c7 43 30 0b 00 00 00 movl $0xb,0x30(%ebx) <== NOT EXECUTED 10b1a0: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) <== NOT EXECUTED 10b1a7: e8 c0 84 00 00 call 11366c <__errno> <== NOT EXECUTED 10b1ac: c7 00 0b 00 00 00 movl $0xb,(%eax) <== NOT EXECUTED 10b1b2: eb 16 jmp 10b1ca <== NOT EXECUTED req->aiocbp = aiocbp; 10b1b4: 89 58 14 mov %ebx,0x14(%eax) req->aiocbp->aio_lio_opcode = LIO_READ; 10b1b7: c7 43 2c 01 00 00 00 movl $0x1,0x2c(%ebx) return rtems_aio_enqueue (req); 10b1be: 89 45 08 mov %eax,0x8(%ebp) } 10b1c1: 8b 5d fc mov -0x4(%ebp),%ebx 10b1c4: 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); 10b1c5: e9 57 fd ff ff jmp 10af21 } 10b1ca: 83 c8 ff or $0xffffffff,%eax 10b1cd: 8b 5d fc mov -0x4(%ebp),%ebx 10b1d0: c9 leave 10b1d1: c3 ret =============================================================================== 0010b1e0 : * 0 - otherwise */ int aio_write (struct aiocb *aiocbp) { 10b1e0: 55 push %ebp 10b1e1: 89 e5 mov %esp,%ebp 10b1e3: 53 push %ebx 10b1e4: 83 ec 0c sub $0xc,%esp 10b1e7: 8b 5d 08 mov 0x8(%ebp),%ebx rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); 10b1ea: 6a 03 push $0x3 10b1ec: ff 33 pushl (%ebx) 10b1ee: e8 c9 56 00 00 call 1108bc if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR))) 10b1f3: 83 e0 03 and $0x3,%eax 10b1f6: 48 dec %eax 10b1f7: 83 c4 10 add $0x10,%esp 10b1fa: 83 f8 01 cmp $0x1,%eax 10b1fd: 76 1b jbe 10b21a rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); 10b1ff: c7 43 30 09 00 00 00 movl $0x9,0x30(%ebx) 10b206: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) 10b20d: e8 5a 84 00 00 call 11366c <__errno> 10b212: c7 00 09 00 00 00 movl $0x9,(%eax) 10b218: eb 69 jmp 10b283 if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX) 10b21a: 83 7b 14 00 cmpl $0x0,0x14(%ebx) 10b21e: 75 06 jne 10b226 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); if (aiocbp->aio_offset < 0) 10b220: 83 7b 08 00 cmpl $0x0,0x8(%ebx) 10b224: 79 1b jns 10b241 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); 10b226: c7 43 30 16 00 00 00 movl $0x16,0x30(%ebx) 10b22d: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) 10b234: e8 33 84 00 00 call 11366c <__errno> 10b239: c7 00 16 00 00 00 movl $0x16,(%eax) 10b23f: eb 42 jmp 10b283 req = malloc (sizeof (rtems_aio_request)); 10b241: 83 ec 0c sub $0xc,%esp 10b244: 6a 18 push $0x18 10b246: e8 69 cf ff ff call 1081b4 if (req == NULL) 10b24b: 83 c4 10 add $0x10,%esp 10b24e: 85 c0 test %eax,%eax 10b250: 75 1b jne 10b26d <== ALWAYS TAKEN rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); 10b252: c7 43 30 0b 00 00 00 movl $0xb,0x30(%ebx) <== NOT EXECUTED 10b259: c7 43 34 ff ff ff ff movl $0xffffffff,0x34(%ebx) <== NOT EXECUTED 10b260: e8 07 84 00 00 call 11366c <__errno> <== NOT EXECUTED 10b265: c7 00 0b 00 00 00 movl $0xb,(%eax) <== NOT EXECUTED 10b26b: eb 16 jmp 10b283 <== NOT EXECUTED req->aiocbp = aiocbp; 10b26d: 89 58 14 mov %ebx,0x14(%eax) req->aiocbp->aio_lio_opcode = LIO_WRITE; 10b270: c7 43 2c 02 00 00 00 movl $0x2,0x2c(%ebx) return rtems_aio_enqueue (req); 10b277: 89 45 08 mov %eax,0x8(%ebp) } 10b27a: 8b 5d fc mov -0x4(%ebp),%ebx 10b27d: 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); 10b27e: e9 9e fc ff ff jmp 10af21 } 10b283: 83 c8 ff or $0xffffffff,%eax 10b286: 8b 5d fc mov -0x4(%ebp),%ebx 10b289: c9 leave 10b28a: c3 ret =============================================================================== 00107518 : #include int chroot( const char *pathname ) { 107518: 55 push %ebp 107519: 89 e5 mov %esp,%ebp 10751b: 57 push %edi 10751c: 56 push %esi 10751d: 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) { 107520: 81 3d 6c 30 12 00 48 cmpl $0x125248,0x12306c 107527: 52 12 00 10752a: 75 1e jne 10754a rtems_libio_set_private_env(); /* try to set a new private env*/ 10752c: e8 cc 10 00 00 call 1085fd if (rtems_current_user_env == &rtems_global_user_env) /* not ok */ 107531: 81 3d 6c 30 12 00 48 cmpl $0x125248,0x12306c 107538: 52 12 00 10753b: 75 0d jne 10754a rtems_set_errno_and_return_minus_one( ENOTSUP ); 10753d: e8 52 a3 00 00 call 111894 <__errno> 107542: c7 00 86 00 00 00 movl $0x86,(%eax) 107548: eb 22 jmp 10756c } result = chdir(pathname); 10754a: 83 ec 0c sub $0xc,%esp 10754d: ff 75 08 pushl 0x8(%ebp) 107550: e8 87 74 00 00 call 10e9dc if (result) { 107555: 83 c4 10 add $0x10,%esp 107558: 85 c0 test %eax,%eax 10755a: 74 15 je 107571 rtems_set_errno_and_return_minus_one( errno ); 10755c: e8 33 a3 00 00 call 111894 <__errno> 107561: 89 c6 mov %eax,%esi 107563: e8 2c a3 00 00 call 111894 <__errno> 107568: 8b 00 mov (%eax),%eax 10756a: 89 06 mov %eax,(%esi) 10756c: 83 c8 ff or $0xffffffff,%eax 10756f: eb 44 jmp 1075b5 } /* clone the new root location */ if (rtems_filesystem_evaluate_path(".", 1, 0, &loc, 0)) { 107571: 83 ec 0c sub $0xc,%esp 107574: 6a 00 push $0x0 107576: 8d 75 e4 lea -0x1c(%ebp),%esi 107579: 56 push %esi 10757a: 6a 00 push $0x0 10757c: 6a 01 push $0x1 10757e: 68 3e fc 11 00 push $0x11fc3e 107583: e8 02 01 00 00 call 10768a 107588: 83 c4 20 add $0x20,%esp 10758b: 85 c0 test %eax,%eax 10758d: 75 cd jne 10755c <== 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); 10758f: 83 ec 0c sub $0xc,%esp 107592: a1 6c 30 12 00 mov 0x12306c,%eax 107597: 83 c0 18 add $0x18,%eax 10759a: 50 push %eax 10759b: e8 a8 01 00 00 call 107748 rtems_filesystem_root = loc; 1075a0: 8b 3d 6c 30 12 00 mov 0x12306c,%edi 1075a6: 83 c7 18 add $0x18,%edi 1075a9: b9 05 00 00 00 mov $0x5,%ecx 1075ae: f3 a5 rep movsl %ds:(%esi),%es:(%edi) return 0; 1075b0: 83 c4 10 add $0x10,%esp 1075b3: 31 c0 xor %eax,%eax } 1075b5: 8d 65 f8 lea -0x8(%ebp),%esp 1075b8: 5e pop %esi 1075b9: 5f pop %edi 1075ba: c9 leave 1075bb: c3 ret =============================================================================== 00109f98 : int clock_gettime( clockid_t clock_id, struct timespec *tp ) { 109f98: 55 push %ebp 109f99: 89 e5 mov %esp,%ebp 109f9b: 83 ec 08 sub $0x8,%esp 109f9e: 8b 45 08 mov 0x8(%ebp),%eax 109fa1: 8b 55 0c mov 0xc(%ebp),%edx if ( !tp ) 109fa4: 85 d2 test %edx,%edx 109fa6: 74 3c je 109fe4 rtems_set_errno_and_return_minus_one( EINVAL ); if ( clock_id == CLOCK_REALTIME ) { 109fa8: 83 f8 01 cmp $0x1,%eax 109fab: 75 0b jne 109fb8 _TOD_Get(tp); 109fad: 83 ec 0c sub $0xc,%esp 109fb0: 52 push %edx 109fb1: e8 aa 1b 00 00 call 10bb60 <_TOD_Get> 109fb6: eb 13 jmp 109fcb return 0; } #ifdef CLOCK_MONOTONIC if ( clock_id == CLOCK_MONOTONIC ) { 109fb8: 83 f8 04 cmp $0x4,%eax 109fbb: 74 05 je 109fc2 <== NEVER TAKEN return 0; } #endif #ifdef _POSIX_CPUTIME if ( clock_id == CLOCK_PROCESS_CPUTIME ) { 109fbd: 83 f8 02 cmp $0x2,%eax 109fc0: 75 10 jne 109fd2 _TOD_Get_uptime_as_timespec( tp ); 109fc2: 83 ec 0c sub $0xc,%esp 109fc5: 52 push %edx 109fc6: e8 e9 1b 00 00 call 10bbb4 <_TOD_Get_uptime_as_timespec> return 0; 109fcb: 83 c4 10 add $0x10,%esp 109fce: 31 c0 xor %eax,%eax 109fd0: eb 20 jmp 109ff2 } #endif #ifdef _POSIX_THREAD_CPUTIME if ( clock_id == CLOCK_THREAD_CPUTIME ) 109fd2: 83 f8 03 cmp $0x3,%eax 109fd5: 75 0d jne 109fe4 rtems_set_errno_and_return_minus_one( ENOSYS ); 109fd7: e8 84 7f 00 00 call 111f60 <__errno> 109fdc: c7 00 58 00 00 00 movl $0x58,(%eax) 109fe2: eb 0b jmp 109fef #endif rtems_set_errno_and_return_minus_one( EINVAL ); 109fe4: e8 77 7f 00 00 call 111f60 <__errno> 109fe9: c7 00 16 00 00 00 movl $0x16,(%eax) 109fef: 83 c8 ff or $0xffffffff,%eax return 0; } 109ff2: c9 leave 109ff3: c3 ret =============================================================================== 00109ff4 : int clock_settime( clockid_t clock_id, const struct timespec *tp ) { 109ff4: 55 push %ebp 109ff5: 89 e5 mov %esp,%ebp 109ff7: 83 ec 08 sub $0x8,%esp 109ffa: 8b 45 08 mov 0x8(%ebp),%eax 109ffd: 8b 55 0c mov 0xc(%ebp),%edx if ( !tp ) 10a000: 85 d2 test %edx,%edx 10a002: 74 44 je 10a048 <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); if ( clock_id == CLOCK_REALTIME ) { 10a004: 83 f8 01 cmp $0x1,%eax 10a007: 75 28 jne 10a031 if ( tp->tv_sec < TOD_SECONDS_1970_THROUGH_1988 ) 10a009: 81 3a ff e4 da 21 cmpl $0x21dae4ff,(%edx) 10a00f: 76 37 jbe 10a048 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 10a011: a1 e0 74 12 00 mov 0x1274e0,%eax 10a016: 40 inc %eax 10a017: a3 e0 74 12 00 mov %eax,0x1274e0 rtems_set_errno_and_return_minus_one( EINVAL ); _Thread_Disable_dispatch(); _TOD_Set( tp ); 10a01c: 83 ec 0c sub $0xc,%esp 10a01f: 52 push %edx 10a020: e8 e7 1b 00 00 call 10bc0c <_TOD_Set> _Thread_Enable_dispatch(); 10a025: e8 30 2f 00 00 call 10cf5a <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one( ENOSYS ); #endif else rtems_set_errno_and_return_minus_one( EINVAL ); return 0; 10a02a: 83 c4 10 add $0x10,%esp 10a02d: 31 c0 xor %eax,%eax 10a02f: eb 25 jmp 10a056 _Thread_Disable_dispatch(); _TOD_Set( tp ); _Thread_Enable_dispatch(); } #ifdef _POSIX_CPUTIME else if ( clock_id == CLOCK_PROCESS_CPUTIME ) 10a031: 83 f8 02 cmp $0x2,%eax 10a034: 74 05 je 10a03b rtems_set_errno_and_return_minus_one( ENOSYS ); #endif #ifdef _POSIX_THREAD_CPUTIME else if ( clock_id == CLOCK_THREAD_CPUTIME ) 10a036: 83 f8 03 cmp $0x3,%eax 10a039: 75 0d jne 10a048 rtems_set_errno_and_return_minus_one( ENOSYS ); 10a03b: e8 20 7f 00 00 call 111f60 <__errno> 10a040: c7 00 58 00 00 00 movl $0x58,(%eax) 10a046: eb 0b jmp 10a053 #endif else rtems_set_errno_and_return_minus_one( EINVAL ); 10a048: e8 13 7f 00 00 call 111f60 <__errno> 10a04d: c7 00 16 00 00 00 movl $0x16,(%eax) 10a053: 83 c8 ff or $0xffffffff,%eax return 0; } 10a056: c9 leave 10a057: c3 ret =============================================================================== 0010d460 : const char *pathname, size_t pathnamelen, int flags, rtems_filesystem_location_info_t *pathloc ) { 10d460: 55 push %ebp 10d461: 89 e5 mov %esp,%ebp 10d463: 57 push %edi 10d464: 56 push %esi 10d465: 53 push %ebx 10d466: 83 ec 1c sub $0x1c,%esp 10d469: 8b 4d 0c mov 0xc(%ebp),%ecx 10d46c: 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 ) ) 10d46f: f7 45 10 f8 ff ff ff testl $0xfffffff8,0x10(%ebp) 10d476: 74 0d je 10d485 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EPERM ); 10d478: e8 47 22 00 00 call 10f6c4 <__errno> <== NOT EXECUTED 10d47d: c7 00 01 00 00 00 movl $0x1,(%eax) <== NOT EXECUTED 10d483: eb 77 jmp 10d4fc <== NOT EXECUTED /* get the device name table */ device_name_table = (rtems_device_name_t *)pathloc->node_access; 10d485: 8b 33 mov (%ebx),%esi if (!device_name_table) 10d487: 85 f6 test %esi,%esi 10d489: 74 04 je 10d48f 10d48b: 31 ff xor %edi,%edi 10d48d: eb 5a jmp 10d4e9 rtems_set_errno_and_return_minus_one( EFAULT ); 10d48f: e8 30 22 00 00 call 10f6c4 <__errno> 10d494: c7 00 0e 00 00 00 movl $0xe,(%eax) 10d49a: eb 60 jmp 10d4fc for (i = 0; i < rtems_device_table_size; i++) { if (!device_name_table[i].device_name) 10d49c: 8b 16 mov (%esi),%edx 10d49e: 85 d2 test %edx,%edx 10d4a0: 74 43 je 10d4e5 continue; if (strncmp(pathname, device_name_table[i].device_name, pathnamelen) != 0) 10d4a2: 50 push %eax 10d4a3: 51 push %ecx 10d4a4: 52 push %edx 10d4a5: ff 75 08 pushl 0x8(%ebp) 10d4a8: 89 55 e4 mov %edx,-0x1c(%ebp) 10d4ab: 89 4d e0 mov %ecx,-0x20(%ebp) 10d4ae: e8 f1 2e 00 00 call 1103a4 10d4b3: 83 c4 10 add $0x10,%esp 10d4b6: 85 c0 test %eax,%eax 10d4b8: 8b 55 e4 mov -0x1c(%ebp),%edx 10d4bb: 8b 4d e0 mov -0x20(%ebp),%ecx 10d4be: 75 25 jne 10d4e5 continue; if (device_name_table[i].device_name[pathnamelen] != '\0') 10d4c0: 80 3c 0a 00 cmpb $0x0,(%edx,%ecx,1) 10d4c4: 75 1f jne 10d4e5 <== NEVER TAKEN continue; /* find the device, set proper values */ pathloc->node_access = (void *)&device_name_table[i]; 10d4c6: 89 33 mov %esi,(%ebx) pathloc->handlers = &devFS_file_handlers; 10d4c8: c7 43 08 ac 0f 12 00 movl $0x120fac,0x8(%ebx) pathloc->ops = &devFS_ops; 10d4cf: c7 43 0c 64 0f 12 00 movl $0x120f64,0xc(%ebx) pathloc->mt_entry = rtems_filesystem_root.mt_entry; 10d4d6: a1 00 11 12 00 mov 0x121100,%eax 10d4db: 8b 40 28 mov 0x28(%eax),%eax 10d4de: 89 43 10 mov %eax,0x10(%ebx) return 0; 10d4e1: 31 c0 xor %eax,%eax 10d4e3: eb 1a jmp 10d4ff /* 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++) { 10d4e5: 47 inc %edi 10d4e6: 83 c6 14 add $0x14,%esi 10d4e9: 3b 3d 48 f1 11 00 cmp 0x11f148,%edi 10d4ef: 72 ab jb 10d49c pathloc->mt_entry = rtems_filesystem_root.mt_entry; return 0; } /* no such file or directory */ rtems_set_errno_and_return_minus_one( ENOENT ); 10d4f1: e8 ce 21 00 00 call 10f6c4 <__errno> 10d4f6: c7 00 02 00 00 00 movl $0x2,(%eax) 10d4fc: 83 c8 ff or $0xffffffff,%eax } 10d4ff: 8d 65 f4 lea -0xc(%ebp),%esp 10d502: 5b pop %ebx 10d503: 5e pop %esi 10d504: 5f pop %edi 10d505: c9 leave 10d506: c3 ret =============================================================================== 00106c40 : const char *path, mode_t mode, dev_t dev, rtems_filesystem_location_info_t *pathloc ) { 106c40: 55 push %ebp 106c41: 89 e5 mov %esp,%ebp 106c43: 57 push %edi 106c44: 56 push %esi 106c45: 53 push %ebx 106c46: 83 ec 1c sub $0x1c,%esp 106c49: 8b 7d 08 mov 0x8(%ebp),%edi 106c4c: 8b 4d 10 mov 0x10(%ebp),%ecx 106c4f: 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') && 106c52: 80 3f 64 cmpb $0x64,(%edi) 106c55: 75 18 jne 106c6f 106c57: 80 7f 01 65 cmpb $0x65,0x1(%edi) 106c5b: 75 12 jne 106c6f <== NEVER TAKEN 106c5d: 80 7f 02 76 cmpb $0x76,0x2(%edi) 106c61: 75 0c jne 106c6f <== NEVER TAKEN (path[2] == 'v') && (path[3] == '\0')) return 0; 106c63: 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')) 106c65: 80 7f 03 00 cmpb $0x0,0x3(%edi) 106c69: 0f 84 c9 00 00 00 je 106d38 return 0; /* must be a character device or a block device */ if (!S_ISBLK(mode) && !S_ISCHR(mode)) 106c6f: 8b 45 0c mov 0xc(%ebp),%eax 106c72: 25 00 f0 00 00 and $0xf000,%eax 106c77: 3d 00 20 00 00 cmp $0x2000,%eax 106c7c: 74 14 je 106c92 106c7e: 3d 00 60 00 00 cmp $0x6000,%eax 106c83: 74 0d je 106c92 rtems_set_errno_and_return_minus_one( EINVAL ); 106c85: e8 3a 8a 00 00 call 10f6c4 <__errno> 106c8a: c7 00 16 00 00 00 movl $0x16,(%eax) 106c90: eb 23 jmp 106cb5 ) { union __rtems_dev_t temp; temp.device = device; return temp.__overlay.major; 106c92: 89 4d e4 mov %ecx,-0x1c(%ebp) dev_t device ) { union __rtems_dev_t temp; temp.device = device; 106c95: 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; 106c98: 8b 45 18 mov 0x18(%ebp),%eax 106c9b: 8b 08 mov (%eax),%ecx if (!device_name_table) 106c9d: 85 c9 test %ecx,%ecx 106c9f: 74 09 je 106caa 106ca1: 89 ca mov %ecx,%edx 106ca3: 83 ce ff or $0xffffffff,%esi 106ca6: 31 db xor %ebx,%ebx 106ca8: eb 46 jmp 106cf0 rtems_set_errno_and_return_minus_one( EFAULT ); 106caa: e8 15 8a 00 00 call 10f6c4 <__errno> 106caf: c7 00 0e 00 00 00 movl $0xe,(%eax) 106cb5: 83 c8 ff or $0xffffffff,%eax 106cb8: eb 7e jmp 106d38 for (slot = -1, i = 0; i < rtems_device_table_size; i++){ if (device_name_table[i].device_name == NULL) 106cba: 8b 02 mov (%edx),%eax 106cbc: 85 c0 test %eax,%eax 106cbe: 74 2a je 106cea slot = i; else if (strcmp(path, device_name_table[i].device_name) == 0) 106cc0: 83 ec 08 sub $0x8,%esp 106cc3: 50 push %eax 106cc4: 57 push %edi 106cc5: 89 55 d8 mov %edx,-0x28(%ebp) 106cc8: 89 4d dc mov %ecx,-0x24(%ebp) 106ccb: e8 2c 96 00 00 call 1102fc 106cd0: 83 c4 10 add $0x10,%esp 106cd3: 85 c0 test %eax,%eax 106cd5: 8b 55 d8 mov -0x28(%ebp),%edx 106cd8: 8b 4d dc mov -0x24(%ebp),%ecx 106cdb: 75 0f jne 106cec rtems_set_errno_and_return_minus_one( EEXIST ); 106cdd: e8 e2 89 00 00 call 10f6c4 <__errno> 106ce2: c7 00 11 00 00 00 movl $0x11,(%eax) 106ce8: eb cb jmp 106cb5 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; 106cea: 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++){ 106cec: 43 inc %ebx 106ced: 83 c2 14 add $0x14,%edx 106cf0: 3b 1d 48 f1 11 00 cmp 0x11f148,%ebx 106cf6: 72 c2 jb 106cba else if (strcmp(path, device_name_table[i].device_name) == 0) rtems_set_errno_and_return_minus_one( EEXIST ); } if (slot == -1) 106cf8: 83 fe ff cmp $0xffffffff,%esi 106cfb: 75 0d jne 106d0a rtems_set_errno_and_return_minus_one( ENOMEM ); 106cfd: e8 c2 89 00 00 call 10f6c4 <__errno> 106d02: c7 00 0c 00 00 00 movl $0xc,(%eax) 106d08: eb ab jmp 106cb5 _ISR_Disable(level); 106d0a: 9c pushf 106d0b: fa cli 106d0c: 5b pop %ebx device_name_table[slot].device_name = (char *)path; 106d0d: 6b d6 14 imul $0x14,%esi,%edx 106d10: 8d 14 11 lea (%ecx,%edx,1),%edx 106d13: 89 3a mov %edi,(%edx) device_name_table[slot].device_name_length = strlen(path); 106d15: 31 c0 xor %eax,%eax 106d17: 83 c9 ff or $0xffffffff,%ecx 106d1a: f2 ae repnz scas %es:(%edi),%al 106d1c: f7 d1 not %ecx 106d1e: 49 dec %ecx 106d1f: 89 4a 04 mov %ecx,0x4(%edx) device_name_table[slot].major = major; 106d22: 8b 45 e4 mov -0x1c(%ebp),%eax 106d25: 89 42 08 mov %eax,0x8(%edx) device_name_table[slot].minor = minor; 106d28: 8b 45 e0 mov -0x20(%ebp),%eax 106d2b: 89 42 0c mov %eax,0xc(%edx) device_name_table[slot].mode = mode; 106d2e: 8b 45 0c mov 0xc(%ebp),%eax 106d31: 89 42 10 mov %eax,0x10(%edx) _ISR_Enable(level); 106d34: 53 push %ebx 106d35: 9d popf return 0; 106d36: 31 c0 xor %eax,%eax } 106d38: 8d 65 f4 lea -0xc(%ebp),%esp 106d3b: 5b pop %ebx 106d3c: 5e pop %esi 106d3d: 5f pop %edi 106d3e: c9 leave 106d3f: c3 ret =============================================================================== 00108084 : /* * Drain output queue */ static void drainOutput (struct rtems_termios_tty *tty) { 108084: 55 push %ebp 108085: 89 e5 mov %esp,%ebp 108087: 53 push %ebx 108088: 83 ec 04 sub $0x4,%esp 10808b: 89 c3 mov %eax,%ebx rtems_interrupt_level level; rtems_status_code sc; if (tty->device.outputUsesInterrupts != TERMIOS_POLLED) { 10808d: 83 b8 b4 00 00 00 00 cmpl $0x0,0xb4(%eax) 108094: 74 46 je 1080dc rtems_interrupt_disable (level); 108096: 9c pushf 108097: fa cli 108098: 58 pop %eax while (tty->rawOutBuf.Tail != tty->rawOutBuf.Head) { 108099: eb 2f jmp 1080ca tty->rawOutBufState = rob_wait; 10809b: c7 83 94 00 00 00 02 movl $0x2,0x94(%ebx) 1080a2: 00 00 00 rtems_interrupt_enable (level); 1080a5: 50 push %eax 1080a6: 9d popf sc = rtems_semaphore_obtain( 1080a7: 50 push %eax 1080a8: 6a 00 push $0x0 1080aa: 6a 00 push $0x0 1080ac: ff b3 8c 00 00 00 pushl 0x8c(%ebx) 1080b2: e8 b1 20 00 00 call 10a168 tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) 1080b7: 83 c4 10 add $0x10,%esp 1080ba: 85 c0 test %eax,%eax 1080bc: 74 09 je 1080c7 <== ALWAYS TAKEN rtems_fatal_error_occurred (sc); 1080be: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 1080c1: 50 push %eax <== NOT EXECUTED 1080c2: e8 6d 26 00 00 call 10a734 <== NOT EXECUTED rtems_interrupt_disable (level); 1080c7: 9c pushf 1080c8: fa cli 1080c9: 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) { 1080ca: 8b 8b 84 00 00 00 mov 0x84(%ebx),%ecx 1080d0: 8b 93 80 00 00 00 mov 0x80(%ebx),%edx 1080d6: 39 d1 cmp %edx,%ecx 1080d8: 75 c1 jne 10809b 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); 1080da: 50 push %eax 1080db: 9d popf } } 1080dc: 8b 5d fc mov -0x4(%ebp),%ebx 1080df: c9 leave 1080e0: c3 ret =============================================================================== 00108c3b : /* * Echo a typed character */ static void echo (unsigned char c, struct rtems_termios_tty *tty) { 108c3b: 55 push %ebp 108c3c: 89 e5 mov %esp,%ebp 108c3e: 53 push %ebx 108c3f: 83 ec 24 sub $0x24,%esp if ((tty->termios.c_lflag & ECHOCTL) && 108c42: f6 42 3d 02 testb $0x2,0x3d(%edx) 108c46: 74 3e je 108c86 <== NEVER TAKEN iscntrl(c) && (c != '\t') && (c != '\n')) { 108c48: 0f b6 c8 movzbl %al,%ecx 108c4b: 8b 1d 3c 31 12 00 mov 0x12313c,%ebx 108c51: f6 44 0b 01 20 testb $0x20,0x1(%ebx,%ecx,1) 108c56: 74 2e je 108c86 108c58: 3c 09 cmp $0x9,%al 108c5a: 74 2a je 108c86 108c5c: 3c 0a cmp $0xa,%al 108c5e: 74 26 je 108c86 char echobuf[2]; echobuf[0] = '^'; 108c60: c6 45 f6 5e movb $0x5e,-0xa(%ebp) echobuf[1] = c ^ 0x40; 108c64: 83 f0 40 xor $0x40,%eax 108c67: 88 45 f7 mov %al,-0x9(%ebp) rtems_termios_puts (echobuf, 2, tty); 108c6a: 50 push %eax 108c6b: 52 push %edx 108c6c: 6a 02 push $0x2 108c6e: 8d 45 f6 lea -0xa(%ebp),%eax 108c71: 50 push %eax 108c72: 89 55 e4 mov %edx,-0x1c(%ebp) 108c75: e8 84 fd ff ff call 1089fe tty->column += 2; 108c7a: 8b 55 e4 mov -0x1c(%ebp),%edx 108c7d: 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')) { 108c81: 83 c4 10 add $0x10,%esp 108c84: eb 08 jmp 108c8e echobuf[0] = '^'; echobuf[1] = c ^ 0x40; rtems_termios_puts (echobuf, 2, tty); tty->column += 2; } else { oproc (c, tty); 108c86: 0f b6 c0 movzbl %al,%eax 108c89: e8 90 fe ff ff call 108b1e } } 108c8e: 8b 5d fc mov -0x4(%ebp),%ebx 108c91: c9 leave 108c92: c3 ret =============================================================================== 0010811e : void endgrent(void) { 10811e: 55 push %ebp 10811f: 89 e5 mov %esp,%ebp 108121: 83 ec 08 sub $0x8,%esp if (group_fp != NULL) 108124: a1 f8 6a 12 00 mov 0x126af8,%eax 108129: 85 c0 test %eax,%eax 10812b: 74 0c je 108139 <== NEVER TAKEN fclose(group_fp); 10812d: 83 ec 0c sub $0xc,%esp 108130: 50 push %eax 108131: e8 6e 9e 00 00 call 111fa4 108136: 83 c4 10 add $0x10,%esp } 108139: c9 leave 10813a: c3 ret =============================================================================== 00107fd1 : void endpwent(void) { 107fd1: 55 push %ebp 107fd2: 89 e5 mov %esp,%ebp 107fd4: 83 ec 08 sub $0x8,%esp if (passwd_fp != NULL) 107fd7: a1 d4 6b 12 00 mov 0x126bd4,%eax 107fdc: 85 c0 test %eax,%eax 107fde: 74 0c je 107fec <== NEVER TAKEN fclose(passwd_fp); 107fe0: 83 ec 0c sub $0xc,%esp 107fe3: 50 push %eax 107fe4: e8 bb 9f 00 00 call 111fa4 107fe9: 83 c4 10 add $0x10,%esp } 107fec: c9 leave 107fed: c3 ret =============================================================================== 00108c93 : * 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) { 108c93: 55 push %ebp 108c94: 89 e5 mov %esp,%ebp 108c96: 57 push %edi 108c97: 56 push %esi 108c98: 53 push %ebx 108c99: 83 ec 2c sub $0x2c,%esp 108c9c: 89 c3 mov %eax,%ebx 108c9e: 89 55 e4 mov %edx,-0x1c(%ebp) if (tty->ccount == 0) 108ca1: 83 78 20 00 cmpl $0x0,0x20(%eax) 108ca5: 0f 84 59 01 00 00 je 108e04 return; if (lineFlag) { 108cab: 85 d2 test %edx,%edx 108cad: 0f 84 46 01 00 00 je 108df9 if (!(tty->termios.c_lflag & ECHO)) { 108cb3: 8b 40 3c mov 0x3c(%eax),%eax 108cb6: a8 08 test $0x8,%al 108cb8: 75 0c jne 108cc6 <== ALWAYS TAKEN tty->ccount = 0; 108cba: c7 43 20 00 00 00 00 movl $0x0,0x20(%ebx) <== NOT EXECUTED return; 108cc1: e9 3e 01 00 00 jmp 108e04 <== NOT EXECUTED } if (!(tty->termios.c_lflag & ECHOE)) { 108cc6: a8 10 test $0x10,%al 108cc8: 0f 85 2b 01 00 00 jne 108df9 <== ALWAYS TAKEN tty->ccount = 0; 108cce: c7 43 20 00 00 00 00 movl $0x0,0x20(%ebx) <== NOT EXECUTED echo (tty->termios.c_cc[VKILL], tty); 108cd5: 0f b6 43 44 movzbl 0x44(%ebx),%eax <== NOT EXECUTED 108cd9: 89 da mov %ebx,%edx <== NOT EXECUTED 108cdb: e8 5b ff ff ff call 108c3b <== NOT EXECUTED if (tty->termios.c_lflag & ECHOK) 108ce0: f6 43 3c 20 testb $0x20,0x3c(%ebx) <== NOT EXECUTED 108ce4: 0f 84 1a 01 00 00 je 108e04 <== NOT EXECUTED echo ('\n', tty); 108cea: 89 da mov %ebx,%edx <== NOT EXECUTED 108cec: b8 0a 00 00 00 mov $0xa,%eax <== NOT EXECUTED 108cf1: eb 2a jmp 108d1d <== NOT EXECUTED return; } } while (tty->ccount) { unsigned char c = tty->cbuf[--tty->ccount]; 108cf3: 8b 7b 1c mov 0x1c(%ebx),%edi 108cf6: 8d 50 ff lea -0x1(%eax),%edx 108cf9: 89 53 20 mov %edx,0x20(%ebx) 108cfc: 8a 4c 07 ff mov -0x1(%edi,%eax,1),%cl if (tty->termios.c_lflag & ECHO) { 108d00: 8b 53 3c mov 0x3c(%ebx),%edx 108d03: f6 c2 08 test $0x8,%dl 108d06: 0f 84 e7 00 00 00 je 108df3 <== NEVER TAKEN if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) { 108d0c: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) 108d10: 75 17 jne 108d29 108d12: f6 c2 10 test $0x10,%dl 108d15: 75 12 jne 108d29 <== ALWAYS TAKEN echo (tty->termios.c_cc[VERASE], tty); 108d17: 0f b6 43 43 movzbl 0x43(%ebx),%eax <== NOT EXECUTED 108d1b: 89 da mov %ebx,%edx <== NOT EXECUTED } } if (!lineFlag) break; } } 108d1d: 8d 65 f4 lea -0xc(%ebp),%esp <== NOT EXECUTED 108d20: 5b pop %ebx <== NOT EXECUTED 108d21: 5e pop %esi <== NOT EXECUTED 108d22: 5f pop %edi <== NOT EXECUTED 108d23: 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); 108d24: e9 12 ff ff ff jmp 108c3b <== NOT EXECUTED } else if (c == '\t') { 108d29: 80 f9 09 cmp $0x9,%cl 108d2c: 8b 35 3c 31 12 00 mov 0x12313c,%esi 108d32: 89 75 e0 mov %esi,-0x20(%ebp) 108d35: 75 60 jne 108d97 int col = tty->read_start_column; 108d37: 8b 73 2c mov 0x2c(%ebx),%esi int i = 0; /* * Find the character before the tab */ while (i != tty->ccount) { 108d3a: 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) 108d3f: 81 e2 00 02 00 00 and $0x200,%edx 108d45: 89 55 dc mov %edx,-0x24(%ebp) 108d48: 89 45 d4 mov %eax,-0x2c(%ebp) int i = 0; /* * Find the character before the tab */ while (i != tty->ccount) { 108d4b: eb 28 jmp 108d75 c = tty->cbuf[i++]; 108d4d: 8a 54 0f ff mov -0x1(%edi,%ecx,1),%dl if (c == '\t') { 108d51: 80 fa 09 cmp $0x9,%dl 108d54: 75 05 jne 108d5b col = (col | 7) + 1; 108d56: 83 ce 07 or $0x7,%esi 108d59: eb 18 jmp 108d73 } else if (iscntrl (c)) { 108d5b: 0f b6 d2 movzbl %dl,%edx 108d5e: 8b 45 e0 mov -0x20(%ebp),%eax 108d61: f6 44 10 01 20 testb $0x20,0x1(%eax,%edx,1) 108d66: 74 0b je 108d73 <== ALWAYS TAKEN if (tty->termios.c_lflag & ECHOCTL) 108d68: 83 7d dc 00 cmpl $0x0,-0x24(%ebp) <== NOT EXECUTED 108d6c: 74 06 je 108d74 <== NOT EXECUTED col += 2; 108d6e: 83 c6 02 add $0x2,%esi <== NOT EXECUTED 108d71: eb 01 jmp 108d74 <== NOT EXECUTED } else { col++; 108d73: 46 inc %esi 108d74: 41 inc %ecx int i = 0; /* * Find the character before the tab */ while (i != tty->ccount) { 108d75: 3b 4d d4 cmp -0x2c(%ebp),%ecx 108d78: 75 d3 jne 108d4d 108d7a: eb 14 jmp 108d90 /* * Back up over the tab */ while (tty->column > col) { rtems_termios_puts ("\b", 1, tty); 108d7c: 57 push %edi 108d7d: 53 push %ebx 108d7e: 6a 01 push $0x1 108d80: 68 bc ef 11 00 push $0x11efbc 108d85: e8 74 fc ff ff call 1089fe tty->column--; 108d8a: ff 4b 28 decl 0x28(%ebx) 108d8d: 83 c4 10 add $0x10,%esp } /* * Back up over the tab */ while (tty->column > col) { 108d90: 39 73 28 cmp %esi,0x28(%ebx) 108d93: 7f e7 jg 108d7c 108d95: eb 5c jmp 108df3 rtems_termios_puts ("\b", 1, tty); tty->column--; } } else { if (iscntrl (c) && (tty->termios.c_lflag & ECHOCTL)) { 108d97: 0f b6 f1 movzbl %cl,%esi 108d9a: 8b 45 e0 mov -0x20(%ebp),%eax 108d9d: f6 44 30 01 20 testb $0x20,0x1(%eax,%esi,1) 108da2: 74 21 je 108dc5 <== ALWAYS TAKEN 108da4: 80 e6 02 and $0x2,%dh <== NOT EXECUTED 108da7: 74 1c je 108dc5 <== NOT EXECUTED rtems_termios_puts ("\b \b", 3, tty); 108da9: 51 push %ecx <== NOT EXECUTED 108daa: 53 push %ebx <== NOT EXECUTED 108dab: 6a 03 push $0x3 <== NOT EXECUTED 108dad: 68 ba ef 11 00 push $0x11efba <== NOT EXECUTED 108db2: e8 47 fc ff ff call 1089fe <== NOT EXECUTED if (tty->column) 108db7: 8b 43 28 mov 0x28(%ebx),%eax <== NOT EXECUTED 108dba: 83 c4 10 add $0x10,%esp <== NOT EXECUTED 108dbd: 85 c0 test %eax,%eax <== NOT EXECUTED 108dbf: 74 04 je 108dc5 <== NOT EXECUTED tty->column--; 108dc1: 48 dec %eax <== NOT EXECUTED 108dc2: 89 43 28 mov %eax,0x28(%ebx) <== NOT EXECUTED } if (!iscntrl (c) || (tty->termios.c_lflag & ECHOCTL)) { 108dc5: a1 3c 31 12 00 mov 0x12313c,%eax 108dca: f6 44 30 01 20 testb $0x20,0x1(%eax,%esi,1) 108dcf: 74 06 je 108dd7 <== ALWAYS TAKEN 108dd1: f6 43 3d 02 testb $0x2,0x3d(%ebx) <== NOT EXECUTED 108dd5: 74 1c je 108df3 <== NOT EXECUTED rtems_termios_puts ("\b \b", 3, tty); 108dd7: 52 push %edx 108dd8: 53 push %ebx 108dd9: 6a 03 push $0x3 108ddb: 68 ba ef 11 00 push $0x11efba 108de0: e8 19 fc ff ff call 1089fe if (tty->column) 108de5: 8b 43 28 mov 0x28(%ebx),%eax 108de8: 83 c4 10 add $0x10,%esp 108deb: 85 c0 test %eax,%eax 108ded: 74 04 je 108df3 <== NEVER TAKEN tty->column--; 108def: 48 dec %eax 108df0: 89 43 28 mov %eax,0x28(%ebx) } } } if (!lineFlag) 108df3: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) 108df7: 74 0b je 108e04 echo ('\n', tty); return; } } while (tty->ccount) { 108df9: 8b 43 20 mov 0x20(%ebx),%eax 108dfc: 85 c0 test %eax,%eax 108dfe: 0f 85 ef fe ff ff jne 108cf3 } } if (!lineFlag) break; } } 108e04: 8d 65 f4 lea -0xc(%ebp),%esp 108e07: 5b pop %ebx 108e08: 5e pop %esi 108e09: 5f pop %edi 108e0a: c9 leave 108e0b: c3 ret =============================================================================== 00107bd8 : int fcntl( int fd, int cmd, ... ) { 107bd8: 55 push %ebp 107bd9: 89 e5 mov %esp,%ebp 107bdb: 57 push %edi 107bdc: 56 push %esi 107bdd: 53 push %ebx 107bde: 83 ec 0c sub $0xc,%esp 107be1: 8b 5d 08 mov 0x8(%ebp),%ebx int ret; va_list ap; va_start( ap, cmd ); 107be4: 8d 75 10 lea 0x10(%ebp),%esi int fd2; int flags; int mask; int ret = 0; rtems_libio_check_fd( fd ); 107be7: 8b 0d 44 21 12 00 mov 0x122144,%ecx 107bed: 39 cb cmp %ecx,%ebx 107bef: 73 14 jae 107c05 iop = rtems_libio_iop( fd ); 107bf1: 8b 15 f8 61 12 00 mov 0x1261f8,%edx 107bf7: 6b db 38 imul $0x38,%ebx,%ebx 107bfa: 8d 1c 1a lea (%edx,%ebx,1),%ebx rtems_libio_check_is_open(iop); 107bfd: 8b 43 14 mov 0x14(%ebx),%eax 107c00: f6 c4 01 test $0x1,%ah 107c03: 75 10 jne 107c15 107c05: e8 1a a3 00 00 call 111f24 <__errno> 107c0a: c7 00 09 00 00 00 movl $0x9,(%eax) 107c10: e9 e6 00 00 00 jmp 107cfb /* * This switch should contain all the cases from POSIX. */ switch ( cmd ) { 107c15: 83 7d 0c 09 cmpl $0x9,0xc(%ebp) 107c19: 0f 87 af 00 00 00 ja 107cce 107c1f: 8b 7d 0c mov 0xc(%ebp),%edi 107c22: ff 24 bd e8 07 12 00 jmp *0x1207e8(,%edi,4) case F_DUPFD: /* dup */ fd2 = va_arg( ap, int ); 107c29: 8b 36 mov (%esi),%esi if ( fd2 ) 107c2b: 85 f6 test %esi,%esi 107c2d: 74 0e je 107c3d diop = rtems_libio_iop( fd2 ); 107c2f: 31 c0 xor %eax,%eax 107c31: 39 ce cmp %ecx,%esi 107c33: 73 15 jae 107c4a <== NEVER TAKEN 107c35: 6b c6 38 imul $0x38,%esi,%eax 107c38: 8d 04 02 lea (%edx,%eax,1),%eax 107c3b: eb 0d jmp 107c4a else { /* allocate a file control block */ diop = rtems_libio_allocate(); 107c3d: e8 d1 04 00 00 call 108113 if ( diop == 0 ) { 107c42: 85 c0 test %eax,%eax 107c44: 0f 84 b1 00 00 00 je 107cfb <== NEVER TAKEN ret = -1; break; } } diop->flags = iop->flags; 107c4a: 8b 53 14 mov 0x14(%ebx),%edx 107c4d: 89 50 14 mov %edx,0x14(%eax) diop->pathinfo = iop->pathinfo; 107c50: 8d 78 18 lea 0x18(%eax),%edi 107c53: 8d 73 18 lea 0x18(%ebx),%esi 107c56: b9 05 00 00 00 mov $0x5,%ecx 107c5b: f3 a5 rep movsl %ds:(%esi),%es:(%edi) ret = (int) (diop - rtems_libio_iops); 107c5d: 2b 05 f8 61 12 00 sub 0x1261f8,%eax 107c63: c1 f8 03 sar $0x3,%eax 107c66: 69 f0 b7 6d db b6 imul $0xb6db6db7,%eax,%esi 107c6c: eb 6d jmp 107cdb break; case F_GETFD: /* get f_flags */ ret = ((iop->flags & LIBIO_FLAGS_CLOSE_ON_EXEC) != 0); 107c6e: f6 c4 08 test $0x8,%ah 107c71: 0f 95 c0 setne %al 107c74: 0f b6 c0 movzbl %al,%eax 107c77: 89 c6 mov %eax,%esi 107c79: eb 64 jmp 107cdf * 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 ) ) 107c7b: 83 3e 00 cmpl $0x0,(%esi) 107c7e: 74 05 je 107c85 iop->flags |= LIBIO_FLAGS_CLOSE_ON_EXEC; 107c80: 80 cc 08 or $0x8,%ah 107c83: eb 03 jmp 107c88 else iop->flags &= ~LIBIO_FLAGS_CLOSE_ON_EXEC; 107c85: 80 e4 f7 and $0xf7,%ah 107c88: 89 43 14 mov %eax,0x14(%ebx) 107c8b: eb 30 jmp 107cbd break; case F_GETFL: /* more flags (cloexec) */ ret = rtems_libio_to_fcntl_flags( iop->flags ); 107c8d: 83 ec 0c sub $0xc,%esp 107c90: 50 push %eax 107c91: e8 3f 04 00 00 call 1080d5 107c96: 89 c6 mov %eax,%esi 107c98: 83 c4 10 add $0x10,%esp 107c9b: eb 3e jmp 107cdb break; case F_SETFL: flags = rtems_libio_fcntl_flags( va_arg( ap, int ) ); 107c9d: 83 ec 0c sub $0xc,%esp 107ca0: ff 36 pushl (%esi) 107ca2: e8 f9 03 00 00 call 1080a0 /* * XXX If we are turning on append, should we seek to the end? */ iop->flags = (iop->flags & ~mask) | (flags & mask); 107ca7: 25 01 02 00 00 and $0x201,%eax 107cac: 8b 53 14 mov 0x14(%ebx),%edx 107caf: 81 e2 fe fd ff ff and $0xfffffdfe,%edx 107cb5: 09 d0 or %edx,%eax 107cb7: 89 43 14 mov %eax,0x14(%ebx) 107cba: 83 c4 10 add $0x10,%esp rtems_libio_t *iop; rtems_libio_t *diop; int fd2; int flags; int mask; int ret = 0; 107cbd: 31 f6 xor %esi,%esi 107cbf: eb 1e jmp 107cdf errno = ENOTSUP; ret = -1; break; case F_GETOWN: /* for sockets. */ errno = ENOTSUP; 107cc1: e8 5e a2 00 00 call 111f24 <__errno> 107cc6: c7 00 86 00 00 00 movl $0x86,(%eax) 107ccc: eb 2d jmp 107cfb ret = -1; break; default: errno = EINVAL; 107cce: e8 51 a2 00 00 call 111f24 <__errno> 107cd3: c7 00 16 00 00 00 movl $0x16,(%eax) 107cd9: eb 20 jmp 107cfb /* * If we got this far successfully, then we give the optional * filesystem specific handler a chance to process this. */ if (ret >= 0) { 107cdb: 85 f6 test %esi,%esi 107cdd: 78 1f js 107cfe <== NEVER TAKEN int err = (*iop->pathinfo.handlers->fcntl_h)( cmd, iop ); 107cdf: 50 push %eax 107ce0: 50 push %eax 107ce1: 8b 43 20 mov 0x20(%ebx),%eax 107ce4: 53 push %ebx 107ce5: ff 75 0c pushl 0xc(%ebp) 107ce8: ff 50 30 call *0x30(%eax) 107ceb: 89 c3 mov %eax,%ebx if (err) { 107ced: 83 c4 10 add $0x10,%esp 107cf0: 85 c0 test %eax,%eax 107cf2: 74 0a je 107cfe <== ALWAYS TAKEN errno = err; 107cf4: e8 2b a2 00 00 call 111f24 <__errno> <== NOT EXECUTED 107cf9: 89 18 mov %ebx,(%eax) <== NOT EXECUTED ret = -1; 107cfb: 83 ce ff or $0xffffffff,%esi va_list ap; va_start( ap, cmd ); ret = vfcntl(fd,cmd,ap); va_end(ap); return ret; } 107cfe: 89 f0 mov %esi,%eax 107d00: 8d 65 f4 lea -0xc(%ebp),%esp 107d03: 5b pop %ebx 107d04: 5e pop %esi 107d05: 5f pop %edi 107d06: c9 leave 107d07: c3 ret =============================================================================== 0010fb23 : */ int fifo_open( pipe_control_t **pipep, rtems_libio_t *iop ) { 10fb23: 55 push %ebp 10fb24: 89 e5 mov %esp,%ebp 10fb26: 57 push %edi 10fb27: 56 push %esi 10fb28: 53 push %ebx 10fb29: 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) { 10fb2c: 83 3d 20 70 12 00 00 cmpl $0x0,0x127020 10fb33: 75 50 jne 10fb85 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 ); 10fb35: 53 push %ebx 10fb36: 6a 00 push $0x0 10fb38: 6a 00 push $0x0 10fb3a: ff 35 20 72 12 00 pushl 0x127220 10fb40: e8 c7 c0 ff ff call 10bc0c rtems_libio_lock(); if (pipe_semaphore == RTEMS_ID_NONE) { 10fb45: 83 c4 10 add $0x10,%esp free(pipe); } static rtems_status_code pipe_lock(void) { rtems_status_code sc = RTEMS_SUCCESSFUL; 10fb48: 31 db xor %ebx,%ebx if (pipe_semaphore == RTEMS_ID_NONE) { rtems_libio_lock(); if (pipe_semaphore == RTEMS_ID_NONE) { 10fb4a: 83 3d 20 70 12 00 00 cmpl $0x0,0x127020 10fb51: 75 1d jne 10fb70 <== NEVER TAKEN sc = rtems_semaphore_create( 10fb53: 83 ec 0c sub $0xc,%esp 10fb56: 68 20 70 12 00 push $0x127020 10fb5b: 6a 00 push $0x0 10fb5d: 6a 54 push $0x54 10fb5f: 6a 01 push $0x1 10fb61: 68 45 50 49 50 push $0x50495045 10fb66: e8 79 be ff ff call 10b9e4 10fb6b: 89 c3 mov %eax,%ebx 10fb6d: 83 c4 20 add $0x20,%esp } static inline void rtems_libio_unlock( void ) { rtems_semaphore_release( rtems_libio_semaphore ); 10fb70: 83 ec 0c sub $0xc,%esp 10fb73: ff 35 20 72 12 00 pushl 0x127220 10fb79: e8 7a c1 ff ff call 10bcf8 } rtems_libio_unlock(); } if (sc == RTEMS_SUCCESSFUL) { 10fb7e: 83 c4 10 add $0x10,%esp 10fb81: 85 db test %ebx,%ebx 10fb83: 75 19 jne 10fb9e sc = rtems_semaphore_obtain(pipe_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 10fb85: 51 push %ecx 10fb86: 6a 00 push $0x0 10fb88: 6a 00 push $0x0 10fb8a: ff 35 20 70 12 00 pushl 0x127020 10fb90: e8 77 c0 ff ff call 10bc0c } if (sc == RTEMS_SUCCESSFUL) { 10fb95: 83 c4 10 add $0x10,%esp return 0; 10fb98: 31 f6 xor %esi,%esi if (sc == RTEMS_SUCCESSFUL) { sc = rtems_semaphore_obtain(pipe_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT); } if (sc == RTEMS_SUCCESSFUL) { 10fb9a: 85 c0 test %eax,%eax 10fb9c: 74 05 je 10fba3 <== ALWAYS TAKEN return 0; } else { return -ENOMEM; 10fb9e: be f4 ff ff ff mov $0xfffffff4,%esi { pipe_control_t *pipe; int err = 0; err = pipe_lock(); if (err) 10fba3: 85 f6 test %esi,%esi 10fba5: 0f 85 37 03 00 00 jne 10fee2 return err; pipe = *pipep; 10fbab: 8b 45 08 mov 0x8(%ebp),%eax 10fbae: 8b 18 mov (%eax),%ebx if (pipe == NULL) { 10fbb0: 85 db test %ebx,%ebx 10fbb2: 0f 85 56 01 00 00 jne 10fd0e { static char c = 'a'; pipe_control_t *pipe; int err = -ENOMEM; pipe = malloc(sizeof(pipe_control_t)); 10fbb8: 83 ec 0c sub $0xc,%esp 10fbbb: 6a 34 push $0x34 10fbbd: e8 ee 93 ff ff call 108fb0 10fbc2: 89 c3 mov %eax,%ebx 10fbc4: 89 45 d4 mov %eax,-0x2c(%ebp) if (pipe == NULL) 10fbc7: 83 c4 10 add $0x10,%esp 10fbca: 85 c0 test %eax,%eax 10fbcc: 0f 84 35 01 00 00 je 10fd07 return err; memset(pipe, 0, sizeof(pipe_control_t)); 10fbd2: b9 0d 00 00 00 mov $0xd,%ecx 10fbd7: 89 c7 mov %eax,%edi 10fbd9: 89 f0 mov %esi,%eax 10fbdb: f3 ab rep stos %eax,%es:(%edi) pipe->Size = PIPE_BUF; 10fbdd: c7 43 04 00 02 00 00 movl $0x200,0x4(%ebx) pipe->Buffer = malloc(pipe->Size); 10fbe4: 83 ec 0c sub $0xc,%esp 10fbe7: 68 00 02 00 00 push $0x200 10fbec: e8 bf 93 ff ff call 108fb0 10fbf1: 89 03 mov %eax,(%ebx) if (! pipe->Buffer) 10fbf3: 83 c4 10 add $0x10,%esp 10fbf6: 85 c0 test %eax,%eax 10fbf8: 0f 84 fb 00 00 00 je 10fcf9 <== NEVER TAKEN goto err_buf; err = -ENOMEM; if (rtems_barrier_create( 10fbfe: 8d 43 2c lea 0x2c(%ebx),%eax 10fc01: 50 push %eax 10fc02: 6a 00 push $0x0 10fc04: 6a 00 push $0x0 rtems_build_name ('P', 'I', 'r', c), 10fc06: 0f be 05 a8 50 12 00 movsbl 0x1250a8,%eax if (! pipe->Buffer) goto err_buf; err = -ENOMEM; if (rtems_barrier_create( 10fc0d: 0d 00 72 49 50 or $0x50497200,%eax 10fc12: 50 push %eax 10fc13: e8 40 18 00 00 call 111458 10fc18: 83 c4 10 add $0x10,%esp 10fc1b: 85 c0 test %eax,%eax 10fc1d: 0f 85 c6 00 00 00 jne 10fce9 rtems_build_name ('P', 'I', 'r', c), RTEMS_BARRIER_MANUAL_RELEASE, 0, &pipe->readBarrier) != RTEMS_SUCCESSFUL) goto err_rbar; if (rtems_barrier_create( 10fc23: 8d 43 30 lea 0x30(%ebx),%eax 10fc26: 50 push %eax 10fc27: 6a 00 push $0x0 10fc29: 6a 00 push $0x0 rtems_build_name ('P', 'I', 'w', c), 10fc2b: 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( 10fc32: 0d 00 77 49 50 or $0x50497700,%eax 10fc37: 50 push %eax 10fc38: e8 1b 18 00 00 call 111458 10fc3d: 83 c4 10 add $0x10,%esp 10fc40: 85 c0 test %eax,%eax 10fc42: 0f 85 90 00 00 00 jne 10fcd8 rtems_build_name ('P', 'I', 'w', c), RTEMS_BARRIER_MANUAL_RELEASE, 0, &pipe->writeBarrier) != RTEMS_SUCCESSFUL) goto err_wbar; if (rtems_semaphore_create( 10fc48: 83 ec 0c sub $0xc,%esp 10fc4b: 8d 43 28 lea 0x28(%ebx),%eax 10fc4e: 50 push %eax 10fc4f: 6a 00 push $0x0 10fc51: 6a 10 push $0x10 10fc53: 6a 01 push $0x1 rtems_build_name ('P', 'I', 's', c), 1, 10fc55: 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( 10fc5c: 0d 00 73 49 50 or $0x50497300,%eax 10fc61: 50 push %eax 10fc62: e8 7d bd ff ff call 10b9e4 10fc67: 83 c4 20 add $0x20,%esp 10fc6a: 85 c0 test %eax,%eax 10fc6c: 75 59 jne 10fcc7 Objects_Id id, Objects_Locations *location ) { return (Barrier_Control *) _Objects_Get( &_Barrier_Information, id, location ); 10fc6e: 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 10fc6f: 8d 7d e0 lea -0x20(%ebp),%edi 10fc72: 57 push %edi 10fc73: ff 73 2c pushl 0x2c(%ebx) 10fc76: 68 5c 7c 12 00 push $0x127c5c 10fc7b: e8 d4 d4 ff ff call 10d154 <_Objects_Get> |= STATES_INTERRUPTIBLE_BY_SIGNAL; 10fc80: 81 48 4c 00 00 00 10 orl $0x10000000,0x4c(%eax) _Thread_Enable_dispatch(); 10fc87: e8 9e df ff ff call 10dc2a <_Thread_Enable_dispatch> 10fc8c: 83 c4 0c add $0xc,%esp 10fc8f: 57 push %edi 10fc90: ff 73 30 pushl 0x30(%ebx) 10fc93: 68 5c 7c 12 00 push $0x127c5c 10fc98: e8 b7 d4 ff ff call 10d154 <_Objects_Get> _Barrier_Get(pipe->writeBarrier, &location)->Barrier.Wait_queue.state |= STATES_INTERRUPTIBLE_BY_SIGNAL; 10fc9d: 81 48 4c 00 00 00 10 orl $0x10000000,0x4c(%eax) _Thread_Enable_dispatch(); 10fca4: e8 81 df ff ff call 10dc2a <_Thread_Enable_dispatch> #ifdef RTEMS_POSIX_API pipe_interruptible(pipe); #endif *pipep = pipe; if (c ++ == 'z') 10fca9: a0 a8 50 12 00 mov 0x1250a8,%al 10fcae: 8d 50 01 lea 0x1(%eax),%edx 10fcb1: 88 15 a8 50 12 00 mov %dl,0x1250a8 10fcb7: 83 c4 10 add $0x10,%esp 10fcba: 3c 7a cmp $0x7a,%al 10fcbc: 75 50 jne 10fd0e c = 'a'; 10fcbe: c6 05 a8 50 12 00 61 movb $0x61,0x1250a8 10fcc5: eb 47 jmp 10fd0e return 0; err_sem: rtems_barrier_delete(pipe->writeBarrier); 10fcc7: 83 ec 0c sub $0xc,%esp 10fcca: 8b 55 d4 mov -0x2c(%ebp),%edx 10fccd: ff 72 30 pushl 0x30(%edx) 10fcd0: e8 3b 18 00 00 call 111510 10fcd5: 83 c4 10 add $0x10,%esp err_wbar: rtems_barrier_delete(pipe->readBarrier); 10fcd8: 83 ec 0c sub $0xc,%esp 10fcdb: 8b 45 d4 mov -0x2c(%ebp),%eax 10fcde: ff 70 2c pushl 0x2c(%eax) 10fce1: e8 2a 18 00 00 call 111510 10fce6: 83 c4 10 add $0x10,%esp err_rbar: free(pipe->Buffer); 10fce9: 83 ec 0c sub $0xc,%esp 10fcec: 8b 55 d4 mov -0x2c(%ebp),%edx 10fcef: ff 32 pushl (%edx) 10fcf1: e8 96 8c ff ff call 10898c 10fcf6: 83 c4 10 add $0x10,%esp err_buf: free(pipe); 10fcf9: 83 ec 0c sub $0xc,%esp 10fcfc: ff 75 d4 pushl -0x2c(%ebp) 10fcff: e8 88 8c ff ff call 10898c 10fd04: 83 c4 10 add $0x10,%esp if (err) goto out; } if (! PIPE_LOCK(pipe)) err = -EINTR; 10fd07: be f4 ff ff ff mov $0xfffffff4,%esi 10fd0c: eb 33 jmp 10fd41 err = pipe_alloc(&pipe); if (err) goto out; } if (! PIPE_LOCK(pipe)) 10fd0e: 50 push %eax 10fd0f: 6a 00 push $0x0 10fd11: 6a 00 push $0x0 10fd13: ff 73 28 pushl 0x28(%ebx) 10fd16: e8 f1 be ff ff call 10bc0c 10fd1b: 83 c4 10 add $0x10,%esp 10fd1e: 85 c0 test %eax,%eax 10fd20: 74 05 je 10fd27 <== ALWAYS TAKEN err = -EINTR; 10fd22: be fc ff ff ff mov $0xfffffffc,%esi <== NOT EXECUTED if (*pipep == NULL) { 10fd27: 8b 45 08 mov 0x8(%ebp),%eax 10fd2a: 83 38 00 cmpl $0x0,(%eax) 10fd2d: 75 12 jne 10fd41 if (err) 10fd2f: 85 f6 test %esi,%esi 10fd31: 74 09 je 10fd3c <== ALWAYS TAKEN pipe_free(pipe); 10fd33: 89 d8 mov %ebx,%eax <== NOT EXECUTED 10fd35: e8 1c fd ff ff call 10fa56 <== NOT EXECUTED 10fd3a: eb 05 jmp 10fd41 <== NOT EXECUTED else *pipep = pipe; 10fd3c: 8b 55 08 mov 0x8(%ebp),%edx 10fd3f: 89 1a mov %ebx,(%edx) } out: pipe_unlock(); 10fd41: e8 fa fc ff ff call 10fa40 pipe_control_t *pipe; unsigned int prevCounter; int err; err = pipe_new(pipep); if (err) 10fd46: 85 f6 test %esi,%esi 10fd48: 0f 85 94 01 00 00 jne 10fee2 return err; pipe = *pipep; 10fd4e: 8b 45 08 mov 0x8(%ebp),%eax 10fd51: 8b 18 mov (%eax),%ebx switch (LIBIO_ACCMODE(iop)) { 10fd53: 8b 55 0c mov 0xc(%ebp),%edx 10fd56: 8b 42 14 mov 0x14(%edx),%eax 10fd59: 83 e0 06 and $0x6,%eax 10fd5c: 83 f8 04 cmp $0x4,%eax 10fd5f: 0f 84 91 00 00 00 je 10fdf6 10fd65: 83 f8 06 cmp $0x6,%eax 10fd68: 0f 84 10 01 00 00 je 10fe7e 10fd6e: 83 f8 02 cmp $0x2,%eax 10fd71: 0f 85 49 01 00 00 jne 10fec0 <== NEVER TAKEN case LIBIO_FLAGS_READ: pipe->readerCounter ++; 10fd77: ff 43 20 incl 0x20(%ebx) if (pipe->Readers ++ == 0) 10fd7a: 8b 43 10 mov 0x10(%ebx),%eax 10fd7d: 8d 50 01 lea 0x1(%eax),%edx 10fd80: 89 53 10 mov %edx,0x10(%ebx) 10fd83: 85 c0 test %eax,%eax 10fd85: 75 11 jne 10fd98 <== NEVER TAKEN PIPE_WAKEUPWRITERS(pipe); 10fd87: 57 push %edi 10fd88: 57 push %edi 10fd89: 8d 45 e4 lea -0x1c(%ebp),%eax 10fd8c: 50 push %eax 10fd8d: ff 73 30 pushl 0x30(%ebx) 10fd90: e8 03 18 00 00 call 111598 10fd95: 83 c4 10 add $0x10,%esp if (pipe->Writers == 0) { 10fd98: 83 7b 14 00 cmpl $0x0,0x14(%ebx) 10fd9c: 0f 85 1e 01 00 00 jne 10fec0 /* Not an error */ if (LIBIO_NODELAY(iop)) 10fda2: 8b 45 0c mov 0xc(%ebp),%eax 10fda5: f6 40 14 01 testb $0x1,0x14(%eax) 10fda9: 0f 85 11 01 00 00 jne 10fec0 break; prevCounter = pipe->writerCounter; 10fdaf: 8b 7b 24 mov 0x24(%ebx),%edi err = -EINTR; /* Wait until a writer opens the pipe */ do { PIPE_UNLOCK(pipe); 10fdb2: 83 ec 0c sub $0xc,%esp 10fdb5: ff 73 28 pushl 0x28(%ebx) 10fdb8: e8 3b bf ff ff call 10bcf8 if (! PIPE_READWAIT(pipe)) 10fdbd: 5a pop %edx 10fdbe: 59 pop %ecx 10fdbf: 6a 00 push $0x0 10fdc1: ff 73 2c pushl 0x2c(%ebx) 10fdc4: e8 27 18 00 00 call 1115f0 10fdc9: 83 c4 10 add $0x10,%esp 10fdcc: 85 c0 test %eax,%eax 10fdce: 0f 85 f9 00 00 00 jne 10fecd <== NEVER TAKEN goto out_error; if (! PIPE_LOCK(pipe)) 10fdd4: 50 push %eax 10fdd5: 6a 00 push $0x0 10fdd7: 6a 00 push $0x0 10fdd9: ff 73 28 pushl 0x28(%ebx) 10fddc: e8 2b be ff ff call 10bc0c 10fde1: 83 c4 10 add $0x10,%esp 10fde4: 85 c0 test %eax,%eax 10fde6: 0f 85 e1 00 00 00 jne 10fecd <== NEVER TAKEN goto out_error; } while (prevCounter == pipe->writerCounter); 10fdec: 3b 7b 24 cmp 0x24(%ebx),%edi 10fdef: 74 c1 je 10fdb2 <== NEVER TAKEN 10fdf1: e9 ca 00 00 00 jmp 10fec0 } break; case LIBIO_FLAGS_WRITE: pipe->writerCounter ++; 10fdf6: ff 43 24 incl 0x24(%ebx) if (pipe->Writers ++ == 0) 10fdf9: 8b 43 14 mov 0x14(%ebx),%eax 10fdfc: 8d 50 01 lea 0x1(%eax),%edx 10fdff: 89 53 14 mov %edx,0x14(%ebx) 10fe02: 85 c0 test %eax,%eax 10fe04: 75 11 jne 10fe17 <== NEVER TAKEN PIPE_WAKEUPREADERS(pipe); 10fe06: 57 push %edi 10fe07: 57 push %edi 10fe08: 8d 45 e4 lea -0x1c(%ebp),%eax 10fe0b: 50 push %eax 10fe0c: ff 73 2c pushl 0x2c(%ebx) 10fe0f: e8 84 17 00 00 call 111598 10fe14: 83 c4 10 add $0x10,%esp if (pipe->Readers == 0 && LIBIO_NODELAY(iop)) { 10fe17: 83 7b 10 00 cmpl $0x0,0x10(%ebx) 10fe1b: 0f 85 9f 00 00 00 jne 10fec0 10fe21: 8b 55 0c mov 0xc(%ebp),%edx 10fe24: f6 42 14 01 testb $0x1,0x14(%edx) 10fe28: 74 18 je 10fe42 PIPE_UNLOCK(pipe); 10fe2a: 83 ec 0c sub $0xc,%esp 10fe2d: ff 73 28 pushl 0x28(%ebx) 10fe30: e8 c3 be ff ff call 10bcf8 err = -ENXIO; goto out_error; 10fe35: 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; 10fe38: be fa ff ff ff mov $0xfffffffa,%esi goto out_error; 10fe3d: e9 90 00 00 00 jmp 10fed2 } if (pipe->Readers == 0) { prevCounter = pipe->readerCounter; 10fe42: 8b 7b 20 mov 0x20(%ebx),%edi err = -EINTR; do { PIPE_UNLOCK(pipe); 10fe45: 83 ec 0c sub $0xc,%esp 10fe48: ff 73 28 pushl 0x28(%ebx) 10fe4b: e8 a8 be ff ff call 10bcf8 if (! PIPE_WRITEWAIT(pipe)) 10fe50: 5a pop %edx 10fe51: 59 pop %ecx 10fe52: 6a 00 push $0x0 10fe54: ff 73 30 pushl 0x30(%ebx) 10fe57: e8 94 17 00 00 call 1115f0 10fe5c: 83 c4 10 add $0x10,%esp 10fe5f: 85 c0 test %eax,%eax 10fe61: 75 6a jne 10fecd <== NEVER TAKEN goto out_error; if (! PIPE_LOCK(pipe)) 10fe63: 50 push %eax 10fe64: 6a 00 push $0x0 10fe66: 6a 00 push $0x0 10fe68: ff 73 28 pushl 0x28(%ebx) 10fe6b: e8 9c bd ff ff call 10bc0c 10fe70: 83 c4 10 add $0x10,%esp 10fe73: 85 c0 test %eax,%eax 10fe75: 75 56 jne 10fecd <== NEVER TAKEN goto out_error; } while (prevCounter == pipe->readerCounter); 10fe77: 3b 7b 20 cmp 0x20(%ebx),%edi 10fe7a: 74 c9 je 10fe45 <== NEVER TAKEN 10fe7c: eb 42 jmp 10fec0 } break; case LIBIO_FLAGS_READ_WRITE: pipe->readerCounter ++; 10fe7e: ff 43 20 incl 0x20(%ebx) if (pipe->Readers ++ == 0) 10fe81: 8b 43 10 mov 0x10(%ebx),%eax 10fe84: 8d 50 01 lea 0x1(%eax),%edx 10fe87: 89 53 10 mov %edx,0x10(%ebx) 10fe8a: 85 c0 test %eax,%eax 10fe8c: 75 11 jne 10fe9f <== NEVER TAKEN PIPE_WAKEUPWRITERS(pipe); 10fe8e: 51 push %ecx 10fe8f: 51 push %ecx 10fe90: 8d 45 e4 lea -0x1c(%ebp),%eax 10fe93: 50 push %eax 10fe94: ff 73 30 pushl 0x30(%ebx) 10fe97: e8 fc 16 00 00 call 111598 10fe9c: 83 c4 10 add $0x10,%esp pipe->writerCounter ++; 10fe9f: ff 43 24 incl 0x24(%ebx) if (pipe->Writers ++ == 0) 10fea2: 8b 43 14 mov 0x14(%ebx),%eax 10fea5: 8d 50 01 lea 0x1(%eax),%edx 10fea8: 89 53 14 mov %edx,0x14(%ebx) 10feab: 85 c0 test %eax,%eax 10fead: 75 11 jne 10fec0 <== NEVER TAKEN PIPE_WAKEUPREADERS(pipe); 10feaf: 52 push %edx 10feb0: 52 push %edx 10feb1: 8d 45 e4 lea -0x1c(%ebp),%eax 10feb4: 50 push %eax 10feb5: ff 73 2c pushl 0x2c(%ebx) 10feb8: e8 db 16 00 00 call 111598 10febd: 83 c4 10 add $0x10,%esp break; } PIPE_UNLOCK(pipe); 10fec0: 83 ec 0c sub $0xc,%esp 10fec3: ff 73 28 pushl 0x28(%ebx) 10fec6: e8 2d be ff ff call 10bcf8 10fecb: eb 12 jmp 10fedf goto out_error; } if (pipe->Readers == 0) { prevCounter = pipe->readerCounter; err = -EINTR; 10fecd: be fc ff ff ff mov $0xfffffffc,%esi <== NOT EXECUTED PIPE_UNLOCK(pipe); return 0; out_error: pipe_release(pipep, iop); 10fed2: 50 push %eax 10fed3: 50 push %eax 10fed4: ff 75 0c pushl 0xc(%ebp) 10fed7: ff 75 08 pushl 0x8(%ebp) 10feda: e8 b2 fb ff ff call 10fa91 return err; 10fedf: 83 c4 10 add $0x10,%esp } 10fee2: 89 f0 mov %esi,%eax 10fee4: 8d 65 f4 lea -0xc(%ebp),%esp 10fee7: 5b pop %ebx 10fee8: 5e pop %esi 10fee9: 5f pop %edi 10feea: c9 leave 10feeb: c3 ret =============================================================================== 00107d7c : long fpathconf( int fd, int name ) { 107d7c: 55 push %ebp 107d7d: 89 e5 mov %esp,%ebp 107d7f: 83 ec 08 sub $0x8,%esp 107d82: 8b 45 08 mov 0x8(%ebp),%eax 107d85: 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); 107d88: 3b 05 44 21 12 00 cmp 0x122144,%eax 107d8e: 73 11 jae 107da1 iop = rtems_libio_iop(fd); 107d90: 6b c0 38 imul $0x38,%eax,%eax 107d93: 03 05 f8 61 12 00 add 0x1261f8,%eax rtems_libio_check_is_open(iop); 107d99: 8b 48 14 mov 0x14(%eax),%ecx 107d9c: f6 c5 01 test $0x1,%ch 107d9f: 75 0d jne 107dae <== ALWAYS TAKEN 107da1: e8 7e a1 00 00 call 111f24 <__errno> 107da6: c7 00 09 00 00 00 movl $0x9,(%eax) 107dac: eb 5b jmp 107e09 rtems_libio_check_permissions(iop, LIBIO_FLAGS_READ); 107dae: 80 e1 02 and $0x2,%cl 107db1: 74 4b je 107dfe /* * Now process the information request. */ the_limits = &iop->pathinfo.mt_entry->pathconf_limits_and_options; 107db3: 8b 40 28 mov 0x28(%eax),%eax switch ( name ) { 107db6: 83 fa 0b cmp $0xb,%edx 107db9: 77 43 ja 107dfe 107dbb: ff 24 95 10 08 12 00 jmp *0x120810(,%edx,4) case _PC_LINK_MAX: return_value = the_limits->link_max; 107dc2: 8b 40 38 mov 0x38(%eax),%eax break; 107dc5: eb 45 jmp 107e0c case _PC_MAX_CANON: return_value = the_limits->max_canon; 107dc7: 8b 40 3c mov 0x3c(%eax),%eax break; 107dca: eb 40 jmp 107e0c case _PC_MAX_INPUT: return_value = the_limits->max_input; 107dcc: 8b 40 40 mov 0x40(%eax),%eax break; 107dcf: eb 3b jmp 107e0c case _PC_NAME_MAX: return_value = the_limits->name_max; 107dd1: 8b 40 44 mov 0x44(%eax),%eax break; 107dd4: eb 36 jmp 107e0c case _PC_PATH_MAX: return_value = the_limits->path_max; 107dd6: 8b 40 48 mov 0x48(%eax),%eax break; 107dd9: eb 31 jmp 107e0c case _PC_PIPE_BUF: return_value = the_limits->pipe_buf; 107ddb: 8b 40 4c mov 0x4c(%eax),%eax break; 107dde: eb 2c jmp 107e0c case _PC_CHOWN_RESTRICTED: return_value = the_limits->posix_chown_restrictions; 107de0: 8b 40 54 mov 0x54(%eax),%eax break; 107de3: eb 27 jmp 107e0c case _PC_NO_TRUNC: return_value = the_limits->posix_no_trunc; 107de5: 8b 40 58 mov 0x58(%eax),%eax break; 107de8: eb 22 jmp 107e0c case _PC_VDISABLE: return_value = the_limits->posix_vdisable; 107dea: 8b 40 64 mov 0x64(%eax),%eax break; 107ded: eb 1d jmp 107e0c case _PC_ASYNC_IO: return_value = the_limits->posix_async_io; 107def: 8b 40 50 mov 0x50(%eax),%eax break; 107df2: eb 18 jmp 107e0c case _PC_PRIO_IO: return_value = the_limits->posix_prio_io; 107df4: 8b 40 5c mov 0x5c(%eax),%eax break; 107df7: eb 13 jmp 107e0c case _PC_SYNC_IO: return_value = the_limits->posix_sync_io; 107df9: 8b 40 60 mov 0x60(%eax),%eax break; 107dfc: eb 0e jmp 107e0c default: rtems_set_errno_and_return_minus_one( EINVAL ); 107dfe: e8 21 a1 00 00 call 111f24 <__errno> 107e03: c7 00 16 00 00 00 movl $0x16,(%eax) 107e09: 83 c8 ff or $0xffffffff,%eax break; } return return_value; } 107e0c: c9 leave 107e0d: c3 ret =============================================================================== 00107348 : #include void free( void *ptr ) { 107348: 55 push %ebp 107349: 89 e5 mov %esp,%ebp 10734b: 53 push %ebx 10734c: 83 ec 04 sub $0x4,%esp 10734f: 8b 5d 08 mov 0x8(%ebp),%ebx MSBUMP(free_calls, 1); 107352: ff 05 1c 52 12 00 incl 0x12521c if ( !ptr ) 107358: 85 db test %ebx,%ebx 10735a: 74 5f je 1073bb return; /* * Do not attempt to free memory if in a critical section or ISR. */ if ( _System_state_Is_up(_System_state_Get()) && 10735c: 83 3d 9c 54 12 00 03 cmpl $0x3,0x12549c 107363: 75 15 jne 10737a <== NEVER TAKEN !malloc_is_system_state_OK() ) { 107365: e8 56 01 00 00 call 1074c0 return; /* * Do not attempt to free memory if in a critical section or ISR. */ if ( _System_state_Is_up(_System_state_Get()) && 10736a: 84 c0 test %al,%al 10736c: 75 0c jne 10737a !malloc_is_system_state_OK() ) { malloc_deferred_free(ptr); 10736e: 89 5d 08 mov %ebx,0x8(%ebp) RTEMS_Malloc_Heap->area_begin, RTEMS_Malloc_Heap->area_end ); } } 107371: 8b 5d fc mov -0x4(%ebp),%ebx 107374: 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); 107375: e9 ae 01 00 00 jmp 107528 } /* * If configured, update the statistics */ if ( rtems_malloc_statistics_helpers ) 10737a: a1 70 36 12 00 mov 0x123670,%eax 10737f: 85 c0 test %eax,%eax 107381: 74 0a je 10738d (*rtems_malloc_statistics_helpers->at_free)(ptr); 107383: 83 ec 0c sub $0xc,%esp 107386: 53 push %ebx 107387: ff 50 08 call *0x8(%eax) 10738a: 83 c4 10 add $0x10,%esp if ( !_Protected_heap_Free( RTEMS_Malloc_Heap, ptr ) ) { 10738d: 50 push %eax 10738e: 50 push %eax 10738f: 53 push %ebx 107390: ff 35 80 11 12 00 pushl 0x121180 107396: e8 09 46 00 00 call 10b9a4 <_Protected_heap_Free> 10739b: 83 c4 10 add $0x10,%esp 10739e: 84 c0 test %al,%al 1073a0: 75 19 jne 1073bb printk( "Program heap: free of bad pointer %p -- range %p - %p \n", ptr, RTEMS_Malloc_Heap->area_begin, RTEMS_Malloc_Heap->area_end 1073a2: 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", 1073a7: ff 70 1c pushl 0x1c(%eax) 1073aa: ff 70 18 pushl 0x18(%eax) 1073ad: 53 push %ebx 1073ae: 68 db ee 11 00 push $0x11eedb 1073b3: e8 d8 0b 00 00 call 107f90 1073b8: 83 c4 10 add $0x10,%esp RTEMS_Malloc_Heap->area_begin, RTEMS_Malloc_Heap->area_end ); } } 1073bb: 8b 5d fc mov -0x4(%ebp),%ebx 1073be: c9 leave 1073bf: c3 ret =============================================================================== 001085c0 : * NOTE: this must be called with * thread dispatching disabled! */ static void free_user_env(void *venv) { 1085c0: 55 push %ebp 1085c1: 89 e5 mov %esp,%ebp 1085c3: 53 push %ebx 1085c4: 83 ec 04 sub $0x4,%esp 1085c7: 8b 5d 08 mov 0x8(%ebp),%ebx rtems_user_env_t *env = (rtems_user_env_t*) venv ; if (env != &rtems_global_user_env 1085ca: 81 fb 48 52 12 00 cmp $0x125248,%ebx 1085d0: 74 26 je 1085f8 <== NEVER TAKEN #ifdef HAVE_USERENV_REFCNT && --env->refcnt <= 0 #endif ) { rtems_filesystem_freenode( &env->current_directory); 1085d2: 83 ec 0c sub $0xc,%esp 1085d5: 8d 43 04 lea 0x4(%ebx),%eax 1085d8: 50 push %eax 1085d9: e8 6a f1 ff ff call 107748 rtems_filesystem_freenode( &env->root_directory); 1085de: 8d 43 18 lea 0x18(%ebx),%eax 1085e1: 89 04 24 mov %eax,(%esp) 1085e4: e8 5f f1 ff ff call 107748 free(env); 1085e9: 83 c4 10 add $0x10,%esp 1085ec: 89 5d 08 mov %ebx,0x8(%ebp) } } 1085ef: 8b 5d fc mov -0x4(%ebp),%ebx 1085f2: c9 leave && --env->refcnt <= 0 #endif ) { rtems_filesystem_freenode( &env->current_directory); rtems_filesystem_freenode( &env->root_directory); free(env); 1085f3: e9 64 f1 ff ff jmp 10775c } } 1085f8: 8b 5d fc mov -0x4(%ebp),%ebx <== NOT EXECUTED 1085fb: c9 leave <== NOT EXECUTED 1085fc: c3 ret <== NOT EXECUTED =============================================================================== 0011e728 : int getdents( int dd_fd, char *dd_buf, int dd_len ) { 11e728: 55 push %ebp 11e729: 89 e5 mov %esp,%ebp 11e72b: 57 push %edi 11e72c: 56 push %esi 11e72d: 53 push %ebx 11e72e: 83 ec 2c sub $0x2c,%esp 11e731: 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 ); 11e734: 31 db xor %ebx,%ebx 11e736: 3b 05 44 31 12 00 cmp 0x123144,%eax 11e73c: 73 09 jae 11e747 <== NEVER TAKEN 11e73e: 6b d8 38 imul $0x38,%eax,%ebx 11e741: 03 1d 40 73 12 00 add 0x127340,%ebx /* * Make sure we are working on a directory */ loc = iop->pathinfo; 11e747: 8d 7d d4 lea -0x2c(%ebp),%edi 11e74a: 8d 73 18 lea 0x18(%ebx),%esi 11e74d: b9 05 00 00 00 mov $0x5,%ecx 11e752: f3 a5 rep movsl %ds:(%esi),%es:(%edi) if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) 11e754: 83 ec 0c sub $0xc,%esp 11e757: 8d 45 d4 lea -0x2c(%ebp),%eax 11e75a: 50 push %eax 11e75b: 8b 45 e0 mov -0x20(%ebp),%eax 11e75e: ff 50 10 call *0x10(%eax) 11e761: 83 c4 10 add $0x10,%esp 11e764: 48 dec %eax 11e765: 74 10 je 11e777 rtems_set_errno_and_return_minus_one( ENOTDIR ); 11e767: e8 d8 38 ff ff call 112044 <__errno> 11e76c: c7 00 14 00 00 00 movl $0x14,(%eax) 11e772: 83 c8 ff or $0xffffffff,%eax 11e775: eb 11 jmp 11e788 /* * 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 ); 11e777: 50 push %eax 11e778: 8b 43 20 mov 0x20(%ebx),%eax 11e77b: ff 75 10 pushl 0x10(%ebp) 11e77e: ff 75 0c pushl 0xc(%ebp) 11e781: 53 push %ebx 11e782: ff 50 08 call *0x8(%eax) 11e785: 83 c4 10 add $0x10,%esp } 11e788: 8d 65 f4 lea -0xc(%ebp),%esp 11e78b: 5b pop %ebx 11e78c: 5e pop %esi 11e78d: 5f pop %edi 11e78e: c9 leave 11e78f: c3 ret =============================================================================== 001106a4 : rtems_libio_t *iop, const char *pathname, uint32_t flag, uint32_t mode ) { 1106a4: 55 push %ebp 1106a5: 89 e5 mov %esp,%ebp 1106a7: 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 ) 1106aa: 8b 4a 18 mov 0x18(%edx),%ecx return -1; /* It wasn't a directory --> return error */ 1106ad: 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 ) 1106b0: 83 79 4c 01 cmpl $0x1,0x4c(%ecx) 1106b4: 75 10 jne 1106c6 <== NEVER TAKEN return -1; /* It wasn't a directory --> return error */ iop->offset = 0; 1106b6: c7 42 0c 00 00 00 00 movl $0x0,0xc(%edx) 1106bd: c7 42 10 00 00 00 00 movl $0x0,0x10(%edx) return 0; 1106c4: 31 c0 xor %eax,%eax } 1106c6: c9 leave 1106c7: c3 ret =============================================================================== 0011090d : int imfs_dir_rmnod( rtems_filesystem_location_info_t *parent_pathloc, /* IN */ rtems_filesystem_location_info_t *pathloc /* IN */ ) { 11090d: 55 push %ebp 11090e: 89 e5 mov %esp,%ebp 110910: 53 push %ebx 110911: 83 ec 04 sub $0x4,%esp 110914: 8b 45 0c mov 0xc(%ebp),%eax IMFS_jnode_t *the_jnode; the_jnode = (IMFS_jnode_t *) pathloc->node_access; 110917: 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 ); 110919: 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 ) ) 11091c: 39 53 50 cmp %edx,0x50(%ebx) 11091f: 74 0d je 11092e rtems_set_errno_and_return_minus_one( ENOTEMPTY ); 110921: e8 a6 07 00 00 call 1110cc <__errno> 110926: c7 00 5a 00 00 00 movl $0x5a,(%eax) 11092c: eb 13 jmp 110941 /* * You cannot remove the file system root node. */ if ( pathloc->mt_entry->mt_fs_root.node_access == pathloc->node_access ) 11092e: 8b 40 10 mov 0x10(%eax),%eax 110931: 39 58 1c cmp %ebx,0x1c(%eax) 110934: 75 10 jne 110946 rtems_set_errno_and_return_minus_one( EBUSY ); 110936: e8 91 07 00 00 call 1110cc <__errno> 11093b: c7 00 10 00 00 00 movl $0x10,(%eax) 110941: 83 c8 ff or $0xffffffff,%eax 110944: eb 1c jmp 110962 /* * You cannot remove a mountpoint. */ if ( the_jnode->info.directory.mt_fs != NULL ) 110946: 83 7b 5c 00 cmpl $0x0,0x5c(%ebx) 11094a: 75 ea jne 110936 <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EBUSY ); IMFS_create_orphan( the_jnode ); 11094c: 83 ec 0c sub $0xc,%esp 11094f: 53 push %ebx 110950: e8 27 d5 ff ff call 10de7c IMFS_check_node_remove( the_jnode ); 110955: 89 1c 24 mov %ebx,(%esp) 110958: e8 61 d5 ff ff call 10debe return 0; 11095d: 83 c4 10 add $0x10,%esp 110960: 31 c0 xor %eax,%eax } 110962: 8b 5d fc mov -0x4(%ebp),%ebx 110965: c9 leave 110966: c3 ret =============================================================================== 00107c6c : /* * Initialize useable but dummy databases */ void init_etc_passwd_group(void) { 107c6c: 55 push %ebp 107c6d: 89 e5 mov %esp,%ebp 107c6f: 53 push %ebx 107c70: 83 ec 04 sub $0x4,%esp FILE *fp; static char etc_passwd_initted = 0; if (etc_passwd_initted) 107c73: 80 3d bc 6c 12 00 00 cmpb $0x0,0x126cbc 107c7a: 0f 85 b8 00 00 00 jne 107d38 return; etc_passwd_initted = 1; 107c80: c6 05 bc 6c 12 00 01 movb $0x1,0x126cbc mkdir("/etc", 0777); 107c87: 50 push %eax 107c88: 50 push %eax 107c89: 68 ff 01 00 00 push $0x1ff 107c8e: 68 67 07 12 00 push $0x120767 107c93: e8 7c 07 00 00 call 108414 /* * Initialize /etc/passwd */ if ((fp = fopen("/etc/passwd", "r")) != NULL) { 107c98: 59 pop %ecx 107c99: 5b pop %ebx 107c9a: 68 b2 f4 11 00 push $0x11f4b2 107c9f: 68 6c 07 12 00 push $0x12076c 107ca4: e8 ff a9 00 00 call 1126a8 107ca9: 83 c4 10 add $0x10,%esp 107cac: 85 c0 test %eax,%eax 107cae: 74 06 je 107cb6 fclose(fp); 107cb0: 83 ec 0c sub $0xc,%esp 107cb3: 50 push %eax 107cb4: eb 2a jmp 107ce0 } else if ((fp = fopen("/etc/passwd", "w")) != NULL) { 107cb6: 52 push %edx 107cb7: 52 push %edx 107cb8: 68 cc f3 11 00 push $0x11f3cc 107cbd: 68 6c 07 12 00 push $0x12076c 107cc2: e8 e1 a9 00 00 call 1126a8 107cc7: 89 c3 mov %eax,%ebx 107cc9: 83 c4 10 add $0x10,%esp 107ccc: 85 c0 test %eax,%eax 107cce: 74 18 je 107ce8 <== NEVER TAKEN fprintf(fp, "root:*:0:0:root::/:/bin/sh\n" 107cd0: 50 push %eax 107cd1: 50 push %eax 107cd2: 53 push %ebx 107cd3: 68 78 07 12 00 push $0x120778 107cd8: e8 97 aa 00 00 call 112774 "rtems:*:1:1:RTEMS Application::/:/bin/sh\n" "tty:!:2:2:tty owner::/:/bin/false\n" ); fclose(fp); 107cdd: 89 1c 24 mov %ebx,(%esp) 107ce0: e8 bf a2 00 00 call 111fa4 107ce5: 83 c4 10 add $0x10,%esp } /* * Initialize /etc/group */ if ((fp = fopen("/etc/group", "r")) != NULL) { 107ce8: 51 push %ecx 107ce9: 51 push %ecx 107cea: 68 b2 f4 11 00 push $0x11f4b2 107cef: 68 df 07 12 00 push $0x1207df 107cf4: e8 af a9 00 00 call 1126a8 107cf9: 83 c4 10 add $0x10,%esp 107cfc: 85 c0 test %eax,%eax 107cfe: 74 06 je 107d06 fclose(fp); 107d00: 83 ec 0c sub $0xc,%esp 107d03: 50 push %eax 107d04: eb 2a jmp 107d30 } else if ((fp = fopen("/etc/group", "w")) != NULL) { 107d06: 52 push %edx 107d07: 52 push %edx 107d08: 68 cc f3 11 00 push $0x11f3cc 107d0d: 68 df 07 12 00 push $0x1207df 107d12: e8 91 a9 00 00 call 1126a8 107d17: 89 c3 mov %eax,%ebx 107d19: 83 c4 10 add $0x10,%esp 107d1c: 85 c0 test %eax,%eax 107d1e: 74 18 je 107d38 <== NEVER TAKEN fprintf( fp, "root:x:0:root\n" 107d20: 50 push %eax 107d21: 50 push %eax 107d22: 53 push %ebx 107d23: 68 ea 07 12 00 push $0x1207ea 107d28: e8 47 aa 00 00 call 112774 "rtems:x:1:rtems\n" "tty:x:2:tty\n" ); fclose(fp); 107d2d: 89 1c 24 mov %ebx,(%esp) 107d30: e8 6f a2 00 00 call 111fa4 107d35: 83 c4 10 add $0x10,%esp } } 107d38: 8b 5d fc mov -0x4(%ebp),%ebx 107d3b: c9 leave 107d3c: c3 ret =============================================================================== 00108e0c : /* * Process a single input character */ static int iproc (unsigned char c, struct rtems_termios_tty *tty) { 108e0c: 55 push %ebp 108e0d: 89 e5 mov %esp,%ebp 108e0f: 53 push %ebx 108e10: 83 ec 14 sub $0x14,%esp 108e13: 89 d3 mov %edx,%ebx 108e15: 88 c1 mov %al,%cl if (tty->termios.c_iflag & ISTRIP) 108e17: 8b 52 30 mov 0x30(%edx),%edx 108e1a: f6 c2 20 test $0x20,%dl 108e1d: 74 03 je 108e22 <== ALWAYS TAKEN c &= 0x7f; 108e1f: 83 e1 7f and $0x7f,%ecx <== NOT EXECUTED if (tty->termios.c_iflag & IUCLC) 108e22: f6 c6 02 test $0x2,%dh 108e25: 74 16 je 108e3d c = tolower (c); 108e27: 0f b6 c9 movzbl %cl,%ecx 108e2a: a1 3c 31 12 00 mov 0x12313c,%eax 108e2f: 0f be 44 08 01 movsbl 0x1(%eax,%ecx,1),%eax 108e34: 83 e0 03 and $0x3,%eax 108e37: 48 dec %eax 108e38: 75 03 jne 108e3d 108e3a: 83 c1 20 add $0x20,%ecx if (c == '\r') { 108e3d: 80 f9 0d cmp $0xd,%cl 108e40: 75 14 jne 108e56 if (tty->termios.c_iflag & IGNCR) return 0; 108e42: 31 c0 xor %eax,%eax if (tty->termios.c_iflag & IUCLC) c = tolower (c); if (c == '\r') { if (tty->termios.c_iflag & IGNCR) 108e44: f6 c2 80 test $0x80,%dl 108e47: 0f 85 d9 00 00 00 jne 108f26 <== NEVER TAKEN return 0; if (tty->termios.c_iflag & ICRNL) 108e4d: 80 e6 01 and $0x1,%dh 108e50: 74 1a je 108e6c <== NEVER TAKEN c = '\n'; 108e52: b1 0a mov $0xa,%cl 108e54: eb 16 jmp 108e6c } else if ((c == '\n') && (tty->termios.c_iflag & INLCR)) { 108e56: 80 f9 0a cmp $0xa,%cl 108e59: 75 09 jne 108e64 108e5b: 80 e2 40 and $0x40,%dl 108e5e: 74 0c je 108e6c <== ALWAYS TAKEN c = '\r'; 108e60: b1 0d mov $0xd,%cl <== NOT EXECUTED 108e62: eb 08 jmp 108e6c <== NOT EXECUTED } if ((c != '\0') && (tty->termios.c_lflag & ICANON)) { 108e64: 84 c9 test %cl,%cl 108e66: 0f 84 87 00 00 00 je 108ef3 <== NEVER TAKEN 108e6c: 8b 53 3c mov 0x3c(%ebx),%edx 108e6f: f6 c2 02 test $0x2,%dl 108e72: 74 7f je 108ef3 if (c == tty->termios.c_cc[VERASE]) { 108e74: 3a 4b 43 cmp 0x43(%ebx),%cl 108e77: 75 04 jne 108e7d erase (tty, 0); 108e79: 31 d2 xor %edx,%edx 108e7b: eb 0a jmp 108e87 return 0; } else if (c == tty->termios.c_cc[VKILL]) { 108e7d: 3a 4b 44 cmp 0x44(%ebx),%cl 108e80: 75 11 jne 108e93 erase (tty, 1); 108e82: ba 01 00 00 00 mov $0x1,%edx 108e87: 89 d8 mov %ebx,%eax 108e89: e8 05 fe ff ff call 108c93 108e8e: e9 91 00 00 00 jmp 108f24 return 0; } else if (c == tty->termios.c_cc[VEOF]) { return 1; 108e93: 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]) { 108e98: 3a 4b 45 cmp 0x45(%ebx),%cl 108e9b: 0f 84 85 00 00 00 je 108f26 <== NEVER TAKEN return 1; } else if (c == '\n') { 108ea1: 80 f9 0a cmp $0xa,%cl 108ea4: 75 1a jne 108ec0 if (tty->termios.c_lflag & (ECHO | ECHONL)) 108ea6: 80 e2 48 and $0x48,%dl 108ea9: 74 09 je 108eb4 <== NEVER TAKEN echo (c, tty); 108eab: 89 da mov %ebx,%edx 108ead: b0 0a mov $0xa,%al 108eaf: e8 87 fd ff ff call 108c3b tty->cbuf[tty->ccount++] = c; 108eb4: 8b 43 20 mov 0x20(%ebx),%eax 108eb7: 8b 53 1c mov 0x1c(%ebx),%edx 108eba: c6 04 02 0a movb $0xa,(%edx,%eax,1) 108ebe: eb 28 jmp 108ee8 return 1; } else if ((c == tty->termios.c_cc[VEOL]) || 108ec0: 3a 4b 4c cmp 0x4c(%ebx),%cl 108ec3: 74 05 je 108eca <== NEVER TAKEN 108ec5: 3a 4b 51 cmp 0x51(%ebx),%cl 108ec8: 75 29 jne 108ef3 <== ALWAYS TAKEN (c == tty->termios.c_cc[VEOL2])) { if (tty->termios.c_lflag & ECHO) 108eca: 80 e2 08 and $0x8,%dl <== NOT EXECUTED 108ecd: 74 10 je 108edf <== NOT EXECUTED echo (c, tty); 108ecf: 0f b6 c1 movzbl %cl,%eax <== NOT EXECUTED 108ed2: 89 da mov %ebx,%edx <== NOT EXECUTED 108ed4: 88 4d f4 mov %cl,-0xc(%ebp) <== NOT EXECUTED 108ed7: e8 5f fd ff ff call 108c3b <== NOT EXECUTED 108edc: 8a 4d f4 mov -0xc(%ebp),%cl <== NOT EXECUTED tty->cbuf[tty->ccount++] = c; 108edf: 8b 43 20 mov 0x20(%ebx),%eax <== NOT EXECUTED 108ee2: 8b 53 1c mov 0x1c(%ebx),%edx <== NOT EXECUTED 108ee5: 88 0c 02 mov %cl,(%edx,%eax,1) <== NOT EXECUTED 108ee8: 40 inc %eax 108ee9: 89 43 20 mov %eax,0x20(%ebx) return 1; 108eec: b8 01 00 00 00 mov $0x1,%eax 108ef1: eb 33 jmp 108f26 } /* * FIXME: Should do IMAXBEL handling somehow */ if (tty->ccount < (CBUFSIZE-1)) { 108ef3: 8b 15 70 30 12 00 mov 0x123070,%edx 108ef9: 4a dec %edx if (tty->termios.c_lflag & ECHO) echo (c, tty); tty->cbuf[tty->ccount++] = c; } return 0; 108efa: 31 c0 xor %eax,%eax } /* * FIXME: Should do IMAXBEL handling somehow */ if (tty->ccount < (CBUFSIZE-1)) { 108efc: 39 53 20 cmp %edx,0x20(%ebx) 108eff: 7d 25 jge 108f26 <== NEVER TAKEN if (tty->termios.c_lflag & ECHO) 108f01: f6 43 3c 08 testb $0x8,0x3c(%ebx) 108f05: 74 10 je 108f17 <== NEVER TAKEN echo (c, tty); 108f07: 0f b6 c1 movzbl %cl,%eax 108f0a: 89 da mov %ebx,%edx 108f0c: 88 4d f4 mov %cl,-0xc(%ebp) 108f0f: e8 27 fd ff ff call 108c3b 108f14: 8a 4d f4 mov -0xc(%ebp),%cl tty->cbuf[tty->ccount++] = c; 108f17: 8b 43 20 mov 0x20(%ebx),%eax 108f1a: 8b 53 1c mov 0x1c(%ebx),%edx 108f1d: 88 0c 02 mov %cl,(%edx,%eax,1) 108f20: 40 inc %eax 108f21: 89 43 20 mov %eax,0x20(%ebx) } return 0; 108f24: 31 c0 xor %eax,%eax } 108f26: 83 c4 14 add $0x14,%esp 108f29: 5b pop %ebx 108f2a: c9 leave 108f2b: c3 ret =============================================================================== 00121ef8 : int killinfo( pid_t pid, int sig, const union sigval *value ) { 121ef8: 55 push %ebp 121ef9: 89 e5 mov %esp,%ebp 121efb: 57 push %edi 121efc: 56 push %esi 121efd: 53 push %ebx 121efe: 83 ec 4c sub $0x4c,%esp 121f01: 8b 5d 0c mov 0xc(%ebp),%ebx 121f04: 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() ) 121f07: e8 64 fd ff ff call 121c70 121f0c: 39 45 08 cmp %eax,0x8(%ebp) 121f0f: 74 0d je 121f1e rtems_set_errno_and_return_minus_one( ESRCH ); 121f11: e8 4e 3a ff ff call 115964 <__errno> 121f16: c7 00 03 00 00 00 movl $0x3,(%eax) 121f1c: eb 0f jmp 121f2d /* * Validate the signal passed. */ if ( !sig ) 121f1e: 85 db test %ebx,%ebx 121f20: 75 13 jne 121f35 rtems_set_errno_and_return_minus_one( EINVAL ); 121f22: e8 3d 3a ff ff call 115964 <__errno> 121f27: c7 00 16 00 00 00 movl $0x16,(%eax) 121f2d: 83 c8 ff or $0xffffffff,%eax 121f30: e9 ef 01 00 00 jmp 122124 static inline bool is_valid_signo( int signo ) { return ((signo) >= 1 && (signo) <= 32 ); 121f35: 8d 4b ff lea -0x1(%ebx),%ecx if ( !is_valid_signo(sig) ) 121f38: 83 f9 1f cmp $0x1f,%ecx 121f3b: 77 e5 ja 121f22 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 ) 121f3d: 6b d3 0c imul $0xc,%ebx,%edx return 0; 121f40: 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 ) 121f42: 83 ba 18 ba 12 00 01 cmpl $0x1,0x12ba18(%edx) 121f49: 0f 84 d5 01 00 00 je 122124 /* * 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 ) ) 121f4f: 83 fb 04 cmp $0x4,%ebx 121f52: 74 0a je 121f5e 121f54: 83 fb 08 cmp $0x8,%ebx 121f57: 74 05 je 121f5e 121f59: 83 fb 0b cmp $0xb,%ebx 121f5c: 75 16 jne 121f74 return pthread_kill( pthread_self(), sig ); 121f5e: e8 89 03 00 00 call 1222ec 121f63: 56 push %esi 121f64: 56 push %esi 121f65: 53 push %ebx 121f66: 50 push %eax 121f67: e8 d8 02 00 00 call 122244 121f6c: 83 c4 10 add $0x10,%esp 121f6f: e9 b0 01 00 00 jmp 122124 static inline sigset_t signo_to_mask( uint32_t sig ) { return 1u << (sig - 1); 121f74: be 01 00 00 00 mov $0x1,%esi 121f79: d3 e6 shl %cl,%esi /* * Build up a siginfo structure */ siginfo = &siginfo_struct; siginfo->si_signo = sig; 121f7b: 89 5d dc mov %ebx,-0x24(%ebp) siginfo->si_code = SI_USER; 121f7e: c7 45 e0 01 00 00 00 movl $0x1,-0x20(%ebp) if ( !value ) { 121f85: 85 ff test %edi,%edi 121f87: 75 09 jne 121f92 siginfo->si_value.sival_int = 0; 121f89: c7 45 e4 00 00 00 00 movl $0x0,-0x1c(%ebp) 121f90: eb 05 jmp 121f97 } else { siginfo->si_value = *value; 121f92: 8b 07 mov (%edi),%eax 121f94: 89 45 e4 mov %eax,-0x1c(%ebp) 121f97: a1 b4 b4 12 00 mov 0x12b4b4,%eax 121f9c: 40 inc %eax 121f9d: 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; 121fa2: a1 dc b9 12 00 mov 0x12b9dc,%eax api = the_thread->API_Extensions[ THREAD_API_POSIX ]; if ( _POSIX_signals_Is_interested( api, mask ) ) { 121fa7: 8b 90 ec 00 00 00 mov 0xec(%eax),%edx 121fad: 8b 92 d0 00 00 00 mov 0xd0(%edx),%edx 121fb3: f7 d2 not %edx 121fb5: 85 d6 test %edx,%esi 121fb7: 0f 85 ed 00 00 00 jne 1220aa } DEBUG_STEP("\n"); _Thread_Enable_dispatch(); return 0; } 121fbd: 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 ); 121fc3: eb 23 jmp 121fe8 !_Chain_Is_tail( the_chain, the_node ) ; the_node = the_node->next ) { the_thread = (Thread_Control *)the_node; 121fc5: 89 d0 mov %edx,%eax api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 121fc7: 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) 121fcd: 85 72 30 test %esi,0x30(%edx) 121fd0: 0f 85 d4 00 00 00 jne 1220aa /* * Is this thread is blocked waiting for another signal but has * not blocked this one? */ if (~api->signals_blocked & mask) 121fd6: 8b 89 d0 00 00 00 mov 0xd0(%ecx),%ecx 121fdc: f7 d1 not %ecx 121fde: 85 ce test %ecx,%esi 121fe0: 0f 85 c4 00 00 00 jne 1220aa 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 ) { 121fe6: 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 ); 121fe8: 81 fa a0 bb 12 00 cmp $0x12bba0,%edx 121fee: 75 d5 jne 121fc5 * NOTES: * * + rtems internal threads do not receive signals. */ interested = NULL; interested_priority = PRIORITY_MAXIMUM + 1; 121ff0: 0f b6 0d 24 72 12 00 movzbl 0x127224,%ecx 121ff7: 41 inc %ecx * * NOTES: * * + rtems internal threads do not receive signals. */ interested = NULL; 121ff8: 31 c0 xor %eax,%eax interested_priority = PRIORITY_MAXIMUM + 1; for (the_api = OBJECTS_CLASSIC_API; the_api <= OBJECTS_APIS_LAST; the_api++) { 121ffa: 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 ] ) 122001: 8b 7d cc mov -0x34(%ebp),%edi 122004: 8b 14 bd 8c b4 12 00 mov 0x12b48c(,%edi,4),%edx 12200b: 85 d2 test %edx,%edx 12200d: 0f 84 86 00 00 00 je 122099 <== NEVER TAKEN continue; the_info = _Objects_Information_table[ the_api ][ 1 ]; 122013: 8b 52 04 mov 0x4(%edx),%edx */ if ( !the_info ) continue; #endif maximum = the_info->maximum; 122016: 0f b7 7a 10 movzwl 0x10(%edx),%edi 12201a: 89 7d c4 mov %edi,-0x3c(%ebp) object_table = the_info->local_table; 12201d: 8b 52 1c mov 0x1c(%edx),%edx 122020: 89 55 c0 mov %edx,-0x40(%ebp) for ( index = 1 ; index <= maximum ; index++ ) { 122023: c7 45 d0 01 00 00 00 movl $0x1,-0x30(%ebp) 12202a: 89 5d b4 mov %ebx,-0x4c(%ebp) 12202d: eb 5f jmp 12208e the_thread = (Thread_Control *) object_table[ index ]; 12202f: 8b 5d d0 mov -0x30(%ebp),%ebx 122032: 8b 7d c0 mov -0x40(%ebp),%edi 122035: 8b 14 9f mov (%edi,%ebx,4),%edx if ( !the_thread ) 122038: 85 d2 test %edx,%edx 12203a: 74 4f je 12208b /* * If this thread is of lower priority than the interested thread, * go on to the next thread. */ if ( the_thread->current_priority > interested_priority ) 12203c: 8b 5a 14 mov 0x14(%edx),%ebx 12203f: 89 5d d4 mov %ebx,-0x2c(%ebp) 122042: 39 cb cmp %ecx,%ebx 122044: 77 45 ja 12208b #if defined(RTEMS_DEBUG) if ( !api ) continue; #endif if ( !_POSIX_signals_Is_interested( api, mask ) ) 122046: 8b ba ec 00 00 00 mov 0xec(%edx),%edi 12204c: 8b bf d0 00 00 00 mov 0xd0(%edi),%edi 122052: f7 d7 not %edi 122054: 85 fe test %edi,%esi 122056: 74 33 je 12208b * * 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 ) { 122058: 39 cb cmp %ecx,%ebx 12205a: 72 2a jb 122086 * and blocking interruptibutable by signal. * * If the interested thread is ready, don't think about changing. */ if ( interested && !_States_Is_ready( interested->current_state ) ) { 12205c: 85 c0 test %eax,%eax 12205e: 74 2b je 12208b <== NEVER TAKEN 122060: 8b 78 10 mov 0x10(%eax),%edi 122063: 89 7d c8 mov %edi,-0x38(%ebp) 122066: 85 ff test %edi,%edi 122068: 74 21 je 12208b <== NEVER TAKEN /* preferred ready over blocked */ DEBUG_STEP("5"); if ( _States_Is_ready( the_thread->current_state ) ) { 12206a: 8b 7a 10 mov 0x10(%edx),%edi 12206d: 85 ff test %edi,%edi 12206f: 74 15 je 122086 continue; } DEBUG_STEP("6"); /* prefer blocked/interruptible over blocked/not interruptible */ if ( !_States_Is_interruptible_by_signal(interested->current_state) ) { 122071: f7 45 c8 00 00 00 10 testl $0x10000000,-0x38(%ebp) 122078: 75 11 jne 12208b DEBUG_STEP("7"); if ( _States_Is_interruptible_by_signal(the_thread->current_state) ) { 12207a: 81 e7 00 00 00 10 and $0x10000000,%edi 122080: 74 09 je 12208b 122082: 89 d9 mov %ebx,%ecx 122084: eb 03 jmp 122089 */ if ( interested && !_States_Is_ready( interested->current_state ) ) { /* preferred ready over blocked */ DEBUG_STEP("5"); if ( _States_Is_ready( the_thread->current_state ) ) { 122086: 8b 4d d4 mov -0x2c(%ebp),%ecx 122089: 89 d0 mov %edx,%eax #endif maximum = the_info->maximum; object_table = the_info->local_table; for ( index = 1 ; index <= maximum ; index++ ) { 12208b: ff 45 d0 incl -0x30(%ebp) 12208e: 8b 55 c4 mov -0x3c(%ebp),%edx 122091: 39 55 d0 cmp %edx,-0x30(%ebp) 122094: 76 99 jbe 12202f 122096: 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++) { 122099: ff 45 cc incl -0x34(%ebp) 12209c: 83 7d cc 04 cmpl $0x4,-0x34(%ebp) 1220a0: 0f 85 5b ff ff ff jne 122001 } } } } if ( interested ) { 1220a6: 85 c0 test %eax,%eax 1220a8: 74 13 je 1220bd /* * 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 ) ) { 1220aa: 51 push %ecx mask = signo_to_mask( sig ); /* * Build up a siginfo structure */ siginfo = &siginfo_struct; 1220ab: 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 ) ) { 1220ae: 52 push %edx 1220af: 53 push %ebx 1220b0: 50 push %eax 1220b1: e8 8a 00 00 00 call 122140 <_POSIX_signals_Unblock_thread> 1220b6: 83 c4 10 add $0x10,%esp 1220b9: 84 c0 test %al,%al 1220bb: 75 60 jne 12211d /* * 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 ); 1220bd: 83 ec 0c sub $0xc,%esp 1220c0: 56 push %esi 1220c1: e8 66 00 00 00 call 12212c <_POSIX_signals_Set_process_signals> if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) { 1220c6: 6b db 0c imul $0xc,%ebx,%ebx 1220c9: 83 c4 10 add $0x10,%esp 1220cc: 83 bb 10 ba 12 00 02 cmpl $0x2,0x12ba10(%ebx) 1220d3: 75 48 jne 12211d psiginfo = (POSIX_signals_Siginfo_node *) _Chain_Get( &_POSIX_signals_Inactive_siginfo ); 1220d5: 83 ec 0c sub $0xc,%esp 1220d8: 68 90 bb 12 00 push $0x12bb90 1220dd: e8 5a d0 fe ff call 10f13c <_Chain_Get> if ( !psiginfo ) { 1220e2: 83 c4 10 add $0x10,%esp 1220e5: 85 c0 test %eax,%eax 1220e7: 75 15 jne 1220fe _Thread_Enable_dispatch(); 1220e9: e8 6c e8 fe ff call 11095a <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one( EAGAIN ); 1220ee: e8 71 38 ff ff call 115964 <__errno> 1220f3: c7 00 0b 00 00 00 movl $0xb,(%eax) 1220f9: e9 2f fe ff ff jmp 121f2d } psiginfo->Info = *siginfo; 1220fe: 8d 78 08 lea 0x8(%eax),%edi 122101: 8d 75 dc lea -0x24(%ebp),%esi 122104: b9 03 00 00 00 mov $0x3,%ecx 122109: f3 a5 rep movsl %ds:(%esi),%es:(%edi) _Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node ); 12210b: 52 push %edx 12210c: 52 push %edx 12210d: 50 push %eax 12210e: 81 c3 08 bc 12 00 add $0x12bc08,%ebx 122114: 53 push %ebx 122115: e8 e6 cf fe ff call 10f100 <_Chain_Append> 12211a: 83 c4 10 add $0x10,%esp } DEBUG_STEP("\n"); _Thread_Enable_dispatch(); 12211d: e8 38 e8 fe ff call 11095a <_Thread_Enable_dispatch> return 0; 122122: 31 c0 xor %eax,%eax } 122124: 8d 65 f4 lea -0xc(%ebp),%esp 122127: 5b pop %ebx 122128: 5e pop %esi 122129: 5f pop %edi 12212a: c9 leave 12212b: c3 ret =============================================================================== 0011d024 : extern void _wrapup_reent(struct _reent *); extern void _reclaim_reent(struct _reent *); void libc_wrapup(void) { 11d024: 55 push %ebp 11d025: 89 e5 mov %esp,%ebp 11d027: 53 push %ebx 11d028: 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())) 11d02b: 83 3d 9c 54 12 00 03 cmpl $0x3,0x12549c 11d032: 75 4f jne 11d083 <== NEVER TAKEN /* * This was already done if the user called exit() directly . _wrapup_reent(0); */ if (_REENT != _global_impure_ptr) { 11d034: 8b 1d c0 f9 11 00 mov 0x11f9c0,%ebx 11d03a: 39 1d 40 31 12 00 cmp %ebx,0x123140 11d040: 74 12 je 11d054 _wrapup_reent(_global_impure_ptr); 11d042: 83 ec 0c sub $0xc,%esp 11d045: 53 push %ebx 11d046: e8 b5 05 00 00 call 11d600 <_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; 11d04b: 89 1d 40 31 12 00 mov %ebx,0x123140 11d051: 83 c4 10 add $0x10,%esp * * Should this be changed to do *all* file streams? * _fwalk (_REENT, fclose); */ fclose (stdin); 11d054: 83 ec 0c sub $0xc,%esp 11d057: a1 40 31 12 00 mov 0x123140,%eax 11d05c: ff 70 04 pushl 0x4(%eax) 11d05f: e8 c0 41 ff ff call 111224 fclose (stdout); 11d064: 5a pop %edx 11d065: a1 40 31 12 00 mov 0x123140,%eax 11d06a: ff 70 08 pushl 0x8(%eax) 11d06d: e8 b2 41 ff ff call 111224 fclose (stderr); 11d072: 58 pop %eax 11d073: a1 40 31 12 00 mov 0x123140,%eax 11d078: ff 70 0c pushl 0xc(%eax) 11d07b: e8 a4 41 ff ff call 111224 11d080: 83 c4 10 add $0x10,%esp } 11d083: 8b 5d fc mov -0x4(%ebp),%ebx 11d086: c9 leave 11d087: c3 ret =============================================================================== 0011cf30 : off_t lseek( int fd, off_t offset, int whence ) { 11cf30: 55 push %ebp 11cf31: 89 e5 mov %esp,%ebp 11cf33: 57 push %edi 11cf34: 56 push %esi 11cf35: 53 push %ebx 11cf36: 83 ec 1c sub $0x1c,%esp 11cf39: 8b 5d 08 mov 0x8(%ebp),%ebx 11cf3c: 8b 45 0c mov 0xc(%ebp),%eax 11cf3f: 8b 55 10 mov 0x10(%ebp),%edx 11cf42: 8b 4d 14 mov 0x14(%ebp),%ecx rtems_libio_t *iop; off_t old_offset; off_t status; rtems_libio_check_fd( fd ); 11cf45: 3b 1d 44 11 12 00 cmp 0x121144,%ebx 11cf4b: 73 0f jae 11cf5c iop = rtems_libio_iop( fd ); 11cf4d: 6b db 38 imul $0x38,%ebx,%ebx 11cf50: 03 1d f8 51 12 00 add 0x1251f8,%ebx rtems_libio_check_is_open(iop); 11cf56: f6 43 15 01 testb $0x1,0x15(%ebx) 11cf5a: 75 0d jne 11cf69 11cf5c: e8 6b 41 ff ff call 1110cc <__errno> 11cf61: c7 00 09 00 00 00 movl $0x9,(%eax) 11cf67: eb 4b jmp 11cfb4 /* * Now process the lseek(). */ old_offset = iop->offset; 11cf69: 8b 73 0c mov 0xc(%ebx),%esi 11cf6c: 8b 7b 10 mov 0x10(%ebx),%edi 11cf6f: 89 75 e0 mov %esi,-0x20(%ebp) 11cf72: 89 7d e4 mov %edi,-0x1c(%ebp) switch ( whence ) { 11cf75: 83 f9 01 cmp $0x1,%ecx 11cf78: 74 11 je 11cf8b 11cf7a: 83 f9 02 cmp $0x2,%ecx 11cf7d: 74 18 je 11cf97 11cf7f: 85 c9 test %ecx,%ecx 11cf81: 75 26 jne 11cfa9 case SEEK_SET: iop->offset = offset; 11cf83: 89 43 0c mov %eax,0xc(%ebx) 11cf86: 89 53 10 mov %edx,0x10(%ebx) break; 11cf89: eb 30 jmp 11cfbb case SEEK_CUR: iop->offset += offset; 11cf8b: 8b 75 e0 mov -0x20(%ebp),%esi 11cf8e: 8b 7d e4 mov -0x1c(%ebp),%edi 11cf91: 01 c6 add %eax,%esi 11cf93: 11 d7 adc %edx,%edi 11cf95: eb 0a jmp 11cfa1 break; case SEEK_END: iop->offset = iop->size + offset; 11cf97: 89 c6 mov %eax,%esi 11cf99: 89 d7 mov %edx,%edi 11cf9b: 03 73 04 add 0x4(%ebx),%esi 11cf9e: 13 7b 08 adc 0x8(%ebx),%edi 11cfa1: 89 73 0c mov %esi,0xc(%ebx) 11cfa4: 89 7b 10 mov %edi,0x10(%ebx) break; 11cfa7: eb 12 jmp 11cfbb default: rtems_set_errno_and_return_minus_one( EINVAL ); 11cfa9: e8 1e 41 ff ff call 1110cc <__errno> 11cfae: c7 00 16 00 00 00 movl $0x16,(%eax) 11cfb4: 83 c8 ff or $0xffffffff,%eax 11cfb7: 89 c2 mov %eax,%edx 11cfb9: eb 23 jmp 11cfde /* * At this time, handlers assume iop->offset has the desired * new offset. */ status = (*iop->pathinfo.handlers->lseek_h)( iop, offset, whence ); 11cfbb: 8b 73 20 mov 0x20(%ebx),%esi 11cfbe: 51 push %ecx 11cfbf: 52 push %edx 11cfc0: 50 push %eax 11cfc1: 53 push %ebx 11cfc2: ff 56 14 call *0x14(%esi) if ( status == (off_t) -1 ) 11cfc5: 83 c4 10 add $0x10,%esp 11cfc8: 83 fa ff cmp $0xffffffff,%edx 11cfcb: 75 11 jne 11cfde 11cfcd: 83 f8 ff cmp $0xffffffff,%eax 11cfd0: 75 0c jne 11cfde <== NEVER TAKEN iop->offset = old_offset; 11cfd2: 8b 75 e0 mov -0x20(%ebp),%esi 11cfd5: 8b 7d e4 mov -0x1c(%ebp),%edi 11cfd8: 89 73 0c mov %esi,0xc(%ebx) 11cfdb: 89 7b 10 mov %edi,0x10(%ebx) /* * So if the operation failed, we have to restore iop->offset. */ return status; } 11cfde: 8d 65 f4 lea -0xc(%ebp),%esp 11cfe1: 5b pop %ebx 11cfe2: 5e pop %esi 11cfe3: 5f pop %edi 11cfe4: c9 leave 11cfe5: c3 ret =============================================================================== 001075e4 : #include "malloc_p.h" void *malloc( size_t size ) { 1075e4: 55 push %ebp 1075e5: 89 e5 mov %esp,%ebp 1075e7: 56 push %esi 1075e8: 53 push %ebx 1075e9: 8b 75 08 mov 0x8(%ebp),%esi void *return_this; MSBUMP(malloc_calls, 1); 1075ec: ff 05 14 52 12 00 incl 0x125214 /* * If some free's have been deferred, then do them now. */ malloc_deferred_frees_process(); 1075f2: e8 07 ff ff ff call 1074fe /* * Validate the parameters */ if ( !size ) return (void *) 0; 1075f7: 31 db xor %ebx,%ebx malloc_deferred_frees_process(); /* * Validate the parameters */ if ( !size ) 1075f9: 85 f6 test %esi,%esi 1075fb: 74 78 je 107675 return (void *) 0; /* * Do not attempt to allocate memory if not in correct system state. */ if ( _System_state_Is_up(_System_state_Get()) && 1075fd: 83 3d 9c 54 12 00 03 cmpl $0x3,0x12549c 107604: 75 09 jne 10760f !malloc_is_system_state_OK() ) 107606: e8 b5 fe ff ff call 1074c0 return (void *) 0; /* * Do not attempt to allocate memory if not in correct system state. */ if ( _System_state_Is_up(_System_state_Get()) && 10760b: 84 c0 test %al,%al 10760d: 74 66 je 107675 <== 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 ); 10760f: 6a 00 push $0x0 107611: 6a 00 push $0x0 107613: 56 push %esi 107614: ff 35 80 11 12 00 pushl 0x121180 10761a: e8 4d 43 00 00 call 10b96c <_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 ) { 10761f: 83 c4 10 add $0x10,%esp 107622: 89 c3 mov %eax,%ebx 107624: 85 c0 test %eax,%eax 107626: 75 28 jne 107650 if (rtems_malloc_sbrk_helpers) 107628: a1 74 36 12 00 mov 0x123674,%eax 10762d: 85 c0 test %eax,%eax 10762f: 74 10 je 107641 return_this = (*rtems_malloc_sbrk_helpers->extend)( size ); 107631: 83 ec 0c sub $0xc,%esp 107634: 56 push %esi 107635: ff 50 04 call *0x4(%eax) 107638: 89 c3 mov %eax,%ebx if ( !return_this ) { 10763a: 83 c4 10 add $0x10,%esp 10763d: 85 c0 test %eax,%eax 10763f: 75 0f jne 107650 errno = ENOMEM; 107641: e8 86 9a 00 00 call 1110cc <__errno> 107646: c7 00 0c 00 00 00 movl $0xc,(%eax) return (void *) 0; 10764c: 31 db xor %ebx,%ebx 10764e: eb 25 jmp 107675 } /* * If the user wants us to dirty the allocated memory, then do it. */ if ( rtems_malloc_dirty_helper ) 107650: a1 78 36 12 00 mov 0x123678,%eax 107655: 85 c0 test %eax,%eax 107657: 74 09 je 107662 (*rtems_malloc_dirty_helper)( return_this, size ); 107659: 52 push %edx 10765a: 52 push %edx 10765b: 56 push %esi 10765c: 53 push %ebx 10765d: ff d0 call *%eax 10765f: 83 c4 10 add $0x10,%esp /* * If configured, update the statistics */ if ( rtems_malloc_statistics_helpers ) 107662: a1 70 36 12 00 mov 0x123670,%eax 107667: 85 c0 test %eax,%eax 107669: 74 0a je 107675 (*rtems_malloc_statistics_helpers->at_malloc)(return_this); 10766b: 83 ec 0c sub $0xc,%esp 10766e: 53 push %ebx 10766f: ff 50 04 call *0x4(%eax) 107672: 83 c4 10 add $0x10,%esp return return_this; } 107675: 89 d8 mov %ebx,%eax 107677: 8d 65 f8 lea -0x8(%ebp),%esp 10767a: 5b pop %ebx 10767b: 5e pop %esi 10767c: c9 leave 10767d: c3 ret =============================================================================== 0010794c : } void *malloc_sbrk_extend_and_allocate( size_t size ) { 10794c: 55 push %ebp 10794d: 89 e5 mov %esp,%ebp 10794f: 57 push %edi 107950: 56 push %esi 107951: 53 push %ebx 107952: 83 ec 0c sub $0xc,%esp 107955: 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; 107958: 8b 0d 94 53 12 00 mov 0x125394,%ecx if ( sbrk_amount == 0 ) return (void *) 0; 10795e: 31 f6 xor %esi,%esi * in "page" amounts. */ sbrk_amount = RTEMS_Malloc_Sbrk_amount; if ( sbrk_amount == 0 ) 107960: 85 c9 test %ecx,%ecx 107962: 74 67 je 1079cb <== NEVER TAKEN return (void *) 0; the_size = ((size + sbrk_amount) / sbrk_amount * sbrk_amount); 107964: 8d 1c 0f lea (%edi,%ecx,1),%ebx 107967: 89 d8 mov %ebx,%eax 107969: 31 d2 xor %edx,%edx 10796b: f7 f1 div %ecx 10796d: 89 c3 mov %eax,%ebx 10796f: 0f af d9 imul %ecx,%ebx starting_address = (void *) sbrk(the_size); 107972: 83 ec 0c sub $0xc,%esp 107975: 53 push %ebx 107976: e8 d8 8a ff ff call 100453 if ( starting_address == (void*) -1 ) 10797b: 83 c4 10 add $0x10,%esp 10797e: 83 f8 ff cmp $0xffffffff,%eax 107981: 74 48 je 1079cb return (void *) 0; if ( !_Protected_heap_Extend( 107983: 52 push %edx 107984: 53 push %ebx 107985: 50 push %eax 107986: ff 35 80 11 12 00 pushl 0x121180 10798c: e8 73 43 00 00 call 10bd04 <_Protected_heap_Extend> 107991: 83 c4 10 add $0x10,%esp 107994: 84 c0 test %al,%al 107996: 75 18 jne 1079b0 RTEMS_Malloc_Heap, starting_address, the_size) ) { sbrk(-the_size); 107998: 83 ec 0c sub $0xc,%esp 10799b: f7 db neg %ebx 10799d: 53 push %ebx 10799e: e8 b0 8a ff ff call 100453 errno = ENOMEM; 1079a3: e8 ec 9c 00 00 call 111694 <__errno> 1079a8: c7 00 0c 00 00 00 movl $0xc,(%eax) 1079ae: eb 18 jmp 1079c8 return (void *) 0; } MSBUMP(space_available, the_size); 1079b0: 01 1d 68 53 12 00 add %ebx,0x125368 1079b6: 6a 00 push $0x0 1079b8: 6a 00 push $0x0 1079ba: 57 push %edi 1079bb: ff 35 80 11 12 00 pushl 0x121180 1079c1: e8 06 43 00 00 call 10bccc <_Protected_heap_Allocate_aligned_with_boundary> 1079c6: 89 c6 mov %eax,%esi return_this = _Protected_heap_Allocate( RTEMS_Malloc_Heap, size ); return return_this; 1079c8: 83 c4 10 add $0x10,%esp } 1079cb: 89 f0 mov %esi,%eax 1079cd: 8d 65 f4 lea -0xc(%ebp),%esp 1079d0: 5b pop %ebx 1079d1: 5e pop %esi 1079d2: 5f pop %edi 1079d3: c9 leave 1079d4: c3 ret =============================================================================== 001103af : */ int memfile_ftruncate( rtems_libio_t *iop, rtems_off64_t length ) { 1103af: 55 push %ebp 1103b0: 89 e5 mov %esp,%ebp 1103b2: 53 push %ebx 1103b3: 83 ec 14 sub $0x14,%esp 1103b6: 8b 4d 08 mov 0x8(%ebp),%ecx 1103b9: 8b 45 0c mov 0xc(%ebp),%eax 1103bc: 8b 55 10 mov 0x10(%ebp),%edx IMFS_jnode_t *the_jnode; the_jnode = iop->pathinfo.node_access; 1103bf: 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 ) 1103c2: 3b 53 54 cmp 0x54(%ebx),%edx 1103c5: 7c 15 jl 1103dc <== NEVER TAKEN 1103c7: 7f 05 jg 1103ce <== NEVER TAKEN 1103c9: 3b 43 50 cmp 0x50(%ebx),%eax 1103cc: 76 0e jbe 1103dc return IMFS_memfile_extend( the_jnode, length ); 1103ce: 51 push %ecx 1103cf: 52 push %edx 1103d0: 50 push %eax 1103d1: 53 push %ebx 1103d2: e8 bf fc ff ff call 110096 1103d7: 83 c4 10 add $0x10,%esp 1103da: eb 24 jmp 110400 /* * 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; 1103dc: 89 43 50 mov %eax,0x50(%ebx) 1103df: 89 53 54 mov %edx,0x54(%ebx) iop->size = the_jnode->info.file.size; 1103e2: 89 41 04 mov %eax,0x4(%ecx) 1103e5: 89 51 08 mov %edx,0x8(%ecx) IMFS_update_atime( the_jnode ); 1103e8: 50 push %eax 1103e9: 50 push %eax 1103ea: 6a 00 push $0x0 1103ec: 8d 45 f0 lea -0x10(%ebp),%eax 1103ef: 50 push %eax 1103f0: e8 cb 6f ff ff call 1073c0 1103f5: 8b 45 f0 mov -0x10(%ebp),%eax 1103f8: 89 43 40 mov %eax,0x40(%ebx) return 0; 1103fb: 83 c4 10 add $0x10,%esp 1103fe: 31 c0 xor %eax,%eax } 110400: 8b 5d fc mov -0x4(%ebp),%ebx 110403: c9 leave 110404: c3 ret =============================================================================== 00110405 : rtems_off64_t memfile_lseek( rtems_libio_t *iop, rtems_off64_t offset, int whence ) { 110405: 55 push %ebp 110406: 89 e5 mov %esp,%ebp 110408: 56 push %esi 110409: 53 push %ebx 11040a: 8b 5d 08 mov 0x8(%ebp),%ebx IMFS_jnode_t *the_jnode; the_jnode = iop->pathinfo.node_access; 11040d: 8b 73 18 mov 0x18(%ebx),%esi if (the_jnode->type == IMFS_LINEAR_FILE) { 110410: 83 7e 4c 06 cmpl $0x6,0x4c(%esi) 110414: 75 1a jne 110430 if (iop->offset > the_jnode->info.linearfile.size) 110416: 8b 56 50 mov 0x50(%esi),%edx 110419: 8b 46 54 mov 0x54(%esi),%eax 11041c: 39 43 10 cmp %eax,0x10(%ebx) 11041f: 7c 41 jl 110462 <== NEVER TAKEN 110421: 7f 05 jg 110428 <== NEVER TAKEN 110423: 39 53 0c cmp %edx,0xc(%ebx) 110426: 76 3a jbe 110462 <== ALWAYS TAKEN iop->offset = the_jnode->info.linearfile.size; 110428: 89 53 0c mov %edx,0xc(%ebx) <== NOT EXECUTED 11042b: 89 43 10 mov %eax,0x10(%ebx) <== NOT EXECUTED 11042e: eb 32 jmp 110462 <== NOT EXECUTED } else { /* Must be a block file (IMFS_MEMORY_FILE). */ if (IMFS_memfile_extend( the_jnode, iop->offset )) 110430: 50 push %eax 110431: ff 73 10 pushl 0x10(%ebx) 110434: ff 73 0c pushl 0xc(%ebx) 110437: 56 push %esi 110438: e8 59 fc ff ff call 110096 11043d: 83 c4 10 add $0x10,%esp 110440: 85 c0 test %eax,%eax 110442: 74 12 je 110456 rtems_set_errno_and_return_minus_one( ENOSPC ); 110444: e8 83 0c 00 00 call 1110cc <__errno> 110449: c7 00 1c 00 00 00 movl $0x1c,(%eax) 11044f: 83 c8 ff or $0xffffffff,%eax 110452: 89 c2 mov %eax,%edx 110454: eb 12 jmp 110468 iop->size = the_jnode->info.file.size; 110456: 8b 46 50 mov 0x50(%esi),%eax 110459: 8b 56 54 mov 0x54(%esi),%edx 11045c: 89 43 04 mov %eax,0x4(%ebx) 11045f: 89 53 08 mov %edx,0x8(%ebx) } return iop->offset; 110462: 8b 43 0c mov 0xc(%ebx),%eax 110465: 8b 53 10 mov 0x10(%ebx),%edx } 110468: 8d 65 f8 lea -0x8(%ebp),%esp 11046b: 5b pop %ebx 11046c: 5e pop %esi 11046d: c9 leave 11046e: c3 ret =============================================================================== 00110320 : rtems_libio_t *iop, const char *pathname, uint32_t flag, uint32_t mode ) { 110320: 55 push %ebp 110321: 89 e5 mov %esp,%ebp 110323: 56 push %esi 110324: 53 push %ebx 110325: 8b 75 08 mov 0x8(%ebp),%esi IMFS_jnode_t *the_jnode; the_jnode = iop->pathinfo.node_access; 110328: 8b 5e 18 mov 0x18(%esi),%ebx /* * Perform 'copy on write' for linear files */ if ((iop->flags & (LIBIO_FLAGS_WRITE | LIBIO_FLAGS_APPEND)) 11032b: f7 46 14 04 02 00 00 testl $0x204,0x14(%esi) 110332: 74 54 je 110388 && (the_jnode->type == IMFS_LINEAR_FILE)) { 110334: 83 7b 4c 06 cmpl $0x6,0x4c(%ebx) 110338: 75 4e jne 110388 <== ALWAYS TAKEN uint32_t count = the_jnode->info.linearfile.size; 11033a: 8b 43 50 mov 0x50(%ebx),%eax <== NOT EXECUTED const unsigned char *buffer = the_jnode->info.linearfile.direct; 11033d: 8b 53 58 mov 0x58(%ebx),%edx <== NOT EXECUTED the_jnode->type = IMFS_MEMORY_FILE; 110340: c7 43 4c 05 00 00 00 movl $0x5,0x4c(%ebx) <== NOT EXECUTED the_jnode->info.file.size = 0; 110347: c7 43 50 00 00 00 00 movl $0x0,0x50(%ebx) <== NOT EXECUTED 11034e: c7 43 54 00 00 00 00 movl $0x0,0x54(%ebx) <== NOT EXECUTED the_jnode->info.file.indirect = 0; 110355: c7 43 58 00 00 00 00 movl $0x0,0x58(%ebx) <== NOT EXECUTED the_jnode->info.file.doubly_indirect = 0; 11035c: c7 43 5c 00 00 00 00 movl $0x0,0x5c(%ebx) <== NOT EXECUTED the_jnode->info.file.triply_indirect = 0; 110363: c7 43 60 00 00 00 00 movl $0x0,0x60(%ebx) <== NOT EXECUTED if ((count != 0) 11036a: 85 c0 test %eax,%eax <== NOT EXECUTED 11036c: 74 1a je 110388 <== NOT EXECUTED && (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1)) 11036e: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 110371: 50 push %eax <== NOT EXECUTED 110372: 52 push %edx <== NOT EXECUTED 110373: 6a 00 push $0x0 <== NOT EXECUTED 110375: 6a 00 push $0x0 <== NOT EXECUTED 110377: 53 push %ebx <== NOT EXECUTED 110378: e8 0b fe ff ff call 110188 <== NOT EXECUTED 11037d: 89 c2 mov %eax,%edx <== NOT EXECUTED 11037f: 83 c4 20 add $0x20,%esp <== NOT EXECUTED return -1; 110382: 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)) 110385: 42 inc %edx <== NOT EXECUTED 110386: 74 20 je 1103a8 <== NOT EXECUTED return -1; } if (iop->flags & LIBIO_FLAGS_APPEND) 110388: f6 46 15 02 testb $0x2,0x15(%esi) 11038c: 74 0c je 11039a iop->offset = the_jnode->info.file.size; 11038e: 8b 43 50 mov 0x50(%ebx),%eax 110391: 8b 53 54 mov 0x54(%ebx),%edx 110394: 89 46 0c mov %eax,0xc(%esi) 110397: 89 56 10 mov %edx,0x10(%esi) iop->size = the_jnode->info.file.size; 11039a: 8b 43 50 mov 0x50(%ebx),%eax 11039d: 8b 53 54 mov 0x54(%ebx),%edx 1103a0: 89 46 04 mov %eax,0x4(%esi) 1103a3: 89 56 08 mov %edx,0x8(%esi) return 0; 1103a6: 31 c0 xor %eax,%eax } 1103a8: 8d 65 f8 lea -0x8(%ebp),%esp 1103ab: 5b pop %ebx 1103ac: 5e pop %esi 1103ad: c9 leave 1103ae: c3 ret =============================================================================== 001077b5 : const char *target, const char *filesystemtype, rtems_filesystem_options_t options, const void *data ) { 1077b5: 55 push %ebp 1077b6: 89 e5 mov %esp,%ebp 1077b8: 57 push %edi 1077b9: 56 push %esi 1077ba: 53 push %ebx 1077bb: 83 ec 4c sub $0x4c,%esp 1077be: 8b 75 10 mov 0x10(%ebp),%esi /* * Are the file system options valid? */ if ( options != RTEMS_FILESYSTEM_READ_ONLY && 1077c1: 83 7d 14 01 cmpl $0x1,0x14(%ebp) 1077c5: 77 13 ja 1077da rtems_set_errno_and_return_minus_one( EINVAL ); /* * Get mount handler */ mount_h = rtems_filesystem_get_mount_handler( filesystemtype ); 1077c7: 83 ec 0c sub $0xc,%esp 1077ca: 56 push %esi 1077cb: e8 77 6c 00 00 call 10e447 1077d0: 89 45 b0 mov %eax,-0x50(%ebp) if ( !mount_h ) 1077d3: 83 c4 10 add $0x10,%esp 1077d6: 85 c0 test %eax,%eax 1077d8: 75 10 jne 1077ea rtems_set_errno_and_return_minus_one( EINVAL ); 1077da: e8 ed 98 00 00 call 1110cc <__errno> 1077df: c7 00 16 00 00 00 movl $0x16,(%eax) 1077e5: e9 ca 00 00 00 jmp 1078b4 { 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; 1077ea: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) 1077ee: 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 : "/"; 1077f2: 8b 45 0c mov 0xc(%ebp),%eax 1077f5: 89 45 b8 mov %eax,-0x48(%ebp) 1077f8: 80 7d b7 00 cmpb $0x0,-0x49(%ebp) 1077fc: 75 07 jne 107805 1077fe: c7 45 b8 d4 ee 11 00 movl $0x11eed4,-0x48(%ebp) size_t filesystemtype_size = strlen( filesystemtype ) + 1; 107805: 83 ca ff or $0xffffffff,%edx 107808: 31 c0 xor %eax,%eax 10780a: 89 d1 mov %edx,%ecx 10780c: 89 f7 mov %esi,%edi 10780e: f2 ae repnz scas %es:(%edi),%al 107810: f7 d1 not %ecx 107812: 89 4d bc mov %ecx,-0x44(%ebp) size_t source_size = source_or_null != NULL ? strlen( source_or_null ) + 1 : 0; 107815: c7 45 c4 00 00 00 00 movl $0x0,-0x3c(%ebp) 10781c: 83 7d 08 00 cmpl $0x0,0x8(%ebp) 107820: 74 0c je 10782e 107822: 89 d1 mov %edx,%ecx 107824: 8b 7d 08 mov 0x8(%ebp),%edi 107827: f2 ae repnz scas %es:(%edi),%al 107829: f7 d1 not %ecx 10782b: 89 4d c4 mov %ecx,-0x3c(%ebp) size_t target_size = strlen( target ) + 1; 10782e: 31 c0 xor %eax,%eax 107830: 83 c9 ff or $0xffffffff,%ecx 107833: 8b 7d b8 mov -0x48(%ebp),%edi 107836: f2 ae repnz scas %es:(%edi),%al 107838: f7 d1 not %ecx 10783a: 89 4d c0 mov %ecx,-0x40(%ebp) 10783d: 49 dec %ecx 10783e: 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 ); 107841: 50 push %eax 107842: 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; 107843: 8b 55 c4 mov -0x3c(%ebp),%edx 107846: 8b 7d bc mov -0x44(%ebp),%edi 107849: 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 ) 10784d: 03 45 c0 add -0x40(%ebp),%eax + filesystemtype_size + source_size + target_size; rtems_filesystem_mount_table_entry_t *mt_entry = calloc( 1, size ); 107850: 50 push %eax 107851: 6a 01 push $0x1 107853: e8 84 f9 ff ff call 1071dc 107858: 89 c3 mov %eax,%ebx if ( mt_entry != NULL ) { 10785a: 83 c4 10 add $0x10,%esp 10785d: 85 c0 test %eax,%eax 10785f: 74 48 je 1078a9 <== NEVER TAKEN char *str = (char *) mt_entry + sizeof( *mt_entry ); 107861: 8d 40 74 lea 0x74(%eax),%eax memcpy( str, filesystemtype, filesystemtype_size ); 107864: 89 c7 mov %eax,%edi 107866: 8b 4d bc mov -0x44(%ebp),%ecx 107869: f3 a4 rep movsb %ds:(%esi),%es:(%edi) 10786b: 89 fa mov %edi,%edx mt_entry->type = str; 10786d: 89 43 6c mov %eax,0x6c(%ebx) str += filesystemtype_size; memcpy( str, source_or_null, source_size ); 107870: 8b 75 08 mov 0x8(%ebp),%esi 107873: 8b 4d c4 mov -0x3c(%ebp),%ecx 107876: f3 a4 rep movsb %ds:(%esi),%es:(%edi) 107878: 89 f8 mov %edi,%eax mt_entry->dev = str; 10787a: 89 53 70 mov %edx,0x70(%ebx) str += source_size; memcpy( str, target, target_size ); 10787d: 8b 75 b8 mov -0x48(%ebp),%esi 107880: 8b 4d c0 mov -0x40(%ebp),%ecx 107883: f3 a4 rep movsb %ds:(%esi),%es:(%edi) mt_entry->target = str; 107885: 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; 107888: 89 5b 2c mov %ebx,0x2c(%ebx) mt_entry->options = options; 10788b: 8b 45 14 mov 0x14(%ebp),%eax 10788e: 89 43 30 mov %eax,0x30(%ebx) mt_entry->pathconf_limits_and_options = rtems_filesystem_default_pathconf; 107891: 8d 7b 38 lea 0x38(%ebx),%edi 107894: be 14 ef 11 00 mov $0x11ef14,%esi 107899: b1 0c mov $0xc,%cl 10789b: 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 ) { 10789d: 80 7d b7 00 cmpb $0x0,-0x49(%ebp) 1078a1: 0f 84 a3 00 00 00 je 10794a 1078a7: eb 13 jmp 1078bc target, filesystemtype, &target_length ); if ( !mt_entry ) rtems_set_errno_and_return_minus_one( ENOMEM ); 1078a9: e8 1e 98 00 00 call 1110cc <__errno> <== NOT EXECUTED 1078ae: c7 00 0c 00 00 00 movl $0xc,(%eax) <== NOT EXECUTED 1078b4: 83 c8 ff or $0xffffffff,%eax 1078b7: e9 26 01 00 00 jmp 1079e2 * The mount_point should be a directory with read/write/execute * permissions in the existing tree. */ if ( has_target ) { if ( rtems_filesystem_evaluate_path( 1078bc: 83 ec 0c sub $0xc,%esp 1078bf: 6a 01 push $0x1 1078c1: 8d 75 d4 lea -0x2c(%ebp),%esi 1078c4: 56 push %esi 1078c5: 6a 07 push $0x7 1078c7: ff 75 ac pushl -0x54(%ebp) 1078ca: ff 75 0c pushl 0xc(%ebp) 1078cd: e8 a4 f9 ff ff call 107276 1078d2: 83 c4 20 add $0x20,%esp 1078d5: 40 inc %eax 1078d6: 0f 84 df 00 00 00 je 1079bb <== NEVER TAKEN /* * Test to see if it is a directory */ if ( loc.ops->node_type_h( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) { 1078dc: 83 ec 0c sub $0xc,%esp 1078df: 56 push %esi 1078e0: 8b 45 e0 mov -0x20(%ebp),%eax 1078e3: ff 50 10 call *0x10(%eax) 1078e6: 83 c4 10 add $0x10,%esp 1078e9: 48 dec %eax 1078ea: 74 10 je 1078fc errno = ENOTDIR; 1078ec: e8 db 97 00 00 call 1110cc <__errno> 1078f1: c7 00 14 00 00 00 movl $0x14,(%eax) goto cleanup_and_bail; 1078f7: e9 c1 00 00 00 jmp 1079bd /* * You can only mount one file system onto a single mount point. */ if ( rtems_filesystem_mount_iterate( is_node_fs_root, loc.node_access ) ) { 1078fc: 57 push %edi 1078fd: 57 push %edi 1078fe: ff 75 d4 pushl -0x2c(%ebp) 107901: 68 2c 77 10 00 push $0x10772c 107906: e8 62 fe ff ff call 10776d 10790b: 83 c4 10 add $0x10,%esp 10790e: 84 c0 test %al,%al 107910: 74 10 je 107922 errno = EBUSY; 107912: e8 b5 97 00 00 call 1110cc <__errno> 107917: c7 00 10 00 00 00 movl $0x10,(%eax) goto cleanup_and_bail; 10791d: e9 9b 00 00 00 jmp 1079bd * 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; 107922: 8b 45 d4 mov -0x2c(%ebp),%eax 107925: 89 43 08 mov %eax,0x8(%ebx) mt_entry->mt_point_node.handlers = loc.handlers; 107928: 8b 45 dc mov -0x24(%ebp),%eax 10792b: 89 43 10 mov %eax,0x10(%ebx) mt_entry->mt_point_node.ops = loc.ops; 10792e: 8b 45 e0 mov -0x20(%ebp),%eax 107931: 89 43 14 mov %eax,0x14(%ebx) mt_entry->mt_point_node.mt_entry = loc.mt_entry; 107934: 8b 55 e4 mov -0x1c(%ebp),%edx 107937: 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 ) ) { 10793a: 83 ec 0c sub $0xc,%esp 10793d: 53 push %ebx 10793e: ff 50 20 call *0x20(%eax) 107941: 83 c4 10 add $0x10,%esp 107944: 85 c0 test %eax,%eax 107946: 74 1d je 107965 <== ALWAYS TAKEN 107948: eb 73 jmp 1079bd <== 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; 10794a: 31 f6 xor %esi,%esi } } else { /* * Do we already have a base file system ? */ if ( !rtems_chain_is_empty( &mount_chain ) ) { 10794c: 81 3d 64 2f 12 00 68 cmpl $0x122f68,0x122f64 107953: 2f 12 00 107956: 74 0d je 107965 <== ALWAYS TAKEN errno = EINVAL; 107958: e8 6f 97 00 00 call 1110cc <__errno> <== NOT EXECUTED 10795d: c7 00 16 00 00 00 movl $0x16,(%eax) <== NOT EXECUTED goto cleanup_and_bail; 107963: eb 58 jmp 1079bd <== 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 ) ) { 107965: 51 push %ecx 107966: 51 push %ecx 107967: ff 75 18 pushl 0x18(%ebp) 10796a: 53 push %ebx 10796b: ff 55 b0 call *-0x50(%ebp) 10796e: 83 c4 10 add $0x10,%esp 107971: 85 c0 test %eax,%eax 107973: 74 0f je 107984 /* * Try to undo the mount operation */ loc.ops->unmount_h( mt_entry ); 107975: 83 ec 0c sub $0xc,%esp 107978: 53 push %ebx 107979: 8b 45 e0 mov -0x20(%ebp),%eax 10797c: ff 50 28 call *0x28(%eax) goto cleanup_and_bail; 10797f: 83 c4 10 add $0x10,%esp 107982: eb 39 jmp 1079bd } /* * Add the mount table entry to the mount table chain */ rtems_libio_lock(); 107984: e8 b4 fd ff ff call 10773d 107989: 52 push %edx 10798a: 52 push %edx 10798b: 53 push %ebx 10798c: 68 64 2f 12 00 push $0x122f64 107991: e8 4a 30 00 00 call 10a9e0 <_Chain_Append> rtems_chain_append( &mount_chain, &mt_entry->Node ); rtems_libio_unlock(); 107996: e8 bc fd ff ff call 107757 if ( !has_target ) 10799b: 83 c4 10 add $0x10,%esp rtems_filesystem_root = mt_entry->mt_fs_root; return 0; 10799e: 31 c0 xor %eax,%eax */ rtems_libio_lock(); rtems_chain_append( &mount_chain, &mt_entry->Node ); rtems_libio_unlock(); if ( !has_target ) 1079a0: 80 7d b7 00 cmpb $0x0,-0x49(%ebp) 1079a4: 75 3c jne 1079e2 rtems_filesystem_root = mt_entry->mt_fs_root; 1079a6: 8b 3d 80 30 12 00 mov 0x123080,%edi 1079ac: 83 c7 18 add $0x18,%edi 1079af: 8d 73 1c lea 0x1c(%ebx),%esi 1079b2: b9 05 00 00 00 mov $0x5,%ecx 1079b7: f3 a5 rep movsl %ds:(%esi),%es:(%edi) 1079b9: eb 27 jmp 1079e2 ) { 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; 1079bb: 31 f6 xor %esi,%esi return 0; cleanup_and_bail: free( mt_entry ); 1079bd: 83 ec 0c sub $0xc,%esp 1079c0: 53 push %ebx 1079c1: e8 82 f9 ff ff call 107348 if ( loc_to_free ) 1079c6: 83 c4 10 add $0x10,%esp rtems_filesystem_freenode( loc_to_free ); return -1; 1079c9: 83 c8 ff or $0xffffffff,%eax cleanup_and_bail: free( mt_entry ); if ( loc_to_free ) 1079cc: 85 f6 test %esi,%esi 1079ce: 74 12 je 1079e2 <== NEVER TAKEN rtems_filesystem_freenode( loc_to_free ); 1079d0: 83 ec 0c sub $0xc,%esp 1079d3: 56 push %esi 1079d4: 89 45 a8 mov %eax,-0x58(%ebp) 1079d7: e8 58 f9 ff ff call 107334 1079dc: 83 c4 10 add $0x10,%esp 1079df: 8b 45 a8 mov -0x58(%ebp),%eax return -1; } 1079e2: 8d 65 f4 lea -0xc(%ebp),%esp 1079e5: 5b pop %ebx 1079e6: 5e pop %esi 1079e7: 5f pop %edi 1079e8: c9 leave 1079e9: c3 ret =============================================================================== 00107d3c : const char *target, const char *filesystemtype, rtems_filesystem_options_t options, const void *data ) { 107d3c: 55 push %ebp 107d3d: 89 e5 mov %esp,%ebp 107d3f: 57 push %edi 107d40: 56 push %esi 107d41: 53 push %ebx 107d42: 83 ec 1c sub $0x1c,%esp 107d45: 8b 4d 08 mov 0x8(%ebp),%ecx 107d48: 8b 5d 0c mov 0xc(%ebp),%ebx 107d4b: 8b 75 10 mov 0x10(%ebp),%esi 107d4e: 8b 7d 14 mov 0x14(%ebp),%edi 107d51: 8b 55 18 mov 0x18(%ebp),%edx int rv = -1; if (target != NULL) { 107d54: 85 db test %ebx,%ebx 107d56: 74 3b je 107d93 rv = rtems_mkdir(target, S_IRWXU | S_IRWXG | S_IRWXO); 107d58: 50 push %eax 107d59: 50 push %eax 107d5a: 68 ff 01 00 00 push $0x1ff 107d5f: 53 push %ebx 107d60: 89 55 e0 mov %edx,-0x20(%ebp) 107d63: 89 4d e4 mov %ecx,-0x1c(%ebp) 107d66: e8 bd 08 00 00 call 108628 if (rv == 0) { 107d6b: 83 c4 10 add $0x10,%esp 107d6e: 85 c0 test %eax,%eax 107d70: 8b 55 e0 mov -0x20(%ebp),%edx 107d73: 8b 4d e4 mov -0x1c(%ebp),%ecx 107d76: 75 29 jne 107da1 <== NEVER TAKEN rv = mount( 107d78: 89 55 18 mov %edx,0x18(%ebp) 107d7b: 89 7d 14 mov %edi,0x14(%ebp) 107d7e: 89 75 10 mov %esi,0x10(%ebp) 107d81: 89 5d 0c mov %ebx,0xc(%ebp) 107d84: 89 4d 08 mov %ecx,0x8(%ebp) } else { errno = EINVAL; } return rv; } 107d87: 8d 65 f4 lea -0xc(%ebp),%esp 107d8a: 5b pop %ebx 107d8b: 5e pop %esi 107d8c: 5f pop %edi 107d8d: c9 leave int rv = -1; if (target != NULL) { rv = rtems_mkdir(target, S_IRWXU | S_IRWXG | S_IRWXO); if (rv == 0) { rv = mount( 107d8e: e9 a2 00 00 00 jmp 107e35 options, data ); } } else { errno = EINVAL; 107d93: e8 b0 99 00 00 call 111748 <__errno> 107d98: c7 00 16 00 00 00 movl $0x16,(%eax) const char *filesystemtype, rtems_filesystem_options_t options, const void *data ) { int rv = -1; 107d9e: 83 c8 ff or $0xffffffff,%eax } else { errno = EINVAL; } return rv; } 107da1: 8d 65 f4 lea -0xc(%ebp),%esp 107da4: 5b pop %ebx 107da5: 5e pop %esi 107da6: 5f pop %edi 107da7: c9 leave 107da8: c3 ret =============================================================================== 00107a45 : */ bool newlib_create_hook( rtems_tcb *current_task __attribute__((unused)), rtems_tcb *creating_task ) { 107a45: 55 push %ebp 107a46: 89 e5 mov %esp,%ebp 107a48: 57 push %edi 107a49: 56 push %esi 107a4a: 53 push %ebx 107a4b: 83 ec 1c sub $0x1c,%esp struct _reent *ptr; if (_Thread_libc_reent == 0) 107a4e: 83 3d c8 53 12 00 00 cmpl $0x0,0x1253c8 107a55: 75 14 jne 107a6b { _REENT = _global_impure_ptr; 107a57: a1 c0 f9 11 00 mov 0x11f9c0,%eax 107a5c: 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; 107a61: c7 05 c8 53 12 00 40 movl $0x123140,0x1253c8 107a68: 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)); 107a6b: 83 ec 0c sub $0xc,%esp 107a6e: 68 24 04 00 00 push $0x424 107a73: e8 6e 55 00 00 call 10cfe6 <_Workspace_Allocate> 107a78: 89 c2 mov %eax,%edx #endif if (ptr) { 107a7a: 83 c4 10 add $0x10,%esp _REENT_INIT_PTR((ptr)); /* GCC extension: structure constants */ creating_task->libc_reent = ptr; return TRUE; } return FALSE; 107a7d: 31 c0 xor %eax,%eax * hooks run with thread dispatching disabled. */ ptr = (struct _reent *) _Workspace_Allocate(sizeof(struct _reent)); #endif if (ptr) { 107a7f: 85 d2 test %edx,%edx 107a81: 0f 84 28 02 00 00 je 107caf <== NEVER TAKEN _REENT_INIT_PTR((ptr)); /* GCC extension: structure constants */ 107a87: c7 02 00 00 00 00 movl $0x0,(%edx) 107a8d: 8d b2 ec 02 00 00 lea 0x2ec(%edx),%esi 107a93: 89 72 04 mov %esi,0x4(%edx) 107a96: 8d 8a 54 03 00 00 lea 0x354(%edx),%ecx 107a9c: 89 4a 08 mov %ecx,0x8(%edx) 107a9f: 8d 8a bc 03 00 00 lea 0x3bc(%edx),%ecx 107aa5: 89 4a 0c mov %ecx,0xc(%edx) 107aa8: c7 42 10 00 00 00 00 movl $0x0,0x10(%edx) 107aaf: 8d 4a 14 lea 0x14(%edx),%ecx 107ab2: bb 19 00 00 00 mov $0x19,%ebx 107ab7: 89 cf mov %ecx,%edi 107ab9: 89 d9 mov %ebx,%ecx 107abb: f3 aa rep stos %al,%es:(%edi) 107abd: 89 cb mov %ecx,%ebx 107abf: c7 42 30 00 00 00 00 movl $0x0,0x30(%edx) 107ac6: c7 42 34 66 ec 11 00 movl $0x11ec66,0x34(%edx) 107acd: c7 42 38 00 00 00 00 movl $0x0,0x38(%edx) 107ad4: c7 42 3c 00 00 00 00 movl $0x0,0x3c(%edx) 107adb: c7 42 40 00 00 00 00 movl $0x0,0x40(%edx) 107ae2: c7 42 44 00 00 00 00 movl $0x0,0x44(%edx) 107ae9: c7 42 48 00 00 00 00 movl $0x0,0x48(%edx) 107af0: c7 42 4c 00 00 00 00 movl $0x0,0x4c(%edx) 107af7: c7 42 50 00 00 00 00 movl $0x0,0x50(%edx) 107afe: c7 42 54 00 00 00 00 movl $0x0,0x54(%edx) 107b05: c7 42 58 00 00 00 00 movl $0x0,0x58(%edx) 107b0c: c7 42 5c 00 00 00 00 movl $0x0,0x5c(%edx) 107b13: c6 42 60 00 movb $0x0,0x60(%edx) 107b17: 8d 42 7c lea 0x7c(%edx),%eax 107b1a: 89 45 e4 mov %eax,-0x1c(%ebp) 107b1d: b1 09 mov $0x9,%cl 107b1f: 89 c7 mov %eax,%edi 107b21: 89 d8 mov %ebx,%eax 107b23: f3 ab rep stos %eax,%es:(%edi) 107b25: c7 82 a0 00 00 00 00 movl $0x0,0xa0(%edx) 107b2c: 00 00 00 107b2f: c7 82 a4 00 00 00 01 movl $0x1,0xa4(%edx) 107b36: 00 00 00 107b39: c7 82 a8 00 00 00 00 movl $0x0,0xa8(%edx) 107b40: 00 00 00 107b43: 66 c7 82 ac 00 00 00 movw $0x330e,0xac(%edx) 107b4a: 0e 33 107b4c: 66 c7 82 ae 00 00 00 movw $0xabcd,0xae(%edx) 107b53: cd ab 107b55: 66 c7 82 b0 00 00 00 movw $0x1234,0xb0(%edx) 107b5c: 34 12 107b5e: 66 c7 82 b2 00 00 00 movw $0xe66d,0xb2(%edx) 107b65: 6d e6 107b67: 66 c7 82 b4 00 00 00 movw $0xdeec,0xb4(%edx) 107b6e: ec de 107b70: 66 c7 82 b6 00 00 00 movw $0x5,0xb6(%edx) 107b77: 05 00 107b79: 66 c7 82 b8 00 00 00 movw $0xb,0xb8(%edx) 107b80: 0b 00 107b82: c7 82 bc 00 00 00 00 movl $0x0,0xbc(%edx) 107b89: 00 00 00 107b8c: c7 82 c0 00 00 00 00 movl $0x0,0xc0(%edx) 107b93: 00 00 00 107b96: c7 82 c4 00 00 00 00 movl $0x0,0xc4(%edx) 107b9d: 00 00 00 107ba0: c7 82 c8 00 00 00 00 movl $0x0,0xc8(%edx) 107ba7: 00 00 00 107baa: c7 82 cc 00 00 00 00 movl $0x0,0xcc(%edx) 107bb1: 00 00 00 107bb4: c7 82 d0 00 00 00 00 movl $0x0,0xd0(%edx) 107bbb: 00 00 00 107bbe: c7 82 f8 00 00 00 00 movl $0x0,0xf8(%edx) 107bc5: 00 00 00 107bc8: c7 82 fc 00 00 00 00 movl $0x0,0xfc(%edx) 107bcf: 00 00 00 107bd2: c7 82 00 01 00 00 00 movl $0x0,0x100(%edx) 107bd9: 00 00 00 107bdc: c7 82 04 01 00 00 00 movl $0x0,0x104(%edx) 107be3: 00 00 00 107be6: c7 82 08 01 00 00 00 movl $0x0,0x108(%edx) 107bed: 00 00 00 107bf0: c7 82 0c 01 00 00 00 movl $0x0,0x10c(%edx) 107bf7: 00 00 00 107bfa: c7 82 10 01 00 00 00 movl $0x0,0x110(%edx) 107c01: 00 00 00 107c04: c7 82 14 01 00 00 00 movl $0x0,0x114(%edx) 107c0b: 00 00 00 107c0e: c7 82 18 01 00 00 00 movl $0x0,0x118(%edx) 107c15: 00 00 00 107c18: c7 82 1c 01 00 00 00 movl $0x0,0x11c(%edx) 107c1f: 00 00 00 107c22: c6 82 d4 00 00 00 00 movb $0x0,0xd4(%edx) 107c29: c6 82 dc 00 00 00 00 movb $0x0,0xdc(%edx) 107c30: c7 82 f4 00 00 00 00 movl $0x0,0xf4(%edx) 107c37: 00 00 00 107c3a: c7 82 48 01 00 00 00 movl $0x0,0x148(%edx) 107c41: 00 00 00 107c44: c7 82 4c 01 00 00 00 movl $0x0,0x14c(%edx) 107c4b: 00 00 00 107c4e: c7 82 50 01 00 00 00 movl $0x0,0x150(%edx) 107c55: 00 00 00 107c58: c7 82 54 01 00 00 00 movl $0x0,0x154(%edx) 107c5f: 00 00 00 107c62: c7 82 d4 02 00 00 00 movl $0x0,0x2d4(%edx) 107c69: 00 00 00 107c6c: c7 82 d4 01 00 00 00 movl $0x0,0x1d4(%edx) 107c73: 00 00 00 107c76: c7 82 dc 02 00 00 00 movl $0x0,0x2dc(%edx) 107c7d: 00 00 00 107c80: c7 82 e0 02 00 00 00 movl $0x0,0x2e0(%edx) 107c87: 00 00 00 107c8a: c7 82 e4 02 00 00 00 movl $0x0,0x2e4(%edx) 107c91: 00 00 00 107c94: c7 82 e8 02 00 00 00 movl $0x0,0x2e8(%edx) 107c9b: 00 00 00 107c9e: b1 4e mov $0x4e,%cl 107ca0: 89 f7 mov %esi,%edi 107ca2: f3 ab rep stos %eax,%es:(%edi) creating_task->libc_reent = ptr; 107ca4: 8b 45 0c mov 0xc(%ebp),%eax 107ca7: 89 90 e4 00 00 00 mov %edx,0xe4(%eax) return TRUE; 107cad: b0 01 mov $0x1,%al } return FALSE; } 107caf: 8d 65 f4 lea -0xc(%ebp),%esp 107cb2: 5b pop %ebx 107cb3: 5e pop %esi 107cb4: 5f pop %edi 107cb5: c9 leave 107cb6: c3 ret =============================================================================== 00107cb7 : void newlib_delete_hook( rtems_tcb *current_task, rtems_tcb *deleted_task ) { 107cb7: 55 push %ebp 107cb8: 89 e5 mov %esp,%ebp 107cba: 57 push %edi 107cbb: 56 push %esi 107cbc: 53 push %ebx 107cbd: 83 ec 0c sub $0xc,%esp 107cc0: 8b 7d 08 mov 0x8(%ebp),%edi 107cc3: 8b 75 0c mov 0xc(%ebp),%esi /* * The reentrancy structure was allocated by newlib using malloc() */ if (current_task == deleted_task) { 107cc6: 39 f7 cmp %esi,%edi 107cc8: 75 08 jne 107cd2 ptr = _REENT; 107cca: 8b 1d 40 31 12 00 mov 0x123140,%ebx 107cd0: eb 06 jmp 107cd8 } else { ptr = deleted_task->libc_reent; 107cd2: 8b 9e e4 00 00 00 mov 0xe4(%esi),%ebx } if (ptr && ptr != _global_impure_ptr) { 107cd8: 85 db test %ebx,%ebx 107cda: 74 20 je 107cfc <== NEVER TAKEN 107cdc: 3b 1d c0 f9 11 00 cmp 0x11f9c0,%ebx 107ce2: 74 18 je 107cfc _reclaim_reent(ptr); */ /* * Just in case there are some buffers lying around. */ _fwalk(ptr, newlib_free_buffers); 107ce4: 50 push %eax 107ce5: 50 push %eax 107ce6: 68 f4 79 10 00 push $0x1079f4 107ceb: 53 push %ebx 107cec: e8 c3 9b 00 00 call 1118b4 <_fwalk> #if REENT_MALLOCED free(ptr); #else _Workspace_Free(ptr); 107cf1: 89 1c 24 mov %ebx,(%esp) 107cf4: e8 06 53 00 00 call 10cfff <_Workspace_Free> 107cf9: 83 c4 10 add $0x10,%esp #endif } deleted_task->libc_reent = NULL; 107cfc: c7 86 e4 00 00 00 00 movl $0x0,0xe4(%esi) 107d03: 00 00 00 /* * Require the switch back to another task to install its own */ if ( current_task == deleted_task ) { 107d06: 39 f7 cmp %esi,%edi 107d08: 75 0a jne 107d14 _REENT = 0; 107d0a: c7 05 40 31 12 00 00 movl $0x0,0x123140 107d11: 00 00 00 } } 107d14: 8d 65 f4 lea -0xc(%ebp),%esp 107d17: 5b pop %ebx 107d18: 5e pop %esi 107d19: 5f pop %edi 107d1a: c9 leave 107d1b: c3 ret =============================================================================== 001079f4 : */ int newlib_free_buffers( FILE *fp ) { 1079f4: 55 push %ebp 1079f5: 89 e5 mov %esp,%ebp 1079f7: 53 push %ebx 1079f8: 83 ec 10 sub $0x10,%esp 1079fb: 8b 5d 08 mov 0x8(%ebp),%ebx switch ( fileno(fp) ) { 1079fe: 53 push %ebx 1079ff: e8 9c 9a 00 00 call 1114a0 107a04: 83 c4 10 add $0x10,%esp 107a07: 83 f8 02 cmp $0x2,%eax 107a0a: 77 26 ja 107a32 <== NEVER TAKEN case 0: case 1: case 2: if (fp->_flags & __SMBF) { 107a0c: f6 43 0c 80 testb $0x80,0xc(%ebx) 107a10: 74 2c je 107a3e <== ALWAYS TAKEN free( fp->_bf._base ); 107a12: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 107a15: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED 107a18: e8 2b f9 ff ff call 107348 <== NOT EXECUTED fp->_flags &= ~__SMBF; 107a1d: 66 81 63 0c 7f ff andw $0xff7f,0xc(%ebx) <== NOT EXECUTED fp->_bf._base = fp->_p = (unsigned char *) NULL; 107a23: c7 03 00 00 00 00 movl $0x0,(%ebx) <== NOT EXECUTED 107a29: c7 43 10 00 00 00 00 movl $0x0,0x10(%ebx) <== NOT EXECUTED 107a30: eb 09 jmp 107a3b <== NOT EXECUTED } break; default: fclose(fp); 107a32: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 107a35: 53 push %ebx <== NOT EXECUTED 107a36: e8 e9 97 00 00 call 111224 <== NOT EXECUTED 107a3b: 83 c4 10 add $0x10,%esp <== NOT EXECUTED } return 0; } 107a3e: 31 c0 xor %eax,%eax 107a40: 8b 5d fc mov -0x4(%ebp),%ebx 107a43: c9 leave 107a44: c3 ret =============================================================================== 00107d7c : int open( const char *pathname, int flags, ... ) { 107d7c: 55 push %ebp 107d7d: 89 e5 mov %esp,%ebp 107d7f: 57 push %edi 107d80: 56 push %esi 107d81: 53 push %ebx 107d82: 83 ec 3c sub $0x3c,%esp /* * Set the Evaluation flags */ eval_flags = 0; status = flags + 1; 107d85: 8b 45 0c mov 0xc(%ebp),%eax 107d88: 40 inc %eax if ( ( status & _FREAD ) == _FREAD ) 107d89: 89 c6 mov %eax,%esi 107d8b: 83 e6 01 and $0x1,%esi eval_flags |= RTEMS_LIBIO_PERMS_READ; 107d8e: f7 de neg %esi 107d90: 83 e6 04 and $0x4,%esi if ( ( status & _FWRITE ) == _FWRITE ) 107d93: a8 02 test $0x2,%al 107d95: 74 03 je 107d9a eval_flags |= RTEMS_LIBIO_PERMS_WRITE; 107d97: 83 ce 02 or $0x2,%esi va_start(ap, flags); mode = va_arg( ap, int ); 107d9a: 8b 45 10 mov 0x10(%ebp),%eax 107d9d: 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(); 107da0: e8 86 64 00 00 call 10e22b 107da5: 89 c3 mov %eax,%ebx if ( iop == 0 ) { 107da7: 85 c0 test %eax,%eax 107da9: 0f 84 56 01 00 00 je 107f05 } /* * See if the file exists. */ status = rtems_filesystem_evaluate_path( 107daf: 83 c9 ff or $0xffffffff,%ecx 107db2: 8b 7d 08 mov 0x8(%ebp),%edi 107db5: 31 c0 xor %eax,%eax 107db7: f2 ae repnz scas %es:(%edi),%al 107db9: f7 d1 not %ecx 107dbb: 49 dec %ecx 107dbc: 83 ec 0c sub $0xc,%esp 107dbf: 6a 01 push $0x1 107dc1: 8d 45 d4 lea -0x2c(%ebp),%eax 107dc4: 50 push %eax 107dc5: 56 push %esi 107dc6: 51 push %ecx 107dc7: ff 75 08 pushl 0x8(%ebp) 107dca: e8 a7 f4 ff ff call 107276 107dcf: 89 c6 mov %eax,%esi pathname, strlen( pathname ), eval_flags, &loc, true ); if ( status == -1 ) { 107dd1: 83 c4 20 add $0x20,%esp 107dd4: 83 f8 ff cmp $0xffffffff,%eax 107dd7: 75 6c jne 107e45 if ( errno != ENOENT ) { 107dd9: e8 ee 92 00 00 call 1110cc <__errno> 107dde: 83 38 02 cmpl $0x2,(%eax) 107de1: 75 27 jne 107e0a rc = errno; goto done; } /* If the file does not exist and we are not trying to create it--> error */ if ( !(flags & O_CREAT) ) { 107de3: f7 45 0c 00 02 00 00 testl $0x200,0xc(%ebp) 107dea: 0f 84 1c 01 00 00 je 107f0c rc = ENOENT; goto done; } /* Create the node for the new regular file */ rc = mknod( pathname, S_IFREG | mode, 0LL ); 107df0: 6a 00 push $0x0 107df2: 6a 00 push $0x0 107df4: 8b 45 c4 mov -0x3c(%ebp),%eax 107df7: 80 cc 80 or $0x80,%ah 107dfa: 50 push %eax 107dfb: ff 75 08 pushl 0x8(%ebp) 107dfe: e8 99 f8 ff ff call 10769c if ( rc ) { 107e03: 83 c4 10 add $0x10,%esp 107e06: 85 c0 test %eax,%eax 107e08: 74 0e je 107e18 <== ALWAYS TAKEN rc = errno; 107e0a: e8 bd 92 00 00 call 1110cc <__errno> 107e0f: 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; 107e11: 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; 107e13: e9 10 01 00 00 jmp 107f28 /* * 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( 107e18: 89 f1 mov %esi,%ecx 107e1a: 8b 7d 08 mov 0x8(%ebp),%edi 107e1d: 31 c0 xor %eax,%eax 107e1f: f2 ae repnz scas %es:(%edi),%al 107e21: f7 d1 not %ecx 107e23: 49 dec %ecx 107e24: 83 ec 0c sub $0xc,%esp 107e27: 6a 01 push $0x1 107e29: 8d 45 d4 lea -0x2c(%ebp),%eax 107e2c: 50 push %eax 107e2d: 6a 00 push $0x0 107e2f: 51 push %ecx 107e30: ff 75 08 pushl 0x8(%ebp) 107e33: e8 3e f4 ff ff call 107276 pathname, strlen( pathname ), 0x0, &loc, true ); if ( status != 0 ) { /* The file did not exist */ 107e38: 83 c4 20 add $0x20,%esp 107e3b: 85 c0 test %eax,%eax 107e3d: 0f 85 d2 00 00 00 jne 107f15 <== NEVER TAKEN 107e43: eb 13 jmp 107e58 rc = EACCES; goto done; } } else if ((flags & (O_EXCL|O_CREAT)) == (O_EXCL|O_CREAT)) { 107e45: 8b 45 0c mov 0xc(%ebp),%eax 107e48: 25 00 0a 00 00 and $0xa00,%eax 107e4d: 3d 00 0a 00 00 cmp $0xa00,%eax 107e52: 0f 84 c6 00 00 00 je 107f1e <== NEVER TAKEN /* * Fill in the file control block based on the loc structure * returned by successful path evaluation. */ iop->flags |= rtems_libio_fcntl_flags( flags ); 107e58: 8b 73 14 mov 0x14(%ebx),%esi 107e5b: 83 ec 0c sub $0xc,%esp 107e5e: ff 75 0c pushl 0xc(%ebp) 107e61: e8 52 63 00 00 call 10e1b8 107e66: 09 f0 or %esi,%eax 107e68: 89 43 14 mov %eax,0x14(%ebx) iop->pathinfo = loc; 107e6b: 8d 7b 18 lea 0x18(%ebx),%edi 107e6e: 8d 75 d4 lea -0x2c(%ebp),%esi 107e71: b9 05 00 00 00 mov $0x5,%ecx 107e76: f3 a5 rep movsl %ds:(%esi),%es:(%edi) rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode ); 107e78: 8b 43 20 mov 0x20(%ebx),%eax 107e7b: ff 75 c4 pushl -0x3c(%ebp) 107e7e: ff 75 0c pushl 0xc(%ebp) 107e81: ff 75 08 pushl 0x8(%ebp) 107e84: 53 push %ebx 107e85: ff 10 call *(%eax) if ( rc ) { 107e87: 83 c4 20 add $0x20,%esp 107e8a: 85 c0 test %eax,%eax 107e8c: 74 0f je 107e9d rc = errno; 107e8e: e8 39 92 00 00 call 1110cc <__errno> 107e93: 8b 30 mov (%eax),%esi rc = EEXIST; loc_to_free = &loc; goto done; } loc_to_free = &loc; 107e95: 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; 107e98: e9 8b 00 00 00 jmp 107f28 } /* * Optionally truncate the file. */ if ( (flags & O_TRUNC) == O_TRUNC ) { 107e9d: f7 45 0c 00 04 00 00 testl $0x400,0xc(%ebp) 107ea4: 0f 84 ae 00 00 00 je 107f58 rc = ftruncate( iop - rtems_libio_iops, 0 ); 107eaa: 50 push %eax 107eab: 6a 00 push $0x0 107ead: 6a 00 push $0x0 107eaf: 89 d8 mov %ebx,%eax 107eb1: 2b 05 f8 51 12 00 sub 0x1251f8,%eax 107eb7: c1 f8 03 sar $0x3,%eax 107eba: 69 c0 b7 6d db b6 imul $0xb6db6db7,%eax,%eax 107ec0: 50 push %eax 107ec1: e8 0a 62 00 00 call 10e0d0 107ec6: 89 c6 mov %eax,%esi if ( rc ) { 107ec8: 83 c4 10 add $0x10,%esp 107ecb: 85 c0 test %eax,%eax 107ecd: 0f 84 85 00 00 00 je 107f58 if(errno) rc = errno; 107ed3: e8 f4 91 00 00 call 1110cc <__errno> 107ed8: 83 38 00 cmpl $0x0,(%eax) 107edb: 74 07 je 107ee4 <== NEVER TAKEN 107edd: e8 ea 91 00 00 call 1110cc <__errno> 107ee2: 8b 30 mov (%eax),%esi close( iop - rtems_libio_iops ); 107ee4: 83 ec 0c sub $0xc,%esp 107ee7: 2b 1d f8 51 12 00 sub 0x1251f8,%ebx 107eed: c1 fb 03 sar $0x3,%ebx 107ef0: 69 db b7 6d db b6 imul $0xb6db6db7,%ebx,%ebx 107ef6: 53 push %ebx 107ef7: e8 64 61 00 00 call 10e060 107efc: 83 c4 10 add $0x10,%esp /* those are released by close(): */ iop = 0; loc_to_free = NULL; 107eff: 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; 107f01: 31 db xor %ebx,%ebx 107f03: eb 23 jmp 107f28 */ /* allocate a file control block */ iop = rtems_libio_allocate(); if ( iop == 0 ) { rc = ENFILE; 107f05: be 17 00 00 00 mov $0x17,%esi 107f0a: eb 40 jmp 107f4c 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; 107f0c: 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; 107f0e: be 02 00 00 00 mov $0x2,%esi 107f13: eb 17 jmp 107f2c 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; 107f15: 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; 107f17: be 0d 00 00 00 mov $0xd,%esi <== NOT EXECUTED 107f1c: eb 0e jmp 107f2c <== 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; 107f1e: 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; 107f21: be 11 00 00 00 mov $0x11,%esi 107f26: eb 04 jmp 107f2c * Single exit and clean up path. */ done: va_end(ap); if ( rc ) { 107f28: 85 f6 test %esi,%esi 107f2a: 74 2c je 107f58 <== NEVER TAKEN if ( iop ) 107f2c: 85 db test %ebx,%ebx 107f2e: 74 0c je 107f3c rtems_libio_free( iop ); 107f30: 83 ec 0c sub $0xc,%esp 107f33: 53 push %ebx 107f34: e8 6b 63 00 00 call 10e2a4 107f39: 83 c4 10 add $0x10,%esp if ( loc_to_free ) 107f3c: 85 ff test %edi,%edi 107f3e: 74 0c je 107f4c rtems_filesystem_freenode( loc_to_free ); 107f40: 83 ec 0c sub $0xc,%esp 107f43: 57 push %edi 107f44: e8 eb f3 ff ff call 107334 107f49: 83 c4 10 add $0x10,%esp rtems_set_errno_and_return_minus_one( rc ); 107f4c: e8 7b 91 00 00 call 1110cc <__errno> 107f51: 89 30 mov %esi,(%eax) 107f53: 83 c8 ff or $0xffffffff,%eax 107f56: eb 0f jmp 107f67 } return iop - rtems_libio_iops; 107f58: 2b 1d f8 51 12 00 sub 0x1251f8,%ebx 107f5e: c1 fb 03 sar $0x3,%ebx 107f61: 69 c3 b7 6d db b6 imul $0xb6db6db7,%ebx,%eax } 107f67: 8d 65 f4 lea -0xc(%ebp),%esp 107f6a: 5b pop %ebx 107f6b: 5e pop %esi 107f6c: 5f pop %edi 107f6d: c9 leave 107f6e: c3 ret =============================================================================== 00108b1e : /* * Handle output processing */ static void oproc (unsigned char c, struct rtems_termios_tty *tty) { 108b1e: 55 push %ebp 108b1f: 89 e5 mov %esp,%ebp 108b21: 56 push %esi 108b22: 53 push %ebx 108b23: 83 ec 10 sub $0x10,%esp 108b26: 89 d3 mov %edx,%ebx 108b28: 88 45 f4 mov %al,-0xc(%ebp) int i; if (tty->termios.c_oflag & OPOST) { 108b2b: 8b 52 34 mov 0x34(%edx),%edx 108b2e: f6 c2 01 test $0x1,%dl 108b31: 0f 84 ed 00 00 00 je 108c24 <== NEVER TAKEN switch (c) { 108b37: 3c 09 cmp $0x9,%al 108b39: 74 75 je 108bb0 108b3b: 77 0d ja 108b4a <== ALWAYS TAKEN 108b3d: 3c 08 cmp $0x8,%al <== NOT EXECUTED 108b3f: 0f 85 aa 00 00 00 jne 108bef <== NOT EXECUTED 108b45: e9 98 00 00 00 jmp 108be2 <== NOT EXECUTED 108b4a: 3c 0a cmp $0xa,%al 108b4c: 74 0a je 108b58 108b4e: 3c 0d cmp $0xd,%al 108b50: 0f 85 99 00 00 00 jne 108bef <== ALWAYS TAKEN 108b56: eb 32 jmp 108b8a <== NOT EXECUTED case '\n': if (tty->termios.c_oflag & ONLRET) 108b58: f6 c2 20 test $0x20,%dl 108b5b: 74 07 je 108b64 <== ALWAYS TAKEN tty->column = 0; 108b5d: c7 43 28 00 00 00 00 movl $0x0,0x28(%ebx) <== NOT EXECUTED if (tty->termios.c_oflag & ONLCR) { 108b64: 80 e2 04 and $0x4,%dl 108b67: 0f 84 b7 00 00 00 je 108c24 <== NEVER TAKEN rtems_termios_puts ("\r", 1, tty); 108b6d: 56 push %esi 108b6e: 53 push %ebx 108b6f: 6a 01 push $0x1 108b71: 68 b8 ef 11 00 push $0x11efb8 108b76: e8 83 fe ff ff call 1089fe tty->column = 0; 108b7b: c7 43 28 00 00 00 00 movl $0x0,0x28(%ebx) 108b82: 83 c4 10 add $0x10,%esp 108b85: e9 9a 00 00 00 jmp 108c24 } break; case '\r': if ((tty->termios.c_oflag & ONOCR) && (tty->column == 0)) 108b8a: f6 c2 10 test $0x10,%dl <== NOT EXECUTED 108b8d: 74 0a je 108b99 <== NOT EXECUTED 108b8f: 83 7b 28 00 cmpl $0x0,0x28(%ebx) <== NOT EXECUTED 108b93: 0f 84 9b 00 00 00 je 108c34 <== NOT EXECUTED return; if (tty->termios.c_oflag & OCRNL) { 108b99: f6 c2 08 test $0x8,%dl <== NOT EXECUTED 108b9c: 74 09 je 108ba7 <== NOT EXECUTED c = '\n'; 108b9e: c6 45 f4 0a movb $0xa,-0xc(%ebp) <== NOT EXECUTED if (tty->termios.c_oflag & ONLRET) 108ba2: 80 e2 20 and $0x20,%dl <== NOT EXECUTED 108ba5: 74 7d je 108c24 <== NOT EXECUTED tty->column = 0; break; } tty->column = 0; 108ba7: c7 43 28 00 00 00 00 movl $0x0,0x28(%ebx) <== NOT EXECUTED break; 108bae: eb 74 jmp 108c24 <== NOT EXECUTED case '\t': i = 8 - (tty->column & 7); 108bb0: 8b 4b 28 mov 0x28(%ebx),%ecx 108bb3: 89 ce mov %ecx,%esi 108bb5: 83 e6 07 and $0x7,%esi 108bb8: b8 08 00 00 00 mov $0x8,%eax 108bbd: 29 f0 sub %esi,%eax if ((tty->termios.c_oflag & TABDLY) == XTABS) { 108bbf: 81 e2 00 18 00 00 and $0x1800,%edx 108bc5: 81 fa 00 18 00 00 cmp $0x1800,%edx 108bcb: 8d 14 08 lea (%eax,%ecx,1),%edx 108bce: 75 0d jne 108bdd <== NEVER TAKEN tty->column += i; 108bd0: 89 53 28 mov %edx,0x28(%ebx) rtems_termios_puts ( " ", i, tty); 108bd3: 51 push %ecx 108bd4: 53 push %ebx 108bd5: 50 push %eax 108bd6: 68 78 eb 11 00 push $0x11eb78 108bdb: eb 4f jmp 108c2c return; } tty->column += i; 108bdd: 89 53 28 mov %edx,0x28(%ebx) <== NOT EXECUTED break; 108be0: eb 42 jmp 108c24 <== NOT EXECUTED case '\b': if (tty->column > 0) 108be2: 8b 43 28 mov 0x28(%ebx),%eax <== NOT EXECUTED 108be5: 85 c0 test %eax,%eax <== NOT EXECUTED 108be7: 7e 3b jle 108c24 <== NOT EXECUTED tty->column--; 108be9: 48 dec %eax <== NOT EXECUTED 108bea: 89 43 28 mov %eax,0x28(%ebx) <== NOT EXECUTED 108bed: eb 35 jmp 108c24 <== NOT EXECUTED break; default: if (tty->termios.c_oflag & OLCUC) 108bef: 80 e2 02 and $0x2,%dl 108bf2: 74 1c je 108c10 <== ALWAYS TAKEN c = toupper(c); 108bf4: 0f b6 c0 movzbl %al,%eax <== NOT EXECUTED 108bf7: 8b 15 3c 31 12 00 mov 0x12313c,%edx <== NOT EXECUTED 108bfd: 0f be 54 02 01 movsbl 0x1(%edx,%eax,1),%edx <== NOT EXECUTED 108c02: 83 e2 03 and $0x3,%edx <== NOT EXECUTED 108c05: 83 fa 02 cmp $0x2,%edx <== NOT EXECUTED 108c08: 75 03 jne 108c0d <== NOT EXECUTED 108c0a: 83 e8 20 sub $0x20,%eax <== NOT EXECUTED 108c0d: 88 45 f4 mov %al,-0xc(%ebp) <== NOT EXECUTED if (!iscntrl(c)) 108c10: 0f b6 45 f4 movzbl -0xc(%ebp),%eax 108c14: 8b 15 3c 31 12 00 mov 0x12313c,%edx 108c1a: f6 44 02 01 20 testb $0x20,0x1(%edx,%eax,1) 108c1f: 75 03 jne 108c24 <== NEVER TAKEN tty->column++; 108c21: ff 43 28 incl 0x28(%ebx) break; } } rtems_termios_puts (&c, 1, tty); 108c24: 52 push %edx 108c25: 53 push %ebx 108c26: 6a 01 push $0x1 108c28: 8d 45 f4 lea -0xc(%ebp),%eax 108c2b: 50 push %eax 108c2c: e8 cd fd ff ff call 1089fe 108c31: 83 c4 10 add $0x10,%esp } 108c34: 8d 65 f8 lea -0x8(%ebp),%esp 108c37: 5b pop %ebx 108c38: 5e pop %esi 108c39: c9 leave 108c3a: c3 ret =============================================================================== 00108ff0 : extern int pipe_create(int filsdes[2]); int pipe( int filsdes[2] ) { 108ff0: 55 push %ebp 108ff1: 89 e5 mov %esp,%ebp 108ff3: 83 ec 08 sub $0x8,%esp 108ff6: 8b 45 08 mov 0x8(%ebp),%eax if (filsdes == NULL) 108ff9: 85 c0 test %eax,%eax 108ffb: 75 10 jne 10900d <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EFAULT ); 108ffd: e8 22 99 00 00 call 112924 <__errno> 109002: c7 00 0e 00 00 00 movl $0xe,(%eax) return pipe_create(filsdes); } 109008: 83 c8 ff or $0xffffffff,%eax 10900b: c9 leave 10900c: c3 ret ) { if (filsdes == NULL) rtems_set_errno_and_return_minus_one( EFAULT ); return pipe_create(filsdes); 10900d: 89 45 08 mov %eax,0x8(%ebp) } 109010: c9 leave ) { if (filsdes == NULL) rtems_set_errno_and_return_minus_one( EFAULT ); return pipe_create(filsdes); 109011: e9 e6 5e 00 00 jmp 10eefc =============================================================================== 0010eefc : * Called by pipe() to create an anonymous pipe. */ int pipe_create( int filsdes[2] ) { 10eefc: 55 push %ebp 10eefd: 89 e5 mov %esp,%ebp 10eeff: 57 push %edi 10ef00: 56 push %esi 10ef01: 53 push %ebx 10ef02: 83 ec 34 sub $0x34,%esp rtems_libio_t *iop; int err = 0; if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0) 10ef05: 68 ff 01 00 00 push $0x1ff 10ef0a: 68 50 0d 12 00 push $0x120d50 10ef0f: e8 58 14 00 00 call 11036c 10ef14: 83 c4 10 add $0x10,%esp return -1; 10ef17: 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) 10ef1e: 85 c0 test %eax,%eax 10ef20: 0f 85 e8 00 00 00 jne 10f00e <== NEVER TAKEN return -1; /* /tmp/.fifoXXXX */ char fifopath[15]; memcpy(fifopath, "/tmp/.fifo", 10); 10ef26: 8d 5d d9 lea -0x27(%ebp),%ebx 10ef29: be 55 0d 12 00 mov $0x120d55,%esi 10ef2e: b9 0a 00 00 00 mov $0xa,%ecx 10ef33: 89 df mov %ebx,%edi 10ef35: f3 a4 rep movsb %ds:(%esi),%es:(%edi) sprintf(fifopath + 10, "%04x", rtems_pipe_no ++); 10ef37: 0f b7 05 20 60 12 00 movzwl 0x126020,%eax 10ef3e: 8d 50 01 lea 0x1(%eax),%edx 10ef41: 66 89 15 20 60 12 00 mov %dx,0x126020 10ef48: 57 push %edi 10ef49: 50 push %eax 10ef4a: 68 60 0d 12 00 push $0x120d60 10ef4f: 8d 45 e3 lea -0x1d(%ebp),%eax 10ef52: 50 push %eax 10ef53: e8 b8 43 00 00 call 113310 /* Try creating FIFO file until find an available file name */ while (mkfifo(fifopath, S_IRUSR|S_IWUSR) != 0) { 10ef58: 59 pop %ecx 10ef59: 5e pop %esi 10ef5a: 68 80 01 00 00 push $0x180 10ef5f: 53 push %ebx 10ef60: e8 c7 11 00 00 call 11012c 10ef65: 83 c4 10 add $0x10,%esp 10ef68: 85 c0 test %eax,%eax 10ef6a: 74 0a je 10ef76 if (errno != EEXIST){ 10ef6c: e8 b3 39 00 00 call 112924 <__errno> 10ef71: e9 98 00 00 00 jmp 10f00e 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); 10ef76: 52 push %edx 10ef77: 52 push %edx 10ef78: 68 00 40 00 00 push $0x4000 10ef7d: 53 push %ebx 10ef7e: e8 59 9e ff ff call 108ddc 10ef83: 8b 55 08 mov 0x8(%ebp),%edx 10ef86: 89 02 mov %eax,(%edx) if (filsdes[0] < 0) { 10ef88: 83 c4 10 add $0x10,%esp 10ef8b: 85 c0 test %eax,%eax 10ef8d: 79 0d jns 10ef9c err = errno; 10ef8f: e8 90 39 00 00 call 112924 <__errno> 10ef94: 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); 10ef96: 83 ec 0c sub $0xc,%esp 10ef99: 53 push %ebx 10ef9a: eb 51 jmp 10efed } else { /* Reset open file to blocking mode */ iop = rtems_libio_iop(filsdes[0]); 10ef9c: 31 d2 xor %edx,%edx 10ef9e: 3b 05 44 21 12 00 cmp 0x122144,%eax 10efa4: 73 09 jae 10efaf <== NEVER TAKEN 10efa6: 6b d0 38 imul $0x38,%eax,%edx 10efa9: 03 15 20 62 12 00 add 0x126220,%edx iop->flags &= ~LIBIO_FLAGS_NO_DELAY; 10efaf: 83 62 14 fe andl $0xfffffffe,0x14(%edx) filsdes[1] = open(fifopath, O_WRONLY); 10efb3: 50 push %eax 10efb4: 50 push %eax 10efb5: 6a 01 push $0x1 10efb7: 8d 45 d9 lea -0x27(%ebp),%eax 10efba: 50 push %eax 10efbb: e8 1c 9e ff ff call 108ddc 10efc0: 8b 55 08 mov 0x8(%ebp),%edx 10efc3: 89 42 04 mov %eax,0x4(%edx) if (filsdes[1] < 0) { 10efc6: 83 c4 10 add $0x10,%esp int pipe_create( int filsdes[2] ) { rtems_libio_t *iop; int err = 0; 10efc9: 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) { 10efcb: 85 c0 test %eax,%eax 10efcd: 79 17 jns 10efe6 err = errno; 10efcf: e8 50 39 00 00 call 112924 <__errno> 10efd4: 8b 30 mov (%eax),%esi close(filsdes[0]); 10efd6: 83 ec 0c sub $0xc,%esp 10efd9: 8b 45 08 mov 0x8(%ebp),%eax 10efdc: ff 30 pushl (%eax) 10efde: e8 01 90 ff ff call 107fe4 10efe3: 83 c4 10 add $0x10,%esp } unlink(fifopath); 10efe6: 83 ec 0c sub $0xc,%esp 10efe9: 8d 45 d9 lea -0x27(%ebp),%eax 10efec: 50 push %eax 10efed: e8 86 b9 ff ff call 10a978 10eff2: 83 c4 10 add $0x10,%esp } if(err != 0) rtems_set_errno_and_return_minus_one(err); return 0; 10eff5: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp) err = errno; close(filsdes[0]); } unlink(fifopath); } if(err != 0) 10effc: 85 f6 test %esi,%esi 10effe: 74 0e je 10f00e rtems_set_errno_and_return_minus_one(err); 10f000: e8 1f 39 00 00 call 112924 <__errno> 10f005: 89 30 mov %esi,(%eax) 10f007: c7 45 d4 ff ff ff ff movl $0xffffffff,-0x2c(%ebp) return 0; } 10f00e: 8b 45 d4 mov -0x2c(%ebp),%eax 10f011: 8d 65 f4 lea -0xc(%ebp),%esp 10f014: 5b pop %ebx 10f015: 5e pop %esi 10f016: 5f pop %edi 10f017: c9 leave 10f018: c3 ret =============================================================================== 001101fb : pipe_control_t *pipe, uint32_t cmd, void *buffer, rtems_libio_t *iop ) { 1101fb: 55 push %ebp 1101fc: 89 e5 mov %esp,%ebp 1101fe: 56 push %esi 1101ff: 53 push %ebx 110200: 8b 5d 08 mov 0x8(%ebp),%ebx 110203: 8b 75 10 mov 0x10(%ebp),%esi *(unsigned int *)buffer = pipe->Length; PIPE_UNLOCK(pipe); return 0; } return -EINVAL; 110206: b8 ea ff ff ff mov $0xffffffea,%eax uint32_t cmd, void *buffer, rtems_libio_t *iop ) { if (cmd == FIONREAD) { 11020b: 81 7d 0c 7f 66 04 40 cmpl $0x4004667f,0xc(%ebp) 110212: 75 36 jne 11024a if (buffer == NULL) return -EFAULT; 110214: b0 f2 mov $0xf2,%al void *buffer, rtems_libio_t *iop ) { if (cmd == FIONREAD) { if (buffer == NULL) 110216: 85 f6 test %esi,%esi 110218: 74 30 je 11024a return -EFAULT; if (! PIPE_LOCK(pipe)) 11021a: 51 push %ecx 11021b: 6a 00 push $0x0 11021d: 6a 00 push $0x0 11021f: ff 73 28 pushl 0x28(%ebx) 110222: e8 e5 b9 ff ff call 10bc0c 110227: 89 c2 mov %eax,%edx 110229: 83 c4 10 add $0x10,%esp return -EINTR; 11022c: b8 fc ff ff ff mov $0xfffffffc,%eax { if (cmd == FIONREAD) { if (buffer == NULL) return -EFAULT; if (! PIPE_LOCK(pipe)) 110231: 85 d2 test %edx,%edx 110233: 75 15 jne 11024a <== NEVER TAKEN return -EINTR; /* Return length of pipe */ *(unsigned int *)buffer = pipe->Length; 110235: 8b 43 0c mov 0xc(%ebx),%eax 110238: 89 06 mov %eax,(%esi) PIPE_UNLOCK(pipe); 11023a: 83 ec 0c sub $0xc,%esp 11023d: ff 73 28 pushl 0x28(%ebx) 110240: e8 b3 ba ff ff call 10bcf8 return 0; 110245: 83 c4 10 add $0x10,%esp 110248: 31 c0 xor %eax,%eax } return -EINVAL; } 11024a: 8d 65 f8 lea -0x8(%ebp),%esp 11024d: 5b pop %ebx 11024e: 5e pop %esi 11024f: c9 leave 110250: c3 ret =============================================================================== 0010feec : pipe_control_t *pipe, void *buffer, size_t count, rtems_libio_t *iop ) { 10feec: 55 push %ebp 10feed: 89 e5 mov %esp,%ebp 10feef: 57 push %edi 10fef0: 56 push %esi 10fef1: 53 push %ebx 10fef2: 83 ec 30 sub $0x30,%esp 10fef5: 8b 5d 08 mov 0x8(%ebp),%ebx int chunk, chunk1, read = 0, ret = 0; if (! PIPE_LOCK(pipe)) 10fef8: 6a 00 push $0x0 10fefa: 6a 00 push $0x0 10fefc: ff 73 28 pushl 0x28(%ebx) 10feff: e8 08 bd ff ff call 10bc0c 10ff04: 83 c4 10 add $0x10,%esp return -EINTR; 10ff07: be fc ff ff ff mov $0xfffffffc,%esi rtems_libio_t *iop ) { int chunk, chunk1, read = 0, ret = 0; if (! PIPE_LOCK(pipe)) 10ff0c: 85 c0 test %eax,%eax 10ff0e: 0f 85 2f 01 00 00 jne 110043 <== NEVER TAKEN 10ff14: c7 45 d0 00 00 00 00 movl $0x0,-0x30(%ebp) 10ff1b: e9 f0 00 00 00 jmp 110010 return -EINTR; while (read < count) { while (PIPE_EMPTY(pipe)) { /* Not an error */ if (pipe->Writers == 0) 10ff20: 83 7b 14 00 cmpl $0x0,0x14(%ebx) 10ff24: 0f 84 f2 00 00 00 je 11001c goto out_locked; if (LIBIO_NODELAY(iop)) { 10ff2a: 8b 45 14 mov 0x14(%ebp),%eax 10ff2d: f6 40 14 01 testb $0x1,0x14(%eax) 10ff31: 0f 85 e9 00 00 00 jne 110020 ret = -EAGAIN; goto out_locked; } /* Wait until pipe is no more empty or no writer exists */ pipe->waitingReaders ++; 10ff37: ff 43 18 incl 0x18(%ebx) PIPE_UNLOCK(pipe); 10ff3a: 83 ec 0c sub $0xc,%esp 10ff3d: ff 73 28 pushl 0x28(%ebx) 10ff40: e8 b3 bd ff ff call 10bcf8 if (! PIPE_READWAIT(pipe)) 10ff45: 5f pop %edi 10ff46: 58 pop %eax 10ff47: 6a 00 push $0x0 10ff49: ff 73 2c pushl 0x2c(%ebx) 10ff4c: e8 9f 16 00 00 call 1115f0 10ff51: 83 c4 0c add $0xc,%esp 10ff54: 83 f8 01 cmp $0x1,%eax 10ff57: 19 f6 sbb %esi,%esi 10ff59: f7 d6 not %esi 10ff5b: 83 e6 fc and $0xfffffffc,%esi ret = -EINTR; if (! PIPE_LOCK(pipe)) { 10ff5e: 6a 00 push $0x0 10ff60: 6a 00 push $0x0 10ff62: ff 73 28 pushl 0x28(%ebx) 10ff65: e8 a2 bc ff ff call 10bc0c 10ff6a: 83 c4 10 add $0x10,%esp 10ff6d: 85 c0 test %eax,%eax 10ff6f: 0f 85 c0 00 00 00 jne 110035 <== NEVER TAKEN /* WARN waitingReaders not restored! */ ret = -EINTR; goto out_nolock; } pipe->waitingReaders --; 10ff75: ff 4b 18 decl 0x18(%ebx) if (ret != 0) 10ff78: 85 f6 test %esi,%esi 10ff7a: 0f 85 a5 00 00 00 jne 110025 <== NEVER TAKEN if (! PIPE_LOCK(pipe)) return -EINTR; while (read < count) { while (PIPE_EMPTY(pipe)) { 10ff80: 8b 53 0c mov 0xc(%ebx),%edx 10ff83: 85 d2 test %edx,%edx 10ff85: 74 99 je 10ff20 if (ret != 0) goto out_locked; } /* Read chunk bytes */ chunk = MIN(count - read, pipe->Length); 10ff87: 8b 45 10 mov 0x10(%ebp),%eax 10ff8a: 2b 45 d0 sub -0x30(%ebp),%eax 10ff8d: 89 55 d4 mov %edx,-0x2c(%ebp) 10ff90: 39 c2 cmp %eax,%edx 10ff92: 76 03 jbe 10ff97 10ff94: 89 45 d4 mov %eax,-0x2c(%ebp) chunk1 = pipe->Size - pipe->Start; 10ff97: 8b 73 08 mov 0x8(%ebx),%esi 10ff9a: 8b 43 04 mov 0x4(%ebx),%eax 10ff9d: 29 f0 sub %esi,%eax if (chunk > chunk1) { 10ff9f: 39 45 d4 cmp %eax,-0x2c(%ebp) 10ffa2: 8b 7d 0c mov 0xc(%ebp),%edi 10ffa5: 8b 4d d0 mov -0x30(%ebp),%ecx 10ffa8: 8d 14 0f lea (%edi,%ecx,1),%edx 10ffab: 7e 1b jle 10ffc8 memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk1); 10ffad: 03 33 add (%ebx),%esi 10ffaf: 89 d7 mov %edx,%edi 10ffb1: 89 c1 mov %eax,%ecx 10ffb3: f3 a4 rep movsb %ds:(%esi),%es:(%edi) memcpy(buffer + read + chunk1, pipe->Buffer, chunk - chunk1); 10ffb5: 8b 55 d0 mov -0x30(%ebp),%edx 10ffb8: 01 c2 add %eax,%edx 10ffba: 03 55 0c add 0xc(%ebp),%edx 10ffbd: 8b 4d d4 mov -0x2c(%ebp),%ecx 10ffc0: 29 c1 sub %eax,%ecx 10ffc2: 8b 33 mov (%ebx),%esi 10ffc4: 89 d7 mov %edx,%edi 10ffc6: eb 07 jmp 10ffcf } else memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk); 10ffc8: 03 33 add (%ebx),%esi 10ffca: 89 d7 mov %edx,%edi 10ffcc: 8b 4d d4 mov -0x2c(%ebp),%ecx 10ffcf: f3 a4 rep movsb %ds:(%esi),%es:(%edi) pipe->Start += chunk; 10ffd1: 8b 45 d4 mov -0x2c(%ebp),%eax 10ffd4: 03 43 08 add 0x8(%ebx),%eax pipe->Start %= pipe->Size; 10ffd7: 31 d2 xor %edx,%edx 10ffd9: f7 73 04 divl 0x4(%ebx) 10ffdc: 89 53 08 mov %edx,0x8(%ebx) pipe->Length -= chunk; 10ffdf: 8b 43 0c mov 0xc(%ebx),%eax 10ffe2: 2b 45 d4 sub -0x2c(%ebp),%eax 10ffe5: 89 43 0c mov %eax,0xc(%ebx) /* For buffering optimization */ if (PIPE_EMPTY(pipe)) 10ffe8: 85 c0 test %eax,%eax 10ffea: 75 07 jne 10fff3 pipe->Start = 0; 10ffec: c7 43 08 00 00 00 00 movl $0x0,0x8(%ebx) if (pipe->waitingWriters > 0) 10fff3: 83 7b 1c 00 cmpl $0x0,0x1c(%ebx) 10fff7: 74 11 je 11000a PIPE_WAKEUPWRITERS(pipe); 10fff9: 56 push %esi 10fffa: 56 push %esi 10fffb: 8d 45 e4 lea -0x1c(%ebp),%eax 10fffe: 50 push %eax 10ffff: ff 73 30 pushl 0x30(%ebx) 110002: e8 91 15 00 00 call 111598 110007: 83 c4 10 add $0x10,%esp read += chunk; 11000a: 8b 4d d4 mov -0x2c(%ebp),%ecx 11000d: 01 4d d0 add %ecx,-0x30(%ebp) int chunk, chunk1, read = 0, ret = 0; if (! PIPE_LOCK(pipe)) return -EINTR; while (read < count) { 110010: 8b 7d 10 mov 0x10(%ebp),%edi 110013: 39 7d d0 cmp %edi,-0x30(%ebp) 110016: 0f 82 64 ff ff ff jb 10ff80 while (PIPE_EMPTY(pipe)) { /* Not an error */ if (pipe->Writers == 0) 11001c: 31 f6 xor %esi,%esi 11001e: eb 05 jmp 110025 goto out_locked; if (LIBIO_NODELAY(iop)) { ret = -EAGAIN; 110020: be f5 ff ff ff mov $0xfffffff5,%esi PIPE_WAKEUPWRITERS(pipe); read += chunk; } out_locked: PIPE_UNLOCK(pipe); 110025: 83 ec 0c sub $0xc,%esp 110028: ff 73 28 pushl 0x28(%ebx) 11002b: e8 c8 bc ff ff call 10bcf8 110030: 83 c4 10 add $0x10,%esp 110033: eb 05 jmp 11003a PIPE_UNLOCK(pipe); if (! PIPE_READWAIT(pipe)) ret = -EINTR; if (! PIPE_LOCK(pipe)) { /* WARN waitingReaders not restored! */ ret = -EINTR; 110035: be fc ff ff ff mov $0xfffffffc,%esi <== NOT EXECUTED out_locked: PIPE_UNLOCK(pipe); out_nolock: if (read > 0) 11003a: 83 7d d0 00 cmpl $0x0,-0x30(%ebp) 11003e: 7e 03 jle 110043 110040: 8b 75 d0 mov -0x30(%ebp),%esi return read; return ret; } 110043: 89 f0 mov %esi,%eax 110045: 8d 65 f4 lea -0xc(%ebp),%esp 110048: 5b pop %ebx 110049: 5e pop %esi 11004a: 5f pop %edi 11004b: c9 leave 11004c: c3 ret =============================================================================== 0010fa91 : */ void pipe_release( pipe_control_t **pipep, rtems_libio_t *iop ) { 10fa91: 55 push %ebp 10fa92: 89 e5 mov %esp,%ebp 10fa94: 57 push %edi 10fa95: 56 push %esi 10fa96: 53 push %ebx 10fa97: 83 ec 1c sub $0x1c,%esp 10fa9a: 8b 7d 08 mov 0x8(%ebp),%edi pipe_control_t *pipe = *pipep; 10fa9d: 8b 1f mov (%edi),%ebx /* WARN pipe not released! */ if (!PIPE_LOCK(pipe)) rtems_fatal_error_occurred(0xdeadbeef); #endif mode = LIBIO_ACCMODE(iop); 10fa9f: 8b 45 0c mov 0xc(%ebp),%eax 10faa2: 8b 40 14 mov 0x14(%eax),%eax 10faa5: 89 c6 mov %eax,%esi 10faa7: 83 e6 06 and $0x6,%esi if (mode & LIBIO_FLAGS_READ) 10faaa: a8 02 test $0x2,%al 10faac: 74 03 je 10fab1 pipe->Readers --; 10faae: ff 4b 10 decl 0x10(%ebx) if (mode & LIBIO_FLAGS_WRITE) 10fab1: f7 c6 04 00 00 00 test $0x4,%esi 10fab7: 74 03 je 10fabc pipe->Writers --; 10fab9: ff 4b 14 decl 0x14(%ebx) PIPE_UNLOCK(pipe); 10fabc: 83 ec 0c sub $0xc,%esp 10fabf: ff 73 28 pushl 0x28(%ebx) 10fac2: e8 31 c2 ff ff call 10bcf8 if (pipe->Readers == 0 && pipe->Writers == 0) { 10fac7: 8b 43 10 mov 0x10(%ebx),%eax 10faca: 83 c4 10 add $0x10,%esp 10facd: 85 c0 test %eax,%eax 10facf: 75 15 jne 10fae6 10fad1: 83 7b 14 00 cmpl $0x0,0x14(%ebx) 10fad5: 75 0f jne 10fae6 #if 0 /* To delete an anonymous pipe file when all users closed it */ if (pipe->Anonymous) delfile = TRUE; #endif pipe_free(pipe); 10fad7: 89 d8 mov %ebx,%eax 10fad9: e8 78 ff ff ff call 10fa56 *pipep = NULL; 10fade: c7 07 00 00 00 00 movl $0x0,(%edi) 10fae4: eb 30 jmp 10fb16 } else if (pipe->Readers == 0 && mode != LIBIO_FLAGS_WRITE) 10fae6: 83 fe 04 cmp $0x4,%esi 10fae9: 74 0f je 10fafa 10faeb: 85 c0 test %eax,%eax 10faed: 75 0b jne 10fafa <== NEVER TAKEN /* Notify waiting Writers that all their partners left */ PIPE_WAKEUPWRITERS(pipe); 10faef: 57 push %edi 10faf0: 57 push %edi 10faf1: 8d 45 e4 lea -0x1c(%ebp),%eax 10faf4: 50 push %eax 10faf5: ff 73 30 pushl 0x30(%ebx) 10faf8: eb 14 jmp 10fb0e else if (pipe->Writers == 0 && mode != LIBIO_FLAGS_READ) 10fafa: 83 fe 02 cmp $0x2,%esi 10fafd: 74 17 je 10fb16 <== NEVER TAKEN 10faff: 83 7b 14 00 cmpl $0x0,0x14(%ebx) 10fb03: 75 11 jne 10fb16 <== NEVER TAKEN PIPE_WAKEUPREADERS(pipe); 10fb05: 56 push %esi 10fb06: 56 push %esi 10fb07: 8d 45 e4 lea -0x1c(%ebp),%eax 10fb0a: 50 push %eax 10fb0b: ff 73 2c pushl 0x2c(%ebx) 10fb0e: e8 85 1a 00 00 call 111598 10fb13: 83 c4 10 add $0x10,%esp pipe_unlock(); 10fb16: e8 25 ff ff ff call 10fa40 iop->flags &= ~LIBIO_FLAGS_OPEN; if(iop->pathinfo.ops->unlink_h(&iop->pathinfo)) return; #endif } 10fb1b: 8d 65 f4 lea -0xc(%ebp),%esp 10fb1e: 5b pop %ebx 10fb1f: 5e pop %esi 10fb20: 5f pop %edi 10fb21: c9 leave 10fb22: c3 ret =============================================================================== 0011004d : pipe_control_t *pipe, const void *buffer, size_t count, rtems_libio_t *iop ) { 11004d: 55 push %ebp 11004e: 89 e5 mov %esp,%ebp 110050: 57 push %edi 110051: 56 push %esi 110052: 53 push %ebx 110053: 83 ec 2c sub $0x2c,%esp 110056: 8b 5d 08 mov 0x8(%ebp),%ebx int chunk, chunk1, written = 0, ret = 0; /* Write nothing */ if (count == 0) return 0; 110059: 31 f6 xor %esi,%esi ) { int chunk, chunk1, written = 0, ret = 0; /* Write nothing */ if (count == 0) 11005b: 83 7d 10 00 cmpl $0x0,0x10(%ebp) 11005f: 0f 84 8c 01 00 00 je 1101f1 <== NEVER TAKEN return 0; if (! PIPE_LOCK(pipe)) 110065: 52 push %edx 110066: 6a 00 push $0x0 110068: 6a 00 push $0x0 11006a: ff 73 28 pushl 0x28(%ebx) 11006d: e8 9a bb ff ff call 10bc0c 110072: 83 c4 10 add $0x10,%esp return -EINTR; 110075: be fc ff ff ff mov $0xfffffffc,%esi /* Write nothing */ if (count == 0) return 0; if (! PIPE_LOCK(pipe)) 11007a: 85 c0 test %eax,%eax 11007c: 0f 85 6f 01 00 00 jne 1101f1 <== NEVER TAKEN return -EINTR; if (pipe->Readers == 0) { 110082: 83 7b 10 00 cmpl $0x0,0x10(%ebx) 110086: 0f 84 16 01 00 00 je 1101a2 ret = -EPIPE; goto out_locked; } /* Write of PIPE_BUF bytes or less shall not be interleaved */ chunk = count <= pipe->Size ? count : 1; 11008c: bf 01 00 00 00 mov $0x1,%edi 110091: 8b 45 10 mov 0x10(%ebp),%eax 110094: 3b 43 04 cmp 0x4(%ebx),%eax 110097: 77 02 ja 11009b <== NEVER TAKEN 110099: 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; 11009b: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp) 1100a2: e9 eb 00 00 00 jmp 110192 /* 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)) { 1100a7: 8b 4d 14 mov 0x14(%ebp),%ecx 1100aa: f6 41 14 01 testb $0x1,0x14(%ecx) 1100ae: 0f 85 fc 00 00 00 jne 1101b0 ret = -EAGAIN; goto out_locked; } /* Wait until there is chunk bytes space or no reader exists */ pipe->waitingWriters ++; 1100b4: ff 43 1c incl 0x1c(%ebx) PIPE_UNLOCK(pipe); 1100b7: 83 ec 0c sub $0xc,%esp 1100ba: ff 73 28 pushl 0x28(%ebx) 1100bd: e8 36 bc ff ff call 10bcf8 if (! PIPE_WRITEWAIT(pipe)) 1100c2: 5e pop %esi 1100c3: 58 pop %eax 1100c4: 6a 00 push $0x0 1100c6: ff 73 30 pushl 0x30(%ebx) 1100c9: e8 22 15 00 00 call 1115f0 1100ce: 83 c4 0c add $0xc,%esp 1100d1: 83 f8 01 cmp $0x1,%eax 1100d4: 19 f6 sbb %esi,%esi 1100d6: f7 d6 not %esi 1100d8: 83 e6 fc and $0xfffffffc,%esi ret = -EINTR; if (! PIPE_LOCK(pipe)) { 1100db: 6a 00 push $0x0 1100dd: 6a 00 push $0x0 1100df: ff 73 28 pushl 0x28(%ebx) 1100e2: e8 25 bb ff ff call 10bc0c 1100e7: 83 c4 10 add $0x10,%esp 1100ea: 85 c0 test %eax,%eax 1100ec: 0f 85 f1 00 00 00 jne 1101e3 <== NEVER TAKEN /* WARN waitingWriters not restored! */ ret = -EINTR; goto out_nolock; } pipe->waitingWriters --; 1100f2: ff 4b 1c decl 0x1c(%ebx) if (ret != 0) 1100f5: 85 f6 test %esi,%esi 1100f7: 0f 85 bf 00 00 00 jne 1101bc <== NEVER TAKEN goto out_locked; if (pipe->Readers == 0) { 1100fd: 83 7b 10 00 cmpl $0x0,0x10(%ebx) 110101: 0f 84 b0 00 00 00 je 1101b7 <== 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) { 110107: 8b 73 04 mov 0x4(%ebx),%esi 11010a: 8b 43 0c mov 0xc(%ebx),%eax 11010d: 89 f1 mov %esi,%ecx 11010f: 29 c1 sub %eax,%ecx 110111: 39 f9 cmp %edi,%ecx 110113: 72 92 jb 1100a7 ret = -EPIPE; goto out_locked; } } chunk = MIN(count - written, PIPE_SPACE(pipe)); 110115: 8b 55 10 mov 0x10(%ebp),%edx 110118: 2b 55 d4 sub -0x2c(%ebp),%edx 11011b: 89 4d d0 mov %ecx,-0x30(%ebp) 11011e: 39 d1 cmp %edx,%ecx 110120: 76 03 jbe 110125 110122: 89 55 d0 mov %edx,-0x30(%ebp) chunk1 = pipe->Size - PIPE_WSTART(pipe); 110125: 03 43 08 add 0x8(%ebx),%eax 110128: 31 d2 xor %edx,%edx 11012a: f7 f6 div %esi 11012c: 29 d6 sub %edx,%esi 11012e: 89 75 cc mov %esi,-0x34(%ebp) if (chunk > chunk1) { 110131: 39 75 d0 cmp %esi,-0x30(%ebp) 110134: 8b 4d 0c mov 0xc(%ebp),%ecx 110137: 8b 45 d4 mov -0x2c(%ebp),%eax 11013a: 8d 34 01 lea (%ecx,%eax,1),%esi 11013d: 7e 20 jle 11015f memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk1); 11013f: 8b 03 mov (%ebx),%eax 110141: 01 d0 add %edx,%eax 110143: 89 c7 mov %eax,%edi 110145: 8b 4d cc mov -0x34(%ebp),%ecx 110148: f3 a4 rep movsb %ds:(%esi),%es:(%edi) memcpy(pipe->Buffer, buffer + written + chunk1, chunk - chunk1); 11014a: 8b 03 mov (%ebx),%eax 11014c: 8b 4d d0 mov -0x30(%ebp),%ecx 11014f: 2b 4d cc sub -0x34(%ebp),%ecx 110152: 8b 75 cc mov -0x34(%ebp),%esi 110155: 03 75 d4 add -0x2c(%ebp),%esi 110158: 03 75 0c add 0xc(%ebp),%esi 11015b: 89 c7 mov %eax,%edi 11015d: eb 09 jmp 110168 } else memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk); 11015f: 8b 03 mov (%ebx),%eax 110161: 01 d0 add %edx,%eax 110163: 89 c7 mov %eax,%edi 110165: 8b 4d d0 mov -0x30(%ebp),%ecx 110168: f3 a4 rep movsb %ds:(%esi),%es:(%edi) pipe->Length += chunk; 11016a: 8b 45 d0 mov -0x30(%ebp),%eax 11016d: 01 43 0c add %eax,0xc(%ebx) if (pipe->waitingReaders > 0) 110170: 83 7b 18 00 cmpl $0x0,0x18(%ebx) 110174: 74 11 je 110187 PIPE_WAKEUPREADERS(pipe); 110176: 51 push %ecx 110177: 51 push %ecx 110178: 8d 4d e4 lea -0x1c(%ebp),%ecx 11017b: 51 push %ecx 11017c: ff 73 2c pushl 0x2c(%ebx) 11017f: e8 14 14 00 00 call 111598 110184: 83 c4 10 add $0x10,%esp written += chunk; 110187: 8b 45 d0 mov -0x30(%ebp),%eax 11018a: 01 45 d4 add %eax,-0x2c(%ebp) /* Write of more than PIPE_BUF bytes can be interleaved */ chunk = 1; 11018d: 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) { 110192: 8b 4d 10 mov 0x10(%ebp),%ecx 110195: 39 4d d4 cmp %ecx,-0x2c(%ebp) 110198: 0f 82 69 ff ff ff jb 110107 11019e: 31 f6 xor %esi,%esi 1101a0: eb 1a jmp 1101bc if (! PIPE_LOCK(pipe)) return -EINTR; if (pipe->Readers == 0) { ret = -EPIPE; 1101a2: 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; 1101a7: c7 45 d4 00 00 00 00 movl $0x0,-0x2c(%ebp) 1101ae: eb 0c jmp 1101bc chunk = count <= pipe->Size ? count : 1; while (written < count) { while (PIPE_SPACE(pipe) < chunk) { if (LIBIO_NODELAY(iop)) { ret = -EAGAIN; 1101b0: be f5 ff ff ff mov $0xfffffff5,%esi 1101b5: eb 05 jmp 1101bc pipe->waitingWriters --; if (ret != 0) goto out_locked; if (pipe->Readers == 0) { ret = -EPIPE; 1101b7: 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); 1101bc: 83 ec 0c sub $0xc,%esp 1101bf: ff 73 28 pushl 0x28(%ebx) 1101c2: e8 31 bb ff ff call 10bcf8 1101c7: 83 c4 10 add $0x10,%esp out_nolock: #ifdef RTEMS_POSIX_API /* Signal SIGPIPE */ if (ret == -EPIPE) 1101ca: 83 fe e0 cmp $0xffffffe0,%esi 1101cd: 75 19 jne 1101e8 kill(getpid(), SIGPIPE); 1101cf: e8 24 07 00 00 call 1108f8 1101d4: 52 push %edx 1101d5: 52 push %edx 1101d6: 6a 0d push $0xd 1101d8: 50 push %eax 1101d9: e8 a2 09 00 00 call 110b80 1101de: 83 c4 10 add $0x10,%esp 1101e1: eb 05 jmp 1101e8 PIPE_UNLOCK(pipe); if (! PIPE_WRITEWAIT(pipe)) ret = -EINTR; if (! PIPE_LOCK(pipe)) { /* WARN waitingWriters not restored! */ ret = -EINTR; 1101e3: be fc ff ff ff mov $0xfffffffc,%esi <== NOT EXECUTED /* Signal SIGPIPE */ if (ret == -EPIPE) kill(getpid(), SIGPIPE); #endif if (written > 0) 1101e8: 83 7d d4 00 cmpl $0x0,-0x2c(%ebp) 1101ec: 7e 03 jle 1101f1 1101ee: 8b 75 d4 mov -0x2c(%ebp),%esi return written; return ret; } 1101f1: 89 f0 mov %esi,%eax 1101f3: 8d 65 f4 lea -0xc(%ebp),%esp 1101f6: 5b pop %ebx 1101f7: 5e pop %esi 1101f8: 5f pop %edi 1101f9: c9 leave 1101fa: c3 ret =============================================================================== 0010a7d4 : int posix_memalign( void **pointer, size_t alignment, size_t size ) { 10a7d4: 55 push %ebp 10a7d5: 89 e5 mov %esp,%ebp 10a7d7: 53 push %ebx 10a7d8: 83 ec 04 sub $0x4,%esp 10a7db: 8b 45 0c mov 0xc(%ebp),%eax /* * Update call statistics */ MSBUMP(memalign_calls, 1); 10a7de: ff 05 04 c3 12 00 incl 0x12c304 if (((alignment - 1) & alignment) != 0 || (alignment < sizeof(void *))) 10a7e4: 8d 58 ff lea -0x1(%eax),%ebx 10a7e7: 85 c3 test %eax,%ebx 10a7e9: 75 0d jne 10a7f8 <== NEVER TAKEN 10a7eb: 83 f8 03 cmp $0x3,%eax 10a7ee: 76 08 jbe 10a7f8 /* * rtems_memalign does all of the error checking work EXCEPT * for adding restrictionso on the alignment. */ return rtems_memalign( pointer, alignment, size ); } 10a7f0: 59 pop %ecx 10a7f1: 5b pop %ebx 10a7f2: c9 leave /* * rtems_memalign does all of the error checking work EXCEPT * for adding restrictionso on the alignment. */ return rtems_memalign( pointer, alignment, size ); 10a7f3: e9 74 01 00 00 jmp 10a96c } 10a7f8: b8 16 00 00 00 mov $0x16,%eax 10a7fd: 5a pop %edx 10a7fe: 5b pop %ebx 10a7ff: c9 leave 10a800: c3 ret =============================================================================== 0010efdc : int pthread_attr_getinheritsched( const pthread_attr_t *attr, int *inheritsched ) { 10efdc: 55 push %ebp 10efdd: 89 e5 mov %esp,%ebp 10efdf: 8b 55 08 mov 0x8(%ebp),%edx 10efe2: 8b 4d 0c mov 0xc(%ebp),%ecx if ( !attr || !attr->is_initialized || !inheritsched ) return EINVAL; 10efe5: b8 16 00 00 00 mov $0x16,%eax int pthread_attr_getinheritsched( const pthread_attr_t *attr, int *inheritsched ) { if ( !attr || !attr->is_initialized || !inheritsched ) 10efea: 85 d2 test %edx,%edx 10efec: 74 17 je 10f005 <== NEVER TAKEN 10efee: 85 c9 test %ecx,%ecx 10eff0: 74 0e je 10f000 <== NEVER TAKEN 10eff2: 83 3a 00 cmpl $0x0,(%edx) 10eff5: 74 09 je 10f000 <== NEVER TAKEN return EINVAL; *inheritsched = attr->inheritsched; 10eff7: 8b 42 10 mov 0x10(%edx),%eax 10effa: 89 01 mov %eax,(%ecx) return 0; 10effc: 31 c0 xor %eax,%eax 10effe: eb 05 jmp 10f005 const pthread_attr_t *attr, int *inheritsched ) { if ( !attr || !attr->is_initialized || !inheritsched ) return EINVAL; 10f000: b8 16 00 00 00 mov $0x16,%eax *inheritsched = attr->inheritsched; return 0; } 10f005: c9 leave 10f006: c3 ret =============================================================================== 0010f1f8 : int pthread_attr_setschedpolicy( pthread_attr_t *attr, int policy ) { 10f1f8: 55 push %ebp 10f1f9: 89 e5 mov %esp,%ebp 10f1fb: 8b 55 08 mov 0x8(%ebp),%edx 10f1fe: 8b 4d 0c mov 0xc(%ebp),%ecx if ( !attr || !attr->is_initialized ) return EINVAL; 10f201: b8 16 00 00 00 mov $0x16,%eax int pthread_attr_setschedpolicy( pthread_attr_t *attr, int policy ) { if ( !attr || !attr->is_initialized ) 10f206: 85 d2 test %edx,%edx 10f208: 74 1e je 10f228 10f20a: 83 3a 00 cmpl $0x0,(%edx) 10f20d: 74 19 je 10f228 return EINVAL; switch ( policy ) { 10f20f: 83 f9 04 cmp $0x4,%ecx 10f212: 77 0f ja 10f223 10f214: b0 01 mov $0x1,%al 10f216: d3 e0 shl %cl,%eax 10f218: a8 17 test $0x17,%al 10f21a: 74 07 je 10f223 <== NEVER TAKEN case SCHED_OTHER: case SCHED_FIFO: case SCHED_RR: case SCHED_SPORADIC: attr->schedpolicy = policy; 10f21c: 89 4a 14 mov %ecx,0x14(%edx) return 0; 10f21f: 31 c0 xor %eax,%eax 10f221: eb 05 jmp 10f228 default: return ENOTSUP; 10f223: b8 86 00 00 00 mov $0x86,%eax } } 10f228: c9 leave 10f229: c3 ret =============================================================================== 0010a518 : int pthread_barrier_init( pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count ) { 10a518: 55 push %ebp 10a519: 89 e5 mov %esp,%ebp 10a51b: 57 push %edi 10a51c: 56 push %esi 10a51d: 53 push %ebx 10a51e: 83 ec 1c sub $0x1c,%esp 10a521: 8b 5d 08 mov 0x8(%ebp),%ebx 10a524: 8b 75 10 mov 0x10(%ebp),%esi /* * Error check parameters */ if ( !barrier ) return EINVAL; 10a527: b8 16 00 00 00 mov $0x16,%eax const pthread_barrierattr_t *the_attr; /* * Error check parameters */ if ( !barrier ) 10a52c: 85 db test %ebx,%ebx 10a52e: 0f 84 96 00 00 00 je 10a5ca return EINVAL; if ( count == 0 ) 10a534: 85 f6 test %esi,%esi 10a536: 0f 84 8e 00 00 00 je 10a5ca return EINVAL; /* * If the user passed in NULL, use the default attributes */ if ( attr ) { 10a53c: 8b 7d 0c mov 0xc(%ebp),%edi 10a53f: 85 ff test %edi,%edi 10a541: 75 0f jne 10a552 the_attr = attr; } else { (void) pthread_barrierattr_init( &my_attr ); 10a543: 83 ec 0c sub $0xc,%esp 10a546: 8d 7d d8 lea -0x28(%ebp),%edi 10a549: 57 push %edi 10a54a: e8 19 ff ff ff call 10a468 10a54f: 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; 10a552: 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 ) 10a557: 83 3f 00 cmpl $0x0,(%edi) 10a55a: 74 6e je 10a5ca return EINVAL; switch ( the_attr->process_shared ) { 10a55c: 83 7f 04 00 cmpl $0x0,0x4(%edi) 10a560: 75 68 jne 10a5ca <== NEVER TAKEN } /* * Convert from POSIX attributes to Core Barrier attributes */ the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE; 10a562: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp) the_attributes.maximum_count = count; 10a569: 89 75 e4 mov %esi,-0x1c(%ebp) rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 10a56c: a1 50 63 12 00 mov 0x126350,%eax 10a571: 40 inc %eax 10a572: 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 ); 10a577: 83 ec 0c sub $0xc,%esp 10a57a: 68 f4 66 12 00 push $0x1266f4 10a57f: e8 0c 1e 00 00 call 10c390 <_Objects_Allocate> 10a584: 89 c6 mov %eax,%esi */ _Thread_Disable_dispatch(); /* prevents deletion */ the_barrier = _POSIX_Barrier_Allocate(); if ( !the_barrier ) { 10a586: 83 c4 10 add $0x10,%esp 10a589: 85 c0 test %eax,%eax 10a58b: 75 0c jne 10a599 _Thread_Enable_dispatch(); 10a58d: e8 d0 2c 00 00 call 10d262 <_Thread_Enable_dispatch> return EAGAIN; 10a592: b8 0b 00 00 00 mov $0xb,%eax 10a597: eb 31 jmp 10a5ca } _CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes ); 10a599: 50 push %eax 10a59a: 50 push %eax 10a59b: 8d 45 e0 lea -0x20(%ebp),%eax 10a59e: 50 push %eax 10a59f: 8d 46 10 lea 0x10(%esi),%eax 10a5a2: 50 push %eax 10a5a3: e8 a8 14 00 00 call 10ba50 <_CORE_barrier_Initialize> uint32_t name ) { _Objects_Set_local_object( information, _Objects_Get_index( the_object->id ), 10a5a8: 8b 46 08 mov 0x8(%esi),%eax Objects_Information *information, Objects_Control *the_object, uint32_t name ) { _Objects_Set_local_object( 10a5ab: 0f b7 c8 movzwl %ax,%ecx #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 10a5ae: 8b 15 10 67 12 00 mov 0x126710,%edx 10a5b4: 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; 10a5b7: 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; 10a5be: 89 03 mov %eax,(%ebx) _Thread_Enable_dispatch(); 10a5c0: e8 9d 2c 00 00 call 10d262 <_Thread_Enable_dispatch> return 0; 10a5c5: 83 c4 10 add $0x10,%esp 10a5c8: 31 c0 xor %eax,%eax } 10a5ca: 8d 65 f4 lea -0xc(%ebp),%esp 10a5cd: 5b pop %ebx 10a5ce: 5e pop %esi 10a5cf: 5f pop %edi 10a5d0: c9 leave 10a5d1: c3 ret =============================================================================== 00109ed0 : void pthread_cleanup_push( void (*routine)( void * ), void *arg ) { 109ed0: 55 push %ebp 109ed1: 89 e5 mov %esp,%ebp 109ed3: 56 push %esi 109ed4: 53 push %ebx 109ed5: 8b 5d 08 mov 0x8(%ebp),%ebx 109ed8: 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 ) 109edb: 85 db test %ebx,%ebx 109edd: 74 4b je 109f2a rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 109edf: a1 48 63 12 00 mov 0x126348,%eax 109ee4: 40 inc %eax 109ee5: a3 48 63 12 00 mov %eax,0x126348 return; _Thread_Disable_dispatch(); handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) ); 109eea: 83 ec 0c sub $0xc,%esp 109eed: 6a 10 push $0x10 109eef: e8 32 3c 00 00 call 10db26 <_Workspace_Allocate> if ( handler ) { 109ef4: 83 c4 10 add $0x10,%esp 109ef7: 85 c0 test %eax,%eax 109ef9: 74 24 je 109f1f <== NEVER TAKEN thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; 109efb: 8b 15 70 68 12 00 mov 0x126870,%edx handler_stack = &thread_support->Cancellation_Handlers; 109f01: 8b 92 ec 00 00 00 mov 0xec(%edx),%edx 109f07: 81 c2 e4 00 00 00 add $0xe4,%edx handler->routine = routine; 109f0d: 89 58 08 mov %ebx,0x8(%eax) handler->arg = arg; 109f10: 89 70 0c mov %esi,0xc(%eax) _Chain_Append( handler_stack, &handler->Node ); 109f13: 51 push %ecx 109f14: 51 push %ecx 109f15: 50 push %eax 109f16: 52 push %edx 109f17: e8 88 15 00 00 call 10b4a4 <_Chain_Append> 109f1c: 83 c4 10 add $0x10,%esp } _Thread_Enable_dispatch(); } 109f1f: 8d 65 f8 lea -0x8(%ebp),%esp 109f22: 5b pop %ebx 109f23: 5e pop %esi 109f24: c9 leave handler->routine = routine; handler->arg = arg; _Chain_Append( handler_stack, &handler->Node ); } _Thread_Enable_dispatch(); 109f25: e9 34 2d 00 00 jmp 10cc5e <_Thread_Enable_dispatch> } 109f2a: 8d 65 f8 lea -0x8(%ebp),%esp 109f2d: 5b pop %ebx 109f2e: 5e pop %esi 109f2f: c9 leave 109f30: c3 ret =============================================================================== 0010ac40 : int pthread_cond_init( pthread_cond_t *cond, const pthread_condattr_t *attr ) { 10ac40: 55 push %ebp 10ac41: 89 e5 mov %esp,%ebp 10ac43: 56 push %esi 10ac44: 53 push %ebx POSIX_Condition_variables_Control *the_cond; const pthread_condattr_t *the_attr; if ( attr ) the_attr = attr; 10ac45: 8b 5d 0c mov 0xc(%ebp),%ebx 10ac48: 85 db test %ebx,%ebx 10ac4a: 75 05 jne 10ac51 else the_attr = &_POSIX_Condition_variables_Default_attributes; 10ac4c: bb 08 15 12 00 mov $0x121508,%ebx /* * Be careful about attributes when global!!! */ if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED ) return EINVAL; 10ac51: 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 ) 10ac56: 83 7b 04 01 cmpl $0x1,0x4(%ebx) 10ac5a: 74 76 je 10acd2 <== NEVER TAKEN return EINVAL; if ( !the_attr->is_initialized ) 10ac5c: 83 3b 00 cmpl $0x0,(%ebx) 10ac5f: 74 71 je 10acd2 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 10ac61: a1 60 73 12 00 mov 0x127360,%eax 10ac66: 40 inc %eax 10ac67: 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 ); 10ac6c: 83 ec 0c sub $0xc,%esp 10ac6f: 68 9c 77 12 00 push $0x12779c 10ac74: e8 f7 22 00 00 call 10cf70 <_Objects_Allocate> 10ac79: 89 c6 mov %eax,%esi _Thread_Disable_dispatch(); the_cond = _POSIX_Condition_variables_Allocate(); if ( !the_cond ) { 10ac7b: 83 c4 10 add $0x10,%esp 10ac7e: 85 c0 test %eax,%eax 10ac80: 75 0c jne 10ac8e _Thread_Enable_dispatch(); 10ac82: e8 bb 31 00 00 call 10de42 <_Thread_Enable_dispatch> return ENOMEM; 10ac87: b8 0c 00 00 00 mov $0xc,%eax 10ac8c: eb 44 jmp 10acd2 } the_cond->process_shared = the_attr->process_shared; 10ac8e: 8b 43 04 mov 0x4(%ebx),%eax 10ac91: 89 46 10 mov %eax,0x10(%esi) the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX; 10ac94: c7 46 14 00 00 00 00 movl $0x0,0x14(%esi) _Thread_queue_Initialize( 10ac9b: 6a 74 push $0x74 10ac9d: 68 00 08 00 10 push $0x10000800 10aca2: 6a 00 push $0x0 10aca4: 8d 46 18 lea 0x18(%esi),%eax 10aca7: 50 push %eax 10aca8: e8 4f 38 00 00 call 10e4fc <_Thread_queue_Initialize> uint32_t name ) { _Objects_Set_local_object( information, _Objects_Get_index( the_object->id ), 10acad: 8b 46 08 mov 0x8(%esi),%eax Objects_Information *information, Objects_Control *the_object, uint32_t name ) { _Objects_Set_local_object( 10acb0: 0f b7 c8 movzwl %ax,%ecx #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 10acb3: 8b 15 b8 77 12 00 mov 0x1277b8,%edx 10acb9: 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; 10acbc: c7 46 0c 00 00 00 00 movl $0x0,0xc(%esi) &_POSIX_Condition_variables_Information, &the_cond->Object, 0 ); *cond = the_cond->Object.id; 10acc3: 8b 55 08 mov 0x8(%ebp),%edx 10acc6: 89 02 mov %eax,(%edx) _Thread_Enable_dispatch(); 10acc8: e8 75 31 00 00 call 10de42 <_Thread_Enable_dispatch> return 0; 10accd: 83 c4 10 add $0x10,%esp 10acd0: 31 c0 xor %eax,%eax } 10acd2: 8d 65 f8 lea -0x8(%ebp),%esp 10acd5: 5b pop %ebx 10acd6: 5e pop %esi 10acd7: c9 leave 10acd8: c3 ret =============================================================================== 0010aaf4 : */ int pthread_condattr_destroy( pthread_condattr_t *attr ) { 10aaf4: 55 push %ebp 10aaf5: 89 e5 mov %esp,%ebp 10aaf7: 8b 55 08 mov 0x8(%ebp),%edx if ( !attr || attr->is_initialized == false ) return EINVAL; 10aafa: b8 16 00 00 00 mov $0x16,%eax int pthread_condattr_destroy( pthread_condattr_t *attr ) { if ( !attr || attr->is_initialized == false ) 10aaff: 85 d2 test %edx,%edx 10ab01: 74 0d je 10ab10 10ab03: 83 3a 00 cmpl $0x0,(%edx) 10ab06: 74 08 je 10ab10 <== NEVER TAKEN return EINVAL; attr->is_initialized = false; 10ab08: c7 02 00 00 00 00 movl $0x0,(%edx) return 0; 10ab0e: 30 c0 xor %al,%al } 10ab10: c9 leave 10ab11: c3 ret =============================================================================== 0010a228 : pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)( void * ), void *arg ) { 10a228: 55 push %ebp 10a229: 89 e5 mov %esp,%ebp 10a22b: 57 push %edi 10a22c: 56 push %esi 10a22d: 53 push %ebx 10a22e: 83 ec 5c sub $0x5c,%esp struct sched_param schedparam; Objects_Name name; int rc; if ( !start_routine ) return EFAULT; 10a231: 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 ) 10a238: 83 7d 10 00 cmpl $0x0,0x10(%ebp) 10a23c: 0f 84 0f 02 00 00 je 10a451 return EFAULT; the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes; 10a242: 8b 5d 0c mov 0xc(%ebp),%ebx 10a245: 85 db test %ebx,%ebx 10a247: 75 05 jne 10a24e 10a249: bb 74 01 12 00 mov $0x120174,%ebx if ( !the_attr->is_initialized ) return EINVAL; 10a24e: 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 ) 10a255: 83 3b 00 cmpl $0x0,(%ebx) 10a258: 0f 84 f3 01 00 00 je 10a451 * 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) ) 10a25e: 83 7b 04 00 cmpl $0x0,0x4(%ebx) 10a262: 74 0e je 10a272 10a264: a1 44 22 12 00 mov 0x122244,%eax 10a269: 39 43 08 cmp %eax,0x8(%ebx) 10a26c: 0f 82 df 01 00 00 jb 10a451 * 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 ) { 10a272: 8b 43 10 mov 0x10(%ebx),%eax 10a275: 83 f8 01 cmp $0x1,%eax 10a278: 74 0b je 10a285 10a27a: 83 f8 02 cmp $0x2,%eax 10a27d: 0f 85 c7 01 00 00 jne 10a44a 10a283: eb 1f jmp 10a2a4 case PTHREAD_INHERIT_SCHED: api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; 10a285: a1 78 68 12 00 mov 0x126878,%eax 10a28a: 8b b0 ec 00 00 00 mov 0xec(%eax),%esi schedpolicy = api->schedpolicy; 10a290: 8b 86 84 00 00 00 mov 0x84(%esi),%eax 10a296: 89 45 ac mov %eax,-0x54(%ebp) schedparam = api->schedparam; 10a299: 8d 7d c4 lea -0x3c(%ebp),%edi 10a29c: 81 c6 88 00 00 00 add $0x88,%esi 10a2a2: eb 0c jmp 10a2b0 break; case PTHREAD_EXPLICIT_SCHED: schedpolicy = the_attr->schedpolicy; 10a2a4: 8b 43 14 mov 0x14(%ebx),%eax 10a2a7: 89 45 ac mov %eax,-0x54(%ebp) schedparam = the_attr->schedparam; 10a2aa: 8d 7d c4 lea -0x3c(%ebp),%edi 10a2ad: 8d 73 18 lea 0x18(%ebx),%esi 10a2b0: b9 07 00 00 00 mov $0x7,%ecx 10a2b5: 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; 10a2b7: 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 ) 10a2be: 83 7b 0c 00 cmpl $0x0,0xc(%ebx) 10a2c2: 0f 85 89 01 00 00 jne 10a451 return ENOTSUP; /* * Interpret the scheduling parameters. */ if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) ) 10a2c8: 83 ec 0c sub $0xc,%esp 10a2cb: ff 75 c4 pushl -0x3c(%ebp) 10a2ce: e8 11 59 00 00 call 10fbe4 <_POSIX_Priority_Is_valid> 10a2d3: 83 c4 10 add $0x10,%esp return EINVAL; 10a2d6: 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 ) ) 10a2dd: 84 c0 test %al,%al 10a2df: 0f 84 6c 01 00 00 je 10a451 <== NEVER TAKEN return EINVAL; core_priority = _POSIX_Priority_To_core( schedparam.sched_priority ); 10a2e5: 8b 45 c4 mov -0x3c(%ebp),%eax 10a2e8: 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); 10a2eb: 0f b6 3d 48 22 12 00 movzbl 0x122248,%edi /* * Set the core scheduling policy information. */ rc = _POSIX_Thread_Translate_sched_param( 10a2f2: 8d 45 e0 lea -0x20(%ebp),%eax 10a2f5: 50 push %eax 10a2f6: 8d 45 e4 lea -0x1c(%ebp),%eax 10a2f9: 50 push %eax 10a2fa: 8d 45 c4 lea -0x3c(%ebp),%eax 10a2fd: 50 push %eax 10a2fe: ff 75 ac pushl -0x54(%ebp) 10a301: e8 fe 58 00 00 call 10fc04 <_POSIX_Thread_Translate_sched_param> 10a306: 89 45 b4 mov %eax,-0x4c(%ebp) schedpolicy, &schedparam, &budget_algorithm, &budget_callout ); if ( rc ) 10a309: 83 c4 10 add $0x10,%esp 10a30c: 85 c0 test %eax,%eax 10a30e: 0f 85 3d 01 00 00 jne 10a451 #endif /* * Lock the allocator mutex for protection */ _RTEMS_Lock_allocator(); 10a314: 83 ec 0c sub $0xc,%esp 10a317: ff 35 f4 63 12 00 pushl 0x1263f4 10a31d: e8 4e 15 00 00 call 10b870 <_API_Mutex_Lock> * _POSIX_Threads_Allocate */ RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void ) { return (Thread_Control *) _Objects_Allocate( &_POSIX_Threads_Information ); 10a322: c7 04 24 74 65 12 00 movl $0x126574,(%esp) 10a329: e8 a2 1e 00 00 call 10c1d0 <_Objects_Allocate> 10a32e: 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 ) { 10a331: 83 c4 10 add $0x10,%esp 10a334: 85 c0 test %eax,%eax 10a336: 75 05 jne 10a33d _RTEMS_Unlock_allocator(); 10a338: 83 ec 0c sub $0xc,%esp 10a33b: eb 53 jmp 10a390 /* * Initialize the core thread for this task. */ name.name_p = NULL; /* posix threads don't have a name by default */ status = _Thread_Initialize( 10a33d: 8b 4d e0 mov -0x20(%ebp),%ecx 10a340: 8b 75 e4 mov -0x1c(%ebp),%esi 10a343: 8b 53 08 mov 0x8(%ebx),%edx 10a346: a1 44 22 12 00 mov 0x122244,%eax 10a34b: d1 e0 shl %eax 10a34d: 39 d0 cmp %edx,%eax 10a34f: 73 02 jae 10a353 10a351: 89 d0 mov %edx,%eax 10a353: 52 push %edx 10a354: 6a 00 push $0x0 10a356: 6a 00 push $0x0 10a358: 51 push %ecx 10a359: 56 push %esi 10a35a: 6a 01 push $0x1 10a35c: 81 e7 ff 00 00 00 and $0xff,%edi 10a362: 2b 7d a8 sub -0x58(%ebp),%edi 10a365: 57 push %edi 10a366: 6a 01 push $0x1 10a368: 50 push %eax 10a369: ff 73 04 pushl 0x4(%ebx) 10a36c: ff 75 b0 pushl -0x50(%ebp) 10a36f: 68 74 65 12 00 push $0x126574 10a374: e8 bb 2d 00 00 call 10d134 <_Thread_Initialize> budget_callout, 0, /* isr level */ name /* posix threads don't have a name */ ); if ( !status ) { 10a379: 83 c4 30 add $0x30,%esp 10a37c: 84 c0 test %al,%al 10a37e: 75 2a jne 10a3aa RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free ( Thread_Control *the_pthread ) { _Objects_Free( &_POSIX_Threads_Information, &the_pthread->Object ); 10a380: 56 push %esi 10a381: 56 push %esi 10a382: ff 75 b0 pushl -0x50(%ebp) 10a385: 68 74 65 12 00 push $0x126574 10a38a: e8 35 21 00 00 call 10c4c4 <_Objects_Free> _POSIX_Threads_Free( the_thread ); _RTEMS_Unlock_allocator(); 10a38f: 5b pop %ebx 10a390: ff 35 f4 63 12 00 pushl 0x1263f4 10a396: e8 1d 15 00 00 call 10b8b8 <_API_Mutex_Unlock> return EAGAIN; 10a39b: 83 c4 10 add $0x10,%esp 10a39e: c7 45 b4 0b 00 00 00 movl $0xb,-0x4c(%ebp) 10a3a5: e9 a7 00 00 00 jmp 10a451 } /* * finish initializing the per API structure */ api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 10a3aa: 8b 45 b0 mov -0x50(%ebp),%eax 10a3ad: 8b 90 ec 00 00 00 mov 0xec(%eax),%edx api->Attributes = *the_attr; 10a3b3: b9 10 00 00 00 mov $0x10,%ecx 10a3b8: 89 d7 mov %edx,%edi 10a3ba: 89 de mov %ebx,%esi 10a3bc: f3 a5 rep movsl %ds:(%esi),%es:(%edi) api->detachstate = the_attr->detachstate; 10a3be: 8b 43 3c mov 0x3c(%ebx),%eax 10a3c1: 89 42 40 mov %eax,0x40(%edx) api->schedpolicy = schedpolicy; 10a3c4: 8b 45 ac mov -0x54(%ebp),%eax 10a3c7: 89 82 84 00 00 00 mov %eax,0x84(%edx) api->schedparam = schedparam; 10a3cd: 8d ba 88 00 00 00 lea 0x88(%edx),%edi 10a3d3: 8d 75 c4 lea -0x3c(%ebp),%esi 10a3d6: b1 07 mov $0x7,%cl 10a3d8: f3 a5 rep movsl %ds:(%esi),%es:(%edi) /* * POSIX threads are allocated and started in one operation. */ status = _Thread_Start( 10a3da: 83 ec 0c sub $0xc,%esp 10a3dd: 6a 00 push $0x0 10a3df: ff 75 14 pushl 0x14(%ebp) 10a3e2: ff 75 10 pushl 0x10(%ebp) 10a3e5: 6a 01 push $0x1 10a3e7: ff 75 b0 pushl -0x50(%ebp) 10a3ea: 89 55 a4 mov %edx,-0x5c(%ebp) 10a3ed: e8 62 35 00 00 call 10d954 <_Thread_Start> _RTEMS_Unlock_allocator(); return EINVAL; } #endif if ( schedpolicy == SCHED_SPORADIC ) { 10a3f2: 83 c4 20 add $0x20,%esp 10a3f5: 83 7d ac 04 cmpl $0x4,-0x54(%ebp) 10a3f9: 8b 55 a4 mov -0x5c(%ebp),%edx 10a3fc: 75 2e jne 10a42c _Watchdog_Insert_ticks( 10a3fe: 83 ec 0c sub $0xc,%esp &api->Sporadic_timer, _Timespec_To_ticks( &api->schedparam.sched_ss_repl_period ) 10a401: 8d 82 90 00 00 00 lea 0x90(%edx),%eax return EINVAL; } #endif if ( schedpolicy == SCHED_SPORADIC ) { _Watchdog_Insert_ticks( 10a407: 50 push %eax 10a408: e8 97 36 00 00 call 10daa4 <_Timespec_To_ticks> Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 10a40d: 8b 55 a4 mov -0x5c(%ebp),%edx 10a410: 89 82 b4 00 00 00 mov %eax,0xb4(%edx) _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 10a416: 58 pop %eax 10a417: 59 pop %ecx 10a418: 81 c2 a8 00 00 00 add $0xa8,%edx 10a41e: 52 push %edx 10a41f: 68 14 64 12 00 push $0x126414 10a424: e8 2f 39 00 00 call 10dd58 <_Watchdog_Insert> 10a429: 83 c4 10 add $0x10,%esp } /* * Return the id and indicate we successfully created the thread */ *thread = the_thread->Object.id; 10a42c: 8b 45 b0 mov -0x50(%ebp),%eax 10a42f: 8b 50 08 mov 0x8(%eax),%edx 10a432: 8b 45 08 mov 0x8(%ebp),%eax 10a435: 89 10 mov %edx,(%eax) _RTEMS_Unlock_allocator(); 10a437: 83 ec 0c sub $0xc,%esp 10a43a: ff 35 f4 63 12 00 pushl 0x1263f4 10a440: e8 73 14 00 00 call 10b8b8 <_API_Mutex_Unlock> return 0; 10a445: 83 c4 10 add $0x10,%esp 10a448: eb 07 jmp 10a451 schedpolicy = the_attr->schedpolicy; schedparam = the_attr->schedparam; break; default: return EINVAL; 10a44a: c7 45 b4 16 00 00 00 movl $0x16,-0x4c(%ebp) */ *thread = the_thread->Object.id; _RTEMS_Unlock_allocator(); return 0; } 10a451: 8b 45 b4 mov -0x4c(%ebp),%eax 10a454: 8d 65 f4 lea -0xc(%ebp),%esp 10a457: 5b pop %ebx 10a458: 5e pop %esi 10a459: 5f pop %edi 10a45a: c9 leave 10a45b: c3 ret =============================================================================== 00110ce0 : } void pthread_exit( void *value_ptr ) { 110ce0: 55 push %ebp 110ce1: 89 e5 mov %esp,%ebp 110ce3: 83 ec 10 sub $0x10,%esp _POSIX_Thread_Exit( _Thread_Executing, value_ptr ); 110ce6: ff 75 08 pushl 0x8(%ebp) 110ce9: ff 35 68 58 12 00 pushl 0x125868 110cef: e8 88 ff ff ff call 110c7c <_POSIX_Thread_Exit> 110cf4: 83 c4 10 add $0x10,%esp <== NOT EXECUTED } 110cf7: c9 leave <== NOT EXECUTED 110cf8: c3 ret <== NOT EXECUTED =============================================================================== 0010bf24 : int pthread_mutex_timedlock( pthread_mutex_t *mutex, const struct timespec *abstime ) { 10bf24: 55 push %ebp 10bf25: 89 e5 mov %esp,%ebp 10bf27: 53 push %ebx 10bf28: 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 ); 10bf2b: 8d 45 f4 lea -0xc(%ebp),%eax 10bf2e: 50 push %eax 10bf2f: ff 75 0c pushl 0xc(%ebp) 10bf32: e8 b9 00 00 00 call 10bff0 <_POSIX_Absolute_timeout_to_ticks> 10bf37: 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, 10bf39: 83 c4 0c add $0xc,%esp 10bf3c: 83 f8 03 cmp $0x3,%eax 10bf3f: 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 ); 10bf42: ff 75 f4 pushl -0xc(%ebp) 10bf45: 0f b6 c2 movzbl %dl,%eax 10bf48: 50 push %eax 10bf49: ff 75 08 pushl 0x8(%ebp) 10bf4c: 88 55 e4 mov %dl,-0x1c(%ebp) 10bf4f: e8 e8 fe ff ff call 10be3c <_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) ) { 10bf54: 83 c4 10 add $0x10,%esp 10bf57: 8a 55 e4 mov -0x1c(%ebp),%dl 10bf5a: 84 d2 test %dl,%dl 10bf5c: 75 1d jne 10bf7b 10bf5e: 83 f8 10 cmp $0x10,%eax 10bf61: 75 18 jne 10bf7b <== NEVER TAKEN if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID ) 10bf63: 85 db test %ebx,%ebx 10bf65: 74 08 je 10bf6f <== NEVER TAKEN return EINVAL; if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST || 10bf67: 4b dec %ebx 10bf68: 83 fb 01 cmp $0x1,%ebx 10bf6b: 77 0e ja 10bf7b <== NEVER TAKEN 10bf6d: eb 07 jmp 10bf76 * 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; 10bf6f: b8 16 00 00 00 mov $0x16,%eax <== NOT EXECUTED 10bf74: eb 05 jmp 10bf7b <== NOT EXECUTED if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST || status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; 10bf76: b8 74 00 00 00 mov $0x74,%eax } return lock_status; } 10bf7b: 8b 5d fc mov -0x4(%ebp),%ebx 10bf7e: c9 leave 10bf7f: c3 ret =============================================================================== 0010bb9c : int pthread_mutexattr_setpshared( pthread_mutexattr_t *attr, int pshared ) { 10bb9c: 55 push %ebp 10bb9d: 89 e5 mov %esp,%ebp 10bb9f: 8b 55 08 mov 0x8(%ebp),%edx 10bba2: 8b 4d 0c mov 0xc(%ebp),%ecx if ( !attr || !attr->is_initialized ) return EINVAL; 10bba5: b8 16 00 00 00 mov $0x16,%eax int pthread_mutexattr_setpshared( pthread_mutexattr_t *attr, int pshared ) { if ( !attr || !attr->is_initialized ) 10bbaa: 85 d2 test %edx,%edx 10bbac: 74 0f je 10bbbd 10bbae: 83 3a 00 cmpl $0x0,(%edx) 10bbb1: 74 0a je 10bbbd return EINVAL; switch ( pshared ) { 10bbb3: 83 f9 01 cmp $0x1,%ecx 10bbb6: 77 05 ja 10bbbd <== NEVER TAKEN case PTHREAD_PROCESS_SHARED: case PTHREAD_PROCESS_PRIVATE: attr->process_shared = pshared; 10bbb8: 89 4a 04 mov %ecx,0x4(%edx) return 0; 10bbbb: 30 c0 xor %al,%al default: return EINVAL; } } 10bbbd: c9 leave 10bbbe: c3 ret =============================================================================== 00109dc4 : #if defined(_UNIX98_THREAD_MUTEX_ATTRIBUTES) int pthread_mutexattr_settype( pthread_mutexattr_t *attr, int type ) { 109dc4: 55 push %ebp 109dc5: 89 e5 mov %esp,%ebp 109dc7: 8b 55 08 mov 0x8(%ebp),%edx 109dca: 8b 4d 0c mov 0xc(%ebp),%ecx if ( !attr || !attr->is_initialized ) return EINVAL; 109dcd: b8 16 00 00 00 mov $0x16,%eax int pthread_mutexattr_settype( pthread_mutexattr_t *attr, int type ) { if ( !attr || !attr->is_initialized ) 109dd2: 85 d2 test %edx,%edx 109dd4: 74 0f je 109de5 109dd6: 83 3a 00 cmpl $0x0,(%edx) 109dd9: 74 0a je 109de5 <== NEVER TAKEN return EINVAL; switch ( type ) { 109ddb: 83 f9 03 cmp $0x3,%ecx 109dde: 77 05 ja 109de5 case PTHREAD_MUTEX_NORMAL: case PTHREAD_MUTEX_RECURSIVE: case PTHREAD_MUTEX_ERRORCHECK: case PTHREAD_MUTEX_DEFAULT: attr->type = type; 109de0: 89 4a 10 mov %ecx,0x10(%edx) return 0; 109de3: 30 c0 xor %al,%al default: return EINVAL; } } 109de5: c9 leave 109de6: c3 ret =============================================================================== 0010a874 : int pthread_once( pthread_once_t *once_control, void (*init_routine)(void) ) { 10a874: 55 push %ebp 10a875: 89 e5 mov %esp,%ebp 10a877: 56 push %esi 10a878: 53 push %ebx 10a879: 83 ec 10 sub $0x10,%esp 10a87c: 8b 5d 08 mov 0x8(%ebp),%ebx 10a87f: 8b 75 0c mov 0xc(%ebp),%esi if ( !once_control || !init_routine ) 10a882: 85 f6 test %esi,%esi 10a884: 74 51 je 10a8d7 10a886: 85 db test %ebx,%ebx 10a888: 74 4d je 10a8d7 once_control->init_executed = true; (*init_routine)(); } rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); } return 0; 10a88a: 31 c0 xor %eax,%eax ) { if ( !once_control || !init_routine ) return EINVAL; if ( !once_control->init_executed ) { 10a88c: 83 7b 04 00 cmpl $0x0,0x4(%ebx) 10a890: 75 4a jne 10a8dc rtems_mode saveMode; rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode); 10a892: 52 push %edx 10a893: 8d 45 f4 lea -0xc(%ebp),%eax 10a896: 50 push %eax 10a897: 68 00 01 00 00 push $0x100 10a89c: 68 00 01 00 00 push $0x100 10a8a1: e8 9e 0a 00 00 call 10b344 if ( !once_control->init_executed ) { 10a8a6: 83 c4 10 add $0x10,%esp 10a8a9: 83 7b 04 00 cmpl $0x0,0x4(%ebx) 10a8ad: 75 0f jne 10a8be <== NEVER TAKEN once_control->is_initialized = true; 10a8af: c7 03 01 00 00 00 movl $0x1,(%ebx) once_control->init_executed = true; 10a8b5: c7 43 04 01 00 00 00 movl $0x1,0x4(%ebx) (*init_routine)(); 10a8bc: ff d6 call *%esi } rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); 10a8be: 50 push %eax 10a8bf: 8d 45 f4 lea -0xc(%ebp),%eax 10a8c2: 50 push %eax 10a8c3: 68 00 01 00 00 push $0x100 10a8c8: ff 75 f4 pushl -0xc(%ebp) 10a8cb: e8 74 0a 00 00 call 10b344 10a8d0: 83 c4 10 add $0x10,%esp } return 0; 10a8d3: 31 c0 xor %eax,%eax 10a8d5: eb 05 jmp 10a8dc pthread_once_t *once_control, void (*init_routine)(void) ) { if ( !once_control || !init_routine ) return EINVAL; 10a8d7: b8 16 00 00 00 mov $0x16,%eax (*init_routine)(); } rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); } return 0; } 10a8dc: 8d 65 f8 lea -0x8(%ebp),%esp 10a8df: 5b pop %ebx 10a8e0: 5e pop %esi 10a8e1: c9 leave 10a8e2: c3 ret =============================================================================== 0010b0a0 : int pthread_rwlock_init( pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr ) { 10b0a0: 55 push %ebp 10b0a1: 89 e5 mov %esp,%ebp 10b0a3: 56 push %esi 10b0a4: 53 push %ebx 10b0a5: 83 ec 10 sub $0x10,%esp 10b0a8: 8b 5d 08 mov 0x8(%ebp),%ebx /* * Error check parameters */ if ( !rwlock ) return EINVAL; 10b0ab: b8 16 00 00 00 mov $0x16,%eax const pthread_rwlockattr_t *the_attr; /* * Error check parameters */ if ( !rwlock ) 10b0b0: 85 db test %ebx,%ebx 10b0b2: 0f 84 8b 00 00 00 je 10b143 return EINVAL; /* * If the user passed in NULL, use the default attributes */ if ( attr ) { 10b0b8: 8b 75 0c mov 0xc(%ebp),%esi 10b0bb: 85 f6 test %esi,%esi 10b0bd: 75 0f jne 10b0ce the_attr = attr; } else { (void) pthread_rwlockattr_init( &default_attr ); 10b0bf: 83 ec 0c sub $0xc,%esp 10b0c2: 8d 75 ec lea -0x14(%ebp),%esi 10b0c5: 56 push %esi 10b0c6: e8 5d 09 00 00 call 10ba28 10b0cb: 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; 10b0ce: 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 ) 10b0d3: 83 3e 00 cmpl $0x0,(%esi) 10b0d6: 74 6b je 10b143 <== NEVER TAKEN return EINVAL; switch ( the_attr->process_shared ) { 10b0d8: 83 7e 04 00 cmpl $0x0,0x4(%esi) 10b0dc: 75 65 jne 10b143 <== NEVER TAKEN */ RTEMS_INLINE_ROUTINE void _CORE_RWLock_Initialize_attributes( CORE_RWLock_Attributes *the_attributes ) { the_attributes->XXX = 0; 10b0de: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 10b0e5: a1 50 83 12 00 mov 0x128350,%eax 10b0ea: 40 inc %eax 10b0eb: 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 ); 10b0f0: 83 ec 0c sub $0xc,%esp 10b0f3: 68 34 85 12 00 push $0x128534 10b0f8: e8 33 23 00 00 call 10d430 <_Objects_Allocate> 10b0fd: 89 c6 mov %eax,%esi */ _Thread_Disable_dispatch(); /* prevents deletion */ the_rwlock = _POSIX_RWLock_Allocate(); if ( !the_rwlock ) { 10b0ff: 83 c4 10 add $0x10,%esp 10b102: 85 c0 test %eax,%eax 10b104: 75 0c jne 10b112 _Thread_Enable_dispatch(); 10b106: e8 f7 31 00 00 call 10e302 <_Thread_Enable_dispatch> return EAGAIN; 10b10b: b8 0b 00 00 00 mov $0xb,%eax 10b110: eb 31 jmp 10b143 } _CORE_RWLock_Initialize( &the_rwlock->RWLock, &the_attributes ); 10b112: 50 push %eax 10b113: 50 push %eax 10b114: 8d 45 f4 lea -0xc(%ebp),%eax 10b117: 50 push %eax 10b118: 8d 46 10 lea 0x10(%esi),%eax 10b11b: 50 push %eax 10b11c: e8 7b 1b 00 00 call 10cc9c <_CORE_RWLock_Initialize> uint32_t name ) { _Objects_Set_local_object( information, _Objects_Get_index( the_object->id ), 10b121: 8b 46 08 mov 0x8(%esi),%eax Objects_Information *information, Objects_Control *the_object, uint32_t name ) { _Objects_Set_local_object( 10b124: 0f b7 c8 movzwl %ax,%ecx #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 10b127: 8b 15 50 85 12 00 mov 0x128550,%edx 10b12d: 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; 10b130: c7 46 0c 00 00 00 00 movl $0x0,0xc(%esi) &_POSIX_RWLock_Information, &the_rwlock->Object, 0 ); *rwlock = the_rwlock->Object.id; 10b137: 89 03 mov %eax,(%ebx) _Thread_Enable_dispatch(); 10b139: e8 c4 31 00 00 call 10e302 <_Thread_Enable_dispatch> return 0; 10b13e: 83 c4 10 add $0x10,%esp 10b141: 31 c0 xor %eax,%eax } 10b143: 8d 65 f8 lea -0x8(%ebp),%esp 10b146: 5b pop %ebx 10b147: 5e pop %esi 10b148: c9 leave 10b149: c3 ret =============================================================================== 0010b1b4 : int pthread_rwlock_timedrdlock( pthread_rwlock_t *rwlock, const struct timespec *abstime ) { 10b1b4: 55 push %ebp 10b1b5: 89 e5 mov %esp,%ebp 10b1b7: 57 push %edi 10b1b8: 56 push %esi 10b1b9: 53 push %ebx 10b1ba: 83 ec 2c sub $0x2c,%esp 10b1bd: 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; 10b1c0: 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 ) 10b1c5: 85 ff test %edi,%edi 10b1c7: 0f 84 87 00 00 00 je 10b254 * * 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 ); 10b1cd: 50 push %eax 10b1ce: 50 push %eax 10b1cf: 8d 45 e0 lea -0x20(%ebp),%eax 10b1d2: 50 push %eax 10b1d3: ff 75 0c pushl 0xc(%ebp) 10b1d6: e8 59 59 00 00 call 110b34 <_POSIX_Absolute_timeout_to_ticks> 10b1db: 89 c6 mov %eax,%esi 10b1dd: 83 c4 0c add $0xc,%esp if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE ) do_wait = false; the_rwlock = _POSIX_RWLock_Get( rwlock, &location ); 10b1e0: 8d 45 e4 lea -0x1c(%ebp),%eax 10b1e3: 50 push %eax 10b1e4: ff 37 pushl (%edi) 10b1e6: 68 34 85 12 00 push $0x128534 10b1eb: e8 6c 26 00 00 call 10d85c <_Objects_Get> switch ( location ) { 10b1f0: 83 c4 10 add $0x10,%esp 10b1f3: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) 10b1f7: 75 5b jne 10b254 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, 10b1f9: 83 fe 03 cmp $0x3,%esi 10b1fc: 0f 94 c2 sete %dl case OBJECTS_LOCAL: _CORE_RWLock_Obtain_for_reading( 10b1ff: 83 ec 0c sub $0xc,%esp 10b202: 6a 00 push $0x0 10b204: ff 75 e0 pushl -0x20(%ebp) 10b207: 0f b6 ca movzbl %dl,%ecx 10b20a: 51 push %ecx 10b20b: ff 37 pushl (%edi) 10b20d: 83 c0 10 add $0x10,%eax 10b210: 50 push %eax 10b211: 88 55 d4 mov %dl,-0x2c(%ebp) 10b214: e8 b7 1a 00 00 call 10ccd0 <_CORE_RWLock_Obtain_for_reading> do_wait, ticks, NULL ); _Thread_Enable_dispatch(); 10b219: 83 c4 20 add $0x20,%esp 10b21c: e8 e1 30 00 00 call 10e302 <_Thread_Enable_dispatch> if ( !do_wait ) { 10b221: 8a 55 d4 mov -0x2c(%ebp),%dl 10b224: 84 d2 test %dl,%dl 10b226: 75 17 jne 10b23f if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) { 10b228: a1 78 88 12 00 mov 0x128878,%eax 10b22d: 83 78 34 02 cmpl $0x2,0x34(%eax) 10b231: 75 0c jne 10b23f if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID ) 10b233: 85 f6 test %esi,%esi 10b235: 74 1d je 10b254 <== NEVER TAKEN return EINVAL; if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST || 10b237: 4e dec %esi status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; 10b238: 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 || 10b23a: 83 fe 01 cmp $0x1,%esi 10b23d: 76 15 jbe 10b254 <== ALWAYS TAKEN status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; } } return _POSIX_RWLock_Translate_core_RWLock_return_code( 10b23f: 83 ec 0c sub $0xc,%esp (CORE_RWLock_Status) _Thread_Executing->Wait.return_code 10b242: a1 78 88 12 00 mov 0x128878,%eax status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; } } return _POSIX_RWLock_Translate_core_RWLock_return_code( 10b247: ff 70 34 pushl 0x34(%eax) 10b24a: e8 bd 00 00 00 call 10b30c <_POSIX_RWLock_Translate_core_RWLock_return_code> 10b24f: 89 c3 mov %eax,%ebx 10b251: 83 c4 10 add $0x10,%esp case OBJECTS_ERROR: break; } return EINVAL; } 10b254: 89 d8 mov %ebx,%eax 10b256: 8d 65 f4 lea -0xc(%ebp),%esp 10b259: 5b pop %ebx 10b25a: 5e pop %esi 10b25b: 5f pop %edi 10b25c: c9 leave 10b25d: c3 ret =============================================================================== 0010b260 : int pthread_rwlock_timedwrlock( pthread_rwlock_t *rwlock, const struct timespec *abstime ) { 10b260: 55 push %ebp 10b261: 89 e5 mov %esp,%ebp 10b263: 57 push %edi 10b264: 56 push %esi 10b265: 53 push %ebx 10b266: 83 ec 2c sub $0x2c,%esp 10b269: 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; 10b26c: 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 ) 10b271: 85 ff test %edi,%edi 10b273: 0f 84 87 00 00 00 je 10b300 * * 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 ); 10b279: 50 push %eax 10b27a: 50 push %eax 10b27b: 8d 45 e0 lea -0x20(%ebp),%eax 10b27e: 50 push %eax 10b27f: ff 75 0c pushl 0xc(%ebp) 10b282: e8 ad 58 00 00 call 110b34 <_POSIX_Absolute_timeout_to_ticks> 10b287: 89 c6 mov %eax,%esi 10b289: 83 c4 0c add $0xc,%esp if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE ) do_wait = false; the_rwlock = _POSIX_RWLock_Get( rwlock, &location ); 10b28c: 8d 45 e4 lea -0x1c(%ebp),%eax 10b28f: 50 push %eax 10b290: ff 37 pushl (%edi) 10b292: 68 34 85 12 00 push $0x128534 10b297: e8 c0 25 00 00 call 10d85c <_Objects_Get> switch ( location ) { 10b29c: 83 c4 10 add $0x10,%esp 10b29f: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) 10b2a3: 75 5b jne 10b300 (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, 10b2a5: 83 fe 03 cmp $0x3,%esi 10b2a8: 0f 94 c2 sete %dl case OBJECTS_LOCAL: _CORE_RWLock_Obtain_for_writing( 10b2ab: 83 ec 0c sub $0xc,%esp 10b2ae: 6a 00 push $0x0 10b2b0: ff 75 e0 pushl -0x20(%ebp) 10b2b3: 0f b6 ca movzbl %dl,%ecx 10b2b6: 51 push %ecx 10b2b7: ff 37 pushl (%edi) 10b2b9: 83 c0 10 add $0x10,%eax 10b2bc: 50 push %eax 10b2bd: 88 55 d4 mov %dl,-0x2c(%ebp) 10b2c0: e8 c3 1a 00 00 call 10cd88 <_CORE_RWLock_Obtain_for_writing> do_wait, ticks, NULL ); _Thread_Enable_dispatch(); 10b2c5: 83 c4 20 add $0x20,%esp 10b2c8: e8 35 30 00 00 call 10e302 <_Thread_Enable_dispatch> if ( !do_wait && 10b2cd: 8a 55 d4 mov -0x2c(%ebp),%dl 10b2d0: 84 d2 test %dl,%dl 10b2d2: 75 17 jne 10b2eb (_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) { 10b2d4: a1 78 88 12 00 mov 0x128878,%eax ticks, NULL ); _Thread_Enable_dispatch(); if ( !do_wait && 10b2d9: 83 78 34 02 cmpl $0x2,0x34(%eax) 10b2dd: 75 0c jne 10b2eb (_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) { if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID ) 10b2df: 85 f6 test %esi,%esi 10b2e1: 74 1d je 10b300 <== NEVER TAKEN return EINVAL; if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST || 10b2e3: 4e dec %esi status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; 10b2e4: 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 || 10b2e6: 83 fe 01 cmp $0x1,%esi 10b2e9: 76 15 jbe 10b300 <== ALWAYS TAKEN status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; } return _POSIX_RWLock_Translate_core_RWLock_return_code( 10b2eb: 83 ec 0c sub $0xc,%esp (CORE_RWLock_Status) _Thread_Executing->Wait.return_code 10b2ee: 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( 10b2f3: ff 70 34 pushl 0x34(%eax) 10b2f6: e8 11 00 00 00 call 10b30c <_POSIX_RWLock_Translate_core_RWLock_return_code> 10b2fb: 89 c3 mov %eax,%ebx 10b2fd: 83 c4 10 add $0x10,%esp case OBJECTS_ERROR: break; } return EINVAL; } 10b300: 89 d8 mov %ebx,%eax 10b302: 8d 65 f4 lea -0xc(%ebp),%esp 10b305: 5b pop %ebx 10b306: 5e pop %esi 10b307: 5f pop %edi 10b308: c9 leave 10b309: c3 ret =============================================================================== 0010ba48 : int pthread_rwlockattr_setpshared( pthread_rwlockattr_t *attr, int pshared ) { 10ba48: 55 push %ebp 10ba49: 89 e5 mov %esp,%ebp 10ba4b: 8b 55 08 mov 0x8(%ebp),%edx 10ba4e: 8b 4d 0c mov 0xc(%ebp),%ecx if ( !attr ) return EINVAL; 10ba51: b8 16 00 00 00 mov $0x16,%eax int pthread_rwlockattr_setpshared( pthread_rwlockattr_t *attr, int pshared ) { if ( !attr ) 10ba56: 85 d2 test %edx,%edx 10ba58: 74 0f je 10ba69 return EINVAL; if ( !attr->is_initialized ) 10ba5a: 83 3a 00 cmpl $0x0,(%edx) 10ba5d: 74 0a je 10ba69 return EINVAL; switch ( pshared ) { 10ba5f: 83 f9 01 cmp $0x1,%ecx 10ba62: 77 05 ja 10ba69 <== NEVER TAKEN case PTHREAD_PROCESS_SHARED: case PTHREAD_PROCESS_PRIVATE: attr->process_shared = pshared; 10ba64: 89 4a 04 mov %ecx,0x4(%edx) return 0; 10ba67: 30 c0 xor %al,%al default: return EINVAL; } } 10ba69: c9 leave 10ba6a: c3 ret =============================================================================== 0010c748 : int pthread_setschedparam( pthread_t thread, int policy, struct sched_param *param ) { 10c748: 55 push %ebp 10c749: 89 e5 mov %esp,%ebp 10c74b: 57 push %edi 10c74c: 56 push %esi 10c74d: 53 push %ebx 10c74e: 83 ec 2c sub $0x2c,%esp 10c751: 8b 75 10 mov 0x10(%ebp),%esi /* * Check all the parameters */ if ( !param ) return EINVAL; 10c754: c7 45 d4 16 00 00 00 movl $0x16,-0x2c(%ebp) int rc; /* * Check all the parameters */ if ( !param ) 10c75b: 85 f6 test %esi,%esi 10c75d: 0f 84 00 01 00 00 je 10c863 return EINVAL; rc = _POSIX_Thread_Translate_sched_param( 10c763: 8d 45 e0 lea -0x20(%ebp),%eax 10c766: 50 push %eax 10c767: 8d 45 e4 lea -0x1c(%ebp),%eax 10c76a: 50 push %eax 10c76b: 56 push %esi 10c76c: ff 75 0c pushl 0xc(%ebp) 10c76f: e8 20 53 00 00 call 111a94 <_POSIX_Thread_Translate_sched_param> 10c774: 89 45 d4 mov %eax,-0x2c(%ebp) policy, param, &budget_algorithm, &budget_callout ); if ( rc ) 10c777: 83 c4 10 add $0x10,%esp 10c77a: 85 c0 test %eax,%eax 10c77c: 0f 85 e1 00 00 00 jne 10c863 10c782: 53 push %ebx return rc; /* * Actually change the scheduling policy and parameters */ the_thread = _POSIX_Threads_Get( thread, &location ); 10c783: 8d 45 dc lea -0x24(%ebp),%eax 10c786: 50 push %eax 10c787: ff 75 08 pushl 0x8(%ebp) 10c78a: 68 d4 95 12 00 push $0x1295d4 10c78f: e8 80 1c 00 00 call 10e414 <_Objects_Get> 10c794: 89 c2 mov %eax,%edx switch ( location ) { 10c796: 83 c4 10 add $0x10,%esp 10c799: 83 7d dc 00 cmpl $0x0,-0x24(%ebp) 10c79d: 0f 85 b9 00 00 00 jne 10c85c case OBJECTS_LOCAL: api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 10c7a3: 8b 98 ec 00 00 00 mov 0xec(%eax),%ebx if ( api->schedpolicy == SCHED_SPORADIC ) 10c7a9: 83 bb 84 00 00 00 04 cmpl $0x4,0x84(%ebx) 10c7b0: 75 18 jne 10c7ca (void) _Watchdog_Remove( &api->Sporadic_timer ); 10c7b2: 83 ec 0c sub $0xc,%esp 10c7b5: 8d 83 a8 00 00 00 lea 0xa8(%ebx),%eax 10c7bb: 50 push %eax 10c7bc: 89 55 d0 mov %edx,-0x30(%ebp) 10c7bf: e8 58 35 00 00 call 10fd1c <_Watchdog_Remove> 10c7c4: 83 c4 10 add $0x10,%esp 10c7c7: 8b 55 d0 mov -0x30(%ebp),%edx api->schedpolicy = policy; 10c7ca: 8b 45 0c mov 0xc(%ebp),%eax 10c7cd: 89 83 84 00 00 00 mov %eax,0x84(%ebx) api->schedparam = *param; 10c7d3: 8d bb 88 00 00 00 lea 0x88(%ebx),%edi 10c7d9: b9 07 00 00 00 mov $0x7,%ecx 10c7de: f3 a5 rep movsl %ds:(%esi),%es:(%edi) the_thread->budget_algorithm = budget_algorithm; 10c7e0: 8b 45 e4 mov -0x1c(%ebp),%eax 10c7e3: 89 42 7c mov %eax,0x7c(%edx) the_thread->budget_callout = budget_callout; 10c7e6: 8b 45 e0 mov -0x20(%ebp),%eax 10c7e9: 89 82 80 00 00 00 mov %eax,0x80(%edx) switch ( api->schedpolicy ) { 10c7ef: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) 10c7f3: 78 60 js 10c855 <== NEVER TAKEN 10c7f5: 83 7d 0c 02 cmpl $0x2,0xc(%ebp) 10c7f9: 7e 08 jle 10c803 10c7fb: 83 7d 0c 04 cmpl $0x4,0xc(%ebp) 10c7ff: 75 54 jne 10c855 <== NEVER TAKEN 10c801: eb 24 jmp 10c827 case SCHED_OTHER: case SCHED_FIFO: case SCHED_RR: the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice; 10c803: a1 80 93 12 00 mov 0x129380,%eax 10c808: 89 42 78 mov %eax,0x78(%edx) 10c80b: 0f b6 05 48 52 12 00 movzbl 0x125248,%eax 10c812: 2b 83 88 00 00 00 sub 0x88(%ebx),%eax the_thread->real_priority = 10c818: 89 42 18 mov %eax,0x18(%edx) _POSIX_Priority_To_core( api->schedparam.sched_priority ); _Thread_Change_priority( 10c81b: 51 push %ecx 10c81c: 6a 01 push $0x1 10c81e: 50 push %eax 10c81f: 52 push %edx 10c820: e8 bf 22 00 00 call 10eae4 <_Thread_Change_priority> 10c825: eb 2b jmp 10c852 true ); break; case SCHED_SPORADIC: api->ss_high_priority = api->schedparam.sched_priority; 10c827: 8b 83 88 00 00 00 mov 0x88(%ebx),%eax 10c82d: 89 83 a4 00 00 00 mov %eax,0xa4(%ebx) _Watchdog_Remove( &api->Sporadic_timer ); 10c833: 83 ec 0c sub $0xc,%esp 10c836: 81 c3 a8 00 00 00 add $0xa8,%ebx 10c83c: 53 push %ebx 10c83d: 89 55 d0 mov %edx,-0x30(%ebp) 10c840: e8 d7 34 00 00 call 10fd1c <_Watchdog_Remove> _POSIX_Threads_Sporadic_budget_TSR( 0, the_thread ); 10c845: 58 pop %eax 10c846: 5a pop %edx 10c847: 8b 55 d0 mov -0x30(%ebp),%edx 10c84a: 52 push %edx 10c84b: 6a 00 push $0x0 10c84d: e8 e1 fd ff ff call 10c633 <_POSIX_Threads_Sporadic_budget_TSR> break; 10c852: 83 c4 10 add $0x10,%esp } _Thread_Enable_dispatch(); 10c855: e8 60 26 00 00 call 10eeba <_Thread_Enable_dispatch> return 0; 10c85a: eb 07 jmp 10c863 #endif case OBJECTS_ERROR: break; } return ESRCH; 10c85c: c7 45 d4 03 00 00 00 movl $0x3,-0x2c(%ebp) } 10c863: 8b 45 d4 mov -0x2c(%ebp),%eax 10c866: 8d 65 f4 lea -0xc(%ebp),%esp 10c869: 5b pop %ebx 10c86a: 5e pop %esi 10c86b: 5f pop %edi 10c86c: c9 leave 10c86d: c3 ret =============================================================================== 0010a644 : * * 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183 */ void pthread_testcancel( void ) { 10a644: 55 push %ebp 10a645: 89 e5 mov %esp,%ebp 10a647: 53 push %ebx 10a648: 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() ) 10a64b: 83 3d 6c 68 12 00 00 cmpl $0x0,0x12686c 10a652: 75 48 jne 10a69c <== NEVER TAKEN return; thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; 10a654: a1 70 68 12 00 mov 0x126870,%eax 10a659: 8b 80 ec 00 00 00 mov 0xec(%eax),%eax 10a65f: 8b 15 48 63 12 00 mov 0x126348,%edx 10a665: 42 inc %edx 10a666: 89 15 48 63 12 00 mov %edx,0x126348 */ void pthread_testcancel( void ) { POSIX_API_Control *thread_support; bool cancel = false; 10a66c: 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 && 10a66e: 83 b8 d8 00 00 00 00 cmpl $0x0,0xd8(%eax) 10a675: 75 0a jne 10a681 <== 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)); 10a677: 83 b8 e0 00 00 00 00 cmpl $0x0,0xe0(%eax) 10a67e: 0f 95 c3 setne %bl thread_support->cancelation_requested ) cancel = true; _Thread_Enable_dispatch(); 10a681: e8 d8 25 00 00 call 10cc5e <_Thread_Enable_dispatch> if ( cancel ) 10a686: 84 db test %bl,%bl 10a688: 74 12 je 10a69c _POSIX_Thread_Exit( _Thread_Executing, PTHREAD_CANCELED ); 10a68a: 50 push %eax 10a68b: 50 push %eax 10a68c: 6a ff push $0xffffffff 10a68e: ff 35 70 68 12 00 pushl 0x126870 10a694: e8 bb 52 00 00 call 10f954 <_POSIX_Thread_Exit> 10a699: 83 c4 10 add $0x10,%esp } 10a69c: 8b 5d fc mov -0x4(%ebp),%ebx 10a69f: c9 leave 10a6a0: c3 ret =============================================================================== 0011d0a4 : ssize_t read( int fd, void *buffer, size_t count ) { 11d0a4: 55 push %ebp 11d0a5: 89 e5 mov %esp,%ebp 11d0a7: 56 push %esi 11d0a8: 53 push %ebx 11d0a9: 8b 5d 08 mov 0x8(%ebp),%ebx 11d0ac: 8b 55 0c mov 0xc(%ebp),%edx 11d0af: 8b 4d 10 mov 0x10(%ebp),%ecx ssize_t rc; rtems_libio_t *iop; rtems_libio_check_fd( fd ); 11d0b2: 3b 1d 44 11 12 00 cmp 0x121144,%ebx 11d0b8: 73 14 jae 11d0ce <== NEVER TAKEN iop = rtems_libio_iop( fd ); 11d0ba: 6b db 38 imul $0x38,%ebx,%ebx 11d0bd: 03 1d f8 51 12 00 add 0x1251f8,%ebx rtems_libio_check_is_open( iop ); 11d0c3: 8b 73 14 mov 0x14(%ebx),%esi 11d0c6: f7 c6 00 01 00 00 test $0x100,%esi 11d0cc: 75 0d jne 11d0db 11d0ce: e8 f9 3f ff ff call 1110cc <__errno> 11d0d3: c7 00 09 00 00 00 movl $0x9,(%eax) 11d0d9: eb 1a jmp 11d0f5 rtems_libio_check_buffer( buffer ); 11d0db: 85 d2 test %edx,%edx 11d0dd: 74 0b je 11d0ea <== NEVER TAKEN rtems_libio_check_count( count ); 11d0df: 31 c0 xor %eax,%eax 11d0e1: 85 c9 test %ecx,%ecx 11d0e3: 74 31 je 11d116 rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ ); 11d0e5: 83 e6 02 and $0x2,%esi 11d0e8: 75 10 jne 11d0fa 11d0ea: e8 dd 3f ff ff call 1110cc <__errno> 11d0ef: c7 00 16 00 00 00 movl $0x16,(%eax) 11d0f5: 83 c8 ff or $0xffffffff,%eax 11d0f8: eb 1c jmp 11d116 /* * Now process the read(). */ rc = (*iop->pathinfo.handlers->read_h)( iop, buffer, count ); 11d0fa: 50 push %eax 11d0fb: 8b 43 20 mov 0x20(%ebx),%eax 11d0fe: 51 push %ecx 11d0ff: 52 push %edx 11d100: 53 push %ebx 11d101: ff 50 08 call *0x8(%eax) if ( rc > 0 ) 11d104: 83 c4 10 add $0x10,%esp 11d107: 85 c0 test %eax,%eax 11d109: 7e 0b jle 11d116 iop->offset += rc; 11d10b: 89 c1 mov %eax,%ecx 11d10d: c1 f9 1f sar $0x1f,%ecx 11d110: 01 43 0c add %eax,0xc(%ebx) 11d113: 11 4b 10 adc %ecx,0x10(%ebx) return rc; } 11d116: 8d 65 f8 lea -0x8(%ebp),%esp 11d119: 5b pop %ebx 11d11a: 5e pop %esi 11d11b: c9 leave 11d11c: c3 ret =============================================================================== 00109ea4 : ssize_t readlink( const char *pathname, char *buf, size_t bufsize ) { 109ea4: 55 push %ebp 109ea5: 89 e5 mov %esp,%ebp 109ea7: 57 push %edi 109ea8: 56 push %esi 109ea9: 53 push %ebx 109eaa: 83 ec 2c sub $0x2c,%esp 109ead: 8b 55 08 mov 0x8(%ebp),%edx 109eb0: 8b 5d 0c mov 0xc(%ebp),%ebx rtems_filesystem_location_info_t loc; int result; if (!buf) 109eb3: 85 db test %ebx,%ebx 109eb5: 75 10 jne 109ec7 rtems_set_errno_and_return_minus_one( EFAULT ); 109eb7: e8 1c 99 00 00 call 1137d8 <__errno> 109ebc: c7 00 0e 00 00 00 movl $0xe,(%eax) 109ec2: 83 cf ff or $0xffffffff,%edi 109ec5: eb 69 jmp 109f30 result = rtems_filesystem_evaluate_path( pathname, strlen( pathname ), 109ec7: 31 c0 xor %eax,%eax 109ec9: 83 c9 ff or $0xffffffff,%ecx 109ecc: 89 d7 mov %edx,%edi 109ece: f2 ae repnz scas %es:(%edi),%al 109ed0: f7 d1 not %ecx 109ed2: 49 dec %ecx 109ed3: 83 ec 0c sub $0xc,%esp 109ed6: 6a 00 push $0x0 109ed8: 8d 75 d4 lea -0x2c(%ebp),%esi 109edb: 56 push %esi 109edc: 6a 00 push $0x0 109ede: 51 push %ecx 109edf: 52 push %edx 109ee0: e8 6d f0 ff ff call 108f52 0, &loc, false ); if ( result != 0 ) 109ee5: 83 c4 20 add $0x20,%esp return -1; 109ee8: 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 ) 109eeb: 85 c0 test %eax,%eax 109eed: 75 41 jne 109f30 <== NEVER TAKEN return -1; if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK ){ 109eef: 83 ec 0c sub $0xc,%esp 109ef2: 56 push %esi 109ef3: 8b 45 e0 mov -0x20(%ebp),%eax 109ef6: ff 50 10 call *0x10(%eax) 109ef9: 83 c4 10 add $0x10,%esp 109efc: 83 f8 04 cmp $0x4,%eax 109eff: 74 16 je 109f17 rtems_filesystem_freenode( &loc ); 109f01: 83 ec 0c sub $0xc,%esp 109f04: 56 push %esi 109f05: e8 06 f1 ff ff call 109010 rtems_set_errno_and_return_minus_one( EINVAL ); 109f0a: e8 c9 98 00 00 call 1137d8 <__errno> 109f0f: c7 00 16 00 00 00 movl $0x16,(%eax) 109f15: eb 16 jmp 109f2d } result = (*loc.ops->readlink_h)( &loc, buf, bufsize ); 109f17: 50 push %eax 109f18: ff 75 10 pushl 0x10(%ebp) 109f1b: 53 push %ebx 109f1c: 56 push %esi 109f1d: 8b 45 e0 mov -0x20(%ebp),%eax 109f20: ff 50 3c call *0x3c(%eax) 109f23: 89 c7 mov %eax,%edi rtems_filesystem_freenode( &loc ); 109f25: 89 34 24 mov %esi,(%esp) 109f28: e8 e3 f0 ff ff call 109010 return result; 109f2d: 83 c4 10 add $0x10,%esp } 109f30: 89 f8 mov %edi,%eax 109f32: 8d 65 f4 lea -0xc(%ebp),%esp 109f35: 5b pop %ebx 109f36: 5e pop %esi 109f37: 5f pop %edi 109f38: c9 leave 109f39: c3 ret =============================================================================== 00108c54 : ssize_t readv( int fd, const struct iovec *iov, int iovcnt ) { 108c54: 55 push %ebp 108c55: 89 e5 mov %esp,%ebp 108c57: 57 push %edi 108c58: 56 push %esi 108c59: 53 push %ebx 108c5a: 83 ec 2c sub $0x2c,%esp 108c5d: 8b 75 08 mov 0x8(%ebp),%esi 108c60: 8b 7d 0c mov 0xc(%ebp),%edi int v; int bytes; rtems_libio_t *iop; bool all_zeros; rtems_libio_check_fd( fd ); 108c63: 3b 35 44 21 12 00 cmp 0x122144,%esi 108c69: 73 11 jae 108c7c iop = rtems_libio_iop( fd ); 108c6b: 6b f6 38 imul $0x38,%esi,%esi 108c6e: 03 35 f8 61 12 00 add 0x1261f8,%esi rtems_libio_check_is_open( iop ); 108c74: 8b 46 14 mov 0x14(%esi),%eax 108c77: f6 c4 01 test $0x1,%ah 108c7a: 75 10 jne 108c8c 108c7c: e8 1b 90 00 00 call 111c9c <__errno> 108c81: c7 00 09 00 00 00 movl $0x9,(%eax) 108c87: e9 a4 00 00 00 jmp 108d30 rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ ); 108c8c: a8 02 test $0x2,%al 108c8e: 74 35 je 108cc5 <== NEVER TAKEN /* * Argument validation on IO vector */ if ( !iov ) 108c90: 85 ff test %edi,%edi 108c92: 74 31 je 108cc5 rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt <= 0 ) 108c94: 83 7d 10 00 cmpl $0x0,0x10(%ebp) 108c98: 7e 2b jle 108cc5 rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt > IOV_MAX ) 108c9a: 81 7d 10 00 04 00 00 cmpl $0x400,0x10(%ebp) 108ca1: 7f 22 jg 108cc5 <== NEVER TAKEN 108ca3: b2 01 mov $0x1,%dl 108ca5: 31 c0 xor %eax,%eax 108ca7: 31 c9 xor %ecx,%ecx 108ca9: 89 75 d4 mov %esi,-0x2c(%ebp) 108cac: eb 03 jmp 108cb1 if ( iov[v].iov_base == 0 ) rtems_set_errno_and_return_minus_one( EINVAL ); /* check for wrap */ old = total; total += iov[v].iov_len; 108cae: 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 ) 108cb1: 83 3c c7 00 cmpl $0x0,(%edi,%eax,8) 108cb5: 74 0e je 108cc5 rtems_set_errno_and_return_minus_one( EINVAL ); /* check for wrap */ old = total; total += iov[v].iov_len; 108cb7: 8b 5c c7 04 mov 0x4(%edi,%eax,8),%ebx 108cbb: 8d 34 19 lea (%ecx,%ebx,1),%esi 108cbe: 89 75 e4 mov %esi,-0x1c(%ebp) if ( total < old ) 108cc1: 39 ce cmp %ecx,%esi 108cc3: 7d 0d jge 108cd2 rtems_set_errno_and_return_minus_one( EINVAL ); 108cc5: e8 d2 8f 00 00 call 111c9c <__errno> 108cca: c7 00 16 00 00 00 movl $0x16,(%eax) 108cd0: eb 5e jmp 108d30 if ( iov[v].iov_len ) all_zeros = false; 108cd2: 85 db test %ebx,%ebx 108cd4: 0f 94 c1 sete %cl 108cd7: f7 d9 neg %ecx 108cd9: 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++ ) { 108cdb: 40 inc %eax 108cdc: 3b 45 10 cmp 0x10(%ebp),%eax 108cdf: 7c cd jl 108cae 108ce1: 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; 108ce4: 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 ) { 108ce6: 84 d2 test %dl,%dl 108ce8: 75 49 jne 108d33 108cea: 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)( 108cf1: 50 push %eax 108cf2: 8b 46 20 mov 0x20(%esi),%eax 108cf5: 8b 55 e4 mov -0x1c(%ebp),%edx 108cf8: ff 74 d7 04 pushl 0x4(%edi,%edx,8) 108cfc: ff 34 d7 pushl (%edi,%edx,8) 108cff: 56 push %esi 108d00: ff 50 08 call *0x8(%eax) iop, iov[v].iov_base, iov[v].iov_len ); if ( bytes < 0 ) 108d03: 83 c4 10 add $0x10,%esp 108d06: 83 f8 00 cmp $0x0,%eax 108d09: 7c 25 jl 108d30 <== NEVER TAKEN return -1; if ( bytes > 0 ) { 108d0b: 74 0d je 108d1a <== NEVER TAKEN iop->offset += bytes; 108d0d: 89 c1 mov %eax,%ecx 108d0f: c1 f9 1f sar $0x1f,%ecx 108d12: 01 46 0c add %eax,0xc(%esi) 108d15: 11 4e 10 adc %ecx,0x10(%esi) total += bytes; 108d18: 01 c3 add %eax,%ebx } if (bytes != iov[ v ].iov_len) 108d1a: 8b 55 e4 mov -0x1c(%ebp),%edx 108d1d: 3b 44 d7 04 cmp 0x4(%edi,%edx,8),%eax 108d21: 75 10 jne 108d33 <== NEVER TAKEN } /* * Now process the readv(). */ for ( total=0, v=0 ; v < iovcnt ; v++ ) { 108d23: 42 inc %edx 108d24: 89 55 e4 mov %edx,-0x1c(%ebp) 108d27: 8b 45 10 mov 0x10(%ebp),%eax 108d2a: 39 c2 cmp %eax,%edx 108d2c: 7c c3 jl 108cf1 108d2e: eb 03 jmp 108d33 iov[v].iov_base, iov[v].iov_len ); if ( bytes < 0 ) return -1; 108d30: 83 cb ff or $0xffffffff,%ebx if (bytes != iov[ v ].iov_len) break; } return total; } 108d33: 89 d8 mov %ebx,%eax 108d35: 8d 65 f4 lea -0xc(%ebp),%esp 108d38: 5b pop %ebx 108d39: 5e pop %esi 108d3a: 5f pop %edi 108d3b: c9 leave 108d3c: c3 ret =============================================================================== 0011d1a8 : void *realloc( void *ptr, size_t size ) { 11d1a8: 55 push %ebp 11d1a9: 89 e5 mov %esp,%ebp 11d1ab: 57 push %edi 11d1ac: 56 push %esi 11d1ad: 53 push %ebx 11d1ae: 83 ec 2c sub $0x2c,%esp 11d1b1: 8b 5d 08 mov 0x8(%ebp),%ebx 11d1b4: 8b 75 0c mov 0xc(%ebp),%esi uintptr_t old_size; char *new_area; MSBUMP(realloc_calls, 1); 11d1b7: 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())) { 11d1bd: 83 3d 9c 54 12 00 03 cmpl $0x3,0x12549c 11d1c4: 75 1a jne 11d1e0 <== NEVER TAKEN if (_Thread_Dispatch_disable_level > 0) 11d1c6: a1 40 53 12 00 mov 0x125340,%eax 11d1cb: 85 c0 test %eax,%eax 11d1cd: 0f 85 ad 00 00 00 jne 11d280 <== NEVER TAKEN return (void *) 0; if (_ISR_Nest_level > 0) 11d1d3: 83 3d 64 58 12 00 00 cmpl $0x0,0x125864 11d1da: 0f 85 a0 00 00 00 jne 11d280 <== NEVER TAKEN } /* * Continue with realloc(). */ if ( !ptr ) 11d1e0: 85 db test %ebx,%ebx 11d1e2: 75 13 jne 11d1f7 return malloc( size ); 11d1e4: 83 ec 0c sub $0xc,%esp 11d1e7: 56 push %esi 11d1e8: e8 f7 a3 fe ff call 1075e4 11d1ed: 89 c3 mov %eax,%ebx 11d1ef: 83 c4 10 add $0x10,%esp 11d1f2: e9 8b 00 00 00 jmp 11d282 if ( !size ) { 11d1f7: 85 f6 test %esi,%esi 11d1f9: 75 0e jne 11d209 <== ALWAYS TAKEN free( ptr ); 11d1fb: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 11d1fe: 53 push %ebx <== NOT EXECUTED 11d1ff: e8 44 a1 fe ff call 107348 <== NOT EXECUTED return (void *) 0; 11d204: 83 c4 10 add $0x10,%esp <== NOT EXECUTED 11d207: eb 77 jmp 11d280 <== NOT EXECUTED } if ( !_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, ptr, &old_size) ) { 11d209: 52 push %edx 11d20a: 8d 45 e4 lea -0x1c(%ebp),%eax 11d20d: 50 push %eax 11d20e: 53 push %ebx 11d20f: ff 35 80 11 12 00 pushl 0x121180 11d215: e8 ee 00 00 00 call 11d308 <_Protected_heap_Get_block_size> 11d21a: 83 c4 10 add $0x10,%esp 11d21d: 84 c0 test %al,%al 11d21f: 75 0d jne 11d22e errno = EINVAL; 11d221: e8 a6 3e ff ff call 1110cc <__errno> 11d226: c7 00 16 00 00 00 movl $0x16,(%eax) 11d22c: eb 52 jmp 11d280 } /* * Now resize it. */ if ( _Protected_heap_Resize_block( RTEMS_Malloc_Heap, ptr, size ) ) { 11d22e: 50 push %eax 11d22f: 56 push %esi 11d230: 53 push %ebx 11d231: ff 35 80 11 12 00 pushl 0x121180 11d237: e8 04 01 00 00 call 11d340 <_Protected_heap_Resize_block> 11d23c: 83 c4 10 add $0x10,%esp 11d23f: 84 c0 test %al,%al 11d241: 75 3f jne 11d282 * 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 ); 11d243: 83 ec 0c sub $0xc,%esp 11d246: 56 push %esi 11d247: e8 98 a3 fe ff call 1075e4 MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */ 11d24c: ff 0d 14 52 12 00 decl 0x125214 if ( !new_area ) { 11d252: 83 c4 10 add $0x10,%esp 11d255: 85 c0 test %eax,%eax 11d257: 74 27 je 11d280 return (void *) 0; } memcpy( new_area, ptr, (size < old_size) ? size : old_size ); 11d259: 8b 55 e4 mov -0x1c(%ebp),%edx 11d25c: 89 f1 mov %esi,%ecx 11d25e: 39 d6 cmp %edx,%esi 11d260: 76 02 jbe 11d264 <== NEVER TAKEN 11d262: 89 d1 mov %edx,%ecx 11d264: 89 c7 mov %eax,%edi 11d266: 89 de mov %ebx,%esi 11d268: f3 a4 rep movsb %ds:(%esi),%es:(%edi) free( ptr ); 11d26a: 83 ec 0c sub $0xc,%esp 11d26d: 53 push %ebx 11d26e: 89 45 d4 mov %eax,-0x2c(%ebp) 11d271: e8 d2 a0 fe ff call 107348 return new_area; 11d276: 83 c4 10 add $0x10,%esp 11d279: 8b 45 d4 mov -0x2c(%ebp),%eax 11d27c: 89 c3 mov %eax,%ebx 11d27e: eb 02 jmp 11d282 new_area = malloc( size ); MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */ if ( !new_area ) { return (void *) 0; 11d280: 31 db xor %ebx,%ebx memcpy( new_area, ptr, (size < old_size) ? size : old_size ); free( ptr ); return new_area; } 11d282: 89 d8 mov %ebx,%eax 11d284: 8d 65 f4 lea -0xc(%ebp),%esp 11d287: 5b pop %ebx 11d288: 5e pop %esi 11d289: 5f pop %edi 11d28a: c9 leave 11d28b: c3 ret =============================================================================== 00108390 : #include int rmdir( const char *pathname ) { 108390: 55 push %ebp 108391: 89 e5 mov %esp,%ebp 108393: 57 push %edi 108394: 56 push %esi 108395: 53 push %ebx 108396: 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 ); 108399: ff 75 08 pushl 0x8(%ebp) 10839c: e8 fe f2 ff ff call 10769f 1083a1: 89 45 b4 mov %eax,-0x4c(%ebp) if ( parentpathlen == 0 ) 1083a4: 83 c4 10 add $0x10,%esp 1083a7: 85 c0 test %eax,%eax 1083a9: 8d 45 d0 lea -0x30(%ebp),%eax 1083ac: 75 15 jne 1083c3 rtems_filesystem_get_start_loc( pathname, &i, &parentloc ); 1083ae: 51 push %ecx 1083af: 50 push %eax 1083b0: 8d 45 e4 lea -0x1c(%ebp),%eax 1083b3: 50 push %eax 1083b4: ff 75 08 pushl 0x8(%ebp) 1083b7: e8 08 01 00 00 call 1084c4 1083bc: 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; 1083bf: 31 db xor %ebx,%ebx 1083c1: eb 25 jmp 1083e8 parentpathlen = rtems_filesystem_dirname ( pathname ); if ( parentpathlen == 0 ) rtems_filesystem_get_start_loc( pathname, &i, &parentloc ); else { result = rtems_filesystem_evaluate_path(pathname, parentpathlen, 1083c3: 83 ec 0c sub $0xc,%esp 1083c6: 6a 00 push $0x0 1083c8: 50 push %eax 1083c9: 6a 02 push $0x2 1083cb: ff 75 b4 pushl -0x4c(%ebp) 1083ce: ff 75 08 pushl 0x8(%ebp) 1083d1: e8 88 f2 ff ff call 10765e 1083d6: 89 c2 mov %eax,%edx RTEMS_LIBIO_PERMS_WRITE, &parentloc, false ); if ( result != 0 ) 1083d8: 83 c4 20 add $0x20,%esp return -1; 1083db: 83 c8 ff or $0xffffffff,%eax else { result = rtems_filesystem_evaluate_path(pathname, parentpathlen, RTEMS_LIBIO_PERMS_WRITE, &parentloc, false ); if ( result != 0 ) 1083de: 85 d2 test %edx,%edx 1083e0: 0f 85 d6 00 00 00 jne 1084bc <== NEVER TAKEN return -1; free_parentloc = true; 1083e6: b3 01 mov $0x1,%bl /* * Start from the parent to find the node that should be under it. */ loc = parentloc; 1083e8: 8d 7d bc lea -0x44(%ebp),%edi 1083eb: 8d 75 d0 lea -0x30(%ebp),%esi 1083ee: b9 05 00 00 00 mov $0x5,%ecx 1083f3: f3 a5 rep movsl %ds:(%esi),%es:(%edi) name = pathname + parentpathlen; 1083f5: 8b 75 08 mov 0x8(%ebp),%esi 1083f8: 03 75 b4 add -0x4c(%ebp),%esi name += rtems_filesystem_prefix_separators( name, strlen( name ) ); 1083fb: 83 c9 ff or $0xffffffff,%ecx 1083fe: 89 f7 mov %esi,%edi 108400: 31 c0 xor %eax,%eax 108402: f2 ae repnz scas %es:(%edi),%al 108404: f7 d1 not %ecx 108406: 49 dec %ecx 108407: 52 push %edx 108408: 52 push %edx 108409: 51 push %ecx 10840a: 56 push %esi 10840b: e8 ce f2 ff ff call 1076de 108410: 01 c6 add %eax,%esi result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), 108412: 83 c9 ff or $0xffffffff,%ecx 108415: 89 f7 mov %esi,%edi 108417: 31 c0 xor %eax,%eax 108419: f2 ae repnz scas %es:(%edi),%al 10841b: f7 d1 not %ecx 10841d: 49 dec %ecx 10841e: c7 04 24 00 00 00 00 movl $0x0,(%esp) 108425: 8d 7d bc lea -0x44(%ebp),%edi 108428: 57 push %edi 108429: 6a 00 push $0x0 10842b: 51 push %ecx 10842c: 56 push %esi 10842d: e8 ce f1 ff ff call 107600 0, &loc, false ); if ( result != 0 ) { 108432: 83 c4 20 add $0x20,%esp 108435: 85 c0 test %eax,%eax 108437: 74 13 je 10844c if ( free_parentloc ) rtems_filesystem_freenode( &parentloc ); return -1; 108439: 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 ) 10843c: 84 db test %bl,%bl 10843e: 74 7c je 1084bc rtems_filesystem_freenode( &parentloc ); 108440: 83 ec 0c sub $0xc,%esp 108443: 8d 55 d0 lea -0x30(%ebp),%edx 108446: 52 push %edx 108447: 89 45 b0 mov %eax,-0x50(%ebp) 10844a: eb 65 jmp 1084b1 } /* * Verify you can remove this node as a directory. */ if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) { 10844c: 83 ec 0c sub $0xc,%esp 10844f: 57 push %edi 108450: 8b 45 c8 mov -0x38(%ebp),%eax 108453: ff 50 10 call *0x10(%eax) 108456: 83 c4 10 add $0x10,%esp 108459: 48 dec %eax 10845a: 74 2f je 10848b rtems_filesystem_freenode( &loc ); 10845c: 83 ec 0c sub $0xc,%esp 10845f: 57 push %edi 108460: e8 b7 f2 ff ff call 10771c if ( free_parentloc ) 108465: 83 c4 10 add $0x10,%esp 108468: 84 db test %bl,%bl 10846a: 74 0f je 10847b <== NEVER TAKEN rtems_filesystem_freenode( &parentloc ); 10846c: 83 ec 0c sub $0xc,%esp 10846f: 8d 45 d0 lea -0x30(%ebp),%eax 108472: 50 push %eax 108473: e8 a4 f2 ff ff call 10771c 108478: 83 c4 10 add $0x10,%esp rtems_set_errno_and_return_minus_one( ENOTDIR ); 10847b: e8 dc 93 00 00 call 11185c <__errno> 108480: c7 00 14 00 00 00 movl $0x14,(%eax) 108486: 83 c8 ff or $0xffffffff,%eax 108489: eb 31 jmp 1084bc /* * Use the filesystems rmnod to remove the node. */ result = (*loc.handlers->rmnod_h)( &parentloc, &loc ); 10848b: 50 push %eax 10848c: 50 push %eax 10848d: 57 push %edi 10848e: 8d 75 d0 lea -0x30(%ebp),%esi 108491: 56 push %esi 108492: 8b 45 c4 mov -0x3c(%ebp),%eax 108495: ff 50 34 call *0x34(%eax) rtems_filesystem_freenode( &loc ); 108498: 89 3c 24 mov %edi,(%esp) 10849b: 89 45 b0 mov %eax,-0x50(%ebp) 10849e: e8 79 f2 ff ff call 10771c if ( free_parentloc ) 1084a3: 83 c4 10 add $0x10,%esp 1084a6: 84 db test %bl,%bl 1084a8: 8b 45 b0 mov -0x50(%ebp),%eax 1084ab: 74 0f je 1084bc rtems_filesystem_freenode( &parentloc ); 1084ad: 83 ec 0c sub $0xc,%esp 1084b0: 56 push %esi 1084b1: e8 66 f2 ff ff call 10771c 1084b6: 83 c4 10 add $0x10,%esp 1084b9: 8b 45 b0 mov -0x50(%ebp),%eax return result; } 1084bc: 8d 65 f4 lea -0xc(%ebp),%esp 1084bf: 5b pop %ebx 1084c0: 5e pop %esi 1084c1: 5f pop %edi 1084c2: c9 leave 1084c3: c3 ret =============================================================================== 0010af21 : * errno - otherwise */ int rtems_aio_enqueue (rtems_aio_request *req) { 10af21: 55 push %ebp 10af22: 89 e5 mov %esp,%ebp 10af24: 57 push %edi 10af25: 56 push %esi 10af26: 53 push %ebx 10af27: 83 ec 58 sub $0x58,%esp 10af2a: 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); 10af2d: 68 d8 72 12 00 push $0x1272d8 10af32: e8 c5 08 00 00 call 10b7fc 10af37: 89 45 b4 mov %eax,-0x4c(%ebp) if (result != 0) { 10af3a: 83 c4 10 add $0x10,%esp 10af3d: 85 c0 test %eax,%eax 10af3f: 74 0e je 10af4f <== ALWAYS TAKEN free (req); 10af41: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 10af44: 53 push %ebx <== NOT EXECUTED 10af45: e8 e6 cd ff ff call 107d30 <== NOT EXECUTED 10af4a: e9 c6 01 00 00 jmp 10b115 <== 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); 10af4f: e8 a8 10 00 00 call 10bffc 10af54: 57 push %edi 10af55: 8d 55 c4 lea -0x3c(%ebp),%edx 10af58: 52 push %edx 10af59: 8d 55 e0 lea -0x20(%ebp),%edx 10af5c: 52 push %edx 10af5d: 50 push %eax 10af5e: e8 9d 0c 00 00 call 10bc00 req->caller_thread = pthread_self (); 10af63: e8 94 10 00 00 call 10bffc 10af68: 89 43 10 mov %eax,0x10(%ebx) req->priority = param.sched_priority - req->aiocbp->aio_reqprio; 10af6b: 8b 43 14 mov 0x14(%ebx),%eax 10af6e: 8b 55 c4 mov -0x3c(%ebp),%edx 10af71: 2b 50 14 sub 0x14(%eax),%edx 10af74: 89 53 0c mov %edx,0xc(%ebx) req->policy = policy; 10af77: 8b 55 e0 mov -0x20(%ebp),%edx 10af7a: 89 53 08 mov %edx,0x8(%ebx) req->aiocbp->error_code = EINPROGRESS; 10af7d: c7 40 30 77 00 00 00 movl $0x77,0x30(%eax) req->aiocbp->return_value = 0; 10af84: c7 40 34 00 00 00 00 movl $0x0,0x34(%eax) if ((aio_request_queue.idle_threads == 0) && 10af8b: 83 c4 10 add $0x10,%esp 10af8e: 83 3d 40 73 12 00 00 cmpl $0x0,0x127340 10af95: 0f 85 b7 00 00 00 jne 10b052 <== NEVER TAKEN 10af9b: 83 3d 3c 73 12 00 04 cmpl $0x4,0x12733c 10afa2: 0f 8f aa 00 00 00 jg 10b052 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); 10afa8: 56 push %esi 10afa9: 6a 01 push $0x1 10afab: ff 30 pushl (%eax) 10afad: 68 20 73 12 00 push $0x127320 10afb2: e8 81 fb ff ff call 10ab38 10afb7: 89 c6 mov %eax,%esi if (r_chain->new_fd == 1) { 10afb9: 83 c4 10 add $0x10,%esp 10afbc: 83 78 18 01 cmpl $0x1,0x18(%eax) 10afc0: 8d 50 08 lea 0x8(%eax),%edx 10afc3: 8d 78 1c lea 0x1c(%eax),%edi 10afc6: 8d 40 20 lea 0x20(%eax),%eax 10afc9: 89 45 b0 mov %eax,-0x50(%ebp) 10afcc: 75 66 jne 10b034 RTEMS_INLINE_ROUTINE void _Chain_Prepend( Chain_Control *the_chain, Chain_Node *the_node ) { _Chain_Insert(_Chain_Head(the_chain), the_node); 10afce: 51 push %ecx 10afcf: 51 push %ecx 10afd0: 53 push %ebx 10afd1: 52 push %edx 10afd2: e8 c9 1f 00 00 call 10cfa0 <_Chain_Insert> rtems_chain_prepend (&r_chain->perfd, &req->next_prio); r_chain->new_fd = 0; 10afd7: c7 46 18 00 00 00 00 movl $0x0,0x18(%esi) pthread_mutex_init (&r_chain->mutex, NULL); 10afde: 5b pop %ebx 10afdf: 58 pop %eax 10afe0: 6a 00 push $0x0 10afe2: 57 push %edi 10afe3: e8 f4 06 00 00 call 10b6dc pthread_cond_init (&r_chain->cond, NULL); 10afe8: 5a pop %edx 10afe9: 59 pop %ecx 10afea: 6a 00 push $0x0 10afec: ff 75 b0 pushl -0x50(%ebp) 10afef: e8 a8 03 00 00 call 10b39c AIO_printf ("New thread \n"); result = pthread_create (&thid, &aio_request_queue.attr, 10aff4: 56 push %esi 10aff5: 68 14 ac 10 00 push $0x10ac14 10affa: 68 e0 72 12 00 push $0x1272e0 10afff: 8d 45 e4 lea -0x1c(%ebp),%eax 10b002: 50 push %eax 10b003: e8 c4 09 00 00 call 10b9cc 10b008: 89 c3 mov %eax,%ebx rtems_aio_handle, (void *) r_chain); if (result != 0) { 10b00a: 83 c4 20 add $0x20,%esp 10b00d: 85 c0 test %eax,%eax 10b00f: 74 18 je 10b029 <== ALWAYS TAKEN pthread_mutex_unlock (&aio_request_queue.mutex); 10b011: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 10b014: 68 d8 72 12 00 push $0x1272d8 <== NOT EXECUTED 10b019: e8 5e 08 00 00 call 10b87c <== NOT EXECUTED return result; 10b01e: 83 c4 10 add $0x10,%esp <== NOT EXECUTED 10b021: 89 5d b4 mov %ebx,-0x4c(%ebp) <== NOT EXECUTED 10b024: e9 ef 00 00 00 jmp 10b118 <== NOT EXECUTED } ++aio_request_queue.active_threads; 10b029: ff 05 3c 73 12 00 incl 0x12733c 10b02f: e9 d4 00 00 00 jmp 10b108 } else { /* put request in the fd chain it belongs to */ pthread_mutex_lock (&r_chain->mutex); 10b034: 83 ec 0c sub $0xc,%esp 10b037: 57 push %edi 10b038: 89 55 ac mov %edx,-0x54(%ebp) 10b03b: e8 bc 07 00 00 call 10b7fc rtems_aio_insert_prio (&r_chain->perfd, req); 10b040: 5e pop %esi 10b041: 58 pop %eax 10b042: 53 push %ebx 10b043: 8b 55 ac mov -0x54(%ebp),%edx 10b046: 52 push %edx 10b047: e8 ec fd ff ff call 10ae38 pthread_cond_signal (&r_chain->cond); 10b04c: 5b pop %ebx 10b04d: ff 75 b0 pushl -0x50(%ebp) 10b050: eb 36 jmp 10b088 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, 10b052: 51 push %ecx 10b053: 6a 00 push $0x0 10b055: ff 30 pushl (%eax) 10b057: 68 20 73 12 00 push $0x127320 10b05c: e8 d7 fa ff ff call 10ab38 10b061: 89 c6 mov %eax,%esi req->aiocbp->aio_fildes, 0); if (r_chain != NULL) 10b063: 83 c4 10 add $0x10,%esp 10b066: 85 c0 test %eax,%eax 10b068: 74 2d je 10b097 { pthread_mutex_lock (&r_chain->mutex); 10b06a: 8d 78 1c lea 0x1c(%eax),%edi 10b06d: 83 ec 0c sub $0xc,%esp 10b070: 57 push %edi 10b071: e8 86 07 00 00 call 10b7fc rtems_aio_insert_prio (&r_chain->perfd, req); 10b076: 58 pop %eax 10b077: 5a pop %edx 10b078: 53 push %ebx 10b079: 8d 46 08 lea 0x8(%esi),%eax 10b07c: 50 push %eax 10b07d: e8 b6 fd ff ff call 10ae38 pthread_cond_signal (&r_chain->cond); 10b082: 83 c6 20 add $0x20,%esi 10b085: 89 34 24 mov %esi,(%esp) 10b088: e8 ab 03 00 00 call 10b438 pthread_mutex_unlock (&r_chain->mutex); 10b08d: 89 3c 24 mov %edi,(%esp) 10b090: e8 e7 07 00 00 call 10b87c 10b095: eb 6e jmp 10b105 } else { /* or to the idle chain */ chain = &aio_request_queue.idle_req; r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1); 10b097: 56 push %esi 10b098: 6a 01 push $0x1 10b09a: 8b 43 14 mov 0x14(%ebx),%eax 10b09d: ff 30 pushl (%eax) 10b09f: 68 2c 73 12 00 push $0x12732c 10b0a4: e8 8f fa ff ff call 10ab38 10b0a9: 89 c6 mov %eax,%esi if (r_chain->new_fd == 1) { 10b0ab: 83 c4 10 add $0x10,%esp 10b0ae: 83 78 18 01 cmpl $0x1,0x18(%eax) 10b0b2: 8d 40 08 lea 0x8(%eax),%eax 10b0b5: 75 2c jne 10b0e3 10b0b7: 51 push %ecx 10b0b8: 51 push %ecx 10b0b9: 53 push %ebx 10b0ba: 50 push %eax 10b0bb: e8 e0 1e 00 00 call 10cfa0 <_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; 10b0c0: c7 46 18 00 00 00 00 movl $0x0,0x18(%esi) pthread_mutex_init (&r_chain->mutex, NULL); 10b0c7: 58 pop %eax 10b0c8: 5a pop %edx 10b0c9: 6a 00 push $0x0 10b0cb: 8d 46 1c lea 0x1c(%esi),%eax 10b0ce: 50 push %eax 10b0cf: e8 08 06 00 00 call 10b6dc pthread_cond_init (&r_chain->cond, NULL); 10b0d4: 5b pop %ebx 10b0d5: 5f pop %edi 10b0d6: 6a 00 push $0x0 10b0d8: 83 c6 20 add $0x20,%esi 10b0db: 56 push %esi 10b0dc: e8 bb 02 00 00 call 10b39c 10b0e1: eb 09 jmp 10b0ec } else /* just insert the request in the existing fd chain */ rtems_aio_insert_prio (&r_chain->perfd, req); 10b0e3: 51 push %ecx 10b0e4: 51 push %ecx 10b0e5: 53 push %ebx 10b0e6: 50 push %eax 10b0e7: e8 4c fd ff ff call 10ae38 10b0ec: 83 c4 10 add $0x10,%esp if (aio_request_queue.idle_threads > 0) 10b0ef: 83 3d 40 73 12 00 00 cmpl $0x0,0x127340 10b0f6: 7e 10 jle 10b108 <== ALWAYS TAKEN pthread_cond_signal (&aio_request_queue.new_req); 10b0f8: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 10b0fb: 68 dc 72 12 00 push $0x1272dc <== NOT EXECUTED 10b100: e8 33 03 00 00 call 10b438 <== NOT EXECUTED 10b105: 83 c4 10 add $0x10,%esp } } pthread_mutex_unlock (&aio_request_queue.mutex); 10b108: 83 ec 0c sub $0xc,%esp 10b10b: 68 d8 72 12 00 push $0x1272d8 10b110: e8 67 07 00 00 call 10b87c return 0; 10b115: 83 c4 10 add $0x10,%esp } 10b118: 8b 45 b4 mov -0x4c(%ebp),%eax 10b11b: 8d 65 f4 lea -0xc(%ebp),%esp 10b11e: 5b pop %ebx 10b11f: 5e pop %esi 10b120: 5f pop %edi 10b121: c9 leave 10b122: c3 ret =============================================================================== 0010ac14 : * NULL - if error */ static void * rtems_aio_handle (void *arg) { 10ac14: 55 push %ebp 10ac15: 89 e5 mov %esp,%ebp 10ac17: 57 push %edi 10ac18: 56 push %esi 10ac19: 53 push %ebx 10ac1a: 83 ec 4c sub $0x4c,%esp rtems_aio_request_chain *r_chain = arg; 10ac1d: 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); 10ac20: 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); 10ac23: 8d 43 1c lea 0x1c(%ebx),%eax 10ac26: 89 45 b4 mov %eax,-0x4c(%ebp) 10ac29: 83 ec 0c sub $0xc,%esp 10ac2c: 50 push %eax 10ac2d: e8 ca 0b 00 00 call 10b7fc if (result != 0) 10ac32: 83 c4 10 add $0x10,%esp 10ac35: 85 c0 test %eax,%eax 10ac37: 0f 85 f1 01 00 00 jne 10ae2e <== NEVER TAKEN } } AIO_printf ("Thread finished\n"); return NULL; } 10ac3d: 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 ); 10ac40: 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)) { 10ac43: 39 c6 cmp %eax,%esi 10ac45: 0f 84 cd 00 00 00 je 10ad18 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); 10ac4b: e8 ac 13 00 00 call 10bffc 10ac50: 52 push %edx 10ac51: 8d 55 c0 lea -0x40(%ebp),%edx 10ac54: 52 push %edx 10ac55: 8d 4d e4 lea -0x1c(%ebp),%ecx 10ac58: 51 push %ecx 10ac59: 50 push %eax 10ac5a: e8 a1 0f 00 00 call 10bc00 param.sched_priority = req->priority; 10ac5f: 8b 46 0c mov 0xc(%esi),%eax 10ac62: 89 45 c0 mov %eax,-0x40(%ebp) pthread_setschedparam (pthread_self(), req->policy, ¶m); 10ac65: 8b 56 08 mov 0x8(%esi),%edx 10ac68: 89 55 b0 mov %edx,-0x50(%ebp) 10ac6b: e8 8c 13 00 00 call 10bffc 10ac70: 83 c4 0c add $0xc,%esp 10ac73: 8d 4d c0 lea -0x40(%ebp),%ecx 10ac76: 51 push %ecx 10ac77: 8b 55 b0 mov -0x50(%ebp),%edx 10ac7a: 52 push %edx 10ac7b: 50 push %eax 10ac7c: e8 8b 13 00 00 call 10c00c */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); 10ac81: 89 34 24 mov %esi,(%esp) 10ac84: e8 db 22 00 00 call 10cf64 <_Chain_Extract> rtems_chain_extract (node); pthread_mutex_unlock (&r_chain->mutex); 10ac89: 59 pop %ecx 10ac8a: ff 75 b4 pushl -0x4c(%ebp) 10ac8d: e8 ea 0b 00 00 call 10b87c switch (req->aiocbp->aio_lio_opcode) { 10ac92: 8b 46 14 mov 0x14(%esi),%eax 10ac95: 83 c4 10 add $0x10,%esp 10ac98: 8b 50 2c mov 0x2c(%eax),%edx 10ac9b: 83 fa 02 cmp $0x2,%edx 10ac9e: 74 20 je 10acc0 10aca0: 83 fa 03 cmp $0x3,%edx 10aca3: 74 36 je 10acdb <== NEVER TAKEN 10aca5: 4a dec %edx 10aca6: 75 45 jne 10aced <== NEVER TAKEN case LIO_READ: AIO_printf ("read\n"); result = pread (req->aiocbp->aio_fildes, 10aca8: 83 ec 0c sub $0xc,%esp 10acab: ff 70 08 pushl 0x8(%eax) 10acae: ff 70 04 pushl 0x4(%eax) 10acb1: ff 70 10 pushl 0x10(%eax) 10acb4: ff 70 0c pushl 0xc(%eax) 10acb7: ff 30 pushl (%eax) 10acb9: e8 e6 93 00 00 call 1140a4 10acbe: eb 16 jmp 10acd6 req->aiocbp->aio_nbytes, req->aiocbp->aio_offset); break; case LIO_WRITE: AIO_printf ("write\n"); result = pwrite (req->aiocbp->aio_fildes, 10acc0: 83 ec 0c sub $0xc,%esp 10acc3: ff 70 08 pushl 0x8(%eax) 10acc6: ff 70 04 pushl 0x4(%eax) 10acc9: ff 70 10 pushl 0x10(%eax) 10accc: ff 70 0c pushl 0xc(%eax) 10accf: ff 30 pushl (%eax) 10acd1: e8 82 94 00 00 call 114158 (void *) req->aiocbp->aio_buf, req->aiocbp->aio_nbytes, req->aiocbp->aio_offset); break; 10acd6: 83 c4 20 add $0x20,%esp 10acd9: eb 0d jmp 10ace8 case LIO_SYNC: AIO_printf ("sync\n"); result = fsync (req->aiocbp->aio_fildes); 10acdb: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 10acde: ff 30 pushl (%eax) <== NOT EXECUTED 10ace0: e8 27 5d 00 00 call 110a0c <== NOT EXECUTED break; 10ace5: 83 c4 10 add $0x10,%esp <== NOT EXECUTED default: result = -1; } if (result == -1) { 10ace8: 83 f8 ff cmp $0xffffffff,%eax 10aceb: 75 19 jne 10ad06 <== ALWAYS TAKEN req->aiocbp->return_value = -1; 10aced: 8b 76 14 mov 0x14(%esi),%esi <== NOT EXECUTED 10acf0: c7 46 34 ff ff ff ff movl $0xffffffff,0x34(%esi) <== NOT EXECUTED req->aiocbp->error_code = errno; 10acf7: e8 70 89 00 00 call 11366c <__errno> <== NOT EXECUTED 10acfc: 8b 00 mov (%eax),%eax <== NOT EXECUTED 10acfe: 89 46 30 mov %eax,0x30(%esi) <== NOT EXECUTED 10ad01: e9 1d ff ff ff jmp 10ac23 <== NOT EXECUTED } else { req->aiocbp->return_value = result; 10ad06: 8b 56 14 mov 0x14(%esi),%edx 10ad09: 89 42 34 mov %eax,0x34(%edx) req->aiocbp->error_code = 0; 10ad0c: c7 42 30 00 00 00 00 movl $0x0,0x30(%edx) 10ad13: e9 0b ff ff ff jmp 10ac23 struct timespec timeout; AIO_printf ("Chain is empty [WQ], wait for work\n"); pthread_mutex_unlock (&r_chain->mutex); 10ad18: 83 ec 0c sub $0xc,%esp 10ad1b: ff 75 b4 pushl -0x4c(%ebp) 10ad1e: e8 59 0b 00 00 call 10b87c pthread_mutex_lock (&aio_request_queue.mutex); 10ad23: c7 04 24 d8 72 12 00 movl $0x1272d8,(%esp) 10ad2a: e8 cd 0a 00 00 call 10b7fc if (rtems_chain_is_empty (chain)) 10ad2f: 83 c4 10 add $0x10,%esp 10ad32: 39 73 08 cmp %esi,0x8(%ebx) 10ad35: 0f 85 de 00 00 00 jne 10ae19 <== NEVER TAKEN { clock_gettime (CLOCK_REALTIME, &timeout); 10ad3b: 52 push %edx 10ad3c: 52 push %edx 10ad3d: 57 push %edi 10ad3e: 6a 01 push $0x1 10ad40: e8 47 05 00 00 call 10b28c timeout.tv_sec += 3; 10ad45: 83 45 dc 03 addl $0x3,-0x24(%ebp) timeout.tv_nsec = 0; 10ad49: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp) result = pthread_cond_timedwait (&r_chain->cond, 10ad50: 8d 73 20 lea 0x20(%ebx),%esi 10ad53: 83 c4 0c add $0xc,%esp 10ad56: 57 push %edi 10ad57: 68 d8 72 12 00 push $0x1272d8 10ad5c: 56 push %esi 10ad5d: e8 46 07 00 00 call 10b4a8 &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) { 10ad62: 83 c4 10 add $0x10,%esp 10ad65: 83 f8 74 cmp $0x74,%eax 10ad68: 0f 85 ab 00 00 00 jne 10ae19 <== NEVER TAKEN 10ad6e: 83 ec 0c sub $0xc,%esp 10ad71: 53 push %ebx 10ad72: e8 ed 21 00 00 call 10cf64 <_Chain_Extract> rtems_chain_extract (&r_chain->next_fd); pthread_mutex_destroy (&r_chain->mutex); 10ad77: 58 pop %eax 10ad78: ff 75 b4 pushl -0x4c(%ebp) 10ad7b: e8 5c 08 00 00 call 10b5dc pthread_cond_destroy (&r_chain->cond); 10ad80: 89 34 24 mov %esi,(%esp) 10ad83: e8 60 05 00 00 call 10b2e8 free (r_chain); 10ad88: 89 1c 24 mov %ebx,(%esp) 10ad8b: e8 a0 cf ff ff call 107d30 /* 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)) { 10ad90: 83 c4 10 add $0x10,%esp 10ad93: 81 3d 2c 73 12 00 30 cmpl $0x127330,0x12732c 10ad9a: 73 12 00 10ad9d: 75 54 jne 10adf3 AIO_printf ("Chain is empty [IQ], wait for work\n"); ++aio_request_queue.idle_threads; 10ad9f: ff 05 40 73 12 00 incl 0x127340 --aio_request_queue.active_threads; 10ada5: ff 0d 3c 73 12 00 decl 0x12733c clock_gettime (CLOCK_REALTIME, &timeout); 10adab: 53 push %ebx 10adac: 53 push %ebx 10adad: 57 push %edi 10adae: 6a 01 push $0x1 10adb0: e8 d7 04 00 00 call 10b28c timeout.tv_sec += 3; 10adb5: 83 45 dc 03 addl $0x3,-0x24(%ebp) timeout.tv_nsec = 0; 10adb9: c7 45 e0 00 00 00 00 movl $0x0,-0x20(%ebp) result = pthread_cond_timedwait (&aio_request_queue.new_req, 10adc0: 83 c4 0c add $0xc,%esp 10adc3: 57 push %edi 10adc4: 68 d8 72 12 00 push $0x1272d8 10adc9: 68 dc 72 12 00 push $0x1272dc 10adce: e8 d5 06 00 00 call 10b4a8 &aio_request_queue.mutex, &timeout); /* If no new fd chain was added in the idle requests then this thread is finished */ if (result == ETIMEDOUT) { 10add3: 83 c4 10 add $0x10,%esp 10add6: 83 f8 74 cmp $0x74,%eax 10add9: 75 18 jne 10adf3 <== NEVER TAKEN AIO_printf ("Etimeout\n"); --aio_request_queue.idle_threads; 10addb: ff 0d 40 73 12 00 decl 0x127340 pthread_mutex_unlock (&aio_request_queue.mutex); 10ade1: 83 ec 0c sub $0xc,%esp 10ade4: 68 d8 72 12 00 push $0x1272d8 10ade9: e8 8e 0a 00 00 call 10b87c return NULL; 10adee: 83 c4 10 add $0x10,%esp 10adf1: eb 3b jmp 10ae2e } } /* 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; 10adf3: ff 0d 40 73 12 00 decl 0x127340 ++aio_request_queue.active_threads; 10adf9: ff 05 3c 73 12 00 incl 0x12733c } } AIO_printf ("Thread finished\n"); return NULL; } 10adff: 8b 1d 2c 73 12 00 mov 0x12732c,%ebx 10ae05: 83 ec 0c sub $0xc,%esp 10ae08: 53 push %ebx 10ae09: e8 56 21 00 00 call 10cf64 <_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); 10ae0e: 89 1c 24 mov %ebx,(%esp) 10ae11: e8 cd fd ff ff call 10abe3 10ae16: 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); 10ae19: 83 ec 0c sub $0xc,%esp 10ae1c: 68 d8 72 12 00 push $0x1272d8 10ae21: e8 56 0a 00 00 call 10b87c 10ae26: 83 c4 10 add $0x10,%esp 10ae29: e9 f5 fd ff ff jmp 10ac23 } } AIO_printf ("Thread finished\n"); return NULL; } 10ae2e: 31 c0 xor %eax,%eax 10ae30: 8d 65 f4 lea -0xc(%ebp),%esp 10ae33: 5b pop %ebx 10ae34: 5e pop %esi 10ae35: 5f pop %edi 10ae36: c9 leave 10ae37: c3 ret =============================================================================== 0010aa3c : * 0 - if initialization succeeded */ int rtems_aio_init (void) { 10aa3c: 55 push %ebp 10aa3d: 89 e5 mov %esp,%ebp 10aa3f: 53 push %ebx 10aa40: 83 ec 10 sub $0x10,%esp int result = 0; result = pthread_attr_init (&aio_request_queue.attr); 10aa43: 68 e0 72 12 00 push $0x1272e0 10aa48: e8 33 0f 00 00 call 10b980 10aa4d: 89 c3 mov %eax,%ebx if (result != 0) 10aa4f: 83 c4 10 add $0x10,%esp 10aa52: 85 c0 test %eax,%eax 10aa54: 0f 85 d7 00 00 00 jne 10ab31 <== NEVER TAKEN return result; result = 10aa5a: 51 push %ecx 10aa5b: 51 push %ecx 10aa5c: 6a 00 push $0x0 10aa5e: 68 e0 72 12 00 push $0x1272e0 10aa63: e8 40 0f 00 00 call 10b9a8 pthread_attr_setdetachstate (&aio_request_queue.attr, PTHREAD_CREATE_DETACHED); if (result != 0) 10aa68: 83 c4 10 add $0x10,%esp 10aa6b: 85 c0 test %eax,%eax 10aa6d: 74 10 je 10aa7f <== ALWAYS TAKEN pthread_attr_destroy (&aio_request_queue.attr); 10aa6f: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 10aa72: 68 e0 72 12 00 push $0x1272e0 <== NOT EXECUTED 10aa77: e8 e4 0e 00 00 call 10b960 <== NOT EXECUTED 10aa7c: 83 c4 10 add $0x10,%esp <== NOT EXECUTED result = pthread_mutex_init (&aio_request_queue.mutex, NULL); 10aa7f: 52 push %edx 10aa80: 52 push %edx 10aa81: 6a 00 push $0x0 10aa83: 68 d8 72 12 00 push $0x1272d8 10aa88: e8 4f 0c 00 00 call 10b6dc if (result != 0) 10aa8d: 83 c4 10 add $0x10,%esp 10aa90: 85 c0 test %eax,%eax 10aa92: 74 10 je 10aaa4 <== ALWAYS TAKEN pthread_attr_destroy (&aio_request_queue.attr); 10aa94: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 10aa97: 68 e0 72 12 00 push $0x1272e0 <== NOT EXECUTED 10aa9c: e8 bf 0e 00 00 call 10b960 <== NOT EXECUTED 10aaa1: 83 c4 10 add $0x10,%esp <== NOT EXECUTED result = pthread_cond_init (&aio_request_queue.new_req, NULL); 10aaa4: 50 push %eax 10aaa5: 50 push %eax 10aaa6: 6a 00 push $0x0 10aaa8: 68 dc 72 12 00 push $0x1272dc 10aaad: e8 ea 08 00 00 call 10b39c 10aab2: 89 c3 mov %eax,%ebx if (result != 0) { 10aab4: 83 c4 10 add $0x10,%esp 10aab7: 85 c0 test %eax,%eax 10aab9: 74 1c je 10aad7 <== ALWAYS TAKEN pthread_mutex_destroy (&aio_request_queue.mutex); 10aabb: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 10aabe: 68 d8 72 12 00 push $0x1272d8 <== NOT EXECUTED 10aac3: e8 14 0b 00 00 call 10b5dc <== NOT EXECUTED pthread_attr_destroy (&aio_request_queue.attr); 10aac8: c7 04 24 e0 72 12 00 movl $0x1272e0,(%esp) <== NOT EXECUTED 10aacf: e8 8c 0e 00 00 call 10b960 <== NOT EXECUTED 10aad4: 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; 10aad7: c7 05 20 73 12 00 24 movl $0x127324,0x127320 10aade: 73 12 00 head->previous = NULL; 10aae1: c7 05 24 73 12 00 00 movl $0x0,0x127324 10aae8: 00 00 00 tail->previous = head; 10aaeb: c7 05 28 73 12 00 20 movl $0x127320,0x127328 10aaf2: 73 12 00 ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; 10aaf5: c7 05 2c 73 12 00 30 movl $0x127330,0x12732c 10aafc: 73 12 00 head->previous = NULL; 10aaff: c7 05 30 73 12 00 00 movl $0x0,0x127330 10ab06: 00 00 00 tail->previous = head; 10ab09: c7 05 34 73 12 00 2c movl $0x12732c,0x127334 10ab10: 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; 10ab13: c7 05 3c 73 12 00 00 movl $0x0,0x12733c 10ab1a: 00 00 00 aio_request_queue.idle_threads = 0; 10ab1d: c7 05 40 73 12 00 00 movl $0x0,0x127340 10ab24: 00 00 00 aio_request_queue.initialized = AIO_QUEUE_INITIALIZED; 10ab27: c7 05 38 73 12 00 0b movl $0xb00b,0x127338 10ab2e: b0 00 00 return result; } 10ab31: 89 d8 mov %ebx,%eax 10ab33: 8b 5d fc mov -0x4(%ebp),%ebx 10ab36: c9 leave 10ab37: c3 ret =============================================================================== 0010ae38 : * NONE */ void rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req) { 10ae38: 55 push %ebp 10ae39: 89 e5 mov %esp,%ebp 10ae3b: 56 push %esi 10ae3c: 53 push %ebx 10ae3d: 8b 4d 08 mov 0x8(%ebp),%ecx 10ae40: 8b 55 0c mov 0xc(%ebp),%edx } } AIO_printf ("Thread finished\n"); return NULL; } 10ae43: 8b 01 mov (%ecx),%eax 10ae45: 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)) { 10ae48: 39 d8 cmp %ebx,%eax 10ae4a: 74 27 je 10ae73 <== 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; 10ae4c: 8b 48 14 mov 0x14(%eax),%ecx 10ae4f: 8b 49 14 mov 0x14(%ecx),%ecx while (req->aiocbp->aio_reqprio > prio && 10ae52: 8b 72 14 mov 0x14(%edx),%esi 10ae55: 8b 76 14 mov 0x14(%esi),%esi 10ae58: eb 08 jmp 10ae62 } } AIO_printf ("Thread finished\n"); return NULL; } 10ae5a: 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; 10ae5c: 8b 48 14 mov 0x14(%eax),%ecx <== NOT EXECUTED 10ae5f: 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 && 10ae62: 39 ce cmp %ecx,%esi 10ae64: 7e 04 jle 10ae6a <== ALWAYS TAKEN 10ae66: 39 d8 cmp %ebx,%eax <== NOT EXECUTED 10ae68: 75 f0 jne 10ae5a <== 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 ); 10ae6a: 89 55 0c mov %edx,0xc(%ebp) 10ae6d: 8b 40 04 mov 0x4(%eax),%eax 10ae70: 89 45 08 mov %eax,0x8(%ebp) } rtems_chain_insert (node->previous, &req->next_prio); } } 10ae73: 5b pop %ebx 10ae74: 5e pop %esi 10ae75: c9 leave 10ae76: e9 25 21 00 00 jmp 10cfa0 <_Chain_Insert> =============================================================================== 0010abe3 : * NONE */ void rtems_aio_move_to_work (rtems_aio_request_chain *r_chain) { 10abe3: 55 push %ebp 10abe4: 89 e5 mov %esp,%ebp 10abe6: 83 ec 08 sub $0x8,%esp 10abe9: 8b 55 08 mov 0x8(%ebp),%edx } } AIO_printf ("Thread finished\n"); return NULL; } 10abec: 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 && 10abf1: 8b 4a 14 mov 0x14(%edx),%ecx 10abf4: eb 02 jmp 10abf8 } } AIO_printf ("Thread finished\n"); return NULL; } 10abf6: 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 && 10abf8: 39 48 14 cmp %ecx,0x14(%eax) 10abfb: 7d 07 jge 10ac04 10abfd: 3d 24 73 12 00 cmp $0x127324,%eax 10ac02: 75 f2 jne 10abf6 <== ALWAYS TAKEN 10ac04: 51 push %ecx 10ac05: 51 push %ecx 10ac06: 52 push %edx 10ac07: ff 70 04 pushl 0x4(%eax) 10ac0a: e8 91 23 00 00 call 10cfa0 <_Chain_Insert> 10ac0f: 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); } 10ac12: c9 leave 10ac13: c3 ret =============================================================================== 0010aec4 : * 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) { 10aec4: 55 push %ebp 10aec5: 89 e5 mov %esp,%ebp 10aec7: 53 push %ebx 10aec8: 83 ec 04 sub $0x4,%esp 10aecb: 8b 55 08 mov 0x8(%ebp),%edx 10aece: 8b 4d 0c mov 0xc(%ebp),%ecx } } AIO_printf ("Thread finished\n"); return NULL; } 10aed1: 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 ); 10aed3: 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; 10aed6: 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)) 10aedb: 39 d3 cmp %edx,%ebx 10aedd: 75 08 jne 10aee7 10aedf: eb 3b jmp 10af1c } } AIO_printf ("Thread finished\n"); return NULL; } 10aee1: 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) { 10aee3: 39 d3 cmp %edx,%ebx <== NOT EXECUTED 10aee5: 74 30 je 10af17 <== NOT EXECUTED node = rtems_chain_next (node); current = (rtems_aio_request *) node; 10aee7: 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) { 10aee9: 39 4b 14 cmp %ecx,0x14(%ebx) 10aeec: 75 f3 jne 10aee1 <== NEVER TAKEN 10aeee: 83 ec 0c sub $0xc,%esp 10aef1: 53 push %ebx 10aef2: e8 6d 20 00 00 call 10cf64 <_Chain_Extract> if (rtems_chain_is_tail (chain, node)) return AIO_NOTCANCELED; else { rtems_chain_extract (node); current->aiocbp->error_code = ECANCELED; 10aef7: 8b 43 14 mov 0x14(%ebx),%eax 10aefa: c7 40 30 8c 00 00 00 movl $0x8c,0x30(%eax) current->aiocbp->return_value = -1; 10af01: c7 40 34 ff ff ff ff movl $0xffffffff,0x34(%eax) free (current); 10af08: 89 1c 24 mov %ebx,(%esp) 10af0b: e8 20 ce ff ff call 107d30 } return AIO_CANCELED; 10af10: 83 c4 10 add $0x10,%esp 10af13: 31 c0 xor %eax,%eax 10af15: eb 05 jmp 10af1c node = rtems_chain_next (node); current = (rtems_aio_request *) node; } if (rtems_chain_is_tail (chain, node)) return AIO_NOTCANCELED; 10af17: b8 01 00 00 00 mov $0x1,%eax current->aiocbp->return_value = -1; free (current); } return AIO_CANCELED; } 10af1c: 8b 5d fc mov -0x4(%ebp),%ebx 10af1f: c9 leave 10af20: c3 ret =============================================================================== 0010ab2c : rtems_chain_control *chain, rtems_chain_node *node, rtems_id task, rtems_event_set events ) { 10ab2c: 55 push %ebp 10ab2d: 89 e5 mov %esp,%ebp 10ab2f: 56 push %esi 10ab30: 53 push %ebx 10ab31: 8b 5d 10 mov 0x10(%ebp),%ebx 10ab34: 8b 75 14 mov 0x14(%ebp),%esi RTEMS_INLINE_ROUTINE bool rtems_chain_append_with_empty_check( rtems_chain_control *chain, rtems_chain_node *node ) { return _Chain_Append_with_empty_check( chain, node ); 10ab37: 50 push %eax 10ab38: 50 push %eax 10ab39: ff 75 0c pushl 0xc(%ebp) 10ab3c: ff 75 08 pushl 0x8(%ebp) 10ab3f: e8 94 04 00 00 call 10afd8 <_Chain_Append_with_empty_check> rtems_status_code sc = RTEMS_SUCCESSFUL; bool was_empty = rtems_chain_append_with_empty_check( chain, node ); if ( was_empty ) { 10ab44: 83 c4 10 add $0x10,%esp 10ab47: 84 c0 test %al,%al 10ab49: 74 11 je 10ab5c <== NEVER TAKEN sc = rtems_event_send( task, events ); 10ab4b: 89 75 0c mov %esi,0xc(%ebp) 10ab4e: 89 5d 08 mov %ebx,0x8(%ebp) } return sc; } 10ab51: 8d 65 f8 lea -0x8(%ebp),%esp 10ab54: 5b pop %ebx 10ab55: 5e pop %esi 10ab56: c9 leave { rtems_status_code sc = RTEMS_SUCCESSFUL; bool was_empty = rtems_chain_append_with_empty_check( chain, node ); if ( was_empty ) { sc = rtems_event_send( task, events ); 10ab57: e9 d4 f6 ff ff jmp 10a230 } return sc; } 10ab5c: 31 c0 xor %eax,%eax 10ab5e: 8d 65 f8 lea -0x8(%ebp),%esp 10ab61: 5b pop %ebx 10ab62: 5e pop %esi <== NOT EXECUTED 10ab63: c9 leave <== NOT EXECUTED 10ab64: c3 ret <== NOT EXECUTED =============================================================================== 0010aba4 : rtems_chain_control *chain, rtems_event_set events, rtems_interval timeout, rtems_chain_node **node_ptr ) { 10aba4: 55 push %ebp 10aba5: 89 e5 mov %esp,%ebp 10aba7: 57 push %edi 10aba8: 56 push %esi 10aba9: 53 push %ebx 10abaa: 83 ec 1c sub $0x1c,%esp 10abad: 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( 10abb0: 8d 75 e4 lea -0x1c(%ebp),%esi 10abb3: eb 13 jmp 10abc8 10abb5: 56 push %esi 10abb6: ff 75 10 pushl 0x10(%ebp) 10abb9: 6a 00 push $0x0 10abbb: 57 push %edi 10abbc: e8 0f f5 ff ff call 10a0d0 ) { rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_chain_node *node = NULL; while ( 10abc1: 83 c4 10 add $0x10,%esp 10abc4: 85 c0 test %eax,%eax 10abc6: 75 16 jne 10abde <== ALWAYS TAKEN */ RTEMS_INLINE_ROUTINE rtems_chain_node *rtems_chain_get( rtems_chain_control *the_chain ) { return _Chain_Get( the_chain ); 10abc8: 83 ec 0c sub $0xc,%esp 10abcb: ff 75 08 pushl 0x8(%ebp) 10abce: e8 a5 04 00 00 call 10b078 <_Chain_Get> 10abd3: 89 c3 mov %eax,%ebx sc == RTEMS_SUCCESSFUL && (node = rtems_chain_get( chain )) == NULL 10abd5: 83 c4 10 add $0x10,%esp 10abd8: 85 c0 test %eax,%eax 10abda: 74 d9 je 10abb5 10abdc: 31 c0 xor %eax,%eax timeout, &out ); } *node_ptr = node; 10abde: 8b 55 14 mov 0x14(%ebp),%edx 10abe1: 89 1a mov %ebx,(%edx) return sc; } 10abe3: 8d 65 f4 lea -0xc(%ebp),%esp 10abe6: 5b pop %ebx 10abe7: 5e pop %esi 10abe8: 5f pop %edi 10abe9: c9 leave 10abea: c3 ret =============================================================================== 0010abec : rtems_chain_control *chain, rtems_chain_node *node, rtems_id task, rtems_event_set events ) { 10abec: 55 push %ebp 10abed: 89 e5 mov %esp,%ebp 10abef: 56 push %esi 10abf0: 53 push %ebx 10abf1: 8b 5d 10 mov 0x10(%ebp),%ebx 10abf4: 8b 75 14 mov 0x14(%ebp),%esi RTEMS_INLINE_ROUTINE bool rtems_chain_prepend_with_empty_check( rtems_chain_control *chain, rtems_chain_node *node ) { return _Chain_Prepend_with_empty_check( chain, node ); 10abf7: 50 push %eax 10abf8: 50 push %eax 10abf9: ff 75 0c pushl 0xc(%ebp) 10abfc: ff 75 08 pushl 0x8(%ebp) 10abff: e8 b8 04 00 00 call 10b0bc <_Chain_Prepend_with_empty_check> rtems_status_code sc = RTEMS_SUCCESSFUL; bool was_empty = rtems_chain_prepend_with_empty_check( chain, node ); if (was_empty) { 10ac04: 83 c4 10 add $0x10,%esp 10ac07: 84 c0 test %al,%al 10ac09: 74 11 je 10ac1c <== NEVER TAKEN sc = rtems_event_send( task, events ); 10ac0b: 89 75 0c mov %esi,0xc(%ebp) 10ac0e: 89 5d 08 mov %ebx,0x8(%ebp) } return sc; } 10ac11: 8d 65 f8 lea -0x8(%ebp),%esp 10ac14: 5b pop %ebx 10ac15: 5e pop %esi 10ac16: c9 leave { rtems_status_code sc = RTEMS_SUCCESSFUL; bool was_empty = rtems_chain_prepend_with_empty_check( chain, node ); if (was_empty) { sc = rtems_event_send( task, events ); 10ac17: e9 14 f6 ff ff jmp 10a230 } return sc; } 10ac1c: 31 c0 xor %eax,%eax 10ac1e: 8d 65 f8 lea -0x8(%ebp),%esp <== NOT EXECUTED 10ac21: 5b pop %ebx <== NOT EXECUTED 10ac22: 5e pop %esi <== NOT EXECUTED 10ac23: c9 leave <== NOT EXECUTED 10ac24: c3 ret <== NOT EXECUTED =============================================================================== 00107698 : void rtems_cpu_usage_report_with_plugin( void *context, rtems_printk_plugin_t print ) { 107698: 55 push %ebp 107699: 89 e5 mov %esp,%ebp 10769b: 57 push %edi 10769c: 56 push %esi 10769d: 53 push %ebx 10769e: 83 ec 6c sub $0x6c,%esp 1076a1: 8b 7d 08 mov 0x8(%ebp),%edi Timestamp_Control uptime, total, ran, last_context_switch; #else uint32_t total_units = 0; #endif if ( !print ) 1076a4: 83 7d 0c 00 cmpl $0x0,0xc(%ebp) 1076a8: 0f 84 54 01 00 00 je 107802 <== NEVER TAKEN * When not using nanosecond CPU usage resolution, we have to count * the number of "ticks" we gave credit for to give the user a rough * guideline as to what each number means proportionally. */ #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ last_context_switch = _Thread_Time_of_last_context_switch; 1076ae: a1 94 90 12 00 mov 0x129094,%eax 1076b3: 8b 15 98 90 12 00 mov 0x129098,%edx 1076b9: 89 45 c0 mov %eax,-0x40(%ebp) 1076bc: 89 55 c4 mov %edx,-0x3c(%ebp) _TOD_Get_uptime( &uptime ); 1076bf: 83 ec 0c sub $0xc,%esp 1076c2: 8d 5d d8 lea -0x28(%ebp),%ebx 1076c5: 53 push %ebx 1076c6: e8 75 4b 00 00 call 10c240 <_TOD_Get_uptime> _Timestamp_Subtract( &CPU_usage_Uptime_at_last_reset, &uptime, &total ); 1076cb: 83 c4 0c add $0xc,%esp 1076ce: 8d 75 d0 lea -0x30(%ebp),%esi 1076d1: 56 push %esi 1076d2: 53 push %ebx 1076d3: 68 80 95 12 00 push $0x129580 1076d8: e8 47 6b 00 00 call 10e224 <_Timespec_Subtract> } } } #endif (*print)( 1076dd: 5b pop %ebx 1076de: 5e pop %esi 1076df: 68 b5 13 12 00 push $0x1213b5 1076e4: 57 push %edi 1076e5: ff 55 0c call *0xc(%ebp) 1076e8: 83 c4 10 add $0x10,%esp " ID | NAME | TICKS | PERCENT\n" #endif "------------+----------------------------------------+---------------+---------\n" ); for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) { 1076eb: 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 ]; 1076f0: 8b 04 9d bc 8f 12 00 mov 0x128fbc(,%ebx,4),%eax 1076f7: 8b 70 04 mov 0x4(%eax),%esi if ( information ) { 1076fa: 85 f6 test %esi,%esi 1076fc: 0f 84 da 00 00 00 je 1077dc <== NEVER TAKEN 107702: c7 45 a4 01 00 00 00 movl $0x1,-0x5c(%ebp) 107709: 89 5d 94 mov %ebx,-0x6c(%ebp) 10770c: e9 bb 00 00 00 jmp 1077cc for ( i=1 ; i <= information->maximum ; i++ ) { the_thread = (Thread_Control *)information->local_table[ i ]; 107711: 8b 46 1c mov 0x1c(%esi),%eax 107714: 8b 4d a4 mov -0x5c(%ebp),%ecx 107717: 8b 14 88 mov (%eax,%ecx,4),%edx if ( !the_thread ) 10771a: 85 d2 test %edx,%edx 10771c: 0f 84 a7 00 00 00 je 1077c9 <== NEVER TAKEN continue; rtems_object_get_name( the_thread->Object.id, sizeof(name), name ); 107722: 51 push %ecx 107723: 8d 5d ab lea -0x55(%ebp),%ebx 107726: 53 push %ebx 107727: 6a 0d push $0xd 107729: ff 72 08 pushl 0x8(%edx) 10772c: 89 55 a0 mov %edx,-0x60(%ebp) 10772f: e8 98 39 00 00 call 10b0cc (*print)( 107734: 53 push %ebx 107735: 8b 55 a0 mov -0x60(%ebp),%edx 107738: ff 72 08 pushl 0x8(%edx) 10773b: 68 27 15 12 00 push $0x121527 107740: 57 push %edi 107741: 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; 107744: 8b 55 a0 mov -0x60(%ebp),%edx 107747: 8b 8a 84 00 00 00 mov 0x84(%edx),%ecx 10774d: 8b 9a 88 00 00 00 mov 0x88(%edx),%ebx 107753: 89 4d c8 mov %ecx,-0x38(%ebp) 107756: 89 5d cc mov %ebx,-0x34(%ebp) if ( _Thread_Executing->Object.id == the_thread->Object.id ) { 107759: 83 c4 20 add $0x20,%esp 10775c: a1 4c 95 12 00 mov 0x12954c,%eax 107761: 8b 5a 08 mov 0x8(%edx),%ebx 107764: 39 58 08 cmp %ebx,0x8(%eax) 107767: 75 27 jne 107790 Timestamp_Control used; _Timestamp_Subtract( &last_context_switch, &uptime, &used ); 107769: 50 push %eax 10776a: 8d 45 b8 lea -0x48(%ebp),%eax 10776d: 50 push %eax 10776e: 8d 55 d8 lea -0x28(%ebp),%edx 107771: 52 push %edx 107772: 8d 55 c0 lea -0x40(%ebp),%edx 107775: 52 push %edx 107776: 89 45 a0 mov %eax,-0x60(%ebp) 107779: e8 a6 6a 00 00 call 10e224 <_Timespec_Subtract> _Timestamp_Add_to( &ran, &used ); 10777e: 59 pop %ecx 10777f: 5b pop %ebx 107780: 8b 45 a0 mov -0x60(%ebp),%eax 107783: 50 push %eax 107784: 8d 45 c8 lea -0x38(%ebp),%eax 107787: 50 push %eax 107788: e8 ab 69 00 00 call 10e138 <_Timespec_Add_to> 10778d: 83 c4 10 add $0x10,%esp }; _Timestamp_Divide( &ran, &total, &ival, &fval ); 107790: 8d 4d e0 lea -0x20(%ebp),%ecx 107793: 51 push %ecx 107794: 8d 5d e4 lea -0x1c(%ebp),%ebx 107797: 53 push %ebx 107798: 8d 45 d0 lea -0x30(%ebp),%eax 10779b: 50 push %eax 10779c: 8d 4d c8 lea -0x38(%ebp),%ecx 10779f: 51 push %ecx 1077a0: e8 c3 69 00 00 call 10e168 <_Timespec_Divide> /* * Print the information */ (*print)( context, 1077a5: 58 pop %eax 1077a6: 5a pop %edx 1077a7: ff 75 e0 pushl -0x20(%ebp) 1077aa: ff 75 e4 pushl -0x1c(%ebp) 1077ad: 8b 45 cc mov -0x34(%ebp),%eax 1077b0: b9 e8 03 00 00 mov $0x3e8,%ecx 1077b5: 31 d2 xor %edx,%edx 1077b7: f7 f1 div %ecx 1077b9: 50 push %eax 1077ba: ff 75 c8 pushl -0x38(%ebp) 1077bd: 68 3a 15 12 00 push $0x12153a 1077c2: 57 push %edi 1077c3: ff 55 0c call *0xc(%ebp) 1077c6: 83 c4 20 add $0x20,%esp continue; #endif information = _Objects_Information_table[ api_index ][ 1 ]; if ( information ) { for ( i=1 ; i <= information->maximum ; i++ ) { 1077c9: ff 45 a4 incl -0x5c(%ebp) 1077cc: 0f b7 46 10 movzwl 0x10(%esi),%eax 1077d0: 39 45 a4 cmp %eax,-0x5c(%ebp) 1077d3: 0f 86 38 ff ff ff jbe 107711 1077d9: 8b 5d 94 mov -0x6c(%ebp),%ebx " ID | NAME | TICKS | PERCENT\n" #endif "------------+----------------------------------------+---------------+---------\n" ); for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) { 1077dc: 43 inc %ebx 1077dd: 83 fb 04 cmp $0x4,%ebx 1077e0: 0f 85 0a ff ff ff jne 1076f0 } } } #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ (*print)( 1077e6: 8b 45 d4 mov -0x2c(%ebp),%eax 1077e9: b9 e8 03 00 00 mov $0x3e8,%ecx 1077ee: 31 d2 xor %edx,%edx 1077f0: f7 f1 div %ecx 1077f2: 50 push %eax 1077f3: ff 75 d0 pushl -0x30(%ebp) 1077f6: 68 52 15 12 00 push $0x121552 1077fb: 57 push %edi 1077fc: ff 55 0c call *0xc(%ebp) 1077ff: 83 c4 10 add $0x10,%esp "-------------------------------------------------------------------------------\n", _Watchdog_Ticks_since_boot - CPU_usage_Ticks_at_last_reset, total_units ); #endif } 107802: 8d 65 f4 lea -0xc(%ebp),%esp 107805: 5b pop %ebx 107806: 5e pop %esi 107807: 5f pop %edi 107808: c9 leave 107809: c3 ret =============================================================================== 0011104c : [RTEMS_IO_ERROR] = EIO, [RTEMS_PROXY_BLOCKING] = EIO }; int rtems_deviceio_errno(rtems_status_code sc) { 11104c: 55 push %ebp 11104d: 89 e5 mov %esp,%ebp 11104f: 53 push %ebx 111050: 83 ec 04 sub $0x4,%esp 111053: 8b 55 08 mov 0x8(%ebp),%edx if (sc == RTEMS_SUCCESSFUL) { return 0; 111056: 31 c0 xor %eax,%eax [RTEMS_PROXY_BLOCKING] = EIO }; int rtems_deviceio_errno(rtems_status_code sc) { if (sc == RTEMS_SUCCESSFUL) { 111058: 85 d2 test %edx,%edx 11105a: 74 1b je 111077 return 0; } else { int eno = EINVAL; 11105c: bb 16 00 00 00 mov $0x16,%ebx if ((unsigned) sc <= RTEMS_STATUS_CODES_LAST) { 111061: 83 fa 1c cmp $0x1c,%edx 111064: 77 07 ja 11106d <== NEVER TAKEN eno = status_code_to_errno [sc]; 111066: 8b 1c 95 a8 f6 11 00 mov 0x11f6a8(,%edx,4),%ebx } errno = eno; 11106d: e8 5a 00 00 00 call 1110cc <__errno> 111072: 89 18 mov %ebx,(%eax) return -1; 111074: 83 c8 ff or $0xffffffff,%eax } } 111077: 5a pop %edx 111078: 5b pop %ebx 111079: c9 leave 11107a: c3 ret =============================================================================== 0010e447 : rtems_filesystem_fsmount_me_t rtems_filesystem_get_mount_handler( const char *type ) { 10e447: 55 push %ebp 10e448: 89 e5 mov %esp,%ebp 10e44a: 83 ec 18 sub $0x18,%esp 10e44d: 8b 45 08 mov 0x8(%ebp),%eax find_arg fa = { 10e450: 89 45 f0 mov %eax,-0x10(%ebp) 10e453: c7 45 f4 00 00 00 00 movl $0x0,-0xc(%ebp) .type = type, .mount_h = NULL }; if ( type != NULL ) { 10e45a: 85 c0 test %eax,%eax 10e45c: 74 13 je 10e471 <== NEVER TAKEN rtems_filesystem_iterate( find_handler, &fa ); 10e45e: 50 push %eax 10e45f: 50 push %eax 10e460: 8d 45 f0 lea -0x10(%ebp),%eax 10e463: 50 push %eax 10e464: 68 70 e3 10 00 push $0x10e370 10e469: e8 62 ff ff ff call 10e3d0 10e46e: 83 c4 10 add $0x10,%esp } return fa.mount_h; } 10e471: 8b 45 f4 mov -0xc(%ebp),%eax 10e474: c9 leave 10e475: c3 ret =============================================================================== 001070fc : * configuration is a single instantiation of the IMFS or miniIMFS with * a single "/dev" directory in it. */ void rtems_filesystem_initialize( void ) { 1070fc: 55 push %ebp 1070fd: 89 e5 mov %esp,%ebp 1070ff: 57 push %edi 107100: 56 push %esi 107101: 53 push %ebx 107102: 83 ec 2c sub $0x2c,%esp /* * Set the default umask to "022". */ rtems_filesystem_umask = 022; 107105: a1 80 30 12 00 mov 0x123080,%eax 10710a: c7 40 2c 12 00 00 00 movl $0x12,0x2c(%eax) /* * mount the first filesystem. */ if ( rtems_filesystem_mount_table_size == 0 ) 107111: 83 3d 80 d7 11 00 00 cmpl $0x0,0x11d780 107118: 75 0a jne 107124 <== ALWAYS TAKEN rtems_fatal_error_occurred( 0xABCD0001 ); 10711a: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 10711d: 68 01 00 cd ab push $0xabcd0001 <== NOT EXECUTED 107122: eb 28 jmp 10714c <== NOT EXECUTED mt = &rtems_filesystem_mount_table[0]; 107124: a1 4c 11 12 00 mov 0x12114c,%eax status = mount( mt->device, mt->mount_point, mt->type, mt->fsoptions, NULL ); 107129: 83 ec 0c sub $0xc,%esp 10712c: 6a 00 push $0x0 10712e: ff 70 04 pushl 0x4(%eax) 107131: ff 30 pushl (%eax) 107133: ff 70 0c pushl 0xc(%eax) 107136: ff 70 08 pushl 0x8(%eax) 107139: e8 77 06 00 00 call 1077b5 if ( status == -1 ) 10713e: 83 c4 20 add $0x20,%esp 107141: 40 inc %eax 107142: 75 0d jne 107151 <== ALWAYS TAKEN rtems_fatal_error_occurred( 0xABCD0002 ); 107144: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 107147: 68 02 00 cd ab push $0xabcd0002 <== NOT EXECUTED 10714c: e8 e3 35 00 00 call 10a734 <== NOT EXECUTED rtems_filesystem_link_counts = 0; 107151: a1 80 30 12 00 mov 0x123080,%eax 107156: 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); 10715c: 83 ec 0c sub $0xc,%esp 10715f: 6a 00 push $0x0 107161: 8d 5d d4 lea -0x2c(%ebp),%ebx 107164: 53 push %ebx 107165: 6a 00 push $0x0 107167: 6a 01 push $0x1 107169: 68 d4 ee 11 00 push $0x11eed4 10716e: e8 03 01 00 00 call 107276 rtems_filesystem_root = loc; 107173: 8b 3d 80 30 12 00 mov 0x123080,%edi 107179: 83 c7 18 add $0x18,%edi 10717c: b9 05 00 00 00 mov $0x5,%ecx 107181: 89 de mov %ebx,%esi 107183: f3 a5 rep movsl %ds:(%esi),%es:(%edi) /* One more clone for the current node */ rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0); 107185: 83 c4 14 add $0x14,%esp 107188: 6a 00 push $0x0 10718a: 53 push %ebx 10718b: 6a 00 push $0x0 10718d: 6a 01 push $0x1 10718f: 68 d4 ee 11 00 push $0x11eed4 107194: e8 dd 00 00 00 call 107276 rtems_filesystem_current = loc; 107199: 8b 3d 80 30 12 00 mov 0x123080,%edi 10719f: 83 c7 04 add $0x4,%edi 1071a2: b9 05 00 00 00 mov $0x5,%ecx 1071a7: 89 de mov %ebx,%esi 1071a9: 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); 1071ab: 83 c4 18 add $0x18,%esp 1071ae: 68 ff 01 00 00 push $0x1ff 1071b3: 68 d6 ee 11 00 push $0x11eed6 1071b8: e8 c3 04 00 00 call 107680 if ( status != 0 ) 1071bd: 83 c4 10 add $0x10,%esp 1071c0: 85 c0 test %eax,%eax 1071c2: 74 0d je 1071d1 <== ALWAYS TAKEN rtems_fatal_error_occurred( 0xABCD0003 ); 1071c4: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 1071c7: 68 03 00 cd ab push $0xabcd0003 <== NOT EXECUTED 1071cc: e9 7b ff ff ff jmp 10714c <== 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. */ } 1071d1: 8d 65 f4 lea -0xc(%ebp),%esp 1071d4: 5b pop %ebx 1071d5: 5e pop %esi 1071d6: 5f pop %edi 1071d7: c9 leave 1071d8: c3 ret =============================================================================== 0010e3d0 : bool rtems_filesystem_iterate( rtems_per_filesystem_routine routine, void *routine_arg ) { 10e3d0: 55 push %ebp 10e3d1: 89 e5 mov %esp,%ebp 10e3d3: 57 push %edi 10e3d4: 56 push %esi 10e3d5: 53 push %ebx 10e3d6: 83 ec 1c sub $0x1c,%esp 10e3d9: 8b 75 08 mov 0x8(%ebp),%esi 10e3dc: 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; 10e3df: 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]; 10e3e1: bb 60 d7 11 00 mov $0x11d760,%ebx rtems_chain_node *node = NULL; bool stop = false; while ( table_entry->type && !stop ) { 10e3e6: eb 0c jmp 10e3f4 stop = (*routine)( table_entry, routine_arg ); 10e3e8: 51 push %ecx 10e3e9: 51 push %ecx 10e3ea: 57 push %edi 10e3eb: 53 push %ebx 10e3ec: ff d6 call *%esi ++table_entry; 10e3ee: 83 c3 08 add $0x8,%ebx 10e3f1: 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 ) { 10e3f4: 83 3b 00 cmpl $0x0,(%ebx) 10e3f7: 74 06 je 10e3ff 10e3f9: 84 c0 test %al,%al 10e3fb: 74 eb je 10e3e8 10e3fd: eb 40 jmp 10e43f stop = (*routine)( table_entry, routine_arg ); ++table_entry; } if ( !stop ) { 10e3ff: 84 c0 test %al,%al 10e401: 75 3c jne 10e43f rtems_libio_lock(); 10e403: 88 45 e4 mov %al,-0x1c(%ebp) 10e406: e8 95 ff ff ff call 10e3a0 } } rtems_libio_unlock(); rtems_set_errno_and_return_minus_one( ENOENT ); } 10e40b: 8b 1d a8 30 12 00 mov 0x1230a8,%ebx ++table_entry; } if ( !stop ) { rtems_libio_lock(); for ( 10e411: 8a 55 e4 mov -0x1c(%ebp),%dl 10e414: eb 10 jmp 10e426 !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 ); 10e416: 52 push %edx 10e417: 52 push %edx 10e418: 57 push %edi 10e419: 8d 43 08 lea 0x8(%ebx),%eax 10e41c: 50 push %eax 10e41d: ff d6 call *%esi 10e41f: 88 c2 mov %al,%dl } } rtems_libio_unlock(); rtems_set_errno_and_return_minus_one( ENOENT ); } 10e421: 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 ) 10e423: 83 c4 10 add $0x10,%esp ++table_entry; } if ( !stop ) { rtems_libio_lock(); for ( 10e426: 81 fb ac 30 12 00 cmp $0x1230ac,%ebx 10e42c: 74 04 je 10e432 node = rtems_chain_first( &filesystem_chain ); !rtems_chain_is_tail( &filesystem_chain, node ) && !stop; 10e42e: 84 d2 test %dl,%dl 10e430: 74 e4 je 10e416 <== ALWAYS TAKEN ) { const filesystem_node *fsn = (filesystem_node *) node; stop = (*routine)( &fsn->entry, routine_arg ); } rtems_libio_unlock(); 10e432: 88 55 e4 mov %dl,-0x1c(%ebp) 10e435: e8 80 ff ff ff call 10e3ba 10e43a: 8a 55 e4 mov -0x1c(%ebp),%dl 10e43d: 88 d0 mov %dl,%al } return stop; } 10e43f: 8d 65 f4 lea -0xc(%ebp),%esp 10e442: 5b pop %ebx 10e443: 5e pop %esi 10e444: 5f pop %edi 10e445: c9 leave 10e446: c3 ret =============================================================================== 0010776d : bool rtems_filesystem_mount_iterate( rtems_per_filesystem_mount_routine routine, void *routine_arg ) { 10776d: 55 push %ebp 10776e: 89 e5 mov %esp,%ebp 107770: 57 push %edi 107771: 56 push %esi 107772: 53 push %ebx 107773: 83 ec 1c sub $0x1c,%esp 107776: 8b 7d 08 mov 0x8(%ebp),%edi 107779: 8b 75 0c mov 0xc(%ebp),%esi rtems_chain_node *node = NULL; bool stop = false; rtems_libio_lock(); 10777c: e8 bc ff ff ff call 10773d stop = (*routine)( mt_entry, routine_arg ); } rtems_libio_unlock(); return stop; } 107781: 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; 107787: 31 c0 xor %eax,%eax rtems_libio_lock(); for ( 107789: eb 0b jmp 107796 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 ); 10778b: 50 push %eax 10778c: 50 push %eax 10778d: 56 push %esi 10778e: 53 push %ebx 10778f: ff d7 call *%edi } rtems_libio_unlock(); return stop; } 107791: 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 ) 107793: 83 c4 10 add $0x10,%esp { rtems_chain_node *node = NULL; bool stop = false; rtems_libio_lock(); for ( 107796: 81 fb 68 2f 12 00 cmp $0x122f68,%ebx 10779c: 74 04 je 1077a2 node = rtems_chain_first( &mount_chain ); !rtems_chain_is_tail( &mount_chain, node ) && !stop; 10779e: 84 c0 test %al,%al 1077a0: 74 e9 je 10778b <== 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(); 1077a2: 88 45 e4 mov %al,-0x1c(%ebp) 1077a5: e8 ad ff ff ff call 107757 return stop; } 1077aa: 8a 45 e4 mov -0x1c(%ebp),%al 1077ad: 8d 65 f4 lea -0xc(%ebp),%esp 1077b0: 5b pop %ebx 1077b1: 5e pop %esi 1077b2: 5f pop %edi 1077b3: c9 leave 1077b4: c3 ret =============================================================================== 001072f6 : int rtems_filesystem_prefix_separators( const char *pathname, int pathnamelen ) { 1072f6: 55 push %ebp 1072f7: 89 e5 mov %esp,%ebp 1072f9: 57 push %edi 1072fa: 56 push %esi 1072fb: 53 push %ebx 1072fc: 83 ec 0c sub $0xc,%esp 1072ff: 8b 7d 08 mov 0x8(%ebp),%edi 107302: 8b 75 0c mov 0xc(%ebp),%esi /* * Eat any separators at start of the path. */ int stripped = 0; 107305: 31 db xor %ebx,%ebx while ( *pathname && pathnamelen && rtems_filesystem_is_separator( *pathname ) ) 107307: eb 01 jmp 10730a { pathname++; pathnamelen--; stripped++; 107309: 43 inc %ebx { /* * Eat any separators at start of the path. */ int stripped = 0; while ( *pathname && pathnamelen && rtems_filesystem_is_separator( *pathname ) ) 10730a: 8a 04 1f mov (%edi,%ebx,1),%al 10730d: 39 de cmp %ebx,%esi 10730f: 74 17 je 107328 <== NEVER TAKEN 107311: 84 c0 test %al,%al 107313: 74 13 je 107328 <== NEVER TAKEN 107315: 83 ec 0c sub $0xc,%esp 107318: 0f be c0 movsbl %al,%eax 10731b: 50 push %eax 10731c: e8 df 0c 00 00 call 108000 107321: 83 c4 10 add $0x10,%esp 107324: 85 c0 test %eax,%eax 107326: 75 e1 jne 107309 pathname++; pathnamelen--; stripped++; } return stripped; } 107328: 89 d8 mov %ebx,%eax 10732a: 8d 65 f4 lea -0xc(%ebp),%esp 10732d: 5b pop %ebx 10732e: 5e pop %esi 10732f: 5f pop %edi 107330: c9 leave 107331: c3 ret =============================================================================== 00107bbd : int rtems_gxx_key_create (__gthread_key_t *key, void (*dtor) (void *)) { 107bbd: 55 push %ebp 107bbe: 89 e5 mov %esp,%ebp 107bc0: 56 push %esi 107bc1: 53 push %ebx 107bc2: 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 ) ); 107bc5: 83 ec 0c sub $0xc,%esp 107bc8: 6a 08 push $0x8 107bca: e8 89 03 00 00 call 107f58 107bcf: 89 c3 mov %eax,%ebx *key = new_key; 107bd1: 8b 45 08 mov 0x8(%ebp),%eax 107bd4: 89 18 mov %ebx,(%eax) new_key->val = NULL; 107bd6: c7 03 00 00 00 00 movl $0x0,(%ebx) new_key->dtor = dtor; 107bdc: 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 ); 107bdf: 83 c4 0c add $0xc,%esp 107be2: 56 push %esi 107be3: 53 push %ebx 107be4: 6a 00 push $0x0 107be6: e8 1d 34 00 00 call 10b008 107beb: 89 c2 mov %eax,%edx if ( status == RTEMS_SUCCESSFUL ) 107bed: 83 c4 10 add $0x10,%esp return 0; 107bf0: 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 ) 107bf2: 85 d2 test %edx,%edx 107bf4: 74 0f je 107c05 <== ALWAYS TAKEN return 0; free( new_key ); 107bf6: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 107bf9: 53 push %ebx <== NOT EXECUTED 107bfa: e8 79 fe ff ff call 107a78 <== NOT EXECUTED return -1; 107bff: 83 c4 10 add $0x10,%esp <== NOT EXECUTED 107c02: 83 c8 ff or $0xffffffff,%eax <== NOT EXECUTED } 107c05: 8d 65 f8 lea -0x8(%ebp),%esp 107c08: 5b pop %ebx 107c09: 5e pop %esi 107c0a: c9 leave 107c0b: c3 ret =============================================================================== 00107c1c : int rtems_gxx_key_delete (__gthread_key_t key) { 107c1c: 55 push %ebp 107c1d: 89 e5 mov %esp,%ebp 107c1f: 53 push %ebx 107c20: 83 ec 0c sub $0xc,%esp 107c23: 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 ); 107c26: 53 push %ebx 107c27: 6a 00 push $0x0 107c29: e8 6e 34 00 00 call 10b09c if ( status == RTEMS_SUCCESSFUL ) { 107c2e: 83 c4 10 add $0x10,%esp 107c31: 85 c0 test %eax,%eax 107c33: 75 11 jne 107c46 <== NEVER TAKEN /* Hmm - hopefully all tasks using this key have gone away... */ if ( key ) free( *(void **)key ); 107c35: 85 db test %ebx,%ebx 107c37: 74 0d je 107c46 <== NEVER TAKEN 107c39: 83 ec 0c sub $0xc,%esp 107c3c: ff 33 pushl (%ebx) 107c3e: e8 35 fe ff ff call 107a78 107c43: 83 c4 10 add $0x10,%esp return 0; } key = NULL; return 0; } 107c46: 31 c0 xor %eax,%eax 107c48: 8b 5d fc mov -0x4(%ebp),%ebx 107c4b: c9 leave 107c4c: c3 ret =============================================================================== 00107b64 : /* 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)) { 107b64: 55 push %ebp 107b65: 89 e5 mov %esp,%ebp 107b67: 56 push %esi 107b68: 53 push %ebx 107b69: 83 ec 10 sub $0x10,%esp 107b6c: 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 ) { 107b6f: 8b 03 mov (%ebx),%eax 107b71: 85 c0 test %eax,%eax 107b73: 75 3f jne 107bb4 rtems_mode saveMode; __gthread_once_t o; rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode); 107b75: 52 push %edx 107b76: 8d 45 f4 lea -0xc(%ebp),%eax 107b79: 50 push %eax 107b7a: 68 00 01 00 00 push $0x100 107b7f: 68 00 01 00 00 push $0x100 107b84: e8 ff 32 00 00 call 10ae88 if ( (o = *(volatile __gthread_once_t *)once) == 0 ) { 107b89: 8b 33 mov (%ebx),%esi 107b8b: 83 c4 10 add $0x10,%esp 107b8e: 85 f6 test %esi,%esi 107b90: 75 06 jne 107b98 <== NEVER TAKEN *(volatile __gthread_once_t *)once = 1; 107b92: c7 03 01 00 00 00 movl $0x1,(%ebx) } rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); 107b98: 50 push %eax 107b99: 8d 45 f4 lea -0xc(%ebp),%eax 107b9c: 50 push %eax 107b9d: 68 00 01 00 00 push $0x100 107ba2: ff 75 f4 pushl -0xc(%ebp) 107ba5: e8 de 32 00 00 call 10ae88 if ( o == 0 ) 107baa: 83 c4 10 add $0x10,%esp 107bad: 85 f6 test %esi,%esi 107baf: 75 03 jne 107bb4 <== NEVER TAKEN (*func)(); 107bb1: ff 55 0c call *0xc(%ebp) } return 0; } 107bb4: 31 c0 xor %eax,%eax 107bb6: 8d 65 f8 lea -0x8(%ebp),%esp 107bb9: 5b pop %ebx 107bba: 5e pop %esi 107bbb: c9 leave 107bbc: c3 ret =============================================================================== 00107ca5 : int rtems_gxx_setspecific(__gthread_key_t key, const void *ptr) { 107ca5: 55 push %ebp 107ca6: 89 e5 mov %esp,%ebp 107ca8: 53 push %ebx 107ca9: 83 ec 08 sub $0x8,%esp 107cac: 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 ); 107caf: ff 73 04 pushl 0x4(%ebx) 107cb2: 53 push %ebx 107cb3: 6a 00 push $0x0 107cb5: e8 4e 33 00 00 call 10b008 107cba: 89 c2 mov %eax,%edx if ( status == RTEMS_SUCCESSFUL ) { 107cbc: 83 c4 10 add $0x10,%esp /* now let's set the proper value */ key->val = (void *)ptr; return 0; } return -1; 107cbf: 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 ) { 107cc2: 85 d2 test %edx,%edx 107cc4: 75 07 jne 107ccd <== NEVER TAKEN /* now let's set the proper value */ key->val = (void *)ptr; 107cc6: 8b 45 0c mov 0xc(%ebp),%eax 107cc9: 89 03 mov %eax,(%ebx) return 0; 107ccb: 31 c0 xor %eax,%eax } return -1; } 107ccd: 8b 5d fc mov -0x4(%ebp),%ebx 107cd0: c9 leave 107cd1: c3 ret =============================================================================== 0010a930 : void *rtems_heap_allocate_aligned_with_boundary( size_t size, uintptr_t alignment, uintptr_t boundary ) { 10a930: 55 push %ebp 10a931: 89 e5 mov %esp,%ebp 10a933: 83 ec 08 sub $0x8,%esp if ( 10a936: 83 3d 88 c5 12 00 03 cmpl $0x3,0x12c588 10a93d: 75 0d jne 10a94c <== NEVER TAKEN _System_state_Is_up( _System_state_Get() ) && !malloc_is_system_state_OK() 10a93f: e8 34 f1 ff ff call 109a78 10a944: 88 c2 mov %al,%dl ) { return NULL; 10a946: 31 c0 xor %eax,%eax uintptr_t boundary ) { if ( _System_state_Is_up( _System_state_Get() ) && !malloc_is_system_state_OK() 10a948: 84 d2 test %dl,%dl 10a94a: 74 1c je 10a968 ) { return NULL; } malloc_deferred_frees_process(); 10a94c: e8 65 f1 ff ff call 109ab6 /* FIXME: Statistics, boundary checks */ return _Protected_heap_Allocate_aligned_with_boundary( 10a951: ff 75 10 pushl 0x10(%ebp) 10a954: ff 75 0c pushl 0xc(%ebp) 10a957: ff 75 08 pushl 0x8(%ebp) 10a95a: ff 35 40 79 12 00 pushl 0x127940 10a960: e8 d7 43 00 00 call 10ed3c <_Protected_heap_Allocate_aligned_with_boundary> 10a965: 83 c4 10 add $0x10,%esp RTEMS_Malloc_Heap, size, alignment, boundary ); } 10a968: c9 leave 10a969: c3 ret =============================================================================== 00107022 : rtems_status_code rtems_io_lookup_name( const char *name, rtems_driver_name_t *device_info ) { 107022: 55 push %ebp 107023: 89 e5 mov %esp,%ebp 107025: 57 push %edi 107026: 56 push %esi 107027: 53 push %ebx 107028: 83 ec 48 sub $0x48,%esp 10702b: 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( 10702e: 31 c0 xor %eax,%eax 107030: 83 c9 ff or $0xffffffff,%ecx 107033: 89 f7 mov %esi,%edi 107035: f2 ae repnz scas %es:(%edi),%al 107037: f7 d1 not %ecx 107039: 49 dec %ecx 10703a: 6a 01 push $0x1 10703c: 8d 55 d4 lea -0x2c(%ebp),%edx 10703f: 52 push %edx 107040: 6a 00 push $0x0 107042: 51 push %ecx 107043: 56 push %esi 107044: 89 55 c4 mov %edx,-0x3c(%ebp) 107047: e8 2a 02 00 00 call 107276 10704c: 89 c7 mov %eax,%edi name, strlen( name ), 0x00, &loc, true ); the_jnode = loc.node_access; 10704e: 8b 5d d4 mov -0x2c(%ebp),%ebx node_type = (*loc.ops->node_type_h)( &loc ); 107051: 83 c4 14 add $0x14,%esp 107054: 8b 55 c4 mov -0x3c(%ebp),%edx 107057: 52 push %edx 107058: 8b 45 e0 mov -0x20(%ebp),%eax 10705b: ff 50 10 call *0x10(%eax) if ( (result != 0) || node_type != RTEMS_FILESYSTEM_DEVICE ) { 10705e: 83 c4 10 add $0x10,%esp 107061: 83 f8 02 cmp $0x2,%eax 107064: 8b 55 c4 mov -0x3c(%ebp),%edx 107067: 75 07 jne 107070 107069: 85 ff test %edi,%edi 10706b: 0f 95 c0 setne %al 10706e: 74 16 je 107086 <== ALWAYS TAKEN rtems_filesystem_freenode( &loc ); 107070: 83 ec 0c sub $0xc,%esp 107073: 8d 45 d4 lea -0x2c(%ebp),%eax 107076: 50 push %eax 107077: e8 b8 02 00 00 call 107334 return RTEMS_UNSATISFIED; 10707c: 83 c4 10 add $0x10,%esp 10707f: b8 0d 00 00 00 mov $0xd,%eax 107084: eb 32 jmp 1070b8 } device_info->device_name = (char *) name; 107086: 8b 4d 0c mov 0xc(%ebp),%ecx 107089: 89 31 mov %esi,(%ecx) device_info->device_name_length = strlen( name ); 10708b: 83 c9 ff or $0xffffffff,%ecx 10708e: 89 f7 mov %esi,%edi 107090: f2 ae repnz scas %es:(%edi),%al 107092: f7 d1 not %ecx 107094: 49 dec %ecx 107095: 8b 45 0c mov 0xc(%ebp),%eax 107098: 89 48 04 mov %ecx,0x4(%eax) device_info->major = the_jnode->info.device.major; 10709b: 8b 43 50 mov 0x50(%ebx),%eax 10709e: 8b 4d 0c mov 0xc(%ebp),%ecx 1070a1: 89 41 08 mov %eax,0x8(%ecx) device_info->minor = the_jnode->info.device.minor; 1070a4: 8b 43 54 mov 0x54(%ebx),%eax 1070a7: 89 41 0c mov %eax,0xc(%ecx) rtems_filesystem_freenode( &loc ); 1070aa: 83 ec 0c sub $0xc,%esp 1070ad: 52 push %edx 1070ae: e8 81 02 00 00 call 107334 return RTEMS_SUCCESSFUL; 1070b3: 83 c4 10 add $0x10,%esp 1070b6: 31 c0 xor %eax,%eax } 1070b8: 8d 65 f4 lea -0xc(%ebp),%esp 1070bb: 5b pop %ebx 1070bc: 5e pop %esi 1070bd: 5f pop %edi 1070be: c9 leave 1070bf: c3 ret =============================================================================== 0010b714 : rtems_status_code rtems_io_register_driver( rtems_device_major_number major, const rtems_driver_address_table *driver_table, rtems_device_major_number *registered_major ) { 10b714: 55 push %ebp 10b715: 89 e5 mov %esp,%ebp 10b717: 57 push %edi 10b718: 56 push %esi 10b719: 53 push %ebx 10b71a: 83 ec 0c sub $0xc,%esp 10b71d: 8b 5d 08 mov 0x8(%ebp),%ebx 10b720: 8b 75 0c mov 0xc(%ebp),%esi 10b723: 8b 45 10 mov 0x10(%ebp),%eax rtems_device_major_number major_limit = _IO_Number_of_drivers; 10b726: 8b 15 78 8d 12 00 mov 0x128d78,%edx if ( rtems_interrupt_is_in_progress() ) 10b72c: 83 3d 1c 89 12 00 00 cmpl $0x0,0x12891c 10b733: 0f 85 cc 00 00 00 jne 10b805 <== NEVER TAKEN return RTEMS_CALLED_FROM_ISR; if ( registered_major == NULL ) 10b739: 85 c0 test %eax,%eax 10b73b: 0f 84 cb 00 00 00 je 10b80c return RTEMS_INVALID_ADDRESS; /* Set it to an invalid value */ *registered_major = major_limit; 10b741: 89 10 mov %edx,(%eax) if ( driver_table == NULL ) 10b743: 85 f6 test %esi,%esi 10b745: 0f 84 c1 00 00 00 je 10b80c static inline bool rtems_io_is_empty_table( const rtems_driver_address_table *table ) { return table->initialization_entry == NULL && table->open_entry == NULL; 10b74b: 83 3e 00 cmpl $0x0,(%esi) 10b74e: 0f 85 cc 00 00 00 jne 10b820 10b754: 83 7e 04 00 cmpl $0x0,0x4(%esi) 10b758: 0f 85 c2 00 00 00 jne 10b820 10b75e: e9 a9 00 00 00 jmp 10b80c rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 10b763: 8b 15 f8 83 12 00 mov 0x1283f8,%edx 10b769: 42 inc %edx 10b76a: 89 15 f8 83 12 00 mov %edx,0x1283f8 if ( major >= major_limit ) return RTEMS_INVALID_NUMBER; _Thread_Disable_dispatch(); if ( major == 0 ) { 10b770: 85 db test %ebx,%ebx 10b772: 75 32 jne 10b7a6 static rtems_status_code rtems_io_obtain_major_number( rtems_device_major_number *major ) { rtems_device_major_number n = _IO_Number_of_drivers; 10b774: 8b 0d 78 8d 12 00 mov 0x128d78,%ecx 10b77a: 8b 15 7c 8d 12 00 mov 0x128d7c,%edx 10b780: eb 15 jmp 10b797 static inline bool rtems_io_is_empty_table( const rtems_driver_address_table *table ) { return table->initialization_entry == NULL && table->open_entry == NULL; 10b782: 83 3a 00 cmpl $0x0,(%edx) 10b785: 0f 85 9f 00 00 00 jne 10b82a 10b78b: 83 7a 04 00 cmpl $0x0,0x4(%edx) 10b78f: 0f 85 95 00 00 00 jne 10b82a 10b795: eb 04 jmp 10b79b rtems_device_major_number n = _IO_Number_of_drivers; rtems_device_major_number m = 0; /* major is error checked by caller */ for ( m = 0; m < n; ++m ) { 10b797: 39 cb cmp %ecx,%ebx 10b799: 72 e7 jb 10b782 if ( rtems_io_is_empty_table( table ) ) break; } /* Assigns invalid value in case of failure */ *major = m; 10b79b: 89 18 mov %ebx,(%eax) if ( m != n ) 10b79d: 39 cb cmp %ecx,%ebx 10b79f: 75 30 jne 10b7d1 10b7a1: e9 8d 00 00 00 jmp 10b833 _Thread_Enable_dispatch(); return sc; } major = *registered_major; } else { rtems_driver_address_table *const table = _IO_Driver_address_table + major; 10b7a6: 6b d3 18 imul $0x18,%ebx,%edx 10b7a9: 03 15 7c 8d 12 00 add 0x128d7c,%edx static inline bool rtems_io_is_empty_table( const rtems_driver_address_table *table ) { return table->initialization_entry == NULL && table->open_entry == NULL; 10b7af: 31 c9 xor %ecx,%ecx 10b7b1: 83 3a 00 cmpl $0x0,(%edx) 10b7b4: 75 09 jne 10b7bf 10b7b6: 31 c9 xor %ecx,%ecx 10b7b8: 83 7a 04 00 cmpl $0x0,0x4(%edx) 10b7bc: 0f 94 c1 sete %cl } major = *registered_major; } else { rtems_driver_address_table *const table = _IO_Driver_address_table + major; if ( !rtems_io_is_empty_table( table ) ) { 10b7bf: 85 c9 test %ecx,%ecx 10b7c1: 75 0c jne 10b7cf _Thread_Enable_dispatch(); 10b7c3: e8 ee 1a 00 00 call 10d2b6 <_Thread_Enable_dispatch> return RTEMS_RESOURCE_IN_USE; 10b7c8: b8 0c 00 00 00 mov $0xc,%eax 10b7cd: eb 49 jmp 10b818 } *registered_major = major; 10b7cf: 89 18 mov %ebx,(%eax) } _IO_Driver_address_table [major] = *driver_table; 10b7d1: 6b c3 18 imul $0x18,%ebx,%eax 10b7d4: 03 05 7c 8d 12 00 add 0x128d7c,%eax 10b7da: b9 06 00 00 00 mov $0x6,%ecx 10b7df: 89 c7 mov %eax,%edi 10b7e1: f3 a5 rep movsl %ds:(%esi),%es:(%edi) _Thread_Enable_dispatch(); 10b7e3: e8 ce 1a 00 00 call 10d2b6 <_Thread_Enable_dispatch> return rtems_io_initialize( major, 0, NULL ); 10b7e8: c7 45 10 00 00 00 00 movl $0x0,0x10(%ebp) 10b7ef: c7 45 0c 00 00 00 00 movl $0x0,0xc(%ebp) 10b7f6: 89 5d 08 mov %ebx,0x8(%ebp) } 10b7f9: 83 c4 0c add $0xc,%esp 10b7fc: 5b pop %ebx 10b7fd: 5e pop %esi 10b7fe: 5f pop %edi 10b7ff: c9 leave _IO_Driver_address_table [major] = *driver_table; _Thread_Enable_dispatch(); return rtems_io_initialize( major, 0, NULL ); 10b800: e9 9b 71 00 00 jmp 1129a0 ) { rtems_device_major_number major_limit = _IO_Number_of_drivers; if ( rtems_interrupt_is_in_progress() ) return RTEMS_CALLED_FROM_ISR; 10b805: b8 12 00 00 00 mov $0x12,%eax 10b80a: eb 0c jmp 10b818 if ( driver_table == NULL ) return RTEMS_INVALID_ADDRESS; if ( rtems_io_is_empty_table( driver_table ) ) return RTEMS_INVALID_ADDRESS; 10b80c: b8 09 00 00 00 mov $0x9,%eax 10b811: eb 05 jmp 10b818 if ( major >= major_limit ) return RTEMS_INVALID_NUMBER; 10b813: b8 0a 00 00 00 mov $0xa,%eax _IO_Driver_address_table [major] = *driver_table; _Thread_Enable_dispatch(); return rtems_io_initialize( major, 0, NULL ); } 10b818: 83 c4 0c add $0xc,%esp 10b81b: 5b pop %ebx 10b81c: 5e pop %esi 10b81d: 5f pop %edi 10b81e: c9 leave 10b81f: c3 ret return RTEMS_INVALID_ADDRESS; if ( rtems_io_is_empty_table( driver_table ) ) return RTEMS_INVALID_ADDRESS; if ( major >= major_limit ) 10b820: 39 d3 cmp %edx,%ebx 10b822: 0f 82 3b ff ff ff jb 10b763 10b828: eb e9 jmp 10b813 rtems_device_major_number n = _IO_Number_of_drivers; rtems_device_major_number m = 0; /* major is error checked by caller */ for ( m = 0; m < n; ++m ) { 10b82a: 43 inc %ebx 10b82b: 83 c2 18 add $0x18,%edx 10b82e: e9 64 ff ff ff jmp 10b797 if ( major == 0 ) { rtems_status_code sc = rtems_io_obtain_major_number( registered_major ); if ( sc != RTEMS_SUCCESSFUL ) { _Thread_Enable_dispatch(); 10b833: e8 7e 1a 00 00 call 10d2b6 <_Thread_Enable_dispatch> *major = m; if ( m != n ) return RTEMS_SUCCESSFUL; return RTEMS_TOO_MANY; 10b838: b8 05 00 00 00 mov $0x5,%eax if ( major == 0 ) { rtems_status_code sc = rtems_io_obtain_major_number( registered_major ); if ( sc != RTEMS_SUCCESSFUL ) { _Thread_Enable_dispatch(); return sc; 10b83d: eb d9 jmp 10b818 =============================================================================== 0010c744 : #include #include void rtems_iterate_over_all_threads(rtems_per_thread_routine routine) { 10c744: 55 push %ebp 10c745: 89 e5 mov %esp,%ebp 10c747: 57 push %edi 10c748: 56 push %esi 10c749: 53 push %ebx 10c74a: 83 ec 0c sub $0xc,%esp uint32_t i; uint32_t api_index; Thread_Control *the_thread; Objects_Information *information; if ( !routine ) 10c74d: 83 7d 08 00 cmpl $0x0,0x8(%ebp) 10c751: 74 3d je 10c790 <== NEVER TAKEN 10c753: 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 ]; 10c758: 8b 04 9d bc 8f 12 00 mov 0x128fbc(,%ebx,4),%eax 10c75f: 8b 78 04 mov 0x4(%eax),%edi if ( !information ) 10c762: be 01 00 00 00 mov $0x1,%esi 10c767: 85 ff test %edi,%edi 10c769: 75 17 jne 10c782 10c76b: eb 1d jmp 10c78a continue; for ( i=1 ; i <= information->maximum ; i++ ) { the_thread = (Thread_Control *)information->local_table[ i ]; 10c76d: 8b 47 1c mov 0x1c(%edi),%eax 10c770: 8b 04 b0 mov (%eax,%esi,4),%eax if ( !the_thread ) 10c773: 85 c0 test %eax,%eax 10c775: 74 0a je 10c781 <== NEVER TAKEN continue; (*routine)(the_thread); 10c777: 83 ec 0c sub $0xc,%esp 10c77a: 50 push %eax 10c77b: ff 55 08 call *0x8(%ebp) 10c77e: 83 c4 10 add $0x10,%esp information = _Objects_Information_table[ api_index ][ 1 ]; if ( !information ) continue; for ( i=1 ; i <= information->maximum ; i++ ) { 10c781: 46 inc %esi 10c782: 0f b7 47 10 movzwl 0x10(%edi),%eax 10c786: 39 c6 cmp %eax,%esi 10c788: 76 e3 jbe 10c76d Objects_Information *information; if ( !routine ) return; for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) { 10c78a: 43 inc %ebx 10c78b: 83 fb 04 cmp $0x4,%ebx 10c78e: 75 c8 jne 10c758 (*routine)(the_thread); } } } 10c790: 8d 65 f4 lea -0xc(%ebp),%esp 10c793: 5b pop %ebx 10c794: 5e pop %esi 10c795: 5f pop %edi 10c796: c9 leave 10c797: c3 ret =============================================================================== 0010e2a4 : */ void rtems_libio_free( rtems_libio_t *iop ) { 10e2a4: 55 push %ebp 10e2a5: 89 e5 mov %esp,%ebp 10e2a7: 53 push %ebx 10e2a8: 83 ec 04 sub $0x4,%esp 10e2ab: 8b 5d 08 mov 0x8(%ebp),%ebx rtems_libio_lock(); 10e2ae: e8 d5 fe ff ff call 10e188 if (iop->sem) 10e2b3: 8b 43 2c mov 0x2c(%ebx),%eax 10e2b6: 85 c0 test %eax,%eax 10e2b8: 74 0c je 10e2c6 <== NEVER TAKEN rtems_semaphore_delete(iop->sem); 10e2ba: 83 ec 0c sub $0xc,%esp 10e2bd: 50 push %eax 10e2be: e8 15 be ff ff call 10a0d8 10e2c3: 83 c4 10 add $0x10,%esp iop->flags &= ~LIBIO_FLAGS_OPEN; 10e2c6: 81 63 14 ff fe ff ff andl $0xfffffeff,0x14(%ebx) iop->data1 = rtems_libio_iop_freelist; 10e2cd: a1 fc 51 12 00 mov 0x1251fc,%eax 10e2d2: 89 43 34 mov %eax,0x34(%ebx) rtems_libio_iop_freelist = iop; 10e2d5: 89 1d fc 51 12 00 mov %ebx,0x1251fc rtems_libio_unlock(); } 10e2db: 8b 5d fc mov -0x4(%ebp),%ebx 10e2de: c9 leave iop->flags &= ~LIBIO_FLAGS_OPEN; iop->data1 = rtems_libio_iop_freelist; rtems_libio_iop_freelist = iop; rtems_libio_unlock(); 10e2df: e9 be fe ff ff jmp 10e1a2 =============================================================================== 00107434 : * * Called by BSP startup code to initialize the libio subsystem. */ void rtems_libio_init( void ) { 107434: 55 push %ebp 107435: 89 e5 mov %esp,%ebp 107437: 53 push %ebx 107438: 83 ec 04 sub $0x4,%esp rtems_status_code rc; uint32_t i; rtems_libio_t *iop; if (rtems_libio_number_iops > 0) 10743b: 8b 1d 44 11 12 00 mov 0x121144,%ebx 107441: 85 db test %ebx,%ebx 107443: 74 3e je 107483 <== NEVER TAKEN { rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops, 107445: 50 push %eax 107446: 50 push %eax 107447: 6a 38 push $0x38 107449: 53 push %ebx 10744a: e8 8d fd ff ff call 1071dc 10744f: a3 f8 51 12 00 mov %eax,0x1251f8 sizeof(rtems_libio_t)); if (rtems_libio_iops == NULL) 107454: 83 c4 10 add $0x10,%esp 107457: 85 c0 test %eax,%eax 107459: 75 07 jne 107462 rtems_fatal_error_occurred(RTEMS_NO_MEMORY); 10745b: 83 ec 0c sub $0xc,%esp 10745e: 6a 1a push $0x1a 107460: eb 44 jmp 1074a6 iop = rtems_libio_iop_freelist = rtems_libio_iops; 107462: a3 fc 51 12 00 mov %eax,0x1251fc 107467: 89 c2 mov %eax,%edx for (i = 0 ; (i + 1) < rtems_libio_number_iops ; i++, iop++) 107469: 31 c9 xor %ecx,%ecx 10746b: eb 03 jmp 107470 iop->data1 = iop + 1; 10746d: 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++) 107470: 41 inc %ecx 107471: 83 c2 38 add $0x38,%edx 107474: 39 d9 cmp %ebx,%ecx 107476: 72 f5 jb 10746d iop->data1 = iop + 1; iop->data1 = NULL; 107478: 6b db 38 imul $0x38,%ebx,%ebx 10747b: c7 44 18 fc 00 00 00 movl $0x0,-0x4(%eax,%ebx,1) 107482: 00 /* * Create the binary semaphore used to provide mutual exclusion * on the IOP Table. */ rc = rtems_semaphore_create( 107483: 83 ec 0c sub $0xc,%esp 107486: 68 00 52 12 00 push $0x125200 10748b: 6a 00 push $0x0 10748d: 6a 54 push $0x54 10748f: 6a 01 push $0x1 107491: 68 4f 49 42 4c push $0x4c42494f 107496: e8 a5 2a 00 00 call 109f40 1, RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY, RTEMS_NO_PRIORITY, &rtems_libio_semaphore ); if ( rc != RTEMS_SUCCESSFUL ) 10749b: 83 c4 20 add $0x20,%esp 10749e: 85 c0 test %eax,%eax 1074a0: 74 09 je 1074ab <== ALWAYS TAKEN rtems_fatal_error_occurred( rc ); 1074a2: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 1074a5: 50 push %eax <== NOT EXECUTED 1074a6: e8 89 32 00 00 call 10a734 /* * Initialize the base file system infrastructure. */ if (rtems_fs_init_helper) 1074ab: a1 40 11 12 00 mov 0x121140,%eax 1074b0: 85 c0 test %eax,%eax 1074b2: 74 06 je 1074ba <== NEVER TAKEN (* rtems_fs_init_helper)(); } 1074b4: 8b 5d fc mov -0x4(%ebp),%ebx 1074b7: c9 leave /* * Initialize the base file system infrastructure. */ if (rtems_fs_init_helper) (* rtems_fs_init_helper)(); 1074b8: ff e0 jmp *%eax } 1074ba: 8b 5d fc mov -0x4(%ebp),%ebx <== NOT EXECUTED 1074bd: c9 leave <== NOT EXECUTED 1074be: c3 ret <== NOT EXECUTED =============================================================================== 001085fd : rtems_status_code rtems_libio_set_private_env(void) { 1085fd: 55 push %ebp 1085fe: 89 e5 mov %esp,%ebp 108600: 57 push %edi 108601: 56 push %esi 108602: 53 push %ebx 108603: 83 ec 3c sub $0x3c,%esp rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_id task_id = rtems_task_self(); 108606: e8 4d 27 00 00 call 10ad58 10860b: 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); 10860d: 83 ec 0c sub $0xc,%esp 108610: 6a 00 push $0x0 108612: 8d 45 d4 lea -0x2c(%ebp),%eax 108615: 50 push %eax 108616: 6a 00 push $0x0 108618: 6a 01 push $0x1 10861a: 68 3c f7 11 00 push $0x11f73c 10861f: e8 66 f0 ff ff call 10768a 108624: 89 c2 mov %eax,%edx if (rv != 0) 108626: 83 c4 20 add $0x20,%esp error_1: rtems_filesystem_freenode(&root_loc); error_0: return RTEMS_NO_MEMORY; 108629: 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) 10862e: 85 d2 test %edx,%edx 108630: 0f 85 c0 00 00 00 jne 1086f6 <== NEVER TAKEN goto error_0; rv = rtems_filesystem_evaluate_path("/", 1, 0, ¤t_loc, 0); 108636: 83 ec 0c sub $0xc,%esp 108639: 6a 00 push $0x0 10863b: 8d 45 c0 lea -0x40(%ebp),%eax 10863e: 50 push %eax 10863f: 6a 00 push $0x0 108641: 6a 01 push $0x1 108643: 68 3c f7 11 00 push $0x11f73c 108648: e8 3d f0 ff ff call 10768a if (rv != 0) 10864d: 83 c4 20 add $0x20,%esp 108650: 85 c0 test %eax,%eax 108652: 0f 85 8a 00 00 00 jne 1086e2 <== 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 108658: 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 ( 10865d: 3d 48 52 12 00 cmp $0x125248,%eax 108662: 74 04 je 108668 rtems_current_user_env == &rtems_global_user_env || rtems_current_user_env->task_id != task_id 108664: 39 18 cmp %ebx,(%eax) 108666: 74 32 je 10869a ) { new_env = malloc(sizeof(rtems_user_env_t)); 108668: 83 ec 0c sub $0xc,%esp 10866b: 6a 48 push $0x48 10866d: e8 8a f5 ff ff call 107bfc 108672: 89 c6 mov %eax,%esi if (new_env == NULL) 108674: 83 c4 10 add $0x10,%esp 108677: 85 c0 test %eax,%eax 108679: 74 58 je 1086d3 #ifdef HAVE_USERENV_REFCNT new_env->refcnt = 1; #endif sc = rtems_task_variable_add( 10867b: 50 push %eax 10867c: 68 c0 85 10 00 push $0x1085c0 108681: 68 6c 30 12 00 push $0x12306c 108686: 6a 00 push $0x0 108688: e8 3f 27 00 00 call 10adcc RTEMS_SELF, (void*)&rtems_current_user_env, (void(*)(void *))free_user_env ); if (sc != RTEMS_SUCCESSFUL) 10868d: 83 c4 10 add $0x10,%esp 108690: 85 c0 test %eax,%eax 108692: 75 33 jne 1086c7 goto error_3; rtems_current_user_env = new_env; 108694: 89 35 6c 30 12 00 mov %esi,0x12306c } /* Inherit the global values */ *rtems_current_user_env = rtems_global_user_env; 10869a: a1 6c 30 12 00 mov 0x12306c,%eax 10869f: be 48 52 12 00 mov $0x125248,%esi 1086a4: b9 12 00 00 00 mov $0x12,%ecx 1086a9: 89 c7 mov %eax,%edi 1086ab: f3 a5 rep movsl %ds:(%esi),%es:(%edi) rtems_current_user_env->task_id = task_id; 1086ad: 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; 1086af: 8d 78 18 lea 0x18(%eax),%edi 1086b2: 8d 75 d4 lea -0x2c(%ebp),%esi 1086b5: b1 05 mov $0x5,%cl 1086b7: f3 a5 rep movsl %ds:(%esi),%es:(%edi) rtems_filesystem_current = current_loc; 1086b9: 8d 78 04 lea 0x4(%eax),%edi 1086bc: 8d 75 c0 lea -0x40(%ebp),%esi 1086bf: b1 05 mov $0x5,%cl 1086c1: f3 a5 rep movsl %ds:(%esi),%es:(%edi) return RTEMS_SUCCESSFUL; 1086c3: 31 c0 xor %eax,%eax 1086c5: eb 2f jmp 1086f6 error_3: free(new_env); 1086c7: 83 ec 0c sub $0xc,%esp 1086ca: 56 push %esi 1086cb: e8 8c f0 ff ff call 10775c 1086d0: 83 c4 10 add $0x10,%esp error_2: rtems_filesystem_freenode(¤t_loc); 1086d3: 83 ec 0c sub $0xc,%esp 1086d6: 8d 45 c0 lea -0x40(%ebp),%eax 1086d9: 50 push %eax 1086da: e8 69 f0 ff ff call 107748 1086df: 83 c4 10 add $0x10,%esp error_1: rtems_filesystem_freenode(&root_loc); 1086e2: 83 ec 0c sub $0xc,%esp 1086e5: 8d 45 d4 lea -0x2c(%ebp),%eax 1086e8: 50 push %eax 1086e9: e8 5a f0 ff ff call 107748 1086ee: 83 c4 10 add $0x10,%esp error_0: return RTEMS_NO_MEMORY; 1086f1: b8 1a 00 00 00 mov $0x1a,%eax } 1086f6: 8d 65 f4 lea -0xc(%ebp),%esp 1086f9: 5b pop %ebx 1086fa: 5e pop %esi 1086fb: 5f pop %edi 1086fc: c9 leave 1086fd: c3 ret =============================================================================== 001086fe : * 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) { 1086fe: 55 push %ebp 1086ff: 89 e5 mov %esp,%ebp 108701: 56 push %esi 108702: 53 push %ebx 108703: 83 ec 20 sub $0x20,%esp 108706: 8b 75 08 mov 0x8(%ebp),%esi rtems_id current_task_id; /* * get current task id */ current_task_id = rtems_task_self(); 108709: e8 4a 26 00 00 call 10ad58 10870e: 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; 108710: 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 ) 108712: 39 de cmp %ebx,%esi 108714: 74 3c je 108752 <== NEVER TAKEN return RTEMS_SUCCESSFUL; /* * Try to get the requested user environment */ sc = rtems_task_variable_get( 108716: 52 push %edx task_id, (void*)&rtems_current_user_env, (void*)&shared_user_env ); 108717: 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( 10871a: 50 push %eax 10871b: 68 6c 30 12 00 push $0x12306c 108720: 56 push %esi 108721: e8 3a 27 00 00 call 10ae60 (void*)&shared_user_env ); /* * If it was not successful, return the error code */ if (sc != RTEMS_SUCCESSFUL) 108726: 83 c4 10 add $0x10,%esp 108729: 85 c0 test %eax,%eax 10872b: 75 25 jne 108752 * 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) { 10872d: 8b 15 6c 30 12 00 mov 0x12306c,%edx 108733: 39 1a cmp %ebx,(%edx) 108735: 75 12 jne 108749 rtems_user_env_t *tmp = rtems_current_user_env; free_user_env( tmp ); 108737: 83 ec 0c sub $0xc,%esp 10873a: 52 push %edx 10873b: 89 45 e4 mov %eax,-0x1c(%ebp) 10873e: e8 7d fe ff ff call 1085c0 108743: 83 c4 10 add $0x10,%esp 108746: 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; 108749: 8b 55 f4 mov -0xc(%ebp),%edx 10874c: 89 15 6c 30 12 00 mov %edx,0x12306c #ifdef HAVE_USERENV_REFCNT rtems_current_user_env->refcnt++; #endif return RTEMS_SUCCESSFUL; } 108752: 8d 65 f8 lea -0x8(%ebp),%esp 108755: 5b pop %ebx 108756: 5e pop %esi 108757: c9 leave 108758: c3 ret =============================================================================== 0010e1ed : */ uint32_t rtems_libio_to_fcntl_flags( uint32_t flags ) { 10e1ed: 55 push %ebp 10e1ee: 89 e5 mov %esp,%ebp 10e1f0: 8b 55 08 mov 0x8(%ebp),%edx uint32_t fcntl_flags = 0; if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) { 10e1f3: 89 d1 mov %edx,%ecx 10e1f5: 83 e1 06 and $0x6,%ecx fcntl_flags |= O_RDWR; 10e1f8: 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 ) { 10e1fd: 83 f9 06 cmp $0x6,%ecx 10e200: 74 0f je 10e211 fcntl_flags |= O_RDWR; } else if ( (flags & LIBIO_FLAGS_READ) == LIBIO_FLAGS_READ) { fcntl_flags |= O_RDONLY; 10e202: 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) { 10e204: f6 c2 02 test $0x2,%dl 10e207: 75 08 jne 10e211 <== ALWAYS TAKEN ) { uint32_t fcntl_flags = 0; if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) { fcntl_flags |= O_RDWR; 10e209: 31 c0 xor %eax,%eax 10e20b: f6 c2 04 test $0x4,%dl <== NOT EXECUTED 10e20e: 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 ) { 10e211: f6 c2 01 test $0x1,%dl 10e214: 74 03 je 10e219 fcntl_flags |= O_NONBLOCK; 10e216: 80 cc 40 or $0x40,%ah } if ( (flags & LIBIO_FLAGS_APPEND) == LIBIO_FLAGS_APPEND ) { 10e219: f6 c6 02 test $0x2,%dh 10e21c: 74 03 je 10e221 fcntl_flags |= O_APPEND; 10e21e: 83 c8 08 or $0x8,%eax } if ( (flags & LIBIO_FLAGS_CREATE) == LIBIO_FLAGS_CREATE ) { 10e221: 80 e6 04 and $0x4,%dh 10e224: 74 03 je 10e229 fcntl_flags |= O_CREAT; 10e226: 80 cc 02 or $0x2,%ah } return fcntl_flags; } 10e229: c9 leave 10e22a: c3 ret =============================================================================== 00109d7c : * size and thus we skip updating the statistics. */ static void rtems_malloc_statistics_at_free( void *pointer ) { 109d7c: 55 push %ebp 109d7d: 89 e5 mov %esp,%ebp 109d7f: 83 ec 1c sub $0x1c,%esp uintptr_t size; if (_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &size) ) { 109d82: 8d 45 f4 lea -0xc(%ebp),%eax 109d85: 50 push %eax 109d86: ff 75 08 pushl 0x8(%ebp) 109d89: ff 35 40 79 12 00 pushl 0x127940 109d8f: e8 50 50 00 00 call 10ede4 <_Protected_heap_Get_block_size> 109d94: 83 c4 10 add $0x10,%esp 109d97: 84 c0 test %al,%al 109d99: 74 11 je 109dac <== NEVER TAKEN MSBUMP(lifetime_freed, size); 109d9b: 8b 45 f4 mov -0xc(%ebp),%eax 109d9e: 31 d2 xor %edx,%edx 109da0: 01 05 20 c3 12 00 add %eax,0x12c320 109da6: 11 15 24 c3 12 00 adc %edx,0x12c324 } } 109dac: c9 leave 109dad: c3 ret =============================================================================== 00109dae : } static void rtems_malloc_statistics_at_malloc( void *pointer ) { 109dae: 55 push %ebp 109daf: 89 e5 mov %esp,%ebp 109db1: 83 ec 18 sub $0x18,%esp 109db4: 8b 45 08 mov 0x8(%ebp),%eax uintptr_t actual_size = 0; 109db7: 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 ) 109dbe: 85 c0 test %eax,%eax 109dc0: 74 43 je 109e05 <== NEVER TAKEN return; _Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &actual_size); 109dc2: 52 push %edx 109dc3: 8d 55 f4 lea -0xc(%ebp),%edx 109dc6: 52 push %edx 109dc7: 50 push %eax 109dc8: ff 35 40 79 12 00 pushl 0x127940 109dce: e8 11 50 00 00 call 10ede4 <_Protected_heap_Get_block_size> MSBUMP(lifetime_allocated, actual_size); 109dd3: 8b 45 f4 mov -0xc(%ebp),%eax 109dd6: 31 d2 xor %edx,%edx 109dd8: 03 05 18 c3 12 00 add 0x12c318,%eax 109dde: 13 15 1c c3 12 00 adc 0x12c31c,%edx 109de4: a3 18 c3 12 00 mov %eax,0x12c318 109de9: 89 15 1c c3 12 00 mov %edx,0x12c31c current_depth = (uint32_t) (s->lifetime_allocated - s->lifetime_freed); 109def: 2b 05 20 c3 12 00 sub 0x12c320,%eax if (current_depth > s->max_depth) 109df5: 83 c4 10 add $0x10,%esp 109df8: 3b 05 14 c3 12 00 cmp 0x12c314,%eax 109dfe: 76 05 jbe 109e05 s->max_depth = current_depth; 109e00: a3 14 c3 12 00 mov %eax,0x12c314 } 109e05: c9 leave 109e06: c3 ret =============================================================================== 00111a3c : int rtems_memalign( void **pointer, size_t alignment, size_t size ) { 111a3c: 55 push %ebp 111a3d: 89 e5 mov %esp,%ebp 111a3f: 57 push %edi 111a40: 56 push %esi 111a41: 53 push %ebx 111a42: 83 ec 0c sub $0xc,%esp 111a45: 8b 5d 08 mov 0x8(%ebp),%ebx /* * Parameter error checks */ if ( !pointer ) return EINVAL; 111a48: be 16 00 00 00 mov $0x16,%esi void *return_this; /* * Parameter error checks */ if ( !pointer ) 111a4d: 85 db test %ebx,%ebx 111a4f: 74 55 je 111aa6 return EINVAL; *pointer = NULL; 111a51: 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()) && 111a57: 83 3d 54 85 12 00 03 cmpl $0x3,0x128554 111a5e: 75 09 jne 111a69 <== NEVER TAKEN !malloc_is_system_state_OK() ) 111a60: e8 97 67 ff ff call 1081fc *pointer = NULL; /* * Do not attempt to allocate memory if not in correct system state. */ if ( _System_state_Is_up(_System_state_Get()) && 111a65: 84 c0 test %al,%al 111a67: 74 3d je 111aa6 <== NEVER TAKEN return EINVAL; /* * If some free's have been deferred, then do them now. */ malloc_deferred_frees_process(); 111a69: e8 cc 67 ff ff call 10823a Heap_Control *heap, uintptr_t size, uintptr_t alignment ) { return 111a6e: 6a 00 push $0x0 111a70: ff 75 0c pushl 0xc(%ebp) 111a73: ff 75 10 pushl 0x10(%ebp) 111a76: ff 35 80 41 12 00 pushl 0x124180 111a7c: e8 87 af ff ff call 10ca08 <_Protected_heap_Allocate_aligned_with_boundary> 111a81: 89 c7 mov %eax,%edi return_this = _Protected_heap_Allocate_aligned( RTEMS_Malloc_Heap, size, alignment ); if ( !return_this ) 111a83: 83 c4 10 add $0x10,%esp return ENOMEM; 111a86: be 0c 00 00 00 mov $0xc,%esi return_this = _Protected_heap_Allocate_aligned( RTEMS_Malloc_Heap, size, alignment ); if ( !return_this ) 111a8b: 85 c0 test %eax,%eax 111a8d: 74 17 je 111aa6 return ENOMEM; /* * If configured, update the more involved statistics */ if ( rtems_malloc_statistics_helpers ) 111a8f: a1 90 66 12 00 mov 0x126690,%eax 111a94: 85 c0 test %eax,%eax 111a96: 74 0a je 111aa2 (*rtems_malloc_statistics_helpers->at_malloc)(pointer); 111a98: 83 ec 0c sub $0xc,%esp 111a9b: 53 push %ebx 111a9c: ff 50 04 call *0x4(%eax) 111a9f: 83 c4 10 add $0x10,%esp *pointer = return_this; 111aa2: 89 3b mov %edi,(%ebx) return 0; 111aa4: 31 f6 xor %esi,%esi } 111aa6: 89 f0 mov %esi,%eax 111aa8: 8d 65 f4 lea -0xc(%ebp),%esp 111aab: 5b pop %ebx 111aac: 5e pop %esi 111aad: 5f pop %edi 111aae: c9 leave 111aaf: c3 ret =============================================================================== 0011036c : return (retval); } int rtems_mkdir(const char *path, mode_t mode) { 11036c: 55 push %ebp 11036d: 89 e5 mov %esp,%ebp 11036f: 57 push %edi 110370: 56 push %esi 110371: 53 push %ebx 110372: 83 ec 78 sub $0x78,%esp int success = 0; char *dup_path = strdup(path); 110375: ff 75 08 pushl 0x8(%ebp) 110378: e8 87 32 00 00 call 113604 11037d: 89 c3 mov %eax,%ebx if (dup_path != NULL) { 11037f: 83 c4 10 add $0x10,%esp success = build(dup_path, mode); free(dup_path); } return success != 0 ? 0 : -1; 110382: 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) { 110385: 85 db test %ebx,%ebx 110387: 0f 84 1e 01 00 00 je 1104ab <== NEVER TAKEN p = path; oumask = 0; retval = 1; if (p[0] == '/') /* Skip leading '/'. */ ++p; 11038d: 31 c0 xor %eax,%eax 11038f: 80 3b 2f cmpb $0x2f,(%ebx) 110392: 0f 94 c0 sete %al 110395: 8d 3c 03 lea (%ebx,%eax,1),%edi char *p; p = path; oumask = 0; retval = 1; if (p[0] == '/') /* Skip leading '/'. */ 110398: c7 45 94 00 00 00 00 movl $0x0,-0x6c(%ebp) 11039f: b8 01 00 00 00 mov $0x1,%eax ++p; for (first = 1, last = 0; !last ; ++p) { if (p[0] == '\0') 1103a4: 8a 0f mov (%edi),%cl last = 1; 1103a6: 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') 1103ab: 84 c9 test %cl,%cl 1103ad: 74 0b je 1103ba last = 1; else if (p[0] != '/') 1103af: 80 f9 2f cmp $0x2f,%cl 1103b2: 0f 85 c8 00 00 00 jne 110480 1103b8: 30 d2 xor %dl,%dl continue; *p = '\0'; 1103ba: c6 07 00 movb $0x0,(%edi) if (!last && p[1] == '\0') 1103bd: be 01 00 00 00 mov $0x1,%esi 1103c2: 85 d2 test %edx,%edx 1103c4: 75 0b jne 1103d1 1103c6: 31 d2 xor %edx,%edx 1103c8: 80 7f 01 00 cmpb $0x0,0x1(%edi) 1103cc: 0f 94 c2 sete %dl 1103cf: 89 d6 mov %edx,%esi last = 1; if (first) { 1103d1: 85 c0 test %eax,%eax 1103d3: 74 1a je 1103ef * mkdir [-m mode] dir * * We change the user's umask and then restore it, * instead of doing chmod's. */ oumask = umask(0); 1103d5: 83 ec 0c sub $0xc,%esp 1103d8: 6a 00 push $0x0 1103da: e8 75 01 00 00 call 110554 1103df: 89 45 94 mov %eax,-0x6c(%ebp) numask = oumask & ~(S_IWUSR | S_IXUSR); 1103e2: 24 3f and $0x3f,%al (void)umask(numask); 1103e4: 89 04 24 mov %eax,(%esp) 1103e7: e8 68 01 00 00 call 110554 1103ec: 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) { 1103ef: b8 ff 01 00 00 mov $0x1ff,%eax oumask = umask(0); numask = oumask & ~(S_IWUSR | S_IXUSR); (void)umask(numask); first = 0; } if (last) 1103f4: 85 f6 test %esi,%esi 1103f6: 74 11 je 110409 (void)umask(oumask); 1103f8: 83 ec 0c sub $0xc,%esp 1103fb: ff 75 94 pushl -0x6c(%ebp) 1103fe: e8 51 01 00 00 call 110554 110403: 83 c4 10 add $0x10,%esp if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) { 110406: 8b 45 0c mov 0xc(%ebp),%eax 110409: 52 push %edx 11040a: 52 push %edx 11040b: 50 push %eax 11040c: 53 push %ebx 11040d: e8 ce 82 ff ff call 1086e0 110412: 83 c4 10 add $0x10,%esp 110415: 85 c0 test %eax,%eax 110417: 79 5e jns 110477 if (errno == EEXIST || errno == EISDIR) { 110419: e8 06 25 00 00 call 112924 <__errno> 11041e: 83 38 11 cmpl $0x11,(%eax) 110421: 74 0a je 11042d 110423: e8 fc 24 00 00 call 112924 <__errno> 110428: 83 38 15 cmpl $0x15,(%eax) 11042b: 75 59 jne 110486 <== ALWAYS TAKEN if (stat(path, &sb) < 0) { 11042d: 50 push %eax 11042e: 50 push %eax 11042f: 8d 45 a0 lea -0x60(%ebp),%eax 110432: 50 push %eax 110433: 53 push %ebx 110434: e8 8b 00 00 00 call 1104c4 110439: 83 c4 10 add $0x10,%esp 11043c: 85 c0 test %eax,%eax 11043e: 78 46 js 110486 <== NEVER TAKEN retval = 0; break; } else if (!S_ISDIR(sb.st_mode)) { 110440: 8b 45 ac mov -0x54(%ebp),%eax 110443: 25 00 f0 00 00 and $0xf000,%eax 110448: 3d 00 40 00 00 cmp $0x4000,%eax 11044d: 74 22 je 110471 if (last) 11044f: 85 f6 test %esi,%esi 110451: 74 0f je 110462 errno = EEXIST; 110453: e8 cc 24 00 00 call 112924 <__errno> 110458: c7 00 11 00 00 00 movl $0x11,(%eax) else errno = ENOTDIR; retval = 0; 11045e: 31 ff xor %edi,%edi 110460: eb 38 jmp 11049a break; } else if (!S_ISDIR(sb.st_mode)) { if (last) errno = EEXIST; else errno = ENOTDIR; 110462: e8 bd 24 00 00 call 112924 <__errno> 110467: c7 00 14 00 00 00 movl $0x14,(%eax) retval = 0; 11046d: 31 ff xor %edi,%edi 11046f: eb 1b jmp 11048c break; } if (last) 110471: 85 f6 test %esi,%esi 110473: 75 3e jne 1104b3 110475: eb 04 jmp 11047b } else { retval = 0; break; } } if (!last) 110477: 85 f6 test %esi,%esi 110479: 75 3f jne 1104ba *p = '/'; 11047b: c6 07 2f movb $0x2f,(%edi) 11047e: 31 c0 xor %eax,%eax p = path; oumask = 0; retval = 1; if (p[0] == '/') /* Skip leading '/'. */ ++p; for (first = 1, last = 0; !last ; ++p) { 110480: 47 inc %edi 110481: e9 1e ff ff ff jmp 1103a4 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; 110486: 31 ff xor %edi,%edi } } if (!last) *p = '/'; } if (!first && !last) 110488: 85 f6 test %esi,%esi 11048a: 75 0e jne 11049a <== ALWAYS TAKEN (void)umask(oumask); 11048c: 83 ec 0c sub $0xc,%esp 11048f: ff 75 94 pushl -0x6c(%ebp) 110492: e8 bd 00 00 00 call 110554 110497: 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); 11049a: 83 ec 0c sub $0xc,%esp 11049d: 53 push %ebx 11049e: e8 e1 7c ff ff call 108184 } return success != 0 ? 0 : -1; 1104a3: 83 c4 10 add $0x10,%esp 1104a6: 83 ff 01 cmp $0x1,%edi 1104a9: 19 c0 sbb %eax,%eax } 1104ab: 8d 65 f4 lea -0xc(%ebp),%esp 1104ae: 5b pop %ebx 1104af: 5e pop %esi 1104b0: 5f pop %edi 1104b1: c9 leave 1104b2: c3 ret errno = ENOTDIR; retval = 0; break; } if (last) retval = 2; 1104b3: bf 02 00 00 00 mov $0x2,%edi 1104b8: eb e0 jmp 11049a } else { retval = 0; break; } } if (!last) 1104ba: bf 01 00 00 00 mov $0x1,%edi 1104bf: eb d9 jmp 11049a =============================================================================== 001147ec : uint32_t length, uint32_t buffer_size, rtems_attribute attribute_set, rtems_id *id ) { 1147ec: 55 push %ebp 1147ed: 89 e5 mov %esp,%ebp 1147ef: 57 push %edi 1147f0: 56 push %esi 1147f1: 53 push %ebx 1147f2: 83 ec 1c sub $0x1c,%esp 1147f5: 8b 75 0c mov 0xc(%ebp),%esi 1147f8: 8b 55 10 mov 0x10(%ebp),%edx 1147fb: 8b 7d 14 mov 0x14(%ebp),%edi register Partition_Control *the_partition; if ( !rtems_is_name_valid( name ) ) return RTEMS_INVALID_NAME; 1147fe: b8 03 00 00 00 mov $0x3,%eax rtems_id *id ) { register Partition_Control *the_partition; if ( !rtems_is_name_valid( name ) ) 114803: 83 7d 08 00 cmpl $0x0,0x8(%ebp) 114807: 0f 84 ce 00 00 00 je 1148db return RTEMS_INVALID_NAME; if ( !starting_address ) return RTEMS_INVALID_ADDRESS; 11480d: b0 09 mov $0x9,%al register Partition_Control *the_partition; if ( !rtems_is_name_valid( name ) ) return RTEMS_INVALID_NAME; if ( !starting_address ) 11480f: 85 f6 test %esi,%esi 114811: 0f 84 c4 00 00 00 je 1148db return RTEMS_INVALID_ADDRESS; if ( !id ) 114817: 83 7d 1c 00 cmpl $0x0,0x1c(%ebp) 11481b: 0f 84 ba 00 00 00 je 1148db <== NEVER TAKEN return RTEMS_INVALID_ADDRESS; if ( length == 0 || buffer_size == 0 || length < buffer_size || 114821: 85 ff test %edi,%edi 114823: 0f 84 ad 00 00 00 je 1148d6 114829: 85 d2 test %edx,%edx 11482b: 0f 84 a5 00 00 00 je 1148d6 !_Partition_Is_buffer_size_aligned( buffer_size ) ) return RTEMS_INVALID_SIZE; 114831: b0 08 mov $0x8,%al return RTEMS_INVALID_ADDRESS; if ( !id ) return RTEMS_INVALID_ADDRESS; if ( length == 0 || buffer_size == 0 || length < buffer_size || 114833: 39 fa cmp %edi,%edx 114835: 0f 82 a0 00 00 00 jb 1148db 11483b: f7 c7 03 00 00 00 test $0x3,%edi 114841: 0f 85 94 00 00 00 jne 1148db !_Partition_Is_buffer_size_aligned( buffer_size ) ) return RTEMS_INVALID_SIZE; if ( !_Addresses_Is_aligned( starting_address ) ) return RTEMS_INVALID_ADDRESS; 114847: 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 ) ) 114849: f7 c6 03 00 00 00 test $0x3,%esi 11484f: 0f 85 86 00 00 00 jne 1148db 114855: a1 14 ef 13 00 mov 0x13ef14,%eax 11485a: 40 inc %eax 11485b: a3 14 ef 13 00 mov %eax,0x13ef14 * 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 ); 114860: 83 ec 0c sub $0xc,%esp 114863: 68 a4 ed 13 00 push $0x13eda4 114868: 89 55 e4 mov %edx,-0x1c(%ebp) 11486b: e8 14 3e 00 00 call 118684 <_Objects_Allocate> 114870: 89 c3 mov %eax,%ebx _Thread_Disable_dispatch(); /* prevents deletion */ the_partition = _Partition_Allocate(); if ( !the_partition ) { 114872: 83 c4 10 add $0x10,%esp 114875: 85 c0 test %eax,%eax 114877: 8b 55 e4 mov -0x1c(%ebp),%edx 11487a: 75 0c jne 114888 _Thread_Enable_dispatch(); 11487c: e8 11 4d 00 00 call 119592 <_Thread_Enable_dispatch> return RTEMS_TOO_MANY; 114881: b8 05 00 00 00 mov $0x5,%eax 114886: eb 53 jmp 1148db _Thread_Enable_dispatch(); return RTEMS_TOO_MANY; } #endif the_partition->starting_address = starting_address; 114888: 89 70 10 mov %esi,0x10(%eax) the_partition->length = length; 11488b: 89 50 14 mov %edx,0x14(%eax) the_partition->buffer_size = buffer_size; 11488e: 89 78 18 mov %edi,0x18(%eax) the_partition->attribute_set = attribute_set; 114891: 8b 45 18 mov 0x18(%ebp),%eax 114894: 89 43 1c mov %eax,0x1c(%ebx) the_partition->number_of_used_blocks = 0; 114897: c7 43 20 00 00 00 00 movl $0x0,0x20(%ebx) _Chain_Initialize( &the_partition->Memory, starting_address, 11489e: 57 push %edi 11489f: 89 d0 mov %edx,%eax 1148a1: 31 d2 xor %edx,%edx 1148a3: f7 f7 div %edi 1148a5: 50 push %eax 1148a6: 56 push %esi 1148a7: 8d 43 24 lea 0x24(%ebx),%eax 1148aa: 50 push %eax 1148ab: e8 84 2a 00 00 call 117334 <_Chain_Initialize> Objects_Name name ) { _Objects_Set_local_object( information, _Objects_Get_index( the_object->id ), 1148b0: 8b 43 08 mov 0x8(%ebx),%eax Objects_Information *information, Objects_Control *the_object, Objects_Name name ) { _Objects_Set_local_object( 1148b3: 0f b7 c8 movzwl %ax,%ecx #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 1148b6: 8b 15 c0 ed 13 00 mov 0x13edc0,%edx 1148bc: 89 1c 8a mov %ebx,(%edx,%ecx,4) information, _Objects_Get_index( the_object->id ), the_object ); the_object->name = name; 1148bf: 8b 55 08 mov 0x8(%ebp),%edx 1148c2: 89 53 0c mov %edx,0xc(%ebx) &_Partition_Information, &the_partition->Object, (Objects_Name) name ); *id = the_partition->Object.id; 1148c5: 8b 55 1c mov 0x1c(%ebp),%edx 1148c8: 89 02 mov %eax,(%edx) name, 0 /* Not used */ ); #endif _Thread_Enable_dispatch(); 1148ca: e8 c3 4c 00 00 call 119592 <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 1148cf: 83 c4 10 add $0x10,%esp 1148d2: 31 c0 xor %eax,%eax 1148d4: eb 05 jmp 1148db 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; 1148d6: b8 08 00 00 00 mov $0x8,%eax ); #endif _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } 1148db: 8d 65 f4 lea -0xc(%ebp),%esp 1148de: 5b pop %ebx 1148df: 5e pop %esi 1148e0: 5f pop %edi 1148e1: c9 leave 1148e2: c3 ret =============================================================================== 0010b031 : rtems_status_code rtems_rate_monotonic_period( rtems_id id, rtems_interval length ) { 10b031: 55 push %ebp 10b032: 89 e5 mov %esp,%ebp 10b034: 57 push %edi 10b035: 56 push %esi 10b036: 53 push %ebx 10b037: 83 ec 30 sub $0x30,%esp 10b03a: 8b 75 08 mov 0x8(%ebp),%esi 10b03d: 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 ); 10b040: 8d 45 e4 lea -0x1c(%ebp),%eax Objects_Id id, Objects_Locations *location ) { return (Rate_monotonic_Control *) _Objects_Get( &_Rate_monotonic_Information, id, location ); 10b043: 50 push %eax 10b044: 56 push %esi 10b045: 68 74 83 12 00 push $0x128374 10b04a: e8 39 1e 00 00 call 10ce88 <_Objects_Get> 10b04f: 89 c7 mov %eax,%edi switch ( location ) { 10b051: 83 c4 10 add $0x10,%esp 10b054: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) 10b058: 0f 85 3b 01 00 00 jne 10b199 <== NEVER TAKEN case OBJECTS_LOCAL: if ( !_Thread_Is_executing( the_period->owner ) ) { 10b05e: a1 8c 89 12 00 mov 0x12898c,%eax 10b063: 39 47 40 cmp %eax,0x40(%edi) 10b066: 74 0f je 10b077 _Thread_Enable_dispatch(); 10b068: e8 c1 28 00 00 call 10d92e <_Thread_Enable_dispatch> return RTEMS_NOT_OWNER_OF_RESOURCE; 10b06d: be 17 00 00 00 mov $0x17,%esi 10b072: e9 27 01 00 00 jmp 10b19e } if ( length == RTEMS_PERIOD_STATUS ) { 10b077: 85 db test %ebx,%ebx 10b079: 75 1b jne 10b096 switch ( the_period->state ) { 10b07b: 8b 47 38 mov 0x38(%edi),%eax 10b07e: 31 f6 xor %esi,%esi 10b080: 83 f8 04 cmp $0x4,%eax 10b083: 77 07 ja 10b08c <== NEVER TAKEN 10b085: 8b 34 85 e0 15 12 00 mov 0x1215e0(,%eax,4),%esi case RATE_MONOTONIC_ACTIVE: default: /* unreached -- only to remove warnings */ return_value = RTEMS_SUCCESSFUL; break; } _Thread_Enable_dispatch(); 10b08c: e8 9d 28 00 00 call 10d92e <_Thread_Enable_dispatch> return( return_value ); 10b091: e9 08 01 00 00 jmp 10b19e } _ISR_Disable( level ); 10b096: 9c pushf 10b097: fa cli 10b098: 8f 45 d4 popl -0x2c(%ebp) if ( the_period->state == RATE_MONOTONIC_INACTIVE ) { 10b09b: 8b 47 38 mov 0x38(%edi),%eax 10b09e: 85 c0 test %eax,%eax 10b0a0: 75 4c jne 10b0ee _ISR_Enable( level ); 10b0a2: ff 75 d4 pushl -0x2c(%ebp) 10b0a5: 9d popf /* * Baseline statistics information for the beginning of a period. */ _Rate_monotonic_Initiate_statistics( the_period ); 10b0a6: 83 ec 0c sub $0xc,%esp 10b0a9: 57 push %edi 10b0aa: e8 3f fe ff ff call 10aeee <_Rate_monotonic_Initiate_statistics> the_period->state = RATE_MONOTONIC_ACTIVE; 10b0af: 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; 10b0b6: c7 47 18 00 00 00 00 movl $0x0,0x18(%edi) the_watchdog->routine = routine; 10b0bd: c7 47 2c a8 b3 10 00 movl $0x10b3a8,0x2c(%edi) the_watchdog->id = id; 10b0c4: 89 77 30 mov %esi,0x30(%edi) the_watchdog->user_data = user_data; 10b0c7: c7 47 34 00 00 00 00 movl $0x0,0x34(%edi) _Rate_monotonic_Timeout, id, NULL ); the_period->next_length = length; 10b0ce: 89 5f 3c mov %ebx,0x3c(%edi) Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 10b0d1: 89 5f 1c mov %ebx,0x1c(%edi) _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 10b0d4: 58 pop %eax 10b0d5: 5a pop %edx _Watchdog_Insert_ticks( &the_period->Timer, length ); 10b0d6: 83 c7 10 add $0x10,%edi 10b0d9: 57 push %edi 10b0da: 68 28 85 12 00 push $0x128528 10b0df: e8 58 35 00 00 call 10e63c <_Watchdog_Insert> _Thread_Enable_dispatch(); 10b0e4: e8 45 28 00 00 call 10d92e <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 10b0e9: 83 c4 10 add $0x10,%esp 10b0ec: eb 65 jmp 10b153 } if ( the_period->state == RATE_MONOTONIC_ACTIVE ) { 10b0ee: 83 f8 02 cmp $0x2,%eax 10b0f1: 75 64 jne 10b157 /* * Update statistics from the concluding period. */ _Rate_monotonic_Update_statistics( the_period ); 10b0f3: 83 ec 0c sub $0xc,%esp 10b0f6: 57 push %edi 10b0f7: e8 5a fe ff ff call 10af56 <_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; 10b0fc: c7 47 38 01 00 00 00 movl $0x1,0x38(%edi) the_period->next_length = length; 10b103: 89 5f 3c mov %ebx,0x3c(%edi) _ISR_Enable( level ); 10b106: ff 75 d4 pushl -0x2c(%ebp) 10b109: 9d popf _Thread_Executing->Wait.id = the_period->Object.id; 10b10a: a1 8c 89 12 00 mov 0x12898c,%eax 10b10f: 8b 57 08 mov 0x8(%edi),%edx 10b112: 89 50 20 mov %edx,0x20(%eax) _Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); 10b115: 5b pop %ebx 10b116: 5e pop %esi 10b117: 68 00 40 00 00 push $0x4000 10b11c: 50 push %eax 10b11d: e8 7a 2f 00 00 call 10e09c <_Thread_Set_state> /* * Did the watchdog timer expire while we were actually blocking * on it? */ _ISR_Disable( level ); 10b122: 9c pushf 10b123: fa cli 10b124: 5a pop %edx local_state = the_period->state; 10b125: 8b 47 38 mov 0x38(%edi),%eax the_period->state = RATE_MONOTONIC_ACTIVE; 10b128: c7 47 38 02 00 00 00 movl $0x2,0x38(%edi) _ISR_Enable( level ); 10b12f: 52 push %edx 10b130: 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 ) 10b131: 83 c4 10 add $0x10,%esp 10b134: 83 f8 03 cmp $0x3,%eax 10b137: 75 15 jne 10b14e _Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); 10b139: 51 push %ecx 10b13a: 51 push %ecx 10b13b: 68 00 40 00 00 push $0x4000 10b140: ff 35 8c 89 12 00 pushl 0x12898c 10b146: e8 cd 24 00 00 call 10d618 <_Thread_Clear_state> 10b14b: 83 c4 10 add $0x10,%esp _Thread_Enable_dispatch(); 10b14e: e8 db 27 00 00 call 10d92e <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 10b153: 31 f6 xor %esi,%esi 10b155: eb 47 jmp 10b19e #endif case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 10b157: be 04 00 00 00 mov $0x4,%esi _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } if ( the_period->state == RATE_MONOTONIC_EXPIRED ) { 10b15c: 83 f8 04 cmp $0x4,%eax 10b15f: 75 3d jne 10b19e <== NEVER TAKEN /* * Update statistics from the concluding period */ _Rate_monotonic_Update_statistics( the_period ); 10b161: 83 ec 0c sub $0xc,%esp 10b164: 57 push %edi 10b165: e8 ec fd ff ff call 10af56 <_Rate_monotonic_Update_statistics> _ISR_Enable( level ); 10b16a: ff 75 d4 pushl -0x2c(%ebp) 10b16d: 9d popf the_period->state = RATE_MONOTONIC_ACTIVE; 10b16e: c7 47 38 02 00 00 00 movl $0x2,0x38(%edi) the_period->next_length = length; 10b175: 89 5f 3c mov %ebx,0x3c(%edi) Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 10b178: 89 5f 1c mov %ebx,0x1c(%edi) _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 10b17b: 58 pop %eax 10b17c: 5a pop %edx _Watchdog_Insert_ticks( &the_period->Timer, length ); 10b17d: 83 c7 10 add $0x10,%edi 10b180: 57 push %edi 10b181: 68 28 85 12 00 push $0x128528 10b186: e8 b1 34 00 00 call 10e63c <_Watchdog_Insert> _Thread_Enable_dispatch(); 10b18b: e8 9e 27 00 00 call 10d92e <_Thread_Enable_dispatch> return RTEMS_TIMEOUT; 10b190: 83 c4 10 add $0x10,%esp 10b193: 66 be 06 00 mov $0x6,%si 10b197: eb 05 jmp 10b19e #endif case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 10b199: be 04 00 00 00 mov $0x4,%esi } 10b19e: 89 f0 mov %esi,%eax 10b1a0: 8d 65 f4 lea -0xc(%ebp),%esp 10b1a3: 5b pop %ebx 10b1a4: 5e pop %esi 10b1a5: 5f pop %edi 10b1a6: c9 leave 10b1a7: c3 ret =============================================================================== 0010b1a8 : */ void rtems_rate_monotonic_report_statistics_with_plugin( void *context, rtems_printk_plugin_t print ) { 10b1a8: 55 push %ebp 10b1a9: 89 e5 mov %esp,%ebp 10b1ab: 57 push %edi 10b1ac: 56 push %esi 10b1ad: 53 push %ebx 10b1ae: 83 ec 7c sub $0x7c,%esp 10b1b1: 8b 5d 08 mov 0x8(%ebp),%ebx 10b1b4: 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 ) 10b1b7: 85 ff test %edi,%edi 10b1b9: 0f 84 2b 01 00 00 je 10b2ea <== NEVER TAKEN return; (*print)( context, "Period information by period\n" ); 10b1bf: 52 push %edx 10b1c0: 52 push %edx 10b1c1: 68 f4 15 12 00 push $0x1215f4 10b1c6: 53 push %ebx 10b1c7: ff d7 call *%edi #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ (*print)( context, "--- CPU times are in seconds ---\n" ); 10b1c9: 5e pop %esi 10b1ca: 58 pop %eax 10b1cb: 68 12 16 12 00 push $0x121612 10b1d0: 53 push %ebx 10b1d1: ff d7 call *%edi (*print)( context, "--- Wall times are in seconds ---\n" ); 10b1d3: 5a pop %edx 10b1d4: 59 pop %ecx 10b1d5: 68 34 16 12 00 push $0x121634 10b1da: 53 push %ebx 10b1db: ff d7 call *%edi Be sure to test the various cases. (*print)( context,"\ 1234567890123456789012345678901234567890123456789012345678901234567890123456789\ \n"); */ (*print)( context, " ID OWNER COUNT MISSED " 10b1dd: 5e pop %esi 10b1de: 58 pop %eax 10b1df: 68 57 16 12 00 push $0x121657 10b1e4: 53 push %ebx 10b1e5: ff d7 call *%edi #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ " " #endif " WALL TIME\n" ); (*print)( context, " " 10b1e7: 5a pop %edx 10b1e8: 59 pop %ecx 10b1e9: 68 a2 16 12 00 push $0x1216a2 10b1ee: 53 push %ebx 10b1ef: 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 ; 10b1f1: 8b 35 7c 83 12 00 mov 0x12837c,%esi 10b1f7: 83 c4 10 add $0x10,%esp 10b1fa: e9 df 00 00 00 jmp 10b2de id <= _Rate_monotonic_Information.maximum_id ; id++ ) { status = rtems_rate_monotonic_get_statistics( id, &the_stats ); 10b1ff: 50 push %eax 10b200: 50 push %eax 10b201: 8d 45 88 lea -0x78(%ebp),%eax 10b204: 50 push %eax 10b205: 56 push %esi 10b206: e8 b5 56 00 00 call 1108c0 if ( status != RTEMS_SUCCESSFUL ) 10b20b: 83 c4 10 add $0x10,%esp 10b20e: 85 c0 test %eax,%eax 10b210: 0f 85 c7 00 00 00 jne 10b2dd #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 ); 10b216: 51 push %ecx 10b217: 51 push %ecx 10b218: 8d 55 c0 lea -0x40(%ebp),%edx 10b21b: 52 push %edx 10b21c: 56 push %esi 10b21d: e8 42 57 00 00 call 110964 #endif rtems_object_get_name( the_status.owner, sizeof(name), name ); 10b222: 83 c4 0c add $0xc,%esp 10b225: 8d 45 e3 lea -0x1d(%ebp),%eax 10b228: 50 push %eax 10b229: 6a 05 push $0x5 10b22b: ff 75 c0 pushl -0x40(%ebp) 10b22e: e8 01 02 00 00 call 10b434 /* * Print part of report line that is not dependent on granularity */ (*print)( context, 10b233: 58 pop %eax 10b234: 5a pop %edx 10b235: ff 75 8c pushl -0x74(%ebp) 10b238: ff 75 88 pushl -0x78(%ebp) 10b23b: 8d 55 e3 lea -0x1d(%ebp),%edx 10b23e: 52 push %edx 10b23f: 56 push %esi 10b240: 68 ee 16 12 00 push $0x1216ee 10b245: 53 push %ebx 10b246: ff d7 call *%edi ); /* * If the count is zero, don't print statistics */ if (the_stats.count == 0) { 10b248: 8b 45 88 mov -0x78(%ebp),%eax 10b24b: 83 c4 20 add $0x20,%esp 10b24e: 85 c0 test %eax,%eax 10b250: 75 0f jne 10b261 (*print)( context, "\n" ); 10b252: 51 push %ecx 10b253: 51 push %ecx 10b254: 68 58 19 12 00 push $0x121958 10b259: 53 push %ebx 10b25a: ff d7 call *%edi continue; 10b25c: 83 c4 10 add $0x10,%esp 10b25f: eb 7c jmp 10b2dd 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 ); 10b261: 52 push %edx 10b262: 8d 55 d8 lea -0x28(%ebp),%edx 10b265: 52 push %edx 10b266: 50 push %eax 10b267: 8d 45 a0 lea -0x60(%ebp),%eax 10b26a: 50 push %eax 10b26b: e8 a0 30 00 00 call 10e310 <_Timespec_Divide_by_integer> (*print)( context, 10b270: 8b 45 dc mov -0x24(%ebp),%eax 10b273: b9 e8 03 00 00 mov $0x3e8,%ecx 10b278: 99 cltd 10b279: f7 f9 idiv %ecx 10b27b: 50 push %eax 10b27c: ff 75 d8 pushl -0x28(%ebp) 10b27f: 8b 45 9c mov -0x64(%ebp),%eax 10b282: 99 cltd 10b283: f7 f9 idiv %ecx 10b285: 50 push %eax 10b286: ff 75 98 pushl -0x68(%ebp) 10b289: 8b 45 94 mov -0x6c(%ebp),%eax 10b28c: 99 cltd 10b28d: f7 f9 idiv %ecx 10b28f: 50 push %eax 10b290: ff 75 90 pushl -0x70(%ebp) 10b293: 68 05 17 12 00 push $0x121705 10b298: 53 push %ebx 10b299: 89 4d 84 mov %ecx,-0x7c(%ebp) 10b29c: 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); 10b29e: 83 c4 2c add $0x2c,%esp 10b2a1: 8d 55 d8 lea -0x28(%ebp),%edx 10b2a4: 52 push %edx 10b2a5: 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; 10b2a8: 8d 45 b8 lea -0x48(%ebp),%eax _Timespec_Divide_by_integer(total_wall, the_stats.count, &wall_average); 10b2ab: 50 push %eax 10b2ac: e8 5f 30 00 00 call 10e310 <_Timespec_Divide_by_integer> (*print)( context, 10b2b1: 8b 45 dc mov -0x24(%ebp),%eax 10b2b4: 8b 4d 84 mov -0x7c(%ebp),%ecx 10b2b7: 99 cltd 10b2b8: f7 f9 idiv %ecx 10b2ba: 50 push %eax 10b2bb: ff 75 d8 pushl -0x28(%ebp) 10b2be: 8b 45 b4 mov -0x4c(%ebp),%eax 10b2c1: 99 cltd 10b2c2: f7 f9 idiv %ecx 10b2c4: 50 push %eax 10b2c5: ff 75 b0 pushl -0x50(%ebp) 10b2c8: 8b 45 ac mov -0x54(%ebp),%eax 10b2cb: 99 cltd 10b2cc: f7 f9 idiv %ecx 10b2ce: 50 push %eax 10b2cf: ff 75 a8 pushl -0x58(%ebp) 10b2d2: 68 24 17 12 00 push $0x121724 10b2d7: 53 push %ebx 10b2d8: ff d7 call *%edi 10b2da: 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++ ) { 10b2dd: 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 ; 10b2de: 3b 35 80 83 12 00 cmp 0x128380,%esi 10b2e4: 0f 86 15 ff ff ff jbe 10b1ff the_stats.min_wall_time, the_stats.max_wall_time, ival_wall, fval_wall ); #endif } } } 10b2ea: 8d 65 f4 lea -0xc(%ebp),%esp 10b2ed: 5b pop %ebx 10b2ee: 5e pop %esi 10b2ef: 5f pop %edi 10b2f0: c9 leave 10b2f1: c3 ret =============================================================================== 00115b4c : rtems_status_code rtems_signal_send( rtems_id id, rtems_signal_set signal_set ) { 115b4c: 55 push %ebp 115b4d: 89 e5 mov %esp,%ebp 115b4f: 53 push %ebx 115b50: 83 ec 14 sub $0x14,%esp 115b53: 8b 5d 0c mov 0xc(%ebp),%ebx Objects_Locations location; RTEMS_API_Control *api; ASR_Information *asr; if ( !signal_set ) return RTEMS_INVALID_NUMBER; 115b56: 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 ) 115b5b: 85 db test %ebx,%ebx 115b5d: 74 6d je 115bcc return RTEMS_INVALID_NUMBER; the_thread = _Thread_Get( id, &location ); 115b5f: 50 push %eax 115b60: 50 push %eax 115b61: 8d 45 f4 lea -0xc(%ebp),%eax 115b64: 50 push %eax 115b65: ff 75 08 pushl 0x8(%ebp) 115b68: e8 47 3a 00 00 call 1195b4 <_Thread_Get> switch ( location ) { 115b6d: 83 c4 10 add $0x10,%esp 115b70: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) 115b74: 75 51 jne 115bc7 case OBJECTS_LOCAL: api = the_thread->API_Extensions[ THREAD_API_RTEMS ]; 115b76: 8b 90 e8 00 00 00 mov 0xe8(%eax),%edx asr = &api->Signal; if ( ! _ASR_Is_null_handler( asr->handler ) ) { 115b7c: 83 7a 0c 00 cmpl $0x0,0xc(%edx) 115b80: 74 39 je 115bbb if ( asr->is_enabled ) { 115b82: 80 7a 08 00 cmpb $0x0,0x8(%edx) 115b86: 74 22 je 115baa rtems_signal_set *signal_set ) { ISR_Level _level; _ISR_Disable( _level ); 115b88: 9c pushf 115b89: fa cli 115b8a: 59 pop %ecx *signal_set |= signals; 115b8b: 09 5a 14 or %ebx,0x14(%edx) _ISR_Enable( _level ); 115b8e: 51 push %ecx 115b8f: 9d popf _ASR_Post_signals( signal_set, &asr->signals_posted ); if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) ) 115b90: 83 3d 40 f4 13 00 00 cmpl $0x0,0x13f440 115b97: 74 19 je 115bb2 115b99: 3b 05 44 f4 13 00 cmp 0x13f444,%eax 115b9f: 75 11 jne 115bb2 <== NEVER TAKEN _Thread_Dispatch_necessary = true; 115ba1: c6 05 50 f4 13 00 01 movb $0x1,0x13f450 115ba8: eb 08 jmp 115bb2 rtems_signal_set *signal_set ) { ISR_Level _level; _ISR_Disable( _level ); 115baa: 9c pushf 115bab: fa cli 115bac: 58 pop %eax *signal_set |= signals; 115bad: 09 5a 18 or %ebx,0x18(%edx) _ISR_Enable( _level ); 115bb0: 50 push %eax 115bb1: 9d popf } else { _ASR_Post_signals( signal_set, &asr->signals_pending ); } _Thread_Enable_dispatch(); 115bb2: e8 db 39 00 00 call 119592 <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 115bb7: 31 c0 xor %eax,%eax 115bb9: eb 11 jmp 115bcc } _Thread_Enable_dispatch(); 115bbb: e8 d2 39 00 00 call 119592 <_Thread_Enable_dispatch> return RTEMS_NOT_DEFINED; 115bc0: b8 0b 00 00 00 mov $0xb,%eax 115bc5: eb 05 jmp 115bcc case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 115bc7: b8 04 00 00 00 mov $0x4,%eax } 115bcc: 8b 5d fc mov -0x4(%ebp),%ebx 115bcf: c9 leave 115bd0: c3 ret =============================================================================== 001072b4 : * rtems_stack_checker_Begin_extension */ void rtems_stack_checker_begin_extension( Thread_Control *the_thread ) { 1072b4: 55 push %ebp 1072b5: 89 e5 mov %esp,%ebp 1072b7: 57 push %edi 1072b8: 56 push %esi 1072b9: 8b 45 08 mov 0x8(%ebp),%eax Stack_check_Control *the_pattern; if ( the_thread->Object.id == 0 ) /* skip system tasks */ 1072bc: 83 78 08 00 cmpl $0x0,0x8(%eax) 1072c0: 74 15 je 1072d7 <== NEVER TAKEN return; the_pattern = Stack_check_Get_pattern_area(&the_thread->Start.Initial_stack); *the_pattern = Stack_check_Pattern; 1072c2: 8b b8 bc 00 00 00 mov 0xbc(%eax),%edi 1072c8: 83 c7 08 add $0x8,%edi 1072cb: be 28 72 12 00 mov $0x127228,%esi 1072d0: b9 04 00 00 00 mov $0x4,%ecx 1072d5: f3 a5 rep movsl %ds:(%esi),%es:(%edi) } 1072d7: 5e pop %esi 1072d8: 5f pop %edi 1072d9: c9 leave 1072da: c3 ret =============================================================================== 0010728d : */ bool rtems_stack_checker_create_extension( Thread_Control *running __attribute__((unused)), Thread_Control *the_thread ) { 10728d: 55 push %ebp 10728e: 89 e5 mov %esp,%ebp 107290: 57 push %edi 107291: 8b 7d 0c mov 0xc(%ebp),%edi Stack_check_Initialize(); 107294: e8 8a ff ff ff call 107223 if (the_thread) 107299: 85 ff test %edi,%edi 10729b: 74 12 je 1072af <== NEVER TAKEN Stack_check_Dope_stack(&the_thread->Start.Initial_stack); 10729d: 8b 8f b8 00 00 00 mov 0xb8(%edi),%ecx 1072a3: 8b 97 bc 00 00 00 mov 0xbc(%edi),%edx 1072a9: b0 a5 mov $0xa5,%al 1072ab: 89 d7 mov %edx,%edi 1072ad: f3 aa rep stos %al,%es:(%edi) return true; } 1072af: b0 01 mov $0x1,%al 1072b1: 5f pop %edi 1072b2: c9 leave 1072b3: c3 ret =============================================================================== 001073e8 : /* * Check if blown */ bool rtems_stack_checker_is_blown( void ) { 1073e8: 55 push %ebp 1073e9: 89 e5 mov %esp,%ebp 1073eb: 53 push %ebx 1073ec: 83 ec 04 sub $0x4,%esp Stack_Control *the_stack = &_Thread_Executing->Start.Initial_stack; 1073ef: a1 1c 79 12 00 mov 0x12791c,%eax ) { #if defined(__GNUC__) void *sp = __builtin_frame_address(0); if ( sp < the_stack->area ) { 1073f4: 8b 90 bc 00 00 00 mov 0xbc(%eax),%edx return false; 1073fa: 31 db xor %ebx,%ebx ) { #if defined(__GNUC__) void *sp = __builtin_frame_address(0); if ( sp < the_stack->area ) { 1073fc: 39 d5 cmp %edx,%ebp 1073fe: 72 0e jb 10740e <== NEVER TAKEN return false; } if ( sp > (the_stack->area + the_stack->size) ) { 107400: 8b 80 b8 00 00 00 mov 0xb8(%eax),%eax 107406: 8d 04 02 lea (%edx,%eax,1),%eax } /* * Check if blown */ bool rtems_stack_checker_is_blown( void ) 107409: 39 c5 cmp %eax,%ebp 10740b: 0f 96 c3 setbe %bl { Stack_Control *the_stack = &_Thread_Executing->Start.Initial_stack; bool sp_ok; bool pattern_ok = true; 10740e: b0 01 mov $0x1,%al /* * The stack checker must be initialized before the pattern is there * to check. */ if ( Stack_check_Initialized ) { 107410: 83 3d 18 6f 12 00 00 cmpl $0x0,0x126f18 107417: 74 19 je 107432 <== NEVER TAKEN pattern_ok = (!memcmp( 107419: 83 c2 08 add $0x8,%edx 10741c: 51 push %ecx 10741d: 6a 10 push $0x10 10741f: 68 28 72 12 00 push $0x127228 107424: 52 push %edx 107425: e8 0e cb 00 00 call 113f38 10742a: 83 c4 10 add $0x10,%esp 10742d: 85 c0 test %eax,%eax 10742f: 0f 94 c0 sete %al /* * Let's report as much as we can. */ if ( !sp_ok || !pattern_ok ) { 107432: 84 db test %bl,%bl 107434: 74 04 je 10743a <== NEVER TAKEN 107436: 84 c0 test %al,%al 107438: 75 11 jne 10744b <== ALWAYS TAKEN Stack_check_report_blown_task( _Thread_Executing, pattern_ok ); 10743a: 52 push %edx <== NOT EXECUTED 10743b: 52 push %edx <== NOT EXECUTED 10743c: 0f b6 c0 movzbl %al,%eax <== NOT EXECUTED 10743f: 50 push %eax <== NOT EXECUTED 107440: ff 35 1c 79 12 00 pushl 0x12791c <== NOT EXECUTED 107446: e8 90 fe ff ff call 1072db <== NOT EXECUTED /* * The Stack Pointer and the Pattern Area are OK so return false. */ return false; } 10744b: 31 c0 xor %eax,%eax 10744d: 8b 5d fc mov -0x4(%ebp),%ebx 107450: c9 leave 107451: c3 ret =============================================================================== 001074b7 : void rtems_stack_checker_report_usage( void ) { 1074b7: 55 push %ebp <== NOT EXECUTED 1074b8: 89 e5 mov %esp,%ebp <== NOT EXECUTED 1074ba: 83 ec 10 sub $0x10,%esp <== NOT EXECUTED rtems_stack_checker_report_usage_with_plugin( NULL, printk_plugin ); 1074bd: 68 1c 8c 10 00 push $0x108c1c <== NOT EXECUTED 1074c2: 6a 00 push $0x0 <== NOT EXECUTED 1074c4: e8 89 ff ff ff call 107452 <== NOT EXECUTED 1074c9: 83 c4 10 add $0x10,%esp <== NOT EXECUTED } 1074cc: c9 leave <== NOT EXECUTED 1074cd: c3 ret <== NOT EXECUTED =============================================================================== 00107452 : void rtems_stack_checker_report_usage_with_plugin( void *context, rtems_printk_plugin_t print ) { 107452: 55 push %ebp <== NOT EXECUTED 107453: 89 e5 mov %esp,%ebp <== NOT EXECUTED 107455: 56 push %esi <== NOT EXECUTED 107456: 53 push %ebx <== NOT EXECUTED 107457: 8b 75 08 mov 0x8(%ebp),%esi <== NOT EXECUTED 10745a: 8b 5d 0c mov 0xc(%ebp),%ebx <== NOT EXECUTED if ( !print ) 10745d: 85 db test %ebx,%ebx <== NOT EXECUTED 10745f: 74 4f je 1074b0 <== NOT EXECUTED return; print_context = context; 107461: 89 35 10 6f 12 00 mov %esi,0x126f10 <== NOT EXECUTED print_handler = print; 107467: 89 1d 14 6f 12 00 mov %ebx,0x126f14 <== NOT EXECUTED (*print)( context, "Stack usage by thread\n"); 10746d: 51 push %ecx <== NOT EXECUTED 10746e: 51 push %ecx <== NOT EXECUTED 10746f: 68 c7 16 12 00 push $0x1216c7 <== NOT EXECUTED 107474: 56 push %esi <== NOT EXECUTED 107475: ff d3 call *%ebx <== NOT EXECUTED (*print)( context, 107477: 58 pop %eax <== NOT EXECUTED 107478: 5a pop %edx <== NOT EXECUTED 107479: 68 de 16 12 00 push $0x1216de <== NOT EXECUTED 10747e: 56 push %esi <== NOT EXECUTED 10747f: 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 ); 107481: c7 04 24 08 71 10 00 movl $0x107108,(%esp) <== NOT EXECUTED 107488: e8 df 63 00 00 call 10d86c <== NOT EXECUTED #if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) /* dump interrupt stack info if any */ Stack_check_Dump_threads_usage((Thread_Control *) -1); 10748d: c7 04 24 ff ff ff ff movl $0xffffffff,(%esp) <== NOT EXECUTED 107494: e8 6f fc ff ff call 107108 <== NOT EXECUTED #endif print_context = NULL; 107499: c7 05 10 6f 12 00 00 movl $0x0,0x126f10 <== NOT EXECUTED 1074a0: 00 00 00 print_handler = NULL; 1074a3: c7 05 14 6f 12 00 00 movl $0x0,0x126f14 <== NOT EXECUTED 1074aa: 00 00 00 1074ad: 83 c4 10 add $0x10,%esp <== NOT EXECUTED } 1074b0: 8d 65 f8 lea -0x8(%ebp),%esp <== NOT EXECUTED 1074b3: 5b pop %ebx <== NOT EXECUTED 1074b4: 5e pop %esi <== NOT EXECUTED 1074b5: c9 leave <== NOT EXECUTED 1074b6: c3 ret <== NOT EXECUTED =============================================================================== 0010738f : */ void rtems_stack_checker_switch_extension( Thread_Control *running __attribute__((unused)), Thread_Control *heir __attribute__((unused)) ) { 10738f: 55 push %ebp 107390: 89 e5 mov %esp,%ebp 107392: 53 push %ebx 107393: 83 ec 14 sub $0x14,%esp 107396: 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); 107399: 8b 83 bc 00 00 00 mov 0xbc(%ebx),%eax 10739f: 8d 48 08 lea 0x8(%eax),%ecx { #if defined(__GNUC__) void *sp = __builtin_frame_address(0); if ( sp < the_stack->area ) { return false; 1073a2: 31 d2 xor %edx,%edx ) { #if defined(__GNUC__) void *sp = __builtin_frame_address(0); if ( sp < the_stack->area ) { 1073a4: 39 c5 cmp %eax,%ebp 1073a6: 72 0b jb 1073b3 <== NEVER TAKEN return false; } if ( sp > (the_stack->area + the_stack->size) ) { 1073a8: 03 83 b8 00 00 00 add 0xb8(%ebx),%eax } /* * rtems_stack_checker_switch_extension */ void rtems_stack_checker_switch_extension( 1073ae: 39 c5 cmp %eax,%ebp 1073b0: 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, 1073b3: 50 push %eax 1073b4: 6a 10 push $0x10 1073b6: 68 28 72 12 00 push $0x127228 1073bb: 51 push %ecx 1073bc: 88 55 f4 mov %dl,-0xc(%ebp) 1073bf: e8 74 cb 00 00 call 113f38 1073c4: 83 c4 10 add $0x10,%esp 1073c7: 85 c0 test %eax,%eax 1073c9: 0f 94 c0 sete %al (void *) Stack_check_Pattern.pattern, PATTERN_SIZE_BYTES)); if ( !sp_ok || !pattern_ok ) { 1073cc: 8a 55 f4 mov -0xc(%ebp),%dl 1073cf: 84 d2 test %dl,%dl 1073d1: 74 04 je 1073d7 <== NEVER TAKEN 1073d3: 84 c0 test %al,%al 1073d5: 75 0c jne 1073e3 <== ALWAYS TAKEN Stack_check_report_blown_task( running, pattern_ok ); 1073d7: 52 push %edx <== NOT EXECUTED 1073d8: 52 push %edx <== NOT EXECUTED 1073d9: 0f b6 c0 movzbl %al,%eax <== NOT EXECUTED 1073dc: 50 push %eax <== NOT EXECUTED 1073dd: 53 push %ebx <== NOT EXECUTED 1073de: e8 f8 fe ff ff call 1072db <== NOT EXECUTED } } 1073e3: 8b 5d fc mov -0x4(%ebp),%ebx 1073e6: c9 leave 1073e7: c3 ret =============================================================================== 0010f010 : rtems_status_code rtems_string_to_double ( const char *s, double *n, char **endptr ) { 10f010: 55 push %ebp 10f011: 89 e5 mov %esp,%ebp 10f013: 57 push %edi 10f014: 56 push %esi 10f015: 53 push %ebx 10f016: 83 ec 2c sub $0x2c,%esp 10f019: 8b 75 08 mov 0x8(%ebp),%esi 10f01c: 8b 5d 0c mov 0xc(%ebp),%ebx 10f01f: 8b 7d 10 mov 0x10(%ebp),%edi double result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 10f022: ba 09 00 00 00 mov $0x9,%edx ) { double result; char *end; if ( !n ) 10f027: 85 db test %ebx,%ebx 10f029: 0f 84 95 00 00 00 je 10f0c4 return RTEMS_INVALID_ADDRESS; errno = 0; 10f02f: e8 48 2a 00 00 call 111a7c <__errno> 10f034: c7 00 00 00 00 00 movl $0x0,(%eax) *n = 0; 10f03a: c7 03 00 00 00 00 movl $0x0,(%ebx) 10f040: c7 43 04 00 00 00 00 movl $0x0,0x4(%ebx) result = strtod( s, &end ); 10f047: 50 push %eax 10f048: 50 push %eax 10f049: 8d 45 e4 lea -0x1c(%ebp),%eax 10f04c: 50 push %eax 10f04d: 56 push %esi 10f04e: e8 d5 54 00 00 call 114528 if ( endptr ) 10f053: 83 c4 10 add $0x10,%esp 10f056: 85 ff test %edi,%edi 10f058: 74 05 je 10f05f *endptr = end; 10f05a: 8b 45 e4 mov -0x1c(%ebp),%eax 10f05d: 89 07 mov %eax,(%edi) if ( end == s ) return RTEMS_NOT_DEFINED; 10f05f: ba 0b 00 00 00 mov $0xb,%edx result = strtod( s, &end ); if ( endptr ) *endptr = end; if ( end == s ) 10f064: 39 75 e4 cmp %esi,-0x1c(%ebp) 10f067: 74 4d je 10f0b6 return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && 10f069: dd 5d c8 fstpl -0x38(%ebp) 10f06c: e8 0b 2a 00 00 call 111a7c <__errno> 10f071: 83 38 22 cmpl $0x22,(%eax) 10f074: dd 45 c8 fldl -0x38(%ebp) 10f077: 75 37 jne 10f0b0 10f079: d9 ee fldz 10f07b: d9 c9 fxch %st(1) 10f07d: dd e1 fucom %st(1) 10f07f: df e0 fnstsw %ax 10f081: dd d9 fstp %st(1) 10f083: 9e sahf 10f084: 7a 07 jp 10f08d <== NEVER TAKEN (( result == 0 ) || ( result == HUGE_VAL ) || ( result == -HUGE_VAL ))) return RTEMS_INVALID_NUMBER; 10f086: ba 0a 00 00 00 mov $0xa,%edx *endptr = end; if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && 10f08b: 74 2d je 10f0ba <== NEVER TAKEN (( result == 0 ) || ( result == HUGE_VAL ) || ( result == -HUGE_VAL ))) return RTEMS_INVALID_NUMBER; 10f08d: 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 ))) 10f092: dd 05 80 3d 12 00 fldl 0x123d80 10f098: d9 c9 fxch %st(1) 10f09a: dd e1 fucom %st(1) 10f09c: df e0 fnstsw %ax 10f09e: dd d9 fstp %st(1) 10f0a0: 9e sahf 10f0a1: 77 1b ja 10f0be <== ALWAYS TAKEN 10f0a3: dd 05 88 3d 12 00 fldl 0x123d88 <== NOT EXECUTED 10f0a9: dd e9 fucomp %st(1) <== NOT EXECUTED 10f0ab: df e0 fnstsw %ax <== NOT EXECUTED 10f0ad: 9e sahf <== NOT EXECUTED 10f0ae: 77 12 ja 10f0c2 <== NOT EXECUTED return RTEMS_INVALID_NUMBER; *n = result; 10f0b0: dd 1b fstpl (%ebx) return RTEMS_SUCCESSFUL; 10f0b2: 31 d2 xor %edx,%edx 10f0b4: eb 0e jmp 10f0c4 10f0b6: dd d8 fstp %st(0) 10f0b8: eb 0a jmp 10f0c4 10f0ba: dd d8 fstp %st(0) <== NOT EXECUTED 10f0bc: eb 06 jmp 10f0c4 <== NOT EXECUTED 10f0be: dd d8 fstp %st(0) 10f0c0: eb 02 jmp 10f0c4 10f0c2: dd d8 fstp %st(0) <== NOT EXECUTED } 10f0c4: 89 d0 mov %edx,%eax 10f0c6: 8d 65 f4 lea -0xc(%ebp),%esp 10f0c9: 5b pop %ebx 10f0ca: 5e pop %esi 10f0cb: 5f pop %edi 10f0cc: c9 leave 10f0cd: c3 ret =============================================================================== 0010f0d0 : rtems_status_code rtems_string_to_float ( const char *s, float *n, char **endptr ) { 10f0d0: 55 push %ebp 10f0d1: 89 e5 mov %esp,%ebp 10f0d3: 57 push %edi 10f0d4: 56 push %esi 10f0d5: 53 push %ebx 10f0d6: 83 ec 2c sub $0x2c,%esp 10f0d9: 8b 75 08 mov 0x8(%ebp),%esi 10f0dc: 8b 5d 0c mov 0xc(%ebp),%ebx 10f0df: 8b 7d 10 mov 0x10(%ebp),%edi float result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 10f0e2: ba 09 00 00 00 mov $0x9,%edx ) { float result; char *end; if ( !n ) 10f0e7: 85 db test %ebx,%ebx 10f0e9: 0f 84 8e 00 00 00 je 10f17d return RTEMS_INVALID_ADDRESS; errno = 0; 10f0ef: e8 88 29 00 00 call 111a7c <__errno> 10f0f4: c7 00 00 00 00 00 movl $0x0,(%eax) *n = 0; 10f0fa: c7 03 00 00 00 00 movl $0x0,(%ebx) result = strtof( s, &end ); 10f100: 50 push %eax 10f101: 50 push %eax 10f102: 8d 45 e4 lea -0x1c(%ebp),%eax 10f105: 50 push %eax 10f106: 56 push %esi 10f107: e8 38 54 00 00 call 114544 if ( endptr ) 10f10c: 83 c4 10 add $0x10,%esp 10f10f: 85 ff test %edi,%edi 10f111: 74 05 je 10f118 *endptr = end; 10f113: 8b 45 e4 mov -0x1c(%ebp),%eax 10f116: 89 07 mov %eax,(%edi) if ( end == s ) return RTEMS_NOT_DEFINED; 10f118: ba 0b 00 00 00 mov $0xb,%edx result = strtof( s, &end ); if ( endptr ) *endptr = end; if ( end == s ) 10f11d: 39 75 e4 cmp %esi,-0x1c(%ebp) 10f120: 74 4d je 10f16f return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && 10f122: d9 5d c8 fstps -0x38(%ebp) 10f125: e8 52 29 00 00 call 111a7c <__errno> 10f12a: 83 38 22 cmpl $0x22,(%eax) 10f12d: d9 45 c8 flds -0x38(%ebp) 10f130: 75 37 jne 10f169 10f132: d9 ee fldz 10f134: d9 c9 fxch %st(1) 10f136: dd e1 fucom %st(1) 10f138: df e0 fnstsw %ax 10f13a: dd d9 fstp %st(1) 10f13c: 9e sahf 10f13d: 7a 07 jp 10f146 <== NEVER TAKEN (( result == 0 ) || ( result == HUGE_VALF ) || ( result == -HUGE_VALF ))) return RTEMS_INVALID_NUMBER; 10f13f: ba 0a 00 00 00 mov $0xa,%edx *endptr = end; if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && 10f144: 74 2d je 10f173 <== NEVER TAKEN (( result == 0 ) || ( result == HUGE_VALF ) || ( result == -HUGE_VALF ))) return RTEMS_INVALID_NUMBER; 10f146: 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 ))) 10f14b: d9 05 90 3d 12 00 flds 0x123d90 10f151: d9 c9 fxch %st(1) 10f153: dd e1 fucom %st(1) 10f155: df e0 fnstsw %ax 10f157: dd d9 fstp %st(1) 10f159: 9e sahf 10f15a: 77 1b ja 10f177 <== ALWAYS TAKEN 10f15c: d9 05 94 3d 12 00 flds 0x123d94 <== NOT EXECUTED 10f162: dd e9 fucomp %st(1) <== NOT EXECUTED 10f164: df e0 fnstsw %ax <== NOT EXECUTED 10f166: 9e sahf <== NOT EXECUTED 10f167: 77 12 ja 10f17b <== NOT EXECUTED return RTEMS_INVALID_NUMBER; *n = result; 10f169: d9 1b fstps (%ebx) return RTEMS_SUCCESSFUL; 10f16b: 31 d2 xor %edx,%edx 10f16d: eb 0e jmp 10f17d 10f16f: dd d8 fstp %st(0) 10f171: eb 0a jmp 10f17d 10f173: dd d8 fstp %st(0) <== NOT EXECUTED 10f175: eb 06 jmp 10f17d <== NOT EXECUTED 10f177: dd d8 fstp %st(0) 10f179: eb 02 jmp 10f17d 10f17b: dd d8 fstp %st(0) <== NOT EXECUTED } 10f17d: 89 d0 mov %edx,%eax 10f17f: 8d 65 f4 lea -0xc(%ebp),%esp 10f182: 5b pop %ebx 10f183: 5e pop %esi 10f184: 5f pop %edi 10f185: c9 leave 10f186: c3 ret =============================================================================== 0010f188 : const char *s, int *n, char **endptr, int base ) { 10f188: 55 push %ebp 10f189: 89 e5 mov %esp,%ebp 10f18b: 57 push %edi 10f18c: 56 push %esi 10f18d: 53 push %ebx 10f18e: 83 ec 2c sub $0x2c,%esp 10f191: 8b 7d 08 mov 0x8(%ebp),%edi 10f194: 8b 75 0c mov 0xc(%ebp),%esi 10f197: 8b 55 10 mov 0x10(%ebp),%edx long result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 10f19a: b8 09 00 00 00 mov $0x9,%eax ) { long result; char *end; if ( !n ) 10f19f: 85 f6 test %esi,%esi 10f1a1: 74 6b je 10f20e return RTEMS_INVALID_ADDRESS; errno = 0; 10f1a3: 89 55 d4 mov %edx,-0x2c(%ebp) 10f1a6: e8 d1 28 00 00 call 111a7c <__errno> 10f1ab: c7 00 00 00 00 00 movl $0x0,(%eax) *n = 0; 10f1b1: c7 06 00 00 00 00 movl $0x0,(%esi) result = strtol( s, &end, base ); 10f1b7: 50 push %eax 10f1b8: ff 75 14 pushl 0x14(%ebp) 10f1bb: 8d 45 e4 lea -0x1c(%ebp),%eax 10f1be: 50 push %eax 10f1bf: 57 push %edi 10f1c0: e8 3f 55 00 00 call 114704 10f1c5: 89 c3 mov %eax,%ebx if ( endptr ) 10f1c7: 83 c4 10 add $0x10,%esp 10f1ca: 8b 55 d4 mov -0x2c(%ebp),%edx 10f1cd: 85 d2 test %edx,%edx 10f1cf: 74 05 je 10f1d6 *endptr = end; 10f1d1: 8b 45 e4 mov -0x1c(%ebp),%eax 10f1d4: 89 02 mov %eax,(%edx) if ( end == s ) return RTEMS_NOT_DEFINED; 10f1d6: b8 0b 00 00 00 mov $0xb,%eax result = strtol( s, &end, base ); if ( endptr ) *endptr = end; if ( end == s ) 10f1db: 39 7d e4 cmp %edi,-0x1c(%ebp) 10f1de: 74 2e je 10f20e return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && 10f1e0: e8 97 28 00 00 call 111a7c <__errno> 10f1e5: 83 38 22 cmpl $0x22,(%eax) 10f1e8: 75 19 jne 10f203 10f1ea: 81 fb ff ff ff 7f cmp $0x7fffffff,%ebx 10f1f0: 74 17 je 10f209 <== ALWAYS TAKEN 10f1f2: 85 db test %ebx,%ebx <== NOT EXECUTED 10f1f4: 74 13 je 10f209 <== NOT EXECUTED (( result == 0 ) || ( result == LONG_MAX ) || ( result == LONG_MIN ))) return RTEMS_INVALID_NUMBER; 10f1f6: 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 ))) 10f1fb: 81 fb 00 00 00 80 cmp $0x80000000,%ebx <== NOT EXECUTED 10f201: 74 0b je 10f20e <== NOT EXECUTED errno = ERANGE; return RTEMS_INVALID_NUMBER; } #endif *n = result; 10f203: 89 1e mov %ebx,(%esi) return RTEMS_SUCCESSFUL; 10f205: 31 c0 xor %eax,%eax 10f207: eb 05 jmp 10f20e if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && (( result == 0 ) || ( result == LONG_MAX ) || ( result == LONG_MIN ))) return RTEMS_INVALID_NUMBER; 10f209: b8 0a 00 00 00 mov $0xa,%eax #endif *n = result; return RTEMS_SUCCESSFUL; } 10f20e: 8d 65 f4 lea -0xc(%ebp),%esp 10f211: 5b pop %ebx 10f212: 5e pop %esi 10f213: 5f pop %edi 10f214: c9 leave 10f215: c3 ret =============================================================================== 0010f2c4 : const char *s, long *n, char **endptr, int base ) { 10f2c4: 55 push %ebp 10f2c5: 89 e5 mov %esp,%ebp 10f2c7: 57 push %edi 10f2c8: 56 push %esi 10f2c9: 53 push %ebx 10f2ca: 83 ec 2c sub $0x2c,%esp 10f2cd: 8b 7d 08 mov 0x8(%ebp),%edi 10f2d0: 8b 75 0c mov 0xc(%ebp),%esi 10f2d3: 8b 55 10 mov 0x10(%ebp),%edx long result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 10f2d6: b8 09 00 00 00 mov $0x9,%eax ) { long result; char *end; if ( !n ) 10f2db: 85 f6 test %esi,%esi 10f2dd: 74 6b je 10f34a return RTEMS_INVALID_ADDRESS; errno = 0; 10f2df: 89 55 d4 mov %edx,-0x2c(%ebp) 10f2e2: e8 95 27 00 00 call 111a7c <__errno> 10f2e7: c7 00 00 00 00 00 movl $0x0,(%eax) *n = 0; 10f2ed: c7 06 00 00 00 00 movl $0x0,(%esi) result = strtol( s, &end, base ); 10f2f3: 50 push %eax 10f2f4: ff 75 14 pushl 0x14(%ebp) 10f2f7: 8d 45 e4 lea -0x1c(%ebp),%eax 10f2fa: 50 push %eax 10f2fb: 57 push %edi 10f2fc: e8 03 54 00 00 call 114704 10f301: 89 c3 mov %eax,%ebx if ( endptr ) 10f303: 83 c4 10 add $0x10,%esp 10f306: 8b 55 d4 mov -0x2c(%ebp),%edx 10f309: 85 d2 test %edx,%edx 10f30b: 74 05 je 10f312 *endptr = end; 10f30d: 8b 45 e4 mov -0x1c(%ebp),%eax 10f310: 89 02 mov %eax,(%edx) if ( end == s ) return RTEMS_NOT_DEFINED; 10f312: b8 0b 00 00 00 mov $0xb,%eax result = strtol( s, &end, base ); if ( endptr ) *endptr = end; if ( end == s ) 10f317: 39 7d e4 cmp %edi,-0x1c(%ebp) 10f31a: 74 2e je 10f34a return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && 10f31c: e8 5b 27 00 00 call 111a7c <__errno> 10f321: 83 38 22 cmpl $0x22,(%eax) 10f324: 75 19 jne 10f33f 10f326: 81 fb ff ff ff 7f cmp $0x7fffffff,%ebx 10f32c: 74 17 je 10f345 10f32e: 85 db test %ebx,%ebx 10f330: 74 13 je 10f345 <== NEVER TAKEN (( result == 0 ) || ( result == LONG_MAX ) || ( result == LONG_MIN ))) return RTEMS_INVALID_NUMBER; 10f332: 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 ))) 10f337: 81 fb 00 00 00 80 cmp $0x80000000,%ebx 10f33d: 74 0b je 10f34a <== ALWAYS TAKEN return RTEMS_INVALID_NUMBER; *n = result; 10f33f: 89 1e mov %ebx,(%esi) return RTEMS_SUCCESSFUL; 10f341: 31 c0 xor %eax,%eax 10f343: eb 05 jmp 10f34a if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && (( result == 0 ) || ( result == LONG_MAX ) || ( result == LONG_MIN ))) return RTEMS_INVALID_NUMBER; 10f345: b8 0a 00 00 00 mov $0xa,%eax *n = result; return RTEMS_SUCCESSFUL; } 10f34a: 8d 65 f4 lea -0xc(%ebp),%esp 10f34d: 5b pop %ebx 10f34e: 5e pop %esi 10f34f: 5f pop %edi 10f350: c9 leave 10f351: c3 ret =============================================================================== 0010f218 : const char *s, long long *n, char **endptr, int base ) { 10f218: 55 push %ebp 10f219: 89 e5 mov %esp,%ebp 10f21b: 57 push %edi 10f21c: 56 push %esi 10f21d: 53 push %ebx 10f21e: 83 ec 2c sub $0x2c,%esp 10f221: 8b 5d 0c mov 0xc(%ebp),%ebx 10f224: 8b 7d 10 mov 0x10(%ebp),%edi long long result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 10f227: b8 09 00 00 00 mov $0x9,%eax ) { long long result; char *end; if ( !n ) 10f22c: 85 db test %ebx,%ebx 10f22e: 0f 84 85 00 00 00 je 10f2b9 return RTEMS_INVALID_ADDRESS; errno = 0; 10f234: e8 43 28 00 00 call 111a7c <__errno> 10f239: c7 00 00 00 00 00 movl $0x0,(%eax) *n = 0; 10f23f: c7 03 00 00 00 00 movl $0x0,(%ebx) 10f245: c7 43 04 00 00 00 00 movl $0x0,0x4(%ebx) result = strtoll( s, &end, base ); 10f24c: 50 push %eax 10f24d: ff 75 14 pushl 0x14(%ebp) 10f250: 8d 45 e4 lea -0x1c(%ebp),%eax 10f253: 50 push %eax 10f254: ff 75 08 pushl 0x8(%ebp) 10f257: e8 c4 54 00 00 call 114720 10f25c: 89 c6 mov %eax,%esi if ( endptr ) 10f25e: 83 c4 10 add $0x10,%esp 10f261: 85 ff test %edi,%edi 10f263: 74 05 je 10f26a *endptr = end; 10f265: 8b 45 e4 mov -0x1c(%ebp),%eax 10f268: 89 07 mov %eax,(%edi) if ( end == s ) return RTEMS_NOT_DEFINED; 10f26a: b8 0b 00 00 00 mov $0xb,%eax result = strtoll( s, &end, base ); if ( endptr ) *endptr = end; if ( end == s ) 10f26f: 8b 4d 08 mov 0x8(%ebp),%ecx 10f272: 39 4d e4 cmp %ecx,-0x1c(%ebp) 10f275: 74 42 je 10f2b9 return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && 10f277: 89 55 d4 mov %edx,-0x2c(%ebp) 10f27a: e8 fd 27 00 00 call 111a7c <__errno> 10f27f: 83 38 22 cmpl $0x22,(%eax) 10f282: 8b 55 d4 mov -0x2c(%ebp),%edx 10f285: 75 24 jne 10f2ab (( result == 0 ) || ( result == LONG_LONG_MAX ) || ( result == LONG_LONG_MIN ))) 10f287: 89 f1 mov %esi,%ecx 10f289: f7 d1 not %ecx 10f28b: 89 d0 mov %edx,%eax 10f28d: 35 ff ff ff 7f xor $0x7fffffff,%eax *endptr = end; if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && 10f292: 09 c1 or %eax,%ecx 10f294: 74 1e je 10f2b4 10f296: 89 f0 mov %esi,%eax 10f298: 09 d0 or %edx,%eax 10f29a: 74 18 je 10f2b4 <== NEVER TAKEN (( result == 0 ) || ( result == LONG_LONG_MAX ) || ( result == LONG_LONG_MIN ))) 10f29c: 8d 8a 00 00 00 80 lea -0x80000000(%edx),%ecx return RTEMS_INVALID_NUMBER; 10f2a2: 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 ))) 10f2a7: 09 f1 or %esi,%ecx 10f2a9: 74 0e je 10f2b9 <== ALWAYS TAKEN return RTEMS_INVALID_NUMBER; *n = result; 10f2ab: 89 33 mov %esi,(%ebx) 10f2ad: 89 53 04 mov %edx,0x4(%ebx) return RTEMS_SUCCESSFUL; 10f2b0: 31 c0 xor %eax,%eax 10f2b2: eb 05 jmp 10f2b9 if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && (( result == 0 ) || ( result == LONG_LONG_MAX ) || ( result == LONG_LONG_MIN ))) return RTEMS_INVALID_NUMBER; 10f2b4: b8 0a 00 00 00 mov $0xa,%eax *n = result; return RTEMS_SUCCESSFUL; } 10f2b9: 8d 65 f4 lea -0xc(%ebp),%esp 10f2bc: 5b pop %ebx 10f2bd: 5e pop %esi 10f2be: 5f pop %edi 10f2bf: c9 leave 10f2c0: c3 ret =============================================================================== 0010f36c : const char *s, unsigned char *n, char **endptr, int base ) { 10f36c: 55 push %ebp 10f36d: 89 e5 mov %esp,%ebp 10f36f: 57 push %edi 10f370: 56 push %esi 10f371: 53 push %ebx 10f372: 83 ec 2c sub $0x2c,%esp 10f375: 8b 7d 08 mov 0x8(%ebp),%edi 10f378: 8b 5d 0c mov 0xc(%ebp),%ebx 10f37b: 8b 55 10 mov 0x10(%ebp),%edx unsigned long result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 10f37e: b8 09 00 00 00 mov $0x9,%eax ) { unsigned long result; char *end; if ( !n ) 10f383: 85 db test %ebx,%ebx 10f385: 74 71 je 10f3f8 return RTEMS_INVALID_ADDRESS; errno = 0; 10f387: 89 55 d4 mov %edx,-0x2c(%ebp) 10f38a: e8 ed 26 00 00 call 111a7c <__errno> 10f38f: c7 00 00 00 00 00 movl $0x0,(%eax) *n = 0; 10f395: c6 03 00 movb $0x0,(%ebx) result = strtoul( s, &end, base ); 10f398: 50 push %eax 10f399: ff 75 14 pushl 0x14(%ebp) 10f39c: 8d 45 e4 lea -0x1c(%ebp),%eax 10f39f: 50 push %eax 10f3a0: 57 push %edi 10f3a1: e8 1a 58 00 00 call 114bc0 10f3a6: 89 c6 mov %eax,%esi if ( endptr ) 10f3a8: 83 c4 10 add $0x10,%esp 10f3ab: 8b 55 d4 mov -0x2c(%ebp),%edx 10f3ae: 85 d2 test %edx,%edx 10f3b0: 74 05 je 10f3b7 *endptr = end; 10f3b2: 8b 45 e4 mov -0x1c(%ebp),%eax 10f3b5: 89 02 mov %eax,(%edx) if ( end == s ) return RTEMS_NOT_DEFINED; 10f3b7: b8 0b 00 00 00 mov $0xb,%eax result = strtoul( s, &end, base ); if ( endptr ) *endptr = end; if ( end == s ) 10f3bc: 39 7d e4 cmp %edi,-0x1c(%ebp) 10f3bf: 74 37 je 10f3f8 return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && 10f3c1: e8 b6 26 00 00 call 111a7c <__errno> 10f3c6: 83 38 22 cmpl $0x22,(%eax) 10f3c9: 75 0d jne 10f3d8 <== ALWAYS TAKEN (( result == 0 ) || ( result == ULONG_MAX ))) 10f3cb: 8d 56 ff lea -0x1(%esi),%edx <== NOT EXECUTED return RTEMS_INVALID_NUMBER; 10f3ce: b8 0a 00 00 00 mov $0xa,%eax <== NOT EXECUTED *endptr = end; if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && 10f3d3: 83 fa fd cmp $0xfffffffd,%edx <== NOT EXECUTED 10f3d6: 77 20 ja 10f3f8 <== NOT EXECUTED (( result == 0 ) || ( result == ULONG_MAX ))) return RTEMS_INVALID_NUMBER; #if (UCHAR_MAX < ULONG_MAX) if ( result > UCHAR_MAX ) { 10f3d8: 81 fe ff 00 00 00 cmp $0xff,%esi 10f3de: 76 12 jbe 10f3f2 <== ALWAYS TAKEN errno = ERANGE; 10f3e0: e8 97 26 00 00 call 111a7c <__errno> <== NOT EXECUTED 10f3e5: c7 00 22 00 00 00 movl $0x22,(%eax) <== NOT EXECUTED return RTEMS_INVALID_NUMBER; 10f3eb: b8 0a 00 00 00 mov $0xa,%eax <== NOT EXECUTED 10f3f0: eb 06 jmp 10f3f8 <== NOT EXECUTED } #endif *n = result; 10f3f2: 89 f0 mov %esi,%eax 10f3f4: 88 03 mov %al,(%ebx) return RTEMS_SUCCESSFUL; 10f3f6: 31 c0 xor %eax,%eax } 10f3f8: 8d 65 f4 lea -0xc(%ebp),%esp 10f3fb: 5b pop %ebx 10f3fc: 5e pop %esi 10f3fd: 5f pop %edi 10f3fe: c9 leave 10f3ff: c3 ret =============================================================================== 0010f400 : const char *s, unsigned int *n, char **endptr, int base ) { 10f400: 55 push %ebp 10f401: 89 e5 mov %esp,%ebp 10f403: 57 push %edi 10f404: 56 push %esi 10f405: 53 push %ebx 10f406: 83 ec 2c sub $0x2c,%esp 10f409: 8b 7d 08 mov 0x8(%ebp),%edi 10f40c: 8b 5d 0c mov 0xc(%ebp),%ebx 10f40f: 8b 55 10 mov 0x10(%ebp),%edx unsigned long result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 10f412: b8 09 00 00 00 mov $0x9,%eax ) { unsigned long result; char *end; if ( !n ) 10f417: 85 db test %ebx,%ebx 10f419: 74 58 je 10f473 return RTEMS_INVALID_ADDRESS; errno = 0; 10f41b: 89 55 d4 mov %edx,-0x2c(%ebp) 10f41e: e8 59 26 00 00 call 111a7c <__errno> 10f423: c7 00 00 00 00 00 movl $0x0,(%eax) *n = 0; 10f429: c7 03 00 00 00 00 movl $0x0,(%ebx) result = strtoul( s, &end, base ); 10f42f: 50 push %eax 10f430: ff 75 14 pushl 0x14(%ebp) 10f433: 8d 45 e4 lea -0x1c(%ebp),%eax 10f436: 50 push %eax 10f437: 57 push %edi 10f438: e8 83 57 00 00 call 114bc0 10f43d: 89 c6 mov %eax,%esi if ( endptr ) 10f43f: 83 c4 10 add $0x10,%esp 10f442: 8b 55 d4 mov -0x2c(%ebp),%edx 10f445: 85 d2 test %edx,%edx 10f447: 74 05 je 10f44e *endptr = end; 10f449: 8b 45 e4 mov -0x1c(%ebp),%eax 10f44c: 89 02 mov %eax,(%edx) if ( end == s ) return RTEMS_NOT_DEFINED; 10f44e: b8 0b 00 00 00 mov $0xb,%eax result = strtoul( s, &end, base ); if ( endptr ) *endptr = end; if ( end == s ) 10f453: 39 7d e4 cmp %edi,-0x1c(%ebp) 10f456: 74 1b je 10f473 return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && 10f458: e8 1f 26 00 00 call 111a7c <__errno> 10f45d: 83 38 22 cmpl $0x22,(%eax) 10f460: 75 0d jne 10f46f (( result == 0 ) || ( result == ULONG_MAX ))) 10f462: 8d 56 ff lea -0x1(%esi),%edx return RTEMS_INVALID_NUMBER; 10f465: b8 0a 00 00 00 mov $0xa,%eax *endptr = end; if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && 10f46a: 83 fa fd cmp $0xfffffffd,%edx 10f46d: 77 04 ja 10f473 <== ALWAYS TAKEN errno = ERANGE; return RTEMS_INVALID_NUMBER; } #endif *n = result; 10f46f: 89 33 mov %esi,(%ebx) return RTEMS_SUCCESSFUL; 10f471: 31 c0 xor %eax,%eax } 10f473: 8d 65 f4 lea -0xc(%ebp),%esp 10f476: 5b pop %ebx 10f477: 5e pop %esi 10f478: 5f pop %edi 10f479: c9 leave 10f47a: c3 ret =============================================================================== 0010f518 : const char *s, unsigned long *n, char **endptr, int base ) { 10f518: 55 push %ebp 10f519: 89 e5 mov %esp,%ebp 10f51b: 57 push %edi 10f51c: 56 push %esi 10f51d: 53 push %ebx 10f51e: 83 ec 2c sub $0x2c,%esp 10f521: 8b 7d 08 mov 0x8(%ebp),%edi 10f524: 8b 5d 0c mov 0xc(%ebp),%ebx 10f527: 8b 55 10 mov 0x10(%ebp),%edx unsigned long result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 10f52a: b8 09 00 00 00 mov $0x9,%eax ) { unsigned long result; char *end; if ( !n ) 10f52f: 85 db test %ebx,%ebx 10f531: 74 58 je 10f58b return RTEMS_INVALID_ADDRESS; errno = 0; 10f533: 89 55 d4 mov %edx,-0x2c(%ebp) 10f536: e8 41 25 00 00 call 111a7c <__errno> 10f53b: c7 00 00 00 00 00 movl $0x0,(%eax) *n = 0; 10f541: c7 03 00 00 00 00 movl $0x0,(%ebx) result = strtoul( s, &end, base ); 10f547: 50 push %eax 10f548: ff 75 14 pushl 0x14(%ebp) 10f54b: 8d 45 e4 lea -0x1c(%ebp),%eax 10f54e: 50 push %eax 10f54f: 57 push %edi 10f550: e8 6b 56 00 00 call 114bc0 10f555: 89 c6 mov %eax,%esi if ( endptr ) 10f557: 83 c4 10 add $0x10,%esp 10f55a: 8b 55 d4 mov -0x2c(%ebp),%edx 10f55d: 85 d2 test %edx,%edx 10f55f: 74 05 je 10f566 *endptr = end; 10f561: 8b 45 e4 mov -0x1c(%ebp),%eax 10f564: 89 02 mov %eax,(%edx) if ( end == s ) return RTEMS_NOT_DEFINED; 10f566: b8 0b 00 00 00 mov $0xb,%eax result = strtoul( s, &end, base ); if ( endptr ) *endptr = end; if ( end == s ) 10f56b: 39 7d e4 cmp %edi,-0x1c(%ebp) 10f56e: 74 1b je 10f58b return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && 10f570: e8 07 25 00 00 call 111a7c <__errno> 10f575: 83 38 22 cmpl $0x22,(%eax) 10f578: 75 0d jne 10f587 (( result == 0 ) || ( result == ULONG_MAX ))) 10f57a: 8d 56 ff lea -0x1(%esi),%edx return RTEMS_INVALID_NUMBER; 10f57d: b8 0a 00 00 00 mov $0xa,%eax *endptr = end; if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && 10f582: 83 fa fd cmp $0xfffffffd,%edx 10f585: 77 04 ja 10f58b <== ALWAYS TAKEN (( result == 0 ) || ( result == ULONG_MAX ))) return RTEMS_INVALID_NUMBER; *n = result; 10f587: 89 33 mov %esi,(%ebx) return RTEMS_SUCCESSFUL; 10f589: 31 c0 xor %eax,%eax } 10f58b: 8d 65 f4 lea -0xc(%ebp),%esp 10f58e: 5b pop %ebx 10f58f: 5e pop %esi 10f590: 5f pop %edi 10f591: c9 leave 10f592: c3 ret =============================================================================== 0010f47c : const char *s, unsigned long long *n, char **endptr, int base ) { 10f47c: 55 push %ebp 10f47d: 89 e5 mov %esp,%ebp 10f47f: 57 push %edi 10f480: 56 push %esi 10f481: 53 push %ebx 10f482: 83 ec 2c sub $0x2c,%esp 10f485: 8b 7d 08 mov 0x8(%ebp),%edi 10f488: 8b 5d 0c mov 0xc(%ebp),%ebx 10f48b: 8b 75 10 mov 0x10(%ebp),%esi unsigned long long result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 10f48e: b8 09 00 00 00 mov $0x9,%eax ) { unsigned long long result; char *end; if ( !n ) 10f493: 85 db test %ebx,%ebx 10f495: 74 76 je 10f50d return RTEMS_INVALID_ADDRESS; errno = 0; 10f497: e8 e0 25 00 00 call 111a7c <__errno> 10f49c: c7 00 00 00 00 00 movl $0x0,(%eax) *n = 0; 10f4a2: c7 03 00 00 00 00 movl $0x0,(%ebx) 10f4a8: c7 43 04 00 00 00 00 movl $0x0,0x4(%ebx) result = strtoull( s, &end, base ); 10f4af: 50 push %eax 10f4b0: ff 75 14 pushl 0x14(%ebp) 10f4b3: 8d 45 e4 lea -0x1c(%ebp),%eax 10f4b6: 50 push %eax 10f4b7: 57 push %edi 10f4b8: e8 1f 57 00 00 call 114bdc 10f4bd: 89 d1 mov %edx,%ecx 10f4bf: 89 c2 mov %eax,%edx if ( endptr ) 10f4c1: 83 c4 10 add $0x10,%esp 10f4c4: 85 f6 test %esi,%esi 10f4c6: 74 05 je 10f4cd *endptr = end; 10f4c8: 8b 45 e4 mov -0x1c(%ebp),%eax 10f4cb: 89 06 mov %eax,(%esi) if ( end == s ) return RTEMS_NOT_DEFINED; 10f4cd: b8 0b 00 00 00 mov $0xb,%eax result = strtoull( s, &end, base ); if ( endptr ) *endptr = end; if ( end == s ) 10f4d2: 39 7d e4 cmp %edi,-0x1c(%ebp) 10f4d5: 74 36 je 10f50d return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && 10f4d7: 89 55 d4 mov %edx,-0x2c(%ebp) 10f4da: 89 4d d0 mov %ecx,-0x30(%ebp) 10f4dd: e8 9a 25 00 00 call 111a7c <__errno> 10f4e2: 83 38 22 cmpl $0x22,(%eax) 10f4e5: 8b 55 d4 mov -0x2c(%ebp),%edx 10f4e8: 8b 4d d0 mov -0x30(%ebp),%ecx 10f4eb: 75 19 jne 10f506 (( result == 0 ) || ( result == ULONG_LONG_MAX ))) 10f4ed: 89 d6 mov %edx,%esi 10f4ef: 89 cf mov %ecx,%edi 10f4f1: 83 c6 ff add $0xffffffff,%esi 10f4f4: 83 d7 ff adc $0xffffffff,%edi *endptr = end; if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && 10f4f7: 83 ff ff cmp $0xffffffff,%edi 10f4fa: 72 0a jb 10f506 <== NEVER TAKEN (( result == 0 ) || ( result == ULONG_LONG_MAX ))) return RTEMS_INVALID_NUMBER; 10f4fc: b8 0a 00 00 00 mov $0xa,%eax *endptr = end; if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && 10f501: 83 fe fd cmp $0xfffffffd,%esi 10f504: 77 07 ja 10f50d <== ALWAYS TAKEN (( result == 0 ) || ( result == ULONG_LONG_MAX ))) return RTEMS_INVALID_NUMBER; *n = result; 10f506: 89 13 mov %edx,(%ebx) 10f508: 89 4b 04 mov %ecx,0x4(%ebx) return RTEMS_SUCCESSFUL; 10f50b: 31 c0 xor %eax,%eax } 10f50d: 8d 65 f4 lea -0xc(%ebp),%esp 10f510: 5b pop %ebx 10f511: 5e pop %esi 10f512: 5f pop %edi 10f513: c9 leave 10f514: c3 ret =============================================================================== 0010707c : int rtems_tarfs_load( char *mountpoint, uint8_t *tar_image, size_t tar_size ) { 10707c: 55 push %ebp 10707d: 89 e5 mov %esp,%ebp 10707f: 57 push %edi 107080: 56 push %esi 107081: 53 push %ebx 107082: 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( 107088: 31 c0 xor %eax,%eax 10708a: 83 c9 ff or $0xffffffff,%ecx 10708d: 8b 7d 08 mov 0x8(%ebp),%edi 107090: f2 ae repnz scas %es:(%edi),%al 107092: f7 d1 not %ecx 107094: 49 dec %ecx 107095: 6a 00 push $0x0 107097: 8d 45 d0 lea -0x30(%ebp),%eax 10709a: 50 push %eax 10709b: 6a 00 push $0x0 10709d: 51 push %ecx 10709e: ff 75 08 pushl 0x8(%ebp) 1070a1: e8 d4 09 00 00 call 107a7a 1070a6: 89 85 54 fe ff ff mov %eax,-0x1ac(%ebp) strlen(mountpoint), 0, &root_loc, 0 ); if (status != 0) 1070ac: 83 c4 20 add $0x20,%esp 1070af: 85 c0 test %eax,%eax 1070b1: 0f 85 d9 01 00 00 jne 107290 return -1; if (root_loc.ops != &IMFS_ops && root_loc.ops != &fifoIMFS_ops) 1070b7: 8b 45 dc mov -0x24(%ebp),%eax 1070ba: 31 f6 xor %esi,%esi 1070bc: 3d 04 45 12 00 cmp $0x124504,%eax 1070c1: 74 1b je 1070de 1070c3: 3d ec 4e 12 00 cmp $0x124eec,%eax 1070c8: 0f 85 c2 01 00 00 jne 107290 <== ALWAYS TAKEN 1070ce: 8b b5 54 fe ff ff mov -0x1ac(%ebp),%esi <== NOT EXECUTED 1070d4: eb 08 jmp 1070de <== NOT EXECUTED 1070d6: 8b b5 50 fe ff ff mov -0x1b0(%ebp),%esi 1070dc: eb 18 jmp 1070f6 * should not have this path. */ else if (linkflag == REGTYPE) { const char *name; loc = root_loc; 1070de: 8d 45 bc lea -0x44(%ebp),%eax 1070e1: 89 85 34 fe ff ff mov %eax,-0x1cc(%ebp) 1070e7: 8d 55 d0 lea -0x30(%ebp),%edx 1070ea: 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); 1070f0: 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) 1070f6: 8d 86 00 02 00 00 lea 0x200(%esi),%eax 1070fc: 89 85 50 fe ff ff mov %eax,-0x1b0(%ebp) 107102: 8b 55 10 mov 0x10(%ebp),%edx 107105: 39 d0 cmp %edx,%eax 107107: 0f 87 8d 01 00 00 ja 10729a <== NEVER TAKEN break; /* * Read a header. */ hdr_ptr = (char *) &tar_image[offset]; 10710d: 03 75 0c add 0xc(%ebp),%esi offset += 512; if (strncmp(&hdr_ptr[257], "ustar", 5)) 107110: 8d 86 01 01 00 00 lea 0x101(%esi),%eax 107116: 52 push %edx 107117: 6a 05 push $0x5 107119: 68 4c 45 12 00 push $0x12454c 10711e: 50 push %eax 10711f: e8 78 e5 00 00 call 11569c 107124: 83 c4 10 add $0x10,%esp 107127: 85 c0 test %eax,%eax 107129: 0f 85 6b 01 00 00 jne 10729a break; strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE); 10712f: 50 push %eax 107130: 6a 63 push $0x63 107132: 56 push %esi 107133: 8d 85 58 ff ff ff lea -0xa8(%ebp),%eax 107139: 50 push %eax 10713a: e8 ed e5 00 00 call 11572c filename[MAX_NAME_FIELD_SIZE] = '\0'; 10713f: c6 45 bb 00 movb $0x0,-0x45(%ebp) linkflag = hdr_ptr[156]; 107143: 8a 96 9c 00 00 00 mov 0x9c(%esi),%dl file_mode = _rtems_octal2ulong(&hdr_ptr[100], 8); 107149: 59 pop %ecx 10714a: 5f pop %edi 10714b: 6a 08 push $0x8 10714d: 8d 46 64 lea 0x64(%esi),%eax 107150: 50 push %eax 107151: 88 95 44 fe ff ff mov %dl,-0x1bc(%ebp) 107157: e8 84 6e 00 00 call 10dfe0 <_rtems_octal2ulong> 10715c: 89 85 48 fe ff ff mov %eax,-0x1b8(%ebp) file_size = _rtems_octal2ulong(&hdr_ptr[124], 12); 107162: 5f pop %edi 107163: 58 pop %eax 107164: 6a 0c push $0xc 107166: 8d 46 7c lea 0x7c(%esi),%eax 107169: 50 push %eax 10716a: e8 71 6e 00 00 call 10dfe0 <_rtems_octal2ulong> 10716f: 89 85 4c fe ff ff mov %eax,-0x1b4(%ebp) hdr_chksum = _rtems_octal2ulong(&hdr_ptr[148], 8); 107175: 5a pop %edx 107176: 59 pop %ecx 107177: 6a 08 push $0x8 107179: 8d 86 94 00 00 00 lea 0x94(%esi),%eax 10717f: 50 push %eax 107180: e8 5b 6e 00 00 call 10dfe0 <_rtems_octal2ulong> 107185: 89 c7 mov %eax,%edi if (_rtems_tar_header_checksum(hdr_ptr) != hdr_chksum) 107187: 89 34 24 mov %esi,(%esp) 10718a: e8 7f 6e 00 00 call 10e00e <_rtems_tar_header_checksum> 10718f: 83 c4 10 add $0x10,%esp 107192: 39 f8 cmp %edi,%eax 107194: 8a 95 44 fe ff ff mov -0x1bc(%ebp),%dl 10719a: 0f 85 fa 00 00 00 jne 10729a <== 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) { 1071a0: 80 fa 35 cmp $0x35,%dl 1071a3: 75 57 jne 1071fc strcpy(full_filename, mountpoint); 1071a5: 50 push %eax 1071a6: 50 push %eax 1071a7: ff 75 08 pushl 0x8(%ebp) 1071aa: 53 push %ebx 1071ab: e8 84 e1 00 00 call 115334 if (full_filename[strlen(full_filename)-1] != '/') 1071b0: 31 c0 xor %eax,%eax 1071b2: 83 c9 ff or $0xffffffff,%ecx 1071b5: 89 df mov %ebx,%edi 1071b7: f2 ae repnz scas %es:(%edi),%al 1071b9: f7 d1 not %ecx 1071bb: 83 c4 10 add $0x10,%esp 1071be: 80 bc 0d 56 fe ff ff cmpb $0x2f,-0x1aa(%ebp,%ecx,1) 1071c5: 2f 1071c6: 74 10 je 1071d8 <== ALWAYS TAKEN strcat(full_filename, "/"); 1071c8: 57 push %edi <== NOT EXECUTED 1071c9: 57 push %edi <== NOT EXECUTED 1071ca: 68 f9 03 12 00 push $0x1203f9 <== NOT EXECUTED 1071cf: 53 push %ebx <== NOT EXECUTED 1071d0: e8 ab df 00 00 call 115180 <== NOT EXECUTED 1071d5: 83 c4 10 add $0x10,%esp <== NOT EXECUTED strcat(full_filename, filename); 1071d8: 56 push %esi 1071d9: 56 push %esi 1071da: 8d 95 58 ff ff ff lea -0xa8(%ebp),%edx 1071e0: 52 push %edx 1071e1: 53 push %ebx 1071e2: e8 99 df 00 00 call 115180 mkdir(full_filename, S_IRWXU | S_IRWXG | S_IRWXO); 1071e7: 5a pop %edx 1071e8: 59 pop %ecx 1071e9: 68 ff 01 00 00 push $0x1ff 1071ee: 53 push %ebx 1071ef: e8 58 0f 00 00 call 10814c 1071f4: 83 c4 10 add $0x10,%esp 1071f7: e9 da fe ff ff jmp 1070d6 * 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) { 1071fc: 80 fa 30 cmp $0x30,%dl 1071ff: 0f 85 d1 fe ff ff jne 1070d6 const char *name; loc = root_loc; 107205: b9 05 00 00 00 mov $0x5,%ecx 10720a: 8b bd 34 fe ff ff mov -0x1cc(%ebp),%edi 107210: 8b b5 30 fe ff ff mov -0x1d0(%ebp),%esi 107216: f3 a5 rep movsl %ds:(%esi),%es:(%edi) if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) { 107218: 50 push %eax 107219: 8d 45 e4 lea -0x1c(%ebp),%eax 10721c: 50 push %eax 10721d: 8d 55 bc lea -0x44(%ebp),%edx 107220: 52 push %edx 107221: 8d 85 58 ff ff ff lea -0xa8(%ebp),%eax 107227: 50 push %eax 107228: e8 df 78 00 00 call 10eb0c 10722d: 83 c4 10 add $0x10,%esp 107230: 85 c0 test %eax,%eax 107232: 75 41 jne 107275 <== NEVER TAKEN node = IMFS_create_node( 107234: 83 ec 0c sub $0xc,%esp 107237: 6a 00 push $0x0 &loc, IMFS_LINEAR_FILE, (char *)name, (file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG, 107239: 8b 85 48 fe ff ff mov -0x1b8(%ebp),%eax 10723f: 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( 107244: 80 cc 80 or $0x80,%ah 107247: 50 push %eax 107248: ff 75 e4 pushl -0x1c(%ebp) 10724b: 6a 06 push $0x6 10724d: 8d 55 bc lea -0x44(%ebp),%edx 107250: 52 push %edx 107251: e8 a9 73 00 00 call 10e5ff &loc, IMFS_LINEAR_FILE, (char *)name, (file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG, NULL ); node->info.linearfile.size = file_size; 107256: 8b 95 4c fe ff ff mov -0x1b4(%ebp),%edx 10725c: 89 50 50 mov %edx,0x50(%eax) 10725f: c7 40 54 00 00 00 00 movl $0x0,0x54(%eax) node->info.linearfile.direct = &tar_image[offset]; 107266: 8b 55 0c mov 0xc(%ebp),%edx 107269: 03 95 50 fe ff ff add -0x1b0(%ebp),%edx 10726f: 89 50 58 mov %edx,0x58(%eax) 107272: 83 c4 20 add $0x20,%esp } nblocks = (((file_size) + 511) & ~511) / 512; 107275: 8b 85 4c fe ff ff mov -0x1b4(%ebp),%eax 10727b: 05 ff 01 00 00 add $0x1ff,%eax offset += 512 * nblocks; 107280: 25 00 fe ff ff and $0xfffffe00,%eax 107285: 01 85 50 fe ff ff add %eax,-0x1b0(%ebp) 10728b: e9 46 fe ff ff jmp 1070d6 ); if (status != 0) return -1; if (root_loc.ops != &IMFS_ops && root_loc.ops != &fifoIMFS_ops) return -1; 107290: c7 85 54 fe ff ff ff movl $0xffffffff,-0x1ac(%ebp) 107297: ff ff ff nblocks = (((file_size) + 511) & ~511) / 512; offset += 512 * nblocks; } } return status; } 10729a: 8b 85 54 fe ff ff mov -0x1ac(%ebp),%eax 1072a0: 8d 65 f4 lea -0xc(%ebp),%esp 1072a3: 5b pop %ebx 1072a4: 5e pop %esi 1072a5: 5f pop %edi 1072a6: c9 leave 1072a7: c3 ret =============================================================================== 00110cfc : rtems_status_code rtems_task_mode( rtems_mode mode_set, rtems_mode mask, rtems_mode *previous_mode_set ) { 110cfc: 55 push %ebp 110cfd: 89 e5 mov %esp,%ebp 110cff: 57 push %edi 110d00: 56 push %esi 110d01: 53 push %ebx 110d02: 83 ec 1c sub $0x1c,%esp 110d05: 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; 110d08: 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 ) 110d0d: 85 c9 test %ecx,%ecx 110d0f: 0f 84 fb 00 00 00 je 110e10 <== NEVER TAKEN return RTEMS_INVALID_ADDRESS; executing = _Thread_Executing; 110d15: 8b 35 68 58 12 00 mov 0x125868,%esi api = executing->API_Extensions[ THREAD_API_RTEMS ]; 110d1b: 8b 9e e8 00 00 00 mov 0xe8(%esi),%ebx asr = &api->Signal; old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT; 110d21: 80 7e 74 01 cmpb $0x1,0x74(%esi) 110d25: 19 ff sbb %edi,%edi 110d27: 81 e7 00 01 00 00 and $0x100,%edi if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE ) 110d2d: 83 7e 7c 00 cmpl $0x0,0x7c(%esi) 110d31: 74 06 je 110d39 old_mode |= RTEMS_NO_TIMESLICE; else old_mode |= RTEMS_TIMESLICE; 110d33: 81 cf 00 02 00 00 or $0x200,%edi old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR; 110d39: 80 7b 08 01 cmpb $0x1,0x8(%ebx) 110d3d: 19 d2 sbb %edx,%edx 110d3f: 81 e2 00 04 00 00 and $0x400,%edx old_mode |= _ISR_Get_level(); 110d45: 89 55 e4 mov %edx,-0x1c(%ebp) 110d48: 89 4d e0 mov %ecx,-0x20(%ebp) 110d4b: e8 65 c6 ff ff call 10d3b5 <_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; 110d50: 8b 55 e4 mov -0x1c(%ebp),%edx 110d53: 09 d0 or %edx,%eax old_mode |= _ISR_Get_level(); 110d55: 09 f8 or %edi,%eax 110d57: 8b 4d e0 mov -0x20(%ebp),%ecx 110d5a: 89 01 mov %eax,(%ecx) *previous_mode_set = old_mode; /* * These are generic thread scheduling characteristics. */ if ( mask & RTEMS_PREEMPT_MASK ) 110d5c: f7 45 0c 00 01 00 00 testl $0x100,0xc(%ebp) 110d63: 74 0b je 110d70 executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false; 110d65: f7 45 08 00 01 00 00 testl $0x100,0x8(%ebp) 110d6c: 0f 94 46 74 sete 0x74(%esi) if ( mask & RTEMS_TIMESLICE_MASK ) { 110d70: f7 45 0c 00 02 00 00 testl $0x200,0xc(%ebp) 110d77: 74 21 je 110d9a if ( _Modes_Is_timeslice(mode_set) ) { 110d79: f7 45 08 00 02 00 00 testl $0x200,0x8(%ebp) 110d80: 74 11 je 110d93 executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; 110d82: c7 46 7c 01 00 00 00 movl $0x1,0x7c(%esi) executing->cpu_time_budget = _Thread_Ticks_per_timeslice; 110d89: a1 10 53 12 00 mov 0x125310,%eax 110d8e: 89 46 78 mov %eax,0x78(%esi) 110d91: eb 07 jmp 110d9a } else executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; 110d93: c7 46 7c 00 00 00 00 movl $0x0,0x7c(%esi) } /* * Set the new interrupt level */ if ( mask & RTEMS_INTERRUPT_MASK ) 110d9a: f6 45 0c 01 testb $0x1,0xc(%ebp) 110d9e: 74 0a je 110daa */ RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level ( Modes_Control mode_set ) { _ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) ); 110da0: f6 45 08 01 testb $0x1,0x8(%ebp) 110da4: 74 03 je 110da9 110da6: fa cli 110da7: eb 01 jmp 110daa 110da9: fb sti /* * This is specific to the RTEMS API */ is_asr_enabled = false; needs_asr_dispatching = false; 110daa: 31 c9 xor %ecx,%ecx if ( mask & RTEMS_ASR_MASK ) { 110dac: f7 45 0c 00 04 00 00 testl $0x400,0xc(%ebp) 110db3: 74 2a je 110ddf * Output: * *previous_mode_set - previous mode set * always return RTEMS_SUCCESSFUL; */ rtems_status_code rtems_task_mode( 110db5: f7 45 08 00 04 00 00 testl $0x400,0x8(%ebp) 110dbc: 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 ) { 110dbf: 3a 43 08 cmp 0x8(%ebx),%al 110dc2: 74 1b je 110ddf asr->is_enabled = is_asr_enabled; 110dc4: 88 43 08 mov %al,0x8(%ebx) ) { rtems_signal_set _signals; ISR_Level _level; _ISR_Disable( _level ); 110dc7: 9c pushf 110dc8: fa cli 110dc9: 58 pop %eax _signals = information->signals_pending; 110dca: 8b 53 18 mov 0x18(%ebx),%edx information->signals_pending = information->signals_posted; 110dcd: 8b 4b 14 mov 0x14(%ebx),%ecx 110dd0: 89 4b 18 mov %ecx,0x18(%ebx) information->signals_posted = _signals; 110dd3: 89 53 14 mov %edx,0x14(%ebx) _ISR_Enable( _level ); 110dd6: 50 push %eax 110dd7: 9d popf /* * This is specific to the RTEMS API */ is_asr_enabled = false; needs_asr_dispatching = false; 110dd8: 83 7b 14 00 cmpl $0x0,0x14(%ebx) 110ddc: 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; 110ddf: 31 c0 xor %eax,%eax needs_asr_dispatching = true; } } } if ( _System_state_Is_up( _System_state_Get() ) ) { 110de1: 83 3d 9c 54 12 00 03 cmpl $0x3,0x12549c 110de8: 75 26 jne 110e10 <== NEVER TAKEN bool are_signals_pending ) { Thread_Control *executing; executing = _Thread_Executing; 110dea: 8b 15 68 58 12 00 mov 0x125868,%edx if ( are_signals_pending || 110df0: 84 c9 test %cl,%cl 110df2: 75 0e jne 110e02 110df4: 3b 15 6c 58 12 00 cmp 0x12586c,%edx 110dfa: 74 14 je 110e10 (!_Thread_Is_heir( executing ) && executing->is_preemptible) ) { 110dfc: 80 7a 74 00 cmpb $0x0,0x74(%edx) 110e00: 74 0e je 110e10 <== NEVER TAKEN _Thread_Dispatch_necessary = true; 110e02: c6 05 74 58 12 00 01 movb $0x1,0x125874 if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) ) _Thread_Dispatch(); 110e09: e8 52 b2 ff ff call 10c060 <_Thread_Dispatch> } return RTEMS_SUCCESSFUL; 110e0e: 31 c0 xor %eax,%eax } 110e10: 83 c4 1c add $0x1c,%esp 110e13: 5b pop %ebx 110e14: 5e pop %esi 110e15: 5f pop %edi 110e16: c9 leave 110e17: c3 ret =============================================================================== 0010dd30 : rtems_status_code rtems_task_set_priority( rtems_id id, rtems_task_priority new_priority, rtems_task_priority *old_priority ) { 10dd30: 55 push %ebp 10dd31: 89 e5 mov %esp,%ebp 10dd33: 56 push %esi 10dd34: 53 push %ebx 10dd35: 83 ec 10 sub $0x10,%esp 10dd38: 8b 5d 0c mov 0xc(%ebp),%ebx 10dd3b: 8b 75 10 mov 0x10(%ebp),%esi register Thread_Control *the_thread; Objects_Locations location; if ( new_priority != RTEMS_CURRENT_PRIORITY && 10dd3e: 85 db test %ebx,%ebx 10dd40: 74 10 je 10dd52 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 ) ); 10dd42: 0f b6 15 24 42 12 00 movzbl 0x124224,%edx !_RTEMS_tasks_Priority_is_valid( new_priority ) ) return RTEMS_INVALID_PRIORITY; 10dd49: b8 13 00 00 00 mov $0x13,%eax ) { register Thread_Control *the_thread; Objects_Locations location; if ( new_priority != RTEMS_CURRENT_PRIORITY && 10dd4e: 39 d3 cmp %edx,%ebx 10dd50: 77 52 ja 10dda4 !_RTEMS_tasks_Priority_is_valid( new_priority ) ) return RTEMS_INVALID_PRIORITY; if ( !old_priority ) return RTEMS_INVALID_ADDRESS; 10dd52: 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 ) 10dd57: 85 f6 test %esi,%esi 10dd59: 74 49 je 10dda4 return RTEMS_INVALID_ADDRESS; the_thread = _Thread_Get( id, &location ); 10dd5b: 51 push %ecx 10dd5c: 51 push %ecx 10dd5d: 8d 45 f4 lea -0xc(%ebp),%eax 10dd60: 50 push %eax 10dd61: ff 75 08 pushl 0x8(%ebp) 10dd64: e8 bf 1e 00 00 call 10fc28 <_Thread_Get> switch ( location ) { 10dd69: 83 c4 10 add $0x10,%esp 10dd6c: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) 10dd70: 75 2d jne 10dd9f case OBJECTS_LOCAL: /* XXX need helper to "convert" from core priority */ *old_priority = the_thread->current_priority; 10dd72: 8b 50 14 mov 0x14(%eax),%edx 10dd75: 89 16 mov %edx,(%esi) if ( new_priority != RTEMS_CURRENT_PRIORITY ) { 10dd77: 85 db test %ebx,%ebx 10dd79: 74 1b je 10dd96 the_thread->real_priority = new_priority; 10dd7b: 89 58 18 mov %ebx,0x18(%eax) if ( the_thread->resource_count == 0 || 10dd7e: 83 78 1c 00 cmpl $0x0,0x1c(%eax) 10dd82: 74 05 je 10dd89 10dd84: 39 58 14 cmp %ebx,0x14(%eax) 10dd87: 76 0d jbe 10dd96 <== ALWAYS TAKEN the_thread->current_priority > new_priority ) _Thread_Change_priority( the_thread, new_priority, false ); 10dd89: 52 push %edx 10dd8a: 6a 00 push $0x0 10dd8c: 53 push %ebx 10dd8d: 50 push %eax 10dd8e: e8 9d 1a 00 00 call 10f830 <_Thread_Change_priority> 10dd93: 83 c4 10 add $0x10,%esp } _Thread_Enable_dispatch(); 10dd96: e8 6b 1e 00 00 call 10fc06 <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 10dd9b: 31 c0 xor %eax,%eax 10dd9d: eb 05 jmp 10dda4 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 10dd9f: b8 04 00 00 00 mov $0x4,%eax } 10dda4: 8d 65 f8 lea -0x8(%ebp),%esp 10dda7: 5b pop %ebx 10dda8: 5e pop %esi 10dda9: c9 leave 10ddaa: c3 ret =============================================================================== 00108507 : } } rtems_status_code rtems_termios_close (void *arg) { 108507: 55 push %ebp 108508: 89 e5 mov %esp,%ebp 10850a: 56 push %esi 10850b: 53 push %ebx 10850c: 8b 75 08 mov 0x8(%ebp),%esi rtems_libio_open_close_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 10850f: 8b 06 mov (%esi),%eax 108511: 8b 58 34 mov 0x34(%eax),%ebx rtems_status_code sc; sc = rtems_semaphore_obtain( 108514: 51 push %ecx 108515: 6a 00 push $0x0 108517: 6a 00 push $0x0 108519: ff 35 3c 52 12 00 pushl 0x12523c 10851f: e8 44 1c 00 00 call 10a168 rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) 108524: 83 c4 10 add $0x10,%esp 108527: 85 c0 test %eax,%eax 108529: 0f 85 88 00 00 00 jne 1085b7 <== NEVER TAKEN rtems_fatal_error_occurred (sc); if (--tty->refcount == 0) { 10852f: 8b 43 08 mov 0x8(%ebx),%eax 108532: 48 dec %eax 108533: 89 43 08 mov %eax,0x8(%ebx) 108536: 85 c0 test %eax,%eax 108538: 0f 85 3e 01 00 00 jne 10867c if (rtems_termios_linesw[tty->t_line].l_close != NULL) { 10853e: 8b 83 cc 00 00 00 mov 0xcc(%ebx),%eax 108544: c1 e0 05 shl $0x5,%eax 108547: 8b 80 f8 4e 12 00 mov 0x124ef8(%eax),%eax 10854d: 85 c0 test %eax,%eax 10854f: 74 08 je 108559 /* * call discipline-specific close */ sc = rtems_termios_linesw[tty->t_line].l_close(tty); 108551: 83 ec 0c sub $0xc,%esp 108554: 53 push %ebx 108555: ff d0 call *%eax 108557: eb 26 jmp 10857f } else { /* * default: just flush output buffer */ sc = rtems_semaphore_obtain(tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 108559: 52 push %edx 10855a: 6a 00 push $0x0 10855c: 6a 00 push $0x0 10855e: ff 73 18 pushl 0x18(%ebx) 108561: e8 02 1c 00 00 call 10a168 if (sc != RTEMS_SUCCESSFUL) { 108566: 83 c4 10 add $0x10,%esp 108569: 85 c0 test %eax,%eax 10856b: 75 4a jne 1085b7 <== NEVER TAKEN rtems_fatal_error_occurred (sc); } drainOutput (tty); 10856d: 89 d8 mov %ebx,%eax 10856f: e8 10 fb ff ff call 108084 rtems_semaphore_release (tty->osem); 108574: 83 ec 0c sub $0xc,%esp 108577: ff 73 18 pushl 0x18(%ebx) 10857a: e8 d5 1c 00 00 call 10a254 10857f: 83 c4 10 add $0x10,%esp } if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { 108582: 83 bb b4 00 00 00 02 cmpl $0x2,0xb4(%ebx) 108589: 75 35 jne 1085c0 /* * send "terminate" to I/O tasks */ sc = rtems_event_send( tty->rxTaskId, TERMIOS_RX_TERMINATE_EVENT ); 10858b: 50 push %eax 10858c: 50 push %eax 10858d: 6a 01 push $0x1 10858f: ff b3 c4 00 00 00 pushl 0xc4(%ebx) 108595: e8 66 17 00 00 call 109d00 if (sc != RTEMS_SUCCESSFUL) 10859a: 83 c4 10 add $0x10,%esp 10859d: 85 c0 test %eax,%eax 10859f: 75 16 jne 1085b7 <== NEVER TAKEN rtems_fatal_error_occurred (sc); sc = rtems_event_send( tty->txTaskId, TERMIOS_TX_TERMINATE_EVENT ); 1085a1: 51 push %ecx 1085a2: 51 push %ecx 1085a3: 6a 01 push $0x1 1085a5: ff b3 c8 00 00 00 pushl 0xc8(%ebx) 1085ab: e8 50 17 00 00 call 109d00 if (sc != RTEMS_SUCCESSFUL) 1085b0: 83 c4 10 add $0x10,%esp 1085b3: 85 c0 test %eax,%eax 1085b5: 74 09 je 1085c0 <== ALWAYS TAKEN rtems_fatal_error_occurred (sc); 1085b7: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 1085ba: 50 push %eax <== NOT EXECUTED 1085bb: e8 74 21 00 00 call 10a734 <== NOT EXECUTED } if (tty->device.lastClose) 1085c0: 8b 83 9c 00 00 00 mov 0x9c(%ebx),%eax 1085c6: 85 c0 test %eax,%eax 1085c8: 74 0d je 1085d7 (*tty->device.lastClose)(tty->major, tty->minor, arg); 1085ca: 52 push %edx 1085cb: 56 push %esi 1085cc: ff 73 10 pushl 0x10(%ebx) 1085cf: ff 73 0c pushl 0xc(%ebx) 1085d2: ff d0 call *%eax 1085d4: 83 c4 10 add $0x10,%esp if (tty->forw == NULL) { 1085d7: 8b 13 mov (%ebx),%edx 1085d9: 85 d2 test %edx,%edx 1085db: 8b 43 04 mov 0x4(%ebx),%eax 1085de: 75 11 jne 1085f1 rtems_termios_ttyTail = tty->back; 1085e0: a3 40 52 12 00 mov %eax,0x125240 if ( rtems_termios_ttyTail != NULL ) { 1085e5: 85 c0 test %eax,%eax 1085e7: 74 0b je 1085f4 rtems_termios_ttyTail->forw = NULL; 1085e9: c7 00 00 00 00 00 movl $0x0,(%eax) 1085ef: eb 03 jmp 1085f4 } } else { tty->forw->back = tty->back; 1085f1: 89 42 04 mov %eax,0x4(%edx) } if (tty->back == NULL) { 1085f4: 8b 53 04 mov 0x4(%ebx),%edx 1085f7: 85 d2 test %edx,%edx 1085f9: 8b 03 mov (%ebx),%eax 1085fb: 75 12 jne 10860f <== NEVER TAKEN rtems_termios_ttyHead = tty->forw; 1085fd: a3 44 52 12 00 mov %eax,0x125244 if ( rtems_termios_ttyHead != NULL ) { 108602: 85 c0 test %eax,%eax 108604: 74 0b je 108611 rtems_termios_ttyHead->back = NULL; 108606: c7 40 04 00 00 00 00 movl $0x0,0x4(%eax) 10860d: eb 02 jmp 108611 } } else { tty->back->forw = tty->forw; 10860f: 89 02 mov %eax,(%edx) } rtems_semaphore_delete (tty->isem); 108611: 83 ec 0c sub $0xc,%esp 108614: ff 73 14 pushl 0x14(%ebx) 108617: e8 bc 1a 00 00 call 10a0d8 rtems_semaphore_delete (tty->osem); 10861c: 59 pop %ecx 10861d: ff 73 18 pushl 0x18(%ebx) 108620: e8 b3 1a 00 00 call 10a0d8 rtems_semaphore_delete (tty->rawOutBuf.Semaphore); 108625: 5a pop %edx 108626: ff b3 8c 00 00 00 pushl 0x8c(%ebx) 10862c: e8 a7 1a 00 00 call 10a0d8 if ((tty->device.pollRead == NULL) || 108631: 83 c4 10 add $0x10,%esp 108634: 83 bb a0 00 00 00 00 cmpl $0x0,0xa0(%ebx) 10863b: 74 09 je 108646 10863d: 83 bb b4 00 00 00 02 cmpl $0x2,0xb4(%ebx) 108644: 75 0e jne 108654 (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)) rtems_semaphore_delete (tty->rawInBuf.Semaphore); 108646: 83 ec 0c sub $0xc,%esp 108649: ff 73 68 pushl 0x68(%ebx) 10864c: e8 87 1a 00 00 call 10a0d8 108651: 83 c4 10 add $0x10,%esp free (tty->rawInBuf.theBuf); 108654: 83 ec 0c sub $0xc,%esp 108657: ff 73 58 pushl 0x58(%ebx) 10865a: e8 e9 ec ff ff call 107348 free (tty->rawOutBuf.theBuf); 10865f: 58 pop %eax 108660: ff 73 7c pushl 0x7c(%ebx) 108663: e8 e0 ec ff ff call 107348 free (tty->cbuf); 108668: 5e pop %esi 108669: ff 73 1c pushl 0x1c(%ebx) 10866c: e8 d7 ec ff ff call 107348 free (tty); 108671: 89 1c 24 mov %ebx,(%esp) 108674: e8 cf ec ff ff call 107348 108679: 83 c4 10 add $0x10,%esp } rtems_semaphore_release (rtems_termios_ttyMutex); 10867c: 83 ec 0c sub $0xc,%esp 10867f: ff 35 3c 52 12 00 pushl 0x12523c 108685: e8 ca 1b 00 00 call 10a254 return RTEMS_SUCCESSFUL; } 10868a: 31 c0 xor %eax,%eax 10868c: 8d 65 f8 lea -0x8(%ebp),%esp 10868f: 5b pop %ebx 108690: 5e pop %esi 108691: c9 leave 108692: c3 ret =============================================================================== 00109840 : * for each transmitted character. * It returns number of characters left to transmit */ int rtems_termios_dequeue_characters (void *ttyp, int len) { 109840: 55 push %ebp 109841: 89 e5 mov %esp,%ebp 109843: 83 ec 08 sub $0x8,%esp 109846: 8b 45 08 mov 0x8(%ebp),%eax rtems_status_code sc; /* * sum up character count already sent */ tty->t_dqlen += len; 109849: 8b 55 0c mov 0xc(%ebp),%edx 10984c: 01 90 90 00 00 00 add %edx,0x90(%eax) if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { 109852: 83 b8 b4 00 00 00 02 cmpl $0x2,0xb4(%eax) 109859: 75 1f jne 10987a /* * send wake up to transmitter task */ sc = rtems_event_send(tty->txTaskId, TERMIOS_TX_START_EVENT); 10985b: 52 push %edx 10985c: 52 push %edx 10985d: 6a 02 push $0x2 10985f: ff b0 c8 00 00 00 pushl 0xc8(%eax) 109865: e8 96 04 00 00 call 109d00 if (sc != RTEMS_SUCCESSFUL) 10986a: 83 c4 10 add $0x10,%esp 10986d: 85 c0 test %eax,%eax 10986f: 74 30 je 1098a1 <== ALWAYS TAKEN rtems_fatal_error_occurred (sc); 109871: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 109874: 50 push %eax <== NOT EXECUTED 109875: e8 ba 0e 00 00 call 10a734 <== NOT EXECUTED return 0; /* nothing to output in IRQ... */ } if (tty->t_line == PPPDISC ) { 10987a: 83 b8 cc 00 00 00 05 cmpl $0x5,0xcc(%eax) 109881: 75 15 jne 109898 /* * call any line discipline start function */ if (rtems_termios_linesw[tty->t_line].l_start != NULL) { 109883: 8b 15 a8 4f 12 00 mov 0x124fa8,%edx 109889: 85 d2 test %edx,%edx 10988b: 74 14 je 1098a1 <== NEVER TAKEN rtems_termios_linesw[tty->t_line].l_start(tty); 10988d: 83 ec 0c sub $0xc,%esp 109890: 50 push %eax 109891: ff d2 call *%edx 109893: 83 c4 10 add $0x10,%esp 109896: eb 09 jmp 1098a1 } return 0; /* nothing to output in IRQ... */ } return rtems_termios_refill_transmitter(tty); 109898: 89 45 08 mov %eax,0x8(%ebp) } 10989b: c9 leave rtems_termios_linesw[tty->t_line].l_start(tty); } return 0; /* nothing to output in IRQ... */ } return rtems_termios_refill_transmitter(tty); 10989c: e9 6d fd ff ff jmp 10960e } 1098a1: 31 c0 xor %eax,%eax 1098a3: c9 leave 1098a4: c3 ret =============================================================================== 0010931f : * 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) { 10931f: 55 push %ebp 109320: 89 e5 mov %esp,%ebp 109322: 57 push %edi 109323: 56 push %esi 109324: 53 push %ebx 109325: 83 ec 2c sub $0x2c,%esp 109328: 8b 5d 08 mov 0x8(%ebp),%ebx 10932b: 8b 7d 0c mov 0xc(%ebp),%edi 10932e: 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) { 109331: 8b 83 cc 00 00 00 mov 0xcc(%ebx),%eax 109337: c1 e0 05 shl $0x5,%eax 10933a: 89 ca mov %ecx,%edx 10933c: 83 b8 04 4f 12 00 00 cmpl $0x0,0x124f04(%eax) 109343: 75 3b jne 109380 109345: 89 4d e0 mov %ecx,-0x20(%ebp) 109348: c6 45 df 00 movb $0x0,-0x21(%ebp) 10934c: 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); 10934e: 8d 43 30 lea 0x30(%ebx),%eax 109351: 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, 109354: 8d 53 4a lea 0x4a(%ebx),%edx 109357: 89 55 d0 mov %edx,-0x30(%ebp) 10935a: e9 26 02 00 00 jmp 109585 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++; 10935f: 0f be 0f movsbl (%edi),%ecx 109362: 47 inc %edi rtems_termios_linesw[tty->t_line].l_rint(c,tty); 109363: 56 push %esi 109364: 56 push %esi 109365: 8b 83 cc 00 00 00 mov 0xcc(%ebx),%eax 10936b: c1 e0 05 shl $0x5,%eax 10936e: 53 push %ebx 10936f: 51 push %ecx 109370: 89 55 cc mov %edx,-0x34(%ebp) 109373: ff 90 04 4f 12 00 call *0x124f04(%eax) 109379: 8b 55 cc mov -0x34(%ebp),%edx 10937c: 4a dec %edx 10937d: 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--) { 109380: 85 d2 test %edx,%edx 109382: 75 db jne 10935f */ 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; 109384: 31 f6 xor %esi,%esi } /* * check to see if rcv wakeup callback was set */ if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) { 109386: 83 bb e4 00 00 00 00 cmpl $0x0,0xe4(%ebx) 10938d: 0f 85 0d 02 00 00 jne 1095a0 <== NEVER TAKEN 109393: 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; 109399: 89 d6 mov %edx,%esi } /* * check to see if rcv wakeup callback was set */ if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) { 10939b: 85 c0 test %eax,%eax 10939d: 0f 84 fd 01 00 00 je 1095a0 <== NEVER TAKEN (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg); 1093a3: 51 push %ecx 1093a4: 51 push %ecx 1093a5: ff b3 e0 00 00 00 pushl 0xe0(%ebx) 1093ab: 8d 53 30 lea 0x30(%ebx),%edx 1093ae: 52 push %edx 1093af: ff d0 call *%eax tty->tty_rcvwakeup = 1; 1093b1: c7 83 e4 00 00 00 01 movl $0x1,0xe4(%ebx) 1093b8: 00 00 00 1093bb: e9 dd 01 00 00 jmp 10959d } return 0; } while (len--) { c = *buf++; 1093c0: 8a 0f mov (%edi),%cl 1093c2: 88 4d de mov %cl,-0x22(%ebp) 1093c5: 47 inc %edi /* FIXME: implement IXANY: any character restarts output */ /* if incoming XON/XOFF controls outgoing stream: */ if (tty->flow_ctrl & FL_MDXON) { 1093c6: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax 1093cc: f6 c4 02 test $0x2,%ah 1093cf: 74 46 je 109417 /* if received char is V_STOP and V_START (both are equal value) */ if (c == tty->termios.c_cc[VSTOP]) { 1093d1: 0f be c1 movsbl %cl,%eax 1093d4: 0f b6 53 4a movzbl 0x4a(%ebx),%edx 1093d8: 39 d0 cmp %edx,%eax 1093da: 75 28 jne 109404 if (c == tty->termios.c_cc[VSTART]) { 1093dc: 0f b6 53 49 movzbl 0x49(%ebx),%edx 1093e0: 39 d0 cmp %edx,%eax 1093e2: 75 0b jne 1093ef <== ALWAYS TAKEN /* received VSTOP and VSTART==VSTOP? */ /* then toggle "stop output" status */ tty->flow_ctrl = tty->flow_ctrl ^ FL_ORCVXOF; 1093e4: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED 1093ea: 83 f0 10 xor $0x10,%eax <== NOT EXECUTED 1093ed: eb 09 jmp 1093f8 <== NOT EXECUTED } else { /* VSTOP received (other code than VSTART) */ /* stop output */ tty->flow_ctrl |= FL_ORCVXOF; 1093ef: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax 1093f5: 83 c8 10 or $0x10,%eax 1093f8: 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) { 1093fe: c6 45 df 01 movb $0x1,-0x21(%ebp) 109402: eb 19 jmp 10941d /* stop output */ tty->flow_ctrl |= FL_ORCVXOF; } flow_rcv = true; } else if (c == tty->termios.c_cc[VSTART]) { 109404: 0f b6 53 49 movzbl 0x49(%ebx),%edx 109408: 39 d0 cmp %edx,%eax 10940a: 75 0b jne 109417 <== ALWAYS TAKEN /* VSTART received */ /* restart output */ tty->flow_ctrl &= ~FL_ORCVXOF; 10940c: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED 109412: 83 e0 ef and $0xffffffef,%eax <== NOT EXECUTED 109415: eb e1 jmp 1093f8 <== NOT EXECUTED flow_rcv = true; } } if (flow_rcv) { 109417: 80 7d df 00 cmpb $0x0,-0x21(%ebp) 10941b: 74 51 je 10946e <== ALWAYS TAKEN /* restart output according to FL_ORCVXOF flag */ if ((tty->flow_ctrl & (FL_ORCVXOF | FL_OSTOP)) == FL_OSTOP) { 10941d: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax 109423: 83 e0 30 and $0x30,%eax 109426: 83 f8 20 cmp $0x20,%eax 109429: 0f 85 53 01 00 00 jne 109582 <== ALWAYS TAKEN /* disable interrupts */ rtems_interrupt_disable(level); 10942f: 9c pushf <== NOT EXECUTED 109430: fa cli <== NOT EXECUTED 109431: 8f 45 e4 popl -0x1c(%ebp) <== NOT EXECUTED tty->flow_ctrl &= ~FL_OSTOP; 109434: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED 10943a: 83 e0 df and $0xffffffdf,%eax <== NOT EXECUTED 10943d: 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) { 109443: 83 bb 94 00 00 00 00 cmpl $0x0,0x94(%ebx) <== NOT EXECUTED 10944a: 74 19 je 109465 <== NOT EXECUTED /* if chars available, call write function... */ (*tty->device.write)( tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail], 1); 10944c: 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)( 109452: 52 push %edx <== NOT EXECUTED 109453: 6a 01 push $0x1 <== NOT EXECUTED 109455: 03 43 7c add 0x7c(%ebx),%eax <== NOT EXECUTED 109458: 50 push %eax <== NOT EXECUTED 109459: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED 10945c: ff 93 a4 00 00 00 call *0xa4(%ebx) <== NOT EXECUTED 109462: 83 c4 10 add $0x10,%esp <== NOT EXECUTED tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail], 1); } /* reenable interrupts */ rtems_interrupt_enable(level); 109465: ff 75 e4 pushl -0x1c(%ebp) <== NOT EXECUTED 109468: 9d popf <== NOT EXECUTED 109469: e9 14 01 00 00 jmp 109582 <== NOT EXECUTED } } else { newTail = (tty->rawInBuf.Tail + 1) % tty->rawInBuf.Size; 10946e: 8b 43 60 mov 0x60(%ebx),%eax 109471: 8b 4b 64 mov 0x64(%ebx),%ecx 109474: 40 inc %eax 109475: 31 d2 xor %edx,%edx 109477: f7 f1 div %ecx 109479: 89 55 e4 mov %edx,-0x1c(%ebp) /* if chars_in_buffer > highwater */ rtems_interrupt_disable(level); 10947c: 9c pushf 10947d: fa cli 10947e: 8f 45 d8 popl -0x28(%ebp) if ((((newTail - tty->rawInBuf.Head + tty->rawInBuf.Size) 109481: 8b 53 5c mov 0x5c(%ebx),%edx 109484: 8b 43 64 mov 0x64(%ebx),%eax % tty->rawInBuf.Size) > tty->highwater) && 109487: 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) 10948a: 29 d0 sub %edx,%eax 10948c: 03 45 e4 add -0x1c(%ebp),%eax % tty->rawInBuf.Size) > tty->highwater) && 10948f: 31 d2 xor %edx,%edx 109491: 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) 109493: 3b 93 c0 00 00 00 cmp 0xc0(%ebx),%edx 109499: 0f 86 98 00 00 00 jbe 109537 <== ALWAYS TAKEN % tty->rawInBuf.Size) > tty->highwater) && !(tty->flow_ctrl & FL_IREQXOF)) { 10949f: 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) && 1094a5: a8 01 test $0x1,%al <== NOT EXECUTED 1094a7: 0f 85 8a 00 00 00 jne 109537 <== NOT EXECUTED !(tty->flow_ctrl & FL_IREQXOF)) { /* incoming data stream should be stopped */ tty->flow_ctrl |= FL_IREQXOF; 1094ad: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED 1094b3: 83 c8 01 or $0x1,%eax <== NOT EXECUTED 1094b6: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED if ((tty->flow_ctrl & (FL_MDXOF | FL_ISNTXOF)) 1094bc: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED 1094c2: 25 02 04 00 00 and $0x402,%eax <== NOT EXECUTED 1094c7: 3d 00 04 00 00 cmp $0x400,%eax <== NOT EXECUTED 1094cc: 75 33 jne 109501 <== NOT EXECUTED == (FL_MDXOF ) ) { if ((tty->flow_ctrl & FL_OSTOP) || 1094ce: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED 1094d4: a8 20 test $0x20,%al <== NOT EXECUTED 1094d6: 75 09 jne 1094e1 <== NOT EXECUTED 1094d8: 83 bb 94 00 00 00 00 cmpl $0x0,0x94(%ebx) <== NOT EXECUTED 1094df: 75 56 jne 109537 <== 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; 1094e1: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED 1094e7: 83 c8 02 or $0x2,%eax <== NOT EXECUTED 1094ea: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED (*tty->device.write)(tty->minor, 1094f0: 51 push %ecx <== NOT EXECUTED 1094f1: 6a 01 push $0x1 <== NOT EXECUTED 1094f3: ff 75 d0 pushl -0x30(%ebp) <== NOT EXECUTED 1094f6: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED 1094f9: ff 93 a4 00 00 00 call *0xa4(%ebx) <== NOT EXECUTED 1094ff: eb 33 jmp 109534 <== NOT EXECUTED (void *)&(tty->termios.c_cc[VSTOP]), 1); } } else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) == (FL_MDRTS) ) { 109501: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED 109507: 25 04 01 00 00 and $0x104,%eax <== NOT EXECUTED 10950c: 3d 00 01 00 00 cmp $0x100,%eax <== NOT EXECUTED 109511: 75 24 jne 109537 <== NOT EXECUTED tty->flow_ctrl |= FL_IRTSOFF; 109513: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED 109519: 83 c8 04 or $0x4,%eax <== NOT EXECUTED 10951c: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED /* deactivate RTS line */ if (tty->device.stopRemoteTx != NULL) { 109522: 8b 83 ac 00 00 00 mov 0xac(%ebx),%eax <== NOT EXECUTED 109528: 85 c0 test %eax,%eax <== NOT EXECUTED 10952a: 74 0b je 109537 <== NOT EXECUTED tty->device.stopRemoteTx(tty->minor); 10952c: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 10952f: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED 109532: ff d0 call *%eax <== NOT EXECUTED 109534: 83 c4 10 add $0x10,%esp <== NOT EXECUTED } } } /* reenable interrupts */ rtems_interrupt_enable(level); 109537: ff 75 d8 pushl -0x28(%ebp) 10953a: 9d popf if (newTail == tty->rawInBuf.Head) { 10953b: 8b 43 5c mov 0x5c(%ebx),%eax 10953e: 39 45 e4 cmp %eax,-0x1c(%ebp) 109541: 75 03 jne 109546 <== ALWAYS TAKEN dropped++; 109543: 46 inc %esi <== NOT EXECUTED 109544: eb 3c jmp 109582 <== NOT EXECUTED } else { tty->rawInBuf.theBuf[newTail] = c; 109546: 8b 43 58 mov 0x58(%ebx),%eax 109549: 8a 4d de mov -0x22(%ebp),%cl 10954c: 8b 55 e4 mov -0x1c(%ebp),%edx 10954f: 88 0c 10 mov %cl,(%eax,%edx,1) tty->rawInBuf.Tail = newTail; 109552: 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 )) { 109555: 83 bb e4 00 00 00 00 cmpl $0x0,0xe4(%ebx) 10955c: 75 24 jne 109582 <== NEVER TAKEN 10955e: 8b 83 dc 00 00 00 mov 0xdc(%ebx),%eax 109564: 85 c0 test %eax,%eax 109566: 74 1a je 109582 <== ALWAYS TAKEN (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg); 109568: 52 push %edx <== NOT EXECUTED 109569: 52 push %edx <== NOT EXECUTED 10956a: ff b3 e0 00 00 00 pushl 0xe0(%ebx) <== NOT EXECUTED 109570: ff 75 d4 pushl -0x2c(%ebp) <== NOT EXECUTED 109573: ff d0 call *%eax <== NOT EXECUTED tty->tty_rcvwakeup = 1; 109575: c7 83 e4 00 00 00 01 movl $0x1,0xe4(%ebx) <== NOT EXECUTED 10957c: 00 00 00 10957f: 83 c4 10 add $0x10,%esp <== NOT EXECUTED 109582: ff 4d e0 decl -0x20(%ebp) tty->tty_rcvwakeup = 1; } return 0; } while (len--) { 109585: 83 7d e0 00 cmpl $0x0,-0x20(%ebp) 109589: 0f 85 31 fe ff ff jne 1093c0 } } } } tty->rawInBufDropped += dropped; 10958f: 01 73 78 add %esi,0x78(%ebx) rtems_semaphore_release (tty->rawInBuf.Semaphore); 109592: 83 ec 0c sub $0xc,%esp 109595: ff 73 68 pushl 0x68(%ebx) 109598: e8 b7 0c 00 00 call 10a254 return dropped; 10959d: 83 c4 10 add $0x10,%esp } 1095a0: 89 f0 mov %esi,%eax 1095a2: 8d 65 f4 lea -0xc(%ebp),%esp 1095a5: 5b pop %ebx 1095a6: 5e pop %esi 1095a7: 5f pop %edi 1095a8: c9 leave 1095a9: c3 ret =============================================================================== 001086b2 : } } rtems_status_code rtems_termios_ioctl (void *arg) { 1086b2: 55 push %ebp 1086b3: 89 e5 mov %esp,%ebp 1086b5: 57 push %edi 1086b6: 56 push %esi 1086b7: 53 push %ebx 1086b8: 83 ec 20 sub $0x20,%esp rtems_libio_ioctl_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 1086bb: 8b 55 08 mov 0x8(%ebp),%edx 1086be: 8b 02 mov (%edx),%eax 1086c0: 8b 58 34 mov 0x34(%eax),%ebx struct ttywakeup *wakeup = (struct ttywakeup *)args->buffer; 1086c3: 8b 72 08 mov 0x8(%edx),%esi rtems_status_code sc; args->ioctl_return = 0; 1086c6: c7 42 0c 00 00 00 00 movl $0x0,0xc(%edx) sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 1086cd: 6a 00 push $0x0 1086cf: 6a 00 push $0x0 1086d1: ff 73 18 pushl 0x18(%ebx) 1086d4: e8 8f 1a 00 00 call 10a168 1086d9: 89 45 e4 mov %eax,-0x1c(%ebp) if (sc != RTEMS_SUCCESSFUL) { 1086dc: 83 c4 10 add $0x10,%esp 1086df: 85 c0 test %eax,%eax 1086e1: 74 0b je 1086ee <== ALWAYS TAKEN args->ioctl_return = sc; 1086e3: 8b 4d 08 mov 0x8(%ebp),%ecx <== NOT EXECUTED 1086e6: 89 41 0c mov %eax,0xc(%ecx) <== NOT EXECUTED return sc; 1086e9: e9 05 03 00 00 jmp 1089f3 <== NOT EXECUTED } switch (args->command) { 1086ee: 8b 55 08 mov 0x8(%ebp),%edx 1086f1: 8b 42 04 mov 0x4(%edx),%eax 1086f4: 83 f8 04 cmp $0x4,%eax 1086f7: 0f 84 4d 02 00 00 je 10894a 1086fd: 77 10 ja 10870f 1086ff: 83 f8 02 cmp $0x2,%eax 108702: 74 77 je 10877b 108704: 0f 87 1e 02 00 00 ja 108928 10870a: 48 dec %eax 10870b: 75 2f jne 10873c <== NEVER TAKEN 10870d: eb 55 jmp 108764 10870f: 3d 7f 66 04 40 cmp $0x4004667f,%eax 108714: 0f 84 a5 02 00 00 je 1089bf <== NEVER TAKEN 10871a: 77 0a ja 108726 10871c: 83 f8 05 cmp $0x5,%eax 10871f: 75 1b jne 10873c 108721: e9 0e 02 00 00 jmp 108934 108726: 3d 1a 74 04 40 cmp $0x4004741a,%eax 10872b: 0f 84 7e 02 00 00 je 1089af 108731: 3d 1b 74 04 80 cmp $0x8004741b,%eax 108736: 0f 84 21 02 00 00 je 10895d <== ALWAYS TAKEN default: if (rtems_termios_linesw[tty->t_line].l_ioctl != NULL) { 10873c: 8b 83 cc 00 00 00 mov 0xcc(%ebx),%eax 108742: c1 e0 05 shl $0x5,%eax 108745: 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; 10874b: 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) { 108752: 85 c0 test %eax,%eax 108754: 0f 84 82 02 00 00 je 1089dc <== NEVER TAKEN sc = rtems_termios_linesw[tty->t_line].l_ioctl(tty,args); 10875a: 52 push %edx 10875b: 52 push %edx 10875c: ff 75 08 pushl 0x8(%ebp) 10875f: e9 40 02 00 00 jmp 1089a4 sc = RTEMS_INVALID_NUMBER; } break; case RTEMS_IO_GET_ATTRIBUTES: *(struct termios *)args->buffer = tty->termios; 108764: 8b 4d 08 mov 0x8(%ebp),%ecx 108767: 8b 41 08 mov 0x8(%ecx),%eax 10876a: 8d 73 30 lea 0x30(%ebx),%esi 10876d: b9 09 00 00 00 mov $0x9,%ecx 108772: 89 c7 mov %eax,%edi 108774: f3 a5 rep movsl %ds:(%esi),%es:(%edi) break; 108776: e9 61 02 00 00 jmp 1089dc case RTEMS_IO_SET_ATTRIBUTES: tty->termios = *(struct termios *)args->buffer; 10877b: 8b 45 08 mov 0x8(%ebp),%eax 10877e: 8b 70 08 mov 0x8(%eax),%esi 108781: 8d 7b 30 lea 0x30(%ebx),%edi 108784: b9 09 00 00 00 mov $0x9,%ecx 108789: 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) && 10878b: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax 108791: f6 c4 02 test $0x2,%ah 108794: 74 57 je 1087ed 108796: f6 43 31 04 testb $0x4,0x31(%ebx) 10879a: 75 51 jne 1087ed !(tty->termios.c_iflag & IXON)) { /* clear related flags in flow_ctrl */ tty->flow_ctrl &= ~(FL_MDXON | FL_ORCVXOF); 10879c: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax 1087a2: 25 ef fd ff ff and $0xfffffdef,%eax 1087a7: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) /* has output been stopped due to received XOFF? */ if (tty->flow_ctrl & FL_OSTOP) { 1087ad: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax 1087b3: a8 20 test $0x20,%al 1087b5: 74 36 je 1087ed <== ALWAYS TAKEN /* disable interrupts */ rtems_interrupt_disable(level); 1087b7: 9c pushf <== NOT EXECUTED 1087b8: fa cli <== NOT EXECUTED 1087b9: 5e pop %esi <== NOT EXECUTED tty->flow_ctrl &= ~FL_OSTOP; 1087ba: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED 1087c0: 83 e0 df and $0xffffffdf,%eax <== NOT EXECUTED 1087c3: 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) { 1087c9: 83 bb 94 00 00 00 00 cmpl $0x0,0x94(%ebx) <== NOT EXECUTED 1087d0: 74 19 je 1087eb <== NOT EXECUTED /* if chars available, call write function... */ (*tty->device.write)( tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1); 1087d2: 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)( 1087d8: 57 push %edi <== NOT EXECUTED 1087d9: 6a 01 push $0x1 <== NOT EXECUTED 1087db: 03 43 7c add 0x7c(%ebx),%eax <== NOT EXECUTED 1087de: 50 push %eax <== NOT EXECUTED 1087df: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED 1087e2: ff 93 a4 00 00 00 call *0xa4(%ebx) <== NOT EXECUTED 1087e8: 83 c4 10 add $0x10,%esp <== NOT EXECUTED tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1); } /* reenable interrupts */ rtems_interrupt_enable(level); 1087eb: 56 push %esi <== NOT EXECUTED 1087ec: 9d popf <== NOT EXECUTED } } /* check for incoming XON/XOFF flow control switched off */ if (( tty->flow_ctrl & FL_MDXOF) && !(tty->termios.c_iflag & IXOFF)) { 1087ed: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax 1087f3: f6 c4 04 test $0x4,%ah 1087f6: 74 24 je 10881c 1087f8: f6 43 31 10 testb $0x10,0x31(%ebx) 1087fc: 75 1e jne 10881c <== NEVER TAKEN /* clear related flags in flow_ctrl */ tty->flow_ctrl &= ~(FL_MDXOF); 1087fe: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax 108804: 80 e4 fb and $0xfb,%ah 108807: 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); 10880d: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax 108813: 83 e0 fd and $0xfffffffd,%eax 108816: 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)) { 10881c: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax 108822: f6 c4 01 test $0x1,%ah 108825: 74 43 je 10886a <== ALWAYS TAKEN 108827: 83 7b 38 00 cmpl $0x0,0x38(%ebx) <== NOT EXECUTED 10882b: 78 3d js 10886a <== NOT EXECUTED /* clear related flags in flow_ctrl */ tty->flow_ctrl &= ~(FL_MDRTS); 10882d: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED 108833: 80 e4 fe and $0xfe,%ah <== NOT EXECUTED 108836: 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)) { 10883c: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED 108842: a8 04 test $0x4,%al <== NOT EXECUTED 108844: 74 15 je 10885b <== NOT EXECUTED 108846: 8b 83 b0 00 00 00 mov 0xb0(%ebx),%eax <== NOT EXECUTED 10884c: 85 c0 test %eax,%eax <== NOT EXECUTED 10884e: 74 0b je 10885b <== NOT EXECUTED tty->device.startRemoteTx(tty->minor); 108850: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 108853: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED 108856: ff d0 call *%eax <== NOT EXECUTED 108858: 83 c4 10 add $0x10,%esp <== NOT EXECUTED } tty->flow_ctrl &= ~(FL_IRTSOFF); 10885b: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED 108861: 83 e0 fb and $0xfffffffb,%eax <== NOT EXECUTED 108864: 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) { 10886a: 83 7b 38 00 cmpl $0x0,0x38(%ebx) 10886e: 79 0f jns 10887f <== ALWAYS TAKEN tty->flow_ctrl |= FL_MDRTS; 108870: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED 108876: 80 cc 01 or $0x1,%ah <== NOT EXECUTED 108879: 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) { 10887f: 8b 53 30 mov 0x30(%ebx),%edx 108882: f6 c6 10 test $0x10,%dh 108885: 74 0f je 108896 tty->flow_ctrl |= FL_MDXOF; 108887: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax 10888d: 80 cc 04 or $0x4,%ah 108890: 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) { 108896: 80 e6 04 and $0x4,%dh 108899: 74 0f je 1088aa tty->flow_ctrl |= FL_MDXON; 10889b: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax 1088a1: 80 cc 02 or $0x2,%ah 1088a4: 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) { 1088aa: f6 43 3c 02 testb $0x2,0x3c(%ebx) 1088ae: 75 39 jne 1088e9 tty->rawInBufSemaphoreOptions = RTEMS_WAIT; tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT; tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT; } else { tty->vtimeTicks = tty->termios.c_cc[VTIME] * 1088b0: 0f b6 73 46 movzbl 0x46(%ebx),%esi rtems_clock_get_ticks_per_second() / 10; 1088b4: e8 6f 12 00 00 call 109b28 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] * 1088b9: 0f af c6 imul %esi,%eax rtems_clock_get_ticks_per_second() / 10; 1088bc: b9 0a 00 00 00 mov $0xa,%ecx 1088c1: 31 d2 xor %edx,%edx 1088c3: 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] * 1088c5: 89 43 54 mov %eax,0x54(%ebx) rtems_clock_get_ticks_per_second() / 10; if (tty->termios.c_cc[VTIME]) { 1088c8: 80 7b 46 00 cmpb $0x0,0x46(%ebx) 1088cc: 74 15 je 1088e3 tty->rawInBufSemaphoreOptions = RTEMS_WAIT; 1088ce: c7 43 6c 00 00 00 00 movl $0x0,0x6c(%ebx) tty->rawInBufSemaphoreTimeout = tty->vtimeTicks; 1088d5: 89 43 70 mov %eax,0x70(%ebx) if (tty->termios.c_cc[VMIN]) 1088d8: 80 7b 47 00 cmpb $0x0,0x47(%ebx) 1088dc: 75 19 jne 1088f7 tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT; else tty->rawInBufSemaphoreFirstTimeout = tty->vtimeTicks; 1088de: 89 43 74 mov %eax,0x74(%ebx) 1088e1: eb 24 jmp 108907 } else { if (tty->termios.c_cc[VMIN]) { 1088e3: 80 7b 47 00 cmpb $0x0,0x47(%ebx) 1088e7: 74 17 je 108900 <== ALWAYS TAKEN tty->rawInBufSemaphoreOptions = RTEMS_WAIT; 1088e9: c7 43 6c 00 00 00 00 movl $0x0,0x6c(%ebx) tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT; 1088f0: c7 43 70 00 00 00 00 movl $0x0,0x70(%ebx) tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT; 1088f7: c7 43 74 00 00 00 00 movl $0x0,0x74(%ebx) 1088fe: eb 07 jmp 108907 } else { tty->rawInBufSemaphoreOptions = RTEMS_NO_WAIT; 108900: c7 43 6c 01 00 00 00 movl $0x1,0x6c(%ebx) } } } if (tty->device.setAttributes) 108907: 8b 83 a8 00 00 00 mov 0xa8(%ebx),%eax 10890d: 85 c0 test %eax,%eax 10890f: 0f 84 c7 00 00 00 je 1089dc <== NEVER TAKEN (*tty->device.setAttributes)(tty->minor, &tty->termios); 108915: 56 push %esi 108916: 56 push %esi 108917: 8d 53 30 lea 0x30(%ebx),%edx 10891a: 52 push %edx 10891b: ff 73 10 pushl 0x10(%ebx) 10891e: ff d0 call *%eax 108920: 83 c4 10 add $0x10,%esp 108923: e9 b4 00 00 00 jmp 1089dc break; case RTEMS_IO_TCDRAIN: drainOutput (tty); 108928: 89 d8 mov %ebx,%eax 10892a: e8 55 f7 ff ff call 108084 break; 10892f: e9 a8 00 00 00 jmp 1089dc case RTEMS_IO_SNDWAKEUP: tty->tty_snd = *wakeup; 108934: 8b 06 mov (%esi),%eax 108936: 8b 56 04 mov 0x4(%esi),%edx 108939: 89 83 d4 00 00 00 mov %eax,0xd4(%ebx) 10893f: 89 93 d8 00 00 00 mov %edx,0xd8(%ebx) break; 108945: e9 92 00 00 00 jmp 1089dc case RTEMS_IO_RCVWAKEUP: tty->tty_rcv = *wakeup; 10894a: 8b 06 mov (%esi),%eax 10894c: 8b 56 04 mov 0x4(%esi),%edx 10894f: 89 83 dc 00 00 00 mov %eax,0xdc(%ebx) 108955: 89 93 e0 00 00 00 mov %edx,0xe0(%ebx) break; 10895b: eb 7f jmp 1089dc #if 1 /* FIXME */ case TIOCSETD: /* * close old line discipline */ if (rtems_termios_linesw[tty->t_line].l_close != NULL) { 10895d: 8b 83 cc 00 00 00 mov 0xcc(%ebx),%eax 108963: c1 e0 05 shl $0x5,%eax 108966: 8b 80 f8 4e 12 00 mov 0x124ef8(%eax),%eax 10896c: 85 c0 test %eax,%eax 10896e: 74 0c je 10897c sc = rtems_termios_linesw[tty->t_line].l_close(tty); 108970: 83 ec 0c sub $0xc,%esp 108973: 53 push %ebx 108974: ff d0 call *%eax 108976: 89 45 e4 mov %eax,-0x1c(%ebp) 108979: 83 c4 10 add $0x10,%esp } tty->t_line=*(int*)(args->buffer); 10897c: 8b 55 08 mov 0x8(%ebp),%edx 10897f: 8b 42 08 mov 0x8(%edx),%eax 108982: 8b 00 mov (%eax),%eax 108984: 89 83 cc 00 00 00 mov %eax,0xcc(%ebx) tty->t_sc = NULL; /* ensure that no more valid data */ 10898a: c7 83 d0 00 00 00 00 movl $0x0,0xd0(%ebx) 108991: 00 00 00 /* * open new line discipline */ if (rtems_termios_linesw[tty->t_line].l_open != NULL) { 108994: c1 e0 05 shl $0x5,%eax 108997: 8b 80 f4 4e 12 00 mov 0x124ef4(%eax),%eax 10899d: 85 c0 test %eax,%eax 10899f: 74 3b je 1089dc <== NEVER TAKEN sc = rtems_termios_linesw[tty->t_line].l_open(tty); 1089a1: 83 ec 0c sub $0xc,%esp 1089a4: 53 push %ebx 1089a5: ff d0 call *%eax 1089a7: 89 45 e4 mov %eax,-0x1c(%ebp) 1089aa: e9 71 ff ff ff jmp 108920 } break; case TIOCGETD: *(int*)(args->buffer)=tty->t_line; 1089af: 8b 4d 08 mov 0x8(%ebp),%ecx 1089b2: 8b 41 08 mov 0x8(%ecx),%eax 1089b5: 8b 93 cc 00 00 00 mov 0xcc(%ebx),%edx 1089bb: 89 10 mov %edx,(%eax) break; 1089bd: eb 1d jmp 1089dc #endif case FIONREAD: { int rawnc = tty->rawInBuf.Tail - tty->rawInBuf.Head; 1089bf: 8b 43 60 mov 0x60(%ebx),%eax <== NOT EXECUTED 1089c2: 8b 53 5c mov 0x5c(%ebx),%edx <== NOT EXECUTED if ( rawnc < 0 ) 1089c5: 29 d0 sub %edx,%eax <== NOT EXECUTED 1089c7: 79 05 jns 1089ce <== NOT EXECUTED rawnc += tty->rawInBuf.Size; 1089c9: 8b 53 64 mov 0x64(%ebx),%edx <== NOT EXECUTED 1089cc: 01 d0 add %edx,%eax <== NOT EXECUTED /* Half guess that this is the right operation */ *(int *)args->buffer = tty->ccount - tty->cindex + rawnc; 1089ce: 8b 4d 08 mov 0x8(%ebp),%ecx <== NOT EXECUTED 1089d1: 8b 51 08 mov 0x8(%ecx),%edx <== NOT EXECUTED 1089d4: 03 43 20 add 0x20(%ebx),%eax <== NOT EXECUTED 1089d7: 2b 43 24 sub 0x24(%ebx),%eax <== NOT EXECUTED 1089da: 89 02 mov %eax,(%edx) <== NOT EXECUTED } break; } rtems_semaphore_release (tty->osem); 1089dc: 83 ec 0c sub $0xc,%esp 1089df: ff 73 18 pushl 0x18(%ebx) 1089e2: e8 6d 18 00 00 call 10a254 args->ioctl_return = sc; 1089e7: 8b 55 e4 mov -0x1c(%ebp),%edx 1089ea: 8b 45 08 mov 0x8(%ebp),%eax 1089ed: 89 50 0c mov %edx,0xc(%eax) return sc; 1089f0: 83 c4 10 add $0x10,%esp } 1089f3: 8b 45 e4 mov -0x1c(%ebp),%eax 1089f6: 8d 65 f4 lea -0xc(%ebp),%esp 1089f9: 5b pop %ebx 1089fa: 5e pop %esi 1089fb: 5f pop %edi 1089fc: c9 leave 1089fd: c3 ret =============================================================================== 001080e1 : rtems_device_major_number major, rtems_device_minor_number minor, void *arg, const rtems_termios_callbacks *callbacks ) { 1080e1: 55 push %ebp 1080e2: 89 e5 mov %esp,%ebp 1080e4: 57 push %edi 1080e5: 56 push %esi 1080e6: 53 push %ebx 1080e7: 83 ec 20 sub $0x20,%esp struct rtems_termios_tty *tty; /* * See if the device has already been opened */ sc = rtems_semaphore_obtain( 1080ea: 6a 00 push $0x0 1080ec: 6a 00 push $0x0 1080ee: ff 35 3c 52 12 00 pushl 0x12523c 1080f4: e8 6f 20 00 00 call 10a168 1080f9: 89 45 e4 mov %eax,-0x1c(%ebp) rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) 1080fc: 83 c4 10 add $0x10,%esp 1080ff: 85 c0 test %eax,%eax 108101: 0f 85 d3 03 00 00 jne 1084da <== NEVER TAKEN return sc; for (tty = rtems_termios_ttyHead ; tty != NULL ; tty = tty->forw) { 108107: 8b 35 44 52 12 00 mov 0x125244,%esi 10810d: 89 f2 mov %esi,%edx 10810f: eb 16 jmp 108127 if ((tty->major == major) && (tty->minor == minor)) 108111: 8b 45 08 mov 0x8(%ebp),%eax 108114: 39 42 0c cmp %eax,0xc(%edx) 108117: 75 0c jne 108125 108119: 8b 4d 0c mov 0xc(%ebp),%ecx 10811c: 39 4a 10 cmp %ecx,0x10(%edx) 10811f: 0f 84 26 03 00 00 je 10844b <== 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) { 108125: 8b 12 mov (%edx),%edx 108127: 85 d2 test %edx,%edx 108129: 75 e6 jne 108111 10812b: e9 b5 03 00 00 jmp 1084e5 /* * Create a new device */ tty = calloc (1, sizeof (struct rtems_termios_tty)); if (tty == NULL) { rtems_semaphore_release (rtems_termios_ttyMutex); 108130: 83 ec 0c sub $0xc,%esp 108133: eb 30 jmp 108165 return RTEMS_NO_MEMORY; } /* * allocate raw input buffer */ tty->rawInBuf.Size = RAW_INPUT_BUFFER_SIZE; 108135: a1 74 30 12 00 mov 0x123074,%eax 10813a: 89 42 64 mov %eax,0x64(%edx) tty->rawInBuf.theBuf = malloc (tty->rawInBuf.Size); 10813d: 8b 42 64 mov 0x64(%edx),%eax 108140: 83 ec 0c sub $0xc,%esp 108143: 50 push %eax 108144: 89 55 e0 mov %edx,-0x20(%ebp) 108147: e8 98 f4 ff ff call 1075e4 10814c: 89 c7 mov %eax,%edi 10814e: 8b 55 e0 mov -0x20(%ebp),%edx 108151: 89 42 58 mov %eax,0x58(%edx) if (tty->rawInBuf.theBuf == NULL) { 108154: 83 c4 10 add $0x10,%esp 108157: 85 c0 test %eax,%eax 108159: 75 24 jne 10817f free(tty); 10815b: 83 ec 0c sub $0xc,%esp 10815e: 52 push %edx 10815f: e8 e4 f1 ff ff call 107348 rtems_semaphore_release (rtems_termios_ttyMutex); 108164: 5b pop %ebx 108165: ff 35 3c 52 12 00 pushl 0x12523c 10816b: e8 e4 20 00 00 call 10a254 return RTEMS_NO_MEMORY; 108170: 83 c4 10 add $0x10,%esp 108173: c7 45 e4 1a 00 00 00 movl $0x1a,-0x1c(%ebp) 10817a: e9 5b 03 00 00 jmp 1084da } /* * allocate raw output buffer */ tty->rawOutBuf.Size = RAW_OUTPUT_BUFFER_SIZE; 10817f: a1 78 30 12 00 mov 0x123078,%eax 108184: 89 82 88 00 00 00 mov %eax,0x88(%edx) tty->rawOutBuf.theBuf = malloc (tty->rawOutBuf.Size); 10818a: 8b 82 88 00 00 00 mov 0x88(%edx),%eax 108190: 83 ec 0c sub $0xc,%esp 108193: 50 push %eax 108194: 89 55 e0 mov %edx,-0x20(%ebp) 108197: e8 48 f4 ff ff call 1075e4 10819c: 8b 55 e0 mov -0x20(%ebp),%edx 10819f: 89 42 7c mov %eax,0x7c(%edx) if (tty->rawOutBuf.theBuf == NULL) { 1081a2: 83 c4 10 add $0x10,%esp 1081a5: 85 c0 test %eax,%eax 1081a7: 75 05 jne 1081ae <== ALWAYS TAKEN free((void *)(tty->rawInBuf.theBuf)); 1081a9: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 1081ac: eb 2e jmp 1081dc <== NOT EXECUTED return RTEMS_NO_MEMORY; } /* * allocate cooked buffer */ tty->cbuf = malloc (CBUFSIZE); 1081ae: 83 ec 0c sub $0xc,%esp 1081b1: ff 35 70 30 12 00 pushl 0x123070 1081b7: 89 55 e0 mov %edx,-0x20(%ebp) 1081ba: 89 45 dc mov %eax,-0x24(%ebp) 1081bd: e8 22 f4 ff ff call 1075e4 1081c2: 8b 55 e0 mov -0x20(%ebp),%edx 1081c5: 89 42 1c mov %eax,0x1c(%edx) if (tty->cbuf == NULL) { 1081c8: 83 c4 10 add $0x10,%esp 1081cb: 85 c0 test %eax,%eax 1081cd: 8b 4d dc mov -0x24(%ebp),%ecx 1081d0: 75 19 jne 1081eb free((void *)(tty->rawOutBuf.theBuf)); 1081d2: 83 ec 0c sub $0xc,%esp 1081d5: 51 push %ecx 1081d6: e8 6d f1 ff ff call 107348 free((void *)(tty->rawInBuf.theBuf)); 1081db: 59 pop %ecx 1081dc: 57 push %edi 1081dd: e8 66 f1 ff ff call 107348 free(tty); 1081e2: 5a pop %edx 1081e3: 8b 55 e0 mov -0x20(%ebp),%edx 1081e6: e9 73 ff ff ff jmp 10815e return RTEMS_NO_MEMORY; } /* * Initialize wakeup callbacks */ tty->tty_snd.sw_pfn = NULL; 1081eb: c7 82 d4 00 00 00 00 movl $0x0,0xd4(%edx) 1081f2: 00 00 00 tty->tty_snd.sw_arg = NULL; 1081f5: c7 82 d8 00 00 00 00 movl $0x0,0xd8(%edx) 1081fc: 00 00 00 tty->tty_rcv.sw_pfn = NULL; 1081ff: c7 82 dc 00 00 00 00 movl $0x0,0xdc(%edx) 108206: 00 00 00 tty->tty_rcv.sw_arg = NULL; 108209: c7 82 e0 00 00 00 00 movl $0x0,0xe0(%edx) 108210: 00 00 00 tty->tty_rcvwakeup = 0; 108213: c7 82 e4 00 00 00 00 movl $0x0,0xe4(%edx) 10821a: 00 00 00 /* * link tty */ tty->forw = rtems_termios_ttyHead; 10821d: 89 32 mov %esi,(%edx) tty->back = NULL; 10821f: c7 42 04 00 00 00 00 movl $0x0,0x4(%edx) if (rtems_termios_ttyHead != NULL) 108226: 85 f6 test %esi,%esi 108228: 74 03 je 10822d rtems_termios_ttyHead->back = tty; 10822a: 89 56 04 mov %edx,0x4(%esi) rtems_termios_ttyHead = tty; 10822d: 89 1d 44 52 12 00 mov %ebx,0x125244 if (rtems_termios_ttyTail == NULL) 108233: 83 3d 40 52 12 00 00 cmpl $0x0,0x125240 10823a: 75 06 jne 108242 rtems_termios_ttyTail = tty; 10823c: 89 1d 40 52 12 00 mov %ebx,0x125240 tty->minor = minor; 108242: 8b 45 0c mov 0xc(%ebp),%eax 108245: 89 43 10 mov %eax,0x10(%ebx) tty->major = major; 108248: 8b 4d 08 mov 0x8(%ebp),%ecx 10824b: 89 4b 0c mov %ecx,0xc(%ebx) /* * Set up mutex semaphores */ sc = rtems_semaphore_create ( 10824e: 83 ec 0c sub $0xc,%esp 108251: 8d 43 14 lea 0x14(%ebx),%eax 108254: 50 push %eax 108255: 6a 00 push $0x0 108257: 6a 54 push $0x54 108259: 6a 01 push $0x1 rtems_build_name ('T', 'R', 'i', c), 10825b: 0f be 05 7c 30 12 00 movsbl 0x12307c,%eax tty->major = major; /* * Set up mutex semaphores */ sc = rtems_semaphore_create ( 108262: 0d 00 69 52 54 or $0x54526900,%eax 108267: 50 push %eax 108268: 89 55 e0 mov %edx,-0x20(%ebp) 10826b: e8 d0 1c 00 00 call 109f40 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) 108270: 83 c4 20 add $0x20,%esp 108273: 85 c0 test %eax,%eax 108275: 8b 55 e0 mov -0x20(%ebp),%edx 108278: 0f 85 42 02 00 00 jne 1084c0 rtems_fatal_error_occurred (sc); sc = rtems_semaphore_create ( 10827e: 83 ec 0c sub $0xc,%esp 108281: 8d 43 18 lea 0x18(%ebx),%eax 108284: 50 push %eax 108285: 6a 00 push $0x0 108287: 6a 54 push $0x54 108289: 6a 01 push $0x1 rtems_build_name ('T', 'R', 'o', c), 10828b: 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 ( 108292: 0d 00 6f 52 54 or $0x54526f00,%eax 108297: 50 push %eax 108298: 89 55 e0 mov %edx,-0x20(%ebp) 10829b: e8 a0 1c 00 00 call 109f40 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) 1082a0: 83 c4 20 add $0x20,%esp 1082a3: 85 c0 test %eax,%eax 1082a5: 8b 55 e0 mov -0x20(%ebp),%edx 1082a8: 0f 85 12 02 00 00 jne 1084c0 rtems_fatal_error_occurred (sc); sc = rtems_semaphore_create ( 1082ae: 83 ec 0c sub $0xc,%esp 1082b1: 8d 83 8c 00 00 00 lea 0x8c(%ebx),%eax 1082b7: 50 push %eax 1082b8: 6a 00 push $0x0 1082ba: 6a 20 push $0x20 1082bc: 6a 00 push $0x0 rtems_build_name ('T', 'R', 'x', c), 1082be: 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 ( 1082c5: 0d 00 78 52 54 or $0x54527800,%eax 1082ca: 50 push %eax 1082cb: 89 55 e0 mov %edx,-0x20(%ebp) 1082ce: e8 6d 1c 00 00 call 109f40 rtems_build_name ('T', 'R', 'x', c), 0, RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_FIFO, RTEMS_NO_PRIORITY, &tty->rawOutBuf.Semaphore); if (sc != RTEMS_SUCCESSFUL) 1082d3: 83 c4 20 add $0x20,%esp 1082d6: 85 c0 test %eax,%eax 1082d8: 8b 55 e0 mov -0x20(%ebp),%edx 1082db: 0f 85 df 01 00 00 jne 1084c0 rtems_fatal_error_occurred (sc); tty->rawOutBufState = rob_idle; 1082e1: c7 83 94 00 00 00 00 movl $0x0,0x94(%ebx) 1082e8: 00 00 00 /* * Set callbacks */ tty->device = *callbacks; 1082eb: 8d bb 98 00 00 00 lea 0x98(%ebx),%edi 1082f1: b9 08 00 00 00 mov $0x8,%ecx 1082f6: 8b 75 14 mov 0x14(%ebp),%esi 1082f9: f3 a5 rep movsl %ds:(%esi),%es:(%edi) /* * Create I/O tasks */ if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { 1082fb: 83 bb b4 00 00 00 02 cmpl $0x2,0xb4(%ebx) 108302: 75 74 jne 108378 sc = rtems_task_create ( 108304: 50 push %eax 108305: 50 push %eax 108306: 8d 83 c8 00 00 00 lea 0xc8(%ebx),%eax 10830c: 50 push %eax 10830d: 6a 00 push $0x0 10830f: 68 00 05 00 00 push $0x500 108314: 68 00 04 00 00 push $0x400 108319: 6a 0a push $0xa rtems_build_name ('T', 'x', 'T', c), 10831b: 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 ( 108322: 0d 00 54 78 54 or $0x54785400,%eax 108327: 50 push %eax 108328: 89 55 e0 mov %edx,-0x20(%ebp) 10832b: e8 b4 1f 00 00 call 10a2e4 TERMIOS_TXTASK_STACKSIZE, RTEMS_NO_PREEMPT | RTEMS_NO_TIMESLICE | RTEMS_NO_ASR, RTEMS_NO_FLOATING_POINT | RTEMS_LOCAL, &tty->txTaskId); if (sc != RTEMS_SUCCESSFUL) 108330: 83 c4 20 add $0x20,%esp 108333: 85 c0 test %eax,%eax 108335: 8b 55 e0 mov -0x20(%ebp),%edx 108338: 0f 85 82 01 00 00 jne 1084c0 <== NEVER TAKEN rtems_fatal_error_occurred (sc); sc = rtems_task_create ( 10833e: 57 push %edi 10833f: 57 push %edi 108340: 8d 83 c4 00 00 00 lea 0xc4(%ebx),%eax 108346: 50 push %eax 108347: 6a 00 push $0x0 108349: 68 00 05 00 00 push $0x500 10834e: 68 00 04 00 00 push $0x400 108353: 6a 09 push $0x9 rtems_build_name ('R', 'x', 'T', c), 108355: 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 ( 10835c: 0d 00 54 78 52 or $0x52785400,%eax 108361: 50 push %eax 108362: 89 55 e0 mov %edx,-0x20(%ebp) 108365: e8 7a 1f 00 00 call 10a2e4 TERMIOS_RXTASK_STACKSIZE, RTEMS_NO_PREEMPT | RTEMS_NO_TIMESLICE | RTEMS_NO_ASR, RTEMS_NO_FLOATING_POINT | RTEMS_LOCAL, &tty->rxTaskId); if (sc != RTEMS_SUCCESSFUL) 10836a: 83 c4 20 add $0x20,%esp 10836d: 85 c0 test %eax,%eax 10836f: 8b 55 e0 mov -0x20(%ebp),%edx 108372: 0f 85 48 01 00 00 jne 1084c0 <== NEVER TAKEN rtems_fatal_error_occurred (sc); } if ((tty->device.pollRead == NULL) || 108378: 83 bb a0 00 00 00 00 cmpl $0x0,0xa0(%ebx) 10837f: 74 09 je 10838a 108381: 83 bb b4 00 00 00 02 cmpl $0x2,0xb4(%ebx) 108388: 75 30 jne 1083ba (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)){ sc = rtems_semaphore_create ( 10838a: 83 ec 0c sub $0xc,%esp 10838d: 8d 43 68 lea 0x68(%ebx),%eax 108390: 50 push %eax 108391: 6a 00 push $0x0 108393: 6a 24 push $0x24 108395: 6a 00 push $0x0 rtems_build_name ('T', 'R', 'r', c), 108397: 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 ( 10839e: 0d 00 72 52 54 or $0x54527200,%eax 1083a3: 50 push %eax 1083a4: 89 55 e0 mov %edx,-0x20(%ebp) 1083a7: e8 94 1b 00 00 call 109f40 rtems_build_name ('T', 'R', 'r', c), 0, RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_PRIORITY, RTEMS_NO_PRIORITY, &tty->rawInBuf.Semaphore); if (sc != RTEMS_SUCCESSFUL) 1083ac: 83 c4 20 add $0x20,%esp 1083af: 85 c0 test %eax,%eax 1083b1: 8b 55 e0 mov -0x20(%ebp),%edx 1083b4: 0f 85 06 01 00 00 jne 1084c0 } /* * Set default parameters */ tty->termios.c_iflag = BRKINT | ICRNL | IXON | IMAXBEL; 1083ba: c7 43 30 02 25 00 00 movl $0x2502,0x30(%ebx) tty->termios.c_oflag = OPOST | ONLCR | XTABS; 1083c1: c7 43 34 05 18 00 00 movl $0x1805,0x34(%ebx) tty->termios.c_cflag = B9600 | CS8 | CREAD | CLOCAL; 1083c8: c7 43 38 bd 08 00 00 movl $0x8bd,0x38(%ebx) tty->termios.c_lflag = 1083cf: c7 43 3c 3b 82 00 00 movl $0x823b,0x3c(%ebx) ISIG | ICANON | IEXTEN | ECHO | ECHOK | ECHOE | ECHOCTL; tty->termios.c_cc[VINTR] = '\003'; 1083d6: c6 43 41 03 movb $0x3,0x41(%ebx) tty->termios.c_cc[VQUIT] = '\034'; 1083da: c6 43 42 1c movb $0x1c,0x42(%ebx) tty->termios.c_cc[VERASE] = '\177'; 1083de: c6 43 43 7f movb $0x7f,0x43(%ebx) tty->termios.c_cc[VKILL] = '\025'; 1083e2: c6 43 44 15 movb $0x15,0x44(%ebx) tty->termios.c_cc[VEOF] = '\004'; 1083e6: c6 43 45 04 movb $0x4,0x45(%ebx) tty->termios.c_cc[VEOL] = '\000'; 1083ea: c6 43 4c 00 movb $0x0,0x4c(%ebx) tty->termios.c_cc[VEOL2] = '\000'; 1083ee: c6 43 51 00 movb $0x0,0x51(%ebx) tty->termios.c_cc[VSTART] = '\021'; 1083f2: c6 43 49 11 movb $0x11,0x49(%ebx) tty->termios.c_cc[VSTOP] = '\023'; 1083f6: c6 43 4a 13 movb $0x13,0x4a(%ebx) tty->termios.c_cc[VSUSP] = '\032'; 1083fa: c6 43 4b 1a movb $0x1a,0x4b(%ebx) tty->termios.c_cc[VREPRINT] = '\022'; 1083fe: c6 43 4d 12 movb $0x12,0x4d(%ebx) tty->termios.c_cc[VDISCARD] = '\017'; 108402: c6 43 4e 0f movb $0xf,0x4e(%ebx) tty->termios.c_cc[VWERASE] = '\027'; 108406: c6 43 4f 17 movb $0x17,0x4f(%ebx) tty->termios.c_cc[VLNEXT] = '\026'; 10840a: c6 43 50 16 movb $0x16,0x50(%ebx) /* start with no flow control, clear flow control flags */ tty->flow_ctrl = 0; 10840e: c7 83 b8 00 00 00 00 movl $0x0,0xb8(%ebx) 108415: 00 00 00 /* * set low/highwater mark for XON/XOFF support */ tty->lowwater = tty->rawInBuf.Size * 1/2; 108418: 8b 43 64 mov 0x64(%ebx),%eax 10841b: d1 e8 shr %eax 10841d: 89 83 bc 00 00 00 mov %eax,0xbc(%ebx) tty->highwater = tty->rawInBuf.Size * 3/4; 108423: 8b 43 64 mov 0x64(%ebx),%eax 108426: 8d 04 40 lea (%eax,%eax,2),%eax 108429: c1 e8 02 shr $0x2,%eax 10842c: 89 83 c0 00 00 00 mov %eax,0xc0(%ebx) /* * Bump name characer */ if (c++ == 'z') 108432: a0 7c 30 12 00 mov 0x12307c,%al 108437: 8d 48 01 lea 0x1(%eax),%ecx 10843a: 88 0d 7c 30 12 00 mov %cl,0x12307c 108440: 3c 7a cmp $0x7a,%al 108442: 75 07 jne 10844b c = 'a'; 108444: c6 05 7c 30 12 00 61 movb $0x61,0x12307c } args->iop->data1 = tty; 10844b: 8b 4d 10 mov 0x10(%ebp),%ecx 10844e: 8b 01 mov (%ecx),%eax 108450: 89 50 34 mov %edx,0x34(%eax) if (!tty->refcount++) { 108453: 8b 42 08 mov 0x8(%edx),%eax 108456: 8d 48 01 lea 0x1(%eax),%ecx 108459: 89 4a 08 mov %ecx,0x8(%edx) 10845c: 85 c0 test %eax,%eax 10845e: 75 69 jne 1084c9 if (tty->device.firstOpen) 108460: 8b 82 98 00 00 00 mov 0x98(%edx),%eax 108466: 85 c0 test %eax,%eax 108468: 74 15 je 10847f (*tty->device.firstOpen)(major, minor, arg); 10846a: 56 push %esi 10846b: ff 75 10 pushl 0x10(%ebp) 10846e: ff 75 0c pushl 0xc(%ebp) 108471: ff 75 08 pushl 0x8(%ebp) 108474: 89 55 e0 mov %edx,-0x20(%ebp) 108477: ff d0 call *%eax 108479: 83 c4 10 add $0x10,%esp 10847c: 8b 55 e0 mov -0x20(%ebp),%edx /* * start I/O tasks, if needed */ if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { 10847f: 83 ba b4 00 00 00 02 cmpl $0x2,0xb4(%edx) 108486: 75 41 jne 1084c9 sc = rtems_task_start( 108488: 53 push %ebx 108489: 52 push %edx 10848a: 68 aa 95 10 00 push $0x1095aa 10848f: ff b2 c4 00 00 00 pushl 0xc4(%edx) 108495: 89 55 e0 mov %edx,-0x20(%ebp) 108498: e8 bb 20 00 00 call 10a558 tty->rxTaskId, rtems_termios_rxdaemon, (rtems_task_argument)tty); if (sc != RTEMS_SUCCESSFUL) 10849d: 83 c4 10 add $0x10,%esp 1084a0: 85 c0 test %eax,%eax 1084a2: 8b 55 e0 mov -0x20(%ebp),%edx 1084a5: 75 19 jne 1084c0 <== NEVER TAKEN rtems_fatal_error_occurred (sc); sc = rtems_task_start( 1084a7: 51 push %ecx 1084a8: 52 push %edx 1084a9: 68 dc 97 10 00 push $0x1097dc 1084ae: ff b2 c8 00 00 00 pushl 0xc8(%edx) 1084b4: e8 9f 20 00 00 call 10a558 tty->txTaskId, rtems_termios_txdaemon, (rtems_task_argument)tty); if (sc != RTEMS_SUCCESSFUL) 1084b9: 83 c4 10 add $0x10,%esp 1084bc: 85 c0 test %eax,%eax 1084be: 74 09 je 1084c9 <== ALWAYS TAKEN rtems_fatal_error_occurred (sc); 1084c0: 83 ec 0c sub $0xc,%esp 1084c3: 50 push %eax 1084c4: e8 6b 22 00 00 call 10a734 } } rtems_semaphore_release (rtems_termios_ttyMutex); 1084c9: 83 ec 0c sub $0xc,%esp 1084cc: ff 35 3c 52 12 00 pushl 0x12523c 1084d2: e8 7d 1d 00 00 call 10a254 return RTEMS_SUCCESSFUL; 1084d7: 83 c4 10 add $0x10,%esp } 1084da: 8b 45 e4 mov -0x1c(%ebp),%eax 1084dd: 8d 65 f4 lea -0xc(%ebp),%esp 1084e0: 5b pop %ebx 1084e1: 5e pop %esi 1084e2: 5f pop %edi 1084e3: c9 leave 1084e4: c3 ret static char c = 'a'; /* * Create a new device */ tty = calloc (1, sizeof (struct rtems_termios_tty)); 1084e5: 52 push %edx 1084e6: 52 push %edx 1084e7: 68 e8 00 00 00 push $0xe8 1084ec: 6a 01 push $0x1 1084ee: e8 e9 ec ff ff call 1071dc 1084f3: 89 c2 mov %eax,%edx 1084f5: 89 c3 mov %eax,%ebx if (tty == NULL) { 1084f7: 83 c4 10 add $0x10,%esp 1084fa: 85 c0 test %eax,%eax 1084fc: 0f 85 33 fc ff ff jne 108135 108502: e9 29 fc ff ff jmp 108130 =============================================================================== 001089fe : * Send characters to device-specific code */ void rtems_termios_puts ( const void *_buf, int len, struct rtems_termios_tty *tty) { 1089fe: 55 push %ebp 1089ff: 89 e5 mov %esp,%ebp 108a01: 57 push %edi 108a02: 56 push %esi 108a03: 53 push %ebx 108a04: 83 ec 3c sub $0x3c,%esp 108a07: 8b 45 08 mov 0x8(%ebp),%eax 108a0a: 8b 75 0c mov 0xc(%ebp),%esi 108a0d: 8b 5d 10 mov 0x10(%ebp),%ebx const unsigned char *buf = _buf; 108a10: 89 c7 mov %eax,%edi unsigned int newHead; rtems_interrupt_level level; rtems_status_code sc; if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) { 108a12: 83 bb b4 00 00 00 00 cmpl $0x0,0xb4(%ebx) 108a19: 75 1b jne 108a36 (*tty->device.write)(tty->minor, (void *)buf, len); 108a1b: 89 75 10 mov %esi,0x10(%ebp) 108a1e: 89 45 0c mov %eax,0xc(%ebp) 108a21: 8b 43 10 mov 0x10(%ebx),%eax 108a24: 89 45 08 mov %eax,0x8(%ebp) 108a27: 8b 83 a4 00 00 00 mov 0xa4(%ebx),%eax tty->rawOutBufState = rob_busy; } rtems_interrupt_enable (level); len--; } } 108a2d: 8d 65 f4 lea -0xc(%ebp),%esp 108a30: 5b pop %ebx 108a31: 5e pop %esi 108a32: 5f pop %edi 108a33: 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); 108a34: ff e0 jmp *%eax return; } newHead = tty->rawOutBuf.Head; 108a36: 8b 83 80 00 00 00 mov 0x80(%ebx),%eax 108a3c: 89 45 e4 mov %eax,-0x1c(%ebp) while (len) { 108a3f: e9 ca 00 00 00 jmp 108b0e * len -= ncopy * * To minimize latency, the memcpy should be done * with interrupts enabled. */ newHead = (newHead + 1) % tty->rawOutBuf.Size; 108a44: 8b 45 e4 mov -0x1c(%ebp),%eax 108a47: 40 inc %eax 108a48: 8b 8b 88 00 00 00 mov 0x88(%ebx),%ecx 108a4e: 31 d2 xor %edx,%edx 108a50: f7 f1 div %ecx 108a52: 89 55 c4 mov %edx,-0x3c(%ebp) 108a55: 89 55 e4 mov %edx,-0x1c(%ebp) rtems_interrupt_disable (level); 108a58: 9c pushf 108a59: fa cli 108a5a: 8f 45 d4 popl -0x2c(%ebp) 108a5d: 8b 55 d4 mov -0x2c(%ebp),%edx 108a60: 8b 4d c4 mov -0x3c(%ebp),%ecx while (newHead == tty->rawOutBuf.Tail) { 108a63: eb 35 jmp 108a9a tty->rawOutBufState = rob_wait; 108a65: c7 83 94 00 00 00 02 movl $0x2,0x94(%ebx) 108a6c: 00 00 00 rtems_interrupt_enable (level); 108a6f: 52 push %edx 108a70: 9d popf sc = rtems_semaphore_obtain( 108a71: 50 push %eax 108a72: 6a 00 push $0x0 108a74: 6a 00 push $0x0 108a76: ff b3 8c 00 00 00 pushl 0x8c(%ebx) 108a7c: 89 4d e0 mov %ecx,-0x20(%ebp) 108a7f: e8 e4 16 00 00 call 10a168 tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) 108a84: 83 c4 10 add $0x10,%esp 108a87: 85 c0 test %eax,%eax 108a89: 8b 4d e0 mov -0x20(%ebp),%ecx 108a8c: 74 09 je 108a97 <== ALWAYS TAKEN rtems_fatal_error_occurred (sc); 108a8e: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 108a91: 50 push %eax <== NOT EXECUTED 108a92: e8 9d 1c 00 00 call 10a734 <== NOT EXECUTED rtems_interrupt_disable (level); 108a97: 9c pushf 108a98: fa cli 108a99: 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) { 108a9a: 8b 83 84 00 00 00 mov 0x84(%ebx),%eax 108aa0: 39 c1 cmp %eax,%ecx 108aa2: 74 c1 je 108a65 108aa4: 89 55 d4 mov %edx,-0x2c(%ebp) 108aa7: 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++; 108aaa: 8b 8b 80 00 00 00 mov 0x80(%ebx),%ecx 108ab0: 8a 07 mov (%edi),%al 108ab2: 8b 53 7c mov 0x7c(%ebx),%edx 108ab5: 88 04 0a mov %al,(%edx,%ecx,1) 108ab8: 47 inc %edi tty->rawOutBuf.Head = newHead; 108ab9: 8b 4d c4 mov -0x3c(%ebp),%ecx 108abc: 89 8b 80 00 00 00 mov %ecx,0x80(%ebx) if (tty->rawOutBufState == rob_idle) { 108ac2: 83 bb 94 00 00 00 00 cmpl $0x0,0x94(%ebx) 108ac9: 75 3e jne 108b09 /* check, whether XOFF has been received */ if (!(tty->flow_ctrl & FL_ORCVXOF)) { 108acb: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax 108ad1: a8 10 test $0x10,%al 108ad3: 75 1b jne 108af0 <== NEVER TAKEN (*tty->device.write)(tty->minor, (char *)&tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1); 108ad5: 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, 108adb: 51 push %ecx 108adc: 6a 01 push $0x1 108ade: 03 43 7c add 0x7c(%ebx),%eax 108ae1: 50 push %eax 108ae2: ff 73 10 pushl 0x10(%ebx) 108ae5: ff 93 a4 00 00 00 call *0xa4(%ebx) 108aeb: 83 c4 10 add $0x10,%esp 108aee: eb 0f jmp 108aff (char *)&tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1); } else { /* remember that output has been stopped due to flow ctrl*/ tty->flow_ctrl |= FL_OSTOP; 108af0: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED 108af6: 83 c8 20 or $0x20,%eax <== NOT EXECUTED 108af9: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED } tty->rawOutBufState = rob_busy; 108aff: c7 83 94 00 00 00 01 movl $0x1,0x94(%ebx) 108b06: 00 00 00 } rtems_interrupt_enable (level); 108b09: ff 75 d4 pushl -0x2c(%ebp) 108b0c: 9d popf len--; 108b0d: 4e dec %esi if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) { (*tty->device.write)(tty->minor, (void *)buf, len); return; } newHead = tty->rawOutBuf.Head; while (len) { 108b0e: 85 f6 test %esi,%esi 108b10: 0f 85 2e ff ff ff jne 108a44 tty->rawOutBufState = rob_busy; } rtems_interrupt_enable (level); len--; } } 108b16: 8d 65 f4 lea -0xc(%ebp),%esp 108b19: 5b pop %ebx 108b1a: 5e pop %esi 108b1b: 5f pop %edi 108b1c: c9 leave 108b1d: c3 ret =============================================================================== 00109025 : return RTEMS_SUCCESSFUL; } rtems_status_code rtems_termios_read (void *arg) { 109025: 55 push %ebp 109026: 89 e5 mov %esp,%ebp 109028: 57 push %edi 109029: 56 push %esi 10902a: 53 push %ebx 10902b: 83 ec 40 sub $0x40,%esp 10902e: 8b 75 08 mov 0x8(%ebp),%esi rtems_libio_rw_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 109031: 8b 06 mov (%esi),%eax 109033: 8b 58 34 mov 0x34(%eax),%ebx uint32_t count = args->count; 109036: 8b 46 10 mov 0x10(%esi),%eax 109039: 89 45 e4 mov %eax,-0x1c(%ebp) char *buffer = args->buffer; 10903c: 8b 46 0c mov 0xc(%esi),%eax 10903f: 89 45 e0 mov %eax,-0x20(%ebp) rtems_status_code sc; sc = rtems_semaphore_obtain (tty->isem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 109042: 6a 00 push $0x0 109044: 6a 00 push $0x0 109046: ff 73 14 pushl 0x14(%ebx) 109049: e8 1a 11 00 00 call 10a168 10904e: 89 45 dc mov %eax,-0x24(%ebp) if (sc != RTEMS_SUCCESSFUL) 109051: 83 c4 10 add $0x10,%esp 109054: 85 c0 test %eax,%eax 109056: 0f 85 9d 02 00 00 jne 1092f9 <== NEVER TAKEN return sc; if (rtems_termios_linesw[tty->t_line].l_read != NULL) { 10905c: 8b 83 cc 00 00 00 mov 0xcc(%ebx),%eax 109062: c1 e0 05 shl $0x5,%eax 109065: 8b 80 fc 4e 12 00 mov 0x124efc(%eax),%eax 10906b: 85 c0 test %eax,%eax 10906d: 74 19 je 109088 sc = rtems_termios_linesw[tty->t_line].l_read(tty,args); 10906f: 57 push %edi 109070: 57 push %edi 109071: 56 push %esi 109072: 53 push %ebx 109073: ff d0 call *%eax 109075: 89 45 dc mov %eax,-0x24(%ebp) tty->tty_rcvwakeup = 0; 109078: c7 83 e4 00 00 00 00 movl $0x0,0xe4(%ebx) 10907f: 00 00 00 rtems_semaphore_release (tty->isem); 109082: 59 pop %ecx 109083: e9 66 02 00 00 jmp 1092ee return sc; } if (tty->cindex == tty->ccount) { 109088: 8b 43 20 mov 0x20(%ebx),%eax 10908b: 39 43 24 cmp %eax,0x24(%ebx) 10908e: 0f 85 2d 02 00 00 jne 1092c1 <== NEVER TAKEN tty->cindex = tty->ccount = 0; 109094: c7 43 20 00 00 00 00 movl $0x0,0x20(%ebx) 10909b: c7 43 24 00 00 00 00 movl $0x0,0x24(%ebx) tty->read_start_column = tty->column; 1090a2: 8b 43 28 mov 0x28(%ebx),%eax 1090a5: 89 43 2c mov %eax,0x2c(%ebx) if (tty->device.pollRead != NULL && 1090a8: 83 bb a0 00 00 00 00 cmpl $0x0,0xa0(%ebx) 1090af: 0f 84 c4 00 00 00 je 109179 1090b5: 83 bb b4 00 00 00 00 cmpl $0x0,0xb4(%ebx) 1090bc: 0f 85 b7 00 00 00 jne 109179 static rtems_status_code fillBufferPoll (struct rtems_termios_tty *tty) { int n; if (tty->termios.c_lflag & ICANON) { 1090c2: f6 43 3c 02 testb $0x2,0x3c(%ebx) 1090c6: 74 35 je 1090fd for (;;) { n = (*tty->device.pollRead)(tty->minor); 1090c8: 83 ec 0c sub $0xc,%esp 1090cb: ff 73 10 pushl 0x10(%ebx) 1090ce: ff 93 a0 00 00 00 call *0xa0(%ebx) if (n < 0) { 1090d4: 83 c4 10 add $0x10,%esp 1090d7: 85 c0 test %eax,%eax 1090d9: 79 0f jns 1090ea rtems_task_wake_after (1); 1090db: 83 ec 0c sub $0xc,%esp 1090de: 6a 01 push $0x1 1090e0: e8 d7 14 00 00 call 10a5bc 1090e5: 83 c4 10 add $0x10,%esp 1090e8: eb de jmp 1090c8 } else { if (siproc (n, tty)) 1090ea: 0f b6 c0 movzbl %al,%eax 1090ed: 89 da mov %ebx,%edx 1090ef: e8 38 fe ff ff call 108f2c 1090f4: 85 c0 test %eax,%eax 1090f6: 74 d0 je 1090c8 1090f8: e9 c4 01 00 00 jmp 1092c1 } } } else { rtems_interval then, now; then = rtems_clock_get_ticks_since_boot(); 1090fd: e8 3a 0a 00 00 call 109b3c 109102: 89 c7 mov %eax,%edi for (;;) { n = (*tty->device.pollRead)(tty->minor); 109104: 83 ec 0c sub $0xc,%esp 109107: ff 73 10 pushl 0x10(%ebx) 10910a: ff 93 a0 00 00 00 call *0xa0(%ebx) if (n < 0) { 109110: 83 c4 10 add $0x10,%esp 109113: 85 c0 test %eax,%eax 109115: 79 3d jns 109154 if (tty->termios.c_cc[VMIN]) { 109117: 80 7b 47 00 cmpb $0x0,0x47(%ebx) 10911b: 74 0e je 10912b <== NEVER TAKEN if (tty->termios.c_cc[VTIME] && tty->ccount) { 10911d: 80 7b 46 00 cmpb $0x0,0x46(%ebx) 109121: 74 22 je 109145 <== NEVER TAKEN 109123: 83 7b 20 00 cmpl $0x0,0x20(%ebx) 109127: 74 1c je 109145 109129: eb 0a jmp 109135 if ((now - then) > tty->vtimeTicks) { break; } } } else { if (!tty->termios.c_cc[VTIME]) 10912b: 80 7b 46 00 cmpb $0x0,0x46(%ebx) <== NOT EXECUTED 10912f: 0f 84 8c 01 00 00 je 1092c1 <== NOT EXECUTED break; now = rtems_clock_get_ticks_since_boot(); 109135: e8 02 0a 00 00 call 109b3c if ((now - then) > tty->vtimeTicks) { 10913a: 29 f8 sub %edi,%eax 10913c: 3b 43 54 cmp 0x54(%ebx),%eax 10913f: 0f 87 7c 01 00 00 ja 1092c1 break; } } rtems_task_wake_after (1); 109145: 83 ec 0c sub $0xc,%esp 109148: 6a 01 push $0x1 10914a: e8 6d 14 00 00 call 10a5bc 10914f: 83 c4 10 add $0x10,%esp 109152: eb b0 jmp 109104 } else { siproc (n, tty); 109154: 0f b6 c0 movzbl %al,%eax 109157: 89 da mov %ebx,%edx 109159: e8 ce fd ff ff call 108f2c if (tty->ccount >= tty->termios.c_cc[VMIN]) 10915e: 8a 43 47 mov 0x47(%ebx),%al 109161: 0f b6 d0 movzbl %al,%edx 109164: 39 53 20 cmp %edx,0x20(%ebx) 109167: 0f 8d 54 01 00 00 jge 1092c1 <== NEVER TAKEN break; if (tty->termios.c_cc[VMIN] && tty->termios.c_cc[VTIME]) 10916d: 84 c0 test %al,%al 10916f: 74 93 je 109104 <== NEVER TAKEN 109171: 80 7b 46 00 cmpb $0x0,0x46(%ebx) 109175: 74 8d je 109104 <== NEVER TAKEN 109177: eb 84 jmp 1090fd * Fill the input buffer from the raw input queue */ static rtems_status_code fillBufferQueue (struct rtems_termios_tty *tty) { rtems_interval timeout = tty->rawInBufSemaphoreFirstTimeout; 109179: 8b 53 74 mov 0x74(%ebx),%edx rtems_status_code sc; int wait = (int)1; 10917c: 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)( 109181: 8d 43 49 lea 0x49(%ebx),%eax 109184: 89 45 d0 mov %eax,-0x30(%ebp) 109187: e9 e6 00 00 00 jmp 109272 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; 10918c: 8b 43 5c mov 0x5c(%ebx),%eax 10918f: 8b 4b 64 mov 0x64(%ebx),%ecx 109192: 40 inc %eax 109193: 31 d2 xor %edx,%edx 109195: f7 f1 div %ecx c = tty->rawInBuf.theBuf[newHead]; 109197: 8b 43 58 mov 0x58(%ebx),%eax 10919a: 8a 04 10 mov (%eax,%edx,1),%al 10919d: 88 45 db mov %al,-0x25(%ebp) tty->rawInBuf.Head = newHead; 1091a0: 89 53 5c mov %edx,0x5c(%ebx) if(((tty->rawInBuf.Tail-newHead+tty->rawInBuf.Size) 1091a3: 8b 43 60 mov 0x60(%ebx),%eax 1091a6: 89 45 c4 mov %eax,-0x3c(%ebp) 1091a9: 8b 4b 64 mov 0x64(%ebx),%ecx % tty->rawInBuf.Size) 1091ac: 8b 43 64 mov 0x64(%ebx),%eax 1091af: 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) 1091b2: 8b 45 c4 mov -0x3c(%ebp),%eax 1091b5: 8d 04 01 lea (%ecx,%eax,1),%eax 1091b8: 29 d0 sub %edx,%eax % tty->rawInBuf.Size) 1091ba: 31 d2 xor %edx,%edx 1091bc: 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) 1091bf: 3b 93 bc 00 00 00 cmp 0xbc(%ebx),%edx 1091c5: 73 74 jae 10923b <== NEVER TAKEN % tty->rawInBuf.Size) < tty->lowwater) { tty->flow_ctrl &= ~FL_IREQXOF; 1091c7: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax 1091cd: 83 e0 fe and $0xfffffffe,%eax 1091d0: 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)) 1091d6: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax 1091dc: 25 02 02 00 00 and $0x202,%eax 1091e1: 3d 02 02 00 00 cmp $0x202,%eax 1091e6: 75 24 jne 10920c <== ALWAYS TAKEN == (FL_MDXON | FL_ISNTXOF)) && ((tty->rawOutBufState == rob_idle) 1091e8: 83 bb 94 00 00 00 00 cmpl $0x0,0x94(%ebx) <== NOT EXECUTED 1091ef: 74 0a je 1091fb <== NOT EXECUTED || (tty->flow_ctrl & FL_OSTOP))) { 1091f1: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED 1091f7: a8 20 test $0x20,%al <== NOT EXECUTED 1091f9: 74 11 je 10920c <== NOT EXECUTED /* XON should be sent now... */ (*tty->device.write)( 1091fb: 52 push %edx <== NOT EXECUTED 1091fc: 6a 01 push $0x1 <== NOT EXECUTED 1091fe: ff 75 d0 pushl -0x30(%ebp) <== NOT EXECUTED 109201: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED 109204: ff 93 a4 00 00 00 call *0xa4(%ebx) <== NOT EXECUTED 10920a: eb 2c jmp 109238 <== NOT EXECUTED tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1); } else if (tty->flow_ctrl & FL_MDRTS) { 10920c: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax 109212: f6 c4 01 test $0x1,%ah 109215: 74 24 je 10923b <== ALWAYS TAKEN tty->flow_ctrl &= ~FL_IRTSOFF; 109217: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED 10921d: 83 e0 fb and $0xfffffffb,%eax <== NOT EXECUTED 109220: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED /* activate RTS line */ if (tty->device.startRemoteTx != NULL) { 109226: 8b 83 b0 00 00 00 mov 0xb0(%ebx),%eax <== NOT EXECUTED 10922c: 85 c0 test %eax,%eax <== NOT EXECUTED 10922e: 74 0b je 10923b <== NOT EXECUTED tty->device.startRemoteTx(tty->minor); 109230: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 109233: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED 109236: ff d0 call *%eax <== NOT EXECUTED 109238: 83 c4 10 add $0x10,%esp <== NOT EXECUTED } } } /* continue processing new character */ if (tty->termios.c_lflag & ICANON) { 10923b: f6 43 3c 02 testb $0x2,0x3c(%ebx) 10923f: 74 12 je 109253 <== NEVER TAKEN if (siproc (c, tty)) 109241: 0f b6 45 db movzbl -0x25(%ebp),%eax 109245: 89 da mov %ebx,%edx 109247: e8 e0 fc ff ff call 108f2c wait = 0; 10924c: 85 c0 test %eax,%eax 10924e: 0f 94 c0 sete %al 109251: eb 15 jmp 109268 } else { siproc (c, tty); 109253: 0f b6 45 db movzbl -0x25(%ebp),%eax <== NOT EXECUTED 109257: 89 da mov %ebx,%edx <== NOT EXECUTED 109259: e8 ce fc ff ff call 108f2c <== NOT EXECUTED if (tty->ccount >= tty->termios.c_cc[VMIN]) 10925e: 0f b6 43 47 movzbl 0x47(%ebx),%eax <== NOT EXECUTED wait = 0; 109262: 39 43 20 cmp %eax,0x20(%ebx) <== NOT EXECUTED 109265: 0f 9c c0 setl %al <== NOT EXECUTED 109268: 0f b6 c0 movzbl %al,%eax 10926b: f7 d8 neg %eax 10926d: 21 c7 and %eax,%edi } timeout = tty->rawInBufSemaphoreTimeout; 10926f: 8b 53 70 mov 0x70(%ebx),%edx while ( wait ) { /* * Process characters read from raw queue */ while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) && 109272: 8b 4b 5c mov 0x5c(%ebx),%ecx 109275: 8b 43 60 mov 0x60(%ebx),%eax 109278: 39 c1 cmp %eax,%ecx 10927a: 74 0f je 10928b (tty->ccount < (CBUFSIZE-1))) { 10927c: a1 70 30 12 00 mov 0x123070,%eax 109281: 48 dec %eax while ( wait ) { /* * Process characters read from raw queue */ while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) && 109282: 39 43 20 cmp %eax,0x20(%ebx) 109285: 0f 8c 01 ff ff ff jl 10918c <== ALWAYS TAKEN } /* * Wait for characters */ if ( wait ) { 10928b: 85 ff test %edi,%edi 10928d: 74 32 je 1092c1 sc = rtems_semaphore_obtain( 10928f: 50 push %eax 109290: 52 push %edx 109291: ff 73 6c pushl 0x6c(%ebx) 109294: ff 73 68 pushl 0x68(%ebx) 109297: 89 55 cc mov %edx,-0x34(%ebp) 10929a: e8 c9 0e 00 00 call 10a168 tty->rawInBuf.Semaphore, tty->rawInBufSemaphoreOptions, timeout); if (sc != RTEMS_SUCCESSFUL) 10929f: 83 c4 10 add $0x10,%esp 1092a2: 85 c0 test %eax,%eax 1092a4: 8b 55 cc mov -0x34(%ebp),%edx 1092a7: 74 c9 je 109272 <== ALWAYS TAKEN 1092a9: eb 16 jmp 1092c1 <== NOT EXECUTED if (sc != RTEMS_SUCCESSFUL) tty->cindex = tty->ccount = 0; } while (count && (tty->cindex < tty->ccount)) { *buffer++ = tty->cbuf[tty->cindex++]; 1092ab: 8b 7b 1c mov 0x1c(%ebx),%edi 1092ae: 8b 45 e4 mov -0x1c(%ebp),%eax 1092b1: 8a 04 07 mov (%edi,%eax,1),%al 1092b4: 88 01 mov %al,(%ecx) 1092b6: 41 inc %ecx 1092b7: 8b 45 e4 mov -0x1c(%ebp),%eax 1092ba: 40 inc %eax 1092bb: 89 43 24 mov %eax,0x24(%ebx) count--; 1092be: 4a dec %edx 1092bf: eb 06 jmp 1092c7 1092c1: 8b 55 e4 mov -0x1c(%ebp),%edx 1092c4: 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)) { 1092c7: 85 d2 test %edx,%edx 1092c9: 74 0b je 1092d6 1092cb: 8b 43 24 mov 0x24(%ebx),%eax 1092ce: 89 45 e4 mov %eax,-0x1c(%ebp) 1092d1: 3b 43 20 cmp 0x20(%ebx),%eax 1092d4: 7c d5 jl 1092ab 1092d6: 89 55 e4 mov %edx,-0x1c(%ebp) *buffer++ = tty->cbuf[tty->cindex++]; count--; } args->bytes_moved = args->count - count; 1092d9: 8b 46 10 mov 0x10(%esi),%eax 1092dc: 29 d0 sub %edx,%eax 1092de: 89 46 18 mov %eax,0x18(%esi) tty->tty_rcvwakeup = 0; 1092e1: c7 83 e4 00 00 00 00 movl $0x0,0xe4(%ebx) 1092e8: 00 00 00 rtems_semaphore_release (tty->isem); 1092eb: 83 ec 0c sub $0xc,%esp 1092ee: ff 73 14 pushl 0x14(%ebx) 1092f1: e8 5e 0f 00 00 call 10a254 return sc; 1092f6: 83 c4 10 add $0x10,%esp } 1092f9: 8b 45 dc mov -0x24(%ebp),%eax 1092fc: 8d 65 f4 lea -0xc(%ebp),%esp 1092ff: 5b pop %ebx 109300: 5e pop %esi 109301: 5f pop %edi 109302: c9 leave 109303: c3 ret =============================================================================== 0010960e : * 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) { 10960e: 55 push %ebp 10960f: 89 e5 mov %esp,%ebp 109611: 57 push %edi 109612: 56 push %esi 109613: 53 push %ebx 109614: 83 ec 0c sub $0xc,%esp 109617: 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)) 10961a: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax 109620: 25 03 04 00 00 and $0x403,%eax 109625: 3d 01 04 00 00 cmp $0x401,%eax 10962a: 75 2c jne 109658 <== ALWAYS TAKEN == (FL_MDXOF | FL_IREQXOF)) { /* XOFF should be sent now... */ (*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTOP]), 1); 10962c: 57 push %edi <== NOT EXECUTED 10962d: 6a 01 push $0x1 <== NOT EXECUTED 10962f: 8d 43 4a lea 0x4a(%ebx),%eax <== NOT EXECUTED 109632: 50 push %eax <== NOT EXECUTED 109633: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED 109636: ff 93 a4 00 00 00 call *0xa4(%ebx) <== NOT EXECUTED rtems_interrupt_disable(level); 10963c: 9c pushf <== NOT EXECUTED 10963d: fa cli <== NOT EXECUTED 10963e: 5a pop %edx <== NOT EXECUTED tty->t_dqlen--; 10963f: ff 8b 90 00 00 00 decl 0x90(%ebx) <== NOT EXECUTED tty->flow_ctrl |= FL_ISNTXOF; 109645: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED 10964b: 83 c8 02 or $0x2,%eax <== NOT EXECUTED 10964e: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED rtems_interrupt_enable(level); 109654: 52 push %edx <== NOT EXECUTED 109655: 9d popf <== NOT EXECUTED 109656: eb 38 jmp 109690 <== NOT EXECUTED nToSend = 1; } else if ((tty->flow_ctrl & (FL_IREQXOF | FL_ISNTXOF)) == FL_ISNTXOF) { 109658: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax 10965e: 83 e0 03 and $0x3,%eax 109661: 83 f8 02 cmp $0x2,%eax 109664: 75 37 jne 10969d <== 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); 109666: 56 push %esi <== NOT EXECUTED 109667: 6a 01 push $0x1 <== NOT EXECUTED 109669: 8d 43 49 lea 0x49(%ebx),%eax <== NOT EXECUTED 10966c: 50 push %eax <== NOT EXECUTED 10966d: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED 109670: ff 93 a4 00 00 00 call *0xa4(%ebx) <== NOT EXECUTED rtems_interrupt_disable(level); 109676: 9c pushf <== NOT EXECUTED 109677: fa cli <== NOT EXECUTED 109678: 5a pop %edx <== NOT EXECUTED tty->t_dqlen--; 109679: ff 8b 90 00 00 00 decl 0x90(%ebx) <== NOT EXECUTED tty->flow_ctrl &= ~FL_ISNTXOF; 10967f: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED 109685: 83 e0 fd and $0xfffffffd,%eax <== NOT EXECUTED 109688: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED rtems_interrupt_enable(level); 10968e: 52 push %edx <== NOT EXECUTED 10968f: 9d popf <== NOT EXECUTED 109690: 83 c4 10 add $0x10,%esp <== NOT EXECUTED nToSend = 1; 109693: be 01 00 00 00 mov $0x1,%esi <== NOT EXECUTED 109698: e9 35 01 00 00 jmp 1097d2 <== NOT EXECUTED } else { if ( tty->rawOutBuf.Head == tty->rawOutBuf.Tail ) { 10969d: 8b 93 80 00 00 00 mov 0x80(%ebx),%edx 1096a3: 8b 83 84 00 00 00 mov 0x84(%ebx),%eax 1096a9: 39 c2 cmp %eax,%edx 1096ab: 75 25 jne 1096d2 /* * this should never happen... */ rtems_semaphore_release (tty->rawOutBuf.Semaphore); } return 0; 1096ad: 31 f6 xor %esi,%esi } else { if ( tty->rawOutBuf.Head == tty->rawOutBuf.Tail ) { /* * buffer was empty */ if (tty->rawOutBufState == rob_wait) { 1096af: 83 bb 94 00 00 00 02 cmpl $0x2,0x94(%ebx) 1096b6: 0f 85 16 01 00 00 jne 1097d2 <== ALWAYS TAKEN /* * this should never happen... */ rtems_semaphore_release (tty->rawOutBuf.Semaphore); 1096bc: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 1096bf: ff b3 8c 00 00 00 pushl 0x8c(%ebx) <== NOT EXECUTED 1096c5: e8 8a 0b 00 00 call 10a254 <== NOT EXECUTED 1096ca: 83 c4 10 add $0x10,%esp <== NOT EXECUTED 1096cd: e9 00 01 00 00 jmp 1097d2 <== NOT EXECUTED } return 0; } rtems_interrupt_disable(level); 1096d2: 9c pushf 1096d3: fa cli 1096d4: 58 pop %eax len = tty->t_dqlen; 1096d5: 8b bb 90 00 00 00 mov 0x90(%ebx),%edi tty->t_dqlen = 0; 1096db: c7 83 90 00 00 00 00 movl $0x0,0x90(%ebx) 1096e2: 00 00 00 rtems_interrupt_enable(level); 1096e5: 50 push %eax 1096e6: 9d popf newTail = (tty->rawOutBuf.Tail + len) % tty->rawOutBuf.Size; 1096e7: 8b 83 84 00 00 00 mov 0x84(%ebx),%eax 1096ed: 8b 8b 88 00 00 00 mov 0x88(%ebx),%ecx 1096f3: 8d 04 07 lea (%edi,%eax,1),%eax 1096f6: 31 d2 xor %edx,%edx 1096f8: f7 f1 div %ecx 1096fa: 89 d7 mov %edx,%edi tty->rawOutBuf.Tail = newTail; 1096fc: 89 93 84 00 00 00 mov %edx,0x84(%ebx) if (tty->rawOutBufState == rob_wait) { 109702: 83 bb 94 00 00 00 02 cmpl $0x2,0x94(%ebx) 109709: 75 11 jne 10971c /* * wake up any pending writer task */ rtems_semaphore_release (tty->rawOutBuf.Semaphore); 10970b: 83 ec 0c sub $0xc,%esp 10970e: ff b3 8c 00 00 00 pushl 0x8c(%ebx) 109714: e8 3b 0b 00 00 call 10a254 109719: 83 c4 10 add $0x10,%esp } if (newTail == tty->rawOutBuf.Head) { 10971c: 8b 83 80 00 00 00 mov 0x80(%ebx),%eax 109722: 39 c7 cmp %eax,%edi 109724: 75 2a jne 109750 /* * Buffer has become empty */ tty->rawOutBufState = rob_idle; 109726: c7 83 94 00 00 00 00 movl $0x0,0x94(%ebx) 10972d: 00 00 00 nToSend = 0; /* * check to see if snd wakeup callback was set */ if ( tty->tty_snd.sw_pfn != NULL) { 109730: 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; 109736: 31 f6 xor %esi,%esi /* * check to see if snd wakeup callback was set */ if ( tty->tty_snd.sw_pfn != NULL) { 109738: 85 c0 test %eax,%eax 10973a: 0f 84 8c 00 00 00 je 1097cc <== ALWAYS TAKEN (*tty->tty_snd.sw_pfn)(&tty->termios, tty->tty_snd.sw_arg); 109740: 51 push %ecx <== NOT EXECUTED 109741: 51 push %ecx <== NOT EXECUTED 109742: ff b3 d8 00 00 00 pushl 0xd8(%ebx) <== NOT EXECUTED 109748: 8d 53 30 lea 0x30(%ebx),%edx <== NOT EXECUTED 10974b: 52 push %edx <== NOT EXECUTED 10974c: ff d0 call *%eax <== NOT EXECUTED 10974e: eb 79 jmp 1097c9 <== NOT EXECUTED } } /* check, whether output should stop due to received XOFF */ else if ((tty->flow_ctrl & (FL_MDXON | FL_ORCVXOF)) 109750: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax 109756: 25 10 02 00 00 and $0x210,%eax 10975b: 3d 10 02 00 00 cmp $0x210,%eax 109760: 75 22 jne 109784 <== 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); 109762: 9c pushf <== NOT EXECUTED 109763: fa cli <== NOT EXECUTED 109764: 5a pop %edx <== NOT EXECUTED tty->flow_ctrl |= FL_OSTOP; 109765: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax <== NOT EXECUTED 10976b: 83 c8 20 or $0x20,%eax <== NOT EXECUTED 10976e: 89 83 b8 00 00 00 mov %eax,0xb8(%ebx) <== NOT EXECUTED tty->rawOutBufState = rob_busy; /*apm*/ 109774: c7 83 94 00 00 00 01 movl $0x1,0x94(%ebx) <== NOT EXECUTED 10977b: 00 00 00 rtems_interrupt_enable(level); 10977e: 52 push %edx <== NOT EXECUTED 10977f: 9d popf <== NOT EXECUTED nToSend = 0; 109780: 31 f6 xor %esi,%esi <== NOT EXECUTED 109782: eb 48 jmp 1097cc <== NOT EXECUTED } else { /* * Buffer not empty, start tranmitter */ if (newTail > tty->rawOutBuf.Head) 109784: 8b 83 80 00 00 00 mov 0x80(%ebx),%eax 10978a: 39 c7 cmp %eax,%edi 10978c: 76 08 jbe 109796 nToSend = tty->rawOutBuf.Size - newTail; 10978e: 8b b3 88 00 00 00 mov 0x88(%ebx),%esi 109794: eb 06 jmp 10979c else nToSend = tty->rawOutBuf.Head - newTail; 109796: 8b b3 80 00 00 00 mov 0x80(%ebx),%esi 10979c: 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)) { 10979e: 8b 83 b8 00 00 00 mov 0xb8(%ebx),%eax 1097a4: f6 c4 06 test $0x6,%ah 1097a7: 74 05 je 1097ae nToSend = 1; 1097a9: be 01 00 00 00 mov $0x1,%esi } tty->rawOutBufState = rob_busy; /*apm*/ 1097ae: c7 83 94 00 00 00 01 movl $0x1,0x94(%ebx) 1097b5: 00 00 00 (*tty->device.write)( 1097b8: 52 push %edx 1097b9: 56 push %esi 1097ba: 8b 43 7c mov 0x7c(%ebx),%eax 1097bd: 01 f8 add %edi,%eax 1097bf: 50 push %eax 1097c0: ff 73 10 pushl 0x10(%ebx) 1097c3: ff 93 a4 00 00 00 call *0xa4(%ebx) 1097c9: 83 c4 10 add $0x10,%esp tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend); } tty->rawOutBuf.Tail = newTail; /*apm*/ 1097cc: 89 bb 84 00 00 00 mov %edi,0x84(%ebx) } return nToSend; } 1097d2: 89 f0 mov %esi,%eax 1097d4: 8d 65 f4 lea -0xc(%ebp),%esp 1097d7: 5b pop %ebx 1097d8: 5e pop %esi 1097d9: 5f pop %edi 1097da: c9 leave 1097db: c3 ret =============================================================================== 001095aa : /* * this task actually processes any receive events */ static rtems_task rtems_termios_rxdaemon(rtems_task_argument argument) { 1095aa: 55 push %ebp 1095ab: 89 e5 mov %esp,%ebp 1095ad: 57 push %edi 1095ae: 56 push %esi 1095af: 53 push %ebx 1095b0: 83 ec 1c sub $0x1c,%esp 1095b3: 8b 5d 08 mov 0x8(%ebp),%ebx while (1) { /* * wait for rtems event */ rtems_event_receive( 1095b6: 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); 1095b9: 8d 75 e7 lea -0x19(%ebp),%esi while (1) { /* * wait for rtems event */ rtems_event_receive( 1095bc: 57 push %edi 1095bd: 6a 00 push $0x0 1095bf: 6a 02 push $0x2 1095c1: 6a 03 push $0x3 1095c3: e8 d8 05 00 00 call 109ba0 (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) { 1095c8: 83 c4 10 add $0x10,%esp 1095cb: f6 45 e0 01 testb $0x1,-0x20(%ebp) 1095cf: 74 17 je 1095e8 <== ALWAYS TAKEN tty->rxTaskId = 0; 1095d1: c7 83 c4 00 00 00 00 movl $0x0,0xc4(%ebx) 1095d8: 00 00 00 rtems_task_delete(RTEMS_SELF); 1095db: 83 ec 0c sub $0xc,%esp 1095de: 6a 00 push $0x0 <== NOT EXECUTED 1095e0: e8 37 0e 00 00 call 10a41c <== NOT EXECUTED 1095e5: 83 c4 10 add $0x10,%esp <== NOT EXECUTED } /* * do something */ c = tty->device.pollRead(tty->minor); 1095e8: 83 ec 0c sub $0xc,%esp 1095eb: ff 73 10 pushl 0x10(%ebx) 1095ee: ff 93 a0 00 00 00 call *0xa0(%ebx) if (c != EOF) { 1095f4: 83 c4 10 add $0x10,%esp 1095f7: 83 f8 ff cmp $0xffffffff,%eax 1095fa: 74 c0 je 1095bc /* * pollRead did call enqueue on its own */ c_buf = c; 1095fc: 88 45 e7 mov %al,-0x19(%ebp) rtems_termios_enqueue_raw_characters ( tty,&c_buf,1); 1095ff: 50 push %eax 109600: 6a 01 push $0x1 109602: 56 push %esi 109603: 53 push %ebx 109604: e8 16 fd ff ff call 10931f 109609: 83 c4 10 add $0x10,%esp 10960c: eb ae jmp 1095bc =============================================================================== 001097dc : /* * this task actually processes any transmit events */ static rtems_task rtems_termios_txdaemon(rtems_task_argument argument) { 1097dc: 55 push %ebp 1097dd: 89 e5 mov %esp,%ebp 1097df: 56 push %esi 1097e0: 53 push %ebx 1097e1: 83 ec 10 sub $0x10,%esp 1097e4: 8b 5d 08 mov 0x8(%ebp),%ebx while (1) { /* * wait for rtems event */ rtems_event_receive( 1097e7: 8d 75 f4 lea -0xc(%ebp),%esi 1097ea: 56 push %esi 1097eb: 6a 00 push $0x0 1097ed: 6a 02 push $0x2 1097ef: 6a 03 push $0x3 1097f1: e8 aa 03 00 00 call 109ba0 (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) { 1097f6: 83 c4 10 add $0x10,%esp 1097f9: f6 45 f4 01 testb $0x1,-0xc(%ebp) 1097fd: 74 17 je 109816 <== ALWAYS TAKEN tty->txTaskId = 0; 1097ff: c7 83 c8 00 00 00 00 movl $0x0,0xc8(%ebx) <== NOT EXECUTED 109806: 00 00 00 rtems_task_delete(RTEMS_SELF); 109809: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 10980c: 6a 00 push $0x0 <== NOT EXECUTED 10980e: e8 09 0c 00 00 call 10a41c <== NOT EXECUTED 109813: 83 c4 10 add $0x10,%esp <== NOT EXECUTED } /* * call any line discipline start function */ if (rtems_termios_linesw[tty->t_line].l_start != NULL) { 109816: 8b 83 cc 00 00 00 mov 0xcc(%ebx),%eax 10981c: c1 e0 05 shl $0x5,%eax 10981f: 8b 80 08 4f 12 00 mov 0x124f08(%eax),%eax 109825: 85 c0 test %eax,%eax 109827: 74 09 je 109832 <== ALWAYS TAKEN rtems_termios_linesw[tty->t_line].l_start(tty); 109829: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 10982c: 53 push %ebx <== NOT EXECUTED 10982d: ff d0 call *%eax <== NOT EXECUTED 10982f: 83 c4 10 add $0x10,%esp <== NOT EXECUTED } /* * try to push further characters to device */ rtems_termios_refill_transmitter(tty); 109832: 83 ec 0c sub $0xc,%esp 109835: 53 push %ebx 109836: e8 d3 fd ff ff call 10960e } 10983b: 83 c4 10 add $0x10,%esp 10983e: eb aa jmp 1097ea =============================================================================== 00108f7e : rtems_termios_puts (&c, 1, tty); } rtems_status_code rtems_termios_write (void *arg) { 108f7e: 55 push %ebp 108f7f: 89 e5 mov %esp,%ebp 108f81: 57 push %edi 108f82: 56 push %esi 108f83: 53 push %ebx 108f84: 83 ec 20 sub $0x20,%esp 108f87: 8b 5d 08 mov 0x8(%ebp),%ebx rtems_libio_rw_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 108f8a: 8b 03 mov (%ebx),%eax 108f8c: 8b 70 34 mov 0x34(%eax),%esi rtems_status_code sc; sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 108f8f: 6a 00 push $0x0 108f91: 6a 00 push $0x0 108f93: ff 76 18 pushl 0x18(%esi) 108f96: e8 cd 11 00 00 call 10a168 108f9b: 89 c7 mov %eax,%edi if (sc != RTEMS_SUCCESSFUL) 108f9d: 83 c4 10 add $0x10,%esp 108fa0: 85 c0 test %eax,%eax 108fa2: 75 77 jne 10901b <== NEVER TAKEN return sc; if (rtems_termios_linesw[tty->t_line].l_write != NULL) { 108fa4: 8b 86 cc 00 00 00 mov 0xcc(%esi),%eax 108faa: c1 e0 05 shl $0x5,%eax 108fad: 8b 80 00 4f 12 00 mov 0x124f00(%eax),%eax 108fb3: 85 c0 test %eax,%eax 108fb5: 74 0b je 108fc2 sc = rtems_termios_linesw[tty->t_line].l_write(tty,args); 108fb7: 57 push %edi 108fb8: 57 push %edi 108fb9: 53 push %ebx 108fba: 56 push %esi 108fbb: ff d0 call *%eax 108fbd: 89 c7 mov %eax,%edi rtems_semaphore_release (tty->osem); 108fbf: 5b pop %ebx 108fc0: eb 4e jmp 109010 return sc; } if (tty->termios.c_oflag & OPOST) { 108fc2: f6 46 34 01 testb $0x1,0x34(%esi) 108fc6: 74 2f je 108ff7 <== NEVER TAKEN uint32_t count = args->count; 108fc8: 8b 4b 10 mov 0x10(%ebx),%ecx char *buffer = args->buffer; 108fcb: 8b 43 0c mov 0xc(%ebx),%eax 108fce: 89 45 e4 mov %eax,-0x1c(%ebp) while (count--) 108fd1: eb 18 jmp 108feb oproc (*buffer++, tty); 108fd3: 8b 55 e4 mov -0x1c(%ebp),%edx 108fd6: 0f b6 02 movzbl (%edx),%eax 108fd9: 42 inc %edx 108fda: 89 55 e4 mov %edx,-0x1c(%ebp) 108fdd: 89 f2 mov %esi,%edx 108fdf: 89 4d e0 mov %ecx,-0x20(%ebp) 108fe2: e8 37 fb ff ff call 108b1e 108fe7: 8b 4d e0 mov -0x20(%ebp),%ecx 108fea: 49 dec %ecx return sc; } if (tty->termios.c_oflag & OPOST) { uint32_t count = args->count; char *buffer = args->buffer; while (count--) 108feb: 85 c9 test %ecx,%ecx 108fed: 75 e4 jne 108fd3 oproc (*buffer++, tty); args->bytes_moved = args->count; 108fef: 8b 43 10 mov 0x10(%ebx),%eax 108ff2: 89 43 18 mov %eax,0x18(%ebx) 108ff5: eb 16 jmp 10900d } else { rtems_termios_puts (args->buffer, args->count, tty); 108ff7: 51 push %ecx <== NOT EXECUTED 108ff8: 56 push %esi <== NOT EXECUTED 108ff9: ff 73 10 pushl 0x10(%ebx) <== NOT EXECUTED 108ffc: ff 73 0c pushl 0xc(%ebx) <== NOT EXECUTED 108fff: e8 fa f9 ff ff call 1089fe <== NOT EXECUTED args->bytes_moved = args->count; 109004: 8b 43 10 mov 0x10(%ebx),%eax <== NOT EXECUTED 109007: 89 43 18 mov %eax,0x18(%ebx) <== NOT EXECUTED 10900a: 83 c4 10 add $0x10,%esp <== NOT EXECUTED } rtems_semaphore_release (tty->osem); 10900d: 83 ec 0c sub $0xc,%esp 109010: ff 76 18 pushl 0x18(%esi) 109013: e8 3c 12 00 00 call 10a254 return sc; 109018: 83 c4 10 add $0x10,%esp } 10901b: 89 f8 mov %edi,%eax 10901d: 8d 65 f4 lea -0xc(%ebp),%esp 109020: 5b pop %ebx 109021: 5e pop %esi 109022: 5f pop %edi 109023: c9 leave 109024: c3 ret =============================================================================== 00116398 : */ rtems_status_code rtems_timer_cancel( rtems_id id ) { 116398: 55 push %ebp 116399: 89 e5 mov %esp,%ebp 11639b: 83 ec 1c sub $0x1c,%esp Timer_Control *the_timer; Objects_Locations location; the_timer = _Timer_Get( id, &location ); 11639e: 8d 45 f4 lea -0xc(%ebp),%eax Objects_Id id, Objects_Locations *location ) { return (Timer_Control *) _Objects_Get( &_Timer_Information, id, location ); 1163a1: 50 push %eax 1163a2: ff 75 08 pushl 0x8(%ebp) 1163a5: 68 5c f8 13 00 push $0x13f85c 1163aa: e8 3d 27 00 00 call 118aec <_Objects_Get> switch ( location ) { 1163af: 83 c4 10 add $0x10,%esp 1163b2: 83 7d f4 00 cmpl $0x0,-0xc(%ebp) 1163b6: 75 1e jne 1163d6 case OBJECTS_LOCAL: if ( !_Timer_Is_dormant_class( the_timer->the_class ) ) 1163b8: 83 78 38 04 cmpl $0x4,0x38(%eax) 1163bc: 74 0f je 1163cd <== NEVER TAKEN (void) _Watchdog_Remove( &the_timer->Ticker ); 1163be: 83 ec 0c sub $0xc,%esp 1163c1: 83 c0 10 add $0x10,%eax 1163c4: 50 push %eax 1163c5: e8 62 41 00 00 call 11a52c <_Watchdog_Remove> 1163ca: 83 c4 10 add $0x10,%esp _Thread_Enable_dispatch(); 1163cd: e8 c0 31 00 00 call 119592 <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 1163d2: 31 c0 xor %eax,%eax 1163d4: eb 05 jmp 1163db #endif case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 1163d6: b8 04 00 00 00 mov $0x4,%eax } 1163db: c9 leave 1163dc: c3 ret =============================================================================== 001167f8 : rtems_id id, rtems_time_of_day *wall_time, rtems_timer_service_routine_entry routine, void *user_data ) { 1167f8: 55 push %ebp 1167f9: 89 e5 mov %esp,%ebp 1167fb: 57 push %edi 1167fc: 56 push %esi 1167fd: 53 push %ebx 1167fe: 83 ec 1c sub $0x1c,%esp 116801: 8b 7d 0c mov 0xc(%ebp),%edi Timer_Control *the_timer; Objects_Locations location; rtems_interval seconds; Timer_server_Control *timer_server = _Timer_server; 116804: 8b 35 9c f8 13 00 mov 0x13f89c,%esi if ( !timer_server ) return RTEMS_INCORRECT_STATE; 11680a: 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 ) 11680f: 85 f6 test %esi,%esi 116811: 0f 84 b1 00 00 00 je 1168c8 return RTEMS_INCORRECT_STATE; if ( !_TOD_Is_set ) return RTEMS_NOT_DEFINED; 116817: b3 0b mov $0xb,%bl Timer_server_Control *timer_server = _Timer_server; if ( !timer_server ) return RTEMS_INCORRECT_STATE; if ( !_TOD_Is_set ) 116819: 80 3d 28 ef 13 00 00 cmpb $0x0,0x13ef28 116820: 0f 84 a2 00 00 00 je 1168c8 <== NEVER TAKEN return RTEMS_NOT_DEFINED; if ( !routine ) return RTEMS_INVALID_ADDRESS; 116826: b3 09 mov $0x9,%bl return RTEMS_INCORRECT_STATE; if ( !_TOD_Is_set ) return RTEMS_NOT_DEFINED; if ( !routine ) 116828: 83 7d 10 00 cmpl $0x0,0x10(%ebp) 11682c: 0f 84 96 00 00 00 je 1168c8 return RTEMS_INVALID_ADDRESS; if ( !_TOD_Validate( wall_time ) ) 116832: 83 ec 0c sub $0xc,%esp 116835: 57 push %edi 116836: e8 b5 d6 ff ff call 113ef0 <_TOD_Validate> 11683b: 83 c4 10 add $0x10,%esp return RTEMS_INVALID_CLOCK; 11683e: b3 14 mov $0x14,%bl return RTEMS_NOT_DEFINED; if ( !routine ) return RTEMS_INVALID_ADDRESS; if ( !_TOD_Validate( wall_time ) ) 116840: 84 c0 test %al,%al 116842: 0f 84 80 00 00 00 je 1168c8 return RTEMS_INVALID_CLOCK; seconds = _TOD_To_seconds( wall_time ); 116848: 83 ec 0c sub $0xc,%esp 11684b: 57 push %edi 11684c: e8 37 d6 ff ff call 113e88 <_TOD_To_seconds> 116851: 89 c7 mov %eax,%edi if ( seconds <= _TOD_Seconds_since_epoch() ) 116853: 83 c4 10 add $0x10,%esp 116856: 3b 05 a0 ef 13 00 cmp 0x13efa0,%eax 11685c: 76 6a jbe 1168c8 11685e: 51 push %ecx return RTEMS_INVALID_CLOCK; the_timer = _Timer_Get( id, &location ); 11685f: 8d 45 e4 lea -0x1c(%ebp),%eax 116862: 50 push %eax 116863: ff 75 08 pushl 0x8(%ebp) 116866: 68 5c f8 13 00 push $0x13f85c 11686b: e8 7c 22 00 00 call 118aec <_Objects_Get> 116870: 89 c3 mov %eax,%ebx switch ( location ) { 116872: 83 c4 10 add $0x10,%esp 116875: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) 116879: 75 48 jne 1168c3 case OBJECTS_LOCAL: (void) _Watchdog_Remove( &the_timer->Ticker ); 11687b: 83 ec 0c sub $0xc,%esp 11687e: 8d 40 10 lea 0x10(%eax),%eax 116881: 50 push %eax 116882: e8 a5 3c 00 00 call 11a52c <_Watchdog_Remove> the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK; 116887: 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; 11688e: c7 43 18 00 00 00 00 movl $0x0,0x18(%ebx) the_watchdog->routine = routine; 116895: 8b 45 10 mov 0x10(%ebp),%eax 116898: 89 43 2c mov %eax,0x2c(%ebx) the_watchdog->id = id; 11689b: 8b 45 08 mov 0x8(%ebp),%eax 11689e: 89 43 30 mov %eax,0x30(%ebx) the_watchdog->user_data = user_data; 1168a1: 8b 45 14 mov 0x14(%ebp),%eax 1168a4: 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(); 1168a7: 2b 3d a0 ef 13 00 sub 0x13efa0,%edi 1168ad: 89 7b 1c mov %edi,0x1c(%ebx) (*timer_server->schedule_operation)( timer_server, the_timer ); 1168b0: 58 pop %eax 1168b1: 5a pop %edx 1168b2: 53 push %ebx 1168b3: 56 push %esi 1168b4: ff 56 04 call *0x4(%esi) _Thread_Enable_dispatch(); 1168b7: e8 d6 2c 00 00 call 119592 <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 1168bc: 83 c4 10 add $0x10,%esp 1168bf: 31 db xor %ebx,%ebx 1168c1: eb 05 jmp 1168c8 #endif case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 1168c3: bb 04 00 00 00 mov $0x4,%ebx } 1168c8: 89 d8 mov %ebx,%eax 1168ca: 8d 65 f4 lea -0xc(%ebp),%esp 1168cd: 5b pop %ebx 1168ce: 5e pop %esi 1168cf: 5f pop %edi 1168d0: c9 leave 1168d1: c3 ret =============================================================================== 0010b14d : static int rtems_verror( rtems_error_code_t error_flag, const char *printf_format, va_list arglist ) { 10b14d: 55 push %ebp 10b14e: 89 e5 mov %esp,%ebp 10b150: 57 push %edi 10b151: 56 push %esi 10b152: 53 push %ebx 10b153: 83 ec 1c sub $0x1c,%esp 10b156: 89 c3 mov %eax,%ebx 10b158: 89 55 e4 mov %edx,-0x1c(%ebp) 10b15b: 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) { 10b15e: a9 00 00 00 20 test $0x20000000,%eax 10b163: 74 2c je 10b191 if (rtems_panic_in_progress++) 10b165: a1 68 b3 12 00 mov 0x12b368,%eax 10b16a: 8d 50 01 lea 0x1(%eax),%edx 10b16d: 89 15 68 b3 12 00 mov %edx,0x12b368 10b173: 85 c0 test %eax,%eax 10b175: 74 0b je 10b182 <== ALWAYS TAKEN rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 10b177: a1 b4 b4 12 00 mov 0x12b4b4,%eax <== NOT EXECUTED 10b17c: 40 inc %eax <== NOT EXECUTED 10b17d: 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; 10b182: 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) 10b184: 83 3d 68 b3 12 00 02 cmpl $0x2,0x12b368 10b18b: 0f 8f da 00 00 00 jg 10b26b <== NEVER TAKEN return 0; } (void) fflush(stdout); /* in case stdout/stderr same */ 10b191: 83 ec 0c sub $0xc,%esp 10b194: a1 c0 91 12 00 mov 0x1291c0,%eax 10b199: ff 70 08 pushl 0x8(%eax) 10b19c: e8 5b ab 00 00 call 115cfc status = error_flag & ~RTEMS_ERROR_MASK; 10b1a1: 89 df mov %ebx,%edi 10b1a3: 81 e7 ff ff ff 8f and $0x8fffffff,%edi if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */ 10b1a9: 83 c4 10 add $0x10,%esp rtems_error_code_t error_flag, const char *printf_format, va_list arglist ) { int local_errno = 0; 10b1ac: 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? */ 10b1ae: 81 e3 00 00 00 40 and $0x40000000,%ebx 10b1b4: 74 07 je 10b1bd local_errno = errno; 10b1b6: e8 a9 a7 00 00 call 115964 <__errno> 10b1bb: 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); 10b1bd: 53 push %ebx 10b1be: ff 75 e0 pushl -0x20(%ebp) 10b1c1: ff 75 e4 pushl -0x1c(%ebp) 10b1c4: a1 c0 91 12 00 mov 0x1291c0,%eax 10b1c9: ff 70 0c pushl 0xc(%eax) 10b1cc: e8 d3 10 01 00 call 11c2a4 10b1d1: 89 c3 mov %eax,%ebx if (status) 10b1d3: 83 c4 10 add $0x10,%esp 10b1d6: 85 ff test %edi,%edi 10b1d8: 74 24 je 10b1fe chars_written += fprintf(stderr, " (status: %s)", rtems_status_text(status)); 10b1da: 83 ec 0c sub $0xc,%esp 10b1dd: 57 push %edi 10b1de: e8 55 ff ff ff call 10b138 10b1e3: 83 c4 0c add $0xc,%esp 10b1e6: 50 push %eax 10b1e7: 68 e7 43 12 00 push $0x1243e7 10b1ec: a1 c0 91 12 00 mov 0x1291c0,%eax 10b1f1: ff 70 0c pushl 0xc(%eax) 10b1f4: e8 f7 ae 00 00 call 1160f0 #endif chars_written += vfprintf(stderr, printf_format, arglist); if (status) chars_written += 10b1f9: 01 c3 add %eax,%ebx 10b1fb: 83 c4 10 add $0x10,%esp fprintf(stderr, " (status: %s)", rtems_status_text(status)); if (local_errno) { 10b1fe: 83 fe 00 cmp $0x0,%esi 10b201: 74 40 je 10b243 if ((local_errno > 0) && *strerror(local_errno)) 10b203: 7e 25 jle 10b22a 10b205: 83 ec 0c sub $0xc,%esp 10b208: 56 push %esi 10b209: e8 8e b7 00 00 call 11699c 10b20e: 83 c4 10 add $0x10,%esp 10b211: 80 38 00 cmpb $0x0,(%eax) 10b214: 74 14 je 10b22a <== NEVER TAKEN chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno)); 10b216: 83 ec 0c sub $0xc,%esp 10b219: 56 push %esi 10b21a: e8 7d b7 00 00 call 11699c 10b21f: 83 c4 0c add $0xc,%esp 10b222: 50 push %eax 10b223: 68 f5 43 12 00 push $0x1243f5 10b228: eb 07 jmp 10b231 else chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno); 10b22a: 51 push %ecx 10b22b: 56 push %esi 10b22c: 68 02 44 12 00 push $0x124402 10b231: a1 c0 91 12 00 mov 0x1291c0,%eax 10b236: ff 70 0c pushl 0xc(%eax) 10b239: e8 b2 ae 00 00 call 1160f0 10b23e: 01 c3 add %eax,%ebx 10b240: 83 c4 10 add $0x10,%esp } chars_written += fprintf(stderr, "\n"); 10b243: 52 push %edx 10b244: 52 push %edx 10b245: 68 64 4b 12 00 push $0x124b64 10b24a: a1 c0 91 12 00 mov 0x1291c0,%eax 10b24f: ff 70 0c pushl 0xc(%eax) 10b252: e8 99 ae 00 00 call 1160f0 10b257: 8d 34 18 lea (%eax,%ebx,1),%esi (void) fflush(stderr); 10b25a: 58 pop %eax 10b25b: a1 c0 91 12 00 mov 0x1291c0,%eax 10b260: ff 70 0c pushl 0xc(%eax) 10b263: e8 94 aa 00 00 call 115cfc return chars_written; 10b268: 83 c4 10 add $0x10,%esp } 10b26b: 89 f0 mov %esi,%eax 10b26d: 8d 65 f4 lea -0xc(%ebp),%esp 10b270: 5b pop %ebx 10b271: 5e pop %esi 10b272: 5f pop %edi 10b273: c9 leave 10b274: c3 ret =============================================================================== 00107930 : /* * Extract an integer value from the database */ static int scanInt(FILE *fp, int *val) { 107930: 55 push %ebp 107931: 89 e5 mov %esp,%ebp 107933: 57 push %edi 107934: 56 push %esi 107935: 53 push %ebx 107936: 83 ec 3c sub $0x3c,%esp 107939: 89 c3 mov %eax,%ebx 10793b: 89 55 e0 mov %edx,-0x20(%ebp) int c; unsigned int i = 0; unsigned int limit = INT_MAX; int sign = 0; 10793e: 31 f6 xor %esi,%esi static int scanInt(FILE *fp, int *val) { int c; unsigned int i = 0; unsigned int limit = INT_MAX; 107940: c7 45 e4 ff ff ff 7f movl $0x7fffffff,-0x1c(%ebp) */ static int scanInt(FILE *fp, int *val) { int c; unsigned int i = 0; 107947: 31 ff xor %edi,%edi sign = 1; } if (!isdigit(c)) return 0; d = c - '0'; if ((i > (limit / 10)) 107949: 89 7d c4 mov %edi,-0x3c(%ebp) unsigned int limit = INT_MAX; int sign = 0; int d; for (;;) { c = getc(fp); 10794c: 8b 43 04 mov 0x4(%ebx),%eax 10794f: 48 dec %eax 107950: 89 43 04 mov %eax,0x4(%ebx) 107953: 85 c0 test %eax,%eax 107955: 79 15 jns 10796c <== ALWAYS TAKEN 107957: 50 push %eax <== NOT EXECUTED 107958: 50 push %eax <== NOT EXECUTED 107959: 53 push %ebx <== NOT EXECUTED 10795a: ff 35 40 4d 12 00 pushl 0x124d40 <== NOT EXECUTED 107960: e8 ff be 00 00 call 113864 <__srget_r> <== NOT EXECUTED 107965: 89 c1 mov %eax,%ecx <== NOT EXECUTED 107967: 83 c4 10 add $0x10,%esp <== NOT EXECUTED 10796a: eb 08 jmp 107974 <== NOT EXECUTED 10796c: 8b 03 mov (%ebx),%eax 10796e: 0f b6 08 movzbl (%eax),%ecx 107971: 40 inc %eax 107972: 89 03 mov %eax,(%ebx) if (c == ':') 107974: 83 f9 3a cmp $0x3a,%ecx 107977: 74 4a je 1079c3 break; if (sign == 0) { 107979: 85 f6 test %esi,%esi 10797b: 75 11 jne 10798e if (c == '-') { sign = -1; limit++; continue; } sign = 1; 10797d: 66 be 01 00 mov $0x1,%si for (;;) { c = getc(fp); if (c == ':') break; if (sign == 0) { if (c == '-') { 107981: 83 f9 2d cmp $0x2d,%ecx 107984: 75 08 jne 10798e sign = -1; limit++; 107986: ff 45 e4 incl -0x1c(%ebp) c = getc(fp); if (c == ':') break; if (sign == 0) { if (c == '-') { sign = -1; 107989: 83 ce ff or $0xffffffff,%esi limit++; continue; 10798c: eb be jmp 10794c } sign = 1; } if (!isdigit(c)) 10798e: a1 3c 4d 12 00 mov 0x124d3c,%eax 107993: f6 44 08 01 04 testb $0x4,0x1(%eax,%ecx,1) 107998: 74 41 je 1079db return 0; d = c - '0'; if ((i > (limit / 10)) 10799a: 8b 45 e4 mov -0x1c(%ebp),%eax 10799d: bf 0a 00 00 00 mov $0xa,%edi 1079a2: 31 d2 xor %edx,%edx 1079a4: f7 f7 div %edi 1079a6: 89 55 d4 mov %edx,-0x2c(%ebp) 1079a9: 39 45 c4 cmp %eax,-0x3c(%ebp) 1079ac: 77 2d ja 1079db } sign = 1; } if (!isdigit(c)) return 0; d = c - '0'; 1079ae: 83 e9 30 sub $0x30,%ecx if ((i > (limit / 10)) || ((i == (limit / 10)) && (d > (limit % 10)))) 1079b1: 39 45 c4 cmp %eax,-0x3c(%ebp) 1079b4: 75 04 jne 1079ba 1079b6: 39 d1 cmp %edx,%ecx 1079b8: 77 21 ja 1079db <== ALWAYS TAKEN return 0; i = i * 10 + d; 1079ba: 6b 7d c4 0a imul $0xa,-0x3c(%ebp),%edi 1079be: 8d 3c 39 lea (%ecx,%edi,1),%edi 1079c1: eb 86 jmp 107949 1079c3: 8b 7d c4 mov -0x3c(%ebp),%edi } if (sign == 0) return 0; 1079c6: 31 c0 xor %eax,%eax if ((i > (limit / 10)) || ((i == (limit / 10)) && (d > (limit % 10)))) return 0; i = i * 10 + d; } if (sign == 0) 1079c8: 85 f6 test %esi,%esi 1079ca: 74 11 je 1079dd <== NEVER TAKEN return 0; *val = i * sign; 1079cc: 0f af f7 imul %edi,%esi 1079cf: 8b 45 e0 mov -0x20(%ebp),%eax 1079d2: 89 30 mov %esi,(%eax) return 1; 1079d4: b8 01 00 00 00 mov $0x1,%eax 1079d9: eb 02 jmp 1079dd if (!isdigit(c)) return 0; d = c - '0'; if ((i > (limit / 10)) || ((i == (limit / 10)) && (d > (limit % 10)))) return 0; 1079db: 31 c0 xor %eax,%eax } if (sign == 0) return 0; *val = i * sign; return 1; } 1079dd: 8d 65 f4 lea -0xc(%ebp),%esp 1079e0: 5b pop %ebx 1079e1: 5e pop %esi 1079e2: 5f pop %edi 1079e3: c9 leave 1079e4: c3 ret =============================================================================== 00107a70 : FILE *fp, struct group *grp, char *buffer, size_t bufsize ) { 107a70: 55 push %ebp 107a71: 89 e5 mov %esp,%ebp 107a73: 57 push %edi 107a74: 56 push %esi 107a75: 53 push %ebx 107a76: 83 ec 34 sub $0x34,%esp 107a79: 89 c7 mov %eax,%edi 107a7b: 89 d3 mov %edx,%ebx 107a7d: 89 4d d4 mov %ecx,-0x2c(%ebp) int grgid; char *grmem, *cp; int memcount; if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0) 107a80: 6a 00 push $0x0 107a82: 8d 45 08 lea 0x8(%ebp),%eax 107a85: 50 push %eax 107a86: 8d 4d d4 lea -0x2c(%ebp),%ecx 107a89: 89 f8 mov %edi,%eax 107a8b: e8 55 ff ff ff call 1079e5 107a90: 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; 107a93: 31 f6 xor %esi,%esi { int grgid; char *grmem, *cp; int memcount; if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0) 107a95: 85 c0 test %eax,%eax 107a97: 0f 84 c2 00 00 00 je 107b5f || !scanString(fp, &grp->gr_passwd, &buffer, &bufsize, 0) 107a9d: 50 push %eax 107a9e: 50 push %eax 107a9f: 8d 53 04 lea 0x4(%ebx),%edx 107aa2: 6a 00 push $0x0 107aa4: 8d 45 08 lea 0x8(%ebp),%eax 107aa7: 50 push %eax 107aa8: 8d 4d d4 lea -0x2c(%ebp),%ecx 107aab: 89 f8 mov %edi,%eax 107aad: e8 33 ff ff ff call 1079e5 107ab2: 83 c4 10 add $0x10,%esp 107ab5: 85 c0 test %eax,%eax 107ab7: 0f 84 a2 00 00 00 je 107b5f <== NEVER TAKEN || !scanInt(fp, &grgid) 107abd: 8d 55 e4 lea -0x1c(%ebp),%edx 107ac0: 89 f8 mov %edi,%eax 107ac2: e8 69 fe ff ff call 107930 107ac7: 85 c0 test %eax,%eax 107ac9: 0f 84 90 00 00 00 je 107b5f <== NEVER TAKEN || !scanString(fp, &grmem, &buffer, &bufsize, 1)) 107acf: 51 push %ecx 107ad0: 51 push %ecx 107ad1: 8d 55 e0 lea -0x20(%ebp),%edx 107ad4: 6a 01 push $0x1 107ad6: 8d 45 08 lea 0x8(%ebp),%eax 107ad9: 50 push %eax 107ada: 8d 4d d4 lea -0x2c(%ebp),%ecx 107add: 89 f8 mov %edi,%eax 107adf: e8 01 ff ff ff call 1079e5 107ae4: 83 c4 10 add $0x10,%esp 107ae7: 85 c0 test %eax,%eax 107ae9: 74 74 je 107b5f <== NEVER TAKEN return 0; grp->gr_gid = grgid; 107aeb: 8b 45 e4 mov -0x1c(%ebp),%eax 107aee: 66 89 43 08 mov %ax,0x8(%ebx) /* * Determine number of members */ for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 107af2: 8b 4d e0 mov -0x20(%ebp),%ecx 107af5: 89 ca mov %ecx,%edx 107af7: b8 01 00 00 00 mov $0x1,%eax 107afc: 89 c6 mov %eax,%esi 107afe: eb 0b jmp 107b0b if(*cp == ',') memcount++; 107b00: 3c 2c cmp $0x2c,%al 107b02: 0f 94 c0 sete %al 107b05: 0f b6 c0 movzbl %al,%eax 107b08: 01 c6 add %eax,%esi grp->gr_gid = grgid; /* * Determine number of members */ for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 107b0a: 42 inc %edx 107b0b: 8a 02 mov (%edx),%al 107b0d: 84 c0 test %al,%al 107b0f: 75 ef jne 107b00 } /* * Hack to produce (hopefully) a suitably-aligned array of pointers */ if (bufsize < (((memcount+1)*sizeof(char *)) + 15)) 107b11: 8d 04 b5 13 00 00 00 lea 0x13(,%esi,4),%eax return 0; 107b18: 31 f6 xor %esi,%esi } /* * Hack to produce (hopefully) a suitably-aligned array of pointers */ if (bufsize < (((memcount+1)*sizeof(char *)) + 15)) 107b1a: 39 45 08 cmp %eax,0x8(%ebp) 107b1d: 72 40 jb 107b5f <== NEVER TAKEN return 0; grp->gr_mem = (char **)(((uintptr_t)buffer + 15) & ~15); 107b1f: 8b 45 d4 mov -0x2c(%ebp),%eax 107b22: 83 c0 0f add $0xf,%eax 107b25: 83 e0 f0 and $0xfffffff0,%eax 107b28: 89 43 0c mov %eax,0xc(%ebx) /* * Fill in pointer array */ grp->gr_mem[0] = grmem; 107b2b: 89 08 mov %ecx,(%eax) } /* * Extract a single group record from the database */ static int scangr( 107b2d: 8b 45 e0 mov -0x20(%ebp),%eax 107b30: 40 inc %eax /* * Fill in pointer array */ grp->gr_mem[0] = grmem; for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 107b31: ba 01 00 00 00 mov $0x1,%edx 107b36: eb 11 jmp 107b49 if(*cp == ',') { 107b38: 80 f9 2c cmp $0x2c,%cl 107b3b: 75 0b jne 107b48 *cp = '\0'; 107b3d: c6 40 ff 00 movb $0x0,-0x1(%eax) grp->gr_mem[memcount++] = cp + 1; 107b41: 8b 4b 0c mov 0xc(%ebx),%ecx 107b44: 89 04 91 mov %eax,(%ecx,%edx,4) 107b47: 42 inc %edx 107b48: 40 inc %eax /* * Fill in pointer array */ grp->gr_mem[0] = grmem; for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 107b49: 8a 48 ff mov -0x1(%eax),%cl 107b4c: 84 c9 test %cl,%cl 107b4e: 75 e8 jne 107b38 if(*cp == ',') { *cp = '\0'; grp->gr_mem[memcount++] = cp + 1; } } grp->gr_mem[memcount] = NULL; 107b50: 8b 43 0c mov 0xc(%ebx),%eax 107b53: c7 04 90 00 00 00 00 movl $0x0,(%eax,%edx,4) return 1; 107b5a: be 01 00 00 00 mov $0x1,%esi } 107b5f: 89 f0 mov %esi,%eax 107b61: 8d 65 f4 lea -0xc(%ebp),%esp 107b64: 5b pop %ebx 107b65: 5e pop %esi 107b66: 5f pop %edi 107b67: c9 leave 107b68: c3 ret =============================================================================== 00107b69 : FILE *fp, struct passwd *pwd, char *buffer, size_t bufsize ) { 107b69: 55 push %ebp 107b6a: 89 e5 mov %esp,%ebp 107b6c: 57 push %edi 107b6d: 56 push %esi 107b6e: 53 push %ebx 107b6f: 83 ec 34 sub $0x34,%esp 107b72: 89 c6 mov %eax,%esi 107b74: 89 d3 mov %edx,%ebx 107b76: 89 4d d4 mov %ecx,-0x2c(%ebp) int pwuid, pwgid; if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0) 107b79: 8d 7d d4 lea -0x2c(%ebp),%edi 107b7c: 6a 00 push $0x0 107b7e: 8d 45 08 lea 0x8(%ebp),%eax 107b81: 50 push %eax 107b82: 89 f9 mov %edi,%ecx 107b84: 89 f0 mov %esi,%eax 107b86: e8 5a fe ff ff call 1079e5 107b8b: 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; 107b8e: 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) 107b95: 85 c0 test %eax,%eax 107b97: 0f 84 c4 00 00 00 je 107c61 || !scanString(fp, &pwd->pw_passwd, &buffer, &bufsize, 0) 107b9d: 51 push %ecx 107b9e: 51 push %ecx 107b9f: 8d 53 04 lea 0x4(%ebx),%edx 107ba2: 6a 00 push $0x0 107ba4: 8d 45 08 lea 0x8(%ebp),%eax 107ba7: 50 push %eax 107ba8: 89 f9 mov %edi,%ecx 107baa: 89 f0 mov %esi,%eax 107bac: e8 34 fe ff ff call 1079e5 107bb1: 83 c4 10 add $0x10,%esp 107bb4: 85 c0 test %eax,%eax 107bb6: 0f 84 a5 00 00 00 je 107c61 <== NEVER TAKEN || !scanInt(fp, &pwuid) 107bbc: 8d 55 e4 lea -0x1c(%ebp),%edx 107bbf: 89 f0 mov %esi,%eax 107bc1: e8 6a fd ff ff call 107930 107bc6: 85 c0 test %eax,%eax 107bc8: 0f 84 93 00 00 00 je 107c61 || !scanInt(fp, &pwgid) 107bce: 8d 55 e0 lea -0x20(%ebp),%edx 107bd1: 89 f0 mov %esi,%eax 107bd3: e8 58 fd ff ff call 107930 107bd8: 85 c0 test %eax,%eax 107bda: 0f 84 81 00 00 00 je 107c61 || !scanString(fp, &pwd->pw_comment, &buffer, &bufsize, 0) 107be0: 52 push %edx 107be1: 52 push %edx 107be2: 8d 53 0c lea 0xc(%ebx),%edx 107be5: 6a 00 push $0x0 107be7: 8d 45 08 lea 0x8(%ebp),%eax 107bea: 50 push %eax 107beb: 89 f9 mov %edi,%ecx 107bed: 89 f0 mov %esi,%eax 107bef: e8 f1 fd ff ff call 1079e5 107bf4: 83 c4 10 add $0x10,%esp 107bf7: 85 c0 test %eax,%eax 107bf9: 74 66 je 107c61 <== NEVER TAKEN || !scanString(fp, &pwd->pw_gecos, &buffer, &bufsize, 0) 107bfb: 50 push %eax 107bfc: 50 push %eax 107bfd: 8d 53 10 lea 0x10(%ebx),%edx 107c00: 6a 00 push $0x0 107c02: 8d 45 08 lea 0x8(%ebp),%eax 107c05: 50 push %eax 107c06: 89 f9 mov %edi,%ecx 107c08: 89 f0 mov %esi,%eax 107c0a: e8 d6 fd ff ff call 1079e5 107c0f: 83 c4 10 add $0x10,%esp 107c12: 85 c0 test %eax,%eax 107c14: 74 4b je 107c61 <== NEVER TAKEN || !scanString(fp, &pwd->pw_dir, &buffer, &bufsize, 0) 107c16: 51 push %ecx 107c17: 51 push %ecx 107c18: 8d 53 14 lea 0x14(%ebx),%edx 107c1b: 6a 00 push $0x0 107c1d: 8d 45 08 lea 0x8(%ebp),%eax 107c20: 50 push %eax 107c21: 89 f9 mov %edi,%ecx 107c23: 89 f0 mov %esi,%eax 107c25: e8 bb fd ff ff call 1079e5 107c2a: 83 c4 10 add $0x10,%esp 107c2d: 85 c0 test %eax,%eax 107c2f: 74 30 je 107c61 <== NEVER TAKEN || !scanString(fp, &pwd->pw_shell, &buffer, &bufsize, 1)) 107c31: 52 push %edx 107c32: 52 push %edx 107c33: 8d 53 18 lea 0x18(%ebx),%edx 107c36: 6a 01 push $0x1 107c38: 8d 45 08 lea 0x8(%ebp),%eax 107c3b: 50 push %eax 107c3c: 89 f9 mov %edi,%ecx 107c3e: 89 f0 mov %esi,%eax 107c40: e8 a0 fd ff ff call 1079e5 107c45: 83 c4 10 add $0x10,%esp 107c48: 85 c0 test %eax,%eax 107c4a: 74 15 je 107c61 return 0; pwd->pw_uid = pwuid; 107c4c: 8b 45 e4 mov -0x1c(%ebp),%eax 107c4f: 66 89 43 08 mov %ax,0x8(%ebx) pwd->pw_gid = pwgid; 107c53: 8b 45 e0 mov -0x20(%ebp),%eax 107c56: 66 89 43 0a mov %ax,0xa(%ebx) return 1; 107c5a: c7 45 d0 01 00 00 00 movl $0x1,-0x30(%ebp) } 107c61: 8b 45 d0 mov -0x30(%ebp),%eax 107c64: 8d 65 f4 lea -0xc(%ebp),%esp 107c67: 5b pop %ebx 107c68: 5e pop %esi 107c69: 5f pop %edi 107c6a: c9 leave 107c6b: c3 ret =============================================================================== 0010a8f4 : #include int sched_get_priority_max( int policy ) { 10a8f4: 55 push %ebp 10a8f5: 89 e5 mov %esp,%ebp 10a8f7: 83 ec 08 sub $0x8,%esp 10a8fa: 8b 4d 08 mov 0x8(%ebp),%ecx switch ( policy ) { 10a8fd: 83 f9 04 cmp $0x4,%ecx 10a900: 77 0b ja 10a90d 10a902: b8 01 00 00 00 mov $0x1,%eax 10a907: d3 e0 shl %cl,%eax 10a909: a8 17 test $0x17,%al 10a90b: 75 10 jne 10a91d <== ALWAYS TAKEN case SCHED_RR: case SCHED_SPORADIC: break; default: rtems_set_errno_and_return_minus_one( EINVAL ); 10a90d: e8 ba 73 00 00 call 111ccc <__errno> 10a912: c7 00 16 00 00 00 movl $0x16,(%eax) 10a918: 83 c8 ff or $0xffffffff,%eax 10a91b: eb 08 jmp 10a925 } return POSIX_SCHEDULER_MAXIMUM_PRIORITY; 10a91d: 0f b6 05 48 22 12 00 movzbl 0x122248,%eax 10a924: 48 dec %eax } 10a925: c9 leave 10a926: c3 ret =============================================================================== 0010a928 : #include int sched_get_priority_min( int policy ) { 10a928: 55 push %ebp 10a929: 89 e5 mov %esp,%ebp 10a92b: 83 ec 08 sub $0x8,%esp 10a92e: 8b 4d 08 mov 0x8(%ebp),%ecx switch ( policy ) { 10a931: 83 f9 04 cmp $0x4,%ecx 10a934: 77 11 ja 10a947 10a936: ba 01 00 00 00 mov $0x1,%edx 10a93b: d3 e2 shl %cl,%edx default: rtems_set_errno_and_return_minus_one( EINVAL ); } return POSIX_SCHEDULER_MINIMUM_PRIORITY; 10a93d: b8 01 00 00 00 mov $0x1,%eax int sched_get_priority_min( int policy ) { switch ( policy ) { 10a942: 80 e2 17 and $0x17,%dl 10a945: 75 0e jne 10a955 <== ALWAYS TAKEN case SCHED_RR: case SCHED_SPORADIC: break; default: rtems_set_errno_and_return_minus_one( EINVAL ); 10a947: e8 80 73 00 00 call 111ccc <__errno> 10a94c: c7 00 16 00 00 00 movl $0x16,(%eax) 10a952: 83 c8 ff or $0xffffffff,%eax } return POSIX_SCHEDULER_MINIMUM_PRIORITY; } 10a955: c9 leave 10a956: c3 ret =============================================================================== 0010a958 : int sched_rr_get_interval( pid_t pid, struct timespec *interval ) { 10a958: 55 push %ebp 10a959: 89 e5 mov %esp,%ebp 10a95b: 56 push %esi 10a95c: 53 push %ebx 10a95d: 8b 75 08 mov 0x8(%ebp),%esi 10a960: 8b 5d 0c mov 0xc(%ebp),%ebx /* * Only supported for the "calling process" (i.e. this node). */ if ( pid && pid != getpid() ) 10a963: 85 f6 test %esi,%esi 10a965: 74 16 je 10a97d <== NEVER TAKEN 10a967: e8 b4 d0 ff ff call 107a20 10a96c: 39 c6 cmp %eax,%esi 10a96e: 74 0d je 10a97d rtems_set_errno_and_return_minus_one( ESRCH ); 10a970: e8 57 73 00 00 call 111ccc <__errno> 10a975: c7 00 03 00 00 00 movl $0x3,(%eax) 10a97b: eb 0f jmp 10a98c if ( !interval ) 10a97d: 85 db test %ebx,%ebx 10a97f: 75 10 jne 10a991 rtems_set_errno_and_return_minus_one( EINVAL ); 10a981: e8 46 73 00 00 call 111ccc <__errno> 10a986: c7 00 16 00 00 00 movl $0x16,(%eax) 10a98c: 83 c8 ff or $0xffffffff,%eax 10a98f: eb 13 jmp 10a9a4 _Timespec_From_ticks( _Thread_Ticks_per_timeslice, interval ); 10a991: 50 push %eax 10a992: 50 push %eax 10a993: 53 push %ebx 10a994: ff 35 20 63 12 00 pushl 0x126320 10a99a: e8 a9 30 00 00 call 10da48 <_Timespec_From_ticks> return 0; 10a99f: 83 c4 10 add $0x10,%esp 10a9a2: 31 c0 xor %eax,%eax } 10a9a4: 8d 65 f8 lea -0x8(%ebp),%esp 10a9a7: 5b pop %ebx 10a9a8: 5e pop %esi 10a9a9: c9 leave 10a9aa: c3 ret =============================================================================== 0010cff0 : int sem_init( sem_t *sem, int pshared, unsigned int value ) { 10cff0: 55 push %ebp 10cff1: 89 e5 mov %esp,%ebp 10cff3: 53 push %ebx 10cff4: 83 ec 14 sub $0x14,%esp 10cff7: 8b 5d 08 mov 0x8(%ebp),%ebx int status; POSIX_Semaphore_Control *the_semaphore; if ( !sem ) 10cffa: 85 db test %ebx,%ebx 10cffc: 75 10 jne 10d00e <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); 10cffe: e8 d5 7f 00 00 call 114fd8 <__errno> 10d003: c7 00 16 00 00 00 movl $0x16,(%eax) 10d009: 83 c8 ff or $0xffffffff,%eax 10d00c: eb 21 jmp 10d02f status = _POSIX_Semaphore_Create_support( 10d00e: 8d 45 f4 lea -0xc(%ebp),%eax 10d011: 50 push %eax 10d012: ff 75 10 pushl 0x10(%ebp) 10d015: ff 75 0c pushl 0xc(%ebp) 10d018: 6a 00 push $0x0 10d01a: e8 bd 58 00 00 call 1128dc <_POSIX_Semaphore_Create_support> pshared, value, &the_semaphore ); if ( status != -1 ) 10d01f: 83 c4 10 add $0x10,%esp 10d022: 83 f8 ff cmp $0xffffffff,%eax 10d025: 74 08 je 10d02f *sem = the_semaphore->Object.id; 10d027: 8b 55 f4 mov -0xc(%ebp),%edx 10d02a: 8b 52 08 mov 0x8(%edx),%edx 10d02d: 89 13 mov %edx,(%ebx) return status; } 10d02f: 8b 5d fc mov -0x4(%ebp),%ebx 10d032: c9 leave 10d033: c3 ret =============================================================================== 0010d034 : int oflag, ... /* mode_t mode, */ /* unsigned int value */ ) { 10d034: 55 push %ebp 10d035: 89 e5 mov %esp,%ebp 10d037: 57 push %edi 10d038: 56 push %esi 10d039: 53 push %ebx 10d03a: 83 ec 2c sub $0x2c,%esp 10d03d: 8b 75 08 mov 0x8(%ebp),%esi rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 10d040: a1 e8 ae 12 00 mov 0x12aee8,%eax 10d045: 40 inc %eax 10d046: a3 e8 ae 12 00 mov %eax,0x12aee8 va_list arg; mode_t mode; unsigned int value = 0; 10d04b: 31 ff xor %edi,%edi POSIX_Semaphore_Control *the_semaphore; Objects_Locations location; _Thread_Disable_dispatch(); if ( oflag & O_CREAT ) { 10d04d: 8b 45 0c mov 0xc(%ebp),%eax 10d050: 25 00 02 00 00 and $0x200,%eax 10d055: 89 45 d4 mov %eax,-0x2c(%ebp) 10d058: 74 03 je 10d05d va_start(arg, oflag); mode = (mode_t) va_arg( arg, unsigned int ); value = va_arg( arg, unsigned int ); 10d05a: 8b 7d 14 mov 0x14(%ebp),%edi va_end(arg); } status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id ); 10d05d: 52 push %edx 10d05e: 52 push %edx 10d05f: 8d 45 e4 lea -0x1c(%ebp),%eax 10d062: 50 push %eax 10d063: 56 push %esi 10d064: e8 a7 59 00 00 call 112a10 <_POSIX_Semaphore_Name_to_id> 10d069: 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 ) { 10d06b: 83 c4 10 add $0x10,%esp 10d06e: 85 c0 test %eax,%eax 10d070: 74 19 je 10d08b /* * 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) ) ) { 10d072: 83 f8 02 cmp $0x2,%eax 10d075: 75 06 jne 10d07d <== NEVER TAKEN 10d077: 83 7d d4 00 cmpl $0x0,-0x2c(%ebp) 10d07b: 75 59 jne 10d0d6 _Thread_Enable_dispatch(); 10d07d: e8 30 28 00 00 call 10f8b2 <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one_cast( status, sem_t * ); 10d082: e8 51 7f 00 00 call 114fd8 <__errno> 10d087: 89 18 mov %ebx,(%eax) 10d089: eb 1f jmp 10d0aa /* * Check for existence with creation. */ if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) { 10d08b: 8b 45 0c mov 0xc(%ebp),%eax 10d08e: 25 00 0a 00 00 and $0xa00,%eax 10d093: 3d 00 0a 00 00 cmp $0xa00,%eax 10d098: 75 15 jne 10d0af _Thread_Enable_dispatch(); 10d09a: e8 13 28 00 00 call 10f8b2 <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * ); 10d09f: e8 34 7f 00 00 call 114fd8 <__errno> 10d0a4: c7 00 11 00 00 00 movl $0x11,(%eax) 10d0aa: 83 c8 ff or $0xffffffff,%eax 10d0ad: eb 4a jmp 10d0f9 10d0af: 50 push %eax } the_semaphore = _POSIX_Semaphore_Get( &the_semaphore_id, &location ); 10d0b0: 8d 45 dc lea -0x24(%ebp),%eax 10d0b3: 50 push %eax 10d0b4: ff 75 e4 pushl -0x1c(%ebp) 10d0b7: 68 8c b1 12 00 push $0x12b18c 10d0bc: e8 d7 1c 00 00 call 10ed98 <_Objects_Get> 10d0c1: 89 45 e0 mov %eax,-0x20(%ebp) the_semaphore->open_count += 1; 10d0c4: ff 40 18 incl 0x18(%eax) _Thread_Enable_dispatch(); 10d0c7: e8 e6 27 00 00 call 10f8b2 <_Thread_Enable_dispatch> _Thread_Enable_dispatch(); 10d0cc: e8 e1 27 00 00 call 10f8b2 <_Thread_Enable_dispatch> goto return_id; 10d0d1: 83 c4 10 add $0x10,%esp 10d0d4: eb 1d jmp 10d0f3 /* * 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( 10d0d6: 8d 45 e0 lea -0x20(%ebp),%eax 10d0d9: 50 push %eax 10d0da: 57 push %edi 10d0db: 6a 00 push $0x0 10d0dd: 56 push %esi 10d0de: e8 f9 57 00 00 call 1128dc <_POSIX_Semaphore_Create_support> 10d0e3: 89 c3 mov %eax,%ebx /* * errno was set by Create_support, so don't set it again. */ _Thread_Enable_dispatch(); 10d0e5: e8 c8 27 00 00 call 10f8b2 <_Thread_Enable_dispatch> if ( status == -1 ) 10d0ea: 83 c4 10 add $0x10,%esp return SEM_FAILED; 10d0ed: 83 c8 ff or $0xffffffff,%eax * errno was set by Create_support, so don't set it again. */ _Thread_Enable_dispatch(); if ( status == -1 ) 10d0f0: 43 inc %ebx 10d0f1: 74 06 je 10d0f9 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; 10d0f3: 8b 45 e0 mov -0x20(%ebp),%eax 10d0f6: 83 c0 08 add $0x8,%eax #endif return id; } 10d0f9: 8d 65 f4 lea -0xc(%ebp),%esp 10d0fc: 5b pop %ebx 10d0fd: 5e pop %esi 10d0fe: 5f pop %edi 10d0ff: c9 leave 10d100: c3 ret =============================================================================== 0010a7d0 : int sigaction( int sig, const struct sigaction *act, struct sigaction *oact ) { 10a7d0: 55 push %ebp 10a7d1: 89 e5 mov %esp,%ebp 10a7d3: 57 push %edi 10a7d4: 56 push %esi 10a7d5: 53 push %ebx 10a7d6: 83 ec 1c sub $0x1c,%esp 10a7d9: 8b 5d 08 mov 0x8(%ebp),%ebx 10a7dc: 8b 55 0c mov 0xc(%ebp),%edx 10a7df: 8b 45 10 mov 0x10(%ebp),%eax ISR_Level level; if ( oact ) 10a7e2: 85 c0 test %eax,%eax 10a7e4: 74 12 je 10a7f8 *oact = _POSIX_signals_Vectors[ sig ]; 10a7e6: 6b f3 0c imul $0xc,%ebx,%esi 10a7e9: 81 c6 3c 7a 12 00 add $0x127a3c,%esi 10a7ef: b9 03 00 00 00 mov $0x3,%ecx 10a7f4: 89 c7 mov %eax,%edi 10a7f6: f3 a5 rep movsl %ds:(%esi),%es:(%edi) if ( !sig ) 10a7f8: 85 db test %ebx,%ebx 10a7fa: 74 0d je 10a809 static inline bool is_valid_signo( int signo ) { return ((signo) >= 1 && (signo) <= 32 ); 10a7fc: 8d 43 ff lea -0x1(%ebx),%eax rtems_set_errno_and_return_minus_one( EINVAL ); if ( !is_valid_signo(sig) ) 10a7ff: 83 f8 1f cmp $0x1f,%eax 10a802: 77 05 ja 10a809 * * NOTE: Solaris documentation claims to "silently enforce" this which * contradicts the POSIX specification. */ if ( sig == SIGKILL ) 10a804: 83 fb 09 cmp $0x9,%ebx 10a807: 75 10 jne 10a819 rtems_set_errno_and_return_minus_one( EINVAL ); 10a809: e8 52 77 00 00 call 111f60 <__errno> 10a80e: c7 00 16 00 00 00 movl $0x16,(%eax) 10a814: 83 c8 ff or $0xffffffff,%eax 10a817: eb 57 jmp 10a870 * 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; 10a819: 31 c0 xor %eax,%eax /* * Evaluate the new action structure and set the global signal vector * appropriately. */ if ( act ) { 10a81b: 85 d2 test %edx,%edx 10a81d: 74 51 je 10a870 <== 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 ); 10a81f: 9c pushf 10a820: fa cli 10a821: 8f 45 e4 popl -0x1c(%ebp) if ( act->sa_handler == SIG_DFL ) { 10a824: 83 7a 08 00 cmpl $0x0,0x8(%edx) 10a828: 75 1a jne 10a844 _POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ]; 10a82a: 6b f3 0c imul $0xc,%ebx,%esi 10a82d: 8d 86 3c 7a 12 00 lea 0x127a3c(%esi),%eax 10a833: 81 c6 c4 11 12 00 add $0x1211c4,%esi 10a839: b9 03 00 00 00 mov $0x3,%ecx 10a83e: 89 c7 mov %eax,%edi 10a840: f3 a5 rep movsl %ds:(%esi),%es:(%edi) 10a842: eb 26 jmp 10a86a } else { _POSIX_signals_Clear_process_signals( sig ); 10a844: 83 ec 0c sub $0xc,%esp 10a847: 53 push %ebx 10a848: 89 55 e0 mov %edx,-0x20(%ebp) 10a84b: e8 ac 4e 00 00 call 10f6fc <_POSIX_signals_Clear_process_signals> _POSIX_signals_Vectors[ sig ] = *act; 10a850: 6b db 0c imul $0xc,%ebx,%ebx 10a853: 81 c3 3c 7a 12 00 add $0x127a3c,%ebx 10a859: b9 03 00 00 00 mov $0x3,%ecx 10a85e: 8b 55 e0 mov -0x20(%ebp),%edx 10a861: 89 df mov %ebx,%edi 10a863: 89 d6 mov %edx,%esi 10a865: f3 a5 rep movsl %ds:(%esi),%es:(%edi) 10a867: 83 c4 10 add $0x10,%esp } _ISR_Enable( level ); 10a86a: ff 75 e4 pushl -0x1c(%ebp) 10a86d: 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; 10a86e: 31 c0 xor %eax,%eax } 10a870: 8d 65 f4 lea -0xc(%ebp),%esp 10a873: 5b pop %ebx 10a874: 5e pop %esi 10a875: 5f pop %edi 10a876: c9 leave 10a877: c3 ret =============================================================================== 0010ab97 : int sigtimedwait( const sigset_t *set, siginfo_t *info, const struct timespec *timeout ) { 10ab97: 55 push %ebp 10ab98: 89 e5 mov %esp,%ebp 10ab9a: 57 push %edi 10ab9b: 56 push %esi 10ab9c: 53 push %ebx 10ab9d: 83 ec 3c sub $0x3c,%esp 10aba0: 8b 75 08 mov 0x8(%ebp),%esi 10aba3: 8b 5d 10 mov 0x10(%ebp),%ebx ISR_Level level; /* * Error check parameters before disabling interrupts. */ if ( !set ) 10aba6: 85 f6 test %esi,%esi 10aba8: 74 24 je 10abce /* NOTE: This is very specifically a RELATIVE not ABSOLUTE time * in the Open Group specification. */ interval = 0; if ( timeout ) { 10abaa: 85 db test %ebx,%ebx 10abac: 74 30 je 10abde if ( !_Timespec_Is_valid( timeout ) ) 10abae: 83 ec 0c sub $0xc,%esp 10abb1: 53 push %ebx 10abb2: e8 4d 31 00 00 call 10dd04 <_Timespec_Is_valid> 10abb7: 83 c4 10 add $0x10,%esp 10abba: 84 c0 test %al,%al 10abbc: 74 10 je 10abce rtems_set_errno_and_return_minus_one( EINVAL ); interval = _Timespec_To_ticks( timeout ); 10abbe: 83 ec 0c sub $0xc,%esp 10abc1: 53 push %ebx 10abc2: e8 95 31 00 00 call 10dd5c <_Timespec_To_ticks> if ( !interval ) 10abc7: 83 c4 10 add $0x10,%esp 10abca: 85 c0 test %eax,%eax 10abcc: 75 12 jne 10abe0 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); 10abce: e8 35 79 00 00 call 112508 <__errno> 10abd3: c7 00 16 00 00 00 movl $0x16,(%eax) 10abd9: e9 39 01 00 00 jmp 10ad17 /* NOTE: This is very specifically a RELATIVE not ABSOLUTE time * in the Open Group specification. */ interval = 0; 10abde: 31 c0 xor %eax,%eax /* * Initialize local variables. */ the_info = ( info ) ? info : &signal_information; 10abe0: 8b 7d 0c mov 0xc(%ebp),%edi 10abe3: 85 ff test %edi,%edi 10abe5: 75 03 jne 10abea 10abe7: 8d 7d dc lea -0x24(%ebp),%edi the_thread = _Thread_Executing; 10abea: 8b 15 c8 78 12 00 mov 0x1278c8,%edx api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 10abf0: 8b 8a ec 00 00 00 mov 0xec(%edx),%ecx 10abf6: 89 4d d4 mov %ecx,-0x2c(%ebp) * What if they are already pending? */ /* API signals pending? */ _ISR_Disable( level ); 10abf9: 9c pushf 10abfa: fa cli 10abfb: 8f 45 d0 popl -0x30(%ebp) if ( *set & api->signals_pending ) { 10abfe: 8b 1e mov (%esi),%ebx 10ac00: 89 5d c4 mov %ebx,-0x3c(%ebp) 10ac03: 8b 5d d4 mov -0x2c(%ebp),%ebx 10ac06: 8b 8b d4 00 00 00 mov 0xd4(%ebx),%ecx 10ac0c: 85 4d c4 test %ecx,-0x3c(%ebp) 10ac0f: 74 32 je 10ac43 /* XXX real info later */ the_info->si_signo = _POSIX_signals_Get_lowest( api->signals_pending ); 10ac11: 83 ec 0c sub $0xc,%esp 10ac14: 51 push %ecx 10ac15: e8 3e ff ff ff call 10ab58 <_POSIX_signals_Get_lowest> 10ac1a: 89 07 mov %eax,(%edi) _POSIX_signals_Clear_signals( 10ac1c: c7 04 24 00 00 00 00 movl $0x0,(%esp) 10ac23: 6a 00 push $0x0 10ac25: 57 push %edi 10ac26: 50 push %eax 10ac27: 53 push %ebx 10ac28: e8 1b 51 00 00 call 10fd48 <_POSIX_signals_Clear_signals> the_info->si_signo, the_info, false, false ); _ISR_Enable( level ); 10ac2d: ff 75 d0 pushl -0x30(%ebp) 10ac30: 9d popf the_info->si_code = SI_USER; 10ac31: c7 47 04 01 00 00 00 movl $0x1,0x4(%edi) the_info->si_value.sival_int = 0; 10ac38: c7 47 08 00 00 00 00 movl $0x0,0x8(%edi) return the_info->si_signo; 10ac3f: 8b 1f mov (%edi),%ebx 10ac41: eb 3d jmp 10ac80 } /* Process pending signals? */ if ( *set & _POSIX_signals_Pending ) { 10ac43: 8b 0d f0 7a 12 00 mov 0x127af0,%ecx 10ac49: 85 4d c4 test %ecx,-0x3c(%ebp) 10ac4c: 74 3a je 10ac88 signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending ); 10ac4e: 83 ec 0c sub $0xc,%esp 10ac51: 51 push %ecx 10ac52: e8 01 ff ff ff call 10ab58 <_POSIX_signals_Get_lowest> 10ac57: 89 c3 mov %eax,%ebx _POSIX_signals_Clear_signals( api, signo, the_info, true, false ); 10ac59: c7 04 24 00 00 00 00 movl $0x0,(%esp) 10ac60: 6a 01 push $0x1 10ac62: 57 push %edi 10ac63: 50 push %eax 10ac64: ff 75 d4 pushl -0x2c(%ebp) 10ac67: e8 dc 50 00 00 call 10fd48 <_POSIX_signals_Clear_signals> _ISR_Enable( level ); 10ac6c: ff 75 d0 pushl -0x30(%ebp) 10ac6f: 9d popf the_info->si_signo = signo; 10ac70: 89 1f mov %ebx,(%edi) the_info->si_code = SI_USER; 10ac72: c7 47 04 01 00 00 00 movl $0x1,0x4(%edi) the_info->si_value.sival_int = 0; 10ac79: c7 47 08 00 00 00 00 movl $0x0,0x8(%edi) return signo; 10ac80: 83 c4 20 add $0x20,%esp 10ac83: e9 92 00 00 00 jmp 10ad1a } the_info->si_signo = -1; 10ac88: c7 07 ff ff ff ff movl $0xffffffff,(%edi) 10ac8e: 8b 0d a0 73 12 00 mov 0x1273a0,%ecx 10ac94: 41 inc %ecx 10ac95: 89 0d a0 73 12 00 mov %ecx,0x1273a0 _Thread_Disable_dispatch(); the_thread->Wait.queue = &_POSIX_signals_Wait_queue; 10ac9b: c7 42 44 88 7a 12 00 movl $0x127a88,0x44(%edx) the_thread->Wait.return_code = EINTR; 10aca2: c7 42 34 04 00 00 00 movl $0x4,0x34(%edx) the_thread->Wait.option = *set; 10aca9: 8b 0e mov (%esi),%ecx 10acab: 89 4a 30 mov %ecx,0x30(%edx) the_thread->Wait.return_argument = the_info; 10acae: 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; 10acb1: c7 05 b8 7a 12 00 01 movl $0x1,0x127ab8 10acb8: 00 00 00 _Thread_queue_Enter_critical_section( &_POSIX_signals_Wait_queue ); _ISR_Enable( level ); 10acbb: ff 75 d0 pushl -0x30(%ebp) 10acbe: 9d popf _Thread_queue_Enqueue( &_POSIX_signals_Wait_queue, interval ); 10acbf: 52 push %edx 10acc0: 68 80 da 10 00 push $0x10da80 10acc5: 50 push %eax 10acc6: 68 88 7a 12 00 push $0x127a88 10accb: e8 d4 2a 00 00 call 10d7a4 <_Thread_queue_Enqueue_with_handler> _Thread_Enable_dispatch(); 10acd0: e8 89 26 00 00 call 10d35e <_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 ); 10acd5: c7 04 24 00 00 00 00 movl $0x0,(%esp) 10acdc: 6a 00 push $0x0 10acde: 57 push %edi 10acdf: ff 37 pushl (%edi) 10ace1: ff 75 d4 pushl -0x2c(%ebp) 10ace4: e8 5f 50 00 00 call 10fd48 <_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) 10ace9: 83 c4 20 add $0x20,%esp 10acec: a1 c8 78 12 00 mov 0x1278c8,%eax 10acf1: 83 78 34 04 cmpl $0x4,0x34(%eax) 10acf5: 75 10 jne 10ad07 || !(*set & signo_to_mask( the_info->si_signo )) ) { 10acf7: 8b 1f mov (%edi),%ebx 10acf9: 8d 4b ff lea -0x1(%ebx),%ecx 10acfc: b8 01 00 00 00 mov $0x1,%eax 10ad01: d3 e0 shl %cl,%eax 10ad03: 85 06 test %eax,(%esi) 10ad05: 75 13 jne 10ad1a errno = _Thread_Executing->Wait.return_code; 10ad07: e8 fc 77 00 00 call 112508 <__errno> 10ad0c: 8b 15 c8 78 12 00 mov 0x1278c8,%edx 10ad12: 8b 52 34 mov 0x34(%edx),%edx 10ad15: 89 10 mov %edx,(%eax) return -1; 10ad17: 83 cb ff or $0xffffffff,%ebx } return the_info->si_signo; } 10ad1a: 89 d8 mov %ebx,%eax 10ad1c: 8d 65 f4 lea -0xc(%ebp),%esp 10ad1f: 5b pop %ebx 10ad20: 5e pop %esi 10ad21: 5f pop %edi 10ad22: c9 leave 10ad23: c3 ret =============================================================================== 0010ca18 : int sigwait( const sigset_t *set, int *sig ) { 10ca18: 55 push %ebp 10ca19: 89 e5 mov %esp,%ebp 10ca1b: 53 push %ebx 10ca1c: 83 ec 08 sub $0x8,%esp 10ca1f: 8b 5d 0c mov 0xc(%ebp),%ebx int status; status = sigtimedwait( set, NULL, NULL ); 10ca22: 6a 00 push $0x0 10ca24: 6a 00 push $0x0 10ca26: ff 75 08 pushl 0x8(%ebp) 10ca29: e8 45 fe ff ff call 10c873 10ca2e: 89 c2 mov %eax,%edx if ( status != -1 ) { 10ca30: 83 c4 10 add $0x10,%esp 10ca33: 83 f8 ff cmp $0xffffffff,%eax 10ca36: 74 0a je 10ca42 if ( sig ) *sig = status; return 0; 10ca38: 31 c0 xor %eax,%eax int status; status = sigtimedwait( set, NULL, NULL ); if ( status != -1 ) { if ( sig ) 10ca3a: 85 db test %ebx,%ebx 10ca3c: 74 0b je 10ca49 <== NEVER TAKEN *sig = status; 10ca3e: 89 13 mov %edx,(%ebx) 10ca40: eb 07 jmp 10ca49 return 0; } return errno; 10ca42: e8 e9 72 00 00 call 113d30 <__errno> 10ca47: 8b 00 mov (%eax),%eax } 10ca49: 8b 5d fc mov -0x4(%ebp),%ebx 10ca4c: c9 leave 10ca4d: c3 ret =============================================================================== 00108f2c : /* * Process input character, with semaphore. */ static int siproc (unsigned char c, struct rtems_termios_tty *tty) { 108f2c: 55 push %ebp 108f2d: 89 e5 mov %esp,%ebp 108f2f: 56 push %esi 108f30: 53 push %ebx 108f31: 89 d3 mov %edx,%ebx 108f33: 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)) { 108f35: f7 42 3c 78 0e 00 00 testl $0xe78,0x3c(%edx) 108f3c: 74 30 je 108f6e <== NEVER TAKEN rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 108f3e: 52 push %edx 108f3f: 6a 00 push $0x0 108f41: 6a 00 push $0x0 108f43: ff 73 18 pushl 0x18(%ebx) 108f46: e8 1d 12 00 00 call 10a168 i = iproc (c, tty); 108f4b: 89 f2 mov %esi,%edx 108f4d: 0f b6 c2 movzbl %dl,%eax 108f50: 89 da mov %ebx,%edx 108f52: e8 b5 fe ff ff call 108e0c 108f57: 89 c6 mov %eax,%esi rtems_semaphore_release (tty->osem); 108f59: 58 pop %eax 108f5a: ff 73 18 pushl 0x18(%ebx) 108f5d: e8 f2 12 00 00 call 10a254 108f62: 83 c4 10 add $0x10,%esp } else { i = iproc (c, tty); } return i; } 108f65: 89 f0 mov %esi,%eax 108f67: 8d 65 f8 lea -0x8(%ebp),%esp 108f6a: 5b pop %ebx 108f6b: 5e pop %esi 108f6c: c9 leave 108f6d: 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); 108f6e: 0f b6 c0 movzbl %al,%eax <== NOT EXECUTED 108f71: 89 da mov %ebx,%edx <== NOT EXECUTED } return i; } 108f73: 8d 65 f8 lea -0x8(%ebp),%esp <== NOT EXECUTED 108f76: 5b pop %ebx <== NOT EXECUTED 108f77: 5e pop %esi <== NOT EXECUTED 108f78: 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); 108f79: e9 8e fe ff ff jmp 108e0c <== NOT EXECUTED =============================================================================== 0010a100 : #include int statvfs (const char *path, struct statvfs *sb) { 10a100: 55 push %ebp 10a101: 89 e5 mov %esp,%ebp 10a103: 57 push %edi 10a104: 56 push %esi 10a105: 53 push %ebx 10a106: 83 ec 38 sub $0x38,%esp 10a109: 8b 55 08 mov 0x8(%ebp),%edx 10a10c: 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 ) ) 10a10f: 31 c0 xor %eax,%eax 10a111: 83 c9 ff or $0xffffffff,%ecx 10a114: 89 d7 mov %edx,%edi 10a116: f2 ae repnz scas %es:(%edi),%al 10a118: f7 d1 not %ecx 10a11a: 49 dec %ecx 10a11b: 6a 01 push $0x1 10a11d: 8d 5d d4 lea -0x2c(%ebp),%ebx 10a120: 53 push %ebx 10a121: 6a 00 push $0x0 10a123: 51 push %ecx 10a124: 52 push %edx 10a125: e8 28 ee ff ff call 108f52 10a12a: 83 c4 20 add $0x20,%esp return -1; 10a12d: 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 ) ) 10a130: 85 c0 test %eax,%eax 10a132: 75 26 jne 10a15a <== NEVER TAKEN return -1; mt_entry = loc.mt_entry; 10a134: 8b 55 e4 mov -0x1c(%ebp),%edx fs_mount_root = &mt_entry->mt_fs_root; memset (sb, 0, sizeof (struct statvfs)); 10a137: b9 0e 00 00 00 mov $0xe,%ecx 10a13c: 89 f7 mov %esi,%edi 10a13e: f3 ab rep stos %eax,%es:(%edi) result = ( fs_mount_root->ops->statvfs_h )( fs_mount_root, sb ); 10a140: 50 push %eax 10a141: 50 push %eax 10a142: 8b 42 28 mov 0x28(%edx),%eax 10a145: 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; 10a146: 83 c2 1c add $0x1c,%edx memset (sb, 0, sizeof (struct statvfs)); result = ( fs_mount_root->ops->statvfs_h )( fs_mount_root, sb ); 10a149: 52 push %edx 10a14a: ff 50 44 call *0x44(%eax) 10a14d: 89 c7 mov %eax,%edi rtems_filesystem_freenode( &loc ); 10a14f: 89 1c 24 mov %ebx,(%esp) 10a152: e8 b9 ee ff ff call 109010 return result; 10a157: 83 c4 10 add $0x10,%esp } 10a15a: 89 f8 mov %edi,%eax 10a15c: 8d 65 f4 lea -0xc(%ebp),%esp 10a15f: 5b pop %ebx 10a160: 5e pop %esi 10a161: 5f pop %edi 10a162: c9 leave 10a163: c3 ret =============================================================================== 00108f68 : fdatasync(fn); } /* iterate over all FILE *'s for this thread */ static void sync_per_thread(Thread_Control *t) { 108f68: 55 push %ebp 108f69: 89 e5 mov %esp,%ebp 108f6b: 53 push %ebx 108f6c: 83 ec 04 sub $0x4,%esp 108f6f: 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; 108f72: 8b 88 e4 00 00 00 mov 0xe4(%eax),%ecx if ( this_reent ) { 108f78: 85 c9 test %ecx,%ecx 108f7a: 74 32 je 108fae <== NEVER TAKEN current_reent = _Thread_Executing->libc_reent; 108f7c: 8b 15 68 68 12 00 mov 0x126868,%edx 108f82: 8b 9a e4 00 00 00 mov 0xe4(%edx),%ebx _Thread_Executing->libc_reent = this_reent; 108f88: 89 8a e4 00 00 00 mov %ecx,0xe4(%edx) _fwalk (t->libc_reent, sync_wrapper); 108f8e: 52 push %edx 108f8f: 52 push %edx 108f90: 68 b3 8f 10 00 push $0x108fb3 108f95: ff b0 e4 00 00 00 pushl 0xe4(%eax) 108f9b: e8 ac 9e 00 00 call 112e4c <_fwalk> _Thread_Executing->libc_reent = current_reent; 108fa0: a1 68 68 12 00 mov 0x126868,%eax 108fa5: 89 98 e4 00 00 00 mov %ebx,0xe4(%eax) 108fab: 83 c4 10 add $0x10,%esp } } 108fae: 8b 5d fc mov -0x4(%ebp),%ebx 108fb1: c9 leave 108fb2: c3 ret =============================================================================== 00109828 : int tcsetattr( int fd, int opt, struct termios *tp ) { 109828: 55 push %ebp 109829: 89 e5 mov %esp,%ebp 10982b: 56 push %esi 10982c: 53 push %ebx 10982d: 8b 5d 08 mov 0x8(%ebp),%ebx 109830: 8b 45 0c mov 0xc(%ebp),%eax 109833: 8b 75 10 mov 0x10(%ebp),%esi switch (opt) { 109836: 85 c0 test %eax,%eax 109838: 74 22 je 10985c 10983a: 48 dec %eax 10983b: 74 0d je 10984a default: rtems_set_errno_and_return_minus_one( ENOTSUP ); 10983d: e8 4e 92 00 00 call 112a90 <__errno> 109842: c7 00 86 00 00 00 movl $0x86,(%eax) 109848: eb 2a jmp 109874 case TCSADRAIN: if (ioctl( fd, RTEMS_IO_TCDRAIN, NULL ) < 0) 10984a: 50 push %eax 10984b: 6a 00 push $0x0 10984d: 6a 03 push $0x3 10984f: 53 push %ebx 109850: e8 6f 64 00 00 call 10fcc4 109855: 83 c4 10 add $0x10,%esp 109858: 85 c0 test %eax,%eax 10985a: 78 18 js 109874 <== NEVER TAKEN return -1; /* * Fall through to.... */ case TCSANOW: return ioctl( fd, RTEMS_IO_SET_ATTRIBUTES, tp ); 10985c: 89 75 10 mov %esi,0x10(%ebp) 10985f: c7 45 0c 02 00 00 00 movl $0x2,0xc(%ebp) 109866: 89 5d 08 mov %ebx,0x8(%ebp) } } 109869: 8d 65 f8 lea -0x8(%ebp),%esp 10986c: 5b pop %ebx 10986d: 5e pop %esi 10986e: c9 leave return -1; /* * Fall through to.... */ case TCSANOW: return ioctl( fd, RTEMS_IO_SET_ATTRIBUTES, tp ); 10986f: e9 50 64 00 00 jmp 10fcc4 } } 109874: 83 c8 ff or $0xffffffff,%eax 109877: 8d 65 f8 lea -0x8(%ebp),%esp 10987a: 5b pop %ebx 10987b: 5e pop %esi 10987c: c9 leave 10987d: c3 ret =============================================================================== 0010a030 : int timer_create( clockid_t clock_id, struct sigevent *evp, timer_t *timerid ) { 10a030: 55 push %ebp 10a031: 89 e5 mov %esp,%ebp 10a033: 56 push %esi 10a034: 53 push %ebx 10a035: 8b 5d 0c mov 0xc(%ebp),%ebx 10a038: 8b 75 10 mov 0x10(%ebp),%esi POSIX_Timer_Control *ptimer; if ( clock_id != CLOCK_REALTIME ) 10a03b: 83 7d 08 01 cmpl $0x1,0x8(%ebp) 10a03f: 75 1d jne 10a05e rtems_set_errno_and_return_minus_one( EINVAL ); if ( !timerid ) 10a041: 85 f6 test %esi,%esi 10a043: 74 19 je 10a05e /* * The data of the structure evp are checked in order to verify if they * are coherent. */ if (evp != NULL) { 10a045: 85 db test %ebx,%ebx 10a047: 74 22 je 10a06b /* The structure has data */ if ( ( evp->sigev_notify != SIGEV_NONE ) && 10a049: 8b 03 mov (%ebx),%eax 10a04b: 48 dec %eax 10a04c: 83 f8 01 cmp $0x1,%eax 10a04f: 77 0d ja 10a05e <== 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 ) 10a051: 8b 43 04 mov 0x4(%ebx),%eax 10a054: 85 c0 test %eax,%eax 10a056: 74 06 je 10a05e <== NEVER TAKEN static inline bool is_valid_signo( int signo ) { return ((signo) >= 1 && (signo) <= 32 ); 10a058: 48 dec %eax rtems_set_errno_and_return_minus_one( EINVAL ); if ( !is_valid_signo(evp->sigev_signo) ) 10a059: 83 f8 1f cmp $0x1f,%eax 10a05c: 76 0d jbe 10a06b <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); 10a05e: e8 89 7c 00 00 call 111cec <__errno> 10a063: c7 00 16 00 00 00 movl $0x16,(%eax) 10a069: eb 2f jmp 10a09a rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 10a06b: a1 b4 73 12 00 mov 0x1273b4,%eax 10a070: 40 inc %eax 10a071: 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 ); 10a076: 83 ec 0c sub $0xc,%esp 10a079: 68 98 76 12 00 push $0x127698 10a07e: e8 75 1b 00 00 call 10bbf8 <_Objects_Allocate> /* * Allocate a timer */ ptimer = _POSIX_Timer_Allocate(); if ( !ptimer ) { 10a083: 83 c4 10 add $0x10,%esp 10a086: 85 c0 test %eax,%eax 10a088: 75 18 jne 10a0a2 _Thread_Enable_dispatch(); 10a08a: e8 3b 2a 00 00 call 10caca <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one( EAGAIN ); 10a08f: e8 58 7c 00 00 call 111cec <__errno> 10a094: c7 00 0b 00 00 00 movl $0xb,(%eax) 10a09a: 83 c8 ff or $0xffffffff,%eax 10a09d: e9 83 00 00 00 jmp 10a125 } /* The data of the created timer are stored to use them later */ ptimer->state = POSIX_TIMER_STATE_CREATE_NEW; 10a0a2: c6 40 3c 02 movb $0x2,0x3c(%eax) ptimer->thread_id = _Thread_Executing->Object.id; 10a0a6: 8b 15 dc 78 12 00 mov 0x1278dc,%edx 10a0ac: 8b 52 08 mov 0x8(%edx),%edx 10a0af: 89 50 38 mov %edx,0x38(%eax) if ( evp != NULL ) { 10a0b2: 85 db test %ebx,%ebx 10a0b4: 74 11 je 10a0c7 ptimer->inf.sigev_notify = evp->sigev_notify; 10a0b6: 8b 13 mov (%ebx),%edx 10a0b8: 89 50 40 mov %edx,0x40(%eax) ptimer->inf.sigev_signo = evp->sigev_signo; 10a0bb: 8b 53 04 mov 0x4(%ebx),%edx 10a0be: 89 50 44 mov %edx,0x44(%eax) ptimer->inf.sigev_value = evp->sigev_value; 10a0c1: 8b 53 08 mov 0x8(%ebx),%edx 10a0c4: 89 50 48 mov %edx,0x48(%eax) } ptimer->overrun = 0; 10a0c7: c7 40 68 00 00 00 00 movl $0x0,0x68(%eax) ptimer->timer_data.it_value.tv_sec = 0; 10a0ce: c7 40 5c 00 00 00 00 movl $0x0,0x5c(%eax) ptimer->timer_data.it_value.tv_nsec = 0; 10a0d5: c7 40 60 00 00 00 00 movl $0x0,0x60(%eax) ptimer->timer_data.it_interval.tv_sec = 0; 10a0dc: c7 40 54 00 00 00 00 movl $0x0,0x54(%eax) ptimer->timer_data.it_interval.tv_nsec = 0; 10a0e3: 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; 10a0ea: c7 40 18 00 00 00 00 movl $0x0,0x18(%eax) the_watchdog->routine = routine; 10a0f1: c7 40 2c 00 00 00 00 movl $0x0,0x2c(%eax) the_watchdog->id = id; 10a0f8: c7 40 30 00 00 00 00 movl $0x0,0x30(%eax) the_watchdog->user_data = user_data; 10a0ff: 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 ), 10a106: 8b 50 08 mov 0x8(%eax),%edx Objects_Information *information, Objects_Control *the_object, uint32_t name ) { _Objects_Set_local_object( 10a109: 0f b7 da movzwl %dx,%ebx #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 10a10c: 8b 0d b4 76 12 00 mov 0x1276b4,%ecx 10a112: 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; 10a115: 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; 10a11c: 89 16 mov %edx,(%esi) _Thread_Enable_dispatch(); 10a11e: e8 a7 29 00 00 call 10caca <_Thread_Enable_dispatch> return 0; 10a123: 31 c0 xor %eax,%eax } 10a125: 8d 65 f8 lea -0x8(%ebp),%esp 10a128: 5b pop %ebx 10a129: 5e pop %esi 10a12a: c9 leave 10a12b: c3 ret =============================================================================== 0010a12c : timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue ) { 10a12c: 55 push %ebp 10a12d: 89 e5 mov %esp,%ebp 10a12f: 57 push %edi 10a130: 56 push %esi 10a131: 53 push %ebx 10a132: 83 ec 2c sub $0x2c,%esp 10a135: 8b 5d 0c mov 0xc(%ebp),%ebx Objects_Locations location; bool activated; uint32_t initial_period; struct itimerspec normalize; if ( !value ) 10a138: 83 7d 10 00 cmpl $0x0,0x10(%ebp) 10a13c: 0f 84 58 01 00 00 je 10a29a <== 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) ) ) { 10a142: 83 ec 0c sub $0xc,%esp 10a145: 8b 45 10 mov 0x10(%ebp),%eax 10a148: 83 c0 08 add $0x8,%eax 10a14b: 50 push %eax 10a14c: e8 43 33 00 00 call 10d494 <_Timespec_Is_valid> 10a151: 83 c4 10 add $0x10,%esp 10a154: 84 c0 test %al,%al 10a156: 0f 84 3e 01 00 00 je 10a29a rtems_set_errno_and_return_minus_one( EINVAL ); } if ( !_Timespec_Is_valid( &(value->it_interval) ) ) { 10a15c: 83 ec 0c sub $0xc,%esp 10a15f: ff 75 10 pushl 0x10(%ebp) 10a162: e8 2d 33 00 00 call 10d494 <_Timespec_Is_valid> 10a167: 83 c4 10 add $0x10,%esp 10a16a: 84 c0 test %al,%al 10a16c: 0f 84 28 01 00 00 je 10a29a <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); } if ( flags != TIMER_ABSTIME && flags != POSIX_TIMER_RELATIVE ) { 10a172: 85 db test %ebx,%ebx 10a174: 74 09 je 10a17f 10a176: 83 fb 04 cmp $0x4,%ebx 10a179: 0f 85 1b 01 00 00 jne 10a29a rtems_set_errno_and_return_minus_one( EINVAL ); } normalize = *value; 10a17f: 8d 7d cc lea -0x34(%ebp),%edi 10a182: b9 04 00 00 00 mov $0x4,%ecx 10a187: 8b 75 10 mov 0x10(%ebp),%esi 10a18a: f3 a5 rep movsl %ds:(%esi),%es:(%edi) /* Convert absolute to relative time */ if (flags == TIMER_ABSTIME) { 10a18c: 83 fb 04 cmp $0x4,%ebx 10a18f: 75 2f jne 10a1c0 struct timespec now; _TOD_Get( &now ); 10a191: 83 ec 0c sub $0xc,%esp 10a194: 8d 5d dc lea -0x24(%ebp),%ebx 10a197: 53 push %ebx 10a198: e8 b3 15 00 00 call 10b750 <_TOD_Get> /* Check for seconds in the past */ if ( _Timespec_Greater_than( &now, &normalize.it_value ) ) 10a19d: 59 pop %ecx 10a19e: 5e pop %esi 10a19f: 8d 75 d4 lea -0x2c(%ebp),%esi 10a1a2: 56 push %esi 10a1a3: 53 push %ebx 10a1a4: e8 c7 32 00 00 call 10d470 <_Timespec_Greater_than> 10a1a9: 83 c4 10 add $0x10,%esp 10a1ac: 84 c0 test %al,%al 10a1ae: 0f 85 e6 00 00 00 jne 10a29a rtems_set_errno_and_return_minus_one( EINVAL ); _Timespec_Subtract( &now, &normalize.it_value, &normalize.it_value ); 10a1b4: 52 push %edx 10a1b5: 56 push %esi 10a1b6: 56 push %esi 10a1b7: 53 push %ebx 10a1b8: e8 fb 32 00 00 call 10d4b8 <_Timespec_Subtract> 10a1bd: 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 ); 10a1c0: 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 ); 10a1c1: 8d 45 e4 lea -0x1c(%ebp),%eax 10a1c4: 50 push %eax 10a1c5: ff 75 08 pushl 0x8(%ebp) 10a1c8: 68 98 76 12 00 push $0x127698 10a1cd: e8 52 1e 00 00 call 10c024 <_Objects_Get> 10a1d2: 89 c3 mov %eax,%ebx switch ( location ) { 10a1d4: 83 c4 10 add $0x10,%esp 10a1d7: 83 7d e4 00 cmpl $0x0,-0x1c(%ebp) 10a1db: 0f 85 b9 00 00 00 jne 10a29a 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 ) { 10a1e1: 83 7d d4 00 cmpl $0x0,-0x2c(%ebp) 10a1e5: 75 3b jne 10a222 10a1e7: 83 7d d8 00 cmpl $0x0,-0x28(%ebp) 10a1eb: 75 35 jne 10a222 /* Stop the timer */ (void) _Watchdog_Remove( &ptimer->Timer ); 10a1ed: 83 ec 0c sub $0xc,%esp 10a1f0: 8d 40 10 lea 0x10(%eax),%eax 10a1f3: 50 push %eax 10a1f4: e8 8b 36 00 00 call 10d884 <_Watchdog_Remove> /* The old data of the timer are returned */ if ( ovalue ) 10a1f9: 83 c4 10 add $0x10,%esp 10a1fc: 83 7d 14 00 cmpl $0x0,0x14(%ebp) 10a200: 74 0d je 10a20f *ovalue = ptimer->timer_data; 10a202: 8d 73 54 lea 0x54(%ebx),%esi 10a205: b9 04 00 00 00 mov $0x4,%ecx 10a20a: 8b 7d 14 mov 0x14(%ebp),%edi 10a20d: f3 a5 rep movsl %ds:(%esi),%es:(%edi) /* The new data are set */ ptimer->timer_data = normalize; 10a20f: 8d 7b 54 lea 0x54(%ebx),%edi 10a212: 8d 75 cc lea -0x34(%ebp),%esi 10a215: b9 04 00 00 00 mov $0x4,%ecx 10a21a: f3 a5 rep movsl %ds:(%esi),%es:(%edi) /* Indicates that the timer is created and stopped */ ptimer->state = POSIX_TIMER_STATE_CREATE_STOP; 10a21c: c6 43 3c 04 movb $0x4,0x3c(%ebx) 10a220: eb 35 jmp 10a257 _Thread_Enable_dispatch(); return 0; } /* Convert from seconds and nanoseconds to ticks */ ptimer->ticks = _Timespec_To_ticks( &value->it_interval ); 10a222: 83 ec 0c sub $0xc,%esp 10a225: ff 75 10 pushl 0x10(%ebp) 10a228: e8 bf 32 00 00 call 10d4ec <_Timespec_To_ticks> 10a22d: 89 43 64 mov %eax,0x64(%ebx) initial_period = _Timespec_To_ticks( &normalize.it_value ); 10a230: 8d 45 d4 lea -0x2c(%ebp),%eax 10a233: 89 04 24 mov %eax,(%esp) 10a236: e8 b1 32 00 00 call 10d4ec <_Timespec_To_ticks> activated = _POSIX_Timer_Insert_helper( 10a23b: 89 1c 24 mov %ebx,(%esp) 10a23e: 68 b0 a2 10 00 push $0x10a2b0 10a243: ff 73 08 pushl 0x8(%ebx) 10a246: 50 push %eax 10a247: 8d 43 10 lea 0x10(%ebx),%eax 10a24a: 50 push %eax 10a24b: e8 70 57 00 00 call 10f9c0 <_POSIX_Timer_Insert_helper> initial_period, ptimer->Object.id, _POSIX_Timer_TSR, ptimer ); if ( !activated ) { 10a250: 83 c4 20 add $0x20,%esp 10a253: 84 c0 test %al,%al 10a255: 75 07 jne 10a25e _Thread_Enable_dispatch(); 10a257: e8 6e 28 00 00 call 10caca <_Thread_Enable_dispatch> 10a25c: eb 38 jmp 10a296 /* * The timer has been started and is running. So we return the * old ones in "ovalue" */ if ( ovalue ) 10a25e: 83 7d 14 00 cmpl $0x0,0x14(%ebp) 10a262: 74 0d je 10a271 *ovalue = ptimer->timer_data; 10a264: 8d 73 54 lea 0x54(%ebx),%esi 10a267: b9 04 00 00 00 mov $0x4,%ecx 10a26c: 8b 7d 14 mov 0x14(%ebp),%edi 10a26f: f3 a5 rep movsl %ds:(%esi),%es:(%edi) ptimer->timer_data = normalize; 10a271: 8d 7b 54 lea 0x54(%ebx),%edi 10a274: 8d 75 cc lea -0x34(%ebp),%esi 10a277: b9 04 00 00 00 mov $0x4,%ecx 10a27c: f3 a5 rep movsl %ds:(%esi),%es:(%edi) /* Indicate that the time is running */ ptimer->state = POSIX_TIMER_STATE_CREATE_RUN; 10a27e: c6 43 3c 03 movb $0x3,0x3c(%ebx) _TOD_Get( &ptimer->time ); 10a282: 83 ec 0c sub $0xc,%esp 10a285: 83 c3 6c add $0x6c,%ebx 10a288: 53 push %ebx 10a289: e8 c2 14 00 00 call 10b750 <_TOD_Get> _Thread_Enable_dispatch(); 10a28e: e8 37 28 00 00 call 10caca <_Thread_Enable_dispatch> return 0; 10a293: 83 c4 10 add $0x10,%esp 10a296: 31 c0 xor %eax,%eax 10a298: eb 0e jmp 10a2a8 #endif case OBJECTS_ERROR: break; } rtems_set_errno_and_return_minus_one( EINVAL ); 10a29a: e8 4d 7a 00 00 call 111cec <__errno> 10a29f: c7 00 16 00 00 00 movl $0x16,(%eax) 10a2a5: 83 c8 ff or $0xffffffff,%eax } 10a2a8: 8d 65 f4 lea -0xc(%ebp),%esp 10a2ab: 5b pop %ebx 10a2ac: 5e pop %esi 10a2ad: 5f pop %edi 10a2ae: c9 leave 10a2af: c3 ret =============================================================================== 00109f6c : useconds_t ualarm( useconds_t useconds, useconds_t interval ) { 109f6c: 55 push %ebp 109f6d: 89 e5 mov %esp,%ebp 109f6f: 57 push %edi 109f70: 56 push %esi 109f71: 53 push %ebx 109f72: 83 ec 1c sub $0x1c,%esp 109f75: 8b 75 08 mov 0x8(%ebp),%esi /* * Initialize the timer used to implement alarm(). */ if ( !the_timer->routine ) { 109f78: 83 3d a0 6c 12 00 00 cmpl $0x0,0x126ca0 109f7f: 75 2c jne 109fad Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 109f81: c7 05 8c 6c 12 00 00 movl $0x0,0x126c8c 109f88: 00 00 00 the_watchdog->routine = routine; 109f8b: c7 05 a0 6c 12 00 34 movl $0x109f34,0x126ca0 109f92: 9f 10 00 the_watchdog->id = id; 109f95: c7 05 a4 6c 12 00 00 movl $0x0,0x126ca4 109f9c: 00 00 00 the_watchdog->user_data = user_data; 109f9f: c7 05 a8 6c 12 00 00 movl $0x0,0x126ca8 109fa6: 00 00 00 useconds_t ualarm( useconds_t useconds, useconds_t interval ) { useconds_t remaining = 0; 109fa9: 31 db xor %ebx,%ebx 109fab: eb 4f jmp 109ffc if ( !the_timer->routine ) { _Watchdog_Initialize( the_timer, _POSIX_signals_Ualarm_TSR, 0, NULL ); } else { Watchdog_States state; state = _Watchdog_Remove( the_timer ); 109fad: 83 ec 0c sub $0xc,%esp 109fb0: 68 84 6c 12 00 push $0x126c84 109fb5: e8 b2 34 00 00 call 10d46c <_Watchdog_Remove> if ( (state == WATCHDOG_ACTIVE) || (state == WATCHDOG_REMOVE_IT) ) { 109fba: 83 e8 02 sub $0x2,%eax 109fbd: 83 c4 10 add $0x10,%esp useconds_t ualarm( useconds_t useconds, useconds_t interval ) { useconds_t remaining = 0; 109fc0: 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) ) { 109fc2: 83 f8 01 cmp $0x1,%eax 109fc5: 77 35 ja 109ffc <== 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); 109fc7: a1 98 6c 12 00 mov 0x126c98,%eax 109fcc: 03 05 90 6c 12 00 add 0x126c90,%eax /* remaining is now in ticks */ _Timespec_From_ticks( ticks, &tp ); 109fd2: 57 push %edi 109fd3: 57 push %edi 109fd4: 8d 55 e0 lea -0x20(%ebp),%edx 109fd7: 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); 109fd8: 2b 05 9c 6c 12 00 sub 0x126c9c,%eax /* remaining is now in ticks */ _Timespec_From_ticks( ticks, &tp ); 109fde: 50 push %eax 109fdf: e8 28 30 00 00 call 10d00c <_Timespec_From_ticks> remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND; 109fe4: 69 4d e0 40 42 0f 00 imul $0xf4240,-0x20(%ebp),%ecx remaining += tp.tv_nsec / 1000; 109feb: 8b 45 e4 mov -0x1c(%ebp),%eax 109fee: bf e8 03 00 00 mov $0x3e8,%edi 109ff3: 99 cltd 109ff4: f7 ff idiv %edi 109ff6: 8d 1c 08 lea (%eax,%ecx,1),%ebx 109ff9: 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 ) { 109ffc: 85 f6 test %esi,%esi 109ffe: 74 44 je 10a044 Watchdog_Interval ticks; tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND; 10a000: b9 40 42 0f 00 mov $0xf4240,%ecx 10a005: 89 f0 mov %esi,%eax 10a007: 31 d2 xor %edx,%edx 10a009: f7 f1 div %ecx 10a00b: 89 45 e0 mov %eax,-0x20(%ebp) tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000; 10a00e: 69 d2 e8 03 00 00 imul $0x3e8,%edx,%edx 10a014: 89 55 e4 mov %edx,-0x1c(%ebp) ticks = _Timespec_To_ticks( &tp ); 10a017: 83 ec 0c sub $0xc,%esp 10a01a: 8d 75 e0 lea -0x20(%ebp),%esi 10a01d: 56 push %esi 10a01e: e8 45 30 00 00 call 10d068 <_Timespec_To_ticks> if ( ticks == 0 ) ticks = 1; _Watchdog_Insert_ticks( the_timer, _Timespec_To_ticks( &tp ) ); 10a023: 89 34 24 mov %esi,(%esp) 10a026: e8 3d 30 00 00 call 10d068 <_Timespec_To_ticks> Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 10a02b: a3 90 6c 12 00 mov %eax,0x126c90 _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 10a030: 59 pop %ecx 10a031: 5e pop %esi 10a032: 68 84 6c 12 00 push $0x126c84 10a037: 68 74 64 12 00 push $0x126474 10a03c: e8 0b 33 00 00 call 10d34c <_Watchdog_Insert> 10a041: 83 c4 10 add $0x10,%esp } return remaining; } 10a044: 89 d8 mov %ebx,%eax 10a046: 8d 65 f4 lea -0xc(%ebp),%esp 10a049: 5b pop %ebx 10a04a: 5e pop %esi 10a04b: 5f pop %edi 10a04c: c9 leave 10a04d: c3 ret =============================================================================== 0010a6c8 : #include int unlink( const char *path ) { 10a6c8: 55 push %ebp 10a6c9: 89 e5 mov %esp,%ebp 10a6cb: 57 push %edi 10a6cc: 56 push %esi 10a6cd: 53 push %ebx 10a6ce: 83 ec 58 sub $0x58,%esp /* * Get the node to be unlinked. Find the parent path first. */ parentpathlen = rtems_filesystem_dirname ( path ); 10a6d1: ff 75 08 pushl 0x8(%ebp) 10a6d4: e8 1a d9 ff ff call 107ff3 10a6d9: 89 45 b4 mov %eax,-0x4c(%ebp) if ( parentpathlen == 0 ) 10a6dc: 83 c4 10 add $0x10,%esp 10a6df: 85 c0 test %eax,%eax 10a6e1: 8d 45 d0 lea -0x30(%ebp),%eax 10a6e4: 75 15 jne 10a6fb rtems_filesystem_get_start_loc( path, &i, &parentloc ); 10a6e6: 51 push %ecx 10a6e7: 50 push %eax 10a6e8: 8d 45 e4 lea -0x1c(%ebp),%eax 10a6eb: 50 push %eax 10a6ec: ff 75 08 pushl 0x8(%ebp) 10a6ef: e8 d4 e6 ff ff call 108dc8 10a6f4: 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; 10a6f7: 31 db xor %ebx,%ebx 10a6f9: eb 25 jmp 10a720 parentpathlen = rtems_filesystem_dirname ( path ); if ( parentpathlen == 0 ) rtems_filesystem_get_start_loc( path, &i, &parentloc ); else { result = rtems_filesystem_evaluate_path( path, parentpathlen, 10a6fb: 83 ec 0c sub $0xc,%esp 10a6fe: 6a 00 push $0x0 10a700: 50 push %eax 10a701: 6a 02 push $0x2 10a703: ff 75 b4 pushl -0x4c(%ebp) 10a706: ff 75 08 pushl 0x8(%ebp) 10a709: e8 a4 d8 ff ff call 107fb2 10a70e: 89 c2 mov %eax,%edx RTEMS_LIBIO_PERMS_WRITE, &parentloc, false ); if ( result != 0 ) 10a710: 83 c4 20 add $0x20,%esp return -1; 10a713: 83 c8 ff or $0xffffffff,%eax else { result = rtems_filesystem_evaluate_path( path, parentpathlen, RTEMS_LIBIO_PERMS_WRITE, &parentloc, false ); if ( result != 0 ) 10a716: 85 d2 test %edx,%edx 10a718: 0f 85 d6 00 00 00 jne 10a7f4 <== NEVER TAKEN return -1; free_parentloc = true; 10a71e: b3 01 mov $0x1,%bl /* * Start from the parent to find the node that should be under it. */ loc = parentloc; 10a720: 8d 7d bc lea -0x44(%ebp),%edi 10a723: 8d 75 d0 lea -0x30(%ebp),%esi 10a726: b9 05 00 00 00 mov $0x5,%ecx 10a72b: f3 a5 rep movsl %ds:(%esi),%es:(%edi) name = path + parentpathlen; 10a72d: 8b 75 08 mov 0x8(%ebp),%esi 10a730: 03 75 b4 add -0x4c(%ebp),%esi name += rtems_filesystem_prefix_separators( name, strlen( name ) ); 10a733: 83 c9 ff or $0xffffffff,%ecx 10a736: 89 f7 mov %esi,%edi 10a738: 31 c0 xor %eax,%eax 10a73a: f2 ae repnz scas %es:(%edi),%al 10a73c: f7 d1 not %ecx 10a73e: 49 dec %ecx 10a73f: 52 push %edx 10a740: 52 push %edx 10a741: 51 push %ecx 10a742: 56 push %esi 10a743: e8 ea d8 ff ff call 108032 10a748: 01 c6 add %eax,%esi result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), 10a74a: 83 c9 ff or $0xffffffff,%ecx 10a74d: 89 f7 mov %esi,%edi 10a74f: 31 c0 xor %eax,%eax 10a751: f2 ae repnz scas %es:(%edi),%al 10a753: f7 d1 not %ecx 10a755: 49 dec %ecx 10a756: c7 04 24 00 00 00 00 movl $0x0,(%esp) 10a75d: 8d 7d bc lea -0x44(%ebp),%edi 10a760: 57 push %edi 10a761: 6a 00 push $0x0 10a763: 51 push %ecx 10a764: 56 push %esi 10a765: e8 ea d7 ff ff call 107f54 0, &loc, false ); if ( result != 0 ) { 10a76a: 83 c4 20 add $0x20,%esp 10a76d: 85 c0 test %eax,%eax 10a76f: 74 13 je 10a784 if ( free_parentloc ) rtems_filesystem_freenode( &parentloc ); return -1; 10a771: 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 ) 10a774: 84 db test %bl,%bl 10a776: 74 7c je 10a7f4 <== NEVER TAKEN rtems_filesystem_freenode( &parentloc ); 10a778: 83 ec 0c sub $0xc,%esp 10a77b: 8d 55 d0 lea -0x30(%ebp),%edx 10a77e: 52 push %edx 10a77f: 89 45 b0 mov %eax,-0x50(%ebp) 10a782: eb 65 jmp 10a7e9 return -1; } if ( (*loc.ops->node_type_h)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) { 10a784: 83 ec 0c sub $0xc,%esp 10a787: 57 push %edi 10a788: 8b 45 c8 mov -0x38(%ebp),%eax 10a78b: ff 50 10 call *0x10(%eax) 10a78e: 83 c4 10 add $0x10,%esp 10a791: 48 dec %eax 10a792: 75 2f jne 10a7c3 rtems_filesystem_freenode( &loc ); 10a794: 83 ec 0c sub $0xc,%esp 10a797: 57 push %edi 10a798: e8 d3 d8 ff ff call 108070 if ( free_parentloc ) 10a79d: 83 c4 10 add $0x10,%esp 10a7a0: 84 db test %bl,%bl 10a7a2: 74 0f je 10a7b3 rtems_filesystem_freenode( &parentloc ); 10a7a4: 83 ec 0c sub $0xc,%esp 10a7a7: 8d 45 d0 lea -0x30(%ebp),%eax 10a7aa: 50 push %eax 10a7ab: e8 c0 d8 ff ff call 108070 10a7b0: 83 c4 10 add $0x10,%esp rtems_set_errno_and_return_minus_one( EISDIR ); 10a7b3: e8 04 a0 00 00 call 1147bc <__errno> 10a7b8: c7 00 15 00 00 00 movl $0x15,(%eax) 10a7be: 83 c8 ff or $0xffffffff,%eax 10a7c1: eb 31 jmp 10a7f4 } result = (*loc.ops->unlink_h)( &parentloc, &loc ); 10a7c3: 50 push %eax 10a7c4: 50 push %eax 10a7c5: 57 push %edi 10a7c6: 8d 75 d0 lea -0x30(%ebp),%esi 10a7c9: 56 push %esi 10a7ca: 8b 45 c8 mov -0x38(%ebp),%eax 10a7cd: ff 50 0c call *0xc(%eax) rtems_filesystem_freenode( &loc ); 10a7d0: 89 3c 24 mov %edi,(%esp) 10a7d3: 89 45 b0 mov %eax,-0x50(%ebp) 10a7d6: e8 95 d8 ff ff call 108070 if ( free_parentloc ) 10a7db: 83 c4 10 add $0x10,%esp 10a7de: 84 db test %bl,%bl 10a7e0: 8b 45 b0 mov -0x50(%ebp),%eax 10a7e3: 74 0f je 10a7f4 rtems_filesystem_freenode( &parentloc ); 10a7e5: 83 ec 0c sub $0xc,%esp 10a7e8: 56 push %esi 10a7e9: e8 82 d8 ff ff call 108070 10a7ee: 83 c4 10 add $0x10,%esp 10a7f1: 8b 45 b0 mov -0x50(%ebp),%eax return result; } 10a7f4: 8d 65 f4 lea -0xc(%ebp),%esp 10a7f7: 5b pop %ebx 10a7f8: 5e pop %esi 10a7f9: 5f pop %edi 10a7fa: c9 leave 10a7fb: c3 ret =============================================================================== 0010a935 : */ int unmount( const char *path ) { 10a935: 55 push %ebp 10a936: 89 e5 mov %esp,%ebp 10a938: 57 push %edi 10a939: 56 push %esi 10a93a: 53 push %ebx 10a93b: 83 ec 38 sub $0x38,%esp 10a93e: 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 ) ) 10a941: 83 cb ff or $0xffffffff,%ebx 10a944: 31 c0 xor %eax,%eax 10a946: 89 d9 mov %ebx,%ecx 10a948: 89 d7 mov %edx,%edi 10a94a: f2 ae repnz scas %es:(%edi),%al 10a94c: f7 d1 not %ecx 10a94e: 49 dec %ecx 10a94f: 6a 01 push $0x1 10a951: 8d 7d d4 lea -0x2c(%ebp),%edi 10a954: 57 push %edi 10a955: 6a 00 push $0x0 10a957: 51 push %ecx 10a958: 52 push %edx 10a959: e8 e8 d5 ff ff call 107f46 10a95e: 83 c4 20 add $0x20,%esp 10a961: 85 c0 test %eax,%eax 10a963: 0f 85 f2 00 00 00 jne 10aa5b return -1; mt_entry = loc.mt_entry; 10a969: 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 ){ 10a96c: 8b 45 d4 mov -0x2c(%ebp),%eax 10a96f: 39 46 1c cmp %eax,0x1c(%esi) 10a972: 74 1c je 10a990 rtems_filesystem_freenode( &loc ); 10a974: 83 ec 0c sub $0xc,%esp 10a977: 57 push %edi 10a978: e8 87 d6 ff ff call 108004 rtems_set_errno_and_return_minus_one( EACCES ); 10a97d: e8 c2 76 00 00 call 112044 <__errno> 10a982: c7 00 0d 00 00 00 movl $0xd,(%eax) 10a988: 83 c4 10 add $0x10,%esp 10a98b: e9 cb 00 00 00 jmp 10aa5b /* * Free the loc node and just use the nodes from the mt_entry . */ rtems_filesystem_freenode( &loc ); 10a990: 83 ec 0c sub $0xc,%esp 10a993: 57 push %edi 10a994: e8 6b d6 ff ff call 108004 * 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 ) 10a999: 83 c4 10 add $0x10,%esp 10a99c: a1 0c 51 12 00 mov 0x12510c,%eax 10a9a1: 39 70 14 cmp %esi,0x14(%eax) 10a9a4: 74 25 je 10a9cb /* * Verify there are no file systems below the path specified */ if ( rtems_filesystem_mount_iterate( is_fs_below_mount_point, 10a9a6: 51 push %ecx 10a9a7: 51 push %ecx 10a9a8: ff 76 2c pushl 0x2c(%esi) 10a9ab: 68 24 a9 10 00 push $0x10a924 10a9b0: e8 44 dd ff ff call 1086f9 10a9b5: 83 c4 10 add $0x10,%esp 10a9b8: 84 c0 test %al,%al 10a9ba: 75 0f jne 10a9cb * 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 ) 10a9bc: 83 ec 0c sub $0xc,%esp 10a9bf: 56 push %esi 10a9c0: e8 27 d9 ff ff call 1082ec 10a9c5: 83 c4 10 add $0x10,%esp 10a9c8: 48 dec %eax 10a9c9: 75 10 jne 10a9db rtems_set_errno_and_return_minus_one( EBUSY ); 10a9cb: e8 74 76 00 00 call 112044 <__errno> 10a9d0: c7 00 10 00 00 00 movl $0x10,(%eax) 10a9d6: e9 80 00 00 00 jmp 10aa5b * 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 ) 10a9db: 83 ec 0c sub $0xc,%esp 10a9de: 8b 46 14 mov 0x14(%esi),%eax 10a9e1: 56 push %esi 10a9e2: ff 50 28 call *0x28(%eax) 10a9e5: 83 c4 10 add $0x10,%esp return -1; 10a9e8: 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 ) 10a9eb: 85 c0 test %eax,%eax 10a9ed: 75 6f jne 10aa5e <== 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){ 10a9ef: 83 ec 0c sub $0xc,%esp 10a9f2: 8b 46 28 mov 0x28(%esi),%eax 10a9f5: 56 push %esi 10a9f6: ff 50 2c call *0x2c(%eax) 10a9f9: 83 c4 10 add $0x10,%esp 10a9fc: 85 c0 test %eax,%eax 10a9fe: 74 1d je 10aa1d <== ALWAYS TAKEN if (( fs_mount_loc->ops->mount_h )( mt_entry ) != 0 ) 10aa00: 83 ec 0c sub $0xc,%esp 10aa03: 8b 46 14 mov 0x14(%esi),%eax <== NOT EXECUTED 10aa06: 56 push %esi <== NOT EXECUTED 10aa07: ff 50 20 call *0x20(%eax) <== NOT EXECUTED 10aa0a: 83 c4 10 add $0x10,%esp <== NOT EXECUTED rtems_fatal_error_occurred( 0 ); return -1; 10aa0d: 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 ) 10aa0f: 85 c0 test %eax,%eax <== NOT EXECUTED 10aa11: 74 4b je 10aa5e <== NOT EXECUTED rtems_fatal_error_occurred( 0 ); 10aa13: 83 ec 0c sub $0xc,%esp <== NOT EXECUTED 10aa16: 6a 00 push $0x0 <== NOT EXECUTED 10aa18: e8 93 0e 00 00 call 10b8b0 <== 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 ); 10aa1d: 52 push %edx 10aa1e: 6a 00 push $0x0 10aa20: 6a 00 push $0x0 10aa22: ff 35 48 73 12 00 pushl 0x127348 10aa28: e8 fb 08 00 00 call 10b328 */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); 10aa2d: 89 34 24 mov %esi,(%esp) 10aa30: e8 4b 11 00 00 call 10bb80 <_Chain_Extract> } static inline void rtems_libio_unlock( void ) { rtems_semaphore_release( rtems_libio_semaphore ); 10aa35: 58 pop %eax 10aa36: ff 35 48 73 12 00 pushl 0x127348 10aa3c: e8 d3 09 00 00 call 10b414 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; 10aa41: 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 ); 10aa44: 89 04 24 mov %eax,(%esp) 10aa47: e8 b8 d5 ff ff call 108004 free( mt_entry ); 10aa4c: 89 34 24 mov %esi,(%esp) 10aa4f: e8 c4 d5 ff ff call 108018 return 0; 10aa54: 83 c4 10 add $0x10,%esp 10aa57: 31 d2 xor %edx,%edx 10aa59: eb 03 jmp 10aa5e * 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; 10aa5b: 83 ca ff or $0xffffffff,%edx rtems_filesystem_freenode( fs_mount_loc ); free( mt_entry ); return 0; } 10aa5e: 89 d0 mov %edx,%eax 10aa60: 8d 65 f4 lea -0xc(%ebp),%esp 10aa63: 5b pop %ebx 10aa64: 5e pop %esi 10aa65: 5f pop %edi 10aa66: c9 leave 10aa67: c3 ret =============================================================================== 0011d28c : ssize_t write( int fd, const void *buffer, size_t count ) { 11d28c: 55 push %ebp 11d28d: 89 e5 mov %esp,%ebp 11d28f: 56 push %esi 11d290: 53 push %ebx 11d291: 8b 5d 08 mov 0x8(%ebp),%ebx 11d294: 8b 55 0c mov 0xc(%ebp),%edx 11d297: 8b 4d 10 mov 0x10(%ebp),%ecx ssize_t rc; rtems_libio_t *iop; rtems_libio_check_fd( fd ); 11d29a: 3b 1d 44 11 12 00 cmp 0x121144,%ebx 11d2a0: 73 14 jae 11d2b6 iop = rtems_libio_iop( fd ); 11d2a2: 6b db 38 imul $0x38,%ebx,%ebx 11d2a5: 03 1d f8 51 12 00 add 0x1251f8,%ebx rtems_libio_check_is_open( iop ); 11d2ab: 8b 73 14 mov 0x14(%ebx),%esi 11d2ae: f7 c6 00 01 00 00 test $0x100,%esi 11d2b4: 75 0d jne 11d2c3 11d2b6: e8 11 3e ff ff call 1110cc <__errno> 11d2bb: c7 00 09 00 00 00 movl $0x9,(%eax) 11d2c1: eb 1a jmp 11d2dd rtems_libio_check_buffer( buffer ); 11d2c3: 85 d2 test %edx,%edx 11d2c5: 74 0b je 11d2d2 <== NEVER TAKEN rtems_libio_check_count( count ); 11d2c7: 31 c0 xor %eax,%eax 11d2c9: 85 c9 test %ecx,%ecx 11d2cb: 74 31 je 11d2fe rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE ); 11d2cd: 83 e6 04 and $0x4,%esi 11d2d0: 75 10 jne 11d2e2 11d2d2: e8 f5 3d ff ff call 1110cc <__errno> 11d2d7: c7 00 16 00 00 00 movl $0x16,(%eax) 11d2dd: 83 c8 ff or $0xffffffff,%eax 11d2e0: eb 1c jmp 11d2fe /* * Now process the write() request. */ rc = (*iop->pathinfo.handlers->write_h)( iop, buffer, count ); 11d2e2: 50 push %eax 11d2e3: 8b 43 20 mov 0x20(%ebx),%eax 11d2e6: 51 push %ecx 11d2e7: 52 push %edx 11d2e8: 53 push %ebx 11d2e9: ff 50 0c call *0xc(%eax) if ( rc > 0 ) 11d2ec: 83 c4 10 add $0x10,%esp 11d2ef: 85 c0 test %eax,%eax 11d2f1: 7e 0b jle 11d2fe iop->offset += rc; 11d2f3: 89 c1 mov %eax,%ecx 11d2f5: c1 f9 1f sar $0x1f,%ecx 11d2f8: 01 43 0c add %eax,0xc(%ebx) 11d2fb: 11 4b 10 adc %ecx,0x10(%ebx) return rc; } 11d2fe: 8d 65 f8 lea -0x8(%ebp),%esp 11d301: 5b pop %ebx 11d302: 5e pop %esi 11d303: c9 leave 11d304: c3 ret =============================================================================== 0010a93c : ssize_t writev( int fd, const struct iovec *iov, int iovcnt ) { 10a93c: 55 push %ebp 10a93d: 89 e5 mov %esp,%ebp 10a93f: 57 push %edi 10a940: 56 push %esi 10a941: 53 push %ebx 10a942: 83 ec 1c sub $0x1c,%esp 10a945: 8b 75 08 mov 0x8(%ebp),%esi 10a948: 8b 7d 0c mov 0xc(%ebp),%edi int bytes; rtems_libio_t *iop; ssize_t old; bool all_zeros; rtems_libio_check_fd( fd ); 10a94b: 3b 35 44 21 12 00 cmp 0x122144,%esi 10a951: 73 11 jae 10a964 iop = rtems_libio_iop( fd ); 10a953: 6b f6 38 imul $0x38,%esi,%esi 10a956: 03 35 f8 61 12 00 add 0x1261f8,%esi rtems_libio_check_is_open( iop ); 10a95c: 8b 46 14 mov 0x14(%esi),%eax 10a95f: f6 c4 01 test $0x1,%ah 10a962: 75 10 jne 10a974 10a964: e8 33 73 00 00 call 111c9c <__errno> 10a969: c7 00 09 00 00 00 movl $0x9,(%eax) 10a96f: e9 ad 00 00 00 jmp 10aa21 rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE ); 10a974: a8 04 test $0x4,%al 10a976: 74 42 je 10a9ba <== NEVER TAKEN /* * Argument validation on IO vector */ if ( !iov ) 10a978: 85 ff test %edi,%edi 10a97a: 74 3e je 10a9ba rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt <= 0 ) 10a97c: 83 7d 10 00 cmpl $0x0,0x10(%ebp) 10a980: 7e 38 jle 10a9ba rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt > IOV_MAX ) 10a982: 81 7d 10 00 04 00 00 cmpl $0x400,0x10(%ebp) 10a989: 7f 2f jg 10a9ba <== NEVER TAKEN 10a98b: b2 01 mov $0x1,%dl 10a98d: 31 c0 xor %eax,%eax 10a98f: 31 c9 xor %ecx,%ecx 10a991: eb 02 jmp 10a995 if ( iov[v].iov_len ) all_zeros = false; /* check for wrap */ old = total; total += iov[v].iov_len; 10a993: 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 ) 10a995: 83 3c c7 00 cmpl $0x0,(%edi,%eax,8) 10a999: 74 1f je 10a9ba rtems_set_errno_and_return_minus_one( EINVAL ); if ( iov[v].iov_len ) all_zeros = false; 10a99b: 83 7c c7 04 00 cmpl $0x0,0x4(%edi,%eax,8) 10a9a0: 0f 94 c3 sete %bl 10a9a3: f7 db neg %ebx 10a9a5: 21 da and %ebx,%edx /* check for wrap */ old = total; total += iov[v].iov_len; 10a9a7: 8b 5c c7 04 mov 0x4(%edi,%eax,8),%ebx 10a9ab: 8d 1c 19 lea (%ecx,%ebx,1),%ebx if ( total < old || total > SSIZE_MAX ) 10a9ae: 81 fb ff 7f 00 00 cmp $0x7fff,%ebx 10a9b4: 7f 04 jg 10a9ba <== NEVER TAKEN 10a9b6: 39 cb cmp %ecx,%ebx 10a9b8: 7d 0d jge 10a9c7 rtems_set_errno_and_return_minus_one( EINVAL ); 10a9ba: e8 dd 72 00 00 call 111c9c <__errno> 10a9bf: c7 00 16 00 00 00 movl $0x16,(%eax) 10a9c5: eb 5a jmp 10aa21 * 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++ ) { 10a9c7: 40 inc %eax 10a9c8: 3b 45 10 cmp 0x10(%ebp),%eax 10a9cb: 7c c6 jl 10a993 /* * A writev with all zeros is supposed to have no effect per OpenGroup. */ if ( all_zeros == true ) { return 0; 10a9cd: 31 db xor %ebx,%ebx } /* * A writev with all zeros is supposed to have no effect per OpenGroup. */ if ( all_zeros == true ) { 10a9cf: 84 d2 test %dl,%dl 10a9d1: 75 51 jne 10aa24 10a9d3: 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 ) 10a9da: 8b 55 e4 mov -0x1c(%ebp),%edx 10a9dd: 8b 44 d7 04 mov 0x4(%edi,%edx,8),%eax 10a9e1: 85 c0 test %eax,%eax 10a9e3: 74 2f je 10aa14 <== NEVER TAKEN continue; bytes = (*iop->pathinfo.handlers->write_h)( 10a9e5: 52 push %edx 10a9e6: 8b 56 20 mov 0x20(%esi),%edx 10a9e9: 50 push %eax 10a9ea: 8b 45 e4 mov -0x1c(%ebp),%eax 10a9ed: ff 34 c7 pushl (%edi,%eax,8) 10a9f0: 56 push %esi 10a9f1: ff 52 0c call *0xc(%edx) iop, iov[v].iov_base, iov[v].iov_len ); if ( bytes < 0 ) 10a9f4: 83 c4 10 add $0x10,%esp 10a9f7: 83 f8 00 cmp $0x0,%eax 10a9fa: 7c 25 jl 10aa21 <== NEVER TAKEN return -1; if ( bytes > 0 ) { 10a9fc: 74 0d je 10aa0b <== NEVER TAKEN iop->offset += bytes; 10a9fe: 89 c1 mov %eax,%ecx 10aa00: c1 f9 1f sar $0x1f,%ecx 10aa03: 01 46 0c add %eax,0xc(%esi) 10aa06: 11 4e 10 adc %ecx,0x10(%esi) total += bytes; 10aa09: 01 c3 add %eax,%ebx } if (bytes != iov[ v ].iov_len) 10aa0b: 8b 55 e4 mov -0x1c(%ebp),%edx 10aa0e: 3b 44 d7 04 cmp 0x4(%edi,%edx,8),%eax 10aa12: 75 10 jne 10aa24 <== NEVER TAKEN } /* * Now process the writev(). */ for ( total=0, v=0 ; v < iovcnt ; v++ ) { 10aa14: ff 45 e4 incl -0x1c(%ebp) 10aa17: 8b 45 10 mov 0x10(%ebp),%eax 10aa1a: 39 45 e4 cmp %eax,-0x1c(%ebp) 10aa1d: 7c bb jl 10a9da 10aa1f: eb 03 jmp 10aa24 iov[v].iov_base, iov[v].iov_len ); if ( bytes < 0 ) return -1; 10aa21: 83 cb ff or $0xffffffff,%ebx if (bytes != iov[ v ].iov_len) break; } return total; } 10aa24: 89 d8 mov %ebx,%eax 10aa26: 8d 65 f4 lea -0xc(%ebp),%esp 10aa29: 5b pop %ebx 10aa2a: 5e pop %esi 10aa2b: 5f pop %edi 10aa2c: c9 leave 10aa2d: c3 ret