=============================================================================== ffc0f770 : { IMFS_jnode_t *node = loc->node_access; IMFS_fs_info_t *fs_info; fs_info = loc->mt_entry->fs_info; switch( node->type ) { ffc0f770: 81 63 00 00 lwz r11,0(r3) ) { IMFS_jnode_t *node = loc->node_access; IMFS_fs_info_t *fs_info; fs_info = loc->mt_entry->fs_info; ffc0f774: 81 23 00 10 lwz r9,16(r3) switch( node->type ) { ffc0f778: 81 6b 00 4c lwz r11,76(r11) ) { IMFS_jnode_t *node = loc->node_access; IMFS_fs_info_t *fs_info; fs_info = loc->mt_entry->fs_info; ffc0f77c: 81 29 00 34 lwz r9,52(r9) switch( node->type ) { ffc0f780: 38 0b ff ff addi r0,r11,-1 ffc0f784: 2b 80 00 06 cmplwi cr7,r0,6 ffc0f788: 41 9d 00 50 bgt- cr7,ffc0f7d8 <== NEVER TAKEN ffc0f78c: 3d 60 ff c2 lis r11,-62 ffc0f790: 39 6b ac e8 addi r11,r11,-21272 ffc0f794: 54 00 10 3a rlwinm r0,r0,2,0,29 ffc0f798: 7c 0b 00 2e lwzx r0,r11,r0 ffc0f79c: 7d 60 5a 14 add r11,r0,r11 ffc0f7a0: 7d 69 03 a6 mtctr r11 ffc0f7a4: 4e 80 04 20 bctr case IMFS_DIRECTORY: loc->handlers = fs_info->directory_handlers; ffc0f7a8: 80 09 00 0c lwz r0,12(r9) ffc0f7ac: 48 00 00 28 b ffc0f7d4 break; case IMFS_DEVICE: loc->handlers = &IMFS_device_handlers; ffc0f7b0: 3d 20 ff c2 lis r9,-62 ffc0f7b4: 38 09 ad 10 addi r0,r9,-21232 ffc0f7b8: 48 00 00 1c b ffc0f7d4 break; case IMFS_SYM_LINK: case IMFS_HARD_LINK: loc->handlers = &IMFS_link_handlers; ffc0f7bc: 3d 20 ff c2 lis r9,-62 ffc0f7c0: 38 09 ad 80 addi r0,r9,-21120 ffc0f7c4: 48 00 00 10 b ffc0f7d4 break; case IMFS_LINEAR_FILE: loc->handlers = fs_info->memfile_handlers; break; case IMFS_MEMORY_FILE: loc->handlers = fs_info->memfile_handlers; ffc0f7c8: 80 09 00 08 lwz r0,8(r9) ffc0f7cc: 48 00 00 08 b ffc0f7d4 break; case IMFS_FIFO: loc->handlers = fs_info->fifo_handlers; ffc0f7d0: 80 09 00 10 lwz r0,16(r9) ffc0f7d4: 90 03 00 08 stw r0,8(r3) break; } return 0; } ffc0f7d8: 38 60 00 00 li r3,0 ffc0f7dc: 4e 80 00 20 blr =============================================================================== ffc0f4d8 : int IMFS_chown( rtems_filesystem_location_info_t *pathloc, /* IN */ uid_t owner, /* IN */ gid_t group /* IN */ ) { ffc0f4d8: 94 21 ff d8 stwu r1,-40(r1) ffc0f4dc: 7c 08 02 a6 mflr r0 ffc0f4e0: 90 01 00 2c stw r0,44(r1) ffc0f4e4: bf a1 00 1c stmw r29,28(r1) ffc0f4e8: 7c 9e 23 78 mr r30,r4 ffc0f4ec: 7c bd 2b 78 mr r29,r5 IMFS_jnode_t *jnode; #if defined(RTEMS_POSIX_API) uid_t st_uid; #endif jnode = (IMFS_jnode_t *) pathloc->node_access; ffc0f4f0: 83 e3 00 00 lwz r31,0(r3) /* * Verify I am the owner of the node or the super user. */ #if defined(RTEMS_POSIX_API) st_uid = geteuid(); ffc0f4f4: 48 00 0f 7d bl ffc10470 if ( ( st_uid != jnode->st_uid ) && ( st_uid != 0 ) ) ffc0f4f8: a0 1f 00 3c lhz r0,60(r31) ffc0f4fc: 7f 80 18 00 cmpw cr7,r0,r3 ffc0f500: 41 9e 00 20 beq- cr7,ffc0f520 ffc0f504: 2f 83 00 00 cmpwi cr7,r3,0 ffc0f508: 41 be 00 18 beq+ cr7,ffc0f520 <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EPERM ); ffc0f50c: 48 00 4d ad bl ffc142b8 <__errno> ffc0f510: 38 00 00 01 li r0,1 ffc0f514: 90 03 00 00 stw r0,0(r3) ffc0f518: 38 60 ff ff li r3,-1 ffc0f51c: 48 00 00 24 b ffc0f540 #endif jnode->st_uid = owner; ffc0f520: b3 df 00 3c sth r30,60(r31) jnode->st_gid = group; IMFS_update_ctime( jnode ); ffc0f524: 38 61 00 08 addi r3,r1,8 ffc0f528: 38 80 00 00 li r4,0 if ( ( st_uid != jnode->st_uid ) && ( st_uid != 0 ) ) rtems_set_errno_and_return_minus_one( EPERM ); #endif jnode->st_uid = owner; jnode->st_gid = group; ffc0f52c: b3 bf 00 3e sth r29,62(r31) IMFS_update_ctime( jnode ); ffc0f530: 4b ff 5c b5 bl ffc051e4 ffc0f534: 80 01 00 08 lwz r0,8(r1) return 0; ffc0f538: 38 60 00 00 li r3,0 #endif jnode->st_uid = owner; jnode->st_gid = group; IMFS_update_ctime( jnode ); ffc0f53c: 90 1f 00 48 stw r0,72(r31) return 0; } ffc0f540: 39 61 00 28 addi r11,r1,40 ffc0f544: 48 00 9c 64 b ffc191a8 <_restgpr_29_x> =============================================================================== ffc0f5d0 : IMFS_fs_info_t *fs_info; /* * MUST have a parent node to call this routine. */ if ( parent_loc == NULL ) ffc0f5d0: 2c 03 00 00 cmpwi r3,0 IMFS_jnode_types_t type, const char *name, mode_t mode, const IMFS_types_union *info ) { ffc0f5d4: 94 21 ff e0 stwu r1,-32(r1) ffc0f5d8: 7c 08 02 a6 mflr r0 ffc0f5dc: bf 61 00 0c stmw r27,12(r1) ffc0f5e0: 7c 9f 23 78 mr r31,r4 ffc0f5e4: 7c fe 3b 78 mr r30,r7 ffc0f5e8: 90 01 00 24 stw r0,36(r1) /* * MUST have a parent node to call this routine. */ if ( parent_loc == NULL ) return NULL; ffc0f5ec: 3b 60 00 00 li r27,0 IMFS_fs_info_t *fs_info; /* * MUST have a parent node to call this routine. */ if ( parent_loc == NULL ) ffc0f5f0: 41 82 01 24 beq- ffc0f714 <== NEVER TAKEN fs_info = parent_loc->mt_entry->fs_info; /* * Reject creation of FIFOs if support is disabled. */ if ( type == IMFS_FIFO && ffc0f5f4: 2f 84 00 07 cmpwi cr7,r4,7 */ if ( parent_loc == NULL ) return NULL; parent = parent_loc->node_access; fs_info = parent_loc->mt_entry->fs_info; ffc0f5f8: 81 23 00 10 lwz r9,16(r3) * MUST have a parent node to call this routine. */ if ( parent_loc == NULL ) return NULL; parent = parent_loc->node_access; ffc0f5fc: 83 83 00 00 lwz r28,0(r3) fs_info = parent_loc->mt_entry->fs_info; ffc0f600: 83 a9 00 34 lwz r29,52(r9) /* * Reject creation of FIFOs if support is disabled. */ if ( type == IMFS_FIFO && ffc0f604: 40 9e 00 18 bne- cr7,ffc0f61c ffc0f608: 81 3d 00 10 lwz r9,16(r29) ffc0f60c: 3d 60 ff c2 lis r11,-62 ffc0f610: 38 0b ac 80 addi r0,r11,-21376 ffc0f614: 7f 89 00 00 cmpw cr7,r9,r0 ffc0f618: 41 be 00 fc beq+ cr7,ffc0f714 return NULL; /* * Allocate filesystem node and fill in basic information */ node = IMFS_allocate_node( type, name, mode & ~rtems_filesystem_umask ); ffc0f61c: 3d 20 00 00 lis r9,0 ffc0f620: 81 29 27 74 lwz r9,10100(r9) ffc0f624: 7c a4 2b 78 mr r4,r5 ffc0f628: 7f e3 fb 78 mr r3,r31 ffc0f62c: 80 09 00 2c lwz r0,44(r9) ffc0f630: 7c c5 00 78 andc r5,r6,r0 ffc0f634: 4b ff ff 15 bl ffc0f548 if ( !node ) ffc0f638: 7c 7b 1b 79 mr. r27,r3 ffc0f63c: 41 82 00 d8 beq- ffc0f714 return NULL; /* * Set the type specific information */ if ( type == IMFS_DIRECTORY ) { ffc0f640: 2f 9f 00 01 cmpwi cr7,r31,1 ffc0f644: 40 be 00 1c bne+ cr7,ffc0f660 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 ); ffc0f648: 38 1b 00 54 addi r0,r27,84 head->next = tail; ffc0f64c: 90 1b 00 50 stw r0,80(r27) head->previous = NULL; ffc0f650: 38 00 00 00 li r0,0 ffc0f654: 90 1b 00 54 stw r0,84(r27) */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { Chain_Node *head = _Chain_Head( the_chain ); ffc0f658: 38 1b 00 50 addi r0,r27,80 ffc0f65c: 48 00 00 54 b ffc0f6b0 rtems_chain_initialize_empty(&node->info.directory.Entries); } else if ( type == IMFS_HARD_LINK ) { ffc0f660: 2f 9f 00 03 cmpwi cr7,r31,3 ffc0f664: 41 9e 00 0c beq- cr7,ffc0f670 node->info.hard_link.link_node = info->hard_link.link_node; } else if ( type == IMFS_SYM_LINK ) { ffc0f668: 2f 9f 00 04 cmpwi cr7,r31,4 ffc0f66c: 40 be 00 0c bne+ cr7,ffc0f678 node->info.sym_link.name = info->sym_link.name; ffc0f670: 80 1e 00 00 lwz r0,0(r30) ffc0f674: 48 00 00 7c b ffc0f6f0 } else if ( type == IMFS_DEVICE ) { ffc0f678: 2f 9f 00 02 cmpwi cr7,r31,2 ffc0f67c: 40 be 00 18 bne+ cr7,ffc0f694 node->info.device.major = info->device.major; ffc0f680: 80 1e 00 00 lwz r0,0(r30) ffc0f684: 90 1b 00 50 stw r0,80(r27) node->info.device.minor = info->device.minor; ffc0f688: 80 1e 00 04 lwz r0,4(r30) ffc0f68c: 90 1b 00 54 stw r0,84(r27) ffc0f690: 48 00 00 64 b ffc0f6f4 } else if ( type == IMFS_LINEAR_FILE ) { ffc0f694: 2f 9f 00 06 cmpwi cr7,r31,6 ffc0f698: 40 be 00 20 bne+ cr7,ffc0f6b8 node->info.linearfile.size = 0; ffc0f69c: 39 20 00 00 li r9,0 ffc0f6a0: 39 40 00 00 li r10,0 ffc0f6a4: 91 3b 00 50 stw r9,80(r27) node->info.linearfile.direct = 0; ffc0f6a8: 38 00 00 00 li r0,0 node->info.sym_link.name = info->sym_link.name; } else if ( type == IMFS_DEVICE ) { node->info.device.major = info->device.major; node->info.device.minor = info->device.minor; } else if ( type == IMFS_LINEAR_FILE ) { node->info.linearfile.size = 0; ffc0f6ac: 91 5b 00 54 stw r10,84(r27) node->info.linearfile.direct = 0; ffc0f6b0: 90 1b 00 58 stw r0,88(r27) ffc0f6b4: 48 00 00 40 b ffc0f6f4 } else if ( type == IMFS_MEMORY_FILE ) { ffc0f6b8: 2f 9f 00 05 cmpwi cr7,r31,5 ffc0f6bc: 40 be 00 28 bne+ cr7,ffc0f6e4 node->info.file.size = 0; node->info.file.indirect = 0; ffc0f6c0: 38 00 00 00 li r0,0 node->info.device.minor = info->device.minor; } else if ( type == IMFS_LINEAR_FILE ) { node->info.linearfile.size = 0; node->info.linearfile.direct = 0; } else if ( type == IMFS_MEMORY_FILE ) { node->info.file.size = 0; ffc0f6c4: 39 20 00 00 li r9,0 node->info.file.indirect = 0; ffc0f6c8: 90 1b 00 58 stw r0,88(r27) node->info.device.minor = info->device.minor; } else if ( type == IMFS_LINEAR_FILE ) { node->info.linearfile.size = 0; node->info.linearfile.direct = 0; } else if ( type == IMFS_MEMORY_FILE ) { node->info.file.size = 0; ffc0f6cc: 39 40 00 00 li r10,0 ffc0f6d0: 91 3b 00 50 stw r9,80(r27) ffc0f6d4: 91 5b 00 54 stw r10,84(r27) node->info.file.indirect = 0; node->info.file.doubly_indirect = 0; ffc0f6d8: 90 1b 00 5c stw r0,92(r27) node->info.file.triply_indirect = 0; ffc0f6dc: 90 1b 00 60 stw r0,96(r27) ffc0f6e0: 48 00 00 14 b ffc0f6f4 } else if ( type == IMFS_FIFO ) { ffc0f6e4: 2f 9f 00 07 cmpwi cr7,r31,7 ffc0f6e8: 40 be 00 0c bne+ cr7,ffc0f6f4 <== NEVER TAKEN node->info.fifo.pipe = NULL; ffc0f6ec: 38 00 00 00 li r0,0 ffc0f6f0: 90 1b 00 50 stw r0,80(r27) /* * This node MUST have a parent, so put it in that directory list. */ node->Parent = parent; node->st_ino = ++fs_info->ino_count; ffc0f6f4: 81 3d 00 04 lwz r9,4(r29) ffc0f6f8: 38 7c 00 50 addi r3,r28,80 } /* * This node MUST have a parent, so put it in that directory list. */ node->Parent = parent; ffc0f6fc: 93 9b 00 08 stw r28,8(r27) ffc0f700: 7f 64 db 78 mr r4,r27 node->st_ino = ++fs_info->ino_count; ffc0f704: 38 09 00 01 addi r0,r9,1 ffc0f708: 90 1d 00 04 stw r0,4(r29) ffc0f70c: 90 1b 00 38 stw r0,56(r27) ffc0f710: 4b ff a0 55 bl ffc09764 <_Chain_Append> rtems_chain_append( &parent->info.directory.Entries, &node->Node ); return node; } ffc0f714: 39 61 00 20 addi r11,r1,32 ffc0f718: 7f 63 db 78 mr r3,r27 ffc0f71c: 48 00 9a 84 b ffc191a0 <_restgpr_27_x> =============================================================================== ffc0f8c0 : const char *pathname, /* IN */ size_t pathnamelen, /* IN */ int flags, /* IN */ rtems_filesystem_location_info_t *pathloc /* IN/OUT */ ) { ffc0f8c0: 94 21 ff 88 stwu r1,-120(r1) ffc0f8c4: 7c 08 02 a6 mflr r0 ffc0f8c8: 90 01 00 7c stw r0,124(r1) 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 ) ) { ffc0f8cc: 54 a0 00 39 rlwinm. r0,r5,0,0,28 const char *pathname, /* IN */ size_t pathnamelen, /* IN */ int flags, /* IN */ rtems_filesystem_location_info_t *pathloc /* IN/OUT */ ) { ffc0f8d0: be a1 00 4c stmw r21,76(r1) ffc0f8d4: 7c 7b 1b 78 mr r27,r3 ffc0f8d8: 7c 9e 23 78 mr r30,r4 ffc0f8dc: 7c bc 2b 78 mr r28,r5 ffc0f8e0: 7c df 33 78 mr r31,r6 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 ) ) { ffc0f8e4: 41 a2 00 10 beq+ ffc0f8f4 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EIO ); ffc0f8e8: 48 00 49 d1 bl ffc142b8 <__errno> <== NOT EXECUTED ffc0f8ec: 38 00 00 05 li r0,5 <== NOT EXECUTED ffc0f8f0: 48 00 01 fc b ffc0faec <== NOT EXECUTED /* * This was filled in by the caller and is valid in the * mount table. */ node = pathloc->node_access; ffc0f8f4: 83 46 00 00 lwz r26,0(r6) size_t pathnamelen, /* IN */ int flags, /* IN */ rtems_filesystem_location_info_t *pathloc /* IN/OUT */ ) { int i = 0; ffc0f8f8: 3b a0 00 00 li r29,0 * Evaluate all tokens until we are done or an error occurs. */ while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) { type = IMFS_get_token( &pathname[i], pathnamelen, token, &len ); ffc0f8fc: 3b 21 00 20 addi r25,r1,32 ffc0f900: 3a e1 00 08 addi r23,r1,8 case IMFS_UP_DIR: /* * Am I at the root of all filesystems? (chroot'ed?) */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) ffc0f904: 3f 00 00 00 lis r24,0 * Evaluate all tokens until we are done or an error occurs. */ while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) { type = IMFS_get_token( &pathname[i], pathnamelen, token, &len ); ffc0f908: 7c 7b ea 14 add r3,r27,r29 ffc0f90c: 7f c4 f3 78 mr r4,r30 ffc0f910: 7f 25 cb 78 mr r5,r25 ffc0f914: 7e e6 bb 78 mr r6,r23 ffc0f918: 48 00 06 ed bl ffc10004 pathnamelen -= len; i += len; if ( !pathloc->node_access ) ffc0f91c: 80 1f 00 00 lwz r0,0(r31) * Evaluate all tokens until we are done or an error occurs. */ while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) { type = IMFS_get_token( &pathname[i], pathnamelen, token, &len ); ffc0f920: 7c 76 1b 78 mr r22,r3 pathnamelen -= len; ffc0f924: 82 a1 00 08 lwz r21,8(r1) i += len; if ( !pathloc->node_access ) ffc0f928: 2f 80 00 00 cmpwi cr7,r0,0 ffc0f92c: 41 9e 01 0c beq- cr7,ffc0fa38 <== NEVER TAKEN rtems_set_errno_and_return_minus_one( ENOENT ); /* * I cannot move out of this directory without execute permission. */ if ( type != IMFS_NO_MORE_PATH ) ffc0f930: 2f 83 00 00 cmpwi cr7,r3,0 ffc0f934: 41 9e 00 24 beq- cr7,ffc0f958 if ( node->type == IMFS_DIRECTORY ) ffc0f938: 80 1a 00 4c lwz r0,76(r26) ffc0f93c: 2f 80 00 01 cmpwi cr7,r0,1 ffc0f940: 40 be 00 18 bne+ cr7,ffc0f958 if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) ) ffc0f944: 7f e3 fb 78 mr r3,r31 ffc0f948: 38 80 00 01 li r4,1 ffc0f94c: 4b ff fe 95 bl ffc0f7e0 ffc0f950: 2f 83 00 00 cmpwi cr7,r3,0 ffc0f954: 41 9e 01 90 beq- cr7,ffc0fae4 rtems_set_errno_and_return_minus_one( EACCES ); node = pathloc->node_access; switch( type ) { ffc0f958: 2f 96 00 03 cmpwi cr7,r22,3 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; ffc0f95c: 83 5f 00 00 lwz r26,0(r31) */ while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) { type = IMFS_get_token( &pathname[i], pathnamelen, token, &len ); pathnamelen -= len; ffc0f960: 7f d5 f0 50 subf r30,r21,r30 i += len; ffc0f964: 7f bd aa 14 add r29,r29,r21 if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) ) rtems_set_errno_and_return_minus_one( EACCES ); node = pathloc->node_access; switch( type ) { ffc0f968: 41 9e 00 54 beq- cr7,ffc0f9bc ffc0f96c: 2f 96 00 04 cmpwi cr7,r22,4 ffc0f970: 41 9e 00 dc beq- cr7,ffc0fa4c ffc0f974: 2f 16 00 02 cmpwi cr6,r22,2 ffc0f978: 40 ba 00 e0 bne+ cr6,ffc0fa58 case IMFS_UP_DIR: /* * Am I at the root of all filesystems? (chroot'ed?) */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) ffc0f97c: 81 38 27 74 lwz r9,10100(r24) ffc0f980: 80 09 00 18 lwz r0,24(r9) ffc0f984: 7f 9a 00 00 cmpw cr7,r26,r0 ffc0f988: 41 be ff 80 beq- cr7,ffc0f908 /* * Am I at the root of this mounted filesystem? */ if (pathloc->node_access == pathloc->mt_entry->mt_fs_root.node_access) { ffc0f98c: 80 9f 00 10 lwz r4,16(r31) /* * Am I at the root of this mounted filesystem? */ if (pathloc->node_access == ffc0f990: 80 04 00 1c lwz r0,28(r4) ffc0f994: 7f 9a 00 00 cmpw cr7,r26,r0 ffc0f998: 40 be 00 0c bne+ cr7,ffc0f9a4 */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) { break; /* Throw out the .. in this case */ } else { newloc = pathloc->mt_entry->mt_point_node; ffc0f99c: 38 84 00 08 addi r4,r4,8 ffc0f9a0: 48 00 00 e0 b ffc0fa80 pathnamelen+len, flags,pathloc); } } else { if ( !node->Parent ) ffc0f9a4: 83 5a 00 08 lwz r26,8(r26) ffc0f9a8: 2f 9a 00 00 cmpwi cr7,r26,0 ffc0f9ac: 40 be 00 98 bne+ cr7,ffc0fa44 rtems_set_errno_and_return_minus_one( ENOENT ); ffc0f9b0: 48 00 49 09 bl ffc142b8 <__errno> ffc0f9b4: 92 c3 00 00 stw r22,0(r3) ffc0f9b8: 48 00 01 38 b ffc0faf0 case IMFS_NAME: /* * If we are at a link follow it. */ if ( node->type == IMFS_HARD_LINK ) { ffc0f9bc: 80 1a 00 4c lwz r0,76(r26) ffc0f9c0: 2f 80 00 03 cmpwi cr7,r0,3 ffc0f9c4: 40 be 00 18 bne+ cr7,ffc0f9dc IMFS_evaluate_hard_link( pathloc, 0 ); ffc0f9c8: 7f e3 fb 78 mr r3,r31 ffc0f9cc: 38 80 00 00 li r4,0 ffc0f9d0: 4b ff fe 91 bl ffc0f860 node = pathloc->node_access; ffc0f9d4: 83 5f 00 00 lwz r26,0(r31) ffc0f9d8: 48 00 00 28 b ffc0fa00 * It would be a design error if we evaluated the link and * was broken. */ IMFS_assert( node ); } else if ( node->type == IMFS_SYM_LINK ) { ffc0f9dc: 2f 80 00 04 cmpwi cr7,r0,4 ffc0f9e0: 40 be 00 20 bne+ cr7,ffc0fa00 result = IMFS_evaluate_sym_link( pathloc, 0 ); ffc0f9e4: 7f e3 fb 78 mr r3,r31 ffc0f9e8: 38 80 00 00 li r4,0 ffc0f9ec: 48 00 01 15 bl ffc0fb00 /* * In contrast to a hard link, it is possible to have a broken * symbolic link. */ node = pathloc->node_access; ffc0f9f0: 83 5f 00 00 lwz r26,0(r31) if ( result == -1 ) ffc0f9f4: 2f 83 ff ff cmpwi cr7,r3,-1 * was broken. */ IMFS_assert( node ); } else if ( node->type == IMFS_SYM_LINK ) { result = IMFS_evaluate_sym_link( pathloc, 0 ); ffc0f9f8: 7c 76 1b 78 mr r22,r3 /* * In contrast to a hard link, it is possible to have a broken * symbolic link. */ node = pathloc->node_access; if ( result == -1 ) ffc0f9fc: 41 9e 00 f8 beq- cr7,ffc0faf4 <== NEVER TAKEN } /* * Only a directory can be decended into. */ if ( node->type != IMFS_DIRECTORY ) ffc0fa00: 80 1a 00 4c lwz r0,76(r26) ffc0fa04: 2f 80 00 01 cmpwi cr7,r0,1 ffc0fa08: 41 be 00 10 beq+ cr7,ffc0fa18 rtems_set_errno_and_return_minus_one( ENOTDIR ); ffc0fa0c: 48 00 48 ad bl ffc142b8 <__errno> ffc0fa10: 38 00 00 14 li r0,20 ffc0fa14: 48 00 00 d8 b ffc0faec /* * 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 ) { ffc0fa18: 80 9a 00 5c lwz r4,92(r26) ffc0fa1c: 2f 84 00 00 cmpwi cr7,r4,0 ffc0fa20: 40 9e 00 5c bne- cr7,ffc0fa7c } /* * Otherwise find the token name in the present location. */ node = IMFS_find_match_in_dir( node, token ); ffc0fa24: 7f 43 d3 78 mr r3,r26 ffc0fa28: 7f 24 cb 78 mr r4,r25 ffc0fa2c: 48 00 05 45 bl ffc0ff70 if ( !node ) ffc0fa30: 7c 7a 1b 79 mr. r26,r3 ffc0fa34: 40 a2 00 10 bne+ ffc0fa44 rtems_set_errno_and_return_minus_one( ENOENT ); ffc0fa38: 48 00 48 81 bl ffc142b8 <__errno> ffc0fa3c: 38 00 00 02 li r0,2 ffc0fa40: 48 00 00 ac b ffc0faec /* * Set the node access to the point we have found. */ pathloc->node_access = node; ffc0fa44: 93 5f 00 00 stw r26,0(r31) ffc0fa48: 4b ff fe c0 b ffc0f908 case IMFS_NO_MORE_PATH: case IMFS_CURRENT_DIR: break; case IMFS_INVALID_TOKEN: rtems_set_errno_and_return_minus_one( ENAMETOOLONG ); ffc0fa4c: 48 00 48 6d bl ffc142b8 <__errno> ffc0fa50: 38 00 00 5b li r0,91 ffc0fa54: 48 00 00 98 b ffc0faec /* * Evaluate all tokens until we are done or an error occurs. */ while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) { ffc0fa58: 2f 16 00 00 cmpwi cr6,r22,0 ffc0fa5c: 41 9a 00 08 beq- cr6,ffc0fa64 ffc0fa60: 40 9e fe a8 bne+ cr7,ffc0f908 <== ALWAYS TAKEN * 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 ) { ffc0fa64: 80 1a 00 4c lwz r0,76(r26) ffc0fa68: 2f 80 00 01 cmpwi cr7,r0,1 ffc0fa6c: 40 9e 00 58 bne- cr7,ffc0fac4 if ( node->info.directory.mt_fs != NULL ) { ffc0fa70: 80 9a 00 5c lwz r4,92(r26) ffc0fa74: 2f 84 00 00 cmpwi cr7,r4,0 ffc0fa78: 41 9e 00 4c beq- cr7,ffc0fac4 newloc = node->info.directory.mt_fs->mt_fs_root; ffc0fa7c: 38 84 00 1c addi r4,r4,28 ffc0fa80: 39 61 00 0c addi r11,r1,12 ffc0fa84: 7c a4 a4 aa lswi r5,r4,20 ffc0fa88: 7c ab a5 aa stswi r5,r11,20 *pathloc = newloc; ffc0fa8c: 7c ab a4 aa lswi r5,r11,20 ffc0fa90: 7c bf a5 aa stswi r5,r31,20 return (*pathloc->ops->evalpath_h)( &pathname[i-len], ffc0fa94: 7f 85 e3 78 mr r5,r28 ffc0fa98: 7f e6 fb 78 mr r6,r31 ffc0fa9c: 81 3f 00 0c lwz r9,12(r31) ffc0faa0: 80 81 00 08 lwz r4,8(r1) ffc0faa4: 80 09 00 00 lwz r0,0(r9) ffc0faa8: 7c 64 e8 50 subf r3,r4,r29 ffc0faac: 7c 7b 1a 14 add r3,r27,r3 ffc0fab0: 7c 09 03 a6 mtctr r0 ffc0fab4: 7c 9e 22 14 add r4,r30,r4 ffc0fab8: 4e 80 04 21 bctrl ffc0fabc: 7c 76 1b 78 mr r22,r3 ffc0fac0: 48 00 00 34 b ffc0faf4 flags, pathloc ); } else { result = IMFS_Set_handlers( pathloc ); } } else { result = IMFS_Set_handlers( pathloc ); ffc0fac4: 7f e3 fb 78 mr r3,r31 ffc0fac8: 4b ff fc a9 bl ffc0f770 /* * Verify we have the correct permissions for this node. */ if ( !IMFS_evaluate_permission( pathloc, flags ) ) ffc0facc: 7f 84 e3 78 mr r4,r28 flags, pathloc ); } else { result = IMFS_Set_handlers( pathloc ); } } else { result = IMFS_Set_handlers( pathloc ); ffc0fad0: 7c 76 1b 78 mr r22,r3 /* * Verify we have the correct permissions for this node. */ if ( !IMFS_evaluate_permission( pathloc, flags ) ) ffc0fad4: 7f e3 fb 78 mr r3,r31 ffc0fad8: 4b ff fd 09 bl ffc0f7e0 ffc0fadc: 2f 83 00 00 cmpwi cr7,r3,0 ffc0fae0: 40 be 00 14 bne+ cr7,ffc0faf4 rtems_set_errno_and_return_minus_one( EACCES ); ffc0fae4: 48 00 47 d5 bl ffc142b8 <__errno> ffc0fae8: 38 00 00 0d li r0,13 ffc0faec: 90 03 00 00 stw r0,0(r3) ffc0faf0: 3a c0 ff ff li r22,-1 return result; } ffc0faf4: 39 61 00 78 addi r11,r1,120 ffc0faf8: 7e c3 b3 78 mr r3,r22 ffc0fafc: 48 00 96 8c b ffc19188 <_restgpr_21_x> =============================================================================== ffc0fc54 : int IMFS_evaluate_for_make( const char *path, /* IN */ rtems_filesystem_location_info_t *pathloc, /* IN/OUT */ const char **name /* OUT */ ) { ffc0fc54: 94 21 ff 88 stwu r1,-120(r1) ffc0fc58: 7c 08 02 a6 mflr r0 ffc0fc5c: 90 01 00 7c stw r0,124(r1) ffc0fc60: be a1 00 4c stmw r21,76(r1) ffc0fc64: 7c 7d 1b 78 mr r29,r3 ffc0fc68: 7c 9f 23 78 mr r31,r4 ffc0fc6c: 7c bc 2b 78 mr r28,r5 /* * This was filled in by the caller and is valid in the * mount table. */ node = pathloc->node_access; ffc0fc70: 83 64 00 00 lwz r27,0(r4) /* * Get the path length. */ pathlen = strlen( path ); ffc0fc74: 48 00 57 e5 bl ffc15458 const char *path, /* IN */ rtems_filesystem_location_info_t *pathloc, /* IN/OUT */ const char **name /* OUT */ ) { int i = 0; ffc0fc78: 3b c0 00 00 li r30,0 node = pathloc->node_access; /* * Get the path length. */ pathlen = strlen( path ); ffc0fc7c: 7c 7a 1b 78 mr r26,r3 * Evaluate all tokens until we are done or an error occurs. */ while( !done ) { type = IMFS_get_token( &path[i], pathlen, token, &len ); ffc0fc80: 3b 21 00 20 addi r25,r1,32 ffc0fc84: 3a e1 00 08 addi r23,r1,8 case IMFS_UP_DIR: /* * Am I at the root of all filesystems? (chroot'ed?) */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) ffc0fc88: 3f 00 00 00 lis r24,0 * Evaluate all tokens until we are done or an error occurs. */ while( !done ) { type = IMFS_get_token( &path[i], pathlen, token, &len ); ffc0fc8c: 7f 44 d3 78 mr r4,r26 ffc0fc90: 7c 7d f2 14 add r3,r29,r30 ffc0fc94: 7f 25 cb 78 mr r5,r25 ffc0fc98: 7e e6 bb 78 mr r6,r23 ffc0fc9c: 48 00 03 69 bl ffc10004 pathlen -= len; i += len; if ( !pathloc->node_access ) ffc0fca0: 80 1f 00 00 lwz r0,0(r31) */ while( !done ) { type = IMFS_get_token( &path[i], pathlen, token, &len ); pathlen -= len; ffc0fca4: 82 a1 00 08 lwz r21,8(r1) * Evaluate all tokens until we are done or an error occurs. */ while( !done ) { type = IMFS_get_token( &path[i], pathlen, token, &len ); ffc0fca8: 7c 76 1b 78 mr r22,r3 pathlen -= len; i += len; if ( !pathloc->node_access ) ffc0fcac: 2f 80 00 00 cmpwi cr7,r0,0 */ while( !done ) { type = IMFS_get_token( &path[i], pathlen, token, &len ); pathlen -= len; ffc0fcb0: 7f 55 d0 50 subf r26,r21,r26 i += len; if ( !pathloc->node_access ) ffc0fcb4: 41 9e 01 90 beq- cr7,ffc0fe44 <== NEVER TAKEN /* * I cannot move out of this directory without execute permission. */ if ( type != IMFS_NO_MORE_PATH ) ffc0fcb8: 2f 83 00 00 cmpwi cr7,r3,0 ffc0fcbc: 41 9e 00 24 beq- cr7,ffc0fce0 if ( node->type == IMFS_DIRECTORY ) ffc0fcc0: 80 1b 00 4c lwz r0,76(r27) ffc0fcc4: 2f 80 00 01 cmpwi cr7,r0,1 ffc0fcc8: 40 be 00 18 bne+ cr7,ffc0fce0 if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) ) ffc0fccc: 7f e3 fb 78 mr r3,r31 ffc0fcd0: 38 80 00 01 li r4,1 ffc0fcd4: 4b ff fb 0d bl ffc0f7e0 ffc0fcd8: 2f 83 00 00 cmpwi cr7,r3,0 ffc0fcdc: 41 9e 01 bc beq- cr7,ffc0fe98 rtems_set_errno_and_return_minus_one( EACCES ); node = pathloc->node_access; switch( type ) { ffc0fce0: 2f 96 00 02 cmpwi cr7,r22,2 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; ffc0fce4: 83 7f 00 00 lwz r27,0(r31) while( !done ) { type = IMFS_get_token( &path[i], pathlen, token, &len ); pathlen -= len; i += len; ffc0fce8: 7f de aa 14 add r30,r30,r21 if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) ) rtems_set_errno_and_return_minus_one( EACCES ); node = pathloc->node_access; switch( type ) { ffc0fcec: 41 9e 00 2c beq- cr7,ffc0fd18 ffc0fcf0: 2b 96 00 02 cmplwi cr7,r22,2 ffc0fcf4: 41 9d 00 10 bgt- cr7,ffc0fd04 ffc0fcf8: 2f 96 00 00 cmpwi cr7,r22,0 ffc0fcfc: 41 9e 01 08 beq- cr7,ffc0fe04 ffc0fd00: 4b ff ff 8c b ffc0fc8c ffc0fd04: 2f 96 00 03 cmpwi cr7,r22,3 ffc0fd08: 41 9e 00 50 beq- cr7,ffc0fd58 ffc0fd0c: 2f 96 00 04 cmpwi cr7,r22,4 ffc0fd10: 40 9e ff 7c bne+ cr7,ffc0fc8c <== NEVER TAKEN ffc0fd14: 48 00 00 fc b ffc0fe10 case IMFS_UP_DIR: /* * Am I at the root of all filesystems? (chroot'ed?) */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) ffc0fd18: 81 38 27 74 lwz r9,10100(r24) ffc0fd1c: 80 09 00 18 lwz r0,24(r9) ffc0fd20: 7f 9b 00 00 cmpw cr7,r27,r0 ffc0fd24: 41 be ff 68 beq- cr7,ffc0fc8c /* * Am I at the root of this mounted filesystem? */ if (pathloc->node_access == pathloc->mt_entry->mt_fs_root.node_access){ ffc0fd28: 80 9f 00 10 lwz r4,16(r31) ffc0fd2c: 80 04 00 1c lwz r0,28(r4) ffc0fd30: 7f 9b 00 00 cmpw cr7,r27,r0 ffc0fd34: 40 be 00 0c bne+ cr7,ffc0fd40 if ( pathloc->node_access == rtems_filesystem_root.node_access ) { break; } else { newloc = pathloc->mt_entry->mt_point_node; ffc0fd38: 38 84 00 08 addi r4,r4,8 ffc0fd3c: 48 00 00 70 b ffc0fdac *pathloc = newloc; return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name ); } } else { if ( !node->Parent ) ffc0fd40: 83 7b 00 08 lwz r27,8(r27) ffc0fd44: 2f 9b 00 00 cmpwi cr7,r27,0 ffc0fd48: 40 be 00 b4 bne+ cr7,ffc0fdfc rtems_set_errno_and_return_minus_one( ENOENT ); ffc0fd4c: 48 00 45 6d bl ffc142b8 <__errno> ffc0fd50: 92 c3 00 00 stw r22,0(r3) ffc0fd54: 48 00 01 50 b ffc0fea4 pathloc->node_access = node; break; case IMFS_NAME: if ( node->type == IMFS_HARD_LINK ) { ffc0fd58: 80 1b 00 4c lwz r0,76(r27) ffc0fd5c: 2f 80 00 03 cmpwi cr7,r0,3 ffc0fd60: 41 9e 00 0c beq- cr7,ffc0fd6c result = IMFS_evaluate_link( pathloc, 0 ); if ( result == -1 ) return -1; } else if ( node->type == IMFS_SYM_LINK ) { ffc0fd64: 2f 80 00 04 cmpwi cr7,r0,4 ffc0fd68: 40 be 00 1c bne+ cr7,ffc0fd84 result = IMFS_evaluate_link( pathloc, 0 ); ffc0fd6c: 7f e3 fb 78 mr r3,r31 ffc0fd70: 38 80 00 00 li r4,0 ffc0fd74: 4b ff fe 25 bl ffc0fb98 if ( result == -1 ) ffc0fd78: 2f 83 ff ff cmpwi cr7,r3,-1 if ( result == -1 ) return -1; } else if ( node->type == IMFS_SYM_LINK ) { result = IMFS_evaluate_link( pathloc, 0 ); ffc0fd7c: 7c 7b 1b 78 mr r27,r3 if ( result == -1 ) ffc0fd80: 41 9e 01 28 beq- cr7,ffc0fea8 <== NEVER TAKEN return -1; } node = pathloc->node_access; ffc0fd84: 80 7f 00 00 lwz r3,0(r31) if ( !node ) ffc0fd88: 2f 83 00 00 cmpwi cr7,r3,0 ffc0fd8c: 41 9e 00 ec beq- cr7,ffc0fe78 <== NEVER TAKEN /* * Only a directory can be decended into. */ if ( node->type != IMFS_DIRECTORY ) ffc0fd90: 80 03 00 4c lwz r0,76(r3) ffc0fd94: 2f 80 00 01 cmpwi cr7,r0,1 ffc0fd98: 40 9e 00 e0 bne- cr7,ffc0fe78 /* * 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 ) { ffc0fd9c: 80 83 00 5c lwz r4,92(r3) ffc0fda0: 2f 84 00 00 cmpwi cr7,r4,0 ffc0fda4: 41 be 00 48 beq+ cr7,ffc0fdec newloc = node->info.directory.mt_fs->mt_fs_root; ffc0fda8: 38 84 00 1c addi r4,r4,28 ffc0fdac: 39 61 00 0c addi r11,r1,12 *pathloc = newloc; return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name ); ffc0fdb0: 80 01 00 08 lwz r0,8(r1) * If we are at a node that is a mount point. Set loc to the * new fs root node and let them finish evaluating the path. */ if ( node->info.directory.mt_fs != NULL ) { newloc = node->info.directory.mt_fs->mt_fs_root; ffc0fdb4: 7c a4 a4 aa lswi r5,r4,20 ffc0fdb8: 7c ab a5 aa stswi r5,r11,20 *pathloc = newloc; return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name ); ffc0fdbc: 7f e4 fb 78 mr r4,r31 ffc0fdc0: 7f c0 f0 50 subf r30,r0,r30 * new fs root node and let them finish evaluating the path. */ if ( node->info.directory.mt_fs != NULL ) { newloc = node->info.directory.mt_fs->mt_fs_root; *pathloc = newloc; ffc0fdc4: 7c ab a4 aa lswi r5,r11,20 ffc0fdc8: 7c bf a5 aa stswi r5,r31,20 return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name ); ffc0fdcc: 7c 7d f2 14 add r3,r29,r30 ffc0fdd0: 7f 85 e3 78 mr r5,r28 ffc0fdd4: 81 3f 00 0c lwz r9,12(r31) ffc0fdd8: 80 09 00 04 lwz r0,4(r9) ffc0fddc: 7c 09 03 a6 mtctr r0 ffc0fde0: 4e 80 04 21 bctrl ffc0fde4: 7c 7b 1b 78 mr r27,r3 ffc0fde8: 48 00 00 c0 b ffc0fea8 /* * Otherwise find the token name in the present location. */ node = IMFS_find_match_in_dir( node, token ); ffc0fdec: 7f 24 cb 78 mr r4,r25 ffc0fdf0: 48 00 01 81 bl ffc0ff70 /* * If there is no node we have found the name of the node we * wish to create. */ if ( ! node ) ffc0fdf4: 7c 7b 1b 79 mr. r27,r3 ffc0fdf8: 41 82 00 24 beq- ffc0fe1c done = true; else pathloc->node_access = node; ffc0fdfc: 93 7f 00 00 stw r27,0(r31) ffc0fe00: 4b ff fe 8c b ffc0fc8c break; case IMFS_NO_MORE_PATH: rtems_set_errno_and_return_minus_one( EEXIST ); ffc0fe04: 48 00 44 b5 bl ffc142b8 <__errno> ffc0fe08: 38 00 00 11 li r0,17 ffc0fe0c: 48 00 00 94 b ffc0fea0 break; case IMFS_INVALID_TOKEN: rtems_set_errno_and_return_minus_one( ENAMETOOLONG ); ffc0fe10: 48 00 44 a9 bl ffc142b8 <__errno> ffc0fe14: 38 00 00 5b li r0,91 ffc0fe18: 48 00 00 88 b ffc0fea0 case IMFS_CURRENT_DIR: break; } } *name = &path[ i - len ]; ffc0fe1c: 80 01 00 08 lwz r0,8(r1) ffc0fe20: 7c 00 f0 50 subf r0,r0,r30 ffc0fe24: 7c 1d 02 14 add r0,r29,r0 * 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( ffc0fe28: 3b de ff ff addi r30,r30,-1 case IMFS_CURRENT_DIR: break; } } *name = &path[ i - len ]; ffc0fe2c: 90 1c 00 00 stw r0,0(r28) * 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( ffc0fe30: 7f bd f2 14 add r29,r29,r30 /* * 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++) { ffc0fe34: 48 00 00 1c b ffc0fe50 if ( !IMFS_is_separator( path[ i ] ) ) ffc0fe38: 4b ff 63 d1 bl ffc06208 ffc0fe3c: 2f 83 00 00 cmpwi cr7,r3,0 ffc0fe40: 40 be 00 10 bne+ cr7,ffc0fe50 rtems_set_errno_and_return_minus_one( ENOENT ); ffc0fe44: 48 00 44 75 bl ffc142b8 <__errno> ffc0fe48: 38 00 00 02 li r0,2 ffc0fe4c: 48 00 00 54 b ffc0fea0 /* * 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++) { ffc0fe50: 8c 7d 00 01 lbzu r3,1(r29) ffc0fe54: 2f 83 00 00 cmpwi cr7,r3,0 ffc0fe58: 40 9e ff e0 bne+ cr7,ffc0fe38 /* * Verify we can execute and write to this directory. */ result = IMFS_Set_handlers( pathloc ); ffc0fe5c: 7f e3 fb 78 mr r3,r31 ffc0fe60: 4b ff f9 11 bl ffc0f770 /* * The returned node must be a directory */ node = pathloc->node_access; if ( node->type != IMFS_DIRECTORY ) ffc0fe64: 81 3f 00 00 lwz r9,0(r31) /* * Verify we can execute and write to this directory. */ result = IMFS_Set_handlers( pathloc ); ffc0fe68: 7c 7b 1b 78 mr r27,r3 /* * The returned node must be a directory */ node = pathloc->node_access; if ( node->type != IMFS_DIRECTORY ) ffc0fe6c: 80 09 00 4c lwz r0,76(r9) ffc0fe70: 2f 80 00 01 cmpwi cr7,r0,1 ffc0fe74: 41 be 00 10 beq+ cr7,ffc0fe84 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( ENOTDIR ); ffc0fe78: 48 00 44 41 bl ffc142b8 <__errno> ffc0fe7c: 38 00 00 14 li r0,20 ffc0fe80: 48 00 00 20 b ffc0fea0 /* * We must have Write and execute permission on the returned node. */ if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_WX ) ) ffc0fe84: 7f e3 fb 78 mr r3,r31 ffc0fe88: 38 80 00 03 li r4,3 ffc0fe8c: 4b ff f9 55 bl ffc0f7e0 ffc0fe90: 2f 83 00 00 cmpwi cr7,r3,0 ffc0fe94: 40 be 00 14 bne+ cr7,ffc0fea8 rtems_set_errno_and_return_minus_one( EACCES ); ffc0fe98: 48 00 44 21 bl ffc142b8 <__errno> ffc0fe9c: 38 00 00 0d li r0,13 ffc0fea0: 90 03 00 00 stw r0,0(r3) ffc0fea4: 3b 60 ff ff li r27,-1 return result; } ffc0fea8: 39 61 00 78 addi r11,r1,120 ffc0feac: 7f 63 db 78 mr r3,r27 ffc0feb0: 48 00 92 d8 b ffc19188 <_restgpr_21_x> =============================================================================== ffc0f7e0 : */ int IMFS_evaluate_permission( rtems_filesystem_location_info_t *node, int flags ) { ffc0f7e0: 94 21 ff e8 stwu r1,-24(r1) ffc0f7e4: 7c 08 02 a6 mflr r0 ffc0f7e8: 90 01 00 1c stw r0,28(r1) uid_t st_uid; gid_t st_gid; IMFS_jnode_t *jnode; int flags_to_test; if ( !rtems_libio_is_valid_perms( flags ) ) ffc0f7ec: 54 80 00 39 rlwinm. r0,r4,0,0,28 */ int IMFS_evaluate_permission( rtems_filesystem_location_info_t *node, int flags ) { ffc0f7f0: bf a1 00 0c stmw r29,12(r1) ffc0f7f4: 7c 9e 23 78 mr r30,r4 uid_t st_uid; gid_t st_gid; IMFS_jnode_t *jnode; int flags_to_test; if ( !rtems_libio_is_valid_perms( flags ) ) ffc0f7f8: 41 a2 00 18 beq+ ffc0f810 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EPERM ); ffc0f7fc: 48 00 4a bd bl ffc142b8 <__errno> <== NOT EXECUTED ffc0f800: 38 00 00 01 li r0,1 <== NOT EXECUTED ffc0f804: 90 03 00 00 stw r0,0(r3) <== NOT EXECUTED ffc0f808: 38 60 ff ff li r3,-1 <== NOT EXECUTED ffc0f80c: 48 00 00 4c b ffc0f858 <== NOT EXECUTED jnode = node->node_access; ffc0f810: 83 e3 00 00 lwz r31,0(r3) #if defined(RTEMS_POSIX_API) st_uid = geteuid(); ffc0f814: 48 00 0c 5d bl ffc10470 ffc0f818: 7c 7d 1b 78 mr r29,r3 st_gid = getegid(); ffc0f81c: 48 00 0c 45 bl ffc10460 * Check if I am owner or a group member or someone else. */ flags_to_test = flags; if ( st_uid == jnode->st_uid ) ffc0f820: a0 1f 00 3c lhz r0,60(r31) ffc0f824: 7f 80 e8 00 cmpw cr7,r0,r29 ffc0f828: 40 be 00 0c bne+ cr7,ffc0f834 flags_to_test <<= 6; ffc0f82c: 57 de 30 32 rlwinm r30,r30,6,0,25 ffc0f830: 48 00 00 14 b ffc0f844 else if ( st_gid == jnode->st_gid ) ffc0f834: a0 1f 00 3e lhz r0,62(r31) ffc0f838: 7f 80 18 00 cmpw cr7,r0,r3 ffc0f83c: 40 be 00 08 bne+ cr7,ffc0f844 <== NEVER TAKEN flags_to_test <<= 3; ffc0f840: 57 de 18 38 rlwinm r30,r30,3,0,28 /* * If all of the flags are set we have permission * to do this. */ if ( ( flags_to_test & jnode->st_mode) == flags_to_test ) ffc0f844: 80 7f 00 30 lwz r3,48(r31) ffc0f848: 7f c3 18 38 and r3,r30,r3 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 ); ffc0f84c: 7c 63 f2 78 xor r3,r3,r30 ffc0f850: 7c 63 00 34 cntlzw r3,r3 ffc0f854: 54 63 d9 7e rlwinm r3,r3,27,5,31 */ if ( ( flags_to_test & jnode->st_mode) == flags_to_test ) return 1; return 0; } ffc0f858: 39 61 00 18 addi r11,r1,24 ffc0f85c: 48 00 99 4c b ffc191a8 <_restgpr_29_x> =============================================================================== ffc13988 : int IMFS_fchmod( rtems_filesystem_location_info_t *loc, mode_t mode ) { ffc13988: 94 21 ff e0 stwu r1,-32(r1) ffc1398c: 7c 08 02 a6 mflr r0 ffc13990: 90 01 00 24 stw r0,36(r1) ffc13994: bf c1 00 18 stmw r30,24(r1) ffc13998: 7c 9e 23 78 mr r30,r4 IMFS_jnode_t *jnode; #if defined(RTEMS_POSIX_API) uid_t st_uid; #endif jnode = loc->node_access; ffc1399c: 83 e3 00 00 lwz r31,0(r3) /* * Verify I am the owner of the node or the super user. */ #if defined(RTEMS_POSIX_API) st_uid = geteuid(); ffc139a0: 4b ff ca d1 bl ffc10470 if ( ( st_uid != jnode->st_uid ) && ( st_uid != 0 ) ) ffc139a4: a0 1f 00 3c lhz r0,60(r31) ffc139a8: 7f 80 18 00 cmpw cr7,r0,r3 ffc139ac: 41 9e 00 20 beq- cr7,ffc139cc ffc139b0: 2f 83 00 00 cmpwi cr7,r3,0 ffc139b4: 41 be 00 18 beq+ cr7,ffc139cc <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EPERM ); ffc139b8: 48 00 09 01 bl ffc142b8 <__errno> ffc139bc: 38 00 00 01 li r0,1 ffc139c0: 90 03 00 00 stw r0,0(r3) ffc139c4: 38 60 ff ff li r3,-1 ffc139c8: 48 00 00 30 b ffc139f8 /* * Change only the RWX permissions on the jnode to mode. */ jnode->st_mode &= ~(S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID | S_ISVTX); ffc139cc: 80 1f 00 30 lwz r0,48(r31) jnode->st_mode |= mode & (S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID | S_ISVTX); ffc139d0: 57 de 05 3e clrlwi r30,r30,20 IMFS_update_ctime( jnode ); ffc139d4: 38 61 00 08 addi r3,r1,8 /* * Change only the RWX permissions on the jnode to mode. */ jnode->st_mode &= ~(S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID | S_ISVTX); ffc139d8: 54 00 00 26 rlwinm r0,r0,0,0,19 jnode->st_mode |= mode & (S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID | S_ISVTX); ffc139dc: 7f de 03 78 or r30,r30,r0 ffc139e0: 93 df 00 30 stw r30,48(r31) IMFS_update_ctime( jnode ); ffc139e4: 38 80 00 00 li r4,0 ffc139e8: 4b ff 17 fd bl ffc051e4 ffc139ec: 80 01 00 08 lwz r0,8(r1) return 0; ffc139f0: 38 60 00 00 li r3,0 */ jnode->st_mode &= ~(S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID | S_ISVTX); jnode->st_mode |= mode & (S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID | S_ISVTX); IMFS_update_ctime( jnode ); ffc139f4: 90 1f 00 48 stw r0,72(r31) return 0; } ffc139f8: 39 61 00 20 addi r11,r1,32 ffc139fc: 48 00 57 b0 b ffc191ac <_restgpr_30_x> =============================================================================== ffc04d20 : rtems_off64_t IMFS_fifo_lseek( rtems_libio_t *iop, rtems_off64_t offset, int whence ) { ffc04d20: 7c 2b 0b 78 mr r11,r1 ffc04d24: 7c 08 02 a6 mflr r0 ffc04d28: 94 21 ff f0 stwu r1,-16(r1) ffc04d2c: 7c 68 1b 78 mr r8,r3 ffc04d30: 90 01 00 14 stw r0,20(r1) ffc04d34: 48 01 c6 bd bl ffc213f0 <_savegpr_31> off_t err = pipe_lseek(LIBIO2PIPE(iop), offset, whence, iop); ffc04d38: 81 23 00 1c lwz r9,28(r3) ffc04d3c: 80 69 00 50 lwz r3,80(r9) ffc04d40: 48 00 a4 99 bl ffc0f1d8 IMFS_FIFO_RETURN(err); ffc04d44: 7c 69 fe 71 srawi. r9,r3,31 rtems_libio_t *iop, rtems_off64_t offset, int whence ) { off_t err = pipe_lseek(LIBIO2PIPE(iop), offset, whence, iop); ffc04d48: 7c 7f 1b 78 mr r31,r3 IMFS_FIFO_RETURN(err); ffc04d4c: 41 80 00 0c blt- ffc04d58 <== ALWAYS TAKEN ffc04d50: 7c 6a 1b 78 mr r10,r3 <== NOT EXECUTED ffc04d54: 48 00 00 18 b ffc04d6c <== NOT EXECUTED ffc04d58: 48 00 da 1d bl ffc12774 <__errno> ffc04d5c: 7f ff 00 d0 neg r31,r31 ffc04d60: 93 e3 00 00 stw r31,0(r3) ffc04d64: 39 20 ff ff li r9,-1 ffc04d68: 39 40 ff ff li r10,-1 } ffc04d6c: 39 61 00 10 addi r11,r1,16 ffc04d70: 7d 23 4b 78 mr r3,r9 ffc04d74: 7d 44 53 78 mr r4,r10 ffc04d78: 48 01 c6 c4 b ffc2143c <_restgpr_31_x> =============================================================================== ffc04e08 : ssize_t IMFS_fifo_write( rtems_libio_t *iop, const void *buffer, size_t count ) { ffc04e08: 94 21 ff e0 stwu r1,-32(r1) ffc04e0c: 7c 08 02 a6 mflr r0 ffc04e10: 7c 66 1b 78 mr r6,r3 ffc04e14: 90 01 00 24 stw r0,36(r1) ffc04e18: bf c1 00 18 stmw r30,24(r1) IMFS_jnode_t *jnode = iop->pathinfo.node_access; ffc04e1c: 83 e3 00 1c lwz r31,28(r3) int err = pipe_write(JNODE2PIPE(jnode), buffer, count, iop); ffc04e20: 80 7f 00 50 lwz r3,80(r31) ffc04e24: 48 00 a1 59 bl ffc0ef7c if (err > 0) { ffc04e28: 7c 7e 1b 79 mr. r30,r3 ffc04e2c: 40 81 00 24 ble- ffc04e50 IMFS_mtime_ctime_update(jnode); ffc04e30: 38 61 00 08 addi r3,r1,8 ffc04e34: 38 80 00 00 li r4,0 ffc04e38: 48 00 11 f1 bl ffc06028 ffc04e3c: 80 01 00 08 lwz r0,8(r1) ffc04e40: 7f c3 f3 78 mr r3,r30 ffc04e44: 90 1f 00 44 stw r0,68(r31) ffc04e48: 90 1f 00 48 stw r0,72(r31) ffc04e4c: 48 00 00 20 b ffc04e6c } IMFS_FIFO_RETURN(err); ffc04e50: 41 a2 00 18 beq+ ffc04e68 <== NEVER TAKEN ffc04e54: 48 00 d9 21 bl ffc12774 <__errno> ffc04e58: 7f de 00 d0 neg r30,r30 ffc04e5c: 93 c3 00 00 stw r30,0(r3) ffc04e60: 38 60 ff ff li r3,-1 ffc04e64: 48 00 00 08 b ffc04e6c ffc04e68: 38 60 00 00 li r3,0 <== NOT EXECUTED } ffc04e6c: 39 61 00 20 addi r11,r1,32 ffc04e70: 48 01 c5 c8 b ffc21438 <_restgpr_30_x> =============================================================================== ffc0ff70 : IMFS_jnode_t *IMFS_find_match_in_dir( IMFS_jnode_t *directory, char *name ) { ffc0ff70: 94 21 ff e8 stwu r1,-24(r1) ffc0ff74: 7c 08 02 a6 mflr r0 ffc0ff78: bf a1 00 0c stmw r29,12(r1) /* * Check for "." and ".." */ if ( !strcmp( name, dotname ) ) ffc0ff7c: 3f c0 ff c2 lis r30,-62 ffc0ff80: 3b de ad 04 addi r30,r30,-21244 IMFS_jnode_t *IMFS_find_match_in_dir( IMFS_jnode_t *directory, char *name ) { ffc0ff84: 7c 7f 1b 78 mr r31,r3 ffc0ff88: 90 01 00 1c stw r0,28(r1) /* * Check for "." and ".." */ if ( !strcmp( name, dotname ) ) ffc0ff8c: 7c 83 23 78 mr r3,r4 IMFS_jnode_t *IMFS_find_match_in_dir( IMFS_jnode_t *directory, char *name ) { ffc0ff90: 7c 9d 23 78 mr r29,r4 /* * Check for "." and ".." */ if ( !strcmp( name, dotname ) ) ffc0ff94: 7f c4 f3 78 mr r4,r30 ffc0ff98: 48 00 52 fd bl ffc15294 ffc0ff9c: 2f 83 00 00 cmpwi cr7,r3,0 ffc0ffa0: 41 9e 00 58 beq- cr7,ffc0fff8 <== NEVER TAKEN return directory; if ( !strcmp( name, dotdotname ) ) ffc0ffa4: 7f a3 eb 78 mr r3,r29 ffc0ffa8: 38 9e 00 04 addi r4,r30,4 ffc0ffac: 48 00 52 e9 bl ffc15294 ffc0ffb0: 2f 83 00 00 cmpwi cr7,r3,0 ffc0ffb4: 40 9e 00 0c bne- cr7,ffc0ffc0 <== ALWAYS TAKEN return directory->Parent; ffc0ffb8: 83 ff 00 08 lwz r31,8(r31) <== NOT EXECUTED ffc0ffbc: 48 00 00 3c b ffc0fff8 <== NOT EXECUTED if ( !strcmp( name, the_jnode->name ) ) return the_jnode; } return 0; } ffc0ffc0: 83 df 00 50 lwz r30,80(r31) RTEMS_INLINE_ROUTINE bool _Chain_Is_tail( Chain_Control *the_chain, const Chain_Node *the_node ) { return (the_node == _Chain_Tail(the_chain)); ffc0ffc4: 3b ff 00 54 addi r31,r31,84 if ( !strcmp( name, dotdotname ) ) return directory->Parent; the_chain = &directory->info.directory.Entries; for ( the_node = rtems_chain_first( the_chain ); ffc0ffc8: 48 00 00 1c b ffc0ffe4 !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 ) ) ffc0ffcc: 7f a3 eb 78 mr r3,r29 ffc0ffd0: 38 9e 00 0c addi r4,r30,12 ffc0ffd4: 48 00 52 c1 bl ffc15294 ffc0ffd8: 2f 83 00 00 cmpwi cr7,r3,0 ffc0ffdc: 41 9e 00 18 beq- cr7,ffc0fff4 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 ) { ffc0ffe0: 83 de 00 00 lwz r30,0(r30) if ( !strcmp( name, dotdotname ) ) return directory->Parent; the_chain = &directory->info.directory.Entries; for ( the_node = rtems_chain_first( the_chain ); ffc0ffe4: 7f 9e f8 00 cmpw cr7,r30,r31 ffc0ffe8: 40 9e ff e4 bne+ cr7,ffc0ffcc if ( !strcmp( name, the_jnode->name ) ) return the_jnode; } return 0; ffc0ffec: 3b e0 00 00 li r31,0 ffc0fff0: 48 00 00 08 b ffc0fff8 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; ffc0fff4: 7f df f3 78 mr r31,r30 if ( !strcmp( name, the_jnode->name ) ) return the_jnode; } return 0; } ffc0fff8: 39 61 00 18 addi r11,r1,24 ffc0fffc: 7f e3 fb 78 mr r3,r31 ffc10000: 48 00 91 a8 b ffc191a8 <_restgpr_29_x> =============================================================================== ffc0feb4 : ((IMFS_jnode_t *)( rtems_chain_head( jnode_get_control( jnode ) )->next)) int IMFS_fsunmount( rtems_filesystem_mount_table_entry_t *temp_mt_entry ) { ffc0feb4: 94 21 ff c8 stwu r1,-56(r1) ffc0feb8: 7c 08 02 a6 mflr r0 /* * 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; ffc0febc: 7c 6b 1b 78 mr r11,r3 ((IMFS_jnode_t *)( rtems_chain_head( jnode_get_control( jnode ) )->next)) int IMFS_fsunmount( rtems_filesystem_mount_table_entry_t *temp_mt_entry ) { ffc0fec0: 90 01 00 3c stw r0,60(r1) * 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; loc = temp_mt_entry->mt_fs_root; ffc0fec4: 38 81 00 08 addi r4,r1,8 /* * Set this to null to indicate that it is being unmounted. */ temp_mt_entry->mt_fs_root.node_access = NULL; ffc0fec8: 38 00 00 00 li r0,0 ((IMFS_jnode_t *)( rtems_chain_head( jnode_get_control( jnode ) )->next)) int IMFS_fsunmount( rtems_filesystem_mount_table_entry_t *temp_mt_entry ) { ffc0fecc: bf a1 00 2c stmw r29,44(r1) temp_mt_entry->mt_fs_root.node_access = NULL; do { next = jnode->Parent; loc.node_access = (void *)jnode; IMFS_Set_handlers( &loc ); ffc0fed0: 7c 9e 23 78 mr r30,r4 /* * 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; ffc0fed4: 87 eb 00 1c lwzu r31,28(r11) loc = temp_mt_entry->mt_fs_root; ffc0fed8: 7c ab a4 aa lswi r5,r11,20 ffc0fedc: 7c a4 a5 aa stswi r5,r4,20 /* * Set this to null to indicate that it is being unmounted. */ temp_mt_entry->mt_fs_root.node_access = NULL; ffc0fee0: 90 03 00 1c stw r0,28(r3) do { next = jnode->Parent; loc.node_access = (void *)jnode; IMFS_Set_handlers( &loc ); ffc0fee4: 7f c3 f3 78 mr r3,r30 */ temp_mt_entry->mt_fs_root.node_access = NULL; do { next = jnode->Parent; ffc0fee8: 83 bf 00 08 lwz r29,8(r31) loc.node_access = (void *)jnode; ffc0feec: 93 e1 00 08 stw r31,8(r1) IMFS_Set_handlers( &loc ); ffc0fef0: 4b ff f8 81 bl ffc0f770 if ( jnode->type != IMFS_DIRECTORY ) { ffc0fef4: 80 1f 00 4c lwz r0,76(r31) ffc0fef8: 2f 80 00 01 cmpwi cr7,r0,1 ffc0fefc: 40 9e 00 14 bne- cr7,ffc0ff10 result = IMFS_unlink( NULL, &loc ); if (result != 0) return -1; jnode = next; } else if ( jnode_has_no_children( jnode ) ) { ffc0ff00: 81 3f 00 50 lwz r9,80(r31) RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); ffc0ff04: 38 1f 00 54 addi r0,r31,84 ffc0ff08: 7f 89 00 00 cmpw cr7,r9,r0 ffc0ff0c: 40 be 00 1c bne+ cr7,ffc0ff28 result = IMFS_unlink( NULL, &loc ); ffc0ff10: 38 60 00 00 li r3,0 ffc0ff14: 7f c4 f3 78 mr r4,r30 ffc0ff18: 4b ff 4c 55 bl ffc04b6c if (result != 0) ffc0ff1c: 2f 83 00 00 cmpwi cr7,r3,0 ffc0ff20: 40 9e 00 3c bne- cr7,ffc0ff5c <== NEVER TAKEN return -1; jnode = next; ffc0ff24: 7f bf eb 78 mr r31,r29 } if ( jnode != NULL ) { ffc0ff28: 2f 9f 00 00 cmpwi cr7,r31,0 ffc0ff2c: 41 9e 00 38 beq- cr7,ffc0ff64 if ( jnode->type == IMFS_DIRECTORY ) { ffc0ff30: 80 1f 00 4c lwz r0,76(r31) ffc0ff34: 2f 80 00 01 cmpwi cr7,r0,1 ffc0ff38: 40 9e ff ac bne+ cr7,ffc0fee4 <== NEVER TAKEN } } } while (jnode != NULL); return 0; } ffc0ff3c: 80 1f 00 50 lwz r0,80(r31) ffc0ff40: 39 3f 00 54 addi r9,r31,84 return -1; jnode = next; } if ( jnode != NULL ) { if ( jnode->type == IMFS_DIRECTORY ) { if ( jnode_has_children( jnode ) ) ffc0ff44: 7f 80 48 00 cmpw cr7,r0,r9 ffc0ff48: 41 be ff 9c beq- cr7,ffc0fee4 jnode = jnode_get_first_child( jnode ); } } } while (jnode != NULL); ffc0ff4c: 2f 80 00 00 cmpwi cr7,r0,0 ffc0ff50: 7c 1f 03 78 mr r31,r0 ffc0ff54: 40 9e ff 90 bne+ cr7,ffc0fee4 <== ALWAYS TAKEN ffc0ff58: 48 00 00 0c b ffc0ff64 <== NOT EXECUTED return -1; jnode = next; } else if ( jnode_has_no_children( jnode ) ) { result = IMFS_unlink( NULL, &loc ); if (result != 0) return -1; ffc0ff5c: 38 60 ff ff li r3,-1 <== NOT EXECUTED ffc0ff60: 48 00 00 08 b ffc0ff68 <== NOT EXECUTED jnode = jnode_get_first_child( jnode ); } } } while (jnode != NULL); return 0; ffc0ff64: 38 60 00 00 li r3,0 } ffc0ff68: 39 61 00 38 addi r11,r1,56 ffc0ff6c: 48 00 92 3c b ffc191a8 <_restgpr_29_x> =============================================================================== ffc10004 : const char *path, int pathlen, char *token, int *token_len ) { ffc10004: 94 21 ff e0 stwu r1,-32(r1) ffc10008: 7c 08 02 a6 mflr r0 ffc1000c: bf 41 00 08 stmw r26,8(r1) ffc10010: 7c 7f 1b 78 mr r31,r3 ffc10014: 7c 9d 23 78 mr r29,r4 ffc10018: 90 01 00 24 stw r0,36(r1) ffc1001c: 7c be 2b 78 mr r30,r5 ffc10020: 7c da 33 78 mr r26,r6 register char c; /* * Copy a name into token. (Remember NULL is a token.) */ c = path[i]; ffc10024: 8b 63 00 00 lbz r27,0(r3) int pathlen, char *token, int *token_len ) { register int i = 0; ffc10028: 3b 80 00 00 li r28,0 /* * Copy a name into token. (Remember NULL is a token.) */ c = path[i]; while ( (!IMFS_is_separator(c)) && (i < pathlen) && (i <= IMFS_NAME_MAX) ) { ffc1002c: 48 00 00 18 b ffc10044 token[i] = c; if ( i == IMFS_NAME_MAX ) ffc10030: 2f 9c 00 20 cmpwi cr7,r28,32 * Copy a name into token. (Remember NULL is a token.) */ c = path[i]; while ( (!IMFS_is_separator(c)) && (i < pathlen) && (i <= IMFS_NAME_MAX) ) { token[i] = c; ffc10034: 7f 7e e1 ae stbx r27,r30,r28 if ( i == IMFS_NAME_MAX ) ffc10038: 41 9e 00 b4 beq- cr7,ffc100ec return IMFS_INVALID_TOKEN; if ( !IMFS_is_valid_name_char(c) ) type = IMFS_INVALID_TOKEN; c = path [++i]; ffc1003c: 3b 9c 00 01 addi r28,r28,1 ffc10040: 7f 7f e0 ae lbzx r27,r31,r28 /* * Copy a name into token. (Remember NULL is a token.) */ c = path[i]; while ( (!IMFS_is_separator(c)) && (i < pathlen) && (i <= IMFS_NAME_MAX) ) { ffc10044: 7f 63 db 78 mr r3,r27 ffc10048: 4b ff 61 c1 bl ffc06208 ffc1004c: 2f 83 00 00 cmpwi cr7,r3,0 ffc10050: 40 9e 00 0c bne- cr7,ffc1005c ffc10054: 7f 9c e8 00 cmpw cr7,r28,r29 ffc10058: 41 9c ff d8 blt+ cr7,ffc10030 /* * Copy a seperator into token. */ if ( i == 0 ) { ffc1005c: 2f 9c 00 00 cmpwi cr7,r28,0 ffc10060: 40 9e 00 24 bne- cr7,ffc10084 token[i] = c; if ( (token[i] != '\0') && pathlen ) { ffc10064: 2f 9b 00 00 cmpwi cr7,r27,0 /* * Copy a seperator into token. */ if ( i == 0 ) { token[i] = c; ffc10068: 9b 7e 00 00 stb r27,0(r30) if ( (token[i] != '\0') && pathlen ) { i++; type = IMFS_CURRENT_DIR; } else { type = IMFS_NO_MORE_PATH; ffc1006c: 3b e0 00 00 li r31,0 */ if ( i == 0 ) { token[i] = c; if ( (token[i] != '\0') && pathlen ) { ffc10070: 41 9e 00 3c beq- cr7,ffc100ac ffc10074: 2f 9d 00 00 cmpwi cr7,r29,0 i++; type = IMFS_CURRENT_DIR; } else { type = IMFS_NO_MORE_PATH; ffc10078: 7f 9f e3 78 mr r31,r28 */ if ( i == 0 ) { token[i] = c; if ( (token[i] != '\0') && pathlen ) { ffc1007c: 41 9e 00 30 beq- cr7,ffc100ac ffc10080: 48 00 00 24 b ffc100a4 i++; type = IMFS_CURRENT_DIR; } else { type = IMFS_NO_MORE_PATH; } } else if (token[ i-1 ] != '\0') { ffc10084: 7d 3e e2 14 add r9,r30,r28 ffc10088: 88 09 ff ff lbz r0,-1(r9) char *token, int *token_len ) { register int i = 0; IMFS_token_types type = IMFS_NAME; ffc1008c: 3b e0 00 03 li r31,3 i++; type = IMFS_CURRENT_DIR; } else { type = IMFS_NO_MORE_PATH; } } else if (token[ i-1 ] != '\0') { ffc10090: 2f 80 00 00 cmpwi cr7,r0,0 ffc10094: 41 9e 00 18 beq- cr7,ffc100ac <== NEVER TAKEN token[i] = '\0'; ffc10098: 38 00 00 00 li r0,0 ffc1009c: 7c 1e e1 ae stbx r0,r30,r28 ffc100a0: 48 00 00 0c b ffc100ac if ( i == 0 ) { token[i] = c; if ( (token[i] != '\0') && pathlen ) { i++; type = IMFS_CURRENT_DIR; ffc100a4: 3b e0 00 01 li r31,1 if ( i == 0 ) { token[i] = c; if ( (token[i] != '\0') && pathlen ) { i++; ffc100a8: 3b 80 00 01 li r28,1 /* * If we copied something that was not a seperator see if * it was a special name. */ if ( type == IMFS_NAME ) { ffc100ac: 2f 9f 00 03 cmpwi cr7,r31,3 /* * Set token_len to the number of characters copied. */ *token_len = i; ffc100b0: 93 9a 00 00 stw r28,0(r26) /* * If we copied something that was not a seperator see if * it was a special name. */ if ( type == IMFS_NAME ) { ffc100b4: 40 be 00 4c bne+ cr7,ffc10100 if ( strcmp( token, "..") == 0 ) ffc100b8: 3c 80 ff c2 lis r4,-62 ffc100bc: 7f c3 f3 78 mr r3,r30 ffc100c0: 38 84 ad 0b addi r4,r4,-21237 ffc100c4: 48 00 51 d1 bl ffc15294 ffc100c8: 2f 83 00 00 cmpwi cr7,r3,0 ffc100cc: 41 9e 00 28 beq- cr7,ffc100f4 type = IMFS_UP_DIR; else if ( strcmp( token, "." ) == 0 ) ffc100d0: 3c 80 ff c2 lis r4,-62 ffc100d4: 7f c3 f3 78 mr r3,r30 ffc100d8: 38 84 ad 0c addi r4,r4,-21236 ffc100dc: 48 00 51 b9 bl ffc15294 ffc100e0: 2f 83 00 00 cmpwi cr7,r3,0 ffc100e4: 41 9e 00 18 beq- cr7,ffc100fc ffc100e8: 48 00 00 18 b ffc10100 while ( (!IMFS_is_separator(c)) && (i < pathlen) && (i <= IMFS_NAME_MAX) ) { token[i] = c; if ( i == IMFS_NAME_MAX ) return IMFS_INVALID_TOKEN; ffc100ec: 3b e0 00 04 li r31,4 ffc100f0: 48 00 00 10 b ffc10100 * it was a special name. */ if ( type == IMFS_NAME ) { if ( strcmp( token, "..") == 0 ) type = IMFS_UP_DIR; ffc100f4: 3b e0 00 02 li r31,2 ffc100f8: 48 00 00 08 b ffc10100 else if ( strcmp( token, "." ) == 0 ) type = IMFS_CURRENT_DIR; ffc100fc: 3b e0 00 01 li r31,1 } return type; } ffc10100: 39 61 00 20 addi r11,r1,32 ffc10104: 7f e3 fb 78 mr r3,r31 ffc10108: 48 00 90 94 b ffc1919c <_restgpr_26_x> =============================================================================== ffc12edc : */ MEMFILE_STATIC int IMFS_memfile_extend( IMFS_jnode_t *the_jnode, off_t new_length ) { ffc12edc: 94 21 ff d8 stwu r1,-40(r1) IMFS_assert( the_jnode->type == IMFS_MEMORY_FILE ); /* * Verify new file size is supported */ if ( new_length >= IMFS_MEMFILE_MAXIMUM_SIZE ) ffc12ee0: 3d 20 00 00 lis r9,0 */ MEMFILE_STATIC int IMFS_memfile_extend( IMFS_jnode_t *the_jnode, off_t new_length ) { ffc12ee4: 7c 08 02 a6 mflr r0 ffc12ee8: bf 01 00 08 stmw r24,8(r1) ffc12eec: 7c 7f 1b 78 mr r31,r3 ffc12ef0: 7c bc 2b 78 mr r28,r5 IMFS_assert( the_jnode->type == IMFS_MEMORY_FILE ); /* * Verify new file size is supported */ if ( new_length >= IMFS_MEMFILE_MAXIMUM_SIZE ) ffc12ef4: 83 c9 27 e4 lwz r30,10212(r9) */ MEMFILE_STATIC int IMFS_memfile_extend( IMFS_jnode_t *the_jnode, off_t new_length ) { ffc12ef8: 7c dd 33 78 mr r29,r6 ffc12efc: 90 01 00 2c stw r0,44(r1) IMFS_assert( the_jnode->type == IMFS_MEMORY_FILE ); /* * Verify new file size is supported */ if ( new_length >= IMFS_MEMFILE_MAXIMUM_SIZE ) ffc12f00: 57 c9 f0 be rlwinm r9,r30,30,2,31 ffc12f04: 39 69 00 01 addi r11,r9,1 ffc12f08: 7d 6b 49 d6 mullw r11,r11,r9 ffc12f0c: 38 0b 00 01 addi r0,r11,1 ffc12f10: 7d 20 49 d6 mullw r9,r0,r9 ffc12f14: 38 00 00 00 li r0,0 ffc12f18: 7f 80 28 00 cmpw cr7,r0,r5 ffc12f1c: 39 29 ff ff addi r9,r9,-1 ffc12f20: 7d 29 f1 d6 mullw r9,r9,r30 ffc12f24: 41 bd 00 1c bgt+ cr7,ffc12f40 <== NEVER TAKEN ffc12f28: 40 9e 00 0c bne- cr7,ffc12f34 <== NEVER TAKEN ffc12f2c: 7f 89 30 40 cmplw cr7,r9,r6 ffc12f30: 41 bd 00 10 bgt+ cr7,ffc12f40 rtems_set_errno_and_return_minus_one( EINVAL ); ffc12f34: 48 00 13 85 bl ffc142b8 <__errno> ffc12f38: 38 00 00 16 li r0,22 ffc12f3c: 48 00 00 94 b ffc12fd0 /* * Verify new file size is actually larger than current size */ if ( new_length <= the_jnode->info.file.size ) ffc12f40: 83 3f 00 50 lwz r25,80(r31) ffc12f44: 83 5f 00 54 lwz r26,84(r31) ffc12f48: 7f 9c c8 00 cmpw cr7,r28,r25 ffc12f4c: 41 bd 00 10 bgt+ cr7,ffc12f5c <== NEVER TAKEN ffc12f50: 40 9e 00 a0 bne- cr7,ffc12ff0 <== NEVER TAKEN ffc12f54: 7f 9d d0 40 cmplw cr7,r29,r26 ffc12f58: 40 9d 00 98 ble- cr7,ffc12ff0 return 0; /* * Calculate the number of range of blocks to allocate */ new_blocks = new_length / IMFS_MEMFILE_BYTES_PER_BLOCK; ffc12f5c: 7f db fe 70 srawi r27,r30,31 ffc12f60: 7f 65 db 78 mr r5,r27 ffc12f64: 7f c6 f3 78 mr r6,r30 ffc12f68: 7f 83 e3 78 mr r3,r28 ffc12f6c: 7f a4 eb 78 mr r4,r29 ffc12f70: 48 00 52 2d bl ffc1819c <__divdi3> old_blocks = the_jnode->info.file.size / IMFS_MEMFILE_BYTES_PER_BLOCK; ffc12f74: 7f 65 db 78 mr r5,r27 ffc12f78: 7f c6 f3 78 mr r6,r30 return 0; /* * Calculate the number of range of blocks to allocate */ new_blocks = new_length / IMFS_MEMFILE_BYTES_PER_BLOCK; ffc12f7c: 7c 98 23 78 mr r24,r4 old_blocks = the_jnode->info.file.size / IMFS_MEMFILE_BYTES_PER_BLOCK; ffc12f80: 7f 23 cb 78 mr r3,r25 ffc12f84: 7f 44 d3 78 mr r4,r26 ffc12f88: 48 00 52 15 bl ffc1819c <__divdi3> ffc12f8c: 7c 9b 23 78 mr r27,r4 /* * Now allocate each of those blocks. */ for ( block=old_blocks ; block<=new_blocks ; block++ ) { ffc12f90: 7c 9e 23 78 mr r30,r4 ffc12f94: 48 00 00 4c b ffc12fe0 if ( IMFS_memfile_addblock( the_jnode, block ) ) { ffc12f98: 7f e3 fb 78 mr r3,r31 ffc12f9c: 7f c4 f3 78 mr r4,r30 ffc12fa0: 4b ff fc e9 bl ffc12c88 ffc12fa4: 2f 83 00 00 cmpwi cr7,r3,0 ffc12fa8: 41 be 00 34 beq+ cr7,ffc12fdc ffc12fac: 48 00 00 14 b ffc12fc0 for ( ; block>=old_blocks ; block-- ) { IMFS_memfile_remove_block( the_jnode, block ); ffc12fb0: 7f c4 f3 78 mr r4,r30 ffc12fb4: 7f e3 fb 78 mr r3,r31 ffc12fb8: 4b ff fe e9 bl ffc12ea0 /* * 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-- ) { ffc12fbc: 3b de ff ff addi r30,r30,-1 ffc12fc0: 7f 9e d8 40 cmplw cr7,r30,r27 ffc12fc4: 40 9c ff ec bge+ cr7,ffc12fb0 IMFS_memfile_remove_block( the_jnode, block ); } rtems_set_errno_and_return_minus_one( ENOSPC ); ffc12fc8: 48 00 12 f1 bl ffc142b8 <__errno> ffc12fcc: 38 00 00 1c li r0,28 ffc12fd0: 90 03 00 00 stw r0,0(r3) ffc12fd4: 38 60 ff ff li r3,-1 ffc12fd8: 48 00 00 1c b ffc12ff4 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++ ) { ffc12fdc: 3b de 00 01 addi r30,r30,1 ffc12fe0: 7f 9e c0 40 cmplw cr7,r30,r24 ffc12fe4: 40 9d ff b4 ble+ cr7,ffc12f98 } /* * Set the new length of the file. */ the_jnode->info.file.size = new_length; ffc12fe8: 93 9f 00 50 stw r28,80(r31) ffc12fec: 93 bf 00 54 stw r29,84(r31) /* * Verify new file size is actually larger than current size */ if ( new_length <= the_jnode->info.file.size ) return 0; ffc12ff0: 38 60 00 00 li r3,0 /* * Set the new length of the file. */ the_jnode->info.file.size = new_length; return 0; } ffc12ff4: 39 61 00 28 addi r11,r1,40 ffc12ff8: 48 00 61 9c b ffc19194 <_restgpr_24_x> =============================================================================== ffc1289c : my_block = block; /* * Is the block number in the simple indirect portion? */ if ( my_block <= LAST_INDIRECT ) { ffc1289c: 3d 20 00 00 lis r9,0 #endif IMFS_jnode_t *the_jnode, unsigned int block, int malloc_it ) { ffc128a0: 94 21 ff e0 stwu r1,-32(r1) ffc128a4: 7c 08 02 a6 mflr r0 my_block = block; /* * Is the block number in the simple indirect portion? */ if ( my_block <= LAST_INDIRECT ) { ffc128a8: 81 29 27 e4 lwz r9,10212(r9) #endif IMFS_jnode_t *the_jnode, unsigned int block, int malloc_it ) { ffc128ac: 90 01 00 24 stw r0,36(r1) my_block = block; /* * Is the block number in the simple indirect portion? */ if ( my_block <= LAST_INDIRECT ) { ffc128b0: 55 29 f0 be rlwinm r9,r9,30,2,31 ffc128b4: 38 09 ff ff addi r0,r9,-1 #endif IMFS_jnode_t *the_jnode, unsigned int block, int malloc_it ) { ffc128b8: bf 61 00 0c stmw r27,12(r1) my_block = block; /* * Is the block number in the simple indirect portion? */ if ( my_block <= LAST_INDIRECT ) { ffc128bc: 7f 84 00 40 cmplw cr7,r4,r0 #endif IMFS_jnode_t *the_jnode, unsigned int block, int malloc_it ) { ffc128c0: 7c 7f 1b 78 mr r31,r3 ffc128c4: 7c 9e 23 78 mr r30,r4 my_block = block; /* * Is the block number in the simple indirect portion? */ if ( my_block <= LAST_INDIRECT ) { ffc128c8: 41 9d 00 44 bgt- cr7,ffc1290c p = info->indirect; if ( malloc_it ) { ffc128cc: 2f 05 00 00 cmpwi cr6,r5,0 /* * Is the block number in the simple indirect portion? */ if ( my_block <= LAST_INDIRECT ) { p = info->indirect; ffc128d0: 80 03 00 58 lwz r0,88(r3) ffc128d4: 2f 80 00 00 cmpwi cr7,r0,0 if ( malloc_it ) { ffc128d8: 41 9a 00 2c beq- cr6,ffc12904 if ( !p ) { ffc128dc: 40 be 00 18 bne+ cr7,ffc128f4 p = memfile_alloc_block(); ffc128e0: 4b ff ff 79 bl ffc12858 if ( !p ) return 0; ffc128e4: 3b a0 00 00 li r29,0 if ( malloc_it ) { if ( !p ) { p = memfile_alloc_block(); if ( !p ) ffc128e8: 2c 03 00 00 cmpwi r3,0 ffc128ec: 41 82 01 78 beq- ffc12a64 <== NEVER TAKEN return 0; info->indirect = p; ffc128f0: 90 7f 00 58 stw r3,88(r31) } return &info->indirect[ my_block ]; ffc128f4: 83 bf 00 58 lwz r29,88(r31) ffc128f8: 57 de 10 3a rlwinm r30,r30,2,0,29 ffc128fc: 7f bd f2 14 add r29,r29,r30 ffc12900: 48 00 01 64 b ffc12a64 } if ( !p ) ffc12904: 40 be 01 50 bne+ cr7,ffc12a54 <== ALWAYS TAKEN ffc12908: 48 00 01 58 b ffc12a60 <== NOT EXECUTED /* * Is the block number in the doubly indirect portion? */ if ( my_block <= LAST_DOUBLY_INDIRECT ) { ffc1290c: 39 69 00 01 addi r11,r9,1 ffc12910: 7d 6b 49 d6 mullw r11,r11,r9 ffc12914: 38 0b ff ff addi r0,r11,-1 ffc12918: 7f 84 00 40 cmplw cr7,r4,r0 ffc1291c: 41 9d 00 60 bgt- cr7,ffc1297c my_block -= FIRST_DOUBLY_INDIRECT; ffc12920: 7f c9 20 50 subf r30,r9,r4 singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; p = info->doubly_indirect; ffc12924: 80 63 00 5c lwz r3,92(r3) */ if ( my_block <= LAST_DOUBLY_INDIRECT ) { my_block -= FIRST_DOUBLY_INDIRECT; singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; ffc12928: 7f 9e 4b 96 divwu r28,r30,r9 doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; p = info->doubly_indirect; if ( malloc_it ) { ffc1292c: 2f 05 00 00 cmpwi cr6,r5,0 */ if ( my_block <= LAST_DOUBLY_INDIRECT ) { my_block -= FIRST_DOUBLY_INDIRECT; singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; ffc12930: 7d 3c 49 d6 mullw r9,r28,r9 ffc12934: 2f 83 00 00 cmpwi cr7,r3,0 ffc12938: 7f c9 f0 50 subf r30,r9,r30 doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; p = info->doubly_indirect; if ( malloc_it ) { ffc1293c: 41 9a 00 2c beq- cr6,ffc12968 if ( !p ) { ffc12940: 40 be 00 18 bne+ cr7,ffc12958 p = memfile_alloc_block(); ffc12944: 4b ff ff 15 bl ffc12858 if ( !p ) return 0; ffc12948: 3b a0 00 00 li r29,0 p = info->doubly_indirect; if ( malloc_it ) { if ( !p ) { p = memfile_alloc_block(); if ( !p ) ffc1294c: 2c 03 00 00 cmpwi r3,0 ffc12950: 41 82 01 14 beq- ffc12a64 <== NEVER TAKEN return 0; info->doubly_indirect = p; ffc12954: 90 7f 00 5c stw r3,92(r31) } p1 = (block_p *)p[ doubly ]; ffc12958: 57 9c 10 3a rlwinm r28,r28,2,0,29 ffc1295c: 7f e3 e2 14 add r31,r3,r28 ffc12960: 7c 63 e0 2e lwzx r3,r3,r28 ffc12964: 48 00 00 a4 b ffc12a08 } return (block_p *)&p1[ singly ]; } if ( !p ) ffc12968: 41 be 00 f8 beq+ cr7,ffc12a60 <== NEVER TAKEN return 0; p = (block_p *)p[ doubly ]; ffc1296c: 57 9c 10 3a rlwinm r28,r28,2,0,29 ffc12970: 7c 03 e0 2e lwzx r0,r3,r28 if ( !p ) return 0; ffc12974: 3b a0 00 00 li r29,0 ffc12978: 48 00 00 d4 b ffc12a4c } /* * Is the block number in the triply indirect portion? */ if ( my_block <= LAST_TRIPLY_INDIRECT ) { ffc1297c: 39 4b 00 01 addi r10,r11,1 ffc12980: 7d 4a 49 d6 mullw r10,r10,r9 } /* * This means the requested block number is out of range. */ return 0; ffc12984: 3b a0 00 00 li r29,0 } /* * Is the block number in the triply indirect portion? */ if ( my_block <= LAST_TRIPLY_INDIRECT ) { ffc12988: 38 0a ff ff addi r0,r10,-1 ffc1298c: 7f 84 00 40 cmplw cr7,r4,r0 ffc12990: 41 9d 00 d4 bgt- cr7,ffc12a64 <== NEVER TAKEN my_block -= FIRST_TRIPLY_INDIRECT; ffc12994: 7f cb 20 50 subf r30,r11,r4 singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS; doubly %= IMFS_MEMFILE_BLOCK_SLOTS; p = info->triply_indirect; ffc12998: 80 63 00 60 lwz r3,96(r3) * Is the block number in the triply indirect portion? */ if ( my_block <= LAST_TRIPLY_INDIRECT ) { my_block -= FIRST_TRIPLY_INDIRECT; singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; ffc1299c: 7c 1e 4b 96 divwu r0,r30,r9 doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS; ffc129a0: 7f 80 4b 96 divwu r28,r0,r9 doubly %= IMFS_MEMFILE_BLOCK_SLOTS; p = info->triply_indirect; if ( malloc_it ) { ffc129a4: 2f 05 00 00 cmpwi cr6,r5,0 * Is the block number in the triply indirect portion? */ if ( my_block <= LAST_TRIPLY_INDIRECT ) { my_block -= FIRST_TRIPLY_INDIRECT; singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; ffc129a8: 7d 60 49 d6 mullw r11,r0,r9 doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS; doubly %= IMFS_MEMFILE_BLOCK_SLOTS; ffc129ac: 7f 7c 49 d6 mullw r27,r28,r9 * Is the block number in the triply indirect portion? */ if ( my_block <= LAST_TRIPLY_INDIRECT ) { my_block -= FIRST_TRIPLY_INDIRECT; singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; ffc129b0: 7f cb f0 50 subf r30,r11,r30 doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS; doubly %= IMFS_MEMFILE_BLOCK_SLOTS; ffc129b4: 7f 7b 00 50 subf r27,r27,r0 ffc129b8: 2f 83 00 00 cmpwi cr7,r3,0 p = info->triply_indirect; if ( malloc_it ) { ffc129bc: 41 9a 00 74 beq- cr6,ffc12a30 if ( !p ) { ffc129c0: 40 be 00 14 bne+ cr7,ffc129d4 p = memfile_alloc_block(); ffc129c4: 4b ff fe 95 bl ffc12858 if ( !p ) ffc129c8: 2c 03 00 00 cmpwi r3,0 ffc129cc: 41 82 00 98 beq- ffc12a64 <== NEVER TAKEN return 0; info->triply_indirect = p; ffc129d0: 90 7f 00 60 stw r3,96(r31) } p1 = (block_p *) p[ triply ]; ffc129d4: 57 9c 10 3a rlwinm r28,r28,2,0,29 ffc129d8: 7f e3 e2 14 add r31,r3,r28 ffc129dc: 7c 63 e0 2e lwzx r3,r3,r28 if ( !p1 ) { ffc129e0: 2f 83 00 00 cmpwi cr7,r3,0 ffc129e4: 40 be 00 18 bne+ cr7,ffc129fc p1 = memfile_alloc_block(); ffc129e8: 4b ff fe 71 bl ffc12858 if ( !p1 ) return 0; ffc129ec: 3b a0 00 00 li r29,0 } p1 = (block_p *) p[ triply ]; if ( !p1 ) { p1 = memfile_alloc_block(); if ( !p1 ) ffc129f0: 2c 03 00 00 cmpwi r3,0 ffc129f4: 41 82 00 70 beq- ffc12a64 <== NEVER TAKEN return 0; p[ triply ] = (block_p) p1; ffc129f8: 90 7f 00 00 stw r3,0(r31) } p2 = (block_p *)p1[ doubly ]; ffc129fc: 57 7b 10 3a rlwinm r27,r27,2,0,29 ffc12a00: 7f e3 da 14 add r31,r3,r27 ffc12a04: 7c 63 d8 2e lwzx r3,r3,r27 if ( !p2 ) { ffc12a08: 2f 83 00 00 cmpwi cr7,r3,0 ffc12a0c: 40 be 00 18 bne+ cr7,ffc12a24 p2 = memfile_alloc_block(); ffc12a10: 4b ff fe 49 bl ffc12858 if ( !p2 ) return 0; ffc12a14: 3b a0 00 00 li r29,0 } p2 = (block_p *)p1[ doubly ]; if ( !p2 ) { p2 = memfile_alloc_block(); if ( !p2 ) ffc12a18: 2c 03 00 00 cmpwi r3,0 ffc12a1c: 41 82 00 48 beq- ffc12a64 <== NEVER TAKEN return 0; p1[ doubly ] = (block_p) p2; ffc12a20: 90 7f 00 00 stw r3,0(r31) } return (block_p *)&p2[ singly ]; ffc12a24: 57 de 10 3a rlwinm r30,r30,2,0,29 ffc12a28: 7f a3 f2 14 add r29,r3,r30 ffc12a2c: 48 00 00 38 b ffc12a64 } if ( !p ) ffc12a30: 41 be 00 34 beq+ cr7,ffc12a64 <== NEVER TAKEN return 0; p1 = (block_p *) p[ triply ]; ffc12a34: 57 9c 10 3a rlwinm r28,r28,2,0,29 ffc12a38: 7d 23 e0 2e lwzx r9,r3,r28 if ( !p1 ) ffc12a3c: 2f 89 00 00 cmpwi cr7,r9,0 ffc12a40: 41 be 00 24 beq+ cr7,ffc12a64 <== NEVER TAKEN return 0; p2 = (block_p *)p1[ doubly ]; ffc12a44: 57 7b 10 3a rlwinm r27,r27,2,0,29 ffc12a48: 7c 09 d8 2e lwzx r0,r9,r27 if ( !p2 ) ffc12a4c: 2f 80 00 00 cmpwi cr7,r0,0 ffc12a50: 41 9e 00 14 beq- cr7,ffc12a64 <== NEVER TAKEN return 0; return (block_p *)&p2[ singly ]; ffc12a54: 57 de 10 3a rlwinm r30,r30,2,0,29 ffc12a58: 7f a0 f2 14 add r29,r0,r30 ffc12a5c: 48 00 00 08 b ffc12a64 return (block_p *)&p1[ singly ]; } if ( !p ) return 0; ffc12a60: 3b a0 00 00 li r29,0 <== NOT EXECUTED /* * This means the requested block number is out of range. */ return 0; } ffc12a64: 39 61 00 20 addi r11,r1,32 ffc12a68: 7f a3 eb 78 mr r3,r29 ffc12a6c: 48 00 67 34 b ffc191a0 <_restgpr_27_x> =============================================================================== ffc12a70 : IMFS_jnode_t *the_jnode, off_t start, unsigned char *destination, unsigned int length ) { ffc12a70: 94 21 ff c8 stwu r1,-56(r1) ffc12a74: 7c 08 02 a6 mflr r0 ffc12a78: 90 01 00 3c stw r0,60(r1) * 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) { ffc12a7c: 80 03 00 4c lwz r0,76(r3) IMFS_jnode_t *the_jnode, off_t start, unsigned char *destination, unsigned int length ) { ffc12a80: bf 01 00 18 stmw r24,24(r1) ffc12a84: 7c 7d 1b 78 mr r29,r3 * 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) { ffc12a88: 2f 80 00 06 cmpwi cr7,r0,6 IMFS_jnode_t *the_jnode, off_t start, unsigned char *destination, unsigned int length ) { ffc12a8c: 7c df 33 78 mr r31,r6 ffc12a90: 7c be 2b 78 mr r30,r5 ffc12a94: 7c fc 3b 78 mr r28,r7 * 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) { ffc12a98: 40 be 00 68 bne+ cr7,ffc12b00 unsigned char *file_ptr; file_ptr = (unsigned char *)the_jnode->info.linearfile.direct; if (my_length > (the_jnode->info.linearfile.size - start)) ffc12a9c: 81 23 00 50 lwz r9,80(r3) ffc12aa0: 38 00 00 00 li r0,0 ffc12aa4: 81 43 00 54 lwz r10,84(r3) my_length = length; if (the_jnode->type == IMFS_LINEAR_FILE) { unsigned char *file_ptr; file_ptr = (unsigned char *)the_jnode->info.linearfile.direct; ffc12aa8: 80 83 00 58 lwz r4,88(r3) if (my_length > (the_jnode->info.linearfile.size - start)) ffc12aac: 7d 9f 50 10 subfc r12,r31,r10 ffc12ab0: 7d 7e 49 10 subfe r11,r30,r9 ffc12ab4: 7f 80 58 00 cmpw cr7,r0,r11 ffc12ab8: 41 bd 00 10 bgt+ cr7,ffc12ac8 <== NEVER TAKEN ffc12abc: 40 9e 00 14 bne- cr7,ffc12ad0 <== NEVER TAKEN ffc12ac0: 7f 88 60 40 cmplw cr7,r8,r12 ffc12ac4: 40 9d 00 0c ble- cr7,ffc12ad0 <== NEVER TAKEN my_length = the_jnode->info.linearfile.size - start; ffc12ac8: 7f 7f 50 50 subf r27,r31,r10 ffc12acc: 48 00 00 08 b ffc12ad4 /* * Linear files (as created from a tar file are easier to handle * than block files). */ my_length = length; ffc12ad0: 7d 1b 43 78 mr r27,r8 <== 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); ffc12ad4: 7c 84 fa 14 add r4,r4,r31 ffc12ad8: 7f 65 db 78 mr r5,r27 ffc12adc: 7f 83 e3 78 mr r3,r28 ffc12ae0: 48 00 24 39 bl ffc14f18 IMFS_update_atime( the_jnode ); ffc12ae4: 38 61 00 08 addi r3,r1,8 ffc12ae8: 38 80 00 00 li r4,0 ffc12aec: 4b ff 26 f9 bl ffc051e4 ffc12af0: 80 01 00 08 lwz r0,8(r1) return my_length; ffc12af4: 7f 7e db 78 mr r30,r27 if (my_length > (the_jnode->info.linearfile.size - start)) my_length = the_jnode->info.linearfile.size - start; memcpy(dest, &file_ptr[start], my_length); IMFS_update_atime( the_jnode ); ffc12af8: 90 1d 00 40 stw r0,64(r29) return my_length; ffc12afc: 48 00 01 64 b ffc12c60 /* * If the last byte we are supposed to read is past the end of this * in memory file, then shorten the length to read. */ last_byte = start + length; if ( last_byte > the_jnode->info.file.size ) ffc12b00: 81 63 00 50 lwz r11,80(r3) ffc12b04: 39 40 00 00 li r10,0 /* * 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; ffc12b08: 7c c0 33 78 mr r0,r6 if ( last_byte > the_jnode->info.file.size ) ffc12b0c: 83 63 00 54 lwz r27,84(r3) ffc12b10: 7f 8a 58 00 cmpw cr7,r10,r11 /* * 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; ffc12b14: 7d 28 32 14 add r9,r8,r6 if ( last_byte > the_jnode->info.file.size ) ffc12b18: 41 9d 00 10 bgt- cr7,ffc12b28 <== NEVER TAKEN ffc12b1c: 40 9e 00 14 bne- cr7,ffc12b30 <== NEVER TAKEN ffc12b20: 7f 89 d8 40 cmplw cr7,r9,r27 ffc12b24: 40 9d 00 0c ble- cr7,ffc12b30 my_length = the_jnode->info.file.size - start; ffc12b28: 7f 60 d8 50 subf r27,r0,r27 ffc12b2c: 48 00 00 08 b ffc12b34 /* * Linear files (as created from a tar file are easier to handle * than block files). */ my_length = length; ffc12b30: 7d 1b 43 78 mr r27,r8 */ /* * Phase 1: possibly the last part of one block */ start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK; ffc12b34: 3d 20 00 00 lis r9,0 ffc12b38: 83 49 27 e4 lwz r26,10212(r9) ffc12b3c: 7f c3 f3 78 mr r3,r30 ffc12b40: 7f e4 fb 78 mr r4,r31 ffc12b44: 7f 58 fe 70 srawi r24,r26,31 ffc12b48: 7f 05 c3 78 mr r5,r24 ffc12b4c: 7f 46 d3 78 mr r6,r26 ffc12b50: 48 00 5a 65 bl ffc185b4 <__moddi3> block = start / IMFS_MEMFILE_BYTES_PER_BLOCK; ffc12b54: 7f c3 f3 78 mr r3,r30 */ /* * Phase 1: possibly the last part of one block */ start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK; ffc12b58: 7c 99 23 78 mr r25,r4 block = start / IMFS_MEMFILE_BYTES_PER_BLOCK; ffc12b5c: 7f 05 c3 78 mr r5,r24 ffc12b60: 7f e4 fb 78 mr r4,r31 ffc12b64: 7f 46 d3 78 mr r6,r26 ffc12b68: 48 00 56 35 bl ffc1819c <__divdi3> if ( start_offset ) { ffc12b6c: 2f 99 00 00 cmpwi cr7,r25,0 /* * Phase 1: possibly the last part of one block */ start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK; block = start / IMFS_MEMFILE_BYTES_PER_BLOCK; ffc12b70: 7c 98 23 78 mr r24,r4 unsigned int last_byte; unsigned int copied; unsigned int start_offset; unsigned char *dest; dest = destination; ffc12b74: 7f 9f e3 78 mr r31,r28 */ last_byte = start + length; if ( last_byte > the_jnode->info.file.size ) my_length = the_jnode->info.file.size - start; copied = 0; ffc12b78: 3b c0 00 00 li r30,0 /* * 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 ) { ffc12b7c: 41 9e 00 4c beq- cr7,ffc12bc8 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 ); ffc12b80: 7f a3 eb 78 mr r3,r29 ffc12b84: 38 a0 00 00 li r5,0 ffc12b88: 4b ff fd 15 bl ffc1289c if ( !block_ptr ) ffc12b8c: 2c 03 00 00 cmpwi r3,0 ffc12b90: 41 82 00 d0 beq- ffc12c60 <== 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; ffc12b94: 7f 59 d0 50 subf r26,r25,r26 ffc12b98: 7f 9b d0 40 cmplw cr7,r27,r26 ffc12b9c: 7f 7e db 78 mr r30,r27 ffc12ba0: 40 9d 00 08 ble- cr7,ffc12ba8 ffc12ba4: 7f 5e d3 78 mr r30,r26 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 ); ffc12ba8: 80 83 00 00 lwz r4,0(r3) ffc12bac: 7f c5 f3 78 mr r5,r30 ffc12bb0: 7f 83 e3 78 mr r3,r28 ffc12bb4: 7c 84 ca 14 add r4,r4,r25 ffc12bb8: 48 00 23 61 bl ffc14f18 dest += to_copy; ffc12bbc: 7f fc f2 14 add r31,r28,r30 block++; ffc12bc0: 3b 18 00 01 addi r24,r24,1 my_length -= to_copy; ffc12bc4: 7f 7e d8 50 subf r27,r30,r27 } /* * Phase 2: all of zero of more blocks */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; ffc12bc8: 3f 40 00 00 lis r26,0 ffc12bcc: 83 9a 27 e4 lwz r28,10212(r26) while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { ffc12bd0: 48 00 00 3c b ffc12c0c block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); ffc12bd4: 7f a3 eb 78 mr r3,r29 ffc12bd8: 7f 04 c3 78 mr r4,r24 ffc12bdc: 38 a0 00 00 li r5,0 ffc12be0: 4b ff fc bd bl ffc1289c if ( !block_ptr ) ffc12be4: 7c 69 1b 79 mr. r9,r3 ffc12be8: 41 82 00 78 beq- ffc12c60 <== NEVER TAKEN return copied; memcpy( dest, &(*block_ptr)[ 0 ], to_copy ); ffc12bec: 80 89 00 00 lwz r4,0(r9) ffc12bf0: 7f e3 fb 78 mr r3,r31 ffc12bf4: 7f 85 e3 78 mr r5,r28 ffc12bf8: 48 00 23 21 bl ffc14f18 dest += to_copy; ffc12bfc: 7f ff e2 14 add r31,r31,r28 block++; ffc12c00: 3b 18 00 01 addi r24,r24,1 my_length -= to_copy; ffc12c04: 7f 7c d8 50 subf r27,r28,r27 copied += to_copy; ffc12c08: 7f de e2 14 add r30,r30,r28 /* * Phase 2: all of zero of more blocks */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { ffc12c0c: 80 1a 27 e4 lwz r0,10212(r26) ffc12c10: 7f 9b 00 40 cmplw cr7,r27,r0 ffc12c14: 40 9c ff c0 bge+ cr7,ffc12bd4 /* * Phase 3: possibly the first part of one block */ IMFS_assert( my_length < IMFS_MEMFILE_BYTES_PER_BLOCK ); if ( my_length ) { ffc12c18: 2f 9b 00 00 cmpwi cr7,r27,0 ffc12c1c: 41 9e 00 30 beq- cr7,ffc12c4c block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); ffc12c20: 7f a3 eb 78 mr r3,r29 ffc12c24: 7f 04 c3 78 mr r4,r24 ffc12c28: 38 a0 00 00 li r5,0 ffc12c2c: 4b ff fc 71 bl ffc1289c if ( !block_ptr ) ffc12c30: 7c 69 1b 79 mr. r9,r3 ffc12c34: 41 82 00 2c beq- ffc12c60 <== NEVER TAKEN return copied; memcpy( dest, &(*block_ptr)[ 0 ], my_length ); ffc12c38: 80 89 00 00 lwz r4,0(r9) ffc12c3c: 7f e3 fb 78 mr r3,r31 ffc12c40: 7f 65 db 78 mr r5,r27 ffc12c44: 48 00 22 d5 bl ffc14f18 copied += my_length; ffc12c48: 7f db f2 14 add r30,r27,r30 } IMFS_update_atime( the_jnode ); ffc12c4c: 38 61 00 08 addi r3,r1,8 ffc12c50: 38 80 00 00 li r4,0 ffc12c54: 4b ff 25 91 bl ffc051e4 ffc12c58: 80 01 00 08 lwz r0,8(r1) ffc12c5c: 90 1d 00 40 stw r0,64(r29) return copied; } ffc12c60: 39 61 00 38 addi r11,r1,56 ffc12c64: 7f c3 f3 78 mr r3,r30 ffc12c68: 48 00 65 2c b ffc19194 <_restgpr_24_x> =============================================================================== ffc12d70 : * is better to stick to simple, easy to understand algorithms. */ int IMFS_memfile_remove( IMFS_jnode_t *the_jnode ) { ffc12d70: 94 21 ff d8 stwu r1,-40(r1) ffc12d74: 7c 08 02 a6 mflr r0 /* * 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; ffc12d78: 3d 20 00 00 lis r9,0 * is better to stick to simple, easy to understand algorithms. */ int IMFS_memfile_remove( IMFS_jnode_t *the_jnode ) { ffc12d7c: bf 21 00 0c stmw r25,12(r1) ffc12d80: 7c 7f 1b 78 mr r31,r3 ffc12d84: 90 01 00 2c stw r0,44(r1) * + doubly indirect * + triply indirect */ info = &the_jnode->info.file; if ( info->indirect ) { ffc12d88: 80 03 00 58 lwz r0,88(r3) /* * 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; ffc12d8c: 83 c9 27 e4 lwz r30,10212(r9) * + doubly indirect * + triply indirect */ info = &the_jnode->info.file; if ( info->indirect ) { ffc12d90: 2f 80 00 00 cmpwi cr7,r0,0 /* * 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; ffc12d94: 57 de f0 be rlwinm r30,r30,30,2,31 * + doubly indirect * + triply indirect */ info = &the_jnode->info.file; if ( info->indirect ) { ffc12d98: 41 9e 00 10 beq- cr7,ffc12da8 memfile_free_blocks_in_table( &info->indirect, to_free ); ffc12d9c: 38 63 00 58 addi r3,r3,88 ffc12da0: 7f c4 f3 78 mr r4,r30 ffc12da4: 4b ff ff 69 bl ffc12d0c } if ( info->doubly_indirect ) { ffc12da8: 80 1f 00 5c lwz r0,92(r31) ffc12dac: 3b a0 00 00 li r29,0 for ( i=0 ; iindirect ) { memfile_free_blocks_in_table( &info->indirect, to_free ); } if ( info->doubly_indirect ) { ffc12db4: 2f 80 00 00 cmpwi cr7,r0,0 ffc12db8: 40 be 00 2c bne+ cr7,ffc12de4 ffc12dbc: 48 00 00 44 b ffc12e00 for ( i=0 ; idoubly_indirect[i] ) { ffc12dc0: 80 7f 00 5c lwz r3,92(r31) ffc12dc4: 57 a0 10 3a rlwinm r0,r29,2,0,29 ffc12dc8: 7d 23 00 2e lwzx r9,r3,r0 ffc12dcc: 2f 89 00 00 cmpwi cr7,r9,0 ffc12dd0: 41 9e 00 10 beq- cr7,ffc12de0 <== NEVER TAKEN memfile_free_blocks_in_table( ffc12dd4: 7c 63 02 14 add r3,r3,r0 ffc12dd8: 7f c4 f3 78 mr r4,r30 ffc12ddc: 4b ff ff 31 bl ffc12d0c 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 ); ffc12df4: 38 7f 00 5c addi r3,r31,92 ffc12df8: 7f c4 f3 78 mr r4,r30 ffc12dfc: 4b ff ff 11 bl ffc12d0c } if ( info->triply_indirect ) { ffc12e00: 80 1f 00 60 lwz r0,96(r31) ffc12e04: 3b a0 00 00 li r29,0 for ( i=0 ; idoubly_indirect, to_free ); } if ( info->triply_indirect ) { ffc12e0c: 2f 80 00 00 cmpwi cr7,r0,0 ffc12e10: 40 be 00 68 bne+ cr7,ffc12e78 ffc12e14: 48 00 00 80 b ffc12e94 for ( i=0 ; itriply_indirect[i]; ffc12e18: 81 3f 00 60 lwz r9,96(r31) } memfile_free_blocks_in_table( &info->doubly_indirect, to_free ); } if ( info->triply_indirect ) { ffc12e1c: 57 b9 10 3a rlwinm r25,r29,2,0,29 for ( i=0 ; itriply_indirect[i]; ffc12e20: 7f 69 c8 2e lwzx r27,r9,r25 if ( !p ) /* ensure we have a valid pointer */ ffc12e24: 2f 9b 00 00 cmpwi cr7,r27,0 ffc12e28: 41 9e 00 60 beq- cr7,ffc12e88 <== NEVER TAKEN * a significant difference in the performance of this routine. * * Regardless until the IMFS implementation is proven, it * is better to stick to simple, easy to understand algorithms. */ int IMFS_memfile_remove( ffc12e2c: 3b 7b ff fc addi r27,r27,-4 ffc12e30: 3b 80 00 00 li r28,0 ffc12e34: 48 00 00 20 b ffc12e54 for ( i=0 ; itriply_indirect[i]; if ( !p ) /* ensure we have a valid pointer */ break; for ( j=0 ; j<== NEVER TAKEN memfile_free_blocks_in_table( (block_p **)&p[j], to_free); ffc12e44: 7f 63 db 78 mr r3,r27 ffc12e48: 7f c4 f3 78 mr r4,r30 ffc12e4c: 4b ff fe c1 bl ffc12d0c 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( ffc12e64: 80 7f 00 60 lwz r3,96(r31) ffc12e68: 7f c4 f3 78 mr r4,r30 memfile_free_blocks_in_table( &info->doubly_indirect, to_free ); } if ( info->triply_indirect ) { for ( i=0 ; i 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( ffc12e88: 38 7f 00 60 addi r3,r31,96 ffc12e8c: 7f c4 f3 78 mr r4,r30 ffc12e90: 4b ff fe 7d bl ffc12d0c (block_p **)&info->triply_indirect, to_free ); } return 0; } ffc12e94: 39 61 00 28 addi r11,r1,40 ffc12e98: 38 60 00 00 li r3,0 ffc12e9c: 48 00 62 fc b ffc19198 <_restgpr_25_x> =============================================================================== ffc12ffc : IMFS_jnode_t *the_jnode, off_t start, const unsigned char *source, unsigned int length ) { ffc12ffc: 94 21 ff c8 stwu r1,-56(r1) ffc13000: 7c 08 02 a6 mflr r0 ffc13004: bf 01 00 18 stmw r24,24(r1) ffc13008: 7c de 33 78 mr r30,r6 ffc1300c: 7c 7f 1b 78 mr r31,r3 ffc13010: 90 01 00 3c stw r0,60(r1) ffc13014: 7c bd 2b 78 mr r29,r5 ffc13018: 7c fc 3b 78 mr r28,r7 * If the last byte we are supposed to write is past the end of this * in memory file, then extend the length. */ last_byte = start + my_length; if ( last_byte > the_jnode->info.file.size ) { ffc1301c: 80 03 00 50 lwz r0,80(r3) IMFS_jnode_t *the_jnode, off_t start, const unsigned char *source, unsigned int length ) { ffc13020: 7d 1b 43 78 mr r27,r8 /* * 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; ffc13024: 7c c8 32 14 add r6,r8,r6 if ( last_byte > the_jnode->info.file.size ) { ffc13028: 2f 80 00 00 cmpwi cr7,r0,0 ffc1302c: 41 9c 00 14 blt- cr7,ffc13040 <== NEVER TAKEN ffc13030: 40 be 00 38 bne+ cr7,ffc13068 <== NEVER TAKEN ffc13034: 80 03 00 54 lwz r0,84(r3) ffc13038: 7f 80 30 40 cmplw cr7,r0,r6 ffc1303c: 40 bc 00 2c bge+ cr7,ffc13068 <== NEVER TAKEN status = IMFS_memfile_extend( the_jnode, last_byte ); ffc13040: 7f e3 fb 78 mr r3,r31 ffc13044: 38 a0 00 00 li r5,0 ffc13048: 4b ff fe 95 bl ffc12edc if ( status ) ffc1304c: 2f 83 00 00 cmpwi cr7,r3,0 ffc13050: 41 be 00 18 beq+ cr7,ffc13068 rtems_set_errno_and_return_minus_one( ENOSPC ); ffc13054: 48 00 12 65 bl ffc142b8 <__errno> ffc13058: 38 00 00 1c li r0,28 ffc1305c: 90 03 00 00 stw r0,0(r3) ffc13060: 38 00 ff ff li r0,-1 ffc13064: 48 00 01 3c b ffc131a0 */ /* * Phase 1: possibly the last part of one block */ start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK; ffc13068: 3d 20 00 00 lis r9,0 ffc1306c: 83 49 27 e4 lwz r26,10212(r9) ffc13070: 7f c4 f3 78 mr r4,r30 ffc13074: 7f a3 eb 78 mr r3,r29 ffc13078: 7f 58 fe 70 srawi r24,r26,31 ffc1307c: 7f 05 c3 78 mr r5,r24 ffc13080: 7f 46 d3 78 mr r6,r26 ffc13084: 48 00 55 31 bl ffc185b4 <__moddi3> block = start / IMFS_MEMFILE_BYTES_PER_BLOCK; ffc13088: 7f a3 eb 78 mr r3,r29 */ /* * Phase 1: possibly the last part of one block */ start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK; ffc1308c: 7c 99 23 78 mr r25,r4 block = start / IMFS_MEMFILE_BYTES_PER_BLOCK; ffc13090: 7f 05 c3 78 mr r5,r24 ffc13094: 7f c4 f3 78 mr r4,r30 ffc13098: 7f 46 d3 78 mr r6,r26 ffc1309c: 48 00 51 01 bl ffc1819c <__divdi3> if ( start_offset ) { ffc130a0: 2f 99 00 00 cmpwi cr7,r25,0 /* * Phase 1: possibly the last part of one block */ start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK; block = start / IMFS_MEMFILE_BYTES_PER_BLOCK; ffc130a4: 7c 9e 23 78 mr r30,r4 if ( start_offset ) { ffc130a8: 41 9e 00 50 beq- cr7,ffc130f8 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 ); ffc130ac: 7f e3 fb 78 mr r3,r31 ffc130b0: 38 a0 00 00 li r5,0 ffc130b4: 4b ff f7 e9 bl ffc1289c if ( !block_ptr ) return copied; ffc130b8: 38 00 00 00 li r0,0 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 ) ffc130bc: 2c 03 00 00 cmpwi r3,0 ffc130c0: 41 82 00 e0 beq- ffc131a0 <== 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; ffc130c4: 7f 59 d0 50 subf r26,r25,r26 ffc130c8: 7f 9a d8 40 cmplw cr7,r26,r27 ffc130cc: 40 9d 00 08 ble- cr7,ffc130d4 ffc130d0: 7f 7a db 78 mr r26,r27 block, to_copy, src ); #endif memcpy( &(*block_ptr)[ start_offset ], src, to_copy ); ffc130d4: 80 63 00 00 lwz r3,0(r3) ffc130d8: 7f 84 e3 78 mr r4,r28 ffc130dc: 7f 45 d3 78 mr r5,r26 ffc130e0: 7c 63 ca 14 add r3,r3,r25 ffc130e4: 48 00 1e 35 bl ffc14f18 src += to_copy; ffc130e8: 7f 9c d2 14 add r28,r28,r26 block++; ffc130ec: 3b de 00 01 addi r30,r30,1 my_length -= to_copy; ffc130f0: 7f 7a d8 50 subf r27,r26,r27 ffc130f4: 48 00 00 08 b ffc130fc status = IMFS_memfile_extend( the_jnode, last_byte ); if ( status ) rtems_set_errno_and_return_minus_one( ENOSPC ); } copied = 0; ffc130f8: 3b 40 00 00 li r26,0 /* * Phase 2: all of zero of more blocks */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; ffc130fc: 3f 20 00 00 lis r25,0 ffc13100: 83 b9 27 e4 lwz r29,10212(r25) while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { ffc13104: 48 00 00 3c b ffc13140 block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); ffc13108: 7f e3 fb 78 mr r3,r31 ffc1310c: 7f c4 f3 78 mr r4,r30 ffc13110: 38 a0 00 00 li r5,0 ffc13114: 4b ff f7 89 bl ffc1289c if ( !block_ptr ) ffc13118: 2c 03 00 00 cmpwi r3,0 ffc1311c: 41 82 00 80 beq- ffc1319c <== 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 ); ffc13120: 80 63 00 00 lwz r3,0(r3) ffc13124: 7f 84 e3 78 mr r4,r28 ffc13128: 7f a5 eb 78 mr r5,r29 ffc1312c: 48 00 1d ed bl ffc14f18 src += to_copy; ffc13130: 7f 9c ea 14 add r28,r28,r29 block++; ffc13134: 3b de 00 01 addi r30,r30,1 my_length -= to_copy; ffc13138: 7f 7d d8 50 subf r27,r29,r27 * 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( ffc1313c: 7f 5a ea 14 add r26,r26,r29 /* * Phase 2: all of zero of more blocks */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { ffc13140: 80 19 27 e4 lwz r0,10212(r25) ffc13144: 7f 9b 00 40 cmplw cr7,r27,r0 ffc13148: 40 9c ff c0 bge+ cr7,ffc13108 * 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 ) { ffc1314c: 2f 9b 00 00 cmpwi cr7,r27,0 ffc13150: 41 9e 00 34 beq- cr7,ffc13184 block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); ffc13154: 7f e3 fb 78 mr r3,r31 ffc13158: 7f c4 f3 78 mr r4,r30 ffc1315c: 38 a0 00 00 li r5,0 ffc13160: 4b ff f7 3d bl ffc1289c if ( !block_ptr ) ffc13164: 7f 40 d3 78 mr r0,r26 ffc13168: 2c 03 00 00 cmpwi r3,0 ffc1316c: 41 82 00 34 beq- ffc131a0 <== 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 ); ffc13170: 80 63 00 00 lwz r3,0(r3) ffc13174: 7f 84 e3 78 mr r4,r28 ffc13178: 7f 65 db 78 mr r5,r27 ffc1317c: 48 00 1d 9d bl ffc14f18 my_length = 0; copied += to_copy; ffc13180: 7f 5a da 14 add r26,r26,r27 } IMFS_mtime_ctime_update( the_jnode ); ffc13184: 38 61 00 08 addi r3,r1,8 ffc13188: 38 80 00 00 li r4,0 ffc1318c: 4b ff 20 59 bl ffc051e4 ffc13190: 80 01 00 08 lwz r0,8(r1) ffc13194: 90 1f 00 44 stw r0,68(r31) ffc13198: 90 1f 00 48 stw r0,72(r31) */ 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 ) ffc1319c: 7f 40 d3 78 mr r0,r26 } IMFS_mtime_ctime_update( the_jnode ); return copied; } ffc131a0: 39 61 00 38 addi r11,r1,56 ffc131a4: 7c 03 03 78 mr r3,r0 ffc131a8: 48 00 5f ec b ffc19194 <_restgpr_24_x> =============================================================================== ffc049cc : #include int IMFS_mount( rtems_filesystem_mount_table_entry_t *mt_entry ) { ffc049cc: 7c 08 02 a6 mflr r0 ffc049d0: 94 21 ff f8 stwu r1,-8(r1) ffc049d4: 90 01 00 0c stw r0,12(r1) IMFS_jnode_t *node; node = mt_entry->mt_point_node.node_access; ffc049d8: 81 23 00 08 lwz r9,8(r3) /* * Is the node that we are mounting onto a directory node ? */ if ( node->type != IMFS_DIRECTORY ) ffc049dc: 80 09 00 4c lwz r0,76(r9) ffc049e0: 2f 80 00 01 cmpwi cr7,r0,1 ffc049e4: 41 be 00 18 beq+ cr7,ffc049fc <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( ENOTDIR ); ffc049e8: 48 00 f8 d1 bl ffc142b8 <__errno> <== NOT EXECUTED ffc049ec: 38 00 00 14 li r0,20 <== NOT EXECUTED ffc049f0: 90 03 00 00 stw r0,0(r3) <== NOT EXECUTED ffc049f4: 38 60 ff ff li r3,-1 <== NOT EXECUTED ffc049f8: 48 00 00 0c b ffc04a04 <== 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; ffc049fc: 90 69 00 5c stw r3,92(r9) return 0; ffc04a00: 38 60 00 00 li r3,0 } ffc04a04: 80 01 00 0c lwz r0,12(r1) ffc04a08: 38 21 00 08 addi r1,r1,8 ffc04a0c: 7c 08 03 a6 mtlr r0 ffc04a10: 4e 80 00 20 blr =============================================================================== ffc06acc : * This routine prints the contents of the specified jnode. */ void IMFS_print_jnode( IMFS_jnode_t *the_jnode ) { ffc06acc: 94 21 ff f0 stwu r1,-16(r1) ffc06ad0: 7c 08 02 a6 mflr r0 ffc06ad4: bf c1 00 08 stmw r30,8(r1) IMFS_assert( the_jnode ); fprintf(stdout, "%s", the_jnode->name ); ffc06ad8: 3f c0 00 00 lis r30,0 * This routine prints the contents of the specified jnode. */ void IMFS_print_jnode( IMFS_jnode_t *the_jnode ) { ffc06adc: 7c 7f 1b 78 mr r31,r3 ffc06ae0: 90 01 00 14 stw r0,20(r1) IMFS_assert( the_jnode ); fprintf(stdout, "%s", the_jnode->name ); ffc06ae4: 38 63 00 0c addi r3,r3,12 ffc06ae8: 81 3e 27 b0 lwz r9,10160(r30) ffc06aec: 80 89 00 08 lwz r4,8(r9) ffc06af0: 48 00 eb ad bl ffc1569c switch( the_jnode->type ) { ffc06af4: 80 bf 00 4c lwz r5,76(r31) ffc06af8: 38 05 ff ff addi r0,r5,-1 ffc06afc: 2b 80 00 06 cmplwi cr7,r0,6 ffc06b00: 41 9d 00 bc bgt- cr7,ffc06bbc <== NEVER TAKEN ffc06b04: 3d 20 ff c2 lis r9,-62 ffc06b08: 39 29 73 94 addi r9,r9,29588 ffc06b0c: 54 00 10 3a rlwinm r0,r0,2,0,29 ffc06b10: 7c 09 00 2e lwzx r0,r9,r0 ffc06b14: 7d 20 4a 14 add r9,r0,r9 ffc06b18: 7d 29 03 a6 mtctr r9 ffc06b1c: 4e 80 04 20 bctr case IMFS_DIRECTORY: fprintf(stdout, "/" ); ffc06b20: 81 3e 27 b0 lwz r9,10160(r30) ffc06b24: 38 60 00 2f li r3,47 ffc06b28: 80 89 00 08 lwz r4,8(r9) ffc06b2c: 48 00 ea 55 bl ffc15580 break; ffc06b30: 48 00 00 a8 b ffc06bd8 case IMFS_DEVICE: fprintf(stdout, " (device %" PRId32 ", %" PRId32 ")", ffc06b34: 81 3e 27 b0 lwz r9,10160(r30) ffc06b38: 3c 80 ff c2 lis r4,-62 ffc06b3c: 38 84 73 b0 addi r4,r4,29616 ffc06b40: 80 bf 00 50 lwz r5,80(r31) ffc06b44: 80 69 00 08 lwz r3,8(r9) ffc06b48: 80 df 00 54 lwz r6,84(r31) ffc06b4c: 48 00 00 1c b ffc06b68 the_jnode->info.device.major, the_jnode->info.device.minor ); break; case IMFS_LINEAR_FILE: fprintf(stdout, " (file %" PRId32 " %p)", ffc06b50: 81 3e 27 b0 lwz r9,10160(r30) ffc06b54: 3c 80 ff c2 lis r4,-62 ffc06b58: 80 bf 00 54 lwz r5,84(r31) ffc06b5c: 38 84 73 c3 addi r4,r4,29635 ffc06b60: 80 69 00 08 lwz r3,8(r9) ffc06b64: 80 df 00 58 lwz r6,88(r31) ffc06b68: 4c c6 31 82 crclr 4*cr1+eq ffc06b6c: 48 00 e9 2d bl ffc15498 (uint32_t)the_jnode->info.linearfile.size, the_jnode->info.linearfile.direct ); break; ffc06b70: 48 00 00 68 b ffc06bd8 the_jnode->info.file.indirect, the_jnode->info.file.doubly_indirect, the_jnode->info.file.triply_indirect ); #else fprintf(stdout, " (file %" PRId32 ")", ffc06b74: 81 3e 27 b0 lwz r9,10160(r30) ffc06b78: 3c 80 ff c2 lis r4,-62 ffc06b7c: 80 bf 00 54 lwz r5,84(r31) ffc06b80: 38 84 73 d2 addi r4,r4,29650 ffc06b84: 80 69 00 08 lwz r3,8(r9) ffc06b88: 4c c6 31 82 crclr 4*cr1+eq ffc06b8c: 48 00 e9 0d bl ffc15498 (uint32_t)the_jnode->info.file.size ); #endif break; ffc06b90: 48 00 00 48 b ffc06bd8 case IMFS_HARD_LINK: fprintf(stdout, " links not printed\n" ); return; case IMFS_SYM_LINK: fprintf(stdout, " links not printed\n" ); ffc06b94: 3c 60 ff c2 lis r3,-62 ffc06b98: 81 3e 27 b0 lwz r9,10160(r30) ffc06b9c: 38 63 73 de addi r3,r3,29662 ffc06ba0: 48 00 00 10 b ffc06bb0 return; case IMFS_FIFO: fprintf(stdout, " FIFO not printed\n" ); ffc06ba4: 3c 60 ff c2 lis r3,-62 ffc06ba8: 81 3e 27 b0 lwz r9,10160(r30) ffc06bac: 38 63 73 f2 addi r3,r3,29682 ffc06bb0: 80 89 00 08 lwz r4,8(r9) ffc06bb4: 48 00 ea e9 bl ffc1569c return; ffc06bb8: 48 00 00 2c b ffc06be4 default: fprintf(stdout, " bad type %d\n", the_jnode->type ); ffc06bbc: 81 3e 27 b0 lwz r9,10160(r30) <== NOT EXECUTED ffc06bc0: 3c 80 ff c2 lis r4,-62 <== NOT EXECUTED ffc06bc4: 38 84 74 05 addi r4,r4,29701 <== NOT EXECUTED ffc06bc8: 80 69 00 08 lwz r3,8(r9) <== NOT EXECUTED ffc06bcc: 4c c6 31 82 crclr 4*cr1+eq <== NOT EXECUTED ffc06bd0: 48 00 e8 c9 bl ffc15498 <== NOT EXECUTED return; ffc06bd4: 48 00 00 10 b ffc06be4 <== NOT EXECUTED } puts(""); ffc06bd8: 3c 60 ff c2 lis r3,-62 ffc06bdc: 38 63 76 2b addi r3,r3,30251 ffc06be0: 48 01 0a 89 bl ffc17668 } ffc06be4: 39 61 00 10 addi r11,r1,16 ffc06be8: 4b ff c9 88 b ffc03570 <_restgpr_30_x> =============================================================================== ffc04a20 : ssize_t IMFS_readlink( rtems_filesystem_location_info_t *loc, char *buf, /* OUT */ size_t bufsize ) { ffc04a20: 2f 85 00 00 cmpwi cr7,r5,0 IMFS_jnode_t *node; ssize_t i; node = loc->node_access; ffc04a24: 81 63 00 00 lwz r11,0(r3) IMFS_assert( node->type == IMFS_SYM_LINK ); for( i=0; ((iinfo.sym_link.name[i] != '\0')); i++ ) ffc04a28: 38 05 00 01 addi r0,r5,1 ffc04a2c: 38 60 00 00 li r3,0 ffc04a30: 40 be 00 14 bne+ cr7,ffc04a44 <== ALWAYS TAKEN ffc04a34: 38 00 00 01 li r0,1 <== NOT EXECUTED ffc04a38: 48 00 00 0c b ffc04a44 <== NOT EXECUTED buf[i] = node->info.sym_link.name[i]; ffc04a3c: 7d 24 19 ae stbx r9,r4,r3 node = loc->node_access; IMFS_assert( node->type == IMFS_SYM_LINK ); for( i=0; ((iinfo.sym_link.name[i] != '\0')); i++ ) ffc04a40: 38 63 00 01 addi r3,r3,1 ffc04a44: 34 00 ff ff addic. r0,r0,-1 ffc04a48: 4d 82 00 20 beqlr ffc04a4c: 81 2b 00 50 lwz r9,80(r11) ffc04a50: 7d 29 18 ae lbzx r9,r9,r3 ffc04a54: 2f 89 00 00 cmpwi cr7,r9,0 ffc04a58: 40 9e ff e4 bne+ cr7,ffc04a3c buf[i] = node->info.sym_link.name[i]; return i; } ffc04a5c: 4e 80 00 20 blr =============================================================================== ffc04a60 : 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 */ ) { ffc04a60: 94 21 ff e0 stwu r1,-32(r1) ffc04a64: 7c 08 02 a6 mflr r0 ffc04a68: 90 01 00 24 stw r0,36(r1) ffc04a6c: bf c1 00 18 stmw r30,24(r1) ffc04a70: 7c be 2b 78 mr r30,r5 IMFS_jnode_t *the_jnode; IMFS_jnode_t *new_parent; the_jnode = old_loc->node_access; strncpy( the_jnode->name, new_name, IMFS_NAME_MAX ); ffc04a74: 38 a0 00 20 li r5,32 ) { IMFS_jnode_t *the_jnode; IMFS_jnode_t *new_parent; the_jnode = old_loc->node_access; ffc04a78: 83 e4 00 00 lwz r31,0(r4) strncpy( the_jnode->name, new_name, IMFS_NAME_MAX ); ffc04a7c: 7c c4 33 78 mr r4,r6 ffc04a80: 38 7f 00 0c addi r3,r31,12 ffc04a84: 48 01 0a 79 bl ffc154fc if ( the_jnode->Parent != NULL ) ffc04a88: 80 1f 00 08 lwz r0,8(r31) ffc04a8c: 2f 80 00 00 cmpwi cr7,r0,0 ffc04a90: 41 9e 00 0c beq- cr7,ffc04a9c <== NEVER TAKEN */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); ffc04a94: 7f e3 fb 78 mr r3,r31 ffc04a98: 48 00 4c fd bl ffc09794 <_Chain_Extract> rtems_chain_extract( (rtems_chain_node *) the_jnode ); new_parent = new_parent_loc->node_access; ffc04a9c: 80 7e 00 00 lwz r3,0(r30) RTEMS_INLINE_ROUTINE void rtems_chain_append( rtems_chain_control *the_chain, rtems_chain_node *the_node ) { _Chain_Append( the_chain, the_node ); ffc04aa0: 7f e4 fb 78 mr r4,r31 the_jnode->Parent = new_parent; ffc04aa4: 90 7f 00 08 stw r3,8(r31) ffc04aa8: 38 63 00 50 addi r3,r3,80 ffc04aac: 48 00 4c b9 bl ffc09764 <_Chain_Append> rtems_chain_append( &new_parent->info.directory.Entries, &the_jnode->Node ); /* * Update the time. */ IMFS_update_ctime( the_jnode ); ffc04ab0: 38 61 00 08 addi r3,r1,8 ffc04ab4: 38 80 00 00 li r4,0 ffc04ab8: 48 00 07 2d bl ffc051e4 ffc04abc: 80 01 00 08 lwz r0,8(r1) return 0; } ffc04ac0: 39 61 00 20 addi r11,r1,32 ffc04ac4: 38 60 00 00 li r3,0 rtems_chain_append( &new_parent->info.directory.Entries, &the_jnode->Node ); /* * Update the time. */ IMFS_update_ctime( the_jnode ); ffc04ac8: 90 1f 00 48 stw r0,72(r31) return 0; } ffc04acc: 48 01 46 e0 b ffc191ac <_restgpr_30_x> =============================================================================== ffc10218 : int IMFS_stat( rtems_filesystem_location_info_t *loc, struct stat *buf ) { ffc10218: 7c 08 02 a6 mflr r0 ffc1021c: 94 21 ff f8 stwu r1,-8(r1) ffc10220: 90 01 00 0c stw r0,12(r1) IMFS_fs_info_t *fs_info; IMFS_jnode_t *the_jnode; IMFS_device_t *io; the_jnode = loc->node_access; ffc10224: 81 63 00 00 lwz r11,0(r3) switch ( the_jnode->type ) { ffc10228: 81 2b 00 4c lwz r9,76(r11) ffc1022c: 38 09 ff fe addi r0,r9,-2 ffc10230: 2b 80 00 05 cmplwi cr7,r0,5 ffc10234: 41 9d 00 54 bgt- cr7,ffc10288 <== NEVER TAKEN ffc10238: 3d 20 ff c2 lis r9,-62 ffc1023c: 39 29 ad f0 addi r9,r9,-21008 ffc10240: 54 00 10 3a rlwinm r0,r0,2,0,29 ffc10244: 7c 09 00 2e lwzx r0,r9,r0 ffc10248: 7d 20 4a 14 add r9,r0,r9 ffc1024c: 7d 29 03 a6 mtctr r9 ffc10250: 4e 80 04 20 bctr case IMFS_DEVICE: io = &the_jnode->info.device; buf->st_rdev = rtems_filesystem_make_dev_t( io->major, io->minor ); ffc10254: 80 0b 00 54 lwz r0,84(r11) rtems_device_minor_number _minor ) { union __rtems_dev_t temp; temp.__overlay.major = _major; ffc10258: 81 2b 00 50 lwz r9,80(r11) ffc1025c: 90 04 00 1c stw r0,28(r4) ffc10260: 91 24 00 18 stw r9,24(r4) break; ffc10264: 48 00 00 38 b ffc1029c case IMFS_LINEAR_FILE: case IMFS_MEMORY_FILE: buf->st_size = the_jnode->info.file.size; ffc10268: 81 2b 00 50 lwz r9,80(r11) ffc1026c: 81 4b 00 54 lwz r10,84(r11) ffc10270: 48 00 00 0c b ffc1027c case IMFS_SYM_LINK: buf->st_size = 0; break; case IMFS_FIFO: buf->st_size = 0; ffc10274: 39 20 00 00 li r9,0 ffc10278: 39 40 00 00 li r10,0 ffc1027c: 91 24 00 20 stw r9,32(r4) ffc10280: 91 44 00 24 stw r10,36(r4) break; ffc10284: 48 00 00 18 b ffc1029c default: rtems_set_errno_and_return_minus_one( ENOTSUP ); ffc10288: 48 00 40 31 bl ffc142b8 <__errno> ffc1028c: 38 00 00 86 li r0,134 ffc10290: 90 03 00 00 stw r0,0(r3) ffc10294: 38 60 ff ff li r3,-1 ffc10298: 48 00 00 64 b ffc102fc /* * The device number of the IMFS is the major number and the minor is the * instance. */ fs_info = loc->mt_entry->fs_info; ffc1029c: 81 23 00 10 lwz r9,16(r3) buf->st_atime = the_jnode->stat_atime; buf->st_mtime = the_jnode->stat_mtime; buf->st_ctime = the_jnode->stat_ctime; return 0; ffc102a0: 38 60 00 00 li r3,0 * 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 = rtems_filesystem_make_dev_t( IMFS_DEVICE_MAJOR_NUMBER, fs_info->instance ); ffc102a4: 81 29 00 34 lwz r9,52(r9) ffc102a8: 80 09 00 00 lwz r0,0(r9) ffc102ac: 39 20 00 00 li r9,0 ffc102b0: 61 29 ff fe ori r9,r9,65534 /* * 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 = ffc102b4: 90 04 00 04 stw r0,4(r4) rtems_filesystem_make_dev_t( IMFS_DEVICE_MAJOR_NUMBER, fs_info->instance ); buf->st_mode = the_jnode->st_mode; ffc102b8: 80 0b 00 30 lwz r0,48(r11) /* * 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 = ffc102bc: 91 24 00 00 stw r9,0(r4) rtems_filesystem_make_dev_t( IMFS_DEVICE_MAJOR_NUMBER, fs_info->instance ); buf->st_mode = the_jnode->st_mode; ffc102c0: 90 04 00 0c stw r0,12(r4) buf->st_nlink = the_jnode->st_nlink; ffc102c4: a0 0b 00 34 lhz r0,52(r11) ffc102c8: b0 04 00 10 sth r0,16(r4) buf->st_ino = the_jnode->st_ino; ffc102cc: 80 0b 00 38 lwz r0,56(r11) ffc102d0: 90 04 00 08 stw r0,8(r4) buf->st_uid = the_jnode->st_uid; ffc102d4: a0 0b 00 3c lhz r0,60(r11) ffc102d8: b0 04 00 12 sth r0,18(r4) buf->st_gid = the_jnode->st_gid; ffc102dc: a0 0b 00 3e lhz r0,62(r11) ffc102e0: b0 04 00 14 sth r0,20(r4) buf->st_atime = the_jnode->stat_atime; ffc102e4: 80 0b 00 40 lwz r0,64(r11) ffc102e8: 90 04 00 28 stw r0,40(r4) buf->st_mtime = the_jnode->stat_mtime; ffc102ec: 80 0b 00 44 lwz r0,68(r11) ffc102f0: 90 04 00 30 stw r0,48(r4) buf->st_ctime = the_jnode->stat_ctime; ffc102f4: 80 0b 00 48 lwz r0,72(r11) ffc102f8: 90 04 00 38 stw r0,56(r4) return 0; } ffc102fc: 80 01 00 0c lwz r0,12(r1) ffc10300: 38 21 00 08 addi r1,r1,8 ffc10304: 7c 08 03 a6 mtlr r0 ffc10308: 4e 80 00 20 blr =============================================================================== ffc04b6c : int IMFS_unlink( rtems_filesystem_location_info_t *parentloc, /* IN */ rtems_filesystem_location_info_t *loc /* IN */ ) { ffc04b6c: 94 21 ff c8 stwu r1,-56(r1) ffc04b70: 7c 08 02 a6 mflr r0 ffc04b74: 90 01 00 3c stw r0,60(r1) ffc04b78: bf 81 00 28 stmw r28,40(r1) ffc04b7c: 7c 7d 1b 78 mr r29,r3 ffc04b80: 7c 9f 23 78 mr r31,r4 IMFS_jnode_t *node; rtems_filesystem_location_info_t the_link; int result = 0; node = loc->node_access; ffc04b84: 83 c4 00 00 lwz r30,0(r4) /* * If this is the last last pointer to the node * free the node. */ if ( node->type == IMFS_HARD_LINK ) { ffc04b88: 80 1e 00 4c lwz r0,76(r30) ffc04b8c: 2f 80 00 03 cmpwi cr7,r0,3 ffc04b90: 40 9e 00 94 bne- cr7,ffc04c24 if ( !node->info.hard_link.link_node ) ffc04b94: 80 1e 00 50 lwz r0,80(r30) ffc04b98: 2f 80 00 00 cmpwi cr7,r0,0 ffc04b9c: 40 be 00 18 bne+ cr7,ffc04bb4 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); ffc04ba0: 48 00 f7 19 bl ffc142b8 <__errno> <== NOT EXECUTED ffc04ba4: 38 00 00 16 li r0,22 <== NOT EXECUTED ffc04ba8: 90 03 00 00 stw r0,0(r3) <== NOT EXECUTED ffc04bac: 38 00 ff ff li r0,-1 <== NOT EXECUTED ffc04bb0: 48 00 00 90 b ffc04c40 <== NOT EXECUTED the_link = *loc; ffc04bb4: 3b 81 00 10 addi r28,r1,16 the_link.node_access = node->info.hard_link.link_node; IMFS_Set_handlers( &the_link ); ffc04bb8: 7f 83 e3 78 mr r3,r28 if ( node->type == IMFS_HARD_LINK ) { if ( !node->info.hard_link.link_node ) rtems_set_errno_and_return_minus_one( EINVAL ); the_link = *loc; ffc04bbc: 7c a4 a4 aa lswi r5,r4,20 ffc04bc0: 7c bc a5 aa stswi r5,r28,20 the_link.node_access = node->info.hard_link.link_node; ffc04bc4: 90 01 00 10 stw r0,16(r1) IMFS_Set_handlers( &the_link ); ffc04bc8: 48 00 ab a9 bl ffc0f770 /* * 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) ffc04bcc: 81 3e 00 50 lwz r9,80(r30) ffc04bd0: a1 69 00 34 lhz r11,52(r9) ffc04bd4: 2f 8b 00 01 cmpwi cr7,r11,1 ffc04bd8: 40 be 00 2c bne+ cr7,ffc04c04 { result = (*the_link.handlers->rmnod_h)( parentloc, &the_link ); ffc04bdc: 81 21 00 18 lwz r9,24(r1) ffc04be0: 7f a3 eb 78 mr r3,r29 ffc04be4: 7f 84 e3 78 mr r4,r28 ffc04be8: 80 09 00 34 lwz r0,52(r9) ffc04bec: 7c 09 03 a6 mtctr r0 ffc04bf0: 4e 80 04 21 bctrl if ( result != 0 ) return -1; ffc04bf4: 38 00 ff ff li r0,-1 */ if ( node->info.hard_link.link_node->st_nlink == 1) { result = (*the_link.handlers->rmnod_h)( parentloc, &the_link ); if ( result != 0 ) ffc04bf8: 2f 83 00 00 cmpwi cr7,r3,0 ffc04bfc: 41 be 00 28 beq+ cr7,ffc04c24 ffc04c00: 48 00 00 40 b ffc04c40 return -1; } else { node->info.hard_link.link_node->st_nlink --; ffc04c04: 39 6b ff ff addi r11,r11,-1 ffc04c08: b1 69 00 34 sth r11,52(r9) IMFS_update_ctime( node->info.hard_link.link_node ); ffc04c0c: 38 61 00 08 addi r3,r1,8 ffc04c10: 38 80 00 00 li r4,0 ffc04c14: 48 00 05 d1 bl ffc051e4 ffc04c18: 81 3e 00 50 lwz r9,80(r30) ffc04c1c: 80 01 00 08 lwz r0,8(r1) ffc04c20: 90 09 00 48 stw r0,72(r9) /* * Now actually free the node we were asked to free. */ result = (*loc->handlers->rmnod_h)( parentloc, loc ); ffc04c24: 81 3f 00 08 lwz r9,8(r31) ffc04c28: 7f a3 eb 78 mr r3,r29 ffc04c2c: 7f e4 fb 78 mr r4,r31 ffc04c30: 80 09 00 34 lwz r0,52(r9) ffc04c34: 7c 09 03 a6 mtctr r0 ffc04c38: 4e 80 04 21 bctrl ffc04c3c: 7c 60 1b 78 mr r0,r3 return result; } ffc04c40: 39 61 00 38 addi r11,r1,56 ffc04c44: 7c 03 03 78 mr r3,r0 ffc04c48: 48 01 45 5c b ffc191a4 <_restgpr_28_x> =============================================================================== ffc04c4c : #include int IMFS_unmount( rtems_filesystem_mount_table_entry_t *mt_entry ) { ffc04c4c: 7c 08 02 a6 mflr r0 ffc04c50: 94 21 ff f8 stwu r1,-8(r1) ffc04c54: 90 01 00 0c stw r0,12(r1) IMFS_jnode_t *node; node = mt_entry->mt_point_node.node_access; ffc04c58: 81 23 00 08 lwz r9,8(r3) /* * Is the node that we are mounting onto a directory node ? */ if ( node->type != IMFS_DIRECTORY ) ffc04c5c: 80 09 00 4c lwz r0,76(r9) ffc04c60: 2f 80 00 01 cmpwi cr7,r0,1 ffc04c64: 41 be 00 10 beq+ cr7,ffc04c74 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( ENOTDIR ); ffc04c68: 48 00 f6 51 bl ffc142b8 <__errno> <== NOT EXECUTED ffc04c6c: 38 00 00 14 li r0,20 <== NOT EXECUTED ffc04c70: 48 00 00 18 b ffc04c88 <== NOT EXECUTED /* * Did the node indicate that there was a directory mounted here? */ if ( node->info.directory.mt_fs == NULL ) ffc04c74: 80 09 00 5c lwz r0,92(r9) ffc04c78: 2f 80 00 00 cmpwi cr7,r0,0 ffc04c7c: 40 be 00 18 bne+ cr7,ffc04c94 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); /* XXX */ ffc04c80: 48 00 f6 39 bl ffc142b8 <__errno> <== NOT EXECUTED ffc04c84: 38 00 00 16 li r0,22 <== NOT EXECUTED ffc04c88: 90 03 00 00 stw r0,0(r3) <== NOT EXECUTED ffc04c8c: 38 60 ff ff li r3,-1 <== NOT EXECUTED ffc04c90: 48 00 00 10 b ffc04ca0 <== 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; ffc04c94: 38 00 00 00 li r0,0 ffc04c98: 90 09 00 5c stw r0,92(r9) return 0; ffc04c9c: 38 60 00 00 li r3,0 } ffc04ca0: 80 01 00 0c lwz r0,12(r1) ffc04ca4: 38 21 00 08 addi r1,r1,8 ffc04ca8: 7c 08 03 a6 mtlr r0 ffc04cac: 4e 80 00 20 blr =============================================================================== ffc04090 : static rtems_printk_plugin_t print_handler; void Stack_check_Dump_threads_usage( Thread_Control *the_thread ) { ffc04090: 94 21 ff c0 stwu r1,-64(r1) ffc04094: 7c 08 02 a6 mflr r0 ffc04098: 90 01 00 44 stw r0,68(r1) * match pattern */ base += PATTERN_SIZE_WORDS; for (ebase = base + length; base < ebase; base++) if (*base != U32_PATTERN) ffc0409c: 3c 00 a5 a5 lis r0,-23131 ffc040a0: 60 00 a5 a5 ori r0,r0,42405 static rtems_printk_plugin_t print_handler; void Stack_check_Dump_threads_usage( Thread_Control *the_thread ) { ffc040a4: be e1 00 1c stmw r23,28(r1) ffc040a8: 7c 7b 1b 78 mr r27,r3 { stack = &the_thread->Start.Initial_stack; current = (void *)_CPU_Context_Get_SP( &the_thread->Registers ); } low = Stack_check_usable_stack_start(stack); ffc040ac: 81 63 00 bc lwz r11,188(r3) size = Stack_check_usable_stack_size(stack); ffc040b0: 83 83 00 b8 lwz r28,184(r3) { stack = &the_thread->Start.Initial_stack; current = (void *)_CPU_Context_Get_SP( &the_thread->Registers ); } low = Stack_check_usable_stack_start(stack); ffc040b4: 39 6b 00 80 addi r11,r11,128 current = 0; } else #endif { stack = &the_thread->Start.Initial_stack; current = (void *)_CPU_Context_Get_SP( &the_thread->Registers ); ffc040b8: 83 43 00 c8 lwz r26,200(r3) } low = Stack_check_usable_stack_start(stack); size = Stack_check_usable_stack_size(stack); ffc040bc: 3b 9c ff 80 addi r28,r28,-128 /* * start at lower memory and find first word that does not * match pattern */ base += PATTERN_SIZE_WORDS; ffc040c0: 39 2b 00 80 addi r9,r11,128 for (ebase = base + length; base < ebase; base++) ffc040c4: 57 8a 00 3a rlwinm r10,r28,0,0,29 ffc040c8: 7d 49 52 14 add r10,r9,r10 ffc040cc: 48 00 00 14 b ffc040e0 if (*base != U32_PATTERN) ffc040d0: 81 09 00 00 lwz r8,0(r9) ffc040d4: 7f 88 00 00 cmpw cr7,r8,r0 ffc040d8: 40 9e 00 18 bne- cr7,ffc040f0 * start at lower memory and find first word that does not * match pattern */ base += PATTERN_SIZE_WORDS; for (ebase = base + length; base < ebase; base++) ffc040dc: 39 29 00 04 addi r9,r9,4 ffc040e0: 7f 89 50 40 cmplw cr7,r9,r10 ffc040e4: 41 9c ff ec blt+ cr7,ffc040d0 <== ALWAYS TAKEN 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; ffc040e8: 3b a0 00 00 li r29,0 <== NOT EXECUTED ffc040ec: 48 00 00 18 b ffc04104 <== 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 ) ffc040f0: 2f 89 00 00 cmpwi cr7,r9,0 used = Stack_check_Calculate_used( low, size, high_water_mark ); else used = 0; ffc040f4: 3b a0 00 00 li r29,0 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 ) ffc040f8: 41 9e 00 0c beq- cr7,ffc04104 <== NEVER TAKEN used = Stack_check_Calculate_used( low, size, high_water_mark ); ffc040fc: 7f ab e2 14 add r29,r11,r28 ffc04100: 7f a9 e8 50 subf r29,r9,r29 #if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) if ( the_thread ) #endif { (*print_handler)( ffc04104: 3f c0 00 00 lis r30,0 ffc04108: 83 1b 00 08 lwz r24,8(r27) ffc0410c: 3b fe 28 f4 addi r31,r30,10484 ffc04110: 83 3e 28 f4 lwz r25,10484(r30) ffc04114: 82 ff 00 04 lwz r23,4(r31) ffc04118: 38 80 00 05 li r4,5 ffc0411c: 38 a1 00 08 addi r5,r1,8 ffc04120: 7f 03 c3 78 mr r3,r24 ffc04124: 48 00 63 ad bl ffc0a4d0 ffc04128: 3c 80 ff c2 lis r4,-62 ffc0412c: 7c 66 1b 78 mr r6,r3 ffc04130: 7f 29 03 a6 mtctr r25 ffc04134: 38 84 9d e8 addi r4,r4,-25112 ffc04138: 7f 05 c3 78 mr r5,r24 ffc0413c: 7e e3 bb 78 mr r3,r23 ffc04140: 4c c6 31 82 crclr 4*cr1+eq ffc04144: 4e 80 04 21 bctrl (*print_handler)( print_context, " %010p - %010p %010p %8" PRId32 " ", stack->area, stack->area + stack->size - 1, ffc04148: 80 db 00 b8 lwz r6,184(r27) else { (*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 ); } #endif (*print_handler)( ffc0414c: 80 1e 28 f4 lwz r0,10484(r30) ffc04150: 3c 80 ff c2 lis r4,-62 print_context, " %010p - %010p %010p %8" PRId32 " ", stack->area, stack->area + stack->size - 1, ffc04154: 80 bb 00 bc lwz r5,188(r27) ffc04158: 38 c6 ff ff addi r6,r6,-1 else { (*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 ); } #endif (*print_handler)( ffc0415c: 7c 09 03 a6 mtctr r0 ffc04160: 80 7f 00 04 lwz r3,4(r31) ffc04164: 38 84 9d f5 addi r4,r4,-25099 ffc04168: 7c c5 32 14 add r6,r5,r6 ffc0416c: 7f 47 d3 78 mr r7,r26 ffc04170: 7f 88 e3 78 mr r8,r28 ffc04174: 4c c6 31 82 crclr 4*cr1+eq ffc04178: 4e 80 04 21 bctrl stack->area + stack->size - 1, current, size ); if (Stack_check_Initialized == 0) { ffc0417c: 80 1f 00 08 lwz r0,8(r31) ffc04180: 2f 80 00 00 cmpwi cr7,r0,0 ffc04184: 40 be 00 24 bne+ cr7,ffc041a8 <== ALWAYS TAKEN (*print_handler)( print_context, "Unavailable\n" ); ffc04188: 80 1e 28 f4 lwz r0,10484(r30) <== NOT EXECUTED ffc0418c: 3c 80 ff c2 lis r4,-62 <== NOT EXECUTED ffc04190: 80 7f 00 04 lwz r3,4(r31) <== NOT EXECUTED ffc04194: 38 84 9e 13 addi r4,r4,-25069 <== NOT EXECUTED ffc04198: 7c 09 03 a6 mtctr r0 <== NOT EXECUTED ffc0419c: 4c c6 31 82 crclr 4*cr1+eq <== NOT EXECUTED ffc041a0: 4e 80 04 21 bctrl <== NOT EXECUTED ffc041a4: 48 00 00 24 b ffc041c8 <== NOT EXECUTED } else { (*print_handler)( print_context, "%8" PRId32 "\n", used ); ffc041a8: 80 1e 28 f4 lwz r0,10484(r30) ffc041ac: 3c 80 ff c2 lis r4,-62 ffc041b0: 80 7f 00 04 lwz r3,4(r31) ffc041b4: 38 84 9e 20 addi r4,r4,-25056 ffc041b8: 7f a5 eb 78 mr r5,r29 ffc041bc: 7c 09 03 a6 mtctr r0 ffc041c0: 4c c6 31 82 crclr 4*cr1+eq ffc041c4: 4e 80 04 21 bctrl } } ffc041c8: 39 61 00 40 addi r11,r1,64 ffc041cc: 4b ff c9 4c b ffc00b18 <_restgpr_23_x> =============================================================================== ffc042a0 : Thread_Control *running, bool pattern_ok ) RTEMS_COMPILER_NO_RETURN_ATTRIBUTE; void Stack_check_report_blown_task(Thread_Control *running, bool pattern_ok) { ffc042a0: 94 21 ff c8 stwu r1,-56(r1) ffc042a4: 7c 08 02 a6 mflr r0 ffc042a8: 90 01 00 3c stw r0,60(r1) ffc042ac: bf a1 00 2c stmw r29,44(r1) ffc042b0: 7c 7d 1b 78 mr r29,r3 ffc042b4: 7c 9e 23 78 mr r30,r4 Stack_Control *stack = &running->Start.Initial_stack; void *pattern_area = Stack_check_Get_pattern(stack); ffc042b8: 83 e3 00 bc lwz r31,188(r3) char name[32]; printk("BLOWN STACK!!!\n"); ffc042bc: 3c 60 ff c2 lis r3,-62 ffc042c0: 38 63 9e 26 addi r3,r3,-25050 ffc042c4: 4c c6 31 82 crclr 4*cr1+eq ffc042c8: 48 00 1f 95 bl ffc0625c printk("task control block: 0x%08" PRIxPTR "\n", running); ffc042cc: 3c 60 ff c2 lis r3,-62 ffc042d0: 38 63 9e 36 addi r3,r3,-25034 ffc042d4: 7f a4 eb 78 mr r4,r29 ffc042d8: 4c c6 31 82 crclr 4*cr1+eq ffc042dc: 48 00 1f 81 bl ffc0625c printk("task ID: 0x%08lx\n", (unsigned long) running->Object.id); ffc042e0: 80 9d 00 08 lwz r4,8(r29) ffc042e4: 3c 60 ff c2 lis r3,-62 ffc042e8: 38 63 9e 53 addi r3,r3,-25005 ffc042ec: 4c c6 31 82 crclr 4*cr1+eq ffc042f0: 48 00 1f 6d bl ffc0625c printk( ffc042f4: 80 9d 00 0c lwz r4,12(r29) ffc042f8: 3c 60 ff c2 lis r3,-62 ffc042fc: 38 63 9e 65 addi r3,r3,-24987 ffc04300: 4c c6 31 82 crclr 4*cr1+eq ffc04304: 48 00 1f 59 bl ffc0625c "task name: 0x%08" PRIx32 "\n", running->Object.name.name_u32 ); printk( ffc04308: 80 7d 00 08 lwz r3,8(r29) ffc0430c: 38 a1 00 08 addi r5,r1,8 ffc04310: 38 80 00 20 li r4,32 ffc04314: 48 00 61 bd bl ffc0a4d0 ffc04318: 7c 64 1b 78 mr r4,r3 ffc0431c: 3c 60 ff c2 lis r3,-62 ffc04320: 38 63 9e 79 addi r3,r3,-24967 ffc04324: 4c c6 31 82 crclr 4*cr1+eq ffc04328: 48 00 1f 35 bl ffc0625c ); printk( "task stack area (%lu Bytes): 0x%08" PRIxPTR " .. 0x%08" PRIxPTR "\n", (unsigned long) stack->size, stack->area, ((char *) stack->area + stack->size) ffc0432c: 80 bd 00 bc lwz r5,188(r29) ffc04330: 80 9d 00 b8 lwz r4,184(r29) ); printk( "task name string: %s\n", rtems_object_get_name(running->Object.id, sizeof(name), name) ); printk( ffc04334: 3c 60 ff c2 lis r3,-62 ffc04338: 38 63 9e 8f addi r3,r3,-24945 ffc0433c: 7c c5 22 14 add r6,r5,r4 ffc04340: 4c c6 31 82 crclr 4*cr1+eq ffc04344: 48 00 1f 19 bl ffc0625c "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) { ffc04348: 2f 9e 00 00 cmpwi cr7,r30,0 ffc0434c: 40 be 00 20 bne+ cr7,ffc0436c <== NEVER TAKEN printk( ffc04350: 3c 60 ff c2 lis r3,-62 ffc04354: 38 63 9e c0 addi r3,r3,-24896 ffc04358: 38 80 00 80 li r4,128 ffc0435c: 38 bf 00 08 addi r5,r31,8 ffc04360: 38 df 00 88 addi r6,r31,136 ffc04364: 4c c6 31 82 crclr 4*cr1+eq ffc04368: 48 00 1e f5 bl ffc0625c rtems_configuration_get_user_multiprocessing_table()->node ); } #endif rtems_fatal_error_occurred(0x81); ffc0436c: 38 60 00 81 li r3,129 ffc04370: 48 00 6a ed bl ffc0ae5c =============================================================================== ffc0b15c <_CORE_RWLock_Release>: */ CORE_RWLock_Status _CORE_RWLock_Release( CORE_RWLock_Control *the_rwlock ) { ffc0b15c: 7c 2b 0b 78 mr r11,r1 ffc0b160: 7c 08 02 a6 mflr r0 ffc0b164: 94 21 ff f0 stwu r1,-16(r1) ISR_Level level; Thread_Control *executing = _Thread_Executing; ffc0b168: 3d 20 00 00 lis r9,0 */ CORE_RWLock_Status _CORE_RWLock_Release( CORE_RWLock_Control *the_rwlock ) { ffc0b16c: 90 01 00 14 stw r0,20(r1) ffc0b170: 48 00 cd 1d bl ffc17e8c <_savegpr_31> ffc0b174: 7c 7f 1b 78 mr r31,r3 ISR_Level level; Thread_Control *executing = _Thread_Executing; ffc0b178: 81 69 31 30 lwz r11,12592(r9) static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc0b17c: 7c 00 00 a6 mfmsr r0 ffc0b180: 7d 30 42 a6 mfsprg r9,0 ffc0b184: 7c 09 48 78 andc r9,r0,r9 ffc0b188: 7d 20 01 24 mtmsr r9 * If locked for reading and no waiters, then OK to read. * If any thread is waiting, then we wait. */ _ISR_Disable( level ); if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){ ffc0b18c: 81 23 00 44 lwz r9,68(r3) ffc0b190: 2f 89 00 00 cmpwi cr7,r9,0 ffc0b194: 40 be 00 14 bne+ cr7,ffc0b1a8 <_CORE_RWLock_Release+0x4c> return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc0b198: 7c 00 01 24 mtmsr r0 _ISR_Enable( level ); executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE; ffc0b19c: 38 00 00 02 li r0,2 ffc0b1a0: 90 0b 00 34 stw r0,52(r11) return CORE_RWLOCK_SUCCESSFUL; ffc0b1a4: 48 00 00 a8 b ffc0b24c <_CORE_RWLock_Release+0xf0> } if ( the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_READING ) { ffc0b1a8: 2f 89 00 01 cmpwi cr7,r9,1 ffc0b1ac: 40 9e 00 20 bne- cr7,ffc0b1cc <_CORE_RWLock_Release+0x70> the_rwlock->number_of_readers -= 1; ffc0b1b0: 81 23 00 48 lwz r9,72(r3) ffc0b1b4: 39 29 ff ff addi r9,r9,-1 if ( the_rwlock->number_of_readers != 0 ) { ffc0b1b8: 2f 89 00 00 cmpwi cr7,r9,0 _ISR_Enable( level ); executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE; return CORE_RWLOCK_SUCCESSFUL; } if ( the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_READING ) { the_rwlock->number_of_readers -= 1; ffc0b1bc: 91 23 00 48 stw r9,72(r3) if ( the_rwlock->number_of_readers != 0 ) { ffc0b1c0: 41 be 00 0c beq+ cr7,ffc0b1cc <_CORE_RWLock_Release+0x70> ffc0b1c4: 7c 00 01 24 mtmsr r0 /* must be unlocked again */ _ISR_Enable( level ); return CORE_RWLOCK_SUCCESSFUL; ffc0b1c8: 48 00 00 84 b ffc0b24c <_CORE_RWLock_Release+0xf0> } } /* CORE_RWLOCK_LOCKED_FOR_WRITING or READING with readers */ executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL; ffc0b1cc: 39 20 00 00 li r9,0 ffc0b1d0: 91 2b 00 34 stw r9,52(r11) /* * Implicitly transition to "unlocked" and find another thread interested * in obtaining this rwlock. */ the_rwlock->current_state = CORE_RWLOCK_UNLOCKED; ffc0b1d4: 91 3f 00 44 stw r9,68(r31) ffc0b1d8: 7c 00 01 24 mtmsr r0 _ISR_Enable( level ); next = _Thread_queue_Dequeue( &the_rwlock->Wait_queue ); ffc0b1dc: 7f e3 fb 78 mr r3,r31 ffc0b1e0: 48 00 1d d1 bl ffc0cfb0 <_Thread_queue_Dequeue> if ( next ) { ffc0b1e4: 2c 03 00 00 cmpwi r3,0 ffc0b1e8: 41 82 00 64 beq- ffc0b24c <_CORE_RWLock_Release+0xf0> if ( next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) { ffc0b1ec: 80 03 00 30 lwz r0,48(r3) ffc0b1f0: 2f 80 00 01 cmpwi cr7,r0,1 ffc0b1f4: 40 be 00 10 bne+ cr7,ffc0b204 <_CORE_RWLock_Release+0xa8> the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_WRITING; ffc0b1f8: 38 00 00 02 li r0,2 ffc0b1fc: 90 1f 00 44 stw r0,68(r31) return CORE_RWLOCK_SUCCESSFUL; ffc0b200: 48 00 00 4c b ffc0b24c <_CORE_RWLock_Release+0xf0> } /* * Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING */ the_rwlock->number_of_readers += 1; ffc0b204: 81 3f 00 48 lwz r9,72(r31) ffc0b208: 38 09 00 01 addi r0,r9,1 ffc0b20c: 90 1f 00 48 stw r0,72(r31) the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING; ffc0b210: 38 00 00 01 li r0,1 ffc0b214: 90 1f 00 44 stw r0,68(r31) /* * Now see if more readers can be let go. */ while ( 1 ) { next = _Thread_queue_First( &the_rwlock->Wait_queue ); ffc0b218: 7f e3 fb 78 mr r3,r31 ffc0b21c: 48 00 22 fd bl ffc0d518 <_Thread_queue_First> if ( !next || ffc0b220: 7c 64 1b 79 mr. r4,r3 ffc0b224: 41 82 00 28 beq- ffc0b24c <_CORE_RWLock_Release+0xf0> ffc0b228: 80 04 00 30 lwz r0,48(r4) ffc0b22c: 2f 80 00 01 cmpwi cr7,r0,1 ffc0b230: 41 9e 00 1c beq- cr7,ffc0b24c <_CORE_RWLock_Release+0xf0><== NEVER TAKEN next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) return CORE_RWLOCK_SUCCESSFUL; the_rwlock->number_of_readers += 1; ffc0b234: 81 3f 00 48 lwz r9,72(r31) _Thread_queue_Extract( &the_rwlock->Wait_queue, next ); ffc0b238: 7f e3 fb 78 mr r3,r31 while ( 1 ) { next = _Thread_queue_First( &the_rwlock->Wait_queue ); if ( !next || next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) return CORE_RWLOCK_SUCCESSFUL; the_rwlock->number_of_readers += 1; ffc0b23c: 38 09 00 01 addi r0,r9,1 ffc0b240: 90 1f 00 48 stw r0,72(r31) _Thread_queue_Extract( &the_rwlock->Wait_queue, next ); ffc0b244: 48 00 21 65 bl ffc0d3a8 <_Thread_queue_Extract> } ffc0b248: 4b ff ff d0 b ffc0b218 <_CORE_RWLock_Release+0xbc> } /* indentation is to match _ISR_Disable at top */ return CORE_RWLOCK_SUCCESSFUL; } ffc0b24c: 39 61 00 10 addi r11,r1,16 ffc0b250: 38 60 00 00 li r3,0 ffc0b254: 4b ff 6b e8 b ffc01e3c <_restgpr_31_x> =============================================================================== ffc0b258 <_CORE_RWLock_Timeout>: void _CORE_RWLock_Timeout( Objects_Id id, void *ignored ) { ffc0b258: 94 21 ff e8 stwu r1,-24(r1) ffc0b25c: 7c 08 02 a6 mflr r0 Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); ffc0b260: 38 81 00 08 addi r4,r1,8 void _CORE_RWLock_Timeout( Objects_Id id, void *ignored ) { ffc0b264: 90 01 00 1c stw r0,28(r1) Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); ffc0b268: 48 00 19 d5 bl ffc0cc3c <_Thread_Get> switch ( location ) { ffc0b26c: 80 01 00 08 lwz r0,8(r1) ffc0b270: 2f 80 00 00 cmpwi cr7,r0,0 ffc0b274: 40 9e 00 18 bne- cr7,ffc0b28c <_CORE_RWLock_Timeout+0x34><== NEVER TAKEN #if defined(RTEMS_MULTIPROCESSING) case OBJECTS_REMOTE: /* impossible */ #endif break; case OBJECTS_LOCAL: _Thread_queue_Process_timeout( the_thread ); ffc0b278: 48 00 23 c1 bl ffc0d638 <_Thread_queue_Process_timeout> */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; ffc0b27c: 3d 20 00 00 lis r9,0 ffc0b280: 81 69 28 14 lwz r11,10260(r9) ffc0b284: 38 0b ff ff addi r0,r11,-1 ffc0b288: 90 09 28 14 stw r0,10260(r9) _Thread_Unnest_dispatch(); break; } } ffc0b28c: 80 01 00 1c lwz r0,28(r1) ffc0b290: 38 21 00 18 addi r1,r1,24 ffc0b294: 7c 08 03 a6 mtlr r0 ffc0b298: 4e 80 00 20 blr =============================================================================== ffc119ec <_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 ) { ffc119ec: 94 21 ff e0 stwu r1,-32(r1) ffc119f0: 7c 08 02 a6 mflr r0 /* * 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)) { ffc119f4: 7c c9 33 78 mr r9,r6 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 ) { ffc119f8: 90 01 00 24 stw r0,36(r1) size_t message_buffering_required; size_t allocated_message_size; the_message_queue->maximum_pending_messages = maximum_pending_messages; the_message_queue->number_of_pending_messages = 0; ffc119fc: 38 00 00 00 li r0,0 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 ) { ffc11a00: bf 81 00 10 stmw r28,16(r1) ffc11a04: 7c 7f 1b 78 mr r31,r3 ffc11a08: 7c 9d 23 78 mr r29,r4 size_t message_buffering_required; size_t allocated_message_size; the_message_queue->maximum_pending_messages = maximum_pending_messages; the_message_queue->number_of_pending_messages = 0; ffc11a0c: 90 03 00 48 stw r0,72(r3) CORE_message_queue_Control *the_message_queue, CORE_message_queue_Notify_Handler the_handler, void *the_argument ) { the_message_queue->notify_handler = the_handler; ffc11a10: 90 03 00 60 stw r0,96(r3) the_message_queue->notify_argument = the_argument; ffc11a14: 90 03 00 64 stw r0,100(r3) /* * 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)) { ffc11a18: 70 c0 00 03 andi. r0,r6,3 ) { size_t message_buffering_required; size_t allocated_message_size; the_message_queue->maximum_pending_messages = maximum_pending_messages; ffc11a1c: 90 a3 00 44 stw r5,68(r3) the_message_queue->number_of_pending_messages = 0; the_message_queue->maximum_message_size = maximum_message_size; ffc11a20: 90 c3 00 4c stw r6,76(r3) /* * 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)) { ffc11a24: 41 82 00 18 beq- ffc11a3c <_CORE_message_queue_Initialize+0x50> allocated_message_size += sizeof(uint32_t); ffc11a28: 39 26 00 04 addi r9,r6,4 allocated_message_size &= ~(sizeof(uint32_t) - 1); ffc11a2c: 55 29 00 3a rlwinm r9,r9,0,0,29 } if (allocated_message_size < maximum_message_size) ffc11a30: 7f 89 30 40 cmplw cr7,r9,r6 return false; ffc11a34: 3b c0 00 00 li r30,0 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) ffc11a38: 41 bc 00 78 blt+ cr7,ffc11ab0 <_CORE_message_queue_Initialize+0xc4><== 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)); ffc11a3c: 3b 89 00 14 addi r28,r9,20 /* * 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 * ffc11a40: 7c 7c 29 d6 mullw r3,r28,r5 (allocated_message_size + sizeof(CORE_message_queue_Buffer_control)); if (message_buffering_required < allocated_message_size) return false; ffc11a44: 3b c0 00 00 li r30,0 * 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) ffc11a48: 7f 83 48 40 cmplw cr7,r3,r9 ffc11a4c: 41 bc 00 64 blt+ cr7,ffc11ab0 <_CORE_message_queue_Initialize+0xc4><== NEVER TAKEN /* * Attempt to allocate the message memory */ the_message_queue->message_buffers = (CORE_message_queue_Buffer *) _Workspace_Allocate( message_buffering_required ); ffc11a50: 90 a1 00 08 stw r5,8(r1) ffc11a54: 48 00 33 85 bl ffc14dd8 <_Workspace_Allocate> if (the_message_queue->message_buffers == 0) ffc11a58: 2f 83 00 00 cmpwi cr7,r3,0 /* * Attempt to allocate the message memory */ the_message_queue->message_buffers = (CORE_message_queue_Buffer *) _Workspace_Allocate( message_buffering_required ); ffc11a5c: 7c 64 1b 78 mr r4,r3 return false; /* * Attempt to allocate the message memory */ the_message_queue->message_buffers = (CORE_message_queue_Buffer *) ffc11a60: 90 7f 00 5c stw r3,92(r31) _Workspace_Allocate( message_buffering_required ); if (the_message_queue->message_buffers == 0) ffc11a64: 80 a1 00 08 lwz r5,8(r1) ffc11a68: 41 9e 00 48 beq- cr7,ffc11ab0 <_CORE_message_queue_Initialize+0xc4> /* * Initialize the pool of inactive messages, pending messages, * and set of waiting threads. */ _Chain_Initialize ( ffc11a6c: 38 7f 00 68 addi r3,r31,104 ffc11a70: 7f 86 e3 78 mr r6,r28 ffc11a74: 48 00 5a 31 bl ffc174a4 <_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 ); ffc11a78: 38 1f 00 54 addi r0,r31,84 head->next = tail; ffc11a7c: 90 1f 00 50 stw r0,80(r31) */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { Chain_Node *head = _Chain_Head( the_chain ); ffc11a80: 38 1f 00 50 addi r0,r31,80 allocated_message_size + sizeof( CORE_message_queue_Buffer_control ) ); _Chain_Initialize_empty( &the_message_queue->Pending_messages ); _Thread_queue_Initialize( ffc11a84: 7f e3 fb 78 mr r3,r31 Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; head->previous = NULL; ffc11a88: 93 df 00 54 stw r30,84(r31) ffc11a8c: 38 a0 00 80 li r5,128 ffc11a90: 38 c0 00 06 li r6,6 tail->previous = head; ffc11a94: 90 1f 00 58 stw r0,88(r31) THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO, STATES_WAITING_FOR_MESSAGE, CORE_MESSAGE_QUEUE_STATUS_TIMEOUT ); return true; ffc11a98: 3b c0 00 01 li r30,1 allocated_message_size + sizeof( CORE_message_queue_Buffer_control ) ); _Chain_Initialize_empty( &the_message_queue->Pending_messages ); _Thread_queue_Initialize( ffc11a9c: 80 9d 00 00 lwz r4,0(r29) ffc11aa0: 68 84 00 01 xori r4,r4,1 ffc11aa4: 7c 84 00 34 cntlzw r4,r4 ffc11aa8: 54 84 d9 7e rlwinm r4,r4,27,5,31 ffc11aac: 48 00 27 e9 bl ffc14294 <_Thread_queue_Initialize> STATES_WAITING_FOR_MESSAGE, CORE_MESSAGE_QUEUE_STATUS_TIMEOUT ); return true; } ffc11ab0: 39 61 00 20 addi r11,r1,32 ffc11ab4: 7f c3 f3 78 mr r3,r30 ffc11ab8: 4b ff 3f 20 b ffc059d8 <_restgpr_28_x> =============================================================================== ffc11abc <_CORE_message_queue_Seize>: void *buffer, size_t *size_p, bool wait, Watchdog_Interval timeout ) { ffc11abc: 94 21 ff e8 stwu r1,-24(r1) ffc11ac0: 7c 08 02 a6 mflr r0 ISR_Level level; CORE_message_queue_Buffer_control *the_message; Thread_Control *executing; executing = _Thread_Executing; ffc11ac4: 3d 60 00 00 lis r11,0 void *buffer, size_t *size_p, bool wait, Watchdog_Interval timeout ) { ffc11ac8: 90 01 00 1c stw r0,28(r1) ISR_Level level; CORE_message_queue_Buffer_control *the_message; Thread_Control *executing; executing = _Thread_Executing; executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL; ffc11acc: 39 40 00 00 li r10,0 void *buffer, size_t *size_p, bool wait, Watchdog_Interval timeout ) { ffc11ad0: 7c 80 23 78 mr r0,r4 ffc11ad4: bf a1 00 0c stmw r29,12(r1) ffc11ad8: 7c a9 2b 78 mr r9,r5 ffc11adc: 7c 7f 1b 78 mr r31,r3 ISR_Level level; CORE_message_queue_Buffer_control *the_message; Thread_Control *executing; executing = _Thread_Executing; ffc11ae0: 81 6b 32 d0 lwz r11,13008(r11) executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL; ffc11ae4: 91 4b 00 34 stw r10,52(r11) static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc11ae8: 7d 40 00 a6 mfmsr r10 ffc11aec: 7c b0 42 a6 mfsprg r5,0 ffc11af0: 7d 45 28 78 andc r5,r10,r5 ffc11af4: 7c a0 01 24 mtmsr r5 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 ); } ffc11af8: 83 c3 00 50 lwz r30,80(r3) RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); ffc11afc: 38 a3 00 54 addi r5,r3,84 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected( Chain_Control *the_chain ) { if ( !_Chain_Is_empty(the_chain)) ffc11b00: 7f 9e 28 00 cmpw cr7,r30,r5 ffc11b04: 41 9e 00 a4 beq- cr7,ffc11ba8 <_CORE_message_queue_Seize+0xec> 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 ) { ffc11b08: 2f 9e 00 00 cmpwi cr7,r30,0 Chain_Control *the_chain ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *old_first = head->next; Chain_Node *new_first = old_first->next; ffc11b0c: 80 9e 00 00 lwz r4,0(r30) head->next = new_first; ffc11b10: 7c 65 1b 78 mr r5,r3 ffc11b14: 94 85 00 50 stwu r4,80(r5) new_first->previous = head; ffc11b18: 90 a4 00 04 stw r5,4(r4) ffc11b1c: 41 9e 00 8c beq- cr7,ffc11ba8 <_CORE_message_queue_Seize+0xec><== NEVER TAKEN the_message_queue->number_of_pending_messages -= 1; ffc11b20: 81 63 00 48 lwz r11,72(r3) ffc11b24: 38 0b ff ff addi r0,r11,-1 ffc11b28: 90 03 00 48 stw r0,72(r3) return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc11b2c: 7d 40 01 24 mtmsr r10 _ISR_Enable( level ); *size_p = the_message->Contents.size; ffc11b30: 80 be 00 0c lwz r5,12(r30) _Thread_Executing->Wait.count = ffc11b34: 3d 60 00 00 lis r11,0 ffc11b38: 81 6b 32 d0 lwz r11,13008(r11) _CORE_message_queue_Get_message_priority( the_message ); _CORE_message_queue_Copy_buffer( the_message->Contents.buffer, ffc11b3c: 3b be 00 10 addi r29,r30,16 the_message = _CORE_message_queue_Get_pending_message( the_message_queue ); if ( the_message != NULL ) { the_message_queue->number_of_pending_messages -= 1; _ISR_Enable( level ); *size_p = the_message->Contents.size; ffc11b40: 90 a6 00 00 stw r5,0(r6) const void *source, void *destination, size_t size ) { memcpy(destination, source, size); ffc11b44: 7d 23 4b 78 mr r3,r9 ffc11b48: 7f a4 eb 78 mr r4,r29 _Thread_Executing->Wait.count = ffc11b4c: 80 1e 00 08 lwz r0,8(r30) ffc11b50: 90 0b 00 24 stw r0,36(r11) ffc11b54: 48 00 8b e9 bl ffc1a73c * 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 ); ffc11b58: 7f e3 fb 78 mr r3,r31 ffc11b5c: 48 00 22 c5 bl ffc13e20 <_Thread_queue_Dequeue> if ( !the_thread ) { ffc11b60: 7c 69 1b 79 mr. r9,r3 ffc11b64: 40 a2 00 14 bne+ ffc11b78 <_CORE_message_queue_Seize+0xbc> 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 ); ffc11b68: 38 7f 00 68 addi r3,r31,104 ffc11b6c: 7f c4 f3 78 mr r4,r30 ffc11b70: 4b ff fd b9 bl ffc11928 <_Chain_Append> _CORE_message_queue_Free_message_buffer( the_message_queue, the_message ); return; ffc11b74: 48 00 00 7c b ffc11bf0 <_CORE_message_queue_Seize+0x134> CORE_message_queue_Buffer_control *the_message, int priority ) { #if defined(RTEMS_SCORE_COREMSG_ENABLE_MESSAGE_PRIORITY) the_message->priority = priority; ffc11b78: 80 09 00 24 lwz r0,36(r9) const void *source, void *destination, size_t size ) { memcpy(destination, source, size); ffc11b7c: 7f a3 eb 78 mr r3,r29 */ _CORE_message_queue_Set_message_priority( the_message, the_thread->Wait.count ); the_message->Contents.size = (size_t) the_thread->Wait.option; ffc11b80: 80 a9 00 30 lwz r5,48(r9) ffc11b84: 80 89 00 2c lwz r4,44(r9) ffc11b88: 90 be 00 0c stw r5,12(r30) CORE_message_queue_Buffer_control *the_message, int priority ) { #if defined(RTEMS_SCORE_COREMSG_ENABLE_MESSAGE_PRIORITY) the_message->priority = priority; ffc11b8c: 90 1e 00 08 stw r0,8(r30) const void *source, void *destination, size_t size ) { memcpy(destination, source, size); ffc11b90: 48 00 8b ad bl ffc1a73c the_thread->Wait.return_argument_second.immutable_object, the_message->Contents.buffer, the_message->Contents.size ); _CORE_message_queue_Insert_message( ffc11b94: 80 be 00 08 lwz r5,8(r30) ffc11b98: 7f e3 fb 78 mr r3,r31 ffc11b9c: 7f c4 f3 78 mr r4,r30 ffc11ba0: 48 00 59 55 bl ffc174f4 <_CORE_message_queue_Insert_message> the_message_queue, the_message, _CORE_message_queue_Get_message_priority( the_message ) ); return; ffc11ba4: 48 00 00 4c b ffc11bf0 <_CORE_message_queue_Seize+0x134> } #endif } if ( !wait ) { ffc11ba8: 2f 87 00 00 cmpwi cr7,r7,0 ffc11bac: 40 9e 00 14 bne- cr7,ffc11bc0 <_CORE_message_queue_Seize+0x104> ffc11bb0: 7d 40 01 24 mtmsr r10 _ISR_Enable( level ); executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT; ffc11bb4: 38 00 00 04 li r0,4 ffc11bb8: 90 0b 00 34 stw r0,52(r11) return; ffc11bbc: 48 00 00 34 b ffc11bf0 <_CORE_message_queue_Seize+0x134> 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; ffc11bc0: 38 e0 00 01 li r7,1 ffc11bc4: 90 ff 00 30 stw r7,48(r31) } _Thread_queue_Enter_critical_section( &the_message_queue->Wait_queue ); executing->Wait.queue = &the_message_queue->Wait_queue; ffc11bc8: 93 eb 00 44 stw r31,68(r11) executing->Wait.id = id; ffc11bcc: 90 0b 00 20 stw r0,32(r11) executing->Wait.return_argument_second.mutable_object = buffer; ffc11bd0: 91 2b 00 2c stw r9,44(r11) executing->Wait.return_argument = size_p; ffc11bd4: 90 cb 00 28 stw r6,40(r11) ffc11bd8: 7d 40 01 24 mtmsr r10 /* Wait.count will be filled in with the message priority */ _ISR_Enable( level ); _Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout ); ffc11bdc: 3c a0 ff c1 lis r5,-63 ffc11be0: 7f e3 fb 78 mr r3,r31 ffc11be4: 7d 04 43 78 mr r4,r8 ffc11be8: 38 a5 43 70 addi r5,r5,17264 ffc11bec: 48 00 23 cd bl ffc13fb8 <_Thread_queue_Enqueue_with_handler> } ffc11bf0: 39 61 00 18 addi r11,r1,24 ffc11bf4: 4b ff 3d e8 b ffc059dc <_restgpr_29_x> =============================================================================== ffc09954 <_CORE_mutex_Seize>: Objects_Id _id, bool _wait, Watchdog_Interval _timeout, ISR_Level _level ) { ffc09954: 94 21 ff e0 stwu r1,-32(r1) ffc09958: 7c 08 02 a6 mflr r0 _CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level ); ffc0995c: 3d 20 00 00 lis r9,0 Objects_Id _id, bool _wait, Watchdog_Interval _timeout, ISR_Level _level ) { ffc09960: 90 01 00 24 stw r0,36(r1) _CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level ); ffc09964: 80 09 28 04 lwz r0,10244(r9) Objects_Id _id, bool _wait, Watchdog_Interval _timeout, ISR_Level _level ) { ffc09968: bf 81 00 10 stmw r28,16(r1) ffc0996c: 7c 7f 1b 78 mr r31,r3 _CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level ); ffc09970: 2f 80 00 00 cmpwi cr7,r0,0 Objects_Id _id, bool _wait, Watchdog_Interval _timeout, ISR_Level _level ) { ffc09974: 7c 9e 23 78 mr r30,r4 ffc09978: 90 e1 00 08 stw r7,8(r1) ffc0997c: 7c bd 2b 78 mr r29,r5 ffc09980: 7c dc 33 78 mr r28,r6 _CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level ); ffc09984: 41 9e 00 2c beq- cr7,ffc099b0 <_CORE_mutex_Seize+0x5c> ffc09988: 2f 85 00 00 cmpwi cr7,r5,0 ffc0998c: 41 9e 00 24 beq- cr7,ffc099b0 <_CORE_mutex_Seize+0x5c> <== NEVER TAKEN ffc09990: 3d 20 00 00 lis r9,0 ffc09994: 80 09 28 48 lwz r0,10312(r9) ffc09998: 2b 80 00 01 cmplwi cr7,r0,1 ffc0999c: 40 bd 00 14 ble+ cr7,ffc099b0 <_CORE_mutex_Seize+0x5c> ffc099a0: 38 60 00 00 li r3,0 ffc099a4: 38 80 00 00 li r4,0 ffc099a8: 38 a0 00 12 li r5,18 ffc099ac: 48 00 07 19 bl ffc0a0c4 <_Internal_error_Occurred> ffc099b0: 7f e3 fb 78 mr r3,r31 ffc099b4: 38 81 00 08 addi r4,r1,8 ffc099b8: 48 00 83 25 bl ffc11cdc <_CORE_mutex_Seize_interrupt_trylock> ffc099bc: 2f 83 00 00 cmpwi cr7,r3,0 ffc099c0: 41 9e 00 64 beq- cr7,ffc09a24 <_CORE_mutex_Seize+0xd0> ffc099c4: 2f 9d 00 00 cmpwi cr7,r29,0 ffc099c8: 3d 20 00 00 lis r9,0 ffc099cc: 39 29 31 e4 addi r9,r9,12772 ffc099d0: 40 9e 00 1c bne- cr7,ffc099ec <_CORE_mutex_Seize+0x98> ffc099d4: 80 01 00 08 lwz r0,8(r1) ffc099d8: 7c 00 01 24 mtmsr r0 ffc099dc: 81 29 00 0c lwz r9,12(r9) ffc099e0: 38 00 00 01 li r0,1 ffc099e4: 90 09 00 34 stw r0,52(r9) ffc099e8: 48 00 00 3c b ffc09a24 <_CORE_mutex_Seize+0xd0> ffc099ec: 81 29 00 0c lwz r9,12(r9) 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; ffc099f0: 38 00 00 01 li r0,1 ffc099f4: 90 1f 00 30 stw r0,48(r31) ffc099f8: 93 e9 00 44 stw r31,68(r9) ffc099fc: 93 c9 00 20 stw r30,32(r9) ffc09a00: 3d 20 00 00 lis r9,0 ffc09a04: 81 69 28 04 lwz r11,10244(r9) ffc09a08: 38 0b 00 01 addi r0,r11,1 ffc09a0c: 90 09 28 04 stw r0,10244(r9) ffc09a10: 80 01 00 08 lwz r0,8(r1) ffc09a14: 7c 00 01 24 mtmsr r0 ffc09a18: 7f e3 fb 78 mr r3,r31 ffc09a1c: 7f 84 e3 78 mr r4,r28 ffc09a20: 4b ff fe c1 bl ffc098e0 <_CORE_mutex_Seize_interrupt_blocking> } ffc09a24: 39 61 00 20 addi r11,r1,32 ffc09a28: 48 00 f7 7c b ffc191a4 <_restgpr_28_x> =============================================================================== ffc09bcc <_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 ) { ffc09bcc: 7c 08 02 a6 mflr r0 ffc09bd0: 7c 2b 0b 78 mr r11,r1 ffc09bd4: 94 21 ff f0 stwu r1,-16(r1) ffc09bd8: 90 01 00 14 stw r0,20(r1) ffc09bdc: 48 00 f5 89 bl ffc19164 <_savegpr_31> ffc09be0: 7c 7f 1b 78 mr r31,r3 ISR_Level level; CORE_semaphore_Status status; status = CORE_SEMAPHORE_STATUS_SUCCESSFUL; if ( (the_thread = _Thread_queue_Dequeue(&the_semaphore->Wait_queue)) ) { ffc09be4: 48 00 1c 7d bl ffc0b860 <_Thread_queue_Dequeue> ffc09be8: 2f 83 00 00 cmpwi cr7,r3,0 { Thread_Control *the_thread; ISR_Level level; CORE_semaphore_Status status; status = CORE_SEMAPHORE_STATUS_SUCCESSFUL; ffc09bec: 38 00 00 00 li r0,0 if ( (the_thread = _Thread_queue_Dequeue(&the_semaphore->Wait_queue)) ) { ffc09bf0: 40 be 00 38 bne+ cr7,ffc09c28 <_CORE_semaphore_Surrender+0x5c> static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc09bf4: 7d 60 00 a6 mfmsr r11 ffc09bf8: 7c 10 42 a6 mfsprg r0,0 ffc09bfc: 7d 60 00 78 andc r0,r11,r0 ffc09c00: 7c 00 01 24 mtmsr r0 (*api_semaphore_mp_support) ( the_thread, id ); #endif } else { _ISR_Disable( level ); if ( the_semaphore->count < the_semaphore->Attributes.maximum_count ) ffc09c04: 81 3f 00 48 lwz r9,72(r31) the_semaphore->count += 1; else status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED; ffc09c08: 38 00 00 04 li r0,4 (*api_semaphore_mp_support) ( the_thread, id ); #endif } else { _ISR_Disable( level ); if ( the_semaphore->count < the_semaphore->Attributes.maximum_count ) ffc09c0c: 81 5f 00 40 lwz r10,64(r31) ffc09c10: 7f 89 50 40 cmplw cr7,r9,r10 ffc09c14: 40 9c 00 10 bge- cr7,ffc09c24 <_CORE_semaphore_Surrender+0x58><== NEVER TAKEN the_semaphore->count += 1; ffc09c18: 39 29 00 01 addi r9,r9,1 ffc09c1c: 91 3f 00 48 stw r9,72(r31) { Thread_Control *the_thread; ISR_Level level; CORE_semaphore_Status status; status = CORE_SEMAPHORE_STATUS_SUCCESSFUL; ffc09c20: 38 00 00 00 li r0,0 return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc09c24: 7d 60 01 24 mtmsr r11 status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED; _ISR_Enable( level ); } return status; } ffc09c28: 39 61 00 10 addi r11,r1,16 ffc09c2c: 7c 03 03 78 mr r3,r0 ffc09c30: 48 00 f5 80 b ffc191b0 <_restgpr_31_x> =============================================================================== ffc085d0 <_Event_Surrender>: */ void _Event_Surrender( Thread_Control *the_thread ) { ffc085d0: 7c 2b 0b 78 mr r11,r1 ffc085d4: 7c 08 02 a6 mflr r0 ffc085d8: 94 21 ff f0 stwu r1,-16(r1) ffc085dc: 90 01 00 14 stw r0,20(r1) ffc085e0: 48 01 0b 85 bl ffc19164 <_savegpr_31> ffc085e4: 7c 7f 1b 78 mr r31,r3 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 ]; ffc085e8: 81 03 01 30 lwz r8,304(r3) option_set = (rtems_option) the_thread->Wait.option; ffc085ec: 80 e3 00 30 lwz r7,48(r3) static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc085f0: 7c 00 00 a6 mfmsr r0 ffc085f4: 7d 30 42 a6 mfsprg r9,0 ffc085f8: 7c 09 48 78 andc r9,r0,r9 ffc085fc: 7d 20 01 24 mtmsr r9 _ISR_Disable( level ); pending_events = api->pending_events; ffc08600: 81 68 00 00 lwz r11,0(r8) event_condition = (rtems_event_set) the_thread->Wait.count; ffc08604: 81 43 00 24 lwz r10,36(r3) seized_events = _Event_sets_Get( pending_events, event_condition ); /* * No events were seized in this operation */ if ( _Event_sets_Is_empty( seized_events ) ) { ffc08608: 7d 49 58 39 and. r9,r10,r11 ffc0860c: 40 a2 00 08 bne+ ffc08614 <_Event_Surrender+0x44> _ISR_Enable( level ); ffc08610: 48 00 00 f4 b ffc08704 <_Event_Surrender+0x134> /* * 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() && ffc08614: 3c c0 00 00 lis r6,0 ffc08618: 38 c6 31 e4 addi r6,r6,12772 ffc0861c: 80 a6 00 08 lwz r5,8(r6) ffc08620: 2f 85 00 00 cmpwi cr7,r5,0 ffc08624: 41 9e 00 64 beq- cr7,ffc08688 <_Event_Surrender+0xb8> ffc08628: 80 c6 00 0c lwz r6,12(r6) ffc0862c: 7f 83 30 00 cmpw cr7,r3,r6 ffc08630: 40 be 00 58 bne+ cr7,ffc08688 <_Event_Surrender+0xb8> _Thread_Is_executing( the_thread ) && ((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) || ffc08634: 3c c0 00 00 lis r6,0 ffc08638: 80 a6 28 54 lwz r5,10324(r6) /* * 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 ) && ffc0863c: 2f 85 00 02 cmpwi cr7,r5,2 ffc08640: 41 9e 00 10 beq- cr7,ffc08650 <_Event_Surrender+0x80> <== NEVER TAKEN ((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) || (_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) { ffc08644: 80 c6 28 54 lwz r6,10324(r6) * 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) || ffc08648: 2f 86 00 01 cmpwi cr7,r6,1 ffc0864c: 40 be 00 3c bne+ cr7,ffc08688 <_Event_Surrender+0xb8> (_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) { if ( seized_events == event_condition || _Options_Is_any(option_set) ) { ffc08650: 7f 89 50 00 cmpw cr7,r9,r10 ffc08654: 41 9e 00 0c beq- cr7,ffc08660 <_Event_Surrender+0x90> ffc08658: 70 e5 00 02 andi. r5,r7,2 ffc0865c: 41 82 00 28 beq- ffc08684 <_Event_Surrender+0xb4> <== 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) ); ffc08660: 7d 6b 48 78 andc r11,r11,r9 api->pending_events = _Event_sets_Clear( pending_events,seized_events ); ffc08664: 91 68 00 00 stw r11,0(r8) the_thread->Wait.count = 0; ffc08668: 39 60 00 00 li r11,0 ffc0866c: 91 7f 00 24 stw r11,36(r31) *(rtems_event_set *)the_thread->Wait.return_argument = seized_events; ffc08670: 81 7f 00 28 lwz r11,40(r31) ffc08674: 91 2b 00 00 stw r9,0(r11) _Event_Sync_state = THREAD_BLOCKING_OPERATION_SATISFIED; ffc08678: 39 60 00 03 li r11,3 ffc0867c: 3d 20 00 00 lis r9,0 ffc08680: 91 69 28 54 stw r11,10324(r9) } _ISR_Enable( level ); ffc08684: 48 00 00 80 b ffc08704 <_Event_Surrender+0x134> */ RTEMS_INLINE_ROUTINE bool _States_Is_waiting_for_event ( States_Control the_states ) { return (the_states & STATES_WAITING_FOR_EVENT); ffc08688: 80 df 00 10 lwz r6,16(r31) } /* * Otherwise, this is a normal send to another thread */ if ( _States_Is_waiting_for_event( the_thread->current_state ) ) { ffc0868c: 70 c5 01 00 andi. r5,r6,256 ffc08690: 41 82 00 74 beq- ffc08704 <_Event_Surrender+0x134> if ( seized_events == event_condition || _Options_Is_any( option_set ) ) { ffc08694: 7f 89 50 00 cmpw cr7,r9,r10 ffc08698: 41 9e 00 0c beq- cr7,ffc086a4 <_Event_Surrender+0xd4> ffc0869c: 70 ea 00 02 andi. r10,r7,2 ffc086a0: 41 82 00 64 beq- ffc08704 <_Event_Surrender+0x134> <== NEVER TAKEN ffc086a4: 7d 6b 48 78 andc r11,r11,r9 api->pending_events = _Event_sets_Clear( pending_events, seized_events ); ffc086a8: 91 68 00 00 stw r11,0(r8) the_thread->Wait.count = 0; ffc086ac: 39 60 00 00 li r11,0 ffc086b0: 91 7f 00 24 stw r11,36(r31) *(rtems_event_set *)the_thread->Wait.return_argument = seized_events; ffc086b4: 81 7f 00 28 lwz r11,40(r31) ffc086b8: 91 2b 00 00 stw r9,0(r11) static inline void ppc_interrupt_flash( uint32_t level ) { uint32_t current_level; __asm__ volatile ( ffc086bc: 7d 20 00 a6 mfmsr r9 ffc086c0: 7c 00 01 24 mtmsr r0 ffc086c4: 7d 20 01 24 mtmsr r9 _ISR_Flash( level ); if ( !_Watchdog_Is_active( &the_thread->Timer ) ) { ffc086c8: 81 3f 00 50 lwz r9,80(r31) ffc086cc: 2f 89 00 02 cmpwi cr7,r9,2 ffc086d0: 41 9e 00 0c beq- cr7,ffc086dc <_Event_Surrender+0x10c> return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc086d4: 7c 00 01 24 mtmsr r0 ffc086d8: 48 00 00 18 b ffc086f0 <_Event_Surrender+0x120> RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate( Watchdog_Control *the_watchdog ) { the_watchdog->state = WATCHDOG_REMOVE_IT; ffc086dc: 39 20 00 03 li r9,3 ffc086e0: 91 3f 00 50 stw r9,80(r31) ffc086e4: 7c 00 01 24 mtmsr r0 _ISR_Enable( level ); _Thread_Unblock( the_thread ); } else { _Watchdog_Deactivate( &the_thread->Timer ); _ISR_Enable( level ); (void) _Watchdog_Remove( &the_thread->Timer ); ffc086e8: 38 7f 00 48 addi r3,r31,72 ffc086ec: 48 00 3e a9 bl ffc0c594 <_Watchdog_Remove> RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); ffc086f0: 3c 80 10 03 lis r4,4099 ffc086f4: 7f e3 fb 78 mr r3,r31 ffc086f8: 60 84 ff f8 ori r4,r4,65528 ffc086fc: 48 00 2a 21 bl ffc0b11c <_Thread_Clear_state> ffc08700: 48 00 00 08 b ffc08708 <_Event_Surrender+0x138> ffc08704: 7c 00 01 24 mtmsr r0 } return; } } _ISR_Enable( level ); } ffc08708: 39 61 00 10 addi r11,r1,16 ffc0870c: 48 01 0a a4 b ffc191b0 <_restgpr_31_x> =============================================================================== ffc08710 <_Event_Timeout>: void _Event_Timeout( Objects_Id id, void *ignored ) { ffc08710: 94 21 ff e8 stwu r1,-24(r1) ffc08714: 7c 08 02 a6 mflr r0 Thread_Control *the_thread; Objects_Locations location; ISR_Level level; the_thread = _Thread_Get( id, &location ); ffc08718: 38 81 00 08 addi r4,r1,8 void _Event_Timeout( Objects_Id id, void *ignored ) { ffc0871c: 90 01 00 1c stw r0,28(r1) Thread_Control *the_thread; Objects_Locations location; ISR_Level level; the_thread = _Thread_Get( id, &location ); ffc08720: 48 00 2d cd bl ffc0b4ec <_Thread_Get> switch ( location ) { ffc08724: 80 01 00 08 lwz r0,8(r1) ffc08728: 2f 80 00 00 cmpwi cr7,r0,0 ffc0872c: 40 9e 00 68 bne- cr7,ffc08794 <_Event_Timeout+0x84> <== NEVER TAKEN static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc08730: 7d 60 00 a6 mfmsr r11 ffc08734: 7d 30 42 a6 mfsprg r9,0 ffc08738: 7d 69 48 78 andc r9,r11,r9 ffc0873c: 7d 20 01 24 mtmsr r9 RTEMS_INLINE_ROUTINE bool _Thread_Is_executing ( const Thread_Control *the_thread ) { return ( the_thread == _Thread_Executing ); ffc08740: 3d 20 00 00 lis r9,0 _ISR_Enable( level ); return; } #endif the_thread->Wait.count = 0; ffc08744: 90 03 00 24 stw r0,36(r3) if ( _Thread_Is_executing( the_thread ) ) { ffc08748: 80 09 31 f0 lwz r0,12784(r9) ffc0874c: 7f 83 00 00 cmpw cr7,r3,r0 ffc08750: 40 be 00 1c bne+ cr7,ffc0876c <_Event_Timeout+0x5c> if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) ffc08754: 3d 20 00 00 lis r9,0 ffc08758: 80 09 28 54 lwz r0,10324(r9) ffc0875c: 2f 80 00 01 cmpwi cr7,r0,1 ffc08760: 40 be 00 0c bne+ cr7,ffc0876c <_Event_Timeout+0x5c> _Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT; ffc08764: 38 00 00 02 li r0,2 ffc08768: 90 09 28 54 stw r0,10324(r9) } the_thread->Wait.return_code = RTEMS_TIMEOUT; ffc0876c: 38 00 00 06 li r0,6 ffc08770: 90 03 00 34 stw r0,52(r3) return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc08774: 7d 60 01 24 mtmsr r11 RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); ffc08778: 3c 80 10 03 lis r4,4099 ffc0877c: 60 84 ff f8 ori r4,r4,65528 ffc08780: 48 00 29 9d bl ffc0b11c <_Thread_Clear_state> */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; ffc08784: 3d 20 00 00 lis r9,0 ffc08788: 81 69 28 04 lwz r11,10244(r9) ffc0878c: 38 0b ff ff addi r0,r11,-1 ffc08790: 90 09 28 04 stw r0,10244(r9) case OBJECTS_REMOTE: /* impossible */ #endif case OBJECTS_ERROR: break; } } ffc08794: 80 01 00 1c lwz r0,28(r1) ffc08798: 38 21 00 18 addi r1,r1,24 ffc0879c: 7c 08 03 a6 mtlr r0 ffc087a0: 4e 80 00 20 blr =============================================================================== ffc0e3c0 <_Heap_Extend>: Heap_Control *heap, void *extend_area_begin_ptr, uintptr_t extend_area_size, uintptr_t *extended_size_ptr ) { ffc0e3c0: 94 21 ff c0 stwu r1,-64(r1) ffc0e3c4: 7c 08 02 a6 mflr r0 ffc0e3c8: be c1 00 18 stmw r22,24(r1) Heap_Block *extend_first_block = NULL; Heap_Block *extend_last_block = NULL; uintptr_t const page_size = heap->page_size; uintptr_t const min_block_size = heap->min_block_size; uintptr_t const extend_area_begin = (uintptr_t) extend_area_begin_ptr; uintptr_t const extend_area_end = extend_area_begin + extend_area_size; ffc0e3cc: 7f c4 2a 14 add r30,r4,r5 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 ) { ffc0e3d0: 7f 9e 20 40 cmplw cr7,r30,r4 Heap_Control *heap, void *extend_area_begin_ptr, uintptr_t extend_area_size, uintptr_t *extended_size_ptr ) { ffc0e3d4: 90 01 00 44 stw r0,68(r1) 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; ffc0e3d8: 3b 40 00 00 li r26,0 Heap_Control *heap, void *extend_area_begin_ptr, uintptr_t extend_area_size, uintptr_t *extended_size_ptr ) { ffc0e3dc: 7c d9 33 78 mr r25,r6 ffc0e3e0: 7c 7f 1b 78 mr r31,r3 Heap_Statistics *const stats = &heap->stats; Heap_Block *const first_block = heap->first_block; ffc0e3e4: 83 83 00 20 lwz r28,32(r3) Heap_Control *heap, void *extend_area_begin_ptr, uintptr_t extend_area_size, uintptr_t *extended_size_ptr ) { ffc0e3e8: 7c 9d 23 78 mr r29,r4 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; ffc0e3ec: 93 41 00 08 stw r26,8(r1) 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; ffc0e3f0: 38 00 00 00 li r0,0 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; Heap_Block *extend_last_block = NULL; ffc0e3f4: 93 41 00 0c stw r26,12(r1) uintptr_t const page_size = heap->page_size; ffc0e3f8: 83 63 00 10 lwz r27,16(r3) uintptr_t const min_block_size = heap->min_block_size; ffc0e3fc: 80 c3 00 14 lwz r6,20(r3) 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; ffc0e400: 83 03 00 30 lwz r24,48(r3) uintptr_t extend_first_block_size = 0; uintptr_t extended_size = 0; bool extend_area_ok = false; if ( extend_area_end < extend_area_begin ) { ffc0e404: 41 bc 02 70 blt+ cr7,ffc0e674 <_Heap_Extend+0x2b4> return false; } extend_area_ok = _Heap_Get_first_and_last_block( ffc0e408: 7c 83 23 78 mr r3,r4 ffc0e40c: 38 e1 00 08 addi r7,r1,8 ffc0e410: 7c a4 2b 78 mr r4,r5 ffc0e414: 39 01 00 0c addi r8,r1,12 ffc0e418: 7f 65 db 78 mr r5,r27 ffc0e41c: 4b ff ab 6d bl ffc08f88 <_Heap_Get_first_and_last_block> &extend_first_block, &extend_last_block ); if (!extend_area_ok ) { /* For simplicity we reject extend areas that are too small */ return false; ffc0e420: 7f 40 d3 78 mr r0,r26 page_size, min_block_size, &extend_first_block, &extend_last_block ); if (!extend_area_ok ) { ffc0e424: 2f 83 00 00 cmpwi cr7,r3,0 ffc0e428: 41 9e 02 4c beq- cr7,ffc0e674 <_Heap_Extend+0x2b4> ffc0e42c: 7f 89 e3 78 mr r9,r28 ffc0e430: 3a c0 00 00 li r22,0 ffc0e434: 39 40 00 00 li r10,0 ffc0e438: 3a e0 00 00 li r23,0 return false; } do { uintptr_t const sub_area_begin = (start_block != first_block) ? (uintptr_t) start_block : heap->area_begin; ffc0e43c: 7f 89 e0 00 cmpw cr7,r9,r28 ffc0e440: 7d 2b 4b 78 mr r11,r9 ffc0e444: 40 be 00 08 bne+ cr7,ffc0e44c <_Heap_Extend+0x8c> ffc0e448: 81 7f 00 18 lwz r11,24(r31) uintptr_t const sub_area_end = start_block->prev_size; ffc0e44c: 80 09 00 00 lwz r0,0(r9) Heap_Block *const end_block = _Heap_Block_of_alloc_area( sub_area_end, page_size ); if ( ffc0e450: 7f 80 e8 40 cmplw cr7,r0,r29 ffc0e454: 40 9d 00 0c ble- cr7,ffc0e460 <_Heap_Extend+0xa0> sub_area_end > extend_area_begin && extend_area_end > sub_area_begin ffc0e458: 7f 9e 58 40 cmplw cr7,r30,r11 ffc0e45c: 41 9d 02 14 bgt- cr7,ffc0e670 <_Heap_Extend+0x2b0> ) { return false; } if ( extend_area_end == sub_area_begin ) { ffc0e460: 7f 9e 58 00 cmpw cr7,r30,r11 ffc0e464: 41 9e 00 10 beq- cr7,ffc0e474 <_Heap_Extend+0xb4> merge_below_block = start_block; } else if ( extend_area_end < sub_area_end ) { ffc0e468: 7f 9e 00 40 cmplw cr7,r30,r0 ffc0e46c: 41 9c 00 10 blt- cr7,ffc0e47c <_Heap_Extend+0xbc> ffc0e470: 48 00 00 10 b ffc0e480 <_Heap_Extend+0xc0> sub_area_end > extend_area_begin && extend_area_end > sub_area_begin ) { return false; } if ( extend_area_end == sub_area_begin ) { ffc0e474: 7d 37 4b 78 mr r23,r9 ffc0e478: 48 00 00 08 b ffc0e480 <_Heap_Extend+0xc0> merge_below_block = start_block; } else if ( extend_area_end < sub_area_end ) { ffc0e47c: 7d 2a 4b 78 mr r10,r9 ffc0e480: 7d 60 db 96 divwu r11,r0,r27 link_below_block = start_block; } if ( sub_area_end == extend_area_begin ) { ffc0e484: 7f 80 e8 00 cmpw cr7,r0,r29 ffc0e488: 7d 6b d9 d6 mullw r11,r11,r27 uintptr_t alloc_begin, uintptr_t page_size ) { return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size ) - HEAP_BLOCK_HEADER_SIZE); ffc0e48c: 39 6b ff f8 addi r11,r11,-8 ffc0e490: 40 be 00 10 bne+ cr7,ffc0e4a0 <_Heap_Extend+0xe0> start_block->prev_size = extend_area_end; ffc0e494: 93 c9 00 00 stw r30,0(r9) 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 ) ffc0e498: 7d 7a 5b 78 mr r26,r11 ffc0e49c: 48 00 00 10 b ffc0e4ac <_Heap_Extend+0xec> merge_above_block = end_block; } else if ( sub_area_end < extend_area_begin ) { ffc0e4a0: 7f 80 e8 40 cmplw cr7,r0,r29 ffc0e4a4: 40 9c 00 08 bge- cr7,ffc0e4ac <_Heap_Extend+0xec> ffc0e4a8: 7d 76 5b 78 mr r22,r11 - 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; ffc0e4ac: 81 2b 00 04 lwz r9,4(r11) ffc0e4b0: 55 29 00 3c rlwinm r9,r9,0,0,30 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); ffc0e4b4: 7d 2b 4a 14 add r9,r11,r9 link_above_block = end_block; } start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) ); } while ( start_block != first_block ); ffc0e4b8: 7f 89 e0 00 cmpw cr7,r9,r28 ffc0e4bc: 40 9e ff 80 bne+ cr7,ffc0e43c <_Heap_Extend+0x7c> if ( extend_area_begin < heap->area_begin ) { ffc0e4c0: 80 1f 00 18 lwz r0,24(r31) ffc0e4c4: 7f 9d 00 40 cmplw cr7,r29,r0 ffc0e4c8: 40 9c 00 0c bge- cr7,ffc0e4d4 <_Heap_Extend+0x114> heap->area_begin = extend_area_begin; ffc0e4cc: 93 bf 00 18 stw r29,24(r31) ffc0e4d0: 48 00 00 14 b ffc0e4e4 <_Heap_Extend+0x124> } else if ( heap->area_end < extend_area_end ) { ffc0e4d4: 80 1f 00 1c lwz r0,28(r31) ffc0e4d8: 7f 80 f0 40 cmplw cr7,r0,r30 ffc0e4dc: 40 9c 00 08 bge- cr7,ffc0e4e4 <_Heap_Extend+0x124> heap->area_end = extend_area_end; ffc0e4e0: 93 df 00 1c stw r30,28(r31) } extend_first_block_size = (uintptr_t) extend_last_block - (uintptr_t) extend_first_block; ffc0e4e4: 81 61 00 08 lwz r11,8(r1) ffc0e4e8: 81 21 00 0c lwz r9,12(r1) extend_first_block->prev_size = extend_area_end; ffc0e4ec: 93 cb 00 00 stw r30,0(r11) heap->area_begin = extend_area_begin; } else if ( heap->area_end < extend_area_end ) { heap->area_end = extend_area_end; } extend_first_block_size = ffc0e4f0: 7c 0b 48 50 subf r0,r11,r9 (uintptr_t) extend_last_block - (uintptr_t) extend_first_block; extend_first_block->prev_size = extend_area_end; extend_first_block->size_and_flag = extend_first_block_size | HEAP_PREV_BLOCK_USED; ffc0e4f4: 60 08 00 01 ori r8,r0,1 _Heap_Protection_block_initialize( heap, extend_first_block ); extend_last_block->prev_size = extend_first_block_size; ffc0e4f8: 90 09 00 00 stw r0,0(r9) extend_last_block->size_and_flag = 0; ffc0e4fc: 38 00 00 00 li r0,0 extend_first_block_size = (uintptr_t) extend_last_block - (uintptr_t) extend_first_block; extend_first_block->prev_size = extend_area_end; extend_first_block->size_and_flag = ffc0e500: 91 0b 00 04 stw r8,4(r11) extend_first_block_size | HEAP_PREV_BLOCK_USED; _Heap_Protection_block_initialize( heap, extend_first_block ); extend_last_block->prev_size = extend_first_block_size; extend_last_block->size_and_flag = 0; ffc0e504: 90 09 00 04 stw r0,4(r9) _Heap_Protection_block_initialize( heap, extend_last_block ); if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) { ffc0e508: 80 1f 00 20 lwz r0,32(r31) ffc0e50c: 7f 80 58 40 cmplw cr7,r0,r11 ffc0e510: 40 9d 00 0c ble- cr7,ffc0e51c <_Heap_Extend+0x15c> heap->first_block = extend_first_block; ffc0e514: 91 7f 00 20 stw r11,32(r31) ffc0e518: 48 00 00 14 b ffc0e52c <_Heap_Extend+0x16c> } else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) { ffc0e51c: 80 1f 00 24 lwz r0,36(r31) ffc0e520: 7f 80 48 40 cmplw cr7,r0,r9 ffc0e524: 40 9c 00 08 bge- cr7,ffc0e52c <_Heap_Extend+0x16c> heap->last_block = extend_last_block; ffc0e528: 91 3f 00 24 stw r9,36(r31) } if ( merge_below_block != NULL ) { ffc0e52c: 2f 97 00 00 cmpwi cr7,r23,0 ffc0e530: 41 9e 00 48 beq- cr7,ffc0e578 <_Heap_Extend+0x1b8> Heap_Control *heap, uintptr_t extend_area_begin, Heap_Block *first_block ) { uintptr_t const page_size = heap->page_size; ffc0e534: 80 1f 00 10 lwz r0,16(r31) uintptr_t const new_first_block_alloc_begin = _Heap_Align_up( extend_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size ); ffc0e538: 3b bd 00 08 addi r29,r29,8 RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_up( uintptr_t value, uintptr_t alignment ) { uintptr_t remainder = value % alignment; ffc0e53c: 7d 3d 03 96 divwu r9,r29,r0 ffc0e540: 7d 29 01 d6 mullw r9,r9,r0 if ( remainder != 0 ) { ffc0e544: 7d 29 e8 51 subf. r9,r9,r29 ffc0e548: 41 82 00 0c beq- ffc0e554 <_Heap_Extend+0x194> <== NEVER TAKEN return value - remainder + alignment; ffc0e54c: 7f bd 02 14 add r29,r29,r0 ffc0e550: 7f a9 e8 50 subf r29,r9,r29 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; ffc0e554: 80 17 00 00 lwz r0,0(r23) ) { uintptr_t const page_size = heap->page_size; 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 = ffc0e558: 38 9d ff f8 addi r4,r29,-8 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; _Heap_Free_block( heap, new_first_block ); ffc0e55c: 7f e3 fb 78 mr r3,r31 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; ffc0e560: 90 1d ff f8 stw r0,-8(r29) 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 = ffc0e564: 7c 04 b8 50 subf r0,r4,r23 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; ffc0e568: 60 00 00 01 ori r0,r0,1 ffc0e56c: 90 04 00 04 stw r0,4(r4) _Heap_Free_block( heap, new_first_block ); ffc0e570: 4b ff fe 15 bl ffc0e384 <_Heap_Free_block> ffc0e574: 48 00 00 1c b ffc0e590 <_Heap_Extend+0x1d0> 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 ) { ffc0e578: 2f 8a 00 00 cmpwi cr7,r10,0 ffc0e57c: 41 9e 00 14 beq- cr7,ffc0e590 <_Heap_Extend+0x1d0> _Heap_Link_below( ffc0e580: 81 21 00 0c lwz r9,12(r1) { 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; ffc0e584: 7d 49 50 50 subf r10,r9,r10 ffc0e588: 61 4a 00 01 ori r10,r10,1 ) { uintptr_t const last_block_begin = (uintptr_t) last_block; uintptr_t const link_begin = (uintptr_t) link; last_block->size_and_flag = ffc0e58c: 91 49 00 04 stw r10,4(r9) link_below_block, extend_last_block ); } if ( merge_above_block != NULL ) { ffc0e590: 2f 9a 00 00 cmpwi cr7,r26,0 ffc0e594: 41 9e 00 4c beq- cr7,ffc0e5e0 <_Heap_Extend+0x220> RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down( uintptr_t value, uintptr_t alignment ) { return value - (value % alignment); ffc0e598: 80 1f 00 10 lwz r0,16(r31) ) { 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, ffc0e59c: 3b de ff f8 addi r30,r30,-8 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( ffc0e5a0: 7f da f0 50 subf r30,r26,r30 ffc0e5a4: 7f de 03 96 divwu r30,r30,r0 ffc0e5a8: 7f de 01 d6 mullw r30,r30,r0 ); 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) ffc0e5ac: 80 1a 00 04 lwz r0,4(r26) | HEAP_PREV_BLOCK_USED; _Heap_Block_set_size( last_block, last_block_new_size ); _Heap_Free_block( heap, last_block ); ffc0e5b0: 7f e3 fb 78 mr r3,r31 ); 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) ffc0e5b4: 7c 1e 00 50 subf r0,r30,r0 page_size ); Heap_Block *const new_last_block = _Heap_Block_at( last_block, last_block_new_size ); new_last_block->size_and_flag = ffc0e5b8: 7d 3e d2 14 add r9,r30,r26 (last_block->size_and_flag - last_block_new_size) | HEAP_PREV_BLOCK_USED; ffc0e5bc: 60 00 00 01 ori r0,r0,1 page_size ); Heap_Block *const new_last_block = _Heap_Block_at( last_block, last_block_new_size ); new_last_block->size_and_flag = ffc0e5c0: 90 09 00 04 stw r0,4(r9) (last_block->size_and_flag - last_block_new_size) | HEAP_PREV_BLOCK_USED; _Heap_Block_set_size( last_block, last_block_new_size ); _Heap_Free_block( heap, last_block ); ffc0e5c4: 7f 44 d3 78 mr r4,r26 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; ffc0e5c8: 80 1a 00 04 lwz r0,4(r26) ffc0e5cc: 54 00 07 fe clrlwi r0,r0,31 block->size_and_flag = size | flag; ffc0e5d0: 7f de 03 78 or r30,r30,r0 ffc0e5d4: 93 da 00 04 stw r30,4(r26) ffc0e5d8: 4b ff fd ad bl ffc0e384 <_Heap_Free_block> ffc0e5dc: 48 00 00 34 b ffc0e610 <_Heap_Extend+0x250> ); } if ( merge_above_block != NULL ) { _Heap_Merge_above( heap, merge_above_block, extend_area_end ); } else if ( link_above_block != NULL ) { ffc0e5e0: 2f 96 00 00 cmpwi cr7,r22,0 ffc0e5e4: 41 9e 00 2c beq- cr7,ffc0e610 <_Heap_Extend+0x250> 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; ffc0e5e8: 80 16 00 04 lwz r0,4(r22) ) { 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 ); ffc0e5ec: 81 61 00 08 lwz r11,8(r1) ffc0e5f0: 54 00 07 fe clrlwi r0,r0,31 } if ( merge_above_block != NULL ) { _Heap_Merge_above( heap, merge_above_block, extend_area_end ); } else if ( link_above_block != NULL ) { _Heap_Link_above( ffc0e5f4: 81 21 00 0c lwz r9,12(r1) ) { 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 ); ffc0e5f8: 7d 76 58 50 subf r11,r22,r11 block->size_and_flag = size | flag; ffc0e5fc: 7d 60 03 78 or r0,r11,r0 ffc0e600: 90 16 00 04 stw r0,4(r22) last_block->size_and_flag |= HEAP_PREV_BLOCK_USED; ffc0e604: 80 09 00 04 lwz r0,4(r9) ffc0e608: 60 00 00 01 ori r0,r0,1 ffc0e60c: 90 09 00 04 stw r0,4(r9) extend_first_block, extend_last_block ); } if ( merge_below_block == NULL && merge_above_block == NULL ) { ffc0e610: 2f 97 00 00 cmpwi cr7,r23,0 ffc0e614: 40 be 00 18 bne+ cr7,ffc0e62c <_Heap_Extend+0x26c> ffc0e618: 2f 9a 00 00 cmpwi cr7,r26,0 ffc0e61c: 40 be 00 10 bne+ cr7,ffc0e62c <_Heap_Extend+0x26c> _Heap_Free_block( heap, extend_first_block ); ffc0e620: 80 81 00 08 lwz r4,8(r1) ffc0e624: 7f e3 fb 78 mr r3,r31 ffc0e628: 4b ff fd 5d bl ffc0e384 <_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 ffc0e62c: 81 3f 00 24 lwz r9,36(r31) extended_size = stats->free_size - free_size; /* Statistics */ stats->size += extended_size; if ( extended_size_ptr != NULL ) ffc0e630: 2f 99 00 00 cmpwi cr7,r25,0 * 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( ffc0e634: 81 7f 00 20 lwz r11,32(r31) 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; ffc0e638: 80 09 00 04 lwz r0,4(r9) * 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( ffc0e63c: 7d 69 58 50 subf r11,r9,r11 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; ffc0e640: 54 00 07 fe clrlwi r0,r0,31 block->size_and_flag = size | flag; ffc0e644: 7d 60 03 78 or r0,r11,r0 ffc0e648: 90 09 00 04 stw r0,4(r9) _Heap_Free_block( heap, extend_first_block ); } _Heap_Set_last_block_size( heap ); extended_size = stats->free_size - free_size; ffc0e64c: 80 1f 00 30 lwz r0,48(r31) ffc0e650: 7f 18 00 50 subf r24,r24,r0 /* Statistics */ stats->size += extended_size; ffc0e654: 80 1f 00 2c lwz r0,44(r31) ffc0e658: 7c 00 c2 14 add r0,r0,r24 ffc0e65c: 90 1f 00 2c stw r0,44(r31) if ( extended_size_ptr != NULL ) *extended_size_ptr = extended_size; return true; ffc0e660: 38 00 00 01 li r0,1 extended_size = stats->free_size - free_size; /* Statistics */ stats->size += extended_size; if ( extended_size_ptr != NULL ) ffc0e664: 41 9e 00 10 beq- cr7,ffc0e674 <_Heap_Extend+0x2b4> <== NEVER TAKEN *extended_size_ptr = extended_size; ffc0e668: 93 19 00 00 stw r24,0(r25) ffc0e66c: 48 00 00 08 b ffc0e674 <_Heap_Extend+0x2b4> _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; ffc0e670: 38 00 00 00 li r0,0 if ( extended_size_ptr != NULL ) *extended_size_ptr = extended_size; return true; } ffc0e674: 39 61 00 40 addi r11,r1,64 ffc0e678: 7c 03 03 78 mr r3,r0 ffc0e67c: 4b ff 1f 24 b ffc005a0 <_restgpr_22_x> =============================================================================== ffc12020 <_Heap_Free>: /* * If NULL return true so a free on NULL is considered a valid release. This * is a special case that could be handled by the in heap check how-ever that * would result in false being returned which is wrong. */ if ( alloc_begin_ptr == NULL ) { ffc12020: 7c 8b 23 79 mr. r11,r4 return do_free; } #endif bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr ) { ffc12024: 94 21 ff f0 stwu r1,-16(r1) ffc12028: 7c 69 1b 78 mr r9,r3 ffc1202c: 93 e1 00 0c stw r31,12(r1) * If NULL return true so a free on NULL is considered a valid release. This * is a special case that could be handled by the in heap check how-ever that * would result in false being returned which is wrong. */ if ( alloc_begin_ptr == NULL ) { return true; ffc12030: 38 60 00 01 li r3,1 /* * If NULL return true so a free on NULL is considered a valid release. This * is a special case that could be handled by the in heap check how-ever that * would result in false being returned which is wrong. */ if ( alloc_begin_ptr == NULL ) { ffc12034: 41 82 01 ec beq- ffc12220 <_Heap_Free+0x200> ffc12038: 80 09 00 10 lwz r0,16(r9) 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 ffc1203c: 80 a9 00 20 lwz r5,32(r9) RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down( uintptr_t value, uintptr_t alignment ) { return value - (value % alignment); ffc12040: 7d 6b 03 96 divwu r11,r11,r0 ffc12044: 7d 6b 01 d6 mullw r11,r11,r0 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; ffc12048: 38 00 00 00 li r0,0 uintptr_t alloc_begin, uintptr_t page_size ) { return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size ) - HEAP_BLOCK_HEADER_SIZE); ffc1204c: 39 6b ff f8 addi r11,r11,-8 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; ffc12050: 7f 8b 28 40 cmplw cr7,r11,r5 ffc12054: 41 9c 00 14 blt- cr7,ffc12068 <_Heap_Free+0x48> ffc12058: 80 09 00 24 lwz r0,36(r9) ffc1205c: 7c 0b 00 10 subfc r0,r11,r0 ffc12060: 38 00 00 00 li r0,0 ffc12064: 7c 00 01 14 adde r0,r0,r0 } alloc_begin = (uintptr_t) alloc_begin_ptr; block = _Heap_Block_of_alloc_area( alloc_begin, heap->page_size ); if ( !_Heap_Is_block_in_heap( heap, block ) ) { ffc12068: 2f 80 00 00 cmpwi cr7,r0,0 return false; ffc1206c: 38 60 00 00 li r3,0 } alloc_begin = (uintptr_t) alloc_begin_ptr; block = _Heap_Block_of_alloc_area( alloc_begin, heap->page_size ); if ( !_Heap_Is_block_in_heap( heap, block ) ) { ffc12070: 41 9e 01 b0 beq- cr7,ffc12220 <_Heap_Free+0x200> --stats->used_blocks; ++stats->frees; stats->free_size += block_size; return( true ); } ffc12074: 80 cb 00 04 lwz r6,4(r11) ffc12078: 38 00 00 00 li r0,0 - 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; ffc1207c: 54 c8 00 3c rlwinm r8,r6,0,0,30 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); ffc12080: 7d 4b 42 14 add r10,r11,r8 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; ffc12084: 7f 8a 28 40 cmplw cr7,r10,r5 ffc12088: 41 9c 00 14 blt- cr7,ffc1209c <_Heap_Free+0x7c> <== NEVER TAKEN ffc1208c: 80 09 00 24 lwz r0,36(r9) ffc12090: 7c 0a 00 10 subfc r0,r10,r0 ffc12094: 38 00 00 00 li r0,0 ffc12098: 7c 00 01 14 adde r0,r0,r0 _Heap_Protection_block_check( heap, block ); block_size = _Heap_Block_size( block ); next_block = _Heap_Block_at( block, block_size ); if ( !_Heap_Is_block_in_heap( heap, next_block ) ) { ffc1209c: 2f 80 00 00 cmpwi cr7,r0,0 return false; ffc120a0: 38 60 00 00 li r3,0 _Heap_Protection_block_check( heap, block ); block_size = _Heap_Block_size( block ); next_block = _Heap_Block_at( block, block_size ); if ( !_Heap_Is_block_in_heap( heap, next_block ) ) { ffc120a4: 41 9e 01 7c beq- cr7,ffc12220 <_Heap_Free+0x200> <== NEVER TAKEN --stats->used_blocks; ++stats->frees; stats->free_size += block_size; return( true ); } ffc120a8: 80 0a 00 04 lwz r0,4(r10) return false; } _Heap_Protection_block_check( heap, next_block ); if ( !_Heap_Is_prev_used( next_block ) ) { ffc120ac: 70 04 00 01 andi. r4,r0,1 ffc120b0: 41 82 01 70 beq- ffc12220 <_Heap_Free+0x200> 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 ffc120b4: 80 69 00 24 lwz r3,36(r9) - 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; ffc120b8: 54 00 00 3c rlwinm r0,r0,0,0,30 && !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size )); ffc120bc: 38 80 00 00 li r4,0 ffc120c0: 7f 8a 18 00 cmpw cr7,r10,r3 ffc120c4: 41 9e 00 18 beq- cr7,ffc120dc <_Heap_Free+0xbc> --stats->used_blocks; ++stats->frees; stats->free_size += block_size; return( true ); } ffc120c8: 7c ea 02 14 add r7,r10,r0 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; ffc120cc: 80 e7 00 04 lwz r7,4(r7) return do_free; } #endif bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr ) ffc120d0: 70 ff 00 01 andi. r31,r7,1 ffc120d4: 7c 80 00 26 mfcr r4 ffc120d8: 54 84 1f fe rlwinm r4,r4,3,31,31 next_block_size = _Heap_Block_size( next_block ); next_is_free = next_block != heap->last_block && !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size )); if ( !_Heap_Is_prev_used( block ) ) { ffc120dc: 70 c7 00 01 andi. r7,r6,1 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 ffc120e0: 54 84 06 3e clrlwi r4,r4,24 && !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size )); if ( !_Heap_Is_prev_used( block ) ) { ffc120e4: 40 82 00 98 bne- ffc1217c <_Heap_Free+0x15c> uintptr_t const prev_size = block->prev_size; ffc120e8: 80 cb 00 00 lwz r6,0(r11) 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; ffc120ec: 39 80 00 00 li r12,0 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); ffc120f0: 7c e6 58 50 subf r7,r6,r11 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; ffc120f4: 7f 87 28 40 cmplw cr7,r7,r5 ffc120f8: 41 9c 00 10 blt- cr7,ffc12108 <_Heap_Free+0xe8> <== NEVER TAKEN ffc120fc: 7d 87 18 10 subfc r12,r7,r3 ffc12100: 39 80 00 00 li r12,0 ffc12104: 7d 8c 61 14 adde r12,r12,r12 Heap_Block * const prev_block = _Heap_Block_at( block, -prev_size ); if ( !_Heap_Is_block_in_heap( heap, prev_block ) ) { ffc12108: 2f 8c 00 00 cmpwi cr7,r12,0 _HAssert( false ); return( false ); ffc1210c: 38 60 00 00 li r3,0 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 ) ) { ffc12110: 41 9e 01 10 beq- cr7,ffc12220 <_Heap_Free+0x200> <== NEVER TAKEN 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; ffc12114: 80 a7 00 04 lwz r5,4(r7) 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) ) { ffc12118: 70 bf 00 01 andi. r31,r5,1 ffc1211c: 41 82 01 04 beq- ffc12220 <_Heap_Free+0x200> <== NEVER TAKEN _HAssert( false ); return( false ); } if ( next_is_free ) { /* coalesce both */ ffc12120: 2f 84 00 00 cmpwi cr7,r4,0 ffc12124: 41 9e 00 38 beq- cr7,ffc1215c <_Heap_Free+0x13c> return _Heap_Free_list_tail(heap)->prev; } RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block ) { Heap_Block *next = block->next; ffc12128: 81 6a 00 08 lwz r11,8(r10) uintptr_t const size = block_size + prev_size + next_block_size; ffc1212c: 7c 08 02 14 add r0,r8,r0 Heap_Block *prev = block->prev; ffc12130: 81 4a 00 0c lwz r10,12(r10) ffc12134: 7c c0 32 14 add r6,r0,r6 prev->next = next; ffc12138: 91 6a 00 08 stw r11,8(r10) next->prev = prev; ffc1213c: 91 4b 00 0c stw r10,12(r11) _Heap_Free_list_remove( next_block ); stats->free_blocks -= 1; ffc12140: 81 69 00 38 lwz r11,56(r9) ffc12144: 38 0b ff ff addi r0,r11,-1 ffc12148: 90 09 00 38 stw r0,56(r9) prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED; ffc1214c: 60 c0 00 01 ori r0,r6,1 ffc12150: 90 07 00 04 stw r0,4(r7) next_block = _Heap_Block_at( prev_block, size ); _HAssert(!_Heap_Is_prev_used( next_block)); next_block->prev_size = size; ffc12154: 7c c7 31 2e stwx r6,r7,r6 ffc12158: 48 00 00 a0 b ffc121f8 <_Heap_Free+0x1d8> } else { /* coalesce prev */ uintptr_t const size = block_size + prev_size; ffc1215c: 7c c8 32 14 add r6,r8,r6 prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED; ffc12160: 60 c0 00 01 ori r0,r6,1 next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED; next_block->prev_size = size; ffc12164: 7c cb 41 2e stwx r6,r11,r8 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; prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED; ffc12168: 90 07 00 04 stw r0,4(r7) next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED; ffc1216c: 80 0a 00 04 lwz r0,4(r10) ffc12170: 54 00 00 3c rlwinm r0,r0,0,0,30 ffc12174: 90 0a 00 04 stw r0,4(r10) ffc12178: 48 00 00 80 b ffc121f8 <_Heap_Free+0x1d8> next_block->prev_size = size; } } else if ( next_is_free ) { /* coalesce next */ ffc1217c: 2f 84 00 00 cmpwi cr7,r4,0 ffc12180: 41 9e 00 30 beq- cr7,ffc121b0 <_Heap_Free+0x190> RTEMS_INLINE_ROUTINE void _Heap_Free_list_replace( Heap_Block *old_block, Heap_Block *new_block ) { Heap_Block *next = old_block->next; ffc12184: 80 ca 00 08 lwz r6,8(r10) uintptr_t const size = block_size + next_block_size; ffc12188: 7c e0 42 14 add r7,r0,r8 Heap_Block *prev = old_block->prev; ffc1218c: 81 4a 00 0c lwz r10,12(r10) _Heap_Free_list_replace( next_block, block ); block->size_and_flag = size | HEAP_PREV_BLOCK_USED; ffc12190: 60 e0 00 01 ori r0,r7,1 new_block->next = next; ffc12194: 90 cb 00 08 stw r6,8(r11) new_block->prev = prev; ffc12198: 91 4b 00 0c stw r10,12(r11) next->prev = new_block; prev->next = new_block; ffc1219c: 91 6a 00 08 stw r11,8(r10) Heap_Block *prev = old_block->prev; new_block->next = next; new_block->prev = prev; next->prev = new_block; ffc121a0: 91 66 00 0c stw r11,12(r6) ffc121a4: 90 0b 00 04 stw r0,4(r11) next_block = _Heap_Block_at( block, size ); next_block->prev_size = size; ffc121a8: 7c eb 39 2e stwx r7,r11,r7 ffc121ac: 48 00 00 4c b ffc121f8 <_Heap_Free+0x1d8> } 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; ffc121b0: 61 00 00 01 ori r0,r8,1 RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_after( Heap_Block *block_before, Heap_Block *new_block ) { Heap_Block *next = block_before->next; ffc121b4: 80 e9 00 08 lwz r7,8(r9) ffc121b8: 90 0b 00 04 stw r0,4(r11) next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED; ffc121bc: 80 0a 00 04 lwz r0,4(r10) new_block->next = next; ffc121c0: 90 eb 00 08 stw r7,8(r11) ffc121c4: 54 00 00 3c rlwinm r0,r0,0,0,30 new_block->prev = block_before; ffc121c8: 91 2b 00 0c stw r9,12(r11) next_block->prev_size = block_size; ffc121cc: 7d 0b 41 2e stwx r8,r11,r8 block_before->next = new_block; next->prev = new_block; ffc121d0: 91 67 00 0c stw r11,12(r7) { Heap_Block *next = block_before->next; new_block->next = next; new_block->prev = block_before; block_before->next = new_block; ffc121d4: 91 69 00 08 stw r11,8(r9) /* Statistics */ ++stats->free_blocks; ffc121d8: 81 69 00 38 lwz r11,56(r9) } 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; next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED; ffc121dc: 90 0a 00 04 stw r0,4(r10) next_block->prev_size = block_size; /* Statistics */ ++stats->free_blocks; ffc121e0: 38 0b 00 01 addi r0,r11,1 if ( stats->max_free_blocks < stats->free_blocks ) { ffc121e4: 81 69 00 3c lwz r11,60(r9) block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED; next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED; next_block->prev_size = block_size; /* Statistics */ ++stats->free_blocks; ffc121e8: 90 09 00 38 stw r0,56(r9) if ( stats->max_free_blocks < stats->free_blocks ) { ffc121ec: 7f 8b 00 40 cmplw cr7,r11,r0 ffc121f0: 40 9c 00 08 bge- cr7,ffc121f8 <_Heap_Free+0x1d8> stats->max_free_blocks = stats->free_blocks; ffc121f4: 90 09 00 3c stw r0,60(r9) } } /* Statistics */ --stats->used_blocks; ffc121f8: 81 69 00 40 lwz r11,64(r9) ++stats->frees; stats->free_size += block_size; return( true ); ffc121fc: 38 60 00 01 li r3,1 stats->max_free_blocks = stats->free_blocks; } } /* Statistics */ --stats->used_blocks; ffc12200: 38 0b ff ff addi r0,r11,-1 ++stats->frees; ffc12204: 81 69 00 50 lwz r11,80(r9) stats->max_free_blocks = stats->free_blocks; } } /* Statistics */ --stats->used_blocks; ffc12208: 90 09 00 40 stw r0,64(r9) ++stats->frees; ffc1220c: 38 0b 00 01 addi r0,r11,1 ffc12210: 90 09 00 50 stw r0,80(r9) stats->free_size += block_size; ffc12214: 80 09 00 30 lwz r0,48(r9) ffc12218: 7d 00 42 14 add r8,r0,r8 ffc1221c: 91 09 00 30 stw r8,48(r9) return( true ); } ffc12220: 83 e1 00 0c lwz r31,12(r1) ffc12224: 38 21 00 10 addi r1,r1,16 ffc12228: 4e 80 00 20 blr =============================================================================== ffc12360 <_Heap_Size_of_alloc_area>: RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down( uintptr_t value, uintptr_t alignment ) { return value - (value % alignment); ffc12360: 80 03 00 10 lwz r0,16(r3) bool _Heap_Size_of_alloc_area( Heap_Control *heap, void *alloc_begin_ptr, uintptr_t *alloc_size ) { ffc12364: 7c 69 1b 78 mr r9,r3 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 ffc12368: 81 03 00 20 lwz r8,32(r3) RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down( uintptr_t value, uintptr_t alignment ) { return value - (value % alignment); ffc1236c: 7d 44 03 96 divwu r10,r4,r0 ffc12370: 7d 4a 01 d6 mullw r10,r10,r0 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; ffc12374: 38 00 00 00 li r0,0 uintptr_t alloc_begin, uintptr_t page_size ) { return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size ) - HEAP_BLOCK_HEADER_SIZE); ffc12378: 39 4a ff f8 addi r10,r10,-8 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; ffc1237c: 7f 8a 40 40 cmplw cr7,r10,r8 ffc12380: 41 9c 00 14 blt- cr7,ffc12394 <_Heap_Size_of_alloc_area+0x34> ffc12384: 80 03 00 24 lwz r0,36(r3) ffc12388: 7c 0a 00 10 subfc r0,r10,r0 ffc1238c: 38 00 00 00 li r0,0 ffc12390: 7c 00 01 14 adde r0,r0,r0 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 ) ) { ffc12394: 2f 80 00 00 cmpwi cr7,r0,0 return false; ffc12398: 38 60 00 00 li r3,0 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 ) ) { ffc1239c: 4d 9e 00 20 beqlr cr7 - 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; ffc123a0: 81 6a 00 04 lwz r11,4(r10) 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; ffc123a4: 38 00 00 00 li r0,0 - 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; ffc123a8: 55 6b 00 3c rlwinm r11,r11,0,0,30 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); ffc123ac: 7d 6a 5a 14 add r11,r10,r11 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; ffc123b0: 7f 8b 40 40 cmplw cr7,r11,r8 ffc123b4: 41 9c 00 14 blt- cr7,ffc123c8 <_Heap_Size_of_alloc_area+0x68><== NEVER TAKEN ffc123b8: 80 09 00 24 lwz r0,36(r9) ffc123bc: 7c 0b 00 10 subfc r0,r11,r0 ffc123c0: 38 00 00 00 li r0,0 ffc123c4: 7c 00 01 14 adde r0,r0,r0 } block_size = _Heap_Block_size( block ); next_block = _Heap_Block_at( block, block_size ); if ( ffc123c8: 2f 80 00 00 cmpwi cr7,r0,0 !_Heap_Is_block_in_heap( heap, next_block ) || !_Heap_Is_prev_used( next_block ) ) { return false; ffc123cc: 38 60 00 00 li r3,0 } block_size = _Heap_Block_size( block ); next_block = _Heap_Block_at( block, block_size ); if ( ffc123d0: 4d 9e 00 20 beqlr cr7 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; ffc123d4: 80 0b 00 04 lwz r0,4(r11) !_Heap_Is_block_in_heap( heap, next_block ) || !_Heap_Is_prev_used( next_block ) ffc123d8: 70 09 00 01 andi. r9,r0,1 ffc123dc: 4d 82 00 20 beqlr ) { return false; } *alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin; ffc123e0: 20 84 00 04 subfic r4,r4,4 ffc123e4: 7d 64 5a 14 add r11,r4,r11 ffc123e8: 91 65 00 00 stw r11,0(r5) return true; ffc123ec: 38 60 00 01 li r3,1 } ffc123f0: 4e 80 00 20 blr =============================================================================== ffc09b0c <_Heap_Walk>: uintptr_t const min_block_size = heap->min_block_size; Heap_Block *const first_block = heap->first_block; Heap_Block *const last_block = heap->last_block; Heap_Block *block = first_block; Heap_Walk_printer printer = dump ? _Heap_Walk_print : _Heap_Walk_print_nothing; ffc09b0c: 2f 85 00 00 cmpwi cr7,r5,0 bool _Heap_Walk( Heap_Control *heap, int source, bool dump ) { ffc09b10: 94 21 ff 98 stwu r1,-104(r1) ffc09b14: 7c 08 02 a6 mflr r0 ffc09b18: bd c1 00 20 stmw r14,32(r1) ffc09b1c: 7c 7e 1b 78 mr r30,r3 ffc09b20: 7c 9f 23 78 mr r31,r4 ffc09b24: 90 01 00 6c stw r0,108(r1) uintptr_t const page_size = heap->page_size; ffc09b28: 83 43 00 10 lwz r26,16(r3) uintptr_t const min_block_size = heap->min_block_size; ffc09b2c: 83 23 00 14 lwz r25,20(r3) Heap_Block *const first_block = heap->first_block; ffc09b30: 83 03 00 20 lwz r24,32(r3) Heap_Block *const last_block = heap->last_block; ffc09b34: 82 e3 00 24 lwz r23,36(r3) Heap_Block *block = first_block; Heap_Walk_printer printer = dump ? _Heap_Walk_print : _Heap_Walk_print_nothing; ffc09b38: 41 9e 00 10 beq- cr7,ffc09b48 <_Heap_Walk+0x3c> ffc09b3c: 3d 20 ff c1 lis r9,-63 ffc09b40: 39 29 9a 5c addi r9,r9,-26020 ffc09b44: 48 00 00 0c b ffc09b50 <_Heap_Walk+0x44> ffc09b48: 3d 20 ff c1 lis r9,-63 ffc09b4c: 39 29 9a 58 addi r9,r9,-26024 ffc09b50: 91 21 00 18 stw r9,24(r1) if ( !_System_state_Is_up( _System_state_Get() ) ) { ffc09b54: 3d 20 00 00 lis r9,0 return true; ffc09b58: 38 60 00 01 li r3,1 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() ) ) { ffc09b5c: 80 09 28 2c lwz r0,10284(r9) ffc09b60: 2f 80 00 03 cmpwi cr7,r0,3 ffc09b64: 40 be 04 c4 bne+ cr7,ffc0a028 <_Heap_Walk+0x51c> 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)( ffc09b68: 80 1e 00 08 lwz r0,8(r30) ffc09b6c: 3c a0 ff c2 lis r5,-62 ffc09b70: 81 1e 00 18 lwz r8,24(r30) ffc09b74: 7f e3 fb 78 mr r3,r31 ffc09b78: 90 01 00 0c stw r0,12(r1) ffc09b7c: 38 80 00 00 li r4,0 ffc09b80: 38 a5 81 71 addi r5,r5,-32399 ffc09b84: 80 1e 00 0c lwz r0,12(r30) ffc09b88: 7f 46 d3 78 mr r6,r26 ffc09b8c: 81 3e 00 1c lwz r9,28(r30) ffc09b90: 7f 27 cb 78 mr r7,r25 ffc09b94: 90 01 00 10 stw r0,16(r1) ffc09b98: 7f 0a c3 78 mr r10,r24 ffc09b9c: 80 01 00 18 lwz r0,24(r1) ffc09ba0: 92 e1 00 08 stw r23,8(r1) ffc09ba4: 7c 09 03 a6 mtctr r0 ffc09ba8: 4c c6 31 82 crclr 4*cr1+eq ffc09bac: 4e 80 04 21 bctrl heap->area_begin, heap->area_end, first_block, last_block, first_free_block, last_free_block ); if ( page_size == 0 ) { ffc09bb0: 2f 9a 00 00 cmpwi cr7,r26,0 ffc09bb4: 40 be 00 18 bne+ cr7,ffc09bcc <_Heap_Walk+0xc0> (*printer)( source, true, "page size is zero\n" ); ffc09bb8: 3c a0 ff c2 lis r5,-62 ffc09bbc: 7f e3 fb 78 mr r3,r31 ffc09bc0: 38 80 00 01 li r4,1 ffc09bc4: 38 a5 82 02 addi r5,r5,-32254 ffc09bc8: 48 00 00 94 b ffc09c5c <_Heap_Walk+0x150> return false; } if ( !_Addresses_Is_aligned( (void *) page_size ) ) { ffc09bcc: 73 49 00 07 andi. r9,r26,7 ffc09bd0: 41 a2 00 1c beq+ ffc09bec <_Heap_Walk+0xe0> (*printer)( ffc09bd4: 3c a0 ff c2 lis r5,-62 ffc09bd8: 7f e3 fb 78 mr r3,r31 ffc09bdc: 38 80 00 01 li r4,1 ffc09be0: 38 a5 82 15 addi r5,r5,-32235 ffc09be4: 7f 46 d3 78 mr r6,r26 ffc09be8: 48 00 04 5c b ffc0a044 <_Heap_Walk+0x538> RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment ) { return (value % alignment) == 0; ffc09bec: 7c 19 d3 96 divwu r0,r25,r26 ffc09bf0: 7c 00 d1 d6 mullw r0,r0,r26 ); return false; } if ( !_Heap_Is_aligned( min_block_size, page_size ) ) { ffc09bf4: 7f 99 00 00 cmpw cr7,r25,r0 ffc09bf8: 41 be 00 1c beq+ cr7,ffc09c14 <_Heap_Walk+0x108> (*printer)( ffc09bfc: 3c a0 ff c2 lis r5,-62 ffc09c00: 7f e3 fb 78 mr r3,r31 ffc09c04: 38 80 00 01 li r4,1 ffc09c08: 38 a5 82 33 addi r5,r5,-32205 ffc09c0c: 7f 26 cb 78 mr r6,r25 ffc09c10: 48 00 04 34 b ffc0a044 <_Heap_Walk+0x538> RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block( const Heap_Block *block ) { return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE; ffc09c14: 38 18 00 08 addi r0,r24,8 RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment ) { return (value % alignment) == 0; ffc09c18: 7d 20 d3 96 divwu r9,r0,r26 ffc09c1c: 7d 29 d1 d6 mullw r9,r9,r26 ); return false; } if ( ffc09c20: 7f 80 48 00 cmpw cr7,r0,r9 ffc09c24: 41 be 00 1c beq+ cr7,ffc09c40 <_Heap_Walk+0x134> !_Heap_Is_aligned( _Heap_Alloc_area_of_block( first_block ), page_size ) ) { (*printer)( ffc09c28: 3c a0 ff c2 lis r5,-62 ffc09c2c: 7f e3 fb 78 mr r3,r31 ffc09c30: 38 80 00 01 li r4,1 ffc09c34: 38 a5 82 57 addi r5,r5,-32169 ffc09c38: 7f 06 c3 78 mr r6,r24 ffc09c3c: 48 00 04 08 b ffc0a044 <_Heap_Walk+0x538> 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; ffc09c40: 80 18 00 04 lwz r0,4(r24) ); return false; } if ( !_Heap_Is_prev_used( first_block ) ) { ffc09c44: 70 09 00 01 andi. r9,r0,1 ffc09c48: 40 a2 00 28 bne+ ffc09c70 <_Heap_Walk+0x164> (*printer)( ffc09c4c: 3c a0 ff c2 lis r5,-62 ffc09c50: 7f e3 fb 78 mr r3,r31 ffc09c54: 38 80 00 01 li r4,1 ffc09c58: 38 a5 82 88 addi r5,r5,-32120 ffc09c5c: 80 01 00 18 lwz r0,24(r1) ffc09c60: 7c 09 03 a6 mtctr r0 ffc09c64: 4c c6 31 82 crclr 4*cr1+eq ffc09c68: 4e 80 04 21 bctrl ffc09c6c: 48 00 01 18 b ffc09d84 <_Heap_Walk+0x278> - 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; ffc09c70: 83 b7 00 04 lwz r29,4(r23) ffc09c74: 57 bd 00 3c rlwinm r29,r29,0,0,30 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); ffc09c78: 7f b7 ea 14 add r29,r23,r29 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; ffc09c7c: 80 1d 00 04 lwz r0,4(r29) ); return false; } if ( _Heap_Is_free( last_block ) ) { ffc09c80: 70 09 00 01 andi. r9,r0,1 ffc09c84: 40 a2 00 18 bne+ ffc09c9c <_Heap_Walk+0x190> (*printer)( ffc09c88: 3c a0 ff c2 lis r5,-62 ffc09c8c: 7f e3 fb 78 mr r3,r31 ffc09c90: 38 80 00 01 li r4,1 ffc09c94: 38 a5 82 b6 addi r5,r5,-32074 ffc09c98: 4b ff ff c4 b ffc09c5c <_Heap_Walk+0x150> ); return false; } if ( ffc09c9c: 7f 9d c0 00 cmpw cr7,r29,r24 ffc09ca0: 41 9e 00 18 beq- cr7,ffc09cb8 <_Heap_Walk+0x1ac> _Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block ) { (*printer)( ffc09ca4: 3c a0 ff c2 lis r5,-62 ffc09ca8: 7f e3 fb 78 mr r3,r31 ffc09cac: 38 80 00 01 li r4,1 ffc09cb0: 38 a5 82 cb addi r5,r5,-32053 ffc09cb4: 4b ff ff a8 b ffc09c5c <_Heap_Walk+0x150> int source, Heap_Walk_printer printer, Heap_Control *heap ) { uintptr_t const page_size = heap->page_size; ffc09cb8: 81 3e 00 10 lwz r9,16(r30) const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap ); ffc09cbc: 7f c0 f3 78 mr r0,r30 block = next_block; } while ( block != first_block ); return true; } ffc09cc0: 80 de 00 08 lwz r6,8(r30) ffc09cc4: 48 00 00 d0 b ffc09d94 <_Heap_Walk+0x288> 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; ffc09cc8: 81 5e 00 20 lwz r10,32(r30) ffc09ccc: 39 60 00 00 li r11,0 ffc09cd0: 7f 8a 30 40 cmplw cr7,r10,r6 ffc09cd4: 41 9d 00 14 bgt- cr7,ffc09ce8 <_Heap_Walk+0x1dc> ffc09cd8: 81 7e 00 24 lwz r11,36(r30) ffc09cdc: 7d 66 58 10 subfc r11,r6,r11 ffc09ce0: 39 60 00 00 li r11,0 ffc09ce4: 7d 6b 59 14 adde r11,r11,r11 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 ) ) { ffc09ce8: 2f 8b 00 00 cmpwi cr7,r11,0 ffc09cec: 40 be 00 18 bne+ cr7,ffc09d04 <_Heap_Walk+0x1f8> (*printer)( ffc09cf0: 3c a0 ff c2 lis r5,-62 ffc09cf4: 7f e3 fb 78 mr r3,r31 ffc09cf8: 38 80 00 01 li r4,1 ffc09cfc: 38 a5 82 fa addi r5,r5,-32006 ffc09d00: 48 00 03 44 b ffc0a044 <_Heap_Walk+0x538> RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block( const Heap_Block *block ) { return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE; ffc09d04: 39 66 00 08 addi r11,r6,8 RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment ) { return (value % alignment) == 0; ffc09d08: 7d 4b 4b 96 divwu r10,r11,r9 ffc09d0c: 7d 4a 49 d6 mullw r10,r10,r9 ); return false; } if ( ffc09d10: 7f 8b 50 00 cmpw cr7,r11,r10 ffc09d14: 41 be 00 18 beq+ cr7,ffc09d2c <_Heap_Walk+0x220> !_Heap_Is_aligned( _Heap_Alloc_area_of_block( free_block ), page_size ) ) { (*printer)( ffc09d18: 3c a0 ff c2 lis r5,-62 ffc09d1c: 7f e3 fb 78 mr r3,r31 ffc09d20: 38 80 00 01 li r4,1 ffc09d24: 38 a5 83 1a addi r5,r5,-31974 ffc09d28: 48 00 03 1c b ffc0a044 <_Heap_Walk+0x538> - 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; ffc09d2c: 81 66 00 04 lwz r11,4(r6) ffc09d30: 55 6b 00 3c rlwinm r11,r11,0,0,30 block = next_block; } while ( block != first_block ); return true; } ffc09d34: 7d 66 5a 14 add r11,r6,r11 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; ffc09d38: 81 6b 00 04 lwz r11,4(r11) ); return false; } if ( _Heap_Is_used( free_block ) ) { ffc09d3c: 71 6a 00 01 andi. r10,r11,1 ffc09d40: 41 a2 00 18 beq+ ffc09d58 <_Heap_Walk+0x24c> (*printer)( ffc09d44: 3c a0 ff c2 lis r5,-62 ffc09d48: 7f e3 fb 78 mr r3,r31 ffc09d4c: 38 80 00 01 li r4,1 ffc09d50: 38 a5 83 4a addi r5,r5,-31926 ffc09d54: 48 00 02 f0 b ffc0a044 <_Heap_Walk+0x538> ); return false; } if ( free_block->prev != prev_block ) { ffc09d58: 80 e6 00 0c lwz r7,12(r6) ffc09d5c: 7f 87 00 00 cmpw cr7,r7,r0 ffc09d60: 41 be 00 2c beq+ cr7,ffc09d8c <_Heap_Walk+0x280> (*printer)( ffc09d64: 3c a0 ff c2 lis r5,-62 ffc09d68: 7f e3 fb 78 mr r3,r31 ffc09d6c: 38 80 00 01 li r4,1 ffc09d70: 38 a5 83 66 addi r5,r5,-31898 ffc09d74: 80 01 00 18 lwz r0,24(r1) ffc09d78: 7c 09 03 a6 mtctr r0 ffc09d7c: 4c c6 31 82 crclr 4*cr1+eq ffc09d80: 4e 80 04 21 bctrl if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; } if ( !_Heap_Walk_check_control( source, printer, heap ) ) { return false; ffc09d84: 38 60 00 00 li r3,0 ffc09d88: 48 00 02 a0 b ffc0a028 <_Heap_Walk+0x51c> return false; } prev_block = free_block; free_block = free_block->next; ffc09d8c: 7c c0 33 78 mr r0,r6 ffc09d90: 80 c6 00 08 lwz r6,8(r6) 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 ) { ffc09d94: 7f 86 f0 00 cmpw cr7,r6,r30 ffc09d98: 40 9e ff 30 bne+ cr7,ffc09cc8 <_Heap_Walk+0x1bc> ffc09d9c: 48 00 00 0c b ffc09da8 <_Heap_Walk+0x29c> block->prev_size ); } block = next_block; } while ( block != first_block ); ffc09da0: 7f 7d db 78 mr r29,r27 ffc09da4: 48 00 00 30 b ffc09dd4 <_Heap_Walk+0x2c8> "block 0x%08x: size %u\n", block, block_size ); } else { (*printer)( ffc09da8: 3e 60 ff c2 lis r19,-62 if ( !_Heap_Is_prev_used( next_block ) ) { if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) { return false; } } else if (prev_used) { (*printer)( ffc09dac: 3e 80 ff c2 lis r20,-62 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)( ffc09db0: 3e 40 ff c2 lis r18,-62 "block 0x%08x: size %u\n", block, block_size ); } else { (*printer)( ffc09db4: 3a 73 85 06 addi r19,r19,-31482 if ( !_Heap_Is_prev_used( next_block ) ) { if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) { return false; } } else if (prev_used) { (*printer)( ffc09db8: 3a 94 84 ef addi r20,r20,-31505 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)( ffc09dbc: 3a 52 84 52 addi r18,r18,-31662 ffc09dc0: 3e 20 ff c2 lis r17,-62 " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), block->next, block->next == last_free_block ? " (= last free)" : (block->next == free_list_tail ? " (= tail)" : "") ffc09dc4: 3e c0 ff c2 lis r22,-62 ffc09dc8: 3e 00 ff c2 lis r16,-62 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)( ffc09dcc: 3d e0 ff c2 lis r15,-62 block, block_size, block->prev, block->prev == first_free_block ? " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), ffc09dd0: 3d c0 ff c2 lis r14,-62 block = next_block; } while ( block != first_block ); return true; } ffc09dd4: 82 bd 00 04 lwz r21,4(r29) 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; ffc09dd8: 38 00 00 00 li r0,0 ffc09ddc: 81 3e 00 20 lwz r9,32(r30) - 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; ffc09de0: 56 bc 00 3c rlwinm r28,r21,0,0,30 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); ffc09de4: 7f 7d e2 14 add r27,r29,r28 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; ffc09de8: 7f 89 d8 40 cmplw cr7,r9,r27 ffc09dec: 41 9d 00 14 bgt- cr7,ffc09e00 <_Heap_Walk+0x2f4> <== NEVER TAKEN ffc09df0: 80 1e 00 24 lwz r0,36(r30) ffc09df4: 7c 1b 00 10 subfc r0,r27,r0 ffc09df8: 38 00 00 00 li r0,0 ffc09dfc: 7c 00 01 14 adde r0,r0,r0 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 ) ) { ffc09e00: 2f 80 00 00 cmpwi cr7,r0,0 ffc09e04: 40 be 00 18 bne+ cr7,ffc09e1c <_Heap_Walk+0x310> (*printer)( ffc09e08: 3c a0 ff c2 lis r5,-62 ffc09e0c: 7f e3 fb 78 mr r3,r31 ffc09e10: 38 80 00 01 li r4,1 ffc09e14: 38 a5 83 98 addi r5,r5,-31848 ffc09e18: 48 00 00 a8 b ffc09ec0 <_Heap_Walk+0x3b4> RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment ) { return (value % alignment) == 0; ffc09e1c: 7d 3c d3 96 divwu r9,r28,r26 ffc09e20: 7d 29 d1 d6 mullw r9,r9,r26 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; ffc09e24: 7f a0 ba 78 xor r0,r29,r23 ); return false; } if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) { ffc09e28: 7f 9c 48 00 cmpw cr7,r28,r9 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; ffc09e2c: 7c 00 00 34 cntlzw r0,r0 ffc09e30: 54 00 d9 7e rlwinm r0,r0,27,5,31 ffc09e34: 68 00 00 01 xori r0,r0,1 ); return false; } if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) { ffc09e38: 41 9e 00 28 beq- cr7,ffc09e60 <_Heap_Walk+0x354> ffc09e3c: 2f 80 00 00 cmpwi cr7,r0,0 ffc09e40: 41 be 00 20 beq+ cr7,ffc09e60 <_Heap_Walk+0x354> (*printer)( ffc09e44: 3c a0 ff c2 lis r5,-62 ffc09e48: 7f e3 fb 78 mr r3,r31 ffc09e4c: 38 80 00 01 li r4,1 ffc09e50: 38 a5 83 c5 addi r5,r5,-31803 ffc09e54: 7f a6 eb 78 mr r6,r29 ffc09e58: 7f 87 e3 78 mr r7,r28 ffc09e5c: 4b ff ff 18 b ffc09d74 <_Heap_Walk+0x268> ); return false; } if ( block_size < min_block_size && is_not_last_block ) { ffc09e60: 7f 9c c8 40 cmplw cr7,r28,r25 ffc09e64: 40 9c 00 3c bge- cr7,ffc09ea0 <_Heap_Walk+0x394> ffc09e68: 2f 80 00 00 cmpwi cr7,r0,0 ffc09e6c: 41 be 00 34 beq+ cr7,ffc09ea0 <_Heap_Walk+0x394> <== NEVER TAKEN (*printer)( ffc09e70: 80 01 00 18 lwz r0,24(r1) ffc09e74: 3c a0 ff c2 lis r5,-62 ffc09e78: 7f e3 fb 78 mr r3,r31 ffc09e7c: 38 80 00 01 li r4,1 ffc09e80: 7c 09 03 a6 mtctr r0 ffc09e84: 38 a5 83 f3 addi r5,r5,-31757 ffc09e88: 7f a6 eb 78 mr r6,r29 ffc09e8c: 7f 87 e3 78 mr r7,r28 ffc09e90: 7f 28 cb 78 mr r8,r25 ffc09e94: 4c c6 31 82 crclr 4*cr1+eq ffc09e98: 4e 80 04 21 bctrl ffc09e9c: 4b ff fe e8 b ffc09d84 <_Heap_Walk+0x278> ); return false; } if ( next_block_begin <= block_begin && is_not_last_block ) { ffc09ea0: 7f 9b e8 40 cmplw cr7,r27,r29 ffc09ea4: 41 9d 00 28 bgt- cr7,ffc09ecc <_Heap_Walk+0x3c0> ffc09ea8: 2f 80 00 00 cmpwi cr7,r0,0 ffc09eac: 41 be 00 20 beq+ cr7,ffc09ecc <_Heap_Walk+0x3c0> (*printer)( ffc09eb0: 3c a0 ff c2 lis r5,-62 ffc09eb4: 7f e3 fb 78 mr r3,r31 ffc09eb8: 38 80 00 01 li r4,1 ffc09ebc: 38 a5 84 1e addi r5,r5,-31714 ffc09ec0: 7f a6 eb 78 mr r6,r29 ffc09ec4: 7f 67 db 78 mr r7,r27 ffc09ec8: 4b ff fe ac b ffc09d74 <_Heap_Walk+0x268> 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; ffc09ecc: 80 1b 00 04 lwz r0,4(r27) ffc09ed0: 56 b5 07 fe clrlwi r21,r21,31 ); return false; } if ( !_Heap_Is_prev_used( next_block ) ) { ffc09ed4: 70 09 00 01 andi. r9,r0,1 ffc09ed8: 40 a2 00 ec bne+ ffc09fc4 <_Heap_Walk+0x4b8> 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 ? ffc09edc: 81 1d 00 0c lwz r8,12(r29) 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)( ffc09ee0: 39 2f 81 3e addi r9,r15,-32450 ffc09ee4: 80 1e 00 08 lwz r0,8(r30) block = next_block; } while ( block != first_block ); return true; } ffc09ee8: 81 7e 00 0c lwz r11,12(r30) 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)( ffc09eec: 7f 88 00 00 cmpw cr7,r8,r0 ffc09ef0: 41 9e 00 14 beq- cr7,ffc09f04 <_Heap_Walk+0x3f8> block, block_size, block->prev, block->prev == first_free_block ? " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), ffc09ef4: 7f 88 f0 00 cmpw cr7,r8,r30 ffc09ef8: 39 36 80 83 addi r9,r22,-32637 ffc09efc: 40 be 00 08 bne+ cr7,ffc09f04 <_Heap_Walk+0x3f8> ffc09f00: 39 2e 81 4e addi r9,r14,-32434 block->next, block->next == last_free_block ? ffc09f04: 81 5d 00 08 lwz r10,8(r29) 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)( ffc09f08: 38 11 81 58 addi r0,r17,-32424 ffc09f0c: 7f 8a 58 00 cmpw cr7,r10,r11 ffc09f10: 41 9e 00 14 beq- cr7,ffc09f24 <_Heap_Walk+0x418> " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), block->next, block->next == last_free_block ? " (= last free)" : (block->next == free_list_tail ? " (= tail)" : "") ffc09f14: 7f 8a f0 00 cmpw cr7,r10,r30 ffc09f18: 38 16 80 83 addi r0,r22,-32637 ffc09f1c: 40 be 00 08 bne+ cr7,ffc09f24 <_Heap_Walk+0x418> ffc09f20: 38 10 81 67 addi r0,r16,-32409 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)( ffc09f24: 90 01 00 08 stw r0,8(r1) ffc09f28: 7f e3 fb 78 mr r3,r31 ffc09f2c: 38 80 00 00 li r4,0 ffc09f30: 80 01 00 18 lwz r0,24(r1) ffc09f34: 7e 45 93 78 mr r5,r18 ffc09f38: 7f a6 eb 78 mr r6,r29 ffc09f3c: 7f 87 e3 78 mr r7,r28 ffc09f40: 7c 09 03 a6 mtctr r0 ffc09f44: 4c c6 31 82 crclr 4*cr1+eq ffc09f48: 4e 80 04 21 bctrl block->next == last_free_block ? " (= last free)" : (block->next == free_list_tail ? " (= tail)" : "") ); if ( block_size != next_block->prev_size ) { ffc09f4c: 81 1b 00 00 lwz r8,0(r27) ffc09f50: 7f 9c 40 00 cmpw cr7,r28,r8 ffc09f54: 41 be 00 34 beq+ cr7,ffc09f88 <_Heap_Walk+0x47c> (*printer)( ffc09f58: 80 01 00 18 lwz r0,24(r1) ffc09f5c: 3c a0 ff c2 lis r5,-62 ffc09f60: 7f e3 fb 78 mr r3,r31 ffc09f64: 38 80 00 01 li r4,1 ffc09f68: 7c 09 03 a6 mtctr r0 ffc09f6c: 38 a5 84 87 addi r5,r5,-31609 ffc09f70: 7f a6 eb 78 mr r6,r29 ffc09f74: 7f 87 e3 78 mr r7,r28 ffc09f78: 7f 69 db 78 mr r9,r27 ffc09f7c: 4c c6 31 82 crclr 4*cr1+eq ffc09f80: 4e 80 04 21 bctrl ffc09f84: 4b ff fe 00 b ffc09d84 <_Heap_Walk+0x278> ); return false; } if ( !prev_used ) { ffc09f88: 2f 95 00 00 cmpwi cr7,r21,0 ffc09f8c: 40 be 00 18 bne+ cr7,ffc09fa4 <_Heap_Walk+0x498> (*printer)( ffc09f90: 3c a0 ff c2 lis r5,-62 ffc09f94: 7f e3 fb 78 mr r3,r31 ffc09f98: 38 80 00 01 li r4,1 ffc09f9c: 38 a5 84 c0 addi r5,r5,-31552 ffc09fa0: 48 00 00 a0 b ffc0a040 <_Heap_Walk+0x534> block = next_block; } while ( block != first_block ); return true; } ffc09fa4: 81 3e 00 08 lwz r9,8(r30) ffc09fa8: 48 00 00 10 b ffc09fb8 <_Heap_Walk+0x4ac> { 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 ) { ffc09fac: 7f 89 e8 00 cmpw cr7,r9,r29 ffc09fb0: 41 9e 00 6c beq- cr7,ffc0a01c <_Heap_Walk+0x510> return true; } free_block = free_block->next; ffc09fb4: 81 29 00 08 lwz r9,8(r9) ) { 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 ) { ffc09fb8: 7f 89 f0 00 cmpw cr7,r9,r30 ffc09fbc: 40 9e ff f0 bne+ cr7,ffc09fac <_Heap_Walk+0x4a0> ffc09fc0: 48 00 00 70 b ffc0a030 <_Heap_Walk+0x524> if ( !_Heap_Is_prev_used( next_block ) ) { if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) { return false; } } else if (prev_used) { ffc09fc4: 2f 95 00 00 cmpwi cr7,r21,0 ffc09fc8: 41 9e 00 2c beq- cr7,ffc09ff4 <_Heap_Walk+0x4e8> (*printer)( ffc09fcc: 80 01 00 18 lwz r0,24(r1) ffc09fd0: 7f e3 fb 78 mr r3,r31 ffc09fd4: 38 80 00 00 li r4,0 ffc09fd8: 7e 85 a3 78 mr r5,r20 ffc09fdc: 7c 09 03 a6 mtctr r0 ffc09fe0: 7f a6 eb 78 mr r6,r29 ffc09fe4: 7f 87 e3 78 mr r7,r28 ffc09fe8: 4c c6 31 82 crclr 4*cr1+eq ffc09fec: 4e 80 04 21 bctrl ffc09ff0: 48 00 00 2c b ffc0a01c <_Heap_Walk+0x510> "block 0x%08x: size %u\n", block, block_size ); } else { (*printer)( ffc09ff4: 80 01 00 18 lwz r0,24(r1) ffc09ff8: 7f e3 fb 78 mr r3,r31 ffc09ffc: 38 80 00 00 li r4,0 ffc0a000: 81 1d 00 00 lwz r8,0(r29) ffc0a004: 7e 65 9b 78 mr r5,r19 ffc0a008: 7c 09 03 a6 mtctr r0 ffc0a00c: 7f a6 eb 78 mr r6,r29 ffc0a010: 7f 87 e3 78 mr r7,r28 ffc0a014: 4c c6 31 82 crclr 4*cr1+eq ffc0a018: 4e 80 04 21 bctrl block->prev_size ); } block = next_block; } while ( block != first_block ); ffc0a01c: 7f 9b c0 00 cmpw cr7,r27,r24 ffc0a020: 40 9e fd 80 bne+ cr7,ffc09da0 <_Heap_Walk+0x294> return true; ffc0a024: 38 60 00 01 li r3,1 } ffc0a028: 39 61 00 68 addi r11,r1,104 ffc0a02c: 4b ff 6a c8 b ffc00af4 <_restgpr_14_x> return false; } if ( !_Heap_Walk_is_in_free_list( heap, block ) ) { (*printer)( ffc0a030: 3c a0 ff c2 lis r5,-62 ffc0a034: 7f e3 fb 78 mr r3,r31 ffc0a038: 38 80 00 01 li r4,1 ffc0a03c: 38 a5 85 2b addi r5,r5,-31445 ffc0a040: 7f a6 eb 78 mr r6,r29 ffc0a044: 80 01 00 18 lwz r0,24(r1) ffc0a048: 7c 09 03 a6 mtctr r0 ffc0a04c: 4c c6 31 82 crclr 4*cr1+eq ffc0a050: 4e 80 04 21 bctrl ffc0a054: 4b ff fd 30 b ffc09d84 <_Heap_Walk+0x278> =============================================================================== ffc09a5c <_Heap_Walk_print>: static void _Heap_Walk_print( int source, bool error, const char *fmt, ... ) { ffc09a5c: 7c 08 02 a6 mflr r0 ffc09a60: 7c 2b 0b 78 mr r11,r1 ffc09a64: 94 21 ff 88 stwu r1,-120(r1) ffc09a68: 90 01 00 7c stw r0,124(r1) ffc09a6c: 4b ff 70 81 bl ffc00aec <_savegpr_31> ffc09a70: 7c 60 1b 78 mr r0,r3 ffc09a74: 90 c1 00 1c stw r6,28(r1) ffc09a78: 90 e1 00 20 stw r7,32(r1) ffc09a7c: 91 01 00 24 stw r8,36(r1) ffc09a80: 91 21 00 28 stw r9,40(r1) ffc09a84: 91 41 00 2c stw r10,44(r1) ffc09a88: 40 86 00 24 bne- cr1,ffc09aac <_Heap_Walk_print+0x50> <== ALWAYS TAKEN ffc09a8c: d8 21 00 30 stfd f1,48(r1) <== NOT EXECUTED ffc09a90: d8 41 00 38 stfd f2,56(r1) <== NOT EXECUTED ffc09a94: d8 61 00 40 stfd f3,64(r1) <== NOT EXECUTED ffc09a98: d8 81 00 48 stfd f4,72(r1) <== NOT EXECUTED ffc09a9c: d8 a1 00 50 stfd f5,80(r1) <== NOT EXECUTED ffc09aa0: d8 c1 00 58 stfd f6,88(r1) <== NOT EXECUTED ffc09aa4: d8 e1 00 60 stfd f7,96(r1) <== NOT EXECUTED ffc09aa8: d9 01 00 68 stfd f8,104(r1) <== NOT EXECUTED va_list ap; if ( error ) { ffc09aac: 2f 84 00 00 cmpwi cr7,r4,0 { /* Do nothing */ } static void _Heap_Walk_print( int source, bool error, const char *fmt, ... ) { ffc09ab0: 7c bf 2b 78 mr r31,r5 va_list ap; if ( error ) { ffc09ab4: 41 be 00 10 beq+ cr7,ffc09ac4 <_Heap_Walk_print+0x68> printk( "FAIL[%d]: ", source ); ffc09ab8: 3c 60 ff c2 lis r3,-62 ffc09abc: 38 63 81 28 addi r3,r3,-32472 ffc09ac0: 48 00 00 0c b ffc09acc <_Heap_Walk_print+0x70> } else { printk( "PASS[%d]: ", source ); ffc09ac4: 3c 60 ff c2 lis r3,-62 ffc09ac8: 38 63 81 33 addi r3,r3,-32461 ffc09acc: 7c 04 03 78 mr r4,r0 ffc09ad0: 4c c6 31 82 crclr 4*cr1+eq ffc09ad4: 4b ff be 99 bl ffc0596c } va_start( ap, fmt ); ffc09ad8: 38 00 00 03 li r0,3 ffc09adc: 98 01 00 08 stb r0,8(r1) ffc09ae0: 38 00 00 00 li r0,0 vprintk( fmt, ap ); ffc09ae4: 7f e3 fb 78 mr r3,r31 printk( "FAIL[%d]: ", source ); } else { printk( "PASS[%d]: ", source ); } va_start( ap, fmt ); ffc09ae8: 98 01 00 09 stb r0,9(r1) ffc09aec: 38 01 00 80 addi r0,r1,128 vprintk( fmt, ap ); ffc09af0: 38 81 00 08 addi r4,r1,8 printk( "FAIL[%d]: ", source ); } else { printk( "PASS[%d]: ", source ); } va_start( ap, fmt ); ffc09af4: 90 01 00 0c stw r0,12(r1) ffc09af8: 38 01 00 10 addi r0,r1,16 ffc09afc: 90 01 00 10 stw r0,16(r1) vprintk( fmt, ap ); ffc09b00: 4b ff dc 31 bl ffc07730 va_end( ap ); } ffc09b04: 39 61 00 78 addi r11,r1,120 ffc09b08: 4b ff 70 30 b ffc00b38 <_restgpr_31_x> =============================================================================== ffc091c0 <_IO_Manager_initialization>: * workspace. * */ void _IO_Manager_initialization(void) { ffc091c0: 94 21 ff e0 stwu r1,-32(r1) ffc091c4: 7c 08 02 a6 mflr r0 uint32_t index; rtems_driver_address_table *driver_table; uint32_t drivers_in_table; uint32_t number_of_drivers; driver_table = Configuration.Device_driver_table; ffc091c8: 3d 20 00 00 lis r9,0 * workspace. * */ void _IO_Manager_initialization(void) { ffc091cc: 90 01 00 24 stw r0,36(r1) uint32_t index; rtems_driver_address_table *driver_table; uint32_t drivers_in_table; uint32_t number_of_drivers; driver_table = Configuration.Device_driver_table; ffc091d0: 39 29 20 b8 addi r9,r9,8376 * workspace. * */ void _IO_Manager_initialization(void) { ffc091d4: bf 41 00 08 stmw r26,8(r1) ffc091d8: 3f a0 00 00 lis r29,0 ffc091dc: 3f 40 00 00 lis r26,0 rtems_driver_address_table *driver_table; uint32_t drivers_in_table; uint32_t number_of_drivers; driver_table = Configuration.Device_driver_table; drivers_in_table = Configuration.number_of_device_drivers; ffc091e0: 83 c9 00 30 lwz r30,48(r9) number_of_drivers = Configuration.maximum_drivers; ffc091e4: 83 69 00 2c lwz r27,44(r9) uint32_t index; rtems_driver_address_table *driver_table; uint32_t drivers_in_table; uint32_t number_of_drivers; driver_table = Configuration.Device_driver_table; ffc091e8: 83 e9 00 34 lwz r31,52(r9) /* * If the user claims there are less drivers than are actually in * the table, then let's just go with the table's count. */ if ( number_of_drivers <= drivers_in_table ) ffc091ec: 7f 9b f0 40 cmplw cr7,r27,r30 ffc091f0: 40 9d 00 40 ble- cr7,ffc09230 <_IO_Manager_initialization+0x70> * have to allocate a new driver table and copy theirs to it. */ _IO_Driver_address_table = (rtems_driver_address_table *) _Workspace_Allocate_or_fatal_error( sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ffc091f4: 1f 9b 00 18 mulli r28,r27,24 * The application requested extra slots in the driver table, so we * have to allocate a new driver table and copy theirs to it. */ _IO_Driver_address_table = (rtems_driver_address_table *) _Workspace_Allocate_or_fatal_error( ffc091f8: 7f 83 e3 78 mr r3,r28 ffc091fc: 48 00 35 11 bl ffc0c70c <_Workspace_Allocate_or_fatal_error> sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); _IO_Number_of_drivers = number_of_drivers; memset( ffc09200: 38 80 00 00 li r4,0 ffc09204: 7f 85 e3 78 mr r5,r28 /* * The application requested extra slots in the driver table, so we * have to allocate a new driver table and copy theirs to it. */ _IO_Driver_address_table = (rtems_driver_address_table *) ffc09208: 90 7d 28 5c stw r3,10332(r29) _Workspace_Allocate_or_fatal_error( sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); _IO_Number_of_drivers = number_of_drivers; ffc0920c: 93 7a 28 58 stw r27,10328(r26) memset( ffc09210: 48 00 bd e9 bl ffc14ff8 ffc09214: 2f 9e 00 00 cmpwi cr7,r30,0 _IO_Driver_address_table, 0, sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); for ( index = 0 ; index < drivers_in_table ; index++ ) ffc09218: 39 60 00 00 li r11,0 _IO_Driver_address_table[index] = driver_table[index]; ffc0921c: 7f a4 eb 78 mr r4,r29 ffc09220: 38 1e 00 01 addi r0,r30,1 ffc09224: 40 be 00 30 bne+ cr7,ffc09254 <_IO_Manager_initialization+0x94><== ALWAYS TAKEN ffc09228: 38 00 00 01 li r0,1 <== NOT EXECUTED ffc0922c: 48 00 00 28 b ffc09254 <_IO_Manager_initialization+0x94><== NOT EXECUTED * If the maximum number of driver is the same as the number in the * table, then we do not have to copy the driver table. They can't * register any dynamically. */ if ( number_of_drivers == drivers_in_table ) { _IO_Driver_address_table = driver_table; ffc09230: 93 fd 28 5c stw r31,10332(r29) _IO_Number_of_drivers = number_of_drivers; ffc09234: 93 da 28 58 stw r30,10328(r26) return; ffc09238: 48 00 00 24 b ffc0925c <_IO_Manager_initialization+0x9c> _IO_Driver_address_table, 0, sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); for ( index = 0 ; index < drivers_in_table ; index++ ) _IO_Driver_address_table[index] = driver_table[index]; ffc0923c: 80 64 28 5c lwz r3,10332(r4) ffc09240: 7d 9f 5a 14 add r12,r31,r11 ffc09244: 7c 63 5a 14 add r3,r3,r11 ffc09248: 7c ac c4 aa lswi r5,r12,24 ffc0924c: 7c a3 c5 aa stswi r5,r3,24 memset( _IO_Driver_address_table, 0, sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); for ( index = 0 ; index < drivers_in_table ; index++ ) ffc09250: 39 6b 00 18 addi r11,r11,24 ffc09254: 34 00 ff ff addic. r0,r0,-1 ffc09258: 40 82 ff e4 bne+ ffc0923c <_IO_Manager_initialization+0x7c> _IO_Driver_address_table[index] = driver_table[index]; } ffc0925c: 39 61 00 20 addi r11,r1,32 ffc09260: 48 00 ff 3c b ffc1919c <_restgpr_26_x> =============================================================================== ffc0a0c4 <_Internal_error_Occurred>: void _Internal_error_Occurred( Internal_errors_Source the_source, bool is_internal, Internal_errors_t the_error ) { ffc0a0c4: 7c 2b 0b 78 mr r11,r1 ffc0a0c8: 94 21 ff f0 stwu r1,-16(r1) ffc0a0cc: 7c 08 02 a6 mflr r0 ffc0a0d0: 48 00 f0 95 bl ffc19164 <_savegpr_31> _Internal_errors_What_happened.the_source = the_source; ffc0a0d4: 3d 60 00 00 lis r11,0 ffc0a0d8: 39 2b 2d f0 addi r9,r11,11760 void _Internal_error_Occurred( Internal_errors_Source the_source, bool is_internal, Internal_errors_t the_error ) { ffc0a0dc: 90 01 00 14 stw r0,20(r1) ffc0a0e0: 7c bf 2b 78 mr r31,r5 _Internal_errors_What_happened.the_source = the_source; _Internal_errors_What_happened.is_internal = is_internal; ffc0a0e4: 98 89 00 04 stb r4,4(r9) _Internal_errors_What_happened.the_error = the_error; ffc0a0e8: 90 a9 00 08 stw r5,8(r9) bool is_internal, Internal_errors_t the_error ) { _Internal_errors_What_happened.the_source = the_source; ffc0a0ec: 90 6b 2d f0 stw r3,11760(r11) _Internal_errors_What_happened.is_internal = is_internal; _Internal_errors_What_happened.the_error = the_error; _User_extensions_Fatal( the_source, is_internal, the_error ); ffc0a0f0: 48 00 21 65 bl ffc0c254 <_User_extensions_Fatal> RTEMS_INLINE_ROUTINE void _System_state_Set ( System_state_Codes state ) { _System_state_Current = state; ffc0a0f4: 38 00 00 05 li r0,5 ffc0a0f8: 3d 20 00 00 lis r9,0 _System_state_Set( SYSTEM_STATE_FAILED ); _CPU_Fatal_halt( the_error ); ffc0a0fc: 7f e3 fb 78 mr r3,r31 ffc0a100: 90 09 28 48 stw r0,10312(r9) ffc0a104: 4b ff 97 a1 bl ffc038a4 <_BSP_Fatal_error> ffc0a108: 48 00 00 00 b ffc0a108 <_Internal_error_Occurred+0x44><== NOT EXECUTED =============================================================================== ffc0a120 <_Objects_Allocate>: */ Objects_Control *_Objects_Allocate( Objects_Information *information ) { ffc0a120: 94 21 ff f0 stwu r1,-16(r1) ffc0a124: 7c 08 02 a6 mflr r0 ffc0a128: 90 01 00 14 stw r0,20(r1) * 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 ) ffc0a12c: 80 03 00 18 lwz r0,24(r3) */ Objects_Control *_Objects_Allocate( Objects_Information *information ) { ffc0a130: bf c1 00 08 stmw r30,8(r1) ffc0a134: 7c 7f 1b 78 mr r31,r3 * 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 ) ffc0a138: 2f 80 00 00 cmpwi cr7,r0,0 return NULL; ffc0a13c: 38 60 00 00 li r3,0 * 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 ) ffc0a140: 41 be 00 70 beq+ cr7,ffc0a1b0 <_Objects_Allocate+0x90> <== 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 ); ffc0a144: 3b df 00 20 addi r30,r31,32 ffc0a148: 7f c3 f3 78 mr r3,r30 ffc0a14c: 4b ff f6 71 bl ffc097bc <_Chain_Get> if ( information->auto_extend ) { ffc0a150: 88 1f 00 12 lbz r0,18(r31) ffc0a154: 2f 80 00 00 cmpwi cr7,r0,0 ffc0a158: 41 9e 00 58 beq- cr7,ffc0a1b0 <_Objects_Allocate+0x90> /* * If the list is empty then we are out of objects and need to * extend information base. */ if ( !the_object ) { ffc0a15c: 2f 83 00 00 cmpwi cr7,r3,0 ffc0a160: 40 be 00 1c bne+ cr7,ffc0a17c <_Objects_Allocate+0x5c> _Objects_Extend_information( information ); ffc0a164: 7f e3 fb 78 mr r3,r31 ffc0a168: 48 00 00 85 bl ffc0a1ec <_Objects_Extend_information> the_object = (Objects_Control *) _Chain_Get( &information->Inactive ); ffc0a16c: 7f c3 f3 78 mr r3,r30 ffc0a170: 4b ff f6 4d bl ffc097bc <_Chain_Get> } if ( the_object ) { ffc0a174: 2c 03 00 00 cmpwi r3,0 ffc0a178: 41 a2 00 38 beq+ ffc0a1b0 <_Objects_Allocate+0x90> uint32_t block; block = (uint32_t) _Objects_Get_index( the_object->id ) - ffc0a17c: a1 23 00 0a lhz r9,10(r3) ffc0a180: a0 1f 00 0a lhz r0,10(r31) ffc0a184: 7c 00 48 50 subf r0,r0,r9 _Objects_Get_index( information->minimum_id ); block /= information->allocation_size; ffc0a188: a1 3f 00 14 lhz r9,20(r31) ffc0a18c: 7c 00 4b 96 divwu r0,r0,r9 information->inactive_per_block[ block ]--; ffc0a190: 81 3f 00 30 lwz r9,48(r31) ffc0a194: 54 00 10 3a rlwinm r0,r0,2,0,29 ffc0a198: 7d 69 00 2e lwzx r11,r9,r0 ffc0a19c: 39 6b ff ff addi r11,r11,-1 ffc0a1a0: 7d 69 01 2e stwx r11,r9,r0 information->inactive--; ffc0a1a4: a1 3f 00 2c lhz r9,44(r31) ffc0a1a8: 38 09 ff ff addi r0,r9,-1 ffc0a1ac: b0 1f 00 2c sth r0,44(r31) ); } #endif return the_object; } ffc0a1b0: 39 61 00 10 addi r11,r1,16 ffc0a1b4: 48 00 ef f8 b ffc191ac <_restgpr_30_x> =============================================================================== ffc0a1ec <_Objects_Extend_information>: */ void _Objects_Extend_information( Objects_Information *information ) { ffc0a1ec: 94 21 ff b8 stwu r1,-72(r1) ffc0a1f0: 7c 08 02 a6 mflr r0 ffc0a1f4: 90 01 00 4c stw r0,76(r1) minimum_index = _Objects_Get_index( information->minimum_id ); index_base = minimum_index; block = 0; /* if ( information->maximum < minimum_index ) */ if ( information->object_blocks == NULL ) ffc0a1f8: 81 63 00 34 lwz r11,52(r3) */ void _Objects_Extend_information( Objects_Information *information ) { ffc0a1fc: be a1 00 1c stmw r21,28(r1) ffc0a200: 7c 7f 1b 78 mr r31,r3 minimum_index = _Objects_Get_index( information->minimum_id ); index_base = minimum_index; block = 0; /* if ( information->maximum < minimum_index ) */ if ( information->object_blocks == NULL ) ffc0a204: 2f 8b 00 00 cmpwi cr7,r11,0 /* * Search for a free block of indexes. If we do NOT need to allocate or * extend the block table, then we will change do_extend. */ do_extend = true; minimum_index = _Objects_Get_index( information->minimum_id ); ffc0a208: a3 83 00 0a lhz r28,10(r3) index_base = minimum_index; block = 0; /* if ( information->maximum < minimum_index ) */ if ( information->object_blocks == NULL ) ffc0a20c: 41 9e 00 54 beq- cr7,ffc0a260 <_Objects_Extend_information+0x74> block_count = 0; else { block_count = information->maximum / information->allocation_size; ffc0a210: a1 23 00 14 lhz r9,20(r3) * information - object information table * * Output parameters: NONE */ void _Objects_Extend_information( ffc0a214: 39 6b ff fc addi r11,r11,-4 /* if ( information->maximum < minimum_index ) */ if ( information->object_blocks == NULL ) block_count = 0; else { block_count = information->maximum / information->allocation_size; ffc0a218: a3 63 00 10 lhz r27,16(r3) /* * Search for a free block of indexes. If we do NOT need to allocate or * extend the block table, then we will change do_extend. */ do_extend = true; minimum_index = _Objects_Get_index( information->minimum_id ); ffc0a21c: 7f 9e e3 78 mr r30,r28 index_base = minimum_index; block = 0; ffc0a220: 3b a0 00 00 li r29,0 /* if ( information->maximum < minimum_index ) */ if ( information->object_blocks == NULL ) block_count = 0; else { block_count = information->maximum / information->allocation_size; ffc0a224: 7f 7b 4b 96 divwu r27,r27,r9 ffc0a228: 2f 9b 00 00 cmpwi cr7,r27,0 * extend the block table, then we will change do_extend. */ do_extend = true; minimum_index = _Objects_Get_index( information->minimum_id ); index_base = minimum_index; block = 0; ffc0a22c: 38 1b 00 01 addi r0,r27,1 ffc0a230: 40 be 00 20 bne+ cr7,ffc0a250 <_Objects_Extend_information+0x64><== ALWAYS TAKEN ffc0a234: 38 00 00 01 li r0,1 <== NOT EXECUTED ffc0a238: 48 00 00 18 b ffc0a250 <_Objects_Extend_information+0x64><== NOT EXECUTED block_count = 0; else { block_count = information->maximum / information->allocation_size; for ( ; block < block_count; block++ ) { if ( information->object_blocks[ block ] == NULL ) { ffc0a23c: 85 4b 00 04 lwzu r10,4(r11) ffc0a240: 2f 8a 00 00 cmpwi cr7,r10,0 ffc0a244: 41 9e 00 30 beq- cr7,ffc0a274 <_Objects_Extend_information+0x88> ffc0a248: 7f de 4a 14 add r30,r30,r9 if ( information->object_blocks == NULL ) block_count = 0; else { block_count = information->maximum / information->allocation_size; for ( ; block < block_count; block++ ) { ffc0a24c: 3b bd 00 01 addi r29,r29,1 ffc0a250: 34 00 ff ff addic. r0,r0,-1 ffc0a254: 40 82 ff e8 bne+ ffc0a23c <_Objects_Extend_information+0x50> /* * Search for a free block of indexes. If we do NOT need to allocate or * extend the block table, then we will change do_extend. */ do_extend = true; ffc0a258: 3b 20 00 01 li r25,1 ffc0a25c: 48 00 00 1c b ffc0a278 <_Objects_Extend_information+0x8c> minimum_index = _Objects_Get_index( information->minimum_id ); ffc0a260: 7f 9e e3 78 mr r30,r28 /* * Search for a free block of indexes. If we do NOT need to allocate or * extend the block table, then we will change do_extend. */ do_extend = true; ffc0a264: 3b 20 00 01 li r25,1 minimum_index = _Objects_Get_index( information->minimum_id ); index_base = minimum_index; block = 0; ffc0a268: 3b a0 00 00 li r29,0 /* if ( information->maximum < minimum_index ) */ if ( information->object_blocks == NULL ) block_count = 0; ffc0a26c: 3b 60 00 00 li r27,0 ffc0a270: 48 00 00 08 b ffc0a278 <_Objects_Extend_information+0x8c> else { block_count = information->maximum / information->allocation_size; for ( ; block < block_count; block++ ) { if ( information->object_blocks[ block ] == NULL ) { do_extend = false; ffc0a274: 3b 20 00 00 li r25,0 } else index_base += information->allocation_size; } } maximum = (uint32_t) information->maximum + information->allocation_size; ffc0a278: a0 1f 00 14 lhz r0,20(r31) ffc0a27c: a2 ff 00 10 lhz r23,16(r31) ffc0a280: 7e e0 ba 14 add r23,r0,r23 /* * We need to limit the number of objects to the maximum number * representable in the index portion of the object Id. In the * case of 16-bit Ids, this is only 256 object instances. */ if ( maximum > OBJECTS_ID_FINAL_INDEX ) { ffc0a284: 2b 97 ff ff cmplwi cr7,r23,65535 ffc0a288: 41 9d 02 00 bgt- cr7,ffc0a488 <_Objects_Extend_information+0x29c> /* * Allocate the name table, and the objects and if it fails either return or * generate a fatal error depending on auto-extending being active. */ block_size = information->allocation_size * information->size; ffc0a28c: 80 7f 00 18 lwz r3,24(r31) ffc0a290: 7c 60 19 d6 mullw r3,r0,r3 if ( information->auto_extend ) { ffc0a294: 88 1f 00 12 lbz r0,18(r31) ffc0a298: 2f 80 00 00 cmpwi cr7,r0,0 ffc0a29c: 41 9e 00 14 beq- cr7,ffc0a2b0 <_Objects_Extend_information+0xc4> new_object_block = _Workspace_Allocate( block_size ); ffc0a2a0: 48 00 24 0d bl ffc0c6ac <_Workspace_Allocate> if ( !new_object_block ) ffc0a2a4: 7c 7a 1b 79 mr. r26,r3 ffc0a2a8: 40 a2 00 10 bne+ ffc0a2b8 <_Objects_Extend_information+0xcc> ffc0a2ac: 48 00 01 dc b ffc0a488 <_Objects_Extend_information+0x29c> return; } else { new_object_block = _Workspace_Allocate_or_fatal_error( block_size ); ffc0a2b0: 48 00 24 5d bl ffc0c70c <_Workspace_Allocate_or_fatal_error> ffc0a2b4: 7c 7a 1b 78 mr r26,r3 } /* * Do we need to grow the tables? */ if ( do_extend ) { ffc0a2b8: 2f 99 00 00 cmpwi cr7,r25,0 ffc0a2bc: 41 9e 01 4c beq- cr7,ffc0a408 <_Objects_Extend_information+0x21c> */ /* * Up the block count and maximum */ block_count++; ffc0a2c0: 3b 3b 00 01 addi r25,r27,1 /* * Allocate the tables and break it up. */ block_size = block_count * (sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) + ffc0a2c4: 1c 19 00 03 mulli r0,r25,3 ((maximum + minimum_index) * sizeof(Objects_Control *)); ffc0a2c8: 7c 77 e2 14 add r3,r23,r28 /* * Allocate the tables and break it up. */ block_size = block_count * (sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) + ffc0a2cc: 7c 63 02 14 add r3,r3,r0 ((maximum + minimum_index) * sizeof(Objects_Control *)); object_blocks = (void**) _Workspace_Allocate( block_size ); ffc0a2d0: 54 63 10 3a rlwinm r3,r3,2,0,29 ffc0a2d4: 48 00 23 d9 bl ffc0c6ac <_Workspace_Allocate> if ( !object_blocks ) { ffc0a2d8: 7c 76 1b 79 mr. r22,r3 ffc0a2dc: 40 a2 00 10 bne+ ffc0a2ec <_Objects_Extend_information+0x100> _Workspace_Free( new_object_block ); ffc0a2e0: 7f 43 d3 78 mr r3,r26 ffc0a2e4: 48 00 23 fd bl ffc0c6e0 <_Workspace_Free> return; ffc0a2e8: 48 00 01 a0 b ffc0a488 <_Objects_Extend_information+0x29c> * Take the block count down. Saves all the (block_count - 1) * in the copies. */ block_count--; if ( information->maximum > minimum_index ) { ffc0a2ec: a0 1f 00 10 lhz r0,16(r31) } /* * Break the block into the various sections. */ inactive_per_block = (uint32_t *) _Addresses_Add_offset( ffc0a2f0: 57 39 10 3a rlwinm r25,r25,2,0,29 RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset ( const void *base, uintptr_t offset ) { return (void *)((uintptr_t)base + offset); ffc0a2f4: 7f 16 ca 14 add r24,r22,r25 * Take the block count down. Saves all the (block_count - 1) * in the copies. */ block_count--; if ( information->maximum > minimum_index ) { ffc0a2f8: 7f 80 e0 40 cmplw cr7,r0,r28 ffc0a2fc: 7f 38 ca 14 add r25,r24,r25 ffc0a300: 41 9d 00 20 bgt- cr7,ffc0a320 <_Objects_Extend_information+0x134> ffc0a304: 2f 9c 00 00 cmpwi cr7,r28,0 ffc0a308: 39 39 ff fc addi r9,r25,-4 /* * Deal with the special case of the 0 to minimum_index */ for ( index = 0; index < minimum_index; index++ ) { local_table[ index ] = NULL; ffc0a30c: 39 60 00 00 li r11,0 ffc0a310: 38 1c 00 01 addi r0,r28,1 ffc0a314: 40 be 00 4c bne+ cr7,ffc0a360 <_Objects_Extend_information+0x174><== ALWAYS TAKEN ffc0a318: 38 00 00 01 li r0,1 <== NOT EXECUTED ffc0a31c: 48 00 00 44 b ffc0a360 <_Objects_Extend_information+0x174><== NOT EXECUTED * separate parts as size of each block has changed. */ memcpy( object_blocks, information->object_blocks, block_count * sizeof(void*) ); ffc0a320: 57 75 10 3a rlwinm r21,r27,2,0,29 /* * Copy each section of the table over. This has to be performed as * separate parts as size of each block has changed. */ memcpy( object_blocks, ffc0a324: 80 9f 00 34 lwz r4,52(r31) ffc0a328: 7e a5 ab 78 mr r5,r21 ffc0a32c: 48 00 ab ed bl ffc14f18 information->object_blocks, block_count * sizeof(void*) ); memcpy( inactive_per_block, ffc0a330: 80 9f 00 30 lwz r4,48(r31) ffc0a334: 7e a5 ab 78 mr r5,r21 ffc0a338: 7f 03 c3 78 mr r3,r24 ffc0a33c: 48 00 ab dd bl ffc14f18 information->inactive_per_block, block_count * sizeof(uint32_t) ); memcpy( local_table, information->local_table, (information->maximum + minimum_index) * sizeof(Objects_Control *) ); ffc0a340: a0 1f 00 10 lhz r0,16(r31) information->object_blocks, block_count * sizeof(void*) ); memcpy( inactive_per_block, information->inactive_per_block, block_count * sizeof(uint32_t) ); memcpy( local_table, ffc0a344: 80 9f 00 1c lwz r4,28(r31) ffc0a348: 7f 23 cb 78 mr r3,r25 information->local_table, (information->maximum + minimum_index) * sizeof(Objects_Control *) ); ffc0a34c: 7f 9c 02 14 add r28,r28,r0 information->object_blocks, block_count * sizeof(void*) ); memcpy( inactive_per_block, information->inactive_per_block, block_count * sizeof(uint32_t) ); memcpy( local_table, ffc0a350: 57 85 10 3a rlwinm r5,r28,2,0,29 ffc0a354: 48 00 ab c5 bl ffc14f18 ffc0a358: 48 00 00 10 b ffc0a368 <_Objects_Extend_information+0x17c> /* * Deal with the special case of the 0 to minimum_index */ for ( index = 0; index < minimum_index; index++ ) { local_table[ index ] = NULL; ffc0a35c: 95 69 00 04 stwu r11,4(r9) } else { /* * Deal with the special case of the 0 to minimum_index */ for ( index = 0; index < minimum_index; index++ ) { ffc0a360: 34 00 ff ff addic. r0,r0,-1 ffc0a364: 40 82 ff f8 bne+ ffc0a35c <_Objects_Extend_information+0x170> */ object_blocks[block_count] = NULL; inactive_per_block[block_count] = 0; for ( index=index_base ; index < ( information->allocation_size + index_base ); ffc0a368: a1 5f 00 14 lhz r10,20(r31) * information - object information table * * Output parameters: NONE */ void _Objects_Extend_information( ffc0a36c: 57 c9 10 3a rlwinm r9,r30,2,0,29 } /* * Initialise the new entries in the table. */ object_blocks[block_count] = NULL; ffc0a370: 38 00 00 00 li r0,0 inactive_per_block[block_count] = 0; for ( index=index_base ; index < ( information->allocation_size + index_base ); index++ ) { local_table[ index ] = NULL; ffc0a374: 7d 7e 52 14 add r11,r30,r10 ffc0a378: 7f 9e 58 40 cmplw cr7,r30,r11 } /* * Initialise the new entries in the table. */ object_blocks[block_count] = NULL; ffc0a37c: 57 7b 10 3a rlwinm r27,r27,2,0,29 * information - object information table * * Output parameters: NONE */ void _Objects_Extend_information( ffc0a380: 39 29 ff fc addi r9,r9,-4 } /* * Initialise the new entries in the table. */ object_blocks[block_count] = NULL; ffc0a384: 7c 16 d9 2e stwx r0,r22,r27 inactive_per_block[block_count] = 0; for ( index=index_base ; index < ( information->allocation_size + index_base ); ffc0a388: 7d 29 ca 14 add r9,r9,r25 /* * Initialise the new entries in the table. */ object_blocks[block_count] = NULL; inactive_per_block[block_count] = 0; ffc0a38c: 7c 18 d9 2e stwx r0,r24,r27 for ( index=index_base ; index < ( information->allocation_size + index_base ); index++ ) { local_table[ index ] = NULL; ffc0a390: 39 00 00 00 li r8,0 ffc0a394: 38 0a 00 01 addi r0,r10,1 ffc0a398: 41 9d 00 0c bgt- cr7,ffc0a3a4 <_Objects_Extend_information+0x1b8><== NEVER TAKEN ffc0a39c: 2f 8b 00 00 cmpwi cr7,r11,0 ffc0a3a0: 40 be 00 10 bne+ cr7,ffc0a3b0 <_Objects_Extend_information+0x1c4><== ALWAYS TAKEN ffc0a3a4: 38 00 00 01 li r0,1 <== NOT EXECUTED ffc0a3a8: 48 00 00 08 b ffc0a3b0 <_Objects_Extend_information+0x1c4><== NOT EXECUTED ffc0a3ac: 95 09 00 04 stwu r8,4(r9) * Initialise the new entries in the table. */ object_blocks[block_count] = NULL; inactive_per_block[block_count] = 0; for ( index=index_base ; ffc0a3b0: 34 00 ff ff addic. r0,r0,-1 ffc0a3b4: 40 82 ff f8 bne+ ffc0a3ac <_Objects_Extend_information+0x1c0> static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc0a3b8: 7c 00 00 a6 mfmsr r0 ffc0a3bc: 7d 30 42 a6 mfsprg r9,0 ffc0a3c0: 7c 09 48 78 andc r9,r0,r9 ffc0a3c4: 7d 20 01 24 mtmsr r9 uint32_t the_class, uint32_t node, uint32_t index ) { return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) | ffc0a3c8: 81 3f 00 00 lwz r9,0(r31) old_tables = information->object_blocks; information->object_blocks = object_blocks; information->inactive_per_block = inactive_per_block; information->local_table = local_table; information->maximum = (Objects_Maximum) maximum; ffc0a3cc: 56 f7 04 3e clrlwi r23,r23,16 information->maximum_id = _Objects_Build_id( ffc0a3d0: a1 7f 00 04 lhz r11,4(r31) ffc0a3d4: 55 29 c0 0e rlwinm r9,r9,24,0,7 old_tables = information->object_blocks; information->object_blocks = object_blocks; information->inactive_per_block = inactive_per_block; information->local_table = local_table; information->maximum = (Objects_Maximum) maximum; ffc0a3d8: b2 ff 00 10 sth r23,16(r31) (( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) | ffc0a3dc: 55 6b d8 08 rlwinm r11,r11,27,0,4 uint32_t the_class, uint32_t node, uint32_t index ) { return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) | ffc0a3e0: 65 29 00 01 oris r9,r9,1 local_table[ index ] = NULL; } _ISR_Disable( level ); old_tables = information->object_blocks; ffc0a3e4: 80 7f 00 34 lwz r3,52(r31) (( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) | ffc0a3e8: 7d 29 5b 78 or r9,r9,r11 information->object_blocks = object_blocks; ffc0a3ec: 92 df 00 34 stw r22,52(r31) uint32_t the_class, uint32_t node, uint32_t index ) { return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) | ffc0a3f0: 7d 37 bb 78 or r23,r9,r23 information->inactive_per_block = inactive_per_block; ffc0a3f4: 93 1f 00 30 stw r24,48(r31) information->local_table = local_table; ffc0a3f8: 93 3f 00 1c stw r25,28(r31) information->maximum = (Objects_Maximum) maximum; information->maximum_id = _Objects_Build_id( ffc0a3fc: 92 ff 00 0c stw r23,12(r31) return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc0a400: 7c 00 01 24 mtmsr r0 information->maximum ); _ISR_Enable( level ); _Workspace_Free( old_tables ); ffc0a404: 48 00 22 dd bl ffc0c6e0 <_Workspace_Free> } /* * Assign the new object block to the object block table. */ information->object_blocks[ block ] = new_object_block; ffc0a408: 81 3f 00 34 lwz r9,52(r31) ffc0a40c: 57 bd 10 3a rlwinm r29,r29,2,0,29 /* * Initialize objects .. add to a local chain first. */ _Chain_Initialize( ffc0a410: 3b 81 00 08 addi r28,r1,8 ffc0a414: a0 bf 00 14 lhz r5,20(r31) } /* * Assign the new object block to the object block table. */ information->object_blocks[ block ] = new_object_block; ffc0a418: 7f 49 e9 2e stwx r26,r9,r29 /* * Initialize objects .. add to a local chain first. */ _Chain_Initialize( ffc0a41c: 7f 83 e3 78 mr r3,r28 ffc0a420: 7f 44 d3 78 mr r4,r26 ffc0a424: 80 df 00 18 lwz r6,24(r31) information->the_class, _Objects_Local_node, index ); _Chain_Append( &information->Inactive, &the_object->Node ); ffc0a428: 3b 7f 00 20 addi r27,r31,32 information->object_blocks[ block ] = new_object_block; /* * Initialize objects .. add to a local chain first. */ _Chain_Initialize( ffc0a42c: 48 00 78 75 bl ffc11ca0 <_Chain_Initialize> /* * Move from the local chain, initialise, then append to the inactive chain */ index = index_base; while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) { ffc0a430: 48 00 00 30 b ffc0a460 <_Objects_Extend_information+0x274> ffc0a434: 81 3f 00 00 lwz r9,0(r31) information->the_class, _Objects_Local_node, index ); _Chain_Append( &information->Inactive, &the_object->Node ); ffc0a438: 7f 63 db 78 mr r3,r27 */ index = index_base; while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) { the_object->id = _Objects_Build_id( ffc0a43c: a0 1f 00 04 lhz r0,4(r31) ffc0a440: 55 29 c0 0e rlwinm r9,r9,24,0,7 ffc0a444: 65 29 00 01 oris r9,r9,1 (( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) | ffc0a448: 54 00 d8 08 rlwinm r0,r0,27,0,4 ffc0a44c: 7d 20 03 78 or r0,r9,r0 uint32_t the_class, uint32_t node, uint32_t index ) { return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) | ffc0a450: 7c 00 f3 78 or r0,r0,r30 ffc0a454: 90 04 00 08 stw r0,8(r4) index ); _Chain_Append( &information->Inactive, &the_object->Node ); index++; ffc0a458: 3b de 00 01 addi r30,r30,1 information->the_class, _Objects_Local_node, index ); _Chain_Append( &information->Inactive, &the_object->Node ); ffc0a45c: 4b ff f3 09 bl ffc09764 <_Chain_Append> /* * Move from the local chain, initialise, then append to the inactive chain */ index = index_base; while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) { ffc0a460: 7f 83 e3 78 mr r3,r28 ffc0a464: 4b ff f3 59 bl ffc097bc <_Chain_Get> ffc0a468: 7c 64 1b 79 mr. r4,r3 ffc0a46c: 40 82 ff c8 bne+ ffc0a434 <_Objects_Extend_information+0x248> _Chain_Append( &information->Inactive, &the_object->Node ); index++; } information->inactive_per_block[ block ] = information->allocation_size; ffc0a470: a0 1f 00 14 lhz r0,20(r31) ffc0a474: 81 3f 00 30 lwz r9,48(r31) ffc0a478: 7c 09 e9 2e stwx r0,r9,r29 information->inactive = (Objects_Maximum)(information->inactive + information->allocation_size); ffc0a47c: a1 3f 00 2c lhz r9,44(r31) ffc0a480: 7c 00 4a 14 add r0,r0,r9 index++; } information->inactive_per_block[ block ] = information->allocation_size; information->inactive = ffc0a484: b0 1f 00 2c sth r0,44(r31) (Objects_Maximum)(information->inactive + information->allocation_size); } ffc0a488: 39 61 00 48 addi r11,r1,72 ffc0a48c: 48 00 ec fc b ffc19188 <_restgpr_21_x> =============================================================================== ffc0a544 <_Objects_Get_information>: Objects_Information *_Objects_Get_information( Objects_APIs the_api, uint16_t the_class ) { ffc0a544: 94 21 ff e8 stwu r1,-24(r1) ffc0a548: 7c 08 02 a6 mflr r0 ffc0a54c: bf a1 00 0c stmw r29,12(r1) Objects_Information *info; int the_class_api_maximum; if ( !the_class ) ffc0a550: 7c 9d 23 79 mr. r29,r4 Objects_Information *_Objects_Get_information( Objects_APIs the_api, uint16_t the_class ) { ffc0a554: 7c 7e 1b 78 mr r30,r3 ffc0a558: 90 01 00 1c stw r0,28(r1) Objects_Information *info; int the_class_api_maximum; if ( !the_class ) return NULL; ffc0a55c: 3b e0 00 00 li r31,0 ) { Objects_Information *info; int the_class_api_maximum; if ( !the_class ) ffc0a560: 41 a2 00 50 beq+ ffc0a5b0 <_Objects_Get_information+0x6c> /* * 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 ); ffc0a564: 48 00 7e 91 bl ffc123f4 <_Objects_API_maximum_class> if ( the_class_api_maximum == 0 ) ffc0a568: 2c 03 00 00 cmpwi r3,0 ffc0a56c: 41 a2 00 44 beq+ ffc0a5b0 <_Objects_Get_information+0x6c> return NULL; if ( the_class > (uint32_t) the_class_api_maximum ) ffc0a570: 7f 9d 18 40 cmplw cr7,r29,r3 ffc0a574: 41 bd 00 3c bgt+ cr7,ffc0a5b0 <_Objects_Get_information+0x6c> return NULL; if ( !_Objects_Information_table[ the_api ] ) ffc0a578: 3d 20 00 00 lis r9,0 ffc0a57c: 57 de 10 3a rlwinm r30,r30,2,0,29 ffc0a580: 39 29 2d 00 addi r9,r9,11520 ffc0a584: 7d 29 f0 2e lwzx r9,r9,r30 ffc0a588: 2f 89 00 00 cmpwi cr7,r9,0 ffc0a58c: 41 be 00 24 beq+ cr7,ffc0a5b0 <_Objects_Get_information+0x6c><== NEVER TAKEN return NULL; info = _Objects_Information_table[ the_api ][ the_class ]; ffc0a590: 57 bd 10 3a rlwinm r29,r29,2,0,29 ffc0a594: 7f e9 e8 2e lwzx r31,r9,r29 if ( !info ) ffc0a598: 2f 9f 00 00 cmpwi cr7,r31,0 ffc0a59c: 41 be 00 14 beq+ cr7,ffc0a5b0 <_Objects_Get_information+0x6c><== NEVER TAKEN * In a multprocessing configuration, we may access remote objects. * Thus we may have 0 local instances and still have a valid object * pointer. */ #if !defined(RTEMS_MULTIPROCESSING) if ( info->maximum == 0 ) ffc0a5a0: a0 1f 00 10 lhz r0,16(r31) ffc0a5a4: 2f 80 00 00 cmpwi cr7,r0,0 ffc0a5a8: 40 be 00 08 bne+ cr7,ffc0a5b0 <_Objects_Get_information+0x6c> return NULL; ffc0a5ac: 3b e0 00 00 li r31,0 #endif return info; } ffc0a5b0: 39 61 00 18 addi r11,r1,24 ffc0a5b4: 7f e3 fb 78 mr r3,r31 ffc0a5b8: 48 00 eb f0 b ffc191a8 <_restgpr_29_x> =============================================================================== ffc1bab0 <_Objects_Get_no_protection>: /* * 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; ffc1bab0: 80 03 00 08 lwz r0,8(r3) if ( information->maximum >= index ) { ffc1bab4: a1 23 00 10 lhz r9,16(r3) /* * 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; ffc1bab8: 20 00 00 01 subfic r0,r0,1 ffc1babc: 7c 00 22 14 add r0,r0,r4 if ( information->maximum >= index ) { ffc1bac0: 7f 89 00 40 cmplw cr7,r9,r0 ffc1bac4: 41 9c 00 24 blt- cr7,ffc1bae8 <_Objects_Get_no_protection+0x38> if ( (the_object = information->local_table[ index ]) != NULL ) { ffc1bac8: 81 23 00 1c lwz r9,28(r3) ffc1bacc: 54 00 10 3a rlwinm r0,r0,2,0,29 ffc1bad0: 7c 69 00 2e lwzx r3,r9,r0 ffc1bad4: 2f 83 00 00 cmpwi cr7,r3,0 ffc1bad8: 41 9e 00 10 beq- cr7,ffc1bae8 <_Objects_Get_no_protection+0x38><== NEVER TAKEN *location = OBJECTS_LOCAL; ffc1badc: 38 00 00 00 li r0,0 ffc1bae0: 90 05 00 00 stw r0,0(r5) return the_object; ffc1bae4: 4e 80 00 20 blr /* * This isn't supported or required yet for Global objects so * if it isn't local, we don't find it. */ *location = OBJECTS_ERROR; ffc1bae8: 38 00 00 01 li r0,1 ffc1baec: 90 05 00 00 stw r0,0(r5) return NULL; ffc1baf0: 38 60 00 00 li r3,0 } ffc1baf4: 4e 80 00 20 blr =============================================================================== ffc0ace0 <_Objects_Id_to_name>: */ Objects_Name_or_id_lookup_errors _Objects_Id_to_name ( Objects_Id id, Objects_Name *name ) { ffc0ace0: 94 21 ff e0 stwu r1,-32(r1) ffc0ace4: 7c 08 02 a6 mflr r0 ffc0ace8: bf c1 00 18 stmw r30,24(r1) ffc0acec: 7c 9e 23 78 mr r30,r4 /* * Caller is trusted for name != NULL. */ tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id; ffc0acf0: 7c 64 1b 79 mr. r4,r3 */ Objects_Name_or_id_lookup_errors _Objects_Id_to_name ( Objects_Id id, Objects_Name *name ) { ffc0acf4: 90 01 00 24 stw r0,36(r1) /* * Caller is trusted for name != NULL. */ tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id; ffc0acf8: 40 82 00 10 bne- ffc0ad08 <_Objects_Id_to_name+0x28> ffc0acfc: 3d 20 00 00 lis r9,0 ffc0ad00: 81 29 31 90 lwz r9,12688(r9) ffc0ad04: 80 89 00 08 lwz r4,8(r9) */ RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API( Objects_Id id ) { return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS); ffc0ad08: 54 89 47 7e rlwinm r9,r4,8,29,31 */ RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid( uint32_t the_api ) { if ( !the_api || the_api > OBJECTS_APIS_LAST ) ffc0ad0c: 38 09 ff ff addi r0,r9,-1 ffc0ad10: 2b 80 00 02 cmplwi cr7,r0,2 the_api = _Objects_Get_API( tmpId ); if ( !_Objects_Is_api_valid( the_api ) ) return OBJECTS_INVALID_ID; ffc0ad14: 3b e0 00 03 li r31,3 ffc0ad18: 41 9d 00 44 bgt- cr7,ffc0ad5c <_Objects_Id_to_name+0x7c> ffc0ad1c: 48 00 00 4c b ffc0ad68 <_Objects_Id_to_name+0x88> if ( !_Objects_Information_table[ the_api ] ) return OBJECTS_INVALID_ID; the_class = _Objects_Get_class( tmpId ); information = _Objects_Information_table[ the_api ][ the_class ]; ffc0ad20: 54 80 3e 7a rlwinm r0,r4,7,25,29 ffc0ad24: 7c 69 00 2e lwzx r3,r9,r0 if ( !information ) ffc0ad28: 2f 83 00 00 cmpwi cr7,r3,0 ffc0ad2c: 41 9e 00 30 beq- cr7,ffc0ad5c <_Objects_Id_to_name+0x7c><== NEVER TAKEN return OBJECTS_INVALID_ID; #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) if ( information->is_string ) ffc0ad30: 88 03 00 38 lbz r0,56(r3) ffc0ad34: 2f 80 00 00 cmpwi cr7,r0,0 ffc0ad38: 40 9e 00 24 bne- cr7,ffc0ad5c <_Objects_Id_to_name+0x7c><== NEVER TAKEN return OBJECTS_INVALID_ID; #endif the_object = _Objects_Get( information, tmpId, &ignored_location ); ffc0ad3c: 38 a1 00 08 addi r5,r1,8 ffc0ad40: 4b ff ff 25 bl ffc0ac64 <_Objects_Get> if ( !the_object ) ffc0ad44: 2c 03 00 00 cmpwi r3,0 ffc0ad48: 41 82 00 14 beq- ffc0ad5c <_Objects_Id_to_name+0x7c> return OBJECTS_INVALID_ID; *name = the_object->name; ffc0ad4c: 80 03 00 0c lwz r0,12(r3) _Thread_Enable_dispatch(); return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL; ffc0ad50: 3b e0 00 00 li r31,0 the_object = _Objects_Get( information, tmpId, &ignored_location ); if ( !the_object ) return OBJECTS_INVALID_ID; *name = the_object->name; ffc0ad54: 90 1e 00 00 stw r0,0(r30) _Thread_Enable_dispatch(); ffc0ad58: 48 00 0d a5 bl ffc0bafc <_Thread_Enable_dispatch> return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL; } ffc0ad5c: 39 61 00 20 addi r11,r1,32 ffc0ad60: 7f e3 fb 78 mr r3,r31 ffc0ad64: 4b ff 69 34 b ffc01698 <_restgpr_30_x> the_api = _Objects_Get_API( tmpId ); if ( !_Objects_Is_api_valid( the_api ) ) return OBJECTS_INVALID_ID; if ( !_Objects_Information_table[ the_api ] ) ffc0ad68: 3d 60 00 00 lis r11,0 ffc0ad6c: 55 29 10 3a rlwinm r9,r9,2,0,29 ffc0ad70: 39 6b 2c a0 addi r11,r11,11424 ffc0ad74: 7d 2b 48 2e lwzx r9,r11,r9 ffc0ad78: 2f 89 00 00 cmpwi cr7,r9,0 ffc0ad7c: 40 9e ff a4 bne+ cr7,ffc0ad20 <_Objects_Id_to_name+0x40> ffc0ad80: 4b ff ff dc b ffc0ad5c <_Objects_Id_to_name+0x7c> =============================================================================== ffc0a868 <_Objects_Shrink_information>: */ void _Objects_Shrink_information( Objects_Information *information ) { ffc0a868: 94 21 ff e8 stwu r1,-24(r1) ffc0a86c: 7c 08 02 a6 mflr r0 index_base = _Objects_Get_index( information->minimum_id ); block_count = (information->maximum - index_base) / information->allocation_size; for ( block = 0; block < block_count; block++ ) { ffc0a870: 39 20 00 00 li r9,0 */ void _Objects_Shrink_information( Objects_Information *information ) { ffc0a874: 90 01 00 1c stw r0,28(r1) ffc0a878: bf 81 00 08 stmw r28,8(r1) ffc0a87c: 7c 7f 1b 78 mr r31,r3 /* * Search the list to find block or chunk with all objects inactive. */ index_base = _Objects_Get_index( information->minimum_id ); ffc0a880: a3 c3 00 0a lhz r30,10(r3) block_count = (information->maximum - index_base) / ffc0a884: a1 43 00 10 lhz r10,16(r3) ffc0a888: a1 63 00 14 lhz r11,20(r3) ffc0a88c: 7d 5e 50 50 subf r10,r30,r10 ffc0a890: 7d 4a 5b 96 divwu r10,r10,r11 ffc0a894: 2f 8a 00 00 cmpwi cr7,r10,0 information->allocation_size; for ( block = 0; block < block_count; block++ ) { ffc0a898: 38 0a 00 01 addi r0,r10,1 ffc0a89c: 40 be 00 90 bne+ cr7,ffc0a92c <_Objects_Shrink_information+0xc4><== ALWAYS TAKEN ffc0a8a0: 38 00 00 01 li r0,1 <== NOT EXECUTED ffc0a8a4: 48 00 00 88 b ffc0a92c <_Objects_Shrink_information+0xc4><== NOT EXECUTED if ( information->inactive_per_block[ block ] == ffc0a8a8: 81 5f 00 30 lwz r10,48(r31) index_base = _Objects_Get_index( information->minimum_id ); block_count = (information->maximum - index_base) / information->allocation_size; for ( block = 0; block < block_count; block++ ) { ffc0a8ac: 55 3d 10 3a rlwinm r29,r9,2,0,29 if ( information->inactive_per_block[ block ] == ffc0a8b0: 7d 4a e8 2e lwzx r10,r10,r29 ffc0a8b4: 7f 8a 58 00 cmpw cr7,r10,r11 ffc0a8b8: 40 be 00 6c bne+ cr7,ffc0a924 <_Objects_Shrink_information+0xbc> information->allocation_size ) { /* * Assume the Inactive chain is never empty at this point */ the_object = (Objects_Control *) _Chain_First( &information->Inactive ); ffc0a8bc: 80 7f 00 20 lwz r3,32(r31) ffc0a8c0: 48 00 00 08 b ffc0a8c8 <_Objects_Shrink_information+0x60> index = _Objects_Get_index( the_object->id ); /* * Get the next node before the node is extracted */ extract_me = the_object; the_object = (Objects_Control *) the_object->Node.next; ffc0a8c4: 7f 83 e3 78 mr r3,r28 * Assume the Inactive chain is never empty at this point */ the_object = (Objects_Control *) _Chain_First( &information->Inactive ); do { index = _Objects_Get_index( the_object->id ); ffc0a8c8: a0 03 00 0a lhz r0,10(r3) /* * Get the next node before the node is extracted */ extract_me = the_object; the_object = (Objects_Control *) the_object->Node.next; ffc0a8cc: 83 83 00 00 lwz r28,0(r3) if ((index >= index_base) && ffc0a8d0: 7f 80 f0 40 cmplw cr7,r0,r30 ffc0a8d4: 41 9c 00 18 blt- cr7,ffc0a8ec <_Objects_Shrink_information+0x84> (index < (index_base + information->allocation_size))) { ffc0a8d8: a1 3f 00 14 lhz r9,20(r31) ffc0a8dc: 7d 3e 4a 14 add r9,r30,r9 /* * Get the next node before the node is extracted */ extract_me = the_object; the_object = (Objects_Control *) the_object->Node.next; if ((index >= index_base) && ffc0a8e0: 7f 80 48 40 cmplw cr7,r0,r9 ffc0a8e4: 40 bc 00 08 bge+ cr7,ffc0a8ec <_Objects_Shrink_information+0x84> (index < (index_base + information->allocation_size))) { _Chain_Extract( &extract_me->Node ); ffc0a8e8: 4b ff ee ad bl ffc09794 <_Chain_Extract> } } while ( the_object ); ffc0a8ec: 2f 9c 00 00 cmpwi cr7,r28,0 ffc0a8f0: 40 9e ff d4 bne+ cr7,ffc0a8c4 <_Objects_Shrink_information+0x5c> /* * Free the memory and reset the structures in the object' information */ _Workspace_Free( information->object_blocks[ block ] ); ffc0a8f4: 81 3f 00 34 lwz r9,52(r31) ffc0a8f8: 7c 69 e8 2e lwzx r3,r9,r29 ffc0a8fc: 48 00 1d e5 bl ffc0c6e0 <_Workspace_Free> information->object_blocks[ block ] = NULL; ffc0a900: 81 3f 00 34 lwz r9,52(r31) information->inactive_per_block[ block ] = 0; information->inactive -= information->allocation_size; ffc0a904: a0 1f 00 14 lhz r0,20(r31) /* * Free the memory and reset the structures in the object' information */ _Workspace_Free( information->object_blocks[ block ] ); information->object_blocks[ block ] = NULL; ffc0a908: 7f 89 e9 2e stwx r28,r9,r29 information->inactive_per_block[ block ] = 0; ffc0a90c: 81 3f 00 30 lwz r9,48(r31) ffc0a910: 7f 89 e9 2e stwx r28,r9,r29 information->inactive -= information->allocation_size; ffc0a914: a1 3f 00 2c lhz r9,44(r31) ffc0a918: 7c 00 48 50 subf r0,r0,r9 ffc0a91c: b0 1f 00 2c sth r0,44(r31) return; ffc0a920: 48 00 00 14 b ffc0a934 <_Objects_Shrink_information+0xcc> } index_base += information->allocation_size; ffc0a924: 7f de 5a 14 add r30,r30,r11 index_base = _Objects_Get_index( information->minimum_id ); block_count = (information->maximum - index_base) / information->allocation_size; for ( block = 0; block < block_count; block++ ) { ffc0a928: 39 29 00 01 addi r9,r9,1 ffc0a92c: 34 00 ff ff addic. r0,r0,-1 ffc0a930: 40 82 ff 78 bne+ ffc0a8a8 <_Objects_Shrink_information+0x40> return; } index_base += information->allocation_size; } } ffc0a934: 39 61 00 18 addi r11,r1,24 ffc0a938: 48 00 e8 6c b ffc191a4 <_restgpr_28_x> =============================================================================== ffc0a274 <_POSIX_Absolute_timeout_to_ticks>: */ POSIX_Absolute_timeout_conversion_results_t _POSIX_Absolute_timeout_to_ticks( const struct timespec *abstime, Watchdog_Interval *ticks_out ) { ffc0a274: 94 21 ff d8 stwu r1,-40(r1) ffc0a278: 7c 08 02 a6 mflr r0 ffc0a27c: 90 01 00 2c stw r0,44(r1) /* * Make sure there is always a value returned. */ *ticks_out = 0; ffc0a280: 38 00 00 00 li r0,0 */ POSIX_Absolute_timeout_conversion_results_t _POSIX_Absolute_timeout_to_ticks( const struct timespec *abstime, Watchdog_Interval *ticks_out ) { ffc0a284: bf 81 00 18 stmw r28,24(r1) ffc0a288: 7c 7c 1b 78 mr r28,r3 ffc0a28c: 7c 9f 23 78 mr r31,r4 /* * Make sure there is always a value returned. */ *ticks_out = 0; ffc0a290: 90 04 00 00 stw r0,0(r4) /* * Is the absolute time even valid? */ if ( !_Timespec_Is_valid(abstime) ) ffc0a294: 48 00 45 45 bl ffc0e7d8 <_Timespec_Is_valid> return POSIX_ABSOLUTE_TIMEOUT_INVALID; ffc0a298: 38 00 00 00 li r0,0 *ticks_out = 0; /* * Is the absolute time even valid? */ if ( !_Timespec_Is_valid(abstime) ) ffc0a29c: 2f 83 00 00 cmpwi cr7,r3,0 ffc0a2a0: 41 be 00 58 beq+ cr7,ffc0a2f8 <_POSIX_Absolute_timeout_to_ticks+0x84> return POSIX_ABSOLUTE_TIMEOUT_INVALID; /* * Is the absolute time in the past? */ _TOD_Get( ¤t_time ); ffc0a2a4: 3b a1 00 08 addi r29,r1,8 ffc0a2a8: 7f a3 eb 78 mr r3,r29 ffc0a2ac: 48 00 1f 8d bl ffc0c238 <_TOD_Get> if ( _Timespec_Less_than( abstime, ¤t_time ) ) ffc0a2b0: 7f 83 e3 78 mr r3,r28 ffc0a2b4: 7f a4 eb 78 mr r4,r29 ffc0a2b8: 48 00 45 61 bl ffc0e818 <_Timespec_Less_than> return POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST; ffc0a2bc: 38 00 00 01 li r0,1 /* * Is the absolute time in the past? */ _TOD_Get( ¤t_time ); if ( _Timespec_Less_than( abstime, ¤t_time ) ) ffc0a2c0: 2f 83 00 00 cmpwi cr7,r3,0 ffc0a2c4: 40 9e 00 34 bne- cr7,ffc0a2f8 <_POSIX_Absolute_timeout_to_ticks+0x84> return POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST; /* * How long until the requested absolute time? */ _Timespec_Subtract( ¤t_time, abstime, &difference ); ffc0a2c8: 3b c1 00 10 addi r30,r1,16 ffc0a2cc: 7f a3 eb 78 mr r3,r29 ffc0a2d0: 7f 84 e3 78 mr r4,r28 ffc0a2d4: 7f c5 f3 78 mr r5,r30 ffc0a2d8: 48 00 45 7d bl ffc0e854 <_Timespec_Subtract> /* * Internally the SuperCore uses ticks, so convert to them. */ *ticks_out = _Timespec_To_ticks( &difference ); ffc0a2dc: 7f c3 f3 78 mr r3,r30 ffc0a2e0: 48 00 45 b9 bl ffc0e898 <_Timespec_To_ticks> /* * This is the case we were expecting and it took this long to * get here. */ return POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE; ffc0a2e4: 38 00 00 03 li r0,3 /* * If the difference was 0, then the future is now. It is so bright * we better wear shades. */ if ( !*ticks_out ) ffc0a2e8: 2f 83 00 00 cmpwi cr7,r3,0 _Timespec_Subtract( ¤t_time, abstime, &difference ); /* * Internally the SuperCore uses ticks, so convert to them. */ *ticks_out = _Timespec_To_ticks( &difference ); ffc0a2ec: 90 7f 00 00 stw r3,0(r31) /* * If the difference was 0, then the future is now. It is so bright * we better wear shades. */ if ( !*ticks_out ) ffc0a2f0: 40 be 00 08 bne+ cr7,ffc0a2f8 <_POSIX_Absolute_timeout_to_ticks+0x84><== ALWAYS TAKEN return POSIX_ABSOLUTE_TIMEOUT_IS_NOW; ffc0a2f4: 38 00 00 02 li r0,2 <== NOT EXECUTED /* * This is the case we were expecting and it took this long to * get here. */ return POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE; } ffc0a2f8: 39 61 00 28 addi r11,r1,40 ffc0a2fc: 7c 03 03 78 mr r3,r0 ffc0a300: 4b ff 88 80 b ffc02b80 <_restgpr_28_x> =============================================================================== ffc0cd24 <_POSIX_Message_queue_Receive_support>: size_t msg_len, unsigned int *msg_prio, bool wait, Watchdog_Interval timeout ) { ffc0cd24: 94 21 ff c8 stwu r1,-56(r1) ffc0cd28: 7c 08 02 a6 mflr r0 ffc0cd2c: bf 61 00 24 stmw r27,36(r1) ffc0cd30: 7c 7f 1b 78 mr r31,r3 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( ffc0cd34: 3c 60 00 00 lis r3,0 ffc0cd38: 7c 9d 23 78 mr r29,r4 ffc0cd3c: 90 01 00 3c stw r0,60(r1) ffc0cd40: 7c bc 2b 78 mr r28,r5 ffc0cd44: 38 63 36 38 addi r3,r3,13880 ffc0cd48: 91 01 00 18 stw r8,24(r1) ffc0cd4c: 7f e4 fb 78 mr r4,r31 ffc0cd50: 38 a1 00 08 addi r5,r1,8 ffc0cd54: 7c de 33 78 mr r30,r6 ffc0cd58: 7c fb 3b 78 mr r27,r7 ffc0cd5c: 48 00 35 1d bl ffc10278 <_Objects_Get> Objects_Locations location; size_t length_out; bool do_wait; the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location ); switch ( location ) { ffc0cd60: 80 01 00 08 lwz r0,8(r1) ffc0cd64: 81 01 00 18 lwz r8,24(r1) ffc0cd68: 2f 80 00 00 cmpwi cr7,r0,0 ffc0cd6c: 40 9e 00 c8 bne- cr7,ffc0ce34 <_POSIX_Message_queue_Receive_support+0x110> case OBJECTS_LOCAL: if ( (the_mq_fd->oflag & O_ACCMODE) == O_WRONLY ) { ffc0cd70: 81 23 00 14 lwz r9,20(r3) ffc0cd74: 55 20 07 be clrlwi r0,r9,30 ffc0cd78: 2f 80 00 01 cmpwi cr7,r0,1 ffc0cd7c: 40 be 00 0c bne+ cr7,ffc0cd88 <_POSIX_Message_queue_Receive_support+0x64> _Thread_Enable_dispatch(); ffc0cd80: 48 00 43 89 bl ffc11108 <_Thread_Enable_dispatch> ffc0cd84: 48 00 00 b0 b ffc0ce34 <_POSIX_Message_queue_Receive_support+0x110> rtems_set_errno_and_return_minus_one( EBADF ); } the_mq = the_mq_fd->Queue; ffc0cd88: 80 63 00 10 lwz r3,16(r3) if ( msg_len < the_mq->Message_queue.maximum_message_size ) { ffc0cd8c: 80 03 00 68 lwz r0,104(r3) ffc0cd90: 7f 9c 00 40 cmplw cr7,r28,r0 ffc0cd94: 40 bc 00 14 bge+ cr7,ffc0cda8 <_POSIX_Message_queue_Receive_support+0x84> _Thread_Enable_dispatch(); ffc0cd98: 48 00 43 71 bl ffc11108 <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one( EMSGSIZE ); ffc0cd9c: 48 00 ac 3d bl ffc179d8 <__errno> ffc0cda0: 38 00 00 7a li r0,122 ffc0cda4: 48 00 00 98 b ffc0ce3c <_POSIX_Message_queue_Receive_support+0x118> length_out = -1; /* * A timed receive with a bad time will do a poll regardless. */ if ( wait ) ffc0cda8: 2f 9b 00 00 cmpwi cr7,r27,0 /* * Now if something goes wrong, we return a "length" of -1 * to indicate an error. */ length_out = -1; ffc0cdac: 38 00 ff ff li r0,-1 ffc0cdb0: 90 01 00 0c stw r0,12(r1) /* * A timed receive with a bad time will do a poll regardless. */ if ( wait ) ffc0cdb4: 38 00 00 00 li r0,0 ffc0cdb8: 41 9e 00 10 beq- cr7,ffc0cdc8 <_POSIX_Message_queue_Receive_support+0xa4><== NEVER TAKEN do_wait = (the_mq_fd->oflag & O_NONBLOCK) ? false : true; ffc0cdbc: 71 20 40 00 andi. r0,r9,16384 ffc0cdc0: 7c 00 00 26 mfcr r0 ffc0cdc4: 54 00 1f fe rlwinm r0,r0,3,31,31 do_wait = wait; /* * Now perform the actual message receive */ _CORE_message_queue_Seize( ffc0cdc8: 7f e4 fb 78 mr r4,r31 timeout ); _Thread_Enable_dispatch(); *msg_prio = _POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count); ffc0cdcc: 3f e0 00 00 lis r31,0 do_wait = wait; /* * Now perform the actual message receive */ _CORE_message_queue_Seize( ffc0cdd0: 7c 07 03 78 mr r7,r0 ffc0cdd4: 38 63 00 1c addi r3,r3,28 ffc0cdd8: 7f a5 eb 78 mr r5,r29 ffc0cddc: 38 c1 00 0c addi r6,r1,12 timeout ); _Thread_Enable_dispatch(); *msg_prio = _POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count); ffc0cde0: 3b ff 36 a4 addi r31,r31,13988 do_wait = wait; /* * Now perform the actual message receive */ _CORE_message_queue_Seize( ffc0cde4: 48 00 23 2d bl ffc0f110 <_CORE_message_queue_Seize> &length_out, do_wait, timeout ); _Thread_Enable_dispatch(); ffc0cde8: 48 00 43 21 bl ffc11108 <_Thread_Enable_dispatch> *msg_prio = _POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count); ffc0cdec: 81 3f 00 0c lwz r9,12(r31) 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); ffc0cdf0: 80 09 00 24 lwz r0,36(r9) ffc0cdf4: 7c 0b fe 70 srawi r11,r0,31 ffc0cdf8: 7d 60 02 78 xor r0,r11,r0 ffc0cdfc: 7c 0b 00 50 subf r0,r11,r0 do_wait, timeout ); _Thread_Enable_dispatch(); *msg_prio = ffc0ce00: 90 1e 00 00 stw r0,0(r30) _POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count); if ( !_Thread_Executing->Wait.return_code ) ffc0ce04: 80 09 00 34 lwz r0,52(r9) ffc0ce08: 2f 80 00 00 cmpwi cr7,r0,0 ffc0ce0c: 40 9e 00 0c bne- cr7,ffc0ce18 <_POSIX_Message_queue_Receive_support+0xf4> return length_out; ffc0ce10: 80 61 00 0c lwz r3,12(r1) ffc0ce14: 48 00 00 30 b ffc0ce44 <_POSIX_Message_queue_Receive_support+0x120> rtems_set_errno_and_return_minus_one( ffc0ce18: 48 00 ab c1 bl ffc179d8 <__errno> ffc0ce1c: 81 3f 00 0c lwz r9,12(r31) ffc0ce20: 7c 7e 1b 78 mr r30,r3 ffc0ce24: 80 69 00 34 lwz r3,52(r9) ffc0ce28: 48 00 02 a5 bl ffc0d0cc <_POSIX_Message_queue_Translate_core_message_queue_return_code> ffc0ce2c: 90 7e 00 00 stw r3,0(r30) ffc0ce30: 48 00 00 10 b ffc0ce40 <_POSIX_Message_queue_Receive_support+0x11c> #endif case OBJECTS_ERROR: break; } rtems_set_errno_and_return_minus_one( EBADF ); ffc0ce34: 48 00 ab a5 bl ffc179d8 <__errno> ffc0ce38: 38 00 00 09 li r0,9 ffc0ce3c: 90 03 00 00 stw r0,0(r3) ffc0ce40: 38 60 ff ff li r3,-1 } ffc0ce44: 39 61 00 38 addi r11,r1,56 ffc0ce48: 4b ff 8a 98 b ffc058e0 <_restgpr_27_x> =============================================================================== ffc0d178 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch>: #include void _POSIX_Thread_Evaluate_cancellation_and_enable_dispatch( Thread_Control *the_thread ) { ffc0d178: 7c 08 02 a6 mflr r0 ffc0d17c: 94 21 ff f8 stwu r1,-8(r1) ffc0d180: 90 01 00 0c stw r0,12(r1) POSIX_API_Control *thread_support; thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ]; ffc0d184: 81 23 01 34 lwz r9,308(r3) if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE && ffc0d188: 80 09 00 d8 lwz r0,216(r9) ffc0d18c: 2f 80 00 00 cmpwi cr7,r0,0 ffc0d190: 40 9e 00 38 bne- cr7,ffc0d1c8 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x50><== NEVER TAKEN ffc0d194: 80 09 00 dc lwz r0,220(r9) ffc0d198: 2f 80 00 01 cmpwi cr7,r0,1 ffc0d19c: 40 be 00 2c bne+ cr7,ffc0d1c8 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x50> thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS && ffc0d1a0: 80 09 00 e0 lwz r0,224(r9) ffc0d1a4: 2f 80 00 00 cmpwi cr7,r0,0 ffc0d1a8: 41 be 00 20 beq+ cr7,ffc0d1c8 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x50> */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; ffc0d1ac: 3d 20 00 00 lis r9,0 ffc0d1b0: 81 69 28 14 lwz r11,10260(r9) thread_support->cancelation_requested ) { _Thread_Unnest_dispatch(); _POSIX_Thread_Exit( the_thread, PTHREAD_CANCELED ); ffc0d1b4: 38 80 ff ff li r4,-1 ffc0d1b8: 38 0b ff ff addi r0,r11,-1 ffc0d1bc: 90 09 28 14 stw r0,10260(r9) ffc0d1c0: 48 00 08 45 bl ffc0da04 <_POSIX_Thread_Exit> ffc0d1c4: 48 00 00 08 b ffc0d1cc <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x54> } else _Thread_Enable_dispatch(); ffc0d1c8: 4b ff d4 cd bl ffc0a694 <_Thread_Enable_dispatch> } ffc0d1cc: 80 01 00 0c lwz r0,12(r1) ffc0d1d0: 38 21 00 08 addi r1,r1,8 ffc0d1d4: 7c 08 03 a6 mtlr r0 ffc0d1d8: 4e 80 00 20 blr =============================================================================== ffc0e774 <_POSIX_Thread_Translate_sched_param>: int policy, struct sched_param *param, Thread_CPU_budget_algorithms *budget_algorithm, Thread_CPU_budget_algorithm_callout *budget_callout ) { ffc0e774: 94 21 ff e0 stwu r1,-32(r1) ffc0e778: 7c 08 02 a6 mflr r0 ffc0e77c: bf 61 00 0c stmw r27,12(r1) ffc0e780: 7c 7f 1b 78 mr r31,r3 ffc0e784: 7c 9e 23 78 mr r30,r4 if ( !_POSIX_Priority_Is_valid( param->sched_priority ) ) ffc0e788: 80 64 00 00 lwz r3,0(r4) int policy, struct sched_param *param, Thread_CPU_budget_algorithms *budget_algorithm, Thread_CPU_budget_algorithm_callout *budget_callout ) { ffc0e78c: 7c bd 2b 78 mr r29,r5 ffc0e790: 90 01 00 24 stw r0,36(r1) ffc0e794: 7c db 33 78 mr r27,r6 if ( !_POSIX_Priority_Is_valid( param->sched_priority ) ) ffc0e798: 4b ff ff b5 bl ffc0e74c <_POSIX_Priority_Is_valid> return EINVAL; ffc0e79c: 3b 80 00 16 li r28,22 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 ) ) ffc0e7a0: 2f 83 00 00 cmpwi cr7,r3,0 ffc0e7a4: 41 9e 00 c8 beq- cr7,ffc0e86c <_POSIX_Thread_Translate_sched_param+0xf8><== NEVER TAKEN return EINVAL; *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; *budget_callout = NULL; if ( policy == SCHED_OTHER ) { ffc0e7a8: 2f 9f 00 00 cmpwi cr7,r31,0 ) { if ( !_POSIX_Priority_Is_valid( param->sched_priority ) ) return EINVAL; *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; ffc0e7ac: 38 00 00 00 li r0,0 ffc0e7b0: 90 1d 00 00 stw r0,0(r29) *budget_callout = NULL; ffc0e7b4: 90 1b 00 00 stw r0,0(r27) if ( policy == SCHED_OTHER ) { ffc0e7b8: 40 be 00 10 bne+ cr7,ffc0e7c8 <_POSIX_Thread_Translate_sched_param+0x54> *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; ffc0e7bc: 38 00 00 01 li r0,1 ffc0e7c0: 90 1d 00 00 stw r0,0(r29) ffc0e7c4: 48 00 00 a4 b ffc0e868 <_POSIX_Thread_Translate_sched_param+0xf4> return 0; } if ( policy == SCHED_FIFO ) { ffc0e7c8: 2f 9f 00 01 cmpwi cr7,r31,1 *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; return 0; ffc0e7cc: 3b 80 00 00 li r28,0 if ( policy == SCHED_OTHER ) { *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; return 0; } if ( policy == SCHED_FIFO ) { ffc0e7d0: 41 9e 00 9c beq- cr7,ffc0e86c <_POSIX_Thread_Translate_sched_param+0xf8> *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; return 0; } if ( policy == SCHED_RR ) { ffc0e7d4: 2f 9f 00 02 cmpwi cr7,r31,2 ffc0e7d8: 40 be 00 0c bne+ cr7,ffc0e7e4 <_POSIX_Thread_Translate_sched_param+0x70> *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE; ffc0e7dc: 93 fd 00 00 stw r31,0(r29) return 0; ffc0e7e0: 48 00 00 8c b ffc0e86c <_POSIX_Thread_Translate_sched_param+0xf8> } if ( policy == SCHED_SPORADIC ) { ffc0e7e4: 2f 9f 00 04 cmpwi cr7,r31,4 *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT; *budget_callout = _POSIX_Threads_Sporadic_budget_callout; return 0; } return EINVAL; ffc0e7e8: 3b 80 00 16 li r28,22 if ( policy == SCHED_RR ) { *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE; return 0; } if ( policy == SCHED_SPORADIC ) { ffc0e7ec: 40 be 00 80 bne+ cr7,ffc0e86c <_POSIX_Thread_Translate_sched_param+0xf8> if ( (param->sched_ss_repl_period.tv_sec == 0) && ffc0e7f0: 80 1e 00 08 lwz r0,8(r30) ffc0e7f4: 2f 80 00 00 cmpwi cr7,r0,0 ffc0e7f8: 40 9e 00 10 bne- cr7,ffc0e808 <_POSIX_Thread_Translate_sched_param+0x94> ffc0e7fc: 80 1e 00 0c lwz r0,12(r30) ffc0e800: 2f 80 00 00 cmpwi cr7,r0,0 ffc0e804: 41 9e 00 68 beq- cr7,ffc0e86c <_POSIX_Thread_Translate_sched_param+0xf8> (param->sched_ss_repl_period.tv_nsec == 0) ) return EINVAL; if ( (param->sched_ss_init_budget.tv_sec == 0) && ffc0e808: 80 1e 00 10 lwz r0,16(r30) ffc0e80c: 2f 80 00 00 cmpwi cr7,r0,0 ffc0e810: 40 9e 00 14 bne- cr7,ffc0e824 <_POSIX_Thread_Translate_sched_param+0xb0> ffc0e814: 80 1e 00 14 lwz r0,20(r30) (param->sched_ss_init_budget.tv_nsec == 0) ) return EINVAL; ffc0e818: 3b 80 00 16 li r28,22 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) && ffc0e81c: 2f 80 00 00 cmpwi cr7,r0,0 ffc0e820: 41 9e 00 4c beq- cr7,ffc0e86c <_POSIX_Thread_Translate_sched_param+0xf8> (param->sched_ss_init_budget.tv_nsec == 0) ) return EINVAL; if ( _Timespec_To_ticks( ¶m->sched_ss_repl_period ) < ffc0e824: 38 7e 00 08 addi r3,r30,8 ffc0e828: 4b ff da 25 bl ffc0c24c <_Timespec_To_ticks> _Timespec_To_ticks( ¶m->sched_ss_init_budget ) ) return EINVAL; ffc0e82c: 3b 80 00 16 li r28,22 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 ) < ffc0e830: 7c 7f 1b 78 mr r31,r3 _Timespec_To_ticks( ¶m->sched_ss_init_budget ) ) ffc0e834: 38 7e 00 10 addi r3,r30,16 ffc0e838: 4b ff da 15 bl ffc0c24c <_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 ) < ffc0e83c: 7f 9f 18 40 cmplw cr7,r31,r3 ffc0e840: 41 9c 00 2c blt- cr7,ffc0e86c <_POSIX_Thread_Translate_sched_param+0xf8> _Timespec_To_ticks( ¶m->sched_ss_init_budget ) ) return EINVAL; if ( !_POSIX_Priority_Is_valid( param->sched_ss_low_priority ) ) ffc0e844: 80 7e 00 04 lwz r3,4(r30) ffc0e848: 4b ff ff 05 bl ffc0e74c <_POSIX_Priority_Is_valid> ffc0e84c: 2f 83 00 00 cmpwi cr7,r3,0 ffc0e850: 41 9e 00 1c beq- cr7,ffc0e86c <_POSIX_Thread_Translate_sched_param+0xf8> return EINVAL; *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT; ffc0e854: 38 00 00 03 li r0,3 *budget_callout = _POSIX_Threads_Sporadic_budget_callout; ffc0e858: 3d 20 ff c1 lis r9,-63 return EINVAL; if ( !_POSIX_Priority_Is_valid( param->sched_ss_low_priority ) ) return EINVAL; *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT; ffc0e85c: 90 1d 00 00 stw r0,0(r29) *budget_callout = _POSIX_Threads_Sporadic_budget_callout; ffc0e860: 38 09 81 f0 addi r0,r9,-32272 ffc0e864: 90 1b 00 00 stw r0,0(r27) return 0; ffc0e868: 3b 80 00 00 li r28,0 } return EINVAL; } ffc0e86c: 39 61 00 20 addi r11,r1,32 ffc0e870: 7f 83 e3 78 mr r3,r28 ffc0e874: 4b ff 23 60 b ffc00bd4 <_restgpr_27_x> =============================================================================== ffc07ed4 <_POSIX_Threads_Initialize_user_threads_body>: * * Output parameters: NONE */ void _POSIX_Threads_Initialize_user_threads_body(void) { ffc07ed4: 94 21 ff 90 stwu r1,-112(r1) ffc07ed8: 7c 08 02 a6 mflr r0 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; ffc07edc: 3d 20 00 00 lis r9,0 * * Output parameters: NONE */ void _POSIX_Threads_Initialize_user_threads_body(void) { ffc07ee0: 90 01 00 74 stw r0,116(r1) 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; ffc07ee4: 39 29 20 b4 addi r9,r9,8372 * * Output parameters: NONE */ void _POSIX_Threads_Initialize_user_threads_body(void) { ffc07ee8: bf 61 00 5c stmw r27,92(r1) 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; ffc07eec: 83 c9 00 34 lwz r30,52(r9) maximum = Configuration_POSIX_API.number_of_initialization_threads; ffc07ef0: 83 89 00 30 lwz r28,48(r9) if ( !user_threads || maximum == 0 ) ffc07ef4: 2f 9e 00 00 cmpwi cr7,r30,0 ffc07ef8: 41 9e 00 70 beq- cr7,ffc07f68 <_POSIX_Threads_Initialize_user_threads_body+0x94><== NEVER TAKEN ffc07efc: 2f 9c 00 00 cmpwi cr7,r28,0 ffc07f00: 41 9e 00 68 beq- cr7,ffc07f68 <_POSIX_Threads_Initialize_user_threads_body+0x94><== NEVER TAKEN ffc07f04: 3b a0 00 00 li r29,0 for ( index=0 ; index < maximum ; index++ ) { /* * There is no way for these calls to fail in this situation. */ (void) pthread_attr_init( &attr ); ffc07f08: 3b e1 00 0c addi r31,r1,12 (void) pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED ); (void) pthread_attr_setstacksize(&attr, user_threads[ index ].stack_size); status = pthread_create( ffc07f0c: 3b 61 00 08 addi r27,r1,8 for ( index=0 ; index < maximum ; index++ ) { /* * There is no way for these calls to fail in this situation. */ (void) pthread_attr_init( &attr ); ffc07f10: 7f e3 fb 78 mr r3,r31 ffc07f14: 48 00 69 65 bl ffc0e878 (void) pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED ); ffc07f18: 38 80 00 02 li r4,2 ffc07f1c: 7f e3 fb 78 mr r3,r31 ffc07f20: 48 00 69 99 bl ffc0e8b8 (void) pthread_attr_setstacksize(&attr, user_threads[ index ].stack_size); ffc07f24: 80 9e 00 04 lwz r4,4(r30) ffc07f28: 7f e3 fb 78 mr r3,r31 ffc07f2c: 48 00 69 c5 bl ffc0e8f0 status = pthread_create( ffc07f30: 80 be 00 00 lwz r5,0(r30) ffc07f34: 7f 63 db 78 mr r3,r27 ffc07f38: 7f e4 fb 78 mr r4,r31 ffc07f3c: 38 c0 00 00 li r6,0 ffc07f40: 4b ff fc c9 bl ffc07c08 &thread_id, &attr, user_threads[ index ].thread_entry, NULL ); if ( status ) ffc07f44: 7c 65 1b 79 mr. r5,r3 ffc07f48: 41 a2 00 10 beq+ ffc07f58 <_POSIX_Threads_Initialize_user_threads_body+0x84> _Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status ); ffc07f4c: 38 60 00 02 li r3,2 ffc07f50: 38 80 00 01 li r4,1 ffc07f54: 48 00 22 89 bl ffc0a1dc <_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++ ) { ffc07f58: 3b bd 00 01 addi r29,r29,1 ffc07f5c: 7f 9d e0 40 cmplw cr7,r29,r28 ffc07f60: 3b de 00 08 addi r30,r30,8 ffc07f64: 41 9c ff ac blt+ cr7,ffc07f10 <_POSIX_Threads_Initialize_user_threads_body+0x3c><== NEVER TAKEN NULL ); if ( status ) _Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status ); } } ffc07f68: 39 61 00 70 addi r11,r1,112 ffc07f6c: 4b ff 8c 68 b ffc00bd4 <_restgpr_27_x> =============================================================================== ffc11260 <_POSIX_Threads_Sporadic_budget_TSR>: */ void _POSIX_Threads_Sporadic_budget_TSR( Objects_Id id __attribute__((unused)), void *argument ) { ffc11260: 94 21 ff f0 stwu r1,-16(r1) ffc11264: 7c 08 02 a6 mflr r0 ffc11268: 90 01 00 14 stw r0,20(r1) ffc1126c: bf c1 00 08 stmw r30,8(r1) ffc11270: 7c 9e 23 78 mr r30,r4 Thread_Control *the_thread; POSIX_API_Control *api; the_thread = argument; api = the_thread->API_Extensions[ THREAD_API_POSIX ]; ffc11274: 83 e4 01 34 lwz r31,308(r4) /* ticks is guaranteed to be at least one */ ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_init_budget ); ffc11278: 38 7f 00 98 addi r3,r31,152 ffc1127c: 48 00 14 dd bl ffc12758 <_Timespec_To_ticks> RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core( int priority ) { return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1); ffc11280: 3d 20 00 00 lis r9,0 ffc11284: 80 1f 00 88 lwz r0,136(r31) ffc11288: 88 89 27 44 lbz r4,10052(r9) the_thread->cpu_time_budget = ticks; ffc1128c: 90 7e 00 78 stw r3,120(r30) ffc11290: 7c 80 20 50 subf r4,r0,r4 */ #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 ) { ffc11294: 80 1e 00 1c lwz r0,28(r30) ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_init_budget ); the_thread->cpu_time_budget = ticks; new_priority = _POSIX_Priority_To_core( api->schedparam.sched_priority ); the_thread->real_priority = new_priority; ffc11298: 90 9e 00 18 stw r4,24(r30) */ #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 ) { ffc1129c: 2f 80 00 00 cmpwi cr7,r0,0 ffc112a0: 40 9e 00 1c bne- cr7,ffc112bc <_POSIX_Threads_Sporadic_budget_TSR+0x5c><== NEVER TAKEN /* * If this would make them less important, then do not change it. */ if ( the_thread->current_priority > new_priority ) { ffc112a4: 80 1e 00 14 lwz r0,20(r30) ffc112a8: 7f 80 20 40 cmplw cr7,r0,r4 ffc112ac: 40 bd 00 10 ble+ cr7,ffc112bc <_POSIX_Threads_Sporadic_budget_TSR+0x5c> _Thread_Change_priority( the_thread, new_priority, true ); ffc112b0: 7f c3 f3 78 mr r3,r30 ffc112b4: 38 a0 00 01 li r5,1 ffc112b8: 4b ff 9d 4d bl ffc0b004 <_Thread_Change_priority> #endif } } /* ticks is guaranteed to be at least one */ ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_repl_period ); ffc112bc: 38 7f 00 90 addi r3,r31,144 ffc112c0: 48 00 14 99 bl ffc12758 <_Timespec_To_ticks> ) { the_watchdog->initial = units; _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); ffc112c4: 38 9f 00 a8 addi r4,r31,168 Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; ffc112c8: 90 7f 00 b4 stw r3,180(r31) _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); ffc112cc: 3c 60 00 00 lis r3,0 ffc112d0: 38 63 2e 08 addi r3,r3,11784 ffc112d4: 4b ff b1 65 bl ffc0c438 <_Watchdog_Insert> _Watchdog_Insert_ticks( &api->Sporadic_timer, ticks ); } ffc112d8: 39 61 00 10 addi r11,r1,16 ffc112dc: 48 00 7e d0 b ffc191ac <_restgpr_30_x> =============================================================================== ffc112e0 <_POSIX_Threads_Sporadic_budget_callout>: * _POSIX_Threads_Sporadic_budget_callout */ void _POSIX_Threads_Sporadic_budget_callout( Thread_Control *the_thread ) { ffc112e0: 7c 08 02 a6 mflr r0 ffc112e4: 94 21 ff f8 stwu r1,-8(r1) ffc112e8: 3d 40 00 00 lis r10,0 ffc112ec: 90 01 00 0c stw r0,12(r1) /* * 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 */ ffc112f0: 38 00 ff ff li r0,-1 ) { POSIX_API_Control *api; uint32_t new_priority; api = the_thread->API_Extensions[ THREAD_API_POSIX ]; ffc112f4: 81 63 01 34 lwz r11,308(r3) /* * 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 */ ffc112f8: 90 03 00 78 stw r0,120(r3) ffc112fc: 88 8a 27 44 lbz r4,10052(r10) ffc11300: 80 0b 00 8c lwz r0,140(r11) ffc11304: 7c 80 20 50 subf r4,r0,r4 */ #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 ) { ffc11308: 80 03 00 1c lwz r0,28(r3) * while at low priority. */ the_thread->cpu_time_budget = 0xFFFFFFFF; /* XXX should be based on MAX_U32 */ new_priority = _POSIX_Priority_To_core(api->schedparam.sched_ss_low_priority); the_thread->real_priority = new_priority; ffc1130c: 90 83 00 18 stw r4,24(r3) */ #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 ) { ffc11310: 2f 80 00 00 cmpwi cr7,r0,0 ffc11314: 40 9e 00 18 bne- cr7,ffc1132c <_POSIX_Threads_Sporadic_budget_callout+0x4c><== 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 ) { ffc11318: 80 03 00 14 lwz r0,20(r3) ffc1131c: 7f 80 20 40 cmplw cr7,r0,r4 ffc11320: 40 bc 00 0c bge+ cr7,ffc1132c <_POSIX_Threads_Sporadic_budget_callout+0x4c><== NEVER TAKEN _Thread_Change_priority( the_thread, new_priority, true ); ffc11324: 38 a0 00 01 li r5,1 ffc11328: 4b ff 9c dd bl ffc0b004 <_Thread_Change_priority> #if 0 printk( "lower priority\n" ); #endif } } } ffc1132c: 80 01 00 0c lwz r0,12(r1) ffc11330: 38 21 00 08 addi r1,r1,8 ffc11334: 7c 08 03 a6 mtlr r0 ffc11338: 4e 80 00 20 blr =============================================================================== ffc07bf4 <_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) { ffc07bf4: 7c 08 02 a6 mflr r0 ffc07bf8: 7c 2b 0b 78 mr r11,r1 ffc07bfc: 94 21 ff f0 stwu r1,-16(r1) ffc07c00: 90 01 00 14 stw r0,20(r1) ffc07c04: 48 01 42 d5 bl ffc1bed8 <_savegpr_31> ffc07c08: 7c 9f 23 78 mr r31,r4 bool activated; ptimer = (POSIX_Timer_Control *)data; /* Increment the number of expirations. */ ptimer->overrun = ptimer->overrun + 1; ffc07c0c: 81 24 00 68 lwz r9,104(r4) ffc07c10: 38 09 00 01 addi r0,r9,1 ffc07c14: 90 04 00 68 stw r0,104(r4) /* The timer must be reprogrammed */ if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) || ffc07c18: 80 04 00 54 lwz r0,84(r4) ffc07c1c: 2f 80 00 00 cmpwi cr7,r0,0 ffc07c20: 40 9e 00 10 bne- cr7,ffc07c30 <_POSIX_Timer_TSR+0x3c> ffc07c24: 80 04 00 58 lwz r0,88(r4) ffc07c28: 2f 80 00 00 cmpwi cr7,r0,0 ffc07c2c: 41 9e 00 38 beq- cr7,ffc07c64 <_POSIX_Timer_TSR+0x70> <== NEVER TAKEN ( ptimer->timer_data.it_interval.tv_nsec != 0 ) ) { activated = _POSIX_Timer_Insert_helper( ffc07c30: 80 9f 00 64 lwz r4,100(r31) ffc07c34: 3c c0 ff c0 lis r6,-64 ffc07c38: 80 bf 00 08 lwz r5,8(r31) ffc07c3c: 38 7f 00 10 addi r3,r31,16 ffc07c40: 38 c6 7b f4 addi r6,r6,31732 ffc07c44: 7f e7 fb 78 mr r7,r31 ffc07c48: 48 00 67 fd bl ffc0e444 <_POSIX_Timer_Insert_helper> ptimer->ticks, ptimer->Object.id, _POSIX_Timer_TSR, ptimer ); if ( !activated ) ffc07c4c: 2f 83 00 00 cmpwi cr7,r3,0 ffc07c50: 41 be 00 30 beq+ cr7,ffc07c80 <_POSIX_Timer_TSR+0x8c> <== NEVER TAKEN return; /* Store the time when the timer was started again */ _TOD_Get( &ptimer->time ); ffc07c54: 38 7f 00 6c addi r3,r31,108 ffc07c58: 48 00 19 05 bl ffc0955c <_TOD_Get> /* The state really did not change but just to be safe */ ptimer->state = POSIX_TIMER_STATE_CREATE_RUN; ffc07c5c: 38 00 00 03 li r0,3 ffc07c60: 48 00 00 08 b ffc07c68 <_POSIX_Timer_TSR+0x74> } else { /* Indicates that the timer is stopped */ ptimer->state = POSIX_TIMER_STATE_CREATE_STOP; ffc07c64: 38 00 00 04 li r0,4 <== NOT EXECUTED ffc07c68: 98 1f 00 3c stb r0,60(r31) /* * 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 ) ) { ffc07c6c: 80 7f 00 38 lwz r3,56(r31) ffc07c70: 80 9f 00 44 lwz r4,68(r31) ffc07c74: 48 00 62 fd bl ffc0df70 } /* After the signal handler returns, the count of expirations of the * timer must be set to 0. */ ptimer->overrun = 0; ffc07c78: 38 00 00 00 li r0,0 ffc07c7c: 90 1f 00 68 stw r0,104(r31) } ffc07c80: 39 61 00 10 addi r11,r1,16 ffc07c84: 4b ff 89 a0 b ffc00624 <_restgpr_31_x> =============================================================================== ffc13c28 <_POSIX_signals_Check_signal>: bool _POSIX_signals_Check_signal( POSIX_API_Control *api, int signo, bool is_global ) { ffc13c28: 94 21 ff 98 stwu r1,-104(r1) ffc13c2c: 7c 08 02 a6 mflr r0 ffc13c30: 7c a6 2b 78 mr r6,r5 ffc13c34: bf 21 00 4c stmw r25,76(r1) 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, ffc13c38: 3b a1 00 08 addi r29,r1,8 ffc13c3c: 7f a5 eb 78 mr r5,r29 ffc13c40: 38 e0 00 01 li r7,1 bool _POSIX_signals_Check_signal( POSIX_API_Control *api, int signo, bool is_global ) { ffc13c44: 90 01 00 6c stw r0,108(r1) ffc13c48: 7c 7f 1b 78 mr r31,r3 ffc13c4c: 7c 9e 23 78 mr r30,r4 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, ffc13c50: 48 00 00 b5 bl ffc13d04 <_POSIX_signals_Clear_signals> ffc13c54: 2f 83 00 00 cmpwi cr7,r3,0 is_global, true ) ) return false; ffc13c58: 38 00 00 00 li r0,0 { 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, ffc13c5c: 41 9e 00 9c beq- cr7,ffc13cf8 <_POSIX_signals_Check_signal+0xd0> #endif /* * Just to prevent sending a signal which is currently being ignored. */ if ( _POSIX_signals_Vectors[ signo ].sa_handler == SIG_IGN ) ffc13c60: 3f 20 00 00 lis r25,0 ffc13c64: 1f 5e 00 0c mulli r26,r30,12 ffc13c68: 3b 39 32 40 addi r25,r25,12864 ffc13c6c: 7d 39 d2 14 add r9,r25,r26 ffc13c70: 83 89 00 08 lwz r28,8(r9) ffc13c74: 2f 9c 00 01 cmpwi cr7,r28,1 ffc13c78: 41 9e 00 80 beq- cr7,ffc13cf8 <_POSIX_signals_Check_signal+0xd0><== NEVER TAKEN /* * Block the signals requested in sa_mask */ saved_signals_blocked = api->signals_blocked; api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask; ffc13c7c: 80 09 00 04 lwz r0,4(r9) /* * 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, ffc13c80: 3d 20 00 00 lis r9,0 return false; /* * Block the signals requested in sa_mask */ saved_signals_blocked = api->signals_blocked; ffc13c84: 83 7f 00 d0 lwz r27,208(r31) /* * 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, ffc13c88: 38 61 00 14 addi r3,r1,20 ffc13c8c: 80 89 31 f0 lwz r4,12784(r9) ffc13c90: 38 a0 00 28 li r5,40 /* * Block the signals requested in sa_mask */ saved_signals_blocked = api->signals_blocked; api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask; ffc13c94: 7c 00 db 78 or r0,r0,r27 ffc13c98: 90 1f 00 d0 stw r0,208(r31) /* * 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, ffc13c9c: 38 84 00 20 addi r4,r4,32 ffc13ca0: 48 00 12 79 bl ffc14f18 sizeof( Thread_Wait_information )); /* * Here, the signal handler function executes */ switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) { ffc13ca4: 7c 19 d0 2e lwzx r0,r25,r26 ffc13ca8: 2f 80 00 02 cmpwi cr7,r0,2 ffc13cac: 40 be 00 1c bne+ cr7,ffc13cc8 <_POSIX_signals_Check_signal+0xa0> case SA_SIGINFO: (*_POSIX_signals_Vectors[ signo ].sa_sigaction)( ffc13cb0: 7f c3 f3 78 mr r3,r30 ffc13cb4: 7f 89 03 a6 mtctr r28 ffc13cb8: 7f a4 eb 78 mr r4,r29 ffc13cbc: 38 a0 00 00 li r5,0 ffc13cc0: 4e 80 04 21 bctrl signo, &siginfo_struct, NULL /* context is undefined per 1003.1b-1993, p. 66 */ ); break; ffc13cc4: 48 00 00 14 b ffc13cd8 <_POSIX_signals_Check_signal+0xb0> default: (*_POSIX_signals_Vectors[ signo ].sa_handler)( signo ); ffc13cc8: 7f c3 f3 78 mr r3,r30 ffc13ccc: 7f 89 03 a6 mtctr r28 ffc13cd0: 4c c6 31 82 crclr 4*cr1+eq ffc13cd4: 4e 80 04 21 bctrl } /* * Restore the blocking information */ memcpy( &_Thread_Executing->Wait, &stored_thread_wait_information, ffc13cd8: 3d 20 00 00 lis r9,0 ffc13cdc: 80 69 31 f0 lwz r3,12784(r9) ffc13ce0: 38 81 00 14 addi r4,r1,20 ffc13ce4: 38 a0 00 28 li r5,40 ffc13ce8: 38 63 00 20 addi r3,r3,32 ffc13cec: 48 00 12 2d bl ffc14f18 sizeof( Thread_Wait_information )); /* * Restore the previous set of blocked signals */ api->signals_blocked = saved_signals_blocked; ffc13cf0: 93 7f 00 d0 stw r27,208(r31) return true; ffc13cf4: 38 00 00 01 li r0,1 } ffc13cf8: 39 61 00 68 addi r11,r1,104 ffc13cfc: 7c 03 03 78 mr r3,r0 ffc13d00: 48 00 54 98 b ffc19198 <_restgpr_25_x> =============================================================================== ffc14250 <_POSIX_signals_Clear_process_signals>: static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc14250: 7d 60 00 a6 mfmsr r11 ffc14254: 7c 10 42 a6 mfsprg r0,0 ffc14258: 7d 60 00 78 andc r0,r11,r0 ffc1425c: 7c 00 01 24 mtmsr r0 mask = signo_to_mask( signo ); ISR_Level level; _ISR_Disable( level ); if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) { ffc14260: 3d 20 00 00 lis r9,0 ffc14264: 1c 03 00 0c mulli r0,r3,12 ffc14268: 39 29 32 40 addi r9,r9,12864 ffc1426c: 7d 29 00 2e lwzx r9,r9,r0 ffc14270: 2f 89 00 02 cmpwi cr7,r9,2 ffc14274: 40 be 00 20 bne+ cr7,ffc14294 <_POSIX_signals_Clear_process_signals+0x44> } if ( clear_signal ) { _POSIX_signals_Pending &= ~mask; } _ISR_Enable( level ); } ffc14278: 3d 20 00 00 lis r9,0 ffc1427c: 39 29 34 34 addi r9,r9,13364 ffc14280: 7d 49 02 14 add r10,r9,r0 ISR_Level level; _ISR_Disable( level ); if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) { if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) ) ffc14284: 7c 09 00 2e lwzx r0,r9,r0 RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); ffc14288: 39 4a 00 04 addi r10,r10,4 ffc1428c: 7f 80 50 00 cmpw cr7,r0,r10 ffc14290: 40 be 00 20 bne+ cr7,ffc142b0 <_POSIX_signals_Clear_process_signals+0x60><== NEVER TAKEN clear_signal = false; } if ( clear_signal ) { _POSIX_signals_Pending &= ~mask; ffc14294: 3d 20 00 00 lis r9,0 ffc14298: 38 00 ff fe li r0,-2 ffc1429c: 38 63 ff ff addi r3,r3,-1 ffc142a0: 5c 03 18 3e rotlw r3,r0,r3 ffc142a4: 80 09 28 50 lwz r0,10320(r9) ffc142a8: 7c 63 00 38 and r3,r3,r0 ffc142ac: 90 69 28 50 stw r3,10320(r9) return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc142b0: 7d 60 01 24 mtmsr r11 } _ISR_Enable( level ); } ffc142b4: 4e 80 00 20 blr =============================================================================== ffc0869c <_POSIX_signals_Get_lowest>: ffc0869c: 39 40 00 05 li r10,5 ffc086a0: 7d 49 03 a6 mtctr r10 sigset_t set ) { int signo; for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { ffc086a4: 39 20 00 1b li r9,27 ffc086a8: 38 00 00 01 li r0,1 #include #include #include #include int _POSIX_signals_Get_lowest( ffc086ac: 39 69 ff ff addi r11,r9,-1 ffc086b0: 7c 0b 58 30 slw r11,r0,r11 ) { int signo; for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { if ( set & signo_to_mask( signo ) ) { ffc086b4: 7d 6a 18 39 and. r10,r11,r3 ffc086b8: 40 82 00 34 bne- ffc086ec <_POSIX_signals_Get_lowest+0x50><== NEVER TAKEN sigset_t set ) { int signo; for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { ffc086bc: 39 29 00 01 addi r9,r9,1 ffc086c0: 42 00 ff ec bdnz+ ffc086ac <_POSIX_signals_Get_lowest+0x10> ffc086c4: 39 60 00 1a li r11,26 ffc086c8: 7d 69 03 a6 mtctr r11 ffc086cc: 39 20 00 01 li r9,1 ffc086d0: 38 00 00 01 li r0,1 #include #include #include #include int _POSIX_signals_Get_lowest( ffc086d4: 39 69 ff ff addi r11,r9,-1 ffc086d8: 7c 0b 58 30 slw r11,r0,r11 #if (SIGHUP != 1) #error "Assumption that SIGHUP==1 violated!!" #endif for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) { if ( set & signo_to_mask( signo ) ) { ffc086dc: 7d 6a 18 39 and. r10,r11,r3 ffc086e0: 40 82 00 0c bne- ffc086ec <_POSIX_signals_Get_lowest+0x50> */ #if (SIGHUP != 1) #error "Assumption that SIGHUP==1 violated!!" #endif for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) { ffc086e4: 39 29 00 01 addi r9,r9,1 ffc086e8: 42 00 ff ec bdnz+ ffc086d4 <_POSIX_signals_Get_lowest+0x38> * a return 0. This routine will NOT be called unless a signal * is pending in the set passed in. */ found_it: return signo; } ffc086ec: 7d 23 4b 78 mr r3,r9 ffc086f0: 4e 80 00 20 blr =============================================================================== ffc25a28 <_POSIX_signals_Unblock_thread>: bool _POSIX_signals_Unblock_thread( Thread_Control *the_thread, int signo, siginfo_t *info ) { ffc25a28: 94 21 ff f0 stwu r1,-16(r1) ffc25a2c: 7c 08 02 a6 mflr r0 /* * Is the thread is specifically waiting for a signal? */ if ( _States_Is_interruptible_signal( the_thread->current_state ) ) { ffc25a30: 3c e0 10 00 lis r7,4096 bool _POSIX_signals_Unblock_thread( Thread_Control *the_thread, int signo, siginfo_t *info ) { ffc25a34: 90 01 00 14 stw r0,20(r1) /* * Is the thread is specifically waiting for a signal? */ if ( _States_Is_interruptible_signal( the_thread->current_state ) ) { ffc25a38: 60 e7 80 00 ori r7,r7,32768 ffc25a3c: 39 64 ff ff addi r11,r4,-1 ffc25a40: 80 03 00 10 lwz r0,16(r3) ffc25a44: 39 40 00 01 li r10,1 bool _POSIX_signals_Unblock_thread( Thread_Control *the_thread, int signo, siginfo_t *info ) { ffc25a48: bf c1 00 08 stmw r30,8(r1) ffc25a4c: 7c a9 2b 78 mr r9,r5 /* * Is the thread is specifically waiting for a signal? */ if ( _States_Is_interruptible_signal( the_thread->current_state ) ) { ffc25a50: 7c 06 38 38 and r6,r0,r7 ffc25a54: 7f 86 38 00 cmpw cr7,r6,r7 { POSIX_API_Control *api; sigset_t mask; siginfo_t *the_info = NULL; api = the_thread->API_Extensions[ THREAD_API_POSIX ]; ffc25a58: 81 03 01 34 lwz r8,308(r3) bool _POSIX_signals_Unblock_thread( Thread_Control *the_thread, int signo, siginfo_t *info ) { ffc25a5c: 7c 7f 1b 78 mr r31,r3 ffc25a60: 7d 4b 58 30 slw r11,r10,r11 /* * Is the thread is specifically waiting for a signal? */ if ( _States_Is_interruptible_signal( the_thread->current_state ) ) { ffc25a64: 40 be 00 60 bne+ cr7,ffc25ac4 <_POSIX_signals_Unblock_thread+0x9c> if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) { ffc25a68: 80 03 00 30 lwz r0,48(r3) ffc25a6c: 7d 6a 00 39 and. r10,r11,r0 ffc25a70: 40 82 00 14 bne- ffc25a84 <_POSIX_signals_Unblock_thread+0x5c> ffc25a74: 80 08 00 d0 lwz r0,208(r8) /* * This should only be reached via pthread_kill(). */ return false; ffc25a78: 3b c0 00 00 li r30,0 * 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) ) { ffc25a7c: 7d 68 00 79 andc. r8,r11,r0 ffc25a80: 41 82 00 cc beq- ffc25b4c <_POSIX_signals_Unblock_thread+0x124> the_thread->Wait.return_code = EINTR; the_info = (siginfo_t *) the_thread->Wait.return_argument; if ( !info ) { ffc25a84: 2f 89 00 00 cmpwi cr7,r9,0 if ( _States_Is_interruptible_signal( the_thread->current_state ) ) { if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) { the_thread->Wait.return_code = EINTR; the_info = (siginfo_t *) the_thread->Wait.return_argument; ffc25a88: 81 7f 00 28 lwz r11,40(r31) */ if ( _States_Is_interruptible_signal( the_thread->current_state ) ) { if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) { the_thread->Wait.return_code = EINTR; ffc25a8c: 38 00 00 04 li r0,4 ffc25a90: 90 1f 00 34 stw r0,52(r31) the_info = (siginfo_t *) the_thread->Wait.return_argument; if ( !info ) { ffc25a94: 40 be 00 18 bne+ cr7,ffc25aac <_POSIX_signals_Unblock_thread+0x84> the_info->si_signo = signo; the_info->si_code = SI_USER; ffc25a98: 38 00 00 01 li r0,1 the_thread->Wait.return_code = EINTR; the_info = (siginfo_t *) the_thread->Wait.return_argument; if ( !info ) { the_info->si_signo = signo; ffc25a9c: 90 8b 00 00 stw r4,0(r11) the_info->si_code = SI_USER; ffc25aa0: 90 0b 00 04 stw r0,4(r11) the_info->si_value.sival_int = 0; ffc25aa4: 91 2b 00 08 stw r9,8(r11) ffc25aa8: 48 00 00 0c b ffc25ab4 <_POSIX_signals_Unblock_thread+0x8c> } else { *the_info = *info; ffc25aac: 7c a9 64 aa lswi r5,r9,12 ffc25ab0: 7c ab 65 aa stswi r5,r11,12 } _Thread_queue_Extract_with_proxy( the_thread ); ffc25ab4: 7f e3 fb 78 mr r3,r31 ffc25ab8: 4b fe ab 45 bl ffc105fc <_Thread_queue_Extract_with_proxy> return true; ffc25abc: 3b c0 00 01 li r30,1 ffc25ac0: 48 00 00 8c b ffc25b4c <_POSIX_signals_Unblock_thread+0x124> } /* * Thread is not waiting due to a sigwait. */ if ( ~api->signals_blocked & mask ) { ffc25ac4: 81 28 00 d0 lwz r9,208(r8) } else if ( the_thread->current_state == STATES_READY ) { if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) ) _Thread_Dispatch_necessary = true; } } return false; ffc25ac8: 3b c0 00 00 li r30,0 } /* * Thread is not waiting due to a sigwait. */ if ( ~api->signals_blocked & mask ) { ffc25acc: 7d 68 48 79 andc. r8,r11,r9 ffc25ad0: 41 82 00 7c beq- ffc25b4c <_POSIX_signals_Unblock_thread+0x124> * 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 ) ) { ffc25ad4: 74 09 10 00 andis. r9,r0,4096 ffc25ad8: 41 82 00 48 beq- ffc25b20 <_POSIX_signals_Unblock_thread+0xf8> the_thread->Wait.return_code = EINTR; ffc25adc: 39 20 00 04 li r9,4 ffc25ae0: 91 23 00 34 stw r9,52(r3) /* * 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) ) ffc25ae4: 3d 20 00 03 lis r9,3 ffc25ae8: 61 29 be e0 ori r9,r9,48864 ffc25aec: 7c 0a 48 39 and. r10,r0,r9 ffc25af0: 41 a2 00 0c beq+ ffc25afc <_POSIX_signals_Unblock_thread+0xd4> _Thread_queue_Extract_with_proxy( the_thread ); ffc25af4: 4b fe ab 09 bl ffc105fc <_Thread_queue_Extract_with_proxy> ffc25af8: 48 00 00 54 b ffc25b4c <_POSIX_signals_Unblock_thread+0x124> else if ( _States_Is_delaying(the_thread->current_state) ) { ffc25afc: 70 0b 00 08 andi. r11,r0,8 ffc25b00: 41 a2 00 4c beq+ ffc25b4c <_POSIX_signals_Unblock_thread+0x124><== NEVER TAKEN (void) _Watchdog_Remove( &the_thread->Timer ); ffc25b04: 38 63 00 48 addi r3,r3,72 ffc25b08: 4b fe b4 e5 bl ffc10fec <_Watchdog_Remove> RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); ffc25b0c: 3c 80 10 03 lis r4,4099 ffc25b10: 7f e3 fb 78 mr r3,r31 ffc25b14: 60 84 ff f8 ori r4,r4,65528 ffc25b18: 4b fe 9f a9 bl ffc0fac0 <_Thread_Clear_state> ffc25b1c: 48 00 00 30 b ffc25b4c <_POSIX_signals_Unblock_thread+0x124> _Thread_Unblock( the_thread ); } } else if ( the_thread->current_state == STATES_READY ) { ffc25b20: 2f 80 00 00 cmpwi cr7,r0,0 ffc25b24: 40 9e 00 28 bne- cr7,ffc25b4c <_POSIX_signals_Unblock_thread+0x124><== NEVER TAKEN if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) ) ffc25b28: 3d 20 00 00 lis r9,0 ffc25b2c: 39 29 32 84 addi r9,r9,12932 ffc25b30: 80 09 00 08 lwz r0,8(r9) ffc25b34: 2f 80 00 00 cmpwi cr7,r0,0 ffc25b38: 41 9e 00 14 beq- cr7,ffc25b4c <_POSIX_signals_Unblock_thread+0x124> ffc25b3c: 80 09 00 0c lwz r0,12(r9) ffc25b40: 7f 83 00 00 cmpw cr7,r3,r0 ffc25b44: 40 be 00 08 bne+ cr7,ffc25b4c <_POSIX_signals_Unblock_thread+0x124><== NEVER TAKEN _Thread_Dispatch_necessary = true; ffc25b48: 99 49 00 18 stb r10,24(r9) } } return false; } ffc25b4c: 39 61 00 10 addi r11,r1,16 ffc25b50: 7f c3 f3 78 mr r3,r30 ffc25b54: 4b fd c4 40 b ffc01f94 <_restgpr_30_x> =============================================================================== ffc09168 <_Rate_monotonic_Timeout>: void _Rate_monotonic_Timeout( Objects_Id id, void *ignored ) { ffc09168: 7c 2b 0b 78 mr r11,r1 ffc0916c: 94 21 ff e0 stwu r1,-32(r1) ffc09170: 7c 08 02 a6 mflr r0 ffc09174: 7c 64 1b 78 mr r4,r3 ffc09178: 3c 60 00 00 lis r3,0 ffc0917c: 48 01 3a 75 bl ffc1cbf0 <_savegpr_31> ffc09180: 38 63 2c 78 addi r3,r3,11384 ffc09184: 90 01 00 24 stw r0,36(r1) ffc09188: 38 a1 00 08 addi r5,r1,8 ffc0918c: 48 00 21 65 bl ffc0b2f0 <_Objects_Get> /* * 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 ); switch ( location ) { ffc09190: 80 01 00 08 lwz r0,8(r1) ffc09194: 7c 7f 1b 78 mr r31,r3 ffc09198: 2f 80 00 00 cmpwi cr7,r0,0 ffc0919c: 40 9e 00 84 bne- cr7,ffc09220 <_Rate_monotonic_Timeout+0xb8><== NEVER TAKEN case OBJECTS_LOCAL: the_thread = the_period->owner; ffc091a0: 80 63 00 40 lwz r3,64(r3) */ RTEMS_INLINE_ROUTINE bool _States_Is_waiting_for_period ( States_Control the_states ) { return (the_states & STATES_WAITING_FOR_PERIOD); ffc091a4: 80 03 00 10 lwz r0,16(r3) if ( _States_Is_waiting_for_period( the_thread->current_state ) && ffc091a8: 70 09 40 00 andi. r9,r0,16384 ffc091ac: 41 82 00 24 beq- ffc091d0 <_Rate_monotonic_Timeout+0x68> ffc091b0: 81 23 00 20 lwz r9,32(r3) ffc091b4: 80 1f 00 08 lwz r0,8(r31) ffc091b8: 7f 89 00 00 cmpw cr7,r9,r0 ffc091bc: 40 be 00 14 bne+ cr7,ffc091d0 <_Rate_monotonic_Timeout+0x68> RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); ffc091c0: 3c 80 10 03 lis r4,4099 ffc091c4: 60 84 ff f8 ori r4,r4,65528 ffc091c8: 48 00 2b 6d bl ffc0bd34 <_Thread_Clear_state> ffc091cc: 48 00 00 18 b ffc091e4 <_Rate_monotonic_Timeout+0x7c> _Thread_Unblock( the_thread ); _Rate_monotonic_Initiate_statistics( the_period ); _Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length ); } else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) { ffc091d0: 80 1f 00 38 lwz r0,56(r31) ffc091d4: 2f 80 00 01 cmpwi cr7,r0,1 ffc091d8: 40 be 00 30 bne+ cr7,ffc09208 <_Rate_monotonic_Timeout+0xa0> the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING; ffc091dc: 38 00 00 03 li r0,3 ffc091e0: 90 1f 00 38 stw r0,56(r31) _Rate_monotonic_Initiate_statistics( the_period ); ffc091e4: 7f e3 fb 78 mr r3,r31 ffc091e8: 4b ff f9 45 bl ffc08b2c <_Rate_monotonic_Initiate_statistics> Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; ffc091ec: 80 1f 00 3c lwz r0,60(r31) _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); ffc091f0: 3c 60 00 00 lis r3,0 Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; ffc091f4: 90 1f 00 1c stw r0,28(r31) _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); ffc091f8: 38 63 2e 48 addi r3,r3,11848 ffc091fc: 38 9f 00 10 addi r4,r31,16 ffc09200: 48 00 40 0d bl ffc0d20c <_Watchdog_Insert> ffc09204: 48 00 00 0c b ffc09210 <_Rate_monotonic_Timeout+0xa8> _Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length ); } else the_period->state = RATE_MONOTONIC_EXPIRED; ffc09208: 38 00 00 04 li r0,4 ffc0920c: 90 1f 00 38 stw r0,56(r31) */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; ffc09210: 3d 20 00 00 lis r9,0 ffc09214: 81 69 28 4c lwz r11,10316(r9) ffc09218: 38 0b ff ff addi r0,r11,-1 ffc0921c: 90 09 28 4c stw r0,10316(r9) case OBJECTS_REMOTE: /* impossible */ #endif case OBJECTS_ERROR: break; } } ffc09220: 39 61 00 20 addi r11,r1,32 ffc09224: 4b ff 7f a8 b ffc011cc <_restgpr_31_x> =============================================================================== ffc0aae8 <_Scheduler_priority_Block>: ) { Scheduler_priority_Per_thread *sched_info; Chain_Control *ready; sched_info = (Scheduler_priority_Per_thread *) the_thread->scheduler_info; ffc0aae8: 81 63 00 8c lwz r11,140(r3) ready = sched_info->ready_chain; ffc0aaec: 81 2b 00 00 lwz r9,0(r11) if ( _Chain_Has_only_one_node( ready ) ) { ffc0aaf0: 81 49 00 00 lwz r10,0(r9) ffc0aaf4: 80 09 00 08 lwz r0,8(r9) ffc0aaf8: 7f 8a 00 00 cmpw cr7,r10,r0 ffc0aafc: 40 be 00 4c bne+ cr7,ffc0ab48 <_Scheduler_priority_Block+0x60> 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 ); ffc0ab00: 38 09 00 04 addi r0,r9,4 head->next = tail; head->previous = NULL; tail->previous = head; ffc0ab04: 91 29 00 08 stw r9,8(r9) ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; ffc0ab08: 90 09 00 00 stw r0,0(r9) head->previous = NULL; ffc0ab0c: 38 00 00 00 li r0,0 ffc0ab10: 90 09 00 04 stw r0,4(r9) RTEMS_INLINE_ROUTINE void _Priority_bit_map_Remove ( Priority_bit_map_Information *the_priority_map ) { *the_priority_map->minor &= the_priority_map->block_minor; ffc0ab14: 81 2b 00 04 lwz r9,4(r11) ffc0ab18: 80 0b 00 14 lwz r0,20(r11) ffc0ab1c: 81 49 00 00 lwz r10,0(r9) ffc0ab20: 7d 40 00 38 and r0,r10,r0 if ( *the_priority_map->minor == 0 ) ffc0ab24: 2f 80 00 00 cmpwi cr7,r0,0 RTEMS_INLINE_ROUTINE void _Priority_bit_map_Remove ( Priority_bit_map_Information *the_priority_map ) { *the_priority_map->minor &= the_priority_map->block_minor; ffc0ab28: 90 09 00 00 stw r0,0(r9) if ( *the_priority_map->minor == 0 ) ffc0ab2c: 40 9e 00 2c bne- cr7,ffc0ab58 <_Scheduler_priority_Block+0x70> _Priority_Major_bit_map &= the_priority_map->block_major; ffc0ab30: 3d 20 00 00 lis r9,0 ffc0ab34: 80 0b 00 10 lwz r0,16(r11) ffc0ab38: 81 49 28 4c lwz r10,10316(r9) ffc0ab3c: 7d 40 00 38 and r0,r10,r0 ffc0ab40: 90 09 28 4c stw r0,10316(r9) ffc0ab44: 48 00 00 14 b ffc0ab58 <_Scheduler_priority_Block+0x70> ) { Chain_Node *next; Chain_Node *previous; next = the_node->next; ffc0ab48: 81 63 00 00 lwz r11,0(r3) previous = the_node->previous; ffc0ab4c: 81 23 00 04 lwz r9,4(r3) next->previous = previous; ffc0ab50: 91 2b 00 04 stw r9,4(r11) previous->next = next; ffc0ab54: 91 69 00 00 stw r11,0(r9) RTEMS_INLINE_ROUTINE bool _Thread_Is_heir ( const Thread_Control *the_thread ) { return ( the_thread == _Thread_Heir ); ffc0ab58: 3d 20 00 00 lis r9,0 { _Scheduler_priority_Ready_queue_extract( the_thread ); /* TODO: flash critical section? */ if ( _Thread_Is_heir( the_thread ) ) ffc0ab5c: 80 09 31 f4 lwz r0,12788(r9) ffc0ab60: 7f 83 00 00 cmpw cr7,r3,r0 ffc0ab64: 40 be 00 64 bne+ cr7,ffc0abc8 <_Scheduler_priority_Block+0xe0> 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 ); ffc0ab68: 3d 40 00 00 lis r10,0 * @param[in] the_thread - pointer to thread */ RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void) { _Thread_Heir = _Scheduler_priority_Ready_queue_first( (Chain_Control *) _Scheduler.information ffc0ab6c: 3d 20 00 00 lis r9,0 ffc0ab70: 80 0a 28 4c lwz r0,10316(r10) * * @param[in] the_thread - pointer to thread */ RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void) { _Thread_Heir = _Scheduler_priority_Ready_queue_first( ffc0ab74: 81 29 20 04 lwz r9,8196(r9) ffc0ab78: 7c 0b 00 34 cntlzw r11,r0 _Bitfield_Find_first_bit( _Priority_Bit_map[major], minor ); ffc0ab7c: 3d 00 00 00 lis r8,0 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 ); ffc0ab80: 90 0a 28 4c stw r0,10316(r10) _Bitfield_Find_first_bit( _Priority_Bit_map[major], minor ); ffc0ab84: 39 08 32 00 addi r8,r8,12800 ffc0ab88: 55 6a 10 3a rlwinm r10,r11,2,0,29 ffc0ab8c: 7c 08 50 2e lwzx r0,r8,r10 ffc0ab90: 7c 07 00 34 cntlzw r7,r0 ffc0ab94: 7c 08 51 2e stwx r0,r8,r10 return (_Priority_Bits_index( major ) << 4) + ffc0ab98: 55 60 20 36 rlwinm r0,r11,4,0,27 ffc0ab9c: 7c 00 3a 14 add r0,r0,r7 Chain_Control *the_ready_queue ) { Priority_Control index = _Priority_bit_map_Get_highest(); if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) ) ffc0aba0: 1c 00 00 0c mulli r0,r0,12 ffc0aba4: 7d 69 02 14 add r11,r9,r0 _Scheduler_priority_Schedule_body(); if ( _Thread_Is_executing( the_thread ) ) _Thread_Dispatch_necessary = true; } ffc0aba8: 7d 29 00 2e lwzx r9,r9,r0 RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); ffc0abac: 39 6b 00 04 addi r11,r11,4 ffc0abb0: 7f 89 58 00 cmpw cr7,r9,r11 return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] ); return NULL; ffc0abb4: 38 00 00 00 li r0,0 Chain_Control *the_ready_queue ) { Priority_Control index = _Priority_bit_map_Get_highest(); if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) ) ffc0abb8: 41 9e 00 08 beq- cr7,ffc0abc0 <_Scheduler_priority_Block+0xd8><== NEVER TAKEN return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] ); ffc0abbc: 7d 20 4b 78 mr r0,r9 * * @param[in] the_thread - pointer to thread */ RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void) { _Thread_Heir = _Scheduler_priority_Ready_queue_first( ffc0abc0: 3d 20 00 00 lis r9,0 ffc0abc4: 90 09 31 f4 stw r0,12788(r9) RTEMS_INLINE_ROUTINE bool _Thread_Is_executing ( const Thread_Control *the_thread ) { return ( the_thread == _Thread_Executing ); ffc0abc8: 3d 20 00 00 lis r9,0 ffc0abcc: 39 29 31 e4 addi r9,r9,12772 /* TODO: flash critical section? */ if ( _Thread_Is_heir( the_thread ) ) _Scheduler_priority_Schedule_body(); if ( _Thread_Is_executing( the_thread ) ) ffc0abd0: 80 09 00 0c lwz r0,12(r9) ffc0abd4: 7f 83 00 00 cmpw cr7,r3,r0 ffc0abd8: 4c be 00 20 bnelr+ cr7 _Thread_Dispatch_necessary = true; ffc0abdc: 38 00 00 01 li r0,1 ffc0abe0: 98 09 00 18 stb r0,24(r9) ffc0abe4: 4e 80 00 20 blr =============================================================================== ffc0ada0 <_Scheduler_priority_Schedule>: 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 ); ffc0ada0: 3d 40 00 00 lis r10,0 * @param[in] the_thread - pointer to thread */ RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void) { _Thread_Heir = _Scheduler_priority_Ready_queue_first( (Chain_Control *) _Scheduler.information ffc0ada4: 3d 20 00 00 lis r9,0 ffc0ada8: 80 0a 28 4c lwz r0,10316(r10) * * @param[in] the_thread - pointer to thread */ RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void) { _Thread_Heir = _Scheduler_priority_Ready_queue_first( ffc0adac: 81 29 20 04 lwz r9,8196(r9) ffc0adb0: 7c 0b 00 34 cntlzw r11,r0 _Bitfield_Find_first_bit( _Priority_Bit_map[major], minor ); ffc0adb4: 3d 00 00 00 lis r8,0 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 ); ffc0adb8: 90 0a 28 4c stw r0,10316(r10) _Bitfield_Find_first_bit( _Priority_Bit_map[major], minor ); ffc0adbc: 39 08 32 00 addi r8,r8,12800 ffc0adc0: 55 6a 10 3a rlwinm r10,r11,2,0,29 ffc0adc4: 7c 08 50 2e lwzx r0,r8,r10 ffc0adc8: 7c 07 00 34 cntlzw r7,r0 ffc0adcc: 7c 08 51 2e stwx r0,r8,r10 return (_Priority_Bits_index( major ) << 4) + ffc0add0: 55 60 20 36 rlwinm r0,r11,4,0,27 ffc0add4: 7c 00 3a 14 add r0,r0,r7 Chain_Control *the_ready_queue ) { Priority_Control index = _Priority_bit_map_Get_highest(); if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) ) ffc0add8: 1c 00 00 0c mulli r0,r0,12 ffc0addc: 7d 69 02 14 add r11,r9,r0 #include void _Scheduler_priority_Schedule(void) { _Scheduler_priority_Schedule_body(); } ffc0ade0: 7d 29 00 2e lwzx r9,r9,r0 RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); ffc0ade4: 39 6b 00 04 addi r11,r11,4 ffc0ade8: 7f 89 58 00 cmpw cr7,r9,r11 return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] ); return NULL; ffc0adec: 38 00 00 00 li r0,0 Chain_Control *the_ready_queue ) { Priority_Control index = _Priority_bit_map_Get_highest(); if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) ) ffc0adf0: 41 9e 00 08 beq- cr7,ffc0adf8 <_Scheduler_priority_Schedule+0x58><== NEVER TAKEN return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] ); ffc0adf4: 7d 20 4b 78 mr r0,r9 * * @param[in] the_thread - pointer to thread */ RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body(void) { _Thread_Heir = _Scheduler_priority_Ready_queue_first( ffc0adf8: 3d 20 00 00 lis r9,0 ffc0adfc: 90 09 31 f4 stw r0,12788(r9) ffc0ae00: 4e 80 00 20 blr =============================================================================== ffc08c0c <_TOD_Validate>: 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) || ffc08c0c: 2c 03 00 00 cmpwi r3,0 { uint32_t days_in_month; uint32_t ticks_per_second; ticks_per_second = TOD_MICROSECONDS_PER_SECOND / rtems_configuration_get_microseconds_per_tick(); ffc08c10: 3d 20 00 00 lis r9,0 ffc08c14: 81 29 20 fc lwz r9,8444(r9) (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; ffc08c18: 38 00 00 00 li r0,0 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) || ffc08c1c: 41 82 00 94 beq- ffc08cb0 <_TOD_Validate+0xa4> <== NEVER TAKEN ) { uint32_t days_in_month; uint32_t ticks_per_second; ticks_per_second = TOD_MICROSECONDS_PER_SECOND / ffc08c20: 3d 60 00 0f lis r11,15 ffc08c24: 61 6b 42 40 ori r11,r11,16960 ffc08c28: 7d 2b 4b 96 divwu r9,r11,r9 rtems_configuration_get_microseconds_per_tick(); if ((!the_tod) || ffc08c2c: 81 63 00 18 lwz r11,24(r3) ffc08c30: 7f 8b 48 40 cmplw cr7,r11,r9 ffc08c34: 40 9c 00 7c bge- cr7,ffc08cb0 <_TOD_Validate+0xa4> (the_tod->ticks >= ticks_per_second) || ffc08c38: 81 23 00 14 lwz r9,20(r3) ffc08c3c: 2b 89 00 3b cmplwi cr7,r9,59 ffc08c40: 41 9d 00 70 bgt- cr7,ffc08cb0 <_TOD_Validate+0xa4> (the_tod->second >= TOD_SECONDS_PER_MINUTE) || ffc08c44: 81 23 00 10 lwz r9,16(r3) ffc08c48: 2b 89 00 3b cmplwi cr7,r9,59 ffc08c4c: 41 9d 00 64 bgt- cr7,ffc08cb0 <_TOD_Validate+0xa4> (the_tod->minute >= TOD_MINUTES_PER_HOUR) || ffc08c50: 81 23 00 0c lwz r9,12(r3) ffc08c54: 2b 89 00 17 cmplwi cr7,r9,23 ffc08c58: 41 9d 00 58 bgt- cr7,ffc08cb0 <_TOD_Validate+0xa4> (the_tod->hour >= TOD_HOURS_PER_DAY) || (the_tod->month == 0) || ffc08c5c: 81 23 00 04 lwz r9,4(r3) 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) || ffc08c60: 2f 89 00 00 cmpwi cr7,r9,0 ffc08c64: 41 9e 00 4c beq- cr7,ffc08cb0 <_TOD_Validate+0xa4> <== NEVER TAKEN (the_tod->month == 0) || ffc08c68: 2b 89 00 0c cmplwi cr7,r9,12 ffc08c6c: 41 9d 00 44 bgt- cr7,ffc08cb0 <_TOD_Validate+0xa4> (the_tod->month > TOD_MONTHS_PER_YEAR) || (the_tod->year < TOD_BASE_YEAR) || ffc08c70: 81 43 00 00 lwz r10,0(r3) (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) || ffc08c74: 2b 8a 07 c3 cmplwi cr7,r10,1987 ffc08c78: 40 9d 00 38 ble- cr7,ffc08cb0 <_TOD_Validate+0xa4> (the_tod->year < TOD_BASE_YEAR) || (the_tod->day == 0) ) ffc08c7c: 81 63 00 08 lwz r11,8(r3) (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) || ffc08c80: 2f 8b 00 00 cmpwi cr7,r11,0 ffc08c84: 41 9e 00 2c beq- cr7,ffc08cb0 <_TOD_Validate+0xa4> <== NEVER TAKEN (the_tod->day == 0) ) return false; if ( (the_tod->year % 4) == 0 ) ffc08c88: 71 40 00 03 andi. r0,r10,3 ffc08c8c: 3d 40 ff c2 lis r10,-62 ffc08c90: 39 4a fc ac addi r10,r10,-852 ffc08c94: 40 82 00 08 bne- ffc08c9c <_TOD_Validate+0x90> days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ]; ffc08c98: 39 29 00 0d addi r9,r9,13 else days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ]; ffc08c9c: 55 29 10 3a rlwinm r9,r9,2,0,29 ffc08ca0: 7c 0a 48 2e lwzx r0,r10,r9 * false - if the the_tod is invalid * * NOTE: This routine only works for leap-years through 2099. */ bool _TOD_Validate( ffc08ca4: 7c 0b 00 10 subfc r0,r11,r0 ffc08ca8: 38 00 00 00 li r0,0 ffc08cac: 7c 00 01 14 adde r0,r0,r0 if ( the_tod->day > days_in_month ) return false; return true; } ffc08cb0: 7c 03 03 78 mr r3,r0 ffc08cb4: 4e 80 00 20 blr =============================================================================== ffc0b004 <_Thread_Change_priority>: void _Thread_Change_priority( Thread_Control *the_thread, Priority_Control new_priority, bool prepend_it ) { ffc0b004: 94 21 ff e0 stwu r1,-32(r1) ffc0b008: 7c 08 02 a6 mflr r0 ffc0b00c: 90 01 00 24 stw r0,36(r1) ffc0b010: bf 81 00 10 stmw r28,16(r1) ffc0b014: 7c 7f 1b 78 mr r31,r3 ffc0b018: 7c be 2b 78 mr r30,r5 States_Control state, original_state; /* * Save original state */ original_state = the_thread->current_state; ffc0b01c: 83 a3 00 10 lwz r29,16(r3) /* * 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 ); ffc0b020: 90 81 00 08 stw r4,8(r1) ffc0b024: 48 00 0e 5d bl ffc0be80 <_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 ) ffc0b028: 80 1f 00 14 lwz r0,20(r31) ffc0b02c: 80 81 00 08 lwz r4,8(r1) ffc0b030: 7f 80 20 00 cmpw cr7,r0,r4 ffc0b034: 41 9e 00 0c beq- cr7,ffc0b040 <_Thread_Change_priority+0x3c> _Thread_Set_priority( the_thread, new_priority ); ffc0b038: 7f e3 fb 78 mr r3,r31 ffc0b03c: 48 00 0d b9 bl ffc0bdf4 <_Thread_Set_priority> static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc0b040: 7f 80 00 a6 mfmsr r28 ffc0b044: 7c 10 42 a6 mfsprg r0,0 ffc0b048: 7f 80 00 78 andc r0,r28,r0 ffc0b04c: 7c 00 01 24 mtmsr r0 /* * 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; ffc0b050: 80 1f 00 10 lwz r0,16(r31) ffc0b054: 57 bd 07 7a rlwinm r29,r29,0,29,29 if ( state != STATES_TRANSIENT ) { ffc0b058: 2f 80 00 04 cmpwi cr7,r0,4 ffc0b05c: 41 9e 00 38 beq- cr7,ffc0b094 <_Thread_Change_priority+0x90> /* Only clear the transient state if it wasn't set already */ if ( ! _States_Is_transient( original_state ) ) ffc0b060: 2f 9d 00 00 cmpwi cr7,r29,0 ffc0b064: 40 9e 00 0c bne- cr7,ffc0b070 <_Thread_Change_priority+0x6c><== NEVER TAKEN RTEMS_INLINE_ROUTINE States_Control _States_Clear ( States_Control states_to_clear, States_Control current_state ) { return (current_state & ~states_to_clear); ffc0b068: 54 09 07 b8 rlwinm r9,r0,0,30,28 the_thread->current_state = _States_Clear( STATES_TRANSIENT, state ); ffc0b06c: 91 3f 00 10 stw r9,16(r31) return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc0b070: 7f 80 01 24 mtmsr r28 _ISR_Enable( level ); if ( _States_Is_waiting_on_thread_queue( state ) ) { ffc0b074: 3d 20 00 03 lis r9,3 ffc0b078: 61 29 be e0 ori r9,r9,48864 ffc0b07c: 7c 0b 48 39 and. r11,r0,r9 ffc0b080: 41 a2 00 94 beq+ ffc0b114 <_Thread_Change_priority+0x110> _Thread_queue_Requeue( the_thread->Wait.queue, the_thread ); ffc0b084: 80 7f 00 44 lwz r3,68(r31) ffc0b088: 7f e4 fb 78 mr r4,r31 ffc0b08c: 48 00 0c b1 bl ffc0bd3c <_Thread_queue_Requeue> ffc0b090: 48 00 00 84 b ffc0b114 <_Thread_Change_priority+0x110> } return; } /* Only clear the transient state if it wasn't set already */ if ( ! _States_Is_transient( original_state ) ) { ffc0b094: 2f 9d 00 00 cmpwi cr7,r29,0 ffc0b098: 40 9e 00 30 bne- cr7,ffc0b0c8 <_Thread_Change_priority+0xc4><== NEVER TAKEN * 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 ); if ( prepend_it ) ffc0b09c: 2f 9e 00 00 cmpwi cr7,r30,0 * 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 ); ffc0b0a0: 93 bf 00 10 stw r29,16(r31) ffc0b0a4: 3d 20 00 00 lis r9,0 ffc0b0a8: 39 29 20 04 addi r9,r9,8196 if ( prepend_it ) ffc0b0ac: 41 9e 00 0c beq- cr7,ffc0b0b8 <_Thread_Change_priority+0xb4> */ RTEMS_INLINE_ROUTINE void _Scheduler_Enqueue_first( Thread_Control *the_thread ) { _Scheduler.Operations.enqueue_first( the_thread ); ffc0b0b0: 80 09 00 28 lwz r0,40(r9) ffc0b0b4: 48 00 00 08 b ffc0b0bc <_Thread_Change_priority+0xb8> */ RTEMS_INLINE_ROUTINE void _Scheduler_Enqueue( Thread_Control *the_thread ) { _Scheduler.Operations.enqueue( the_thread ); ffc0b0b8: 80 09 00 24 lwz r0,36(r9) ffc0b0bc: 7f e3 fb 78 mr r3,r31 ffc0b0c0: 7c 09 03 a6 mtctr r0 ffc0b0c4: 4e 80 04 21 bctrl static inline void ppc_interrupt_flash( uint32_t level ) { uint32_t current_level; __asm__ volatile ( ffc0b0c8: 7c 00 00 a6 mfmsr r0 ffc0b0cc: 7f 80 01 24 mtmsr r28 ffc0b0d0: 7c 00 01 24 mtmsr r0 * 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(); ffc0b0d4: 3d 20 00 00 lis r9,0 ffc0b0d8: 80 09 20 0c lwz r0,8204(r9) ffc0b0dc: 7c 09 03 a6 mtctr r0 ffc0b0e0: 4e 80 04 21 bctrl * is also the heir thread, and false otherwise. */ RTEMS_INLINE_ROUTINE bool _Thread_Is_executing_also_the_heir( void ) { return ( _Thread_Executing == _Thread_Heir ); ffc0b0e4: 3d 20 00 00 lis r9,0 ffc0b0e8: 39 29 31 e4 addi r9,r9,12772 ffc0b0ec: 81 69 00 0c lwz r11,12(r9) * 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() && ffc0b0f0: 80 09 00 10 lwz r0,16(r9) ffc0b0f4: 7f 8b 00 00 cmpw cr7,r11,r0 ffc0b0f8: 41 9e 00 18 beq- cr7,ffc0b110 <_Thread_Change_priority+0x10c> ffc0b0fc: 88 0b 00 74 lbz r0,116(r11) ffc0b100: 2f 80 00 00 cmpwi cr7,r0,0 ffc0b104: 41 9e 00 0c beq- cr7,ffc0b110 <_Thread_Change_priority+0x10c> _Thread_Executing->is_preemptible ) _Thread_Dispatch_necessary = true; ffc0b108: 38 00 00 01 li r0,1 ffc0b10c: 98 09 00 18 stb r0,24(r9) return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc0b110: 7f 80 01 24 mtmsr r28 _ISR_Enable( level ); } ffc0b114: 39 61 00 20 addi r11,r1,32 ffc0b118: 48 00 e0 8c b ffc191a4 <_restgpr_28_x> =============================================================================== ffc0b328 <_Thread_Delay_ended>: void _Thread_Delay_ended( Objects_Id id, void *ignored __attribute__((unused)) ) { ffc0b328: 94 21 ff e8 stwu r1,-24(r1) ffc0b32c: 7c 08 02 a6 mflr r0 Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); ffc0b330: 38 81 00 08 addi r4,r1,8 void _Thread_Delay_ended( Objects_Id id, void *ignored __attribute__((unused)) ) { ffc0b334: 90 01 00 1c stw r0,28(r1) Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); ffc0b338: 48 00 01 b5 bl ffc0b4ec <_Thread_Get> switch ( location ) { ffc0b33c: 80 01 00 08 lwz r0,8(r1) ffc0b340: 2f 80 00 00 cmpwi cr7,r0,0 ffc0b344: 40 9e 00 20 bne- cr7,ffc0b364 <_Thread_Delay_ended+0x3c><== NEVER TAKEN #if defined(RTEMS_MULTIPROCESSING) case OBJECTS_REMOTE: /* impossible */ #endif break; case OBJECTS_LOCAL: _Thread_Clear_state( ffc0b348: 3c 80 10 00 lis r4,4096 ffc0b34c: 60 84 00 18 ori r4,r4,24 ffc0b350: 4b ff fd cd bl ffc0b11c <_Thread_Clear_state> ffc0b354: 3d 20 00 00 lis r9,0 ffc0b358: 81 69 28 04 lwz r11,10244(r9) ffc0b35c: 38 0b ff ff addi r0,r11,-1 ffc0b360: 90 09 28 04 stw r0,10244(r9) | STATES_INTERRUPTIBLE_BY_SIGNAL ); _Thread_Unnest_dispatch(); break; } } ffc0b364: 80 01 00 1c lwz r0,28(r1) ffc0b368: 38 21 00 18 addi r1,r1,24 ffc0b36c: 7c 08 03 a6 mtlr r0 ffc0b370: 4e 80 00 20 blr =============================================================================== ffc0b374 <_Thread_Dispatch>: * dispatch thread * no dispatch thread */ void _Thread_Dispatch( void ) { ffc0b374: 94 21 ff b8 stwu r1,-72(r1) ffc0b378: 7c 08 02 a6 mflr r0 ffc0b37c: be a1 00 1c stmw r21,28(r1) Thread_Control *executing; Thread_Control *heir; ISR_Level level; executing = _Thread_Executing; ffc0b380: 3f 40 00 00 lis r26,0 ffc0b384: 39 3a 31 e4 addi r9,r26,12772 * dispatch thread * no dispatch thread */ void _Thread_Dispatch( void ) { ffc0b388: 90 01 00 4c stw r0,76(r1) Thread_Control *executing; Thread_Control *heir; ISR_Level level; executing = _Thread_Executing; ffc0b38c: 83 e9 00 0c lwz r31,12(r9) static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc0b390: 7c 00 00 a6 mfmsr r0 ffc0b394: 7d 30 42 a6 mfsprg r9,0 ffc0b398: 7c 09 48 78 andc r9,r0,r9 ffc0b39c: 7d 20 01 24 mtmsr r9 #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ { Timestamp_Control uptime, ran; _TOD_Get_uptime( &uptime ); _Timestamp_Subtract( ffc0b3a0: 3f 80 00 00 lis r28,0 executing = _Thread_Executing; _ISR_Disable( level ); while ( _Thread_Dispatch_necessary == true ) { heir = _Thread_Heir; _Thread_Dispatch_disable_level = 1; ffc0b3a4: 3e a0 00 00 lis r21,0 ffc0b3a8: 3a c0 00 01 li r22,1 _Thread_Dispatch_necessary = false; ffc0b3ac: 3a e0 00 00 li r23,0 #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 ) heir->cpu_time_budget = _Thread_Ticks_per_timeslice; ffc0b3b0: 3f 00 00 00 lis r24,0 _ISR_Enable( level ); #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ { Timestamp_Control uptime, ran; _TOD_Get_uptime( &uptime ); ffc0b3b4: 3b 61 00 08 addi r27,r1,8 _Timestamp_Subtract( ffc0b3b8: 3b 9c 28 34 addi r28,r28,10292 ffc0b3bc: 3b a1 00 10 addi r29,r1,16 #endif /* * Switch libc's task specific data. */ if ( _Thread_libc_reent ) { ffc0b3c0: 3f 20 00 00 lis r25,0 Thread_Control *heir; ISR_Level level; executing = _Thread_Executing; _ISR_Disable( level ); while ( _Thread_Dispatch_necessary == true ) { ffc0b3c4: 48 00 00 dc b ffc0b4a0 <_Thread_Dispatch+0x12c> heir = _Thread_Heir; ffc0b3c8: 83 c9 00 10 lwz r30,16(r9) _Thread_Dispatch_disable_level = 1; ffc0b3cc: 92 d5 28 04 stw r22,10244(r21) /* * 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 ) ffc0b3d0: 7f 9e f8 00 cmpw cr7,r30,r31 executing = _Thread_Executing; _ISR_Disable( level ); while ( _Thread_Dispatch_necessary == true ) { heir = _Thread_Heir; _Thread_Dispatch_disable_level = 1; _Thread_Dispatch_necessary = false; ffc0b3d4: 9a e9 00 18 stb r23,24(r9) _Thread_Executing = heir; ffc0b3d8: 93 c9 00 0c stw r30,12(r9) /* * 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 ) ffc0b3dc: 41 9e 00 d4 beq- cr7,ffc0b4b0 <_Thread_Dispatch+0x13c> */ #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 ) ffc0b3e0: 81 3e 00 7c lwz r9,124(r30) ffc0b3e4: 2f 89 00 01 cmpwi cr7,r9,1 ffc0b3e8: 40 be 00 0c bne+ cr7,ffc0b3f4 <_Thread_Dispatch+0x80> heir->cpu_time_budget = _Thread_Ticks_per_timeslice; ffc0b3ec: 81 38 28 00 lwz r9,10240(r24) ffc0b3f0: 91 3e 00 78 stw r9,120(r30) return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc0b3f4: 7c 00 01 24 mtmsr r0 _ISR_Enable( level ); #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ { Timestamp_Control uptime, ran; _TOD_Get_uptime( &uptime ); ffc0b3f8: 7f 63 db 78 mr r3,r27 ffc0b3fc: 48 00 6a 19 bl ffc11e14 <_TOD_Get_uptime> _Timestamp_Subtract( ffc0b400: 7f 83 e3 78 mr r3,r28 ffc0b404: 7f 64 db 78 mr r4,r27 ffc0b408: 7f a5 eb 78 mr r5,r29 ffc0b40c: 48 00 0c ad bl ffc0c0b8 <_Timespec_Subtract> &_Thread_Time_of_last_context_switch, &uptime, &ran ); _Timestamp_Add_to( &executing->cpu_time_used, &ran ); ffc0b410: 38 7f 00 84 addi r3,r31,132 ffc0b414: 7f a4 eb 78 mr r4,r29 ffc0b418: 48 00 0c 45 bl ffc0c05c <_Timespec_Add_to> _Thread_Time_of_last_context_switch = uptime; ffc0b41c: 81 21 00 08 lwz r9,8(r1) ffc0b420: 81 41 00 0c lwz r10,12(r1) ffc0b424: 91 3c 00 00 stw r9,0(r28) #endif /* * Switch libc's task specific data. */ if ( _Thread_libc_reent ) { ffc0b428: 81 39 28 18 lwz r9,10264(r25) &_Thread_Time_of_last_context_switch, &uptime, &ran ); _Timestamp_Add_to( &executing->cpu_time_used, &ran ); _Thread_Time_of_last_context_switch = uptime; ffc0b42c: 91 5c 00 04 stw r10,4(r28) #endif /* * Switch libc's task specific data. */ if ( _Thread_libc_reent ) { ffc0b430: 2f 89 00 00 cmpwi cr7,r9,0 ffc0b434: 41 9e 00 14 beq- cr7,ffc0b448 <_Thread_Dispatch+0xd4> <== NEVER TAKEN executing->libc_reent = *_Thread_libc_reent; ffc0b438: 80 09 00 00 lwz r0,0(r9) ffc0b43c: 90 1f 01 2c stw r0,300(r31) *_Thread_libc_reent = heir->libc_reent; ffc0b440: 80 1e 01 2c lwz r0,300(r30) ffc0b444: 90 09 00 00 stw r0,0(r9) } _User_extensions_Thread_switch( executing, heir ); ffc0b448: 7f e3 fb 78 mr r3,r31 ffc0b44c: 7f c4 f3 78 mr r4,r30 ffc0b450: 48 00 0f 95 bl ffc0c3e4 <_User_extensions_Thread_switch> * operations. */ #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) #if ( CPU_USE_DEFERRED_FP_SWITCH != TRUE ) if ( executing->fp_context != NULL ) ffc0b454: 80 1f 01 28 lwz r0,296(r31) ffc0b458: 2f 80 00 00 cmpwi cr7,r0,0 ffc0b45c: 41 9e 00 0c beq- cr7,ffc0b468 <_Thread_Dispatch+0xf4> _Context_Save_fp( &executing->fp_context ); ffc0b460: 38 7f 01 28 addi r3,r31,296 ffc0b464: 48 00 de 1d bl ffc19280 <_CPU_Context_save_fp> #endif #endif _Context_Switch( &executing->Registers, &heir->Registers ); ffc0b468: 38 7f 00 c8 addi r3,r31,200 ffc0b46c: 38 9e 00 c8 addi r4,r30,200 ffc0b470: 48 00 df 91 bl ffc19400 <_CPU_Context_switch> _Context_Save_fp( &_Thread_Allocated_fp->fp_context ); _Context_Restore_fp( &executing->fp_context ); _Thread_Allocated_fp = executing; } #else if ( executing->fp_context != NULL ) ffc0b474: 80 1f 01 28 lwz r0,296(r31) ffc0b478: 2f 80 00 00 cmpwi cr7,r0,0 ffc0b47c: 41 9e 00 0c beq- cr7,ffc0b488 <_Thread_Dispatch+0x114> _Context_Restore_fp( &executing->fp_context ); ffc0b480: 38 7f 01 28 addi r3,r31,296 ffc0b484: 48 00 de bd bl ffc19340 <_CPU_Context_restore_fp> #endif #endif executing = _Thread_Executing; ffc0b488: 39 3a 31 e4 addi r9,r26,12772 ffc0b48c: 83 e9 00 0c lwz r31,12(r9) static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc0b490: 7c 00 00 a6 mfmsr r0 ffc0b494: 7d 30 42 a6 mfsprg r9,0 ffc0b498: 7c 09 48 78 andc r9,r0,r9 ffc0b49c: 7d 20 01 24 mtmsr r9 Thread_Control *heir; ISR_Level level; executing = _Thread_Executing; _ISR_Disable( level ); while ( _Thread_Dispatch_necessary == true ) { ffc0b4a0: 39 3a 31 e4 addi r9,r26,12772 ffc0b4a4: 89 69 00 18 lbz r11,24(r9) ffc0b4a8: 2f 8b 00 00 cmpwi cr7,r11,0 ffc0b4ac: 40 9e ff 1c bne+ cr7,ffc0b3c8 <_Thread_Dispatch+0x54> _ISR_Disable( level ); } post_switch: _Thread_Dispatch_disable_level = 0; ffc0b4b0: 39 60 00 00 li r11,0 ffc0b4b4: 3d 20 00 00 lis r9,0 ffc0b4b8: 91 69 28 04 stw r11,10244(r9) return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc0b4bc: 7c 00 01 24 mtmsr r0 _ISR_Enable( level ); _API_extensions_Run_postswitch(); ffc0b4c0: 4b ff e1 19 bl ffc095d8 <_API_extensions_Run_postswitch> } ffc0b4c4: 39 61 00 48 addi r11,r1,72 ffc0b4c8: 48 00 dc c0 b ffc19188 <_restgpr_21_x> =============================================================================== ffc140a8 <_Thread_Handler>: * * Output parameters: NONE */ void _Thread_Handler( void ) { ffc140a8: 94 21 ff f0 stwu r1,-16(r1) ffc140ac: 7c 08 02 a6 mflr r0 #if defined(EXECUTE_GLOBAL_CONSTRUCTORS) static char doneConstructors; char doneCons; #endif executing = _Thread_Executing; ffc140b0: 3d 20 00 00 lis r9,0 * * Output parameters: NONE */ void _Thread_Handler( void ) { ffc140b4: 90 01 00 14 stw r0,20(r1) ffc140b8: bf c1 00 08 stmw r30,8(r1) #if defined(EXECUTE_GLOBAL_CONSTRUCTORS) static char doneConstructors; char doneCons; #endif executing = _Thread_Executing; ffc140bc: 83 e9 31 f0 lwz r31,12784(r9) /* * have to put level into a register for those cpu's that use * inline asm here */ level = executing->Start.isr_level; ffc140c0: 81 3f 00 ac lwz r9,172(r31) } static inline void _CPU_ISR_Set_level( uint32_t level ) { register unsigned int msr; _CPU_MSR_GET(msr); ffc140c4: 38 00 00 00 li r0,0 ffc140c8: 7c 00 00 a6 mfmsr r0 if (!(level & CPU_MODES_INTERRUPT_MASK)) { ffc140cc: 71 2b 00 01 andi. r11,r9,1 ffc140d0: 40 82 00 10 bne- ffc140e0 <_Thread_Handler+0x38> static inline uint32_t ppc_interrupt_get_disable_mask( void ) { uint32_t mask; __asm__ volatile ( ffc140d4: 7d 30 42 a6 mfsprg r9,0 msr |= ppc_interrupt_get_disable_mask(); ffc140d8: 7d 20 03 78 or r0,r9,r0 ffc140dc: 48 00 00 0c b ffc140e8 <_Thread_Handler+0x40> ffc140e0: 7d 30 42 a6 mfsprg r9,0 } else { msr &= ~ppc_interrupt_get_disable_mask(); ffc140e4: 7c 00 48 78 andc r0,r0,r9 } _CPU_MSR_SET(msr); ffc140e8: 7c 00 01 24 mtmsr r0 _ISR_Set_level(level); #if defined(EXECUTE_GLOBAL_CONSTRUCTORS) doneCons = doneConstructors; ffc140ec: 3d 20 00 00 lis r9,0 ffc140f0: 8b c9 2a 98 lbz r30,10904(r9) doneConstructors = 1; ffc140f4: 38 00 00 01 li r0,1 /* * 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 ); ffc140f8: 7f e3 fb 78 mr r3,r31 level = executing->Start.isr_level; _ISR_Set_level(level); #if defined(EXECUTE_GLOBAL_CONSTRUCTORS) doneCons = doneConstructors; doneConstructors = 1; ffc140fc: 98 09 2a 98 stb r0,10904(r9) /* * 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 ); ffc14100: 4b ff 80 b1 bl ffc0c1b0 <_User_extensions_Thread_begin> /* * At this point, the dispatch disable level BETTER be 1. */ _Thread_Enable_dispatch(); ffc14104: 4b ff 73 c9 bl ffc0b4cc <_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) */ { ffc14108: 2f 9e 00 00 cmpwi cr7,r30,0 ffc1410c: 40 be 00 08 bne+ cr7,ffc14114 <_Thread_Handler+0x6c> INIT_NAME (); ffc14110: 48 00 5d cd bl ffc19edc <_init> } #endif if ( executing->Start.prototype == THREAD_START_NUMERIC ) { ffc14114: 80 1f 00 94 lwz r0,148(r31) ffc14118: 2f 80 00 00 cmpwi cr7,r0,0 ffc1411c: 40 be 00 10 bne+ cr7,ffc1412c <_Thread_Handler+0x84> executing->Wait.return_argument = (*(Thread_Entry_numeric) executing->Start.entry_point)( ffc14120: 80 1f 00 90 lwz r0,144(r31) ffc14124: 80 7f 00 9c lwz r3,156(r31) ffc14128: 48 00 00 14 b ffc1413c <_Thread_Handler+0x94> executing->Start.numeric_argument ); } #if defined(RTEMS_POSIX_API) else if ( executing->Start.prototype == THREAD_START_POINTER ) { ffc1412c: 2f 80 00 01 cmpwi cr7,r0,1 ffc14130: 40 be 00 18 bne+ cr7,ffc14148 <_Thread_Handler+0xa0> <== NEVER TAKEN executing->Wait.return_argument = (*(Thread_Entry_pointer) executing->Start.entry_point)( ffc14134: 80 1f 00 90 lwz r0,144(r31) ffc14138: 80 7f 00 98 lwz r3,152(r31) ffc1413c: 7c 09 03 a6 mtctr r0 ffc14140: 4e 80 04 21 bctrl executing->Start.numeric_argument ); } #if defined(RTEMS_POSIX_API) else if ( executing->Start.prototype == THREAD_START_POINTER ) { executing->Wait.return_argument = ffc14144: 90 7f 00 28 stw r3,40(r31) * 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 ); ffc14148: 7f e3 fb 78 mr r3,r31 ffc1414c: 4b ff 80 b9 bl ffc0c204 <_User_extensions_Thread_exitted> _Internal_error_Occurred( ffc14150: 38 60 00 00 li r3,0 ffc14154: 38 80 00 01 li r4,1 ffc14158: 38 a0 00 05 li r5,5 ffc1415c: 4b ff 5f 69 bl ffc0a0c4 <_Internal_error_Occurred> =============================================================================== ffc0b598 <_Thread_Initialize>: Thread_CPU_budget_algorithms budget_algorithm, Thread_CPU_budget_algorithm_callout budget_callout, uint32_t isr_level, Objects_Name name ) { ffc0b598: 94 21 ff d0 stwu r1,-48(r1) ffc0b59c: 7c 08 02 a6 mflr r0 ffc0b5a0: be e1 00 0c stmw r23,12(r1) if ( !actual_stack_size || actual_stack_size < stack_size ) return false; /* stack allocation failed */ stack = the_thread->Start.stack; #else if ( !stack_area ) { ffc0b5a4: 7c b7 2b 79 mr. r23,r5 Thread_CPU_budget_algorithms budget_algorithm, Thread_CPU_budget_algorithm_callout budget_callout, uint32_t isr_level, Objects_Name name ) { ffc0b5a8: 7d 3a 4b 78 mr r26,r9 ffc0b5ac: 90 01 00 34 stw r0,52(r1) /* * Zero out all the allocated memory fields */ for ( i=0 ; i <= THREAD_API_LAST ; i++ ) the_thread->API_Extensions[i] = NULL; ffc0b5b0: 38 00 00 00 li r0,0 Thread_CPU_budget_algorithms budget_algorithm, Thread_CPU_budget_algorithm_callout budget_callout, uint32_t isr_level, Objects_Name name ) { ffc0b5b4: 7c 7e 1b 78 mr r30,r3 ffc0b5b8: 81 21 00 40 lwz r9,64(r1) ffc0b5bc: 7c 9f 23 78 mr r31,r4 ffc0b5c0: 7c dd 33 78 mr r29,r6 /* * Zero out all the allocated memory fields */ for ( i=0 ; i <= THREAD_API_LAST ; i++ ) the_thread->API_Extensions[i] = NULL; ffc0b5c4: 90 04 01 30 stw r0,304(r4) Thread_CPU_budget_algorithms budget_algorithm, Thread_CPU_budget_algorithm_callout budget_callout, uint32_t isr_level, Objects_Name name ) { ffc0b5c8: 7c fc 3b 78 mr r28,r7 ffc0b5cc: 7d 1b 43 78 mr r27,r8 ffc0b5d0: 83 09 00 00 lwz r24,0(r9) ffc0b5d4: 7d 59 53 78 mr r25,r10 /* * Zero out all the allocated memory fields */ for ( i=0 ; i <= THREAD_API_LAST ; i++ ) the_thread->API_Extensions[i] = NULL; ffc0b5d8: 90 04 01 34 stw r0,308(r4) extensions_area = NULL; the_thread->libc_reent = NULL; ffc0b5dc: 90 04 01 2c stw r0,300(r4) if ( !actual_stack_size || actual_stack_size < stack_size ) return false; /* stack allocation failed */ stack = the_thread->Start.stack; #else if ( !stack_area ) { ffc0b5e0: 40 a2 00 38 bne+ ffc0b618 <_Thread_Initialize+0x80> actual_stack_size = _Thread_Stack_Allocate( the_thread, stack_size ); ffc0b5e4: 7c 83 23 78 mr r3,r4 ffc0b5e8: 7c c4 33 78 mr r4,r6 ffc0b5ec: 48 00 08 e9 bl ffc0bed4 <_Thread_Stack_Allocate> if ( !actual_stack_size || actual_stack_size < stack_size ) return false; /* stack allocation failed */ ffc0b5f0: 38 00 00 00 li r0,0 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 ) ffc0b5f4: 2c 03 00 00 cmpwi r3,0 ffc0b5f8: 41 82 01 ac beq- ffc0b7a4 <_Thread_Initialize+0x20c> ffc0b5fc: 7f 83 e8 40 cmplw cr7,r3,r29 return false; /* stack allocation failed */ ffc0b600: 7e e0 bb 78 mr r0,r23 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 ) ffc0b604: 41 9c 01 a0 blt- cr7,ffc0b7a4 <_Thread_Initialize+0x20c><== NEVER TAKEN return false; /* stack allocation failed */ stack = the_thread->Start.stack; the_thread->Start.core_allocated_stack = true; ffc0b608: 38 00 00 01 li r0,1 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 */ stack = the_thread->Start.stack; ffc0b60c: 82 ff 00 c4 lwz r23,196(r31) the_thread->Start.core_allocated_stack = true; ffc0b610: 98 1f 00 b4 stb r0,180(r31) ffc0b614: 48 00 00 0c b ffc0b620 <_Thread_Initialize+0x88> } else { stack = stack_area; actual_stack_size = stack_size; the_thread->Start.core_allocated_stack = false; ffc0b618: 98 04 00 b4 stb r0,180(r4) ffc0b61c: 7c c3 33 78 mr r3,r6 /* * Allocate the floating point area for this thread */ #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) if ( is_fp ) { ffc0b620: 2f 9c 00 00 cmpwi cr7,r28,0 Stack_Control *the_stack, void *starting_address, size_t size ) { the_stack->area = starting_address; ffc0b624: 92 ff 00 bc stw r23,188(r31) extensions_area = NULL; the_thread->libc_reent = NULL; #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) fp_area = NULL; ffc0b628: 3a e0 00 00 li r23,0 the_stack->size = size; ffc0b62c: 90 7f 00 b8 stw r3,184(r31) /* * Allocate the floating point area for this thread */ #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) if ( is_fp ) { ffc0b630: 41 be 00 14 beq+ cr7,ffc0b644 <_Thread_Initialize+0xac> fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE ); ffc0b634: 38 60 01 08 li r3,264 ffc0b638: 48 00 10 75 bl ffc0c6ac <_Workspace_Allocate> if ( !fp_area ) ffc0b63c: 7c 77 1b 79 mr. r23,r3 ffc0b640: 41 82 01 20 beq- ffc0b760 <_Thread_Initialize+0x1c8> #endif /* * Allocate the extensions area for this thread */ if ( _Thread_Maximum_extensions ) { ffc0b644: 3d 20 00 00 lis r9,0 fp_area = _Workspace_Allocate( CONTEXT_FP_SIZE ); if ( !fp_area ) goto failed; fp_area = _Context_Fp_start( fp_area, 0 ); } the_thread->fp_context = fp_area; ffc0b648: 92 ff 01 28 stw r23,296(r31) Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; ffc0b64c: 38 00 00 00 li r0,0 #endif /* * Allocate the extensions area for this thread */ if ( _Thread_Maximum_extensions ) { ffc0b650: 80 69 28 24 lwz r3,10276(r9) * Zero out all the allocated memory fields */ for ( i=0 ; i <= THREAD_API_LAST ; i++ ) the_thread->API_Extensions[i] = NULL; extensions_area = NULL; ffc0b654: 3b a0 00 00 li r29,0 if ( !fp_area ) goto failed; fp_area = _Context_Fp_start( fp_area, 0 ); } the_thread->fp_context = fp_area; the_thread->Start.fp_context = fp_area; ffc0b658: 92 ff 00 c0 stw r23,192(r31) #endif /* * Allocate the extensions area for this thread */ if ( _Thread_Maximum_extensions ) { ffc0b65c: 2f 83 00 00 cmpwi cr7,r3,0 ffc0b660: 90 1f 00 50 stw r0,80(r31) the_watchdog->routine = routine; ffc0b664: 90 1f 00 64 stw r0,100(r31) the_watchdog->id = id; ffc0b668: 90 1f 00 68 stw r0,104(r31) the_watchdog->user_data = user_data; ffc0b66c: 90 1f 00 6c stw r0,108(r31) ffc0b670: 41 be 00 18 beq+ cr7,ffc0b688 <_Thread_Initialize+0xf0> extensions_area = _Workspace_Allocate( ffc0b674: 38 63 00 01 addi r3,r3,1 ffc0b678: 54 63 10 3a rlwinm r3,r3,2,0,29 ffc0b67c: 48 00 10 31 bl ffc0c6ac <_Workspace_Allocate> (_Thread_Maximum_extensions + 1) * sizeof( void * ) ); if ( !extensions_area ) ffc0b680: 7c 7d 1b 79 mr. r29,r3 ffc0b684: 41 82 00 e0 beq- ffc0b764 <_Thread_Initialize+0x1cc> * 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 ) { ffc0b688: 2f 9d 00 00 cmpwi cr7,r29,0 (_Thread_Maximum_extensions + 1) * sizeof( void * ) ); if ( !extensions_area ) goto failed; } the_thread->extensions = (void **) extensions_area; ffc0b68c: 93 bf 01 38 stw r29,312(r31) * 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 ) { ffc0b690: 41 9e 00 2c beq- cr7,ffc0b6bc <_Thread_Initialize+0x124> for ( i = 0; i <= _Thread_Maximum_extensions ; i++ ) ffc0b694: 3d 20 00 00 lis r9,0 ffc0b698: 81 49 28 24 lwz r10,10276(r9) * all memory associated with this thread. It completes by adding * the thread to the local object table so operations on this * thread id are allowed. */ bool _Thread_Initialize( ffc0b69c: 39 7d ff fc addi r11,r29,-4 ffc0b6a0: 39 20 00 00 li r9,0 * so they cannot rely on the thread create user extension * call. */ if ( the_thread->extensions ) { for ( i = 0; i <= _Thread_Maximum_extensions ; i++ ) the_thread->extensions[i] = NULL; ffc0b6a4: 38 00 00 00 li r0,0 ffc0b6a8: 48 00 00 0c b ffc0b6b4 <_Thread_Initialize+0x11c> ffc0b6ac: 94 0b 00 04 stwu r0,4(r11) * 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++ ) ffc0b6b0: 39 29 00 01 addi r9,r9,1 ffc0b6b4: 7f 89 50 40 cmplw cr7,r9,r10 ffc0b6b8: 40 9d ff f4 ble+ cr7,ffc0b6ac <_Thread_Initialize+0x114> the_thread->Start.is_preemptible = is_preemptible; the_thread->Start.budget_algorithm = budget_algorithm; the_thread->Start.budget_callout = budget_callout; switch ( budget_algorithm ) { ffc0b6bc: 2f 99 00 02 cmpwi cr7,r25,2 * General initialization */ the_thread->Start.is_preemptible = is_preemptible; the_thread->Start.budget_algorithm = budget_algorithm; the_thread->Start.budget_callout = budget_callout; ffc0b6c0: 80 01 00 38 lwz r0,56(r1) /* * General initialization */ the_thread->Start.is_preemptible = is_preemptible; ffc0b6c4: 9b 5f 00 a0 stb r26,160(r31) the_thread->Start.budget_algorithm = budget_algorithm; ffc0b6c8: 93 3f 00 a4 stw r25,164(r31) the_thread->Start.budget_callout = budget_callout; ffc0b6cc: 90 1f 00 a8 stw r0,168(r31) switch ( budget_algorithm ) { ffc0b6d0: 40 be 00 10 bne+ cr7,ffc0b6e0 <_Thread_Initialize+0x148> 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; ffc0b6d4: 3d 20 00 00 lis r9,0 ffc0b6d8: 80 09 28 00 lwz r0,10240(r9) ffc0b6dc: 90 1f 00 78 stw r0,120(r31) case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT: break; #endif } the_thread->Start.isr_level = isr_level; ffc0b6e0: 80 01 00 3c lwz r0,60(r1) */ RTEMS_INLINE_ROUTINE void* _Scheduler_Allocate( Thread_Control *the_thread ) { return _Scheduler.Operations.allocate( the_thread ); ffc0b6e4: 3d 20 00 00 lis r9,0 the_thread->current_state = STATES_DORMANT; the_thread->Wait.queue = NULL; ffc0b6e8: 3b 80 00 00 li r28,0 the_thread->resource_count = 0; the_thread->real_priority = priority; ffc0b6ec: 93 7f 00 18 stw r27,24(r31) ffc0b6f0: 7f e3 fb 78 mr r3,r31 case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT: break; #endif } the_thread->Start.isr_level = isr_level; ffc0b6f4: 90 1f 00 ac stw r0,172(r31) the_thread->current_state = STATES_DORMANT; ffc0b6f8: 38 00 00 01 li r0,1 ffc0b6fc: 90 1f 00 10 stw r0,16(r31) ffc0b700: 80 09 20 1c lwz r0,8220(r9) the_thread->Wait.queue = NULL; ffc0b704: 93 9f 00 44 stw r28,68(r31) ffc0b708: 7c 09 03 a6 mtctr r0 the_thread->resource_count = 0; ffc0b70c: 93 9f 00 1c stw r28,28(r31) the_thread->real_priority = priority; the_thread->Start.initial_priority = priority; ffc0b710: 93 7f 00 b0 stw r27,176(r31) ffc0b714: 4e 80 04 21 bctrl sched =_Scheduler_Allocate( the_thread ); if ( !sched ) ffc0b718: 7c 7a 1b 79 mr. r26,r3 ffc0b71c: 41 82 00 4c beq- ffc0b768 <_Thread_Initialize+0x1d0> goto failed; _Thread_Set_priority( the_thread, priority ); ffc0b720: 7f e3 fb 78 mr r3,r31 ffc0b724: 7f 64 db 78 mr r4,r27 ffc0b728: 48 00 06 cd bl ffc0bdf4 <_Thread_Set_priority> Objects_Information *information, Objects_Control *the_object, Objects_Name name ) { _Objects_Set_local_object( ffc0b72c: a0 1f 00 0a lhz r0,10(r31) _Workspace_Free( sched ); _Thread_Stack_Free( the_thread ); return false; } ffc0b730: 81 3e 00 1c lwz r9,28(r30) * 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 ); ffc0b734: 7f e3 fb 78 mr r3,r31 #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; ffc0b738: 54 00 10 3a rlwinm r0,r0,2,0,29 /* * Initialize the CPU usage statistics */ #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ _Timestamp_Set_to_zero( &the_thread->cpu_time_used ); ffc0b73c: 93 9f 00 84 stw r28,132(r31) ffc0b740: 93 9f 00 88 stw r28,136(r31) ffc0b744: 7f e9 01 2e stwx r31,r9,r0 information, _Objects_Get_index( the_object->id ), the_object ); the_object->name = name; ffc0b748: 93 1f 00 0c stw r24,12(r31) * 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 ); ffc0b74c: 48 00 0b 69 bl ffc0c2b4 <_User_extensions_Thread_create> if ( extension_status ) return true; ffc0b750: 38 00 00 01 li r0,1 * 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 ) ffc0b754: 2f 83 00 00 cmpwi cr7,r3,0 ffc0b758: 41 be 00 10 beq+ cr7,ffc0b768 <_Thread_Initialize+0x1d0> ffc0b75c: 48 00 00 48 b ffc0b7a4 <_Thread_Initialize+0x20c> * Zero out all the allocated memory fields */ for ( i=0 ; i <= THREAD_API_LAST ; i++ ) the_thread->API_Extensions[i] = NULL; extensions_area = NULL; ffc0b760: 3b a0 00 00 li r29,0 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; ffc0b764: 3b 40 00 00 li r26,0 extension_status = _User_extensions_Thread_create( the_thread ); if ( extension_status ) return true; failed: _Workspace_Free( the_thread->libc_reent ); ffc0b768: 80 7f 01 2c lwz r3,300(r31) ffc0b76c: 48 00 0f 75 bl ffc0c6e0 <_Workspace_Free> for ( i=0 ; i <= THREAD_API_LAST ; i++ ) _Workspace_Free( the_thread->API_Extensions[i] ); ffc0b770: 80 7f 01 30 lwz r3,304(r31) ffc0b774: 48 00 0f 6d bl ffc0c6e0 <_Workspace_Free> ffc0b778: 80 7f 01 34 lwz r3,308(r31) ffc0b77c: 48 00 0f 65 bl ffc0c6e0 <_Workspace_Free> _Workspace_Free( extensions_area ); ffc0b780: 7f a3 eb 78 mr r3,r29 ffc0b784: 48 00 0f 5d bl ffc0c6e0 <_Workspace_Free> #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) _Workspace_Free( fp_area ); ffc0b788: 7e e3 bb 78 mr r3,r23 ffc0b78c: 48 00 0f 55 bl ffc0c6e0 <_Workspace_Free> #endif _Workspace_Free( sched ); ffc0b790: 7f 43 d3 78 mr r3,r26 ffc0b794: 48 00 0f 4d bl ffc0c6e0 <_Workspace_Free> _Thread_Stack_Free( the_thread ); ffc0b798: 7f e3 fb 78 mr r3,r31 ffc0b79c: 48 00 07 ad bl ffc0bf48 <_Thread_Stack_Free> return false; ffc0b7a0: 38 00 00 00 li r0,0 } ffc0b7a4: 39 61 00 30 addi r11,r1,48 ffc0b7a8: 7c 03 03 78 mr r3,r0 ffc0b7ac: 48 00 d9 e4 b ffc19190 <_restgpr_23_x> =============================================================================== ffc0ba54 <_Thread_Restart>: bool _Thread_Restart( Thread_Control *the_thread, void *pointer_argument, Thread_Entry_numeric_type numeric_argument ) { ffc0ba54: 7c 2b 0b 78 mr r11,r1 ffc0ba58: 7c 08 02 a6 mflr r0 ffc0ba5c: 94 21 ff e8 stwu r1,-24(r1) ffc0ba60: 90 01 00 1c stw r0,28(r1) ffc0ba64: 48 01 02 65 bl ffc1bcc8 <_savegpr_31> _Thread_Restart_self(); return true; } return false; ffc0ba68: 38 00 00 00 li r0,0 */ RTEMS_INLINE_ROUTINE bool _States_Is_dormant ( States_Control the_states ) { return (the_states & STATES_DORMANT); ffc0ba6c: 81 23 00 10 lwz r9,16(r3) bool _Thread_Restart( Thread_Control *the_thread, void *pointer_argument, Thread_Entry_numeric_type numeric_argument ) { ffc0ba70: 7c 7f 1b 78 mr r31,r3 if ( !_States_Is_dormant( the_thread->current_state ) ) { ffc0ba74: 71 2b 00 01 andi. r11,r9,1 ffc0ba78: 40 a2 00 70 bne+ ffc0bae8 <_Thread_Restart+0x94> _Thread_Set_transient( the_thread ); ffc0ba7c: 90 81 00 08 stw r4,8(r1) ffc0ba80: 90 a1 00 0c stw r5,12(r1) ffc0ba84: 48 00 00 fd bl ffc0bb80 <_Thread_Set_transient> _Thread_Reset( the_thread, pointer_argument, numeric_argument ); ffc0ba88: 7f e3 fb 78 mr r3,r31 ffc0ba8c: 80 81 00 08 lwz r4,8(r1) ffc0ba90: 80 a1 00 0c lwz r5,12(r1) ffc0ba94: 48 00 3b 25 bl ffc0f5b8 <_Thread_Reset> _Thread_Load_environment( the_thread ); ffc0ba98: 7f e3 fb 78 mr r3,r31 ffc0ba9c: 48 00 37 dd bl ffc0f278 <_Thread_Load_environment> _Thread_Ready( the_thread ); ffc0baa0: 7f e3 fb 78 mr r3,r31 ffc0baa4: 48 00 3a cd bl ffc0f570 <_Thread_Ready> _User_extensions_Thread_restart( the_thread ); ffc0baa8: 7f e3 fb 78 mr r3,r31 ffc0baac: 48 00 06 8d bl ffc0c138 <_User_extensions_Thread_restart> RTEMS_INLINE_ROUTINE bool _Thread_Is_executing ( const Thread_Control *the_thread ) { return ( the_thread == _Thread_Executing ); ffc0bab0: 3d 20 00 00 lis r9,0 if ( _Thread_Is_executing ( the_thread ) ) ffc0bab4: 81 29 31 90 lwz r9,12688(r9) _Thread_Restart_self(); return true; ffc0bab8: 38 00 00 01 li r0,1 _Thread_Ready( the_thread ); _User_extensions_Thread_restart( the_thread ); if ( _Thread_Is_executing ( the_thread ) ) ffc0babc: 7f 9f 48 00 cmpw cr7,r31,r9 ffc0bac0: 40 be 00 28 bne+ cr7,ffc0bae8 <_Thread_Restart+0x94> */ RTEMS_INLINE_ROUTINE void _Thread_Restart_self( void ) { #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) if ( _Thread_Executing->fp_context != NULL ) ffc0bac4: 80 1f 01 28 lwz r0,296(r31) ffc0bac8: 2f 80 00 00 cmpwi cr7,r0,0 ffc0bacc: 41 9e 00 0c beq- cr7,ffc0bad8 <_Thread_Restart+0x84> <== NEVER TAKEN _Context_Restore_fp( &_Thread_Executing->fp_context ); ffc0bad0: 38 7f 01 28 addi r3,r31,296 ffc0bad4: 48 01 03 6d bl ffc1be40 <_CPU_Context_restore_fp> #endif _CPU_Context_Restart_self( &_Thread_Executing->Registers ); ffc0bad8: 3d 20 00 00 lis r9,0 ffc0badc: 80 69 31 90 lwz r3,12688(r9) ffc0bae0: 38 63 00 c8 addi r3,r3,200 ffc0bae4: 48 01 05 1d bl ffc1c000 <_CPU_Context_restore> return true; } return false; } ffc0bae8: 39 61 00 18 addi r11,r1,24 ffc0baec: 7c 03 03 78 mr r3,r0 ffc0baf0: 4b ff 52 68 b ffc00d58 <_restgpr_31_x> =============================================================================== ffc0f7f4 <_Thread_Tickle_timeslice>: * * Output parameters: NONE */ void _Thread_Tickle_timeslice( void ) { ffc0f7f4: 7c 08 02 a6 mflr r0 ffc0f7f8: 7c 2b 0b 78 mr r11,r1 ffc0f7fc: 94 21 ff f0 stwu r1,-16(r1) Thread_Control *executing; executing = _Thread_Executing; ffc0f800: 3d 20 00 00 lis r9,0 * * Output parameters: NONE */ void _Thread_Tickle_timeslice( void ) { ffc0f804: 90 01 00 14 stw r0,20(r1) ffc0f808: 4b ff 18 d1 bl ffc010d8 <_savegpr_31> Thread_Control *executing; executing = _Thread_Executing; ffc0f80c: 83 e9 32 50 lwz r31,12880(r9) /* * If the thread is not preemptible or is not ready, then * just return. */ if ( !executing->is_preemptible ) ffc0f810: 88 1f 00 74 lbz r0,116(r31) ffc0f814: 2f 80 00 00 cmpwi cr7,r0,0 ffc0f818: 41 9e 00 88 beq- cr7,ffc0f8a0 <_Thread_Tickle_timeslice+0xac> return; if ( !_States_Is_ready( executing->current_state ) ) ffc0f81c: 80 1f 00 10 lwz r0,16(r31) ffc0f820: 2f 80 00 00 cmpwi cr7,r0,0 ffc0f824: 40 9e 00 7c bne- cr7,ffc0f8a0 <_Thread_Tickle_timeslice+0xac> /* * The cpu budget algorithm determines what happens next. */ switch ( executing->budget_algorithm ) { ffc0f828: 80 1f 00 7c lwz r0,124(r31) ffc0f82c: 2b 80 00 01 cmplwi cr7,r0,1 ffc0f830: 41 9c 00 70 blt- cr7,ffc0f8a0 <_Thread_Tickle_timeslice+0xac> ffc0f834: 2b 80 00 02 cmplwi cr7,r0,2 ffc0f838: 40 9d 00 10 ble- cr7,ffc0f848 <_Thread_Tickle_timeslice+0x54> ffc0f83c: 2f 80 00 03 cmpwi cr7,r0,3 ffc0f840: 40 be 00 60 bne+ cr7,ffc0f8a0 <_Thread_Tickle_timeslice+0xac><== NEVER TAKEN ffc0f844: 48 00 00 38 b ffc0f87c <_Thread_Tickle_timeslice+0x88> 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 ) { ffc0f848: 81 3f 00 78 lwz r9,120(r31) ffc0f84c: 38 09 ff ff addi r0,r9,-1 ffc0f850: 2f 80 00 00 cmpwi cr7,r0,0 ffc0f854: 90 1f 00 78 stw r0,120(r31) ffc0f858: 41 bd 00 48 bgt+ cr7,ffc0f8a0 <_Thread_Tickle_timeslice+0xac> * always operates on the scheduler that 'owns' the currently executing * thread. */ RTEMS_INLINE_ROUTINE void _Scheduler_Yield( void ) { _Scheduler.Operations.yield(); ffc0f85c: 3d 20 00 00 lis r9,0 ffc0f860: 80 09 20 10 lwz r0,8208(r9) ffc0f864: 7c 09 03 a6 mtctr r0 ffc0f868: 4e 80 04 21 bctrl * 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; ffc0f86c: 3d 20 00 00 lis r9,0 ffc0f870: 80 09 28 04 lwz r0,10244(r9) ffc0f874: 90 1f 00 78 stw r0,120(r31) ffc0f878: 48 00 00 28 b ffc0f8a0 <_Thread_Tickle_timeslice+0xac> } break; #if defined(RTEMS_SCORE_THREAD_ENABLE_SCHEDULER_CALLOUT) case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT: if ( --executing->cpu_time_budget == 0 ) ffc0f87c: 81 3f 00 78 lwz r9,120(r31) ffc0f880: 38 09 ff ff addi r0,r9,-1 ffc0f884: 2f 80 00 00 cmpwi cr7,r0,0 ffc0f888: 90 1f 00 78 stw r0,120(r31) ffc0f88c: 40 be 00 14 bne+ cr7,ffc0f8a0 <_Thread_Tickle_timeslice+0xac> (*executing->budget_callout)( executing ); ffc0f890: 80 1f 00 80 lwz r0,128(r31) ffc0f894: 7f e3 fb 78 mr r3,r31 ffc0f898: 7c 09 03 a6 mtctr r0 ffc0f89c: 4e 80 04 21 bctrl break; #endif } } ffc0f8a0: 39 61 00 10 addi r11,r1,16 ffc0f8a4: 4b ff 18 80 b ffc01124 <_restgpr_31_x> =============================================================================== ffc0bd3c <_Thread_queue_Requeue>: void _Thread_queue_Requeue( Thread_queue_Control *the_thread_queue, Thread_Control *the_thread ) { ffc0bd3c: 94 21 ff d8 stwu r1,-40(r1) ffc0bd40: 7c 08 02 a6 mflr r0 ffc0bd44: bf a1 00 1c stmw r29,28(r1) /* * Just in case the thread really wasn't blocked on a thread queue * when we get here. */ if ( !the_thread_queue ) ffc0bd48: 7c 7f 1b 79 mr. r31,r3 void _Thread_queue_Requeue( Thread_queue_Control *the_thread_queue, Thread_Control *the_thread ) { ffc0bd4c: 7c 9e 23 78 mr r30,r4 ffc0bd50: 90 01 00 2c stw r0,44(r1) /* * Just in case the thread really wasn't blocked on a thread queue * when we get here. */ if ( !the_thread_queue ) ffc0bd54: 41 82 00 54 beq- ffc0bda8 <_Thread_queue_Requeue+0x6c> <== 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 ) { ffc0bd58: 80 1f 00 34 lwz r0,52(r31) ffc0bd5c: 2f 80 00 01 cmpwi cr7,r0,1 ffc0bd60: 40 be 00 48 bne+ cr7,ffc0bda8 <_Thread_queue_Requeue+0x6c><== NEVER TAKEN static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc0bd64: 7f a0 00 a6 mfmsr r29 ffc0bd68: 7d 30 42 a6 mfsprg r9,0 ffc0bd6c: 7f a9 48 78 andc r9,r29,r9 ffc0bd70: 7d 20 01 24 mtmsr r9 Thread_queue_Control *tq = the_thread_queue; ISR_Level level; ISR_Level level_ignored; _ISR_Disable( level ); if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) { ffc0bd74: 3d 60 00 03 lis r11,3 ffc0bd78: 81 24 00 10 lwz r9,16(r4) ffc0bd7c: 61 6b be e0 ori r11,r11,48864 ffc0bd80: 7d 6a 48 39 and. r10,r11,r9 ffc0bd84: 41 a2 00 20 beq+ ffc0bda4 <_Thread_queue_Requeue+0x68> <== 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; ffc0bd88: 90 1f 00 30 stw r0,48(r31) _Thread_queue_Enter_critical_section( tq ); _Thread_queue_Extract_priority_helper( tq, the_thread, true ); ffc0bd8c: 38 a0 00 01 li r5,1 ffc0bd90: 48 00 68 25 bl ffc125b4 <_Thread_queue_Extract_priority_helper> (void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored ); ffc0bd94: 7f e3 fb 78 mr r3,r31 ffc0bd98: 7f c4 f3 78 mr r4,r30 ffc0bd9c: 38 a1 00 08 addi r5,r1,8 ffc0bda0: 4b ff fd 0d bl ffc0baac <_Thread_queue_Enqueue_priority> return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc0bda4: 7f a0 01 24 mtmsr r29 } _ISR_Enable( level ); } } ffc0bda8: 39 61 00 28 addi r11,r1,40 ffc0bdac: 48 00 d3 fc b ffc191a8 <_restgpr_29_x> =============================================================================== ffc0bdb0 <_Thread_queue_Timeout>: void _Thread_queue_Timeout( Objects_Id id, void *ignored __attribute__((unused)) ) { ffc0bdb0: 94 21 ff e8 stwu r1,-24(r1) ffc0bdb4: 7c 08 02 a6 mflr r0 Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); ffc0bdb8: 38 81 00 08 addi r4,r1,8 void _Thread_queue_Timeout( Objects_Id id, void *ignored __attribute__((unused)) ) { ffc0bdbc: 90 01 00 1c stw r0,28(r1) Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); ffc0bdc0: 4b ff f7 2d bl ffc0b4ec <_Thread_Get> switch ( location ) { ffc0bdc4: 80 01 00 08 lwz r0,8(r1) ffc0bdc8: 2f 80 00 00 cmpwi cr7,r0,0 ffc0bdcc: 40 9e 00 18 bne- cr7,ffc0bde4 <_Thread_queue_Timeout+0x34><== NEVER TAKEN #if defined(RTEMS_MULTIPROCESSING) case OBJECTS_REMOTE: /* impossible */ #endif break; case OBJECTS_LOCAL: _Thread_queue_Process_timeout( the_thread ); ffc0bdd0: 48 00 68 d9 bl ffc126a8 <_Thread_queue_Process_timeout> */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; ffc0bdd4: 3d 20 00 00 lis r9,0 ffc0bdd8: 81 69 28 04 lwz r11,10244(r9) ffc0bddc: 38 0b ff ff addi r0,r11,-1 ffc0bde0: 90 09 28 04 stw r0,10244(r9) _Thread_Unnest_dispatch(); break; } } ffc0bde4: 80 01 00 1c lwz r0,28(r1) ffc0bde8: 38 21 00 18 addi r1,r1,24 ffc0bdec: 7c 08 03 a6 mtlr r0 ffc0bdf0: 4e 80 00 20 blr =============================================================================== ffc18fc8 <_Timer_server_Body>: * @a arg points to the corresponding timer server control block. */ static rtems_task _Timer_server_Body( rtems_task_argument arg ) { ffc18fc8: 94 21 ff 98 stwu r1,-104(r1) ffc18fcc: 7c 08 02 a6 mflr r0 ffc18fd0: be 21 00 2c stmw r17,44(r1) ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; ffc18fd4: 3a 81 00 0c addi r20,r1,12 head->previous = NULL; tail->previous = head; ffc18fd8: 3a 21 00 08 addi r17,r1,8 ffc18fdc: 90 01 00 6c stw r0,108(r1) ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; ffc18fe0: 3b 81 00 14 addi r28,r1,20 head->previous = NULL; ffc18fe4: 38 00 00 00 li r0,0 ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; ffc18fe8: 3b 61 00 18 addi r27,r1,24 ffc18fec: 92 81 00 08 stw r20,8(r1) ffc18ff0: 7c 7f 1b 78 mr r31,r3 head->previous = NULL; ffc18ff4: 90 01 00 0c stw r0,12(r1) static void _Timer_server_Process_interval_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot; ffc18ff8: 3e 40 00 00 lis r18,0 */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; watchdogs->last_snapshot = snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); ffc18ffc: 3b 43 00 30 addi r26,r3,48 tail->previous = head; ffc19000: 92 21 00 10 stw r17,16(r1) static void _Timer_server_Process_tod_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch(); ffc19004: 3e 60 00 00 lis r19,0 /* * 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 ); ffc19008: 3b a3 00 68 addi r29,r3,104 ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; ffc1900c: 93 61 00 14 stw r27,20(r1) ) { if ( !_Chain_Is_empty(the_chain)) return _Chain_Get_first_unprotected(the_chain); else return NULL; ffc19010: 3a a0 00 00 li r21,0 * the active flag of the timer server is true. */ (*watchdog->routine)( watchdog->id, watchdog->user_data ); } } else { ts->active = false; ffc19014: 3a c0 00 00 li r22,0 { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; head->previous = NULL; ffc19018: 90 01 00 18 stw r0,24(r1) _Thread_Set_state( ts->thread, STATES_DELAYING ); _Timer_server_Reset_interval_system_watchdog( ts ); _Timer_server_Reset_tod_system_watchdog( ts ); _Thread_Enable_dispatch(); ts->active = true; ffc1901c: 3a e0 00 01 li r23,1 static void _Timer_server_Stop_interval_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog ); ffc19020: 3b 03 00 08 addi r24,r3,8 tail->previous = head; ffc19024: 93 81 00 1c stw r28,28(r1) static void _Timer_server_Stop_tod_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog ); ffc19028: 3b 23 00 40 addi r25,r3,64 { /* * 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; ffc1902c: 92 3f 00 78 stw r17,120(r31) static void _Timer_server_Process_interval_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot; ffc19030: 80 12 29 1c lwz r0,10524(r18) */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; watchdogs->last_snapshot = snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); ffc19034: 7f 85 e3 78 mr r5,r28 Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot; /* * We assume adequate unsigned arithmetic here. */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; ffc19038: 80 9f 00 3c lwz r4,60(r31) watchdogs->last_snapshot = snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); ffc1903c: 7f 43 d3 78 mr r3,r26 /* * We assume adequate unsigned arithmetic here. */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; watchdogs->last_snapshot = snapshot; ffc19040: 90 1f 00 3c stw r0,60(r31) _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); ffc19044: 7c 84 00 50 subf r4,r4,r0 ffc19048: 48 00 4a f5 bl ffc1db3c <_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(); ffc1904c: 83 d3 28 f8 lwz r30,10488(r19) Watchdog_Interval last_snapshot = watchdogs->last_snapshot; ffc19050: 80 bf 00 74 lwz r5,116(r31) /* * 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 ) { ffc19054: 7f 9e 28 40 cmplw cr7,r30,r5 ffc19058: 40 bd 00 18 ble+ cr7,ffc19070 <_Timer_server_Body+0xa8> /* * 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 ); ffc1905c: 7c 85 f0 50 subf r4,r5,r30 ffc19060: 7f a3 eb 78 mr r3,r29 ffc19064: 7f 85 e3 78 mr r5,r28 ffc19068: 48 00 4a d5 bl ffc1db3c <_Watchdog_Adjust_to_chain> ffc1906c: 48 00 00 18 b ffc19084 <_Timer_server_Body+0xbc> } else if ( snapshot < last_snapshot ) { ffc19070: 40 bc 00 14 bge+ cr7,ffc19084 <_Timer_server_Body+0xbc> /* * 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 ); ffc19074: 7f a3 eb 78 mr r3,r29 ffc19078: 38 80 00 01 li r4,1 ffc1907c: 7c be 28 50 subf r5,r30,r5 ffc19080: 48 00 4a 05 bl ffc1da84 <_Watchdog_Adjust> } watchdogs->last_snapshot = snapshot; ffc19084: 93 df 00 74 stw r30,116(r31) } static void _Timer_server_Process_insertions( Timer_server_Control *ts ) { while ( true ) { Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain ); ffc19088: 80 7f 00 78 lwz r3,120(r31) ffc1908c: 48 00 0b cd bl ffc19c58 <_Chain_Get> if ( timer == NULL ) { ffc19090: 7c 7e 1b 79 mr. r30,r3 ffc19094: 41 82 00 2c beq- ffc190c0 <_Timer_server_Body+0xf8> static void _Timer_server_Insert_timer( Timer_server_Control *ts, Timer_Control *timer ) { if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) { ffc19098: 80 1e 00 38 lwz r0,56(r30) _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); ffc1909c: 7f 43 d3 78 mr r3,r26 static void _Timer_server_Insert_timer( Timer_server_Control *ts, Timer_Control *timer ) { if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) { ffc190a0: 2f 80 00 01 cmpwi cr7,r0,1 ffc190a4: 41 9e 00 10 beq- cr7,ffc190b4 <_Timer_server_Body+0xec> _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); } else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) { ffc190a8: 2f 80 00 03 cmpwi cr7,r0,3 ffc190ac: 40 9e ff dc bne+ cr7,ffc19088 <_Timer_server_Body+0xc0> <== NEVER TAKEN _Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker ); ffc190b0: 7f a3 eb 78 mr r3,r29 ffc190b4: 38 9e 00 10 addi r4,r30,16 ffc190b8: 48 00 4b 39 bl ffc1dbf0 <_Watchdog_Insert> ffc190bc: 4b ff ff cc b ffc19088 <_Timer_server_Body+0xc0> * of zero it will be processed in the next iteration of the timer server * body loop. */ _Timer_server_Process_insertions( ts ); _ISR_Disable( level ); ffc190c0: 4b ff fe 21 bl ffc18ee0 if ( _Chain_Is_empty( insert_chain ) ) { ffc190c4: 80 01 00 08 lwz r0,8(r1) ffc190c8: 7f 80 a0 00 cmpw cr7,r0,r20 ffc190cc: 40 be 00 1c bne+ cr7,ffc190e8 <_Timer_server_Body+0x120><== NEVER TAKEN ts->insert_chain = NULL; ffc190d0: 93 df 00 78 stw r30,120(r31) ffc190d4: 7c 60 01 24 mtmsr r3 _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 ) ) { ffc190d8: 80 01 00 14 lwz r0,20(r1) ffc190dc: 7f 80 d8 00 cmpw cr7,r0,r27 ffc190e0: 40 be 00 10 bne+ cr7,ffc190f0 <_Timer_server_Body+0x128> ffc190e4: 48 00 00 58 b ffc1913c <_Timer_server_Body+0x174> ffc190e8: 7c 60 01 24 mtmsr r3 <== NOT EXECUTED ffc190ec: 4b ff ff 44 b ffc19030 <_Timer_server_Body+0x68> <== NOT EXECUTED /* * It is essential that interrupts are disable here since an interrupt * service routine may remove a watchdog from the chain. */ _ISR_Disable( level ); ffc190f0: 4b ff fd f1 bl ffc18ee0 initialized = false; } #endif return status; } ffc190f4: 81 21 00 14 lwz r9,20(r1) */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected( Chain_Control *the_chain ) { if ( !_Chain_Is_empty(the_chain)) ffc190f8: 7f 89 d8 00 cmpw cr7,r9,r27 ffc190fc: 41 9e 00 38 beq- cr7,ffc19134 <_Timer_server_Body+0x16c> * 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 ) { ffc19100: 2f 89 00 00 cmpwi cr7,r9,0 Chain_Control *the_chain ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *old_first = head->next; Chain_Node *new_first = old_first->next; ffc19104: 81 69 00 00 lwz r11,0(r9) head->next = new_first; ffc19108: 91 61 00 14 stw r11,20(r1) new_first->previous = head; ffc1910c: 93 8b 00 04 stw r28,4(r11) ffc19110: 41 9e 00 24 beq- cr7,ffc19134 <_Timer_server_Body+0x16c><== NEVER TAKEN watchdog->state = WATCHDOG_INACTIVE; ffc19114: 92 a9 00 08 stw r21,8(r9) ffc19118: 7c 60 01 24 mtmsr r3 /* * 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 ); ffc1911c: 80 09 00 1c lwz r0,28(r9) ffc19120: 80 69 00 20 lwz r3,32(r9) ffc19124: 80 89 00 24 lwz r4,36(r9) ffc19128: 7c 09 03 a6 mtctr r0 ffc1912c: 4e 80 04 21 bctrl } ffc19130: 4b ff ff c0 b ffc190f0 <_Timer_server_Body+0x128> ffc19134: 7c 60 01 24 mtmsr r3 ffc19138: 4b ff fe f4 b ffc1902c <_Timer_server_Body+0x64> } else { ts->active = false; ffc1913c: 9a df 00 7c stb r22,124(r31) /* * Block until there is something to do. */ _Thread_Disable_dispatch(); ffc19140: 4b ff fd b5 bl ffc18ef4 <_Thread_Disable_dispatch> _Thread_Set_state( ts->thread, STATES_DELAYING ); ffc19144: 80 7f 00 00 lwz r3,0(r31) ffc19148: 38 80 00 08 li r4,8 ffc1914c: 48 00 41 99 bl ffc1d2e4 <_Thread_Set_state> _Timer_server_Reset_interval_system_watchdog( ts ); ffc19150: 7f e3 fb 78 mr r3,r31 ffc19154: 4b ff fd b5 bl ffc18f08 <_Timer_server_Reset_interval_system_watchdog> _Timer_server_Reset_tod_system_watchdog( ts ); ffc19158: 7f e3 fb 78 mr r3,r31 ffc1915c: 4b ff fe 0d bl ffc18f68 <_Timer_server_Reset_tod_system_watchdog> _Thread_Enable_dispatch(); ffc19160: 48 00 37 8d bl ffc1c8ec <_Thread_Enable_dispatch> ts->active = true; ffc19164: 9a ff 00 7c stb r23,124(r31) static void _Timer_server_Stop_interval_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog ); ffc19168: 7f 03 c3 78 mr r3,r24 ffc1916c: 48 00 4b e1 bl ffc1dd4c <_Watchdog_Remove> static void _Timer_server_Stop_tod_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog ); ffc19170: 7f 23 cb 78 mr r3,r25 ffc19174: 48 00 4b d9 bl ffc1dd4c <_Watchdog_Remove> ffc19178: 4b ff fe b4 b ffc1902c <_Timer_server_Body+0x64> =============================================================================== ffc1917c <_Timer_server_Schedule_operation_method>: static void _Timer_server_Schedule_operation_method( Timer_server_Control *ts, Timer_Control *timer ) { ffc1917c: 94 21 ff f0 stwu r1,-16(r1) ffc19180: 7c 08 02 a6 mflr r0 ffc19184: 90 01 00 14 stw r0,20(r1) if ( ts->insert_chain == NULL ) { ffc19188: 80 03 00 78 lwz r0,120(r3) static void _Timer_server_Schedule_operation_method( Timer_server_Control *ts, Timer_Control *timer ) { ffc1918c: bf c1 00 08 stmw r30,8(r1) ffc19190: 7c 7f 1b 78 mr r31,r3 if ( ts->insert_chain == NULL ) { ffc19194: 2f 80 00 00 cmpwi cr7,r0,0 static void _Timer_server_Schedule_operation_method( Timer_server_Control *ts, Timer_Control *timer ) { ffc19198: 7c 9e 23 78 mr r30,r4 if ( ts->insert_chain == NULL ) { ffc1919c: 40 be 01 00 bne+ cr7,ffc1929c <_Timer_server_Schedule_operation_method+0x120> * 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(); ffc191a0: 4b ff fd 55 bl ffc18ef4 <_Thread_Disable_dispatch> if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) { ffc191a4: 80 1e 00 38 lwz r0,56(r30) ffc191a8: 2f 80 00 01 cmpwi cr7,r0,1 ffc191ac: 40 be 00 6c bne+ cr7,ffc19218 <_Timer_server_Schedule_operation_method+0x9c> /* * We have to advance the last known ticks value of the server and update * the watchdog chain accordingly. */ _ISR_Disable( level ); ffc191b0: 4b ff fd 31 bl ffc18ee0 snapshot = _Watchdog_Ticks_since_boot; ffc191b4: 3d 20 00 00 lis r9,0 ffc191b8: 80 09 29 1c lwz r0,10524(r9) RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); ffc191bc: 39 7f 00 34 addi r11,r31,52 initialized = false; } #endif return status; } ffc191c0: 81 3f 00 30 lwz r9,48(r31) * We have to advance the last known ticks value of the server and update * the watchdog chain accordingly. */ _ISR_Disable( level ); snapshot = _Watchdog_Ticks_since_boot; last_snapshot = ts->Interval_watchdogs.last_snapshot; ffc191c4: 81 5f 00 3c lwz r10,60(r31) if ( !_Chain_Is_empty( &ts->Interval_watchdogs.Chain ) ) { ffc191c8: 7f 89 58 00 cmpw cr7,r9,r11 ffc191cc: 41 9e 00 20 beq- cr7,ffc191ec <_Timer_server_Schedule_operation_method+0x70> /* * We assume adequate unsigned arithmetic here. */ delta = snapshot - last_snapshot; delta_interval = first_watchdog->delta_interval; ffc191d0: 81 09 00 10 lwz r8,16(r9) first_watchdog = _Watchdog_First( &ts->Interval_watchdogs.Chain ); /* * We assume adequate unsigned arithmetic here. */ delta = snapshot - last_snapshot; ffc191d4: 7d 4a 00 50 subf r10,r10,r0 delta_interval = first_watchdog->delta_interval; if (delta_interval > delta) { delta_interval -= delta; } else { delta_interval = 0; ffc191d8: 39 60 00 00 li r11,0 * We assume adequate unsigned arithmetic here. */ delta = snapshot - last_snapshot; delta_interval = first_watchdog->delta_interval; if (delta_interval > delta) { ffc191dc: 7f 88 50 40 cmplw cr7,r8,r10 ffc191e0: 40 9d 00 08 ble- cr7,ffc191e8 <_Timer_server_Schedule_operation_method+0x6c> delta_interval -= delta; ffc191e4: 7d 6a 40 50 subf r11,r10,r8 } else { delta_interval = 0; } first_watchdog->delta_interval = delta_interval; ffc191e8: 91 69 00 10 stw r11,16(r9) } ts->Interval_watchdogs.last_snapshot = snapshot; ffc191ec: 90 1f 00 3c stw r0,60(r31) ffc191f0: 7c 60 01 24 mtmsr r3 _ISR_Enable( level ); _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); ffc191f4: 38 7f 00 30 addi r3,r31,48 ffc191f8: 38 9e 00 10 addi r4,r30,16 ffc191fc: 48 00 49 f5 bl ffc1dbf0 <_Watchdog_Insert> if ( !ts->active ) { ffc19200: 88 1f 00 7c lbz r0,124(r31) ffc19204: 2f 80 00 00 cmpwi cr7,r0,0 ffc19208: 40 be 00 8c bne+ cr7,ffc19294 <_Timer_server_Schedule_operation_method+0x118> _Timer_server_Reset_interval_system_watchdog( ts ); ffc1920c: 7f e3 fb 78 mr r3,r31 ffc19210: 4b ff fc f9 bl ffc18f08 <_Timer_server_Reset_interval_system_watchdog> ffc19214: 48 00 00 80 b ffc19294 <_Timer_server_Schedule_operation_method+0x118> } } else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) { ffc19218: 2f 80 00 03 cmpwi cr7,r0,3 ffc1921c: 40 be 00 78 bne+ cr7,ffc19294 <_Timer_server_Schedule_operation_method+0x118> /* * We have to advance the last known seconds value of the server and update * the watchdog chain accordingly. */ _ISR_Disable( level ); ffc19220: 4b ff fc c1 bl ffc18ee0 snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch(); ffc19224: 3d 20 00 00 lis r9,0 last_snapshot = ts->TOD_watchdogs.last_snapshot; ffc19228: 81 1f 00 74 lwz r8,116(r31) /* * We have to advance the last known seconds value of the server and update * the watchdog chain accordingly. */ _ISR_Disable( level ); snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch(); ffc1922c: 80 09 28 f8 lwz r0,10488(r9) ffc19230: 39 7f 00 6c addi r11,r31,108 initialized = false; } #endif return status; } ffc19234: 81 3f 00 68 lwz r9,104(r31) * 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 ) ) { ffc19238: 7f 89 58 00 cmpw cr7,r9,r11 ffc1923c: 41 9e 00 30 beq- cr7,ffc1926c <_Timer_server_Schedule_operation_method+0xf0> first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain ); delta_interval = first_watchdog->delta_interval; if ( snapshot > last_snapshot ) { ffc19240: 7f 80 40 40 cmplw cr7,r0,r8 _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 ) ) { first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain ); delta_interval = first_watchdog->delta_interval; ffc19244: 81 49 00 10 lwz r10,16(r9) } } else { /* * Someone put us in the past. */ delta = last_snapshot - snapshot; ffc19248: 7d 6a 42 14 add r11,r10,r8 delta_interval += delta; ffc1924c: 7d 60 58 50 subf r11,r0,r11 snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch(); last_snapshot = ts->TOD_watchdogs.last_snapshot; if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) { first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain ); delta_interval = first_watchdog->delta_interval; if ( snapshot > last_snapshot ) { ffc19250: 40 9d 00 18 ble- cr7,ffc19268 <_Timer_server_Schedule_operation_method+0xec> /* * We advanced in time. */ delta = snapshot - last_snapshot; ffc19254: 7d 08 00 50 subf r8,r8,r0 if (delta_interval > delta) { ffc19258: 7f 8a 40 40 cmplw cr7,r10,r8 delta_interval -= delta; } else { delta_interval = 0; ffc1925c: 39 60 00 00 li r11,0 if ( snapshot > last_snapshot ) { /* * We advanced in time. */ delta = snapshot - last_snapshot; if (delta_interval > delta) { ffc19260: 40 9d 00 08 ble- cr7,ffc19268 <_Timer_server_Schedule_operation_method+0xec><== NEVER TAKEN delta_interval -= delta; ffc19264: 7d 68 50 50 subf r11,r8,r10 * Someone put us in the past. */ delta = last_snapshot - snapshot; delta_interval += delta; } first_watchdog->delta_interval = delta_interval; ffc19268: 91 69 00 10 stw r11,16(r9) } ts->TOD_watchdogs.last_snapshot = snapshot; ffc1926c: 90 1f 00 74 stw r0,116(r31) ffc19270: 7c 60 01 24 mtmsr r3 _ISR_Enable( level ); _Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker ); ffc19274: 38 7f 00 68 addi r3,r31,104 ffc19278: 38 9e 00 10 addi r4,r30,16 ffc1927c: 48 00 49 75 bl ffc1dbf0 <_Watchdog_Insert> if ( !ts->active ) { ffc19280: 88 1f 00 7c lbz r0,124(r31) ffc19284: 2f 80 00 00 cmpwi cr7,r0,0 ffc19288: 40 be 00 0c bne+ cr7,ffc19294 <_Timer_server_Schedule_operation_method+0x118> _Timer_server_Reset_tod_system_watchdog( ts ); ffc1928c: 7f e3 fb 78 mr r3,r31 ffc19290: 4b ff fc d9 bl ffc18f68 <_Timer_server_Reset_tod_system_watchdog> } } _Thread_Enable_dispatch(); ffc19294: 48 00 36 59 bl ffc1c8ec <_Thread_Enable_dispatch> ffc19298: 48 00 00 0c b ffc192a4 <_Timer_server_Schedule_operation_method+0x128> * 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 ); ffc1929c: 80 63 00 78 lwz r3,120(r3) ffc192a0: 48 00 09 61 bl ffc19c00 <_Chain_Append> } } ffc192a4: 39 61 00 10 addi r11,r1,16 ffc192a8: 4b ff 50 f8 b ffc0e3a0 <_restgpr_30_x> =============================================================================== ffc0c0fc <_User_extensions_Handler_initialization>: #include #include #include void _User_extensions_Handler_initialization(void) { ffc0c0fc: 94 21 ff e8 stwu r1,-24(r1) ffc0c100: 7c 08 02 a6 mflr r0 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; ffc0c104: 3d 20 00 00 lis r9,0 #include #include #include void _User_extensions_Handler_initialization(void) { ffc0c108: 90 01 00 1c stw r0,28(r1) 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; ffc0c10c: 39 29 20 b8 addi r9,r9,8376 ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; ffc0c110: 3d 60 00 00 lis r11,0 #include #include #include void _User_extensions_Handler_initialization(void) { ffc0c114: bf 81 00 08 stmw r28,8(r1) uint32_t i; uint32_t number_of_extensions; User_extensions_Table *initial_extensions; number_of_extensions = Configuration.number_of_initial_extensions; initial_extensions = Configuration.User_extension_table; ffc0c118: 83 a9 00 3c lwz r29,60(r9) 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; ffc0c11c: 83 c9 00 38 lwz r30,56(r9) ffc0c120: 39 2b 2e 94 addi r9,r11,11924 initial_extensions = Configuration.User_extension_table; _Chain_Initialize_empty( &_User_extensions_List ); _Chain_Initialize_empty( &_User_extensions_Switches_list ); if ( initial_extensions ) { ffc0c124: 2f 9d 00 00 cmpwi cr7,r29,0 head->previous = NULL; tail->previous = head; ffc0c128: 91 29 00 08 stw r9,8(r9) ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; ffc0c12c: 38 09 00 04 addi r0,r9,4 ffc0c130: 90 0b 2e 94 stw r0,11924(r11) head->previous = NULL; ffc0c134: 38 00 00 00 li r0,0 ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; ffc0c138: 3d 60 00 00 lis r11,0 head->previous = NULL; ffc0c13c: 90 09 00 04 stw r0,4(r9) ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; ffc0c140: 39 2b 2d 70 addi r9,r11,11632 ffc0c144: 39 49 00 04 addi r10,r9,4 ffc0c148: 91 4b 2d 70 stw r10,11632(r11) head->previous = NULL; ffc0c14c: 90 09 00 04 stw r0,4(r9) tail->previous = head; ffc0c150: 91 29 00 08 stw r9,8(r9) ffc0c154: 41 9e 00 54 beq- cr7,ffc0c1a8 <_User_extensions_Handler_initialization+0xac><== NEVER TAKEN extension = (User_extensions_Control *) _Workspace_Allocate_or_fatal_error( number_of_extensions * sizeof( User_extensions_Control ) ffc0c158: 1f 9e 00 34 mulli r28,r30,52 _Chain_Initialize_empty( &_User_extensions_List ); _Chain_Initialize_empty( &_User_extensions_Switches_list ); if ( initial_extensions ) { extension = (User_extensions_Control *) _Workspace_Allocate_or_fatal_error( ffc0c15c: 7f 83 e3 78 mr r3,r28 ffc0c160: 48 00 05 ad bl ffc0c70c <_Workspace_Allocate_or_fatal_error> number_of_extensions * sizeof( User_extensions_Control ) ); memset ( ffc0c164: 7f 85 e3 78 mr r5,r28 ffc0c168: 38 80 00 00 li r4,0 _Chain_Initialize_empty( &_User_extensions_List ); _Chain_Initialize_empty( &_User_extensions_Switches_list ); if ( initial_extensions ) { extension = (User_extensions_Control *) _Workspace_Allocate_or_fatal_error( ffc0c16c: 7c 7f 1b 78 mr r31,r3 number_of_extensions * sizeof( User_extensions_Control ) ); memset ( ffc0c170: 48 00 8e 89 bl ffc14ff8 extension, 0, number_of_extensions * sizeof( User_extensions_Control ) ); for ( i = 0 ; i < number_of_extensions ; i++ ) { ffc0c174: 3b 80 00 00 li r28,0 ffc0c178: 48 00 00 28 b ffc0c1a0 <_User_extensions_Handler_initialization+0xa4> #include #include #include #include void _User_extensions_Handler_initialization(void) ffc0c17c: 57 83 28 34 rlwinm r3,r28,5,0,26 RTEMS_INLINE_ROUTINE void _User_extensions_Add_set_with_table( User_extensions_Control *extension, const User_extensions_Table *extension_table ) { extension->Callouts = *extension_table; ffc0c180: 38 9f 00 14 addi r4,r31,20 ffc0c184: 7c 7d 1a 14 add r3,r29,r3 ffc0c188: 7c a3 04 aa lswi r5,r3,32 ffc0c18c: 7c a4 05 aa stswi r5,r4,32 _User_extensions_Add_set( extension ); ffc0c190: 7f e3 fb 78 mr r3,r31 extension, 0, number_of_extensions * sizeof( User_extensions_Control ) ); for ( i = 0 ; i < number_of_extensions ; i++ ) { ffc0c194: 3b 9c 00 01 addi r28,r28,1 ffc0c198: 48 00 66 21 bl ffc127b8 <_User_extensions_Add_set> _User_extensions_Add_set_with_table (extension, &initial_extensions[i]); extension++; ffc0c19c: 3b ff 00 34 addi r31,r31,52 extension, 0, number_of_extensions * sizeof( User_extensions_Control ) ); for ( i = 0 ; i < number_of_extensions ; i++ ) { ffc0c1a0: 7f 9c f0 40 cmplw cr7,r28,r30 ffc0c1a4: 41 9c ff d8 blt+ cr7,ffc0c17c <_User_extensions_Handler_initialization+0x80> _User_extensions_Add_set_with_table (extension, &initial_extensions[i]); extension++; } } } ffc0c1a8: 39 61 00 18 addi r11,r1,24 ffc0c1ac: 48 00 cf f8 b ffc191a4 <_restgpr_28_x> =============================================================================== ffc0d284 <_Watchdog_Adjust>: void _Watchdog_Adjust( Chain_Control *header, Watchdog_Adjust_directions direction, Watchdog_Interval units ) { ffc0d284: 94 21 ff e0 stwu r1,-32(r1) ffc0d288: 7c 08 02 a6 mflr r0 ffc0d28c: bf 61 00 0c stmw r27,12(r1) ffc0d290: 7c 7f 1b 78 mr r31,r3 ffc0d294: 7c be 2b 78 mr r30,r5 ffc0d298: 90 01 00 24 stw r0,36(r1) static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc0d29c: 7c 00 00 a6 mfmsr r0 ffc0d2a0: 7d 30 42 a6 mfsprg r9,0 ffc0d2a4: 7c 09 48 78 andc r9,r0,r9 ffc0d2a8: 7d 20 01 24 mtmsr r9 } } _ISR_Enable( level ); } ffc0d2ac: 81 23 00 00 lwz r9,0(r3) RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); ffc0d2b0: 3b 83 00 04 addi r28,r3,4 * hence the compiler must not assume *header to remain * unmodified across that call. * * Till Straumann, 7/2003 */ if ( !_Chain_Is_empty( header ) ) { ffc0d2b4: 7f 89 e0 00 cmpw cr7,r9,r28 ffc0d2b8: 41 9e 00 78 beq- cr7,ffc0d330 <_Watchdog_Adjust+0xac> switch ( direction ) { ffc0d2bc: 2f 84 00 00 cmpwi cr7,r4,0 if ( units < _Watchdog_First( header )->delta_interval ) { _Watchdog_First( header )->delta_interval -= units; break; } else { units -= _Watchdog_First( header )->delta_interval; _Watchdog_First( header )->delta_interval = 1; ffc0d2c0: 3b 60 00 01 li r27,1 * unmodified across that call. * * Till Straumann, 7/2003 */ if ( !_Chain_Is_empty( header ) ) { switch ( direction ) { ffc0d2c4: 41 9e 00 64 beq- cr7,ffc0d328 <_Watchdog_Adjust+0xa4> ffc0d2c8: 2f 84 00 01 cmpwi cr7,r4,1 ffc0d2cc: 40 be 00 64 bne+ cr7,ffc0d330 <_Watchdog_Adjust+0xac> <== NEVER TAKEN case WATCHDOG_BACKWARD: _Watchdog_First( header )->delta_interval += units; ffc0d2d0: 81 69 00 10 lwz r11,16(r9) ffc0d2d4: 7f cb 2a 14 add r30,r11,r5 ffc0d2d8: 48 00 00 18 b ffc0d2f0 <_Watchdog_Adjust+0x6c> RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First( Chain_Control *header ) { return ( (Watchdog_Control *) _Chain_First( header ) ); ffc0d2dc: 81 3f 00 00 lwz r9,0(r31) break; case WATCHDOG_FORWARD: while ( units ) { if ( units < _Watchdog_First( header )->delta_interval ) { ffc0d2e0: 83 a9 00 10 lwz r29,16(r9) ffc0d2e4: 7f 9e e8 40 cmplw cr7,r30,r29 ffc0d2e8: 40 bc 00 10 bge+ cr7,ffc0d2f8 <_Watchdog_Adjust+0x74> _Watchdog_First( header )->delta_interval -= units; ffc0d2ec: 7f de e8 50 subf r30,r30,r29 ffc0d2f0: 93 c9 00 10 stw r30,16(r9) break; ffc0d2f4: 48 00 00 3c b ffc0d330 <_Watchdog_Adjust+0xac> } else { units -= _Watchdog_First( header )->delta_interval; _Watchdog_First( header )->delta_interval = 1; ffc0d2f8: 93 69 00 10 stw r27,16(r9) return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc0d2fc: 7c 00 01 24 mtmsr r0 _ISR_Enable( level ); _Watchdog_Tickle( header ); ffc0d300: 7f e3 fb 78 mr r3,r31 ffc0d304: 48 00 02 3d bl ffc0d540 <_Watchdog_Tickle> static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc0d308: 7c 00 00 a6 mfmsr r0 ffc0d30c: 7d 30 42 a6 mfsprg r9,0 ffc0d310: 7c 09 48 78 andc r9,r0,r9 ffc0d314: 7d 20 01 24 mtmsr r9 _ISR_Disable( level ); if ( _Chain_Is_empty( header ) ) ffc0d318: 81 3f 00 00 lwz r9,0(r31) ffc0d31c: 7f 89 e0 00 cmpw cr7,r9,r28 ffc0d320: 41 9e 00 10 beq- cr7,ffc0d330 <_Watchdog_Adjust+0xac> while ( units ) { if ( units < _Watchdog_First( header )->delta_interval ) { _Watchdog_First( header )->delta_interval -= units; break; } else { units -= _Watchdog_First( header )->delta_interval; ffc0d324: 7f dd f0 50 subf r30,r29,r30 switch ( direction ) { case WATCHDOG_BACKWARD: _Watchdog_First( header )->delta_interval += units; break; case WATCHDOG_FORWARD: while ( units ) { ffc0d328: 2f 9e 00 00 cmpwi cr7,r30,0 ffc0d32c: 40 9e ff b0 bne+ cr7,ffc0d2dc <_Watchdog_Adjust+0x58> <== ALWAYS TAKEN return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc0d330: 7c 00 01 24 mtmsr r0 } } _ISR_Enable( level ); } ffc0d334: 39 61 00 20 addi r11,r1,32 ffc0d338: 4b ff 40 08 b ffc01340 <_restgpr_27_x> =============================================================================== ffc0c594 <_Watchdog_Remove>: */ Watchdog_States _Watchdog_Remove( Watchdog_Control *the_watchdog ) { ffc0c594: 7c 69 1b 78 mr r9,r3 static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc0c598: 7c 00 00 a6 mfmsr r0 ffc0c59c: 7d 70 42 a6 mfsprg r11,0 ffc0c5a0: 7c 0b 58 78 andc r11,r0,r11 ffc0c5a4: 7d 60 01 24 mtmsr r11 ISR_Level level; Watchdog_States previous_state; Watchdog_Control *next_watchdog; _ISR_Disable( level ); previous_state = the_watchdog->state; ffc0c5a8: 80 63 00 08 lwz r3,8(r3) switch ( previous_state ) { ffc0c5ac: 2f 83 00 01 cmpwi cr7,r3,1 ffc0c5b0: 41 9e 00 18 beq- cr7,ffc0c5c8 <_Watchdog_Remove+0x34> ffc0c5b4: 2b 83 00 01 cmplwi cr7,r3,1 ffc0c5b8: 41 9c 00 70 blt- cr7,ffc0c628 <_Watchdog_Remove+0x94> ffc0c5bc: 2b 83 00 03 cmplwi cr7,r3,3 ffc0c5c0: 41 9d 00 68 bgt- cr7,ffc0c628 <_Watchdog_Remove+0x94> <== NEVER TAKEN ffc0c5c4: 48 00 00 10 b ffc0c5d4 <_Watchdog_Remove+0x40> /* * 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; ffc0c5c8: 39 60 00 00 li r11,0 ffc0c5cc: 91 69 00 08 stw r11,8(r9) break; ffc0c5d0: 48 00 00 58 b ffc0c628 <_Watchdog_Remove+0x94> case WATCHDOG_ACTIVE: case WATCHDOG_REMOVE_IT: the_watchdog->state = WATCHDOG_INACTIVE; ffc0c5d4: 39 60 00 00 li r11,0 ffc0c5d8: 91 69 00 08 stw r11,8(r9) } the_watchdog->stop_time = _Watchdog_Ticks_since_boot; _ISR_Enable( level ); return( previous_state ); } ffc0c5dc: 81 69 00 00 lwz r11,0(r9) case WATCHDOG_REMOVE_IT: the_watchdog->state = WATCHDOG_INACTIVE; next_watchdog = _Watchdog_Next( the_watchdog ); if ( _Watchdog_Next(next_watchdog) ) ffc0c5e0: 81 4b 00 00 lwz r10,0(r11) ffc0c5e4: 2f 8a 00 00 cmpwi cr7,r10,0 ffc0c5e8: 41 9e 00 14 beq- cr7,ffc0c5fc <_Watchdog_Remove+0x68> next_watchdog->delta_interval += the_watchdog->delta_interval; ffc0c5ec: 81 0b 00 10 lwz r8,16(r11) ffc0c5f0: 81 49 00 10 lwz r10,16(r9) ffc0c5f4: 7d 48 52 14 add r10,r8,r10 ffc0c5f8: 91 4b 00 10 stw r10,16(r11) if ( _Watchdog_Sync_count ) ffc0c5fc: 3d 40 00 00 lis r10,0 ffc0c600: 81 4a 28 3c lwz r10,10300(r10) ffc0c604: 2f 8a 00 00 cmpwi cr7,r10,0 ffc0c608: 41 9e 00 14 beq- cr7,ffc0c61c <_Watchdog_Remove+0x88> _Watchdog_Sync_level = _ISR_Nest_level; ffc0c60c: 3d 40 00 00 lis r10,0 ffc0c610: 81 0a 31 ec lwz r8,12780(r10) ffc0c614: 3d 40 00 00 lis r10,0 ffc0c618: 91 0a 28 2c stw r8,10284(r10) { Chain_Node *next; Chain_Node *previous; next = the_node->next; previous = the_node->previous; ffc0c61c: 81 49 00 04 lwz r10,4(r9) next->previous = previous; ffc0c620: 91 4b 00 04 stw r10,4(r11) previous->next = next; ffc0c624: 91 6a 00 00 stw r11,0(r10) _Chain_Extract_unprotected( &the_watchdog->Node ); break; } the_watchdog->stop_time = _Watchdog_Ticks_since_boot; ffc0c628: 3d 60 00 00 lis r11,0 ffc0c62c: 81 6b 28 40 lwz r11,10304(r11) ffc0c630: 91 69 00 18 stw r11,24(r9) return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc0c634: 7c 00 01 24 mtmsr r0 _ISR_Enable( level ); return( previous_state ); } ffc0c638: 4e 80 00 20 blr =============================================================================== ffc0cab8 <_Watchdog_Report_chain>: void _Watchdog_Report_chain( const char *name, Chain_Control *header ) { ffc0cab8: 94 21 ff e8 stwu r1,-24(r1) ffc0cabc: 7c 08 02 a6 mflr r0 ffc0cac0: bf 81 00 08 stmw r28,8(r1) ffc0cac4: 7c 7e 1b 78 mr r30,r3 ffc0cac8: 7c 9f 23 78 mr r31,r4 ffc0cacc: 90 01 00 1c stw r0,28(r1) static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc0cad0: 7f a0 00 a6 mfmsr r29 ffc0cad4: 7c 10 42 a6 mfsprg r0,0 ffc0cad8: 7f a0 00 78 andc r0,r29,r0 ffc0cadc: 7c 00 01 24 mtmsr r0 ISR_Level level; Chain_Node *node; _ISR_Disable( level ); printk( "Watchdog Chain: %s %p\n", name, header ); ffc0cae0: 3c 60 ff c2 lis r3,-62 ffc0cae4: 7f e5 fb 78 mr r5,r31 ffc0cae8: 38 63 f5 10 addi r3,r3,-2800 ffc0caec: 7f c4 f3 78 mr r4,r30 ffc0caf0: 4c c6 31 82 crclr 4*cr1+eq ffc0caf4: 4b ff 95 b9 bl ffc060ac printk( "== end of %s \n", name ); } else { printk( "Chain is empty\n" ); } _ISR_Enable( level ); } ffc0caf8: 83 9f 00 00 lwz r28,0(r31) RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); ffc0cafc: 3b ff 00 04 addi r31,r31,4 ISR_Level level; Chain_Node *node; _ISR_Disable( level ); printk( "Watchdog Chain: %s %p\n", name, header ); if ( !_Chain_Is_empty( header ) ) { ffc0cb00: 7f 9c f8 00 cmpw cr7,r28,r31 ffc0cb04: 41 9e 00 34 beq- cr7,ffc0cb38 <_Watchdog_Report_chain+0x80> node != _Chain_Tail(header) ; node = node->next ) { Watchdog_Control *watch = (Watchdog_Control *) node; _Watchdog_Report( NULL, watch ); ffc0cb08: 7f 84 e3 78 mr r4,r28 ffc0cb0c: 38 60 00 00 li r3,0 ffc0cb10: 48 00 00 45 bl ffc0cb54 <_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 ) ffc0cb14: 83 9c 00 00 lwz r28,0(r28) Chain_Node *node; _ISR_Disable( level ); printk( "Watchdog Chain: %s %p\n", name, header ); if ( !_Chain_Is_empty( header ) ) { for ( node = _Chain_First( header ) ; ffc0cb18: 7f 9c f8 00 cmpw cr7,r28,r31 ffc0cb1c: 40 9e ff ec bne+ cr7,ffc0cb08 <_Watchdog_Report_chain+0x50><== NEVER TAKEN { Watchdog_Control *watch = (Watchdog_Control *) node; _Watchdog_Report( NULL, watch ); } printk( "== end of %s \n", name ); ffc0cb20: 3c 60 ff c2 lis r3,-62 ffc0cb24: 38 63 f5 27 addi r3,r3,-2777 ffc0cb28: 7f c4 f3 78 mr r4,r30 ffc0cb2c: 4c c6 31 82 crclr 4*cr1+eq ffc0cb30: 4b ff 95 7d bl ffc060ac ffc0cb34: 48 00 00 14 b ffc0cb48 <_Watchdog_Report_chain+0x90> } else { printk( "Chain is empty\n" ); ffc0cb38: 3c 60 ff c2 lis r3,-62 ffc0cb3c: 38 63 f5 36 addi r3,r3,-2762 ffc0cb40: 4c c6 31 82 crclr 4*cr1+eq ffc0cb44: 4b ff 95 69 bl ffc060ac return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc0cb48: 7f a0 01 24 mtmsr r29 } _ISR_Enable( level ); } ffc0cb4c: 39 61 00 18 addi r11,r1,24 ffc0cb50: 4b ff 43 74 b ffc00ec4 <_restgpr_28_x> =============================================================================== ffc08fd4 <_rename_r>: int _rename_r( struct _reent *ptr __attribute__((unused)), const char *old, const char *new ) { ffc08fd4: 94 21 ff 88 stwu r1,-120(r1) ffc08fd8: 7d 80 00 26 mfcr r12 ffc08fdc: 7c 08 02 a6 mflr r0 /* * Get the parent node of the old path to be renamed. Find the parent path. */ old_parent_pathlen = rtems_filesystem_dirname ( old ); ffc08fe0: 7c 83 23 78 mr r3,r4 int _rename_r( struct _reent *ptr __attribute__((unused)), const char *old, const char *new ) { ffc08fe4: bf 41 00 60 stmw r26,96(r1) ffc08fe8: 7c 9d 23 78 mr r29,r4 ffc08fec: 7c bb 2b 78 mr r27,r5 ffc08ff0: 90 01 00 7c stw r0,124(r1) ffc08ff4: 91 81 00 5c stw r12,92(r1) /* * Get the parent node of the old path to be renamed. Find the parent path. */ old_parent_pathlen = rtems_filesystem_dirname ( old ); ffc08ff8: 4b ff e7 b5 bl ffc077ac if ( old_parent_pathlen == 0 ) ffc08ffc: 7c 7a 1b 79 mr. r26,r3 ffc09000: 38 c1 00 24 addi r6,r1,36 ffc09004: 40 82 00 1c bne- ffc09020 <_rename_r+0x4c> rtems_filesystem_get_start_loc( old, &i, &old_parent_loc ); ffc09008: 7f a3 eb 78 mr r3,r29 ffc0900c: 38 81 00 08 addi r4,r1,8 ffc09010: 7c c5 33 78 mr r5,r6 ffc09014: 48 00 03 99 bl ffc093ac 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; ffc09018: 3b c0 00 00 li r30,0 ffc0901c: 48 00 00 28 b ffc09044 <_rename_r+0x70> 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, ffc09020: 7f a3 eb 78 mr r3,r29 ffc09024: 7f 44 d3 78 mr r4,r26 ffc09028: 38 a0 00 02 li r5,2 ffc0902c: 38 e0 00 00 li r7,0 ffc09030: 4b ff e7 21 bl ffc07750 RTEMS_LIBIO_PERMS_WRITE, &old_parent_loc, false ); if ( result != 0 ) return -1; ffc09034: 3b 80 ff ff li r28,-1 else { result = rtems_filesystem_evaluate_path( old, old_parent_pathlen, RTEMS_LIBIO_PERMS_WRITE, &old_parent_loc, false ); if ( result != 0 ) ffc09038: 2f 83 00 00 cmpwi cr7,r3,0 ffc0903c: 40 9e 01 5c bne- cr7,ffc09198 <_rename_r+0x1c4> <== NEVER TAKEN return -1; free_old_parentloc = true; ffc09040: 3b c0 00 01 li r30,1 /* * Start from the parent to find the node that should be under it. */ old_loc = old_parent_loc; ffc09044: 3b 81 00 10 addi r28,r1,16 ffc09048: 3b e1 00 24 addi r31,r1,36 ffc0904c: 7c bf a4 aa lswi r5,r31,20 ffc09050: 7c bc a5 aa stswi r5,r28,20 name = old + old_parent_pathlen; ffc09054: 7f bd d2 14 add r29,r29,r26 name += rtems_filesystem_prefix_separators( name, strlen( name ) ); ffc09058: 7f a3 eb 78 mr r3,r29 /* * Start from the parent to find the node that should be under it. */ old_loc = old_parent_loc; name = old + old_parent_pathlen; ffc0905c: 93 a1 00 0c stw r29,12(r1) name += rtems_filesystem_prefix_separators( name, strlen( name ) ); ffc09060: 48 00 ef c9 bl ffc18028 ffc09064: 7c 64 1b 78 mr r4,r3 ffc09068: 7f a3 eb 78 mr r3,r29 ffc0906c: 4b ff e7 89 bl ffc077f4 ffc09070: 7f bd 1a 14 add r29,r29,r3 result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), ffc09074: 7f a3 eb 78 mr r3,r29 * Start from the parent to find the node that should be under it. */ old_loc = old_parent_loc; name = old + old_parent_pathlen; name += rtems_filesystem_prefix_separators( name, strlen( name ) ); ffc09078: 93 a1 00 0c stw r29,12(r1) result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), ffc0907c: 48 00 ef ad bl ffc18028 ffc09080: 38 a0 00 00 li r5,0 ffc09084: 7c 64 1b 78 mr r4,r3 ffc09088: 7f 86 e3 78 mr r6,r28 ffc0908c: 7f a3 eb 78 mr r3,r29 ffc09090: 38 e0 00 00 li r7,0 ffc09094: 4b ff e6 39 bl ffc076cc 0, &old_loc, false ); if ( result != 0 ) { ffc09098: 2f 83 00 00 cmpwi cr7,r3,0 ffc0909c: 41 be 00 18 beq+ cr7,ffc090b4 <_rename_r+0xe0> if ( free_old_parentloc ) ffc090a0: 2f 9e 00 00 cmpwi cr7,r30,0 rtems_filesystem_freenode( &old_parent_loc ); return -1; ffc090a4: 3b 80 ff ff li r28,-1 result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), 0, &old_loc, false ); if ( result != 0 ) { if ( free_old_parentloc ) rtems_filesystem_freenode( &old_parent_loc ); ffc090a8: 7f e3 fb 78 mr r3,r31 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 ) ffc090ac: 41 be 00 ec beq+ cr7,ffc09198 <_rename_r+0x1c4> <== NEVER TAKEN ffc090b0: 48 00 00 e4 b ffc09194 <_rename_r+0x1c0> /* * Get the parent of the new node we are renaming to. */ rtems_filesystem_get_start_loc( new, &i, &new_parent_loc ); ffc090b4: 3b a1 00 38 addi r29,r1,56 ffc090b8: 7f 63 db 78 mr r3,r27 ffc090bc: 38 81 00 08 addi r4,r1,8 ffc090c0: 7f a5 eb 78 mr r5,r29 ffc090c4: 48 00 02 e9 bl ffc093ac result = (*new_parent_loc.ops->evalformake_h)( &new[i], &new_parent_loc, &name ); ffc090c8: 81 21 00 44 lwz r9,68(r1) ffc090cc: 80 61 00 08 lwz r3,8(r1) ffc090d0: 7f a4 eb 78 mr r4,r29 ffc090d4: 80 09 00 04 lwz r0,4(r9) ffc090d8: 38 a1 00 0c addi r5,r1,12 ffc090dc: 7c 7b 1a 14 add r3,r27,r3 ffc090e0: 7c 09 03 a6 mtctr r0 ffc090e4: 4e 80 04 21 bctrl if ( result != 0 ) { ffc090e8: 2f 83 00 00 cmpwi cr7,r3,0 ffc090ec: 41 be 00 28 beq+ cr7,ffc09114 <_rename_r+0x140> rtems_filesystem_freenode( &new_parent_loc ); ffc090f0: 7f a3 eb 78 mr r3,r29 ffc090f4: 4b ff e9 99 bl ffc07a8c if ( free_old_parentloc ) ffc090f8: 2f 9e 00 00 cmpwi cr7,r30,0 ffc090fc: 41 be 00 0c beq+ cr7,ffc09108 <_rename_r+0x134> <== NEVER TAKEN rtems_filesystem_freenode( &old_parent_loc ); ffc09100: 7f e3 fb 78 mr r3,r31 ffc09104: 4b ff e9 89 bl ffc07a8c rtems_filesystem_freenode( &old_loc ); ffc09108: 38 61 00 10 addi r3,r1,16 ffc0910c: 4b ff e9 81 bl ffc07a8c ffc09110: 48 00 00 40 b ffc09150 <_rename_r+0x17c> /* * 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 ) { ffc09114: 80 01 00 48 lwz r0,72(r1) ffc09118: 2e 1e 00 00 cmpwi cr4,r30,0 ffc0911c: 81 21 00 34 lwz r9,52(r1) ffc09120: 7f 89 00 00 cmpw cr7,r9,r0 ffc09124: 41 be 00 34 beq+ cr7,ffc09158 <_rename_r+0x184> rtems_filesystem_freenode( &new_parent_loc ); ffc09128: 7f a3 eb 78 mr r3,r29 ffc0912c: 4b ff e9 61 bl ffc07a8c if ( free_old_parentloc ) ffc09130: 41 b2 00 0c beq+ cr4,ffc0913c <_rename_r+0x168> rtems_filesystem_freenode( &old_parent_loc ); ffc09134: 7f e3 fb 78 mr r3,r31 ffc09138: 4b ff e9 55 bl ffc07a8c rtems_filesystem_freenode( &old_loc ); ffc0913c: 38 61 00 10 addi r3,r1,16 ffc09140: 4b ff e9 4d bl ffc07a8c rtems_set_errno_and_return_minus_one( EXDEV ); ffc09144: 48 00 b5 71 bl ffc146b4 <__errno> ffc09148: 38 00 00 12 li r0,18 ffc0914c: 90 03 00 00 stw r0,0(r3) ffc09150: 3b 80 ff ff li r28,-1 ffc09154: 48 00 00 44 b ffc09198 <_rename_r+0x1c4> } result = (*new_parent_loc.ops->rename_h)( &old_parent_loc, &old_loc, &new_parent_loc, name ); ffc09158: 81 21 00 44 lwz r9,68(r1) ffc0915c: 7f 84 e3 78 mr r4,r28 ffc09160: 7f e3 fb 78 mr r3,r31 ffc09164: 80 c1 00 0c lwz r6,12(r1) ffc09168: 80 09 00 40 lwz r0,64(r9) ffc0916c: 7f a5 eb 78 mr r5,r29 ffc09170: 7c 09 03 a6 mtctr r0 ffc09174: 4e 80 04 21 bctrl ffc09178: 7c 7c 1b 78 mr r28,r3 rtems_filesystem_freenode( &new_parent_loc ); ffc0917c: 7f a3 eb 78 mr r3,r29 ffc09180: 4b ff e9 0d bl ffc07a8c if ( free_old_parentloc ) ffc09184: 41 b2 00 0c beq+ cr4,ffc09190 <_rename_r+0x1bc> rtems_filesystem_freenode( &old_parent_loc ); ffc09188: 7f e3 fb 78 mr r3,r31 ffc0918c: 4b ff e9 01 bl ffc07a8c rtems_filesystem_freenode( &old_loc ); ffc09190: 38 61 00 10 addi r3,r1,16 ffc09194: 4b ff e8 f9 bl ffc07a8c return result; } ffc09198: 81 81 00 5c lwz r12,92(r1) ffc0919c: 39 61 00 78 addi r11,r1,120 ffc091a0: 7f 83 e3 78 mr r3,r28 ffc091a4: 7d 80 81 20 mtcrf 8,r12 ffc091a8: 4b ff a3 b8 b ffc03560 <_restgpr_26_x> =============================================================================== ffc0840c : * operation(s) cannot be canceled */ int aio_cancel(int fildes, struct aiocb *aiocbp) { ffc0840c: 94 21 ff e0 stwu r1,-32(r1) ffc08410: 7c 08 02 a6 mflr r0 ffc08414: bf 61 00 0c stmw r27,12(r1) rtems_aio_request_chain *r_chain; int result; pthread_mutex_lock (&aio_request_queue.mutex); ffc08418: 3f e0 00 00 lis r31,0 ffc0841c: 3b ff 2c 70 addi r31,r31,11376 * operation(s) cannot be canceled */ int aio_cancel(int fildes, struct aiocb *aiocbp) { ffc08420: 7c 7d 1b 78 mr r29,r3 ffc08424: 90 01 00 24 stw r0,36(r1) rtems_aio_request_chain *r_chain; int result; pthread_mutex_lock (&aio_request_queue.mutex); ffc08428: 7f e3 fb 78 mr r3,r31 * operation(s) cannot be canceled */ int aio_cancel(int fildes, struct aiocb *aiocbp) { ffc0842c: 7c 9e 23 78 mr r30,r4 rtems_aio_request_chain *r_chain; int result; pthread_mutex_lock (&aio_request_queue.mutex); ffc08430: 48 00 12 2d bl ffc0965c if (fcntl (fildes, F_GETFD) < 0) { ffc08434: 7f a3 eb 78 mr r3,r29 ffc08438: 38 80 00 01 li r4,1 ffc0843c: 4c c6 31 82 crclr 4*cr1+eq ffc08440: 48 00 73 89 bl ffc0f7c8 ffc08444: 2f 83 00 00 cmpwi cr7,r3,0 ffc08448: 40 bc 00 18 bge+ cr7,ffc08460 pthread_mutex_unlock(&aio_request_queue.mutex); ffc0844c: 7f e3 fb 78 mr r3,r31 ffc08450: 48 00 12 b1 bl ffc09700 rtems_set_errno_and_return_minus_one (EBADF); ffc08454: 48 00 ac a5 bl ffc130f8 <__errno> ffc08458: 38 00 00 09 li r0,9 ffc0845c: 48 00 00 c8 b ffc08524 } /* if aiocbp is NULL remove all request for given file descriptor */ if (aiocbp == NULL) { ffc08460: 2f 9e 00 00 cmpwi cr7,r30,0 ffc08464: 40 be 00 a4 bne+ cr7,ffc08508 AIO_printf ("Cancel all requests\n"); r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0); ffc08468: 38 7f 00 48 addi r3,r31,72 ffc0846c: 7f a4 eb 78 mr r4,r29 ffc08470: 38 a0 00 00 li r5,0 ffc08474: 48 00 02 d1 bl ffc08744 if (r_chain == NULL) { ffc08478: 7c 7e 1b 79 mr. r30,r3 ffc0847c: 40 a2 00 58 bne+ ffc084d4 AIO_printf ("Request chain not on [WQ]\n"); if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) { ffc08480: 81 3f 00 54 lwz r9,84(r31) ffc08484: 38 1f 00 58 addi r0,r31,88 ffc08488: 7f 89 00 00 cmpw cr7,r9,r0 ffc0848c: 41 9e 00 f8 beq- cr7,ffc08584 <== NEVER TAKEN r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0); ffc08490: 38 7f 00 54 addi r3,r31,84 ffc08494: 7f a4 eb 78 mr r4,r29 ffc08498: 38 a0 00 00 li r5,0 ffc0849c: 48 00 02 a9 bl ffc08744 if (r_chain == NULL) { ffc084a0: 7c 7e 1b 79 mr. r30,r3 ffc084a4: 41 82 00 e0 beq- ffc08584 */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); ffc084a8: 48 00 2d b5 bl ffc0b25c <_Chain_Extract> AIO_printf ("Request chain on [IQ]\n"); rtems_chain_extract (&r_chain->next_fd); rtems_aio_remove_fd (r_chain); pthread_mutex_destroy (&r_chain->mutex); ffc084ac: 3b be 00 1c addi r29,r30,28 } AIO_printf ("Request chain on [IQ]\n"); rtems_chain_extract (&r_chain->next_fd); rtems_aio_remove_fd (r_chain); ffc084b0: 7f c3 f3 78 mr r3,r30 ffc084b4: 48 00 06 69 bl ffc08b1c pthread_mutex_destroy (&r_chain->mutex); ffc084b8: 7f a3 eb 78 mr r3,r29 ffc084bc: 48 00 0e d5 bl ffc09390 pthread_cond_destroy (&r_chain->mutex); ffc084c0: 7f a3 eb 78 mr r3,r29 ffc084c4: 48 00 0b 05 bl ffc08fc8 free (r_chain); ffc084c8: 7f c3 f3 78 mr r3,r30 ffc084cc: 4b ff ca e9 bl ffc04fb4 ffc084d0: 48 00 00 28 b ffc084f8 return AIO_ALLDONE; } AIO_printf ("Request chain on [WQ]\n"); pthread_mutex_lock (&r_chain->mutex); ffc084d4: 3b be 00 1c addi r29,r30,28 ffc084d8: 7f a3 eb 78 mr r3,r29 ffc084dc: 48 00 11 81 bl ffc0965c ffc084e0: 7f c3 f3 78 mr r3,r30 ffc084e4: 48 00 2d 79 bl ffc0b25c <_Chain_Extract> rtems_chain_extract (&r_chain->next_fd); rtems_aio_remove_fd (r_chain); ffc084e8: 7f c3 f3 78 mr r3,r30 ffc084ec: 48 00 06 31 bl ffc08b1c pthread_mutex_unlock (&r_chain->mutex); ffc084f0: 7f a3 eb 78 mr r3,r29 ffc084f4: 48 00 12 0d bl ffc09700 pthread_mutex_unlock (&aio_request_queue.mutex); ffc084f8: 7f e3 fb 78 mr r3,r31 ffc084fc: 48 00 12 05 bl ffc09700 return AIO_CANCELED; ffc08500: 3b c0 00 00 li r30,0 ffc08504: 48 00 00 bc b ffc085c0 } else { AIO_printf ("Cancel request\n"); if (aiocbp->aio_fildes != fildes) { ffc08508: 83 9e 00 00 lwz r28,0(r30) ffc0850c: 7f 9c e8 00 cmpw cr7,r28,r29 ffc08510: 41 be 00 20 beq+ cr7,ffc08530 pthread_mutex_unlock (&aio_request_queue.mutex); ffc08514: 7f e3 fb 78 mr r3,r31 ffc08518: 48 00 11 e9 bl ffc09700 rtems_set_errno_and_return_minus_one (EINVAL); ffc0851c: 48 00 ab dd bl ffc130f8 <__errno> ffc08520: 38 00 00 16 li r0,22 ffc08524: 90 03 00 00 stw r0,0(r3) ffc08528: 3b c0 ff ff li r30,-1 ffc0852c: 48 00 00 94 b ffc085c0 } r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0); ffc08530: 38 7f 00 48 addi r3,r31,72 ffc08534: 7f 84 e3 78 mr r4,r28 ffc08538: 38 a0 00 00 li r5,0 ffc0853c: 48 00 02 09 bl ffc08744 if (r_chain == NULL) { ffc08540: 7c 7b 1b 79 mr. r27,r3 ffc08544: 40 a2 00 50 bne+ ffc08594 if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) { ffc08548: 81 3f 00 54 lwz r9,84(r31) ffc0854c: 38 1f 00 58 addi r0,r31,88 ffc08550: 7f 89 00 00 cmpw cr7,r9,r0 ffc08554: 41 9e 00 30 beq- cr7,ffc08584 <== NEVER TAKEN r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0); ffc08558: 38 7f 00 54 addi r3,r31,84 ffc0855c: 7f 84 e3 78 mr r4,r28 ffc08560: 38 a0 00 00 li r5,0 ffc08564: 48 00 01 e1 bl ffc08744 if (r_chain == NULL) { ffc08568: 2c 03 00 00 cmpwi r3,0 ffc0856c: 41 a2 ff a8 beq- ffc08514 rtems_set_errno_and_return_minus_one (EINVAL); } AIO_printf ("Request on [IQ]\n"); result = rtems_aio_remove_req (&r_chain->perfd, aiocbp); ffc08570: 7f c4 f3 78 mr r4,r30 ffc08574: 38 63 00 08 addi r3,r3,8 ffc08578: 48 00 05 fd bl ffc08b74 ffc0857c: 7c 7e 1b 78 mr r30,r3 ffc08580: 48 00 00 38 b ffc085b8 pthread_mutex_unlock (&aio_request_queue.mutex); return result; } else { pthread_mutex_unlock (&aio_request_queue.mutex); ffc08584: 7f e3 fb 78 mr r3,r31 ffc08588: 48 00 11 79 bl ffc09700 return AIO_ALLDONE; ffc0858c: 3b c0 00 02 li r30,2 ffc08590: 48 00 00 30 b ffc085c0 } } AIO_printf ("Request on [WQ]\n"); pthread_mutex_lock (&r_chain->mutex); ffc08594: 3b bb 00 1c addi r29,r27,28 ffc08598: 7f a3 eb 78 mr r3,r29 ffc0859c: 48 00 10 c1 bl ffc0965c result = rtems_aio_remove_req (&r_chain->perfd, aiocbp); ffc085a0: 7f c4 f3 78 mr r4,r30 ffc085a4: 38 7b 00 08 addi r3,r27,8 ffc085a8: 48 00 05 cd bl ffc08b74 ffc085ac: 7c 7e 1b 78 mr r30,r3 pthread_mutex_unlock (&r_chain->mutex); ffc085b0: 7f a3 eb 78 mr r3,r29 ffc085b4: 48 00 11 4d bl ffc09700 pthread_mutex_unlock (&aio_request_queue.mutex); ffc085b8: 7f e3 fb 78 mr r3,r31 ffc085bc: 48 00 11 45 bl ffc09700 return result; } return AIO_ALLDONE; } ffc085c0: 39 61 00 20 addi r11,r1,32 ffc085c4: 7f c3 f3 78 mr r3,r30 ffc085c8: 4b ff 85 60 b ffc00b28 <_restgpr_27_x> =============================================================================== ffc085d4 : ) { rtems_aio_request *req; int mode; if (op != O_SYNC) ffc085d4: 2f 83 20 00 cmpwi cr7,r3,8192 int aio_fsync( int op, struct aiocb *aiocbp ) { ffc085d8: 94 21 ff f0 stwu r1,-16(r1) ffc085dc: 7c 08 02 a6 mflr r0 ffc085e0: bf c1 00 08 stmw r30,8(r1) ffc085e4: 7c 9f 23 78 mr r31,r4 rtems_aio_request *req; int mode; if (op != O_SYNC) rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); ffc085e8: 3b c0 00 16 li r30,22 int aio_fsync( int op, struct aiocb *aiocbp ) { ffc085ec: 90 01 00 14 stw r0,20(r1) rtems_aio_request *req; int mode; if (op != O_SYNC) ffc085f0: 40 9e 00 28 bne- cr7,ffc08618 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); mode = fcntl (aiocbp->aio_fildes, F_GETFL); ffc085f4: 80 64 00 00 lwz r3,0(r4) ffc085f8: 38 80 00 03 li r4,3 ffc085fc: 4c c6 31 82 crclr 4*cr1+eq ffc08600: 48 00 71 c9 bl ffc0f7c8 if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR))) ffc08604: 54 63 07 be clrlwi r3,r3,30 ffc08608: 38 63 ff ff addi r3,r3,-1 ffc0860c: 2b 83 00 01 cmplwi cr7,r3,1 ffc08610: 40 bd 00 24 ble+ cr7,ffc08634 rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); ffc08614: 3b c0 00 09 li r30,9 ffc08618: 38 00 ff ff li r0,-1 ffc0861c: 93 df 00 34 stw r30,52(r31) ffc08620: 90 1f 00 38 stw r0,56(r31) ffc08624: 48 00 aa d5 bl ffc130f8 <__errno> ffc08628: 93 c3 00 00 stw r30,0(r3) ffc0862c: 38 60 ff ff li r3,-1 ffc08630: 48 00 00 28 b ffc08658 req = malloc (sizeof (rtems_aio_request)); ffc08634: 38 60 00 18 li r3,24 ffc08638: 4b ff cf f5 bl ffc0562c if (req == NULL) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); ffc0863c: 3b c0 00 0b li r30,11 mode = fcntl (aiocbp->aio_fildes, F_GETFL); if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR))) rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); req = malloc (sizeof (rtems_aio_request)); if (req == NULL) ffc08640: 7c 69 1b 79 mr. r9,r3 ffc08644: 41 a2 ff d4 beq- ffc08618 <== NEVER TAKEN rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); req->aiocbp = aiocbp; req->aiocbp->aio_lio_opcode = LIO_SYNC; ffc08648: 38 00 00 03 li r0,3 req = malloc (sizeof (rtems_aio_request)); if (req == NULL) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); req->aiocbp = aiocbp; ffc0864c: 93 e9 00 14 stw r31,20(r9) req->aiocbp->aio_lio_opcode = LIO_SYNC; ffc08650: 90 1f 00 30 stw r0,48(r31) return rtems_aio_enqueue (req); ffc08654: 48 00 05 9d bl ffc08bf0 } ffc08658: 39 61 00 10 addi r11,r1,16 ffc0865c: 4b ff 84 d8 b ffc00b34 <_restgpr_30_x> =============================================================================== ffc08e10 : * 0 - otherwise */ int aio_read (struct aiocb *aiocbp) { ffc08e10: 94 21 ff f0 stwu r1,-16(r1) ffc08e14: 7c 08 02 a6 mflr r0 rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); ffc08e18: 38 80 00 03 li r4,3 * 0 - otherwise */ int aio_read (struct aiocb *aiocbp) { ffc08e1c: 90 01 00 14 stw r0,20(r1) ffc08e20: bf c1 00 08 stmw r30,8(r1) ffc08e24: 7c 7f 1b 78 mr r31,r3 rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); ffc08e28: 80 63 00 00 lwz r3,0(r3) ffc08e2c: 4c c6 31 82 crclr 4*cr1+eq ffc08e30: 48 00 69 99 bl ffc0f7c8 if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR))) ffc08e34: 70 63 00 03 andi. r3,r3,3 ffc08e38: 41 82 00 10 beq- ffc08e48 <== NEVER TAKEN ffc08e3c: 2f 83 00 02 cmpwi cr7,r3,2 rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); ffc08e40: 3b c0 00 09 li r30,9 { rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR))) ffc08e44: 40 9e 00 14 bne- cr7,ffc08e58 rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX) ffc08e48: 80 1f 00 18 lwz r0,24(r31) ffc08e4c: 2f 80 00 00 cmpwi cr7,r0,0 ffc08e50: 41 be 00 24 beq+ cr7,ffc08e74 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); ffc08e54: 3b c0 00 16 li r30,22 ffc08e58: 38 00 ff ff li r0,-1 ffc08e5c: 93 df 00 34 stw r30,52(r31) ffc08e60: 90 1f 00 38 stw r0,56(r31) ffc08e64: 48 00 a2 95 bl ffc130f8 <__errno> ffc08e68: 93 c3 00 00 stw r30,0(r3) ffc08e6c: 38 60 ff ff li r3,-1 ffc08e70: 48 00 00 34 b ffc08ea4 if (aiocbp->aio_offset < 0) ffc08e74: 80 1f 00 08 lwz r0,8(r31) ffc08e78: 2f 80 00 00 cmpwi cr7,r0,0 ffc08e7c: 41 bc ff d8 blt- cr7,ffc08e54 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); req = malloc (sizeof (rtems_aio_request)); ffc08e80: 38 60 00 18 li r3,24 ffc08e84: 4b ff c7 a9 bl ffc0562c if (req == NULL) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); ffc08e88: 3b c0 00 0b li r30,11 if (aiocbp->aio_offset < 0) rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); req = malloc (sizeof (rtems_aio_request)); if (req == NULL) ffc08e8c: 7c 69 1b 79 mr. r9,r3 ffc08e90: 41 a2 ff c8 beq- ffc08e58 <== NEVER TAKEN rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); req->aiocbp = aiocbp; req->aiocbp->aio_lio_opcode = LIO_READ; ffc08e94: 38 00 00 01 li r0,1 req = malloc (sizeof (rtems_aio_request)); if (req == NULL) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); req->aiocbp = aiocbp; ffc08e98: 93 e9 00 14 stw r31,20(r9) req->aiocbp->aio_lio_opcode = LIO_READ; ffc08e9c: 90 1f 00 30 stw r0,48(r31) return rtems_aio_enqueue (req); ffc08ea0: 4b ff fd 51 bl ffc08bf0 } ffc08ea4: 39 61 00 10 addi r11,r1,16 ffc08ea8: 4b ff 7c 8c b ffc00b34 <_restgpr_30_x> =============================================================================== ffc08eb4 : * 0 - otherwise */ int aio_write (struct aiocb *aiocbp) { ffc08eb4: 94 21 ff f0 stwu r1,-16(r1) ffc08eb8: 7c 08 02 a6 mflr r0 rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); ffc08ebc: 38 80 00 03 li r4,3 * 0 - otherwise */ int aio_write (struct aiocb *aiocbp) { ffc08ec0: 90 01 00 14 stw r0,20(r1) ffc08ec4: bf c1 00 08 stmw r30,8(r1) ffc08ec8: 7c 7f 1b 78 mr r31,r3 rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR))) rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); ffc08ecc: 3b c0 00 09 li r30,9 aio_write (struct aiocb *aiocbp) { rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); ffc08ed0: 80 63 00 00 lwz r3,0(r3) ffc08ed4: 4c c6 31 82 crclr 4*cr1+eq ffc08ed8: 48 00 68 f1 bl ffc0f7c8 if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR))) ffc08edc: 54 63 07 be clrlwi r3,r3,30 ffc08ee0: 38 63 ff ff addi r3,r3,-1 ffc08ee4: 2b 83 00 01 cmplwi cr7,r3,1 ffc08ee8: 41 9d 00 14 bgt- cr7,ffc08efc rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX) ffc08eec: 80 1f 00 18 lwz r0,24(r31) ffc08ef0: 2f 80 00 00 cmpwi cr7,r0,0 ffc08ef4: 41 be 00 24 beq+ cr7,ffc08f18 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); ffc08ef8: 3b c0 00 16 li r30,22 ffc08efc: 38 00 ff ff li r0,-1 ffc08f00: 93 df 00 34 stw r30,52(r31) ffc08f04: 90 1f 00 38 stw r0,56(r31) ffc08f08: 48 00 a1 f1 bl ffc130f8 <__errno> ffc08f0c: 93 c3 00 00 stw r30,0(r3) ffc08f10: 38 60 ff ff li r3,-1 ffc08f14: 48 00 00 34 b ffc08f48 if (aiocbp->aio_offset < 0) ffc08f18: 80 1f 00 08 lwz r0,8(r31) ffc08f1c: 2f 80 00 00 cmpwi cr7,r0,0 ffc08f20: 41 bc ff d8 blt- cr7,ffc08ef8 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); req = malloc (sizeof (rtems_aio_request)); ffc08f24: 38 60 00 18 li r3,24 ffc08f28: 4b ff c7 05 bl ffc0562c if (req == NULL) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); ffc08f2c: 3b c0 00 0b li r30,11 if (aiocbp->aio_offset < 0) rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); req = malloc (sizeof (rtems_aio_request)); if (req == NULL) ffc08f30: 7c 69 1b 79 mr. r9,r3 ffc08f34: 41 a2 ff c8 beq- ffc08efc <== NEVER TAKEN rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); req->aiocbp = aiocbp; req->aiocbp->aio_lio_opcode = LIO_WRITE; ffc08f38: 38 00 00 02 li r0,2 req = malloc (sizeof (rtems_aio_request)); if (req == NULL) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); req->aiocbp = aiocbp; ffc08f3c: 93 e9 00 14 stw r31,20(r9) req->aiocbp->aio_lio_opcode = LIO_WRITE; ffc08f40: 90 1f 00 30 stw r0,48(r31) return rtems_aio_enqueue (req); ffc08f44: 4b ff fc ad bl ffc08bf0 } ffc08f48: 39 61 00 10 addi r11,r1,16 ffc08f4c: 4b ff 7b e8 b ffc00b34 <_restgpr_30_x> =============================================================================== ffc04194 : #include int chroot( const char *pathname ) { ffc04194: 94 21 ff c8 stwu r1,-56(r1) ffc04198: 7c 08 02 a6 mflr r0 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) { ffc0419c: 3d 20 00 00 lis r9,0 #include int chroot( const char *pathname ) { ffc041a0: bf a1 00 2c stmw r29,44(r1) 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) { ffc041a4: 3f c0 00 00 lis r30,0 #include int chroot( const char *pathname ) { ffc041a8: 7c 7d 1b 78 mr r29,r3 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) { ffc041ac: 83 fe 27 34 lwz r31,10036(r30) #include int chroot( const char *pathname ) { ffc041b0: 90 01 00 3c stw r0,60(r1) 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) { ffc041b4: 38 09 2b 50 addi r0,r9,11088 ffc041b8: 7f 9f 00 00 cmpw cr7,r31,r0 ffc041bc: 40 be 00 24 bne+ cr7,ffc041e0 rtems_libio_set_private_env(); /* try to set a new private env*/ ffc041c0: 48 00 15 69 bl ffc05728 if (rtems_current_user_env == &rtems_global_user_env) /* not ok */ ffc041c4: 80 1e 27 34 lwz r0,10036(r30) ffc041c8: 7f 80 f8 00 cmpw cr7,r0,r31 ffc041cc: 40 be 00 14 bne+ cr7,ffc041e0 rtems_set_errno_and_return_minus_one( ENOTSUP ); ffc041d0: 48 00 c4 91 bl ffc10660 <__errno> ffc041d4: 38 00 00 86 li r0,134 ffc041d8: 90 03 00 00 stw r0,0(r3) ffc041dc: 48 00 00 28 b ffc04204 } result = chdir(pathname); ffc041e0: 7f a3 eb 78 mr r3,r29 ffc041e4: 48 00 8b 49 bl ffc0cd2c if (result) { ffc041e8: 2f 83 00 00 cmpwi cr7,r3,0 ffc041ec: 41 be 00 20 beq+ cr7,ffc0420c rtems_set_errno_and_return_minus_one( errno ); ffc041f0: 48 00 c4 71 bl ffc10660 <__errno> ffc041f4: 7c 7f 1b 78 mr r31,r3 ffc041f8: 48 00 c4 69 bl ffc10660 <__errno> ffc041fc: 80 03 00 00 lwz r0,0(r3) ffc04200: 90 1f 00 00 stw r0,0(r31) ffc04204: 38 60 ff ff li r3,-1 ffc04208: 48 00 00 50 b ffc04258 } /* clone the new root location */ if (rtems_filesystem_evaluate_path(".", 1, 0, &loc, 0)) { ffc0420c: 3c 60 ff c1 lis r3,-63 ffc04210: 3b e1 00 08 addi r31,r1,8 ffc04214: 38 63 74 74 addi r3,r3,29812 ffc04218: 38 80 00 01 li r4,1 ffc0421c: 38 a0 00 00 li r5,0 ffc04220: 7f e6 fb 78 mr r6,r31 ffc04224: 38 e0 00 00 li r7,0 ffc04228: 48 00 01 49 bl ffc04370 ffc0422c: 2f 83 00 00 cmpwi cr7,r3,0 ffc04230: 40 be ff c0 bne- cr7,ffc041f0 <== 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); ffc04234: 3f c0 00 00 lis r30,0 ffc04238: 80 7e 27 34 lwz r3,10036(r30) ffc0423c: 38 63 00 18 addi r3,r3,24 ffc04240: 48 00 02 25 bl ffc04464 rtems_filesystem_root = loc; ffc04244: 81 7e 27 34 lwz r11,10036(r30) return 0; ffc04248: 38 60 00 00 li r3,0 if (rtems_filesystem_evaluate_path(".", 1, 0, &loc, 0)) { /* our cwd has changed, though - but there is no easy way of return :-( */ rtems_set_errno_and_return_minus_one( errno ); } rtems_filesystem_freenode(&rtems_filesystem_root); rtems_filesystem_root = loc; ffc0424c: 39 6b 00 18 addi r11,r11,24 ffc04250: 7c bf a4 aa lswi r5,r31,20 ffc04254: 7c ab a5 aa stswi r5,r11,20 return 0; } ffc04258: 39 61 00 38 addi r11,r1,56 ffc0425c: 48 01 12 f4 b ffc15550 <_restgpr_29_x> =============================================================================== ffc07898 : int clock_gettime( clockid_t clock_id, struct timespec *tp ) { ffc07898: 7c 08 02 a6 mflr r0 ffc0789c: 94 21 ff f8 stwu r1,-8(r1) ffc078a0: 90 01 00 0c stw r0,12(r1) ffc078a4: 7c 60 1b 78 mr r0,r3 if ( !tp ) ffc078a8: 7c 83 23 79 mr. r3,r4 ffc078ac: 41 82 00 44 beq- ffc078f0 rtems_set_errno_and_return_minus_one( EINVAL ); if ( clock_id == CLOCK_REALTIME ) { ffc078b0: 2f 80 00 01 cmpwi cr7,r0,1 ffc078b4: 40 be 00 0c bne+ cr7,ffc078c0 _TOD_Get(tp); ffc078b8: 48 00 21 89 bl ffc09a40 <_TOD_Get> ffc078bc: 48 00 00 18 b ffc078d4 return 0; } #ifdef CLOCK_MONOTONIC if ( clock_id == CLOCK_MONOTONIC ) { ffc078c0: 2f 80 00 04 cmpwi cr7,r0,4 ffc078c4: 41 9e 00 0c beq- cr7,ffc078d0 <== NEVER TAKEN return 0; } #endif #ifdef _POSIX_CPUTIME if ( clock_id == CLOCK_PROCESS_CPUTIME ) { ffc078c8: 2f 80 00 02 cmpwi cr7,r0,2 ffc078cc: 40 be 00 10 bne+ cr7,ffc078dc _TOD_Get_uptime_as_timespec( tp ); ffc078d0: 48 00 21 f1 bl ffc09ac0 <_TOD_Get_uptime_as_timespec> return 0; ffc078d4: 38 60 00 00 li r3,0 ffc078d8: 48 00 00 28 b ffc07900 } #endif #ifdef _POSIX_THREAD_CPUTIME if ( clock_id == CLOCK_THREAD_CPUTIME ) ffc078dc: 2f 80 00 03 cmpwi cr7,r0,3 ffc078e0: 40 be 00 10 bne+ cr7,ffc078f0 rtems_set_errno_and_return_minus_one( ENOSYS ); ffc078e4: 48 00 9c 61 bl ffc11544 <__errno> ffc078e8: 38 00 00 58 li r0,88 ffc078ec: 48 00 00 0c b ffc078f8 #endif rtems_set_errno_and_return_minus_one( EINVAL ); ffc078f0: 48 00 9c 55 bl ffc11544 <__errno> ffc078f4: 38 00 00 16 li r0,22 ffc078f8: 90 03 00 00 stw r0,0(r3) ffc078fc: 38 60 ff ff li r3,-1 return 0; } ffc07900: 80 01 00 0c lwz r0,12(r1) ffc07904: 38 21 00 08 addi r1,r1,8 ffc07908: 7c 08 03 a6 mtlr r0 ffc0790c: 4e 80 00 20 blr =============================================================================== ffc07910 : int clock_settime( clockid_t clock_id, const struct timespec *tp ) { ffc07910: 7c 08 02 a6 mflr r0 ffc07914: 94 21 ff f8 stwu r1,-8(r1) ffc07918: 90 01 00 0c stw r0,12(r1) ffc0791c: 7c 60 1b 78 mr r0,r3 if ( !tp ) ffc07920: 7c 83 23 79 mr. r3,r4 ffc07924: 41 82 00 5c beq- ffc07980 <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); if ( clock_id == CLOCK_REALTIME ) { ffc07928: 2f 80 00 01 cmpwi cr7,r0,1 ffc0792c: 40 be 00 38 bne+ cr7,ffc07964 if ( tp->tv_sec < TOD_SECONDS_1970_THROUGH_1988 ) ffc07930: 81 23 00 00 lwz r9,0(r3) ffc07934: 3c 00 21 da lis r0,8666 ffc07938: 60 00 e4 ff ori r0,r0,58623 ffc0793c: 7f 89 00 40 cmplw cr7,r9,r0 ffc07940: 40 9d 00 40 ble- cr7,ffc07980 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; ffc07944: 3d 20 00 00 lis r9,0 ffc07948: 81 69 28 78 lwz r11,10360(r9) ffc0794c: 38 0b 00 01 addi r0,r11,1 ffc07950: 90 09 28 78 stw r0,10360(r9) rtems_set_errno_and_return_minus_one( EINVAL ); _Thread_Disable_dispatch(); _TOD_Set( tp ); ffc07954: 48 00 21 dd bl ffc09b30 <_TOD_Set> _Thread_Enable_dispatch(); ffc07958: 48 00 3a 21 bl ffc0b378 <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one( ENOSYS ); #endif else rtems_set_errno_and_return_minus_one( EINVAL ); return 0; ffc0795c: 38 60 00 00 li r3,0 ffc07960: 48 00 00 30 b ffc07990 _Thread_Disable_dispatch(); _TOD_Set( tp ); _Thread_Enable_dispatch(); } #ifdef _POSIX_CPUTIME else if ( clock_id == CLOCK_PROCESS_CPUTIME ) ffc07964: 2f 80 00 02 cmpwi cr7,r0,2 ffc07968: 41 9e 00 0c beq- cr7,ffc07974 rtems_set_errno_and_return_minus_one( ENOSYS ); #endif #ifdef _POSIX_THREAD_CPUTIME else if ( clock_id == CLOCK_THREAD_CPUTIME ) ffc0796c: 2f 80 00 03 cmpwi cr7,r0,3 ffc07970: 40 be 00 10 bne+ cr7,ffc07980 rtems_set_errno_and_return_minus_one( ENOSYS ); ffc07974: 48 00 9b d1 bl ffc11544 <__errno> ffc07978: 38 00 00 58 li r0,88 ffc0797c: 48 00 00 0c b ffc07988 #endif else rtems_set_errno_and_return_minus_one( EINVAL ); ffc07980: 48 00 9b c5 bl ffc11544 <__errno> ffc07984: 38 00 00 16 li r0,22 ffc07988: 90 03 00 00 stw r0,0(r3) ffc0798c: 38 60 ff ff li r3,-1 return 0; } ffc07990: 80 01 00 0c lwz r0,12(r1) ffc07994: 38 21 00 08 addi r1,r1,8 ffc07998: 7c 08 03 a6 mtlr r0 ffc0799c: 4e 80 00 20 blr =============================================================================== ffc0c2dc : const char *pathname, size_t pathnamelen, int flags, rtems_filesystem_location_info_t *pathloc ) { ffc0c2dc: 94 21 ff d8 stwu r1,-40(r1) ffc0c2e0: 7c 08 02 a6 mflr r0 ffc0c2e4: 90 01 00 2c stw r0,44(r1) int i; rtems_device_name_t *device_name_table; /* see if 'flags' is valid */ if ( !rtems_libio_is_valid_perms( flags ) ) ffc0c2e8: 54 a0 00 39 rlwinm. r0,r5,0,0,28 const char *pathname, size_t pathnamelen, int flags, rtems_filesystem_location_info_t *pathloc ) { ffc0c2ec: bf 21 00 0c stmw r25,12(r1) ffc0c2f0: 7c 7e 1b 78 mr r30,r3 ffc0c2f4: 7c 9f 23 78 mr r31,r4 ffc0c2f8: 7c dd 33 78 mr r29,r6 int i; rtems_device_name_t *device_name_table; /* see if 'flags' is valid */ if ( !rtems_libio_is_valid_perms( flags ) ) ffc0c2fc: 41 a2 00 10 beq+ ffc0c30c <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EPERM ); ffc0c300: 48 00 29 f1 bl ffc0ecf0 <__errno> <== NOT EXECUTED ffc0c304: 38 00 00 01 li r0,1 <== NOT EXECUTED ffc0c308: 48 00 00 a0 b ffc0c3a8 <== NOT EXECUTED /* get the device name table */ device_name_table = (rtems_device_name_t *)pathloc->node_access; ffc0c30c: 83 86 00 00 lwz r28,0(r6) if (!device_name_table) ffc0c310: 3b 60 00 00 li r27,0 rtems_set_errno_and_return_minus_one( EFAULT ); for (i = 0; i < rtems_device_table_size; i++) { ffc0c314: 3f 20 00 00 lis r25,0 if ( !rtems_libio_is_valid_perms( flags ) ) rtems_set_errno_and_return_minus_one( EPERM ); /* get the device name table */ device_name_table = (rtems_device_name_t *)pathloc->node_access; if (!device_name_table) ffc0c318: 2f 9c 00 00 cmpwi cr7,r28,0 ffc0c31c: 40 be 00 78 bne+ cr7,ffc0c394 rtems_set_errno_and_return_minus_one( EFAULT ); ffc0c320: 48 00 29 d1 bl ffc0ecf0 <__errno> ffc0c324: 38 00 00 0e li r0,14 ffc0c328: 48 00 00 80 b ffc0c3a8 for (i = 0; i < rtems_device_table_size; i++) { if (!device_name_table[i].device_name) ffc0c32c: 83 5c 00 00 lwz r26,0(r28) ffc0c330: 2f 9a 00 00 cmpwi cr7,r26,0 ffc0c334: 41 9e 00 58 beq- cr7,ffc0c38c continue; if (strncmp(pathname, device_name_table[i].device_name, pathnamelen) != 0) ffc0c338: 7f c3 f3 78 mr r3,r30 ffc0c33c: 7f 44 d3 78 mr r4,r26 ffc0c340: 7f e5 fb 78 mr r5,r31 ffc0c344: 48 00 43 25 bl ffc10668 ffc0c348: 2f 83 00 00 cmpwi cr7,r3,0 ffc0c34c: 40 9e 00 40 bne- cr7,ffc0c38c continue; if (device_name_table[i].device_name[pathnamelen] != '\0') ffc0c350: 7c 1a f8 ae lbzx r0,r26,r31 ffc0c354: 2f 80 00 00 cmpwi cr7,r0,0 ffc0c358: 40 be 00 34 bne+ cr7,ffc0c38c <== NEVER TAKEN continue; /* find the device, set proper values */ pathloc->node_access = (void *)&device_name_table[i]; pathloc->handlers = &devFS_file_handlers; ffc0c35c: 3d 20 00 00 lis r9,0 if (device_name_table[i].device_name[pathnamelen] != '\0') continue; /* find the device, set proper values */ pathloc->node_access = (void *)&device_name_table[i]; ffc0c360: 93 9d 00 00 stw r28,0(r29) pathloc->handlers = &devFS_file_handlers; ffc0c364: 38 09 21 78 addi r0,r9,8568 pathloc->ops = &devFS_ops; ffc0c368: 3d 20 00 00 lis r9,0 if (device_name_table[i].device_name[pathnamelen] != '\0') continue; /* find the device, set proper values */ pathloc->node_access = (void *)&device_name_table[i]; pathloc->handlers = &devFS_file_handlers; ffc0c36c: 90 1d 00 08 stw r0,8(r29) pathloc->ops = &devFS_ops; ffc0c370: 38 09 21 b0 addi r0,r9,8624 pathloc->mt_entry = rtems_filesystem_root.mt_entry; ffc0c374: 3d 20 00 00 lis r9,0 continue; /* find the device, set proper values */ pathloc->node_access = (void *)&device_name_table[i]; pathloc->handlers = &devFS_file_handlers; pathloc->ops = &devFS_ops; ffc0c378: 90 1d 00 0c stw r0,12(r29) pathloc->mt_entry = rtems_filesystem_root.mt_entry; ffc0c37c: 81 29 27 b4 lwz r9,10164(r9) ffc0c380: 80 09 00 28 lwz r0,40(r9) ffc0c384: 90 1d 00 10 stw r0,16(r29) return 0; ffc0c388: 48 00 00 28 b ffc0c3b0 /* 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++) { ffc0c38c: 3b 7b 00 01 addi r27,r27,1 ffc0c390: 3b 9c 00 14 addi r28,r28,20 ffc0c394: 80 19 27 70 lwz r0,10096(r25) ffc0c398: 7f 9b 00 40 cmplw cr7,r27,r0 ffc0c39c: 41 9c ff 90 blt+ cr7,ffc0c32c pathloc->mt_entry = rtems_filesystem_root.mt_entry; return 0; } /* no such file or directory */ rtems_set_errno_and_return_minus_one( ENOENT ); ffc0c3a0: 48 00 29 51 bl ffc0ecf0 <__errno> ffc0c3a4: 38 00 00 02 li r0,2 ffc0c3a8: 90 03 00 00 stw r0,0(r3) ffc0c3ac: 38 60 ff ff li r3,-1 } ffc0c3b0: 39 61 00 28 addi r11,r1,40 ffc0c3b4: 48 00 c2 e4 b ffc18698 <_restgpr_25_x> =============================================================================== ffc047a0 : const char *path, mode_t mode, dev_t dev, rtems_filesystem_location_info_t *pathloc ) { ffc047a0: 94 21 ff d8 stwu r1,-40(r1) ffc047a4: 7c 08 02 a6 mflr r0 ffc047a8: bf 01 00 08 stmw r24,8(r1) ffc047ac: 7c 7f 1b 78 mr r31,r3 ffc047b0: 7c 9e 23 78 mr r30,r4 ffc047b4: 90 01 00 2c stw r0,44(r1) ffc047b8: 7c bd 2b 78 mr r29,r5 ffc047bc: 7c dc 33 78 mr r28,r6 * 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') && ffc047c0: 88 03 00 00 lbz r0,0(r3) ffc047c4: 2f 80 00 64 cmpwi cr7,r0,100 ffc047c8: 40 be 00 2c bne+ cr7,ffc047f4 ffc047cc: 88 03 00 01 lbz r0,1(r3) ffc047d0: 2f 80 00 65 cmpwi cr7,r0,101 ffc047d4: 40 be 00 20 bne+ cr7,ffc047f4 <== NEVER TAKEN ffc047d8: 88 03 00 02 lbz r0,2(r3) ffc047dc: 2f 80 00 76 cmpwi cr7,r0,118 ffc047e0: 40 be 00 14 bne+ cr7,ffc047f4 <== NEVER TAKEN (path[2] == 'v') && (path[3] == '\0')) ffc047e4: 88 03 00 03 lbz r0,3(r3) return 0; ffc047e8: 38 60 00 00 li r3,0 * 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')) ffc047ec: 2f 80 00 00 cmpwi cr7,r0,0 ffc047f0: 41 9e 00 e4 beq- cr7,ffc048d4 return 0; /* must be a character device or a block device */ if (!S_ISBLK(mode) && !S_ISCHR(mode)) ffc047f4: 57 c0 04 26 rlwinm r0,r30,0,16,19 ffc047f8: 2f 80 60 00 cmpwi cr7,r0,24576 ffc047fc: 41 9e 00 18 beq- cr7,ffc04814 ffc04800: 2f 80 20 00 cmpwi cr7,r0,8192 ffc04804: 41 be 00 10 beq+ cr7,ffc04814 rtems_set_errno_and_return_minus_one( EINVAL ); ffc04808: 48 00 a4 e9 bl ffc0ecf0 <__errno> ffc0480c: 38 00 00 16 li r0,22 ffc04810: 48 00 00 28 b ffc04838 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; ffc04814: 83 47 00 00 lwz r26,0(r7) if (!device_name_table) ffc04818: 2f 9a 00 00 cmpwi cr7,r26,0 ffc0481c: 41 9e 00 14 beq- cr7,ffc04830 ffc04820: 3b 20 ff ff li r25,-1 ffc04824: 3b 60 00 00 li r27,0 rtems_set_errno_and_return_minus_one( EFAULT ); for (slot = -1, i = 0; i < rtems_device_table_size; i++){ ffc04828: 3f 00 00 00 lis r24,0 ffc0482c: 48 00 00 4c b ffc04878 rtems_filesystem_split_dev_t(dev, major, minor); /* Find an empty slot in device name table */ device_name_table = (rtems_device_name_t *)pathloc->node_access; if (!device_name_table) rtems_set_errno_and_return_minus_one( EFAULT ); ffc04830: 48 00 a4 c1 bl ffc0ecf0 <__errno> ffc04834: 38 00 00 0e li r0,14 ffc04838: 90 03 00 00 stw r0,0(r3) ffc0483c: 38 60 ff ff li r3,-1 ffc04840: 48 00 00 94 b ffc048d4 #include #include #include "devfs.h" int devFS_mknod( ffc04844: 1c 1b 00 14 mulli r0,r27,20 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++){ if (device_name_table[i].device_name == NULL) ffc04848: 7c 9a 00 2e lwzx r4,r26,r0 ffc0484c: 2f 84 00 00 cmpwi cr7,r4,0 ffc04850: 41 9e 00 20 beq- cr7,ffc04870 slot = i; else if (strcmp(path, device_name_table[i].device_name) == 0) ffc04854: 7f e3 fb 78 mr r3,r31 ffc04858: 48 00 bc b9 bl ffc10510 ffc0485c: 2f 83 00 00 cmpwi cr7,r3,0 ffc04860: 40 be 00 14 bne+ cr7,ffc04874 rtems_set_errno_and_return_minus_one( EEXIST ); ffc04864: 48 00 a4 8d bl ffc0ecf0 <__errno> ffc04868: 38 00 00 11 li r0,17 ffc0486c: 4b ff ff cc b ffc04838 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; ffc04870: 7f 79 db 78 mr r25,r27 /* 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++){ ffc04874: 3b 7b 00 01 addi r27,r27,1 ffc04878: 80 18 27 70 lwz r0,10096(r24) ffc0487c: 7f 9b 00 40 cmplw cr7,r27,r0 ffc04880: 41 9c ff c4 blt+ cr7,ffc04844 else if (strcmp(path, device_name_table[i].device_name) == 0) rtems_set_errno_and_return_minus_one( EEXIST ); } if (slot == -1) ffc04884: 2f 99 ff ff cmpwi cr7,r25,-1 ffc04888: 40 be 00 10 bne+ cr7,ffc04898 rtems_set_errno_and_return_minus_one( ENOMEM ); ffc0488c: 48 00 a4 65 bl ffc0ecf0 <__errno> ffc04890: 38 00 00 0c li r0,12 ffc04894: 4b ff ff a4 b ffc04838 static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc04898: 7f 00 00 a6 mfmsr r24 ffc0489c: 7c 10 42 a6 mfsprg r0,0 ffc048a0: 7f 00 00 78 andc r0,r24,r0 ffc048a4: 7c 00 01 24 mtmsr r0 _ISR_Disable(level); device_name_table[slot].device_name = (char *)path; ffc048a8: 1f 39 00 14 mulli r25,r25,20 ffc048ac: 7f fa c9 2e stwx r31,r26,r25 device_name_table[slot].device_name_length = strlen(path); ffc048b0: 7f e3 fb 78 mr r3,r31 if (slot == -1) rtems_set_errno_and_return_minus_one( ENOMEM ); _ISR_Disable(level); device_name_table[slot].device_name = (char *)path; ffc048b4: 7f 7a ca 14 add r27,r26,r25 device_name_table[slot].device_name_length = strlen(path); ffc048b8: 48 00 bd 0d bl ffc105c4 device_name_table[slot].major = major; ffc048bc: 93 bb 00 08 stw r29,8(r27) if (slot == -1) rtems_set_errno_and_return_minus_one( ENOMEM ); _ISR_Disable(level); device_name_table[slot].device_name = (char *)path; device_name_table[slot].device_name_length = strlen(path); ffc048c0: 90 7b 00 04 stw r3,4(r27) device_name_table[slot].major = major; device_name_table[slot].minor = minor; ffc048c4: 93 9b 00 0c stw r28,12(r27) device_name_table[slot].mode = mode; ffc048c8: 93 db 00 10 stw r30,16(r27) return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc048cc: 7f 00 01 24 mtmsr r24 _ISR_Enable(level); return 0; ffc048d0: 38 60 00 00 li r3,0 } ffc048d4: 39 61 00 28 addi r11,r1,40 ffc048d8: 48 01 3d bc b ffc18694 <_restgpr_24_x> =============================================================================== ffc06294 : /* * Drain output queue */ static void drainOutput (struct rtems_termios_tty *tty) { ffc06294: 94 21 ff f0 stwu r1,-16(r1) ffc06298: 7c 08 02 a6 mflr r0 ffc0629c: 90 01 00 14 stw r0,20(r1) rtems_interrupt_level level; rtems_status_code sc; if (tty->device.outputUsesInterrupts != TERMIOS_POLLED) { ffc062a0: 80 03 00 b4 lwz r0,180(r3) /* * Drain output queue */ static void drainOutput (struct rtems_termios_tty *tty) { ffc062a4: bf c1 00 08 stmw r30,8(r1) ffc062a8: 7c 7f 1b 78 mr r31,r3 rtems_interrupt_level level; rtems_status_code sc; if (tty->device.outputUsesInterrupts != TERMIOS_POLLED) { ffc062ac: 2f 80 00 00 cmpwi cr7,r0,0 ffc062b0: 41 be 00 4c beq+ cr7,ffc062fc rtems_interrupt_disable (level); ffc062b4: 4b ff ff cd bl ffc06280 while (tty->rawOutBuf.Tail != tty->rawOutBuf.Head) { tty->rawOutBufState = rob_wait; ffc062b8: 3b c0 00 02 li r30,2 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) { ffc062bc: 48 00 00 2c b ffc062e8 tty->rawOutBufState = rob_wait; ffc062c0: 93 df 00 94 stw r30,148(r31) <== NOT EXECUTED static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc062c4: 7c 60 01 24 mtmsr r3 <== NOT EXECUTED rtems_interrupt_enable (level); sc = rtems_semaphore_obtain( ffc062c8: 80 7f 00 8c lwz r3,140(r31) <== NOT EXECUTED ffc062cc: 38 80 00 00 li r4,0 <== NOT EXECUTED ffc062d0: 38 a0 00 00 li r5,0 <== NOT EXECUTED ffc062d4: 48 00 27 51 bl ffc08a24 <== NOT EXECUTED tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) ffc062d8: 2f 83 00 00 cmpwi cr7,r3,0 <== NOT EXECUTED ffc062dc: 41 be 00 08 beq+ cr7,ffc062e4 <== NOT EXECUTED rtems_fatal_error_occurred (sc); ffc062e0: 48 00 2e c5 bl ffc091a4 <== NOT EXECUTED rtems_interrupt_disable (level); ffc062e4: 4b ff ff 9d bl ffc06280 <== NOT EXECUTED 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) { ffc062e8: 81 3f 00 84 lwz r9,132(r31) ffc062ec: 80 1f 00 80 lwz r0,128(r31) ffc062f0: 7f 89 00 00 cmpw cr7,r9,r0 ffc062f4: 40 9e ff cc bne+ cr7,ffc062c0 <== NEVER TAKEN ffc062f8: 7c 60 01 24 mtmsr r3 rtems_fatal_error_occurred (sc); rtems_interrupt_disable (level); } rtems_interrupt_enable (level); } } ffc062fc: 39 61 00 10 addi r11,r1,16 ffc06300: 48 01 2e ac b ffc191ac <_restgpr_30_x> =============================================================================== ffc06f70 : /* * Echo a typed character */ static void echo (unsigned char c, struct rtems_termios_tty *tty) { ffc06f70: 7c 08 02 a6 mflr r0 ffc06f74: 7c 2b 0b 78 mr r11,r1 ffc06f78: 94 21 ff e0 stwu r1,-32(r1) ffc06f7c: 90 01 00 24 stw r0,36(r1) ffc06f80: 48 01 21 e5 bl ffc19164 <_savegpr_31> ffc06f84: 7c 9f 23 78 mr r31,r4 if ((tty->termios.c_lflag & ECHOCTL) && ffc06f88: 80 04 00 3c lwz r0,60(r4) ffc06f8c: 70 09 02 00 andi. r9,r0,512 ffc06f90: 41 82 00 5c beq- ffc06fec <== NEVER TAKEN iscntrl(c) && (c != '\t') && (c != '\n')) { ffc06f94: 3d 20 00 00 lis r9,0 ffc06f98: 81 29 27 7c lwz r9,10108(r9) ffc06f9c: 7d 29 1a 14 add r9,r9,r3 ffc06fa0: 88 09 00 01 lbz r0,1(r9) * Echo a typed character */ static void echo (unsigned char c, struct rtems_termios_tty *tty) { if ((tty->termios.c_lflag & ECHOCTL) && ffc06fa4: 70 09 00 20 andi. r9,r0,32 ffc06fa8: 41 82 00 44 beq- ffc06fec iscntrl(c) && (c != '\t') && (c != '\n')) { ffc06fac: 2f 83 00 09 cmpwi cr7,r3,9 ffc06fb0: 41 9e 00 3c beq- cr7,ffc06fec ffc06fb4: 2f 83 00 0a cmpwi cr7,r3,10 ffc06fb8: 41 be 00 34 beq+ cr7,ffc06fec char echobuf[2]; echobuf[0] = '^'; echobuf[1] = c ^ 0x40; ffc06fbc: 68 63 00 40 xori r3,r3,64 { if ((tty->termios.c_lflag & ECHOCTL) && iscntrl(c) && (c != '\t') && (c != '\n')) { char echobuf[2]; echobuf[0] = '^'; ffc06fc0: 38 00 00 5e li r0,94 echobuf[1] = c ^ 0x40; ffc06fc4: 98 61 00 09 stb r3,9(r1) rtems_termios_puts (echobuf, 2, tty); ffc06fc8: 38 80 00 02 li r4,2 ffc06fcc: 38 61 00 08 addi r3,r1,8 { if ((tty->termios.c_lflag & ECHOCTL) && iscntrl(c) && (c != '\t') && (c != '\n')) { char echobuf[2]; echobuf[0] = '^'; ffc06fd0: 98 01 00 08 stb r0,8(r1) echobuf[1] = c ^ 0x40; rtems_termios_puts (echobuf, 2, tty); ffc06fd4: 7f e5 fb 78 mr r5,r31 ffc06fd8: 4b ff fd 05 bl ffc06cdc tty->column += 2; ffc06fdc: 81 3f 00 28 lwz r9,40(r31) ffc06fe0: 38 09 00 02 addi r0,r9,2 ffc06fe4: 90 1f 00 28 stw r0,40(r31) */ static void echo (unsigned char c, struct rtems_termios_tty *tty) { if ((tty->termios.c_lflag & ECHOCTL) && iscntrl(c) && (c != '\t') && (c != '\n')) { ffc06fe8: 48 00 00 0c b ffc06ff4 echobuf[0] = '^'; echobuf[1] = c ^ 0x40; rtems_termios_puts (echobuf, 2, tty); tty->column += 2; } else { oproc (c, tty); ffc06fec: 7f e4 fb 78 mr r4,r31 ffc06ff0: 4b ff fe 15 bl ffc06e04 } } ffc06ff4: 39 61 00 20 addi r11,r1,32 ffc06ff8: 48 01 21 b8 b ffc191b0 <_restgpr_31_x> =============================================================================== ffc05464 : void endgrent(void) { if (group_fp != NULL) ffc05464: 3d 20 00 00 lis r9,0 fclose(group_fp); group_fp = fopen("/etc/group", "r"); } void endgrent(void) { ffc05468: 94 21 ff f8 stwu r1,-8(r1) ffc0546c: 7c 08 02 a6 mflr r0 if (group_fp != NULL) ffc05470: 80 69 2a 94 lwz r3,10900(r9) fclose(group_fp); group_fp = fopen("/etc/group", "r"); } void endgrent(void) { ffc05474: 90 01 00 0c stw r0,12(r1) if (group_fp != NULL) ffc05478: 2f 83 00 00 cmpwi cr7,r3,0 ffc0547c: 41 9e 00 08 beq- cr7,ffc05484 <== NEVER TAKEN fclose(group_fp); ffc05480: 48 00 c0 dd bl ffc1155c } ffc05484: 80 01 00 0c lwz r0,12(r1) ffc05488: 38 21 00 08 addi r1,r1,8 ffc0548c: 7c 08 03 a6 mtlr r0 ffc05490: 4e 80 00 20 blr =============================================================================== ffc052a4 : void endpwent(void) { if (passwd_fp != NULL) ffc052a4: 3d 20 00 00 lis r9,0 fclose(passwd_fp); passwd_fp = fopen("/etc/passwd", "r"); } void endpwent(void) { ffc052a8: 94 21 ff f8 stwu r1,-8(r1) ffc052ac: 7c 08 02 a6 mflr r0 if (passwd_fp != NULL) ffc052b0: 80 69 29 b8 lwz r3,10680(r9) fclose(passwd_fp); passwd_fp = fopen("/etc/passwd", "r"); } void endpwent(void) { ffc052b4: 90 01 00 0c stw r0,12(r1) if (passwd_fp != NULL) ffc052b8: 2f 83 00 00 cmpwi cr7,r3,0 ffc052bc: 41 9e 00 08 beq- cr7,ffc052c4 <== NEVER TAKEN fclose(passwd_fp); ffc052c0: 48 00 c2 9d bl ffc1155c } ffc052c4: 80 01 00 0c lwz r0,12(r1) ffc052c8: 38 21 00 08 addi r1,r1,8 ffc052cc: 7c 08 03 a6 mtlr r0 ffc052d0: 4e 80 00 20 blr =============================================================================== ffc06ffc : * 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) { ffc06ffc: 94 21 ff e0 stwu r1,-32(r1) ffc07000: 7c 08 02 a6 mflr r0 ffc07004: 7d 80 00 26 mfcr r12 ffc07008: 90 01 00 24 stw r0,36(r1) if (tty->ccount == 0) ffc0700c: 80 03 00 20 lwz r0,32(r3) * 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) { ffc07010: bf 61 00 0c stmw r27,12(r1) ffc07014: 7c 7f 1b 78 mr r31,r3 if (tty->ccount == 0) ffc07018: 2f 80 00 00 cmpwi cr7,r0,0 * 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) { ffc0701c: 91 81 00 08 stw r12,8(r1) if (tty->ccount == 0) ffc07020: 41 9e 01 d8 beq- cr7,ffc071f8 return; if (lineFlag) { ffc07024: 2f 84 00 00 cmpwi cr7,r4,0 ffc07028: 41 9e 01 ac beq- cr7,ffc071d4 if (!(tty->termios.c_lflag & ECHO)) { ffc0702c: 80 03 00 3c lwz r0,60(r3) ffc07030: 70 09 00 08 andi. r9,r0,8 ffc07034: 40 a2 00 0c bne+ ffc07040 <== ALWAYS TAKEN tty->ccount = 0; ffc07038: 91 23 00 20 stw r9,32(r3) <== NOT EXECUTED return; ffc0703c: 48 00 01 bc b ffc071f8 <== NOT EXECUTED } if (!(tty->termios.c_lflag & ECHOE)) { ffc07040: 70 00 00 10 andi. r0,r0,16 ffc07044: 40 a2 01 90 bne+ ffc071d4 <== ALWAYS TAKEN tty->ccount = 0; ffc07048: 90 03 00 20 stw r0,32(r3) <== NOT EXECUTED echo (tty->termios.c_cc[VKILL], tty); ffc0704c: 7f e4 fb 78 mr r4,r31 <== NOT EXECUTED ffc07050: 88 63 00 44 lbz r3,68(r3) <== NOT EXECUTED ffc07054: 4b ff ff 1d bl ffc06f70 <== NOT EXECUTED if (tty->termios.c_lflag & ECHOK) ffc07058: 80 1f 00 3c lwz r0,60(r31) <== NOT EXECUTED echo ('\n', tty); ffc0705c: 38 60 00 0a li r3,10 <== NOT EXECUTED return; } if (!(tty->termios.c_lflag & ECHOE)) { tty->ccount = 0; echo (tty->termios.c_cc[VKILL], tty); if (tty->termios.c_lflag & ECHOK) ffc07060: 70 07 00 20 andi. r7,r0,32 <== NOT EXECUTED ffc07064: 41 a2 01 94 beq+ ffc071f8 <== NOT EXECUTED ffc07068: 48 00 00 30 b ffc07098 <== NOT EXECUTED } while (tty->ccount) { unsigned char c = tty->cbuf[--tty->ccount]; if (tty->termios.c_lflag & ECHO) { ffc0706c: 80 1f 00 3c lwz r0,60(r31) return; } } while (tty->ccount) { unsigned char c = tty->cbuf[--tty->ccount]; ffc07070: 39 29 ff ff addi r9,r9,-1 ffc07074: 81 5f 00 1c lwz r10,28(r31) if (tty->termios.c_lflag & ECHO) { ffc07078: 70 0b 00 08 andi. r11,r0,8 return; } } while (tty->ccount) { unsigned char c = tty->cbuf[--tty->ccount]; ffc0707c: 91 3f 00 20 stw r9,32(r31) ffc07080: 7f ca 48 ae lbzx r30,r10,r9 if (tty->termios.c_lflag & ECHO) { ffc07084: 41 82 01 48 beq- ffc071cc <== NEVER TAKEN if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) { ffc07088: 40 92 00 30 bne- cr4,ffc070b8 ffc0708c: 70 07 00 10 andi. r7,r0,16 ffc07090: 40 a2 00 28 bne+ ffc070b8 <== ALWAYS TAKEN echo (tty->termios.c_cc[VERASE], tty); ffc07094: 88 7f 00 43 lbz r3,67(r31) <== NOT EXECUTED } } if (!lineFlag) break; } } ffc07098: 80 01 00 24 lwz r0,36(r1) <== 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); ffc0709c: 7f e4 fb 78 mr r4,r31 <== NOT EXECUTED } } if (!lineFlag) break; } } ffc070a0: 81 81 00 08 lwz r12,8(r1) <== NOT EXECUTED ffc070a4: 7c 08 03 a6 mtlr r0 <== NOT EXECUTED ffc070a8: bb 61 00 0c lmw r27,12(r1) <== NOT EXECUTED ffc070ac: 38 21 00 20 addi r1,r1,32 <== NOT EXECUTED ffc070b0: 7d 80 81 20 mtcrf 8,r12 <== 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); ffc070b4: 4b ff fe bc b ffc06f70 <== NOT EXECUTED } else if (c == '\t') { ffc070b8: 2f 9e 00 09 cmpwi cr7,r30,9 ffc070bc: 40 be 00 90 bne+ cr7,ffc0714c while (i != tty->ccount) { c = tty->cbuf[i++]; if (c == '\t') { col = (col | 7) + 1; } else if (iscntrl (c)) { if (tty->termios.c_lflag & ECHOCTL) ffc070c0: 39 29 00 01 addi r9,r9,1 if (tty->termios.c_lflag & ECHO) { if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) { echo (tty->termios.c_cc[VERASE], tty); } else if (c == '\t') { int col = tty->read_start_column; ffc070c4: 83 df 00 2c lwz r30,44(r31) */ while (i != tty->ccount) { c = tty->cbuf[i++]; if (c == '\t') { col = (col | 7) + 1; } else if (iscntrl (c)) { ffc070c8: 81 1d 27 7c lwz r8,10108(r29) if (tty->termios.c_lflag & ECHO) { if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) { echo (tty->termios.c_cc[VERASE], tty); } else if (c == '\t') { int col = tty->read_start_column; int i = 0; ffc070cc: 39 60 00 00 li r11,0 while (i != tty->ccount) { c = tty->cbuf[i++]; if (c == '\t') { col = (col | 7) + 1; } else if (iscntrl (c)) { if (tty->termios.c_lflag & ECHOCTL) ffc070d0: 70 07 02 00 andi. r7,r0,512 ffc070d4: 7d 29 03 a6 mtctr r9 int i = 0; /* * Find the character before the tab */ while (i != tty->ccount) { ffc070d8: 48 00 00 40 b ffc07118 c = tty->cbuf[i++]; ffc070dc: 7c 0a 58 ae lbzx r0,r10,r11 ffc070e0: 39 6b 00 01 addi r11,r11,1 if (c == '\t') { ffc070e4: 2f 80 00 09 cmpwi cr7,r0,9 ffc070e8: 40 be 00 0c bne+ cr7,ffc070f4 col = (col | 7) + 1; ffc070ec: 63 de 00 07 ori r30,r30,7 ffc070f0: 48 00 00 24 b ffc07114 } else if (iscntrl (c)) { ffc070f4: 7d 28 02 14 add r9,r8,r0 ffc070f8: 88 09 00 01 lbz r0,1(r9) ffc070fc: 54 09 df fe rlwinm r9,r0,27,31,31 ffc07100: 2f 89 00 00 cmpwi cr7,r9,0 ffc07104: 41 9e 00 10 beq- cr7,ffc07114 <== ALWAYS TAKEN if (tty->termios.c_lflag & ECHOCTL) ffc07108: 41 82 00 10 beq- ffc07118 <== NOT EXECUTED col += 2; ffc0710c: 3b de 00 02 addi r30,r30,2 <== NOT EXECUTED ffc07110: 48 00 00 08 b ffc07118 <== NOT EXECUTED } else { col++; ffc07114: 3b de 00 01 addi r30,r30,1 int i = 0; /* * Find the character before the tab */ while (i != tty->ccount) { ffc07118: 42 00 ff c4 bdnz+ ffc070dc ffc0711c: 48 00 00 20 b ffc0713c /* * Back up over the tab */ while (tty->column > col) { rtems_termios_puts ("\b", 1, tty); ffc07120: 7f 63 db 78 mr r3,r27 ffc07124: 38 80 00 01 li r4,1 ffc07128: 7f e5 fb 78 mr r5,r31 ffc0712c: 4b ff fb b1 bl ffc06cdc tty->column--; ffc07130: 81 3f 00 28 lwz r9,40(r31) ffc07134: 38 09 ff ff addi r0,r9,-1 ffc07138: 90 1f 00 28 stw r0,40(r31) } /* * Back up over the tab */ while (tty->column > col) { ffc0713c: 80 1f 00 28 lwz r0,40(r31) ffc07140: 7f 80 f0 00 cmpw cr7,r0,r30 ffc07144: 41 9d ff dc bgt+ cr7,ffc07120 ffc07148: 48 00 00 84 b ffc071cc rtems_termios_puts ("\b", 1, tty); tty->column--; } } else { if (iscntrl (c) && (tty->termios.c_lflag & ECHOCTL)) { ffc0714c: 81 3d 27 7c lwz r9,10108(r29) ffc07150: 3b de 00 01 addi r30,r30,1 ffc07154: 7d 29 f0 ae lbzx r9,r9,r30 ffc07158: 71 2b 00 20 andi. r11,r9,32 ffc0715c: 41 82 00 30 beq- ffc0718c <== ALWAYS TAKEN ffc07160: 70 07 02 00 andi. r7,r0,512 <== NOT EXECUTED ffc07164: 41 a2 00 28 beq+ ffc0718c <== NOT EXECUTED rtems_termios_puts ("\b \b", 3, tty); ffc07168: 7f 83 e3 78 mr r3,r28 <== NOT EXECUTED ffc0716c: 38 80 00 03 li r4,3 <== NOT EXECUTED ffc07170: 7f e5 fb 78 mr r5,r31 <== NOT EXECUTED ffc07174: 4b ff fb 69 bl ffc06cdc <== NOT EXECUTED if (tty->column) ffc07178: 81 3f 00 28 lwz r9,40(r31) <== NOT EXECUTED ffc0717c: 2f 89 00 00 cmpwi cr7,r9,0 <== NOT EXECUTED ffc07180: 41 9e 00 0c beq- cr7,ffc0718c <== NOT EXECUTED tty->column--; ffc07184: 39 29 ff ff addi r9,r9,-1 <== NOT EXECUTED ffc07188: 91 3f 00 28 stw r9,40(r31) <== NOT EXECUTED } if (!iscntrl (c) || (tty->termios.c_lflag & ECHOCTL)) { ffc0718c: 81 3d 27 7c lwz r9,10108(r29) ffc07190: 7c 09 f0 ae lbzx r0,r9,r30 ffc07194: 70 09 00 20 andi. r9,r0,32 ffc07198: 41 82 00 10 beq- ffc071a8 <== ALWAYS TAKEN ffc0719c: 80 1f 00 3c lwz r0,60(r31) <== NOT EXECUTED ffc071a0: 70 0b 02 00 andi. r11,r0,512 <== NOT EXECUTED ffc071a4: 41 82 00 28 beq- ffc071cc <== NOT EXECUTED rtems_termios_puts ("\b \b", 3, tty); ffc071a8: 7f 83 e3 78 mr r3,r28 ffc071ac: 38 80 00 03 li r4,3 ffc071b0: 7f e5 fb 78 mr r5,r31 ffc071b4: 4b ff fb 29 bl ffc06cdc if (tty->column) ffc071b8: 81 3f 00 28 lwz r9,40(r31) ffc071bc: 2f 89 00 00 cmpwi cr7,r9,0 ffc071c0: 41 9e 00 0c beq- cr7,ffc071cc <== NEVER TAKEN tty->column--; ffc071c4: 39 29 ff ff addi r9,r9,-1 ffc071c8: 91 3f 00 28 stw r9,40(r31) } } } if (!lineFlag) ffc071cc: 40 b2 00 20 bne+ cr4,ffc071ec ffc071d0: 48 00 00 28 b ffc071f8 while (tty->ccount) { unsigned char c = tty->cbuf[--tty->ccount]; if (tty->termios.c_lflag & ECHO) { if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) { ffc071d4: 2e 04 00 00 cmpwi cr4,r4,0 rtems_termios_puts ("\b \b", 3, tty); if (tty->column) tty->column--; } if (!iscntrl (c) || (tty->termios.c_lflag & ECHOCTL)) { rtems_termios_puts ("\b \b", 3, tty); ffc071d8: 3f 80 ff c2 lis r28,-62 /* * Back up over the tab */ while (tty->column > col) { rtems_termios_puts ("\b", 1, tty); ffc071dc: 3f 60 ff c2 lis r27,-62 ffc071e0: 3f a0 00 00 lis r29,0 rtems_termios_puts ("\b \b", 3, tty); if (tty->column) tty->column--; } if (!iscntrl (c) || (tty->termios.c_lflag & ECHOCTL)) { rtems_termios_puts ("\b \b", 3, tty); ffc071e4: 3b 9c ab 40 addi r28,r28,-21696 /* * Back up over the tab */ while (tty->column > col) { rtems_termios_puts ("\b", 1, tty); ffc071e8: 3b 7b ab 42 addi r27,r27,-21694 echo ('\n', tty); return; } } while (tty->ccount) { ffc071ec: 81 3f 00 20 lwz r9,32(r31) ffc071f0: 2f 89 00 00 cmpwi cr7,r9,0 ffc071f4: 40 9e fe 78 bne+ cr7,ffc0706c } } if (!lineFlag) break; } } ffc071f8: 81 81 00 08 lwz r12,8(r1) ffc071fc: 39 61 00 20 addi r11,r1,32 ffc07200: 7d 80 81 20 mtcrf 8,r12 ffc07204: 48 01 1f 9c b ffc191a0 <_restgpr_27_x> =============================================================================== ffc04d90 : int fd2; int flags; int mask; int ret = 0; rtems_libio_check_fd( fd ); ffc04d90: 3d 20 00 00 lis r9,0 int fcntl( int fd, int cmd, ... ) { ffc04d94: 94 21 ff c8 stwu r1,-56(r1) ffc04d98: 7c 08 02 a6 mflr r0 int fd2; int flags; int mask; int ret = 0; rtems_libio_check_fd( fd ); ffc04d9c: 81 09 27 0c lwz r8,9996(r9) int fcntl( int fd, int cmd, ... ) { ffc04da0: 90 01 00 3c stw r0,60(r1) int ret; va_list ap; va_start( ap, cmd ); ffc04da4: 38 00 00 02 li r0,2 int fd2; int flags; int mask; int ret = 0; rtems_libio_check_fd( fd ); ffc04da8: 7f 83 40 40 cmplw cr7,r3,r8 ... ) { int ret; va_list ap; va_start( ap, cmd ); ffc04dac: 98 01 00 08 stb r0,8(r1) ffc04db0: 38 01 00 40 addi r0,r1,64 ffc04db4: 90 01 00 0c stw r0,12(r1) ffc04db8: 38 01 00 10 addi r0,r1,16 int fcntl( int fd, int cmd, ... ) { ffc04dbc: bf a1 00 2c stmw r29,44(r1) ffc04dc0: 7c 9e 23 78 mr r30,r4 ffc04dc4: 90 a1 00 18 stw r5,24(r1) ffc04dc8: 90 c1 00 1c stw r6,28(r1) ffc04dcc: 90 e1 00 20 stw r7,32(r1) int ret; va_list ap; va_start( ap, cmd ); ffc04dd0: 90 01 00 10 stw r0,16(r1) int fd2; int flags; int mask; int ret = 0; rtems_libio_check_fd( fd ); ffc04dd4: 40 9c 00 20 bge- cr7,ffc04df4 iop = rtems_libio_iop( fd ); ffc04dd8: 3d 20 00 00 lis r9,0 ffc04ddc: 81 49 27 cc lwz r10,10188(r9) ffc04de0: 54 7f 30 32 rlwinm r31,r3,6,0,25 ffc04de4: 7f ea fa 14 add r31,r10,r31 rtems_libio_check_is_open(iop); ffc04de8: 80 7f 00 18 lwz r3,24(r31) ffc04dec: 70 60 01 00 andi. r0,r3,256 ffc04df0: 40 a2 00 10 bne+ ffc04e00 ffc04df4: 48 00 c7 91 bl ffc11584 <__errno> ffc04df8: 38 00 00 09 li r0,9 ffc04dfc: 48 00 01 80 b ffc04f7c /* * This switch should contain all the cases from POSIX. */ switch ( cmd ) { ffc04e00: 2b 84 00 09 cmplwi cr7,r4,9 ffc04e04: 41 9d 01 70 bgt- cr7,ffc04f74 ffc04e08: 3d 20 ff c2 lis r9,-62 ffc04e0c: 39 29 8d d4 addi r9,r9,-29228 ffc04e10: 54 80 10 3a rlwinm r0,r4,2,0,29 ffc04e14: 7c 09 00 2e lwzx r0,r9,r0 ffc04e18: 7d 20 4a 14 add r9,r0,r9 ffc04e1c: 7d 29 03 a6 mtctr r9 ffc04e20: 4e 80 04 20 bctr case F_DUPFD: /* dup */ fd2 = va_arg( ap, int ); ffc04e24: 89 61 00 08 lbz r11,8(r1) ffc04e28: 2b 8b 00 07 cmplwi cr7,r11,7 ffc04e2c: 41 9d 00 1c bgt- cr7,ffc04e48 <== NEVER TAKEN ffc04e30: 81 21 00 10 lwz r9,16(r1) ffc04e34: 55 60 10 3a rlwinm r0,r11,2,0,29 ffc04e38: 39 6b 00 01 addi r11,r11,1 ffc04e3c: 7d 29 02 14 add r9,r9,r0 ffc04e40: 99 61 00 08 stb r11,8(r1) ffc04e44: 48 00 00 10 b ffc04e54 ffc04e48: 81 21 00 0c lwz r9,12(r1) <== NOT EXECUTED ffc04e4c: 38 09 00 04 addi r0,r9,4 <== NOT EXECUTED ffc04e50: 90 01 00 0c stw r0,12(r1) <== NOT EXECUTED ffc04e54: 80 09 00 00 lwz r0,0(r9) if ( fd2 ) ffc04e58: 2f 80 00 00 cmpwi cr7,r0,0 ffc04e5c: 41 9e 00 1c beq- cr7,ffc04e78 diop = rtems_libio_iop( fd2 ); ffc04e60: 7f 80 40 40 cmplw cr7,r0,r8 ffc04e64: 38 60 00 00 li r3,0 ffc04e68: 40 9c 00 1c bge- cr7,ffc04e84 <== NEVER TAKEN ffc04e6c: 54 03 30 32 rlwinm r3,r0,6,0,25 ffc04e70: 7c 6a 1a 14 add r3,r10,r3 ffc04e74: 48 00 00 10 b ffc04e84 else { /* allocate a file control block */ diop = rtems_libio_allocate(); ffc04e78: 48 00 07 01 bl ffc05578 if ( diop == 0 ) { ffc04e7c: 2c 03 00 00 cmpwi r3,0 ffc04e80: 41 82 01 34 beq- ffc04fb4 <== NEVER TAKEN break; } } diop->flags = iop->flags; diop->pathinfo = iop->pathinfo; ffc04e84: 39 63 00 1c addi r11,r3,28 ret = -1; break; } } diop->flags = iop->flags; ffc04e88: 80 1f 00 18 lwz r0,24(r31) diop->pathinfo = iop->pathinfo; ffc04e8c: 38 9f 00 1c addi r4,r31,28 ffc04e90: 7c a4 a4 aa lswi r5,r4,20 ffc04e94: 7c ab a5 aa stswi r5,r11,20 ret = (int) (diop - rtems_libio_iops); ffc04e98: 3d 20 00 00 lis r9,0 ffc04e9c: 83 a9 27 cc lwz r29,10188(r9) ret = -1; break; } } diop->flags = iop->flags; ffc04ea0: 90 03 00 18 stw r0,24(r3) diop->pathinfo = iop->pathinfo; ret = (int) (diop - rtems_libio_iops); ffc04ea4: 7c 7d 18 50 subf r3,r29,r3 ffc04ea8: 7c 7d 36 70 srawi r29,r3,6 ffc04eac: 48 00 00 d8 b ffc04f84 break; case F_GETFD: /* get f_flags */ ret = ((iop->flags & LIBIO_FLAGS_CLOSE_ON_EXEC) != 0); ffc04eb0: 54 7d af fe rlwinm r29,r3,21,31,31 ffc04eb4: 48 00 00 d8 b ffc04f8c * 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 ) ) ffc04eb8: 89 61 00 08 lbz r11,8(r1) ffc04ebc: 2b 8b 00 07 cmplwi cr7,r11,7 ffc04ec0: 41 9d 00 1c bgt- cr7,ffc04edc <== NEVER TAKEN ffc04ec4: 81 21 00 10 lwz r9,16(r1) ffc04ec8: 55 60 10 3a rlwinm r0,r11,2,0,29 ffc04ecc: 39 6b 00 01 addi r11,r11,1 ffc04ed0: 7d 29 02 14 add r9,r9,r0 ffc04ed4: 99 61 00 08 stb r11,8(r1) ffc04ed8: 48 00 00 10 b ffc04ee8 ffc04edc: 81 21 00 0c lwz r9,12(r1) <== NOT EXECUTED ffc04ee0: 38 09 00 04 addi r0,r9,4 <== NOT EXECUTED ffc04ee4: 90 01 00 0c stw r0,12(r1) <== NOT EXECUTED ffc04ee8: 80 09 00 00 lwz r0,0(r9) ffc04eec: 2f 80 00 00 cmpwi cr7,r0,0 ffc04ef0: 41 9e 00 0c beq- cr7,ffc04efc iop->flags |= LIBIO_FLAGS_CLOSE_ON_EXEC; ffc04ef4: 60 63 08 00 ori r3,r3,2048 ffc04ef8: 48 00 00 64 b ffc04f5c else iop->flags &= ~LIBIO_FLAGS_CLOSE_ON_EXEC; ffc04efc: 54 63 05 66 rlwinm r3,r3,0,21,19 ffc04f00: 48 00 00 5c b ffc04f5c break; case F_GETFL: /* more flags (cloexec) */ ret = rtems_libio_to_fcntl_flags( iop->flags ); ffc04f04: 48 00 06 29 bl ffc0552c ffc04f08: 7c 7d 1b 78 mr r29,r3 ffc04f0c: 48 00 00 78 b ffc04f84 break; case F_SETFL: flags = rtems_libio_fcntl_flags( va_arg( ap, int ) ); ffc04f10: 89 61 00 08 lbz r11,8(r1) ffc04f14: 2b 8b 00 07 cmplwi cr7,r11,7 ffc04f18: 41 9d 00 1c bgt- cr7,ffc04f34 <== NEVER TAKEN ffc04f1c: 81 21 00 10 lwz r9,16(r1) ffc04f20: 55 60 10 3a rlwinm r0,r11,2,0,29 ffc04f24: 39 6b 00 01 addi r11,r11,1 ffc04f28: 7d 29 02 14 add r9,r9,r0 ffc04f2c: 99 61 00 08 stb r11,8(r1) ffc04f30: 48 00 00 10 b ffc04f40 ffc04f34: 81 21 00 0c lwz r9,12(r1) <== NOT EXECUTED ffc04f38: 38 09 00 04 addi r0,r9,4 <== NOT EXECUTED ffc04f3c: 90 01 00 0c stw r0,12(r1) <== NOT EXECUTED ffc04f40: 80 69 00 00 lwz r3,0(r9) ffc04f44: 48 00 05 a5 bl ffc054e8 /* * XXX If we are turning on append, should we seek to the end? */ iop->flags = (iop->flags & ~mask) | (flags & mask); ffc04f48: 80 1f 00 18 lwz r0,24(r31) ffc04f4c: 70 63 02 01 andi. r3,r3,513 ffc04f50: 39 20 fd fe li r9,-514 ffc04f54: 7d 20 00 38 and r0,r9,r0 ffc04f58: 7c 63 03 78 or r3,r3,r0 ffc04f5c: 90 7f 00 18 stw r3,24(r31) rtems_libio_t *iop; rtems_libio_t *diop; int fd2; int flags; int mask; int ret = 0; ffc04f60: 3b a0 00 00 li r29,0 ffc04f64: 48 00 00 28 b ffc04f8c errno = ENOTSUP; ret = -1; break; case F_GETOWN: /* for sockets. */ errno = ENOTSUP; ffc04f68: 48 00 c6 1d bl ffc11584 <__errno> ffc04f6c: 38 00 00 86 li r0,134 ffc04f70: 48 00 00 0c b ffc04f7c ret = -1; break; default: errno = EINVAL; ffc04f74: 48 00 c6 11 bl ffc11584 <__errno> ffc04f78: 38 00 00 16 li r0,22 ffc04f7c: 90 03 00 00 stw r0,0(r3) ffc04f80: 48 00 00 34 b ffc04fb4 /* * If we got this far successfully, then we give the optional * filesystem specific handler a chance to process this. */ if (ret >= 0) { ffc04f84: 2f 9d 00 00 cmpwi cr7,r29,0 ffc04f88: 41 9c 00 30 blt- cr7,ffc04fb8 <== NEVER TAKEN int err = (*iop->pathinfo.handlers->fcntl_h)( cmd, iop ); ffc04f8c: 81 3f 00 24 lwz r9,36(r31) ffc04f90: 7f e4 fb 78 mr r4,r31 ffc04f94: 7f c3 f3 78 mr r3,r30 ffc04f98: 80 09 00 30 lwz r0,48(r9) ffc04f9c: 7c 09 03 a6 mtctr r0 ffc04fa0: 4e 80 04 21 bctrl if (err) { ffc04fa4: 7c 7f 1b 79 mr. r31,r3 ffc04fa8: 41 a2 00 10 beq+ ffc04fb8 <== ALWAYS TAKEN errno = err; ffc04fac: 48 00 c5 d9 bl ffc11584 <__errno> <== NOT EXECUTED ffc04fb0: 93 e3 00 00 stw r31,0(r3) <== NOT EXECUTED ret = -1; ffc04fb4: 3b a0 ff ff li r29,-1 va_list ap; va_start( ap, cmd ); ret = vfcntl(fd,cmd,ap); va_end(ap); return ret; } ffc04fb8: 39 61 00 38 addi r11,r1,56 ffc04fbc: 7f a3 eb 78 mr r3,r29 ffc04fc0: 4b ff bd 60 b ffc00d20 <_restgpr_29_x> =============================================================================== ffc0e9b4 : */ int fifo_open( pipe_control_t **pipep, rtems_libio_t *iop ) { ffc0e9b4: 94 21 ff c8 stwu r1,-56(r1) ffc0e9b8: 7c 08 02 a6 mflr r0 ffc0e9bc: bf 21 00 1c stmw r25,28(r1) static rtems_status_code pipe_lock(void) { rtems_status_code sc = RTEMS_SUCCESSFUL; if (pipe_semaphore == RTEMS_ID_NONE) { ffc0e9c0: 3f c0 00 00 lis r30,0 */ int fifo_open( pipe_control_t **pipep, rtems_libio_t *iop ) { ffc0e9c4: 7c 7c 1b 78 mr r28,r3 ffc0e9c8: 90 01 00 3c stw r0,60(r1) ffc0e9cc: 7c 9b 23 78 mr r27,r4 static rtems_status_code pipe_lock(void) { rtems_status_code sc = RTEMS_SUCCESSFUL; if (pipe_semaphore == RTEMS_ID_NONE) { ffc0e9d0: 3b fe 29 d8 addi r31,r30,10712 ffc0e9d4: 80 1e 29 d8 lwz r0,10712(r30) ffc0e9d8: 2f 80 00 00 cmpwi cr7,r0,0 ffc0e9dc: 40 be 00 5c bne+ cr7,ffc0ea38 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 ); ffc0e9e0: 3d 20 00 00 lis r9,0 ffc0e9e4: 80 69 27 d4 lwz r3,10196(r9) ffc0e9e8: 38 80 00 00 li r4,0 ffc0e9ec: 38 a0 00 00 li r5,0 ffc0e9f0: 4b ff b2 35 bl ffc09c24 rtems_libio_lock(); if (pipe_semaphore == RTEMS_ID_NONE) { ffc0e9f4: 80 1e 29 d8 lwz r0,10712(r30) free(pipe); } static rtems_status_code pipe_lock(void) { rtems_status_code sc = RTEMS_SUCCESSFUL; ffc0e9f8: 3b c0 00 00 li r30,0 if (pipe_semaphore == RTEMS_ID_NONE) { rtems_libio_lock(); if (pipe_semaphore == RTEMS_ID_NONE) { ffc0e9fc: 2f 80 00 00 cmpwi cr7,r0,0 ffc0ea00: 40 be 00 24 bne+ cr7,ffc0ea24 <== NEVER TAKEN sc = rtems_semaphore_create( ffc0ea04: 3c 60 50 49 lis r3,20553 ffc0ea08: 60 63 50 45 ori r3,r3,20549 ffc0ea0c: 38 80 00 01 li r4,1 ffc0ea10: 38 a0 00 54 li r5,84 ffc0ea14: 38 c0 00 00 li r6,0 ffc0ea18: 7f e7 fb 78 mr r7,r31 ffc0ea1c: 4b ff af 89 bl ffc099a4 ffc0ea20: 7c 7e 1b 78 mr r30,r3 } static inline void rtems_libio_unlock( void ) { rtems_semaphore_release( rtems_libio_semaphore ); ffc0ea24: 3d 20 00 00 lis r9,0 ffc0ea28: 80 69 27 d4 lwz r3,10196(r9) ffc0ea2c: 4b ff b3 21 bl ffc09d4c } rtems_libio_unlock(); } if (sc == RTEMS_SUCCESSFUL) { ffc0ea30: 2f 9e 00 00 cmpwi cr7,r30,0 ffc0ea34: 40 be 00 24 bne+ cr7,ffc0ea58 sc = rtems_semaphore_obtain(pipe_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT); ffc0ea38: 3d 20 00 00 lis r9,0 ffc0ea3c: 80 69 29 d8 lwz r3,10712(r9) ffc0ea40: 38 80 00 00 li r4,0 ffc0ea44: 38 a0 00 00 li r5,0 ffc0ea48: 4b ff b1 dd bl ffc09c24 } if (sc == RTEMS_SUCCESSFUL) { return 0; ffc0ea4c: 3b c0 00 00 li r30,0 if (sc == RTEMS_SUCCESSFUL) { sc = rtems_semaphore_obtain(pipe_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT); } if (sc == RTEMS_SUCCESSFUL) { ffc0ea50: 2f 83 00 00 cmpwi cr7,r3,0 ffc0ea54: 41 be 00 08 beq+ cr7,ffc0ea5c <== ALWAYS TAKEN return 0; } else { return -ENOMEM; ffc0ea58: 3b c0 ff f4 li r30,-12 { pipe_control_t *pipe; int err = 0; err = pipe_lock(); if (err) ffc0ea5c: 2f 9e 00 00 cmpwi cr7,r30,0 ffc0ea60: 40 9e 03 64 bne- cr7,ffc0edc4 return err; pipe = *pipep; ffc0ea64: 83 fc 00 00 lwz r31,0(r28) if (pipe == NULL) { ffc0ea68: 2f 9f 00 00 cmpwi cr7,r31,0 ffc0ea6c: 40 be 01 4c bne+ cr7,ffc0ebb8 { static char c = 'a'; pipe_control_t *pipe; int err = -ENOMEM; pipe = malloc(sizeof(pipe_control_t)); ffc0ea70: 38 60 00 34 li r3,52 ffc0ea74: 4b ff 7d 51 bl ffc067c4 if (pipe == NULL) ffc0ea78: 2f 83 00 00 cmpwi cr7,r3,0 { static char c = 'a'; pipe_control_t *pipe; int err = -ENOMEM; pipe = malloc(sizeof(pipe_control_t)); ffc0ea7c: 7c 7f 1b 78 mr r31,r3 ffc0ea80: 7c 7a 1b 78 mr r26,r3 if (pipe == NULL) ffc0ea84: 41 9e 01 2c beq- cr7,ffc0ebb0 return err; memset(pipe, 0, sizeof(pipe_control_t)); ffc0ea88: 38 80 00 00 li r4,0 ffc0ea8c: 38 a0 00 34 li r5,52 ffc0ea90: 48 00 54 3d bl ffc13ecc pipe->Size = PIPE_BUF; ffc0ea94: 38 00 02 00 li r0,512 ffc0ea98: 90 1f 00 04 stw r0,4(r31) pipe->Buffer = malloc(pipe->Size); ffc0ea9c: 38 60 02 00 li r3,512 ffc0eaa0: 4b ff 7d 25 bl ffc067c4 if (! pipe->Buffer) ffc0eaa4: 2f 83 00 00 cmpwi cr7,r3,0 if (pipe == NULL) return err; memset(pipe, 0, sizeof(pipe_control_t)); pipe->Size = PIPE_BUF; pipe->Buffer = malloc(pipe->Size); ffc0eaa8: 90 7f 00 00 stw r3,0(r31) if (! pipe->Buffer) ffc0eaac: 41 9e 00 fc beq- cr7,ffc0eba8 <== NEVER TAKEN goto err_buf; err = -ENOMEM; if (rtems_barrier_create( rtems_build_name ('P', 'I', 'r', c), ffc0eab0: 3f a0 00 00 lis r29,0 ffc0eab4: 88 7d 21 b1 lbz r3,8625(r29) if (! pipe->Buffer) goto err_buf; err = -ENOMEM; if (rtems_barrier_create( ffc0eab8: 38 80 00 00 li r4,0 ffc0eabc: 38 a0 00 00 li r5,0 ffc0eac0: 64 63 50 49 oris r3,r3,20553 ffc0eac4: 60 63 72 00 ori r3,r3,29184 ffc0eac8: 38 df 00 2c addi r6,r31,44 ffc0eacc: 48 00 1b 21 bl ffc105ec ffc0ead0: 2f 83 00 00 cmpwi cr7,r3,0 ffc0ead4: 40 9e 00 cc bne- cr7,ffc0eba0 rtems_build_name ('P', 'I', 'r', c), RTEMS_BARRIER_MANUAL_RELEASE, 0, &pipe->readBarrier) != RTEMS_SUCCESSFUL) goto err_rbar; if (rtems_barrier_create( rtems_build_name ('P', 'I', 'w', c), ffc0ead8: 88 7d 21 b1 lbz r3,8625(r29) 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( ffc0eadc: 38 80 00 00 li r4,0 ffc0eae0: 38 a0 00 00 li r5,0 ffc0eae4: 64 63 50 49 oris r3,r3,20553 ffc0eae8: 60 63 77 00 ori r3,r3,30464 ffc0eaec: 38 df 00 30 addi r6,r31,48 ffc0eaf0: 48 00 1a fd bl ffc105ec ffc0eaf4: 2f 83 00 00 cmpwi cr7,r3,0 ffc0eaf8: 40 9e 00 a0 bne- cr7,ffc0eb98 rtems_build_name ('P', 'I', 'w', c), RTEMS_BARRIER_MANUAL_RELEASE, 0, &pipe->writeBarrier) != RTEMS_SUCCESSFUL) goto err_wbar; if (rtems_semaphore_create( rtems_build_name ('P', 'I', 's', c), 1, ffc0eafc: 88 7d 21 b1 lbz r3,8625(r29) 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( ffc0eb00: 38 80 00 01 li r4,1 ffc0eb04: 38 a0 00 10 li r5,16 ffc0eb08: 64 63 50 49 oris r3,r3,20553 ffc0eb0c: 60 63 73 00 ori r3,r3,29440 ffc0eb10: 38 c0 00 00 li r6,0 ffc0eb14: 38 ff 00 28 addi r7,r31,40 ffc0eb18: 4b ff ae 8d bl ffc099a4 ffc0eb1c: 2f 83 00 00 cmpwi cr7,r3,0 ffc0eb20: 40 9e 00 70 bne- cr7,ffc0eb90 Objects_Id id, Objects_Locations *location ) { return (Barrier_Control *) _Objects_Get( &_Barrier_Information, id, location ); ffc0eb24: 3f 20 00 00 lis r25,0 ffc0eb28: 80 9f 00 2c lwz r4,44(r31) ffc0eb2c: 3b 39 35 1c addi r25,r25,13596 /* 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 ffc0eb30: 3b 41 00 0c addi r26,r1,12 ffc0eb34: 7f 45 d3 78 mr r5,r26 ffc0eb38: 7f 23 cb 78 mr r3,r25 ffc0eb3c: 4b ff cb 89 bl ffc0b6c4 <_Objects_Get> |= STATES_INTERRUPTIBLE_BY_SIGNAL; ffc0eb40: 80 03 00 4c lwz r0,76(r3) ffc0eb44: 64 00 10 00 oris r0,r0,4096 ffc0eb48: 90 03 00 4c stw r0,76(r3) _Thread_Enable_dispatch(); ffc0eb4c: 4b ff d9 b1 bl ffc0c4fc <_Thread_Enable_dispatch> ffc0eb50: 80 9f 00 30 lwz r4,48(r31) ffc0eb54: 7f 45 d3 78 mr r5,r26 ffc0eb58: 7f 23 cb 78 mr r3,r25 ffc0eb5c: 4b ff cb 69 bl ffc0b6c4 <_Objects_Get> _Barrier_Get(pipe->writeBarrier, &location)->Barrier.Wait_queue.state |= STATES_INTERRUPTIBLE_BY_SIGNAL; ffc0eb60: 80 03 00 4c lwz r0,76(r3) ffc0eb64: 64 00 10 00 oris r0,r0,4096 ffc0eb68: 90 03 00 4c stw r0,76(r3) _Thread_Enable_dispatch(); ffc0eb6c: 4b ff d9 91 bl ffc0c4fc <_Thread_Enable_dispatch> #ifdef RTEMS_POSIX_API pipe_interruptible(pipe); #endif *pipep = pipe; if (c ++ == 'z') ffc0eb70: 89 3d 21 b1 lbz r9,8625(r29) ffc0eb74: 2f 89 00 7a cmpwi cr7,r9,122 ffc0eb78: 38 09 00 01 addi r0,r9,1 ffc0eb7c: 98 1d 21 b1 stb r0,8625(r29) ffc0eb80: 40 be 00 38 bne+ cr7,ffc0ebb8 c = 'a'; ffc0eb84: 38 00 00 61 li r0,97 ffc0eb88: 98 1d 21 b1 stb r0,8625(r29) ffc0eb8c: 48 00 00 2c b ffc0ebb8 return 0; err_sem: rtems_barrier_delete(pipe->writeBarrier); ffc0eb90: 80 7f 00 30 lwz r3,48(r31) ffc0eb94: 48 00 1b 25 bl ffc106b8 err_wbar: rtems_barrier_delete(pipe->readBarrier); ffc0eb98: 80 7a 00 2c lwz r3,44(r26) ffc0eb9c: 48 00 1b 1d bl ffc106b8 err_rbar: free(pipe->Buffer); ffc0eba0: 80 7a 00 00 lwz r3,0(r26) ffc0eba4: 4b ff 73 b1 bl ffc05f54 err_buf: free(pipe); ffc0eba8: 7f 43 d3 78 mr r3,r26 ffc0ebac: 4b ff 73 a9 bl ffc05f54 if (err) goto out; } if (! PIPE_LOCK(pipe)) err = -EINTR; ffc0ebb0: 3b c0 ff f4 li r30,-12 ffc0ebb4: 48 00 00 44 b ffc0ebf8 err = pipe_alloc(&pipe); if (err) goto out; } if (! PIPE_LOCK(pipe)) ffc0ebb8: 80 7f 00 28 lwz r3,40(r31) ffc0ebbc: 38 80 00 00 li r4,0 ffc0ebc0: 38 a0 00 00 li r5,0 ffc0ebc4: 4b ff b0 61 bl ffc09c24 ffc0ebc8: 2f 83 00 00 cmpwi cr7,r3,0 ffc0ebcc: 41 9e 00 08 beq- cr7,ffc0ebd4 <== ALWAYS TAKEN err = -EINTR; ffc0ebd0: 3b c0 ff fc li r30,-4 <== NOT EXECUTED if (*pipep == NULL) { ffc0ebd4: 80 1c 00 00 lwz r0,0(r28) ffc0ebd8: 2f 80 00 00 cmpwi cr7,r0,0 ffc0ebdc: 40 be 00 1c bne+ cr7,ffc0ebf8 if (err) ffc0ebe0: 2f 9e 00 00 cmpwi cr7,r30,0 ffc0ebe4: 41 be 00 10 beq+ cr7,ffc0ebf4 <== ALWAYS TAKEN pipe_free(pipe); ffc0ebe8: 7f e3 fb 78 mr r3,r31 <== NOT EXECUTED ffc0ebec: 4b ff fc cd bl ffc0e8b8 <== NOT EXECUTED ffc0ebf0: 48 00 00 08 b ffc0ebf8 <== NOT EXECUTED else *pipep = pipe; ffc0ebf4: 93 fc 00 00 stw r31,0(r28) } out: pipe_unlock(); ffc0ebf8: 4b ff fc 99 bl ffc0e890 pipe_control_t *pipe; unsigned int prevCounter; int err; err = pipe_new(pipep); if (err) ffc0ebfc: 2f 9e 00 00 cmpwi cr7,r30,0 ffc0ec00: 40 9e 01 c4 bne- cr7,ffc0edc4 return err; pipe = *pipep; switch (LIBIO_ACCMODE(iop)) { ffc0ec04: 80 1b 00 18 lwz r0,24(r27) int err; err = pipe_new(pipep); if (err) return err; pipe = *pipep; ffc0ec08: 83 fc 00 00 lwz r31,0(r28) switch (LIBIO_ACCMODE(iop)) { ffc0ec0c: 54 00 07 7c rlwinm r0,r0,0,29,30 ffc0ec10: 2f 80 00 04 cmpwi cr7,r0,4 ffc0ec14: 41 9e 00 a0 beq- cr7,ffc0ecb4 ffc0ec18: 2f 80 00 06 cmpwi cr7,r0,6 ffc0ec1c: 41 9e 01 34 beq- cr7,ffc0ed50 ffc0ec20: 2f 80 00 02 cmpwi cr7,r0,2 ffc0ec24: 40 be 01 84 bne+ cr7,ffc0eda8 <== NEVER TAKEN case LIBIO_FLAGS_READ: pipe->readerCounter ++; ffc0ec28: 81 3f 00 20 lwz r9,32(r31) ffc0ec2c: 38 09 00 01 addi r0,r9,1 if (pipe->Readers ++ == 0) ffc0ec30: 81 3f 00 10 lwz r9,16(r31) return err; pipe = *pipep; switch (LIBIO_ACCMODE(iop)) { case LIBIO_FLAGS_READ: pipe->readerCounter ++; ffc0ec34: 90 1f 00 20 stw r0,32(r31) if (pipe->Readers ++ == 0) ffc0ec38: 2f 89 00 00 cmpwi cr7,r9,0 ffc0ec3c: 38 09 00 01 addi r0,r9,1 ffc0ec40: 90 1f 00 10 stw r0,16(r31) ffc0ec44: 40 be 00 10 bne+ cr7,ffc0ec54 <== NEVER TAKEN PIPE_WAKEUPWRITERS(pipe); ffc0ec48: 80 7f 00 30 lwz r3,48(r31) ffc0ec4c: 38 81 00 08 addi r4,r1,8 ffc0ec50: 48 00 1b 21 bl ffc10770 if (pipe->Writers == 0) { ffc0ec54: 80 1f 00 14 lwz r0,20(r31) ffc0ec58: 2f 80 00 00 cmpwi cr7,r0,0 ffc0ec5c: 40 9e 01 4c bne- cr7,ffc0eda8 /* Not an error */ if (LIBIO_NODELAY(iop)) ffc0ec60: 80 1b 00 18 lwz r0,24(r27) ffc0ec64: 70 09 00 01 andi. r9,r0,1 ffc0ec68: 40 82 01 40 bne- ffc0eda8 break; prevCounter = pipe->writerCounter; ffc0ec6c: 83 bf 00 24 lwz r29,36(r31) err = -EINTR; /* Wait until a writer opens the pipe */ do { PIPE_UNLOCK(pipe); ffc0ec70: 80 7f 00 28 lwz r3,40(r31) ffc0ec74: 4b ff b0 d9 bl ffc09d4c if (! PIPE_READWAIT(pipe)) ffc0ec78: 80 7f 00 2c lwz r3,44(r31) ffc0ec7c: 38 80 00 00 li r4,0 ffc0ec80: 48 00 1b 5d bl ffc107dc ffc0ec84: 2f 83 00 00 cmpwi cr7,r3,0 ffc0ec88: 40 9e 01 2c bne- cr7,ffc0edb4 <== NEVER TAKEN goto out_error; if (! PIPE_LOCK(pipe)) ffc0ec8c: 80 7f 00 28 lwz r3,40(r31) ffc0ec90: 38 80 00 00 li r4,0 ffc0ec94: 38 a0 00 00 li r5,0 ffc0ec98: 4b ff af 8d bl ffc09c24 ffc0ec9c: 2f 83 00 00 cmpwi cr7,r3,0 ffc0eca0: 40 9e 01 14 bne- cr7,ffc0edb4 <== NEVER TAKEN goto out_error; } while (prevCounter == pipe->writerCounter); ffc0eca4: 80 1f 00 24 lwz r0,36(r31) ffc0eca8: 7f 9d 00 00 cmpw cr7,r29,r0 ffc0ecac: 41 9e ff c4 beq+ cr7,ffc0ec70 <== NEVER TAKEN ffc0ecb0: 48 00 00 f8 b ffc0eda8 } break; case LIBIO_FLAGS_WRITE: pipe->writerCounter ++; ffc0ecb4: 81 3f 00 24 lwz r9,36(r31) ffc0ecb8: 38 09 00 01 addi r0,r9,1 if (pipe->Writers ++ == 0) ffc0ecbc: 81 3f 00 14 lwz r9,20(r31) } while (prevCounter == pipe->writerCounter); } break; case LIBIO_FLAGS_WRITE: pipe->writerCounter ++; ffc0ecc0: 90 1f 00 24 stw r0,36(r31) if (pipe->Writers ++ == 0) ffc0ecc4: 2f 89 00 00 cmpwi cr7,r9,0 ffc0ecc8: 38 09 00 01 addi r0,r9,1 ffc0eccc: 90 1f 00 14 stw r0,20(r31) ffc0ecd0: 40 be 00 10 bne+ cr7,ffc0ece0 <== NEVER TAKEN PIPE_WAKEUPREADERS(pipe); ffc0ecd4: 80 7f 00 2c lwz r3,44(r31) ffc0ecd8: 38 81 00 08 addi r4,r1,8 ffc0ecdc: 48 00 1a 95 bl ffc10770 if (pipe->Readers == 0 && LIBIO_NODELAY(iop)) { ffc0ece0: 80 1f 00 10 lwz r0,16(r31) ffc0ece4: 2f 80 00 00 cmpwi cr7,r0,0 ffc0ece8: 40 9e 00 c0 bne- cr7,ffc0eda8 ffc0ecec: 80 1b 00 18 lwz r0,24(r27) ffc0ecf0: 70 09 00 01 andi. r9,r0,1 ffc0ecf4: 41 a2 00 14 beq+ ffc0ed08 PIPE_UNLOCK(pipe); ffc0ecf8: 80 7f 00 28 lwz r3,40(r31) err = -ENXIO; ffc0ecfc: 3b c0 ff fa li r30,-6 if (pipe->Writers ++ == 0) PIPE_WAKEUPREADERS(pipe); if (pipe->Readers == 0 && LIBIO_NODELAY(iop)) { PIPE_UNLOCK(pipe); ffc0ed00: 4b ff b0 4d bl ffc09d4c err = -ENXIO; goto out_error; ffc0ed04: 48 00 00 b4 b ffc0edb8 } if (pipe->Readers == 0) { prevCounter = pipe->readerCounter; ffc0ed08: 83 bf 00 20 lwz r29,32(r31) err = -EINTR; do { PIPE_UNLOCK(pipe); ffc0ed0c: 80 7f 00 28 lwz r3,40(r31) ffc0ed10: 4b ff b0 3d bl ffc09d4c if (! PIPE_WRITEWAIT(pipe)) ffc0ed14: 80 7f 00 30 lwz r3,48(r31) ffc0ed18: 38 80 00 00 li r4,0 ffc0ed1c: 48 00 1a c1 bl ffc107dc ffc0ed20: 2f 83 00 00 cmpwi cr7,r3,0 ffc0ed24: 40 9e 00 90 bne- cr7,ffc0edb4 <== NEVER TAKEN goto out_error; if (! PIPE_LOCK(pipe)) ffc0ed28: 80 7f 00 28 lwz r3,40(r31) ffc0ed2c: 38 80 00 00 li r4,0 ffc0ed30: 38 a0 00 00 li r5,0 ffc0ed34: 4b ff ae f1 bl ffc09c24 ffc0ed38: 2f 83 00 00 cmpwi cr7,r3,0 ffc0ed3c: 40 9e 00 78 bne- cr7,ffc0edb4 <== NEVER TAKEN goto out_error; } while (prevCounter == pipe->readerCounter); ffc0ed40: 80 1f 00 20 lwz r0,32(r31) ffc0ed44: 7f 9d 00 00 cmpw cr7,r29,r0 ffc0ed48: 41 9e ff c4 beq+ cr7,ffc0ed0c <== NEVER TAKEN ffc0ed4c: 48 00 00 5c b ffc0eda8 } break; case LIBIO_FLAGS_READ_WRITE: pipe->readerCounter ++; ffc0ed50: 81 3f 00 20 lwz r9,32(r31) ffc0ed54: 38 09 00 01 addi r0,r9,1 if (pipe->Readers ++ == 0) ffc0ed58: 81 3f 00 10 lwz r9,16(r31) } while (prevCounter == pipe->readerCounter); } break; case LIBIO_FLAGS_READ_WRITE: pipe->readerCounter ++; ffc0ed5c: 90 1f 00 20 stw r0,32(r31) if (pipe->Readers ++ == 0) ffc0ed60: 2f 89 00 00 cmpwi cr7,r9,0 ffc0ed64: 38 09 00 01 addi r0,r9,1 ffc0ed68: 90 1f 00 10 stw r0,16(r31) ffc0ed6c: 40 be 00 10 bne+ cr7,ffc0ed7c <== NEVER TAKEN PIPE_WAKEUPWRITERS(pipe); ffc0ed70: 80 7f 00 30 lwz r3,48(r31) ffc0ed74: 38 81 00 08 addi r4,r1,8 ffc0ed78: 48 00 19 f9 bl ffc10770 pipe->writerCounter ++; ffc0ed7c: 81 3f 00 24 lwz r9,36(r31) ffc0ed80: 38 09 00 01 addi r0,r9,1 if (pipe->Writers ++ == 0) ffc0ed84: 81 3f 00 14 lwz r9,20(r31) case LIBIO_FLAGS_READ_WRITE: pipe->readerCounter ++; if (pipe->Readers ++ == 0) PIPE_WAKEUPWRITERS(pipe); pipe->writerCounter ++; ffc0ed88: 90 1f 00 24 stw r0,36(r31) if (pipe->Writers ++ == 0) ffc0ed8c: 2f 89 00 00 cmpwi cr7,r9,0 ffc0ed90: 38 09 00 01 addi r0,r9,1 ffc0ed94: 90 1f 00 14 stw r0,20(r31) ffc0ed98: 40 be 00 10 bne+ cr7,ffc0eda8 <== NEVER TAKEN PIPE_WAKEUPREADERS(pipe); ffc0ed9c: 80 7f 00 2c lwz r3,44(r31) ffc0eda0: 38 81 00 08 addi r4,r1,8 ffc0eda4: 48 00 19 cd bl ffc10770 break; } PIPE_UNLOCK(pipe); ffc0eda8: 80 7f 00 28 lwz r3,40(r31) ffc0edac: 4b ff af a1 bl ffc09d4c return 0; ffc0edb0: 48 00 00 14 b ffc0edc4 goto out_error; } if (pipe->Readers == 0) { prevCounter = pipe->readerCounter; err = -EINTR; ffc0edb4: 3b c0 ff fc li r30,-4 <== NOT EXECUTED PIPE_UNLOCK(pipe); return 0; out_error: pipe_release(pipep, iop); ffc0edb8: 7f 83 e3 78 mr r3,r28 ffc0edbc: 7f 64 db 78 mr r4,r27 ffc0edc0: 4b ff fb 41 bl ffc0e900 return err; } ffc0edc4: 39 61 00 38 addi r11,r1,56 ffc0edc8: 7f c3 f3 78 mr r3,r30 ffc0edcc: 48 01 26 58 b ffc21424 <_restgpr_25_x> =============================================================================== ffc05058 : long fpathconf( int fd, int name ) { ffc05058: 7c 08 02 a6 mflr r0 ffc0505c: 94 21 ff f8 stwu r1,-8(r1) long return_value; rtems_libio_t *iop; rtems_filesystem_limits_and_options_t *the_limits; rtems_libio_check_fd(fd); ffc05060: 3d 20 00 00 lis r9,0 long fpathconf( int fd, int name ) { ffc05064: 90 01 00 0c stw r0,12(r1) long return_value; rtems_libio_t *iop; rtems_filesystem_limits_and_options_t *the_limits; rtems_libio_check_fd(fd); ffc05068: 80 09 27 0c lwz r0,9996(r9) ffc0506c: 7f 83 00 40 cmplw cr7,r3,r0 ffc05070: 40 9c 00 20 bge- cr7,ffc05090 iop = rtems_libio_iop(fd); ffc05074: 3d 20 00 00 lis r9,0 ffc05078: 80 09 27 cc lwz r0,10188(r9) ffc0507c: 54 63 30 32 rlwinm r3,r3,6,0,25 ffc05080: 7c 60 1a 14 add r3,r0,r3 rtems_libio_check_is_open(iop); ffc05084: 80 03 00 18 lwz r0,24(r3) ffc05088: 70 09 01 00 andi. r9,r0,256 ffc0508c: 40 a2 00 10 bne+ ffc0509c <== ALWAYS TAKEN ffc05090: 48 00 c4 f5 bl ffc11584 <__errno> ffc05094: 38 00 00 09 li r0,9 ffc05098: 48 00 00 9c b ffc05134 rtems_libio_check_permissions(iop, LIBIO_FLAGS_READ); ffc0509c: 70 09 00 02 andi. r9,r0,2 ffc050a0: 41 82 00 8c beq- ffc0512c * Now process the information request. */ the_limits = &iop->pathinfo.mt_entry->pathconf_limits_and_options; switch ( name ) { ffc050a4: 2b 84 00 0b cmplwi cr7,r4,11 /* * Now process the information request. */ the_limits = &iop->pathinfo.mt_entry->pathconf_limits_and_options; ffc050a8: 81 23 00 2c lwz r9,44(r3) switch ( name ) { ffc050ac: 41 9d 00 80 bgt- cr7,ffc0512c ffc050b0: 3d 60 ff c2 lis r11,-62 ffc050b4: 39 6b 8d fc addi r11,r11,-29188 ffc050b8: 54 84 10 3a rlwinm r4,r4,2,0,29 ffc050bc: 7c 0b 20 2e lwzx r0,r11,r4 ffc050c0: 7d 60 5a 14 add r11,r0,r11 ffc050c4: 7d 69 03 a6 mtctr r11 ffc050c8: 4e 80 04 20 bctr case _PC_LINK_MAX: return_value = the_limits->link_max; ffc050cc: 80 69 00 38 lwz r3,56(r9) break; ffc050d0: 48 00 00 6c b ffc0513c case _PC_MAX_CANON: return_value = the_limits->max_canon; ffc050d4: 80 69 00 3c lwz r3,60(r9) break; ffc050d8: 48 00 00 64 b ffc0513c case _PC_MAX_INPUT: return_value = the_limits->max_input; ffc050dc: 80 69 00 40 lwz r3,64(r9) break; ffc050e0: 48 00 00 5c b ffc0513c case _PC_NAME_MAX: return_value = the_limits->name_max; ffc050e4: 80 69 00 44 lwz r3,68(r9) break; ffc050e8: 48 00 00 54 b ffc0513c case _PC_PATH_MAX: return_value = the_limits->path_max; ffc050ec: 80 69 00 48 lwz r3,72(r9) break; ffc050f0: 48 00 00 4c b ffc0513c case _PC_PIPE_BUF: return_value = the_limits->pipe_buf; ffc050f4: 80 69 00 4c lwz r3,76(r9) break; ffc050f8: 48 00 00 44 b ffc0513c case _PC_CHOWN_RESTRICTED: return_value = the_limits->posix_chown_restrictions; ffc050fc: 80 69 00 54 lwz r3,84(r9) break; ffc05100: 48 00 00 3c b ffc0513c case _PC_NO_TRUNC: return_value = the_limits->posix_no_trunc; ffc05104: 80 69 00 58 lwz r3,88(r9) break; ffc05108: 48 00 00 34 b ffc0513c case _PC_VDISABLE: return_value = the_limits->posix_vdisable; ffc0510c: 80 69 00 64 lwz r3,100(r9) break; ffc05110: 48 00 00 2c b ffc0513c case _PC_ASYNC_IO: return_value = the_limits->posix_async_io; ffc05114: 80 69 00 50 lwz r3,80(r9) break; ffc05118: 48 00 00 24 b ffc0513c case _PC_PRIO_IO: return_value = the_limits->posix_prio_io; ffc0511c: 80 69 00 5c lwz r3,92(r9) break; ffc05120: 48 00 00 1c b ffc0513c case _PC_SYNC_IO: return_value = the_limits->posix_sync_io; ffc05124: 80 69 00 60 lwz r3,96(r9) break; ffc05128: 48 00 00 14 b ffc0513c default: rtems_set_errno_and_return_minus_one( EINVAL ); ffc0512c: 48 00 c4 59 bl ffc11584 <__errno> ffc05130: 38 00 00 16 li r0,22 ffc05134: 90 03 00 00 stw r0,0(r3) ffc05138: 38 60 ff ff li r3,-1 break; } return return_value; } ffc0513c: 80 01 00 0c lwz r0,12(r1) ffc05140: 38 21 00 08 addi r1,r1,8 ffc05144: 7c 08 03 a6 mtlr r0 ffc05148: 4e 80 00 20 blr =============================================================================== ffc05130 : #include void free( void *ptr ) { ffc05130: 94 21 ff f0 stwu r1,-16(r1) ffc05134: 7c 08 02 a6 mflr r0 MSBUMP(free_calls, 1); ffc05138: 3d 20 00 00 lis r9,0 #include void free( void *ptr ) { ffc0513c: 90 01 00 14 stw r0,20(r1) MSBUMP(free_calls, 1); ffc05140: 39 29 2c 00 addi r9,r9,11264 #include void free( void *ptr ) { ffc05144: bf c1 00 08 stmw r30,8(r1) MSBUMP(free_calls, 1); if ( !ptr ) ffc05148: 7c 7f 1b 79 mr. r31,r3 void free( void *ptr ) { MSBUMP(free_calls, 1); ffc0514c: 81 69 00 0c lwz r11,12(r9) ffc05150: 38 0b 00 01 addi r0,r11,1 ffc05154: 90 09 00 0c stw r0,12(r9) if ( !ptr ) ffc05158: 41 82 00 84 beq- ffc051dc return; /* * Do not attempt to free memory if in a critical section or ISR. */ if ( _System_state_Is_up(_System_state_Get()) && ffc0515c: 3d 20 00 00 lis r9,0 ffc05160: 80 09 28 48 lwz r0,10312(r9) ffc05164: 2f 80 00 03 cmpwi cr7,r0,3 ffc05168: 40 be 00 1c bne+ cr7,ffc05184 <== NEVER TAKEN !malloc_is_system_state_OK() ) { ffc0516c: 48 00 01 bd bl ffc05328 return; /* * Do not attempt to free memory if in a critical section or ISR. */ if ( _System_state_Is_up(_System_state_Get()) && ffc05170: 2f 83 00 00 cmpwi cr7,r3,0 ffc05174: 40 be 00 10 bne+ cr7,ffc05184 !malloc_is_system_state_OK() ) { malloc_deferred_free(ptr); ffc05178: 7f e3 fb 78 mr r3,r31 ffc0517c: 48 00 02 31 bl ffc053ac return; ffc05180: 48 00 00 5c b ffc051dc } /* * If configured, update the statistics */ if ( rtems_malloc_statistics_helpers ) ffc05184: 3d 20 00 00 lis r9,0 ffc05188: 81 29 27 a8 lwz r9,10152(r9) ffc0518c: 2f 89 00 00 cmpwi cr7,r9,0 ffc05190: 41 9e 00 14 beq- cr7,ffc051a4 (*rtems_malloc_statistics_helpers->at_free)(ptr); ffc05194: 80 09 00 08 lwz r0,8(r9) ffc05198: 7f e3 fb 78 mr r3,r31 ffc0519c: 7c 09 03 a6 mtctr r0 ffc051a0: 4e 80 04 21 bctrl if ( !_Protected_heap_Free( RTEMS_Malloc_Heap, ptr ) ) { ffc051a4: 3f c0 00 00 lis r30,0 ffc051a8: 80 7e 27 3c lwz r3,10044(r30) ffc051ac: 7f e4 fb 78 mr r4,r31 ffc051b0: 48 00 57 e5 bl ffc0a994 <_Protected_heap_Free> ffc051b4: 2f 83 00 00 cmpwi cr7,r3,0 ffc051b8: 40 be 00 24 bne+ cr7,ffc051dc printk( "Program heap: free of bad pointer %p -- range %p - %p \n", ptr, RTEMS_Malloc_Heap->area_begin, ffc051bc: 81 3e 27 3c lwz r9,10044(r30) */ 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", ffc051c0: 3c 60 ff c2 lis r3,-62 ffc051c4: 38 63 aa d3 addi r3,r3,-21805 ffc051c8: 80 a9 00 18 lwz r5,24(r9) ffc051cc: 7f e4 fb 78 mr r4,r31 ffc051d0: 80 c9 00 1c lwz r6,28(r9) ffc051d4: 4c c6 31 82 crclr 4*cr1+eq ffc051d8: 48 00 0e 19 bl ffc05ff0 RTEMS_Malloc_Heap->area_begin, RTEMS_Malloc_Heap->area_end ); } } ffc051dc: 39 61 00 10 addi r11,r1,16 ffc051e0: 48 01 3f cc b ffc191ac <_restgpr_30_x> =============================================================================== ffc056e0 : * NOTE: this must be called with * thread dispatching disabled! */ static void free_user_env(void *venv) { ffc056e0: 7c 08 02 a6 mflr r0 ffc056e4: 7c 2b 0b 78 mr r11,r1 ffc056e8: 94 21 ff f0 stwu r1,-16(r1) rtems_user_env_t *env = (rtems_user_env_t*) venv ; if (env != &rtems_global_user_env ffc056ec: 3d 20 00 00 lis r9,0 * NOTE: this must be called with * thread dispatching disabled! */ static void free_user_env(void *venv) { ffc056f0: 90 01 00 14 stw r0,20(r1) rtems_user_env_t *env = (rtems_user_env_t*) venv ; if (env != &rtems_global_user_env ffc056f4: 38 09 2b 50 addi r0,r9,11088 ffc056f8: 7f 83 00 00 cmpw cr7,r3,r0 * NOTE: this must be called with * thread dispatching disabled! */ static void free_user_env(void *venv) { ffc056fc: 48 00 fe 11 bl ffc1550c <_savegpr_31> ffc05700: 7c 7f 1b 78 mr r31,r3 rtems_user_env_t *env = (rtems_user_env_t*) venv ; if (env != &rtems_global_user_env ffc05704: 41 9e 00 1c beq- cr7,ffc05720 <== NEVER TAKEN #ifdef HAVE_USERENV_REFCNT && --env->refcnt <= 0 #endif ) { rtems_filesystem_freenode( &env->current_directory); ffc05708: 38 63 00 04 addi r3,r3,4 ffc0570c: 4b ff ed 59 bl ffc04464 rtems_filesystem_freenode( &env->root_directory); ffc05710: 38 7f 00 18 addi r3,r31,24 ffc05714: 4b ff ed 51 bl ffc04464 free(env); ffc05718: 7f e3 fb 78 mr r3,r31 ffc0571c: 4b ff ed 75 bl ffc04490 } } ffc05720: 39 61 00 10 addi r11,r1,16 ffc05724: 48 00 fe 34 b ffc15558 <_restgpr_31_x> =============================================================================== ffc17280 : int getdents( int dd_fd, char *dd_buf, int dd_len ) { ffc17280: 94 21 ff c8 stwu r1,-56(r1) ffc17284: 7c 08 02 a6 mflr r0 rtems_filesystem_location_info_t loc; /* * Get the file control block structure associated with the file descriptor */ iop = rtems_libio_iop( dd_fd ); ffc17288: 3d 20 00 00 lis r9,0 int getdents( int dd_fd, char *dd_buf, int dd_len ) { ffc1728c: 90 01 00 3c stw r0,60(r1) rtems_filesystem_location_info_t loc; /* * Get the file control block structure associated with the file descriptor */ iop = rtems_libio_iop( dd_fd ); ffc17290: 80 09 27 8c lwz r0,10124(r9) int getdents( int dd_fd, char *dd_buf, int dd_len ) { ffc17294: bf c1 00 30 stmw r30,48(r1) ffc17298: 7c bf 2b 78 mr r31,r5 rtems_filesystem_location_info_t loc; /* * Get the file control block structure associated with the file descriptor */ iop = rtems_libio_iop( dd_fd ); ffc1729c: 7f 83 00 40 cmplw cr7,r3,r0 ffc172a0: 3b c0 00 00 li r30,0 ffc172a4: 40 9c 00 14 bge- cr7,ffc172b8 <== NEVER TAKEN ffc172a8: 3d 20 00 00 lis r9,0 ffc172ac: 83 c9 28 58 lwz r30,10328(r9) ffc172b0: 54 63 30 32 rlwinm r3,r3,6,0,25 ffc172b4: 7f de 1a 14 add r30,r30,r3 /* * Make sure we are working on a directory */ loc = iop->pathinfo; ffc172b8: 39 7e 00 1c addi r11,r30,28 ffc172bc: 38 61 00 08 addi r3,r1,8 ffc172c0: 7c ab a4 aa lswi r5,r11,20 ffc172c4: 7c a3 a5 aa stswi r5,r3,20 if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) ffc172c8: 81 21 00 14 lwz r9,20(r1) ffc172cc: 80 09 00 10 lwz r0,16(r9) ffc172d0: 90 81 00 28 stw r4,40(r1) ffc172d4: 7c 09 03 a6 mtctr r0 ffc172d8: 4e 80 04 21 bctrl ffc172dc: 80 81 00 28 lwz r4,40(r1) ffc172e0: 2f 83 00 01 cmpwi cr7,r3,1 ffc172e4: 41 be 00 18 beq+ cr7,ffc172fc rtems_set_errno_and_return_minus_one( ENOTDIR ); ffc172e8: 4b ff 9d ed bl ffc110d4 <__errno> ffc172ec: 38 00 00 14 li r0,20 ffc172f0: 90 03 00 00 stw r0,0(r3) ffc172f4: 38 60 ff ff li r3,-1 ffc172f8: 48 00 00 1c b ffc17314 /* * 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 ); ffc172fc: 81 3e 00 24 lwz r9,36(r30) ffc17300: 7f c3 f3 78 mr r3,r30 ffc17304: 7f e5 fb 78 mr r5,r31 ffc17308: 80 09 00 08 lwz r0,8(r9) ffc1730c: 7c 09 03 a6 mtctr r0 ffc17310: 4e 80 04 21 bctrl } ffc17314: 39 61 00 38 addi r11,r1,56 ffc17318: 4b ff f8 a0 b ffc16bb8 <_restgpr_30_x> =============================================================================== ffc136c0 : 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 ) ffc136c0: 81 23 00 1c lwz r9,28(r3) return -1; /* It wasn't a directory --> return error */ ffc136c4: 38 00 ff ff li r0,-1 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 ) ffc136c8: 81 29 00 4c lwz r9,76(r9) ffc136cc: 2f 89 00 01 cmpwi cr7,r9,1 ffc136d0: 40 be 00 18 bne+ cr7,ffc136e8 <== NEVER TAKEN return -1; /* It wasn't a directory --> return error */ iop->offset = 0; ffc136d4: 39 20 00 00 li r9,0 ffc136d8: 39 40 00 00 li r10,0 ffc136dc: 91 23 00 10 stw r9,16(r3) return 0; ffc136e0: 38 00 00 00 li r0,0 the_jnode = (IMFS_jnode_t *) iop->pathinfo.node_access; if ( the_jnode->type != IMFS_DIRECTORY ) return -1; /* It wasn't a directory --> return error */ iop->offset = 0; ffc136e4: 91 43 00 14 stw r10,20(r3) return 0; } ffc136e8: 7c 03 03 78 mr r3,r0 ffc136ec: 4e 80 00 20 blr =============================================================================== ffc13908 : int imfs_dir_rmnod( rtems_filesystem_location_info_t *parent_pathloc, /* IN */ rtems_filesystem_location_info_t *pathloc /* IN */ ) { ffc13908: 7c 08 02 a6 mflr r0 ffc1390c: 7c 2b 0b 78 mr r11,r1 ffc13910: 94 21 ff f0 stwu r1,-16(r1) ffc13914: 90 01 00 14 stw r0,20(r1) ffc13918: 48 00 58 4d bl ffc19164 <_savegpr_31> IMFS_jnode_t *the_jnode; the_jnode = (IMFS_jnode_t *) pathloc->node_access; ffc1391c: 83 e4 00 00 lwz r31,0(r4) /* * You cannot remove a node that still has children */ if ( ! rtems_chain_is_empty( &the_jnode->info.directory.Entries ) ) ffc13920: 81 3f 00 50 lwz r9,80(r31) RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); ffc13924: 38 1f 00 54 addi r0,r31,84 ffc13928: 7f 89 00 00 cmpw cr7,r9,r0 ffc1392c: 41 be 00 10 beq+ cr7,ffc1393c rtems_set_errno_and_return_minus_one( ENOTEMPTY ); ffc13930: 48 00 09 89 bl ffc142b8 <__errno> ffc13934: 38 00 00 5a li r0,90 ffc13938: 48 00 00 1c b ffc13954 /* * You cannot remove the file system root node. */ if ( pathloc->mt_entry->mt_fs_root.node_access == pathloc->node_access ) ffc1393c: 81 24 00 10 lwz r9,16(r4) ffc13940: 80 09 00 1c lwz r0,28(r9) ffc13944: 7f 80 f8 00 cmpw cr7,r0,r31 ffc13948: 40 be 00 18 bne+ cr7,ffc13960 rtems_set_errno_and_return_minus_one( EBUSY ); ffc1394c: 48 00 09 6d bl ffc142b8 <__errno> ffc13950: 38 00 00 10 li r0,16 ffc13954: 90 03 00 00 stw r0,0(r3) ffc13958: 38 60 ff ff li r3,-1 ffc1395c: 48 00 00 24 b ffc13980 /* * You cannot remove a mountpoint. */ if ( the_jnode->info.directory.mt_fs != NULL ) ffc13960: 80 1f 00 5c lwz r0,92(r31) ffc13964: 2f 80 00 00 cmpwi cr7,r0,0 ffc13968: 40 be ff e4 bne- cr7,ffc1394c <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EBUSY ); IMFS_create_orphan( the_jnode ); ffc1396c: 7f e3 fb 78 mr r3,r31 ffc13970: 4b ff c7 9d bl ffc1010c IMFS_check_node_remove( the_jnode ); ffc13974: 7f e3 fb 78 mr r3,r31 ffc13978: 4b ff c7 ed bl ffc10164 return 0; ffc1397c: 38 60 00 00 li r3,0 } ffc13980: 39 61 00 10 addi r11,r1,16 ffc13984: 48 00 58 2c b ffc191b0 <_restgpr_31_x> =============================================================================== ffc04e80 : /* * Initialize useable but dummy databases */ void init_etc_passwd_group(void) { ffc04e80: 7c 08 02 a6 mflr r0 ffc04e84: 7c 2b 0b 78 mr r11,r1 ffc04e88: 94 21 ff f0 stwu r1,-16(r1) FILE *fp; static char etc_passwd_initted = 0; if (etc_passwd_initted) ffc04e8c: 3d 20 00 00 lis r9,0 /* * Initialize useable but dummy databases */ void init_etc_passwd_group(void) { ffc04e90: 90 01 00 14 stw r0,20(r1) ffc04e94: 48 01 1f b5 bl ffc16e48 <_savegpr_31> FILE *fp; static char etc_passwd_initted = 0; if (etc_passwd_initted) ffc04e98: 88 09 28 d0 lbz r0,10448(r9) ffc04e9c: 2f 80 00 00 cmpwi cr7,r0,0 ffc04ea0: 40 be 00 bc bne+ cr7,ffc04f5c return; etc_passwd_initted = 1; mkdir("/etc", 0777); ffc04ea4: 3c 60 ff c2 lis r3,-62 FILE *fp; static char etc_passwd_initted = 0; if (etc_passwd_initted) return; etc_passwd_initted = 1; ffc04ea8: 38 00 00 01 li r0,1 mkdir("/etc", 0777); ffc04eac: 38 80 01 ff li r4,511 FILE *fp; static char etc_passwd_initted = 0; if (etc_passwd_initted) return; etc_passwd_initted = 1; ffc04eb0: 98 09 28 d0 stb r0,10448(r9) mkdir("/etc", 0777); ffc04eb4: 38 63 8b f3 addi r3,r3,-29709 /* * Initialize /etc/passwd */ if ((fp = fopen("/etc/passwd", "r")) != NULL) { ffc04eb8: 3f e0 ff c2 lis r31,-62 static char etc_passwd_initted = 0; if (etc_passwd_initted) return; etc_passwd_initted = 1; mkdir("/etc", 0777); ffc04ebc: 48 00 09 d5 bl ffc05890 /* * Initialize /etc/passwd */ if ((fp = fopen("/etc/passwd", "r")) != NULL) { ffc04ec0: 3b ff 8b f8 addi r31,r31,-29704 ffc04ec4: 3c 80 ff c2 lis r4,-62 ffc04ec8: 7f e3 fb 78 mr r3,r31 ffc04ecc: 38 84 84 1c addi r4,r4,-31716 ffc04ed0: 48 00 d0 4d bl ffc11f1c ffc04ed4: 2f 83 00 00 cmpwi cr7,r3,0 ffc04ed8: 40 be 00 30 bne+ cr7,ffc04f08 fclose(fp); } else if ((fp = fopen("/etc/passwd", "w")) != NULL) { ffc04edc: 3c 80 ff c2 lis r4,-62 ffc04ee0: 7f e3 fb 78 mr r3,r31 ffc04ee4: 38 84 8c 04 addi r4,r4,-29692 ffc04ee8: 48 00 d0 35 bl ffc11f1c ffc04eec: 7c 7f 1b 79 mr. r31,r3 ffc04ef0: 41 82 00 1c beq- ffc04f0c <== NEVER TAKEN fprintf(fp, "root:*:0:0:root::/:/bin/sh\n" ffc04ef4: 3c 60 ff c2 lis r3,-62 ffc04ef8: 38 63 8c 06 addi r3,r3,-29690 ffc04efc: 7f e4 fb 78 mr r4,r31 ffc04f00: 48 00 d0 e1 bl ffc11fe0 "rtems:*:1:1:RTEMS Application::/:/bin/sh\n" "tty:!:2:2:tty owner::/:/bin/false\n" ); fclose(fp); ffc04f04: 7f e3 fb 78 mr r3,r31 ffc04f08: 48 00 c6 55 bl ffc1155c } /* * Initialize /etc/group */ if ((fp = fopen("/etc/group", "r")) != NULL) { ffc04f0c: 3f e0 ff c2 lis r31,-62 ffc04f10: 3b ff 8c 6d addi r31,r31,-29587 ffc04f14: 3c 80 ff c2 lis r4,-62 ffc04f18: 7f e3 fb 78 mr r3,r31 ffc04f1c: 38 84 84 1c addi r4,r4,-31716 ffc04f20: 48 00 cf fd bl ffc11f1c ffc04f24: 2f 83 00 00 cmpwi cr7,r3,0 ffc04f28: 40 be 00 30 bne+ cr7,ffc04f58 fclose(fp); } else if ((fp = fopen("/etc/group", "w")) != NULL) { ffc04f2c: 3c 80 ff c2 lis r4,-62 ffc04f30: 7f e3 fb 78 mr r3,r31 ffc04f34: 38 84 8c 04 addi r4,r4,-29692 ffc04f38: 48 00 cf e5 bl ffc11f1c ffc04f3c: 7c 7f 1b 79 mr. r31,r3 ffc04f40: 41 82 00 1c beq- ffc04f5c <== NEVER TAKEN fprintf( fp, "root:x:0:root\n" ffc04f44: 3c 60 ff c2 lis r3,-62 ffc04f48: 38 63 8c 78 addi r3,r3,-29576 ffc04f4c: 7f e4 fb 78 mr r4,r31 ffc04f50: 48 00 d0 91 bl ffc11fe0 "rtems:x:1:rtems\n" "tty:x:2:tty\n" ); fclose(fp); ffc04f54: 7f e3 fb 78 mr r3,r31 ffc04f58: 48 00 c6 05 bl ffc1155c } } ffc04f5c: 39 61 00 10 addi r11,r1,16 ffc04f60: 4b ff b9 68 b ffc008c8 <_restgpr_31_x> =============================================================================== ffc07208 : /* * Process a single input character */ static int iproc (unsigned char c, struct rtems_termios_tty *tty) { ffc07208: 94 21 ff f0 stwu r1,-16(r1) ffc0720c: 7c 08 02 a6 mflr r0 ffc07210: 90 01 00 14 stw r0,20(r1) if (tty->termios.c_iflag & ISTRIP) ffc07214: 80 04 00 30 lwz r0,48(r4) /* * Process a single input character */ static int iproc (unsigned char c, struct rtems_termios_tty *tty) { ffc07218: bf c1 00 08 stmw r30,8(r1) ffc0721c: 7c 7e 1b 78 mr r30,r3 if (tty->termios.c_iflag & ISTRIP) ffc07220: 70 09 00 20 andi. r9,r0,32 /* * Process a single input character */ static int iproc (unsigned char c, struct rtems_termios_tty *tty) { ffc07224: 7c 9f 23 78 mr r31,r4 if (tty->termios.c_iflag & ISTRIP) ffc07228: 41 82 00 08 beq- ffc07230 <== ALWAYS TAKEN c &= 0x7f; ffc0722c: 54 7e 06 7e clrlwi r30,r3,25 <== NOT EXECUTED if (tty->termios.c_iflag & IUCLC) ffc07230: 70 09 02 00 andi. r9,r0,512 ffc07234: 41 82 00 28 beq- ffc0725c c = tolower (c); ffc07238: 3d 20 00 00 lis r9,0 ffc0723c: 81 29 27 7c lwz r9,10108(r9) ffc07240: 7d 29 f2 14 add r9,r9,r30 ffc07244: 89 29 00 01 lbz r9,1(r9) ffc07248: 55 29 07 be clrlwi r9,r9,30 ffc0724c: 2f 89 00 01 cmpwi cr7,r9,1 ffc07250: 40 be 00 08 bne+ cr7,ffc07258 ffc07254: 3b de 00 20 addi r30,r30,32 ffc07258: 57 de 06 3e clrlwi r30,r30,24 if (c == '\r') { ffc0725c: 2f 9e 00 0d cmpwi cr7,r30,13 ffc07260: 40 be 00 20 bne+ cr7,ffc07280 if (tty->termios.c_iflag & IGNCR) ffc07264: 70 09 00 80 andi. r9,r0,128 return 0; ffc07268: 38 60 00 00 li r3,0 if (tty->termios.c_iflag & IUCLC) c = tolower (c); if (c == '\r') { if (tty->termios.c_iflag & IGNCR) ffc0726c: 40 82 01 44 bne- ffc073b0 <== NEVER TAKEN return 0; if (tty->termios.c_iflag & ICRNL) ffc07270: 70 09 01 00 andi. r9,r0,256 ffc07274: 41 82 00 2c beq- ffc072a0 <== NEVER TAKEN c = '\n'; ffc07278: 3b c0 00 0a li r30,10 ffc0727c: 48 00 00 24 b ffc072a0 } else if ((c == '\n') && (tty->termios.c_iflag & INLCR)) { ffc07280: 2f 9e 00 0a cmpwi cr7,r30,10 ffc07284: 40 be 00 14 bne+ cr7,ffc07298 ffc07288: 70 09 00 40 andi. r9,r0,64 ffc0728c: 41 82 00 14 beq- ffc072a0 <== ALWAYS TAKEN c = '\r'; ffc07290: 3b c0 00 0d li r30,13 <== NOT EXECUTED ffc07294: 48 00 00 0c b ffc072a0 <== NOT EXECUTED } if ((c != '\0') && (tty->termios.c_lflag & ICANON)) { ffc07298: 2f 9e 00 00 cmpwi cr7,r30,0 ffc0729c: 41 be 00 c8 beq+ cr7,ffc07364 <== NEVER TAKEN ffc072a0: 80 1f 00 3c lwz r0,60(r31) ffc072a4: 70 09 00 02 andi. r9,r0,2 ffc072a8: 41 82 00 bc beq- ffc07364 if (c == tty->termios.c_cc[VERASE]) { ffc072ac: 89 3f 00 43 lbz r9,67(r31) erase (tty, 0); ffc072b0: 7f e3 fb 78 mr r3,r31 ffc072b4: 38 80 00 00 li r4,0 } else if ((c == '\n') && (tty->termios.c_iflag & INLCR)) { c = '\r'; } if ((c != '\0') && (tty->termios.c_lflag & ICANON)) { if (c == tty->termios.c_cc[VERASE]) { ffc072b8: 7f 89 f0 00 cmpw cr7,r9,r30 ffc072bc: 41 9e 00 18 beq- cr7,ffc072d4 erase (tty, 0); return 0; } else if (c == tty->termios.c_cc[VKILL]) { ffc072c0: 89 3f 00 44 lbz r9,68(r31) ffc072c4: 7f 89 f0 00 cmpw cr7,r9,r30 ffc072c8: 40 be 00 14 bne+ cr7,ffc072dc erase (tty, 1); ffc072cc: 7f e3 fb 78 mr r3,r31 ffc072d0: 38 80 00 01 li r4,1 ffc072d4: 4b ff fd 29 bl ffc06ffc ffc072d8: 48 00 00 d4 b ffc073ac return 0; } else if (c == tty->termios.c_cc[VEOF]) { ffc072dc: 89 3f 00 45 lbz r9,69(r31) return 1; ffc072e0: 38 60 00 01 li r3,1 } else if (c == tty->termios.c_cc[VKILL]) { erase (tty, 1); return 0; } else if (c == tty->termios.c_cc[VEOF]) { ffc072e4: 7f 89 f0 00 cmpw cr7,r9,r30 ffc072e8: 41 9e 00 c8 beq- cr7,ffc073b0 <== NEVER TAKEN return 1; } else if (c == '\n') { ffc072ec: 2f 9e 00 0a cmpwi cr7,r30,10 ffc072f0: 40 be 00 2c bne+ cr7,ffc0731c if (tty->termios.c_lflag & (ECHO | ECHONL)) ffc072f4: 70 09 00 48 andi. r9,r0,72 ffc072f8: 41 a2 00 10 beq+ ffc07308 <== NEVER TAKEN echo (c, tty); ffc072fc: 38 60 00 0a li r3,10 ffc07300: 7f e4 fb 78 mr r4,r31 ffc07304: 4b ff fc 6d bl ffc06f70 tty->cbuf[tty->ccount++] = c; ffc07308: 81 3f 00 20 lwz r9,32(r31) ffc0730c: 38 00 00 0a li r0,10 ffc07310: 81 7f 00 1c lwz r11,28(r31) ffc07314: 7c 0b 49 ae stbx r0,r11,r9 ffc07318: 48 00 00 3c b ffc07354 return 1; } else if ((c == tty->termios.c_cc[VEOL]) || ffc0731c: 89 3f 00 4c lbz r9,76(r31) ffc07320: 7f 89 f0 00 cmpw cr7,r9,r30 ffc07324: 41 9e 00 10 beq- cr7,ffc07334 <== NEVER TAKEN ffc07328: 89 3f 00 51 lbz r9,81(r31) ffc0732c: 7f 89 f0 00 cmpw cr7,r9,r30 ffc07330: 40 be 00 34 bne+ cr7,ffc07364 <== ALWAYS TAKEN (c == tty->termios.c_cc[VEOL2])) { if (tty->termios.c_lflag & ECHO) ffc07334: 70 09 00 08 andi. r9,r0,8 <== NOT EXECUTED ffc07338: 41 a2 00 10 beq+ ffc07348 <== NOT EXECUTED echo (c, tty); ffc0733c: 7f c3 f3 78 mr r3,r30 <== NOT EXECUTED ffc07340: 7f e4 fb 78 mr r4,r31 <== NOT EXECUTED ffc07344: 4b ff fc 2d bl ffc06f70 <== NOT EXECUTED tty->cbuf[tty->ccount++] = c; ffc07348: 81 3f 00 20 lwz r9,32(r31) <== NOT EXECUTED ffc0734c: 81 7f 00 1c lwz r11,28(r31) <== NOT EXECUTED ffc07350: 7f cb 49 ae stbx r30,r11,r9 <== NOT EXECUTED ffc07354: 39 29 00 01 addi r9,r9,1 ffc07358: 91 3f 00 20 stw r9,32(r31) return 1; ffc0735c: 38 60 00 01 li r3,1 ffc07360: 48 00 00 50 b ffc073b0 } /* * FIXME: Should do IMAXBEL handling somehow */ if (tty->ccount < (CBUFSIZE-1)) { ffc07364: 3d 20 00 00 lis r9,0 ffc07368: 81 29 21 8c lwz r9,8588(r9) if (tty->termios.c_lflag & ECHO) echo (c, tty); tty->cbuf[tty->ccount++] = c; } return 0; ffc0736c: 38 60 00 00 li r3,0 } /* * FIXME: Should do IMAXBEL handling somehow */ if (tty->ccount < (CBUFSIZE-1)) { ffc07370: 38 09 ff ff addi r0,r9,-1 ffc07374: 81 3f 00 20 lwz r9,32(r31) ffc07378: 7f 89 00 00 cmpw cr7,r9,r0 ffc0737c: 40 9c 00 34 bge- cr7,ffc073b0 <== NEVER TAKEN if (tty->termios.c_lflag & ECHO) ffc07380: 80 1f 00 3c lwz r0,60(r31) ffc07384: 70 09 00 08 andi. r9,r0,8 ffc07388: 41 a2 00 10 beq+ ffc07398 <== NEVER TAKEN echo (c, tty); ffc0738c: 7f c3 f3 78 mr r3,r30 ffc07390: 7f e4 fb 78 mr r4,r31 ffc07394: 4b ff fb dd bl ffc06f70 tty->cbuf[tty->ccount++] = c; ffc07398: 81 3f 00 20 lwz r9,32(r31) ffc0739c: 81 7f 00 1c lwz r11,28(r31) ffc073a0: 7f cb 49 ae stbx r30,r11,r9 ffc073a4: 39 29 00 01 addi r9,r9,1 ffc073a8: 91 3f 00 20 stw r9,32(r31) } return 0; ffc073ac: 38 60 00 00 li r3,0 } ffc073b0: 39 61 00 10 addi r11,r1,16 ffc073b4: 48 01 1d f8 b ffc191ac <_restgpr_30_x> =============================================================================== ffc25788 : int killinfo( pid_t pid, int sig, const union sigval *value ) { ffc25788: 94 21 ff d8 stwu r1,-40(r1) ffc2578c: 7c 08 02 a6 mflr r0 ffc25790: bf 81 00 18 stmw r28,24(r1) ffc25794: 7c 7e 1b 78 mr r30,r3 ffc25798: 7c 9f 23 78 mr r31,r4 ffc2579c: 90 01 00 2c stw r0,44(r1) ffc257a0: 7c bd 2b 78 mr r29,r5 POSIX_signals_Siginfo_node *psiginfo; /* * Only supported for the "calling process" (i.e. this node). */ if ( pid != getpid() ) ffc257a4: 4b ff fc 7d bl ffc25420 ffc257a8: 7f 9e 18 00 cmpw cr7,r30,r3 ffc257ac: 41 be 00 10 beq+ cr7,ffc257bc rtems_set_errno_and_return_minus_one( ESRCH ); ffc257b0: 4b ff 07 9d bl ffc15f4c <__errno> ffc257b4: 38 00 00 03 li r0,3 ffc257b8: 48 00 00 14 b ffc257cc /* * Validate the signal passed. */ if ( !sig ) ffc257bc: 2f 9f 00 00 cmpwi cr7,r31,0 ffc257c0: 40 be 00 18 bne+ cr7,ffc257d8 rtems_set_errno_and_return_minus_one( EINVAL ); ffc257c4: 4b ff 07 89 bl ffc15f4c <__errno> ffc257c8: 38 00 00 16 li r0,22 ffc257cc: 90 03 00 00 stw r0,0(r3) ffc257d0: 38 60 ff ff li r3,-1 ffc257d4: 48 00 02 24 b ffc259f8 static inline bool is_valid_signo( int signo ) { return ((signo) >= 1 && (signo) <= 32 ); ffc257d8: 3b df ff ff addi r30,r31,-1 if ( !is_valid_signo(sig) ) ffc257dc: 2b 9e 00 1f cmplwi cr7,r30,31 ffc257e0: 41 bd ff e4 bgt- cr7,ffc257c4 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 ) ffc257e4: 1c 1f 00 0c mulli r0,r31,12 ffc257e8: 3d 20 00 00 lis r9,0 ffc257ec: 39 29 32 e0 addi r9,r9,13024 ffc257f0: 7d 29 02 14 add r9,r9,r0 ffc257f4: 80 09 00 08 lwz r0,8(r9) return 0; ffc257f8: 38 60 00 00 li r3,0 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 ) ffc257fc: 2f 80 00 01 cmpwi cr7,r0,1 ffc25800: 41 9e 01 f8 beq- cr7,ffc259f8 /* * 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 ) ) ffc25804: 2f 9f 00 08 cmpwi cr7,r31,8 ffc25808: 41 9e 00 14 beq- cr7,ffc2581c ffc2580c: 2f 9f 00 04 cmpwi cr7,r31,4 ffc25810: 41 9e 00 0c beq- cr7,ffc2581c ffc25814: 2f 9f 00 0b cmpwi cr7,r31,11 ffc25818: 40 be 00 14 bne+ cr7,ffc2582c return pthread_kill( pthread_self(), sig ); ffc2581c: 48 00 04 0d bl ffc25c28 ffc25820: 7f e4 fb 78 mr r4,r31 ffc25824: 48 00 03 35 bl ffc25b58 ffc25828: 48 00 01 d0 b ffc259f8 * Build up a siginfo structure */ siginfo = &siginfo_struct; siginfo->si_signo = sig; siginfo->si_code = SI_USER; if ( !value ) { ffc2582c: 2f 9d 00 00 cmpwi cr7,r29,0 /* * Build up a siginfo structure */ siginfo = &siginfo_struct; siginfo->si_signo = sig; ffc25830: 93 e1 00 08 stw r31,8(r1) static inline sigset_t signo_to_mask( uint32_t sig ) { return 1u << (sig - 1); ffc25834: 38 00 00 01 li r0,1 ffc25838: 7c 1e f0 30 slw r30,r0,r30 siginfo->si_code = SI_USER; ffc2583c: 90 01 00 0c stw r0,12(r1) if ( !value ) { ffc25840: 40 be 00 0c bne+ cr7,ffc2584c siginfo->si_value.sival_int = 0; ffc25844: 93 a1 00 10 stw r29,16(r1) ffc25848: 48 00 00 0c b ffc25854 } else { siginfo->si_value = *value; ffc2584c: 80 1d 00 00 lwz r0,0(r29) ffc25850: 90 01 00 10 stw r0,16(r1) ffc25854: 3d 20 00 00 lis r9,0 ffc25858: 81 69 28 4c lwz r11,10316(r9) ffc2585c: 38 0b 00 01 addi r0,r11,1 ffc25860: 90 09 28 4c stw r0,10316(r9) /* * 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; ffc25864: 3d 20 00 00 lis r9,0 ffc25868: 80 69 32 90 lwz r3,12944(r9) api = the_thread->API_Extensions[ THREAD_API_POSIX ]; if ( _POSIX_signals_Is_interested( api, mask ) ) { ffc2586c: 81 23 01 34 lwz r9,308(r3) ffc25870: 80 09 00 d0 lwz r0,208(r9) ffc25874: 7f c5 00 79 andc. r5,r30,r0 ffc25878: 40 82 01 00 bne- ffc25978 } DEBUG_STEP("\n"); _Thread_Enable_dispatch(); return 0; } ffc2587c: 3d 20 00 00 lis r9,0 /* 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 ); ffc25880: 3d 60 00 00 lis r11,0 } DEBUG_STEP("\n"); _Thread_Enable_dispatch(); return 0; } ffc25884: 81 29 34 6c lwz r9,13420(r9) /* 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 ); ffc25888: 38 0b 34 70 addi r0,r11,13424 ffc2588c: 48 00 00 28 b ffc258b4 #endif /* * Is this thread is actually blocked waiting for the signal? */ if (the_thread->Wait.option & mask) ffc25890: 81 49 00 30 lwz r10,48(r9) for ( the_node = _Chain_First( the_chain ); !_Chain_Is_tail( the_chain, the_node ) ; the_node = the_node->next ) { the_thread = (Thread_Control *)the_node; ffc25894: 7d 23 4b 78 mr r3,r9 api = the_thread->API_Extensions[ THREAD_API_POSIX ]; ffc25898: 81 69 01 34 lwz r11,308(r9) #endif /* * Is this thread is actually blocked waiting for the signal? */ if (the_thread->Wait.option & mask) ffc2589c: 7f c8 50 39 and. r8,r30,r10 ffc258a0: 40 82 00 d8 bne- ffc25978 /* * Is this thread is blocked waiting for another signal but has * not blocked this one? */ if (~api->signals_blocked & mask) ffc258a4: 81 6b 00 d0 lwz r11,208(r11) ffc258a8: 7f ca 58 79 andc. r10,r30,r11 ffc258ac: 40 82 00 cc bne- ffc25978 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 ) { ffc258b0: 81 29 00 00 lwz r9,0(r9) /* 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 ); ffc258b4: 7f 89 00 00 cmpw cr7,r9,r0 ffc258b8: 40 9e ff d8 bne+ cr7,ffc25890 * NOTES: * * + rtems internal threads do not receive signals. */ interested = NULL; interested_priority = PRIORITY_MAXIMUM + 1; ffc258bc: 3d 20 00 00 lis r9,0 ffc258c0: 89 29 27 84 lbz r9,10116(r9) ffc258c4: 3d 60 00 00 lis r11,0 ffc258c8: 39 6b 2d a4 addi r11,r11,11684 ffc258cc: 38 09 00 01 addi r0,r9,1 */ #define _POSIX_signals_Is_interested( _api, _mask ) \ ( ~(_api)->signals_blocked & (_mask) ) int killinfo( ffc258d0: 38 8b 00 08 addi r4,r11,8 * * NOTES: * * + rtems internal threads do not receive signals. */ interested = NULL; ffc258d4: 38 60 00 00 li r3,0 for (the_api = OBJECTS_CLASSIC_API; the_api <= OBJECTS_APIS_LAST; the_api++) { /* * This can occur when no one is interested and an API is not configured. */ if ( !_Objects_Information_table[ the_api ] ) ffc258d8: 85 2b 00 04 lwzu r9,4(r11) ffc258dc: 2f 89 00 00 cmpwi cr7,r9,0 ffc258e0: 41 9e 00 88 beq- cr7,ffc25968 <== NEVER TAKEN continue; the_info = _Objects_Information_table[ the_api ][ 1 ]; ffc258e4: 81 29 00 04 lwz r9,4(r9) #endif maximum = the_info->maximum; object_table = the_info->local_table; for ( index = 1 ; index <= maximum ; index++ ) { ffc258e8: 39 00 00 01 li r8,1 */ if ( !the_info ) continue; #endif maximum = the_info->maximum; ffc258ec: a3 a9 00 10 lhz r29,16(r9) ffc258f0: 80 e9 00 1c lwz r7,28(r9) object_table = the_info->local_table; for ( index = 1 ; index <= maximum ; index++ ) { ffc258f4: 48 00 00 6c b ffc25960 the_thread = (Thread_Control *) object_table[ index ]; ffc258f8: 85 27 00 04 lwzu r9,4(r7) if ( !the_thread ) ffc258fc: 2f 89 00 00 cmpwi cr7,r9,0 ffc25900: 41 9e 00 5c beq- cr7,ffc2595c /* * If this thread is of lower priority than the interested thread, * go on to the next thread. */ if ( the_thread->current_priority > interested_priority ) ffc25904: 81 49 00 14 lwz r10,20(r9) ffc25908: 7f 8a 00 40 cmplw cr7,r10,r0 ffc2590c: 41 9d 00 50 bgt- cr7,ffc2595c #if defined(RTEMS_DEBUG) if ( !api ) continue; #endif if ( !_POSIX_signals_Is_interested( api, mask ) ) ffc25910: 80 c9 01 34 lwz r6,308(r9) ffc25914: 80 c6 00 d0 lwz r6,208(r6) ffc25918: 7f dc 30 79 andc. r28,r30,r6 ffc2591c: 41 82 00 40 beq- ffc2595c * * 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 ) { ffc25920: 41 9c 00 34 blt- cr7,ffc25954 * and blocking interruptibutable by signal. * * If the interested thread is ready, don't think about changing. */ if ( interested && !_States_Is_ready( interested->current_state ) ) { ffc25924: 2f 83 00 00 cmpwi cr7,r3,0 ffc25928: 41 9e 00 34 beq- cr7,ffc2595c <== NEVER TAKEN ffc2592c: 80 a3 00 10 lwz r5,16(r3) ffc25930: 2f 85 00 00 cmpwi cr7,r5,0 ffc25934: 41 9e 00 28 beq- cr7,ffc2595c <== NEVER TAKEN /* preferred ready over blocked */ DEBUG_STEP("5"); if ( _States_Is_ready( the_thread->current_state ) ) { ffc25938: 80 c9 00 10 lwz r6,16(r9) ffc2593c: 2f 86 00 00 cmpwi cr7,r6,0 ffc25940: 41 9e 00 14 beq- cr7,ffc25954 continue; } DEBUG_STEP("6"); /* prefer blocked/interruptible over blocked/not interruptible */ if ( !_States_Is_interruptible_by_signal(interested->current_state) ) { ffc25944: 74 bc 10 00 andis. r28,r5,4096 ffc25948: 40 82 00 14 bne- ffc2595c DEBUG_STEP("7"); if ( _States_Is_interruptible_by_signal(the_thread->current_state) ) { ffc2594c: 74 c5 10 00 andis. r5,r6,4096 ffc25950: 41 82 00 0c beq- ffc2595c */ if ( interested && !_States_Is_ready( interested->current_state ) ) { /* preferred ready over blocked */ DEBUG_STEP("5"); if ( _States_Is_ready( the_thread->current_state ) ) { ffc25954: 7d 40 53 78 mr r0,r10 ffc25958: 7d 23 4b 78 mr r3,r9 #endif maximum = the_info->maximum; object_table = the_info->local_table; for ( index = 1 ; index <= maximum ; index++ ) { ffc2595c: 39 08 00 01 addi r8,r8,1 ffc25960: 7f 88 e8 40 cmplw cr7,r8,r29 ffc25964: 40 9d ff 94 ble+ cr7,ffc258f8 * + 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++) { ffc25968: 7f 8b 20 00 cmpw cr7,r11,r4 ffc2596c: 40 be ff 6c bne- cr7,ffc258d8 } } } } if ( interested ) { ffc25970: 2f 83 00 00 cmpwi cr7,r3,0 ffc25974: 41 9e 00 18 beq- cr7,ffc2598c /* * 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 ) ) { ffc25978: 7f e4 fb 78 mr r4,r31 ffc2597c: 38 a1 00 08 addi r5,r1,8 ffc25980: 48 00 00 a9 bl ffc25a28 <_POSIX_signals_Unblock_thread> ffc25984: 2f 83 00 00 cmpwi cr7,r3,0 ffc25988: 40 9e 00 68 bne- cr7,ffc259f0 /* * 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 ); ffc2598c: 7f c3 f3 78 mr r3,r30 ffc25990: 48 00 00 71 bl ffc25a00 <_POSIX_signals_Set_process_signals> if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) { ffc25994: 1f ff 00 0c mulli r31,r31,12 ffc25998: 3d 20 00 00 lis r9,0 ffc2599c: 39 29 32 e0 addi r9,r9,13024 ffc259a0: 7c 09 f8 2e lwzx r0,r9,r31 ffc259a4: 2f 80 00 02 cmpwi cr7,r0,2 ffc259a8: 40 be 00 48 bne+ cr7,ffc259f0 psiginfo = (POSIX_signals_Siginfo_node *) _Chain_Get( &_POSIX_signals_Inactive_siginfo ); ffc259ac: 3c 60 00 00 lis r3,0 ffc259b0: 38 63 34 60 addi r3,r3,13408 ffc259b4: 4b fe 86 e9 bl ffc0e09c <_Chain_Get> if ( !psiginfo ) { ffc259b8: 7c 64 1b 79 mr. r4,r3 ffc259bc: 40 a2 00 14 bne+ ffc259d0 _Thread_Enable_dispatch(); ffc259c0: 4b fe a4 b1 bl ffc0fe70 <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one( EAGAIN ); ffc259c4: 4b ff 05 89 bl ffc15f4c <__errno> ffc259c8: 38 00 00 0b li r0,11 ffc259cc: 4b ff fe 00 b ffc257cc } psiginfo->Info = *siginfo; ffc259d0: 39 24 00 08 addi r9,r4,8 ffc259d4: 39 61 00 08 addi r11,r1,8 _Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node ); ffc259d8: 3c 60 00 00 lis r3,0 if ( !psiginfo ) { _Thread_Enable_dispatch(); rtems_set_errno_and_return_minus_one( EAGAIN ); } psiginfo->Info = *siginfo; ffc259dc: 7c ab 64 aa lswi r5,r11,12 ffc259e0: 7c a9 65 aa stswi r5,r9,12 _Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node ); ffc259e4: 38 63 34 d4 addi r3,r3,13524 ffc259e8: 7c 63 fa 14 add r3,r3,r31 ffc259ec: 4b fe 86 59 bl ffc0e044 <_Chain_Append> } DEBUG_STEP("\n"); _Thread_Enable_dispatch(); ffc259f0: 4b fe a4 81 bl ffc0fe70 <_Thread_Enable_dispatch> return 0; ffc259f4: 38 60 00 00 li r3,0 } ffc259f8: 39 61 00 28 addi r11,r1,40 ffc259fc: 4b fd c5 90 b ffc01f8c <_restgpr_28_x> =============================================================================== ffc19780 : extern void _wrapup_reent(struct _reent *); extern void _reclaim_reent(struct _reent *); void libc_wrapup(void) { ffc19780: 94 21 ff f0 stwu r1,-16(r1) ffc19784: 7c 08 02 a6 mflr r0 /* * In case RTEMS is already down, don't do this. It could be * dangerous. */ if (!_System_state_Is_up(_System_state_Get())) ffc19788: 3d 20 00 00 lis r9,0 extern void _wrapup_reent(struct _reent *); extern void _reclaim_reent(struct _reent *); void libc_wrapup(void) { ffc1978c: 90 01 00 14 stw r0,20(r1) /* * In case RTEMS is already down, don't do this. It could be * dangerous. */ if (!_System_state_Is_up(_System_state_Get())) ffc19790: 80 09 28 48 lwz r0,10312(r9) extern void _wrapup_reent(struct _reent *); extern void _reclaim_reent(struct _reent *); void libc_wrapup(void) { ffc19794: bf c1 00 08 stmw r30,8(r1) /* * In case RTEMS is already down, don't do this. It could be * dangerous. */ if (!_System_state_Is_up(_System_state_Get())) ffc19798: 2f 80 00 03 cmpwi cr7,r0,3 ffc1979c: 40 be 00 50 bne+ cr7,ffc197ec <== NEVER TAKEN /* * This was already done if the user called exit() directly . _wrapup_reent(0); */ if (_REENT != _global_impure_ptr) { ffc197a0: 3d 20 00 00 lis r9,0 ffc197a4: 3f c0 00 00 lis r30,0 ffc197a8: 83 e9 27 84 lwz r31,10116(r9) ffc197ac: 80 1e 27 80 lwz r0,10112(r30) ffc197b0: 7f 80 f8 00 cmpw cr7,r0,r31 ffc197b4: 41 9e 00 10 beq- cr7,ffc197c4 _wrapup_reent(_global_impure_ptr); ffc197b8: 7f e3 fb 78 mr r3,r31 ffc197bc: 48 00 04 31 bl ffc19bec <_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; ffc197c0: 93 fe 27 80 stw r31,10112(r30) * * Should this be changed to do *all* file streams? * _fwalk (_REENT, fclose); */ fclose (stdin); ffc197c4: 3f e0 00 00 lis r31,0 ffc197c8: 81 3f 27 80 lwz r9,10112(r31) ffc197cc: 80 69 00 04 lwz r3,4(r9) ffc197d0: 4b ff ac 89 bl ffc14458 fclose (stdout); ffc197d4: 81 3f 27 80 lwz r9,10112(r31) ffc197d8: 80 69 00 08 lwz r3,8(r9) ffc197dc: 4b ff ac 7d bl ffc14458 fclose (stderr); ffc197e0: 81 3f 27 80 lwz r9,10112(r31) ffc197e4: 80 69 00 0c lwz r3,12(r9) ffc197e8: 4b ff ac 71 bl ffc14458 } ffc197ec: 39 61 00 10 addi r11,r1,16 ffc197f0: 4b ff f9 bc b ffc191ac <_restgpr_30_x> =============================================================================== ffc1965c : off_t lseek( int fd, off_t offset, int whence ) { ffc1965c: 94 21 ff e8 stwu r1,-24(r1) ffc19660: 7c 08 02 a6 mflr r0 rtems_libio_t *iop; off_t old_offset; off_t status; rtems_libio_check_fd( fd ); ffc19664: 3d 20 00 00 lis r9,0 off_t lseek( int fd, off_t offset, int whence ) { ffc19668: 90 01 00 1c stw r0,28(r1) rtems_libio_t *iop; off_t old_offset; off_t status; rtems_libio_check_fd( fd ); ffc1966c: 80 09 27 2c lwz r0,10028(r9) off_t lseek( int fd, off_t offset, int whence ) { ffc19670: bf a1 00 0c stmw r29,12(r1) rtems_libio_t *iop; off_t old_offset; off_t status; rtems_libio_check_fd( fd ); ffc19674: 7f 83 00 40 cmplw cr7,r3,r0 ffc19678: 40 9c 00 20 bge- cr7,ffc19698 iop = rtems_libio_iop( fd ); ffc1967c: 3d 20 00 00 lis r9,0 ffc19680: 83 a9 27 e8 lwz r29,10216(r9) ffc19684: 54 63 30 32 rlwinm r3,r3,6,0,25 ffc19688: 7f bd 1a 14 add r29,r29,r3 rtems_libio_check_is_open(iop); ffc1968c: 80 1d 00 18 lwz r0,24(r29) ffc19690: 70 09 01 00 andi. r9,r0,256 ffc19694: 40 a2 00 10 bne+ ffc196a4 ffc19698: 4b ff ac 21 bl ffc142b8 <__errno> ffc1969c: 38 00 00 09 li r0,9 ffc196a0: 48 00 00 60 b ffc19700 /* * Now process the lseek(). */ old_offset = iop->offset; switch ( whence ) { ffc196a4: 2f 87 00 01 cmpwi cr7,r7,1 /* * Now process the lseek(). */ old_offset = iop->offset; ffc196a8: 83 dd 00 10 lwz r30,16(r29) ffc196ac: 83 fd 00 14 lwz r31,20(r29) switch ( whence ) { ffc196b0: 41 9e 00 20 beq- cr7,ffc196d0 ffc196b4: 2f 87 00 02 cmpwi cr7,r7,2 ffc196b8: 41 9e 00 24 beq- cr7,ffc196dc ffc196bc: 2f 87 00 00 cmpwi cr7,r7,0 ffc196c0: 40 9e 00 38 bne- cr7,ffc196f8 case SEEK_SET: iop->offset = offset; ffc196c4: 90 bd 00 10 stw r5,16(r29) ffc196c8: 90 dd 00 14 stw r6,20(r29) break; ffc196cc: 48 00 00 44 b ffc19710 case SEEK_CUR: iop->offset += offset; ffc196d0: 7d 46 f8 14 addc r10,r6,r31 ffc196d4: 7d 25 f1 14 adde r9,r5,r30 ffc196d8: 48 00 00 14 b ffc196ec break; case SEEK_END: iop->offset = iop->size + offset; ffc196dc: 81 3d 00 08 lwz r9,8(r29) ffc196e0: 81 5d 00 0c lwz r10,12(r29) ffc196e4: 7d 4a 30 14 addc r10,r10,r6 ffc196e8: 7d 29 29 14 adde r9,r9,r5 ffc196ec: 91 3d 00 10 stw r9,16(r29) ffc196f0: 91 5d 00 14 stw r10,20(r29) break; ffc196f4: 48 00 00 1c b ffc19710 default: rtems_set_errno_and_return_minus_one( EINVAL ); ffc196f8: 4b ff ab c1 bl ffc142b8 <__errno> ffc196fc: 38 00 00 16 li r0,22 ffc19700: 90 03 00 00 stw r0,0(r3) ffc19704: 39 20 ff ff li r9,-1 ffc19708: 39 40 ff ff li r10,-1 ffc1970c: 48 00 00 38 b ffc19744 /* * At this time, handlers assume iop->offset has the desired * new offset. */ status = (*iop->pathinfo.handlers->lseek_h)( iop, offset, whence ); ffc19710: 81 3d 00 24 lwz r9,36(r29) ffc19714: 7f a3 eb 78 mr r3,r29 ffc19718: 80 09 00 14 lwz r0,20(r9) ffc1971c: 7c 09 03 a6 mtctr r0 ffc19720: 4e 80 04 21 bctrl ffc19724: 7c 69 1b 78 mr r9,r3 if ( status == (off_t) -1 ) ffc19728: 2f 89 ff ff cmpwi cr7,r9,-1 /* * At this time, handlers assume iop->offset has the desired * new offset. */ status = (*iop->pathinfo.handlers->lseek_h)( iop, offset, whence ); ffc1972c: 7c 8a 23 78 mr r10,r4 if ( status == (off_t) -1 ) ffc19730: 40 be 00 14 bne+ cr7,ffc19744 ffc19734: 2f 84 ff ff cmpwi cr7,r4,-1 ffc19738: 40 be 00 0c bne+ cr7,ffc19744 <== NEVER TAKEN iop->offset = old_offset; ffc1973c: 93 dd 00 10 stw r30,16(r29) ffc19740: 93 fd 00 14 stw r31,20(r29) /* * So if the operation failed, we have to restore iop->offset. */ return status; } ffc19744: 39 61 00 18 addi r11,r1,24 ffc19748: 7d 23 4b 78 mr r3,r9 ffc1974c: 7d 44 53 78 mr r4,r10 ffc19750: 4b ff fa 58 b ffc191a8 <_restgpr_29_x> =============================================================================== ffc054cc : #include "malloc_p.h" void *malloc( size_t size ) { ffc054cc: 94 21 ff f0 stwu r1,-16(r1) ffc054d0: 7c 08 02 a6 mflr r0 void *return_this; MSBUMP(malloc_calls, 1); ffc054d4: 3d 20 00 00 lis r9,0 #include "malloc_p.h" void *malloc( size_t size ) { ffc054d8: 90 01 00 14 stw r0,20(r1) void *return_this; MSBUMP(malloc_calls, 1); ffc054dc: 39 29 2c 00 addi r9,r9,11264 ffc054e0: 81 69 00 04 lwz r11,4(r9) #include "malloc_p.h" void *malloc( size_t size ) { ffc054e4: bf c1 00 08 stmw r30,8(r1) ffc054e8: 7c 7f 1b 78 mr r31,r3 void *return_this; MSBUMP(malloc_calls, 1); ffc054ec: 38 0b 00 01 addi r0,r11,1 ffc054f0: 90 09 00 04 stw r0,4(r9) /* * Validate the parameters */ if ( !size ) return (void *) 0; ffc054f4: 3b c0 00 00 li r30,0 MSBUMP(malloc_calls, 1); /* * If some free's have been deferred, then do them now. */ malloc_deferred_frees_process(); ffc054f8: 4b ff fe 79 bl ffc05370 /* * Validate the parameters */ if ( !size ) ffc054fc: 2f 9f 00 00 cmpwi cr7,r31,0 ffc05500: 41 9e 00 bc beq- cr7,ffc055bc return (void *) 0; /* * Do not attempt to allocate memory if not in correct system state. */ if ( _System_state_Is_up(_System_state_Get()) && ffc05504: 3d 20 00 00 lis r9,0 ffc05508: 80 09 28 48 lwz r0,10312(r9) ffc0550c: 2f 80 00 03 cmpwi cr7,r0,3 ffc05510: 40 be 00 10 bne+ cr7,ffc05520 !malloc_is_system_state_OK() ) ffc05514: 4b ff fe 15 bl ffc05328 return (void *) 0; /* * Do not attempt to allocate memory if not in correct system state. */ if ( _System_state_Is_up(_System_state_Get()) && ffc05518: 2f 83 00 00 cmpwi cr7,r3,0 ffc0551c: 41 9e 00 a0 beq- cr7,ffc055bc <== 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 ); ffc05520: 3d 20 00 00 lis r9,0 ffc05524: 80 69 27 3c lwz r3,10044(r9) ffc05528: 7f e4 fb 78 mr r4,r31 ffc0552c: 38 a0 00 00 li r5,0 ffc05530: 38 c0 00 00 li r6,0 ffc05534: 48 00 54 09 bl ffc0a93c <_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 ) { ffc05538: 7c 7e 1b 79 mr. r30,r3 ffc0553c: 40 a2 00 40 bne+ ffc0557c if (rtems_malloc_sbrk_helpers) ffc05540: 3d 20 00 00 lis r9,0 ffc05544: 81 29 27 ac lwz r9,10156(r9) ffc05548: 2f 89 00 00 cmpwi cr7,r9,0 ffc0554c: 41 9e 00 1c beq- cr7,ffc05568 return_this = (*rtems_malloc_sbrk_helpers->extend)( size ); ffc05550: 80 09 00 04 lwz r0,4(r9) ffc05554: 7f e3 fb 78 mr r3,r31 ffc05558: 7c 09 03 a6 mtctr r0 ffc0555c: 4e 80 04 21 bctrl if ( !return_this ) { ffc05560: 7c 7e 1b 79 mr. r30,r3 ffc05564: 40 a2 00 18 bne+ ffc0557c <== NEVER TAKEN errno = ENOMEM; ffc05568: 48 00 ed 51 bl ffc142b8 <__errno> ffc0556c: 38 00 00 0c li r0,12 ffc05570: 90 03 00 00 stw r0,0(r3) return (void *) 0; ffc05574: 3b c0 00 00 li r30,0 ffc05578: 48 00 00 44 b ffc055bc } /* * If the user wants us to dirty the allocated memory, then do it. */ if ( rtems_malloc_dirty_helper ) ffc0557c: 3d 20 00 00 lis r9,0 ffc05580: 80 09 27 b0 lwz r0,10160(r9) ffc05584: 2f 80 00 00 cmpwi cr7,r0,0 ffc05588: 41 9e 00 14 beq- cr7,ffc0559c (*rtems_malloc_dirty_helper)( return_this, size ); ffc0558c: 7f c3 f3 78 mr r3,r30 ffc05590: 7c 09 03 a6 mtctr r0 ffc05594: 7f e4 fb 78 mr r4,r31 ffc05598: 4e 80 04 21 bctrl /* * If configured, update the statistics */ if ( rtems_malloc_statistics_helpers ) ffc0559c: 3d 20 00 00 lis r9,0 ffc055a0: 81 29 27 a8 lwz r9,10152(r9) ffc055a4: 2f 89 00 00 cmpwi cr7,r9,0 ffc055a8: 41 9e 00 14 beq- cr7,ffc055bc (*rtems_malloc_statistics_helpers->at_malloc)(return_this); ffc055ac: 80 09 00 04 lwz r0,4(r9) ffc055b0: 7f c3 f3 78 mr r3,r30 ffc055b4: 7c 09 03 a6 mtctr r0 ffc055b8: 4e 80 04 21 bctrl return return_this; } ffc055bc: 39 61 00 10 addi r11,r1,16 ffc055c0: 7f c3 f3 78 mr r3,r30 ffc055c4: 48 01 3b e8 b ffc191ac <_restgpr_30_x> =============================================================================== ffc049dc : } void *malloc_sbrk_extend_and_allocate( size_t size ) { ffc049dc: 94 21 ff e8 stwu r1,-24(r1) ffc049e0: 7c 08 02 a6 mflr r0 * 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; ffc049e4: 3d 20 00 00 lis r9,0 } void *malloc_sbrk_extend_and_allocate( size_t size ) { ffc049e8: 90 01 00 1c stw r0,28(r1) * 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; ffc049ec: 80 09 27 e0 lwz r0,10208(r9) } void *malloc_sbrk_extend_and_allocate( size_t size ) { ffc049f0: bf 81 00 08 stmw r28,8(r1) ffc049f4: 7c 7d 1b 78 mr r29,r3 * in "page" amounts. */ sbrk_amount = RTEMS_Malloc_Sbrk_amount; if ( sbrk_amount == 0 ) ffc049f8: 2f 80 00 00 cmpwi cr7,r0,0 return (void *) 0; ffc049fc: 3b c0 00 00 li r30,0 * in "page" amounts. */ sbrk_amount = RTEMS_Malloc_Sbrk_amount; if ( sbrk_amount == 0 ) ffc04a00: 41 be 00 7c beq+ cr7,ffc04a7c <== NEVER TAKEN return (void *) 0; the_size = ((size + sbrk_amount) / sbrk_amount * sbrk_amount); ffc04a04: 7f e3 02 14 add r31,r3,r0 ffc04a08: 7f ff 03 96 divwu r31,r31,r0 ffc04a0c: 7f ff 01 d6 mullw r31,r31,r0 starting_address = (void *) sbrk(the_size); ffc04a10: 7f e3 fb 78 mr r3,r31 ffc04a14: 4b ff ba 75 bl ffc00488 if ( starting_address == (void*) -1 ) ffc04a18: 2f 83 ff ff cmpwi cr7,r3,-1 if ( sbrk_amount == 0 ) return (void *) 0; the_size = ((size + sbrk_amount) / sbrk_amount * sbrk_amount); starting_address = (void *) sbrk(the_size); ffc04a1c: 7c 64 1b 78 mr r4,r3 if ( starting_address == (void*) -1 ) ffc04a20: 41 9e 00 5c beq- cr7,ffc04a7c return (void *) 0; if ( !_Protected_heap_Extend( ffc04a24: 3f 80 00 00 lis r28,0 ffc04a28: 80 7c 27 1c lwz r3,10012(r28) ffc04a2c: 7f e5 fb 78 mr r5,r31 ffc04a30: 48 00 51 05 bl ffc09b34 <_Protected_heap_Extend> ffc04a34: 2f 83 00 00 cmpwi cr7,r3,0 ffc04a38: 40 be 00 1c bne+ cr7,ffc04a54 RTEMS_Malloc_Heap, starting_address, the_size) ) { sbrk(-the_size); ffc04a3c: 7c 7f 00 d0 neg r3,r31 ffc04a40: 4b ff ba 49 bl ffc00488 errno = ENOMEM; ffc04a44: 48 00 be c1 bl ffc10904 <__errno> ffc04a48: 38 00 00 0c li r0,12 ffc04a4c: 90 03 00 00 stw r0,0(r3) return (void *) 0; ffc04a50: 48 00 00 2c b ffc04a7c } MSBUMP(space_available, the_size); ffc04a54: 3d 20 00 00 lis r9,0 ffc04a58: 80 7c 27 1c lwz r3,10012(r28) ffc04a5c: 80 09 2c a8 lwz r0,11432(r9) ffc04a60: 7f a4 eb 78 mr r4,r29 ffc04a64: 38 a0 00 00 li r5,0 ffc04a68: 7f ff 02 14 add r31,r31,r0 ffc04a6c: 38 c0 00 00 li r6,0 ffc04a70: 93 e9 2c a8 stw r31,11432(r9) ffc04a74: 48 00 50 69 bl ffc09adc <_Protected_heap_Allocate_aligned_with_boundary> ffc04a78: 7c 7e 1b 78 mr r30,r3 return_this = _Protected_heap_Allocate( RTEMS_Malloc_Heap, size ); return return_this; } ffc04a7c: 39 61 00 18 addi r11,r1,24 ffc04a80: 7f c3 f3 78 mr r3,r30 ffc04a84: 4b ff bb 34 b ffc005b8 <_restgpr_28_x> =============================================================================== ffc132b4 : */ int memfile_ftruncate( rtems_libio_t *iop, rtems_off64_t length ) { ffc132b4: 7c 08 02 a6 mflr r0 ffc132b8: 7c 2b 0b 78 mr r11,r1 ffc132bc: 94 21 ff e0 stwu r1,-32(r1) ffc132c0: 90 01 00 24 stw r0,36(r1) ffc132c4: 48 00 5e a1 bl ffc19164 <_savegpr_31> IMFS_jnode_t *the_jnode; the_jnode = iop->pathinfo.node_access; ffc132c8: 83 e3 00 1c lwz r31,28(r3) * 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 ) ffc132cc: 80 1f 00 50 lwz r0,80(r31) ffc132d0: 7f 80 28 00 cmpw cr7,r0,r5 ffc132d4: 41 9c 00 14 blt- cr7,ffc132e8 <== NEVER TAKEN ffc132d8: 40 be 00 1c bne+ cr7,ffc132f4 <== NEVER TAKEN ffc132dc: 80 1f 00 54 lwz r0,84(r31) ffc132e0: 7f 80 30 40 cmplw cr7,r0,r6 ffc132e4: 40 bc 00 10 bge+ cr7,ffc132f4 return IMFS_memfile_extend( the_jnode, length ); ffc132e8: 7f e3 fb 78 mr r3,r31 ffc132ec: 4b ff fb f1 bl ffc12edc ffc132f0: 48 00 00 2c b ffc1331c /* * 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; ffc132f4: 90 bf 00 50 stw r5,80(r31) iop->size = the_jnode->info.file.size; IMFS_update_atime( the_jnode ); ffc132f8: 38 80 00 00 li r4,0 /* * 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; ffc132fc: 90 df 00 54 stw r6,84(r31) iop->size = the_jnode->info.file.size; ffc13300: 90 a3 00 08 stw r5,8(r3) ffc13304: 90 c3 00 0c stw r6,12(r3) IMFS_update_atime( the_jnode ); ffc13308: 38 61 00 08 addi r3,r1,8 ffc1330c: 4b ff 1e d9 bl ffc051e4 ffc13310: 80 01 00 08 lwz r0,8(r1) return 0; ffc13314: 38 60 00 00 li r3,0 * future use and just set the length. */ the_jnode->info.file.size = length; iop->size = the_jnode->info.file.size; IMFS_update_atime( the_jnode ); ffc13318: 90 1f 00 40 stw r0,64(r31) return 0; } ffc1331c: 39 61 00 20 addi r11,r1,32 ffc13320: 48 00 5e 90 b ffc191b0 <_restgpr_31_x> =============================================================================== ffc13324 : rtems_off64_t memfile_lseek( rtems_libio_t *iop, rtems_off64_t offset, int whence ) { ffc13324: 94 21 ff f0 stwu r1,-16(r1) ffc13328: 7c 08 02 a6 mflr r0 ffc1332c: 90 01 00 14 stw r0,20(r1) ffc13330: bf c1 00 08 stmw r30,8(r1) ffc13334: 7c 7f 1b 78 mr r31,r3 IMFS_jnode_t *the_jnode; the_jnode = iop->pathinfo.node_access; ffc13338: 83 c3 00 1c lwz r30,28(r3) if (the_jnode->type == IMFS_LINEAR_FILE) { ffc1333c: 80 1e 00 4c lwz r0,76(r30) ffc13340: 2f 80 00 06 cmpwi cr7,r0,6 ffc13344: 40 9e 00 34 bne- cr7,ffc13378 if (iop->offset > the_jnode->info.linearfile.size) ffc13348: 81 3e 00 50 lwz r9,80(r30) ffc1334c: 81 63 00 10 lwz r11,16(r3) ffc13350: 80 1e 00 54 lwz r0,84(r30) ffc13354: 7f 8b 48 00 cmpw cr7,r11,r9 ffc13358: 41 9d 00 14 bgt- cr7,ffc1336c <== NEVER TAKEN ffc1335c: 40 9e 00 5c bne- cr7,ffc133b8 <== NEVER TAKEN ffc13360: 81 63 00 14 lwz r11,20(r3) ffc13364: 7f 8b 00 40 cmplw cr7,r11,r0 ffc13368: 40 9d 00 50 ble- cr7,ffc133b8 <== ALWAYS TAKEN iop->offset = the_jnode->info.linearfile.size; ffc1336c: 91 3f 00 10 stw r9,16(r31) <== NOT EXECUTED ffc13370: 90 1f 00 14 stw r0,20(r31) <== NOT EXECUTED ffc13374: 48 00 00 44 b ffc133b8 <== NOT EXECUTED } else { /* Must be a block file (IMFS_MEMORY_FILE). */ if (IMFS_memfile_extend( the_jnode, iop->offset )) ffc13378: 80 bf 00 10 lwz r5,16(r31) ffc1337c: 7f c3 f3 78 mr r3,r30 ffc13380: 80 df 00 14 lwz r6,20(r31) ffc13384: 4b ff fb 59 bl ffc12edc ffc13388: 2f 83 00 00 cmpwi cr7,r3,0 ffc1338c: 41 be 00 1c beq+ cr7,ffc133a8 rtems_set_errno_and_return_minus_one( ENOSPC ); ffc13390: 48 00 0f 29 bl ffc142b8 <__errno> ffc13394: 38 00 00 1c li r0,28 ffc13398: 90 03 00 00 stw r0,0(r3) ffc1339c: 39 20 ff ff li r9,-1 ffc133a0: 39 40 ff ff li r10,-1 ffc133a4: 48 00 00 1c b ffc133c0 iop->size = the_jnode->info.file.size; ffc133a8: 81 3e 00 50 lwz r9,80(r30) ffc133ac: 81 5e 00 54 lwz r10,84(r30) ffc133b0: 91 3f 00 08 stw r9,8(r31) ffc133b4: 91 5f 00 0c stw r10,12(r31) } return iop->offset; ffc133b8: 81 3f 00 10 lwz r9,16(r31) ffc133bc: 81 5f 00 14 lwz r10,20(r31) } ffc133c0: 39 61 00 10 addi r11,r1,16 ffc133c4: 7d 23 4b 78 mr r3,r9 ffc133c8: 7d 44 53 78 mr r4,r10 ffc133cc: 48 00 5d e0 b ffc191ac <_restgpr_30_x> =============================================================================== ffc131f4 : rtems_libio_t *iop, const char *pathname, uint32_t flag, uint32_t mode ) { ffc131f4: 94 21 ff f0 stwu r1,-16(r1) ffc131f8: 7c 08 02 a6 mflr r0 ffc131fc: 90 01 00 14 stw r0,20(r1) the_jnode = iop->pathinfo.node_access; /* * Perform 'copy on write' for linear files */ if ((iop->flags & (LIBIO_FLAGS_WRITE | LIBIO_FLAGS_APPEND)) ffc13200: 80 03 00 18 lwz r0,24(r3) rtems_libio_t *iop, const char *pathname, uint32_t flag, uint32_t mode ) { ffc13204: bf c1 00 08 stmw r30,8(r1) ffc13208: 7c 7e 1b 78 mr r30,r3 the_jnode = iop->pathinfo.node_access; /* * Perform 'copy on write' for linear files */ if ((iop->flags & (LIBIO_FLAGS_WRITE | LIBIO_FLAGS_APPEND)) ffc1320c: 70 09 02 04 andi. r9,r0,516 uint32_t mode ) { IMFS_jnode_t *the_jnode; the_jnode = iop->pathinfo.node_access; ffc13210: 83 e3 00 1c lwz r31,28(r3) /* * Perform 'copy on write' for linear files */ if ((iop->flags & (LIBIO_FLAGS_WRITE | LIBIO_FLAGS_APPEND)) ffc13214: 41 82 00 64 beq- ffc13278 && (the_jnode->type == IMFS_LINEAR_FILE)) { ffc13218: 80 1f 00 4c lwz r0,76(r31) ffc1321c: 2f 80 00 06 cmpwi cr7,r0,6 ffc13220: 40 be 00 58 bne+ cr7,ffc13278 <== ALWAYS TAKEN uint32_t count = the_jnode->info.linearfile.size; ffc13224: 81 1f 00 54 lwz r8,84(r31) <== NOT EXECUTED const unsigned char *buffer = the_jnode->info.linearfile.direct; the_jnode->type = IMFS_MEMORY_FILE; ffc13228: 38 00 00 05 li r0,5 <== NOT EXECUTED ffc1322c: 90 1f 00 4c stw r0,76(r31) <== NOT EXECUTED the_jnode->info.file.size = 0; ffc13230: 39 20 00 00 li r9,0 <== NOT EXECUTED the_jnode->info.file.indirect = 0; the_jnode->info.file.doubly_indirect = 0; the_jnode->info.file.triply_indirect = 0; if ((count != 0) ffc13234: 2f 88 00 00 cmpwi cr7,r8,0 <== NOT EXECUTED uint32_t count = the_jnode->info.linearfile.size; const unsigned char *buffer = the_jnode->info.linearfile.direct; the_jnode->type = IMFS_MEMORY_FILE; the_jnode->info.file.size = 0; the_jnode->info.file.indirect = 0; ffc13238: 38 00 00 00 li r0,0 <== NOT EXECUTED * Perform 'copy on write' for linear files */ if ((iop->flags & (LIBIO_FLAGS_WRITE | LIBIO_FLAGS_APPEND)) && (the_jnode->type == IMFS_LINEAR_FILE)) { uint32_t count = the_jnode->info.linearfile.size; const unsigned char *buffer = the_jnode->info.linearfile.direct; ffc1323c: 80 ff 00 58 lwz r7,88(r31) <== NOT EXECUTED the_jnode->type = IMFS_MEMORY_FILE; the_jnode->info.file.size = 0; ffc13240: 39 40 00 00 li r10,0 <== NOT EXECUTED ffc13244: 91 3f 00 50 stw r9,80(r31) <== NOT EXECUTED ffc13248: 91 5f 00 54 stw r10,84(r31) <== NOT EXECUTED the_jnode->info.file.indirect = 0; ffc1324c: 90 1f 00 58 stw r0,88(r31) <== NOT EXECUTED the_jnode->info.file.doubly_indirect = 0; ffc13250: 90 1f 00 5c stw r0,92(r31) <== NOT EXECUTED the_jnode->info.file.triply_indirect = 0; ffc13254: 90 1f 00 60 stw r0,96(r31) <== NOT EXECUTED if ((count != 0) ffc13258: 41 be 00 20 beq+ cr7,ffc13278 <== NOT EXECUTED && (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1)) ffc1325c: 7f e3 fb 78 mr r3,r31 <== NOT EXECUTED ffc13260: 38 a0 00 00 li r5,0 <== NOT EXECUTED ffc13264: 38 c0 00 00 li r6,0 <== NOT EXECUTED ffc13268: 4b ff fd 95 bl ffc12ffc <== NOT EXECUTED return -1; ffc1326c: 38 00 ff ff li r0,-1 <== 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)) ffc13270: 2f 83 ff ff cmpwi cr7,r3,-1 <== NOT EXECUTED ffc13274: 41 9e 00 34 beq- cr7,ffc132a8 <== NOT EXECUTED return -1; } if (iop->flags & LIBIO_FLAGS_APPEND) ffc13278: 80 1e 00 18 lwz r0,24(r30) ffc1327c: 70 09 02 00 andi. r9,r0,512 ffc13280: 41 82 00 14 beq- ffc13294 iop->offset = the_jnode->info.file.size; ffc13284: 81 3f 00 50 lwz r9,80(r31) ffc13288: 81 5f 00 54 lwz r10,84(r31) ffc1328c: 91 3e 00 10 stw r9,16(r30) ffc13290: 91 5e 00 14 stw r10,20(r30) iop->size = the_jnode->info.file.size; ffc13294: 81 3f 00 50 lwz r9,80(r31) return 0; ffc13298: 38 00 00 00 li r0,0 return -1; } if (iop->flags & LIBIO_FLAGS_APPEND) iop->offset = the_jnode->info.file.size; iop->size = the_jnode->info.file.size; ffc1329c: 81 5f 00 54 lwz r10,84(r31) ffc132a0: 91 3e 00 08 stw r9,8(r30) ffc132a4: 91 5e 00 0c stw r10,12(r30) return 0; } ffc132a8: 39 61 00 10 addi r11,r1,16 ffc132ac: 7c 03 03 78 mr r3,r0 ffc132b0: 48 00 5e fc b ffc191ac <_restgpr_30_x> =============================================================================== ffc057b8 : /* * Are the file system options valid? */ if ( options != RTEMS_FILESYSTEM_READ_ONLY && ffc057b8: 2b 86 00 01 cmplwi cr7,r6,1 const char *target, const char *filesystemtype, rtems_filesystem_options_t options, const void *data ) { ffc057bc: 94 21 ff a0 stwu r1,-96(r1) ffc057c0: 7c 08 02 a6 mflr r0 ffc057c4: be 41 00 28 stmw r18,40(r1) ffc057c8: 7c 7c 1b 78 mr r28,r3 ffc057cc: 7c 9f 23 78 mr r31,r4 ffc057d0: 90 01 00 64 stw r0,100(r1) ffc057d4: 7c b9 2b 78 mr r25,r5 ffc057d8: 7c d8 33 78 mr r24,r6 ffc057dc: 7c fa 3b 78 mr r26,r7 /* * Are the file system options valid? */ if ( options != RTEMS_FILESYSTEM_READ_ONLY && ffc057e0: 41 9d 00 14 bgt- cr7,ffc057f4 rtems_set_errno_and_return_minus_one( EINVAL ); /* * Get mount handler */ mount_h = rtems_filesystem_get_mount_handler( filesystemtype ); ffc057e4: 7c a3 2b 78 mr r3,r5 ffc057e8: 48 00 b0 c9 bl ffc108b0 if ( !mount_h ) ffc057ec: 7c 7b 1b 79 mr. r27,r3 ffc057f0: 40 a2 00 10 bne+ ffc05800 rtems_set_errno_and_return_minus_one( EINVAL ); ffc057f4: 48 00 ea c5 bl ffc142b8 <__errno> ffc057f8: 38 00 00 16 li r0,22 ffc057fc: 48 00 00 ec b ffc058e8 { 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; ffc05800: 7f fd 00 34 cntlzw r29,r31 ffc05804: 57 bd d9 7e rlwinm r29,r29,27,5,31 ffc05808: 6b bd 00 01 xori r29,r29,1 const char *target_or_null, const char *filesystemtype, size_t *target_length_ptr ) { const char *target = target_or_null != NULL ? target_or_null : "/"; ffc0580c: 2f 9d 00 00 cmpwi cr7,r29,0 ffc05810: 7f f6 fb 78 mr r22,r31 ffc05814: 40 be 00 0c bne+ cr7,ffc05820 ffc05818: 3e c0 ff c2 lis r22,-62 ffc0581c: 3a d6 aa cc addi r22,r22,-21812 size_t filesystemtype_size = strlen( filesystemtype ) + 1; ffc05820: 7f 23 cb 78 mr r3,r25 ffc05824: 48 00 fc 35 bl ffc15458 size_t source_size = source_or_null != NULL ? strlen( source_or_null ) + 1 : 0; ffc05828: 2f 9c 00 00 cmpwi cr7,r28,0 const char *filesystemtype, size_t *target_length_ptr ) { const char *target = target_or_null != NULL ? target_or_null : "/"; size_t filesystemtype_size = strlen( filesystemtype ) + 1; ffc0582c: 3a a3 00 01 addi r21,r3,1 size_t source_size = source_or_null != NULL ? strlen( source_or_null ) + 1 : 0; ffc05830: 3a e0 00 00 li r23,0 ffc05834: 41 9e 00 10 beq- cr7,ffc05844 ffc05838: 7f 83 e3 78 mr r3,r28 ffc0583c: 48 00 fc 1d bl ffc15458 ffc05840: 3a e3 00 01 addi r23,r3,1 size_t target_size = strlen( target ) + 1; ffc05844: 7e c3 b3 78 mr r3,r22 ffc05848: 48 00 fc 11 bl ffc15458 size_t size = sizeof( rtems_filesystem_mount_table_entry_t ) + filesystemtype_size + source_size + target_size; ffc0584c: 38 95 00 74 addi r4,r21,116 { 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; ffc05850: 3a 43 00 01 addi r18,r3,1 size_t size = sizeof( rtems_filesystem_mount_table_entry_t ) + filesystemtype_size + source_size + target_size; ffc05854: 7c 84 ba 14 add r4,r4,r23 { 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; ffc05858: 7c 73 1b 78 mr r19,r3 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 ); ffc0585c: 7c 84 92 14 add r4,r4,r18 ffc05860: 38 60 00 01 li r3,1 ffc05864: 4b ff f6 c5 bl ffc04f28 if ( mt_entry != NULL ) { ffc05868: 7c 7e 1b 79 mr. r30,r3 ffc0586c: 41 82 00 74 beq- ffc058e0 <== NEVER TAKEN char *str = (char *) mt_entry + sizeof( *mt_entry ); ffc05870: 3a 9e 00 74 addi r20,r30,116 memcpy( str, filesystemtype, filesystemtype_size ); ffc05874: 7f 24 cb 78 mr r4,r25 ffc05878: 7e a5 ab 78 mr r5,r21 ffc0587c: 7e 83 a3 78 mr r3,r20 ffc05880: 48 00 f6 99 bl ffc14f18 mt_entry->type = str; str += filesystemtype_size; ffc05884: 7f 34 aa 14 add r25,r20,r21 if ( mt_entry != NULL ) { char *str = (char *) mt_entry + sizeof( *mt_entry ); memcpy( str, filesystemtype, filesystemtype_size ); mt_entry->type = str; ffc05888: 92 9e 00 6c stw r20,108(r30) str += filesystemtype_size; memcpy( str, source_or_null, source_size ); ffc0588c: 7e e5 bb 78 mr r5,r23 ffc05890: 7f 84 e3 78 mr r4,r28 ffc05894: 7f 23 cb 78 mr r3,r25 ffc05898: 48 00 f6 81 bl ffc14f18 mt_entry->dev = str; str += source_size; ffc0589c: 7e f9 ba 14 add r23,r25,r23 memcpy( str, filesystemtype, filesystemtype_size ); mt_entry->type = str; str += filesystemtype_size; memcpy( str, source_or_null, source_size ); mt_entry->dev = str; ffc058a0: 93 3e 00 70 stw r25,112(r30) str += source_size; memcpy( str, target, target_size ); ffc058a4: 7e c4 b3 78 mr r4,r22 ffc058a8: 7e 45 93 78 mr r5,r18 ffc058ac: 7e e3 bb 78 mr r3,r23 ffc058b0: 48 00 f6 69 bl ffc14f18 mt_entry->target = str; ffc058b4: 92 fe 00 68 stw r23,104(r30) if ( !mt_entry ) rtems_set_errno_and_return_minus_one( ENOMEM ); mt_entry->mt_fs_root.mt_entry = mt_entry; mt_entry->options = options; mt_entry->pathconf_limits_and_options = rtems_filesystem_default_pathconf; ffc058b8: 3c 80 ff c2 lis r4,-62 &target_length ); if ( !mt_entry ) rtems_set_errno_and_return_minus_one( ENOMEM ); mt_entry->mt_fs_root.mt_entry = mt_entry; ffc058bc: 93 de 00 2c stw r30,44(r30) mt_entry->options = options; mt_entry->pathconf_limits_and_options = rtems_filesystem_default_pathconf; ffc058c0: 38 7e 00 38 addi r3,r30,56 ffc058c4: 38 84 ab 0c addi r4,r4,-21748 ); if ( !mt_entry ) rtems_set_errno_and_return_minus_one( ENOMEM ); mt_entry->mt_fs_root.mt_entry = mt_entry; mt_entry->options = options; ffc058c8: 93 1e 00 30 stw r24,48(r30) mt_entry->pathconf_limits_and_options = rtems_filesystem_default_pathconf; ffc058cc: 38 a0 00 30 li r5,48 ffc058d0: 48 00 f6 49 bl ffc14f18 /* * The mount_point should be a directory with read/write/execute * permissions in the existing tree. */ if ( has_target ) { ffc058d4: 2f 9d 00 00 cmpwi cr7,r29,0 ffc058d8: 41 be 00 d0 beq+ cr7,ffc059a8 ffc058dc: 48 00 00 18 b ffc058f4 target, filesystemtype, &target_length ); if ( !mt_entry ) rtems_set_errno_and_return_minus_one( ENOMEM ); ffc058e0: 48 00 e9 d9 bl ffc142b8 <__errno> <== NOT EXECUTED ffc058e4: 38 00 00 0c li r0,12 <== NOT EXECUTED ffc058e8: 90 03 00 00 stw r0,0(r3) ffc058ec: 3b e0 ff ff li r31,-1 ffc058f0: 48 00 01 7c b ffc05a6c * The mount_point should be a directory with read/write/execute * permissions in the existing tree. */ if ( has_target ) { if ( rtems_filesystem_evaluate_path( ffc058f4: 7f e3 fb 78 mr r3,r31 ffc058f8: 3b e1 00 08 addi r31,r1,8 ffc058fc: 7e 64 9b 78 mr r4,r19 ffc05900: 38 a0 00 07 li r5,7 ffc05904: 7f e6 fb 78 mr r6,r31 ffc05908: 38 e0 00 01 li r7,1 ffc0590c: 4b ff f7 05 bl ffc05010 ffc05910: 2f 83 ff ff cmpwi cr7,r3,-1 ffc05914: 41 9e 01 30 beq- cr7,ffc05a44 <== NEVER TAKEN /* * Test to see if it is a directory */ if ( loc.ops->node_type_h( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) { ffc05918: 81 21 00 14 lwz r9,20(r1) ffc0591c: 7f e3 fb 78 mr r3,r31 ffc05920: 80 09 00 10 lwz r0,16(r9) ffc05924: 7c 09 03 a6 mtctr r0 ffc05928: 4e 80 04 21 bctrl ffc0592c: 2f 83 00 01 cmpwi cr7,r3,1 ffc05930: 41 be 00 10 beq+ cr7,ffc05940 errno = ENOTDIR; ffc05934: 48 00 e9 85 bl ffc142b8 <__errno> ffc05938: 38 00 00 14 li r0,20 ffc0593c: 48 00 00 24 b ffc05960 /* * You can only mount one file system onto a single mount point. */ if ( rtems_filesystem_mount_iterate( is_node_fs_root, loc.node_access ) ) { ffc05940: 3c 60 ff c0 lis r3,-64 ffc05944: 80 81 00 08 lwz r4,8(r1) ffc05948: 38 63 56 e0 addi r3,r3,22240 ffc0594c: 4b ff fe 01 bl ffc0574c ffc05950: 2f 83 00 00 cmpwi cr7,r3,0 ffc05954: 41 be 00 14 beq+ cr7,ffc05968 errno = EBUSY; ffc05958: 48 00 e9 61 bl ffc142b8 <__errno> ffc0595c: 38 00 00 10 li r0,16 ffc05960: 90 03 00 00 stw r0,0(r3) ffc05964: 48 00 00 e8 b ffc05a4c * 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; ffc05968: 80 01 00 08 lwz r0,8(r1) /* * 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 ) ) { ffc0596c: 7f c3 f3 78 mr r3,r30 * traverse the tree. */ mt_entry->mt_point_node.node_access = loc.node_access; mt_entry->mt_point_node.handlers = loc.handlers; mt_entry->mt_point_node.ops = loc.ops; ffc05970: 81 21 00 14 lwz r9,20(r1) if ( has_target ) { if ( rtems_filesystem_evaluate_path( target, target_length, RTEMS_LIBIO_PERMS_RWX, &loc, true ) == -1 ) goto cleanup_and_bail; loc_to_free = &loc; ffc05974: 7f fc fb 78 mr r28,r31 * 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; ffc05978: 90 1e 00 08 stw r0,8(r30) mt_entry->mt_point_node.handlers = loc.handlers; ffc0597c: 80 01 00 10 lwz r0,16(r1) mt_entry->mt_point_node.ops = loc.ops; ffc05980: 91 3e 00 14 stw r9,20(r30) * until the system is unmounted. It may be needed to correctly * traverse the tree. */ mt_entry->mt_point_node.node_access = loc.node_access; mt_entry->mt_point_node.handlers = loc.handlers; ffc05984: 90 1e 00 10 stw r0,16(r30) mt_entry->mt_point_node.ops = loc.ops; mt_entry->mt_point_node.mt_entry = loc.mt_entry; ffc05988: 80 01 00 18 lwz r0,24(r1) ffc0598c: 90 1e 00 18 stw r0,24(r30) /* * 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 ) ) { ffc05990: 80 09 00 20 lwz r0,32(r9) ffc05994: 7c 09 03 a6 mtctr r0 ffc05998: 4e 80 04 21 bctrl ffc0599c: 2f 83 00 00 cmpwi cr7,r3,0 ffc059a0: 41 be 00 34 beq+ cr7,ffc059d4 <== ALWAYS TAKEN ffc059a4: 48 00 00 a8 b ffc05a4c <== NOT EXECUTED stop = (*routine)( mt_entry, routine_arg ); } rtems_libio_unlock(); return stop; } ffc059a8: 3d 20 00 00 lis r9,0 ffc059ac: 39 69 21 78 addi r11,r9,8568 } } else { /* * Do we already have a base file system ? */ if ( !rtems_chain_is_empty( &mount_chain ) ) { ffc059b0: 81 29 21 78 lwz r9,8568(r9) */ RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_tail( const Chain_Control *the_chain ) { return &the_chain->Tail.Node; ffc059b4: 38 0b 00 04 addi r0,r11,4 ffc059b8: 7f 89 00 00 cmpw cr7,r9,r0 ) { 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; ffc059bc: 3b 80 00 00 li r28,0 } } else { /* * Do we already have a base file system ? */ if ( !rtems_chain_is_empty( &mount_chain ) ) { ffc059c0: 41 be 00 14 beq+ cr7,ffc059d4 <== ALWAYS TAKEN errno = EINVAL; ffc059c4: 48 00 e8 f5 bl ffc142b8 <__errno> <== NOT EXECUTED ffc059c8: 38 00 00 16 li r0,22 <== NOT EXECUTED ffc059cc: 90 03 00 00 stw r0,0(r3) <== NOT EXECUTED goto cleanup_and_bail; ffc059d0: 48 00 00 80 b ffc05a50 <== 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 ) ) { ffc059d4: 7f c3 f3 78 mr r3,r30 ffc059d8: 7f 69 03 a6 mtctr r27 ffc059dc: 7f 44 d3 78 mr r4,r26 ffc059e0: 4e 80 04 21 bctrl ffc059e4: 2f 83 00 00 cmpwi cr7,r3,0 ffc059e8: 41 be 00 1c beq+ cr7,ffc05a04 /* * Try to undo the mount operation */ loc.ops->unmount_h( mt_entry ); ffc059ec: 81 21 00 14 lwz r9,20(r1) ffc059f0: 7f c3 f3 78 mr r3,r30 ffc059f4: 80 09 00 28 lwz r0,40(r9) ffc059f8: 7c 09 03 a6 mtctr r0 ffc059fc: 4e 80 04 21 bctrl goto cleanup_and_bail; ffc05a00: 48 00 00 50 b ffc05a50 } /* * Add the mount table entry to the mount table chain */ rtems_libio_lock(); ffc05a04: 4b ff fc f1 bl ffc056f4 ffc05a08: 3c 60 00 00 lis r3,0 ffc05a0c: 38 63 21 78 addi r3,r3,8568 ffc05a10: 7f c4 f3 78 mr r4,r30 ffc05a14: 48 00 3d 51 bl ffc09764 <_Chain_Append> rtems_libio_unlock(); if ( !has_target ) rtems_filesystem_root = mt_entry->mt_fs_root; return 0; ffc05a18: 3b e0 00 00 li r31,0 /* * Add the mount table entry to the mount table chain */ rtems_libio_lock(); rtems_chain_append( &mount_chain, &mt_entry->Node ); rtems_libio_unlock(); ffc05a1c: 4b ff fd 09 bl ffc05724 if ( !has_target ) ffc05a20: 2f 9d 00 00 cmpwi cr7,r29,0 ffc05a24: 40 9e 00 48 bne- cr7,ffc05a6c rtems_filesystem_root = mt_entry->mt_fs_root; ffc05a28: 3d 20 00 00 lis r9,0 ffc05a2c: 81 69 27 74 lwz r11,10100(r9) ffc05a30: 38 7e 00 1c addi r3,r30,28 ffc05a34: 39 6b 00 18 addi r11,r11,24 ffc05a38: 7c a3 a4 aa lswi r5,r3,20 ffc05a3c: 7c ab a5 aa stswi r5,r11,20 ffc05a40: 48 00 00 2c b ffc05a6c ) { 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; ffc05a44: 3b 80 00 00 li r28,0 <== NOT EXECUTED ffc05a48: 48 00 00 08 b ffc05a50 <== NOT EXECUTED if ( has_target ) { if ( rtems_filesystem_evaluate_path( target, target_length, RTEMS_LIBIO_PERMS_RWX, &loc, true ) == -1 ) goto cleanup_and_bail; loc_to_free = &loc; ffc05a4c: 7f fc fb 78 mr r28,r31 return 0; cleanup_and_bail: free( mt_entry ); ffc05a50: 7f c3 f3 78 mr r3,r30 ffc05a54: 4b ff f6 dd bl ffc05130 if ( loc_to_free ) ffc05a58: 2f 9c 00 00 cmpwi cr7,r28,0 rtems_filesystem_freenode( loc_to_free ); return -1; ffc05a5c: 3b e0 ff ff li r31,-1 cleanup_and_bail: free( mt_entry ); if ( loc_to_free ) ffc05a60: 41 be 00 0c beq+ cr7,ffc05a6c <== NEVER TAKEN rtems_filesystem_freenode( loc_to_free ); ffc05a64: 7f 83 e3 78 mr r3,r28 ffc05a68: 4b ff f6 9d bl ffc05104 return -1; } ffc05a6c: 39 61 00 60 addi r11,r1,96 ffc05a70: 7f e3 fb 78 mr r3,r31 ffc05a74: 48 01 37 08 b ffc1917c <_restgpr_18_x> =============================================================================== ffc04d4c : const char *target, const char *filesystemtype, rtems_filesystem_options_t options, const void *data ) { ffc04d4c: 94 21 ff e0 stwu r1,-32(r1) ffc04d50: 7c 08 02 a6 mflr r0 ffc04d54: bf c1 00 18 stmw r30,24(r1) int rv = -1; if (target != NULL) { ffc04d58: 7c 9e 23 79 mr. r30,r4 const char *target, const char *filesystemtype, rtems_filesystem_options_t options, const void *data ) { ffc04d5c: 7c 7f 1b 78 mr r31,r3 ffc04d60: 90 01 00 24 stw r0,36(r1) int rv = -1; if (target != NULL) { ffc04d64: 41 82 00 40 beq- ffc04da4 rv = rtems_mkdir(target, S_IRWXU | S_IRWXG | S_IRWXO); ffc04d68: 7f c3 f3 78 mr r3,r30 ffc04d6c: 90 a1 00 08 stw r5,8(r1) ffc04d70: 38 80 01 ff li r4,511 ffc04d74: 90 c1 00 0c stw r6,12(r1) ffc04d78: 90 e1 00 10 stw r7,16(r1) ffc04d7c: 48 00 09 d5 bl ffc05750 if (rv == 0) { ffc04d80: 2c 03 00 00 cmpwi r3,0 ffc04d84: 80 a1 00 08 lwz r5,8(r1) ffc04d88: 80 c1 00 0c lwz r6,12(r1) ffc04d8c: 80 e1 00 10 lwz r7,16(r1) ffc04d90: 40 a2 00 24 bne+ ffc04db4 <== NEVER TAKEN rv = mount( ffc04d94: 7f e3 fb 78 mr r3,r31 ffc04d98: 7f c4 f3 78 mr r4,r30 ffc04d9c: 48 00 00 f9 bl ffc04e94 ffc04da0: 48 00 00 14 b ffc04db4 options, data ); } } else { errno = EINVAL; ffc04da4: 48 00 b7 85 bl ffc10528 <__errno> ffc04da8: 38 00 00 16 li r0,22 ffc04dac: 90 03 00 00 stw r0,0(r3) const char *filesystemtype, rtems_filesystem_options_t options, const void *data ) { int rv = -1; ffc04db0: 38 60 ff ff li r3,-1 } else { errno = EINVAL; } return rv; } ffc04db4: 39 61 00 20 addi r11,r1,32 ffc04db8: 48 01 06 64 b ffc1541c <_restgpr_30_x> =============================================================================== ffc05c94 : /* * The reentrancy structure was allocated by newlib using malloc() */ if (current_task == deleted_task) { ffc05c94: 7f 83 20 00 cmpw cr7,r3,r4 void newlib_delete_hook( rtems_tcb *current_task, rtems_tcb *deleted_task ) { ffc05c98: 94 21 ff e8 stwu r1,-24(r1) ffc05c9c: 7c 08 02 a6 mflr r0 ffc05ca0: bf a1 00 0c stmw r29,12(r1) ffc05ca4: 7c 7d 1b 78 mr r29,r3 ffc05ca8: 7c 9e 23 78 mr r30,r4 ffc05cac: 90 01 00 1c stw r0,28(r1) /* * The reentrancy structure was allocated by newlib using malloc() */ if (current_task == deleted_task) { ffc05cb0: 40 be 00 10 bne+ cr7,ffc05cc0 ptr = _REENT; ffc05cb4: 3d 20 00 00 lis r9,0 ffc05cb8: 83 e9 27 80 lwz r31,10112(r9) ffc05cbc: 48 00 00 08 b ffc05cc4 } else { ptr = deleted_task->libc_reent; ffc05cc0: 83 e4 01 2c lwz r31,300(r4) } if (ptr && ptr != _global_impure_ptr) { ffc05cc4: 2f 9f 00 00 cmpwi cr7,r31,0 ffc05cc8: 41 9e 00 2c beq- cr7,ffc05cf4 <== NEVER TAKEN ffc05ccc: 3d 20 00 00 lis r9,0 ffc05cd0: 80 09 27 84 lwz r0,10116(r9) ffc05cd4: 7f 9f 00 00 cmpw cr7,r31,r0 ffc05cd8: 41 9e 00 1c beq- cr7,ffc05cf4 _reclaim_reent(ptr); */ /* * Just in case there are some buffers lying around. */ _fwalk(ptr, newlib_free_buffers); ffc05cdc: 3c 80 ff c0 lis r4,-64 ffc05ce0: 7f e3 fb 78 mr r3,r31 ffc05ce4: 38 84 5a 7c addi r4,r4,23164 ffc05ce8: 48 00 f0 2d bl ffc14d14 <_fwalk> #if REENT_MALLOCED free(ptr); #else _Workspace_Free(ptr); ffc05cec: 7f e3 fb 78 mr r3,r31 ffc05cf0: 48 00 69 f1 bl ffc0c6e0 <_Workspace_Free> /* * Require the switch back to another task to install its own */ if ( current_task == deleted_task ) { ffc05cf4: 7f 9d f0 00 cmpw cr7,r29,r30 #else _Workspace_Free(ptr); #endif } deleted_task->libc_reent = NULL; ffc05cf8: 38 00 00 00 li r0,0 ffc05cfc: 90 1e 01 2c stw r0,300(r30) /* * Require the switch back to another task to install its own */ if ( current_task == deleted_task ) { ffc05d00: 40 be 00 0c bne+ cr7,ffc05d0c _REENT = 0; ffc05d04: 3d 20 00 00 lis r9,0 ffc05d08: 90 09 27 80 stw r0,10112(r9) } } ffc05d0c: 39 61 00 18 addi r11,r1,24 ffc05d10: 48 01 34 98 b ffc191a8 <_restgpr_29_x> =============================================================================== ffc05a7c : */ int newlib_free_buffers( FILE *fp ) { ffc05a7c: 7c 2b 0b 78 mr r11,r1 ffc05a80: 7c 08 02 a6 mflr r0 ffc05a84: 94 21 ff f0 stwu r1,-16(r1) ffc05a88: 48 01 36 dd bl ffc19164 <_savegpr_31> ffc05a8c: 90 01 00 14 stw r0,20(r1) ffc05a90: 7c 7f 1b 78 mr r31,r3 switch ( fileno(fp) ) { ffc05a94: 48 00 ed 09 bl ffc1479c ffc05a98: 2b 83 00 02 cmplwi cr7,r3,2 ffc05a9c: 41 9d 00 34 bgt- cr7,ffc05ad0 <== NEVER TAKEN case 0: case 1: case 2: if (fp->_flags & __SMBF) { ffc05aa0: a0 1f 00 0c lhz r0,12(r31) ffc05aa4: 70 09 00 80 andi. r9,r0,128 ffc05aa8: 41 a2 00 30 beq+ ffc05ad8 <== ALWAYS TAKEN free( fp->_bf._base ); ffc05aac: 80 7f 00 10 lwz r3,16(r31) <== NOT EXECUTED ffc05ab0: 4b ff f6 81 bl ffc05130 <== NOT EXECUTED fp->_flags &= ~__SMBF; ffc05ab4: a0 1f 00 0c lhz r0,12(r31) <== NOT EXECUTED ffc05ab8: 54 00 06 6e rlwinm r0,r0,0,25,23 <== NOT EXECUTED ffc05abc: b0 1f 00 0c sth r0,12(r31) <== NOT EXECUTED fp->_bf._base = fp->_p = (unsigned char *) NULL; ffc05ac0: 38 00 00 00 li r0,0 <== NOT EXECUTED ffc05ac4: 90 1f 00 00 stw r0,0(r31) <== NOT EXECUTED ffc05ac8: 90 1f 00 10 stw r0,16(r31) <== NOT EXECUTED ffc05acc: 48 00 00 0c b ffc05ad8 <== NOT EXECUTED } break; default: fclose(fp); ffc05ad0: 7f e3 fb 78 mr r3,r31 <== NOT EXECUTED ffc05ad4: 48 00 e9 85 bl ffc14458 <== NOT EXECUTED } return 0; } ffc05ad8: 39 61 00 10 addi r11,r1,16 ffc05adc: 38 60 00 00 li r3,0 ffc05ae0: 48 01 36 d0 b ffc191b0 <_restgpr_31_x> =============================================================================== ffc05da4 : int open( const char *pathname, int flags, ... ) { ffc05da4: 94 21 ff b0 stwu r1,-80(r1) ffc05da8: 7c 08 02 a6 mflr r0 ffc05dac: 90 01 00 54 stw r0,84(r1) /* * Set the Evaluation flags */ eval_flags = 0; status = flags + 1; ffc05db0: 38 04 00 01 addi r0,r4,1 if ( ( status & _FREAD ) == _FREAD ) ffc05db4: 70 09 00 01 andi. r9,r0,1 int open( const char *pathname, int flags, ... ) { ffc05db8: bf 21 00 34 stmw r25,52(r1) ffc05dbc: 7c 7d 1b 78 mr r29,r3 ffc05dc0: 7c 9e 23 78 mr r30,r4 ffc05dc4: 90 a1 00 28 stw r5,40(r1) int eval_flags; /* * Set the Evaluation flags */ eval_flags = 0; ffc05dc8: 3b 80 00 00 li r28,0 status = flags + 1; if ( ( status & _FREAD ) == _FREAD ) ffc05dcc: 41 82 00 08 beq- ffc05dd4 eval_flags |= RTEMS_LIBIO_PERMS_READ; ffc05dd0: 3b 80 00 04 li r28,4 if ( ( status & _FWRITE ) == _FWRITE ) ffc05dd4: 70 09 00 02 andi. r9,r0,2 ffc05dd8: 41 82 00 08 beq- ffc05de0 eval_flags |= RTEMS_LIBIO_PERMS_WRITE; ffc05ddc: 63 9c 00 02 ori r28,r28,2 va_start(ap, flags); ffc05de0: 38 01 00 58 addi r0,r1,88 ffc05de4: 90 01 00 0c stw r0,12(r1) ffc05de8: 39 21 00 20 addi r9,r1,32 mode = va_arg( ap, int ); ffc05dec: 38 00 00 03 li r0,3 if ( ( status & _FREAD ) == _FREAD ) eval_flags |= RTEMS_LIBIO_PERMS_READ; if ( ( status & _FWRITE ) == _FWRITE ) eval_flags |= RTEMS_LIBIO_PERMS_WRITE; va_start(ap, flags); ffc05df0: 91 21 00 10 stw r9,16(r1) mode = va_arg( ap, int ); ffc05df4: 98 01 00 08 stb r0,8(r1) ffc05df8: 83 69 00 08 lwz r27,8(r9) * 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(); ffc05dfc: 48 00 a7 6d bl ffc10568 if ( iop == 0 ) { ffc05e00: 7c 7f 1b 79 mr. r31,r3 ffc05e04: 41 82 01 74 beq- ffc05f78 } /* * See if the file exists. */ status = rtems_filesystem_evaluate_path( ffc05e08: 7f a3 eb 78 mr r3,r29 ffc05e0c: 48 00 f6 4d bl ffc15458 ffc05e10: 3b 41 00 14 addi r26,r1,20 ffc05e14: 7c 64 1b 78 mr r4,r3 ffc05e18: 7f 85 e3 78 mr r5,r28 ffc05e1c: 7f a3 eb 78 mr r3,r29 ffc05e20: 7f 46 d3 78 mr r6,r26 ffc05e24: 38 e0 00 01 li r7,1 ffc05e28: 4b ff f1 e9 bl ffc05010 pathname, strlen( pathname ), eval_flags, &loc, true ); if ( status == -1 ) { ffc05e2c: 2f 83 ff ff cmpwi cr7,r3,-1 ffc05e30: 40 be 00 80 bne+ cr7,ffc05eb0 if ( errno != ENOENT ) { ffc05e34: 48 00 e4 85 bl ffc142b8 <__errno> ffc05e38: 80 03 00 00 lwz r0,0(r3) ffc05e3c: 2f 80 00 02 cmpwi cr7,r0,2 ffc05e40: 41 9e 00 14 beq- cr7,ffc05e54 rc = errno; ffc05e44: 48 00 e4 75 bl ffc142b8 <__errno> 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; ffc05e48: 3b 80 00 00 li r28,0 status = rtems_filesystem_evaluate_path( pathname, strlen( pathname ), eval_flags, &loc, true ); if ( status == -1 ) { if ( errno != ENOENT ) { rc = errno; ffc05e4c: 83 23 00 00 lwz r25,0(r3) goto done; ffc05e50: 48 00 01 3c b ffc05f8c } /* If the file does not exist and we are not trying to create it--> error */ if ( !(flags & O_CREAT) ) { ffc05e54: 73 c0 02 00 andi. r0,r30,512 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; ffc05e58: 3b 80 00 00 li r28,0 goto done; } /* If the file does not exist and we are not trying to create it--> error */ if ( !(flags & O_CREAT) ) { rc = ENOENT; ffc05e5c: 3b 20 00 02 li r25,2 rc = errno; goto done; } /* If the file does not exist and we are not trying to create it--> error */ if ( !(flags & O_CREAT) ) { ffc05e60: 41 a2 01 34 beq+ ffc05f94 rc = ENOENT; goto done; } /* Create the node for the new regular file */ rc = mknod( pathname, S_IFREG | mode, 0LL ); ffc05e64: 7f a3 eb 78 mr r3,r29 ffc05e68: 63 64 80 00 ori r4,r27,32768 ffc05e6c: 38 a0 00 00 li r5,0 ffc05e70: 38 c0 00 00 li r6,0 ffc05e74: 4b ff f7 81 bl ffc055f4 if ( rc ) { ffc05e78: 2f 83 00 00 cmpwi cr7,r3,0 ffc05e7c: 40 9e 00 8c bne- cr7,ffc05f08 <== NEVER TAKEN /* * After we do the mknod(), we have to evaluate the path to get the * "loc" structure needed to actually have the file itself open. * So we created it, and then we need to have "look it up." */ status = rtems_filesystem_evaluate_path( ffc05e80: 7f a3 eb 78 mr r3,r29 ffc05e84: 48 00 f5 d5 bl ffc15458 ffc05e88: 38 a0 00 00 li r5,0 ffc05e8c: 7c 64 1b 78 mr r4,r3 ffc05e90: 7f 46 d3 78 mr r6,r26 ffc05e94: 7f a3 eb 78 mr r3,r29 ffc05e98: 38 e0 00 01 li r7,1 ffc05e9c: 4b ff f1 75 bl ffc05010 pathname, strlen( pathname ), 0x0, &loc, true ); if ( status != 0 ) { /* The file did not exist */ rc = EACCES; ffc05ea0: 3b 20 00 0d li r25,13 * "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( pathname, strlen( pathname ), 0x0, &loc, true ); if ( status != 0 ) { /* The file did not exist */ ffc05ea4: 2f 83 00 00 cmpwi cr7,r3,0 ffc05ea8: 40 9e 00 ec bne- cr7,ffc05f94 <== NEVER TAKEN ffc05eac: 48 00 00 10 b ffc05ebc rc = EACCES; goto done; } } else if ((flags & (O_EXCL|O_CREAT)) == (O_EXCL|O_CREAT)) { ffc05eb0: 73 c0 0a 00 andi. r0,r30,2560 ffc05eb4: 2f 80 0a 00 cmpwi cr7,r0,2560 ffc05eb8: 41 9e 00 c8 beq- cr7,ffc05f80 /* * Fill in the file control block based on the loc structure * returned by successful path evaluation. */ iop->flags |= rtems_libio_fcntl_flags( flags ); ffc05ebc: 83 9f 00 18 lwz r28,24(r31) ffc05ec0: 7f c3 f3 78 mr r3,r30 ffc05ec4: 48 00 a6 15 bl ffc104d8 iop->pathinfo = loc; ffc05ec8: 39 7f 00 1c addi r11,r31,28 /* * Fill in the file control block based on the loc structure * returned by successful path evaluation. */ iop->flags |= rtems_libio_fcntl_flags( flags ); ffc05ecc: 7c 63 e3 78 or r3,r3,r28 iop->pathinfo = loc; ffc05ed0: 3b 81 00 14 addi r28,r1,20 /* * Fill in the file control block based on the loc structure * returned by successful path evaluation. */ iop->flags |= rtems_libio_fcntl_flags( flags ); ffc05ed4: 90 7f 00 18 stw r3,24(r31) iop->pathinfo = loc; rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode ); ffc05ed8: 7f a4 eb 78 mr r4,r29 /* * Fill in the file control block based on the loc structure * returned by successful path evaluation. */ iop->flags |= rtems_libio_fcntl_flags( flags ); iop->pathinfo = loc; ffc05edc: 7c bc a4 aa lswi r5,r28,20 ffc05ee0: 7c ab a5 aa stswi r5,r11,20 rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode ); ffc05ee4: 7f e3 fb 78 mr r3,r31 ffc05ee8: 7f c5 f3 78 mr r5,r30 ffc05eec: 81 3f 00 24 lwz r9,36(r31) ffc05ef0: 7f 66 db 78 mr r6,r27 ffc05ef4: 80 09 00 00 lwz r0,0(r9) ffc05ef8: 7c 09 03 a6 mtctr r0 ffc05efc: 4e 80 04 21 bctrl if ( rc ) { ffc05f00: 2f 83 00 00 cmpwi cr7,r3,0 ffc05f04: 41 be 00 10 beq+ cr7,ffc05f14 rc = errno; ffc05f08: 48 00 e3 b1 bl ffc142b8 <__errno> ffc05f0c: 83 23 00 00 lwz r25,0(r3) goto done; ffc05f10: 48 00 00 7c b ffc05f8c } /* * Optionally truncate the file. */ if ( (flags & O_TRUNC) == O_TRUNC ) { ffc05f14: 73 c0 04 00 andi. r0,r30,1024 ffc05f18: 41 a2 00 ac beq+ ffc05fc4 rc = ftruncate( iop - rtems_libio_iops, 0 ); ffc05f1c: 3d 20 00 00 lis r9,0 ffc05f20: 80 69 27 e8 lwz r3,10216(r9) ffc05f24: 38 a0 00 00 li r5,0 ffc05f28: 38 c0 00 00 li r6,0 ffc05f2c: 7c 63 f8 50 subf r3,r3,r31 ffc05f30: 7c 63 36 70 srawi r3,r3,6 ffc05f34: 48 00 a4 65 bl ffc10398 if ( rc ) { ffc05f38: 7c 79 1b 79 mr. r25,r3 ffc05f3c: 41 a2 00 88 beq+ ffc05fc4 if(errno) rc = errno; ffc05f40: 48 00 e3 79 bl ffc142b8 <__errno> ffc05f44: 80 03 00 00 lwz r0,0(r3) ffc05f48: 2f 80 00 00 cmpwi cr7,r0,0 ffc05f4c: 41 be 00 0c beq+ cr7,ffc05f58 <== NEVER TAKEN ffc05f50: 48 00 e3 69 bl ffc142b8 <__errno> ffc05f54: 83 23 00 00 lwz r25,0(r3) close( iop - rtems_libio_iops ); ffc05f58: 3d 20 00 00 lis r9,0 ffc05f5c: 80 09 27 e8 lwz r0,10216(r9) /* those are released by close(): */ iop = 0; loc_to_free = NULL; ffc05f60: 3b 80 00 00 li r28,0 */ if ( (flags & O_TRUNC) == O_TRUNC ) { rc = ftruncate( iop - rtems_libio_iops, 0 ); if ( rc ) { if(errno) rc = errno; close( iop - rtems_libio_iops ); ffc05f64: 7f e0 f8 50 subf r31,r0,r31 ffc05f68: 7f e3 36 70 srawi r3,r31,6 ffc05f6c: 48 00 a3 a1 bl ffc1030c /* those are released by close(): */ iop = 0; ffc05f70: 3b e0 00 00 li r31,0 ffc05f74: 48 00 00 18 b ffc05f8c */ /* allocate a file control block */ iop = rtems_libio_allocate(); if ( iop == 0 ) { rc = ENFILE; ffc05f78: 3b 20 00 17 li r25,23 ffc05f7c: 48 00 00 38 b ffc05fb4 } } 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; ffc05f80: 7f 5c d3 78 mr r28,r26 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; ffc05f84: 3b 20 00 11 li r25,17 ffc05f88: 48 00 00 0c b ffc05f94 * Single exit and clean up path. */ done: va_end(ap); if ( rc ) { ffc05f8c: 2f 99 00 00 cmpwi cr7,r25,0 ffc05f90: 41 be 00 34 beq+ cr7,ffc05fc4 <== NEVER TAKEN if ( iop ) ffc05f94: 2f 9f 00 00 cmpwi cr7,r31,0 ffc05f98: 41 9e 00 0c beq- cr7,ffc05fa4 rtems_libio_free( iop ); ffc05f9c: 7f e3 fb 78 mr r3,r31 ffc05fa0: 48 00 a6 61 bl ffc10600 if ( loc_to_free ) ffc05fa4: 2f 9c 00 00 cmpwi cr7,r28,0 ffc05fa8: 41 9e 00 0c beq- cr7,ffc05fb4 rtems_filesystem_freenode( loc_to_free ); ffc05fac: 7f 83 e3 78 mr r3,r28 ffc05fb0: 4b ff f1 55 bl ffc05104 rtems_set_errno_and_return_minus_one( rc ); ffc05fb4: 48 00 e3 05 bl ffc142b8 <__errno> ffc05fb8: 93 23 00 00 stw r25,0(r3) ffc05fbc: 38 60 ff ff li r3,-1 ffc05fc0: 48 00 00 14 b ffc05fd4 } return iop - rtems_libio_iops; ffc05fc4: 3d 20 00 00 lis r9,0 ffc05fc8: 80 69 27 e8 lwz r3,10216(r9) ffc05fcc: 7f e3 f8 50 subf r31,r3,r31 ffc05fd0: 7f e3 36 70 srawi r3,r31,6 } ffc05fd4: 39 61 00 50 addi r11,r1,80 ffc05fd8: 48 01 31 c0 b ffc19198 <_restgpr_25_x> =============================================================================== ffc06e04 : /* * Handle output processing */ static void oproc (unsigned char c, struct rtems_termios_tty *tty) { ffc06e04: 7c 08 02 a6 mflr r0 ffc06e08: 7c 2b 0b 78 mr r11,r1 ffc06e0c: 94 21 ff e8 stwu r1,-24(r1) ffc06e10: 90 01 00 1c stw r0,28(r1) ffc06e14: 48 01 23 51 bl ffc19164 <_savegpr_31> ffc06e18: 7c 9f 23 78 mr r31,r4 ffc06e1c: 98 61 00 08 stb r3,8(r1) int i; if (tty->termios.c_oflag & OPOST) { ffc06e20: 80 04 00 34 lwz r0,52(r4) ffc06e24: 70 09 00 01 andi. r9,r0,1 ffc06e28: 41 82 01 30 beq- ffc06f58 <== NEVER TAKEN switch (c) { ffc06e2c: 2f 83 00 09 cmpwi cr7,r3,9 ffc06e30: 41 9e 00 90 beq- cr7,ffc06ec0 ffc06e34: 2b 83 00 09 cmplwi cr7,r3,9 ffc06e38: 41 9d 00 10 bgt- cr7,ffc06e48 <== ALWAYS TAKEN ffc06e3c: 2f 83 00 08 cmpwi cr7,r3,8 <== NOT EXECUTED ffc06e40: 40 be 00 c4 bne+ cr7,ffc06f04 <== NOT EXECUTED ffc06e44: 48 00 00 a8 b ffc06eec <== NOT EXECUTED ffc06e48: 2f 83 00 0a cmpwi cr7,r3,10 ffc06e4c: 41 9e 00 10 beq- cr7,ffc06e5c ffc06e50: 2f 83 00 0d cmpwi cr7,r3,13 ffc06e54: 40 be 00 b0 bne+ cr7,ffc06f04 <== ALWAYS TAKEN ffc06e58: 48 00 00 34 b ffc06e8c <== NOT EXECUTED case '\n': if (tty->termios.c_oflag & ONLRET) ffc06e5c: 70 09 00 20 andi. r9,r0,32 ffc06e60: 41 82 00 0c beq- ffc06e6c <== ALWAYS TAKEN tty->column = 0; ffc06e64: 39 20 00 00 li r9,0 <== NOT EXECUTED ffc06e68: 91 24 00 28 stw r9,40(r4) <== NOT EXECUTED if (tty->termios.c_oflag & ONLCR) { ffc06e6c: 70 09 00 04 andi. r9,r0,4 ffc06e70: 41 a2 00 e8 beq+ ffc06f58 <== NEVER TAKEN rtems_termios_puts ("\r", 1, tty); ffc06e74: 3c 60 ff c2 lis r3,-62 ffc06e78: 38 63 ab 3e addi r3,r3,-21698 ffc06e7c: 38 80 00 01 li r4,1 ffc06e80: 7f e5 fb 78 mr r5,r31 ffc06e84: 4b ff fe 59 bl ffc06cdc ffc06e88: 48 00 00 30 b ffc06eb8 tty->column = 0; } break; case '\r': if ((tty->termios.c_oflag & ONOCR) && (tty->column == 0)) ffc06e8c: 70 09 00 10 andi. r9,r0,16 <== NOT EXECUTED ffc06e90: 41 82 00 10 beq- ffc06ea0 <== NOT EXECUTED ffc06e94: 81 24 00 28 lwz r9,40(r4) <== NOT EXECUTED ffc06e98: 2f 89 00 00 cmpwi cr7,r9,0 <== NOT EXECUTED ffc06e9c: 41 9e 00 cc beq- cr7,ffc06f68 <== NOT EXECUTED return; if (tty->termios.c_oflag & OCRNL) { ffc06ea0: 70 09 00 08 andi. r9,r0,8 <== NOT EXECUTED ffc06ea4: 41 82 00 58 beq- ffc06efc <== NOT EXECUTED c = '\n'; ffc06ea8: 39 20 00 0a li r9,10 <== NOT EXECUTED ffc06eac: 99 21 00 08 stb r9,8(r1) <== NOT EXECUTED if (tty->termios.c_oflag & ONLRET) ffc06eb0: 70 09 00 20 andi. r9,r0,32 <== NOT EXECUTED ffc06eb4: 41 82 00 a4 beq- ffc06f58 <== NOT EXECUTED tty->column = 0; ffc06eb8: 38 00 00 00 li r0,0 ffc06ebc: 48 00 00 98 b ffc06f54 tty->column = 0; break; case '\t': i = 8 - (tty->column & 7); if ((tty->termios.c_oflag & TABDLY) == XTABS) { ffc06ec0: 54 00 04 e8 rlwinm r0,r0,0,19,20 } tty->column = 0; break; case '\t': i = 8 - (tty->column & 7); ffc06ec4: 81 24 00 28 lwz r9,40(r4) if ((tty->termios.c_oflag & TABDLY) == XTABS) { ffc06ec8: 2f 80 18 00 cmpwi cr7,r0,6144 } tty->column = 0; break; case '\t': i = 8 - (tty->column & 7); ffc06ecc: 55 24 07 7e clrlwi r4,r9,29 ffc06ed0: 20 84 00 08 subfic r4,r4,8 ffc06ed4: 7c 04 4a 14 add r0,r4,r9 if ((tty->termios.c_oflag & TABDLY) == XTABS) { ffc06ed8: 40 be 00 7c bne+ cr7,ffc06f54 <== NEVER TAKEN tty->column += i; rtems_termios_puts ( " ", i, tty); ffc06edc: 3c 60 ff c2 lis r3,-62 break; case '\t': i = 8 - (tty->column & 7); if ((tty->termios.c_oflag & TABDLY) == XTABS) { tty->column += i; ffc06ee0: 90 1f 00 28 stw r0,40(r31) rtems_termios_puts ( " ", i, tty); ffc06ee4: 38 63 a7 e2 addi r3,r3,-22558 ffc06ee8: 48 00 00 78 b ffc06f60 } tty->column += i; break; case '\b': if (tty->column > 0) ffc06eec: 81 24 00 28 lwz r9,40(r4) <== NOT EXECUTED ffc06ef0: 2f 89 00 00 cmpwi cr7,r9,0 <== NOT EXECUTED ffc06ef4: 40 9d 00 64 ble- cr7,ffc06f58 <== NOT EXECUTED tty->column--; ffc06ef8: 39 29 ff ff addi r9,r9,-1 <== NOT EXECUTED ffc06efc: 91 3f 00 28 stw r9,40(r31) <== NOT EXECUTED ffc06f00: 48 00 00 58 b ffc06f58 <== NOT EXECUTED break; default: if (tty->termios.c_oflag & OLCUC) ffc06f04: 70 09 00 02 andi. r9,r0,2 ffc06f08: 41 82 00 28 beq- ffc06f30 <== ALWAYS TAKEN c = toupper(c); ffc06f0c: 3d 20 00 00 lis r9,0 <== NOT EXECUTED ffc06f10: 81 29 27 7c lwz r9,10108(r9) <== NOT EXECUTED ffc06f14: 7d 29 1a 14 add r9,r9,r3 <== NOT EXECUTED ffc06f18: 88 09 00 01 lbz r0,1(r9) <== NOT EXECUTED ffc06f1c: 54 00 07 be clrlwi r0,r0,30 <== NOT EXECUTED ffc06f20: 2f 80 00 02 cmpwi cr7,r0,2 <== NOT EXECUTED ffc06f24: 40 be 00 08 bne+ cr7,ffc06f2c <== NOT EXECUTED ffc06f28: 38 63 ff e0 addi r3,r3,-32 <== NOT EXECUTED ffc06f2c: 98 61 00 08 stb r3,8(r1) <== NOT EXECUTED if (!iscntrl(c)) ffc06f30: 3d 20 00 00 lis r9,0 ffc06f34: 88 01 00 08 lbz r0,8(r1) ffc06f38: 81 29 27 7c lwz r9,10108(r9) ffc06f3c: 7d 29 02 14 add r9,r9,r0 ffc06f40: 88 09 00 01 lbz r0,1(r9) ffc06f44: 70 09 00 20 andi. r9,r0,32 ffc06f48: 40 82 00 10 bne- ffc06f58 <== NEVER TAKEN tty->column++; ffc06f4c: 81 3f 00 28 lwz r9,40(r31) ffc06f50: 38 09 00 01 addi r0,r9,1 ffc06f54: 90 1f 00 28 stw r0,40(r31) break; } } rtems_termios_puts (&c, 1, tty); ffc06f58: 38 61 00 08 addi r3,r1,8 ffc06f5c: 38 80 00 01 li r4,1 ffc06f60: 7f e5 fb 78 mr r5,r31 ffc06f64: 4b ff fd 79 bl ffc06cdc } ffc06f68: 39 61 00 18 addi r11,r1,24 ffc06f6c: 48 01 22 44 b ffc191b0 <_restgpr_31_x> =============================================================================== ffc0d93c : * Called by pipe() to create an anonymous pipe. */ int pipe_create( int filsdes[2] ) { ffc0d93c: 94 21 ff d8 stwu r1,-40(r1) ffc0d940: 7c 08 02 a6 mflr r0 rtems_libio_t *iop; int err = 0; if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0) ffc0d944: 38 80 01 ff li r4,511 * Called by pipe() to create an anonymous pipe. */ int pipe_create( int filsdes[2] ) { ffc0d948: bf 81 00 18 stmw r28,24(r1) ffc0d94c: 7c 7d 1b 78 mr r29,r3 rtems_libio_t *iop; int err = 0; if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0) ffc0d950: 3c 60 ff c2 lis r3,-62 ffc0d954: 38 63 fa b0 addi r3,r3,-1360 * Called by pipe() to create an anonymous pipe. */ int pipe_create( int filsdes[2] ) { ffc0d958: 90 01 00 2c stw r0,44(r1) rtems_libio_t *iop; int err = 0; if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0) ffc0d95c: 48 00 18 95 bl ffc0f1f0 return -1; ffc0d960: 3b c0 ff ff li r30,-1 ) { rtems_libio_t *iop; int err = 0; if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0) ffc0d964: 2f 83 00 00 cmpwi cr7,r3,0 ffc0d968: 40 be 01 04 bne+ cr7,ffc0da6c <== NEVER TAKEN return -1; /* /tmp/.fifoXXXX */ char fifopath[15]; memcpy(fifopath, "/tmp/.fifo", 10); ffc0d96c: 3d 20 ff c2 lis r9,-62 ffc0d970: 3b e1 00 08 addi r31,r1,8 ffc0d974: 39 29 fa b5 addi r9,r9,-1355 ffc0d978: 7c a9 54 aa lswi r5,r9,10 ffc0d97c: 7c bf 55 aa stswi r5,r31,10 sprintf(fifopath + 10, "%04x", rtems_pipe_no ++); ffc0d980: 3d 20 00 00 lis r9,0 ffc0d984: 3c 80 ff c2 lis r4,-62 ffc0d988: a0 a9 29 d8 lhz r5,10712(r9) ffc0d98c: 38 84 fa c0 addi r4,r4,-1344 ffc0d990: 38 61 00 12 addi r3,r1,18 ffc0d994: 38 05 00 01 addi r0,r5,1 ffc0d998: b0 09 29 d8 sth r0,10712(r9) ffc0d99c: 4c c6 31 82 crclr 4*cr1+eq ffc0d9a0: 48 00 54 9d bl ffc12e3c /* Try creating FIFO file until find an available file name */ while (mkfifo(fifopath, S_IRUSR|S_IWUSR) != 0) { ffc0d9a4: 7f e3 fb 78 mr r3,r31 ffc0d9a8: 38 80 01 80 li r4,384 ffc0d9ac: 48 00 15 41 bl ffc0eeec ffc0d9b0: 2f 83 00 00 cmpwi cr7,r3,0 ffc0d9b4: 41 be 00 0c beq+ cr7,ffc0d9c0 if (errno != EEXIST){ ffc0d9b8: 48 00 45 7d bl ffc11f34 <__errno> ffc0d9bc: 48 00 00 b0 b ffc0da6c 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); ffc0d9c0: 7f e3 fb 78 mr r3,r31 ffc0d9c4: 38 80 40 00 li r4,16384 ffc0d9c8: 4c c6 31 82 crclr 4*cr1+eq ffc0d9cc: 4b ff 8a 85 bl ffc06450 if (filsdes[0] < 0) { ffc0d9d0: 2f 83 00 00 cmpwi cr7,r3,0 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); ffc0d9d4: 90 7d 00 00 stw r3,0(r29) if (filsdes[0] < 0) { ffc0d9d8: 40 bc 00 14 bge+ cr7,ffc0d9ec err = errno; ffc0d9dc: 48 00 45 59 bl ffc11f34 <__errno> ffc0d9e0: 83 83 00 00 lwz r28,0(r3) /* 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); ffc0d9e4: 7f e3 fb 78 mr r3,r31 ffc0d9e8: 48 00 00 68 b ffc0da50 } else { /* Reset open file to blocking mode */ iop = rtems_libio_iop(filsdes[0]); ffc0d9ec: 3d 20 00 00 lis r9,0 ffc0d9f0: 80 09 27 0c lwz r0,9996(r9) ffc0d9f4: 39 20 00 00 li r9,0 ffc0d9f8: 7f 83 00 40 cmplw cr7,r3,r0 ffc0d9fc: 40 9c 00 14 bge- cr7,ffc0da10 <== NEVER TAKEN ffc0da00: 3d 20 00 00 lis r9,0 ffc0da04: 81 29 27 cc lwz r9,10188(r9) ffc0da08: 54 63 30 32 rlwinm r3,r3,6,0,25 ffc0da0c: 7d 29 1a 14 add r9,r9,r3 iop->flags &= ~LIBIO_FLAGS_NO_DELAY; ffc0da10: 80 09 00 18 lwz r0,24(r9) filsdes[1] = open(fifopath, O_WRONLY); ffc0da14: 38 61 00 08 addi r3,r1,8 ffc0da18: 38 80 00 01 li r4,1 unlink(fifopath); } else { /* Reset open file to blocking mode */ iop = rtems_libio_iop(filsdes[0]); iop->flags &= ~LIBIO_FLAGS_NO_DELAY; ffc0da1c: 54 00 00 3c rlwinm r0,r0,0,0,30 ffc0da20: 90 09 00 18 stw r0,24(r9) int pipe_create( int filsdes[2] ) { rtems_libio_t *iop; int err = 0; ffc0da24: 3b 80 00 00 li r28,0 else { /* Reset open file to blocking mode */ iop = rtems_libio_iop(filsdes[0]); iop->flags &= ~LIBIO_FLAGS_NO_DELAY; filsdes[1] = open(fifopath, O_WRONLY); ffc0da28: 4c c6 31 82 crclr 4*cr1+eq ffc0da2c: 4b ff 8a 25 bl ffc06450 if (filsdes[1] < 0) { ffc0da30: 2f 83 00 00 cmpwi cr7,r3,0 else { /* Reset open file to blocking mode */ iop = rtems_libio_iop(filsdes[0]); iop->flags &= ~LIBIO_FLAGS_NO_DELAY; filsdes[1] = open(fifopath, O_WRONLY); ffc0da34: 90 7d 00 04 stw r3,4(r29) if (filsdes[1] < 0) { ffc0da38: 40 bc 00 14 bge+ cr7,ffc0da4c err = errno; ffc0da3c: 48 00 44 f9 bl ffc11f34 <__errno> ffc0da40: 83 83 00 00 lwz r28,0(r3) close(filsdes[0]); ffc0da44: 80 7d 00 00 lwz r3,0(r29) ffc0da48: 4b ff 78 39 bl ffc05280 } unlink(fifopath); ffc0da4c: 38 61 00 08 addi r3,r1,8 ffc0da50: 4b ff aa a1 bl ffc084f0 } if(err != 0) ffc0da54: 2f 9c 00 00 cmpwi cr7,r28,0 rtems_set_errno_and_return_minus_one(err); return 0; ffc0da58: 3b c0 00 00 li r30,0 err = errno; close(filsdes[0]); } unlink(fifopath); } if(err != 0) ffc0da5c: 41 be 00 10 beq+ cr7,ffc0da6c rtems_set_errno_and_return_minus_one(err); ffc0da60: 48 00 44 d5 bl ffc11f34 <__errno> ffc0da64: 3b c0 ff ff li r30,-1 ffc0da68: 93 83 00 00 stw r28,0(r3) return 0; } ffc0da6c: 39 61 00 28 addi r11,r1,40 ffc0da70: 7f c3 f3 78 mr r3,r30 ffc0da74: 48 00 ff f0 b ffc1da64 <_restgpr_28_x> =============================================================================== ffc0f168 : uint32_t cmd, void *buffer, rtems_libio_t *iop ) { if (cmd == FIONREAD) { ffc0f168: 6c 89 40 04 xoris r9,r4,16388 pipe_control_t *pipe, uint32_t cmd, void *buffer, rtems_libio_t *iop ) { ffc0f16c: 94 21 ff f0 stwu r1,-16(r1) if (cmd == FIONREAD) { ffc0f170: 2f 89 66 7f cmpwi cr7,r9,26239 pipe_control_t *pipe, uint32_t cmd, void *buffer, rtems_libio_t *iop ) { ffc0f174: 7c 08 02 a6 mflr r0 ffc0f178: bf c1 00 08 stmw r30,8(r1) ffc0f17c: 7c 7f 1b 78 mr r31,r3 ffc0f180: 7c be 2b 78 mr r30,r5 ffc0f184: 90 01 00 14 stw r0,20(r1) *(unsigned int *)buffer = pipe->Length; PIPE_UNLOCK(pipe); return 0; } return -EINVAL; ffc0f188: 38 00 ff ea li r0,-22 uint32_t cmd, void *buffer, rtems_libio_t *iop ) { if (cmd == FIONREAD) { ffc0f18c: 40 9e 00 40 bne- cr7,ffc0f1cc if (buffer == NULL) ffc0f190: 2f 85 00 00 cmpwi cr7,r5,0 return -EFAULT; ffc0f194: 38 00 ff f2 li r0,-14 void *buffer, rtems_libio_t *iop ) { if (cmd == FIONREAD) { if (buffer == NULL) ffc0f198: 41 be 00 34 beq+ cr7,ffc0f1cc return -EFAULT; if (! PIPE_LOCK(pipe)) ffc0f19c: 80 63 00 28 lwz r3,40(r3) ffc0f1a0: 38 80 00 00 li r4,0 ffc0f1a4: 38 a0 00 00 li r5,0 ffc0f1a8: 4b ff aa 7d bl ffc09c24 return -EINTR; ffc0f1ac: 38 00 ff fc li r0,-4 { if (cmd == FIONREAD) { if (buffer == NULL) return -EFAULT; if (! PIPE_LOCK(pipe)) ffc0f1b0: 2f 83 00 00 cmpwi cr7,r3,0 ffc0f1b4: 40 be 00 18 bne+ cr7,ffc0f1cc <== NEVER TAKEN return -EINTR; /* Return length of pipe */ *(unsigned int *)buffer = pipe->Length; ffc0f1b8: 80 1f 00 0c lwz r0,12(r31) PIPE_UNLOCK(pipe); ffc0f1bc: 80 7f 00 28 lwz r3,40(r31) if (! PIPE_LOCK(pipe)) return -EINTR; /* Return length of pipe */ *(unsigned int *)buffer = pipe->Length; ffc0f1c0: 90 1e 00 00 stw r0,0(r30) PIPE_UNLOCK(pipe); ffc0f1c4: 4b ff ab 89 bl ffc09d4c return 0; ffc0f1c8: 38 00 00 00 li r0,0 } return -EINVAL; } ffc0f1cc: 39 61 00 10 addi r11,r1,16 ffc0f1d0: 7c 03 03 78 mr r3,r0 ffc0f1d4: 48 01 22 64 b ffc21438 <_restgpr_30_x> =============================================================================== ffc0edd0 : pipe_control_t *pipe, void *buffer, size_t count, rtems_libio_t *iop ) { ffc0edd0: 94 21 ff c8 stwu r1,-56(r1) ffc0edd4: 7c 08 02 a6 mflr r0 ffc0edd8: 90 01 00 3c stw r0,60(r1) ffc0eddc: bf 01 00 18 stmw r24,24(r1) ffc0ede0: 7c 7f 1b 78 mr r31,r3 ffc0ede4: 7c 9e 23 78 mr r30,r4 int chunk, chunk1, read = 0, ret = 0; if (! PIPE_LOCK(pipe)) ffc0ede8: 80 63 00 28 lwz r3,40(r3) pipe_control_t *pipe, void *buffer, size_t count, rtems_libio_t *iop ) { ffc0edec: 7c bd 2b 78 mr r29,r5 int chunk, chunk1, read = 0, ret = 0; if (! PIPE_LOCK(pipe)) ffc0edf0: 38 80 00 00 li r4,0 ffc0edf4: 38 a0 00 00 li r5,0 pipe_control_t *pipe, void *buffer, size_t count, rtems_libio_t *iop ) { ffc0edf8: 7c d8 33 78 mr r24,r6 int chunk, chunk1, read = 0, ret = 0; if (! PIPE_LOCK(pipe)) ffc0edfc: 4b ff ae 29 bl ffc09c24 ffc0ee00: 2f 83 00 00 cmpwi cr7,r3,0 return -EINTR; ffc0ee04: 3b 60 ff fc li r27,-4 rtems_libio_t *iop ) { int chunk, chunk1, read = 0, ret = 0; if (! PIPE_LOCK(pipe)) ffc0ee08: 3b 80 00 00 li r28,0 /* For buffering optimization */ if (PIPE_EMPTY(pipe)) pipe->Start = 0; if (pipe->waitingWriters > 0) PIPE_WAKEUPWRITERS(pipe); ffc0ee0c: 3b 21 00 08 addi r25,r1,8 rtems_libio_t *iop ) { int chunk, chunk1, read = 0, ret = 0; if (! PIPE_LOCK(pipe)) ffc0ee10: 41 be 01 30 beq+ cr7,ffc0ef40 <== ALWAYS TAKEN ffc0ee14: 48 00 01 5c b ffc0ef70 <== NOT EXECUTED return -EINTR; while (read < count) { while (PIPE_EMPTY(pipe)) { /* Not an error */ if (pipe->Writers == 0) ffc0ee18: 80 1f 00 14 lwz r0,20(r31) ffc0ee1c: 2f 80 00 00 cmpwi cr7,r0,0 ffc0ee20: 41 9e 01 28 beq- cr7,ffc0ef48 goto out_locked; if (LIBIO_NODELAY(iop)) { ffc0ee24: 80 18 00 18 lwz r0,24(r24) ffc0ee28: 70 09 00 01 andi. r9,r0,1 ffc0ee2c: 40 82 01 24 bne- ffc0ef50 ret = -EAGAIN; goto out_locked; } /* Wait until pipe is no more empty or no writer exists */ pipe->waitingReaders ++; ffc0ee30: 81 3f 00 18 lwz r9,24(r31) PIPE_UNLOCK(pipe); if (! PIPE_READWAIT(pipe)) ret = -EINTR; ffc0ee34: 3b 60 ff fc li r27,-4 goto out_locked; } /* Wait until pipe is no more empty or no writer exists */ pipe->waitingReaders ++; PIPE_UNLOCK(pipe); ffc0ee38: 80 7f 00 28 lwz r3,40(r31) ret = -EAGAIN; goto out_locked; } /* Wait until pipe is no more empty or no writer exists */ pipe->waitingReaders ++; ffc0ee3c: 38 09 00 01 addi r0,r9,1 ffc0ee40: 90 1f 00 18 stw r0,24(r31) PIPE_UNLOCK(pipe); ffc0ee44: 4b ff af 09 bl ffc09d4c if (! PIPE_READWAIT(pipe)) ffc0ee48: 80 7f 00 2c lwz r3,44(r31) ffc0ee4c: 38 80 00 00 li r4,0 ffc0ee50: 48 00 19 8d bl ffc107dc ffc0ee54: 2f 83 00 00 cmpwi cr7,r3,0 ffc0ee58: 40 9e 00 08 bne- cr7,ffc0ee60 <== NEVER TAKEN ffc0ee5c: 3b 60 00 00 li r27,0 ret = -EINTR; if (! PIPE_LOCK(pipe)) { ffc0ee60: 80 7f 00 28 lwz r3,40(r31) ffc0ee64: 38 80 00 00 li r4,0 ffc0ee68: 38 a0 00 00 li r5,0 ffc0ee6c: 4b ff ad b9 bl ffc09c24 ffc0ee70: 2f 83 00 00 cmpwi cr7,r3,0 ffc0ee74: 40 9e 00 ec bne- cr7,ffc0ef60 <== NEVER TAKEN /* WARN waitingReaders not restored! */ ret = -EINTR; goto out_nolock; } pipe->waitingReaders --; if (ret != 0) ffc0ee78: 2f 9b 00 00 cmpwi cr7,r27,0 if (! PIPE_LOCK(pipe)) { /* WARN waitingReaders not restored! */ ret = -EINTR; goto out_nolock; } pipe->waitingReaders --; ffc0ee7c: 81 3f 00 18 lwz r9,24(r31) ffc0ee80: 38 09 ff ff addi r0,r9,-1 ffc0ee84: 90 1f 00 18 stw r0,24(r31) if (ret != 0) ffc0ee88: 40 9e 00 cc bne- cr7,ffc0ef54 <== NEVER TAKEN if (! PIPE_LOCK(pipe)) return -EINTR; while (read < count) { while (PIPE_EMPTY(pipe)) { ffc0ee8c: 83 7f 00 0c lwz r27,12(r31) ffc0ee90: 2f 9b 00 00 cmpwi cr7,r27,0 ffc0ee94: 41 9e ff 84 beq+ cr7,ffc0ee18 if (ret != 0) goto out_locked; } /* Read chunk bytes */ chunk = MIN(count - read, pipe->Length); ffc0ee98: 7c 1c e8 50 subf r0,r28,r29 ffc0ee9c: 7f 9b 00 40 cmplw cr7,r27,r0 ffc0eea0: 40 9d 00 08 ble- cr7,ffc0eea8 ffc0eea4: 7c 1b 03 78 mr r27,r0 chunk1 = pipe->Size - pipe->Start; ffc0eea8: 80 1f 00 08 lwz r0,8(r31) ffc0eeac: 7c 7e e2 14 add r3,r30,r28 ffc0eeb0: 83 5f 00 04 lwz r26,4(r31) ffc0eeb4: 80 9f 00 00 lwz r4,0(r31) ffc0eeb8: 7f 40 d0 50 subf r26,r0,r26 if (chunk > chunk1) { ffc0eebc: 7f 9b d0 00 cmpw cr7,r27,r26 ffc0eec0: 40 9d 00 24 ble- cr7,ffc0eee4 memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk1); ffc0eec4: 7c 84 02 14 add r4,r4,r0 ffc0eec8: 7f 45 d3 78 mr r5,r26 ffc0eecc: 48 00 4e 09 bl ffc13cd4 memcpy(buffer + read + chunk1, pipe->Buffer, chunk - chunk1); ffc0eed0: 7c 7c d2 14 add r3,r28,r26 ffc0eed4: 7c 7e 1a 14 add r3,r30,r3 ffc0eed8: 80 9f 00 00 lwz r4,0(r31) ffc0eedc: 7c ba d8 50 subf r5,r26,r27 ffc0eee0: 48 00 00 0c b ffc0eeec } else memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk); ffc0eee4: 7c 84 02 14 add r4,r4,r0 ffc0eee8: 7f 65 db 78 mr r5,r27 ffc0eeec: 48 00 4d e9 bl ffc13cd4 pipe->Start += chunk; ffc0eef0: 80 1f 00 08 lwz r0,8(r31) pipe->Start %= pipe->Size; ffc0eef4: 81 3f 00 04 lwz r9,4(r31) memcpy(buffer + read + chunk1, pipe->Buffer, chunk - chunk1); } else memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk); pipe->Start += chunk; ffc0eef8: 7c 1b 02 14 add r0,r27,r0 pipe->Start %= pipe->Size; ffc0eefc: 7d 60 4b 96 divwu r11,r0,r9 ffc0ef00: 7d 2b 49 d6 mullw r9,r11,r9 ffc0ef04: 7c 09 00 50 subf r0,r9,r0 ffc0ef08: 90 1f 00 08 stw r0,8(r31) pipe->Length -= chunk; ffc0ef0c: 80 1f 00 0c lwz r0,12(r31) ffc0ef10: 7c 1b 00 50 subf r0,r27,r0 /* For buffering optimization */ if (PIPE_EMPTY(pipe)) ffc0ef14: 2f 80 00 00 cmpwi cr7,r0,0 else memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk); pipe->Start += chunk; pipe->Start %= pipe->Size; pipe->Length -= chunk; ffc0ef18: 90 1f 00 0c stw r0,12(r31) /* For buffering optimization */ if (PIPE_EMPTY(pipe)) ffc0ef1c: 40 9e 00 08 bne- cr7,ffc0ef24 pipe->Start = 0; ffc0ef20: 90 1f 00 08 stw r0,8(r31) if (pipe->waitingWriters > 0) ffc0ef24: 80 1f 00 1c lwz r0,28(r31) ffc0ef28: 2f 80 00 00 cmpwi cr7,r0,0 ffc0ef2c: 41 be 00 10 beq+ cr7,ffc0ef3c PIPE_WAKEUPWRITERS(pipe); ffc0ef30: 80 7f 00 30 lwz r3,48(r31) ffc0ef34: 7f 24 cb 78 mr r4,r25 ffc0ef38: 48 00 18 39 bl ffc10770 read += chunk; ffc0ef3c: 7f 9c da 14 add r28,r28,r27 int chunk, chunk1, read = 0, ret = 0; if (! PIPE_LOCK(pipe)) return -EINTR; while (read < count) { ffc0ef40: 7f 9c e8 40 cmplw cr7,r28,r29 ffc0ef44: 41 9c ff 48 blt+ cr7,ffc0ee8c while (PIPE_EMPTY(pipe)) { /* Not an error */ if (pipe->Writers == 0) ffc0ef48: 3b 60 00 00 li r27,0 ffc0ef4c: 48 00 00 08 b ffc0ef54 goto out_locked; if (LIBIO_NODELAY(iop)) { ret = -EAGAIN; ffc0ef50: 3b 60 ff f5 li r27,-11 PIPE_WAKEUPWRITERS(pipe); read += chunk; } out_locked: PIPE_UNLOCK(pipe); ffc0ef54: 80 7f 00 28 lwz r3,40(r31) ffc0ef58: 4b ff ad f5 bl ffc09d4c ffc0ef5c: 48 00 00 08 b ffc0ef64 PIPE_UNLOCK(pipe); if (! PIPE_READWAIT(pipe)) ret = -EINTR; if (! PIPE_LOCK(pipe)) { /* WARN waitingReaders not restored! */ ret = -EINTR; ffc0ef60: 3b 60 ff fc li r27,-4 <== NOT EXECUTED out_locked: PIPE_UNLOCK(pipe); out_nolock: if (read > 0) ffc0ef64: 2f 9c 00 00 cmpwi cr7,r28,0 ffc0ef68: 40 9d 00 08 ble- cr7,ffc0ef70 ffc0ef6c: 7f 9b e3 78 mr r27,r28 return read; return ret; } ffc0ef70: 39 61 00 38 addi r11,r1,56 ffc0ef74: 7f 63 db 78 mr r3,r27 ffc0ef78: 48 01 24 a8 b ffc21420 <_restgpr_24_x> =============================================================================== ffc0e900 : */ void pipe_release( pipe_control_t **pipep, rtems_libio_t *iop ) { ffc0e900: 94 21 ff d8 stwu r1,-40(r1) ffc0e904: 7c 08 02 a6 mflr r0 ffc0e908: 90 01 00 2c stw r0,44(r1) /* WARN pipe not released! */ if (!PIPE_LOCK(pipe)) rtems_fatal_error_occurred(0xdeadbeef); #endif mode = LIBIO_ACCMODE(iop); ffc0e90c: 80 04 00 18 lwz r0,24(r4) */ void pipe_release( pipe_control_t **pipep, rtems_libio_t *iop ) { ffc0e910: bf 81 00 18 stmw r28,24(r1) ffc0e914: 7c 7e 1b 78 mr r30,r3 if (!PIPE_LOCK(pipe)) rtems_fatal_error_occurred(0xdeadbeef); #endif mode = LIBIO_ACCMODE(iop); if (mode & LIBIO_FLAGS_READ) ffc0e918: 70 09 00 02 andi. r9,r0,2 void pipe_release( pipe_control_t **pipep, rtems_libio_t *iop ) { pipe_control_t *pipe = *pipep; ffc0e91c: 83 e3 00 00 lwz r31,0(r3) /* WARN pipe not released! */ if (!PIPE_LOCK(pipe)) rtems_fatal_error_occurred(0xdeadbeef); #endif mode = LIBIO_ACCMODE(iop); ffc0e920: 54 1d 07 7c rlwinm r29,r0,0,29,30 if (mode & LIBIO_FLAGS_READ) ffc0e924: 41 82 00 10 beq- ffc0e934 pipe->Readers --; ffc0e928: 81 3f 00 10 lwz r9,16(r31) ffc0e92c: 38 09 ff ff addi r0,r9,-1 ffc0e930: 90 1f 00 10 stw r0,16(r31) if (mode & LIBIO_FLAGS_WRITE) ffc0e934: 73 a0 00 04 andi. r0,r29,4 ffc0e938: 41 82 00 10 beq- ffc0e948 pipe->Writers --; ffc0e93c: 81 3f 00 14 lwz r9,20(r31) ffc0e940: 38 09 ff ff addi r0,r9,-1 ffc0e944: 90 1f 00 14 stw r0,20(r31) PIPE_UNLOCK(pipe); ffc0e948: 80 7f 00 28 lwz r3,40(r31) ffc0e94c: 4b ff b4 01 bl ffc09d4c if (pipe->Readers == 0 && pipe->Writers == 0) { ffc0e950: 80 1f 00 10 lwz r0,16(r31) ffc0e954: 2f 80 00 00 cmpwi cr7,r0,0 ffc0e958: 40 9e 00 30 bne- cr7,ffc0e988 ffc0e95c: 83 9f 00 14 lwz r28,20(r31) ffc0e960: 2f 9c 00 00 cmpwi cr7,r28,0 ffc0e964: 40 be 00 14 bne+ cr7,ffc0e978 #if 0 /* To delete an anonymous pipe file when all users closed it */ if (pipe->Anonymous) delfile = TRUE; #endif pipe_free(pipe); ffc0e968: 7f e3 fb 78 mr r3,r31 ffc0e96c: 4b ff ff 4d bl ffc0e8b8 *pipep = NULL; ffc0e970: 93 9e 00 00 stw r28,0(r30) ffc0e974: 48 00 00 34 b ffc0e9a8 } else if (pipe->Readers == 0 && mode != LIBIO_FLAGS_WRITE) ffc0e978: 2f 9d 00 04 cmpwi cr7,r29,4 ffc0e97c: 41 be 00 0c beq+ cr7,ffc0e988 <== NEVER TAKEN /* Notify waiting Writers that all their partners left */ PIPE_WAKEUPWRITERS(pipe); ffc0e980: 80 7f 00 30 lwz r3,48(r31) ffc0e984: 48 00 00 1c b ffc0e9a0 else if (pipe->Writers == 0 && mode != LIBIO_FLAGS_READ) ffc0e988: 80 1f 00 14 lwz r0,20(r31) ffc0e98c: 2f 80 00 00 cmpwi cr7,r0,0 ffc0e990: 40 9e 00 18 bne- cr7,ffc0e9a8 <== NEVER TAKEN ffc0e994: 2f 9d 00 02 cmpwi cr7,r29,2 ffc0e998: 41 9e 00 10 beq- cr7,ffc0e9a8 <== NEVER TAKEN PIPE_WAKEUPREADERS(pipe); ffc0e99c: 80 7f 00 2c lwz r3,44(r31) ffc0e9a0: 38 81 00 08 addi r4,r1,8 ffc0e9a4: 48 00 1d cd bl ffc10770 pipe_unlock(); ffc0e9a8: 4b ff fe e9 bl ffc0e890 iop->flags &= ~LIBIO_FLAGS_OPEN; if(iop->pathinfo.ops->unlink_h(&iop->pathinfo)) return; #endif } ffc0e9ac: 39 61 00 28 addi r11,r1,40 ffc0e9b0: 48 01 2a 80 b ffc21430 <_restgpr_28_x> =============================================================================== ffc0ef7c : pipe_control_t *pipe, const void *buffer, size_t count, rtems_libio_t *iop ) { ffc0ef7c: 94 21 ff c0 stwu r1,-64(r1) ffc0ef80: 7c 08 02 a6 mflr r0 ffc0ef84: be e1 00 1c stmw r23,28(r1) int chunk, chunk1, written = 0, ret = 0; /* Write nothing */ if (count == 0) ffc0ef88: 7c bb 2b 79 mr. r27,r5 pipe_control_t *pipe, const void *buffer, size_t count, rtems_libio_t *iop ) { ffc0ef8c: 7c 7f 1b 78 mr r31,r3 ffc0ef90: 90 01 00 44 stw r0,68(r1) ffc0ef94: 7c 9e 23 78 mr r30,r4 ffc0ef98: 7c d7 33 78 mr r23,r6 int chunk, chunk1, written = 0, ret = 0; /* Write nothing */ if (count == 0) return 0; ffc0ef9c: 3b 80 00 00 li r28,0 ) { int chunk, chunk1, written = 0, ret = 0; /* Write nothing */ if (count == 0) ffc0efa0: 41 a2 01 bc beq+ ffc0f15c <== NEVER TAKEN return 0; if (! PIPE_LOCK(pipe)) ffc0efa4: 80 63 00 28 lwz r3,40(r3) ffc0efa8: 38 80 00 00 li r4,0 ffc0efac: 38 a0 00 00 li r5,0 ffc0efb0: 4b ff ac 75 bl ffc09c24 return -EINTR; ffc0efb4: 3b 80 ff fc li r28,-4 /* Write nothing */ if (count == 0) return 0; if (! PIPE_LOCK(pipe)) ffc0efb8: 2f 83 00 00 cmpwi cr7,r3,0 ffc0efbc: 40 9e 01 a0 bne- cr7,ffc0f15c <== NEVER TAKEN return -EINTR; if (pipe->Readers == 0) { ffc0efc0: 80 1f 00 10 lwz r0,16(r31) ffc0efc4: 2f 80 00 00 cmpwi cr7,r0,0 ffc0efc8: 41 9e 01 4c beq- cr7,ffc0f114 ret = -EPIPE; goto out_locked; } /* Write of PIPE_BUF bytes or less shall not be interleaved */ chunk = count <= pipe->Size ? count : 1; ffc0efcc: 80 1f 00 04 lwz r0,4(r31) ffc0efd0: 3b 20 00 01 li r25,1 ffc0efd4: 7f 9b 00 40 cmplw cr7,r27,r0 ffc0efd8: 41 9d 00 08 bgt- cr7,ffc0efe0 <== NEVER TAKEN ffc0efdc: 7f 79 db 78 mr r25,r27 /* Wait until there is chunk bytes space or no reader exists */ pipe->waitingWriters ++; PIPE_UNLOCK(pipe); if (! PIPE_WRITEWAIT(pipe)) ret = -EINTR; ffc0efe0: 3b a0 00 00 li r29,0 else memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk); pipe->Length += chunk; if (pipe->waitingReaders > 0) PIPE_WAKEUPREADERS(pipe); ffc0efe4: 3b 01 00 08 addi r24,r1,8 ffc0efe8: 48 00 01 1c b ffc0f104 /* 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)) { ffc0efec: 80 17 00 18 lwz r0,24(r23) ffc0eff0: 70 09 00 01 andi. r9,r0,1 ffc0eff4: 40 82 01 2c bne- ffc0f120 ret = -EAGAIN; goto out_locked; } /* Wait until there is chunk bytes space or no reader exists */ pipe->waitingWriters ++; ffc0eff8: 81 3f 00 1c lwz r9,28(r31) PIPE_UNLOCK(pipe); if (! PIPE_WRITEWAIT(pipe)) ret = -EINTR; ffc0effc: 3b 80 ff fc li r28,-4 goto out_locked; } /* Wait until there is chunk bytes space or no reader exists */ pipe->waitingWriters ++; PIPE_UNLOCK(pipe); ffc0f000: 80 7f 00 28 lwz r3,40(r31) ret = -EAGAIN; goto out_locked; } /* Wait until there is chunk bytes space or no reader exists */ pipe->waitingWriters ++; ffc0f004: 38 09 00 01 addi r0,r9,1 ffc0f008: 90 1f 00 1c stw r0,28(r31) PIPE_UNLOCK(pipe); ffc0f00c: 4b ff ad 41 bl ffc09d4c if (! PIPE_WRITEWAIT(pipe)) ffc0f010: 80 7f 00 30 lwz r3,48(r31) ffc0f014: 38 80 00 00 li r4,0 ffc0f018: 48 00 17 c5 bl ffc107dc ffc0f01c: 2f 83 00 00 cmpwi cr7,r3,0 ffc0f020: 40 9e 00 08 bne- cr7,ffc0f028 <== NEVER TAKEN ffc0f024: 3b 80 00 00 li r28,0 ret = -EINTR; if (! PIPE_LOCK(pipe)) { ffc0f028: 80 7f 00 28 lwz r3,40(r31) ffc0f02c: 38 80 00 00 li r4,0 ffc0f030: 38 a0 00 00 li r5,0 ffc0f034: 4b ff ab f1 bl ffc09c24 ffc0f038: 2f 83 00 00 cmpwi cr7,r3,0 ffc0f03c: 40 9e 01 10 bne- cr7,ffc0f14c <== NEVER TAKEN /* WARN waitingWriters not restored! */ ret = -EINTR; goto out_nolock; } pipe->waitingWriters --; if (ret != 0) ffc0f040: 2f 9c 00 00 cmpwi cr7,r28,0 if (! PIPE_LOCK(pipe)) { /* WARN waitingWriters not restored! */ ret = -EINTR; goto out_nolock; } pipe->waitingWriters --; ffc0f044: 81 3f 00 1c lwz r9,28(r31) ffc0f048: 38 09 ff ff addi r0,r9,-1 ffc0f04c: 90 1f 00 1c stw r0,28(r31) if (ret != 0) ffc0f050: 40 9e 00 dc bne- cr7,ffc0f12c <== NEVER TAKEN goto out_locked; if (pipe->Readers == 0) { ffc0f054: 80 1f 00 10 lwz r0,16(r31) ffc0f058: 2f 80 00 00 cmpwi cr7,r0,0 ffc0f05c: 41 9e 00 cc beq- cr7,ffc0f128 <== 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) { ffc0f060: 83 5f 00 04 lwz r26,4(r31) ffc0f064: 80 1f 00 0c lwz r0,12(r31) ffc0f068: 7f 80 d0 50 subf r28,r0,r26 ffc0f06c: 7f 9c c8 40 cmplw cr7,r28,r25 ffc0f070: 41 9c ff 7c blt+ cr7,ffc0efec ret = -EPIPE; goto out_locked; } } chunk = MIN(count - written, PIPE_SPACE(pipe)); ffc0f074: 7d 3d d8 50 subf r9,r29,r27 ffc0f078: 7f 9c 48 40 cmplw cr7,r28,r9 ffc0f07c: 40 9d 00 08 ble- cr7,ffc0f084 ffc0f080: 7d 3c 4b 78 mr r28,r9 chunk1 = pipe->Size - PIPE_WSTART(pipe); ffc0f084: 81 3f 00 08 lwz r9,8(r31) ffc0f088: 7c 9e ea 14 add r4,r30,r29 ffc0f08c: 80 7f 00 00 lwz r3,0(r31) ffc0f090: 7d 20 4a 14 add r9,r0,r9 ffc0f094: 7c 09 d3 96 divwu r0,r9,r26 ffc0f098: 7c 00 d1 d6 mullw r0,r0,r26 ffc0f09c: 7c 00 48 50 subf r0,r0,r9 ffc0f0a0: 7f 40 d0 50 subf r26,r0,r26 if (chunk > chunk1) { ffc0f0a4: 7f 9c d0 00 cmpw cr7,r28,r26 ffc0f0a8: 40 9d 00 24 ble- cr7,ffc0f0cc memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk1); ffc0f0ac: 7f 45 d3 78 mr r5,r26 ffc0f0b0: 7c 63 02 14 add r3,r3,r0 ffc0f0b4: 48 00 4c 21 bl ffc13cd4 memcpy(pipe->Buffer, buffer + written + chunk1, chunk - chunk1); ffc0f0b8: 7c 9a ea 14 add r4,r26,r29 ffc0f0bc: 80 7f 00 00 lwz r3,0(r31) ffc0f0c0: 7c 9e 22 14 add r4,r30,r4 ffc0f0c4: 7c ba e0 50 subf r5,r26,r28 ffc0f0c8: 48 00 00 0c b ffc0f0d4 } else memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk); ffc0f0cc: 7c 63 02 14 add r3,r3,r0 ffc0f0d0: 7f 85 e3 78 mr r5,r28 ffc0f0d4: 48 00 4c 01 bl ffc13cd4 pipe->Length += chunk; ffc0f0d8: 80 1f 00 0c lwz r0,12(r31) ffc0f0dc: 7c 00 e2 14 add r0,r0,r28 ffc0f0e0: 90 1f 00 0c stw r0,12(r31) if (pipe->waitingReaders > 0) ffc0f0e4: 80 1f 00 18 lwz r0,24(r31) ffc0f0e8: 2f 80 00 00 cmpwi cr7,r0,0 ffc0f0ec: 41 be 00 10 beq+ cr7,ffc0f0fc PIPE_WAKEUPREADERS(pipe); ffc0f0f0: 80 7f 00 2c lwz r3,44(r31) ffc0f0f4: 7f 04 c3 78 mr r4,r24 ffc0f0f8: 48 00 16 79 bl ffc10770 written += chunk; ffc0f0fc: 7f bd e2 14 add r29,r29,r28 /* Write of more than PIPE_BUF bytes can be interleaved */ chunk = 1; ffc0f100: 3b 20 00 01 li r25,1 } /* Write of PIPE_BUF bytes or less shall not be interleaved */ chunk = count <= pipe->Size ? count : 1; while (written < count) { ffc0f104: 7f 9d d8 40 cmplw cr7,r29,r27 ffc0f108: 41 9c ff 58 blt+ cr7,ffc0f060 ffc0f10c: 3b 80 00 00 li r28,0 ffc0f110: 48 00 00 1c b ffc0f12c if (! PIPE_LOCK(pipe)) return -EINTR; if (pipe->Readers == 0) { ret = -EPIPE; ffc0f114: 3b 80 ff e0 li r28,-32 const void *buffer, size_t count, rtems_libio_t *iop ) { int chunk, chunk1, written = 0, ret = 0; ffc0f118: 3b a0 00 00 li r29,0 ffc0f11c: 48 00 00 10 b ffc0f12c chunk = count <= pipe->Size ? count : 1; while (written < count) { while (PIPE_SPACE(pipe) < chunk) { if (LIBIO_NODELAY(iop)) { ret = -EAGAIN; ffc0f120: 3b 80 ff f5 li r28,-11 ffc0f124: 48 00 00 08 b ffc0f12c pipe->waitingWriters --; if (ret != 0) goto out_locked; if (pipe->Readers == 0) { ret = -EPIPE; ffc0f128: 3b 80 ff e0 li r28,-32 <== NOT EXECUTED /* Write of more than PIPE_BUF bytes can be interleaved */ chunk = 1; } out_locked: PIPE_UNLOCK(pipe); ffc0f12c: 80 7f 00 28 lwz r3,40(r31) ffc0f130: 4b ff ac 1d bl ffc09d4c out_nolock: #ifdef RTEMS_POSIX_API /* Signal SIGPIPE */ if (ret == -EPIPE) ffc0f134: 2f 9c ff e0 cmpwi cr7,r28,-32 ffc0f138: 40 be 00 18 bne+ cr7,ffc0f150 kill(getpid(), SIGPIPE); ffc0f13c: 48 00 08 6d bl ffc0f9a8 ffc0f140: 38 80 00 0d li r4,13 ffc0f144: 48 00 0b d5 bl ffc0fd18 ffc0f148: 48 00 00 08 b ffc0f150 PIPE_UNLOCK(pipe); if (! PIPE_WRITEWAIT(pipe)) ret = -EINTR; if (! PIPE_LOCK(pipe)) { /* WARN waitingWriters not restored! */ ret = -EINTR; ffc0f14c: 3b 80 ff fc li r28,-4 <== NOT EXECUTED /* Signal SIGPIPE */ if (ret == -EPIPE) kill(getpid(), SIGPIPE); #endif if (written > 0) ffc0f150: 2f 9d 00 00 cmpwi cr7,r29,0 ffc0f154: 40 9d 00 08 ble- cr7,ffc0f15c ffc0f158: 7f bc eb 78 mr r28,r29 return written; return ret; } ffc0f15c: 39 61 00 40 addi r11,r1,64 ffc0f160: 7f 83 e3 78 mr r3,r28 ffc0f164: 48 01 22 b8 b ffc2141c <_restgpr_23_x> =============================================================================== ffc087c4 : int posix_memalign( void **pointer, size_t alignment, size_t size ) { ffc087c4: 94 21 ff f8 stwu r1,-8(r1) ffc087c8: 7c 08 02 a6 mflr r0 /* * Update call statistics */ MSBUMP(memalign_calls, 1); ffc087cc: 3d 60 00 00 lis r11,0 int posix_memalign( void **pointer, size_t alignment, size_t size ) { ffc087d0: 90 01 00 0c stw r0,12(r1) /* * Update call statistics */ MSBUMP(memalign_calls, 1); ffc087d4: 39 6b 34 48 addi r11,r11,13384 ffc087d8: 81 4b 00 08 lwz r10,8(r11) ffc087dc: 38 0a 00 01 addi r0,r10,1 ffc087e0: 90 0b 00 08 stw r0,8(r11) if (((alignment - 1) & alignment) != 0 || (alignment < sizeof(void *))) ffc087e4: 39 64 ff ff addi r11,r4,-1 ffc087e8: 7d 6a 20 39 and. r10,r11,r4 return EINVAL; ffc087ec: 38 00 00 16 li r0,22 /* * Update call statistics */ MSBUMP(memalign_calls, 1); if (((alignment - 1) & alignment) != 0 || (alignment < sizeof(void *))) ffc087f0: 40 82 00 14 bne- ffc08804 <== NEVER TAKEN ffc087f4: 2b 84 00 03 cmplwi cr7,r4,3 ffc087f8: 40 bd 00 0c ble+ cr7,ffc08804 /* * rtems_memalign does all of the error checking work EXCEPT * for adding restrictionso on the alignment. */ return rtems_memalign( pointer, alignment, size ); ffc087fc: 48 00 02 e9 bl ffc08ae4 ffc08800: 7c 60 1b 78 mr r0,r3 } ffc08804: 7c 03 03 78 mr r3,r0 ffc08808: 80 01 00 0c lwz r0,12(r1) ffc0880c: 38 21 00 08 addi r1,r1,8 ffc08810: 7c 08 03 a6 mtlr r0 ffc08814: 4e 80 00 20 blr =============================================================================== ffc05ff0 : * printk * * Kernel printf function requiring minimal infrastructure. */ void printk(const char *fmt, ...) { ffc05ff0: 94 21 ff 88 stwu r1,-120(r1) ffc05ff4: 7c 08 02 a6 mflr r0 ffc05ff8: 90 81 00 1c stw r4,28(r1) ffc05ffc: 90 01 00 7c stw r0,124(r1) ffc06000: 90 a1 00 20 stw r5,32(r1) ffc06004: 90 c1 00 24 stw r6,36(r1) ffc06008: 90 e1 00 28 stw r7,40(r1) ffc0600c: 91 01 00 2c stw r8,44(r1) ffc06010: 91 21 00 30 stw r9,48(r1) ffc06014: 91 41 00 34 stw r10,52(r1) ffc06018: 40 86 00 24 bne- cr1,ffc0603c <== ALWAYS TAKEN ffc0601c: d8 21 00 38 stfd f1,56(r1) <== NOT EXECUTED ffc06020: d8 41 00 40 stfd f2,64(r1) <== NOT EXECUTED ffc06024: d8 61 00 48 stfd f3,72(r1) <== NOT EXECUTED ffc06028: d8 81 00 50 stfd f4,80(r1) <== NOT EXECUTED ffc0602c: d8 a1 00 58 stfd f5,88(r1) <== NOT EXECUTED ffc06030: d8 c1 00 60 stfd f6,96(r1) <== NOT EXECUTED ffc06034: d8 e1 00 68 stfd f7,104(r1) <== NOT EXECUTED ffc06038: d9 01 00 70 stfd f8,112(r1) <== NOT EXECUTED va_list ap; /* points to each unnamed argument in turn */ va_start(ap, fmt); /* make ap point to 1st unnamed arg */ ffc0603c: 38 00 00 01 li r0,1 ffc06040: 98 01 00 08 stb r0,8(r1) ffc06044: 38 00 00 00 li r0,0 vprintk(fmt, ap); ffc06048: 38 81 00 08 addi r4,r1,8 */ void printk(const char *fmt, ...) { va_list ap; /* points to each unnamed argument in turn */ va_start(ap, fmt); /* make ap point to 1st unnamed arg */ ffc0604c: 98 01 00 09 stb r0,9(r1) ffc06050: 38 01 00 80 addi r0,r1,128 ffc06054: 90 01 00 0c stw r0,12(r1) ffc06058: 38 01 00 18 addi r0,r1,24 ffc0605c: 90 01 00 10 stw r0,16(r1) vprintk(fmt, ap); ffc06060: 48 00 1f e5 bl ffc08044 va_end(ap); /* clean up when done */ } ffc06064: 80 01 00 7c lwz r0,124(r1) ffc06068: 38 21 00 78 addi r1,r1,120 ffc0606c: 7c 08 03 a6 mtlr r0 ffc06070: 4e 80 00 20 blr =============================================================================== ffc06834 : int printk_plugin( void *ignored __attribute__((unused)), const char *format, ... ) { ffc06834: 94 21 ff 90 stwu r1,-112(r1) ffc06838: 7c 08 02 a6 mflr r0 ffc0683c: 90 a1 00 18 stw r5,24(r1) ffc06840: 90 01 00 74 stw r0,116(r1) ffc06844: 90 c1 00 1c stw r6,28(r1) ffc06848: 90 e1 00 20 stw r7,32(r1) ffc0684c: 91 01 00 24 stw r8,36(r1) ffc06850: 91 21 00 28 stw r9,40(r1) ffc06854: 91 41 00 2c stw r10,44(r1) ffc06858: 40 86 00 24 bne- cr1,ffc0687c <== ALWAYS TAKEN ffc0685c: d8 21 00 30 stfd f1,48(r1) <== NOT EXECUTED ffc06860: d8 41 00 38 stfd f2,56(r1) <== NOT EXECUTED ffc06864: d8 61 00 40 stfd f3,64(r1) <== NOT EXECUTED ffc06868: d8 81 00 48 stfd f4,72(r1) <== NOT EXECUTED ffc0686c: d8 a1 00 50 stfd f5,80(r1) <== NOT EXECUTED ffc06870: d8 c1 00 58 stfd f6,88(r1) <== NOT EXECUTED ffc06874: d8 e1 00 60 stfd f7,96(r1) <== NOT EXECUTED ffc06878: d9 01 00 68 stfd f8,104(r1) <== NOT EXECUTED va_list arg_pointer; va_start (arg_pointer, format); ffc0687c: 38 00 00 02 li r0,2 ffc06880: 98 01 00 08 stb r0,8(r1) ffc06884: 38 00 00 00 li r0,0 vprintk( format, arg_pointer ); ffc06888: 7c 83 23 78 mr r3,r4 ... ) { va_list arg_pointer; va_start (arg_pointer, format); ffc0688c: 98 01 00 09 stb r0,9(r1) ffc06890: 38 01 00 78 addi r0,r1,120 vprintk( format, arg_pointer ); ffc06894: 38 81 00 08 addi r4,r1,8 ... ) { va_list arg_pointer; va_start (arg_pointer, format); ffc06898: 90 01 00 0c stw r0,12(r1) ffc0689c: 38 01 00 10 addi r0,r1,16 ffc068a0: 90 01 00 10 stw r0,16(r1) vprintk( format, arg_pointer ); ffc068a4: 48 00 1d 59 bl ffc085fc va_end(arg_pointer); /* clean up when done */ return 0; } ffc068a8: 38 60 00 00 li r3,0 ffc068ac: 80 01 00 74 lwz r0,116(r1) ffc068b0: 38 21 00 70 addi r1,r1,112 ffc068b4: 7c 08 03 a6 mtlr r0 ffc068b8: 4e 80 00 20 blr =============================================================================== ffc0d654 : int pthread_attr_setschedpolicy( pthread_attr_t *attr, int policy ) { if ( !attr || !attr->is_initialized ) ffc0d654: 2c 03 00 00 cmpwi r3,0 return EINVAL; ffc0d658: 38 00 00 16 li r0,22 int pthread_attr_setschedpolicy( pthread_attr_t *attr, int policy ) { if ( !attr || !attr->is_initialized ) ffc0d65c: 41 82 00 38 beq- ffc0d694 ffc0d660: 81 23 00 00 lwz r9,0(r3) ffc0d664: 2f 89 00 00 cmpwi cr7,r9,0 ffc0d668: 41 9e 00 2c beq- cr7,ffc0d694 return EINVAL; switch ( policy ) { ffc0d66c: 2b 84 00 04 cmplwi cr7,r4,4 ffc0d670: 41 9d 00 20 bgt- cr7,ffc0d690 ffc0d674: 38 00 00 01 li r0,1 ffc0d678: 7c 00 20 30 slw r0,r0,r4 ffc0d67c: 70 09 00 17 andi. r9,r0,23 ffc0d680: 41 82 00 10 beq- ffc0d690 <== NEVER TAKEN case SCHED_OTHER: case SCHED_FIFO: case SCHED_RR: case SCHED_SPORADIC: attr->schedpolicy = policy; ffc0d684: 90 83 00 14 stw r4,20(r3) return 0; ffc0d688: 38 00 00 00 li r0,0 ffc0d68c: 48 00 00 08 b ffc0d694 default: return ENOTSUP; ffc0d690: 38 00 00 86 li r0,134 } } ffc0d694: 7c 03 03 78 mr r3,r0 ffc0d698: 4e 80 00 20 blr =============================================================================== ffc07fc4 : int pthread_barrier_init( pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count ) { ffc07fc4: 94 21 ff d8 stwu r1,-40(r1) ffc07fc8: 7c 08 02 a6 mflr r0 ffc07fcc: bf 81 00 18 stmw r28,24(r1) const pthread_barrierattr_t *the_attr; /* * Error check parameters */ if ( !barrier ) ffc07fd0: 7c 7c 1b 79 mr. r28,r3 int pthread_barrier_init( pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count ) { ffc07fd4: 7c bf 2b 78 mr r31,r5 ffc07fd8: 90 01 00 2c stw r0,44(r1) /* * Error check parameters */ if ( !barrier ) return EINVAL; ffc07fdc: 38 00 00 16 li r0,22 const pthread_barrierattr_t *the_attr; /* * Error check parameters */ if ( !barrier ) ffc07fe0: 41 82 00 a8 beq- ffc08088 return EINVAL; if ( count == 0 ) ffc07fe4: 2f 85 00 00 cmpwi cr7,r5,0 ffc07fe8: 41 9e 00 a0 beq- cr7,ffc08088 return EINVAL; /* * If the user passed in NULL, use the default attributes */ if ( attr ) { ffc07fec: 2f 84 00 00 cmpwi cr7,r4,0 ffc07ff0: 7c 9e 23 78 mr r30,r4 ffc07ff4: 40 be 00 10 bne+ cr7,ffc08004 the_attr = attr; } else { (void) pthread_barrierattr_init( &my_attr ); ffc07ff8: 3b c1 00 10 addi r30,r1,16 ffc07ffc: 7f c3 f3 78 mr r3,r30 ffc08000: 4b ff fe e9 bl ffc07ee8 } /* * Now start error checking the attributes that we are going to use */ if ( !the_attr->is_initialized ) ffc08004: 81 3e 00 00 lwz r9,0(r30) return EINVAL; ffc08008: 38 00 00 16 li r0,22 } /* * Now start error checking the attributes that we are going to use */ if ( !the_attr->is_initialized ) ffc0800c: 2f 89 00 00 cmpwi cr7,r9,0 ffc08010: 41 9e 00 78 beq- cr7,ffc08088 return EINVAL; switch ( the_attr->process_shared ) { ffc08014: 83 de 00 04 lwz r30,4(r30) ffc08018: 2f 9e 00 00 cmpwi cr7,r30,0 ffc0801c: 40 9e 00 6c bne- cr7,ffc08088 <== NEVER TAKEN rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; ffc08020: 3d 20 00 00 lis r9,0 } /* * Convert from POSIX attributes to Core Barrier attributes */ the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE; ffc08024: 93 c1 00 08 stw r30,8(r1) ffc08028: 81 69 28 14 lwz r11,10260(r9) the_attributes.maximum_count = count; ffc0802c: 93 e1 00 0c stw r31,12(r1) ffc08030: 38 0b 00 01 addi r0,r11,1 ffc08034: 90 09 28 14 stw r0,10260(r9) * 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 ); ffc08038: 3f a0 00 00 lis r29,0 ffc0803c: 3b bd 2f ac addi r29,r29,12204 ffc08040: 7f a3 eb 78 mr r3,r29 ffc08044: 48 00 23 a9 bl ffc0a3ec <_Objects_Allocate> */ _Thread_Disable_dispatch(); /* prevents deletion */ the_barrier = _POSIX_Barrier_Allocate(); if ( !the_barrier ) { ffc08048: 7c 7f 1b 79 mr. r31,r3 ffc0804c: 40 a2 00 10 bne+ ffc0805c _Thread_Enable_dispatch(); ffc08050: 48 00 36 9d bl ffc0b6ec <_Thread_Enable_dispatch> return EAGAIN; ffc08054: 38 00 00 0b li r0,11 ffc08058: 48 00 00 30 b ffc08088 } _CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes ); ffc0805c: 38 7f 00 10 addi r3,r31,16 ffc08060: 38 81 00 08 addi r4,r1,8 ffc08064: 48 00 18 fd bl ffc09960 <_CORE_barrier_Initialize> uint32_t name ) { _Objects_Set_local_object( information, _Objects_Get_index( the_object->id ), ffc08068: 80 1f 00 08 lwz r0,8(r31) #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; ffc0806c: 81 7d 00 1c lwz r11,28(r29) ffc08070: 54 09 13 ba rlwinm r9,r0,2,14,29 ffc08074: 7f eb 49 2e stwx r31,r11,r9 _Objects_Get_index( the_object->id ), the_object ); /* ASSERT: information->is_string == false */ the_object->name.name_u32 = name; ffc08078: 93 df 00 0c stw r30,12(r31) ); /* * Exit the critical section and return the user an operational barrier */ *barrier = the_barrier->Object.id; ffc0807c: 90 1c 00 00 stw r0,0(r28) _Thread_Enable_dispatch(); ffc08080: 48 00 36 6d bl ffc0b6ec <_Thread_Enable_dispatch> return 0; ffc08084: 38 00 00 00 li r0,0 } ffc08088: 39 61 00 28 addi r11,r1,40 ffc0808c: 7c 03 03 78 mr r3,r0 ffc08090: 4b ff 8e 9c b ffc00f2c <_restgpr_28_x> =============================================================================== ffc07638 : void pthread_cleanup_push( void (*routine)( void * ), void *arg ) { ffc07638: 94 21 ff f0 stwu r1,-16(r1) ffc0763c: 7c 08 02 a6 mflr r0 ffc07640: bf c1 00 08 stmw r30,8(r1) /* * 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 ) ffc07644: 7c 7e 1b 79 mr. r30,r3 void pthread_cleanup_push( void (*routine)( void * ), void *arg ) { ffc07648: 7c 9f 23 78 mr r31,r4 ffc0764c: 90 01 00 14 stw r0,20(r1) /* * 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 ) ffc07650: 41 82 00 48 beq- ffc07698 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; ffc07654: 3d 20 00 00 lis r9,0 ffc07658: 81 69 28 0c lwz r11,10252(r9) ffc0765c: 38 0b 00 01 addi r0,r11,1 ffc07660: 90 09 28 0c stw r0,10252(r9) return; _Thread_Disable_dispatch(); handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) ); ffc07664: 38 60 00 10 li r3,16 ffc07668: 48 00 4b 61 bl ffc0c1c8 <_Workspace_Allocate> if ( handler ) { ffc0766c: 7c 69 1b 79 mr. r9,r3 ffc07670: 41 82 00 24 beq- ffc07694 <== NEVER TAKEN thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; ffc07674: 3d 60 00 00 lis r11,0 ffc07678: 81 6b 31 10 lwz r11,12560(r11) handler_stack = &thread_support->Cancellation_Handlers; handler->routine = routine; handler->arg = arg; _Chain_Append( handler_stack, &handler->Node ); ffc0767c: 7d 24 4b 78 mr r4,r9 handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) ); if ( handler ) { thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; handler_stack = &thread_support->Cancellation_Handlers; ffc07680: 80 6b 01 34 lwz r3,308(r11) handler->routine = routine; ffc07684: 93 c9 00 08 stw r30,8(r9) handler->arg = arg; _Chain_Append( handler_stack, &handler->Node ); ffc07688: 38 63 00 e4 addi r3,r3,228 thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; handler_stack = &thread_support->Cancellation_Handlers; handler->routine = routine; handler->arg = arg; ffc0768c: 93 e9 00 0c stw r31,12(r9) _Chain_Append( handler_stack, &handler->Node ); ffc07690: 48 00 19 f9 bl ffc09088 <_Chain_Append> } _Thread_Enable_dispatch(); ffc07694: 48 00 37 39 bl ffc0adcc <_Thread_Enable_dispatch> } ffc07698: 39 61 00 10 addi r11,r1,16 ffc0769c: 48 00 ed 50 b ffc163ec <_restgpr_30_x> =============================================================================== ffc0895c : int pthread_cond_init( pthread_cond_t *cond, const pthread_condattr_t *attr ) { ffc0895c: 94 21 ff e8 stwu r1,-24(r1) ffc08960: 7c 08 02 a6 mflr r0 ffc08964: bf 81 00 08 stmw r28,8(r1) POSIX_Condition_variables_Control *the_cond; const pthread_condattr_t *the_attr; if ( attr ) the_attr = attr; ffc08968: 7c 9e 23 79 mr. r30,r4 int pthread_cond_init( pthread_cond_t *cond, const pthread_condattr_t *attr ) { ffc0896c: 7c 7c 1b 78 mr r28,r3 ffc08970: 90 01 00 1c stw r0,28(r1) POSIX_Condition_variables_Control *the_cond; const pthread_condattr_t *the_attr; if ( attr ) the_attr = attr; ffc08974: 40 a2 00 0c bne+ ffc08980 else the_attr = &_POSIX_Condition_variables_Default_attributes; ffc08978: 3f c0 00 00 lis r30,0 ffc0897c: 3b de 27 88 addi r30,r30,10120 /* * Be careful about attributes when global!!! */ if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED ) ffc08980: 80 1e 00 04 lwz r0,4(r30) return EINVAL; ffc08984: 38 60 00 16 li r3,22 else the_attr = &_POSIX_Condition_variables_Default_attributes; /* * Be careful about attributes when global!!! */ if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED ) ffc08988: 2f 80 00 01 cmpwi cr7,r0,1 ffc0898c: 41 9e 00 8c beq- cr7,ffc08a18 <== NEVER TAKEN return EINVAL; if ( !the_attr->is_initialized ) ffc08990: 80 1e 00 00 lwz r0,0(r30) ffc08994: 2f 80 00 00 cmpwi cr7,r0,0 ffc08998: 41 be 00 80 beq+ cr7,ffc08a18 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; ffc0899c: 3d 20 00 00 lis r9,0 ffc089a0: 81 69 28 40 lwz r11,10304(r9) ffc089a4: 38 0b 00 01 addi r0,r11,1 ffc089a8: 90 09 28 40 stw r0,10304(r9) RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control *_POSIX_Condition_variables_Allocate( void ) { return (POSIX_Condition_variables_Control *) _Objects_Allocate( &_POSIX_Condition_variables_Information ); ffc089ac: 3f a0 00 00 lis r29,0 ffc089b0: 3b bd 30 64 addi r29,r29,12388 ffc089b4: 7f a3 eb 78 mr r3,r29 ffc089b8: 48 00 29 f9 bl ffc0b3b0 <_Objects_Allocate> _Thread_Disable_dispatch(); the_cond = _POSIX_Condition_variables_Allocate(); if ( !the_cond ) { ffc089bc: 7c 7f 1b 79 mr. r31,r3 ffc089c0: 40 a2 00 10 bne+ ffc089d0 _Thread_Enable_dispatch(); ffc089c4: 48 00 3c ed bl ffc0c6b0 <_Thread_Enable_dispatch> return ENOMEM; ffc089c8: 38 60 00 0c li r3,12 ffc089cc: 48 00 00 4c b ffc08a18 } the_cond->process_shared = the_attr->process_shared; ffc089d0: 80 1e 00 04 lwz r0,4(r30) the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX; ffc089d4: 3b c0 00 00 li r30,0 ffc089d8: 93 df 00 14 stw r30,20(r31) _Thread_queue_Initialize( ffc089dc: 3c a0 10 00 lis r5,4096 ffc089e0: 38 7f 00 18 addi r3,r31,24 if ( !the_cond ) { _Thread_Enable_dispatch(); return ENOMEM; } the_cond->process_shared = the_attr->process_shared; ffc089e4: 90 1f 00 10 stw r0,16(r31) the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX; _Thread_queue_Initialize( ffc089e8: 38 80 00 00 li r4,0 ffc089ec: 60 a5 08 00 ori r5,r5,2048 ffc089f0: 38 c0 00 74 li r6,116 ffc089f4: 48 00 45 45 bl ffc0cf38 <_Thread_queue_Initialize> uint32_t name ) { _Objects_Set_local_object( information, _Objects_Get_index( the_object->id ), ffc089f8: 80 1f 00 08 lwz r0,8(r31) #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; ffc089fc: 81 7d 00 1c lwz r11,28(r29) ffc08a00: 54 09 13 ba rlwinm r9,r0,2,14,29 ffc08a04: 7f eb 49 2e stwx r31,r11,r9 _Objects_Get_index( the_object->id ), the_object ); /* ASSERT: information->is_string == false */ the_object->name.name_u32 = name; ffc08a08: 93 df 00 0c stw r30,12(r31) &_POSIX_Condition_variables_Information, &the_cond->Object, 0 ); *cond = the_cond->Object.id; ffc08a0c: 90 1c 00 00 stw r0,0(r28) _Thread_Enable_dispatch(); ffc08a10: 48 00 3c a1 bl ffc0c6b0 <_Thread_Enable_dispatch> return 0; ffc08a14: 38 60 00 00 li r3,0 } ffc08a18: 39 61 00 18 addi r11,r1,24 ffc08a1c: 4b ff 8d b8 b ffc017d4 <_restgpr_28_x> =============================================================================== ffc087b4 : int pthread_condattr_destroy( pthread_condattr_t *attr ) { if ( !attr || attr->is_initialized == false ) ffc087b4: 2c 03 00 00 cmpwi r3,0 return EINVAL; ffc087b8: 38 00 00 16 li r0,22 int pthread_condattr_destroy( pthread_condattr_t *attr ) { if ( !attr || attr->is_initialized == false ) ffc087bc: 41 82 00 18 beq- ffc087d4 ffc087c0: 81 23 00 00 lwz r9,0(r3) ffc087c4: 2f 89 00 00 cmpwi cr7,r9,0 ffc087c8: 41 9e 00 0c beq- cr7,ffc087d4 <== NEVER TAKEN return EINVAL; attr->is_initialized = false; ffc087cc: 38 00 00 00 li r0,0 ffc087d0: 90 03 00 00 stw r0,0(r3) return 0; } ffc087d4: 7c 03 03 78 mr r3,r0 ffc087d8: 4e 80 00 20 blr =============================================================================== ffc07c08 : pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)( void * ), void *arg ) { ffc07c08: 94 21 ff 88 stwu r1,-120(r1) ffc07c0c: 7c 08 02 a6 mflr r0 ffc07c10: be c1 00 50 stmw r22,80(r1) int schedpolicy = SCHED_RR; struct sched_param schedparam; Objects_Name name; int rc; if ( !start_routine ) ffc07c14: 7c b8 2b 79 mr. r24,r5 pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)( void * ), void *arg ) { ffc07c18: 7c 7a 1b 78 mr r26,r3 ffc07c1c: 90 01 00 7c stw r0,124(r1) ffc07c20: 7c d9 33 78 mr r25,r6 struct sched_param schedparam; Objects_Name name; int rc; if ( !start_routine ) return EFAULT; ffc07c24: 3b c0 00 0e li r30,14 int schedpolicy = SCHED_RR; struct sched_param schedparam; Objects_Name name; int rc; if ( !start_routine ) ffc07c28: 41 82 02 0c beq- ffc07e34 return EFAULT; the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes; ffc07c2c: 2f 84 00 00 cmpwi cr7,r4,0 ffc07c30: 7c 9f 23 78 mr r31,r4 ffc07c34: 40 be 00 0c bne+ cr7,ffc07c40 ffc07c38: 3f e0 ff c2 lis r31,-62 ffc07c3c: 3b ff ef 58 addi r31,r31,-4264 if ( !the_attr->is_initialized ) ffc07c40: 80 1f 00 00 lwz r0,0(r31) return EINVAL; ffc07c44: 3b c0 00 16 li r30,22 if ( !start_routine ) return EFAULT; the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes; if ( !the_attr->is_initialized ) ffc07c48: 2f 80 00 00 cmpwi cr7,r0,0 ffc07c4c: 41 9e 01 e8 beq- cr7,ffc07e34 * 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) ) ffc07c50: 80 1f 00 04 lwz r0,4(r31) ffc07c54: 2f 80 00 00 cmpwi cr7,r0,0 ffc07c58: 41 9e 00 18 beq- cr7,ffc07c70 ffc07c5c: 3d 60 00 00 lis r11,0 ffc07c60: 81 3f 00 08 lwz r9,8(r31) ffc07c64: 80 0b 27 48 lwz r0,10056(r11) ffc07c68: 7f 89 00 40 cmplw cr7,r9,r0 ffc07c6c: 41 9c 01 c8 blt- cr7,ffc07e34 * 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 ) { ffc07c70: 80 1f 00 10 lwz r0,16(r31) ffc07c74: 2f 80 00 01 cmpwi cr7,r0,1 ffc07c78: 41 9e 00 14 beq- cr7,ffc07c8c ffc07c7c: 2f 80 00 02 cmpwi cr7,r0,2 schedpolicy = the_attr->schedpolicy; schedparam = the_attr->schedparam; break; default: return EINVAL; ffc07c80: 3b c0 00 16 li r30,22 * 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 ) { ffc07c84: 40 be 01 b0 bne+ cr7,ffc07e34 ffc07c88: 48 00 00 1c b ffc07ca4 case PTHREAD_INHERIT_SCHED: api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; ffc07c8c: 3d 20 00 00 lis r9,0 ffc07c90: 81 29 31 10 lwz r9,12560(r9) ffc07c94: 80 69 01 34 lwz r3,308(r9) schedpolicy = api->schedpolicy; ffc07c98: 83 63 00 84 lwz r27,132(r3) schedparam = api->schedparam; ffc07c9c: 38 63 00 88 addi r3,r3,136 ffc07ca0: 48 00 00 0c b ffc07cac break; case PTHREAD_EXPLICIT_SCHED: schedpolicy = the_attr->schedpolicy; ffc07ca4: 83 7f 00 14 lwz r27,20(r31) schedparam = the_attr->schedparam; ffc07ca8: 38 7f 00 18 addi r3,r31,24 ffc07cac: 38 81 00 20 addi r4,r1,32 ffc07cb0: 7c a3 e4 aa lswi r5,r3,28 ffc07cb4: 7c a4 e5 aa stswi r5,r4,28 /* * 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; ffc07cb8: 3b c0 00 86 li r30,134 /* * Check the contentionscope since rtems only supports PROCESS wide * contention (i.e. no system wide contention). */ if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS ) ffc07cbc: 80 1f 00 0c lwz r0,12(r31) ffc07cc0: 2f 80 00 00 cmpwi cr7,r0,0 ffc07cc4: 40 9e 01 70 bne- cr7,ffc07e34 return ENOTSUP; /* * Interpret the scheduling parameters. */ if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) ) ffc07cc8: 80 61 00 20 lwz r3,32(r1) return EINVAL; ffc07ccc: 3b c0 00 16 li r30,22 return ENOTSUP; /* * Interpret the scheduling parameters. */ if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) ) ffc07cd0: 48 00 6a 7d bl ffc0e74c <_POSIX_Priority_Is_valid> ffc07cd4: 2f 83 00 00 cmpwi cr7,r3,0 ffc07cd8: 41 be 01 5c beq+ cr7,ffc07e34 <== NEVER TAKEN return EINVAL; core_priority = _POSIX_Priority_To_core( schedparam.sched_priority ); ffc07cdc: 7c 24 0b 78 mr r4,r1 ffc07ce0: 86 e4 00 20 lwzu r23,32(r4) RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core( int priority ) { return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1); ffc07ce4: 3d 20 00 00 lis r9,0 /* * Set the core scheduling policy information. */ rc = _POSIX_Thread_Translate_sched_param( ffc07ce8: 7f 63 db 78 mr r3,r27 ffc07cec: 8a c9 27 4c lbz r22,10060(r9) ffc07cf0: 38 a1 00 18 addi r5,r1,24 ffc07cf4: 38 c1 00 1c addi r6,r1,28 ffc07cf8: 48 00 6a 7d bl ffc0e774 <_POSIX_Thread_Translate_sched_param> schedpolicy, &schedparam, &budget_algorithm, &budget_callout ); if ( rc ) ffc07cfc: 7c 7e 1b 79 mr. r30,r3 ffc07d00: 40 a2 01 34 bne+ ffc07e34 #endif /* * Lock the allocator mutex for protection */ _RTEMS_Lock_allocator(); ffc07d04: 3f a0 00 00 lis r29,0 ffc07d08: 80 7d 28 34 lwz r3,10292(r29) ffc07d0c: 48 00 1a 21 bl ffc0972c <_API_Mutex_Lock> * _POSIX_Threads_Allocate */ RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void ) { return (Thread_Control *) _Objects_Allocate( &_POSIX_Threads_Information ); ffc07d10: 3c 60 00 00 lis r3,0 ffc07d14: 38 63 2e 0c addi r3,r3,11788 ffc07d18: 48 00 25 21 bl ffc0a238 <_Objects_Allocate> * Allocate the thread control block. * * NOTE: Global threads are not currently supported. */ the_thread = _POSIX_Threads_Allocate(); if ( !the_thread ) { ffc07d1c: 7c 7c 1b 79 mr. r28,r3 ffc07d20: 40 a2 00 0c bne+ ffc07d2c _RTEMS_Unlock_allocator(); ffc07d24: 80 7d 28 34 lwz r3,10292(r29) ffc07d28: 48 00 00 80 b ffc07da8 static inline size_t _POSIX_Threads_Ensure_minimum_stack ( size_t size ) { if ( size >= PTHREAD_MINIMUM_STACK_SIZE ) ffc07d2c: 3d 20 00 00 lis r9,0 /* * Initialize the core thread for this task. */ name.name_p = NULL; /* posix threads don't have a name by default */ status = _Thread_Initialize( ffc07d30: 80 1f 00 08 lwz r0,8(r31) static inline size_t _POSIX_Threads_Ensure_minimum_stack ( size_t size ) { if ( size >= PTHREAD_MINIMUM_STACK_SIZE ) ffc07d34: 80 c9 27 48 lwz r6,10056(r9) /* * Initialize the core thread for this task. */ name.name_p = NULL; /* posix threads don't have a name by default */ status = _Thread_Initialize( ffc07d38: 80 bf 00 04 lwz r5,4(r31) static inline size_t _POSIX_Threads_Ensure_minimum_stack ( size_t size ) { if ( size >= PTHREAD_MINIMUM_STACK_SIZE ) ffc07d3c: 54 c6 08 3c rlwinm r6,r6,1,0,30 /* * Initialize the core thread for this task. */ name.name_p = NULL; /* posix threads don't have a name by default */ status = _Thread_Initialize( ffc07d40: 7f 86 00 40 cmplw cr7,r6,r0 ffc07d44: 40 9c 00 08 bge- cr7,ffc07d4c ffc07d48: 7c 06 03 78 mr r6,r0 ffc07d4c: 38 00 00 00 li r0,0 ffc07d50: 81 61 00 1c lwz r11,28(r1) ffc07d54: 7c 29 0b 78 mr r9,r1 ffc07d58: 81 41 00 18 lwz r10,24(r1) ffc07d5c: 94 09 00 48 stwu r0,72(r9) ffc07d60: 3f a0 00 00 lis r29,0 ffc07d64: 3b bd 2e 0c addi r29,r29,11788 ffc07d68: 91 21 00 10 stw r9,16(r1) ffc07d6c: 7f a3 eb 78 mr r3,r29 ffc07d70: 7f 84 e3 78 mr r4,r28 ffc07d74: 38 e0 00 01 li r7,1 ffc07d78: 91 61 00 08 stw r11,8(r1) ffc07d7c: 7d 17 b0 50 subf r8,r23,r22 ffc07d80: 39 20 00 01 li r9,1 ffc07d84: 90 01 00 0c stw r0,12(r1) ffc07d88: 48 00 38 7d bl ffc0b604 <_Thread_Initialize> budget_callout, 0, /* isr level */ name /* posix threads don't have a name */ ); if ( !status ) { ffc07d8c: 2f 83 00 00 cmpwi cr7,r3,0 ffc07d90: 40 9e 00 24 bne- cr7,ffc07db4 RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free ( Thread_Control *the_pthread ) { _Objects_Free( &_POSIX_Threads_Information, &the_pthread->Object ); ffc07d94: 7f a3 eb 78 mr r3,r29 ffc07d98: 7f 84 e3 78 mr r4,r28 ffc07d9c: 48 00 28 0d bl ffc0a5a8 <_Objects_Free> _POSIX_Threads_Free( the_thread ); _RTEMS_Unlock_allocator(); ffc07da0: 3d 20 00 00 lis r9,0 ffc07da4: 80 69 28 34 lwz r3,10292(r9) ffc07da8: 48 00 1a 09 bl ffc097b0 <_API_Mutex_Unlock> return EAGAIN; ffc07dac: 3b c0 00 0b li r30,11 ffc07db0: 48 00 00 84 b ffc07e34 } /* * finish initializing the per API structure */ api = the_thread->API_Extensions[ THREAD_API_POSIX ]; ffc07db4: 83 bc 01 34 lwz r29,308(r28) api->Attributes = *the_attr; ffc07db8: 38 a0 00 40 li r5,64 ffc07dbc: 7f e4 fb 78 mr r4,r31 ffc07dc0: 7f a3 eb 78 mr r3,r29 ffc07dc4: 48 00 a0 71 bl ffc11e34 api->detachstate = the_attr->detachstate; ffc07dc8: 80 1f 00 3c lwz r0,60(r31) api->schedpolicy = schedpolicy; ffc07dcc: 93 7d 00 84 stw r27,132(r29) api->schedparam = schedparam; ffc07dd0: 38 9d 00 88 addi r4,r29,136 ffc07dd4: 38 61 00 20 addi r3,r1,32 * finish initializing the per API structure */ api = the_thread->API_Extensions[ THREAD_API_POSIX ]; api->Attributes = *the_attr; api->detachstate = the_attr->detachstate; ffc07dd8: 90 1d 00 40 stw r0,64(r29) api->schedpolicy = schedpolicy; api->schedparam = schedparam; ffc07ddc: 7c a3 e4 aa lswi r5,r3,28 ffc07de0: 7c a4 e5 aa stswi r5,r4,28 /* * POSIX threads are allocated and started in one operation. */ status = _Thread_Start( ffc07de4: 7f 83 e3 78 mr r3,r28 ffc07de8: 38 80 00 01 li r4,1 ffc07dec: 7f 05 c3 78 mr r5,r24 ffc07df0: 7f 26 cb 78 mr r6,r25 ffc07df4: 38 e0 00 00 li r7,0 ffc07df8: 48 00 42 75 bl ffc0c06c <_Thread_Start> _RTEMS_Unlock_allocator(); return EINVAL; } #endif if ( schedpolicy == SCHED_SPORADIC ) { ffc07dfc: 2f 9b 00 04 cmpwi cr7,r27,4 ffc07e00: 40 be 00 20 bne+ cr7,ffc07e20 _Watchdog_Insert_ticks( ffc07e04: 38 7d 00 90 addi r3,r29,144 ffc07e08: 48 00 44 45 bl ffc0c24c <_Timespec_To_ticks> ) { the_watchdog->initial = units; _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); ffc07e0c: 38 9d 00 a8 addi r4,r29,168 Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; ffc07e10: 90 7d 00 b4 stw r3,180(r29) _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); ffc07e14: 3c 60 00 00 lis r3,0 ffc07e18: 38 63 2d 28 addi r3,r3,11560 ffc07e1c: 48 00 48 1d bl ffc0c638 <_Watchdog_Insert> } /* * Return the id and indicate we successfully created the thread */ *thread = the_thread->Object.id; ffc07e20: 80 1c 00 08 lwz r0,8(r28) _RTEMS_Unlock_allocator(); ffc07e24: 3d 20 00 00 lis r9,0 ffc07e28: 80 69 28 34 lwz r3,10292(r9) } /* * Return the id and indicate we successfully created the thread */ *thread = the_thread->Object.id; ffc07e2c: 90 1a 00 00 stw r0,0(r26) _RTEMS_Unlock_allocator(); ffc07e30: 48 00 19 81 bl ffc097b0 <_API_Mutex_Unlock> return 0; } ffc07e34: 39 61 00 78 addi r11,r1,120 ffc07e38: 7f c3 f3 78 mr r3,r30 ffc07e3c: 4b ff 8d 84 b ffc00bc0 <_restgpr_22_x> =============================================================================== ffc25b58 : int pthread_kill( pthread_t thread, int sig ) { ffc25b58: 94 21 ff d8 stwu r1,-40(r1) ffc25b5c: 7c 08 02 a6 mflr r0 ffc25b60: bf 81 00 18 stmw r28,24(r1) POSIX_API_Control *api; Thread_Control *the_thread; Objects_Locations location; if ( !sig ) ffc25b64: 7c 9d 23 79 mr. r29,r4 int pthread_kill( pthread_t thread, int sig ) { ffc25b68: 90 01 00 2c stw r0,44(r1) POSIX_API_Control *api; Thread_Control *the_thread; Objects_Locations location; if ( !sig ) ffc25b6c: 41 82 00 10 beq- ffc25b7c static inline bool is_valid_signo( int signo ) { return ((signo) >= 1 && (signo) <= 32 ); ffc25b70: 3b 9d ff ff addi r28,r29,-1 rtems_set_errno_and_return_minus_one( EINVAL ); if ( !is_valid_signo(sig) ) ffc25b74: 2b 9c 00 1f cmplwi cr7,r28,31 ffc25b78: 40 bd 00 10 ble+ cr7,ffc25b88 rtems_set_errno_and_return_minus_one( EINVAL ); ffc25b7c: 4b ff 03 d1 bl ffc15f4c <__errno> ffc25b80: 38 00 00 16 li r0,22 ffc25b84: 48 00 00 94 b ffc25c18 the_thread = _Thread_Get( thread, &location ); ffc25b88: 38 81 00 08 addi r4,r1,8 ffc25b8c: 4b fe a3 05 bl ffc0fe90 <_Thread_Get> switch ( location ) { ffc25b90: 80 01 00 08 lwz r0,8(r1) rtems_set_errno_and_return_minus_one( EINVAL ); if ( !is_valid_signo(sig) ) rtems_set_errno_and_return_minus_one( EINVAL ); the_thread = _Thread_Get( thread, &location ); ffc25b94: 7c 7e 1b 78 mr r30,r3 switch ( location ) { ffc25b98: 2f 80 00 00 cmpwi cr7,r0,0 ffc25b9c: 40 9e 00 74 bne- cr7,ffc25c10 <== NEVER TAKEN api = the_thread->API_Extensions[ THREAD_API_POSIX ]; if ( sig ) { if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) { ffc25ba0: 1c 1d 00 0c mulli r0,r29,12 case OBJECTS_LOCAL: /* * If sig == 0 then just validate arguments */ api = the_thread->API_Extensions[ THREAD_API_POSIX ]; ffc25ba4: 81 23 01 34 lwz r9,308(r3) if ( sig ) { if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) { ffc25ba8: 3d 60 00 00 lis r11,0 ffc25bac: 39 6b 32 e0 addi r11,r11,13024 ffc25bb0: 7d 6b 02 14 add r11,r11,r0 ffc25bb4: 80 0b 00 08 lwz r0,8(r11) ffc25bb8: 2f 80 00 01 cmpwi cr7,r0,1 ffc25bbc: 41 9e 00 48 beq- cr7,ffc25c04 return 0; } /* XXX critical section */ api->signals_pending |= signo_to_mask( sig ); ffc25bc0: 80 09 00 d4 lwz r0,212(r9) static inline sigset_t signo_to_mask( uint32_t sig ) { return 1u << (sig - 1); ffc25bc4: 3b e0 00 01 li r31,1 ffc25bc8: 7f fc e0 30 slw r28,r31,r28 ffc25bcc: 7c 1c e3 78 or r28,r0,r28 ffc25bd0: 93 89 00 d4 stw r28,212(r9) (void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL ); ffc25bd4: 7f a4 eb 78 mr r4,r29 ffc25bd8: 38 a0 00 00 li r5,0 ffc25bdc: 4b ff fe 4d bl ffc25a28 <_POSIX_signals_Unblock_thread> if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) ) ffc25be0: 3d 20 00 00 lis r9,0 ffc25be4: 39 29 32 84 addi r9,r9,12932 ffc25be8: 80 09 00 08 lwz r0,8(r9) ffc25bec: 2f 80 00 00 cmpwi cr7,r0,0 ffc25bf0: 41 9e 00 14 beq- cr7,ffc25c04 ffc25bf4: 80 09 00 0c lwz r0,12(r9) ffc25bf8: 7f 9e 00 00 cmpw cr7,r30,r0 ffc25bfc: 40 be 00 08 bne+ cr7,ffc25c04 _Thread_Dispatch_necessary = true; ffc25c00: 9b e9 00 18 stb r31,24(r9) } _Thread_Enable_dispatch(); ffc25c04: 4b fe a2 6d bl ffc0fe70 <_Thread_Enable_dispatch> return 0; ffc25c08: 38 60 00 00 li r3,0 ffc25c0c: 48 00 00 14 b ffc25c20 #endif case OBJECTS_ERROR: break; } rtems_set_errno_and_return_minus_one( ESRCH ); ffc25c10: 4b ff 03 3d bl ffc15f4c <__errno> <== NOT EXECUTED ffc25c14: 38 00 00 03 li r0,3 <== NOT EXECUTED ffc25c18: 90 03 00 00 stw r0,0(r3) ffc25c1c: 38 60 ff ff li r3,-1 } ffc25c20: 39 61 00 28 addi r11,r1,40 ffc25c24: 4b fd c3 68 b ffc01f8c <_restgpr_28_x> =============================================================================== ffc0a164 : int pthread_mutex_timedlock( pthread_mutex_t *mutex, const struct timespec *abstime ) { ffc0a164: 94 21 ff d8 stwu r1,-40(r1) ffc0a168: 7c 08 02 a6 mflr r0 ffc0a16c: bf a1 00 1c stmw r29,28(r1) ffc0a170: 7c 7d 1b 78 mr r29,r3 * * 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 ); ffc0a174: 7c 83 23 78 mr r3,r4 ffc0a178: 38 81 00 08 addi r4,r1,8 int pthread_mutex_timedlock( pthread_mutex_t *mutex, const struct timespec *abstime ) { ffc0a17c: 90 01 00 2c stw r0,44(r1) * * 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 ); ffc0a180: 48 00 00 f5 bl ffc0a274 <_POSIX_Absolute_timeout_to_ticks> 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, ffc0a184: 68 7f 00 03 xori r31,r3,3 if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE ) do_wait = false; lock_status = _POSIX_Mutex_Lock_support( mutex, do_wait, ticks ); ffc0a188: 80 a1 00 08 lwz r5,8(r1) ffc0a18c: 7f ff 00 34 cntlzw r31,r31 ffc0a190: 57 ff d9 7e rlwinm r31,r31,27,5,31 * * 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 ); ffc0a194: 7c 7e 1b 78 mr r30,r3 if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE ) do_wait = false; lock_status = _POSIX_Mutex_Lock_support( mutex, do_wait, ticks ); ffc0a198: 7f e4 fb 78 mr r4,r31 ffc0a19c: 7f a3 eb 78 mr r3,r29 ffc0a1a0: 4b ff fe c1 bl ffc0a060 <_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) ) { ffc0a1a4: 2f 9f 00 00 cmpwi cr7,r31,0 ffc0a1a8: 40 9e 00 30 bne- cr7,ffc0a1d8 ffc0a1ac: 2f 83 00 10 cmpwi cr7,r3,16 ffc0a1b0: 40 be 00 28 bne+ cr7,ffc0a1d8 <== NEVER TAKEN if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID ) ffc0a1b4: 2f 9e 00 00 cmpwi cr7,r30,0 ffc0a1b8: 41 9e 00 14 beq- cr7,ffc0a1cc <== NEVER TAKEN return EINVAL; if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST || ffc0a1bc: 3b de ff ff addi r30,r30,-1 ffc0a1c0: 2b 9e 00 01 cmplwi cr7,r30,1 ffc0a1c4: 41 bd 00 14 bgt+ cr7,ffc0a1d8 <== NEVER TAKEN ffc0a1c8: 48 00 00 0c b ffc0a1d4 * 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; ffc0a1cc: 38 60 00 16 li r3,22 <== NOT EXECUTED ffc0a1d0: 48 00 00 08 b ffc0a1d8 <== NOT EXECUTED if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST || status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; ffc0a1d4: 38 60 00 74 li r3,116 } return lock_status; } ffc0a1d8: 39 61 00 28 addi r11,r1,40 ffc0a1dc: 4b ff 89 a8 b ffc02b84 <_restgpr_29_x> =============================================================================== ffc09ce4 : int pthread_mutexattr_setpshared( pthread_mutexattr_t *attr, int pshared ) { if ( !attr || !attr->is_initialized ) ffc09ce4: 2c 03 00 00 cmpwi r3,0 return EINVAL; ffc09ce8: 38 00 00 16 li r0,22 int pthread_mutexattr_setpshared( pthread_mutexattr_t *attr, int pshared ) { if ( !attr || !attr->is_initialized ) ffc09cec: 41 82 00 20 beq- ffc09d0c ffc09cf0: 81 23 00 00 lwz r9,0(r3) ffc09cf4: 2f 89 00 00 cmpwi cr7,r9,0 ffc09cf8: 41 9e 00 14 beq- cr7,ffc09d0c return EINVAL; switch ( pshared ) { ffc09cfc: 2b 84 00 01 cmplwi cr7,r4,1 ffc09d00: 41 9d 00 0c bgt- cr7,ffc09d0c <== NEVER TAKEN case PTHREAD_PROCESS_SHARED: case PTHREAD_PROCESS_PRIVATE: attr->process_shared = pshared; ffc09d04: 90 83 00 04 stw r4,4(r3) return 0; ffc09d08: 38 00 00 00 li r0,0 default: return EINVAL; } } ffc09d0c: 7c 03 03 78 mr r3,r0 ffc09d10: 4e 80 00 20 blr =============================================================================== ffc0727c : int pthread_mutexattr_settype( pthread_mutexattr_t *attr, int type ) { if ( !attr || !attr->is_initialized ) ffc0727c: 2c 03 00 00 cmpwi r3,0 return EINVAL; ffc07280: 38 00 00 16 li r0,22 int pthread_mutexattr_settype( pthread_mutexattr_t *attr, int type ) { if ( !attr || !attr->is_initialized ) ffc07284: 41 82 00 20 beq- ffc072a4 ffc07288: 81 23 00 00 lwz r9,0(r3) ffc0728c: 2f 89 00 00 cmpwi cr7,r9,0 ffc07290: 41 9e 00 14 beq- cr7,ffc072a4 <== NEVER TAKEN return EINVAL; switch ( type ) { ffc07294: 2b 84 00 03 cmplwi cr7,r4,3 ffc07298: 41 9d 00 0c bgt- cr7,ffc072a4 case PTHREAD_MUTEX_NORMAL: case PTHREAD_MUTEX_RECURSIVE: case PTHREAD_MUTEX_ERRORCHECK: case PTHREAD_MUTEX_DEFAULT: attr->type = type; ffc0729c: 90 83 00 10 stw r4,16(r3) return 0; ffc072a0: 38 00 00 00 li r0,0 default: return EINVAL; } } ffc072a4: 7c 03 03 78 mr r3,r0 ffc072a8: 4e 80 00 20 blr =============================================================================== ffc082a8 : int pthread_once( pthread_once_t *once_control, void (*init_routine)(void) ) { ffc082a8: 94 21 ff e0 stwu r1,-32(r1) ffc082ac: 7c 08 02 a6 mflr r0 ffc082b0: bf c1 00 18 stmw r30,24(r1) if ( !once_control || !init_routine ) ffc082b4: 7c 7f 1b 79 mr. r31,r3 int pthread_once( pthread_once_t *once_control, void (*init_routine)(void) ) { ffc082b8: 7c 9e 23 78 mr r30,r4 ffc082bc: 90 01 00 24 stw r0,36(r1) if ( !once_control || !init_routine ) return EINVAL; ffc082c0: 38 00 00 16 li r0,22 int pthread_once( pthread_once_t *once_control, void (*init_routine)(void) ) { if ( !once_control || !init_routine ) ffc082c4: 41 82 00 60 beq- ffc08324 ffc082c8: 2f 84 00 00 cmpwi cr7,r4,0 ffc082cc: 41 9e 00 58 beq- cr7,ffc08324 return EINVAL; if ( !once_control->init_executed ) { ffc082d0: 81 3f 00 04 lwz r9,4(r31) once_control->init_executed = true; (*init_routine)(); } rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); } return 0; ffc082d4: 38 00 00 00 li r0,0 ) { if ( !once_control || !init_routine ) return EINVAL; if ( !once_control->init_executed ) { ffc082d8: 2f 89 00 00 cmpwi cr7,r9,0 ffc082dc: 40 be 00 48 bne+ cr7,ffc08324 rtems_mode saveMode; rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode); ffc082e0: 38 60 01 00 li r3,256 ffc082e4: 38 80 01 00 li r4,256 ffc082e8: 38 a1 00 08 addi r5,r1,8 ffc082ec: 48 00 0c b5 bl ffc08fa0 if ( !once_control->init_executed ) { ffc082f0: 80 1f 00 04 lwz r0,4(r31) ffc082f4: 2f 80 00 00 cmpwi cr7,r0,0 ffc082f8: 40 be 00 18 bne+ cr7,ffc08310 <== NEVER TAKEN once_control->is_initialized = true; ffc082fc: 38 00 00 01 li r0,1 once_control->init_executed = true; (*init_routine)(); ffc08300: 7f c9 03 a6 mtctr r30 if ( !once_control->init_executed ) { rtems_mode saveMode; rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode); if ( !once_control->init_executed ) { once_control->is_initialized = true; ffc08304: 90 1f 00 00 stw r0,0(r31) once_control->init_executed = true; ffc08308: 90 1f 00 04 stw r0,4(r31) (*init_routine)(); ffc0830c: 4e 80 04 21 bctrl } rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); ffc08310: 7c 25 0b 78 mr r5,r1 ffc08314: 84 65 00 08 lwzu r3,8(r5) ffc08318: 38 80 01 00 li r4,256 ffc0831c: 48 00 0c 85 bl ffc08fa0 } return 0; ffc08320: 38 00 00 00 li r0,0 } ffc08324: 39 61 00 20 addi r11,r1,32 ffc08328: 7c 03 03 78 mr r3,r0 ffc0832c: 4b ff 88 b4 b ffc00be0 <_restgpr_30_x> =============================================================================== ffc08e9c : int pthread_rwlock_init( pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr ) { ffc08e9c: 94 21 ff d8 stwu r1,-40(r1) ffc08ea0: 7c 08 02 a6 mflr r0 ffc08ea4: bf 81 00 18 stmw r28,24(r1) const pthread_rwlockattr_t *the_attr; /* * Error check parameters */ if ( !rwlock ) ffc08ea8: 7c 7c 1b 79 mr. r28,r3 int pthread_rwlock_init( pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr ) { ffc08eac: 90 01 00 2c stw r0,44(r1) /* * Error check parameters */ if ( !rwlock ) return EINVAL; ffc08eb0: 38 00 00 16 li r0,22 const pthread_rwlockattr_t *the_attr; /* * Error check parameters */ if ( !rwlock ) ffc08eb4: 41 82 00 9c beq- ffc08f50 return EINVAL; /* * If the user passed in NULL, use the default attributes */ if ( attr ) { ffc08eb8: 2f 84 00 00 cmpwi cr7,r4,0 ffc08ebc: 7c 9f 23 78 mr r31,r4 ffc08ec0: 40 be 00 10 bne+ cr7,ffc08ed0 the_attr = attr; } else { (void) pthread_rwlockattr_init( &default_attr ); ffc08ec4: 3b e1 00 0c addi r31,r1,12 ffc08ec8: 7f e3 fb 78 mr r3,r31 ffc08ecc: 48 00 0a 41 bl ffc0990c } /* * Now start error checking the attributes that we are going to use */ if ( !the_attr->is_initialized ) ffc08ed0: 81 3f 00 00 lwz r9,0(r31) return EINVAL; ffc08ed4: 38 00 00 16 li r0,22 } /* * Now start error checking the attributes that we are going to use */ if ( !the_attr->is_initialized ) ffc08ed8: 2f 89 00 00 cmpwi cr7,r9,0 ffc08edc: 41 9e 00 74 beq- cr7,ffc08f50 <== NEVER TAKEN return EINVAL; switch ( the_attr->process_shared ) { ffc08ee0: 83 df 00 04 lwz r30,4(r31) ffc08ee4: 2f 9e 00 00 cmpwi cr7,r30,0 ffc08ee8: 40 9e 00 68 bne- cr7,ffc08f50 <== NEVER TAKEN rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; ffc08eec: 3d 20 00 00 lis r9,0 */ RTEMS_INLINE_ROUTINE void _CORE_RWLock_Initialize_attributes( CORE_RWLock_Attributes *the_attributes ) { the_attributes->XXX = 0; ffc08ef0: 93 c1 00 08 stw r30,8(r1) ffc08ef4: 81 69 28 14 lwz r11,10260(r9) ffc08ef8: 38 0b 00 01 addi r0,r11,1 ffc08efc: 90 09 28 14 stw r0,10260(r9) * 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 ); ffc08f00: 3f a0 00 00 lis r29,0 ffc08f04: 3b bd 2d ec addi r29,r29,11756 ffc08f08: 7f a3 eb 78 mr r3,r29 ffc08f0c: 48 00 2a 11 bl ffc0b91c <_Objects_Allocate> */ _Thread_Disable_dispatch(); /* prevents deletion */ the_rwlock = _POSIX_RWLock_Allocate(); if ( !the_rwlock ) { ffc08f10: 7c 7f 1b 79 mr. r31,r3 ffc08f14: 40 a2 00 10 bne+ ffc08f24 _Thread_Enable_dispatch(); ffc08f18: 48 00 3d 05 bl ffc0cc1c <_Thread_Enable_dispatch> return EAGAIN; ffc08f1c: 38 00 00 0b li r0,11 ffc08f20: 48 00 00 30 b ffc08f50 } _CORE_RWLock_Initialize( &the_rwlock->RWLock, &the_attributes ); ffc08f24: 38 7f 00 10 addi r3,r31,16 ffc08f28: 38 81 00 08 addi r4,r1,8 ffc08f2c: 48 00 20 75 bl ffc0afa0 <_CORE_RWLock_Initialize> uint32_t name ) { _Objects_Set_local_object( information, _Objects_Get_index( the_object->id ), ffc08f30: 80 1f 00 08 lwz r0,8(r31) #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; ffc08f34: 81 7d 00 1c lwz r11,28(r29) ffc08f38: 54 09 13 ba rlwinm r9,r0,2,14,29 ffc08f3c: 7f eb 49 2e stwx r31,r11,r9 _Objects_Get_index( the_object->id ), the_object ); /* ASSERT: information->is_string == false */ the_object->name.name_u32 = name; ffc08f40: 93 df 00 0c stw r30,12(r31) &_POSIX_RWLock_Information, &the_rwlock->Object, 0 ); *rwlock = the_rwlock->Object.id; ffc08f44: 90 1c 00 00 stw r0,0(r28) _Thread_Enable_dispatch(); ffc08f48: 48 00 3c d5 bl ffc0cc1c <_Thread_Enable_dispatch> return 0; ffc08f4c: 38 00 00 00 li r0,0 } ffc08f50: 39 61 00 28 addi r11,r1,40 ffc08f54: 7c 03 03 78 mr r3,r0 ffc08f58: 4b ff 8e d8 b ffc01e30 <_restgpr_28_x> =============================================================================== ffc08fd4 : int pthread_rwlock_timedrdlock( pthread_rwlock_t *rwlock, const struct timespec *abstime ) { ffc08fd4: 94 21 ff d8 stwu r1,-40(r1) ffc08fd8: 7c 08 02 a6 mflr r0 ffc08fdc: bf 81 00 18 stmw r28,24(r1) Objects_Locations location; Watchdog_Interval ticks; bool do_wait = true; POSIX_Absolute_timeout_conversion_results_t status; if ( !rwlock ) ffc08fe0: 7c 7c 1b 79 mr. r28,r3 return EINVAL; ffc08fe4: 3b c0 00 16 li r30,22 int pthread_rwlock_timedrdlock( pthread_rwlock_t *rwlock, const struct timespec *abstime ) { ffc08fe8: 90 01 00 2c stw r0,44(r1) Objects_Locations location; Watchdog_Interval ticks; bool do_wait = true; POSIX_Absolute_timeout_conversion_results_t status; if ( !rwlock ) ffc08fec: 41 82 00 a4 beq- ffc09090 * * 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 ); ffc08ff0: 7c 83 23 78 mr r3,r4 ffc08ff4: 38 81 00 0c addi r4,r1,12 ffc08ff8: 48 00 6c 9d bl ffc0fc94 <_POSIX_Absolute_timeout_to_ticks> ffc08ffc: 80 9c 00 00 lwz r4,0(r28) ffc09000: 7c 7d 1b 78 mr r29,r3 ffc09004: 3c 60 00 00 lis r3,0 ffc09008: 38 63 2d ec addi r3,r3,11756 ffc0900c: 38 a1 00 08 addi r5,r1,8 ffc09010: 48 00 2e 19 bl ffc0be28 <_Objects_Get> if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE ) do_wait = false; the_rwlock = _POSIX_RWLock_Get( rwlock, &location ); switch ( location ) { ffc09014: 80 01 00 08 lwz r0,8(r1) ffc09018: 2f 80 00 00 cmpwi cr7,r0,0 ffc0901c: 40 9e 00 74 bne- cr7,ffc09090 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, ffc09020: 6b bf 00 03 xori r31,r29,3 case OBJECTS_LOCAL: _CORE_RWLock_Obtain_for_reading( ffc09024: 80 9c 00 00 lwz r4,0(r28) ffc09028: 7f ff 00 34 cntlzw r31,r31 ffc0902c: 80 c1 00 0c lwz r6,12(r1) ffc09030: 57 ff d9 7e rlwinm r31,r31,27,5,31 ffc09034: 38 63 00 10 addi r3,r3,16 ffc09038: 7f e5 fb 78 mr r5,r31 ffc0903c: 38 e0 00 00 li r7,0 ffc09040: 48 00 1f a1 bl ffc0afe0 <_CORE_RWLock_Obtain_for_reading> do_wait, ticks, NULL ); _Thread_Enable_dispatch(); ffc09044: 48 00 3b d9 bl ffc0cc1c <_Thread_Enable_dispatch> if ( !do_wait ) { ffc09048: 2f 9f 00 00 cmpwi cr7,r31,0 ffc0904c: 40 9e 00 30 bne- cr7,ffc0907c if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) { ffc09050: 3d 20 00 00 lis r9,0 ffc09054: 81 29 31 30 lwz r9,12592(r9) ffc09058: 80 09 00 34 lwz r0,52(r9) ffc0905c: 2f 80 00 02 cmpwi cr7,r0,2 ffc09060: 40 be 00 1c bne+ cr7,ffc0907c if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID ) ffc09064: 2f 9d 00 00 cmpwi cr7,r29,0 ffc09068: 41 9e 00 28 beq- cr7,ffc09090 <== NEVER TAKEN return EINVAL; if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST || ffc0906c: 3b bd ff ff addi r29,r29,-1 ffc09070: 2b 9d 00 01 cmplwi cr7,r29,1 status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; ffc09074: 3b c0 00 74 li r30,116 _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 || ffc09078: 40 9d 00 18 ble- cr7,ffc09090 <== ALWAYS TAKEN return ETIMEDOUT; } } return _POSIX_RWLock_Translate_core_RWLock_return_code( (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ffc0907c: 3d 20 00 00 lis r9,0 ffc09080: 81 29 31 30 lwz r9,12592(r9) status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; } } return _POSIX_RWLock_Translate_core_RWLock_return_code( ffc09084: 80 69 00 34 lwz r3,52(r9) ffc09088: 48 00 00 dd bl ffc09164 <_POSIX_RWLock_Translate_core_RWLock_return_code> ffc0908c: 7c 7e 1b 78 mr r30,r3 case OBJECTS_ERROR: break; } return EINVAL; } ffc09090: 39 61 00 28 addi r11,r1,40 ffc09094: 7f c3 f3 78 mr r3,r30 ffc09098: 4b ff 8d 98 b ffc01e30 <_restgpr_28_x> =============================================================================== ffc0909c : int pthread_rwlock_timedwrlock( pthread_rwlock_t *rwlock, const struct timespec *abstime ) { ffc0909c: 94 21 ff d8 stwu r1,-40(r1) ffc090a0: 7c 08 02 a6 mflr r0 ffc090a4: bf 81 00 18 stmw r28,24(r1) Objects_Locations location; Watchdog_Interval ticks; bool do_wait = true; POSIX_Absolute_timeout_conversion_results_t status; if ( !rwlock ) ffc090a8: 7c 7c 1b 79 mr. r28,r3 return EINVAL; ffc090ac: 3b c0 00 16 li r30,22 int pthread_rwlock_timedwrlock( pthread_rwlock_t *rwlock, const struct timespec *abstime ) { ffc090b0: 90 01 00 2c stw r0,44(r1) Objects_Locations location; Watchdog_Interval ticks; bool do_wait = true; POSIX_Absolute_timeout_conversion_results_t status; if ( !rwlock ) ffc090b4: 41 82 00 a4 beq- ffc09158 * * 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 ); ffc090b8: 7c 83 23 78 mr r3,r4 ffc090bc: 38 81 00 0c addi r4,r1,12 ffc090c0: 48 00 6b d5 bl ffc0fc94 <_POSIX_Absolute_timeout_to_ticks> ffc090c4: 80 9c 00 00 lwz r4,0(r28) ffc090c8: 7c 7d 1b 78 mr r29,r3 ffc090cc: 3c 60 00 00 lis r3,0 ffc090d0: 38 63 2d ec addi r3,r3,11756 ffc090d4: 38 a1 00 08 addi r5,r1,8 ffc090d8: 48 00 2d 51 bl ffc0be28 <_Objects_Get> if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE ) do_wait = false; the_rwlock = _POSIX_RWLock_Get( rwlock, &location ); switch ( location ) { ffc090dc: 80 01 00 08 lwz r0,8(r1) ffc090e0: 2f 80 00 00 cmpwi cr7,r0,0 ffc090e4: 40 9e 00 74 bne- cr7,ffc09158 (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, ffc090e8: 6b bf 00 03 xori r31,r29,3 case OBJECTS_LOCAL: _CORE_RWLock_Obtain_for_writing( ffc090ec: 80 9c 00 00 lwz r4,0(r28) ffc090f0: 7f ff 00 34 cntlzw r31,r31 ffc090f4: 80 c1 00 0c lwz r6,12(r1) ffc090f8: 57 ff d9 7e rlwinm r31,r31,27,5,31 ffc090fc: 38 63 00 10 addi r3,r3,16 ffc09100: 7f e5 fb 78 mr r5,r31 ffc09104: 38 e0 00 00 li r7,0 ffc09108: 48 00 1f b9 bl ffc0b0c0 <_CORE_RWLock_Obtain_for_writing> do_wait, ticks, NULL ); _Thread_Enable_dispatch(); ffc0910c: 48 00 3b 11 bl ffc0cc1c <_Thread_Enable_dispatch> if ( !do_wait && ffc09110: 2f 9f 00 00 cmpwi cr7,r31,0 ffc09114: 40 9e 00 30 bne- cr7,ffc09144 (_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) { ffc09118: 3d 20 00 00 lis r9,0 ffc0911c: 81 29 31 30 lwz r9,12592(r9) ticks, NULL ); _Thread_Enable_dispatch(); if ( !do_wait && ffc09120: 80 09 00 34 lwz r0,52(r9) ffc09124: 2f 80 00 02 cmpwi cr7,r0,2 ffc09128: 40 be 00 1c bne+ cr7,ffc09144 (_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) { if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID ) ffc0912c: 2f 9d 00 00 cmpwi cr7,r29,0 ffc09130: 41 9e 00 28 beq- cr7,ffc09158 <== NEVER TAKEN return EINVAL; if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST || ffc09134: 3b bd ff ff addi r29,r29,-1 ffc09138: 2b 9d 00 01 cmplwi cr7,r29,1 status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; ffc0913c: 3b c0 00 74 li r30,116 _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 || ffc09140: 40 9d 00 18 ble- cr7,ffc09158 <== ALWAYS TAKEN status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; } return _POSIX_RWLock_Translate_core_RWLock_return_code( (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ffc09144: 3d 20 00 00 lis r9,0 ffc09148: 81 29 31 30 lwz r9,12592(r9) if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST || status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; } return _POSIX_RWLock_Translate_core_RWLock_return_code( ffc0914c: 80 69 00 34 lwz r3,52(r9) ffc09150: 48 00 00 15 bl ffc09164 <_POSIX_RWLock_Translate_core_RWLock_return_code> ffc09154: 7c 7e 1b 78 mr r30,r3 case OBJECTS_ERROR: break; } return EINVAL; } ffc09158: 39 61 00 28 addi r11,r1,40 ffc0915c: 7f c3 f3 78 mr r3,r30 ffc09160: 4b ff 8c d0 b ffc01e30 <_restgpr_28_x> =============================================================================== ffc09930 : int pthread_rwlockattr_setpshared( pthread_rwlockattr_t *attr, int pshared ) { if ( !attr ) ffc09930: 2c 03 00 00 cmpwi r3,0 return EINVAL; ffc09934: 38 00 00 16 li r0,22 int pthread_rwlockattr_setpshared( pthread_rwlockattr_t *attr, int pshared ) { if ( !attr ) ffc09938: 41 82 00 20 beq- ffc09958 return EINVAL; if ( !attr->is_initialized ) ffc0993c: 81 23 00 00 lwz r9,0(r3) ffc09940: 2f 89 00 00 cmpwi cr7,r9,0 ffc09944: 41 9e 00 14 beq- cr7,ffc09958 return EINVAL; switch ( pshared ) { ffc09948: 2b 84 00 01 cmplwi cr7,r4,1 ffc0994c: 41 9d 00 0c bgt- cr7,ffc09958 <== NEVER TAKEN case PTHREAD_PROCESS_SHARED: case PTHREAD_PROCESS_PRIVATE: attr->process_shared = pshared; ffc09950: 90 83 00 04 stw r4,4(r3) return 0; ffc09954: 38 00 00 00 li r0,0 default: return EINVAL; } } ffc09958: 7c 03 03 78 mr r3,r0 ffc0995c: 4e 80 00 20 blr =============================================================================== ffc0aa50 : int pthread_setschedparam( pthread_t thread, int policy, struct sched_param *param ) { ffc0aa50: 94 21 ff d0 stwu r1,-48(r1) ffc0aa54: 7c 08 02 a6 mflr r0 ffc0aa58: bf 61 00 1c stmw r27,28(r1) int rc; /* * Check all the parameters */ if ( !param ) ffc0aa5c: 7c bd 2b 79 mr. r29,r5 int pthread_setschedparam( pthread_t thread, int policy, struct sched_param *param ) { ffc0aa60: 7c 7c 1b 78 mr r28,r3 ffc0aa64: 90 01 00 34 stw r0,52(r1) ffc0aa68: 7c 9f 23 78 mr r31,r4 /* * Check all the parameters */ if ( !param ) return EINVAL; ffc0aa6c: 3b c0 00 16 li r30,22 int rc; /* * Check all the parameters */ if ( !param ) ffc0aa70: 41 82 00 e8 beq- ffc0ab58 return EINVAL; rc = _POSIX_Thread_Translate_sched_param( ffc0aa74: 7c 83 23 78 mr r3,r4 ffc0aa78: 38 a1 00 08 addi r5,r1,8 ffc0aa7c: 7f a4 eb 78 mr r4,r29 ffc0aa80: 38 c1 00 0c addi r6,r1,12 ffc0aa84: 48 00 63 cd bl ffc10e50 <_POSIX_Thread_Translate_sched_param> policy, param, &budget_algorithm, &budget_callout ); if ( rc ) ffc0aa88: 7c 7e 1b 79 mr. r30,r3 ffc0aa8c: 40 82 00 cc bne- ffc0ab58 return rc; /* * Actually change the scheduling policy and parameters */ the_thread = _Thread_Get( thread, &location ); ffc0aa90: 7f 83 e3 78 mr r3,r28 ffc0aa94: 38 81 00 10 addi r4,r1,16 ffc0aa98: 48 00 30 c1 bl ffc0db58 <_Thread_Get> switch ( location ) { ffc0aa9c: 80 01 00 10 lwz r0,16(r1) return rc; /* * Actually change the scheduling policy and parameters */ the_thread = _Thread_Get( thread, &location ); ffc0aaa0: 7c 7b 1b 78 mr r27,r3 switch ( location ) { ffc0aaa4: 2f 80 00 00 cmpwi cr7,r0,0 ffc0aaa8: 40 9e 00 ac bne- cr7,ffc0ab54 case OBJECTS_LOCAL: api = the_thread->API_Extensions[ THREAD_API_POSIX ]; ffc0aaac: 83 83 01 34 lwz r28,308(r3) if ( api->schedpolicy == SCHED_SPORADIC ) ffc0aab0: 80 1c 00 84 lwz r0,132(r28) ffc0aab4: 2f 80 00 04 cmpwi cr7,r0,4 ffc0aab8: 40 be 00 0c bne+ cr7,ffc0aac4 (void) _Watchdog_Remove( &api->Sporadic_timer ); ffc0aabc: 38 7c 00 a8 addi r3,r28,168 ffc0aac0: 48 00 43 d9 bl ffc0ee98 <_Watchdog_Remove> api->schedpolicy = policy; api->schedparam = *param; the_thread->budget_algorithm = budget_algorithm; the_thread->budget_callout = budget_callout; switch ( api->schedpolicy ) { ffc0aac4: 2f 9f 00 00 cmpwi cr7,r31,0 api = the_thread->API_Extensions[ THREAD_API_POSIX ]; if ( api->schedpolicy == SCHED_SPORADIC ) (void) _Watchdog_Remove( &api->Sporadic_timer ); api->schedpolicy = policy; ffc0aac8: 93 fc 00 84 stw r31,132(r28) api->schedparam = *param; ffc0aacc: 38 9c 00 88 addi r4,r28,136 the_thread->budget_algorithm = budget_algorithm; ffc0aad0: 80 01 00 08 lwz r0,8(r1) if ( api->schedpolicy == SCHED_SPORADIC ) (void) _Watchdog_Remove( &api->Sporadic_timer ); api->schedpolicy = policy; api->schedparam = *param; ffc0aad4: 7c bd e4 aa lswi r5,r29,28 ffc0aad8: 7c a4 e5 aa stswi r5,r4,28 the_thread->budget_algorithm = budget_algorithm; ffc0aadc: 90 1b 00 7c stw r0,124(r27) the_thread->budget_callout = budget_callout; ffc0aae0: 80 01 00 0c lwz r0,12(r1) ffc0aae4: 90 1b 00 80 stw r0,128(r27) switch ( api->schedpolicy ) { ffc0aae8: 41 9c 00 64 blt- cr7,ffc0ab4c <== NEVER TAKEN ffc0aaec: 2f 9f 00 02 cmpwi cr7,r31,2 ffc0aaf0: 40 9d 00 10 ble- cr7,ffc0ab00 ffc0aaf4: 2f 9f 00 04 cmpwi cr7,r31,4 ffc0aaf8: 40 be 00 54 bne+ cr7,ffc0ab4c <== NEVER TAKEN ffc0aafc: 48 00 00 34 b ffc0ab30 case SCHED_OTHER: case SCHED_FIFO: case SCHED_RR: the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice; ffc0ab00: 3d 20 00 00 lis r9,0 ffc0ab04: 80 09 28 84 lwz r0,10372(r9) ffc0ab08: 3d 20 00 00 lis r9,0 ffc0ab0c: 88 89 27 8c lbz r4,10124(r9) the_thread->real_priority = _POSIX_Priority_To_core( api->schedparam.sched_priority ); _Thread_Change_priority( ffc0ab10: 7f 63 db 78 mr r3,r27 switch ( api->schedpolicy ) { case SCHED_OTHER: case SCHED_FIFO: case SCHED_RR: the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice; ffc0ab14: 90 1b 00 78 stw r0,120(r27) the_thread->real_priority = _POSIX_Priority_To_core( api->schedparam.sched_priority ); _Thread_Change_priority( ffc0ab18: 38 a0 00 01 li r5,1 ffc0ab1c: 80 1c 00 88 lwz r0,136(r28) ffc0ab20: 7c 80 20 50 subf r4,r0,r4 case SCHED_OTHER: case SCHED_FIFO: case SCHED_RR: the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice; the_thread->real_priority = ffc0ab24: 90 9b 00 18 stw r4,24(r27) _POSIX_Priority_To_core( api->schedparam.sched_priority ); _Thread_Change_priority( ffc0ab28: 48 00 2b 49 bl ffc0d670 <_Thread_Change_priority> the_thread, the_thread->real_priority, true ); break; ffc0ab2c: 48 00 00 20 b ffc0ab4c case SCHED_SPORADIC: api->ss_high_priority = api->schedparam.sched_priority; ffc0ab30: 80 1c 00 88 lwz r0,136(r28) _Watchdog_Remove( &api->Sporadic_timer ); ffc0ab34: 38 7c 00 a8 addi r3,r28,168 true ); break; case SCHED_SPORADIC: api->ss_high_priority = api->schedparam.sched_priority; ffc0ab38: 90 1c 00 a4 stw r0,164(r28) _Watchdog_Remove( &api->Sporadic_timer ); ffc0ab3c: 48 00 43 5d bl ffc0ee98 <_Watchdog_Remove> _POSIX_Threads_Sporadic_budget_TSR( 0, the_thread ); ffc0ab40: 38 60 00 00 li r3,0 ffc0ab44: 7f 64 db 78 mr r4,r27 ffc0ab48: 4b ff fd c1 bl ffc0a908 <_POSIX_Threads_Sporadic_budget_TSR> break; } _Thread_Enable_dispatch(); ffc0ab4c: 48 00 2f ed bl ffc0db38 <_Thread_Enable_dispatch> return 0; ffc0ab50: 48 00 00 08 b ffc0ab58 #endif case OBJECTS_ERROR: break; } return ESRCH; ffc0ab54: 3b c0 00 03 li r30,3 } ffc0ab58: 39 61 00 30 addi r11,r1,48 ffc0ab5c: 7f c3 f3 78 mr r3,r30 ffc0ab60: 4b ff 80 1c b ffc02b7c <_restgpr_27_x> =============================================================================== ffc07e54 : * * 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183 */ void pthread_testcancel( void ) { ffc07e54: 7c 08 02 a6 mflr r0 ffc07e58: 7c 2b 0b 78 mr r11,r1 ffc07e5c: 94 21 ff f0 stwu r1,-16(r1) * 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() ) ffc07e60: 3d 20 00 00 lis r9,0 ffc07e64: 39 29 31 04 addi r9,r9,12548 * * 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183 */ void pthread_testcancel( void ) { ffc07e68: 90 01 00 14 stw r0,20(r1) ffc07e6c: 48 00 e5 39 bl ffc163a4 <_savegpr_31> * 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() ) ffc07e70: 80 09 00 08 lwz r0,8(r9) ffc07e74: 2f 80 00 00 cmpwi cr7,r0,0 ffc07e78: 40 9e 00 58 bne- cr7,ffc07ed0 <== NEVER TAKEN ffc07e7c: 3d 60 00 00 lis r11,0 return; thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; ffc07e80: 81 29 00 0c lwz r9,12(r9) ffc07e84: 81 4b 28 0c lwz r10,10252(r11) ffc07e88: 81 29 01 34 lwz r9,308(r9) ffc07e8c: 38 0a 00 01 addi r0,r10,1 ffc07e90: 90 0b 28 0c stw r0,10252(r11) _Thread_Disable_dispatch(); if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE && ffc07e94: 80 09 00 d8 lwz r0,216(r9) */ void pthread_testcancel( void ) { POSIX_API_Control *thread_support; bool cancel = false; ffc07e98: 3b e0 00 00 li r31,0 return; thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; _Thread_Disable_dispatch(); if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE && ffc07e9c: 2f 80 00 00 cmpwi cr7,r0,0 ffc07ea0: 40 9e 00 14 bne- cr7,ffc07eb4 <== 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)); ffc07ea4: 80 09 00 e0 lwz r0,224(r9) ffc07ea8: 7c 00 00 34 cntlzw r0,r0 ffc07eac: 54 00 d9 7e rlwinm r0,r0,27,5,31 ffc07eb0: 68 1f 00 01 xori r31,r0,1 thread_support->cancelation_requested ) cancel = true; _Thread_Enable_dispatch(); ffc07eb4: 48 00 2f 19 bl ffc0adcc <_Thread_Enable_dispatch> if ( cancel ) ffc07eb8: 2f 9f 00 00 cmpwi cr7,r31,0 ffc07ebc: 41 be 00 14 beq+ cr7,ffc07ed0 _POSIX_Thread_Exit( _Thread_Executing, PTHREAD_CANCELED ); ffc07ec0: 3d 20 00 00 lis r9,0 ffc07ec4: 80 69 31 10 lwz r3,12560(r9) ffc07ec8: 38 80 ff ff li r4,-1 ffc07ecc: 48 00 63 31 bl ffc0e1fc <_POSIX_Thread_Exit> } ffc07ed0: 39 61 00 10 addi r11,r1,16 ffc07ed4: 48 00 e5 1c b ffc163f0 <_restgpr_31_x> =============================================================================== ffc19814 : ssize_t read( int fd, void *buffer, size_t count ) { ffc19814: 7c 08 02 a6 mflr r0 ffc19818: 7c 2b 0b 78 mr r11,r1 ffc1981c: 94 21 ff f0 stwu r1,-16(r1) ssize_t rc; rtems_libio_t *iop; rtems_libio_check_fd( fd ); ffc19820: 3d 40 00 00 lis r10,0 ssize_t read( int fd, void *buffer, size_t count ) { ffc19824: 90 01 00 14 stw r0,20(r1) ffc19828: 4b ff f9 3d bl ffc19164 <_savegpr_31> ssize_t rc; rtems_libio_t *iop; rtems_libio_check_fd( fd ); ffc1982c: 80 0a 27 2c lwz r0,10028(r10) ffc19830: 7f 83 00 40 cmplw cr7,r3,r0 ffc19834: 40 9c 00 20 bge- cr7,ffc19854 <== NEVER TAKEN iop = rtems_libio_iop( fd ); ffc19838: 3d 40 00 00 lis r10,0 ffc1983c: 83 ea 27 e8 lwz r31,10216(r10) ffc19840: 54 63 30 32 rlwinm r3,r3,6,0,25 ffc19844: 7f ff 1a 14 add r31,r31,r3 rtems_libio_check_is_open( iop ); ffc19848: 80 1f 00 18 lwz r0,24(r31) ffc1984c: 70 0a 01 00 andi. r10,r0,256 ffc19850: 40 a2 00 10 bne+ ffc19860 ffc19854: 4b ff aa 65 bl ffc142b8 <__errno> ffc19858: 38 00 00 09 li r0,9 ffc1985c: 48 00 00 28 b ffc19884 rtems_libio_check_buffer( buffer ); ffc19860: 2f 84 00 00 cmpwi cr7,r4,0 ffc19864: 41 9e 00 18 beq- cr7,ffc1987c <== NEVER TAKEN rtems_libio_check_count( count ); ffc19868: 2f 85 00 00 cmpwi cr7,r5,0 ffc1986c: 38 60 00 00 li r3,0 ffc19870: 41 9e 00 5c beq- cr7,ffc198cc rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ ); ffc19874: 70 09 00 02 andi. r9,r0,2 ffc19878: 40 a2 00 18 bne+ ffc19890 ffc1987c: 4b ff aa 3d bl ffc142b8 <__errno> ffc19880: 38 00 00 16 li r0,22 ffc19884: 90 03 00 00 stw r0,0(r3) ffc19888: 38 60 ff ff li r3,-1 ffc1988c: 48 00 00 40 b ffc198cc /* * Now process the read(). */ rc = (*iop->pathinfo.handlers->read_h)( iop, buffer, count ); ffc19890: 81 3f 00 24 lwz r9,36(r31) ffc19894: 7f e3 fb 78 mr r3,r31 ffc19898: 80 09 00 08 lwz r0,8(r9) ffc1989c: 7c 09 03 a6 mtctr r0 ffc198a0: 4e 80 04 21 bctrl if ( rc > 0 ) ffc198a4: 2c 03 00 00 cmpwi r3,0 ffc198a8: 40 81 00 24 ble- ffc198cc iop->offset += rc; ffc198ac: 81 7f 00 10 lwz r11,16(r31) ffc198b0: 7c 6a 1b 78 mr r10,r3 ffc198b4: 81 9f 00 14 lwz r12,20(r31) ffc198b8: 7c 69 fe 70 srawi r9,r3,31 ffc198bc: 7d 4a 60 14 addc r10,r10,r12 ffc198c0: 7d 29 59 14 adde r9,r9,r11 ffc198c4: 91 3f 00 10 stw r9,16(r31) ffc198c8: 91 5f 00 14 stw r10,20(r31) return rc; } ffc198cc: 39 61 00 10 addi r11,r1,16 ffc198d0: 4b ff f8 e0 b ffc191b0 <_restgpr_31_x> =============================================================================== ffc079e4 : ssize_t readlink( const char *pathname, char *buf, size_t bufsize ) { ffc079e4: 94 21 ff c8 stwu r1,-56(r1) ffc079e8: 7c 08 02 a6 mflr r0 ffc079ec: bf 81 00 28 stmw r28,40(r1) rtems_filesystem_location_info_t loc; int result; if (!buf) ffc079f0: 7c 9d 23 79 mr. r29,r4 ssize_t readlink( const char *pathname, char *buf, size_t bufsize ) { ffc079f4: 7c 7f 1b 78 mr r31,r3 ffc079f8: 90 01 00 3c stw r0,60(r1) ffc079fc: 7c be 2b 78 mr r30,r5 rtems_filesystem_location_info_t loc; int result; if (!buf) ffc07a00: 40 a2 00 18 bne+ ffc07a18 rtems_set_errno_and_return_minus_one( EFAULT ); ffc07a04: 48 00 ba 81 bl ffc13484 <__errno> ffc07a08: 38 00 00 0e li r0,14 ffc07a0c: 90 03 00 00 stw r0,0(r3) ffc07a10: 3b 80 ff ff li r28,-1 ffc07a14: 48 00 00 8c b ffc07aa0 result = rtems_filesystem_evaluate_path( pathname, strlen( pathname ), ffc07a18: 48 00 da 91 bl ffc154a8 ffc07a1c: 38 a0 00 00 li r5,0 ffc07a20: 7c 64 1b 78 mr r4,r3 ffc07a24: 7f e3 fb 78 mr r3,r31 ffc07a28: 3b e1 00 08 addi r31,r1,8 ffc07a2c: 7f e6 fb 78 mr r6,r31 ffc07a30: 38 e0 00 00 li r7,0 ffc07a34: 4b ff ec c1 bl ffc066f4 0, &loc, false ); if ( result != 0 ) return -1; ffc07a38: 3b 80 ff ff li r28,-1 if (!buf) rtems_set_errno_and_return_minus_one( EFAULT ); result = rtems_filesystem_evaluate_path( pathname, strlen( pathname ), 0, &loc, false ); if ( result != 0 ) ffc07a3c: 2f 83 00 00 cmpwi cr7,r3,0 ffc07a40: 40 be 00 60 bne+ cr7,ffc07aa0 <== NEVER TAKEN return -1; if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK ){ ffc07a44: 81 21 00 14 lwz r9,20(r1) ffc07a48: 7f e3 fb 78 mr r3,r31 ffc07a4c: 80 09 00 10 lwz r0,16(r9) ffc07a50: 7c 09 03 a6 mtctr r0 ffc07a54: 4e 80 04 21 bctrl ffc07a58: 2f 83 00 04 cmpwi cr7,r3,4 ffc07a5c: 41 be 00 1c beq+ cr7,ffc07a78 rtems_filesystem_freenode( &loc ); ffc07a60: 7f e3 fb 78 mr r3,r31 ffc07a64: 4b ff ed 85 bl ffc067e8 rtems_set_errno_and_return_minus_one( EINVAL ); ffc07a68: 48 00 ba 1d bl ffc13484 <__errno> ffc07a6c: 38 00 00 16 li r0,22 ffc07a70: 90 03 00 00 stw r0,0(r3) ffc07a74: 48 00 00 2c b ffc07aa0 } result = (*loc.ops->readlink_h)( &loc, buf, bufsize ); ffc07a78: 81 21 00 14 lwz r9,20(r1) ffc07a7c: 7f e3 fb 78 mr r3,r31 ffc07a80: 7f a4 eb 78 mr r4,r29 ffc07a84: 80 09 00 3c lwz r0,60(r9) ffc07a88: 7f c5 f3 78 mr r5,r30 ffc07a8c: 7c 09 03 a6 mtctr r0 ffc07a90: 4e 80 04 21 bctrl ffc07a94: 7c 7c 1b 78 mr r28,r3 rtems_filesystem_freenode( &loc ); ffc07a98: 7f e3 fb 78 mr r3,r31 ffc07a9c: 4b ff ed 4d bl ffc067e8 return result; } ffc07aa0: 39 61 00 38 addi r11,r1,56 ffc07aa4: 7f 83 e3 78 mr r3,r28 ffc07aa8: 4b ff ab b4 b ffc0265c <_restgpr_28_x> =============================================================================== ffc06454 : ssize_t readv( int fd, const struct iovec *iov, int iovcnt ) { ffc06454: 94 21 ff d8 stwu r1,-40(r1) ffc06458: 7c 08 02 a6 mflr r0 int v; int bytes; rtems_libio_t *iop; bool all_zeros; rtems_libio_check_fd( fd ); ffc0645c: 3d 20 00 00 lis r9,0 ssize_t readv( int fd, const struct iovec *iov, int iovcnt ) { ffc06460: 90 01 00 2c stw r0,44(r1) int v; int bytes; rtems_libio_t *iop; bool all_zeros; rtems_libio_check_fd( fd ); ffc06464: 80 09 27 0c lwz r0,9996(r9) ssize_t readv( int fd, const struct iovec *iov, int iovcnt ) { ffc06468: bf 21 00 0c stmw r25,12(r1) ffc0646c: 7c ba 2b 78 mr r26,r5 int v; int bytes; rtems_libio_t *iop; bool all_zeros; rtems_libio_check_fd( fd ); ffc06470: 7f 83 00 40 cmplw cr7,r3,r0 ffc06474: 40 9c 00 20 bge- cr7,ffc06494 iop = rtems_libio_iop( fd ); ffc06478: 3d 20 00 00 lis r9,0 ffc0647c: 83 69 27 cc lwz r27,10188(r9) ffc06480: 54 63 30 32 rlwinm r3,r3,6,0,25 ffc06484: 7f 7b 1a 14 add r27,r27,r3 rtems_libio_check_is_open( iop ); ffc06488: 80 1b 00 18 lwz r0,24(r27) ffc0648c: 70 09 01 00 andi. r9,r0,256 ffc06490: 40 a2 00 10 bne+ ffc064a0 ffc06494: 48 00 af 29 bl ffc113bc <__errno> ffc06498: 38 00 00 09 li r0,9 ffc0649c: 48 00 00 64 b ffc06500 rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ ); ffc064a0: 70 09 00 02 andi. r9,r0,2 ffc064a4: 41 82 00 54 beq- ffc064f8 <== NEVER TAKEN /* * Argument validation on IO vector */ if ( !iov ) ffc064a8: 2f 84 00 00 cmpwi cr7,r4,0 ffc064ac: 41 9e 00 4c beq- cr7,ffc064f8 rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt <= 0 ) ffc064b0: 2f 85 00 00 cmpwi cr7,r5,0 ffc064b4: 40 9d 00 44 ble- cr7,ffc064f8 rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt > IOV_MAX ) ffc064b8: 2f 85 04 00 cmpwi cr7,r5,1024 ffc064bc: 41 9d 00 3c bgt- cr7,ffc064f8 <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); ffc064c0: 7c 9c 23 78 mr r28,r4 rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt <= 0 ) rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt > IOV_MAX ) ffc064c4: 7c a9 03 a6 mtctr r5 ffc064c8: 7c 89 23 78 mr r9,r4 ffc064cc: 38 00 00 01 li r0,1 ffc064d0: 39 60 00 00 li r11,0 ffc064d4: 48 00 00 08 b ffc064dc if ( iov[v].iov_base == 0 ) rtems_set_errno_and_return_minus_one( EINVAL ); /* check for wrap */ old = total; total += iov[v].iov_len; ffc064d8: 7d 0b 43 78 mr r11,r8 /* * 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 ) ffc064dc: 81 49 00 00 lwz r10,0(r9) ffc064e0: 2f 8a 00 00 cmpwi cr7,r10,0 ffc064e4: 41 9e 00 14 beq- cr7,ffc064f8 rtems_set_errno_and_return_minus_one( EINVAL ); /* check for wrap */ old = total; total += iov[v].iov_len; ffc064e8: 81 49 00 04 lwz r10,4(r9) ffc064ec: 7d 0b 52 14 add r8,r11,r10 if ( total < old ) ffc064f0: 7f 88 58 00 cmpw cr7,r8,r11 ffc064f4: 40 bc 00 14 bge+ cr7,ffc06508 rtems_set_errno_and_return_minus_one( EINVAL ); ffc064f8: 48 00 ae c5 bl ffc113bc <__errno> ffc064fc: 38 00 00 16 li r0,22 ffc06500: 90 03 00 00 stw r0,0(r3) ffc06504: 48 00 00 94 b ffc06598 if ( iov[v].iov_len ) all_zeros = false; ffc06508: 31 4a ff ff addic r10,r10,-1 ffc0650c: 7d 4a 51 10 subfe r10,r10,r10 ffc06510: 7c 00 50 38 and r0,r0,r10 * 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++ ) { ffc06514: 39 29 00 08 addi r9,r9,8 ffc06518: 42 00 ff c0 bdnz+ ffc064d8 /* * 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 ) { ffc0651c: 2f 80 00 00 cmpwi cr7,r0,0 return 0; ffc06520: 3b a0 00 00 li r29,0 /* * 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 ) { ffc06524: 40 9e 00 78 bne- cr7,ffc0659c ffc06528: 3b 20 00 00 li r25,0 /* * Now process the readv(). */ for ( total=0, v=0 ; v < iovcnt ; v++ ) { bytes = (*iop->pathinfo.handlers->read_h)( ffc0652c: 81 3b 00 24 lwz r9,36(r27) ffc06530: 7f 63 db 78 mr r3,r27 ffc06534: 80 9c 00 00 lwz r4,0(r28) ffc06538: 80 09 00 08 lwz r0,8(r9) ffc0653c: 80 bc 00 04 lwz r5,4(r28) ffc06540: 7c 09 03 a6 mtctr r0 ffc06544: 4e 80 04 21 bctrl iop, iov[v].iov_base, iov[v].iov_len ); if ( bytes < 0 ) ffc06548: 2c 03 00 00 cmpwi r3,0 ffc0654c: 41 80 00 4c blt- ffc06598 <== NEVER TAKEN return -1; if ( bytes > 0 ) { ffc06550: 41 82 00 28 beq- ffc06578 <== NEVER TAKEN iop->offset += bytes; ffc06554: 81 3b 00 10 lwz r9,16(r27) ffc06558: 7c 7f 1b 78 mr r31,r3 ffc0655c: 81 5b 00 14 lwz r10,20(r27) ffc06560: 7c 7e fe 70 srawi r30,r3,31 total += bytes; ffc06564: 7f bd 1a 14 add r29,r29,r3 if ( bytes < 0 ) return -1; if ( bytes > 0 ) { iop->offset += bytes; ffc06568: 7d 4a f8 14 addc r10,r10,r31 ffc0656c: 7d 29 f1 14 adde r9,r9,r30 ffc06570: 91 3b 00 10 stw r9,16(r27) ffc06574: 91 5b 00 14 stw r10,20(r27) total += bytes; } if (bytes != iov[ v ].iov_len) ffc06578: 80 1c 00 04 lwz r0,4(r28) ffc0657c: 7f 83 00 00 cmpw cr7,r3,r0 ffc06580: 40 9e 00 1c bne- cr7,ffc0659c <== NEVER TAKEN } /* * Now process the readv(). */ for ( total=0, v=0 ; v < iovcnt ; v++ ) { ffc06584: 3b 39 00 01 addi r25,r25,1 ffc06588: 7f 99 d0 00 cmpw cr7,r25,r26 ffc0658c: 3b 9c 00 08 addi r28,r28,8 ffc06590: 41 9c ff 9c blt+ cr7,ffc0652c ffc06594: 48 00 00 08 b ffc0659c iov[v].iov_base, iov[v].iov_len ); if ( bytes < 0 ) return -1; ffc06598: 3b a0 ff ff li r29,-1 if (bytes != iov[ v ].iov_len) break; } return total; } ffc0659c: 39 61 00 28 addi r11,r1,40 ffc065a0: 7f a3 eb 78 mr r3,r29 ffc065a4: 4b ff a6 3c b ffc00be0 <_restgpr_25_x> =============================================================================== ffc06074 : void *realloc( void *ptr, size_t size ) { ffc06074: 94 21 ff d8 stwu r1,-40(r1) ffc06078: 7c 08 02 a6 mflr r0 uintptr_t old_size; char *new_area; MSBUMP(realloc_calls, 1); ffc0607c: 3d 20 00 00 lis r9,0 void *realloc( void *ptr, size_t size ) { ffc06080: 90 01 00 2c stw r0,44(r1) uintptr_t old_size; char *new_area; MSBUMP(realloc_calls, 1); ffc06084: 39 29 2c 00 addi r9,r9,11264 ffc06088: 81 69 00 10 lwz r11,16(r9) void *realloc( void *ptr, size_t size ) { ffc0608c: bf a1 00 1c stmw r29,28(r1) ffc06090: 7c 7f 1b 78 mr r31,r3 uintptr_t old_size; char *new_area; MSBUMP(realloc_calls, 1); ffc06094: 38 0b 00 01 addi r0,r11,1 ffc06098: 90 09 00 10 stw r0,16(r9) /* * Do not attempt to allocate memory if in a critical section or ISR. */ if (_System_state_Is_up(_System_state_Get())) { ffc0609c: 3d 20 00 00 lis r9,0 void *realloc( void *ptr, size_t size ) { ffc060a0: 7c 9e 23 78 mr r30,r4 /* * Do not attempt to allocate memory if in a critical section or ISR. */ if (_System_state_Is_up(_System_state_Get())) { ffc060a4: 80 09 28 48 lwz r0,10312(r9) ffc060a8: 2f 80 00 03 cmpwi cr7,r0,3 ffc060ac: 40 be 00 24 bne+ cr7,ffc060d0 <== NEVER TAKEN if (_Thread_Dispatch_disable_level > 0) ffc060b0: 3d 20 00 00 lis r9,0 ffc060b4: 80 09 28 04 lwz r0,10244(r9) ffc060b8: 2f 80 00 00 cmpwi cr7,r0,0 ffc060bc: 40 be 00 d8 bne+ cr7,ffc06194 <== NEVER TAKEN return (void *) 0; if (_ISR_Nest_level > 0) ffc060c0: 3d 20 00 00 lis r9,0 ffc060c4: 80 09 31 ec lwz r0,12780(r9) ffc060c8: 2f 80 00 00 cmpwi cr7,r0,0 ffc060cc: 40 9e 00 c8 bne- cr7,ffc06194 <== NEVER TAKEN } /* * Continue with realloc(). */ if ( !ptr ) ffc060d0: 2f 9f 00 00 cmpwi cr7,r31,0 ffc060d4: 40 be 00 14 bne+ cr7,ffc060e8 return malloc( size ); ffc060d8: 7f c3 f3 78 mr r3,r30 ffc060dc: 4b ff f3 f1 bl ffc054cc ffc060e0: 7c 7f 1b 78 mr r31,r3 ffc060e4: 48 00 00 b4 b ffc06198 if ( !size ) { ffc060e8: 2f 9e 00 00 cmpwi cr7,r30,0 ffc060ec: 40 be 00 10 bne+ cr7,ffc060fc <== ALWAYS TAKEN free( ptr ); ffc060f0: 7f e3 fb 78 mr r3,r31 <== NOT EXECUTED ffc060f4: 4b ff f0 3d bl ffc05130 <== NOT EXECUTED ffc060f8: 48 00 00 9c b ffc06194 <== NOT EXECUTED return (void *) 0; } if ( !_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, ptr, &old_size) ) { ffc060fc: 3f a0 00 00 lis r29,0 ffc06100: 80 7d 27 3c lwz r3,10044(r29) ffc06104: 7f e4 fb 78 mr r4,r31 ffc06108: 38 a1 00 08 addi r5,r1,8 ffc0610c: 48 00 48 d1 bl ffc0a9dc <_Protected_heap_Get_block_size> ffc06110: 2f 83 00 00 cmpwi cr7,r3,0 ffc06114: 40 be 00 14 bne+ cr7,ffc06128 errno = EINVAL; ffc06118: 48 00 e1 a1 bl ffc142b8 <__errno> ffc0611c: 38 00 00 16 li r0,22 ffc06120: 90 03 00 00 stw r0,0(r3) ffc06124: 48 00 00 70 b ffc06194 } /* * Now resize it. */ if ( _Protected_heap_Resize_block( RTEMS_Malloc_Heap, ptr, size ) ) { ffc06128: 80 7d 27 3c lwz r3,10044(r29) ffc0612c: 7f e4 fb 78 mr r4,r31 ffc06130: 7f c5 f3 78 mr r5,r30 ffc06134: 48 00 49 01 bl ffc0aa34 <_Protected_heap_Resize_block> ffc06138: 2f 83 00 00 cmpwi cr7,r3,0 ffc0613c: 40 be 00 5c bne+ cr7,ffc06198 * 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 ); ffc06140: 7f c3 f3 78 mr r3,r30 ffc06144: 4b ff f3 89 bl ffc054cc MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */ ffc06148: 3d 20 00 00 lis r9,0 if ( !new_area ) { ffc0614c: 7c 7d 1b 79 mr. r29,r3 * and the C Standard. */ new_area = malloc( size ); MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */ ffc06150: 39 29 2c 00 addi r9,r9,11264 ffc06154: 81 69 00 04 lwz r11,4(r9) ffc06158: 38 0b ff ff addi r0,r11,-1 ffc0615c: 90 09 00 04 stw r0,4(r9) if ( !new_area ) { ffc06160: 41 82 00 34 beq- ffc06194 return (void *) 0; } memcpy( new_area, ptr, (size < old_size) ? size : old_size ); ffc06164: 80 01 00 08 lwz r0,8(r1) ffc06168: 7f c5 f3 78 mr r5,r30 ffc0616c: 7f 9e 00 40 cmplw cr7,r30,r0 ffc06170: 40 9d 00 08 ble- cr7,ffc06178 <== NEVER TAKEN ffc06174: 7c 05 03 78 mr r5,r0 ffc06178: 7f e4 fb 78 mr r4,r31 ffc0617c: 7f a3 eb 78 mr r3,r29 ffc06180: 48 00 ed 99 bl ffc14f18 free( ptr ); ffc06184: 7f e3 fb 78 mr r3,r31 ffc06188: 4b ff ef a9 bl ffc05130 return new_area; ffc0618c: 7f bf eb 78 mr r31,r29 ffc06190: 48 00 00 08 b ffc06198 new_area = malloc( size ); MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */ if ( !new_area ) { return (void *) 0; ffc06194: 3b e0 00 00 li r31,0 memcpy( new_area, ptr, (size < old_size) ? size : old_size ); free( ptr ); return new_area; } ffc06198: 39 61 00 28 addi r11,r1,40 ffc0619c: 7f e3 fb 78 mr r3,r31 ffc061a0: 48 01 30 08 b ffc191a8 <_restgpr_29_x> =============================================================================== ffc055fc : #include int rmdir( const char *pathname ) { ffc055fc: 94 21 ff a8 stwu r1,-88(r1) ffc05600: 7d 80 00 26 mfcr r12 ffc05604: 7c 08 02 a6 mflr r0 ffc05608: bf 41 00 40 stmw r26,64(r1) ffc0560c: 7c 7c 1b 78 mr r28,r3 ffc05610: 90 01 00 5c stw r0,92(r1) ffc05614: 91 81 00 3c stw r12,60(r1) /* * Get the parent node of the node we wish to remove. Find the parent path. */ parentpathlen = rtems_filesystem_dirname ( pathname ); ffc05618: 4b ff ef dd bl ffc045f4 if ( parentpathlen == 0 ) ffc0561c: 7c 7b 1b 79 mr. r27,r3 ffc05620: 38 c1 00 0c addi r6,r1,12 ffc05624: 40 82 00 1c bne- ffc05640 rtems_filesystem_get_start_loc( pathname, &i, &parentloc ); ffc05628: 7f 83 e3 78 mr r3,r28 ffc0562c: 38 81 00 08 addi r4,r1,8 ffc05630: 7c c5 33 78 mr r5,r6 ffc05634: 48 00 01 21 bl ffc05754 const char *name; rtems_filesystem_location_info_t parentloc; rtems_filesystem_location_info_t loc; int i; int result; bool free_parentloc = false; ffc05638: 3b a0 00 00 li r29,0 ffc0563c: 48 00 00 28 b ffc05664 parentpathlen = rtems_filesystem_dirname ( pathname ); if ( parentpathlen == 0 ) rtems_filesystem_get_start_loc( pathname, &i, &parentloc ); else { result = rtems_filesystem_evaluate_path(pathname, parentpathlen, ffc05640: 7f 83 e3 78 mr r3,r28 ffc05644: 7f 64 db 78 mr r4,r27 ffc05648: 38 a0 00 02 li r5,2 ffc0564c: 38 e0 00 00 li r7,0 ffc05650: 4b ff ef 49 bl ffc04598 RTEMS_LIBIO_PERMS_WRITE, &parentloc, false ); if ( result != 0 ) return -1; ffc05654: 3b 40 ff ff li r26,-1 else { result = rtems_filesystem_evaluate_path(pathname, parentpathlen, RTEMS_LIBIO_PERMS_WRITE, &parentloc, false ); if ( result != 0 ) ffc05658: 2f 83 00 00 cmpwi cr7,r3,0 ffc0565c: 40 9e 00 e4 bne- cr7,ffc05740 <== NEVER TAKEN return -1; free_parentloc = true; ffc05660: 3b a0 00 01 li r29,1 /* * Start from the parent to find the node that should be under it. */ loc = parentloc; ffc05664: 3b e1 00 20 addi r31,r1,32 ffc05668: 3b c1 00 0c addi r30,r1,12 ffc0566c: 7c be a4 aa lswi r5,r30,20 ffc05670: 7c bf a5 aa stswi r5,r31,20 name = pathname + parentpathlen; ffc05674: 7f 9c da 14 add r28,r28,r27 name += rtems_filesystem_prefix_separators( name, strlen( name ) ); ffc05678: 7f 83 e3 78 mr r3,r28 ffc0567c: 48 00 c6 e1 bl ffc11d5c ffc05680: 7c 64 1b 78 mr r4,r3 ffc05684: 7f 83 e3 78 mr r3,r28 ffc05688: 4b ff ef b5 bl ffc0463c ffc0568c: 7f 9c 1a 14 add r28,r28,r3 result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), ffc05690: 7f 83 e3 78 mr r3,r28 ffc05694: 48 00 c6 c9 bl ffc11d5c ffc05698: 38 a0 00 00 li r5,0 ffc0569c: 7c 64 1b 78 mr r4,r3 ffc056a0: 7f e6 fb 78 mr r6,r31 ffc056a4: 7f 83 e3 78 mr r3,r28 ffc056a8: 38 e0 00 00 li r7,0 ffc056ac: 4b ff ee 69 bl ffc04514 0, &loc, false ); if ( result != 0 ) { ffc056b0: 2f 83 00 00 cmpwi cr7,r3,0 ffc056b4: 41 be 00 14 beq+ cr7,ffc056c8 if ( free_parentloc ) ffc056b8: 2f 9d 00 00 cmpwi cr7,r29,0 rtems_filesystem_freenode( &parentloc ); return -1; ffc056bc: 3b 40 ff ff li r26,-1 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 ) ffc056c0: 41 be 00 80 beq+ cr7,ffc05740 ffc056c4: 48 00 00 74 b ffc05738 } /* * Verify you can remove this node as a directory. */ if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) { ffc056c8: 81 21 00 2c lwz r9,44(r1) ffc056cc: 7f e3 fb 78 mr r3,r31 ffc056d0: 2e 1d 00 00 cmpwi cr4,r29,0 ffc056d4: 80 09 00 10 lwz r0,16(r9) ffc056d8: 7c 09 03 a6 mtctr r0 ffc056dc: 4e 80 04 21 bctrl ffc056e0: 2f 83 00 01 cmpwi cr7,r3,1 ffc056e4: 41 be 00 2c beq+ cr7,ffc05710 rtems_filesystem_freenode( &loc ); ffc056e8: 7f e3 fb 78 mr r3,r31 ffc056ec: 4b ff ef a1 bl ffc0468c if ( free_parentloc ) ffc056f0: 41 b2 00 0c beq+ cr4,ffc056fc <== NEVER TAKEN rtems_filesystem_freenode( &parentloc ); ffc056f4: 7f c3 f3 78 mr r3,r30 ffc056f8: 4b ff ef 95 bl ffc0468c rtems_set_errno_and_return_minus_one( ENOTDIR ); ffc056fc: 48 00 b4 c1 bl ffc10bbc <__errno> ffc05700: 38 00 00 14 li r0,20 ffc05704: 90 03 00 00 stw r0,0(r3) ffc05708: 3b 40 ff ff li r26,-1 ffc0570c: 48 00 00 34 b ffc05740 /* * Use the filesystems rmnod to remove the node. */ result = (*loc.handlers->rmnod_h)( &parentloc, &loc ); ffc05710: 81 21 00 28 lwz r9,40(r1) ffc05714: 7f c3 f3 78 mr r3,r30 ffc05718: 7f e4 fb 78 mr r4,r31 ffc0571c: 80 09 00 34 lwz r0,52(r9) ffc05720: 7c 09 03 a6 mtctr r0 ffc05724: 4e 80 04 21 bctrl ffc05728: 7c 7a 1b 78 mr r26,r3 rtems_filesystem_freenode( &loc ); ffc0572c: 7f e3 fb 78 mr r3,r31 ffc05730: 4b ff ef 5d bl ffc0468c if ( free_parentloc ) ffc05734: 41 b2 00 0c beq+ cr4,ffc05740 rtems_filesystem_freenode( &parentloc ); ffc05738: 7f c3 f3 78 mr r3,r30 ffc0573c: 4b ff ef 51 bl ffc0468c return result; } ffc05740: 81 81 00 3c lwz r12,60(r1) ffc05744: 39 61 00 58 addi r11,r1,88 ffc05748: 7f 43 d3 78 mr r3,r26 ffc0574c: 7d 80 81 20 mtcrf 8,r12 ffc05750: 48 01 04 a8 b ffc15bf8 <_restgpr_26_x> =============================================================================== ffc08bf0 : * errno - otherwise */ int rtems_aio_enqueue (rtems_aio_request *req) { ffc08bf0: 94 21 ff a8 stwu r1,-88(r1) ffc08bf4: 7c 08 02 a6 mflr r0 ffc08bf8: bf 21 00 3c stmw r25,60(r1) 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); ffc08bfc: 3f e0 00 00 lis r31,0 ffc08c00: 3b ff 2c 70 addi r31,r31,11376 * errno - otherwise */ int rtems_aio_enqueue (rtems_aio_request *req) { ffc08c04: 7c 7d 1b 78 mr r29,r3 ffc08c08: 90 01 00 5c stw r0,92(r1) 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); ffc08c0c: 7f e3 fb 78 mr r3,r31 ffc08c10: 48 00 0a 4d bl ffc0965c if (result != 0) { ffc08c14: 7c 7e 1b 79 mr. r30,r3 ffc08c18: 41 a2 00 10 beq+ ffc08c28 <== ALWAYS TAKEN free (req); ffc08c1c: 7f a3 eb 78 mr r3,r29 <== NOT EXECUTED ffc08c20: 4b ff c3 95 bl ffc04fb4 <== NOT EXECUTED return result; ffc08c24: 48 00 01 e0 b ffc08e04 <== NOT EXECUTED } /* _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); ffc08c28: 48 00 13 11 bl ffc09f38 ffc08c2c: 38 81 00 0c addi r4,r1,12 ffc08c30: 38 a1 00 10 addi r5,r1,16 ffc08c34: 48 00 0e ad bl ffc09ae0 req->caller_thread = pthread_self (); ffc08c38: 48 00 13 01 bl ffc09f38 req->priority = param.sched_priority - req->aiocbp->aio_reqprio; ffc08c3c: 81 3d 00 14 lwz r9,20(r29) ffc08c40: 81 61 00 10 lwz r11,16(r1) ffc08c44: 80 09 00 18 lwz r0,24(r9) /* _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); req->caller_thread = pthread_self (); ffc08c48: 90 7d 00 10 stw r3,16(r29) req->priority = param.sched_priority - req->aiocbp->aio_reqprio; ffc08c4c: 7c 00 58 50 subf r0,r0,r11 ffc08c50: 90 1d 00 0c stw r0,12(r29) req->policy = policy; ffc08c54: 80 01 00 0c lwz r0,12(r1) ffc08c58: 90 1d 00 08 stw r0,8(r29) req->aiocbp->error_code = EINPROGRESS; ffc08c5c: 38 00 00 77 li r0,119 ffc08c60: 90 09 00 34 stw r0,52(r9) req->aiocbp->return_value = 0; if ((aio_request_queue.idle_threads == 0) && ffc08c64: 80 1f 00 68 lwz r0,104(r31) req->caller_thread = pthread_self (); req->priority = param.sched_priority - req->aiocbp->aio_reqprio; req->policy = policy; req->aiocbp->error_code = EINPROGRESS; req->aiocbp->return_value = 0; ffc08c68: 93 c9 00 38 stw r30,56(r9) if ((aio_request_queue.idle_threads == 0) && ffc08c6c: 2f 80 00 00 cmpwi cr7,r0,0 ffc08c70: 40 9e 00 c8 bne- cr7,ffc08d38 <== NEVER TAKEN ffc08c74: 80 1f 00 64 lwz r0,100(r31) ffc08c78: 2f 80 00 04 cmpwi cr7,r0,4 ffc08c7c: 41 bd 00 bc bgt+ cr7,ffc08d38 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); ffc08c80: 80 89 00 00 lwz r4,0(r9) ffc08c84: 38 7f 00 48 addi r3,r31,72 ffc08c88: 38 a0 00 01 li r5,1 ffc08c8c: 4b ff fa b9 bl ffc08744 if (r_chain->new_fd == 1) { ffc08c90: 80 03 00 18 lwz r0,24(r3) if ((aio_request_queue.idle_threads == 0) && aio_request_queue.active_threads < AIO_MAX_THREADS) /* we still have empty places on the active_threads chain */ { chain = &aio_request_queue.work_req; r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1); ffc08c94: 7c 7c 1b 78 mr r28,r3 ffc08c98: 3b 23 00 08 addi r25,r3,8 if (r_chain->new_fd == 1) { ffc08c9c: 2f 80 00 01 cmpwi cr7,r0,1 ffc08ca0: 3b 63 00 1c addi r27,r3,28 ffc08ca4: 3b 43 00 20 addi r26,r3,32 ffc08ca8: 40 be 00 6c bne+ cr7,ffc08d14 RTEMS_INLINE_ROUTINE void _Chain_Prepend( Chain_Control *the_chain, Chain_Node *the_node ) { _Chain_Insert(_Chain_Head(the_chain), the_node); ffc08cac: 7f a4 eb 78 mr r4,r29 ffc08cb0: 7f 23 cb 78 mr r3,r25 ffc08cb4: 48 00 26 11 bl ffc0b2c4 <_Chain_Insert> rtems_chain_prepend (&r_chain->perfd, &req->next_prio); r_chain->new_fd = 0; ffc08cb8: 93 dc 00 18 stw r30,24(r28) pthread_mutex_init (&r_chain->mutex, NULL); ffc08cbc: 38 80 00 00 li r4,0 ffc08cc0: 7f 63 db 78 mr r3,r27 ffc08cc4: 48 00 08 39 bl ffc094fc pthread_cond_init (&r_chain->cond, NULL); ffc08cc8: 38 80 00 00 li r4,0 ffc08ccc: 7f 43 d3 78 mr r3,r26 ffc08cd0: 48 00 03 e1 bl ffc090b0 AIO_printf ("New thread \n"); result = pthread_create (&thid, &aio_request_queue.attr, ffc08cd4: 3c a0 ff c1 lis r5,-63 ffc08cd8: 38 61 00 08 addi r3,r1,8 ffc08cdc: 38 9f 00 08 addi r4,r31,8 ffc08ce0: 38 a5 88 64 addi r5,r5,-30620 ffc08ce4: 7f 86 e3 78 mr r6,r28 ffc08ce8: 48 00 0b c1 bl ffc098a8 rtems_aio_handle, (void *) r_chain); if (result != 0) { ffc08cec: 7c 7d 1b 79 mr. r29,r3 ffc08cf0: 41 a2 00 14 beq+ ffc08d04 <== ALWAYS TAKEN pthread_mutex_unlock (&aio_request_queue.mutex); ffc08cf4: 7f e3 fb 78 mr r3,r31 <== NOT EXECUTED ffc08cf8: 48 00 0a 09 bl ffc09700 <== NOT EXECUTED return result; ffc08cfc: 7f be eb 78 mr r30,r29 <== NOT EXECUTED ffc08d00: 48 00 01 04 b ffc08e04 <== NOT EXECUTED } ++aio_request_queue.active_threads; ffc08d04: 81 3f 00 64 lwz r9,100(r31) ffc08d08: 38 09 00 01 addi r0,r9,1 ffc08d0c: 90 1f 00 64 stw r0,100(r31) ffc08d10: 48 00 00 e8 b ffc08df8 } else { /* put request in the fd chain it belongs to */ pthread_mutex_lock (&r_chain->mutex); ffc08d14: 7f 63 db 78 mr r3,r27 ffc08d18: 48 00 09 45 bl ffc0965c rtems_aio_insert_prio (&r_chain->perfd, req); ffc08d1c: 7f 23 cb 78 mr r3,r25 ffc08d20: 7f a4 eb 78 mr r4,r29 ffc08d24: 4b ff fd 8d bl ffc08ab0 pthread_cond_signal (&r_chain->cond); ffc08d28: 7f 43 d3 78 mr r3,r26 ffc08d2c: 48 00 04 49 bl ffc09174 pthread_mutex_unlock (&r_chain->mutex); ffc08d30: 7f 63 db 78 mr r3,r27 ffc08d34: 48 00 00 48 b ffc08d7c 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, ffc08d38: 3f 80 00 00 lis r28,0 ffc08d3c: 80 89 00 00 lwz r4,0(r9) ffc08d40: 3b 9c 2c b8 addi r28,r28,11448 ffc08d44: 7f 83 e3 78 mr r3,r28 ffc08d48: 38 a0 00 00 li r5,0 ffc08d4c: 4b ff f9 f9 bl ffc08744 req->aiocbp->aio_fildes, 0); if (r_chain != NULL) ffc08d50: 7c 7f 1b 79 mr. r31,r3 ffc08d54: 41 82 00 30 beq- ffc08d84 { pthread_mutex_lock (&r_chain->mutex); ffc08d58: 3b 9f 00 1c addi r28,r31,28 ffc08d5c: 7f 83 e3 78 mr r3,r28 ffc08d60: 48 00 08 fd bl ffc0965c rtems_aio_insert_prio (&r_chain->perfd, req); ffc08d64: 38 7f 00 08 addi r3,r31,8 ffc08d68: 7f a4 eb 78 mr r4,r29 ffc08d6c: 4b ff fd 45 bl ffc08ab0 pthread_cond_signal (&r_chain->cond); ffc08d70: 38 7f 00 20 addi r3,r31,32 ffc08d74: 48 00 04 01 bl ffc09174 pthread_mutex_unlock (&r_chain->mutex); ffc08d78: 7f 83 e3 78 mr r3,r28 ffc08d7c: 48 00 09 85 bl ffc09700 ffc08d80: 48 00 00 78 b ffc08df8 } else { /* or to the idle chain */ chain = &aio_request_queue.idle_req; r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1); ffc08d84: 81 3d 00 14 lwz r9,20(r29) ffc08d88: 38 7c 00 0c addi r3,r28,12 ffc08d8c: 38 a0 00 01 li r5,1 ffc08d90: 80 89 00 00 lwz r4,0(r9) ffc08d94: 4b ff f9 b1 bl ffc08744 if (r_chain->new_fd == 1) { ffc08d98: 80 03 00 18 lwz r0,24(r3) } else { /* or to the idle chain */ chain = &aio_request_queue.idle_req; r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1); ffc08d9c: 7c 7c 1b 78 mr r28,r3 ffc08da0: 38 63 00 08 addi r3,r3,8 if (r_chain->new_fd == 1) { ffc08da4: 2f 80 00 01 cmpwi cr7,r0,1 ffc08da8: 40 be 00 2c bne+ cr7,ffc08dd4 ffc08dac: 7f a4 eb 78 mr r4,r29 ffc08db0: 48 00 25 15 bl ffc0b2c4 <_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; ffc08db4: 93 fc 00 18 stw r31,24(r28) pthread_mutex_init (&r_chain->mutex, NULL); ffc08db8: 38 7c 00 1c addi r3,r28,28 ffc08dbc: 38 80 00 00 li r4,0 ffc08dc0: 48 00 07 3d bl ffc094fc pthread_cond_init (&r_chain->cond, NULL); ffc08dc4: 38 7c 00 20 addi r3,r28,32 ffc08dc8: 38 80 00 00 li r4,0 ffc08dcc: 48 00 02 e5 bl ffc090b0 ffc08dd0: 48 00 00 0c b ffc08ddc } else /* just insert the request in the existing fd chain */ rtems_aio_insert_prio (&r_chain->perfd, req); ffc08dd4: 7f a4 eb 78 mr r4,r29 ffc08dd8: 4b ff fc d9 bl ffc08ab0 if (aio_request_queue.idle_threads > 0) ffc08ddc: 3c 60 00 00 lis r3,0 ffc08de0: 38 63 2c 70 addi r3,r3,11376 ffc08de4: 80 03 00 68 lwz r0,104(r3) ffc08de8: 2f 80 00 00 cmpwi cr7,r0,0 ffc08dec: 40 9d 00 0c ble- cr7,ffc08df8 <== ALWAYS TAKEN pthread_cond_signal (&aio_request_queue.new_req); ffc08df0: 38 63 00 04 addi r3,r3,4 <== NOT EXECUTED ffc08df4: 48 00 03 81 bl ffc09174 <== NOT EXECUTED } } pthread_mutex_unlock (&aio_request_queue.mutex); ffc08df8: 3c 60 00 00 lis r3,0 ffc08dfc: 38 63 2c 70 addi r3,r3,11376 ffc08e00: 48 00 09 01 bl ffc09700 return 0; } ffc08e04: 39 61 00 58 addi r11,r1,88 ffc08e08: 7f c3 f3 78 mr r3,r30 ffc08e0c: 4b ff 7d 14 b ffc00b20 <_restgpr_25_x> =============================================================================== ffc08864 : * NULL - if error */ static void * rtems_aio_handle (void *arg) { ffc08864: 94 21 ff 98 stwu r1,-104(r1) ffc08868: 7c 08 02 a6 mflr r0 ffc0886c: be 81 00 38 stmw r20,56(r1) struct timespec timeout; AIO_printf ("Chain is empty [WQ], wait for work\n"); pthread_mutex_unlock (&r_chain->mutex); pthread_mutex_lock (&aio_request_queue.mutex); ffc08870: 3f e0 00 00 lis r31,0 ffc08874: 3b ff 2c 70 addi r31,r31,11376 * NULL - if error */ static void * rtems_aio_handle (void *arg) { ffc08878: 90 01 00 6c stw r0,108(r1) ffc0887c: 7c 7e 1b 78 mr r30,r3 pthread_mutex_unlock (&r_chain->mutex); pthread_mutex_lock (&aio_request_queue.mutex); if (rtems_chain_is_empty (chain)) { clock_gettime (CLOCK_REALTIME, &timeout); ffc08880: 3b 81 00 0c addi r28,r1,12 pthread_cond_destroy (&r_chain->cond); free (r_chain); /* If the idle chain is empty sleep for 3 seconds and wait for a signal. The thread now becomes idle. */ if (rtems_chain_is_empty (&aio_request_queue.idle_req)) { ffc08884: 3a df 00 58 addi r22,r31,88 --aio_request_queue.active_threads; clock_gettime (CLOCK_REALTIME, &timeout); timeout.tv_sec += 3; timeout.tv_nsec = 0; result = pthread_cond_timedwait (&aio_request_queue.new_req, ffc08888: 3a ff 00 04 addi r23,r31,4 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); ffc0888c: 3b 61 00 14 addi r27,r1,20 ffc08890: 3b 01 00 08 addi r24,r1,8 default: result = -1; } if (result == -1) { req->aiocbp->return_value = -1; ffc08894: 3b 20 ff ff li r25,-1 req->aiocbp->error_code = errno; } else { req->aiocbp->return_value = result; req->aiocbp->error_code = 0; ffc08898: 3b 40 00 00 li r26,0 /* 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); ffc0889c: 3a be 00 1c addi r21,r30,28 ffc088a0: 7e a3 ab 78 mr r3,r21 ffc088a4: 48 00 0d b9 bl ffc0965c if (result != 0) ffc088a8: 7c 74 1b 79 mr. r20,r3 ffc088ac: 40 82 01 f8 bne- ffc08aa4 <== NEVER TAKEN } } AIO_printf ("Thread finished\n"); return NULL; } ffc088b0: 83 be 00 08 lwz r29,8(r30) RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); ffc088b4: 38 1e 00 0c addi r0,r30,12 /* 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)) { ffc088b8: 7f 9d 00 00 cmpw cr7,r29,r0 ffc088bc: 41 9e 00 cc beq- cr7,ffc08988 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); ffc088c0: 48 00 16 79 bl ffc09f38 ffc088c4: 7f 04 c3 78 mr r4,r24 ffc088c8: 7f 65 db 78 mr r5,r27 ffc088cc: 48 00 12 15 bl ffc09ae0 param.sched_priority = req->priority; ffc088d0: 80 1d 00 0c lwz r0,12(r29) ffc088d4: 90 01 00 14 stw r0,20(r1) pthread_setschedparam (pthread_self(), req->policy, ¶m); ffc088d8: 48 00 16 61 bl ffc09f38 ffc088dc: 7f 65 db 78 mr r5,r27 ffc088e0: 80 9d 00 08 lwz r4,8(r29) ffc088e4: 48 00 16 65 bl ffc09f48 */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); ffc088e8: 7f a3 eb 78 mr r3,r29 ffc088ec: 48 00 29 71 bl ffc0b25c <_Chain_Extract> rtems_chain_extract (node); pthread_mutex_unlock (&r_chain->mutex); ffc088f0: 7e a3 ab 78 mr r3,r21 ffc088f4: 48 00 0e 0d bl ffc09700 switch (req->aiocbp->aio_lio_opcode) { ffc088f8: 81 3d 00 14 lwz r9,20(r29) ffc088fc: 80 09 00 30 lwz r0,48(r9) ffc08900: 2f 80 00 02 cmpwi cr7,r0,2 ffc08904: 41 9e 00 30 beq- cr7,ffc08934 ffc08908: 2f 80 00 03 cmpwi cr7,r0,3 ffc0890c: 41 9e 00 44 beq- cr7,ffc08950 <== NEVER TAKEN ffc08910: 2f 80 00 01 cmpwi cr7,r0,1 ffc08914: 40 be 00 4c bne+ cr7,ffc08960 <== NEVER TAKEN case LIO_READ: AIO_printf ("read\n"); result = pread (req->aiocbp->aio_fildes, ffc08918: 80 69 00 00 lwz r3,0(r9) ffc0891c: 80 89 00 10 lwz r4,16(r9) ffc08920: 80 a9 00 14 lwz r5,20(r9) ffc08924: 80 e9 00 08 lwz r7,8(r9) ffc08928: 81 09 00 0c lwz r8,12(r9) ffc0892c: 48 00 b7 31 bl ffc1405c (void *) req->aiocbp->aio_buf, req->aiocbp->aio_nbytes, req->aiocbp->aio_offset); break; ffc08930: 48 00 00 28 b ffc08958 case LIO_WRITE: AIO_printf ("write\n"); result = pwrite (req->aiocbp->aio_fildes, ffc08934: 80 69 00 00 lwz r3,0(r9) ffc08938: 80 89 00 10 lwz r4,16(r9) ffc0893c: 80 a9 00 14 lwz r5,20(r9) ffc08940: 80 e9 00 08 lwz r7,8(r9) ffc08944: 81 09 00 0c lwz r8,12(r9) ffc08948: 48 00 b8 4d bl ffc14194 (void *) req->aiocbp->aio_buf, req->aiocbp->aio_nbytes, req->aiocbp->aio_offset); break; ffc0894c: 48 00 00 0c b ffc08958 case LIO_SYNC: AIO_printf ("sync\n"); result = fsync (req->aiocbp->aio_fildes); ffc08950: 80 69 00 00 lwz r3,0(r9) <== NOT EXECUTED ffc08954: 48 00 70 bd bl ffc0fa10 <== NOT EXECUTED break; default: result = -1; } if (result == -1) { ffc08958: 2f 83 ff ff cmpwi cr7,r3,-1 ffc0895c: 40 be 00 1c bne+ cr7,ffc08978 <== ALWAYS TAKEN req->aiocbp->return_value = -1; ffc08960: 83 bd 00 14 lwz r29,20(r29) <== NOT EXECUTED ffc08964: 93 3d 00 38 stw r25,56(r29) <== NOT EXECUTED req->aiocbp->error_code = errno; ffc08968: 48 00 a7 91 bl ffc130f8 <__errno> <== NOT EXECUTED ffc0896c: 80 03 00 00 lwz r0,0(r3) <== NOT EXECUTED ffc08970: 90 1d 00 34 stw r0,52(r29) <== NOT EXECUTED ffc08974: 4b ff ff 28 b ffc0889c <== NOT EXECUTED } else { req->aiocbp->return_value = result; ffc08978: 81 3d 00 14 lwz r9,20(r29) ffc0897c: 90 69 00 38 stw r3,56(r9) req->aiocbp->error_code = 0; ffc08980: 93 49 00 34 stw r26,52(r9) ffc08984: 4b ff ff 18 b ffc0889c struct timespec timeout; AIO_printf ("Chain is empty [WQ], wait for work\n"); pthread_mutex_unlock (&r_chain->mutex); ffc08988: 7e a3 ab 78 mr r3,r21 ffc0898c: 48 00 0d 75 bl ffc09700 pthread_mutex_lock (&aio_request_queue.mutex); ffc08990: 7f e3 fb 78 mr r3,r31 ffc08994: 48 00 0c c9 bl ffc0965c if (rtems_chain_is_empty (chain)) ffc08998: 80 1e 00 08 lwz r0,8(r30) ffc0899c: 7f 80 e8 00 cmpw cr7,r0,r29 ffc089a0: 40 be 00 f8 bne+ cr7,ffc08a98 <== NEVER TAKEN { clock_gettime (CLOCK_REALTIME, &timeout); ffc089a4: 7f 84 e3 78 mr r4,r28 ffc089a8: 38 60 00 01 li r3,1 ffc089ac: 48 00 05 a5 bl ffc08f50 timeout.tv_sec += 3; ffc089b0: 81 21 00 0c lwz r9,12(r1) timeout.tv_nsec = 0; result = pthread_cond_timedwait (&r_chain->cond, ffc089b4: 3b be 00 20 addi r29,r30,32 if (rtems_chain_is_empty (chain)) { clock_gettime (CLOCK_REALTIME, &timeout); timeout.tv_sec += 3; timeout.tv_nsec = 0; ffc089b8: 92 81 00 10 stw r20,16(r1) pthread_mutex_lock (&aio_request_queue.mutex); if (rtems_chain_is_empty (chain)) { clock_gettime (CLOCK_REALTIME, &timeout); timeout.tv_sec += 3; ffc089bc: 38 09 00 03 addi r0,r9,3 timeout.tv_nsec = 0; result = pthread_cond_timedwait (&r_chain->cond, ffc089c0: 7f a3 eb 78 mr r3,r29 pthread_mutex_lock (&aio_request_queue.mutex); if (rtems_chain_is_empty (chain)) { clock_gettime (CLOCK_REALTIME, &timeout); timeout.tv_sec += 3; ffc089c4: 90 01 00 0c stw r0,12(r1) timeout.tv_nsec = 0; result = pthread_cond_timedwait (&r_chain->cond, ffc089c8: 7f e4 fb 78 mr r4,r31 ffc089cc: 7f 85 e3 78 mr r5,r28 ffc089d0: 48 00 08 41 bl ffc09210 &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) { ffc089d4: 2f 83 00 74 cmpwi cr7,r3,116 ffc089d8: 40 be 00 c0 bne+ cr7,ffc08a98 <== NEVER TAKEN ffc089dc: 7f c3 f3 78 mr r3,r30 ffc089e0: 48 00 28 7d bl ffc0b25c <_Chain_Extract> rtems_chain_extract (&r_chain->next_fd); pthread_mutex_destroy (&r_chain->mutex); ffc089e4: 7e a3 ab 78 mr r3,r21 ffc089e8: 48 00 09 a9 bl ffc09390 pthread_cond_destroy (&r_chain->cond); ffc089ec: 7f a3 eb 78 mr r3,r29 ffc089f0: 48 00 05 d9 bl ffc08fc8 free (r_chain); ffc089f4: 7f c3 f3 78 mr r3,r30 ffc089f8: 4b ff c5 bd bl ffc04fb4 /* 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)) { ffc089fc: 80 1f 00 54 lwz r0,84(r31) ffc08a00: 7f 80 b0 00 cmpw cr7,r0,r22 ffc08a04: 40 be 00 68 bne+ cr7,ffc08a6c AIO_printf ("Chain is empty [IQ], wait for work\n"); ++aio_request_queue.idle_threads; ffc08a08: 81 3f 00 68 lwz r9,104(r31) --aio_request_queue.active_threads; clock_gettime (CLOCK_REALTIME, &timeout); ffc08a0c: 7f 84 e3 78 mr r4,r28 ffc08a10: 38 60 00 01 li r3,1 /* If the idle chain is empty sleep for 3 seconds and wait for a signal. The thread now becomes idle. */ if (rtems_chain_is_empty (&aio_request_queue.idle_req)) { AIO_printf ("Chain is empty [IQ], wait for work\n"); ++aio_request_queue.idle_threads; ffc08a14: 38 09 00 01 addi r0,r9,1 --aio_request_queue.active_threads; ffc08a18: 81 3f 00 64 lwz r9,100(r31) /* If the idle chain is empty sleep for 3 seconds and wait for a signal. The thread now becomes idle. */ if (rtems_chain_is_empty (&aio_request_queue.idle_req)) { AIO_printf ("Chain is empty [IQ], wait for work\n"); ++aio_request_queue.idle_threads; ffc08a1c: 90 1f 00 68 stw r0,104(r31) --aio_request_queue.active_threads; ffc08a20: 38 09 ff ff addi r0,r9,-1 ffc08a24: 90 1f 00 64 stw r0,100(r31) clock_gettime (CLOCK_REALTIME, &timeout); ffc08a28: 48 00 05 29 bl ffc08f50 timeout.tv_sec += 3; ffc08a2c: 81 21 00 0c lwz r9,12(r1) timeout.tv_nsec = 0; result = pthread_cond_timedwait (&aio_request_queue.new_req, ffc08a30: 7e e3 bb 78 mr r3,r23 ++aio_request_queue.idle_threads; --aio_request_queue.active_threads; clock_gettime (CLOCK_REALTIME, &timeout); timeout.tv_sec += 3; timeout.tv_nsec = 0; ffc08a34: 92 81 00 10 stw r20,16(r1) AIO_printf ("Chain is empty [IQ], wait for work\n"); ++aio_request_queue.idle_threads; --aio_request_queue.active_threads; clock_gettime (CLOCK_REALTIME, &timeout); timeout.tv_sec += 3; ffc08a38: 38 09 00 03 addi r0,r9,3 timeout.tv_nsec = 0; result = pthread_cond_timedwait (&aio_request_queue.new_req, ffc08a3c: 7f e4 fb 78 mr r4,r31 AIO_printf ("Chain is empty [IQ], wait for work\n"); ++aio_request_queue.idle_threads; --aio_request_queue.active_threads; clock_gettime (CLOCK_REALTIME, &timeout); timeout.tv_sec += 3; ffc08a40: 90 01 00 0c stw r0,12(r1) timeout.tv_nsec = 0; result = pthread_cond_timedwait (&aio_request_queue.new_req, ffc08a44: 7f 85 e3 78 mr r5,r28 ffc08a48: 48 00 07 c9 bl ffc09210 &aio_request_queue.mutex, &timeout); /* If no new fd chain was added in the idle requests then this thread is finished */ if (result == ETIMEDOUT) { ffc08a4c: 2f 83 00 74 cmpwi cr7,r3,116 ffc08a50: 40 be 00 1c bne+ cr7,ffc08a6c <== NEVER TAKEN AIO_printf ("Etimeout\n"); --aio_request_queue.idle_threads; ffc08a54: 81 3f 00 68 lwz r9,104(r31) pthread_mutex_unlock (&aio_request_queue.mutex); ffc08a58: 7f e3 fb 78 mr r3,r31 /* If no new fd chain was added in the idle requests then this thread is finished */ if (result == ETIMEDOUT) { AIO_printf ("Etimeout\n"); --aio_request_queue.idle_threads; ffc08a5c: 38 09 ff ff addi r0,r9,-1 ffc08a60: 90 1f 00 68 stw r0,104(r31) pthread_mutex_unlock (&aio_request_queue.mutex); ffc08a64: 48 00 0c 9d bl ffc09700 return NULL; ffc08a68: 48 00 00 3c b ffc08aa4 } } /* 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; ffc08a6c: 81 3f 00 68 lwz r9,104(r31) } } AIO_printf ("Thread finished\n"); return NULL; } ffc08a70: 83 df 00 54 lwz r30,84(r31) } } /* 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; ffc08a74: 38 09 ff ff addi r0,r9,-1 ++aio_request_queue.active_threads; ffc08a78: 81 3f 00 64 lwz r9,100(r31) } } /* 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; ffc08a7c: 90 1f 00 68 stw r0,104(r31) ffc08a80: 7f c3 f3 78 mr r3,r30 ++aio_request_queue.active_threads; ffc08a84: 38 09 00 01 addi r0,r9,1 ffc08a88: 90 1f 00 64 stw r0,100(r31) ffc08a8c: 48 00 27 d1 bl ffc0b25c <_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); ffc08a90: 7f c3 f3 78 mr r3,r30 ffc08a94: 4b ff fd 79 bl ffc0880c } } /* 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); ffc08a98: 7f e3 fb 78 mr r3,r31 ffc08a9c: 48 00 0c 65 bl ffc09700 ffc08aa0: 4b ff fd fc b ffc0889c } } AIO_printf ("Thread finished\n"); return NULL; } ffc08aa4: 39 61 00 68 addi r11,r1,104 ffc08aa8: 38 60 00 00 li r3,0 ffc08aac: 4b ff 80 60 b ffc00b0c <_restgpr_20_x> =============================================================================== ffc08660 : * 0 - if initialization succeeded */ int rtems_aio_init (void) { ffc08660: 94 21 ff f0 stwu r1,-16(r1) ffc08664: 7c 08 02 a6 mflr r0 ffc08668: bf c1 00 08 stmw r30,8(r1) int result = 0; result = pthread_attr_init (&aio_request_queue.attr); ffc0866c: 3f e0 00 00 lis r31,0 ffc08670: 3b ff 2c 78 addi r31,r31,11384 ffc08674: 7f e3 fb 78 mr r3,r31 * 0 - if initialization succeeded */ int rtems_aio_init (void) { ffc08678: 90 01 00 14 stw r0,20(r1) int result = 0; result = pthread_attr_init (&aio_request_queue.attr); ffc0867c: 48 00 11 bd bl ffc09838 if (result != 0) ffc08680: 7c 7e 1b 79 mr. r30,r3 ffc08684: 40 a2 00 b4 bne+ ffc08738 <== NEVER TAKEN return result; result = ffc08688: 7f e3 fb 78 mr r3,r31 ffc0868c: 38 80 00 00 li r4,0 ffc08690: 48 00 11 e9 bl ffc09878 pthread_attr_setdetachstate (&aio_request_queue.attr, PTHREAD_CREATE_DETACHED); if (result != 0) ffc08694: 2f 83 00 00 cmpwi cr7,r3,0 ffc08698: 41 be 00 0c beq+ cr7,ffc086a4 <== ALWAYS TAKEN pthread_attr_destroy (&aio_request_queue.attr); ffc0869c: 7f e3 fb 78 mr r3,r31 <== NOT EXECUTED ffc086a0: 48 00 11 71 bl ffc09810 <== NOT EXECUTED result = pthread_mutex_init (&aio_request_queue.mutex, NULL); ffc086a4: 3f e0 00 00 lis r31,0 ffc086a8: 3b ff 2c 70 addi r31,r31,11376 ffc086ac: 7f e3 fb 78 mr r3,r31 ffc086b0: 38 80 00 00 li r4,0 ffc086b4: 48 00 0e 49 bl ffc094fc if (result != 0) ffc086b8: 2f 83 00 00 cmpwi cr7,r3,0 ffc086bc: 41 be 00 0c beq+ cr7,ffc086c8 <== ALWAYS TAKEN pthread_attr_destroy (&aio_request_queue.attr); ffc086c0: 38 7f 00 08 addi r3,r31,8 <== NOT EXECUTED ffc086c4: 48 00 11 4d bl ffc09810 <== NOT EXECUTED result = pthread_cond_init (&aio_request_queue.new_req, NULL); ffc086c8: 3f e0 00 00 lis r31,0 ffc086cc: 3b ff 2c 74 addi r31,r31,11380 ffc086d0: 7f e3 fb 78 mr r3,r31 ffc086d4: 38 80 00 00 li r4,0 ffc086d8: 48 00 09 d9 bl ffc090b0 if (result != 0) { ffc086dc: 7c 7e 1b 79 mr. r30,r3 ffc086e0: 41 a2 00 14 beq+ ffc086f4 <== ALWAYS TAKEN pthread_mutex_destroy (&aio_request_queue.mutex); ffc086e4: 38 7f ff fc addi r3,r31,-4 <== NOT EXECUTED ffc086e8: 48 00 0c a9 bl ffc09390 <== NOT EXECUTED pthread_attr_destroy (&aio_request_queue.attr); ffc086ec: 38 7f 00 04 addi r3,r31,4 <== NOT EXECUTED ffc086f0: 48 00 11 21 bl ffc09810 <== NOT EXECUTED ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; ffc086f4: 3d 20 00 00 lis r9,0 ffc086f8: 39 29 2c 70 addi r9,r9,11376 ffc086fc: 38 09 00 4c addi r0,r9,76 head->previous = NULL; tail->previous = head; ffc08700: 39 69 00 48 addi r11,r9,72 ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; ffc08704: 90 09 00 48 stw r0,72(r9) head->previous = NULL; ffc08708: 38 00 00 00 li r0,0 tail->previous = head; ffc0870c: 91 69 00 50 stw r11,80(r9) ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; ffc08710: 39 69 00 58 addi r11,r9,88 head->previous = NULL; ffc08714: 90 09 00 4c stw r0,76(r9) ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; ffc08718: 91 69 00 54 stw r11,84(r9) head->previous = NULL; tail->previous = head; ffc0871c: 39 69 00 54 addi r11,r9,84 { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; head->previous = NULL; ffc08720: 90 09 00 58 stw r0,88(r9) } rtems_chain_initialize_empty (&aio_request_queue.work_req); rtems_chain_initialize_empty (&aio_request_queue.idle_req); aio_request_queue.active_threads = 0; ffc08724: 90 09 00 64 stw r0,100(r9) aio_request_queue.idle_threads = 0; ffc08728: 90 09 00 68 stw r0,104(r9) aio_request_queue.initialized = AIO_QUEUE_INITIALIZED; ffc0872c: 60 00 b0 0b ori r0,r0,45067 tail->previous = head; ffc08730: 91 69 00 5c stw r11,92(r9) ffc08734: 90 09 00 60 stw r0,96(r9) return result; } ffc08738: 39 61 00 10 addi r11,r1,16 ffc0873c: 7f c3 f3 78 mr r3,r30 ffc08740: 4b ff 83 f4 b ffc00b34 <_restgpr_30_x> =============================================================================== ffc08ab0 : * NONE */ void rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req) { ffc08ab0: 94 21 ff f8 stwu r1,-8(r1) ffc08ab4: 7c 08 02 a6 mflr r0 ffc08ab8: 7c 8b 23 78 mr r11,r4 ffc08abc: 90 01 00 0c stw r0,12(r1) ffc08ac0: 38 03 00 04 addi r0,r3,4 } } AIO_printf ("Thread finished\n"); return NULL; } ffc08ac4: 81 23 00 00 lwz r9,0(r3) rtems_chain_node *node; AIO_printf ("FD exists \n"); node = rtems_chain_first (chain); if (rtems_chain_is_empty (chain)) { ffc08ac8: 7f 89 00 00 cmpw cr7,r9,r0 ffc08acc: 41 9e 00 3c beq- cr7,ffc08b08 <== 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; ffc08ad0: 81 49 00 14 lwz r10,20(r9) while (req->aiocbp->aio_reqprio > prio && ffc08ad4: 81 04 00 14 lwz r8,20(r4) if (rtems_chain_is_empty (chain)) { AIO_printf ("First in chain \n"); rtems_chain_prepend (chain, &req->next_prio); } else { AIO_printf ("Add by priority \n"); int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio; ffc08ad8: 81 4a 00 18 lwz r10,24(r10) while (req->aiocbp->aio_reqprio > prio && ffc08adc: 81 08 00 18 lwz r8,24(r8) ffc08ae0: 48 00 00 10 b ffc08af0 } } AIO_printf ("Thread finished\n"); return NULL; } ffc08ae4: 81 29 00 00 lwz r9,0(r9) <== 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; ffc08ae8: 81 49 00 14 lwz r10,20(r9) <== NOT EXECUTED ffc08aec: 81 4a 00 18 lwz r10,24(r10) <== 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 && ffc08af0: 7f 88 50 00 cmpw cr7,r8,r10 ffc08af4: 40 9d 00 0c ble- cr7,ffc08b00 <== ALWAYS TAKEN ffc08af8: 7f 89 00 00 cmpw cr7,r9,r0 <== NOT EXECUTED ffc08afc: 40 9e ff e8 bne+ cr7,ffc08ae4 <== 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 ); ffc08b00: 80 69 00 04 lwz r3,4(r9) ffc08b04: 7d 64 5b 78 mr r4,r11 ffc08b08: 48 00 27 bd bl ffc0b2c4 <_Chain_Insert> } rtems_chain_insert (node->previous, &req->next_prio); } } ffc08b0c: 80 01 00 0c lwz r0,12(r1) ffc08b10: 38 21 00 08 addi r1,r1,8 ffc08b14: 7c 08 03 a6 mtlr r0 ffc08b18: 4e 80 00 20 blr =============================================================================== ffc0880c : * NONE */ void rtems_aio_move_to_work (rtems_aio_request_chain *r_chain) { ffc0880c: 94 21 ff f8 stwu r1,-8(r1) ffc08810: 7c 08 02 a6 mflr r0 } } AIO_printf ("Thread finished\n"); return NULL; } ffc08814: 3d 60 00 00 lis r11,0 * NONE */ void rtems_aio_move_to_work (rtems_aio_request_chain *r_chain) { ffc08818: 90 01 00 0c stw r0,12(r1) } } AIO_printf ("Thread finished\n"); return NULL; } ffc0881c: 39 6b 2c 70 addi r11,r11,11376 * NONE */ void rtems_aio_move_to_work (rtems_aio_request_chain *r_chain) { ffc08820: 7c 64 1b 78 mr r4,r3 } } AIO_printf ("Thread finished\n"); return NULL; } ffc08824: 81 2b 00 48 lwz r9,72(r11) 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 && ffc08828: 39 6b 00 4c addi r11,r11,76 ffc0882c: 80 03 00 14 lwz r0,20(r3) ffc08830: 48 00 00 08 b ffc08838 } } AIO_printf ("Thread finished\n"); return NULL; } ffc08834: 81 29 00 00 lwz r9,0(r9) 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 && ffc08838: 81 49 00 14 lwz r10,20(r9) ffc0883c: 7f 8a 00 00 cmpw cr7,r10,r0 ffc08840: 40 9c 00 0c bge- cr7,ffc0884c ffc08844: 7f 89 58 00 cmpw cr7,r9,r11 ffc08848: 40 9e ff ec bne+ cr7,ffc08834 <== ALWAYS TAKEN ffc0884c: 80 69 00 04 lwz r3,4(r9) ffc08850: 48 00 2a 75 bl ffc0b2c4 <_Chain_Insert> node = rtems_chain_next (node); temp = (rtems_aio_request_chain *) node; } rtems_chain_insert (rtems_chain_previous (node), &r_chain->next_fd); } ffc08854: 80 01 00 0c lwz r0,12(r1) ffc08858: 38 21 00 08 addi r1,r1,8 ffc0885c: 7c 08 03 a6 mtlr r0 ffc08860: 4e 80 00 20 blr =============================================================================== ffc08b74 : * 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) { ffc08b74: 7c 08 02 a6 mflr r0 ffc08b78: 7c 2b 0b 78 mr r11,r1 ffc08b7c: 94 21 ff f0 stwu r1,-16(r1) ffc08b80: 90 01 00 14 stw r0,20(r1) ffc08b84: 4b ff 7f 69 bl ffc00aec <_savegpr_31> RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); ffc08b88: 38 03 00 04 addi r0,r3,4 } } AIO_printf ("Thread finished\n"); return NULL; } ffc08b8c: 83 e3 00 00 lwz r31,0(r3) */ int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp) { if (rtems_chain_is_empty (chain)) return AIO_ALLDONE; ffc08b90: 38 60 00 02 li r3,2 * AIO_CANCELED - if request was canceled */ int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp) { if (rtems_chain_is_empty (chain)) ffc08b94: 7f 9f 00 00 cmpw cr7,r31,r0 ffc08b98: 40 be 00 14 bne+ cr7,ffc08bac ffc08b9c: 48 00 00 4c b ffc08be8 } } AIO_printf ("Thread finished\n"); return NULL; } ffc08ba0: 83 e3 00 00 lwz r31,0(r3) <== 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) { ffc08ba4: 7f 9f 00 00 cmpw cr7,r31,r0 <== NOT EXECUTED ffc08ba8: 41 9e 00 3c beq- cr7,ffc08be4 <== NOT EXECUTED ffc08bac: 81 3f 00 14 lwz r9,20(r31) node = rtems_chain_next (node); current = (rtems_aio_request *) node; ffc08bb0: 7f e3 fb 78 mr r3,r31 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) { ffc08bb4: 7f 89 20 00 cmpw cr7,r9,r4 ffc08bb8: 40 9e ff e8 bne+ cr7,ffc08ba0 <== NEVER TAKEN ffc08bbc: 48 00 26 a1 bl ffc0b25c <_Chain_Extract> if (rtems_chain_is_tail (chain, node)) return AIO_NOTCANCELED; else { rtems_chain_extract (node); current->aiocbp->error_code = ECANCELED; ffc08bc0: 81 3f 00 14 lwz r9,20(r31) ffc08bc4: 38 00 00 8c li r0,140 ffc08bc8: 90 09 00 34 stw r0,52(r9) current->aiocbp->return_value = -1; ffc08bcc: 38 00 ff ff li r0,-1 free (current); ffc08bd0: 7f e3 fb 78 mr r3,r31 return AIO_NOTCANCELED; else { rtems_chain_extract (node); current->aiocbp->error_code = ECANCELED; current->aiocbp->return_value = -1; ffc08bd4: 90 09 00 38 stw r0,56(r9) free (current); ffc08bd8: 4b ff c3 dd bl ffc04fb4 } return AIO_CANCELED; ffc08bdc: 38 60 00 00 li r3,0 ffc08be0: 48 00 00 08 b ffc08be8 node = rtems_chain_next (node); current = (rtems_aio_request *) node; } if (rtems_chain_is_tail (chain, node)) return AIO_NOTCANCELED; ffc08be4: 38 60 00 01 li r3,1 <== NOT EXECUTED current->aiocbp->return_value = -1; free (current); } return AIO_CANCELED; } ffc08be8: 39 61 00 10 addi r11,r1,16 ffc08bec: 4b ff 7f 4c b ffc00b38 <_restgpr_31_x> =============================================================================== ffc08880 : rtems_chain_control *chain, rtems_event_set events, rtems_interval timeout, rtems_chain_node **node_ptr ) { ffc08880: 94 21 ff d0 stwu r1,-48(r1) ffc08884: 7c 08 02 a6 mflr r0 ffc08888: bf 41 00 18 stmw r26,24(r1) ffc0888c: 7c 7a 1b 78 mr r26,r3 ffc08890: 7c 9b 23 78 mr r27,r4 ffc08894: 90 01 00 34 stw r0,52(r1) ffc08898: 7c bc 2b 78 mr r28,r5 ffc0889c: 7c df 33 78 mr r31,r6 while ( sc == RTEMS_SUCCESSFUL && (node = rtems_chain_get( chain )) == NULL ) { rtems_event_set out; sc = rtems_event_receive( ffc088a0: 3b a1 00 08 addi r29,r1,8 ffc088a4: 48 00 00 20 b ffc088c4 ffc088a8: 7f 63 db 78 mr r3,r27 ffc088ac: 38 80 00 00 li r4,0 ffc088b0: 7f 85 e3 78 mr r5,r28 ffc088b4: 7f a6 eb 78 mr r6,r29 ffc088b8: 4b ff f2 b1 bl ffc07b68 ) { rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_chain_node *node = NULL; while ( ffc088bc: 2c 03 00 00 cmpwi r3,0 ffc088c0: 40 82 00 18 bne- ffc088d8 <== ALWAYS TAKEN */ RTEMS_INLINE_ROUTINE rtems_chain_node *rtems_chain_get( rtems_chain_control *the_chain ) { return _Chain_Get( the_chain ); ffc088c4: 7f 43 d3 78 mr r3,r26 ffc088c8: 48 00 06 7d bl ffc08f44 <_Chain_Get> sc == RTEMS_SUCCESSFUL && (node = rtems_chain_get( chain )) == NULL ffc088cc: 7c 7e 1b 79 mr. r30,r3 ffc088d0: 41 82 ff d8 beq+ ffc088a8 ffc088d4: 38 60 00 00 li r3,0 } *node_ptr = node; return sc; } ffc088d8: 39 61 00 30 addi r11,r1,48 timeout, &out ); } *node_ptr = node; ffc088dc: 93 df 00 00 stw r30,0(r31) return sc; } ffc088e0: 48 00 d2 90 b ffc15b70 <_restgpr_26_x> =============================================================================== ffc048a8 : void rtems_cpu_usage_report_with_plugin( void *context, rtems_printk_plugin_t print ) { ffc048a8: 94 21 ff 58 stwu r1,-168(r1) ffc048ac: 7c 08 02 a6 mflr r0 ffc048b0: 90 01 00 ac stw r0,172(r1) Timestamp_Control uptime, total, ran, uptime_at_last_reset; #else uint32_t total_units = 0; #endif if ( !print ) ffc048b4: 7c 80 23 79 mr. r0,r4 void rtems_cpu_usage_report_with_plugin( void *context, rtems_printk_plugin_t print ) { ffc048b8: bd c1 00 60 stmw r14,96(r1) ffc048bc: 7c 7c 1b 78 mr r28,r3 Timestamp_Control uptime, total, ran, uptime_at_last_reset; #else uint32_t total_units = 0; #endif if ( !print ) ffc048c0: 90 01 00 58 stw r0,88(r1) ffc048c4: 41 82 01 f0 beq- ffc04ab4 <== NEVER TAKEN * 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__ _Timestamp_Set_to_zero( &total ); uptime_at_last_reset = CPU_usage_Uptime_at_last_reset; ffc048c8: 3d 20 00 00 lis r9,0 * 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__ _Timestamp_Set_to_zero( &total ); ffc048cc: 38 00 00 00 li r0,0 uptime_at_last_reset = CPU_usage_Uptime_at_last_reset; ffc048d0: 39 29 28 e0 addi r9,r9,10464 * 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__ _Timestamp_Set_to_zero( &total ); ffc048d4: 90 01 00 18 stw r0,24(r1) } } } #endif (*print)( ffc048d8: 3c 80 ff c2 lis r4,-62 * 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__ _Timestamp_Set_to_zero( &total ); uptime_at_last_reset = CPU_usage_Uptime_at_last_reset; ffc048dc: 81 49 00 04 lwz r10,4(r9) } } } #endif (*print)( ffc048e0: 38 84 f4 6b addi r4,r4,-2965 * 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__ _Timestamp_Set_to_zero( &total ); ffc048e4: 90 01 00 1c stw r0,28(r1) } } } #endif (*print)( ffc048e8: 3f c0 00 00 lis r30,0 ffc048ec: 3b de 30 80 addi r30,r30,12416 * 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__ _Timestamp_Set_to_zero( &total ); uptime_at_last_reset = CPU_usage_Uptime_at_last_reset; ffc048f0: 81 29 00 00 lwz r9,0(r9) if ( !the_thread ) continue; rtems_object_get_name( the_thread->Object.id, sizeof(name), name ); (*print)( ffc048f4: 3e 00 ff c2 lis r16,-62 } } } #endif (*print)( ffc048f8: 80 01 00 58 lwz r0,88(r1) /* * Print the information */ (*print)( context, ffc048fc: 3e a0 ff c2 lis r21,-62 * 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__ _Timestamp_Set_to_zero( &total ); uptime_at_last_reset = CPU_usage_Uptime_at_last_reset; ffc04900: 91 21 00 28 stw r9,40(r1) /*PAGE * * rtems_cpu_usage_report */ void rtems_cpu_usage_report_with_plugin( ffc04904: 39 fe 00 0c addi r15,r30,12 } } } #endif (*print)( ffc04908: 7c 09 03 a6 mtctr r0 the_thread = (Thread_Control *)information->local_table[ i ]; if ( !the_thread ) continue; rtems_object_get_name( the_thread->Object.id, sizeof(name), name ); ffc0490c: 3a e1 00 40 addi r23,r1,64 * 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__ _Timestamp_Set_to_zero( &total ); uptime_at_last_reset = CPU_usage_Uptime_at_last_reset; ffc04910: 91 41 00 2c stw r10,44(r1) if ( !the_thread ) continue; rtems_object_get_name( the_thread->Object.id, sizeof(name), name ); (*print)( ffc04914: 3a 10 f5 dd addi r16,r16,-2595 /* * If this is the currently executing thread, account for time * since the last context switch. */ ran = the_thread->cpu_time_used; if ( _Thread_Executing->Object.id == the_thread->Object.id ) { ffc04918: 3e 20 00 00 lis r17,0 ffc0491c: 3b e1 00 10 addi r31,r1,16 _Timestamp_Subtract( &last, &uptime, &used ); _Timestamp_Add_to( &ran, &used ); } else { _TOD_Get_uptime( &uptime ); } _Timestamp_Subtract( &uptime_at_last_reset, &uptime, &total ); ffc04920: 3a 41 00 28 addi r18,r1,40 } } } #endif (*print)( ffc04924: 4c c6 31 82 crclr 4*cr1+eq ffc04928: 4e 80 04 21 bctrl _Timestamp_Subtract( &last, &uptime, &used ); _Timestamp_Add_to( &ran, &used ); } else { _TOD_Get_uptime( &uptime ); } _Timestamp_Subtract( &uptime_at_last_reset, &uptime, &total ); ffc0492c: 3b 01 00 18 addi r24,r1,24 _Timestamp_Divide( &ran, &total, &ival, &fval ); ffc04930: 3b 21 00 20 addi r25,r1,32 ffc04934: 3a 61 00 0c addi r19,r1,12 ffc04938: 3a 81 00 08 addi r20,r1,8 /* * Print the information */ (*print)( context, ffc0493c: 3a b5 f5 f0 addi r21,r21,-2576 ffc04940: 3a c0 03 e8 li r22,1000 * since the last context switch. */ ran = the_thread->cpu_time_used; if ( _Thread_Executing->Object.id == the_thread->Object.id ) { Timestamp_Control used; Timestamp_Control last = _Thread_Time_of_last_context_switch; ffc04944: 3d c0 00 00 lis r14,0 _TOD_Get_uptime( &uptime ); _Timestamp_Subtract( &last, &uptime, &used ); ffc04948: 3b 41 00 30 addi r26,r1,48 #if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG) if ( !_Objects_Information_table[ api_index ] ) continue; #endif information = _Objects_Information_table[ api_index ][ 1 ]; ffc0494c: 85 3e 00 04 lwzu r9,4(r30) if ( information ) { ffc04950: 3b a0 00 01 li r29,1 #if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG) if ( !_Objects_Information_table[ api_index ] ) continue; #endif information = _Objects_Information_table[ api_index ][ 1 ]; ffc04954: 83 69 00 04 lwz r27,4(r9) if ( information ) { ffc04958: 2f 9b 00 00 cmpwi cr7,r27,0 ffc0495c: 40 be 01 18 bne+ cr7,ffc04a74 <== ALWAYS TAKEN ffc04960: 48 00 01 20 b ffc04a80 <== NOT EXECUTED for ( i=1 ; i <= information->maximum ; i++ ) { the_thread = (Thread_Control *)information->local_table[ i ]; ffc04964: 81 3b 00 1c lwz r9,28(r27) ffc04968: 57 a0 10 3a rlwinm r0,r29,2,0,29 ffc0496c: 7d 29 00 2e lwzx r9,r9,r0 if ( !the_thread ) ffc04970: 2f 89 00 00 cmpwi cr7,r9,0 ffc04974: 41 9e 00 fc beq- cr7,ffc04a70 <== NEVER TAKEN continue; rtems_object_get_name( the_thread->Object.id, sizeof(name), name ); ffc04978: 80 69 00 08 lwz r3,8(r9) ffc0497c: 38 80 00 0d li r4,13 ffc04980: 7e e5 bb 78 mr r5,r23 ffc04984: 91 21 00 5c stw r9,92(r1) ffc04988: 48 00 47 09 bl ffc09090 (*print)( ffc0498c: 7f 83 e3 78 mr r3,r28 ffc04990: 81 21 00 5c lwz r9,92(r1) ffc04994: 7e 04 83 78 mr r4,r16 ffc04998: 80 01 00 58 lwz r0,88(r1) ffc0499c: 7e e6 bb 78 mr r6,r23 ffc049a0: 80 a9 00 08 lwz r5,8(r9) ffc049a4: 7c 09 03 a6 mtctr r0 ffc049a8: 4c c6 31 82 crclr 4*cr1+eq ffc049ac: 4e 80 04 21 bctrl #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; ffc049b0: 81 21 00 5c lwz r9,92(r1) ffc049b4: 81 69 00 84 lwz r11,132(r9) if ( _Thread_Executing->Object.id == the_thread->Object.id ) { ffc049b8: 80 09 00 08 lwz r0,8(r9) #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; ffc049bc: 91 61 00 20 stw r11,32(r1) if ( _Thread_Executing->Object.id == the_thread->Object.id ) { ffc049c0: 39 71 35 a4 addi r11,r17,13732 ffc049c4: 81 6b 00 0c lwz r11,12(r11) #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; ffc049c8: 81 89 00 88 lwz r12,136(r9) if ( _Thread_Executing->Object.id == the_thread->Object.id ) { ffc049cc: 81 6b 00 08 lwz r11,8(r11) #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; ffc049d0: 91 81 00 24 stw r12,36(r1) if ( _Thread_Executing->Object.id == the_thread->Object.id ) { ffc049d4: 7f 8b 00 00 cmpw cr7,r11,r0 ffc049d8: 40 be 00 40 bne+ cr7,ffc04a18 Timestamp_Control used; Timestamp_Control last = _Thread_Time_of_last_context_switch; ffc049dc: 39 2e 28 c4 addi r9,r14,10436 ffc049e0: 81 49 00 04 lwz r10,4(r9) _TOD_Get_uptime( &uptime ); ffc049e4: 7f e3 fb 78 mr r3,r31 * since the last context switch. */ ran = the_thread->cpu_time_used; if ( _Thread_Executing->Object.id == the_thread->Object.id ) { Timestamp_Control used; Timestamp_Control last = _Thread_Time_of_last_context_switch; ffc049e8: 81 29 00 00 lwz r9,0(r9) ffc049ec: 91 41 00 3c stw r10,60(r1) ffc049f0: 91 21 00 38 stw r9,56(r1) _TOD_Get_uptime( &uptime ); ffc049f4: 48 00 5c d1 bl ffc0a6c4 <_TOD_Get_uptime> _Timestamp_Subtract( &last, &uptime, &used ); ffc049f8: 38 61 00 38 addi r3,r1,56 ffc049fc: 7f e4 fb 78 mr r4,r31 ffc04a00: 7f 45 d3 78 mr r5,r26 ffc04a04: 48 00 84 b1 bl ffc0ceb4 <_Timespec_Subtract> _Timestamp_Add_to( &ran, &used ); ffc04a08: 7f 23 cb 78 mr r3,r25 ffc04a0c: 7f 44 d3 78 mr r4,r26 ffc04a10: 48 00 83 85 bl ffc0cd94 <_Timespec_Add_to> ffc04a14: 48 00 00 0c b ffc04a20 } else { _TOD_Get_uptime( &uptime ); ffc04a18: 7f e3 fb 78 mr r3,r31 ffc04a1c: 48 00 5c a9 bl ffc0a6c4 <_TOD_Get_uptime> } _Timestamp_Subtract( &uptime_at_last_reset, &uptime, &total ); ffc04a20: 7e 43 93 78 mr r3,r18 ffc04a24: 7f e4 fb 78 mr r4,r31 ffc04a28: 7f 05 c3 78 mr r5,r24 ffc04a2c: 48 00 84 89 bl ffc0ceb4 <_Timespec_Subtract> _Timestamp_Divide( &ran, &total, &ival, &fval ); ffc04a30: 7f 23 cb 78 mr r3,r25 ffc04a34: 7f 04 c3 78 mr r4,r24 ffc04a38: 7e 85 a3 78 mr r5,r20 ffc04a3c: 7e 66 9b 78 mr r6,r19 ffc04a40: 48 00 83 b1 bl ffc0cdf0 <_Timespec_Divide> /* * Print the information */ (*print)( context, ffc04a44: 80 c1 00 24 lwz r6,36(r1) ffc04a48: 80 01 00 58 lwz r0,88(r1) ffc04a4c: 7f 83 e3 78 mr r3,r28 ffc04a50: 7e a4 ab 78 mr r4,r21 ffc04a54: 80 a1 00 20 lwz r5,32(r1) ffc04a58: 7c c6 b3 96 divwu r6,r6,r22 ffc04a5c: 80 e1 00 08 lwz r7,8(r1) ffc04a60: 81 01 00 0c lwz r8,12(r1) ffc04a64: 7c 09 03 a6 mtctr r0 ffc04a68: 4c c6 31 82 crclr 4*cr1+eq ffc04a6c: 4e 80 04 21 bctrl continue; #endif information = _Objects_Information_table[ api_index ][ 1 ]; if ( information ) { for ( i=1 ; i <= information->maximum ; i++ ) { ffc04a70: 3b bd 00 01 addi r29,r29,1 ffc04a74: a0 1b 00 10 lhz r0,16(r27) ffc04a78: 7f 9d 00 40 cmplw cr7,r29,r0 ffc04a7c: 40 9d fe e8 ble+ cr7,ffc04964 " ID | NAME | TICKS | PERCENT\n" #endif "------------+----------------------------------------+---------------+---------\n" ); for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) { ffc04a80: 7f 9e 78 00 cmpw cr7,r30,r15 ffc04a84: 40 9e fe c8 bne+ cr7,ffc0494c } } } #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ (*print)( ffc04a88: 80 c1 00 1c lwz r6,28(r1) ffc04a8c: 38 00 03 e8 li r0,1000 ffc04a90: 3c 80 ff c2 lis r4,-62 ffc04a94: 80 a1 00 18 lwz r5,24(r1) ffc04a98: 7c c6 03 96 divwu r6,r6,r0 ffc04a9c: 80 01 00 58 lwz r0,88(r1) ffc04aa0: 7c 09 03 a6 mtctr r0 ffc04aa4: 7f 83 e3 78 mr r3,r28 ffc04aa8: 38 84 f6 08 addi r4,r4,-2552 ffc04aac: 4c c6 31 82 crclr 4*cr1+eq ffc04ab0: 4e 80 04 21 bctrl "-------------------------------------------------------------------------------\n", _Watchdog_Ticks_since_boot - CPU_usage_Ticks_at_last_reset, total_units ); #endif } ffc04ab4: 39 61 00 a8 addi r11,r1,168 ffc04ab8: 4b ff c8 54 b ffc0130c <_restgpr_14_x> =============================================================================== ffc141fc : [RTEMS_PROXY_BLOCKING] = EIO }; int rtems_deviceio_errno(rtems_status_code sc) { if (sc == RTEMS_SUCCESSFUL) { ffc141fc: 2c 03 00 00 cmpwi r3,0 [RTEMS_IO_ERROR] = EIO, [RTEMS_PROXY_BLOCKING] = EIO }; int rtems_deviceio_errno(rtems_status_code sc) { ffc14200: 7c 08 02 a6 mflr r0 ffc14204: 7c 2b 0b 78 mr r11,r1 ffc14208: 94 21 ff f0 stwu r1,-16(r1) ffc1420c: 90 01 00 14 stw r0,20(r1) ffc14210: 48 00 4f 55 bl ffc19164 <_savegpr_31> if (sc == RTEMS_SUCCESSFUL) { return 0; ffc14214: 38 00 00 00 li r0,0 [RTEMS_PROXY_BLOCKING] = EIO }; int rtems_deviceio_errno(rtems_status_code sc) { if (sc == RTEMS_SUCCESSFUL) { ffc14218: 41 a2 00 2c beq+ ffc14244 return 0; } else { int eno = EINVAL; if ((unsigned) sc <= RTEMS_STATUS_CODES_LAST) { ffc1421c: 2b 83 00 1c cmplwi cr7,r3,28 int rtems_deviceio_errno(rtems_status_code sc) { if (sc == RTEMS_SUCCESSFUL) { return 0; } else { int eno = EINVAL; ffc14220: 3b e0 00 16 li r31,22 if ((unsigned) sc <= RTEMS_STATUS_CODES_LAST) { ffc14224: 41 9d 00 14 bgt- cr7,ffc14238 <== NEVER TAKEN eno = status_code_to_errno [sc]; ffc14228: 3d 20 ff c2 lis r9,-62 ffc1422c: 54 63 10 3a rlwinm r3,r3,2,0,29 ffc14230: 39 29 b0 68 addi r9,r9,-20376 ffc14234: 7f e9 18 2e lwzx r31,r9,r3 } errno = eno; ffc14238: 48 00 00 81 bl ffc142b8 <__errno> return -1; ffc1423c: 38 00 ff ff li r0,-1 if ((unsigned) sc <= RTEMS_STATUS_CODES_LAST) { eno = status_code_to_errno [sc]; } errno = eno; ffc14240: 93 e3 00 00 stw r31,0(r3) return -1; } } ffc14244: 39 61 00 10 addi r11,r1,16 ffc14248: 7c 03 03 78 mr r3,r0 ffc1424c: 48 00 4f 64 b ffc191b0 <_restgpr_31_x> =============================================================================== ffc092ac : int rtems_error( rtems_error_code_t error_flag, const char *printf_format, ... ) { ffc092ac: 7c 2b 0b 78 mr r11,r1 ffc092b0: 7c 08 02 a6 mflr r0 ffc092b4: 94 21 ff 88 stwu r1,-120(r1) ffc092b8: 4b ff 8c 95 bl ffc01f4c <_savegpr_31> ffc092bc: 90 01 00 7c stw r0,124(r1) ffc092c0: 7c 7f 1b 78 mr r31,r3 ffc092c4: 90 a1 00 18 stw r5,24(r1) ffc092c8: 90 c1 00 1c stw r6,28(r1) ffc092cc: 90 e1 00 20 stw r7,32(r1) ffc092d0: 91 01 00 24 stw r8,36(r1) ffc092d4: 91 21 00 28 stw r9,40(r1) ffc092d8: 91 41 00 2c stw r10,44(r1) ffc092dc: 40 86 00 24 bne- cr1,ffc09300 <== ALWAYS TAKEN ffc092e0: d8 21 00 30 stfd f1,48(r1) <== NOT EXECUTED ffc092e4: d8 41 00 38 stfd f2,56(r1) <== NOT EXECUTED ffc092e8: d8 61 00 40 stfd f3,64(r1) <== NOT EXECUTED ffc092ec: d8 81 00 48 stfd f4,72(r1) <== NOT EXECUTED ffc092f0: d8 a1 00 50 stfd f5,80(r1) <== NOT EXECUTED ffc092f4: d8 c1 00 58 stfd f6,88(r1) <== NOT EXECUTED ffc092f8: d8 e1 00 60 stfd f7,96(r1) <== NOT EXECUTED ffc092fc: d9 01 00 68 stfd f8,104(r1) <== NOT EXECUTED va_list arglist; int chars_written; va_start(arglist, printf_format); ffc09300: 38 00 00 02 li r0,2 ffc09304: 98 01 00 08 stb r0,8(r1) ffc09308: 38 00 00 00 li r0,0 chars_written = rtems_verror(error_flag, printf_format, arglist); ffc0930c: 7f e3 fb 78 mr r3,r31 ) { va_list arglist; int chars_written; va_start(arglist, printf_format); ffc09310: 98 01 00 09 stb r0,9(r1) ffc09314: 38 01 00 80 addi r0,r1,128 chars_written = rtems_verror(error_flag, printf_format, arglist); ffc09318: 38 a1 00 08 addi r5,r1,8 ) { va_list arglist; int chars_written; va_start(arglist, printf_format); ffc0931c: 90 01 00 0c stw r0,12(r1) ffc09320: 38 01 00 10 addi r0,r1,16 ffc09324: 90 01 00 10 stw r0,16(r1) chars_written = rtems_verror(error_flag, printf_format, arglist); ffc09328: 4b ff fe 09 bl ffc09130 va_end(arglist); if (error_flag & RTEMS_ERROR_PANIC) { ffc0932c: 77 e0 20 00 andis. r0,r31,8192 ffc09330: 41 a2 00 24 beq+ ffc09354 rtems_error(0, "fatal error, exiting"); ffc09334: 3c 80 ff c2 lis r4,-62 ffc09338: 38 84 73 ff addi r4,r4,29695 ffc0933c: 38 60 00 00 li r3,0 ffc09340: 4c c6 31 82 crclr 4*cr1+eq ffc09344: 4b ff ff 69 bl ffc092ac _exit(errno); ffc09348: 48 00 cc 05 bl ffc15f4c <__errno> ffc0934c: 80 63 00 00 lwz r3,0(r3) ffc09350: 48 00 0c 29 bl ffc09f78 <_exit> } if (error_flag & RTEMS_ERROR_ABORT) { ffc09354: 77 e0 10 00 andis. r0,r31,4096 ffc09358: 41 a2 00 1c beq+ ffc09374 rtems_error(0, "fatal error, aborting"); ffc0935c: 3c 80 ff c2 lis r4,-62 ffc09360: 38 84 74 14 addi r4,r4,29716 ffc09364: 38 60 00 00 li r3,0 ffc09368: 4c c6 31 82 crclr 4*cr1+eq ffc0936c: 4b ff ff 41 bl ffc092ac abort(); ffc09370: 48 00 cb c1 bl ffc15f30 } return chars_written; } ffc09374: 39 61 00 78 addi r11,r1,120 ffc09378: 4b ff 8c 20 b ffc01f98 <_restgpr_31_x> =============================================================================== ffc108b0 : find_arg fa = { .type = type, .mount_h = NULL }; if ( type != NULL ) { ffc108b0: 2f 83 00 00 cmpwi cr7,r3,0 rtems_filesystem_fsmount_me_t rtems_filesystem_get_mount_handler( const char *type ) { ffc108b4: 94 21 ff e8 stwu r1,-24(r1) ffc108b8: 7c 08 02 a6 mflr r0 find_arg fa = { ffc108bc: 90 61 00 08 stw r3,8(r1) rtems_filesystem_fsmount_me_t rtems_filesystem_get_mount_handler( const char *type ) { ffc108c0: 90 01 00 1c stw r0,28(r1) find_arg fa = { ffc108c4: 38 00 00 00 li r0,0 ffc108c8: 90 01 00 0c stw r0,12(r1) .type = type, .mount_h = NULL }; if ( type != NULL ) { ffc108cc: 41 9e 00 14 beq- cr7,ffc108e0 <== NEVER TAKEN rtems_filesystem_iterate( find_handler, &fa ); ffc108d0: 3c 60 ff c1 lis r3,-63 ffc108d4: 38 63 07 5c addi r3,r3,1884 ffc108d8: 38 81 00 08 addi r4,r1,8 ffc108dc: 4b ff ff 21 bl ffc107fc } return fa.mount_h; } ffc108e0: 80 01 00 1c lwz r0,28(r1) ffc108e4: 80 61 00 0c lwz r3,12(r1) ffc108e8: 38 21 00 18 addi r1,r1,24 ffc108ec: 7c 08 03 a6 mtlr r0 ffc108f0: 4e 80 00 20 blr =============================================================================== ffc04e28 : * configuration is a single instantiation of the IMFS or miniIMFS with * a single "/dev" directory in it. */ void rtems_filesystem_initialize( void ) { ffc04e28: 94 21 ff c8 stwu r1,-56(r1) ffc04e2c: 7c 08 02 a6 mflr r0 /* * mount the first filesystem. */ if ( rtems_filesystem_mount_table_size == 0 ) rtems_fatal_error_occurred( 0xABCD0001 ); ffc04e30: 3c 60 ab cd lis r3,-21555 * configuration is a single instantiation of the IMFS or miniIMFS with * a single "/dev" directory in it. */ void rtems_filesystem_initialize( void ) { ffc04e34: bf a1 00 2c stmw r29,44(r1) /* * Set the default umask to "022". */ rtems_filesystem_umask = 022; ffc04e38: 3f c0 00 00 lis r30,0 /* * mount the first filesystem. */ if ( rtems_filesystem_mount_table_size == 0 ) rtems_fatal_error_occurred( 0xABCD0001 ); ffc04e3c: 60 63 00 01 ori r3,r3,1 /* * Set the default umask to "022". */ rtems_filesystem_umask = 022; ffc04e40: 81 3e 27 74 lwz r9,10100(r30) * configuration is a single instantiation of the IMFS or miniIMFS with * a single "/dev" directory in it. */ void rtems_filesystem_initialize( void ) { ffc04e44: 90 01 00 3c stw r0,60(r1) /* * Set the default umask to "022". */ rtems_filesystem_umask = 022; ffc04e48: 38 00 00 12 li r0,18 ffc04e4c: 90 09 00 2c stw r0,44(r9) /* * mount the first filesystem. */ if ( rtems_filesystem_mount_table_size == 0 ) ffc04e50: 3d 20 00 00 lis r9,0 ffc04e54: 80 09 27 38 lwz r0,10040(r9) ffc04e58: 2f 80 00 00 cmpwi cr7,r0,0 ffc04e5c: 41 9e 00 34 beq- cr7,ffc04e90 <== NEVER TAKEN rtems_fatal_error_occurred( 0xABCD0001 ); mt = &rtems_filesystem_mount_table[0]; ffc04e60: 3d 20 00 00 lis r9,0 ffc04e64: 81 29 27 34 lwz r9,10036(r9) status = mount( mt->device, mt->mount_point, mt->type, mt->fsoptions, NULL ); ffc04e68: 38 e0 00 00 li r7,0 ffc04e6c: 80 69 00 08 lwz r3,8(r9) ffc04e70: 80 89 00 0c lwz r4,12(r9) ffc04e74: 80 a9 00 00 lwz r5,0(r9) ffc04e78: 80 c9 00 04 lwz r6,4(r9) ffc04e7c: 48 00 09 3d bl ffc057b8 if ( status == -1 ) ffc04e80: 2f 83 ff ff cmpwi cr7,r3,-1 ffc04e84: 40 be 00 10 bne+ cr7,ffc04e94 <== ALWAYS TAKEN rtems_fatal_error_occurred( 0xABCD0002 ); ffc04e88: 3c 60 ab cd lis r3,-21555 <== NOT EXECUTED ffc04e8c: 60 63 00 02 ori r3,r3,2 <== NOT EXECUTED ffc04e90: 48 00 43 15 bl ffc091a4 <== NOT EXECUTED rtems_filesystem_link_counts = 0; ffc04e94: 81 3e 27 74 lwz r9,10100(r30) ffc04e98: 38 00 00 00 li r0,0 * gonna hit performance. * * Till Straumann, 10/25/2002 */ /* Clone the root pathloc */ rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0); ffc04e9c: 3f a0 ff c2 lis r29,-62 status = mount( mt->device, mt->mount_point, mt->type, mt->fsoptions, NULL ); if ( status == -1 ) rtems_fatal_error_occurred( 0xABCD0002 ); rtems_filesystem_link_counts = 0; ffc04ea0: b0 09 00 30 sth r0,48(r9) * gonna hit performance. * * Till Straumann, 10/25/2002 */ /* Clone the root pathloc */ rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0); ffc04ea4: 3b e1 00 08 addi r31,r1,8 ffc04ea8: 3b bd aa cc addi r29,r29,-21812 ffc04eac: 38 a0 00 00 li r5,0 ffc04eb0: 7f e6 fb 78 mr r6,r31 ffc04eb4: 38 e0 00 00 li r7,0 ffc04eb8: 38 80 00 01 li r4,1 ffc04ebc: 7f a3 eb 78 mr r3,r29 ffc04ec0: 48 00 01 51 bl ffc05010 rtems_filesystem_root = loc; ffc04ec4: 81 7e 27 74 lwz r11,10100(r30) /* One more clone for the current node */ rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0); ffc04ec8: 38 80 00 01 li r4,1 * * Till Straumann, 10/25/2002 */ /* Clone the root pathloc */ rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0); rtems_filesystem_root = loc; ffc04ecc: 39 6b 00 18 addi r11,r11,24 ffc04ed0: 7c bf a4 aa lswi r5,r31,20 ffc04ed4: 7c ab a5 aa stswi r5,r11,20 /* One more clone for the current node */ rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0); ffc04ed8: 7f a3 eb 78 mr r3,r29 ffc04edc: 38 a0 00 00 li r5,0 ffc04ee0: 7f e6 fb 78 mr r6,r31 ffc04ee4: 38 e0 00 00 li r7,0 ffc04ee8: 48 00 01 29 bl ffc05010 rtems_filesystem_current = loc; ffc04eec: 81 7e 27 74 lwz r11,10100(r30) * * 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); ffc04ef0: 3c 60 ff c2 lis r3,-62 /* Clone the root pathloc */ rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0); rtems_filesystem_root = loc; /* One more clone for the current node */ rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0); rtems_filesystem_current = loc; ffc04ef4: 39 6b 00 04 addi r11,r11,4 ffc04ef8: 7c bf a4 aa lswi r5,r31,20 ffc04efc: 7c ab a5 aa stswi r5,r11,20 * * 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); ffc04f00: 38 63 aa ce addi r3,r3,-21810 ffc04f04: 38 80 01 ff li r4,511 ffc04f08: 48 00 06 c1 bl ffc055c8 if ( status != 0 ) ffc04f0c: 2f 83 00 00 cmpwi cr7,r3,0 ffc04f10: 41 be 00 10 beq+ cr7,ffc04f20 <== ALWAYS TAKEN rtems_fatal_error_occurred( 0xABCD0003 ); ffc04f14: 3c 60 ab cd lis r3,-21555 <== NOT EXECUTED ffc04f18: 60 63 00 03 ori r3,r3,3 <== NOT EXECUTED ffc04f1c: 4b ff ff 74 b ffc04e90 <== 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. */ } ffc04f20: 39 61 00 38 addi r11,r1,56 ffc04f24: 48 01 42 84 b ffc191a8 <_restgpr_29_x> =============================================================================== ffc107fc : bool rtems_filesystem_iterate( rtems_per_filesystem_routine routine, void *routine_arg ) { ffc107fc: 94 21 ff e0 stwu r1,-32(r1) ffc10800: 7c 08 02 a6 mflr r0 ffc10804: bf 81 00 10 stmw r28,16(r1) const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0]; ffc10808: 3f e0 ff c2 lis r31,-62 bool rtems_filesystem_iterate( rtems_per_filesystem_routine routine, void *routine_arg ) { ffc1080c: 7c 9e 23 78 mr r30,r4 ffc10810: 90 61 00 08 stw r3,8(r1) const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0]; ffc10814: 3b ff 9f 34 addi r31,r31,-24780 rtems_chain_node *node = NULL; bool stop = false; ffc10818: 38 60 00 00 li r3,0 bool rtems_filesystem_iterate( rtems_per_filesystem_routine routine, void *routine_arg ) { ffc1081c: 90 01 00 24 stw r0,36(r1) const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0]; rtems_chain_node *node = NULL; bool stop = false; while ( table_entry->type && !stop ) { ffc10820: 48 00 00 1c b ffc1083c stop = (*routine)( table_entry, routine_arg ); ffc10824: 80 01 00 08 lwz r0,8(r1) ffc10828: 7f e3 fb 78 mr r3,r31 ffc1082c: 7f c4 f3 78 mr r4,r30 ffc10830: 7c 09 03 a6 mtctr r0 ++table_entry; ffc10834: 3b ff 00 08 addi r31,r31,8 const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0]; rtems_chain_node *node = NULL; bool stop = false; while ( table_entry->type && !stop ) { stop = (*routine)( table_entry, routine_arg ); ffc10838: 4e 80 04 21 bctrl { const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0]; rtems_chain_node *node = NULL; bool stop = false; while ( table_entry->type && !stop ) { ffc1083c: 80 1f 00 00 lwz r0,0(r31) ffc10840: 2f 83 00 00 cmpwi cr7,r3,0 ffc10844: 2f 00 00 00 cmpwi cr6,r0,0 ffc10848: 41 9a 00 0c beq- cr6,ffc10854 ffc1084c: 41 9e ff d8 beq+ cr7,ffc10824 ffc10850: 48 00 00 58 b ffc108a8 ffc10854: 7c 7c 1b 78 mr r28,r3 stop = (*routine)( table_entry, routine_arg ); ++table_entry; } if ( !stop ) { ffc10858: 40 9e 00 50 bne- cr7,ffc108a8 } } rtems_libio_unlock(); rtems_set_errno_and_return_minus_one( ENOENT ); } ffc1085c: 3f a0 00 00 lis r29,0 stop = (*routine)( table_entry, routine_arg ); ++table_entry; } if ( !stop ) { rtems_libio_lock(); ffc10860: 4b ff ff 45 bl ffc107a4 } } rtems_libio_unlock(); rtems_set_errno_and_return_minus_one( ENOENT ); } ffc10864: 83 fd 21 d0 lwz r31,8656(r29) */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return &the_chain->Tail.Node; ffc10868: 3b bd 21 d0 addi r29,r29,8656 ffc1086c: 3b bd 00 04 addi r29,r29,4 ++table_entry; } if ( !stop ) { rtems_libio_lock(); for ( ffc10870: 48 00 00 20 b ffc10890 !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 ); ffc10874: 80 01 00 08 lwz r0,8(r1) ffc10878: 38 7f 00 08 addi r3,r31,8 ffc1087c: 7f c4 f3 78 mr r4,r30 ffc10880: 7c 09 03 a6 mtctr r0 ffc10884: 4e 80 04 21 bctrl } } rtems_libio_unlock(); rtems_set_errno_and_return_minus_one( ENOENT ); } ffc10888: 83 ff 00 00 lwz r31,0(r31) !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 ); ffc1088c: 7c 7c 1b 78 mr r28,r3 ++table_entry; } if ( !stop ) { rtems_libio_lock(); for ( ffc10890: 7f 9f e8 00 cmpw cr7,r31,r29 ffc10894: 41 9e 00 0c beq- cr7,ffc108a0 node = rtems_chain_first( &filesystem_chain ); !rtems_chain_is_tail( &filesystem_chain, node ) && !stop; ffc10898: 2f 9c 00 00 cmpwi cr7,r28,0 ffc1089c: 41 9e ff d8 beq+ cr7,ffc10874 <== ALWAYS TAKEN ) { const filesystem_node *fsn = (filesystem_node *) node; stop = (*routine)( &fsn->entry, routine_arg ); } rtems_libio_unlock(); ffc108a0: 4b ff ff 35 bl ffc107d4 ffc108a4: 7f 83 e3 78 mr r3,r28 } return stop; } ffc108a8: 39 61 00 20 addi r11,r1,32 ffc108ac: 48 00 88 f8 b ffc191a4 <_restgpr_28_x> =============================================================================== ffc0574c : bool rtems_filesystem_mount_iterate( rtems_per_filesystem_mount_routine routine, void *routine_arg ) { ffc0574c: 94 21 ff e0 stwu r1,-32(r1) ffc05750: 7c 08 02 a6 mflr r0 ffc05754: bf 81 00 10 stmw r28,16(r1) stop = (*routine)( mt_entry, routine_arg ); } rtems_libio_unlock(); return stop; } ffc05758: 3f c0 00 00 lis r30,0 bool rtems_filesystem_mount_iterate( rtems_per_filesystem_mount_routine routine, void *routine_arg ) { ffc0575c: 7c 7c 1b 78 mr r28,r3 ffc05760: 90 01 00 24 stw r0,36(r1) ffc05764: 7c 9d 23 78 mr r29,r4 rtems_chain_node *node = NULL; bool stop = false; rtems_libio_lock(); ffc05768: 4b ff ff 8d bl ffc056f4 rtems_per_filesystem_mount_routine routine, void *routine_arg ) { rtems_chain_node *node = NULL; bool stop = false; ffc0576c: 38 60 00 00 li r3,0 stop = (*routine)( mt_entry, routine_arg ); } rtems_libio_unlock(); return stop; } ffc05770: 83 fe 21 78 lwz r31,8568(r30) */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return &the_chain->Tail.Node; ffc05774: 3b de 21 78 addi r30,r30,8568 ffc05778: 3b de 00 04 addi r30,r30,4 { rtems_chain_node *node = NULL; bool stop = false; rtems_libio_lock(); for ( ffc0577c: 48 00 00 18 b ffc05794 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 ); ffc05780: 7f e3 fb 78 mr r3,r31 ffc05784: 7f 89 03 a6 mtctr r28 ffc05788: 7f a4 eb 78 mr r4,r29 ffc0578c: 4e 80 04 21 bctrl } rtems_libio_unlock(); return stop; } ffc05790: 83 ff 00 00 lwz r31,0(r31) { rtems_chain_node *node = NULL; bool stop = false; rtems_libio_lock(); for ( ffc05794: 7f 9f f0 00 cmpw cr7,r31,r30 ffc05798: 41 9e 00 0c beq- cr7,ffc057a4 node = rtems_chain_first( &mount_chain ); !rtems_chain_is_tail( &mount_chain, node ) && !stop; ffc0579c: 2f 83 00 00 cmpwi cr7,r3,0 ffc057a0: 41 9e ff e0 beq+ cr7,ffc05780 <== 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(); ffc057a4: 90 61 00 08 stw r3,8(r1) ffc057a8: 4b ff ff 7d bl ffc05724 return stop; } ffc057ac: 39 61 00 20 addi r11,r1,32 ffc057b0: 80 61 00 08 lwz r3,8(r1) ffc057b4: 48 01 39 f0 b ffc191a4 <_restgpr_28_x> =============================================================================== ffc050b4 : int rtems_filesystem_prefix_separators( const char *pathname, int pathnamelen ) { ffc050b4: 94 21 ff e8 stwu r1,-24(r1) ffc050b8: 7c 08 02 a6 mflr r0 ffc050bc: bf a1 00 0c stmw r29,12(r1) ffc050c0: 7c 7f 1b 78 mr r31,r3 ffc050c4: 7c 9d 23 78 mr r29,r4 ffc050c8: 90 01 00 1c stw r0,28(r1) /* * Eat any separators at start of the path. */ int stripped = 0; ffc050cc: 3b c0 00 00 li r30,0 while ( *pathname && pathnamelen && rtems_filesystem_is_separator( *pathname ) ) ffc050d0: 48 00 00 08 b ffc050d8 { pathname++; pathnamelen--; stripped++; ffc050d4: 3b de 00 01 addi r30,r30,1 { /* * Eat any separators at start of the path. */ int stripped = 0; while ( *pathname && pathnamelen && rtems_filesystem_is_separator( *pathname ) ) ffc050d8: 7c 7f f0 ae lbzx r3,r31,r30 ffc050dc: 2f 83 00 00 cmpwi cr7,r3,0 ffc050e0: 41 9e 00 18 beq- cr7,ffc050f8 <== NEVER TAKEN ffc050e4: 7f 9d f0 00 cmpw cr7,r29,r30 ffc050e8: 41 9e 00 10 beq- cr7,ffc050f8 <== NEVER TAKEN ffc050ec: 48 00 11 1d bl ffc06208 ffc050f0: 2f 83 00 00 cmpwi cr7,r3,0 ffc050f4: 40 9e ff e0 bne+ cr7,ffc050d4 pathname++; pathnamelen--; stripped++; } return stripped; } ffc050f8: 39 61 00 18 addi r11,r1,24 ffc050fc: 7f c3 f3 78 mr r3,r30 ffc05100: 48 01 40 a8 b ffc191a8 <_restgpr_29_x> =============================================================================== ffc04e0c : int rtems_gxx_key_create (__gthread_key_t *key, void (*dtor) (void *)) { ffc04e0c: 94 21 ff e8 stwu r1,-24(r1) ffc04e10: 7c 08 02 a6 mflr r0 ffc04e14: bf a1 00 0c stmw r29,12(r1) ffc04e18: 7c 7d 1b 78 mr r29,r3 * 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 ) ); ffc04e1c: 38 60 00 08 li r3,8 } return 0; } int rtems_gxx_key_create (__gthread_key_t *key, void (*dtor) (void *)) { ffc04e20: 7c 9e 23 78 mr r30,r4 ffc04e24: 90 01 00 1c stw r0,28(r1) * 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 ) ); ffc04e28: 48 00 05 25 bl ffc0534c *key = new_key; new_key->val = NULL; ffc04e2c: 38 00 00 00 li r0,0 * 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 ) ); *key = new_key; ffc04e30: 90 7d 00 00 stw r3,0(r29) * 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 ) ); ffc04e34: 7c 7f 1b 78 mr r31,r3 "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 ); ffc04e38: 7f e4 fb 78 mr r4,r31 * 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 ) ); *key = new_key; new_key->val = NULL; ffc04e3c: 90 03 00 00 stw r0,0(r3) "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 ); ffc04e40: 7f c5 f3 78 mr r5,r30 */ /* Do not pull your hair, trust me this works. :-) */ __gthread_key_t new_key = (__gthread_key_t) malloc( sizeof( *new_key ) ); *key = new_key; new_key->val = NULL; new_key->dtor = dtor; ffc04e44: 93 c3 00 04 stw r30,4(r3) "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 ); ffc04e48: 38 60 00 00 li r3,0 ffc04e4c: 48 00 3f 7d bl ffc08dc8 if ( status == RTEMS_SUCCESSFUL ) return 0; ffc04e50: 38 00 00 00 li r0,0 ); #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 ) ffc04e54: 2f 83 00 00 cmpwi cr7,r3,0 ffc04e58: 41 be 00 10 beq+ cr7,ffc04e68 <== ALWAYS TAKEN return 0; free( new_key ); ffc04e5c: 7f e3 fb 78 mr r3,r31 <== NOT EXECUTED ffc04e60: 4b ff fe 09 bl ffc04c68 <== NOT EXECUTED return -1; ffc04e64: 38 00 ff ff li r0,-1 <== NOT EXECUTED } ffc04e68: 39 61 00 18 addi r11,r1,24 ffc04e6c: 7c 03 03 78 mr r3,r0 ffc04e70: 4b ff be 7c b ffc00cec <_restgpr_29_x> =============================================================================== ffc04e84 : int rtems_gxx_key_delete (__gthread_key_t key) { ffc04e84: 7c 2b 0b 78 mr r11,r1 ffc04e88: 94 21 ff f0 stwu r1,-16(r1) ffc04e8c: 7c 08 02 a6 mflr r0 ffc04e90: 48 01 11 11 bl ffc15fa0 <_savegpr_31> ffc04e94: 7c 7f 1b 78 mr r31,r3 #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 ); ffc04e98: 7f e4 fb 78 mr r4,r31 key->val = 0; return 0; } int rtems_gxx_key_delete (__gthread_key_t key) { ffc04e9c: 90 01 00 14 stw r0,20(r1) #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 ); ffc04ea0: 38 60 00 00 li r3,0 ffc04ea4: 48 00 3f d9 bl ffc08e7c if ( status == RTEMS_SUCCESSFUL ) { ffc04ea8: 2f 83 00 00 cmpwi cr7,r3,0 ffc04eac: 40 9e 00 14 bne- cr7,ffc04ec0 <== NEVER TAKEN /* Hmm - hopefully all tasks using this key have gone away... */ if ( key ) free( *(void **)key ); ffc04eb0: 2f 9f 00 00 cmpwi cr7,r31,0 ffc04eb4: 41 9e 00 0c beq- cr7,ffc04ec0 <== NEVER TAKEN ffc04eb8: 80 7f 00 00 lwz r3,0(r31) ffc04ebc: 4b ff fd ad bl ffc04c68 return 0; } key = NULL; return 0; } ffc04ec0: 39 61 00 10 addi r11,r1,16 ffc04ec4: 38 60 00 00 li r3,0 ffc04ec8: 4b ff be 2c b ffc00cf4 <_restgpr_31_x> =============================================================================== ffc04fe0 : int rtems_gxx_mutex_lock (__gthread_mutex_t *mutex) { ffc04fe0: 7c 08 02 a6 mflr r0 ffc04fe4: 94 21 ff f8 stwu r1,-8(r1) #ifdef DEBUG_GXX_WRAPPERS printk( "gxx_wrappers: lock mutex=%X\n", *mutex ); #endif status = rtems_semaphore_obtain( ffc04fe8: 38 80 00 00 li r4,0 printk( "gxx_wrappers: mutex init complete =%X\n", *mutex ); #endif } int rtems_gxx_mutex_lock (__gthread_mutex_t *mutex) { ffc04fec: 90 01 00 0c stw r0,12(r1) #ifdef DEBUG_GXX_WRAPPERS printk( "gxx_wrappers: lock mutex=%X\n", *mutex ); #endif status = rtems_semaphore_obtain( ffc04ff0: 38 a0 00 00 li r5,0 ffc04ff4: 80 63 00 00 lwz r3,0(r3) ffc04ff8: 48 00 36 95 bl ffc0868c RTEMS_WAIT, RTEMS_NO_TIMEOUT ); if ( status == RTEMS_SUCCESSFUL ) return 0; return -1; ffc04ffc: 38 00 ff ff li r0,-1 status = rtems_semaphore_obtain( *(rtems_id *)mutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT ); if ( status == RTEMS_SUCCESSFUL ) ffc05000: 2f 83 00 00 cmpwi cr7,r3,0 ffc05004: 40 9e 00 08 bne- cr7,ffc0500c <== NEVER TAKEN return 0; ffc05008: 38 00 00 00 li r0,0 return -1; } ffc0500c: 7c 03 03 78 mr r3,r0 ffc05010: 80 01 00 0c lwz r0,12(r1) ffc05014: 38 21 00 08 addi r1,r1,8 ffc05018: 7c 08 03 a6 mtlr r0 ffc0501c: 4e 80 00 20 blr =============================================================================== ffc05058 : int rtems_gxx_mutex_trylock (__gthread_mutex_t *mutex) { ffc05058: 7c 08 02 a6 mflr r0 ffc0505c: 94 21 ff f8 stwu r1,-8(r1) #ifdef DEBUG_GXX_WRAPPERS printk( "gxx_wrappers: trylock mutex=%X\n", *mutex ); #endif status = rtems_semaphore_obtain (*(rtems_id *)mutex, RTEMS_NO_WAIT, 0); ffc05060: 38 80 00 01 li r4,1 return 0; return -1; } int rtems_gxx_mutex_trylock (__gthread_mutex_t *mutex) { ffc05064: 90 01 00 0c stw r0,12(r1) #ifdef DEBUG_GXX_WRAPPERS printk( "gxx_wrappers: trylock mutex=%X\n", *mutex ); #endif status = rtems_semaphore_obtain (*(rtems_id *)mutex, RTEMS_NO_WAIT, 0); ffc05068: 38 a0 00 00 li r5,0 ffc0506c: 80 63 00 00 lwz r3,0(r3) ffc05070: 48 00 36 1d bl ffc0868c if ( status == RTEMS_SUCCESSFUL ) return 0; return -1; ffc05074: 38 00 ff ff li r0,-1 #ifdef DEBUG_GXX_WRAPPERS printk( "gxx_wrappers: trylock mutex=%X\n", *mutex ); #endif status = rtems_semaphore_obtain (*(rtems_id *)mutex, RTEMS_NO_WAIT, 0); if ( status == RTEMS_SUCCESSFUL ) ffc05078: 2f 83 00 00 cmpwi cr7,r3,0 ffc0507c: 40 9e 00 08 bne- cr7,ffc05084 <== NEVER TAKEN return 0; ffc05080: 38 00 00 00 li r0,0 return -1; } ffc05084: 7c 03 03 78 mr r3,r0 ffc05088: 80 01 00 0c lwz r0,12(r1) ffc0508c: 38 21 00 08 addi r1,r1,8 ffc05090: 7c 08 03 a6 mtlr r0 ffc05094: 4e 80 00 20 blr =============================================================================== ffc05098 : int rtems_gxx_mutex_unlock (__gthread_mutex_t *mutex) { ffc05098: 7c 08 02 a6 mflr r0 ffc0509c: 94 21 ff f8 stwu r1,-8(r1) ffc050a0: 90 01 00 0c stw r0,12(r1) #ifdef DEBUG_GXX_WRAPPERS printk( "gxx_wrappers: unlock mutex=%X\n", *mutex ); #endif status = rtems_semaphore_release( *(rtems_id *)mutex ); ffc050a4: 80 63 00 00 lwz r3,0(r3) ffc050a8: 48 00 37 0d bl ffc087b4 if ( status == RTEMS_SUCCESSFUL ) return 0; return -1; ffc050ac: 38 00 ff ff li r0,-1 #ifdef DEBUG_GXX_WRAPPERS printk( "gxx_wrappers: unlock mutex=%X\n", *mutex ); #endif status = rtems_semaphore_release( *(rtems_id *)mutex ); if ( status == RTEMS_SUCCESSFUL ) ffc050b0: 2f 83 00 00 cmpwi cr7,r3,0 ffc050b4: 40 9e 00 08 bne- cr7,ffc050bc <== NEVER TAKEN return 0; ffc050b8: 38 00 00 00 li r0,0 return -1; } ffc050bc: 7c 03 03 78 mr r3,r0 ffc050c0: 80 01 00 0c lwz r0,12(r1) ffc050c4: 38 21 00 08 addi r1,r1,8 ffc050c8: 7c 08 03 a6 mtlr r0 ffc050cc: 4e 80 00 20 blr =============================================================================== ffc04d98 : /* 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)) { ffc04d98: 94 21 ff d8 stwu r1,-40(r1) ffc04d9c: 7c 08 02 a6 mflr r0 ffc04da0: 90 01 00 2c stw r0,44(r1) #ifdef DEBUG_GXX_WRAPPERS printk( "gxx_wrappers: once=%x, func=%x\n", *once, func ); #endif if ( *(volatile __gthread_once_t *)once == 0 ) { ffc04da4: 80 03 00 00 lwz r0,0(r3) /* 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)) { ffc04da8: bf a1 00 1c stmw r29,28(r1) ffc04dac: 7c 7f 1b 78 mr r31,r3 #ifdef DEBUG_GXX_WRAPPERS printk( "gxx_wrappers: once=%x, func=%x\n", *once, func ); #endif if ( *(volatile __gthread_once_t *)once == 0 ) { ffc04db0: 2f 80 00 00 cmpwi cr7,r0,0 /* 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)) { ffc04db4: 7c 9d 23 78 mr r29,r4 #ifdef DEBUG_GXX_WRAPPERS printk( "gxx_wrappers: once=%x, func=%x\n", *once, func ); #endif if ( *(volatile __gthread_once_t *)once == 0 ) { ffc04db8: 40 be 00 48 bne+ cr7,ffc04e00 rtems_mode saveMode; __gthread_once_t o; rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode); ffc04dbc: 38 60 01 00 li r3,256 ffc04dc0: 38 80 01 00 li r4,256 ffc04dc4: 38 a1 00 08 addi r5,r1,8 ffc04dc8: 48 00 3d 75 bl ffc08b3c if ( (o = *(volatile __gthread_once_t *)once) == 0 ) { ffc04dcc: 83 df 00 00 lwz r30,0(r31) ffc04dd0: 2f 9e 00 00 cmpwi cr7,r30,0 ffc04dd4: 40 9e 00 0c bne- cr7,ffc04de0 <== NEVER TAKEN *(volatile __gthread_once_t *)once = 1; ffc04dd8: 38 00 00 01 li r0,1 ffc04ddc: 90 1f 00 00 stw r0,0(r31) } rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); ffc04de0: 7c 25 0b 78 mr r5,r1 ffc04de4: 84 65 00 08 lwzu r3,8(r5) ffc04de8: 38 80 01 00 li r4,256 ffc04dec: 48 00 3d 51 bl ffc08b3c if ( o == 0 ) ffc04df0: 2f 9e 00 00 cmpwi cr7,r30,0 ffc04df4: 40 be 00 0c bne+ cr7,ffc04e00 <== NEVER TAKEN (*func)(); ffc04df8: 7f a9 03 a6 mtctr r29 ffc04dfc: 4e 80 04 21 bctrl } return 0; } ffc04e00: 39 61 00 28 addi r11,r1,40 ffc04e04: 38 60 00 00 li r3,0 ffc04e08: 4b ff be e4 b ffc00cec <_restgpr_29_x> =============================================================================== ffc04f48 : int rtems_gxx_setspecific(__gthread_key_t key, const void *ptr) { ffc04f48: 94 21 ff f0 stwu r1,-16(r1) ffc04f4c: 7c 08 02 a6 mflr r0 ffc04f50: 90 01 00 14 stw r0,20(r1) ffc04f54: bf c1 00 08 stmw r30,8(r1) ffc04f58: 7c 7f 1b 78 mr r31,r3 ffc04f5c: 7c 9e 23 78 mr r30,r4 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 ); ffc04f60: 80 bf 00 04 lwz r5,4(r31) ffc04f64: 38 60 00 00 li r3,0 ffc04f68: 7f e4 fb 78 mr r4,r31 ffc04f6c: 48 00 3e 5d bl ffc08dc8 if ( status == RTEMS_SUCCESSFUL ) { /* now let's set the proper value */ key->val = (void *)ptr; return 0; } return -1; ffc04f70: 38 00 ff ff li r0,-1 ); #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 ) { ffc04f74: 2f 83 00 00 cmpwi cr7,r3,0 ffc04f78: 40 9e 00 0c bne- cr7,ffc04f84 <== NEVER TAKEN /* now let's set the proper value */ key->val = (void *)ptr; ffc04f7c: 93 df 00 00 stw r30,0(r31) return 0; ffc04f80: 38 00 00 00 li r0,0 } return -1; } ffc04f84: 39 61 00 10 addi r11,r1,16 ffc04f88: 7c 03 03 78 mr r3,r0 ffc04f8c: 4b ff bd 64 b ffc00cf0 <_restgpr_30_x> =============================================================================== ffc08a7c : void *rtems_heap_allocate_aligned_with_boundary( size_t size, uintptr_t alignment, uintptr_t boundary ) { ffc08a7c: 94 21 ff e8 stwu r1,-24(r1) ffc08a80: 7c 08 02 a6 mflr r0 if ( ffc08a84: 3d 20 00 00 lis r9,0 void *rtems_heap_allocate_aligned_with_boundary( size_t size, uintptr_t alignment, uintptr_t boundary ) { ffc08a88: 90 01 00 1c stw r0,28(r1) if ( ffc08a8c: 80 09 28 ac lwz r0,10412(r9) void *rtems_heap_allocate_aligned_with_boundary( size_t size, uintptr_t alignment, uintptr_t boundary ) { ffc08a90: bf a1 00 0c stmw r29,12(r1) ffc08a94: 7c 7d 1b 78 mr r29,r3 if ( ffc08a98: 2f 80 00 03 cmpwi cr7,r0,3 void *rtems_heap_allocate_aligned_with_boundary( size_t size, uintptr_t alignment, uintptr_t boundary ) { ffc08a9c: 7c 9e 23 78 mr r30,r4 ffc08aa0: 7c bf 2b 78 mr r31,r5 if ( ffc08aa4: 40 be 00 14 bne+ cr7,ffc08ab8 <== NEVER TAKEN _System_state_Is_up( _System_state_Get() ) && !malloc_is_system_state_OK() ffc08aa8: 4b ff ec d1 bl ffc07778 ) { return NULL; ffc08aac: 38 00 00 00 li r0,0 uintptr_t boundary ) { if ( _System_state_Is_up( _System_state_Get() ) && !malloc_is_system_state_OK() ffc08ab0: 2f 83 00 00 cmpwi cr7,r3,0 ffc08ab4: 41 9e 00 24 beq- cr7,ffc08ad8 ) { return NULL; } malloc_deferred_frees_process(); ffc08ab8: 4b ff ed 09 bl ffc077c0 /* FIXME: Statistics, boundary checks */ return _Protected_heap_Allocate_aligned_with_boundary( ffc08abc: 3d 20 00 00 lis r9,0 ffc08ac0: 80 69 27 7c lwz r3,10108(r9) ffc08ac4: 7f a4 eb 78 mr r4,r29 ffc08ac8: 7f c5 f3 78 mr r5,r30 ffc08acc: 7f e6 fb 78 mr r6,r31 ffc08ad0: 48 00 54 1d bl ffc0deec <_Protected_heap_Allocate_aligned_with_boundary> ffc08ad4: 7c 60 1b 78 mr r0,r3 RTEMS_Malloc_Heap, size, alignment, boundary ); } ffc08ad8: 39 61 00 18 addi r11,r1,24 ffc08adc: 7c 03 03 78 mr r3,r0 ffc08ae0: 4b ff a8 10 b ffc032f0 <_restgpr_29_x> =============================================================================== ffc04d28 : rtems_status_code rtems_io_lookup_name( const char *name, rtems_driver_name_t *device_info ) { ffc04d28: 94 21 ff c0 stwu r1,-64(r1) ffc04d2c: 7c 08 02 a6 mflr r0 ffc04d30: bf 61 00 2c stmw r27,44(r1) ffc04d34: 7c 7d 1b 78 mr r29,r3 ffc04d38: 7c 9f 23 78 mr r31,r4 ffc04d3c: 90 01 00 44 stw r0,68(r1) 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( ffc04d40: 3b c1 00 08 addi r30,r1,8 ffc04d44: 48 01 07 15 bl ffc15458 ffc04d48: 38 a0 00 00 li r5,0 ffc04d4c: 7c 64 1b 78 mr r4,r3 ffc04d50: 7f c6 f3 78 mr r6,r30 ffc04d54: 38 e0 00 01 li r7,1 ffc04d58: 7f a3 eb 78 mr r3,r29 ffc04d5c: 48 00 02 b5 bl ffc05010 name, strlen( name ), 0x00, &loc, true ); the_jnode = loc.node_access; node_type = (*loc.ops->node_type_h)( &loc ); ffc04d60: 81 21 00 14 lwz r9,20(r1) 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( ffc04d64: 7c 7b 1b 78 mr r27,r3 name, strlen( name ), 0x00, &loc, true ); the_jnode = loc.node_access; ffc04d68: 83 81 00 08 lwz r28,8(r1) node_type = (*loc.ops->node_type_h)( &loc ); ffc04d6c: 80 09 00 10 lwz r0,16(r9) ffc04d70: 7f c3 f3 78 mr r3,r30 ffc04d74: 7c 09 03 a6 mtctr r0 ffc04d78: 4e 80 04 21 bctrl if ( (result != 0) || node_type != RTEMS_FILESYSTEM_DEVICE ) { ffc04d7c: 2f 9b 00 00 cmpwi cr7,r27,0 ffc04d80: 40 9e 00 0c bne- cr7,ffc04d8c <== NEVER TAKEN ffc04d84: 2f 83 00 02 cmpwi cr7,r3,2 ffc04d88: 41 9e 00 14 beq- cr7,ffc04d9c rtems_filesystem_freenode( &loc ); ffc04d8c: 38 61 00 08 addi r3,r1,8 ffc04d90: 48 00 03 75 bl ffc05104 return RTEMS_UNSATISFIED; ffc04d94: 38 60 00 0d li r3,13 ffc04d98: 48 00 00 30 b ffc04dc8 } device_info->device_name = (char *) name; ffc04d9c: 93 bf 00 00 stw r29,0(r31) device_info->device_name_length = strlen( name ); ffc04da0: 7f a3 eb 78 mr r3,r29 ffc04da4: 48 01 06 b5 bl ffc15458 ffc04da8: 90 7f 00 04 stw r3,4(r31) device_info->major = the_jnode->info.device.major; device_info->minor = the_jnode->info.device.minor; rtems_filesystem_freenode( &loc ); ffc04dac: 7f c3 f3 78 mr r3,r30 return RTEMS_UNSATISFIED; } device_info->device_name = (char *) name; device_info->device_name_length = strlen( name ); device_info->major = the_jnode->info.device.major; ffc04db0: 80 1c 00 50 lwz r0,80(r28) ffc04db4: 90 1f 00 08 stw r0,8(r31) device_info->minor = the_jnode->info.device.minor; ffc04db8: 80 1c 00 54 lwz r0,84(r28) ffc04dbc: 90 1f 00 0c stw r0,12(r31) rtems_filesystem_freenode( &loc ); ffc04dc0: 48 00 03 45 bl ffc05104 return RTEMS_SUCCESSFUL; ffc04dc4: 38 60 00 00 li r3,0 } ffc04dc8: 39 61 00 40 addi r11,r1,64 ffc04dcc: 48 01 43 d4 b ffc191a0 <_restgpr_27_x> =============================================================================== ffc092a8 : 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 ) { ffc092a8: 7c 08 02 a6 mflr r0 ffc092ac: 7c 2b 0b 78 mr r11,r1 ffc092b0: 94 21 ff f0 stwu r1,-16(r1) rtems_device_major_number major_limit = _IO_Number_of_drivers; ffc092b4: 3d 20 00 00 lis r9,0 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 ) { ffc092b8: 90 01 00 14 stw r0,20(r1) ffc092bc: 48 00 fe a9 bl ffc19164 <_savegpr_31> ffc092c0: 7c 7f 1b 78 mr r31,r3 rtems_device_major_number major_limit = _IO_Number_of_drivers; ffc092c4: 80 09 28 58 lwz r0,10328(r9) if ( rtems_interrupt_is_in_progress() ) ffc092c8: 3d 20 00 00 lis r9,0 ffc092cc: 81 29 31 ec lwz r9,12780(r9) return RTEMS_CALLED_FROM_ISR; ffc092d0: 38 60 00 12 li r3,18 rtems_device_major_number *registered_major ) { rtems_device_major_number major_limit = _IO_Number_of_drivers; if ( rtems_interrupt_is_in_progress() ) ffc092d4: 2f 89 00 00 cmpwi cr7,r9,0 ffc092d8: 40 9e 01 14 bne- cr7,ffc093ec return RTEMS_CALLED_FROM_ISR; if ( registered_major == NULL ) ffc092dc: 2f 85 00 00 cmpwi cr7,r5,0 return RTEMS_INVALID_ADDRESS; ffc092e0: 38 60 00 09 li r3,9 rtems_device_major_number major_limit = _IO_Number_of_drivers; if ( rtems_interrupt_is_in_progress() ) return RTEMS_CALLED_FROM_ISR; if ( registered_major == NULL ) ffc092e4: 41 9e 01 08 beq- cr7,ffc093ec return RTEMS_INVALID_ADDRESS; /* Set it to an invalid value */ *registered_major = major_limit; if ( driver_table == NULL ) ffc092e8: 2f 84 00 00 cmpwi cr7,r4,0 if ( registered_major == NULL ) return RTEMS_INVALID_ADDRESS; /* Set it to an invalid value */ *registered_major = major_limit; ffc092ec: 90 05 00 00 stw r0,0(r5) if ( driver_table == NULL ) ffc092f0: 41 9e 00 fc beq- cr7,ffc093ec static inline bool rtems_io_is_empty_table( const rtems_driver_address_table *table ) { return table->initialization_entry == NULL && table->open_entry == NULL; ffc092f4: 81 24 00 00 lwz r9,0(r4) ffc092f8: 2f 89 00 00 cmpwi cr7,r9,0 ffc092fc: 40 be 00 f8 bne+ cr7,ffc093f4 ffc09300: 81 24 00 04 lwz r9,4(r4) ffc09304: 2f 89 00 00 cmpwi cr7,r9,0 ffc09308: 40 be 00 ec bne+ cr7,ffc093f4 ffc0930c: 48 00 00 e0 b ffc093ec rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; ffc09310: 3d 20 00 00 lis r9,0 ffc09314: 81 69 28 04 lwz r11,10244(r9) ffc09318: 38 0b 00 01 addi r0,r11,1 ffc0931c: 90 09 28 04 stw r0,10244(r9) if ( major >= major_limit ) return RTEMS_INVALID_NUMBER; _Thread_Disable_dispatch(); if ( major == 0 ) { ffc09320: 2f 9f 00 00 cmpwi cr7,r31,0 ffc09324: 3d 20 00 00 lis r9,0 ffc09328: 40 9e 00 58 bne- cr7,ffc09380 static rtems_status_code rtems_io_obtain_major_number( rtems_device_major_number *major ) { rtems_device_major_number n = _IO_Number_of_drivers; ffc0932c: 3d 60 00 00 lis r11,0 ffc09330: 81 29 28 5c lwz r9,10332(r9) ffc09334: 81 6b 28 58 lwz r11,10328(r11) ffc09338: 2f 8b 00 00 cmpwi cr7,r11,0 ffc0933c: 38 0b 00 01 addi r0,r11,1 ffc09340: 40 be 00 28 bne+ cr7,ffc09368 <== ALWAYS TAKEN ffc09344: 38 00 00 01 li r0,1 <== NOT EXECUTED ffc09348: 48 00 00 20 b ffc09368 <== NOT EXECUTED static inline bool rtems_io_is_empty_table( const rtems_driver_address_table *table ) { return table->initialization_entry == NULL && table->open_entry == NULL; ffc0934c: 81 49 00 00 lwz r10,0(r9) ffc09350: 2f 8a 00 00 cmpwi cr7,r10,0 ffc09354: 40 be 00 b0 bne+ cr7,ffc09404 ffc09358: 81 49 00 04 lwz r10,4(r9) ffc0935c: 2f 8a 00 00 cmpwi cr7,r10,0 ffc09360: 40 be 00 a4 bne+ cr7,ffc09404 ffc09364: 48 00 00 0c b ffc09370 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 ) { ffc09368: 34 00 ff ff addic. r0,r0,-1 ffc0936c: 40 82 ff e0 bne+ ffc0934c } /* Assigns invalid value in case of failure */ *major = m; if ( m != n ) ffc09370: 7f 9f 58 00 cmpw cr7,r31,r11 if ( rtems_io_is_empty_table( table ) ) break; } /* Assigns invalid value in case of failure */ *major = m; ffc09374: 93 e5 00 00 stw r31,0(r5) if ( m != n ) ffc09378: 40 be 00 48 bne+ cr7,ffc093c0 ffc0937c: 48 00 00 94 b ffc09410 _Thread_Enable_dispatch(); return sc; } major = *registered_major; } else { rtems_driver_address_table *const table = _IO_Driver_address_table + major; ffc09380: 1c 1f 00 18 mulli r0,r31,24 ffc09384: 81 29 28 5c lwz r9,10332(r9) ffc09388: 7d 69 02 14 add r11,r9,r0 static inline bool rtems_io_is_empty_table( const rtems_driver_address_table *table ) { return table->initialization_entry == NULL && table->open_entry == NULL; ffc0938c: 7d 29 00 2e lwzx r9,r9,r0 ffc09390: 38 00 00 00 li r0,0 ffc09394: 2f 89 00 00 cmpwi cr7,r9,0 ffc09398: 40 be 00 10 bne+ cr7,ffc093a8 return RTEMS_SUCCESSFUL; return RTEMS_TOO_MANY; } rtems_status_code rtems_io_register_driver( ffc0939c: 80 0b 00 04 lwz r0,4(r11) ffc093a0: 7c 00 00 34 cntlzw r0,r0 ffc093a4: 54 00 d9 7e rlwinm r0,r0,27,5,31 } major = *registered_major; } else { rtems_driver_address_table *const table = _IO_Driver_address_table + major; if ( !rtems_io_is_empty_table( table ) ) { ffc093a8: 2f 80 00 00 cmpwi cr7,r0,0 ffc093ac: 40 9e 00 10 bne- cr7,ffc093bc _Thread_Enable_dispatch(); ffc093b0: 48 00 21 1d bl ffc0b4cc <_Thread_Enable_dispatch> return RTEMS_RESOURCE_IN_USE; ffc093b4: 38 60 00 0c li r3,12 ffc093b8: 48 00 00 34 b ffc093ec } *registered_major = major; ffc093bc: 93 e5 00 00 stw r31,0(r5) } _IO_Driver_address_table [major] = *driver_table; ffc093c0: 3d 20 00 00 lis r9,0 ffc093c4: 81 69 28 5c lwz r11,10332(r9) ffc093c8: 1c 1f 00 18 mulli r0,r31,24 ffc093cc: 7d 6b 02 14 add r11,r11,r0 ffc093d0: 7c a4 c4 aa lswi r5,r4,24 ffc093d4: 7c ab c5 aa stswi r5,r11,24 _Thread_Enable_dispatch(); ffc093d8: 48 00 20 f5 bl ffc0b4cc <_Thread_Enable_dispatch> return rtems_io_initialize( major, 0, NULL ); ffc093dc: 7f e3 fb 78 mr r3,r31 ffc093e0: 38 80 00 00 li r4,0 ffc093e4: 38 a0 00 00 li r5,0 ffc093e8: 48 00 88 31 bl ffc11c18 } ffc093ec: 39 61 00 10 addi r11,r1,16 ffc093f0: 48 00 fd c0 b ffc191b0 <_restgpr_31_x> return RTEMS_INVALID_ADDRESS; if ( rtems_io_is_empty_table( driver_table ) ) return RTEMS_INVALID_ADDRESS; if ( major >= major_limit ) ffc093f4: 7f 9f 00 40 cmplw cr7,r31,r0 return RTEMS_INVALID_NUMBER; ffc093f8: 38 60 00 0a li r3,10 return RTEMS_INVALID_ADDRESS; if ( rtems_io_is_empty_table( driver_table ) ) return RTEMS_INVALID_ADDRESS; if ( major >= major_limit ) ffc093fc: 41 9c ff 14 blt+ cr7,ffc09310 ffc09400: 4b ff ff ec b ffc093ec 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 ) { ffc09404: 3b ff 00 01 addi r31,r31,1 ffc09408: 39 29 00 18 addi r9,r9,24 ffc0940c: 4b ff ff 5c b ffc09368 if ( major == 0 ) { rtems_status_code sc = rtems_io_obtain_major_number( registered_major ); if ( sc != RTEMS_SUCCESSFUL ) { _Thread_Enable_dispatch(); ffc09410: 48 00 20 bd bl ffc0b4cc <_Thread_Enable_dispatch> *major = m; if ( m != n ) return RTEMS_SUCCESSFUL; return RTEMS_TOO_MANY; ffc09414: 38 60 00 05 li r3,5 if ( major == 0 ) { rtems_status_code sc = rtems_io_obtain_major_number( registered_major ); if ( sc != RTEMS_SUCCESSFUL ) { _Thread_Enable_dispatch(); return sc; ffc09418: 4b ff ff d4 b ffc093ec =============================================================================== ffc0acc4 : #include #include void rtems_iterate_over_all_threads(rtems_per_thread_routine routine) { ffc0acc4: 94 21 ff e0 stwu r1,-32(r1) ffc0acc8: 7c 08 02 a6 mflr r0 ffc0accc: bf 61 00 0c stmw r27,12(r1) uint32_t i; uint32_t api_index; Thread_Control *the_thread; Objects_Information *information; if ( !routine ) ffc0acd0: 7c 7b 1b 79 mr. r27,r3 #include #include void rtems_iterate_over_all_threads(rtems_per_thread_routine routine) { ffc0acd4: 90 01 00 24 stw r0,36(r1) uint32_t i; uint32_t api_index; Thread_Control *the_thread; Objects_Information *information; if ( !routine ) ffc0acd8: 41 82 00 5c beq- ffc0ad34 <== NEVER TAKEN ffc0acdc: 3f e0 00 00 lis r31,0 ffc0ace0: 3b ff 30 80 addi r31,r31,12416 #endif #include #include void rtems_iterate_over_all_threads(rtems_per_thread_routine routine) ffc0ace4: 3b 9f 00 0c addi r28,r31,12 #if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG) if ( !_Objects_Information_table[ api_index ] ) continue; #endif information = _Objects_Information_table[ api_index ][ 1 ]; ffc0ace8: 85 3f 00 04 lwzu r9,4(r31) if ( !information ) ffc0acec: 3b c0 00 01 li r30,1 #if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG) if ( !_Objects_Information_table[ api_index ] ) continue; #endif information = _Objects_Information_table[ api_index ][ 1 ]; ffc0acf0: 83 a9 00 04 lwz r29,4(r9) if ( !information ) ffc0acf4: 2f 9d 00 00 cmpwi cr7,r29,0 ffc0acf8: 40 be 00 28 bne+ cr7,ffc0ad20 ffc0acfc: 48 00 00 30 b ffc0ad2c continue; for ( i=1 ; i <= information->maximum ; i++ ) { the_thread = (Thread_Control *)information->local_table[ i ]; ffc0ad00: 81 3d 00 1c lwz r9,28(r29) ffc0ad04: 57 c0 10 3a rlwinm r0,r30,2,0,29 ffc0ad08: 7c 69 00 2e lwzx r3,r9,r0 if ( !the_thread ) ffc0ad0c: 2f 83 00 00 cmpwi cr7,r3,0 ffc0ad10: 41 9e 00 0c beq- cr7,ffc0ad1c continue; (*routine)(the_thread); ffc0ad14: 7f 69 03 a6 mtctr r27 ffc0ad18: 4e 80 04 21 bctrl information = _Objects_Information_table[ api_index ][ 1 ]; if ( !information ) continue; for ( i=1 ; i <= information->maximum ; i++ ) { ffc0ad1c: 3b de 00 01 addi r30,r30,1 ffc0ad20: a0 1d 00 10 lhz r0,16(r29) ffc0ad24: 7f 9e 00 40 cmplw cr7,r30,r0 ffc0ad28: 40 9d ff d8 ble+ cr7,ffc0ad00 Objects_Information *information; if ( !routine ) return; for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) { ffc0ad2c: 7f 9f e0 00 cmpw cr7,r31,r28 ffc0ad30: 40 9e ff b8 bne+ cr7,ffc0ace8 (*routine)(the_thread); } } } ffc0ad34: 39 61 00 20 addi r11,r1,32 ffc0ad38: 4b ff 66 08 b ffc01340 <_restgpr_27_x> =============================================================================== ffc10600 : */ void rtems_libio_free( rtems_libio_t *iop ) { ffc10600: 7c 2b 0b 78 mr r11,r1 ffc10604: 94 21 ff f0 stwu r1,-16(r1) ffc10608: 7c 08 02 a6 mflr r0 ffc1060c: 48 00 8b 59 bl ffc19164 <_savegpr_31> ffc10610: 7c 7f 1b 78 mr r31,r3 ffc10614: 90 01 00 14 stw r0,20(r1) rtems_libio_lock(); ffc10618: 4b ff fe 69 bl ffc10480 if (iop->sem) ffc1061c: 80 7f 00 30 lwz r3,48(r31) ffc10620: 2f 83 00 00 cmpwi cr7,r3,0 ffc10624: 41 be 00 08 beq+ cr7,ffc1062c <== NEVER TAKEN rtems_semaphore_delete(iop->sem); ffc10628: 4b ff 83 45 bl ffc0896c iop->flags &= ~LIBIO_FLAGS_OPEN; ffc1062c: 80 1f 00 18 lwz r0,24(r31) iop->data1 = rtems_libio_iop_freelist; ffc10630: 3d 20 00 00 lis r9,0 rtems_libio_lock(); if (iop->sem) rtems_semaphore_delete(iop->sem); iop->flags &= ~LIBIO_FLAGS_OPEN; ffc10634: 54 00 06 2c rlwinm r0,r0,0,24,22 ffc10638: 90 1f 00 18 stw r0,24(r31) iop->data1 = rtems_libio_iop_freelist; ffc1063c: 80 09 27 ec lwz r0,10220(r9) rtems_libio_iop_freelist = iop; ffc10640: 93 e9 27 ec stw r31,10220(r9) if (iop->sem) rtems_semaphore_delete(iop->sem); iop->flags &= ~LIBIO_FLAGS_OPEN; iop->data1 = rtems_libio_iop_freelist; ffc10644: 90 1f 00 38 stw r0,56(r31) rtems_libio_iop_freelist = iop; rtems_libio_unlock(); } ffc10648: 80 01 00 14 lwz r0,20(r1) ffc1064c: 83 e1 00 0c lwz r31,12(r1) ffc10650: 38 21 00 10 addi r1,r1,16 ffc10654: 7c 08 03 a6 mtlr r0 iop->flags &= ~LIBIO_FLAGS_OPEN; iop->data1 = rtems_libio_iop_freelist; rtems_libio_iop_freelist = iop; rtems_libio_unlock(); ffc10658: 4b ff fe 58 b ffc104b0 =============================================================================== ffc05260 : * * Called by BSP startup code to initialize the libio subsystem. */ void rtems_libio_init( void ) { ffc05260: 7c 2b 0b 78 mr r11,r1 ffc05264: 94 21 ff f0 stwu r1,-16(r1) rtems_status_code rc; uint32_t i; rtems_libio_t *iop; if (rtems_libio_number_iops > 0) ffc05268: 3d 20 00 00 lis r9,0 * * Called by BSP startup code to initialize the libio subsystem. */ void rtems_libio_init( void ) { ffc0526c: 7c 08 02 a6 mflr r0 ffc05270: 48 01 3e f5 bl ffc19164 <_savegpr_31> rtems_status_code rc; uint32_t i; rtems_libio_t *iop; if (rtems_libio_number_iops > 0) ffc05274: 83 e9 27 2c lwz r31,10028(r9) * * Called by BSP startup code to initialize the libio subsystem. */ void rtems_libio_init( void ) { ffc05278: 90 01 00 14 stw r0,20(r1) rtems_status_code rc; uint32_t i; rtems_libio_t *iop; if (rtems_libio_number_iops > 0) ffc0527c: 2f 9f 00 00 cmpwi cr7,r31,0 ffc05280: 41 9e 00 5c beq- cr7,ffc052dc <== NEVER TAKEN { rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops, ffc05284: 7f e3 fb 78 mr r3,r31 ffc05288: 38 80 00 40 li r4,64 ffc0528c: 4b ff fc 9d bl ffc04f28 ffc05290: 3d 20 00 00 lis r9,0 sizeof(rtems_libio_t)); if (rtems_libio_iops == NULL) ffc05294: 2f 83 00 00 cmpwi cr7,r3,0 uint32_t i; rtems_libio_t *iop; if (rtems_libio_number_iops > 0) { rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops, ffc05298: 90 69 27 e8 stw r3,10216(r9) sizeof(rtems_libio_t)); if (rtems_libio_iops == NULL) ffc0529c: 40 be 00 0c bne+ cr7,ffc052a8 rtems_fatal_error_occurred(RTEMS_NO_MEMORY); ffc052a0: 38 60 00 1a li r3,26 ffc052a4: 48 00 00 60 b ffc05304 iop = rtems_libio_iop_freelist = rtems_libio_iops; ffc052a8: 3d 20 00 00 lis r9,0 for (i = 0 ; (i + 1) < rtems_libio_number_iops ; i++, iop++) ffc052ac: 7f e9 03 a6 mtctr r31 rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops, sizeof(rtems_libio_t)); if (rtems_libio_iops == NULL) rtems_fatal_error_occurred(RTEMS_NO_MEMORY); iop = rtems_libio_iop_freelist = rtems_libio_iops; ffc052b0: 90 69 27 ec stw r3,10220(r9) ffc052b4: 7c 69 1b 78 mr r9,r3 for (i = 0 ; (i + 1) < rtems_libio_number_iops ; i++, iop++) ffc052b8: 48 00 00 08 b ffc052c0 iop->data1 = iop + 1; ffc052bc: 91 29 ff f8 stw r9,-8(r9) 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++) ffc052c0: 39 29 00 40 addi r9,r9,64 ffc052c4: 42 00 ff f8 bdnz+ ffc052bc * rtems_libio_init * * Called by BSP startup code to initialize the libio subsystem. */ void rtems_libio_init( void ) ffc052c8: 57 ff 30 32 rlwinm r31,r31,6,0,25 rtems_fatal_error_occurred(RTEMS_NO_MEMORY); iop = rtems_libio_iop_freelist = rtems_libio_iops; for (i = 0 ; (i + 1) < rtems_libio_number_iops ; i++, iop++) iop->data1 = iop + 1; iop->data1 = NULL; ffc052cc: 3b ff ff c0 addi r31,r31,-64 ffc052d0: 7c 63 fa 14 add r3,r3,r31 ffc052d4: 38 00 00 00 li r0,0 ffc052d8: 90 03 00 38 stw r0,56(r3) /* * Create the binary semaphore used to provide mutual exclusion * on the IOP Table. */ rc = rtems_semaphore_create( ffc052dc: 3c 60 4c 42 lis r3,19522 ffc052e0: 3c e0 00 00 lis r7,0 ffc052e4: 60 63 49 4f ori r3,r3,18767 ffc052e8: 38 80 00 01 li r4,1 ffc052ec: 38 a0 00 54 li r5,84 ffc052f0: 38 c0 00 00 li r6,0 ffc052f4: 38 e7 27 f0 addi r7,r7,10224 ffc052f8: 48 00 34 ad bl ffc087a4 1, RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY, RTEMS_NO_PRIORITY, &rtems_libio_semaphore ); if ( rc != RTEMS_SUCCESSFUL ) ffc052fc: 2f 83 00 00 cmpwi cr7,r3,0 ffc05300: 41 be 00 08 beq+ cr7,ffc05308 <== ALWAYS TAKEN rtems_fatal_error_occurred( rc ); ffc05304: 48 00 3e a1 bl ffc091a4 /* * Initialize the base file system infrastructure. */ if (rtems_fs_init_helper) ffc05308: 3d 20 00 00 lis r9,0 ffc0530c: 80 09 27 28 lwz r0,10024(r9) ffc05310: 2f 80 00 00 cmpwi cr7,r0,0 ffc05314: 41 9e 00 0c beq- cr7,ffc05320 <== NEVER TAKEN (* rtems_fs_init_helper)(); ffc05318: 7c 09 03 a6 mtctr r0 ffc0531c: 4e 80 04 21 bctrl } ffc05320: 39 61 00 10 addi r11,r1,16 ffc05324: 48 01 3e 8c b ffc191b0 <_restgpr_31_x> =============================================================================== ffc106dc : */ int rtems_libio_is_file_open( void *node_access ) { ffc106dc: 7c 2b 0b 78 mr r11,r1 ffc106e0: 7c 08 02 a6 mflr r0 ffc106e4: 94 21 ff f0 stwu r1,-16(r1) ffc106e8: 48 00 8a 7d bl ffc19164 <_savegpr_31> ffc106ec: 90 01 00 14 stw r0,20(r1) ffc106f0: 7c 7f 1b 78 mr r31,r3 rtems_libio_t *iop; int result=0; uint32_t i; rtems_libio_lock(); ffc106f4: 4b ff fd 8d bl ffc10480 /* * Look for any active file descriptor entry. */ for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){ ffc106f8: 3d 60 00 00 lis r11,0 ffc106fc: 81 6b 27 2c lwz r11,10028(r11) ffc10700: 3d 20 00 00 lis r9,0 ffc10704: 81 29 27 e8 lwz r9,10216(r9) ffc10708: 2f 8b 00 00 cmpwi cr7,r11,0 ffc1070c: 38 0b 00 01 addi r0,r11,1 ffc10710: 40 be 00 28 bne+ cr7,ffc10738 <== ALWAYS TAKEN ffc10714: 38 00 00 01 li r0,1 <== NOT EXECUTED ffc10718: 48 00 00 20 b ffc10738 <== NOT EXECUTED if ((iop->flags & LIBIO_FLAGS_OPEN) != 0) { ffc1071c: 81 69 00 18 lwz r11,24(r9) ffc10720: 71 6a 01 00 andi. r10,r11,256 ffc10724: 41 82 00 10 beq- ffc10734 /* * Check if this node is under the file system that we * are trying to dismount. */ if ( iop->pathinfo.node_access == node_access ) { ffc10728: 81 69 00 1c lwz r11,28(r9) ffc1072c: 7f 8b f8 00 cmpw cr7,r11,r31 ffc10730: 41 9e 00 18 beq- cr7,ffc10748 /* * Look for any active file descriptor entry. */ for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){ ffc10734: 39 29 00 40 addi r9,r9,64 ffc10738: 34 00 ff ff addic. r0,r0,-1 ffc1073c: 40 82 ff e0 bne+ ffc1071c int rtems_libio_is_file_open( void *node_access ) { rtems_libio_t *iop; int result=0; ffc10740: 3b e0 00 00 li r31,0 ffc10744: 48 00 00 08 b ffc1074c * Check if this node is under the file system that we * are trying to dismount. */ if ( iop->pathinfo.node_access == node_access ) { result = 1; ffc10748: 3b e0 00 01 li r31,1 break; } } } rtems_libio_unlock(); ffc1074c: 4b ff fd 65 bl ffc104b0 return result; } ffc10750: 39 61 00 10 addi r11,r1,16 ffc10754: 7f e3 fb 78 mr r3,r31 ffc10758: 48 00 8a 58 b ffc191b0 <_restgpr_31_x> =============================================================================== ffc1065c : */ int rtems_libio_is_open_files_in_fs( rtems_filesystem_mount_table_entry_t * fs_mt_entry ) { ffc1065c: 7c 2b 0b 78 mr r11,r1 ffc10660: 7c 08 02 a6 mflr r0 ffc10664: 94 21 ff f0 stwu r1,-16(r1) ffc10668: 48 00 8a fd bl ffc19164 <_savegpr_31> ffc1066c: 90 01 00 14 stw r0,20(r1) ffc10670: 7c 7f 1b 78 mr r31,r3 rtems_libio_t *iop; int result = 0; uint32_t i; rtems_libio_lock(); ffc10674: 4b ff fe 0d bl ffc10480 /* * Look for any active file descriptor entry. */ for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){ ffc10678: 3d 60 00 00 lis r11,0 ffc1067c: 81 6b 27 2c lwz r11,10028(r11) ffc10680: 3d 20 00 00 lis r9,0 ffc10684: 81 29 27 e8 lwz r9,10216(r9) ffc10688: 2f 8b 00 00 cmpwi cr7,r11,0 ffc1068c: 38 0b 00 01 addi r0,r11,1 ffc10690: 40 be 00 28 bne+ cr7,ffc106b8 <== ALWAYS TAKEN ffc10694: 38 00 00 01 li r0,1 <== NOT EXECUTED ffc10698: 48 00 00 20 b ffc106b8 <== NOT EXECUTED if ((iop->flags & LIBIO_FLAGS_OPEN) != 0) { ffc1069c: 81 69 00 18 lwz r11,24(r9) ffc106a0: 71 6a 01 00 andi. r10,r11,256 ffc106a4: 41 82 00 10 beq- ffc106b4 /* * Check if this node is under the file system that we * are trying to dismount. */ if ( iop->pathinfo.mt_entry == fs_mt_entry ) { ffc106a8: 81 69 00 2c lwz r11,44(r9) ffc106ac: 7f 8b f8 00 cmpw cr7,r11,r31 ffc106b0: 41 9e 00 18 beq- cr7,ffc106c8 /* * Look for any active file descriptor entry. */ for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){ ffc106b4: 39 29 00 40 addi r9,r9,64 ffc106b8: 34 00 ff ff addic. r0,r0,-1 ffc106bc: 40 82 ff e0 bne+ ffc1069c int rtems_libio_is_open_files_in_fs( rtems_filesystem_mount_table_entry_t * fs_mt_entry ) { rtems_libio_t *iop; int result = 0; ffc106c0: 3b e0 00 00 li r31,0 ffc106c4: 48 00 00 08 b ffc106cc * Check if this node is under the file system that we * are trying to dismount. */ if ( iop->pathinfo.mt_entry == fs_mt_entry ) { result = 1; ffc106c8: 3b e0 00 01 li r31,1 break; } } } rtems_libio_unlock(); ffc106cc: 4b ff fd e5 bl ffc104b0 return result; } ffc106d0: 39 61 00 10 addi r11,r1,16 ffc106d4: 7f e3 fb 78 mr r3,r31 ffc106d8: 48 00 8a d8 b ffc191b0 <_restgpr_31_x> =============================================================================== ffc05728 : rtems_status_code rtems_libio_set_private_env(void) { ffc05728: 94 21 ff b8 stwu r1,-72(r1) ffc0572c: 7c 08 02 a6 mflr r0 ffc05730: bf a1 00 3c stmw r29,60(r1) 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); ffc05734: 3f e0 ff c1 lis r31,-63 ffc05738: 3b ff 72 44 addi r31,r31,29252 free(env); } } rtems_status_code rtems_libio_set_private_env(void) { ffc0573c: 90 01 00 4c stw r0,76(r1) rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_id task_id = rtems_task_self(); ffc05740: 48 00 2d fd bl ffc0853c ffc05744: 7c 7e 1b 78 mr r30,r3 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); ffc05748: 38 80 00 01 li r4,1 ffc0574c: 7f e3 fb 78 mr r3,r31 ffc05750: 38 a0 00 00 li r5,0 ffc05754: 38 c1 00 08 addi r6,r1,8 ffc05758: 38 e0 00 00 li r7,0 ffc0575c: 4b ff ec 15 bl ffc04370 error_1: rtems_filesystem_freenode(&root_loc); error_0: return RTEMS_NO_MEMORY; ffc05760: 38 00 00 1a li r0,26 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) ffc05764: 2f 83 00 00 cmpwi cr7,r3,0 ffc05768: 40 be 00 e0 bne+ cr7,ffc05848 <== NEVER TAKEN goto error_0; rv = rtems_filesystem_evaluate_path("/", 1, 0, ¤t_loc, 0); ffc0576c: 7f e3 fb 78 mr r3,r31 ffc05770: 38 80 00 01 li r4,1 ffc05774: 38 a0 00 00 li r5,0 ffc05778: 38 c1 00 1c addi r6,r1,28 ffc0577c: 38 e0 00 00 li r7,0 ffc05780: 4b ff eb f1 bl ffc04370 if (rv != 0) ffc05784: 2f 83 00 00 cmpwi cr7,r3,0 ffc05788: 40 9e 00 b4 bne- cr7,ffc0583c <== 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 ffc0578c: 3d 20 00 00 lis r9,0 ffc05790: 81 29 27 34 lwz r9,10036(r9) /* * Bharath: I'm not sure if the check can be reduced to * if( rtems_current_user_env->task_id != task_id ) { */ if ( ffc05794: 3d 60 00 00 lis r11,0 ffc05798: 38 0b 2b 50 addi r0,r11,11088 ffc0579c: 7f 89 00 00 cmpw cr7,r9,r0 ffc057a0: 41 9e 00 10 beq- cr7,ffc057b0 rtems_current_user_env == &rtems_global_user_env || rtems_current_user_env->task_id != task_id ffc057a4: 80 09 00 00 lwz r0,0(r9) ffc057a8: 7f 80 f0 00 cmpw cr7,r0,r30 ffc057ac: 41 9e 00 38 beq- cr7,ffc057e4 ) { new_env = malloc(sizeof(rtems_user_env_t)); ffc057b0: 38 60 00 48 li r3,72 ffc057b4: 4b ff f3 85 bl ffc04b38 if (new_env == NULL) ffc057b8: 7c 7f 1b 79 mr. r31,r3 ffc057bc: 41 82 00 78 beq- ffc05834 #ifdef HAVE_USERENV_REFCNT new_env->refcnt = 1; #endif sc = rtems_task_variable_add( ffc057c0: 3f a0 00 00 lis r29,0 ffc057c4: 3c a0 ff c0 lis r5,-64 ffc057c8: 38 60 00 00 li r3,0 ffc057cc: 38 9d 27 34 addi r4,r29,10036 ffc057d0: 38 a5 56 e0 addi r5,r5,22240 ffc057d4: 48 00 2e 51 bl ffc08624 RTEMS_SELF, (void*)&rtems_current_user_env, (void(*)(void *))free_user_env ); if (sc != RTEMS_SUCCESSFUL) ffc057d8: 2f 83 00 00 cmpwi cr7,r3,0 ffc057dc: 40 9e 00 50 bne- cr7,ffc0582c goto error_3; rtems_current_user_env = new_env; ffc057e0: 93 fd 27 34 stw r31,10036(r29) } /* Inherit the global values */ *rtems_current_user_env = rtems_global_user_env; ffc057e4: 3d 20 00 00 lis r9,0 ffc057e8: 83 e9 27 34 lwz r31,10036(r9) ffc057ec: 3c 80 00 00 lis r4,0 ffc057f0: 38 a0 00 48 li r5,72 ffc057f4: 7f e3 fb 78 mr r3,r31 ffc057f8: 38 84 2b 50 addi r4,r4,11088 ffc057fc: 48 00 ba c5 bl ffc112c0 * 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; ffc05800: 39 7f 00 18 addi r11,r31,24 ffc05804: 38 81 00 08 addi r4,r1,8 } /* Inherit the global values */ *rtems_current_user_env = rtems_global_user_env; rtems_current_user_env->task_id = task_id; ffc05808: 93 df 00 00 stw r30,0(r31) * 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; rtems_filesystem_current = current_loc; ffc0580c: 3b ff 00 04 addi r31,r31,4 * 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; ffc05810: 7c a4 a4 aa lswi r5,r4,20 ffc05814: 7c ab a5 aa stswi r5,r11,20 rtems_filesystem_current = current_loc; ffc05818: 39 61 00 1c addi r11,r1,28 return RTEMS_SUCCESSFUL; ffc0581c: 38 00 00 00 li r0,0 * 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; rtems_filesystem_current = current_loc; ffc05820: 7c ab a4 aa lswi r5,r11,20 ffc05824: 7c bf a5 aa stswi r5,r31,20 return RTEMS_SUCCESSFUL; ffc05828: 48 00 00 20 b ffc05848 error_3: free(new_env); ffc0582c: 7f e3 fb 78 mr r3,r31 ffc05830: 4b ff ec 61 bl ffc04490 error_2: rtems_filesystem_freenode(¤t_loc); ffc05834: 38 61 00 1c addi r3,r1,28 ffc05838: 4b ff ec 2d bl ffc04464 error_1: rtems_filesystem_freenode(&root_loc); ffc0583c: 38 61 00 08 addi r3,r1,8 ffc05840: 4b ff ec 25 bl ffc04464 error_0: return RTEMS_NO_MEMORY; ffc05844: 38 00 00 1a li r0,26 } ffc05848: 39 61 00 48 addi r11,r1,72 ffc0584c: 7c 03 03 78 mr r3,r0 ffc05850: 48 00 fd 00 b ffc15550 <_restgpr_29_x> =============================================================================== ffc05854 : * 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) { ffc05854: 94 21 ff d8 stwu r1,-40(r1) ffc05858: 7c 08 02 a6 mflr r0 ffc0585c: bf 81 00 18 stmw r28,24(r1) ffc05860: 7c 7c 1b 78 mr r28,r3 * 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; ffc05864: 3b a0 00 00 li r29,0 * 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) { ffc05868: 90 01 00 2c stw r0,44(r1) rtems_id current_task_id; /* * get current task id */ current_task_id = rtems_task_self(); ffc0586c: 48 00 2c d1 bl ffc0853c /* * 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 ) ffc05870: 7f 9c 18 00 cmpw cr7,r28,r3 rtems_id current_task_id; /* * get current task id */ current_task_id = rtems_task_self(); ffc05874: 7c 7f 1b 78 mr r31,r3 /* * 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 ) ffc05878: 41 9e 00 40 beq- cr7,ffc058b8 <== NEVER TAKEN return RTEMS_SUCCESSFUL; /* * Try to get the requested user environment */ sc = rtems_task_variable_get( ffc0587c: 3f c0 00 00 lis r30,0 ffc05880: 7f 83 e3 78 mr r3,r28 ffc05884: 38 9e 27 34 addi r4,r30,10036 ffc05888: 38 a1 00 08 addi r5,r1,8 ffc0588c: 48 00 2e 4d bl ffc086d8 (void*)&shared_user_env ); /* * If it was not successful, return the error code */ if (sc != RTEMS_SUCCESSFUL) ffc05890: 7c 7d 1b 79 mr. r29,r3 ffc05894: 40 82 00 24 bne- ffc058b8 * 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) { ffc05898: 80 7e 27 34 lwz r3,10036(r30) ffc0589c: 80 03 00 00 lwz r0,0(r3) ffc058a0: 7f 80 f8 00 cmpw cr7,r0,r31 ffc058a4: 40 be 00 08 bne+ cr7,ffc058ac rtems_user_env_t *tmp = rtems_current_user_env; free_user_env( tmp ); ffc058a8: 4b ff fe 39 bl ffc056e0 } /* the current_user_env is the same pointer that remote env */ rtems_current_user_env = shared_user_env; ffc058ac: 80 01 00 08 lwz r0,8(r1) ffc058b0: 3d 20 00 00 lis r9,0 ffc058b4: 90 09 27 34 stw r0,10036(r9) #ifdef HAVE_USERENV_REFCNT rtems_current_user_env->refcnt++; #endif return RTEMS_SUCCESSFUL; } ffc058b8: 39 61 00 28 addi r11,r1,40 ffc058bc: 7f a3 eb 78 mr r3,r29 ffc058c0: 48 00 fc 8c b ffc1554c <_restgpr_28_x> =============================================================================== ffc1051c : uint32_t flags ) { uint32_t fcntl_flags = 0; if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) { ffc1051c: 54 69 07 7c rlwinm r9,r3,0,29,30 ffc10520: 2f 89 00 06 cmpwi cr7,r9,6 fcntl_flags |= O_RDWR; ffc10524: 38 00 00 02 li r0,2 uint32_t flags ) { uint32_t fcntl_flags = 0; if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) { ffc10528: 41 9e 00 14 beq- cr7,ffc1053c fcntl_flags |= O_RDWR; } else if ( (flags & LIBIO_FLAGS_READ) == LIBIO_FLAGS_READ) { ffc1052c: 70 69 00 02 andi. r9,r3,2 fcntl_flags |= O_RDONLY; ffc10530: 38 00 00 00 li r0,0 { 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) { ffc10534: 40 82 00 08 bne- ffc1053c <== ALWAYS TAKEN ) { uint32_t fcntl_flags = 0; if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) { fcntl_flags |= O_RDWR; ffc10538: 54 60 f7 fe rlwinm r0,r3,30,31,31 <== 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 ) { ffc1053c: 70 69 00 01 andi. r9,r3,1 ffc10540: 41 82 00 08 beq- ffc10548 fcntl_flags |= O_NONBLOCK; ffc10544: 60 00 40 00 ori r0,r0,16384 } if ( (flags & LIBIO_FLAGS_APPEND) == LIBIO_FLAGS_APPEND ) { ffc10548: 70 69 02 00 andi. r9,r3,512 ffc1054c: 41 82 00 08 beq- ffc10554 fcntl_flags |= O_APPEND; ffc10550: 60 00 00 08 ori r0,r0,8 } if ( (flags & LIBIO_FLAGS_CREATE) == LIBIO_FLAGS_CREATE ) { ffc10554: 70 69 04 00 andi. r9,r3,1024 ffc10558: 41 82 00 08 beq- ffc10560 fcntl_flags |= O_CREAT; ffc1055c: 60 00 02 00 ori r0,r0,512 } return fcntl_flags; } ffc10560: 7c 03 03 78 mr r3,r0 ffc10564: 4e 80 00 20 blr =============================================================================== ffc07bc0 : * size and thus we skip updating the statistics. */ static void rtems_malloc_statistics_at_free( void *pointer ) { ffc07bc0: 94 21 ff e8 stwu r1,-24(r1) uintptr_t size; if (_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &size) ) { ffc07bc4: 3d 20 00 00 lis r9,0 * size and thus we skip updating the statistics. */ static void rtems_malloc_statistics_at_free( void *pointer ) { ffc07bc8: 7c 08 02 a6 mflr r0 ffc07bcc: 7c 64 1b 78 mr r4,r3 uintptr_t size; if (_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &size) ) { ffc07bd0: 80 69 27 7c lwz r3,10108(r9) ffc07bd4: 38 a1 00 08 addi r5,r1,8 * size and thus we skip updating the statistics. */ static void rtems_malloc_statistics_at_free( void *pointer ) { ffc07bd8: 90 01 00 1c stw r0,28(r1) uintptr_t size; if (_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &size) ) { ffc07bdc: 48 00 64 05 bl ffc0dfe0 <_Protected_heap_Get_block_size> ffc07be0: 2f 83 00 00 cmpwi cr7,r3,0 ffc07be4: 41 9e 00 2c beq- cr7,ffc07c10 <== NEVER TAKEN MSBUMP(lifetime_freed, size); ffc07be8: 3d 00 00 00 lis r8,0 ffc07bec: 81 41 00 08 lwz r10,8(r1) ffc07bf0: 39 08 34 48 addi r8,r8,13384 ffc07bf4: 81 68 00 28 lwz r11,40(r8) ffc07bf8: 39 20 00 00 li r9,0 ffc07bfc: 81 88 00 2c lwz r12,44(r8) ffc07c00: 7d 4a 60 14 addc r10,r10,r12 ffc07c04: 7d 29 59 14 adde r9,r9,r11 ffc07c08: 91 28 00 28 stw r9,40(r8) ffc07c0c: 91 48 00 2c stw r10,44(r8) } } ffc07c10: 80 01 00 1c lwz r0,28(r1) ffc07c14: 38 21 00 18 addi r1,r1,24 ffc07c18: 7c 08 03 a6 mtlr r0 ffc07c1c: 4e 80 00 20 blr =============================================================================== ffc07c20 : { uintptr_t actual_size = 0; uint32_t current_depth; rtems_malloc_statistics_t *s = &rtems_malloc_statistics; if ( !pointer ) ffc07c20: 7c 64 1b 79 mr. r4,r3 } static void rtems_malloc_statistics_at_malloc( void *pointer ) { ffc07c24: 94 21 ff e8 stwu r1,-24(r1) ffc07c28: 7c 08 02 a6 mflr r0 ffc07c2c: 90 01 00 1c stw r0,28(r1) uintptr_t actual_size = 0; ffc07c30: 38 00 00 00 li r0,0 ffc07c34: 90 01 00 08 stw r0,8(r1) uint32_t current_depth; rtems_malloc_statistics_t *s = &rtems_malloc_statistics; if ( !pointer ) ffc07c38: 41 82 00 54 beq- ffc07c8c <== NEVER TAKEN return; _Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &actual_size); ffc07c3c: 3d 20 00 00 lis r9,0 ffc07c40: 80 69 27 7c lwz r3,10108(r9) ffc07c44: 38 a1 00 08 addi r5,r1,8 ffc07c48: 48 00 63 99 bl ffc0dfe0 <_Protected_heap_Get_block_size> MSBUMP(lifetime_allocated, actual_size); ffc07c4c: 3d 00 00 00 lis r8,0 ffc07c50: 39 08 34 48 addi r8,r8,13384 ffc07c54: 81 41 00 08 lwz r10,8(r1) ffc07c58: 81 68 00 20 lwz r11,32(r8) ffc07c5c: 39 20 00 00 li r9,0 ffc07c60: 81 88 00 24 lwz r12,36(r8) current_depth = (uint32_t) (s->lifetime_allocated - s->lifetime_freed); ffc07c64: 80 08 00 2c lwz r0,44(r8) if ( !pointer ) return; _Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &actual_size); MSBUMP(lifetime_allocated, actual_size); ffc07c68: 7d 4a 60 14 addc r10,r10,r12 ffc07c6c: 7d 29 59 14 adde r9,r9,r11 ffc07c70: 91 28 00 20 stw r9,32(r8) current_depth = (uint32_t) (s->lifetime_allocated - s->lifetime_freed); ffc07c74: 7c 00 50 50 subf r0,r0,r10 if (current_depth > s->max_depth) ffc07c78: 81 28 00 18 lwz r9,24(r8) if ( !pointer ) return; _Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &actual_size); MSBUMP(lifetime_allocated, actual_size); ffc07c7c: 91 48 00 24 stw r10,36(r8) current_depth = (uint32_t) (s->lifetime_allocated - s->lifetime_freed); if (current_depth > s->max_depth) ffc07c80: 7f 80 48 40 cmplw cr7,r0,r9 ffc07c84: 40 9d 00 08 ble- cr7,ffc07c8c s->max_depth = current_depth; ffc07c88: 90 08 00 18 stw r0,24(r8) } ffc07c8c: 80 01 00 1c lwz r0,28(r1) ffc07c90: 38 21 00 18 addi r1,r1,24 ffc07c94: 7c 08 03 a6 mtlr r0 ffc07c98: 4e 80 00 20 blr =============================================================================== ffc10a34 : int rtems_memalign( void **pointer, size_t alignment, size_t size ) { ffc10a34: 94 21 ff e8 stwu r1,-24(r1) ffc10a38: 7c 08 02 a6 mflr r0 ffc10a3c: bf 81 00 08 stmw r28,8(r1) void *return_this; /* * Parameter error checks */ if ( !pointer ) ffc10a40: 7c 7f 1b 79 mr. r31,r3 int rtems_memalign( void **pointer, size_t alignment, size_t size ) { ffc10a44: 7c 9e 23 78 mr r30,r4 ffc10a48: 90 01 00 1c stw r0,28(r1) ffc10a4c: 7c bc 2b 78 mr r28,r5 /* * Parameter error checks */ if ( !pointer ) return EINVAL; ffc10a50: 3b a0 00 16 li r29,22 void *return_this; /* * Parameter error checks */ if ( !pointer ) ffc10a54: 41 82 00 78 beq- ffc10acc return EINVAL; *pointer = NULL; ffc10a58: 38 00 00 00 li r0,0 /* * Do not attempt to allocate memory if not in correct system state. */ if ( _System_state_Is_up(_System_state_Get()) && ffc10a5c: 3d 20 00 00 lis r9,0 * Parameter error checks */ if ( !pointer ) return EINVAL; *pointer = NULL; ffc10a60: 90 1f 00 00 stw r0,0(r31) /* * Do not attempt to allocate memory if not in correct system state. */ if ( _System_state_Is_up(_System_state_Get()) && ffc10a64: 80 09 28 48 lwz r0,10312(r9) ffc10a68: 2f 80 00 03 cmpwi cr7,r0,3 ffc10a6c: 40 be 00 10 bne+ cr7,ffc10a7c <== NEVER TAKEN !malloc_is_system_state_OK() ) ffc10a70: 4b ff 48 b9 bl ffc05328 *pointer = NULL; /* * Do not attempt to allocate memory if not in correct system state. */ if ( _System_state_Is_up(_System_state_Get()) && ffc10a74: 2f 83 00 00 cmpwi cr7,r3,0 ffc10a78: 41 9e 00 54 beq- cr7,ffc10acc <== NEVER TAKEN return EINVAL; /* * If some free's have been deferred, then do them now. */ malloc_deferred_frees_process(); ffc10a7c: 4b ff 48 f5 bl ffc05370 Heap_Control *heap, uintptr_t size, uintptr_t alignment ) { return ffc10a80: 3d 20 00 00 lis r9,0 ffc10a84: 80 69 27 3c lwz r3,10044(r9) ffc10a88: 7f c5 f3 78 mr r5,r30 ffc10a8c: 7f 84 e3 78 mr r4,r28 ffc10a90: 38 c0 00 00 li r6,0 ffc10a94: 4b ff 9e a9 bl ffc0a93c <_Protected_heap_Allocate_aligned_with_boundary> RTEMS_Malloc_Heap, size, alignment ); if ( !return_this ) return ENOMEM; ffc10a98: 3b a0 00 0c li r29,12 return_this = _Protected_heap_Allocate_aligned( RTEMS_Malloc_Heap, size, alignment ); if ( !return_this ) ffc10a9c: 7c 7e 1b 79 mr. r30,r3 ffc10aa0: 41 82 00 2c beq- ffc10acc return ENOMEM; /* * If configured, update the more involved statistics */ if ( rtems_malloc_statistics_helpers ) ffc10aa4: 3d 20 00 00 lis r9,0 ffc10aa8: 81 29 27 a8 lwz r9,10152(r9) ffc10aac: 2f 89 00 00 cmpwi cr7,r9,0 ffc10ab0: 41 9e 00 14 beq- cr7,ffc10ac4 (*rtems_malloc_statistics_helpers->at_malloc)(pointer); ffc10ab4: 80 09 00 04 lwz r0,4(r9) ffc10ab8: 7f e3 fb 78 mr r3,r31 ffc10abc: 7c 09 03 a6 mtctr r0 ffc10ac0: 4e 80 04 21 bctrl *pointer = return_this; ffc10ac4: 93 df 00 00 stw r30,0(r31) return 0; ffc10ac8: 3b a0 00 00 li r29,0 } ffc10acc: 39 61 00 18 addi r11,r1,24 ffc10ad0: 7f a3 eb 78 mr r3,r29 ffc10ad4: 48 00 86 d0 b ffc191a4 <_restgpr_28_x> =============================================================================== ffc0f1f0 : return (retval); } int rtems_mkdir(const char *path, mode_t mode) { ffc0f1f0: 94 21 ff 88 stwu r1,-120(r1) ffc0f1f4: 7c 08 02 a6 mflr r0 ffc0f1f8: bf 01 00 58 stmw r24,88(r1) ffc0f1fc: 7c 98 23 78 mr r24,r4 ffc0f200: 90 01 00 7c stw r0,124(r1) int success = 0; char *dup_path = strdup(path); ffc0f204: 48 00 3f c1 bl ffc131c4 if (dup_path != NULL) { ffc0f208: 7c 7e 1b 79 mr. r30,r3 success = build(dup_path, mode); free(dup_path); } return success != 0 ? 0 : -1; ffc0f20c: 38 00 ff ff li r0,-1 rtems_mkdir(const char *path, mode_t mode) { int success = 0; char *dup_path = strdup(path); if (dup_path != NULL) { ffc0f210: 41 82 01 64 beq- ffc0f374 <== NEVER TAKEN char *p; p = path; oumask = 0; retval = 1; if (p[0] == '/') /* Skip leading '/'. */ ffc0f214: 88 1e 00 00 lbz r0,0(r30) (void)umask(oumask); return (retval); } int rtems_mkdir(const char *path, mode_t mode) ffc0f218: 3b 80 00 00 li r28,0 for (first = 1, last = 0; !last ; ++p) { if (p[0] == '\0') last = 1; else if (p[0] != '/') continue; *p = '\0'; ffc0f21c: 3b 20 00 00 li r25,0 p = path; oumask = 0; retval = 1; if (p[0] == '/') /* Skip leading '/'. */ ++p; ffc0f220: 68 1d 00 2f xori r29,r0,47 ffc0f224: 23 bd 00 00 subfic r29,r29,0 ffc0f228: 7f be 01 94 addze r29,r30 (void)umask(oumask); return (retval); } int rtems_mkdir(const char *path, mode_t mode) ffc0f22c: 3b bd ff ff addi r29,r29,-1 ffc0f230: 38 00 00 01 li r0,1 retval = 0; break; } } if (!last) *p = '/'; ffc0f234: 3b 40 00 2f li r26,47 } 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) { ffc0f238: 3b 61 00 08 addi r27,r1,8 oumask = 0; retval = 1; if (p[0] == '/') /* Skip leading '/'. */ ++p; for (first = 1, last = 0; !last ; ++p) { if (p[0] == '\0') ffc0f23c: 8d 7d 00 01 lbzu r11,1(r29) last = 1; ffc0f240: 39 20 00 01 li r9,1 oumask = 0; retval = 1; if (p[0] == '/') /* Skip leading '/'. */ ++p; for (first = 1, last = 0; !last ; ++p) { if (p[0] == '\0') ffc0f244: 2f 8b 00 00 cmpwi cr7,r11,0 ffc0f248: 41 9e 00 10 beq- cr7,ffc0f258 last = 1; else if (p[0] != '/') ffc0f24c: 2f 8b 00 2f cmpwi cr7,r11,47 ffc0f250: 40 9e ff ec bne+ cr7,ffc0f23c ffc0f254: 39 20 00 00 li r9,0 continue; *p = '\0'; if (!last && p[1] == '\0') ffc0f258: 2f 89 00 00 cmpwi cr7,r9,0 for (first = 1, last = 0; !last ; ++p) { if (p[0] == '\0') last = 1; else if (p[0] != '/') continue; *p = '\0'; ffc0f25c: 9b 3d 00 00 stb r25,0(r29) if (!last && p[1] == '\0') ffc0f260: 3b e0 00 01 li r31,1 ffc0f264: 40 9e 00 10 bne- cr7,ffc0f274 ffc0f268: 8b fd 00 01 lbz r31,1(r29) ffc0f26c: 7f ff 00 34 cntlzw r31,r31 ffc0f270: 57 ff d9 7e rlwinm r31,r31,27,5,31 last = 1; if (first) { ffc0f274: 2f 80 00 00 cmpwi cr7,r0,0 ffc0f278: 41 be 00 18 beq+ cr7,ffc0f290 * mkdir [-m mode] dir * * We change the user's umask and then restore it, * instead of doing chmod's. */ oumask = umask(0); ffc0f27c: 38 60 00 00 li r3,0 ffc0f280: 48 00 01 b9 bl ffc0f438 ffc0f284: 7c 7c 1b 78 mr r28,r3 numask = oumask & ~(S_IWUSR | S_IXUSR); (void)umask(numask); ffc0f288: 54 63 06 ae rlwinm r3,r3,0,26,23 ffc0f28c: 48 00 01 ad bl ffc0f438 first = 0; } if (last) ffc0f290: 2f 9f 00 00 cmpwi cr7,r31,0 (void)umask(oumask); if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) { ffc0f294: 38 80 01 ff li r4,511 oumask = umask(0); numask = oumask & ~(S_IWUSR | S_IXUSR); (void)umask(numask); first = 0; } if (last) ffc0f298: 41 be 00 10 beq+ cr7,ffc0f2a8 (void)umask(oumask); ffc0f29c: 7f 83 e3 78 mr r3,r28 ffc0f2a0: 48 00 01 99 bl ffc0f438 if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) { ffc0f2a4: 7f 04 c3 78 mr r4,r24 ffc0f2a8: 7f c3 f3 78 mr r3,r30 ffc0f2ac: 4b ff 69 c9 bl ffc05c74 ffc0f2b0: 2f 83 00 00 cmpwi cr7,r3,0 ffc0f2b4: 40 bc 00 80 bge+ cr7,ffc0f334 if (errno == EEXIST || errno == EISDIR) { ffc0f2b8: 48 00 2c 7d bl ffc11f34 <__errno> ffc0f2bc: 80 03 00 00 lwz r0,0(r3) ffc0f2c0: 2f 80 00 11 cmpwi cr7,r0,17 ffc0f2c4: 41 9e 00 14 beq- cr7,ffc0f2d8 ffc0f2c8: 48 00 2c 6d bl ffc11f34 <__errno> ffc0f2cc: 80 03 00 00 lwz r0,0(r3) ffc0f2d0: 2f 80 00 15 cmpwi cr7,r0,21 ffc0f2d4: 40 9e 00 74 bne- cr7,ffc0f348 <== ALWAYS TAKEN if (stat(path, &sb) < 0) { ffc0f2d8: 7f c3 f3 78 mr r3,r30 ffc0f2dc: 7f 64 db 78 mr r4,r27 ffc0f2e0: 48 00 00 b1 bl ffc0f390 ffc0f2e4: 2f 83 00 00 cmpwi cr7,r3,0 ffc0f2e8: 41 9c 00 60 blt- cr7,ffc0f348 <== NEVER TAKEN retval = 0; break; } else if (!S_ISDIR(sb.st_mode)) { ffc0f2ec: 80 01 00 14 lwz r0,20(r1) ffc0f2f0: 2f 9f 00 00 cmpwi cr7,r31,0 ffc0f2f4: 54 00 04 26 rlwinm r0,r0,0,16,19 ffc0f2f8: 2f 00 40 00 cmpwi cr6,r0,16384 ffc0f2fc: 41 ba 00 30 beq+ cr6,ffc0f32c if (last) ffc0f300: 41 9e 00 18 beq- cr7,ffc0f318 errno = EEXIST; ffc0f304: 48 00 2c 31 bl ffc11f34 <__errno> ffc0f308: 38 00 00 11 li r0,17 ffc0f30c: 90 03 00 00 stw r0,0(r3) else errno = ENOTDIR; retval = 0; ffc0f310: 3b a0 00 00 li r29,0 ffc0f314: 48 00 00 48 b ffc0f35c break; } else if (!S_ISDIR(sb.st_mode)) { if (last) errno = EEXIST; else errno = ENOTDIR; ffc0f318: 48 00 2c 1d bl ffc11f34 <__errno> ffc0f31c: 38 00 00 14 li r0,20 ffc0f320: 90 03 00 00 stw r0,0(r3) retval = 0; ffc0f324: 3b a0 00 00 li r29,0 ffc0f328: 48 00 00 2c b ffc0f354 break; } if (last) ffc0f32c: 40 9e 00 54 bne- cr7,ffc0f380 ffc0f330: 48 00 00 0c b ffc0f33c } else { retval = 0; break; } } if (!last) ffc0f334: 2f 9f 00 00 cmpwi cr7,r31,0 ffc0f338: 40 9e 00 50 bne- cr7,ffc0f388 *p = '/'; ffc0f33c: 9b 5d 00 00 stb r26,0(r29) ffc0f340: 38 00 00 00 li r0,0 ffc0f344: 4b ff fe f8 b ffc0f23c } if (!first && !last) ffc0f348: 2f 9f 00 00 cmpwi cr7,r31,0 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; ffc0f34c: 3b a0 00 00 li r29,0 } } if (!last) *p = '/'; } if (!first && !last) ffc0f350: 40 be 00 0c bne+ cr7,ffc0f35c <== ALWAYS TAKEN (void)umask(oumask); ffc0f354: 7f 83 e3 78 mr r3,r28 ffc0f358: 48 00 00 e1 bl ffc0f438 int success = 0; char *dup_path = strdup(path); if (dup_path != NULL) { success = build(dup_path, mode); free(dup_path); ffc0f35c: 7f c3 f3 78 mr r3,r30 ffc0f360: 4b ff 61 51 bl ffc054b0 } return success != 0 ? 0 : -1; ffc0f364: 2f 9d 00 00 cmpwi cr7,r29,0 ffc0f368: 38 00 00 00 li r0,0 ffc0f36c: 40 be 00 08 bne+ cr7,ffc0f374 ffc0f370: 38 00 ff ff li r0,-1 } ffc0f374: 39 61 00 78 addi r11,r1,120 ffc0f378: 7c 03 03 78 mr r3,r0 ffc0f37c: 48 00 e6 d8 b ffc1da54 <_restgpr_24_x> errno = ENOTDIR; retval = 0; break; } if (last) retval = 2; ffc0f380: 3b a0 00 02 li r29,2 ffc0f384: 4b ff ff d8 b ffc0f35c } else { retval = 0; break; } } if (!last) ffc0f388: 3b a0 00 01 li r29,1 ffc0f38c: 4b ff ff d0 b ffc0f35c =============================================================================== ffc0937c : void rtems_panic( const char *printf_format, ... ) { ffc0937c: 94 21 ff 88 stwu r1,-120(r1) ffc09380: 7c 08 02 a6 mflr r0 ffc09384: 90 81 00 1c stw r4,28(r1) ffc09388: 90 01 00 7c stw r0,124(r1) ffc0938c: 90 a1 00 20 stw r5,32(r1) ffc09390: 90 c1 00 24 stw r6,36(r1) ffc09394: 90 e1 00 28 stw r7,40(r1) ffc09398: 91 01 00 2c stw r8,44(r1) ffc0939c: 91 21 00 30 stw r9,48(r1) ffc093a0: 91 41 00 34 stw r10,52(r1) ffc093a4: 40 86 00 24 bne- cr1,ffc093c8 <== ALWAYS TAKEN ffc093a8: d8 21 00 38 stfd f1,56(r1) <== NOT EXECUTED ffc093ac: d8 41 00 40 stfd f2,64(r1) <== NOT EXECUTED ffc093b0: d8 61 00 48 stfd f3,72(r1) <== NOT EXECUTED ffc093b4: d8 81 00 50 stfd f4,80(r1) <== NOT EXECUTED ffc093b8: d8 a1 00 58 stfd f5,88(r1) <== NOT EXECUTED ffc093bc: d8 c1 00 60 stfd f6,96(r1) <== NOT EXECUTED ffc093c0: d8 e1 00 68 stfd f7,104(r1) <== NOT EXECUTED ffc093c4: d9 01 00 70 stfd f8,112(r1) <== NOT EXECUTED va_list arglist; va_start(arglist, printf_format); ffc093c8: 38 00 00 01 li r0,1 ffc093cc: 98 01 00 08 stb r0,8(r1) ffc093d0: 38 00 00 00 li r0,0 void rtems_panic( const char *printf_format, ... ) { ffc093d4: 7c 64 1b 78 mr r4,r3 va_list arglist; va_start(arglist, printf_format); ffc093d8: 98 01 00 09 stb r0,9(r1) ffc093dc: 38 01 00 80 addi r0,r1,128 (void) rtems_verror(RTEMS_ERROR_PANIC, printf_format, arglist); ffc093e0: 38 a1 00 08 addi r5,r1,8 ... ) { va_list arglist; va_start(arglist, printf_format); ffc093e4: 90 01 00 0c stw r0,12(r1) (void) rtems_verror(RTEMS_ERROR_PANIC, printf_format, arglist); ffc093e8: 3c 60 20 00 lis r3,8192 ... ) { va_list arglist; va_start(arglist, printf_format); ffc093ec: 38 01 00 18 addi r0,r1,24 ffc093f0: 90 01 00 10 stw r0,16(r1) (void) rtems_verror(RTEMS_ERROR_PANIC, printf_format, arglist); ffc093f4: 4b ff fd 3d bl ffc09130 va_end(arglist); rtems_error(0, "fatal error, exiting"); ffc093f8: 3c 80 ff c2 lis r4,-62 ffc093fc: 38 84 73 ff addi r4,r4,29695 ffc09400: 38 60 00 00 li r3,0 ffc09404: 4c c6 31 82 crclr 4*cr1+eq ffc09408: 4b ff fe a5 bl ffc092ac _exit(errno); ffc0940c: 48 00 cb 41 bl ffc15f4c <__errno> ffc09410: 80 63 00 00 lwz r3,0(r3) ffc09414: 48 00 0b 65 bl ffc09f78 <_exit> =============================================================================== ffc16650 : uint32_t length, uint32_t buffer_size, rtems_attribute attribute_set, rtems_id *id ) { ffc16650: 94 21 ff d0 stwu r1,-48(r1) ffc16654: 7c 08 02 a6 mflr r0 ffc16658: bf 21 00 14 stmw r25,20(r1) register Partition_Control *the_partition; if ( !rtems_is_name_valid( name ) ) ffc1665c: 7c 7b 1b 79 mr. r27,r3 uint32_t length, uint32_t buffer_size, rtems_attribute attribute_set, rtems_id *id ) { ffc16660: 7c bf 2b 78 mr r31,r5 ffc16664: 90 01 00 34 stw r0,52(r1) ffc16668: 7c fa 3b 78 mr r26,r7 ffc1666c: 7d 1d 43 78 mr r29,r8 register Partition_Control *the_partition; if ( !rtems_is_name_valid( name ) ) return RTEMS_INVALID_NAME; ffc16670: 38 00 00 03 li r0,3 rtems_id *id ) { register Partition_Control *the_partition; if ( !rtems_is_name_valid( name ) ) ffc16674: 41 82 00 cc beq- ffc16740 return RTEMS_INVALID_NAME; if ( !starting_address ) ffc16678: 2f 84 00 00 cmpwi cr7,r4,0 return RTEMS_INVALID_ADDRESS; ffc1667c: 38 00 00 09 li r0,9 register Partition_Control *the_partition; if ( !rtems_is_name_valid( name ) ) return RTEMS_INVALID_NAME; if ( !starting_address ) ffc16680: 41 9e 00 c0 beq- cr7,ffc16740 return RTEMS_INVALID_ADDRESS; if ( !id ) ffc16684: 2f 88 00 00 cmpwi cr7,r8,0 ffc16688: 41 9e 00 b8 beq- cr7,ffc16740 <== NEVER TAKEN return RTEMS_INVALID_ADDRESS; if ( length == 0 || buffer_size == 0 || length < buffer_size || ffc1668c: 2f 85 00 00 cmpwi cr7,r5,0 !_Partition_Is_buffer_size_aligned( buffer_size ) ) return RTEMS_INVALID_SIZE; ffc16690: 38 00 00 08 li r0,8 return RTEMS_INVALID_ADDRESS; if ( !id ) return RTEMS_INVALID_ADDRESS; if ( length == 0 || buffer_size == 0 || length < buffer_size || ffc16694: 41 9e 00 ac beq- cr7,ffc16740 ffc16698: 2f 86 00 00 cmpwi cr7,r6,0 ffc1669c: 41 9e 00 a4 beq- cr7,ffc16740 ffc166a0: 7f 85 30 40 cmplw cr7,r5,r6 ffc166a4: 41 9c 00 9c blt- cr7,ffc16740 ffc166a8: 70 c9 00 07 andi. r9,r6,7 ffc166ac: 40 82 00 94 bne- ffc16740 !_Partition_Is_buffer_size_aligned( buffer_size ) ) return RTEMS_INVALID_SIZE; if ( !_Addresses_Is_aligned( starting_address ) ) ffc166b0: 70 99 00 07 andi. r25,r4,7 return RTEMS_INVALID_ADDRESS; ffc166b4: 38 00 00 09 li r0,9 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 ) ) ffc166b8: 40 a2 00 88 bne+ ffc16740 ffc166bc: 3d 20 00 00 lis r9,0 ffc166c0: 81 69 28 e0 lwz r11,10464(r9) ffc166c4: 38 0b 00 01 addi r0,r11,1 ffc166c8: 90 09 28 e0 stw r0,10464(r9) * 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 ); ffc166cc: 3f 80 00 00 lis r28,0 ffc166d0: 90 81 00 08 stw r4,8(r1) ffc166d4: 3b 9c 6f 20 addi r28,r28,28448 ffc166d8: 7f 83 e3 78 mr r3,r28 ffc166dc: 90 c1 00 0c stw r6,12(r1) ffc166e0: 48 00 4e c5 bl ffc1b5a4 <_Objects_Allocate> _Thread_Disable_dispatch(); /* prevents deletion */ the_partition = _Partition_Allocate(); if ( !the_partition ) { ffc166e4: 7c 7e 1b 79 mr. r30,r3 ffc166e8: 80 81 00 08 lwz r4,8(r1) ffc166ec: 80 c1 00 0c lwz r6,12(r1) ffc166f0: 40 a2 00 10 bne+ ffc16700 _Thread_Enable_dispatch(); ffc166f4: 48 00 61 f9 bl ffc1c8ec <_Thread_Enable_dispatch> return RTEMS_TOO_MANY; ffc166f8: 38 00 00 05 li r0,5 ffc166fc: 48 00 00 44 b ffc16740 the_partition->length = length; the_partition->buffer_size = buffer_size; the_partition->attribute_set = attribute_set; the_partition->number_of_used_blocks = 0; _Chain_Initialize( &the_partition->Memory, starting_address, ffc16700: 7c bf 33 96 divwu r5,r31,r6 _Thread_Enable_dispatch(); return RTEMS_TOO_MANY; } #endif the_partition->starting_address = starting_address; ffc16704: 90 9e 00 10 stw r4,16(r30) the_partition->length = length; the_partition->buffer_size = buffer_size; ffc16708: 90 de 00 18 stw r6,24(r30) return RTEMS_TOO_MANY; } #endif the_partition->starting_address = starting_address; the_partition->length = length; ffc1670c: 93 fe 00 14 stw r31,20(r30) the_partition->buffer_size = buffer_size; the_partition->attribute_set = attribute_set; ffc16710: 93 5e 00 1c stw r26,28(r30) the_partition->number_of_used_blocks = 0; ffc16714: 93 3e 00 20 stw r25,32(r30) _Chain_Initialize( &the_partition->Memory, starting_address, ffc16718: 38 7e 00 24 addi r3,r30,36 ffc1671c: 48 00 35 7d bl ffc19c98 <_Chain_Initialize> Objects_Name name ) { _Objects_Set_local_object( information, _Objects_Get_index( the_object->id ), ffc16720: 80 1e 00 08 lwz r0,8(r30) #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; ffc16724: 81 7c 00 1c lwz r11,28(r28) ffc16728: 54 09 13 ba rlwinm r9,r0,2,14,29 ffc1672c: 7f cb 49 2e stwx r30,r11,r9 information, _Objects_Get_index( the_object->id ), the_object ); the_object->name = name; ffc16730: 93 7e 00 0c stw r27,12(r30) &_Partition_Information, &the_partition->Object, (Objects_Name) name ); *id = the_partition->Object.id; ffc16734: 90 1d 00 00 stw r0,0(r29) name, 0 /* Not used */ ); #endif _Thread_Enable_dispatch(); ffc16738: 48 00 61 b5 bl ffc1c8ec <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; ffc1673c: 38 00 00 00 li r0,0 } ffc16740: 39 61 00 30 addi r11,r1,48 ffc16744: 7c 03 03 78 mr r3,r0 ffc16748: 4b ff 7c 44 b ffc0e38c <_restgpr_25_x> =============================================================================== ffc16898 : rtems_status_code rtems_partition_return_buffer( rtems_id id, void *buffer ) { ffc16898: 94 21 ff e0 stwu r1,-32(r1) ffc1689c: 7c 08 02 a6 mflr r0 ffc168a0: 90 01 00 24 stw r0,36(r1) ffc168a4: 7c 60 1b 78 mr r0,r3 Objects_Id id, Objects_Locations *location ) { return (Partition_Control *) _Objects_Get( &_Partition_Information, id, location ); ffc168a8: 3c 60 00 00 lis r3,0 ffc168ac: bf c1 00 18 stmw r30,24(r1) ffc168b0: 38 63 6f 20 addi r3,r3,28448 ffc168b4: 7c 9f 23 78 mr r31,r4 ffc168b8: 38 a1 00 08 addi r5,r1,8 ffc168bc: 7c 04 03 78 mr r4,r0 ffc168c0: 48 00 52 39 bl ffc1baf8 <_Objects_Get> register Partition_Control *the_partition; Objects_Locations location; the_partition = _Partition_Get( id, &location ); switch ( location ) { ffc168c4: 80 01 00 08 lwz r0,8(r1) ffc168c8: 7c 7e 1b 78 mr r30,r3 ffc168cc: 2f 80 00 00 cmpwi cr7,r0,0 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; ffc168d0: 38 60 00 04 li r3,4 { register Partition_Control *the_partition; Objects_Locations location; the_partition = _Partition_Get( id, &location ); switch ( location ) { ffc168d4: 40 9e 00 58 bne- cr7,ffc1692c ) { void *starting; void *ending; starting = the_partition->starting_address; ffc168d8: 80 1e 00 10 lwz r0,16(r30) ending = _Addresses_Add_offset( starting, the_partition->length ); ffc168dc: 81 3e 00 14 lwz r9,20(r30) const void *address, const void *base, const void *limit ) { return (address >= base && address <= limit); ffc168e0: 7f 9f 00 40 cmplw cr7,r31,r0 ffc168e4: 41 9c 00 50 blt- cr7,ffc16934 RTEMS_INLINE_ROUTINE void *_Addresses_Add_offset ( const void *base, uintptr_t offset ) { return (void *)((uintptr_t)base + offset); ffc168e8: 7d 20 4a 14 add r9,r0,r9 const void *address, const void *base, const void *limit ) { return (address >= base && address <= limit); ffc168ec: 7f 9f 48 40 cmplw cr7,r31,r9 ffc168f0: 41 9d 00 44 bgt- cr7,ffc16934 <== NEVER TAKEN offset = (uint32_t) _Addresses_Subtract( the_buffer, the_partition->starting_address ); return ((offset % the_partition->buffer_size) == 0); ffc168f4: 81 3e 00 18 lwz r9,24(r30) RTEMS_INLINE_ROUTINE int32_t _Addresses_Subtract ( const void *left, const void *right ) { return (int32_t) ((const char *) left - (const char *) right); ffc168f8: 7c 00 f8 50 subf r0,r0,r31 ffc168fc: 7d 60 4b 96 divwu r11,r0,r9 ffc16900: 7d 2b 49 d6 mullw r9,r11,r9 starting = the_partition->starting_address; ending = _Addresses_Add_offset( starting, the_partition->length ); return ( _Addresses_Is_in_range( the_buffer, starting, ending ) && ffc16904: 7f 80 48 00 cmpw cr7,r0,r9 ffc16908: 40 9e 00 2c bne- cr7,ffc16934 RTEMS_INLINE_ROUTINE void _Partition_Free_buffer ( Partition_Control *the_partition, Chain_Node *the_buffer ) { _Chain_Append( &the_partition->Memory, the_buffer ); ffc1690c: 38 7e 00 24 addi r3,r30,36 ffc16910: 7f e4 fb 78 mr r4,r31 ffc16914: 48 00 32 ed bl ffc19c00 <_Chain_Append> case OBJECTS_LOCAL: if ( _Partition_Is_buffer_valid( buffer, the_partition ) ) { _Partition_Free_buffer( the_partition, buffer ); the_partition->number_of_used_blocks -= 1; ffc16918: 81 3e 00 20 lwz r9,32(r30) ffc1691c: 38 09 ff ff addi r0,r9,-1 ffc16920: 90 1e 00 20 stw r0,32(r30) _Thread_Enable_dispatch(); ffc16924: 48 00 5f c9 bl ffc1c8ec <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; ffc16928: 38 60 00 00 li r3,0 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } ffc1692c: 39 61 00 20 addi r11,r1,32 ffc16930: 4b ff 7a 70 b ffc0e3a0 <_restgpr_30_x> _Partition_Free_buffer( the_partition, buffer ); the_partition->number_of_used_blocks -= 1; _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } _Thread_Enable_dispatch(); ffc16934: 48 00 5f b9 bl ffc1c8ec <_Thread_Enable_dispatch> return RTEMS_INVALID_ADDRESS; ffc16938: 38 60 00 09 li r3,9 ffc1693c: 4b ff ff f0 b ffc1692c =============================================================================== ffc08cb4 : rtems_status_code rtems_rate_monotonic_period( rtems_id id, rtems_interval length ) { ffc08cb4: 94 21 ff d8 stwu r1,-40(r1) ffc08cb8: 7c 08 02 a6 mflr r0 ffc08cbc: bf 81 00 18 stmw r28,24(r1) ffc08cc0: 7c 7e 1b 78 mr r30,r3 Objects_Id id, Objects_Locations *location ) { return (Rate_monotonic_Control *) _Objects_Get( &_Rate_monotonic_Information, id, location ); ffc08cc4: 3c 60 00 00 lis r3,0 ffc08cc8: 7c 9f 23 78 mr r31,r4 ffc08ccc: 90 01 00 2c stw r0,44(r1) ffc08cd0: 38 63 2c 78 addi r3,r3,11384 ffc08cd4: 7f c4 f3 78 mr r4,r30 ffc08cd8: 38 a1 00 08 addi r5,r1,8 ffc08cdc: 48 00 26 15 bl ffc0b2f0 <_Objects_Get> rtems_rate_monotonic_period_states local_state; ISR_Level level; the_period = _Rate_monotonic_Get( id, &location ); switch ( location ) { ffc08ce0: 80 01 00 08 lwz r0,8(r1) ffc08ce4: 7c 7d 1b 78 mr r29,r3 ffc08ce8: 2f 80 00 00 cmpwi cr7,r0,0 ffc08cec: 40 9e 01 70 bne- cr7,ffc08e5c case OBJECTS_LOCAL: if ( !_Thread_Is_executing( the_period->owner ) ) { ffc08cf0: 3d 60 00 00 lis r11,0 ffc08cf4: 81 23 00 40 lwz r9,64(r3) ffc08cf8: 80 0b 32 30 lwz r0,12848(r11) ffc08cfc: 7f 89 00 00 cmpw cr7,r9,r0 ffc08d00: 41 9e 00 10 beq- cr7,ffc08d10 _Thread_Enable_dispatch(); ffc08d04: 48 00 33 e1 bl ffc0c0e4 <_Thread_Enable_dispatch> return RTEMS_NOT_OWNER_OF_RESOURCE; ffc08d08: 3b c0 00 17 li r30,23 ffc08d0c: 48 00 01 54 b ffc08e60 } if ( length == RTEMS_PERIOD_STATUS ) { ffc08d10: 2f 9f 00 00 cmpwi cr7,r31,0 ffc08d14: 40 9e 00 2c bne- cr7,ffc08d40 switch ( the_period->state ) { ffc08d18: 80 03 00 38 lwz r0,56(r3) ffc08d1c: 3b c0 00 00 li r30,0 ffc08d20: 2b 80 00 04 cmplwi cr7,r0,4 ffc08d24: 41 9d 00 14 bgt- cr7,ffc08d38 <== NEVER TAKEN ffc08d28: 3d 20 ff c2 lis r9,-62 ffc08d2c: 54 00 10 3a rlwinm r0,r0,2,0,29 ffc08d30: 39 29 f2 84 addi r9,r9,-3452 ffc08d34: 7f c9 00 2e lwzx r30,r9,r0 case RATE_MONOTONIC_ACTIVE: default: /* unreached -- only to remove warnings */ return_value = RTEMS_SUCCESSFUL; break; } _Thread_Enable_dispatch(); ffc08d38: 48 00 33 ad bl ffc0c0e4 <_Thread_Enable_dispatch> return( return_value ); ffc08d3c: 48 00 01 24 b ffc08e60 static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc08d40: 7f 80 00 a6 mfmsr r28 ffc08d44: 7c 10 42 a6 mfsprg r0,0 ffc08d48: 7f 80 00 78 andc r0,r28,r0 ffc08d4c: 7c 00 01 24 mtmsr r0 } _ISR_Disable( level ); if ( the_period->state == RATE_MONOTONIC_INACTIVE ) { ffc08d50: 80 03 00 38 lwz r0,56(r3) ffc08d54: 2f 80 00 00 cmpwi cr7,r0,0 ffc08d58: 40 be 00 4c bne+ cr7,ffc08da4 return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc08d5c: 7f 80 01 24 mtmsr r28 _ISR_Enable( level ); /* * Baseline statistics information for the beginning of a period. */ _Rate_monotonic_Initiate_statistics( the_period ); ffc08d60: 4b ff fd cd bl ffc08b2c <_Rate_monotonic_Initiate_statistics> the_period->state = RATE_MONOTONIC_ACTIVE; ffc08d64: 38 00 00 02 li r0,2 Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; ffc08d68: 3d 20 ff c1 lis r9,-63 ffc08d6c: 90 1d 00 38 stw r0,56(r29) ffc08d70: 39 29 91 68 addi r9,r9,-28312 Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; ffc08d74: 38 00 00 00 li r0,0 the_watchdog->routine = routine; ffc08d78: 91 3d 00 2c stw r9,44(r29) ) { the_watchdog->initial = units; _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); ffc08d7c: 3c 60 00 00 lis r3,0 Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; ffc08d80: 90 1d 00 18 stw r0,24(r29) ) { the_watchdog->initial = units; _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); ffc08d84: 38 63 2e 48 addi r3,r3,11848 ffc08d88: 38 9d 00 10 addi r4,r29,16 void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; the_watchdog->id = id; ffc08d8c: 93 dd 00 30 stw r30,48(r29) the_watchdog->user_data = user_data; ffc08d90: 90 1d 00 34 stw r0,52(r29) _Rate_monotonic_Timeout, id, NULL ); the_period->next_length = length; ffc08d94: 93 fd 00 3c stw r31,60(r29) Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; ffc08d98: 93 fd 00 1c stw r31,28(r29) _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); ffc08d9c: 48 00 44 71 bl ffc0d20c <_Watchdog_Insert> ffc08da0: 48 00 00 70 b ffc08e10 _Watchdog_Insert_ticks( &the_period->Timer, length ); _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } if ( the_period->state == RATE_MONOTONIC_ACTIVE ) { ffc08da4: 2f 80 00 02 cmpwi cr7,r0,2 ffc08da8: 40 be 00 74 bne+ cr7,ffc08e1c /* * Update statistics from the concluding period. */ _Rate_monotonic_Update_statistics( the_period ); ffc08dac: 4b ff fe 01 bl ffc08bac <_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; ffc08db0: 38 00 00 01 li r0,1 ffc08db4: 90 1d 00 38 stw r0,56(r29) the_period->next_length = length; ffc08db8: 93 fd 00 3c stw r31,60(r29) ffc08dbc: 7f 80 01 24 mtmsr r28 _ISR_Enable( level ); _Thread_Executing->Wait.id = the_period->Object.id; ffc08dc0: 3d 20 00 00 lis r9,0 ffc08dc4: 80 1d 00 08 lwz r0,8(r29) ffc08dc8: 80 69 32 30 lwz r3,12848(r9) _Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); ffc08dcc: 38 80 40 00 li r4,16384 the_period->state = RATE_MONOTONIC_OWNER_IS_BLOCKING; the_period->next_length = length; _ISR_Enable( level ); _Thread_Executing->Wait.id = the_period->Object.id; ffc08dd0: 90 03 00 20 stw r0,32(r3) _Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); ffc08dd4: 48 00 3c 69 bl ffc0ca3c <_Thread_Set_state> static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc08dd8: 7d 20 00 a6 mfmsr r9 ffc08ddc: 7c 10 42 a6 mfsprg r0,0 ffc08de0: 7d 20 00 78 andc r0,r9,r0 ffc08de4: 7c 00 01 24 mtmsr r0 * Did the watchdog timer expire while we were actually blocking * on it? */ _ISR_Disable( level ); local_state = the_period->state; the_period->state = RATE_MONOTONIC_ACTIVE; ffc08de8: 39 60 00 02 li r11,2 /* * Did the watchdog timer expire while we were actually blocking * on it? */ _ISR_Disable( level ); local_state = the_period->state; ffc08dec: 80 1d 00 38 lwz r0,56(r29) the_period->state = RATE_MONOTONIC_ACTIVE; ffc08df0: 91 7d 00 38 stw r11,56(r29) return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc08df4: 7d 20 01 24 mtmsr r9 /* * 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 ) ffc08df8: 2f 80 00 03 cmpwi cr7,r0,3 ffc08dfc: 40 be 00 14 bne+ cr7,ffc08e10 <== ALWAYS TAKEN _Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); ffc08e00: 3d 20 00 00 lis r9,0 <== NOT EXECUTED ffc08e04: 80 69 32 30 lwz r3,12848(r9) <== NOT EXECUTED ffc08e08: 38 80 40 00 li r4,16384 <== NOT EXECUTED ffc08e0c: 48 00 2f 29 bl ffc0bd34 <_Thread_Clear_state> <== NOT EXECUTED _Thread_Enable_dispatch(); ffc08e10: 48 00 32 d5 bl ffc0c0e4 <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; ffc08e14: 3b c0 00 00 li r30,0 ffc08e18: 48 00 00 48 b ffc08e60 } if ( the_period->state == RATE_MONOTONIC_EXPIRED ) { ffc08e1c: 2f 80 00 04 cmpwi cr7,r0,4 #endif case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; ffc08e20: 3b c0 00 04 li r30,4 _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } if ( the_period->state == RATE_MONOTONIC_EXPIRED ) { ffc08e24: 40 be 00 3c bne+ cr7,ffc08e60 <== NEVER TAKEN /* * Update statistics from the concluding period */ _Rate_monotonic_Update_statistics( the_period ); ffc08e28: 4b ff fd 85 bl ffc08bac <_Rate_monotonic_Update_statistics> ffc08e2c: 7f 80 01 24 mtmsr r28 _ISR_Enable( level ); the_period->state = RATE_MONOTONIC_ACTIVE; ffc08e30: 38 00 00 02 li r0,2 the_period->next_length = length; ffc08e34: 93 fd 00 3c stw r31,60(r29) ffc08e38: 3c 60 00 00 lis r3,0 */ _Rate_monotonic_Update_statistics( the_period ); _ISR_Enable( level ); the_period->state = RATE_MONOTONIC_ACTIVE; ffc08e3c: 90 1d 00 38 stw r0,56(r29) ffc08e40: 38 63 2e 48 addi r3,r3,11848 ffc08e44: 38 9d 00 10 addi r4,r29,16 Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; ffc08e48: 93 fd 00 1c stw r31,28(r29) the_period->next_length = length; _Watchdog_Insert_ticks( &the_period->Timer, length ); _Thread_Enable_dispatch(); return RTEMS_TIMEOUT; ffc08e4c: 3b c0 00 06 li r30,6 _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); ffc08e50: 48 00 43 bd bl ffc0d20c <_Watchdog_Insert> the_period->state = RATE_MONOTONIC_ACTIVE; the_period->next_length = length; _Watchdog_Insert_ticks( &the_period->Timer, length ); _Thread_Enable_dispatch(); ffc08e54: 48 00 32 91 bl ffc0c0e4 <_Thread_Enable_dispatch> return RTEMS_TIMEOUT; ffc08e58: 48 00 00 08 b ffc08e60 #endif case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; ffc08e5c: 3b c0 00 04 li r30,4 } ffc08e60: 39 61 00 28 addi r11,r1,40 ffc08e64: 7f c3 f3 78 mr r3,r30 ffc08e68: 4b ff 83 58 b ffc011c0 <_restgpr_28_x> =============================================================================== ffc08e6c : */ void rtems_rate_monotonic_report_statistics_with_plugin( void *context, rtems_printk_plugin_t print ) { ffc08e6c: 94 21 ff 58 stwu r1,-168(r1) ffc08e70: 7c 08 02 a6 mflr r0 ffc08e74: 90 01 00 ac stw r0,172(r1) rtems_id id; rtems_rate_monotonic_period_statistics the_stats; rtems_rate_monotonic_period_status the_status; char name[5]; if ( !print ) ffc08e78: 7c 80 23 79 mr. r0,r4 */ void rtems_rate_monotonic_report_statistics_with_plugin( void *context, rtems_printk_plugin_t print ) { ffc08e7c: be 41 00 70 stmw r18,112(r1) ffc08e80: 7c 7f 1b 78 mr r31,r3 rtems_id id; rtems_rate_monotonic_period_statistics the_stats; rtems_rate_monotonic_period_status the_status; char name[5]; if ( !print ) ffc08e84: 90 01 00 68 stw r0,104(r1) ffc08e88: 41 82 01 fc beq- ffc09084 <== NEVER TAKEN return; (*print)( context, "Period information by period\n" ); ffc08e8c: 3c 80 ff c2 lis r4,-62 ffc08e90: 7c 09 03 a6 mtctr r0 ffc08e94: 38 84 f2 98 addi r4,r4,-3432 /* * 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 ; ffc08e98: 3e 60 00 00 lis r19,0 rtems_object_get_name( the_status.owner, sizeof(name), name ); /* * Print part of report line that is not dependent on granularity */ (*print)( context, ffc08e9c: 3e c0 ff c2 lis r22,-62 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 ); (*print)( context, ffc08ea0: 3f 00 ff c2 lis r24,-62 char name[5]; if ( !print ) return; (*print)( context, "Period information by period\n" ); ffc08ea4: 4c c6 31 82 crclr 4*cr1+eq ffc08ea8: 4e 80 04 21 bctrl #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ (*print)( context, "--- CPU times are in seconds ---\n" ); ffc08eac: 80 01 00 68 lwz r0,104(r1) ffc08eb0: 3c 80 ff c2 lis r4,-62 ffc08eb4: 7c 09 03 a6 mtctr r0 ffc08eb8: 38 84 f2 b6 addi r4,r4,-3402 ffc08ebc: 7f e3 fb 78 mr r3,r31 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); (*print)( context, ffc08ec0: 3f 40 ff c2 lis r26,-62 /* * If the count is zero, don't print statistics */ if (the_stats.count == 0) { (*print)( context, "\n" ); ffc08ec4: 3e 40 ff c2 lis r18,-62 * 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++ ) { status = rtems_rate_monotonic_get_statistics( id, &the_stats ); ffc08ec8: 3a 81 00 30 addi r20,r1,48 if ( !print ) return; (*print)( context, "Period information by period\n" ); #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ (*print)( context, "--- CPU times are in seconds ---\n" ); ffc08ecc: 4c c6 31 82 crclr 4*cr1+eq ffc08ed0: 4e 80 04 21 bctrl (*print)( context, "--- Wall times are in seconds ---\n" ); ffc08ed4: 80 01 00 68 lwz r0,104(r1) ffc08ed8: 3c 80 ff c2 lis r4,-62 ffc08edc: 7c 09 03 a6 mtctr r0 ffc08ee0: 38 84 f2 d8 addi r4,r4,-3368 ffc08ee4: 7f e3 fb 78 mr r3,r31 #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 ); ffc08ee8: 3a a1 00 18 addi r21,r1,24 #endif rtems_object_get_name( the_status.owner, sizeof(name), name ); ffc08eec: 3b 61 00 08 addi r27,r1,8 /* * Print part of report line that is not dependent on granularity */ (*print)( context, ffc08ef0: 3a d6 f3 92 addi r22,r22,-3182 return; (*print)( context, "Period information by period\n" ); #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ (*print)( context, "--- CPU times are in seconds ---\n" ); (*print)( context, "--- Wall times are in seconds ---\n" ); ffc08ef4: 4c c6 31 82 crclr 4*cr1+eq ffc08ef8: 4e 80 04 21 bctrl Be sure to test the various cases. (*print)( context,"\ 1234567890123456789012345678901234567890123456789012345678901234567890123456789\ \n"); */ (*print)( context, " ID OWNER COUNT MISSED " ffc08efc: 80 01 00 68 lwz r0,104(r1) ffc08f00: 3c 80 ff c2 lis r4,-62 ffc08f04: 7c 09 03 a6 mtctr r0 ffc08f08: 38 84 f2 fb addi r4,r4,-3333 ffc08f0c: 7f e3 fb 78 mr r3,r31 { #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ 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; ffc08f10: 3a e1 00 48 addi r23,r1,72 _Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average ); ffc08f14: 3b 81 00 10 addi r28,r1,16 (*print)( context, ffc08f18: 3b 18 f3 a9 addi r24,r24,-3159 Be sure to test the various cases. (*print)( context,"\ 1234567890123456789012345678901234567890123456789012345678901234567890123456789\ \n"); */ (*print)( context, " ID OWNER COUNT MISSED " ffc08f1c: 4c c6 31 82 crclr 4*cr1+eq ffc08f20: 4e 80 04 21 bctrl #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ " " #endif " WALL TIME\n" ); (*print)( context, " " ffc08f24: 80 01 00 68 lwz r0,104(r1) ffc08f28: 3c 80 ff c2 lis r4,-62 ffc08f2c: 7f e3 fb 78 mr r3,r31 ffc08f30: 7c 09 03 a6 mtctr r0 ffc08f34: 38 84 f3 46 addi r4,r4,-3258 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 ); (*print)( context, ffc08f38: 3b c0 03 e8 li r30,1000 { #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; ffc08f3c: 3b 21 00 60 addi r25,r1,96 _Timespec_Divide_by_integer(total_wall, the_stats.count, &wall_average); (*print)( context, ffc08f40: 3b 5a f3 c8 addi r26,r26,-3128 #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ " " #endif " WALL TIME\n" ); (*print)( context, " " ffc08f44: 4c c6 31 82 crclr 4*cr1+eq ffc08f48: 4e 80 04 21 bctrl /* * 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 ; ffc08f4c: 39 33 2c 78 addi r9,r19,11384 ffc08f50: 83 a9 00 08 lwz r29,8(r9) /* * If the count is zero, don't print statistics */ if (the_stats.count == 0) { (*print)( context, "\n" ); ffc08f54: 3a 52 f2 36 addi r18,r18,-3530 /* * 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 ; ffc08f58: 48 00 01 1c b ffc09074 id <= _Rate_monotonic_Information.maximum_id ; id++ ) { status = rtems_rate_monotonic_get_statistics( id, &the_stats ); ffc08f5c: 7f a3 eb 78 mr r3,r29 ffc08f60: 7e 84 a3 78 mr r4,r20 ffc08f64: 48 00 68 f9 bl ffc0f85c if ( status != RTEMS_SUCCESSFUL ) ffc08f68: 2f 83 00 00 cmpwi cr7,r3,0 ffc08f6c: 40 be 01 04 bne+ cr7,ffc09070 #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 ); ffc08f70: 7e a4 ab 78 mr r4,r21 ffc08f74: 7f a3 eb 78 mr r3,r29 ffc08f78: 48 00 69 b1 bl ffc0f928 #endif rtems_object_get_name( the_status.owner, sizeof(name), name ); ffc08f7c: 80 61 00 18 lwz r3,24(r1) ffc08f80: 38 80 00 05 li r4,5 ffc08f84: 7f 65 db 78 mr r5,r27 ffc08f88: 48 00 02 a1 bl ffc09228 /* * Print part of report line that is not dependent on granularity */ (*print)( context, ffc08f8c: 80 01 00 68 lwz r0,104(r1) ffc08f90: 7e c4 b3 78 mr r4,r22 ffc08f94: 80 e1 00 30 lwz r7,48(r1) ffc08f98: 7f e3 fb 78 mr r3,r31 ffc08f9c: 81 01 00 34 lwz r8,52(r1) ffc08fa0: 7f a5 eb 78 mr r5,r29 ffc08fa4: 7c 09 03 a6 mtctr r0 ffc08fa8: 7f 66 db 78 mr r6,r27 ffc08fac: 4c c6 31 82 crclr 4*cr1+eq ffc08fb0: 4e 80 04 21 bctrl ); /* * If the count is zero, don't print statistics */ if (the_stats.count == 0) { ffc08fb4: 80 81 00 30 lwz r4,48(r1) ffc08fb8: 2f 84 00 00 cmpwi cr7,r4,0 ffc08fbc: 40 9e 00 20 bne- cr7,ffc08fdc (*print)( context, "\n" ); ffc08fc0: 80 01 00 68 lwz r0,104(r1) ffc08fc4: 7f e3 fb 78 mr r3,r31 ffc08fc8: 7e 44 93 78 mr r4,r18 ffc08fcc: 7c 09 03 a6 mtctr r0 ffc08fd0: 4c c6 31 82 crclr 4*cr1+eq ffc08fd4: 4e 80 04 21 bctrl continue; ffc08fd8: 48 00 00 98 b ffc09070 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 ); ffc08fdc: 7e e3 bb 78 mr r3,r23 ffc08fe0: 7f 85 e3 78 mr r5,r28 ffc08fe4: 48 00 3d a1 bl ffc0cd84 <_Timespec_Divide_by_integer> (*print)( context, ffc08fe8: 80 01 00 68 lwz r0,104(r1) ffc08fec: 80 c1 00 3c lwz r6,60(r1) ffc08ff0: 7f 04 c3 78 mr r4,r24 ffc08ff4: 81 01 00 44 lwz r8,68(r1) ffc08ff8: 7c 09 03 a6 mtctr r0 ffc08ffc: 81 41 00 14 lwz r10,20(r1) ffc09000: 7c c6 f3 d6 divw r6,r6,r30 ffc09004: 80 e1 00 40 lwz r7,64(r1) ffc09008: 81 21 00 10 lwz r9,16(r1) ffc0900c: 80 a1 00 38 lwz r5,56(r1) ffc09010: 7d 08 f3 d6 divw r8,r8,r30 ffc09014: 7d 4a f3 d6 divw r10,r10,r30 ffc09018: 7f e3 fb 78 mr r3,r31 ffc0901c: 4c c6 31 82 crclr 4*cr1+eq ffc09020: 4e 80 04 21 bctrl 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); ffc09024: 80 81 00 30 lwz r4,48(r1) ffc09028: 7f 23 cb 78 mr r3,r25 ffc0902c: 7f 85 e3 78 mr r5,r28 ffc09030: 48 00 3d 55 bl ffc0cd84 <_Timespec_Divide_by_integer> (*print)( context, ffc09034: 80 c1 00 54 lwz r6,84(r1) ffc09038: 81 01 00 5c lwz r8,92(r1) ffc0903c: 7f e3 fb 78 mr r3,r31 ffc09040: 81 41 00 14 lwz r10,20(r1) ffc09044: 7f 44 d3 78 mr r4,r26 ffc09048: 80 01 00 68 lwz r0,104(r1) ffc0904c: 7c c6 f3 d6 divw r6,r6,r30 ffc09050: 80 a1 00 50 lwz r5,80(r1) ffc09054: 80 e1 00 58 lwz r7,88(r1) ffc09058: 7c 09 03 a6 mtctr r0 ffc0905c: 81 21 00 10 lwz r9,16(r1) ffc09060: 7d 08 f3 d6 divw r8,r8,r30 ffc09064: 7d 4a f3 d6 divw r10,r10,r30 ffc09068: 4c c6 31 82 crclr 4*cr1+eq ffc0906c: 4e 80 04 21 bctrl * 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++ ) { ffc09070: 3b bd 00 01 addi r29,r29,1 /* * 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 ; ffc09074: 39 33 2c 78 addi r9,r19,11384 /* * 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 ; ffc09078: 80 09 00 0c lwz r0,12(r9) ffc0907c: 7f 9d 00 40 cmplw cr7,r29,r0 ffc09080: 40 9d fe dc ble+ cr7,ffc08f5c the_stats.min_wall_time, the_stats.max_wall_time, ival_wall, fval_wall ); #endif } } } ffc09084: 39 61 00 a8 addi r11,r1,168 ffc09088: 4b ff 81 10 b ffc01198 <_restgpr_18_x> =============================================================================== ffc17d80 : rtems_status_code rtems_signal_send( rtems_id id, rtems_signal_set signal_set ) { ffc17d80: 7c 2b 0b 78 mr r11,r1 ffc17d84: 94 21 ff e0 stwu r1,-32(r1) ffc17d88: 7c 08 02 a6 mflr r0 ffc17d8c: 48 01 a1 bd bl ffc31f48 <_savegpr_31> register Thread_Control *the_thread; Objects_Locations location; RTEMS_API_Control *api; ASR_Information *asr; if ( !signal_set ) ffc17d90: 7c 9f 23 79 mr. r31,r4 rtems_status_code rtems_signal_send( rtems_id id, rtems_signal_set signal_set ) { ffc17d94: 90 01 00 24 stw r0,36(r1) Objects_Locations location; RTEMS_API_Control *api; ASR_Information *asr; if ( !signal_set ) return RTEMS_INVALID_NUMBER; ffc17d98: 38 00 00 0a li r0,10 register Thread_Control *the_thread; Objects_Locations location; RTEMS_API_Control *api; ASR_Information *asr; if ( !signal_set ) ffc17d9c: 41 82 00 bc beq- ffc17e58 return RTEMS_INVALID_NUMBER; the_thread = _Thread_Get( id, &location ); ffc17da0: 38 81 00 08 addi r4,r1,8 ffc17da4: 48 00 4b 69 bl ffc1c90c <_Thread_Get> switch ( location ) { ffc17da8: 80 01 00 08 lwz r0,8(r1) ffc17dac: 2f 80 00 00 cmpwi cr7,r0,0 ffc17db0: 40 9e 00 a4 bne- cr7,ffc17e54 case OBJECTS_LOCAL: api = the_thread->API_Extensions[ THREAD_API_RTEMS ]; ffc17db4: 81 23 01 30 lwz r9,304(r3) asr = &api->Signal; if ( ! _ASR_Is_null_handler( asr->handler ) ) { ffc17db8: 80 09 00 0c lwz r0,12(r9) ffc17dbc: 2f 80 00 00 cmpwi cr7,r0,0 ffc17dc0: 41 9e 00 88 beq- cr7,ffc17e48 if ( asr->is_enabled ) { ffc17dc4: 88 09 00 08 lbz r0,8(r9) ffc17dc8: 2f 80 00 00 cmpwi cr7,r0,0 ffc17dcc: 41 9e 00 50 beq- cr7,ffc17e1c static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc17dd0: 7c 00 00 a6 mfmsr r0 ffc17dd4: 7d 70 42 a6 mfsprg r11,0 ffc17dd8: 7c 0b 58 78 andc r11,r0,r11 ffc17ddc: 7d 60 01 24 mtmsr r11 ) { ISR_Level _level; _ISR_Disable( _level ); *signal_set |= signals; ffc17de0: 81 69 00 14 lwz r11,20(r9) ffc17de4: 7d 7f fb 78 or r31,r11,r31 ffc17de8: 93 e9 00 14 stw r31,20(r9) return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc17dec: 7c 00 01 24 mtmsr r0 _ASR_Post_signals( signal_set, &asr->signals_posted ); if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) ) ffc17df0: 3d 20 00 00 lis r9,0 ffc17df4: 39 29 75 44 addi r9,r9,30020 ffc17df8: 80 09 00 08 lwz r0,8(r9) ffc17dfc: 2f 80 00 00 cmpwi cr7,r0,0 ffc17e00: 41 9e 00 3c beq- cr7,ffc17e3c ffc17e04: 80 09 00 0c lwz r0,12(r9) ffc17e08: 7f 83 00 00 cmpw cr7,r3,r0 ffc17e0c: 40 be 00 30 bne+ cr7,ffc17e3c <== NEVER TAKEN _Thread_Dispatch_necessary = true; ffc17e10: 38 00 00 01 li r0,1 ffc17e14: 98 09 00 18 stb r0,24(r9) ffc17e18: 48 00 00 24 b ffc17e3c static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc17e1c: 7c 00 00 a6 mfmsr r0 ffc17e20: 7d 70 42 a6 mfsprg r11,0 ffc17e24: 7c 0b 58 78 andc r11,r0,r11 ffc17e28: 7d 60 01 24 mtmsr r11 ffc17e2c: 81 69 00 18 lwz r11,24(r9) ffc17e30: 7d 7f fb 78 or r31,r11,r31 ffc17e34: 93 e9 00 18 stw r31,24(r9) return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc17e38: 7c 00 01 24 mtmsr r0 } else { _ASR_Post_signals( signal_set, &asr->signals_pending ); } _Thread_Enable_dispatch(); ffc17e3c: 48 00 4a b1 bl ffc1c8ec <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; ffc17e40: 38 00 00 00 li r0,0 ffc17e44: 48 00 00 14 b ffc17e58 } _Thread_Enable_dispatch(); ffc17e48: 48 00 4a a5 bl ffc1c8ec <_Thread_Enable_dispatch> return RTEMS_NOT_DEFINED; ffc17e4c: 38 00 00 0b li r0,11 ffc17e50: 48 00 00 08 b ffc17e58 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; ffc17e54: 38 00 00 04 li r0,4 } ffc17e58: 39 61 00 20 addi r11,r1,32 ffc17e5c: 7c 03 03 78 mr r3,r0 ffc17e60: 4b ff 65 44 b ffc0e3a4 <_restgpr_31_x> =============================================================================== ffc04260 : * rtems_stack_checker_Begin_extension */ void rtems_stack_checker_begin_extension( Thread_Control *the_thread ) { ffc04260: 7c 08 02 a6 mflr r0 ffc04264: 94 21 ff f8 stwu r1,-8(r1) ffc04268: 90 01 00 0c stw r0,12(r1) Stack_check_Control *the_pattern; if ( the_thread->Object.id == 0 ) /* skip system tasks */ ffc0426c: 80 03 00 08 lwz r0,8(r3) ffc04270: 2f 80 00 00 cmpwi cr7,r0,0 ffc04274: 41 9e 00 1c beq- cr7,ffc04290 <== NEVER TAKEN return; the_pattern = Stack_check_Get_pattern_area(&the_thread->Start.Initial_stack); *the_pattern = Stack_check_Pattern; ffc04278: 80 63 00 bc lwz r3,188(r3) ffc0427c: 3c 80 00 00 lis r4,0 ffc04280: 38 84 2b 68 addi r4,r4,11112 ffc04284: 38 63 00 08 addi r3,r3,8 ffc04288: 38 a0 00 80 li r5,128 ffc0428c: 48 00 fa cd bl ffc13d58 } ffc04290: 80 01 00 0c lwz r0,12(r1) ffc04294: 38 21 00 08 addi r1,r1,8 ffc04298: 7c 08 03 a6 mtlr r0 ffc0429c: 4e 80 00 20 blr =============================================================================== ffc04220 : */ bool rtems_stack_checker_create_extension( Thread_Control *running __attribute__((unused)), Thread_Control *the_thread ) { ffc04220: 7c 2b 0b 78 mr r11,r1 ffc04224: 94 21 ff f0 stwu r1,-16(r1) ffc04228: 7c 08 02 a6 mflr r0 ffc0422c: 4b ff c8 c1 bl ffc00aec <_savegpr_31> ffc04230: 7c 9f 23 78 mr r31,r4 ffc04234: 90 01 00 14 stw r0,20(r1) Stack_check_Initialize(); ffc04238: 4b ff ff 99 bl ffc041d0 if (the_thread) ffc0423c: 2f 9f 00 00 cmpwi cr7,r31,0 ffc04240: 41 9e 00 14 beq- cr7,ffc04254 <== NEVER TAKEN Stack_check_Dope_stack(&the_thread->Start.Initial_stack); ffc04244: 80 7f 00 bc lwz r3,188(r31) ffc04248: 38 80 00 a5 li r4,165 ffc0424c: 80 bf 00 b8 lwz r5,184(r31) ffc04250: 48 00 fb e9 bl ffc13e38 return true; } ffc04254: 39 61 00 10 addi r11,r1,16 ffc04258: 38 60 00 01 li r3,1 ffc0425c: 4b ff c8 dc b ffc00b38 <_restgpr_31_x> =============================================================================== ffc043ec : /* * Check if blown */ bool rtems_stack_checker_is_blown( void ) { ffc043ec: 94 21 ff f0 stwu r1,-16(r1) ffc043f0: 7c 08 02 a6 mflr r0 Stack_Control *the_stack = &_Thread_Executing->Start.Initial_stack; ffc043f4: 3d 20 00 00 lis r9,0 /* * Check if blown */ bool rtems_stack_checker_is_blown( void ) { ffc043f8: 90 01 00 14 stw r0,20(r1) Stack_Control *the_stack = &_Thread_Executing->Start.Initial_stack; ffc043fc: 81 29 32 50 lwz r9,12880(r9) /* * Check if blown */ bool rtems_stack_checker_is_blown( void ) { ffc04400: bf c1 00 08 stmw r30,8(r1) ffc04404: 7c 3f 0b 78 mr r31,r1 { #if defined(__GNUC__) void *sp = __builtin_frame_address(0); if ( sp < the_stack->area ) { return false; ffc04408: 3b c0 00 00 li r30,0 ) { #if defined(__GNUC__) void *sp = __builtin_frame_address(0); if ( sp < the_stack->area ) { ffc0440c: 80 69 00 bc lwz r3,188(r9) ffc04410: 7f 9f 18 40 cmplw cr7,r31,r3 ffc04414: 41 9c 00 18 blt- cr7,ffc0442c <== NEVER TAKEN return false; } if ( sp > (the_stack->area + the_stack->size) ) { ffc04418: 83 c9 00 b8 lwz r30,184(r9) ffc0441c: 7f c3 f2 14 add r30,r3,r30 } /* * Check if blown */ bool rtems_stack_checker_is_blown( void ) ffc04420: 7f df f0 10 subfc r30,r31,r30 ffc04424: 3b c0 00 00 li r30,0 ffc04428: 7f de f1 14 adde r30,r30,r30 /* * The stack checker must be initialized before the pattern is there * to check. */ if ( Stack_check_Initialized ) { ffc0442c: 3d 20 00 00 lis r9,0 ffc04430: 80 09 28 fc lwz r0,10492(r9) */ bool rtems_stack_checker_is_blown( void ) { Stack_Control *the_stack = &_Thread_Executing->Start.Initial_stack; bool sp_ok; bool pattern_ok = true; ffc04434: 38 80 00 01 li r4,1 /* * The stack checker must be initialized before the pattern is there * to check. */ if ( Stack_check_Initialized ) { ffc04438: 2f 80 00 00 cmpwi cr7,r0,0 ffc0443c: 41 9e 00 20 beq- cr7,ffc0445c <== NEVER TAKEN pattern_ok = (!memcmp( ffc04440: 3c 80 00 00 lis r4,0 ffc04444: 38 84 2b 68 addi r4,r4,11112 ffc04448: 38 63 00 08 addi r3,r3,8 ffc0444c: 38 a0 00 80 li r5,128 ffc04450: 48 00 f8 71 bl ffc13cc0 ffc04454: 7c 64 00 34 cntlzw r4,r3 ffc04458: 54 84 d9 7e rlwinm r4,r4,27,5,31 /* * Let's report as much as we can. */ if ( !sp_ok || !pattern_ok ) { ffc0445c: 2f 9e 00 00 cmpwi cr7,r30,0 ffc04460: 41 9e 00 0c beq- cr7,ffc0446c <== NEVER TAKEN ffc04464: 2f 84 00 00 cmpwi cr7,r4,0 ffc04468: 40 be 00 10 bne+ cr7,ffc04478 <== ALWAYS TAKEN Stack_check_report_blown_task( _Thread_Executing, pattern_ok ); ffc0446c: 3d 20 00 00 lis r9,0 <== NOT EXECUTED ffc04470: 80 69 32 50 lwz r3,12880(r9) <== NOT EXECUTED ffc04474: 4b ff fe 2d bl ffc042a0 <== NOT EXECUTED /* * The Stack Pointer and the Pattern Area are OK so return false. */ return false; } ffc04478: 39 7f 00 10 addi r11,r31,16 ffc0447c: 38 60 00 00 li r3,0 ffc04480: 4b ff c6 b4 b ffc00b34 <_restgpr_30_x> =============================================================================== ffc04484 : void rtems_stack_checker_report_usage_with_plugin( void *context, rtems_printk_plugin_t print ) { ffc04484: 94 21 ff e8 stwu r1,-24(r1) ffc04488: 7c 08 02 a6 mflr r0 ffc0448c: bf 81 00 08 stmw r28,8(r1) if ( !print ) ffc04490: 7c 9e 23 79 mr. r30,r4 void rtems_stack_checker_report_usage_with_plugin( void *context, rtems_printk_plugin_t print ) { ffc04494: 7c 7c 1b 78 mr r28,r3 ffc04498: 90 01 00 1c stw r0,28(r1) if ( !print ) ffc0449c: 41 82 00 58 beq- ffc044f4 <== NEVER TAKEN return; print_context = context; ffc044a0: 3f e0 00 00 lis r31,0 print_handler = print; (*print)( context, "Stack usage by thread\n"); ffc044a4: 7f c9 03 a6 mtctr r30 ) { if ( !print ) return; print_context = context; ffc044a8: 3b bf 28 f4 addi r29,r31,10484 print_handler = print; ffc044ac: 93 df 28 f4 stw r30,10484(r31) (*print)( context, "Stack usage by thread\n"); ffc044b0: 3c 80 ff c2 lis r4,-62 ffc044b4: 38 84 9e f6 addi r4,r4,-24842 ) { if ( !print ) return; print_context = context; ffc044b8: 90 7d 00 04 stw r3,4(r29) print_handler = print; (*print)( context, "Stack usage by thread\n"); ffc044bc: 4c c6 31 82 crclr 4*cr1+eq ffc044c0: 4e 80 04 21 bctrl (*print)( context, ffc044c4: 3c 80 ff c2 lis r4,-62 ffc044c8: 38 84 9f 0d addi r4,r4,-24819 ffc044cc: 7f c9 03 a6 mtctr r30 ffc044d0: 7f 83 e3 78 mr r3,r28 ffc044d4: 4c c6 31 82 crclr 4*cr1+eq ffc044d8: 4e 80 04 21 bctrl " 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 ); ffc044dc: 3c 60 ff c0 lis r3,-64 ffc044e0: 38 63 40 90 addi r3,r3,16528 ffc044e4: 48 00 77 f1 bl ffc0bcd4 #if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) /* dump interrupt stack info if any */ Stack_check_Dump_threads_usage((Thread_Control *) -1); #endif print_context = NULL; ffc044e8: 38 00 00 00 li r0,0 ffc044ec: 90 1d 00 04 stw r0,4(r29) print_handler = NULL; ffc044f0: 90 1f 28 f4 stw r0,10484(r31) } ffc044f4: 39 61 00 18 addi r11,r1,24 ffc044f8: 4b ff c6 34 b ffc00b2c <_restgpr_28_x> =============================================================================== ffc04374 : */ void rtems_stack_checker_switch_extension( Thread_Control *running __attribute__((unused)), Thread_Control *heir __attribute__((unused)) ) { ffc04374: 94 21 ff e8 stwu r1,-24(r1) ffc04378: 7c 08 02 a6 mflr r0 ffc0437c: 90 01 00 1c stw r0,28(r1) 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); ffc04380: 81 23 00 bc lwz r9,188(r3) */ void rtems_stack_checker_switch_extension( Thread_Control *running __attribute__((unused)), Thread_Control *heir __attribute__((unused)) ) { ffc04384: bf a1 00 0c stmw r29,12(r1) ffc04388: 7c 3f 0b 78 mr r31,r1 ) { #if defined(__GNUC__) void *sp = __builtin_frame_address(0); if ( sp < the_stack->area ) { ffc0438c: 7f 9f 48 40 cmplw cr7,r31,r9 */ void rtems_stack_checker_switch_extension( Thread_Control *running __attribute__((unused)), Thread_Control *heir __attribute__((unused)) ) { ffc04390: 7c 7e 1b 78 mr r30,r3 { #if defined(__GNUC__) void *sp = __builtin_frame_address(0); if ( sp < the_stack->area ) { return false; ffc04394: 3b a0 00 00 li r29,0 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); ffc04398: 38 69 00 08 addi r3,r9,8 ) { #if defined(__GNUC__) void *sp = __builtin_frame_address(0); if ( sp < the_stack->area ) { ffc0439c: 41 9c 00 18 blt- cr7,ffc043b4 <== NEVER TAKEN return false; } if ( sp > (the_stack->area + the_stack->size) ) { ffc043a0: 83 be 00 b8 lwz r29,184(r30) ffc043a4: 7f a9 ea 14 add r29,r9,r29 } /* * rtems_stack_checker_switch_extension */ void rtems_stack_checker_switch_extension( ffc043a8: 7f bf e8 10 subfc r29,r31,r29 ffc043ac: 3b a0 00 00 li r29,0 ffc043b0: 7f bd e9 14 adde r29,r29,r29 /* * 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, ffc043b4: 3c 80 00 00 lis r4,0 ffc043b8: 38 84 2b 68 addi r4,r4,11112 ffc043bc: 38 a0 00 80 li r5,128 ffc043c0: 48 00 f9 01 bl ffc13cc0 (void *) Stack_check_Pattern.pattern, PATTERN_SIZE_BYTES)); if ( !sp_ok || !pattern_ok ) { ffc043c4: 2f 9d 00 00 cmpwi cr7,r29,0 /* * 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, ffc043c8: 7c 64 00 34 cntlzw r4,r3 ffc043cc: 54 84 d9 7e rlwinm r4,r4,27,5,31 (void *) Stack_check_Pattern.pattern, PATTERN_SIZE_BYTES)); if ( !sp_ok || !pattern_ok ) { ffc043d0: 41 9e 00 0c beq- cr7,ffc043dc <== NEVER TAKEN ffc043d4: 2f 84 00 00 cmpwi cr7,r4,0 ffc043d8: 40 be 00 0c bne+ cr7,ffc043e4 Stack_check_report_blown_task( running, pattern_ok ); ffc043dc: 7f c3 f3 78 mr r3,r30 ffc043e0: 4b ff fe c1 bl ffc042a0 } } ffc043e4: 39 7f 00 18 addi r11,r31,24 ffc043e8: 4b ff c7 48 b ffc00b30 <_restgpr_29_x> =============================================================================== ffc0dda4 : rtems_status_code rtems_string_to_double ( const char *s, double *n, char **endptr ) { ffc0dda4: 94 21 ff d0 stwu r1,-48(r1) ffc0dda8: 7c 08 02 a6 mflr r0 ffc0ddac: bf a1 00 1c stmw r29,28(r1) double result; char *end; if ( !n ) ffc0ddb0: 7c 9e 23 79 mr. r30,r4 rtems_status_code rtems_string_to_double ( const char *s, double *n, char **endptr ) { ffc0ddb4: 7c 7f 1b 78 mr r31,r3 ffc0ddb8: 90 01 00 34 stw r0,52(r1) ffc0ddbc: 7c bd 2b 78 mr r29,r5 double result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; ffc0ddc0: 38 60 00 09 li r3,9 rtems_status_code rtems_string_to_double ( const char *s, double *n, char **endptr ) { ffc0ddc4: db e1 00 28 stfd f31,40(r1) double result; char *end; if ( !n ) ffc0ddc8: 41 82 00 98 beq- ffc0de60 return RTEMS_INVALID_ADDRESS; errno = 0; ffc0ddcc: 48 00 34 c1 bl ffc1128c <__errno> *n = 0; ffc0ddd0: 3d 20 ff c2 lis r9,-62 ffc0ddd4: c8 09 f2 28 lfd f0,-3544(r9) char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; errno = 0; ffc0ddd8: 38 00 00 00 li r0,0 ffc0dddc: 90 03 00 00 stw r0,0(r3) *n = 0; result = strtod( s, &end ); ffc0dde0: 38 81 00 08 addi r4,r1,8 ffc0dde4: 7f e3 fb 78 mr r3,r31 if ( !n ) return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; ffc0dde8: d8 1e 00 00 stfd f0,0(r30) result = strtod( s, &end ); ffc0ddec: 48 00 61 f1 bl ffc13fdc if ( endptr ) ffc0ddf0: 2f 9d 00 00 cmpwi cr7,r29,0 return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; result = strtod( s, &end ); ffc0ddf4: ff e0 08 90 fmr f31,f1 if ( endptr ) ffc0ddf8: 41 9e 00 0c beq- cr7,ffc0de04 *endptr = end; ffc0ddfc: 80 01 00 08 lwz r0,8(r1) ffc0de00: 90 1d 00 00 stw r0,0(r29) if ( end == s ) ffc0de04: 80 01 00 08 lwz r0,8(r1) return RTEMS_NOT_DEFINED; ffc0de08: 38 60 00 0b li r3,11 result = strtod( s, &end ); if ( endptr ) *endptr = end; if ( end == s ) ffc0de0c: 7f 80 f8 00 cmpw cr7,r0,r31 ffc0de10: 41 9e 00 50 beq- cr7,ffc0de60 return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && ffc0de14: 48 00 34 79 bl ffc1128c <__errno> ffc0de18: 80 03 00 00 lwz r0,0(r3) ffc0de1c: 2f 80 00 22 cmpwi cr7,r0,34 ffc0de20: 40 be 00 38 bne+ cr7,ffc0de58 ffc0de24: 3d 20 ff c2 lis r9,-62 ffc0de28: c8 09 f2 28 lfd f0,-3544(r9) (( result == 0 ) || ( result == HUGE_VAL ) || ( result == -HUGE_VAL ))) return RTEMS_INVALID_NUMBER; ffc0de2c: 38 60 00 0a li r3,10 *endptr = end; if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && ffc0de30: ff 9f 00 00 fcmpu cr7,f31,f0 ffc0de34: 41 9e 00 2c beq- cr7,ffc0de60 <== NEVER TAKEN (( result == 0 ) || ( result == HUGE_VAL ) || ( result == -HUGE_VAL ))) ffc0de38: 3d 20 ff c2 lis r9,-62 ffc0de3c: c8 09 16 a8 lfd f0,5800(r9) ffc0de40: ff 9f 00 00 fcmpu cr7,f31,f0 ffc0de44: 41 9d 00 1c bgt- cr7,ffc0de60 <== ALWAYS TAKEN ffc0de48: 3d 20 ff c2 lis r9,-62 <== NOT EXECUTED ffc0de4c: c8 09 16 b0 lfd f0,5808(r9) <== NOT EXECUTED ffc0de50: ff 9f 00 00 fcmpu cr7,f31,f0 <== NOT EXECUTED ffc0de54: 41 9c 00 0c blt- cr7,ffc0de60 <== NOT EXECUTED return RTEMS_INVALID_NUMBER; *n = result; ffc0de58: db fe 00 00 stfd f31,0(r30) return RTEMS_SUCCESSFUL; ffc0de5c: 38 60 00 00 li r3,0 } ffc0de60: 80 01 00 34 lwz r0,52(r1) ffc0de64: bb a1 00 1c lmw r29,28(r1) ffc0de68: 7c 08 03 a6 mtlr r0 ffc0de6c: cb e1 00 28 lfd f31,40(r1) ffc0de70: 38 21 00 30 addi r1,r1,48 ffc0de74: 4e 80 00 20 blr =============================================================================== ffc0de78 : rtems_status_code rtems_string_to_float ( const char *s, float *n, char **endptr ) { ffc0de78: 94 21 ff d0 stwu r1,-48(r1) ffc0de7c: 7c 08 02 a6 mflr r0 ffc0de80: bf a1 00 1c stmw r29,28(r1) float result; char *end; if ( !n ) ffc0de84: 7c 9e 23 79 mr. r30,r4 rtems_status_code rtems_string_to_float ( const char *s, float *n, char **endptr ) { ffc0de88: 7c 7f 1b 78 mr r31,r3 ffc0de8c: 90 01 00 34 stw r0,52(r1) ffc0de90: 7c bd 2b 78 mr r29,r5 float result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; ffc0de94: 38 60 00 09 li r3,9 rtems_status_code rtems_string_to_float ( const char *s, float *n, char **endptr ) { ffc0de98: db e1 00 28 stfd f31,40(r1) float result; char *end; if ( !n ) ffc0de9c: 41 82 00 94 beq- ffc0df30 return RTEMS_INVALID_ADDRESS; errno = 0; ffc0dea0: 48 00 33 ed bl ffc1128c <__errno> ffc0dea4: 38 00 00 00 li r0,0 ffc0dea8: 90 03 00 00 stw r0,0(r3) *n = 0; ffc0deac: 38 00 00 00 li r0,0 result = strtof( s, &end ); ffc0deb0: 7f e3 fb 78 mr r3,r31 if ( !n ) return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; ffc0deb4: 90 1e 00 00 stw r0,0(r30) result = strtof( s, &end ); ffc0deb8: 38 81 00 08 addi r4,r1,8 ffc0debc: 48 00 61 39 bl ffc13ff4 if ( endptr ) ffc0dec0: 2f 9d 00 00 cmpwi cr7,r29,0 return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; result = strtof( s, &end ); ffc0dec4: ff e0 08 90 fmr f31,f1 if ( endptr ) ffc0dec8: 41 9e 00 0c beq- cr7,ffc0ded4 *endptr = end; ffc0decc: 80 01 00 08 lwz r0,8(r1) ffc0ded0: 90 1d 00 00 stw r0,0(r29) if ( end == s ) ffc0ded4: 80 01 00 08 lwz r0,8(r1) return RTEMS_NOT_DEFINED; ffc0ded8: 38 60 00 0b li r3,11 result = strtof( s, &end ); if ( endptr ) *endptr = end; if ( end == s ) ffc0dedc: 7f 80 f8 00 cmpw cr7,r0,r31 ffc0dee0: 41 9e 00 50 beq- cr7,ffc0df30 return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && ffc0dee4: 48 00 33 a9 bl ffc1128c <__errno> ffc0dee8: 80 03 00 00 lwz r0,0(r3) ffc0deec: 2f 80 00 22 cmpwi cr7,r0,34 ffc0def0: 40 be 00 38 bne+ cr7,ffc0df28 ffc0def4: 3d 20 ff c2 lis r9,-62 ffc0def8: c0 09 f2 1c lfs f0,-3556(r9) (( result == 0 ) || ( result == HUGE_VALF ) || ( result == -HUGE_VALF ))) return RTEMS_INVALID_NUMBER; ffc0defc: 38 60 00 0a li r3,10 *endptr = end; if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && ffc0df00: ff 9f 00 00 fcmpu cr7,f31,f0 ffc0df04: 41 9e 00 2c beq- cr7,ffc0df30 <== NEVER TAKEN (( result == 0 ) || ( result == HUGE_VALF ) || ( result == -HUGE_VALF ))) ffc0df08: 3d 20 ff c2 lis r9,-62 ffc0df0c: c0 09 16 b8 lfs f0,5816(r9) ffc0df10: ff 9f 00 00 fcmpu cr7,f31,f0 ffc0df14: 41 9d 00 1c bgt- cr7,ffc0df30 <== ALWAYS TAKEN ffc0df18: 3d 20 ff c2 lis r9,-62 <== NOT EXECUTED ffc0df1c: c0 09 16 bc lfs f0,5820(r9) <== NOT EXECUTED ffc0df20: ff 9f 00 00 fcmpu cr7,f31,f0 <== NOT EXECUTED ffc0df24: 41 9c 00 0c blt- cr7,ffc0df30 <== NOT EXECUTED return RTEMS_INVALID_NUMBER; *n = result; ffc0df28: d3 fe 00 00 stfs f31,0(r30) return RTEMS_SUCCESSFUL; ffc0df2c: 38 60 00 00 li r3,0 } ffc0df30: 80 01 00 34 lwz r0,52(r1) ffc0df34: bb a1 00 1c lmw r29,28(r1) ffc0df38: 7c 08 03 a6 mtlr r0 ffc0df3c: cb e1 00 28 lfd f31,40(r1) ffc0df40: 38 21 00 30 addi r1,r1,48 ffc0df44: 4e 80 00 20 blr =============================================================================== ffc0df48 : const char *s, int *n, char **endptr, int base ) { ffc0df48: 94 21 ff d8 stwu r1,-40(r1) ffc0df4c: 7c 08 02 a6 mflr r0 ffc0df50: bf 81 00 18 stmw r28,24(r1) long result; char *end; if ( !n ) ffc0df54: 7c 9d 23 79 mr. r29,r4 const char *s, int *n, char **endptr, int base ) { ffc0df58: 7c 7f 1b 78 mr r31,r3 ffc0df5c: 90 01 00 2c stw r0,44(r1) ffc0df60: 7c be 2b 78 mr r30,r5 ffc0df64: 7c dc 33 78 mr r28,r6 long result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; ffc0df68: 38 00 00 09 li r0,9 ) { long result; char *end; if ( !n ) ffc0df6c: 41 82 00 84 beq- ffc0dff0 return RTEMS_INVALID_ADDRESS; errno = 0; ffc0df70: 48 00 33 1d bl ffc1128c <__errno> ffc0df74: 38 00 00 00 li r0,0 ffc0df78: 90 03 00 00 stw r0,0(r3) *n = 0; result = strtol( s, &end, base ); ffc0df7c: 7f 85 e3 78 mr r5,r28 ffc0df80: 7f e3 fb 78 mr r3,r31 if ( !n ) return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; ffc0df84: 90 1d 00 00 stw r0,0(r29) result = strtol( s, &end, base ); ffc0df88: 38 81 00 08 addi r4,r1,8 ffc0df8c: 48 00 62 e1 bl ffc1426c if ( endptr ) ffc0df90: 2f 9e 00 00 cmpwi cr7,r30,0 return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; result = strtol( s, &end, base ); ffc0df94: 7c 7c 1b 78 mr r28,r3 if ( endptr ) ffc0df98: 41 9e 00 0c beq- cr7,ffc0dfa4 *endptr = end; ffc0df9c: 80 01 00 08 lwz r0,8(r1) ffc0dfa0: 90 1e 00 00 stw r0,0(r30) if ( end == s ) ffc0dfa4: 81 21 00 08 lwz r9,8(r1) return RTEMS_NOT_DEFINED; ffc0dfa8: 38 00 00 0b li r0,11 result = strtol( s, &end, base ); if ( endptr ) *endptr = end; if ( end == s ) ffc0dfac: 7f 89 f8 00 cmpw cr7,r9,r31 ffc0dfb0: 41 9e 00 40 beq- cr7,ffc0dff0 return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && ffc0dfb4: 48 00 32 d9 bl ffc1128c <__errno> ffc0dfb8: 80 03 00 00 lwz r0,0(r3) ffc0dfbc: 2f 80 00 22 cmpwi cr7,r0,34 ffc0dfc0: 40 be 00 28 bne+ cr7,ffc0dfe8 ffc0dfc4: 2f 9c 00 00 cmpwi cr7,r28,0 (( result == 0 ) || ( result == LONG_MAX ) || ( result == LONG_MIN ))) return RTEMS_INVALID_NUMBER; ffc0dfc8: 38 00 00 0a li r0,10 *endptr = end; if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && ffc0dfcc: 41 9e 00 24 beq- cr7,ffc0dff0 <== NEVER TAKEN (( result == 0 ) || ( result == LONG_MAX ) || ( result == LONG_MIN ))) ffc0dfd0: 6f 89 80 00 xoris r9,r28,32768 ffc0dfd4: 2f 89 ff ff cmpwi cr7,r9,-1 ffc0dfd8: 41 9e 00 18 beq- cr7,ffc0dff0 <== ALWAYS TAKEN ffc0dfdc: 3d 20 80 00 lis r9,-32768 <== NOT EXECUTED ffc0dfe0: 7f 9c 48 00 cmpw cr7,r28,r9 <== NOT EXECUTED ffc0dfe4: 41 9e 00 0c beq- cr7,ffc0dff0 <== NOT EXECUTED errno = ERANGE; return RTEMS_INVALID_NUMBER; } #endif *n = result; ffc0dfe8: 93 9d 00 00 stw r28,0(r29) return RTEMS_SUCCESSFUL; ffc0dfec: 38 00 00 00 li r0,0 } ffc0dff0: 39 61 00 28 addi r11,r1,40 ffc0dff4: 7c 03 03 78 mr r3,r0 ffc0dff8: 4b ff 4e d8 b ffc02ed0 <_restgpr_28_x> =============================================================================== ffc0e0d4 : const char *s, long *n, char **endptr, int base ) { ffc0e0d4: 94 21 ff d8 stwu r1,-40(r1) ffc0e0d8: 7c 08 02 a6 mflr r0 ffc0e0dc: bf 81 00 18 stmw r28,24(r1) long result; char *end; if ( !n ) ffc0e0e0: 7c 9d 23 79 mr. r29,r4 const char *s, long *n, char **endptr, int base ) { ffc0e0e4: 7c 7f 1b 78 mr r31,r3 ffc0e0e8: 90 01 00 2c stw r0,44(r1) ffc0e0ec: 7c be 2b 78 mr r30,r5 ffc0e0f0: 7c dc 33 78 mr r28,r6 long result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; ffc0e0f4: 38 00 00 09 li r0,9 ) { long result; char *end; if ( !n ) ffc0e0f8: 41 82 00 84 beq- ffc0e17c return RTEMS_INVALID_ADDRESS; errno = 0; ffc0e0fc: 48 00 31 91 bl ffc1128c <__errno> ffc0e100: 38 00 00 00 li r0,0 ffc0e104: 90 03 00 00 stw r0,0(r3) *n = 0; result = strtol( s, &end, base ); ffc0e108: 7f 85 e3 78 mr r5,r28 ffc0e10c: 7f e3 fb 78 mr r3,r31 if ( !n ) return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; ffc0e110: 90 1d 00 00 stw r0,0(r29) result = strtol( s, &end, base ); ffc0e114: 38 81 00 08 addi r4,r1,8 ffc0e118: 48 00 61 55 bl ffc1426c if ( endptr ) ffc0e11c: 2f 9e 00 00 cmpwi cr7,r30,0 return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; result = strtol( s, &end, base ); ffc0e120: 7c 7c 1b 78 mr r28,r3 if ( endptr ) ffc0e124: 41 9e 00 0c beq- cr7,ffc0e130 *endptr = end; ffc0e128: 80 01 00 08 lwz r0,8(r1) ffc0e12c: 90 1e 00 00 stw r0,0(r30) if ( end == s ) ffc0e130: 81 21 00 08 lwz r9,8(r1) return RTEMS_NOT_DEFINED; ffc0e134: 38 00 00 0b li r0,11 result = strtol( s, &end, base ); if ( endptr ) *endptr = end; if ( end == s ) ffc0e138: 7f 89 f8 00 cmpw cr7,r9,r31 ffc0e13c: 41 9e 00 40 beq- cr7,ffc0e17c return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && ffc0e140: 48 00 31 4d bl ffc1128c <__errno> ffc0e144: 80 03 00 00 lwz r0,0(r3) ffc0e148: 2f 80 00 22 cmpwi cr7,r0,34 ffc0e14c: 40 be 00 28 bne+ cr7,ffc0e174 ffc0e150: 2f 9c 00 00 cmpwi cr7,r28,0 (( result == 0 ) || ( result == LONG_MAX ) || ( result == LONG_MIN ))) return RTEMS_INVALID_NUMBER; ffc0e154: 38 00 00 0a li r0,10 *endptr = end; if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && ffc0e158: 41 9e 00 24 beq- cr7,ffc0e17c <== NEVER TAKEN (( result == 0 ) || ( result == LONG_MAX ) || ( result == LONG_MIN ))) ffc0e15c: 6f 89 80 00 xoris r9,r28,32768 ffc0e160: 2f 89 ff ff cmpwi cr7,r9,-1 ffc0e164: 41 9e 00 18 beq- cr7,ffc0e17c ffc0e168: 3d 20 80 00 lis r9,-32768 ffc0e16c: 7f 9c 48 00 cmpw cr7,r28,r9 ffc0e170: 41 9e 00 0c beq- cr7,ffc0e17c <== ALWAYS TAKEN return RTEMS_INVALID_NUMBER; *n = result; ffc0e174: 93 9d 00 00 stw r28,0(r29) return RTEMS_SUCCESSFUL; ffc0e178: 38 00 00 00 li r0,0 } ffc0e17c: 39 61 00 28 addi r11,r1,40 ffc0e180: 7c 03 03 78 mr r3,r0 ffc0e184: 4b ff 4d 4c b ffc02ed0 <_restgpr_28_x> =============================================================================== ffc0dffc : const char *s, long long *n, char **endptr, int base ) { ffc0dffc: 94 21 ff d0 stwu r1,-48(r1) ffc0e000: 7c 08 02 a6 mflr r0 ffc0e004: bf 61 00 1c stmw r27,28(r1) long long result; char *end; if ( !n ) ffc0e008: 7c 9d 23 79 mr. r29,r4 const char *s, long long *n, char **endptr, int base ) { ffc0e00c: 7c 7f 1b 78 mr r31,r3 ffc0e010: 90 01 00 34 stw r0,52(r1) ffc0e014: 7c be 2b 78 mr r30,r5 ffc0e018: 7c dc 33 78 mr r28,r6 long long result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; ffc0e01c: 38 60 00 09 li r3,9 ) { long long result; char *end; if ( !n ) ffc0e020: 41 82 00 ac beq- ffc0e0cc return RTEMS_INVALID_ADDRESS; errno = 0; ffc0e024: 48 00 32 69 bl ffc1128c <__errno> ffc0e028: 38 00 00 00 li r0,0 *n = 0; ffc0e02c: 39 20 00 00 li r9,0 char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; errno = 0; ffc0e030: 90 03 00 00 stw r0,0(r3) *n = 0; ffc0e034: 39 40 00 00 li r10,0 ffc0e038: 91 3d 00 00 stw r9,0(r29) result = strtoll( s, &end, base ); ffc0e03c: 7f 85 e3 78 mr r5,r28 ffc0e040: 7f e3 fb 78 mr r3,r31 if ( !n ) return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; ffc0e044: 91 5d 00 04 stw r10,4(r29) result = strtoll( s, &end, base ); ffc0e048: 38 81 00 08 addi r4,r1,8 ffc0e04c: 48 00 62 41 bl ffc1428c if ( endptr ) ffc0e050: 2f 9e 00 00 cmpwi cr7,r30,0 return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; result = strtoll( s, &end, base ); ffc0e054: 7c 7c 1b 78 mr r28,r3 ffc0e058: 7c 9b 23 78 mr r27,r4 if ( endptr ) ffc0e05c: 41 9e 00 0c beq- cr7,ffc0e068 *endptr = end; ffc0e060: 80 01 00 08 lwz r0,8(r1) ffc0e064: 90 1e 00 00 stw r0,0(r30) if ( end == s ) ffc0e068: 80 01 00 08 lwz r0,8(r1) return RTEMS_NOT_DEFINED; ffc0e06c: 38 60 00 0b li r3,11 result = strtoll( s, &end, base ); if ( endptr ) *endptr = end; if ( end == s ) ffc0e070: 7f 80 f8 00 cmpw cr7,r0,r31 ffc0e074: 41 9e 00 58 beq- cr7,ffc0e0cc return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && ffc0e078: 48 00 32 15 bl ffc1128c <__errno> ffc0e07c: 80 03 00 00 lwz r0,0(r3) ffc0e080: 2f 80 00 22 cmpwi cr7,r0,34 ffc0e084: 40 be 00 3c bne+ cr7,ffc0e0c0 ffc0e088: 7f 80 db 79 or. r0,r28,r27 (( result == 0 ) || ( result == LONG_LONG_MAX ) || ( result == LONG_LONG_MIN ))) return RTEMS_INVALID_NUMBER; ffc0e08c: 38 60 00 0a li r3,10 *endptr = end; if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && ffc0e090: 41 82 00 3c beq- ffc0e0cc <== NEVER TAKEN (( result == 0 ) || ( result == LONG_LONG_MAX ) || ( result == LONG_LONG_MIN ))) ffc0e094: 6f 80 80 00 xoris r0,r28,32768 ffc0e098: 2f 80 ff ff cmpwi cr7,r0,-1 ffc0e09c: 40 9e 00 0c bne- cr7,ffc0e0a8 ffc0e0a0: 2f 9b ff ff cmpwi cr7,r27,-1 ffc0e0a4: 41 9e 00 28 beq- cr7,ffc0e0cc <== ALWAYS TAKEN ffc0e0a8: 3c 00 80 00 lis r0,-32768 ffc0e0ac: 7f 9c 00 00 cmpw cr7,r28,r0 ffc0e0b0: 40 be 00 10 bne+ cr7,ffc0e0c0 <== NEVER TAKEN ffc0e0b4: 2f 9b 00 00 cmpwi cr7,r27,0 return RTEMS_INVALID_NUMBER; ffc0e0b8: 38 60 00 0a li r3,10 if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && (( result == 0 ) || ( result == LONG_LONG_MAX ) || ( result == LONG_LONG_MIN ))) ffc0e0bc: 41 9e 00 10 beq- cr7,ffc0e0cc <== ALWAYS TAKEN return RTEMS_INVALID_NUMBER; *n = result; ffc0e0c0: 93 9d 00 00 stw r28,0(r29) return RTEMS_SUCCESSFUL; ffc0e0c4: 38 60 00 00 li r3,0 if ( ( errno == ERANGE ) && (( result == 0 ) || ( result == LONG_LONG_MAX ) || ( result == LONG_LONG_MIN ))) return RTEMS_INVALID_NUMBER; *n = result; ffc0e0c8: 93 7d 00 04 stw r27,4(r29) return RTEMS_SUCCESSFUL; } ffc0e0cc: 39 61 00 30 addi r11,r1,48 ffc0e0d0: 4b ff 4d fc b ffc02ecc <_restgpr_27_x> =============================================================================== ffc0e1ac : const char *s, unsigned char *n, char **endptr, int base ) { ffc0e1ac: 94 21 ff d8 stwu r1,-40(r1) ffc0e1b0: 7c 08 02 a6 mflr r0 ffc0e1b4: bf 81 00 18 stmw r28,24(r1) unsigned long result; char *end; if ( !n ) ffc0e1b8: 7c 9d 23 79 mr. r29,r4 const char *s, unsigned char *n, char **endptr, int base ) { ffc0e1bc: 7c 7f 1b 78 mr r31,r3 ffc0e1c0: 90 01 00 2c stw r0,44(r1) ffc0e1c4: 7c be 2b 78 mr r30,r5 ffc0e1c8: 7c dc 33 78 mr r28,r6 unsigned long result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; ffc0e1cc: 38 00 00 09 li r0,9 ) { unsigned long result; char *end; if ( !n ) ffc0e1d0: 41 82 00 90 beq- ffc0e260 return RTEMS_INVALID_ADDRESS; errno = 0; ffc0e1d4: 48 00 30 b9 bl ffc1128c <__errno> ffc0e1d8: 38 00 00 00 li r0,0 ffc0e1dc: 90 03 00 00 stw r0,0(r3) *n = 0; result = strtoul( s, &end, base ); ffc0e1e0: 7f 85 e3 78 mr r5,r28 ffc0e1e4: 7f e3 fb 78 mr r3,r31 if ( !n ) return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; ffc0e1e8: 98 1d 00 00 stb r0,0(r29) result = strtoul( s, &end, base ); ffc0e1ec: 38 81 00 08 addi r4,r1,8 ffc0e1f0: 48 00 65 fd bl ffc147ec if ( endptr ) ffc0e1f4: 2f 9e 00 00 cmpwi cr7,r30,0 return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; result = strtoul( s, &end, base ); ffc0e1f8: 7c 7c 1b 78 mr r28,r3 if ( endptr ) ffc0e1fc: 41 9e 00 0c beq- cr7,ffc0e208 *endptr = end; ffc0e200: 80 01 00 08 lwz r0,8(r1) ffc0e204: 90 1e 00 00 stw r0,0(r30) if ( end == s ) ffc0e208: 81 21 00 08 lwz r9,8(r1) return RTEMS_NOT_DEFINED; ffc0e20c: 38 00 00 0b li r0,11 result = strtoul( s, &end, base ); if ( endptr ) *endptr = end; if ( end == s ) ffc0e210: 7f 89 f8 00 cmpw cr7,r9,r31 ffc0e214: 41 9e 00 4c beq- cr7,ffc0e260 return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && ffc0e218: 48 00 30 75 bl ffc1128c <__errno> ffc0e21c: 80 03 00 00 lwz r0,0(r3) ffc0e220: 2f 80 00 22 cmpwi cr7,r0,34 ffc0e224: 40 be 00 18 bne+ cr7,ffc0e23c <== ALWAYS TAKEN (( result == 0 ) || ( result == ULONG_MAX ))) ffc0e228: 39 7c ff ff addi r11,r28,-1 <== NOT EXECUTED *endptr = end; if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && ffc0e22c: 39 20 ff fd li r9,-3 <== NOT EXECUTED ffc0e230: 7f 8b 48 40 cmplw cr7,r11,r9 <== NOT EXECUTED (( result == 0 ) || ( result == ULONG_MAX ))) return RTEMS_INVALID_NUMBER; ffc0e234: 38 00 00 0a li r0,10 <== NOT EXECUTED *endptr = end; if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && ffc0e238: 41 9d 00 28 bgt- cr7,ffc0e260 <== NOT EXECUTED (( result == 0 ) || ( result == ULONG_MAX ))) return RTEMS_INVALID_NUMBER; #if (UCHAR_MAX < ULONG_MAX) if ( result > UCHAR_MAX ) { ffc0e23c: 2b 9c 00 ff cmplwi cr7,r28,255 ffc0e240: 40 9d 00 18 ble- cr7,ffc0e258 <== ALWAYS TAKEN errno = ERANGE; ffc0e244: 48 00 30 49 bl ffc1128c <__errno> <== NOT EXECUTED ffc0e248: 38 00 00 22 li r0,34 <== NOT EXECUTED ffc0e24c: 90 03 00 00 stw r0,0(r3) <== NOT EXECUTED return RTEMS_INVALID_NUMBER; ffc0e250: 38 00 00 0a li r0,10 <== NOT EXECUTED ffc0e254: 48 00 00 0c b ffc0e260 <== NOT EXECUTED } #endif *n = result; ffc0e258: 9b 9d 00 00 stb r28,0(r29) return RTEMS_SUCCESSFUL; ffc0e25c: 38 00 00 00 li r0,0 } ffc0e260: 39 61 00 28 addi r11,r1,40 ffc0e264: 7c 03 03 78 mr r3,r0 ffc0e268: 4b ff 4c 68 b ffc02ed0 <_restgpr_28_x> =============================================================================== ffc0e26c : const char *s, unsigned int *n, char **endptr, int base ) { ffc0e26c: 94 21 ff d8 stwu r1,-40(r1) ffc0e270: 7c 08 02 a6 mflr r0 ffc0e274: bf 81 00 18 stmw r28,24(r1) unsigned long result; char *end; if ( !n ) ffc0e278: 7c 9d 23 79 mr. r29,r4 const char *s, unsigned int *n, char **endptr, int base ) { ffc0e27c: 7c 7f 1b 78 mr r31,r3 ffc0e280: 90 01 00 2c stw r0,44(r1) ffc0e284: 7c be 2b 78 mr r30,r5 ffc0e288: 7c dc 33 78 mr r28,r6 unsigned long result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; ffc0e28c: 38 00 00 09 li r0,9 ) { unsigned long result; char *end; if ( !n ) ffc0e290: 41 82 00 74 beq- ffc0e304 return RTEMS_INVALID_ADDRESS; errno = 0; ffc0e294: 48 00 2f f9 bl ffc1128c <__errno> ffc0e298: 38 00 00 00 li r0,0 ffc0e29c: 90 03 00 00 stw r0,0(r3) *n = 0; result = strtoul( s, &end, base ); ffc0e2a0: 7f 85 e3 78 mr r5,r28 ffc0e2a4: 7f e3 fb 78 mr r3,r31 if ( !n ) return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; ffc0e2a8: 90 1d 00 00 stw r0,0(r29) result = strtoul( s, &end, base ); ffc0e2ac: 38 81 00 08 addi r4,r1,8 ffc0e2b0: 48 00 65 3d bl ffc147ec if ( endptr ) ffc0e2b4: 2f 9e 00 00 cmpwi cr7,r30,0 return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; result = strtoul( s, &end, base ); ffc0e2b8: 7c 7c 1b 78 mr r28,r3 if ( endptr ) ffc0e2bc: 41 9e 00 0c beq- cr7,ffc0e2c8 *endptr = end; ffc0e2c0: 80 01 00 08 lwz r0,8(r1) ffc0e2c4: 90 1e 00 00 stw r0,0(r30) if ( end == s ) ffc0e2c8: 81 21 00 08 lwz r9,8(r1) return RTEMS_NOT_DEFINED; ffc0e2cc: 38 00 00 0b li r0,11 result = strtoul( s, &end, base ); if ( endptr ) *endptr = end; if ( end == s ) ffc0e2d0: 7f 89 f8 00 cmpw cr7,r9,r31 ffc0e2d4: 41 9e 00 30 beq- cr7,ffc0e304 return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && ffc0e2d8: 48 00 2f b5 bl ffc1128c <__errno> ffc0e2dc: 80 03 00 00 lwz r0,0(r3) ffc0e2e0: 2f 80 00 22 cmpwi cr7,r0,34 ffc0e2e4: 40 be 00 18 bne+ cr7,ffc0e2fc (( result == 0 ) || ( result == ULONG_MAX ))) ffc0e2e8: 39 7c ff ff addi r11,r28,-1 *endptr = end; if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && ffc0e2ec: 39 20 ff fd li r9,-3 ffc0e2f0: 7f 8b 48 40 cmplw cr7,r11,r9 (( result == 0 ) || ( result == ULONG_MAX ))) return RTEMS_INVALID_NUMBER; ffc0e2f4: 38 00 00 0a li r0,10 *endptr = end; if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && ffc0e2f8: 41 9d 00 0c bgt- cr7,ffc0e304 <== ALWAYS TAKEN errno = ERANGE; return RTEMS_INVALID_NUMBER; } #endif *n = result; ffc0e2fc: 93 9d 00 00 stw r28,0(r29) return RTEMS_SUCCESSFUL; ffc0e300: 38 00 00 00 li r0,0 } ffc0e304: 39 61 00 28 addi r11,r1,40 ffc0e308: 7c 03 03 78 mr r3,r0 ffc0e30c: 4b ff 4b c4 b ffc02ed0 <_restgpr_28_x> =============================================================================== ffc0e3d0 : const char *s, unsigned long *n, char **endptr, int base ) { ffc0e3d0: 94 21 ff d8 stwu r1,-40(r1) ffc0e3d4: 7c 08 02 a6 mflr r0 ffc0e3d8: bf 81 00 18 stmw r28,24(r1) unsigned long result; char *end; if ( !n ) ffc0e3dc: 7c 9d 23 79 mr. r29,r4 const char *s, unsigned long *n, char **endptr, int base ) { ffc0e3e0: 7c 7f 1b 78 mr r31,r3 ffc0e3e4: 90 01 00 2c stw r0,44(r1) ffc0e3e8: 7c be 2b 78 mr r30,r5 ffc0e3ec: 7c dc 33 78 mr r28,r6 unsigned long result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; ffc0e3f0: 38 00 00 09 li r0,9 ) { unsigned long result; char *end; if ( !n ) ffc0e3f4: 41 82 00 74 beq- ffc0e468 return RTEMS_INVALID_ADDRESS; errno = 0; ffc0e3f8: 48 00 2e 95 bl ffc1128c <__errno> ffc0e3fc: 38 00 00 00 li r0,0 ffc0e400: 90 03 00 00 stw r0,0(r3) *n = 0; result = strtoul( s, &end, base ); ffc0e404: 7f 85 e3 78 mr r5,r28 ffc0e408: 7f e3 fb 78 mr r3,r31 if ( !n ) return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; ffc0e40c: 90 1d 00 00 stw r0,0(r29) result = strtoul( s, &end, base ); ffc0e410: 38 81 00 08 addi r4,r1,8 ffc0e414: 48 00 63 d9 bl ffc147ec if ( endptr ) ffc0e418: 2f 9e 00 00 cmpwi cr7,r30,0 return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; result = strtoul( s, &end, base ); ffc0e41c: 7c 7c 1b 78 mr r28,r3 if ( endptr ) ffc0e420: 41 9e 00 0c beq- cr7,ffc0e42c *endptr = end; ffc0e424: 80 01 00 08 lwz r0,8(r1) ffc0e428: 90 1e 00 00 stw r0,0(r30) if ( end == s ) ffc0e42c: 81 21 00 08 lwz r9,8(r1) return RTEMS_NOT_DEFINED; ffc0e430: 38 00 00 0b li r0,11 result = strtoul( s, &end, base ); if ( endptr ) *endptr = end; if ( end == s ) ffc0e434: 7f 89 f8 00 cmpw cr7,r9,r31 ffc0e438: 41 9e 00 30 beq- cr7,ffc0e468 return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && ffc0e43c: 48 00 2e 51 bl ffc1128c <__errno> ffc0e440: 80 03 00 00 lwz r0,0(r3) ffc0e444: 2f 80 00 22 cmpwi cr7,r0,34 ffc0e448: 40 be 00 18 bne+ cr7,ffc0e460 (( result == 0 ) || ( result == ULONG_MAX ))) ffc0e44c: 39 7c ff ff addi r11,r28,-1 *endptr = end; if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && ffc0e450: 39 20 ff fd li r9,-3 ffc0e454: 7f 8b 48 40 cmplw cr7,r11,r9 (( result == 0 ) || ( result == ULONG_MAX ))) return RTEMS_INVALID_NUMBER; ffc0e458: 38 00 00 0a li r0,10 *endptr = end; if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && ffc0e45c: 41 9d 00 0c bgt- cr7,ffc0e468 <== ALWAYS TAKEN (( result == 0 ) || ( result == ULONG_MAX ))) return RTEMS_INVALID_NUMBER; *n = result; ffc0e460: 93 9d 00 00 stw r28,0(r29) return RTEMS_SUCCESSFUL; ffc0e464: 38 00 00 00 li r0,0 } ffc0e468: 39 61 00 28 addi r11,r1,40 ffc0e46c: 7c 03 03 78 mr r3,r0 ffc0e470: 4b ff 4a 60 b ffc02ed0 <_restgpr_28_x> =============================================================================== ffc0e310 : const char *s, unsigned long long *n, char **endptr, int base ) { ffc0e310: 94 21 ff d0 stwu r1,-48(r1) ffc0e314: 7c 08 02 a6 mflr r0 ffc0e318: bf 61 00 1c stmw r27,28(r1) unsigned long long result; char *end; if ( !n ) ffc0e31c: 7c 9d 23 79 mr. r29,r4 const char *s, unsigned long long *n, char **endptr, int base ) { ffc0e320: 7c 7f 1b 78 mr r31,r3 ffc0e324: 90 01 00 34 stw r0,52(r1) ffc0e328: 7c be 2b 78 mr r30,r5 ffc0e32c: 7c db 33 78 mr r27,r6 unsigned long long result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; ffc0e330: 38 60 00 09 li r3,9 ) { unsigned long long result; char *end; if ( !n ) ffc0e334: 41 82 00 94 beq- ffc0e3c8 return RTEMS_INVALID_ADDRESS; errno = 0; ffc0e338: 48 00 2f 55 bl ffc1128c <__errno> ffc0e33c: 38 00 00 00 li r0,0 *n = 0; ffc0e340: 39 20 00 00 li r9,0 char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; errno = 0; ffc0e344: 90 03 00 00 stw r0,0(r3) *n = 0; ffc0e348: 39 40 00 00 li r10,0 ffc0e34c: 91 3d 00 00 stw r9,0(r29) result = strtoull( s, &end, base ); ffc0e350: 7f 65 db 78 mr r5,r27 ffc0e354: 7f e3 fb 78 mr r3,r31 if ( !n ) return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; ffc0e358: 91 5d 00 04 stw r10,4(r29) result = strtoull( s, &end, base ); ffc0e35c: 38 81 00 08 addi r4,r1,8 ffc0e360: 48 00 64 ad bl ffc1480c if ( endptr ) ffc0e364: 2f 9e 00 00 cmpwi cr7,r30,0 return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; result = strtoull( s, &end, base ); ffc0e368: 7c 9c 23 78 mr r28,r4 ffc0e36c: 7c 7b 1b 78 mr r27,r3 if ( endptr ) ffc0e370: 41 9e 00 0c beq- cr7,ffc0e37c *endptr = end; ffc0e374: 80 01 00 08 lwz r0,8(r1) ffc0e378: 90 1e 00 00 stw r0,0(r30) if ( end == s ) ffc0e37c: 80 01 00 08 lwz r0,8(r1) return RTEMS_NOT_DEFINED; ffc0e380: 38 60 00 0b li r3,11 result = strtoull( s, &end, base ); if ( endptr ) *endptr = end; if ( end == s ) ffc0e384: 7f 80 f8 00 cmpw cr7,r0,r31 ffc0e388: 41 9e 00 40 beq- cr7,ffc0e3c8 return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && ffc0e38c: 48 00 2f 01 bl ffc1128c <__errno> ffc0e390: 80 03 00 00 lwz r0,0(r3) ffc0e394: 2f 80 00 22 cmpwi cr7,r0,34 ffc0e398: 40 be 00 24 bne+ cr7,ffc0e3bc (( result == 0 ) || ( result == ULONG_LONG_MAX ))) ffc0e39c: 31 5c ff ff addic r10,r28,-1 ffc0e3a0: 7d 3b 01 d4 addme r9,r27 *endptr = end; if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && ffc0e3a4: 2f 89 ff ff cmpwi cr7,r9,-1 ffc0e3a8: 40 be 00 14 bne+ cr7,ffc0e3bc <== NEVER TAKEN ffc0e3ac: 38 00 ff fd li r0,-3 ffc0e3b0: 7f 8a 00 40 cmplw cr7,r10,r0 (( result == 0 ) || ( result == ULONG_LONG_MAX ))) return RTEMS_INVALID_NUMBER; ffc0e3b4: 38 60 00 0a li r3,10 *endptr = end; if ( end == s ) return RTEMS_NOT_DEFINED; if ( ( errno == ERANGE ) && ffc0e3b8: 41 9d 00 10 bgt- cr7,ffc0e3c8 <== ALWAYS TAKEN (( result == 0 ) || ( result == ULONG_LONG_MAX ))) return RTEMS_INVALID_NUMBER; *n = result; ffc0e3bc: 93 7d 00 00 stw r27,0(r29) return RTEMS_SUCCESSFUL; ffc0e3c0: 38 60 00 00 li r3,0 if ( ( errno == ERANGE ) && (( result == 0 ) || ( result == ULONG_LONG_MAX ))) return RTEMS_INVALID_NUMBER; *n = result; ffc0e3c4: 93 9d 00 04 stw r28,4(r29) return RTEMS_SUCCESSFUL; } ffc0e3c8: 39 61 00 30 addi r11,r1,48 ffc0e3cc: 4b ff 4b 00 b ffc02ecc <_restgpr_27_x> =============================================================================== ffc03c54 : int rtems_tarfs_load( char *mountpoint, uint8_t *tar_image, size_t tar_size ) { ffc03c54: 94 21 fe 28 stwu r1,-472(r1) ffc03c58: 7c 08 02 a6 mflr r0 ffc03c5c: be 01 01 98 stmw r16,408(r1) ffc03c60: 7c 79 1b 78 mr r25,r3 ffc03c64: 7c 98 23 78 mr r24,r4 ffc03c68: 90 01 01 dc stw r0,476(r1) ffc03c6c: 7c b4 2b 78 mr r20,r5 int offset; unsigned long nblocks; IMFS_jnode_t *node; int status; status = rtems_filesystem_evaluate_path( ffc03c70: 48 01 19 55 bl ffc155c4 ffc03c74: 38 a0 00 00 li r5,0 ffc03c78: 7c 64 1b 78 mr r4,r3 ffc03c7c: 38 c1 00 0c addi r6,r1,12 ffc03c80: 7f 23 cb 78 mr r3,r25 ffc03c84: 38 e0 00 00 li r7,0 ffc03c88: 48 00 0c 5d bl ffc048e4 strlen(mountpoint), 0, &root_loc, 0 ); if (status != 0) ffc03c8c: 7c 7d 1b 79 mr. r29,r3 ffc03c90: 40 82 01 98 bne- ffc03e28 return -1; if (root_loc.ops != &IMFS_ops && root_loc.ops != &fifoIMFS_ops) ffc03c94: 80 01 00 18 lwz r0,24(r1) ffc03c98: 3d 20 ff c2 lis r9,-62 ffc03c9c: 39 29 1d f0 addi r9,r9,7664 ffc03ca0: 7f 80 48 00 cmpw cr7,r0,r9 ffc03ca4: 3a 40 00 00 li r18,0 ffc03ca8: 41 be 00 24 beq+ cr7,ffc03ccc ffc03cac: 3d 20 ff c2 lis r9,-62 ffc03cb0: 39 29 25 08 addi r9,r9,9480 ffc03cb4: 7f 80 48 00 cmpw cr7,r0,r9 ffc03cb8: 7f b2 eb 78 mr r18,r29 ffc03cbc: 40 be 01 6c bne+ cr7,ffc03e28 <== ALWAYS TAKEN ffc03cc0: 48 00 00 0c b ffc03ccc <== NOT EXECUTED ffc03cc4: 7f d2 f3 78 mr r18,r30 ffc03cc8: 48 00 00 24 b ffc03cec /* * Read a header. */ hdr_ptr = (char *) &tar_image[offset]; offset += 512; if (strncmp(&hdr_ptr[257], "ustar", 5)) ffc03ccc: 3e a0 ff c2 lis r21,-62 * - For files, create a file node with special tarfs properties. */ if (linkflag == DIRTYPE) { strcpy(full_filename, mountpoint); if (full_filename[strlen(full_filename)-1] != '/') strcat(full_filename, "/"); ffc03cd0: 3e c0 ff c2 lis r22,-62 /* * Read a header. */ hdr_ptr = (char *) &tar_image[offset]; offset += 512; if (strncmp(&hdr_ptr[257], "ustar", 5)) ffc03cd4: 3a b5 1e 38 addi r21,r21,7736 break; strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE); ffc03cd8: 3b 61 00 34 addi r27,r1,52 * should not have this path. */ else if (linkflag == REGTYPE) { const char *name; loc = root_loc; ffc03cdc: 3b 81 00 20 addi r28,r1,32 if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) { ffc03ce0: 3b 41 00 08 addi r26,r1,8 * - 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); ffc03ce4: 3b e1 00 98 addi r31,r1,152 if (full_filename[strlen(full_filename)-1] != '/') strcat(full_filename, "/"); ffc03ce8: 3a d6 ea 51 addi r22,r22,-5551 /* * Create an IMFS node structure pointing to tar image memory. */ offset = 0; while (1) { if (offset + 512 > tar_size) ffc03cec: 3b d2 02 00 addi r30,r18,512 ffc03cf0: 7f 9e a0 40 cmplw cr7,r30,r20 ffc03cf4: 41 9d 01 38 bgt- cr7,ffc03e2c <== NEVER TAKEN break; /* * Read a header. */ hdr_ptr = (char *) &tar_image[offset]; ffc03cf8: 7e 58 92 14 add r18,r24,r18 offset += 512; if (strncmp(&hdr_ptr[257], "ustar", 5)) ffc03cfc: 38 72 01 01 addi r3,r18,257 ffc03d00: 7e a4 ab 78 mr r4,r21 ffc03d04: 38 a0 00 05 li r5,5 ffc03d08: 48 01 19 61 bl ffc15668 ffc03d0c: 7c 77 1b 79 mr. r23,r3 ffc03d10: 40 82 01 1c bne- ffc03e2c break; strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE); ffc03d14: 38 a0 00 63 li r5,99 ffc03d18: 7e 44 93 78 mr r4,r18 ffc03d1c: 7f 63 db 78 mr r3,r27 ffc03d20: 48 01 1a a1 bl ffc157c0 filename[MAX_NAME_FIELD_SIZE] = '\0'; ffc03d24: 9a e1 00 97 stb r23,151(r1) linkflag = hdr_ptr[156]; file_mode = _rtems_octal2ulong(&hdr_ptr[100], 8); ffc03d28: 38 80 00 08 li r4,8 ffc03d2c: 38 72 00 64 addi r3,r18,100 break; strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE); filename[MAX_NAME_FIELD_SIZE] = '\0'; linkflag = hdr_ptr[156]; ffc03d30: 8a 32 00 9c lbz r17,156(r18) file_mode = _rtems_octal2ulong(&hdr_ptr[100], 8); ffc03d34: 48 00 83 49 bl ffc0c07c <_rtems_octal2ulong> file_size = _rtems_octal2ulong(&hdr_ptr[124], 12); ffc03d38: 38 80 00 0c li r4,12 strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE); filename[MAX_NAME_FIELD_SIZE] = '\0'; linkflag = hdr_ptr[156]; file_mode = _rtems_octal2ulong(&hdr_ptr[100], 8); ffc03d3c: 7c 73 1b 78 mr r19,r3 file_size = _rtems_octal2ulong(&hdr_ptr[124], 12); ffc03d40: 38 72 00 7c addi r3,r18,124 ffc03d44: 48 00 83 39 bl ffc0c07c <_rtems_octal2ulong> hdr_chksum = _rtems_octal2ulong(&hdr_ptr[148], 8); ffc03d48: 38 80 00 08 li r4,8 strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE); filename[MAX_NAME_FIELD_SIZE] = '\0'; linkflag = hdr_ptr[156]; file_mode = _rtems_octal2ulong(&hdr_ptr[100], 8); file_size = _rtems_octal2ulong(&hdr_ptr[124], 12); ffc03d4c: 7c 77 1b 78 mr r23,r3 hdr_chksum = _rtems_octal2ulong(&hdr_ptr[148], 8); ffc03d50: 38 72 00 94 addi r3,r18,148 ffc03d54: 48 00 83 29 bl ffc0c07c <_rtems_octal2ulong> ffc03d58: 7c 70 1b 78 mr r16,r3 if (_rtems_tar_header_checksum(hdr_ptr) != hdr_chksum) ffc03d5c: 7e 43 93 78 mr r3,r18 ffc03d60: 48 00 83 69 bl ffc0c0c8 <_rtems_tar_header_checksum> ffc03d64: 7f 83 80 00 cmpw cr7,r3,r16 ffc03d68: 40 9e 00 c4 bne- cr7,ffc03e2c <== 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) { ffc03d6c: 2f 91 00 35 cmpwi cr7,r17,53 ffc03d70: 40 be 00 50 bne+ cr7,ffc03dc0 strcpy(full_filename, mountpoint); ffc03d74: 7f 24 cb 78 mr r4,r25 ffc03d78: 7f e3 fb 78 mr r3,r31 ffc03d7c: 48 01 13 75 bl ffc150f0 if (full_filename[strlen(full_filename)-1] != '/') ffc03d80: 7f e3 fb 78 mr r3,r31 ffc03d84: 48 01 18 41 bl ffc155c4 ffc03d88: 7c 7a 1a 14 add r3,r26,r3 ffc03d8c: 88 03 00 8f lbz r0,143(r3) ffc03d90: 2f 80 00 2f cmpwi cr7,r0,47 ffc03d94: 41 9e 00 10 beq- cr7,ffc03da4 <== ALWAYS TAKEN strcat(full_filename, "/"); ffc03d98: 7f e3 fb 78 mr r3,r31 <== NOT EXECUTED ffc03d9c: 7e c4 b3 78 mr r4,r22 <== NOT EXECUTED ffc03da0: 48 01 12 15 bl ffc14fb4 <== NOT EXECUTED strcat(full_filename, filename); ffc03da4: 7f 64 db 78 mr r4,r27 ffc03da8: 7f e3 fb 78 mr r3,r31 ffc03dac: 48 01 12 09 bl ffc14fb4 mkdir(full_filename, S_IRWXU | S_IRWXG | S_IRWXO); ffc03db0: 7f e3 fb 78 mr r3,r31 ffc03db4: 38 80 01 ff li r4,511 ffc03db8: 48 00 14 c1 bl ffc05278 ffc03dbc: 4b ff ff 08 b ffc03cc4 * 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) { ffc03dc0: 2f 91 00 30 cmpwi cr7,r17,48 ffc03dc4: 40 9e ff 00 bne+ cr7,ffc03cc4 const char *name; loc = root_loc; ffc03dc8: 39 61 00 0c addi r11,r1,12 ffc03dcc: 7c ab a4 aa lswi r5,r11,20 ffc03dd0: 7c bc a5 aa stswi r5,r28,20 if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) { ffc03dd4: 7f 63 db 78 mr r3,r27 ffc03dd8: 7f 84 e3 78 mr r4,r28 ffc03ddc: 7f 45 d3 78 mr r5,r26 ffc03de0: 48 00 8f b9 bl ffc0cd98 ffc03de4: 7c 72 1b 79 mr. r18,r3 ffc03de8: 40 a2 00 30 bne+ ffc03e18 <== NEVER TAKEN node = IMFS_create_node( &loc, IMFS_LINEAR_FILE, (char *)name, (file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG, ffc03dec: 56 66 05 fe clrlwi r6,r19,23 else if (linkflag == REGTYPE) { const char *name; loc = root_loc; if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) { node = IMFS_create_node( ffc03df0: 80 a1 00 08 lwz r5,8(r1) ffc03df4: 7f 83 e3 78 mr r3,r28 ffc03df8: 38 80 00 06 li r4,6 ffc03dfc: 60 c6 80 00 ori r6,r6,32768 ffc03e00: 38 e0 00 00 li r7,0 ffc03e04: 48 00 89 11 bl ffc0c714 IMFS_LINEAR_FILE, (char *)name, (file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG, NULL ); node->info.linearfile.size = file_size; node->info.linearfile.direct = &tar_image[offset]; ffc03e08: 7c 18 f2 14 add r0,r24,r30 &loc, IMFS_LINEAR_FILE, (char *)name, (file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG, NULL ); node->info.linearfile.size = file_size; ffc03e0c: 92 e3 00 54 stw r23,84(r3) ffc03e10: 92 43 00 50 stw r18,80(r3) node->info.linearfile.direct = &tar_image[offset]; ffc03e14: 90 03 00 58 stw r0,88(r3) } nblocks = (((file_size) + 511) & ~511) / 512; ffc03e18: 3a f7 01 ff addi r23,r23,511 offset += 512 * nblocks; ffc03e1c: 56 f7 00 2c rlwinm r23,r23,0,0,22 ffc03e20: 7f d7 f2 14 add r30,r23,r30 ffc03e24: 4b ff fe a0 b ffc03cc4 ); if (status != 0) return -1; if (root_loc.ops != &IMFS_ops && root_loc.ops != &fifoIMFS_ops) return -1; ffc03e28: 3b a0 ff ff li r29,-1 nblocks = (((file_size) + 511) & ~511) / 512; offset += 512 * nblocks; } } return status; } ffc03e2c: 39 61 01 d8 addi r11,r1,472 ffc03e30: 7f a3 eb 78 mr r3,r29 ffc03e34: 4b ff c7 54 b ffc00588 <_restgpr_16_x> =============================================================================== ffc1171c : ASR_Information *asr; bool is_asr_enabled = false; bool needs_asr_dispatching = false; rtems_mode old_mode; if ( !previous_mode_set ) ffc1171c: 2c 05 00 00 cmpwi r5,0 rtems_status_code rtems_task_mode( rtems_mode mode_set, rtems_mode mask, rtems_mode *previous_mode_set ) { ffc11720: 7c 08 02 a6 mflr r0 ffc11724: 94 21 ff f8 stwu r1,-8(r1) ffc11728: 90 01 00 0c stw r0,12(r1) ffc1172c: 7c 60 1b 78 mr r0,r3 bool is_asr_enabled = false; bool needs_asr_dispatching = false; rtems_mode old_mode; if ( !previous_mode_set ) return RTEMS_INVALID_ADDRESS; ffc11730: 38 60 00 09 li r3,9 ASR_Information *asr; bool is_asr_enabled = false; bool needs_asr_dispatching = false; rtems_mode old_mode; if ( !previous_mode_set ) ffc11734: 41 82 01 8c beq- ffc118c0 return RTEMS_INVALID_ADDRESS; executing = _Thread_Executing; ffc11738: 3d 20 00 00 lis r9,0 ffc1173c: 81 69 31 f0 lwz r11,12784(r9) api = executing->API_Extensions[ THREAD_API_RTEMS ]; asr = &api->Signal; old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT; if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE ) ffc11740: 81 0b 00 7c lwz r8,124(r11) executing = _Thread_Executing; api = executing->API_Extensions[ THREAD_API_RTEMS ]; asr = &api->Signal; old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT; ffc11744: 89 4b 00 74 lbz r10,116(r11) if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE ) ffc11748: 2f 88 00 00 cmpwi cr7,r8,0 if ( !previous_mode_set ) return RTEMS_INVALID_ADDRESS; executing = _Thread_Executing; api = executing->API_Extensions[ THREAD_API_RTEMS ]; ffc1174c: 81 2b 01 30 lwz r9,304(r11) asr = &api->Signal; old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT; ffc11750: 7d 4a 00 34 cntlzw r10,r10 ffc11754: 55 4a d9 7e rlwinm r10,r10,27,5,31 ffc11758: 55 4a 40 2e rlwinm r10,r10,8,0,23 if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE ) ffc1175c: 41 9e 00 08 beq- cr7,ffc11764 old_mode |= RTEMS_NO_TIMESLICE; else old_mode |= RTEMS_TIMESLICE; ffc11760: 61 4a 02 00 ori r10,r10,512 old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR; ffc11764: 89 09 00 08 lbz r8,8(r9) ffc11768: 7d 08 00 34 cntlzw r8,r8 ffc1176c: 55 08 d9 7e rlwinm r8,r8,27,5,31 ffc11770: 55 08 50 2a rlwinm r8,r8,10,0,21 ffc11774: 7d 08 53 78 or r8,r8,r10 #ifndef ASM static inline uint32_t _CPU_ISR_Get_level( void ) { register unsigned int msr; _CPU_MSR_GET(msr); ffc11778: 39 40 00 00 li r10,0 ffc1177c: 7d 40 00 a6 mfmsr r10 if (msr & MSR_EE) return 0; ffc11780: 71 47 80 00 andi. r7,r10,32768 ffc11784: 7c e0 00 26 mfcr r7 ffc11788: 54 e7 1f fe rlwinm r7,r7,3,31,31 old_mode |= _ISR_Get_level(); ffc1178c: 7d 0a 3b 78 or r10,r8,r7 *previous_mode_set = old_mode; ffc11790: 91 45 00 00 stw r10,0(r5) /* * These are generic thread scheduling characteristics. */ if ( mask & RTEMS_PREEMPT_MASK ) ffc11794: 70 8a 01 00 andi. r10,r4,256 ffc11798: 41 82 00 14 beq- ffc117ac executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false; ffc1179c: 70 07 01 00 andi. r7,r0,256 ffc117a0: 7d 40 00 26 mfcr r10 ffc117a4: 55 4a 1f fe rlwinm r10,r10,3,31,31 ffc117a8: 99 4b 00 74 stb r10,116(r11) if ( mask & RTEMS_TIMESLICE_MASK ) { ffc117ac: 70 8a 02 00 andi. r10,r4,512 ffc117b0: 41 82 00 28 beq- ffc117d8 if ( _Modes_Is_timeslice(mode_set) ) { ffc117b4: 70 0a 02 00 andi. r10,r0,512 ffc117b8: 41 82 00 1c beq- ffc117d4 executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; ffc117bc: 39 40 00 01 li r10,1 ffc117c0: 91 4b 00 7c stw r10,124(r11) executing->cpu_time_budget = _Thread_Ticks_per_timeslice; ffc117c4: 3d 40 00 00 lis r10,0 ffc117c8: 81 4a 28 00 lwz r10,10240(r10) ffc117cc: 91 4b 00 78 stw r10,120(r11) ffc117d0: 48 00 00 08 b ffc117d8 } else executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; ffc117d4: 91 4b 00 7c stw r10,124(r11) } /* * Set the new interrupt level */ if ( mask & RTEMS_INTERRUPT_MASK ) ffc117d8: 70 8b 00 01 andi. r11,r4,1 ffc117dc: 41 82 00 2c beq- ffc11808 } static inline void _CPU_ISR_Set_level( uint32_t level ) { register unsigned int msr; _CPU_MSR_GET(msr); ffc117e0: 39 60 00 00 li r11,0 ffc117e4: 7d 60 00 a6 mfmsr r11 if (!(level & CPU_MODES_INTERRUPT_MASK)) { ffc117e8: 70 07 00 01 andi. r7,r0,1 ffc117ec: 40 82 00 10 bne- ffc117fc static inline uint32_t ppc_interrupt_get_disable_mask( void ) { uint32_t mask; __asm__ volatile ( ffc117f0: 7d 50 42 a6 mfsprg r10,0 msr |= ppc_interrupt_get_disable_mask(); ffc117f4: 7d 4b 5b 78 or r11,r10,r11 ffc117f8: 48 00 00 0c b ffc11804 ffc117fc: 7d 50 42 a6 mfsprg r10,0 } else { msr &= ~ppc_interrupt_get_disable_mask(); ffc11800: 7d 6b 50 78 andc r11,r11,r10 } _CPU_MSR_SET(msr); ffc11804: 7d 60 01 24 mtmsr r11 * This is specific to the RTEMS API */ is_asr_enabled = false; needs_asr_dispatching = false; if ( mask & RTEMS_ASR_MASK ) { ffc11808: 70 8a 04 00 andi. r10,r4,1024 /* * This is specific to the RTEMS API */ is_asr_enabled = false; needs_asr_dispatching = false; ffc1180c: 39 60 00 00 li r11,0 if ( mask & RTEMS_ASR_MASK ) { ffc11810: 41 82 00 58 beq- ffc11868 * Output: * *previous_mode_set - previous mode set * always return RTEMS_SUCCESSFUL; */ rtems_status_code rtems_task_mode( ffc11814: 70 07 04 00 andi. r7,r0,1024 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 ) { ffc11818: 89 49 00 08 lbz r10,8(r9) * Output: * *previous_mode_set - previous mode set * always return RTEMS_SUCCESSFUL; */ rtems_status_code rtems_task_mode( ffc1181c: 7c 00 00 26 mfcr r0 ffc11820: 54 00 1f fe rlwinm r0,r0,3,31,31 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 ) { ffc11824: 7f 8a 00 00 cmpw cr7,r10,r0 ffc11828: 41 9e 00 40 beq- cr7,ffc11868 asr->is_enabled = is_asr_enabled; ffc1182c: 98 09 00 08 stb r0,8(r9) static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc11830: 7c 00 00 a6 mfmsr r0 ffc11834: 7d 70 42 a6 mfsprg r11,0 ffc11838: 7c 0b 58 78 andc r11,r0,r11 ffc1183c: 7d 60 01 24 mtmsr r11 { rtems_signal_set _signals; ISR_Level _level; _ISR_Disable( _level ); _signals = information->signals_pending; ffc11840: 81 69 00 18 lwz r11,24(r9) information->signals_pending = information->signals_posted; ffc11844: 81 49 00 14 lwz r10,20(r9) information->signals_posted = _signals; ffc11848: 91 69 00 14 stw r11,20(r9) rtems_signal_set _signals; ISR_Level _level; _ISR_Disable( _level ); _signals = information->signals_pending; information->signals_pending = information->signals_posted; ffc1184c: 91 49 00 18 stw r10,24(r9) return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc11850: 7c 00 01 24 mtmsr r0 _ASR_Swap_signals( asr ); if ( _ASR_Are_signals_pending( asr ) ) { ffc11854: 80 09 00 14 lwz r0,20(r9) needs_asr_dispatching = true; ffc11858: 39 60 00 01 li r11,1 if ( mask & RTEMS_ASR_MASK ) { is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true; if ( is_asr_enabled != asr->is_enabled ) { asr->is_enabled = is_asr_enabled; _ASR_Swap_signals( asr ); if ( _ASR_Are_signals_pending( asr ) ) { ffc1185c: 2f 80 00 00 cmpwi cr7,r0,0 ffc11860: 40 9e 00 08 bne- cr7,ffc11868 /* * This is specific to the RTEMS API */ is_asr_enabled = false; needs_asr_dispatching = false; ffc11864: 39 60 00 00 li r11,0 needs_asr_dispatching = true; } } } if ( _System_state_Is_up( _System_state_Get() ) ) { ffc11868: 3d 20 00 00 lis r9,0 ffc1186c: 80 09 28 48 lwz r0,10312(r9) if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) ) _Thread_Dispatch(); } return RTEMS_SUCCESSFUL; ffc11870: 38 60 00 00 li r3,0 needs_asr_dispatching = true; } } } if ( _System_state_Is_up( _System_state_Get() ) ) { ffc11874: 2f 80 00 03 cmpwi cr7,r0,3 ffc11878: 40 be 00 48 bne+ cr7,ffc118c0 { Thread_Control *executing; executing = _Thread_Executing; if ( are_signals_pending || ffc1187c: 2f 8b 00 00 cmpwi cr7,r11,0 bool are_signals_pending ) { Thread_Control *executing; executing = _Thread_Executing; ffc11880: 3d 40 00 00 lis r10,0 ffc11884: 39 4a 31 e4 addi r10,r10,12772 ffc11888: 81 2a 00 0c lwz r9,12(r10) if ( are_signals_pending || ffc1188c: 40 9e 00 1c bne- cr7,ffc118a8 ffc11890: 80 0a 00 10 lwz r0,16(r10) ffc11894: 7f 89 00 00 cmpw cr7,r9,r0 ffc11898: 41 9e 00 28 beq- cr7,ffc118c0 (!_Thread_Is_heir( executing ) && executing->is_preemptible) ) { ffc1189c: 88 09 00 74 lbz r0,116(r9) ffc118a0: 2f 80 00 00 cmpwi cr7,r0,0 ffc118a4: 41 9e 00 1c beq- cr7,ffc118c0 <== NEVER TAKEN _Thread_Dispatch_necessary = true; ffc118a8: 3d 20 00 00 lis r9,0 ffc118ac: 38 00 00 01 li r0,1 ffc118b0: 39 29 31 e4 addi r9,r9,12772 ffc118b4: 98 09 00 18 stb r0,24(r9) if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) ) _Thread_Dispatch(); ffc118b8: 4b ff 9a bd bl ffc0b374 <_Thread_Dispatch> } return RTEMS_SUCCESSFUL; ffc118bc: 38 60 00 00 li r3,0 } ffc118c0: 80 01 00 0c lwz r0,12(r1) ffc118c4: 38 21 00 08 addi r1,r1,8 ffc118c8: 7c 08 03 a6 mtlr r0 ffc118cc: 4e 80 00 20 blr =============================================================================== ffc0c590 : rtems_status_code rtems_task_set_priority( rtems_id id, rtems_task_priority new_priority, rtems_task_priority *old_priority ) { ffc0c590: 94 21 ff e0 stwu r1,-32(r1) ffc0c594: 7c 08 02 a6 mflr r0 ffc0c598: bf c1 00 18 stmw r30,24(r1) register Thread_Control *the_thread; Objects_Locations location; if ( new_priority != RTEMS_CURRENT_PRIORITY && ffc0c59c: 7c 9f 23 79 mr. r31,r4 rtems_status_code rtems_task_set_priority( rtems_id id, rtems_task_priority new_priority, rtems_task_priority *old_priority ) { ffc0c5a0: 7c be 2b 78 mr r30,r5 ffc0c5a4: 90 01 00 24 stw r0,36(r1) register Thread_Control *the_thread; Objects_Locations location; if ( new_priority != RTEMS_CURRENT_PRIORITY && ffc0c5a8: 41 82 00 18 beq- ffc0c5c0 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 ) ); ffc0c5ac: 3d 20 00 00 lis r9,0 ffc0c5b0: 89 29 27 44 lbz r9,10052(r9) !_RTEMS_tasks_Priority_is_valid( new_priority ) ) return RTEMS_INVALID_PRIORITY; ffc0c5b4: 38 00 00 13 li r0,19 ) { register Thread_Control *the_thread; Objects_Locations location; if ( new_priority != RTEMS_CURRENT_PRIORITY && ffc0c5b8: 7f 9f 48 40 cmplw cr7,r31,r9 ffc0c5bc: 41 9d 00 6c bgt- cr7,ffc0c628 !_RTEMS_tasks_Priority_is_valid( new_priority ) ) return RTEMS_INVALID_PRIORITY; if ( !old_priority ) ffc0c5c0: 2f 9e 00 00 cmpwi cr7,r30,0 return RTEMS_INVALID_ADDRESS; ffc0c5c4: 38 00 00 09 li r0,9 if ( new_priority != RTEMS_CURRENT_PRIORITY && !_RTEMS_tasks_Priority_is_valid( new_priority ) ) return RTEMS_INVALID_PRIORITY; if ( !old_priority ) ffc0c5c8: 41 9e 00 60 beq- cr7,ffc0c628 return RTEMS_INVALID_ADDRESS; the_thread = _Thread_Get( id, &location ); ffc0c5cc: 38 81 00 08 addi r4,r1,8 ffc0c5d0: 48 00 26 b5 bl ffc0ec84 <_Thread_Get> switch ( location ) { ffc0c5d4: 80 01 00 08 lwz r0,8(r1) ffc0c5d8: 2f 80 00 00 cmpwi cr7,r0,0 ffc0c5dc: 40 9e 00 48 bne- cr7,ffc0c624 case OBJECTS_LOCAL: /* XXX need helper to "convert" from core priority */ *old_priority = the_thread->current_priority; if ( new_priority != RTEMS_CURRENT_PRIORITY ) { ffc0c5e0: 2f 9f 00 00 cmpwi cr7,r31,0 the_thread = _Thread_Get( id, &location ); switch ( location ) { case OBJECTS_LOCAL: /* XXX need helper to "convert" from core priority */ *old_priority = the_thread->current_priority; ffc0c5e4: 80 03 00 14 lwz r0,20(r3) ffc0c5e8: 90 1e 00 00 stw r0,0(r30) if ( new_priority != RTEMS_CURRENT_PRIORITY ) { ffc0c5ec: 41 9e 00 2c beq- cr7,ffc0c618 the_thread->real_priority = new_priority; if ( the_thread->resource_count == 0 || ffc0c5f0: 80 03 00 1c lwz r0,28(r3) case OBJECTS_LOCAL: /* XXX need helper to "convert" from core priority */ *old_priority = the_thread->current_priority; if ( new_priority != RTEMS_CURRENT_PRIORITY ) { the_thread->real_priority = new_priority; ffc0c5f4: 93 e3 00 18 stw r31,24(r3) if ( the_thread->resource_count == 0 || ffc0c5f8: 2f 80 00 00 cmpwi cr7,r0,0 ffc0c5fc: 41 9e 00 10 beq- cr7,ffc0c60c ffc0c600: 80 03 00 14 lwz r0,20(r3) ffc0c604: 7f 80 f8 40 cmplw cr7,r0,r31 ffc0c608: 40 9d 00 10 ble- cr7,ffc0c618 <== ALWAYS TAKEN the_thread->current_priority > new_priority ) _Thread_Change_priority( the_thread, new_priority, false ); ffc0c60c: 7f e4 fb 78 mr r4,r31 ffc0c610: 38 a0 00 00 li r5,0 ffc0c614: 48 00 21 89 bl ffc0e79c <_Thread_Change_priority> } _Thread_Enable_dispatch(); ffc0c618: 48 00 26 4d bl ffc0ec64 <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; ffc0c61c: 38 00 00 00 li r0,0 ffc0c620: 48 00 00 08 b ffc0c628 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; ffc0c624: 38 00 00 04 li r0,4 } ffc0c628: 39 61 00 20 addi r11,r1,32 ffc0c62c: 7c 03 03 78 mr r3,r0 ffc0c630: 4b ff 4a f0 b ffc01120 <_restgpr_30_x> =============================================================================== ffc06720 : } } rtems_status_code rtems_termios_close (void *arg) { ffc06720: 94 21 ff f0 stwu r1,-16(r1) ffc06724: 7c 08 02 a6 mflr r0 rtems_libio_open_close_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; rtems_status_code sc; sc = rtems_semaphore_obtain( ffc06728: 38 80 00 00 li r4,0 } } rtems_status_code rtems_termios_close (void *arg) { ffc0672c: 90 01 00 14 stw r0,20(r1) rtems_libio_open_close_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; rtems_status_code sc; sc = rtems_semaphore_obtain( ffc06730: 38 a0 00 00 li r5,0 rtems_status_code rtems_termios_close (void *arg) { rtems_libio_open_close_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; ffc06734: 81 23 00 00 lwz r9,0(r3) } } rtems_status_code rtems_termios_close (void *arg) { ffc06738: bf c1 00 08 stmw r30,8(r1) ffc0673c: 7c 7e 1b 78 mr r30,r3 rtems_libio_open_close_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; ffc06740: 83 e9 00 38 lwz r31,56(r9) rtems_status_code sc; sc = rtems_semaphore_obtain( ffc06744: 3d 20 00 00 lis r9,0 ffc06748: 80 69 27 f4 lwz r3,10228(r9) ffc0674c: 48 00 22 d9 bl ffc08a24 rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) ffc06750: 2f 83 00 00 cmpwi cr7,r3,0 ffc06754: 40 9e 00 a4 bne- cr7,ffc067f8 <== NEVER TAKEN rtems_fatal_error_occurred (sc); if (--tty->refcount == 0) { ffc06758: 81 3f 00 08 lwz r9,8(r31) ffc0675c: 38 09 ff ff addi r0,r9,-1 ffc06760: 2f 80 00 00 cmpwi cr7,r0,0 ffc06764: 90 1f 00 08 stw r0,8(r31) ffc06768: 40 9e 01 64 bne- cr7,ffc068cc if (rtems_termios_linesw[tty->t_line].l_close != NULL) { ffc0676c: 80 1f 00 cc lwz r0,204(r31) ffc06770: 3d 20 00 00 lis r9,0 ffc06774: 39 29 28 fc addi r9,r9,10492 ffc06778: 54 00 28 34 rlwinm r0,r0,5,0,26 ffc0677c: 7d 29 02 14 add r9,r9,r0 ffc06780: 80 09 00 04 lwz r0,4(r9) ffc06784: 2f 80 00 00 cmpwi cr7,r0,0 ffc06788: 41 9e 00 14 beq- cr7,ffc0679c /* * call discipline-specific close */ sc = rtems_termios_linesw[tty->t_line].l_close(tty); ffc0678c: 7f e3 fb 78 mr r3,r31 ffc06790: 7c 09 03 a6 mtctr r0 ffc06794: 4e 80 04 21 bctrl ffc06798: 48 00 00 2c b ffc067c4 } else { /* * default: just flush output buffer */ sc = rtems_semaphore_obtain(tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); ffc0679c: 80 7f 00 18 lwz r3,24(r31) ffc067a0: 38 80 00 00 li r4,0 ffc067a4: 38 a0 00 00 li r5,0 ffc067a8: 48 00 22 7d bl ffc08a24 if (sc != RTEMS_SUCCESSFUL) { ffc067ac: 2f 83 00 00 cmpwi cr7,r3,0 ffc067b0: 40 9e 00 48 bne- cr7,ffc067f8 <== NEVER TAKEN rtems_fatal_error_occurred (sc); } drainOutput (tty); ffc067b4: 7f e3 fb 78 mr r3,r31 ffc067b8: 4b ff fa dd bl ffc06294 rtems_semaphore_release (tty->osem); ffc067bc: 80 7f 00 18 lwz r3,24(r31) ffc067c0: 48 00 23 8d bl ffc08b4c } if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { ffc067c4: 80 1f 00 b4 lwz r0,180(r31) ffc067c8: 2f 80 00 02 cmpwi cr7,r0,2 ffc067cc: 40 be 00 30 bne+ cr7,ffc067fc /* * send "terminate" to I/O tasks */ sc = rtems_event_send( tty->rxTaskId, TERMIOS_RX_TERMINATE_EVENT ); ffc067d0: 80 7f 00 c4 lwz r3,196(r31) ffc067d4: 38 80 00 01 li r4,1 ffc067d8: 48 00 1d 8d bl ffc08564 if (sc != RTEMS_SUCCESSFUL) ffc067dc: 2f 83 00 00 cmpwi cr7,r3,0 ffc067e0: 40 9e 00 18 bne- cr7,ffc067f8 <== NEVER TAKEN rtems_fatal_error_occurred (sc); sc = rtems_event_send( tty->txTaskId, TERMIOS_TX_TERMINATE_EVENT ); ffc067e4: 80 7f 00 c8 lwz r3,200(r31) ffc067e8: 38 80 00 01 li r4,1 ffc067ec: 48 00 1d 79 bl ffc08564 if (sc != RTEMS_SUCCESSFUL) ffc067f0: 2f 83 00 00 cmpwi cr7,r3,0 ffc067f4: 41 be 00 08 beq+ cr7,ffc067fc <== ALWAYS TAKEN rtems_fatal_error_occurred (sc); ffc067f8: 48 00 29 ad bl ffc091a4 <== NOT EXECUTED } if (tty->device.lastClose) ffc067fc: 80 1f 00 9c lwz r0,156(r31) ffc06800: 2f 80 00 00 cmpwi cr7,r0,0 ffc06804: 41 9e 00 18 beq- cr7,ffc0681c <== ALWAYS TAKEN (*tty->device.lastClose)(tty->major, tty->minor, arg); ffc06808: 80 7f 00 0c lwz r3,12(r31) <== NOT EXECUTED ffc0680c: 7f c5 f3 78 mr r5,r30 <== NOT EXECUTED ffc06810: 80 9f 00 10 lwz r4,16(r31) <== NOT EXECUTED ffc06814: 7c 09 03 a6 mtctr r0 <== NOT EXECUTED ffc06818: 4e 80 04 21 bctrl <== NOT EXECUTED if (tty->forw == NULL) { ffc0681c: 81 7f 00 00 lwz r11,0(r31) ffc06820: 81 3f 00 04 lwz r9,4(r31) ffc06824: 2f 8b 00 00 cmpwi cr7,r11,0 ffc06828: 40 be 00 1c bne+ cr7,ffc06844 rtems_termios_ttyTail = tty->back; if ( rtems_termios_ttyTail != NULL ) { ffc0682c: 2f 89 00 00 cmpwi cr7,r9,0 rtems_fatal_error_occurred (sc); } if (tty->device.lastClose) (*tty->device.lastClose)(tty->major, tty->minor, arg); if (tty->forw == NULL) { rtems_termios_ttyTail = tty->back; ffc06830: 3d 40 00 00 lis r10,0 ffc06834: 91 2a 27 f8 stw r9,10232(r10) if ( rtems_termios_ttyTail != NULL ) { ffc06838: 41 9e 00 10 beq- cr7,ffc06848 rtems_termios_ttyTail->forw = NULL; ffc0683c: 91 69 00 00 stw r11,0(r9) ffc06840: 48 00 00 08 b ffc06848 } } else { tty->forw->back = tty->back; ffc06844: 91 2b 00 04 stw r9,4(r11) } if (tty->back == NULL) { ffc06848: 81 7f 00 04 lwz r11,4(r31) ffc0684c: 81 3f 00 00 lwz r9,0(r31) ffc06850: 2f 8b 00 00 cmpwi cr7,r11,0 ffc06854: 40 be 00 1c bne+ cr7,ffc06870 rtems_termios_ttyHead = tty->forw; if ( rtems_termios_ttyHead != NULL ) { ffc06858: 2f 89 00 00 cmpwi cr7,r9,0 } else { tty->forw->back = tty->back; } if (tty->back == NULL) { rtems_termios_ttyHead = tty->forw; ffc0685c: 3d 40 00 00 lis r10,0 ffc06860: 91 2a 27 fc stw r9,10236(r10) if ( rtems_termios_ttyHead != NULL ) { ffc06864: 41 9e 00 10 beq- cr7,ffc06874 rtems_termios_ttyHead->back = NULL; ffc06868: 91 69 00 04 stw r11,4(r9) ffc0686c: 48 00 00 08 b ffc06874 } } else { tty->back->forw = tty->forw; ffc06870: 91 2b 00 00 stw r9,0(r11) } rtems_semaphore_delete (tty->isem); ffc06874: 80 7f 00 14 lwz r3,20(r31) ffc06878: 48 00 20 f5 bl ffc0896c rtems_semaphore_delete (tty->osem); ffc0687c: 80 7f 00 18 lwz r3,24(r31) ffc06880: 48 00 20 ed bl ffc0896c rtems_semaphore_delete (tty->rawOutBuf.Semaphore); ffc06884: 80 7f 00 8c lwz r3,140(r31) ffc06888: 48 00 20 e5 bl ffc0896c if ((tty->device.pollRead == NULL) || ffc0688c: 80 1f 00 a0 lwz r0,160(r31) ffc06890: 2f 80 00 00 cmpwi cr7,r0,0 ffc06894: 41 9e 00 10 beq- cr7,ffc068a4 ffc06898: 80 1f 00 b4 lwz r0,180(r31) ffc0689c: 2f 80 00 02 cmpwi cr7,r0,2 ffc068a0: 40 be 00 0c bne+ cr7,ffc068ac (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)) rtems_semaphore_delete (tty->rawInBuf.Semaphore); ffc068a4: 80 7f 00 68 lwz r3,104(r31) ffc068a8: 48 00 20 c5 bl ffc0896c free (tty->rawInBuf.theBuf); ffc068ac: 80 7f 00 58 lwz r3,88(r31) ffc068b0: 4b ff e8 81 bl ffc05130 free (tty->rawOutBuf.theBuf); ffc068b4: 80 7f 00 7c lwz r3,124(r31) ffc068b8: 4b ff e8 79 bl ffc05130 free (tty->cbuf); ffc068bc: 80 7f 00 1c lwz r3,28(r31) ffc068c0: 4b ff e8 71 bl ffc05130 free (tty); ffc068c4: 7f e3 fb 78 mr r3,r31 ffc068c8: 4b ff e8 69 bl ffc05130 } rtems_semaphore_release (rtems_termios_ttyMutex); ffc068cc: 3d 20 00 00 lis r9,0 ffc068d0: 80 69 27 f4 lwz r3,10228(r9) ffc068d4: 48 00 22 79 bl ffc08b4c return RTEMS_SUCCESSFUL; } ffc068d8: 39 61 00 10 addi r11,r1,16 ffc068dc: 38 60 00 00 li r3,0 ffc068e0: 48 01 28 cc b ffc191ac <_restgpr_30_x> =============================================================================== ffc07e5c : * for each transmitted character. * It returns number of characters left to transmit */ int rtems_termios_dequeue_characters (void *ttyp, int len) { ffc07e5c: 94 21 ff f8 stwu r1,-8(r1) ffc07e60: 7c 08 02 a6 mflr r0 ffc07e64: 90 01 00 0c stw r0,12(r1) rtems_status_code sc; /* * sum up character count already sent */ tty->t_dqlen += len; ffc07e68: 80 03 00 90 lwz r0,144(r3) ffc07e6c: 7c 00 22 14 add r0,r0,r4 ffc07e70: 90 03 00 90 stw r0,144(r3) if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { ffc07e74: 80 03 00 b4 lwz r0,180(r3) ffc07e78: 2f 80 00 02 cmpwi cr7,r0,2 ffc07e7c: 40 be 00 1c bne+ cr7,ffc07e98 /* * send wake up to transmitter task */ sc = rtems_event_send(tty->txTaskId, TERMIOS_TX_START_EVENT); ffc07e80: 80 63 00 c8 lwz r3,200(r3) ffc07e84: 38 80 00 02 li r4,2 ffc07e88: 48 00 06 dd bl ffc08564 if (sc != RTEMS_SUCCESSFUL) ffc07e8c: 2f 83 00 00 cmpwi cr7,r3,0 ffc07e90: 41 be 00 40 beq+ cr7,ffc07ed0 <== ALWAYS TAKEN rtems_fatal_error_occurred (sc); ffc07e94: 48 00 13 11 bl ffc091a4 <== NOT EXECUTED return 0; /* nothing to output in IRQ... */ } if (tty->t_line == PPPDISC ) { ffc07e98: 80 03 00 cc lwz r0,204(r3) ffc07e9c: 2f 80 00 05 cmpwi cr7,r0,5 ffc07ea0: 40 9e 00 20 bne- cr7,ffc07ec0 /* * call any line discipline start function */ if (rtems_termios_linesw[tty->t_line].l_start != NULL) { ffc07ea4: 3d 20 00 00 lis r9,0 ffc07ea8: 80 09 29 b0 lwz r0,10672(r9) ffc07eac: 2f 80 00 00 cmpwi cr7,r0,0 ffc07eb0: 41 9e 00 20 beq- cr7,ffc07ed0 <== NEVER TAKEN rtems_termios_linesw[tty->t_line].l_start(tty); ffc07eb4: 7c 09 03 a6 mtctr r0 ffc07eb8: 4e 80 04 21 bctrl ffc07ebc: 48 00 00 14 b ffc07ed0 } return 0; /* nothing to output in IRQ... */ } return rtems_termios_refill_transmitter(tty); } ffc07ec0: 80 01 00 0c lwz r0,12(r1) ffc07ec4: 38 21 00 08 addi r1,r1,8 ffc07ec8: 7c 08 03 a6 mtlr r0 rtems_termios_linesw[tty->t_line].l_start(tty); } return 0; /* nothing to output in IRQ... */ } return rtems_termios_refill_transmitter(tty); ffc07ecc: 4b ff fd 28 b ffc07bf4 } ffc07ed0: 80 01 00 0c lwz r0,12(r1) ffc07ed4: 38 60 00 00 li r3,0 ffc07ed8: 38 21 00 08 addi r1,r1,8 ffc07edc: 7c 08 03 a6 mtlr r0 ffc07ee0: 4e 80 00 20 blr =============================================================================== ffc07894 : * 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) { ffc07894: 94 21 ff d0 stwu r1,-48(r1) ffc07898: 7c 08 02 a6 mflr r0 ffc0789c: 90 01 00 34 stw r0,52(r1) 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) { ffc078a0: 81 23 00 cc lwz r9,204(r3) * 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) { ffc078a4: be c1 00 08 stmw r22,8(r1) 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) { ffc078a8: 3f c0 00 00 lis r30,0 ffc078ac: 3b de 28 fc addi r30,r30,10492 ffc078b0: 55 29 28 34 rlwinm r9,r9,5,0,26 ffc078b4: 7d 3e 4a 14 add r9,r30,r9 ffc078b8: 80 09 00 10 lwz r0,16(r9) * 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) { ffc078bc: 7c 7f 1b 78 mr r31,r3 ffc078c0: 7c bc 2b 78 mr r28,r5 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) { ffc078c4: 2f 80 00 00 cmpwi cr7,r0,0 ffc078c8: 3b 24 ff ff addi r25,r4,-1 ffc078cc: 40 be 00 3c bne+ cr7,ffc07908 * NOTE: This routine runs in the context of the * 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) ffc078d0: 3b 40 00 00 li r26,0 ffc078d4: 3b c0 00 00 li r30,0 /* * 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); ffc078d8: 3a e3 00 30 addi r23,r3,48 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, ffc078dc: 3b 03 00 4a addi r24,r3,74 ffc078e0: 48 00 02 70 b ffc07b50 rtems_interrupt_level level; if (rtems_termios_linesw[tty->t_line].l_rint != NULL) { while (len--) { c = *buf++; rtems_termios_linesw[tty->t_line].l_rint(c,tty); ffc078e4: 81 3f 00 cc lwz r9,204(r31) ffc078e8: 7f e4 fb 78 mr r4,r31 ffc078ec: 8c 79 00 01 lbzu r3,1(r25) ffc078f0: 3b 9c ff ff addi r28,r28,-1 ffc078f4: 55 29 28 34 rlwinm r9,r9,5,0,26 ffc078f8: 7d 3e 4a 14 add r9,r30,r9 ffc078fc: 80 09 00 10 lwz r0,16(r9) ffc07900: 7c 09 03 a6 mtctr r0 ffc07904: 4e 80 04 21 bctrl 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--) { ffc07908: 2f 9c 00 00 cmpwi cr7,r28,0 ffc0790c: 40 9e ff d8 bne+ cr7,ffc078e4 } /* * check to see if rcv wakeup callback was set */ if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) { ffc07910: 80 1f 00 e4 lwz r0,228(r31) (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg); tty->tty_rcvwakeup = 1; } return 0; ffc07914: 3b c0 00 00 li r30,0 } /* * check to see if rcv wakeup callback was set */ if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) { ffc07918: 2f 80 00 00 cmpwi cr7,r0,0 ffc0791c: 40 9e 02 50 bne- cr7,ffc07b6c <== NEVER TAKEN ffc07920: 80 1f 00 dc lwz r0,220(r31) (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg); tty->tty_rcvwakeup = 1; } return 0; ffc07924: 7f 9e e3 78 mr r30,r28 } /* * check to see if rcv wakeup callback was set */ if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) { ffc07928: 2f 80 00 00 cmpwi cr7,r0,0 ffc0792c: 41 9e 02 40 beq- cr7,ffc07b6c (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg); ffc07930: 7c 09 03 a6 mtctr r0 ffc07934: 38 7f 00 30 addi r3,r31,48 ffc07938: 80 9f 00 e0 lwz r4,224(r31) ffc0793c: 4e 80 04 21 bctrl tty->tty_rcvwakeup = 1; ffc07940: 38 00 00 01 li r0,1 ffc07944: 90 1f 00 e4 stw r0,228(r31) ffc07948: 48 00 02 24 b ffc07b6c while (len--) { c = *buf++; /* FIXME: implement IXANY: any character restarts output */ /* if incoming XON/XOFF controls outgoing stream: */ if (tty->flow_ctrl & FL_MDXON) { ffc0794c: 80 1f 00 b8 lwz r0,184(r31) } return 0; } while (len--) { c = *buf++; ffc07950: 8f 79 00 01 lbzu r27,1(r25) /* FIXME: implement IXANY: any character restarts output */ /* if incoming XON/XOFF controls outgoing stream: */ if (tty->flow_ctrl & FL_MDXON) { ffc07954: 70 09 02 00 andi. r9,r0,512 ffc07958: 41 82 00 58 beq- ffc079b0 /* if received char is V_STOP and V_START (both are equal value) */ if (c == tty->termios.c_cc[VSTOP]) { ffc0795c: 89 3f 00 4a lbz r9,74(r31) ffc07960: 88 1f 00 49 lbz r0,73(r31) ffc07964: 7f 89 d8 00 cmpw cr7,r9,r27 ffc07968: 40 be 00 30 bne+ cr7,ffc07998 if (c == tty->termios.c_cc[VSTART]) { ffc0796c: 54 00 06 3e clrlwi r0,r0,24 ffc07970: 7f 80 48 00 cmpw cr7,r0,r9 ffc07974: 40 be 00 10 bne+ cr7,ffc07984 <== ALWAYS TAKEN /* received VSTOP and VSTART==VSTOP? */ /* then toggle "stop output" status */ tty->flow_ctrl = tty->flow_ctrl ^ FL_ORCVXOF; ffc07978: 80 1f 00 b8 lwz r0,184(r31) <== NOT EXECUTED ffc0797c: 68 00 00 10 xori r0,r0,16 <== NOT EXECUTED ffc07980: 48 00 00 0c b ffc0798c <== NOT EXECUTED } else { /* VSTOP received (other code than VSTART) */ /* stop output */ tty->flow_ctrl |= FL_ORCVXOF; ffc07984: 80 1f 00 b8 lwz r0,184(r31) ffc07988: 60 00 00 10 ori r0,r0,16 ffc0798c: 90 1f 00 b8 stw r0,184(r31) * 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) { ffc07990: 3b 40 00 01 li r26,1 ffc07994: 48 00 00 24 b ffc079b8 /* stop output */ tty->flow_ctrl |= FL_ORCVXOF; } flow_rcv = true; } else if (c == tty->termios.c_cc[VSTART]) { ffc07998: 54 00 06 3e clrlwi r0,r0,24 ffc0799c: 7f 80 d8 00 cmpw cr7,r0,r27 ffc079a0: 40 be 00 10 bne+ cr7,ffc079b0 <== ALWAYS TAKEN /* VSTART received */ /* restart output */ tty->flow_ctrl &= ~FL_ORCVXOF; ffc079a4: 80 1f 00 b8 lwz r0,184(r31) <== NOT EXECUTED ffc079a8: 54 00 07 34 rlwinm r0,r0,0,28,26 <== NOT EXECUTED ffc079ac: 4b ff ff e0 b ffc0798c <== NOT EXECUTED flow_rcv = true; } } if (flow_rcv) { ffc079b0: 2f 9a 00 00 cmpwi cr7,r26,0 ffc079b4: 41 9e 00 5c beq- cr7,ffc07a10 <== ALWAYS TAKEN /* restart output according to FL_ORCVXOF flag */ if ((tty->flow_ctrl & (FL_ORCVXOF | FL_OSTOP)) == FL_OSTOP) { ffc079b8: 80 1f 00 b8 lwz r0,184(r31) ffc079bc: 54 00 06 b6 rlwinm r0,r0,0,26,27 ffc079c0: 2f 80 00 20 cmpwi cr7,r0,32 ffc079c4: 40 be 01 88 bne+ cr7,ffc07b4c <== ALWAYS TAKEN /* disable interrupts */ rtems_interrupt_disable(level); ffc079c8: 4b ff e8 b9 bl ffc06280 <== NOT EXECUTED ffc079cc: 7c 7d 1b 78 mr r29,r3 <== NOT EXECUTED tty->flow_ctrl &= ~FL_OSTOP; ffc079d0: 80 1f 00 b8 lwz r0,184(r31) <== NOT EXECUTED ffc079d4: 54 00 06 f2 rlwinm r0,r0,0,27,25 <== NOT EXECUTED ffc079d8: 90 1f 00 b8 stw r0,184(r31) <== NOT EXECUTED /* check for chars in output buffer (or rob_state?) */ if (tty->rawOutBufState != rob_idle) { ffc079dc: 80 1f 00 94 lwz r0,148(r31) <== NOT EXECUTED ffc079e0: 2f 80 00 00 cmpwi cr7,r0,0 <== NOT EXECUTED ffc079e4: 41 be 00 24 beq+ cr7,ffc07a08 <== NOT EXECUTED /* if chars available, call write function... */ (*tty->device.write)( tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail], 1); ffc079e8: 81 3f 00 84 lwz r9,132(r31) <== 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)( ffc079ec: 38 a0 00 01 li r5,1 <== NOT EXECUTED ffc079f0: 80 9f 00 7c lwz r4,124(r31) <== NOT EXECUTED ffc079f4: 80 1f 00 a4 lwz r0,164(r31) <== NOT EXECUTED ffc079f8: 80 7f 00 10 lwz r3,16(r31) <== NOT EXECUTED ffc079fc: 7c 84 4a 14 add r4,r4,r9 <== NOT EXECUTED ffc07a00: 7c 09 03 a6 mtctr r0 <== NOT EXECUTED ffc07a04: 4e 80 04 21 bctrl <== NOT EXECUTED ffc07a08: 7f a0 01 24 mtmsr r29 <== NOT EXECUTED ffc07a0c: 48 00 01 40 b ffc07b4c <== NOT EXECUTED } /* reenable interrupts */ rtems_interrupt_enable(level); } } else { newTail = (tty->rawInBuf.Tail + 1) % tty->rawInBuf.Size; ffc07a10: 83 bf 00 60 lwz r29,96(r31) ffc07a14: 81 3f 00 64 lwz r9,100(r31) ffc07a18: 38 1d 00 01 addi r0,r29,1 ffc07a1c: 7f a0 4b 96 divwu r29,r0,r9 ffc07a20: 7f bd 49 d6 mullw r29,r29,r9 ffc07a24: 7f bd 00 50 subf r29,r29,r0 /* if chars_in_buffer > highwater */ rtems_interrupt_disable(level); ffc07a28: 4b ff e8 59 bl ffc06280 ffc07a2c: 7c 76 1b 78 mr r22,r3 if ((((newTail - tty->rawInBuf.Head + tty->rawInBuf.Size) ffc07a30: 80 1f 00 5c lwz r0,92(r31) ffc07a34: 81 7f 00 64 lwz r11,100(r31) % tty->rawInBuf.Size) > tty->highwater) && ffc07a38: 81 3f 00 64 lwz r9,100(r31) } } 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) ffc07a3c: 7c 00 58 50 subf r0,r0,r11 ffc07a40: 7c 00 ea 14 add r0,r0,r29 % tty->rawInBuf.Size) > tty->highwater) && ffc07a44: 7d 60 4b 96 divwu r11,r0,r9 ffc07a48: 7d 2b 49 d6 mullw r9,r11,r9 } } 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) ffc07a4c: 81 7f 00 c0 lwz r11,192(r31) % tty->rawInBuf.Size) > tty->highwater) && ffc07a50: 7c 09 00 50 subf r0,r9,r0 } } 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) ffc07a54: 7f 80 58 40 cmplw cr7,r0,r11 ffc07a58: 40 9d 00 a0 ble- cr7,ffc07af8 <== ALWAYS TAKEN % tty->rawInBuf.Size) > tty->highwater) && !(tty->flow_ctrl & FL_IREQXOF)) { ffc07a5c: 80 1f 00 b8 lwz r0,184(r31) <== 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) && ffc07a60: 70 09 00 01 andi. r9,r0,1 <== NOT EXECUTED ffc07a64: 40 82 00 94 bne- ffc07af8 <== NOT EXECUTED !(tty->flow_ctrl & FL_IREQXOF)) { /* incoming data stream should be stopped */ tty->flow_ctrl |= FL_IREQXOF; ffc07a68: 80 1f 00 b8 lwz r0,184(r31) <== NOT EXECUTED ffc07a6c: 60 00 00 01 ori r0,r0,1 <== NOT EXECUTED ffc07a70: 90 1f 00 b8 stw r0,184(r31) <== NOT EXECUTED if ((tty->flow_ctrl & (FL_MDXOF | FL_ISNTXOF)) ffc07a74: 80 1f 00 b8 lwz r0,184(r31) <== NOT EXECUTED ffc07a78: 70 00 04 02 andi. r0,r0,1026 <== NOT EXECUTED ffc07a7c: 2f 80 04 00 cmpwi cr7,r0,1024 <== NOT EXECUTED ffc07a80: 40 be 00 44 bne+ cr7,ffc07ac4 <== NOT EXECUTED == (FL_MDXOF ) ) { if ((tty->flow_ctrl & FL_OSTOP) || ffc07a84: 80 1f 00 b8 lwz r0,184(r31) <== NOT EXECUTED ffc07a88: 70 09 00 20 andi. r9,r0,32 <== NOT EXECUTED ffc07a8c: 40 82 00 10 bne- ffc07a9c <== NOT EXECUTED ffc07a90: 80 1f 00 94 lwz r0,148(r31) <== NOT EXECUTED ffc07a94: 2f 80 00 00 cmpwi cr7,r0,0 <== NOT EXECUTED ffc07a98: 40 9e 00 60 bne- cr7,ffc07af8 <== 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; ffc07a9c: 80 1f 00 b8 lwz r0,184(r31) <== NOT EXECUTED (*tty->device.write)(tty->minor, ffc07aa0: 7f 04 c3 78 mr r4,r24 <== NOT EXECUTED ffc07aa4: 80 7f 00 10 lwz r3,16(r31) <== NOT EXECUTED ffc07aa8: 38 a0 00 01 li r5,1 <== NOT EXECUTED == (FL_MDXOF ) ) { 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; ffc07aac: 60 00 00 02 ori r0,r0,2 <== NOT EXECUTED ffc07ab0: 90 1f 00 b8 stw r0,184(r31) <== NOT EXECUTED (*tty->device.write)(tty->minor, ffc07ab4: 80 1f 00 a4 lwz r0,164(r31) <== NOT EXECUTED ffc07ab8: 7c 09 03 a6 mtctr r0 <== NOT EXECUTED ffc07abc: 4e 80 04 21 bctrl <== NOT EXECUTED ffc07ac0: 48 00 00 38 b ffc07af8 <== NOT EXECUTED (void *)&(tty->termios.c_cc[VSTOP]), 1); } } else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) == (FL_MDRTS) ) { ffc07ac4: 80 1f 00 b8 lwz r0,184(r31) <== NOT EXECUTED ffc07ac8: 70 00 01 04 andi. r0,r0,260 <== NOT EXECUTED ffc07acc: 2f 80 01 00 cmpwi cr7,r0,256 <== NOT EXECUTED ffc07ad0: 40 be 00 28 bne+ cr7,ffc07af8 <== NOT EXECUTED tty->flow_ctrl |= FL_IRTSOFF; ffc07ad4: 80 1f 00 b8 lwz r0,184(r31) <== NOT EXECUTED ffc07ad8: 60 00 00 04 ori r0,r0,4 <== NOT EXECUTED ffc07adc: 90 1f 00 b8 stw r0,184(r31) <== NOT EXECUTED /* deactivate RTS line */ if (tty->device.stopRemoteTx != NULL) { ffc07ae0: 80 1f 00 ac lwz r0,172(r31) <== NOT EXECUTED ffc07ae4: 2f 80 00 00 cmpwi cr7,r0,0 <== NOT EXECUTED ffc07ae8: 41 9e 00 10 beq- cr7,ffc07af8 <== NOT EXECUTED tty->device.stopRemoteTx(tty->minor); ffc07aec: 80 7f 00 10 lwz r3,16(r31) <== NOT EXECUTED ffc07af0: 7c 09 03 a6 mtctr r0 <== NOT EXECUTED ffc07af4: 4e 80 04 21 bctrl <== NOT EXECUTED ffc07af8: 7e c0 01 24 mtmsr r22 } /* reenable interrupts */ rtems_interrupt_enable(level); if (newTail == tty->rawInBuf.Head) { ffc07afc: 80 1f 00 5c lwz r0,92(r31) ffc07b00: 7f 9d 00 00 cmpw cr7,r29,r0 ffc07b04: 40 be 00 0c bne+ cr7,ffc07b10 <== ALWAYS TAKEN dropped++; ffc07b08: 3b de 00 01 addi r30,r30,1 <== NOT EXECUTED ffc07b0c: 48 00 00 40 b ffc07b4c <== NOT EXECUTED } else { tty->rawInBuf.theBuf[newTail] = c; ffc07b10: 81 3f 00 58 lwz r9,88(r31) ffc07b14: 7f 69 e9 ae stbx r27,r9,r29 tty->rawInBuf.Tail = newTail; /* * check to see if rcv wakeup callback was set */ if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) { ffc07b18: 80 1f 00 e4 lwz r0,228(r31) if (newTail == tty->rawInBuf.Head) { dropped++; } else { tty->rawInBuf.theBuf[newTail] = c; tty->rawInBuf.Tail = newTail; ffc07b1c: 93 bf 00 60 stw r29,96(r31) /* * check to see if rcv wakeup callback was set */ if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) { ffc07b20: 2f 80 00 00 cmpwi cr7,r0,0 ffc07b24: 40 9e 00 28 bne- cr7,ffc07b4c <== NEVER TAKEN ffc07b28: 80 1f 00 dc lwz r0,220(r31) ffc07b2c: 2f 80 00 00 cmpwi cr7,r0,0 ffc07b30: 41 9e 00 1c beq- cr7,ffc07b4c <== ALWAYS TAKEN (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg); ffc07b34: 7c 09 03 a6 mtctr r0 <== NOT EXECUTED ffc07b38: 7e e3 bb 78 mr r3,r23 <== NOT EXECUTED ffc07b3c: 80 9f 00 e0 lwz r4,224(r31) <== NOT EXECUTED ffc07b40: 4e 80 04 21 bctrl <== NOT EXECUTED tty->tty_rcvwakeup = 1; ffc07b44: 38 00 00 01 li r0,1 <== NOT EXECUTED ffc07b48: 90 1f 00 e4 stw r0,228(r31) <== NOT EXECUTED ffc07b4c: 3b 9c ff ff addi r28,r28,-1 tty->tty_rcvwakeup = 1; } return 0; } while (len--) { ffc07b50: 2f 9c 00 00 cmpwi cr7,r28,0 ffc07b54: 40 9e fd f8 bne+ cr7,ffc0794c } } } } tty->rawInBufDropped += dropped; ffc07b58: 80 1f 00 78 lwz r0,120(r31) rtems_semaphore_release (tty->rawInBuf.Semaphore); ffc07b5c: 80 7f 00 68 lwz r3,104(r31) } } } } tty->rawInBufDropped += dropped; ffc07b60: 7c 00 f2 14 add r0,r0,r30 ffc07b64: 90 1f 00 78 stw r0,120(r31) rtems_semaphore_release (tty->rawInBuf.Semaphore); ffc07b68: 48 00 0f e5 bl ffc08b4c return dropped; } ffc07b6c: 39 61 00 30 addi r11,r1,48 ffc07b70: 7f c3 f3 78 mr r3,r30 ffc07b74: 48 01 16 18 b ffc1918c <_restgpr_22_x> =============================================================================== ffc06900 : } } rtems_status_code rtems_termios_ioctl (void *arg) { ffc06900: 94 21 ff e0 stwu r1,-32(r1) ffc06904: 7c 08 02 a6 mflr r0 struct rtems_termios_tty *tty = args->iop->data1; struct ttywakeup *wakeup = (struct ttywakeup *)args->buffer; rtems_status_code sc; args->ioctl_return = 0; sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); ffc06908: 38 80 00 00 li r4,0 } } rtems_status_code rtems_termios_ioctl (void *arg) { ffc0690c: 90 01 00 24 stw r0,36(r1) rtems_libio_ioctl_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; struct ttywakeup *wakeup = (struct ttywakeup *)args->buffer; rtems_status_code sc; args->ioctl_return = 0; ffc06910: 38 00 00 00 li r0,0 sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); ffc06914: 38 a0 00 00 li r5,0 rtems_status_code rtems_termios_ioctl (void *arg) { rtems_libio_ioctl_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; ffc06918: 81 23 00 00 lwz r9,0(r3) } } rtems_status_code rtems_termios_ioctl (void *arg) { ffc0691c: bf 61 00 0c stmw r27,12(r1) ffc06920: 7c 7e 1b 78 mr r30,r3 rtems_libio_ioctl_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; ffc06924: 83 e9 00 38 lwz r31,56(r9) struct ttywakeup *wakeup = (struct ttywakeup *)args->buffer; ffc06928: 83 83 00 08 lwz r28,8(r3) rtems_status_code sc; args->ioctl_return = 0; ffc0692c: 90 03 00 0c stw r0,12(r3) sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); ffc06930: 80 7f 00 18 lwz r3,24(r31) ffc06934: 48 00 20 f1 bl ffc08a24 if (sc != RTEMS_SUCCESSFUL) { ffc06938: 7c 7d 1b 79 mr. r29,r3 ffc0693c: 40 82 03 90 bne- ffc06ccc <== NEVER TAKEN args->ioctl_return = sc; return sc; } switch (args->command) { ffc06940: 80 1e 00 04 lwz r0,4(r30) ffc06944: 2f 80 00 04 cmpwi cr7,r0,4 ffc06948: 41 9e 02 bc beq- cr7,ffc06c04 ffc0694c: 2b 80 00 04 cmplwi cr7,r0,4 ffc06950: 41 9d 00 20 bgt- cr7,ffc06970 ffc06954: 2f 80 00 02 cmpwi cr7,r0,2 ffc06958: 41 9e 00 a0 beq- cr7,ffc069f8 ffc0695c: 2b 80 00 02 cmplwi cr7,r0,2 ffc06960: 41 9d 02 84 bgt- cr7,ffc06be4 ffc06964: 2f 80 00 01 cmpwi cr7,r0,1 ffc06968: 40 be 00 44 bne+ cr7,ffc069ac <== NEVER TAKEN ffc0696c: 48 00 00 78 b ffc069e4 ffc06970: 3d 20 40 04 lis r9,16388 ffc06974: 61 29 66 7f ori r9,r9,26239 ffc06978: 7f 80 48 00 cmpw cr7,r0,r9 ffc0697c: 41 9e 03 18 beq- cr7,ffc06c94 <== NEVER TAKEN ffc06980: 7f 80 48 40 cmplw cr7,r0,r9 ffc06984: 41 9d 00 10 bgt- cr7,ffc06994 ffc06988: 2f 80 00 05 cmpwi cr7,r0,5 ffc0698c: 40 be 00 20 bne+ cr7,ffc069ac ffc06990: 48 00 02 60 b ffc06bf0 ffc06994: 6c 09 40 04 xoris r9,r0,16388 ffc06998: 2f 89 74 1a cmpwi cr7,r9,29722 ffc0699c: 41 9e 02 ec beq- cr7,ffc06c88 ffc069a0: 6c 09 80 04 xoris r9,r0,32772 ffc069a4: 2f 89 74 1b cmpwi cr7,r9,29723 ffc069a8: 41 9e 02 70 beq- cr7,ffc06c18 <== ALWAYS TAKEN default: if (rtems_termios_linesw[tty->t_line].l_ioctl != NULL) { ffc069ac: 80 1f 00 cc lwz r0,204(r31) ffc069b0: 3d 20 00 00 lis r9,0 ffc069b4: 39 29 28 fc addi r9,r9,10492 ffc069b8: 54 00 28 34 rlwinm r0,r0,5,0,26 ffc069bc: 7d 29 02 14 add r9,r9,r0 ffc069c0: 80 09 00 18 lwz r0,24(r9) sc = rtems_termios_linesw[tty->t_line].l_ioctl(tty,args); } else { sc = RTEMS_INVALID_NUMBER; ffc069c4: 3b a0 00 0a li r29,10 args->ioctl_return = sc; return sc; } switch (args->command) { default: if (rtems_termios_linesw[tty->t_line].l_ioctl != NULL) { ffc069c8: 2f 80 00 00 cmpwi cr7,r0,0 ffc069cc: 41 9e 02 f8 beq- cr7,ffc06cc4 <== NEVER TAKEN sc = rtems_termios_linesw[tty->t_line].l_ioctl(tty,args); ffc069d0: 7f e3 fb 78 mr r3,r31 ffc069d4: 7c 09 03 a6 mtctr r0 ffc069d8: 7f c4 f3 78 mr r4,r30 ffc069dc: 4e 80 04 21 bctrl ffc069e0: 48 00 02 a0 b ffc06c80 sc = RTEMS_INVALID_NUMBER; } break; case RTEMS_IO_GET_ATTRIBUTES: *(struct termios *)args->buffer = tty->termios; ffc069e4: 80 7e 00 08 lwz r3,8(r30) ffc069e8: 38 9f 00 30 addi r4,r31,48 ffc069ec: 38 a0 00 24 li r5,36 ffc069f0: 48 00 e5 29 bl ffc14f18 break; ffc069f4: 48 00 02 d0 b ffc06cc4 case RTEMS_IO_SET_ATTRIBUTES: tty->termios = *(struct termios *)args->buffer; ffc069f8: 80 9e 00 08 lwz r4,8(r30) ffc069fc: 38 7f 00 30 addi r3,r31,48 ffc06a00: 38 a0 00 24 li r5,36 ffc06a04: 48 00 e5 15 bl ffc14f18 /* * check for flow control options to be switched off */ /* check for outgoing XON/XOFF flow control switched off */ if (( tty->flow_ctrl & FL_MDXON) && ffc06a08: 80 1f 00 b8 lwz r0,184(r31) ffc06a0c: 70 09 02 00 andi. r9,r0,512 ffc06a10: 41 82 00 70 beq- ffc06a80 !(tty->termios.c_iflag & IXON)) { ffc06a14: 80 1f 00 30 lwz r0,48(r31) /* * check for flow control options to be switched off */ /* check for outgoing XON/XOFF flow control switched off */ if (( tty->flow_ctrl & FL_MDXON) && ffc06a18: 70 0b 04 00 andi. r11,r0,1024 ffc06a1c: 40 82 00 64 bne- ffc06a80 !(tty->termios.c_iflag & IXON)) { /* clear related flags in flow_ctrl */ tty->flow_ctrl &= ~(FL_MDXON | FL_ORCVXOF); ffc06a20: 81 3f 00 b8 lwz r9,184(r31) ffc06a24: 38 00 fd ef li r0,-529 ffc06a28: 7d 20 00 38 and r0,r9,r0 ffc06a2c: 90 1f 00 b8 stw r0,184(r31) /* has output been stopped due to received XOFF? */ if (tty->flow_ctrl & FL_OSTOP) { ffc06a30: 80 1f 00 b8 lwz r0,184(r31) ffc06a34: 70 09 00 20 andi. r9,r0,32 ffc06a38: 41 a2 00 48 beq+ ffc06a80 <== ALWAYS TAKEN /* disable interrupts */ rtems_interrupt_disable(level); ffc06a3c: 4b ff f8 45 bl ffc06280 <== NOT EXECUTED ffc06a40: 7c 7c 1b 78 mr r28,r3 <== NOT EXECUTED tty->flow_ctrl &= ~FL_OSTOP; ffc06a44: 80 1f 00 b8 lwz r0,184(r31) <== NOT EXECUTED ffc06a48: 54 00 06 f2 rlwinm r0,r0,0,27,25 <== NOT EXECUTED ffc06a4c: 90 1f 00 b8 stw r0,184(r31) <== NOT EXECUTED /* check for chars in output buffer (or rob_state?) */ if (tty->rawOutBufState != rob_idle) { ffc06a50: 80 1f 00 94 lwz r0,148(r31) <== NOT EXECUTED ffc06a54: 2f 80 00 00 cmpwi cr7,r0,0 <== NOT EXECUTED ffc06a58: 41 be 00 24 beq+ cr7,ffc06a7c <== NOT EXECUTED /* if chars available, call write function... */ (*tty->device.write)( tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1); ffc06a5c: 81 3f 00 84 lwz r9,132(r31) <== 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)( ffc06a60: 38 a0 00 01 li r5,1 <== NOT EXECUTED ffc06a64: 80 9f 00 7c lwz r4,124(r31) <== NOT EXECUTED ffc06a68: 80 1f 00 a4 lwz r0,164(r31) <== NOT EXECUTED ffc06a6c: 80 7f 00 10 lwz r3,16(r31) <== NOT EXECUTED ffc06a70: 7c 84 4a 14 add r4,r4,r9 <== NOT EXECUTED ffc06a74: 7c 09 03 a6 mtctr r0 <== NOT EXECUTED ffc06a78: 4e 80 04 21 bctrl <== NOT EXECUTED ffc06a7c: 7f 80 01 24 mtmsr r28 <== NOT EXECUTED /* reenable interrupts */ rtems_interrupt_enable(level); } } /* check for incoming XON/XOFF flow control switched off */ if (( tty->flow_ctrl & FL_MDXOF) && !(tty->termios.c_iflag & IXOFF)) { ffc06a80: 80 1f 00 b8 lwz r0,184(r31) ffc06a84: 70 09 04 00 andi. r9,r0,1024 ffc06a88: 41 82 00 28 beq- ffc06ab0 ffc06a8c: 80 1f 00 30 lwz r0,48(r31) ffc06a90: 70 0b 10 00 andi. r11,r0,4096 ffc06a94: 40 82 00 1c bne- ffc06ab0 /* clear related flags in flow_ctrl */ tty->flow_ctrl &= ~(FL_MDXOF); ffc06a98: 80 1f 00 b8 lwz r0,184(r31) ffc06a9c: 54 00 05 a8 rlwinm r0,r0,0,22,20 ffc06aa0: 90 1f 00 b8 stw r0,184(r31) /* FIXME: what happens, if we had sent XOFF but not yet XON? */ tty->flow_ctrl &= ~(FL_ISNTXOF); ffc06aa4: 80 1f 00 b8 lwz r0,184(r31) ffc06aa8: 54 00 07 fa rlwinm r0,r0,0,31,29 ffc06aac: 90 1f 00 b8 stw r0,184(r31) } /* check for incoming RTS/CTS flow control switched off */ if (( tty->flow_ctrl & FL_MDRTS) && !(tty->termios.c_cflag & CRTSCTS)) { ffc06ab0: 80 1f 00 b8 lwz r0,184(r31) ffc06ab4: 70 09 01 00 andi. r9,r0,256 ffc06ab8: 41 82 00 4c beq- ffc06b04 ffc06abc: 80 1f 00 38 lwz r0,56(r31) ffc06ac0: 2f 80 00 00 cmpwi cr7,r0,0 ffc06ac4: 41 9c 00 40 blt- cr7,ffc06b04 <== ALWAYS TAKEN /* clear related flags in flow_ctrl */ tty->flow_ctrl &= ~(FL_MDRTS); ffc06ac8: 80 1f 00 b8 lwz r0,184(r31) <== NOT EXECUTED ffc06acc: 54 00 06 2c rlwinm r0,r0,0,24,22 <== NOT EXECUTED ffc06ad0: 90 1f 00 b8 stw r0,184(r31) <== NOT EXECUTED /* restart remote Tx, if it was stopped */ if ((tty->flow_ctrl & FL_IRTSOFF) && (tty->device.startRemoteTx != NULL)) { ffc06ad4: 80 1f 00 b8 lwz r0,184(r31) <== NOT EXECUTED ffc06ad8: 70 0b 00 04 andi. r11,r0,4 <== NOT EXECUTED ffc06adc: 41 82 00 1c beq- ffc06af8 <== NOT EXECUTED ffc06ae0: 80 1f 00 b0 lwz r0,176(r31) <== NOT EXECUTED ffc06ae4: 2f 80 00 00 cmpwi cr7,r0,0 <== NOT EXECUTED ffc06ae8: 41 9e 00 10 beq- cr7,ffc06af8 <== NOT EXECUTED tty->device.startRemoteTx(tty->minor); ffc06aec: 80 7f 00 10 lwz r3,16(r31) <== NOT EXECUTED ffc06af0: 7c 09 03 a6 mtctr r0 <== NOT EXECUTED ffc06af4: 4e 80 04 21 bctrl <== NOT EXECUTED } tty->flow_ctrl &= ~(FL_IRTSOFF); ffc06af8: 80 1f 00 b8 lwz r0,184(r31) <== NOT EXECUTED ffc06afc: 54 00 07 b8 rlwinm r0,r0,0,30,28 <== NOT EXECUTED ffc06b00: 90 1f 00 b8 stw r0,184(r31) <== 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) { ffc06b04: 80 1f 00 38 lwz r0,56(r31) ffc06b08: 2f 80 00 00 cmpwi cr7,r0,0 ffc06b0c: 40 bc 00 10 bge+ cr7,ffc06b1c tty->flow_ctrl |= FL_MDRTS; ffc06b10: 80 1f 00 b8 lwz r0,184(r31) ffc06b14: 60 00 01 00 ori r0,r0,256 ffc06b18: 90 1f 00 b8 stw r0,184(r31) } /* check for incoming XON/XOF flow control switched on */ if (tty->termios.c_iflag & IXOFF) { ffc06b1c: 80 1f 00 30 lwz r0,48(r31) ffc06b20: 70 09 10 00 andi. r9,r0,4096 ffc06b24: 41 82 00 10 beq- ffc06b34 tty->flow_ctrl |= FL_MDXOF; ffc06b28: 81 3f 00 b8 lwz r9,184(r31) ffc06b2c: 61 29 04 00 ori r9,r9,1024 ffc06b30: 91 3f 00 b8 stw r9,184(r31) } /* check for outgoing XON/XOF flow control switched on */ if (tty->termios.c_iflag & IXON) { ffc06b34: 70 0b 04 00 andi. r11,r0,1024 ffc06b38: 41 82 00 10 beq- ffc06b48 tty->flow_ctrl |= FL_MDXON; ffc06b3c: 80 1f 00 b8 lwz r0,184(r31) ffc06b40: 60 00 02 00 ori r0,r0,512 ffc06b44: 90 1f 00 b8 stw r0,184(r31) 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) { ffc06b48: 83 9f 00 3c lwz r28,60(r31) ffc06b4c: 73 9c 00 02 andi. r28,r28,2 ffc06b50: 41 82 00 0c beq- ffc06b5c tty->rawInBufSemaphoreOptions = RTEMS_WAIT; ffc06b54: 38 00 00 00 li r0,0 ffc06b58: 48 00 00 54 b ffc06bac tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT; tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT; } else { tty->vtimeTicks = tty->termios.c_cc[VTIME] * ffc06b5c: 8b 7f 00 46 lbz r27,70(r31) rtems_clock_get_ticks_per_second() / 10; ffc06b60: 48 00 18 49 bl ffc083a8 ffc06b64: 38 00 00 0a li r0,10 ffc06b68: 89 3f 00 47 lbz r9,71(r31) 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] * ffc06b6c: 7f 63 d9 d6 mullw r27,r3,r27 rtems_clock_get_ticks_per_second() / 10; ffc06b70: 7f 7b 03 96 divwu r27,r27,r0 if (tty->termios.c_cc[VTIME]) { ffc06b74: 88 1f 00 46 lbz r0,70(r31) ffc06b78: 2f 80 00 00 cmpwi cr7,r0,0 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] * ffc06b7c: 93 7f 00 54 stw r27,84(r31) rtems_clock_get_ticks_per_second() / 10; if (tty->termios.c_cc[VTIME]) { ffc06b80: 41 9e 00 24 beq- cr7,ffc06ba4 tty->rawInBufSemaphoreOptions = RTEMS_WAIT; tty->rawInBufSemaphoreTimeout = tty->vtimeTicks; if (tty->termios.c_cc[VMIN]) ffc06b84: 71 20 00 ff andi. r0,r9,255 tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT; } else { tty->vtimeTicks = tty->termios.c_cc[VTIME] * rtems_clock_get_ticks_per_second() / 10; if (tty->termios.c_cc[VTIME]) { tty->rawInBufSemaphoreOptions = RTEMS_WAIT; ffc06b88: 93 9f 00 6c stw r28,108(r31) tty->rawInBufSemaphoreTimeout = tty->vtimeTicks; ffc06b8c: 93 7f 00 70 stw r27,112(r31) if (tty->termios.c_cc[VMIN]) ffc06b90: 41 82 00 0c beq- ffc06b9c tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT; ffc06b94: 93 9f 00 74 stw r28,116(r31) ffc06b98: 48 00 00 2c b ffc06bc4 else tty->rawInBufSemaphoreFirstTimeout = tty->vtimeTicks; ffc06b9c: 93 7f 00 74 stw r27,116(r31) ffc06ba0: 48 00 00 24 b ffc06bc4 } else { if (tty->termios.c_cc[VMIN]) { ffc06ba4: 71 2b 00 ff andi. r11,r9,255 ffc06ba8: 41 82 00 14 beq- ffc06bbc <== ALWAYS TAKEN tty->rawInBufSemaphoreOptions = RTEMS_WAIT; ffc06bac: 90 1f 00 6c stw r0,108(r31) tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT; ffc06bb0: 90 1f 00 70 stw r0,112(r31) tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT; ffc06bb4: 90 1f 00 74 stw r0,116(r31) ffc06bb8: 48 00 00 0c b ffc06bc4 } else { tty->rawInBufSemaphoreOptions = RTEMS_NO_WAIT; ffc06bbc: 38 00 00 01 li r0,1 ffc06bc0: 90 1f 00 6c stw r0,108(r31) } } } if (tty->device.setAttributes) ffc06bc4: 80 1f 00 a8 lwz r0,168(r31) ffc06bc8: 2f 80 00 00 cmpwi cr7,r0,0 ffc06bcc: 41 9e 00 f8 beq- cr7,ffc06cc4 <== NEVER TAKEN (*tty->device.setAttributes)(tty->minor, &tty->termios); ffc06bd0: 80 7f 00 10 lwz r3,16(r31) ffc06bd4: 38 9f 00 30 addi r4,r31,48 ffc06bd8: 7c 09 03 a6 mtctr r0 ffc06bdc: 4e 80 04 21 bctrl ffc06be0: 48 00 00 e4 b ffc06cc4 break; case RTEMS_IO_TCDRAIN: drainOutput (tty); ffc06be4: 7f e3 fb 78 mr r3,r31 ffc06be8: 4b ff f6 ad bl ffc06294 break; ffc06bec: 48 00 00 d8 b ffc06cc4 case RTEMS_IO_SNDWAKEUP: tty->tty_snd = *wakeup; ffc06bf0: 81 3c 00 00 lwz r9,0(r28) ffc06bf4: 81 5c 00 04 lwz r10,4(r28) ffc06bf8: 91 3f 00 d4 stw r9,212(r31) ffc06bfc: 91 5f 00 d8 stw r10,216(r31) break; ffc06c00: 48 00 00 c4 b ffc06cc4 case RTEMS_IO_RCVWAKEUP: tty->tty_rcv = *wakeup; ffc06c04: 81 3c 00 00 lwz r9,0(r28) ffc06c08: 81 5c 00 04 lwz r10,4(r28) ffc06c0c: 91 3f 00 dc stw r9,220(r31) ffc06c10: 91 5f 00 e0 stw r10,224(r31) break; ffc06c14: 48 00 00 b0 b ffc06cc4 #if 1 /* FIXME */ case TIOCSETD: /* * close old line discipline */ if (rtems_termios_linesw[tty->t_line].l_close != NULL) { ffc06c18: 80 1f 00 cc lwz r0,204(r31) ffc06c1c: 3d 20 00 00 lis r9,0 ffc06c20: 39 29 28 fc addi r9,r9,10492 ffc06c24: 54 00 28 34 rlwinm r0,r0,5,0,26 ffc06c28: 7d 29 02 14 add r9,r9,r0 ffc06c2c: 80 09 00 04 lwz r0,4(r9) ffc06c30: 2f 80 00 00 cmpwi cr7,r0,0 ffc06c34: 41 9e 00 14 beq- cr7,ffc06c48 sc = rtems_termios_linesw[tty->t_line].l_close(tty); ffc06c38: 7f e3 fb 78 mr r3,r31 ffc06c3c: 7c 09 03 a6 mtctr r0 ffc06c40: 4e 80 04 21 bctrl ffc06c44: 7c 7d 1b 78 mr r29,r3 } tty->t_line=*(int*)(args->buffer); ffc06c48: 81 3e 00 08 lwz r9,8(r30) ffc06c4c: 80 09 00 00 lwz r0,0(r9) tty->t_sc = NULL; /* ensure that no more valid data */ ffc06c50: 39 20 00 00 li r9,0 ffc06c54: 91 3f 00 d0 stw r9,208(r31) /* * open new line discipline */ if (rtems_termios_linesw[tty->t_line].l_open != NULL) { ffc06c58: 3d 20 00 00 lis r9,0 ffc06c5c: 39 29 28 fc addi r9,r9,10492 * close old line discipline */ if (rtems_termios_linesw[tty->t_line].l_close != NULL) { sc = rtems_termios_linesw[tty->t_line].l_close(tty); } tty->t_line=*(int*)(args->buffer); ffc06c60: 90 1f 00 cc stw r0,204(r31) tty->t_sc = NULL; /* ensure that no more valid data */ /* * open new line discipline */ if (rtems_termios_linesw[tty->t_line].l_open != NULL) { ffc06c64: 54 00 28 34 rlwinm r0,r0,5,0,26 ffc06c68: 7c 09 00 2e lwzx r0,r9,r0 ffc06c6c: 2f 80 00 00 cmpwi cr7,r0,0 ffc06c70: 41 9e 00 54 beq- cr7,ffc06cc4 sc = rtems_termios_linesw[tty->t_line].l_open(tty); ffc06c74: 7f e3 fb 78 mr r3,r31 ffc06c78: 7c 09 03 a6 mtctr r0 ffc06c7c: 4e 80 04 21 bctrl ffc06c80: 7c 7d 1b 78 mr r29,r3 ffc06c84: 48 00 00 40 b ffc06cc4 } break; case TIOCGETD: *(int*)(args->buffer)=tty->t_line; ffc06c88: 81 3e 00 08 lwz r9,8(r30) ffc06c8c: 80 1f 00 cc lwz r0,204(r31) ffc06c90: 48 00 00 30 b ffc06cc0 break; #endif case FIONREAD: { int rawnc = tty->rawInBuf.Tail - tty->rawInBuf.Head; ffc06c94: 81 3f 00 60 lwz r9,96(r31) <== NOT EXECUTED ffc06c98: 80 1f 00 5c lwz r0,92(r31) <== NOT EXECUTED if ( rawnc < 0 ) ffc06c9c: 7c 00 48 51 subf. r0,r0,r9 <== NOT EXECUTED ffc06ca0: 40 a0 00 0c bge+ ffc06cac <== NOT EXECUTED rawnc += tty->rawInBuf.Size; ffc06ca4: 81 3f 00 64 lwz r9,100(r31) <== NOT EXECUTED ffc06ca8: 7c 00 4a 14 add r0,r0,r9 <== NOT EXECUTED /* Half guess that this is the right operation */ *(int *)args->buffer = tty->ccount - tty->cindex + rawnc; ffc06cac: 81 5f 00 20 lwz r10,32(r31) <== NOT EXECUTED ffc06cb0: 81 7f 00 24 lwz r11,36(r31) <== NOT EXECUTED ffc06cb4: 81 3e 00 08 lwz r9,8(r30) <== NOT EXECUTED ffc06cb8: 7d 6b 50 50 subf r11,r11,r10 <== NOT EXECUTED ffc06cbc: 7c 0b 02 14 add r0,r11,r0 <== NOT EXECUTED ffc06cc0: 90 09 00 00 stw r0,0(r9) } break; } rtems_semaphore_release (tty->osem); ffc06cc4: 80 7f 00 18 lwz r3,24(r31) ffc06cc8: 48 00 1e 85 bl ffc08b4c args->ioctl_return = sc; return sc; } ffc06ccc: 39 61 00 20 addi r11,r1,32 } break; } rtems_semaphore_release (tty->osem); args->ioctl_return = sc; ffc06cd0: 93 be 00 0c stw r29,12(r30) return sc; } ffc06cd4: 7f a3 eb 78 mr r3,r29 ffc06cd8: 48 01 24 c8 b ffc191a0 <_restgpr_27_x> =============================================================================== ffc06304 : rtems_device_major_number major, rtems_device_minor_number minor, void *arg, const rtems_termios_callbacks *callbacks ) { ffc06304: 94 21 ff c8 stwu r1,-56(r1) struct rtems_termios_tty *tty; /* * See if the device has already been opened */ sc = rtems_semaphore_obtain( ffc06308: 3d 20 00 00 lis r9,0 rtems_device_major_number major, rtems_device_minor_number minor, void *arg, const rtems_termios_callbacks *callbacks ) { ffc0630c: 7c 08 02 a6 mflr r0 ffc06310: be a1 00 0c stmw r21,12(r1) ffc06314: 7c 7b 1b 78 mr r27,r3 ffc06318: 7c 9a 23 78 mr r26,r4 struct rtems_termios_tty *tty; /* * See if the device has already been opened */ sc = rtems_semaphore_obtain( ffc0631c: 80 69 27 f4 lwz r3,10228(r9) rtems_device_major_number major, rtems_device_minor_number minor, void *arg, const rtems_termios_callbacks *callbacks ) { ffc06320: 7c b9 2b 78 mr r25,r5 struct rtems_termios_tty *tty; /* * See if the device has already been opened */ sc = rtems_semaphore_obtain( ffc06324: 38 80 00 00 li r4,0 rtems_device_major_number major, rtems_device_minor_number minor, void *arg, const rtems_termios_callbacks *callbacks ) { ffc06328: 90 01 00 3c stw r0,60(r1) struct rtems_termios_tty *tty; /* * See if the device has already been opened */ sc = rtems_semaphore_obtain( ffc0632c: 38 a0 00 00 li r5,0 rtems_device_major_number major, rtems_device_minor_number minor, void *arg, const rtems_termios_callbacks *callbacks ) { ffc06330: 7c d8 33 78 mr r24,r6 struct rtems_termios_tty *tty; /* * See if the device has already been opened */ sc = rtems_semaphore_obtain( ffc06334: 48 00 26 f1 bl ffc08a24 rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) ffc06338: 7c 7d 1b 79 mr. r29,r3 ffc0633c: 40 82 03 b8 bne- ffc066f4 <== NEVER TAKEN return sc; for (tty = rtems_termios_ttyHead ; tty != NULL ; tty = tty->forw) { ffc06340: 3d 20 00 00 lis r9,0 ffc06344: 83 89 27 fc lwz r28,10236(r9) ffc06348: 7f 9e e3 78 mr r30,r28 ffc0634c: 48 00 00 20 b ffc0636c if ((tty->major == major) && (tty->minor == minor)) ffc06350: 80 1e 00 0c lwz r0,12(r30) ffc06354: 7f 80 d8 00 cmpw cr7,r0,r27 ffc06358: 40 be 00 10 bne+ cr7,ffc06368 ffc0635c: 80 1e 00 10 lwz r0,16(r30) ffc06360: 7f 80 d0 00 cmpw cr7,r0,r26 ffc06364: 41 9e 03 00 beq- cr7,ffc06664 <== 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) { ffc06368: 83 de 00 00 lwz r30,0(r30) ffc0636c: 2f 9e 00 00 cmpwi cr7,r30,0 ffc06370: 40 9e ff e0 bne+ cr7,ffc06350 ffc06374: 48 00 03 8c b ffc06700 return RTEMS_NO_MEMORY; } /* * allocate raw input buffer */ tty->rawInBuf.Size = RAW_INPUT_BUFFER_SIZE; ffc06378: 3d 20 00 00 lis r9,0 ffc0637c: 80 09 21 84 lwz r0,8580(r9) ffc06380: 3a a9 21 84 addi r21,r9,8580 ffc06384: 90 1e 00 64 stw r0,100(r30) tty->rawInBuf.theBuf = malloc (tty->rawInBuf.Size); ffc06388: 80 7e 00 64 lwz r3,100(r30) ffc0638c: 4b ff f1 41 bl ffc054cc if (tty->rawInBuf.theBuf == NULL) { ffc06390: 2f 83 00 00 cmpwi cr7,r3,0 } /* * allocate raw input buffer */ tty->rawInBuf.Size = RAW_INPUT_BUFFER_SIZE; tty->rawInBuf.theBuf = malloc (tty->rawInBuf.Size); ffc06394: 90 7e 00 58 stw r3,88(r30) ffc06398: 7c 77 1b 78 mr r23,r3 if (tty->rawInBuf.theBuf == NULL) { ffc0639c: 40 be 00 20 bne+ cr7,ffc063bc free(tty); ffc063a0: 7f c3 f3 78 mr r3,r30 ffc063a4: 4b ff ed 8d bl ffc05130 rtems_semaphore_release (rtems_termios_ttyMutex); ffc063a8: 3d 20 00 00 lis r9,0 ffc063ac: 80 69 27 f4 lwz r3,10228(r9) return RTEMS_NO_MEMORY; ffc063b0: 3b a0 00 1a li r29,26 */ tty->rawInBuf.Size = RAW_INPUT_BUFFER_SIZE; tty->rawInBuf.theBuf = malloc (tty->rawInBuf.Size); if (tty->rawInBuf.theBuf == NULL) { free(tty); rtems_semaphore_release (rtems_termios_ttyMutex); ffc063b4: 48 00 27 99 bl ffc08b4c return RTEMS_NO_MEMORY; ffc063b8: 48 00 03 3c b ffc066f4 } /* * allocate raw output buffer */ tty->rawOutBuf.Size = RAW_OUTPUT_BUFFER_SIZE; ffc063bc: 80 15 00 04 lwz r0,4(r21) ffc063c0: 90 1e 00 88 stw r0,136(r30) tty->rawOutBuf.theBuf = malloc (tty->rawOutBuf.Size); ffc063c4: 80 7e 00 88 lwz r3,136(r30) ffc063c8: 4b ff f1 05 bl ffc054cc if (tty->rawOutBuf.theBuf == NULL) { ffc063cc: 2f 83 00 00 cmpwi cr7,r3,0 } /* * allocate raw output buffer */ tty->rawOutBuf.Size = RAW_OUTPUT_BUFFER_SIZE; tty->rawOutBuf.theBuf = malloc (tty->rawOutBuf.Size); ffc063d0: 90 7e 00 7c stw r3,124(r30) ffc063d4: 7c 76 1b 78 mr r22,r3 if (tty->rawOutBuf.theBuf == NULL) { ffc063d8: 41 9e 00 20 beq- cr7,ffc063f8 return RTEMS_NO_MEMORY; } /* * allocate cooked buffer */ tty->cbuf = malloc (CBUFSIZE); ffc063dc: 80 75 00 08 lwz r3,8(r21) ffc063e0: 4b ff f0 ed bl ffc054cc if (tty->cbuf == NULL) { ffc063e4: 2f 83 00 00 cmpwi cr7,r3,0 return RTEMS_NO_MEMORY; } /* * allocate cooked buffer */ tty->cbuf = malloc (CBUFSIZE); ffc063e8: 90 7e 00 1c stw r3,28(r30) if (tty->cbuf == NULL) { ffc063ec: 40 be 00 18 bne+ cr7,ffc06404 <== ALWAYS TAKEN free((void *)(tty->rawOutBuf.theBuf)); ffc063f0: 7e c3 b3 78 mr r3,r22 <== NOT EXECUTED ffc063f4: 4b ff ed 3d bl ffc05130 <== NOT EXECUTED free((void *)(tty->rawInBuf.theBuf)); ffc063f8: 7e e3 bb 78 mr r3,r23 ffc063fc: 4b ff ed 35 bl ffc05130 ffc06400: 4b ff ff a0 b ffc063a0 /* * link tty */ tty->forw = rtems_termios_ttyHead; tty->back = NULL; if (rtems_termios_ttyHead != NULL) ffc06404: 2f 9c 00 00 cmpwi cr7,r28,0 tty->tty_rcvwakeup = 0; /* * link tty */ tty->forw = rtems_termios_ttyHead; ffc06408: 93 9e 00 00 stw r28,0(r30) return RTEMS_NO_MEMORY; } /* * Initialize wakeup callbacks */ tty->tty_snd.sw_pfn = NULL; ffc0640c: 38 00 00 00 li r0,0 ffc06410: 90 1e 00 d4 stw r0,212(r30) tty->tty_snd.sw_arg = NULL; ffc06414: 90 1e 00 d8 stw r0,216(r30) tty->tty_rcv.sw_pfn = NULL; ffc06418: 90 1e 00 dc stw r0,220(r30) tty->tty_rcv.sw_arg = NULL; ffc0641c: 90 1e 00 e0 stw r0,224(r30) tty->tty_rcvwakeup = 0; ffc06420: 90 1e 00 e4 stw r0,228(r30) /* * link tty */ tty->forw = rtems_termios_ttyHead; tty->back = NULL; ffc06424: 90 1e 00 04 stw r0,4(r30) if (rtems_termios_ttyHead != NULL) ffc06428: 41 9e 00 08 beq- cr7,ffc06430 rtems_termios_ttyHead->back = tty; ffc0642c: 93 dc 00 04 stw r30,4(r28) rtems_termios_ttyHead = tty; ffc06430: 3d 20 00 00 lis r9,0 ffc06434: 93 e9 27 fc stw r31,10236(r9) if (rtems_termios_ttyTail == NULL) ffc06438: 3d 20 00 00 lis r9,0 ffc0643c: 80 09 27 f8 lwz r0,10232(r9) ffc06440: 2f 80 00 00 cmpwi cr7,r0,0 ffc06444: 40 be 00 08 bne+ cr7,ffc0644c rtems_termios_ttyTail = tty; ffc06448: 93 e9 27 f8 stw r31,10232(r9) /* * Set up mutex semaphores */ sc = rtems_semaphore_create ( rtems_build_name ('T', 'R', 'i', c), ffc0644c: 3f 80 00 00 lis r28,0 rtems_termios_ttyHead->back = tty; rtems_termios_ttyHead = tty; if (rtems_termios_ttyTail == NULL) rtems_termios_ttyTail = tty; tty->minor = minor; ffc06450: 93 5f 00 10 stw r26,16(r31) /* * Set up mutex semaphores */ sc = rtems_semaphore_create ( rtems_build_name ('T', 'R', 'i', c), ffc06454: 3b 9c 21 84 addi r28,r28,8580 ffc06458: 88 7c 00 0c lbz r3,12(r28) tty->major = major; /* * Set up mutex semaphores */ sc = rtems_semaphore_create ( ffc0645c: 38 80 00 01 li r4,1 rtems_termios_ttyHead = tty; if (rtems_termios_ttyTail == NULL) rtems_termios_ttyTail = tty; tty->minor = minor; tty->major = major; ffc06460: 93 7f 00 0c stw r27,12(r31) /* * Set up mutex semaphores */ sc = rtems_semaphore_create ( ffc06464: 38 a0 00 54 li r5,84 ffc06468: 64 63 54 52 oris r3,r3,21586 ffc0646c: 60 63 69 00 ori r3,r3,26880 ffc06470: 38 c0 00 00 li r6,0 ffc06474: 38 ff 00 14 addi r7,r31,20 ffc06478: 48 00 23 2d bl ffc087a4 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) ffc0647c: 2f 83 00 00 cmpwi cr7,r3,0 ffc06480: 40 9e 02 64 bne- cr7,ffc066e4 rtems_fatal_error_occurred (sc); sc = rtems_semaphore_create ( rtems_build_name ('T', 'R', 'o', c), ffc06484: 88 7c 00 0c lbz r3,12(r28) 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 ( ffc06488: 38 80 00 01 li r4,1 ffc0648c: 38 a0 00 54 li r5,84 ffc06490: 64 63 54 52 oris r3,r3,21586 ffc06494: 60 63 6f 00 ori r3,r3,28416 ffc06498: 38 c0 00 00 li r6,0 ffc0649c: 38 ff 00 18 addi r7,r31,24 ffc064a0: 48 00 23 05 bl ffc087a4 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) ffc064a4: 2f 83 00 00 cmpwi cr7,r3,0 ffc064a8: 40 9e 02 3c bne- cr7,ffc066e4 rtems_fatal_error_occurred (sc); sc = rtems_semaphore_create ( rtems_build_name ('T', 'R', 'x', c), ffc064ac: 88 7c 00 0c lbz r3,12(r28) 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 ( ffc064b0: 38 80 00 00 li r4,0 ffc064b4: 38 a0 00 20 li r5,32 ffc064b8: 64 63 54 52 oris r3,r3,21586 ffc064bc: 60 63 78 00 ori r3,r3,30720 ffc064c0: 38 c0 00 00 li r6,0 ffc064c4: 38 ff 00 8c addi r7,r31,140 ffc064c8: 48 00 22 dd bl ffc087a4 rtems_build_name ('T', 'R', 'x', c), 0, RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_FIFO, RTEMS_NO_PRIORITY, &tty->rawOutBuf.Semaphore); if (sc != RTEMS_SUCCESSFUL) ffc064cc: 7c 60 1b 79 mr. r0,r3 ffc064d0: 40 82 02 14 bne- ffc066e4 tty->rawOutBufState = rob_idle; /* * Set callbacks */ tty->device = *callbacks; ffc064d4: 38 9f 00 98 addi r4,r31,152 RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_FIFO, RTEMS_NO_PRIORITY, &tty->rawOutBuf.Semaphore); if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); tty->rawOutBufState = rob_idle; ffc064d8: 90 1f 00 94 stw r0,148(r31) /* * Set callbacks */ tty->device = *callbacks; ffc064dc: 7c b8 04 aa lswi r5,r24,32 ffc064e0: 7c a4 05 aa stswi r5,r4,32 /* * Create I/O tasks */ if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { ffc064e4: 80 1f 00 b4 lwz r0,180(r31) ffc064e8: 2f 80 00 02 cmpwi cr7,r0,2 ffc064ec: 40 be 00 5c bne+ cr7,ffc06548 sc = rtems_task_create ( rtems_build_name ('T', 'x', 'T', c), ffc064f0: 88 7c 00 0c lbz r3,12(r28) /* * Create I/O tasks */ if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { sc = rtems_task_create ( ffc064f4: 38 80 00 0a li r4,10 ffc064f8: 38 a0 04 00 li r5,1024 ffc064fc: 64 63 54 78 oris r3,r3,21624 ffc06500: 60 63 54 00 ori r3,r3,21504 ffc06504: 38 c0 05 00 li r6,1280 ffc06508: 38 e0 00 00 li r7,0 ffc0650c: 39 1f 00 c8 addi r8,r31,200 ffc06510: 48 00 26 fd bl ffc08c0c TERMIOS_TXTASK_STACKSIZE, RTEMS_NO_PREEMPT | RTEMS_NO_TIMESLICE | RTEMS_NO_ASR, RTEMS_NO_FLOATING_POINT | RTEMS_LOCAL, &tty->txTaskId); if (sc != RTEMS_SUCCESSFUL) ffc06514: 2f 83 00 00 cmpwi cr7,r3,0 ffc06518: 40 9e 01 cc bne- cr7,ffc066e4 <== NEVER TAKEN rtems_fatal_error_occurred (sc); sc = rtems_task_create ( rtems_build_name ('R', 'x', 'T', c), ffc0651c: 88 7c 00 0c lbz r3,12(r28) RTEMS_NO_ASR, RTEMS_NO_FLOATING_POINT | RTEMS_LOCAL, &tty->txTaskId); if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); sc = rtems_task_create ( ffc06520: 38 80 00 09 li r4,9 ffc06524: 38 a0 04 00 li r5,1024 ffc06528: 64 63 52 78 oris r3,r3,21112 ffc0652c: 60 63 54 00 ori r3,r3,21504 ffc06530: 38 c0 05 00 li r6,1280 ffc06534: 38 e0 00 00 li r7,0 ffc06538: 39 1f 00 c4 addi r8,r31,196 ffc0653c: 48 00 26 d1 bl ffc08c0c TERMIOS_RXTASK_STACKSIZE, RTEMS_NO_PREEMPT | RTEMS_NO_TIMESLICE | RTEMS_NO_ASR, RTEMS_NO_FLOATING_POINT | RTEMS_LOCAL, &tty->rxTaskId); if (sc != RTEMS_SUCCESSFUL) ffc06540: 2f 83 00 00 cmpwi cr7,r3,0 ffc06544: 40 9e 01 a0 bne- cr7,ffc066e4 <== NEVER TAKEN rtems_fatal_error_occurred (sc); } if ((tty->device.pollRead == NULL) || ffc06548: 80 1f 00 a0 lwz r0,160(r31) ffc0654c: 2f 80 00 00 cmpwi cr7,r0,0 ffc06550: 41 9e 00 10 beq- cr7,ffc06560 ffc06554: 80 1f 00 b4 lwz r0,180(r31) ffc06558: 2f 80 00 02 cmpwi cr7,r0,2 ffc0655c: 40 be 00 30 bne+ cr7,ffc0658c (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)){ sc = rtems_semaphore_create ( rtems_build_name ('T', 'R', 'r', c), ffc06560: 3d 20 00 00 lis r9,0 ffc06564: 88 69 21 90 lbz r3,8592(r9) rtems_fatal_error_occurred (sc); } if ((tty->device.pollRead == NULL) || (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)){ sc = rtems_semaphore_create ( ffc06568: 38 80 00 00 li r4,0 ffc0656c: 38 a0 00 24 li r5,36 ffc06570: 64 63 54 52 oris r3,r3,21586 ffc06574: 60 63 72 00 ori r3,r3,29184 ffc06578: 38 c0 00 00 li r6,0 ffc0657c: 38 ff 00 68 addi r7,r31,104 ffc06580: 48 00 22 25 bl ffc087a4 rtems_build_name ('T', 'R', 'r', c), 0, RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_PRIORITY, RTEMS_NO_PRIORITY, &tty->rawInBuf.Semaphore); if (sc != RTEMS_SUCCESSFUL) ffc06584: 2f 83 00 00 cmpwi cr7,r3,0 ffc06588: 40 9e 01 5c bne- cr7,ffc066e4 <== NEVER TAKEN } /* * Set default parameters */ tty->termios.c_iflag = BRKINT | ICRNL | IXON | IMAXBEL; ffc0658c: 38 00 25 02 li r0,9474 ffc06590: 90 1f 00 30 stw r0,48(r31) tty->termios.c_oflag = OPOST | ONLCR | XTABS; ffc06594: 38 00 18 05 li r0,6149 tty->lowwater = tty->rawInBuf.Size * 1/2; tty->highwater = tty->rawInBuf.Size * 3/4; /* * Bump name characer */ if (c++ == 'z') ffc06598: 3d 20 00 00 lis r9,0 /* * Set default parameters */ tty->termios.c_iflag = BRKINT | ICRNL | IXON | IMAXBEL; tty->termios.c_oflag = OPOST | ONLCR | XTABS; ffc0659c: 90 1f 00 34 stw r0,52(r31) tty->termios.c_cflag = B9600 | CS8 | CREAD | CLOCAL; ffc065a0: 38 00 08 bd li r0,2237 tty->lowwater = tty->rawInBuf.Size * 1/2; tty->highwater = tty->rawInBuf.Size * 3/4; /* * Bump name characer */ if (c++ == 'z') ffc065a4: 39 29 21 84 addi r9,r9,8580 /* * Set default parameters */ tty->termios.c_iflag = BRKINT | ICRNL | IXON | IMAXBEL; tty->termios.c_oflag = OPOST | ONLCR | XTABS; tty->termios.c_cflag = B9600 | CS8 | CREAD | CLOCAL; ffc065a8: 90 1f 00 38 stw r0,56(r31) tty->termios.c_lflag = ffc065ac: 38 00 00 00 li r0,0 ffc065b0: 60 00 82 3b ori r0,r0,33339 ffc065b4: 90 1f 00 3c stw r0,60(r31) ISIG | ICANON | IEXTEN | ECHO | ECHOK | ECHOE | ECHOCTL; tty->termios.c_cc[VINTR] = '\003'; ffc065b8: 38 00 00 03 li r0,3 ffc065bc: 98 1f 00 41 stb r0,65(r31) tty->termios.c_cc[VQUIT] = '\034'; ffc065c0: 38 00 00 1c li r0,28 ffc065c4: 98 1f 00 42 stb r0,66(r31) tty->termios.c_cc[VERASE] = '\177'; ffc065c8: 38 00 00 7f li r0,127 ffc065cc: 98 1f 00 43 stb r0,67(r31) tty->termios.c_cc[VKILL] = '\025'; ffc065d0: 38 00 00 15 li r0,21 ffc065d4: 98 1f 00 44 stb r0,68(r31) tty->termios.c_cc[VEOF] = '\004'; ffc065d8: 38 00 00 04 li r0,4 ffc065dc: 98 1f 00 45 stb r0,69(r31) tty->termios.c_cc[VEOL] = '\000'; ffc065e0: 38 00 00 00 li r0,0 ffc065e4: 98 1f 00 4c stb r0,76(r31) tty->termios.c_cc[VEOL2] = '\000'; ffc065e8: 98 1f 00 51 stb r0,81(r31) tty->termios.c_cc[VSTART] = '\021'; ffc065ec: 38 00 00 11 li r0,17 ffc065f0: 98 1f 00 49 stb r0,73(r31) tty->termios.c_cc[VSTOP] = '\023'; ffc065f4: 38 00 00 13 li r0,19 ffc065f8: 98 1f 00 4a stb r0,74(r31) tty->termios.c_cc[VSUSP] = '\032'; ffc065fc: 38 00 00 1a li r0,26 ffc06600: 98 1f 00 4b stb r0,75(r31) tty->termios.c_cc[VREPRINT] = '\022'; ffc06604: 38 00 00 12 li r0,18 ffc06608: 98 1f 00 4d stb r0,77(r31) tty->termios.c_cc[VDISCARD] = '\017'; ffc0660c: 38 00 00 0f li r0,15 ffc06610: 98 1f 00 4e stb r0,78(r31) tty->termios.c_cc[VWERASE] = '\027'; ffc06614: 38 00 00 17 li r0,23 ffc06618: 98 1f 00 4f stb r0,79(r31) tty->termios.c_cc[VLNEXT] = '\026'; ffc0661c: 38 00 00 16 li r0,22 ffc06620: 98 1f 00 50 stb r0,80(r31) /* start with no flow control, clear flow control flags */ tty->flow_ctrl = 0; ffc06624: 38 00 00 00 li r0,0 ffc06628: 90 1f 00 b8 stw r0,184(r31) /* * set low/highwater mark for XON/XOFF support */ tty->lowwater = tty->rawInBuf.Size * 1/2; ffc0662c: 80 1f 00 64 lwz r0,100(r31) tty->highwater = tty->rawInBuf.Size * 3/4; /* * Bump name characer */ if (c++ == 'z') ffc06630: 89 69 00 0c lbz r11,12(r9) /* start with no flow control, clear flow control flags */ tty->flow_ctrl = 0; /* * set low/highwater mark for XON/XOFF support */ tty->lowwater = tty->rawInBuf.Size * 1/2; ffc06634: 54 00 f8 7e rlwinm r0,r0,31,1,31 ffc06638: 90 1f 00 bc stw r0,188(r31) tty->highwater = tty->rawInBuf.Size * 3/4; /* * Bump name characer */ if (c++ == 'z') ffc0663c: 2f 8b 00 7a cmpwi cr7,r11,122 tty->flow_ctrl = 0; /* * set low/highwater mark for XON/XOFF support */ tty->lowwater = tty->rawInBuf.Size * 1/2; tty->highwater = tty->rawInBuf.Size * 3/4; ffc06640: 80 1f 00 64 lwz r0,100(r31) ffc06644: 1c 00 00 03 mulli r0,r0,3 ffc06648: 54 00 f0 be rlwinm r0,r0,30,2,31 ffc0664c: 90 1f 00 c0 stw r0,192(r31) /* * Bump name characer */ if (c++ == 'z') ffc06650: 38 0b 00 01 addi r0,r11,1 ffc06654: 98 09 00 0c stb r0,12(r9) ffc06658: 40 be 00 0c bne+ cr7,ffc06664 c = 'a'; ffc0665c: 38 00 00 61 li r0,97 ffc06660: 98 09 00 0c stb r0,12(r9) } args->iop->data1 = tty; ffc06664: 81 39 00 00 lwz r9,0(r25) ffc06668: 93 c9 00 38 stw r30,56(r9) if (!tty->refcount++) { ffc0666c: 81 3e 00 08 lwz r9,8(r30) ffc06670: 2f 89 00 00 cmpwi cr7,r9,0 ffc06674: 38 09 00 01 addi r0,r9,1 ffc06678: 90 1e 00 08 stw r0,8(r30) ffc0667c: 40 9e 00 6c bne- cr7,ffc066e8 if (tty->device.firstOpen) ffc06680: 80 1e 00 98 lwz r0,152(r30) ffc06684: 2f 80 00 00 cmpwi cr7,r0,0 ffc06688: 41 9e 00 18 beq- cr7,ffc066a0 <== ALWAYS TAKEN (*tty->device.firstOpen)(major, minor, arg); ffc0668c: 7f 63 db 78 mr r3,r27 <== NOT EXECUTED ffc06690: 7c 09 03 a6 mtctr r0 <== NOT EXECUTED ffc06694: 7f 44 d3 78 mr r4,r26 <== NOT EXECUTED ffc06698: 7f 25 cb 78 mr r5,r25 <== NOT EXECUTED ffc0669c: 4e 80 04 21 bctrl <== NOT EXECUTED /* * start I/O tasks, if needed */ if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { ffc066a0: 80 1e 00 b4 lwz r0,180(r30) ffc066a4: 2f 80 00 02 cmpwi cr7,r0,2 ffc066a8: 40 be 00 40 bne+ cr7,ffc066e8 sc = rtems_task_start( ffc066ac: 80 7e 00 c4 lwz r3,196(r30) ffc066b0: 3c 80 ff c0 lis r4,-64 ffc066b4: 38 84 7b 78 addi r4,r4,31608 ffc066b8: 7f c5 f3 78 mr r5,r30 ffc066bc: 48 00 28 19 bl ffc08ed4 tty->rxTaskId, rtems_termios_rxdaemon, (rtems_task_argument)tty); if (sc != RTEMS_SUCCESSFUL) ffc066c0: 2f 83 00 00 cmpwi cr7,r3,0 ffc066c4: 40 9e 00 20 bne- cr7,ffc066e4 <== NEVER TAKEN rtems_fatal_error_occurred (sc); sc = rtems_task_start( ffc066c8: 80 7e 00 c8 lwz r3,200(r30) ffc066cc: 3c 80 ff c0 lis r4,-64 ffc066d0: 38 84 7d dc addi r4,r4,32220 ffc066d4: 7f c5 f3 78 mr r5,r30 ffc066d8: 48 00 27 fd bl ffc08ed4 tty->txTaskId, rtems_termios_txdaemon, (rtems_task_argument)tty); if (sc != RTEMS_SUCCESSFUL) ffc066dc: 2f 83 00 00 cmpwi cr7,r3,0 ffc066e0: 41 be 00 08 beq+ cr7,ffc066e8 <== ALWAYS TAKEN rtems_fatal_error_occurred (sc); ffc066e4: 48 00 2a c1 bl ffc091a4 } } rtems_semaphore_release (rtems_termios_ttyMutex); ffc066e8: 3d 20 00 00 lis r9,0 ffc066ec: 80 69 27 f4 lwz r3,10228(r9) ffc066f0: 48 00 24 5d bl ffc08b4c return RTEMS_SUCCESSFUL; } ffc066f4: 39 61 00 38 addi r11,r1,56 ffc066f8: 7f a3 eb 78 mr r3,r29 ffc066fc: 48 01 2a 8c b ffc19188 <_restgpr_21_x> static char c = 'a'; /* * Create a new device */ tty = calloc (1, sizeof (struct rtems_termios_tty)); ffc06700: 38 60 00 01 li r3,1 ffc06704: 38 80 00 e8 li r4,232 ffc06708: 4b ff e8 21 bl ffc04f28 if (tty == NULL) { ffc0670c: 2f 83 00 00 cmpwi cr7,r3,0 static char c = 'a'; /* * Create a new device */ tty = calloc (1, sizeof (struct rtems_termios_tty)); ffc06710: 7c 7e 1b 78 mr r30,r3 ffc06714: 7c 7f 1b 78 mr r31,r3 if (tty == NULL) { ffc06718: 40 9e fc 60 bne+ cr7,ffc06378 ffc0671c: 4b ff fc 8c b ffc063a8 =============================================================================== ffc06cdc : * Send characters to device-specific code */ void rtems_termios_puts ( const void *_buf, int len, struct rtems_termios_tty *tty) { ffc06cdc: 94 21 ff d8 stwu r1,-40(r1) ffc06ce0: 7c 08 02 a6 mflr r0 ffc06ce4: 90 01 00 2c stw r0,44(r1) const unsigned char *buf = _buf; unsigned int newHead; rtems_interrupt_level level; rtems_status_code sc; if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) { ffc06ce8: 80 05 00 b4 lwz r0,180(r5) * Send characters to device-specific code */ void rtems_termios_puts ( const void *_buf, int len, struct rtems_termios_tty *tty) { ffc06cec: bf 21 00 0c stmw r25,12(r1) ffc06cf0: 7c 7b 1b 78 mr r27,r3 const unsigned char *buf = _buf; unsigned int newHead; rtems_interrupt_level level; rtems_status_code sc; if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) { ffc06cf4: 2f 80 00 00 cmpwi cr7,r0,0 * Send characters to device-specific code */ void rtems_termios_puts ( const void *_buf, int len, struct rtems_termios_tty *tty) { ffc06cf8: 7c 9d 23 78 mr r29,r4 ffc06cfc: 7c bf 2b 78 mr r31,r5 const unsigned char *buf = _buf; unsigned int newHead; rtems_interrupt_level level; rtems_status_code sc; if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) { ffc06d00: 40 be 00 20 bne+ cr7,ffc06d20 (*tty->device.write)(tty->minor, (void *)buf, len); ffc06d04: 80 05 00 a4 lwz r0,164(r5) ffc06d08: 7f 64 db 78 mr r4,r27 ffc06d0c: 80 65 00 10 lwz r3,16(r5) ffc06d10: 7f a5 eb 78 mr r5,r29 ffc06d14: 7c 09 03 a6 mtctr r0 ffc06d18: 4e 80 04 21 bctrl return; ffc06d1c: 48 00 00 e0 b ffc06dfc } newHead = tty->rawOutBuf.Head; ffc06d20: 83 c5 00 80 lwz r30,128(r5) /* * Send characters to device-specific code */ void rtems_termios_puts ( ffc06d24: 3b 63 ff ff addi r27,r3,-1 * with interrupts enabled. */ newHead = (newHead + 1) % tty->rawOutBuf.Size; rtems_interrupt_disable (level); while (newHead == tty->rawOutBuf.Tail) { tty->rawOutBufState = rob_wait; ffc06d28: 3b 20 00 02 li r25,2 (char *)&tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1); } else { /* remember that output has been stopped due to flow ctrl*/ tty->flow_ctrl |= FL_OSTOP; } tty->rawOutBufState = rob_busy; ffc06d2c: 3b 40 00 01 li r26,1 if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) { (*tty->device.write)(tty->minor, (void *)buf, len); return; } newHead = tty->rawOutBuf.Head; while (len) { ffc06d30: 48 00 00 c4 b ffc06df4 * len -= ncopy * * To minimize latency, the memcpy should be done * with interrupts enabled. */ newHead = (newHead + 1) % tty->rawOutBuf.Size; ffc06d34: 80 1f 00 88 lwz r0,136(r31) ffc06d38: 3b de 00 01 addi r30,r30,1 ffc06d3c: 7d 3e 03 96 divwu r9,r30,r0 ffc06d40: 7c 09 01 d6 mullw r0,r9,r0 ffc06d44: 7f c0 f0 50 subf r30,r0,r30 rtems_interrupt_disable (level); ffc06d48: 4b ff f5 39 bl ffc06280 ffc06d4c: 7c 7c 1b 78 mr r28,r3 while (newHead == tty->rawOutBuf.Tail) { ffc06d50: 48 00 00 30 b ffc06d80 tty->rawOutBufState = rob_wait; ffc06d54: 93 3f 00 94 stw r25,148(r31) ffc06d58: 7f 80 01 24 mtmsr r28 rtems_interrupt_enable (level); sc = rtems_semaphore_obtain( ffc06d5c: 80 7f 00 8c lwz r3,140(r31) ffc06d60: 38 80 00 00 li r4,0 ffc06d64: 38 a0 00 00 li r5,0 ffc06d68: 48 00 1c bd bl ffc08a24 tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) ffc06d6c: 2f 83 00 00 cmpwi cr7,r3,0 ffc06d70: 41 be 00 08 beq+ cr7,ffc06d78 <== ALWAYS TAKEN rtems_fatal_error_occurred (sc); ffc06d74: 48 00 24 31 bl ffc091a4 <== NOT EXECUTED rtems_interrupt_disable (level); ffc06d78: 4b ff f5 09 bl ffc06280 ffc06d7c: 7c 7c 1b 78 mr r28,r3 * 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) { ffc06d80: 80 1f 00 84 lwz r0,132(r31) ffc06d84: 7f 9e 00 00 cmpw cr7,r30,r0 ffc06d88: 41 9e ff cc beq+ cr7,ffc06d54 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++; ffc06d8c: 80 1f 00 80 lwz r0,128(r31) ffc06d90: 8d 7b 00 01 lbzu r11,1(r27) ffc06d94: 81 3f 00 7c lwz r9,124(r31) ffc06d98: 7d 69 01 ae stbx r11,r9,r0 tty->rawOutBuf.Head = newHead; if (tty->rawOutBufState == rob_idle) { ffc06d9c: 80 1f 00 94 lwz r0,148(r31) if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); rtems_interrupt_disable (level); } tty->rawOutBuf.theBuf[tty->rawOutBuf.Head] = *buf++; tty->rawOutBuf.Head = newHead; ffc06da0: 93 df 00 80 stw r30,128(r31) if (tty->rawOutBufState == rob_idle) { ffc06da4: 2f 80 00 00 cmpwi cr7,r0,0 ffc06da8: 40 9e 00 44 bne- cr7,ffc06dec /* check, whether XOFF has been received */ if (!(tty->flow_ctrl & FL_ORCVXOF)) { ffc06dac: 80 1f 00 b8 lwz r0,184(r31) ffc06db0: 70 09 00 10 andi. r9,r0,16 ffc06db4: 40 a2 00 28 bne+ ffc06ddc <== NEVER TAKEN (*tty->device.write)(tty->minor, (char *)&tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1); ffc06db8: 81 3f 00 84 lwz r9,132(r31) 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, ffc06dbc: 38 a0 00 01 li r5,1 ffc06dc0: 80 9f 00 7c lwz r4,124(r31) ffc06dc4: 80 1f 00 a4 lwz r0,164(r31) ffc06dc8: 80 7f 00 10 lwz r3,16(r31) ffc06dcc: 7c 84 4a 14 add r4,r4,r9 ffc06dd0: 7c 09 03 a6 mtctr r0 ffc06dd4: 4e 80 04 21 bctrl ffc06dd8: 48 00 00 10 b ffc06de8 (char *)&tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1); } else { /* remember that output has been stopped due to flow ctrl*/ tty->flow_ctrl |= FL_OSTOP; ffc06ddc: 80 1f 00 b8 lwz r0,184(r31) <== NOT EXECUTED ffc06de0: 60 00 00 20 ori r0,r0,32 <== NOT EXECUTED ffc06de4: 90 1f 00 b8 stw r0,184(r31) <== NOT EXECUTED } tty->rawOutBufState = rob_busy; ffc06de8: 93 5f 00 94 stw r26,148(r31) ffc06dec: 7f 80 01 24 mtmsr r28 } rtems_interrupt_enable (level); len--; ffc06df0: 3b bd ff ff addi r29,r29,-1 if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) { (*tty->device.write)(tty->minor, (void *)buf, len); return; } newHead = tty->rawOutBuf.Head; while (len) { ffc06df4: 2f 9d 00 00 cmpwi cr7,r29,0 ffc06df8: 40 9e ff 3c bne+ cr7,ffc06d34 tty->rawOutBufState = rob_busy; } rtems_interrupt_enable (level); len--; } } ffc06dfc: 39 61 00 28 addi r11,r1,40 ffc06e00: 48 01 23 98 b ffc19198 <_restgpr_25_x> =============================================================================== ffc074f0 : return RTEMS_SUCCESSFUL; } rtems_status_code rtems_termios_read (void *arg) { ffc074f0: 94 21 ff d0 stwu r1,-48(r1) ffc074f4: 7c 08 02 a6 mflr r0 struct rtems_termios_tty *tty = args->iop->data1; uint32_t count = args->count; char *buffer = args->buffer; rtems_status_code sc; sc = rtems_semaphore_obtain (tty->isem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); ffc074f8: 38 80 00 00 li r4,0 return RTEMS_SUCCESSFUL; } rtems_status_code rtems_termios_read (void *arg) { ffc074fc: 90 01 00 34 stw r0,52(r1) struct rtems_termios_tty *tty = args->iop->data1; uint32_t count = args->count; char *buffer = args->buffer; rtems_status_code sc; sc = rtems_semaphore_obtain (tty->isem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); ffc07500: 38 a0 00 00 li r5,0 rtems_status_code rtems_termios_read (void *arg) { rtems_libio_rw_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; ffc07504: 81 23 00 00 lwz r9,0(r3) return RTEMS_SUCCESSFUL; } rtems_status_code rtems_termios_read (void *arg) { ffc07508: be e1 00 0c stmw r23,12(r1) ffc0750c: 7c 7e 1b 78 mr r30,r3 rtems_libio_rw_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; ffc07510: 83 e9 00 38 lwz r31,56(r9) uint32_t count = args->count; ffc07514: 83 63 00 14 lwz r27,20(r3) char *buffer = args->buffer; ffc07518: 83 23 00 10 lwz r25,16(r3) rtems_status_code sc; sc = rtems_semaphore_obtain (tty->isem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); ffc0751c: 80 7f 00 14 lwz r3,20(r31) ffc07520: 48 00 15 05 bl ffc08a24 if (sc != RTEMS_SUCCESSFUL) ffc07524: 7c 7c 1b 79 mr. r28,r3 ffc07528: 40 82 03 38 bne- ffc07860 <== NEVER TAKEN return sc; if (rtems_termios_linesw[tty->t_line].l_read != NULL) { ffc0752c: 80 1f 00 cc lwz r0,204(r31) ffc07530: 3d 20 00 00 lis r9,0 ffc07534: 39 29 28 fc addi r9,r9,10492 ffc07538: 54 00 28 34 rlwinm r0,r0,5,0,26 ffc0753c: 7d 29 02 14 add r9,r9,r0 ffc07540: 80 09 00 08 lwz r0,8(r9) ffc07544: 2f 80 00 00 cmpwi cr7,r0,0 ffc07548: 41 9e 00 1c beq- cr7,ffc07564 sc = rtems_termios_linesw[tty->t_line].l_read(tty,args); ffc0754c: 7f e3 fb 78 mr r3,r31 ffc07550: 7c 09 03 a6 mtctr r0 ffc07554: 7f c4 f3 78 mr r4,r30 ffc07558: 4e 80 04 21 bctrl ffc0755c: 7c 7c 1b 78 mr r28,r3 ffc07560: 48 00 02 f0 b ffc07850 tty->tty_rcvwakeup = 0; rtems_semaphore_release (tty->isem); return sc; } if (tty->cindex == tty->ccount) { ffc07564: 81 3f 00 24 lwz r9,36(r31) ffc07568: 80 1f 00 20 lwz r0,32(r31) ffc0756c: 7f 89 00 00 cmpw cr7,r9,r0 ffc07570: 40 be 02 98 bne+ cr7,ffc07808 <== NEVER TAKEN tty->cindex = tty->ccount = 0; tty->read_start_column = tty->column; ffc07574: 80 1f 00 28 lwz r0,40(r31) rtems_semaphore_release (tty->isem); return sc; } if (tty->cindex == tty->ccount) { tty->cindex = tty->ccount = 0; ffc07578: 93 9f 00 20 stw r28,32(r31) tty->read_start_column = tty->column; ffc0757c: 90 1f 00 2c stw r0,44(r31) if (tty->device.pollRead != NULL && ffc07580: 80 1f 00 a0 lwz r0,160(r31) rtems_semaphore_release (tty->isem); return sc; } if (tty->cindex == tty->ccount) { tty->cindex = tty->ccount = 0; ffc07584: 93 9f 00 24 stw r28,36(r31) tty->read_start_column = tty->column; if (tty->device.pollRead != NULL && ffc07588: 2f 80 00 00 cmpwi cr7,r0,0 ffc0758c: 41 9e 00 fc beq- cr7,ffc07688 ffc07590: 80 1f 00 b4 lwz r0,180(r31) ffc07594: 2f 80 00 00 cmpwi cr7,r0,0 ffc07598: 40 be 00 f0 bne+ cr7,ffc07688 static rtems_status_code fillBufferPoll (struct rtems_termios_tty *tty) { int n; if (tty->termios.c_lflag & ICANON) { ffc0759c: 80 1f 00 3c lwz r0,60(r31) ffc075a0: 70 09 00 02 andi. r9,r0,2 ffc075a4: 41 82 00 40 beq- ffc075e4 for (;;) { n = (*tty->device.pollRead)(tty->minor); ffc075a8: 80 1f 00 a0 lwz r0,160(r31) ffc075ac: 80 7f 00 10 lwz r3,16(r31) ffc075b0: 7c 09 03 a6 mtctr r0 ffc075b4: 4e 80 04 21 bctrl if (n < 0) { ffc075b8: 2c 03 00 00 cmpwi r3,0 ffc075bc: 40 a0 00 10 bge+ ffc075cc rtems_task_wake_after (1); ffc075c0: 38 60 00 01 li r3,1 ffc075c4: 48 00 19 e9 bl ffc08fac ffc075c8: 4b ff ff e0 b ffc075a8 } else { if (siproc (n, tty)) ffc075cc: 54 63 06 3e clrlwi r3,r3,24 ffc075d0: 7f e4 fb 78 mr r4,r31 ffc075d4: 4b ff fd e5 bl ffc073b8 ffc075d8: 2f 83 00 00 cmpwi cr7,r3,0 ffc075dc: 41 9e ff cc beq+ cr7,ffc075a8 ffc075e0: 48 00 02 28 b ffc07808 } } } else { rtems_interval then, now; then = rtems_clock_get_ticks_since_boot(); ffc075e4: 48 00 0d dd bl ffc083c0 ffc075e8: 7c 7d 1b 78 mr r29,r3 for (;;) { n = (*tty->device.pollRead)(tty->minor); ffc075ec: 80 1f 00 a0 lwz r0,160(r31) ffc075f0: 80 7f 00 10 lwz r3,16(r31) ffc075f4: 7c 09 03 a6 mtctr r0 ffc075f8: 4e 80 04 21 bctrl if (n < 0) { ffc075fc: 2c 03 00 00 cmpwi r3,0 ffc07600: 40 80 00 54 bge- ffc07654 if (tty->termios.c_cc[VMIN]) { ffc07604: 88 1f 00 47 lbz r0,71(r31) ffc07608: 2f 80 00 00 cmpwi cr7,r0,0 ffc0760c: 88 1f 00 46 lbz r0,70(r31) ffc07610: 41 9e 00 1c beq- cr7,ffc0762c <== NEVER TAKEN if (tty->termios.c_cc[VTIME] && tty->ccount) { ffc07614: 70 09 00 ff andi. r9,r0,255 ffc07618: 41 82 00 30 beq- ffc07648 <== NEVER TAKEN ffc0761c: 80 1f 00 20 lwz r0,32(r31) ffc07620: 2f 80 00 00 cmpwi cr7,r0,0 ffc07624: 41 be 00 24 beq+ cr7,ffc07648 ffc07628: 48 00 00 0c b ffc07634 if ((now - then) > tty->vtimeTicks) { break; } } } else { if (!tty->termios.c_cc[VTIME]) ffc0762c: 70 09 00 ff andi. r9,r0,255 <== NOT EXECUTED ffc07630: 41 82 01 d8 beq- ffc07808 <== NOT EXECUTED break; now = rtems_clock_get_ticks_since_boot(); ffc07634: 48 00 0d 8d bl ffc083c0 if ((now - then) > tty->vtimeTicks) { ffc07638: 80 1f 00 54 lwz r0,84(r31) ffc0763c: 7c 7d 18 50 subf r3,r29,r3 ffc07640: 7f 83 00 40 cmplw cr7,r3,r0 ffc07644: 41 9d 01 c4 bgt- cr7,ffc07808 break; } } rtems_task_wake_after (1); ffc07648: 38 60 00 01 li r3,1 ffc0764c: 48 00 19 61 bl ffc08fac ffc07650: 4b ff ff 9c b ffc075ec } else { siproc (n, tty); ffc07654: 54 63 06 3e clrlwi r3,r3,24 ffc07658: 7f e4 fb 78 mr r4,r31 ffc0765c: 4b ff fd 5d bl ffc073b8 if (tty->ccount >= tty->termios.c_cc[VMIN]) ffc07660: 88 1f 00 47 lbz r0,71(r31) ffc07664: 81 3f 00 20 lwz r9,32(r31) ffc07668: 7f 89 00 00 cmpw cr7,r9,r0 ffc0766c: 40 9c 01 9c bge- cr7,ffc07808 <== NEVER TAKEN break; if (tty->termios.c_cc[VMIN] && tty->termios.c_cc[VTIME]) ffc07670: 2f 80 00 00 cmpwi cr7,r0,0 ffc07674: 41 be ff 78 beq- cr7,ffc075ec <== NEVER TAKEN ffc07678: 88 1f 00 46 lbz r0,70(r31) ffc0767c: 2f 80 00 00 cmpwi cr7,r0,0 ffc07680: 41 9e ff 6c beq+ cr7,ffc075ec <== NEVER TAKEN ffc07684: 4b ff ff 60 b ffc075e4 * Fill the input buffer from the raw input queue */ static rtems_status_code fillBufferQueue (struct rtems_termios_tty *tty) { rtems_interval timeout = tty->rawInBufSemaphoreFirstTimeout; ffc07688: 83 5f 00 74 lwz r26,116(r31) rtems_status_code sc; int wait = (int)1; ffc0768c: 3b a0 00 01 li r29,1 while ( wait ) { /* * Process characters read from raw queue */ while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) && (tty->ccount < (CBUFSIZE-1))) { ffc07690: 3e e0 00 00 lis r23,0 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)( ffc07694: 3b 1f 00 49 addi r24,r31,73 ffc07698: 48 00 01 28 b ffc077c0 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; ffc0769c: 81 3f 00 5c lwz r9,92(r31) ffc076a0: 81 7f 00 64 lwz r11,100(r31) ffc076a4: 39 29 00 01 addi r9,r9,1 ffc076a8: 7c 09 5b 96 divwu r0,r9,r11 ffc076ac: 7c 00 59 d6 mullw r0,r0,r11 ffc076b0: 7c 00 48 50 subf r0,r0,r9 c = tty->rawInBuf.theBuf[newHead]; ffc076b4: 81 3f 00 58 lwz r9,88(r31) ffc076b8: 7f 49 00 ae lbzx r26,r9,r0 tty->rawInBuf.Head = newHead; ffc076bc: 90 1f 00 5c stw r0,92(r31) if(((tty->rawInBuf.Tail-newHead+tty->rawInBuf.Size) ffc076c0: 81 7f 00 60 lwz r11,96(r31) ffc076c4: 81 5f 00 64 lwz r10,100(r31) % tty->rawInBuf.Size) ffc076c8: 81 3f 00 64 lwz r9,100(r31) 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) ffc076cc: 7d 6a 5a 14 add r11,r10,r11 ffc076d0: 7c 00 58 50 subf r0,r0,r11 % tty->rawInBuf.Size) ffc076d4: 7d 60 4b 96 divwu r11,r0,r9 ffc076d8: 7d 2b 49 d6 mullw r9,r11,r9 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) ffc076dc: 81 7f 00 bc lwz r11,188(r31) % tty->rawInBuf.Size) ffc076e0: 7c 09 00 50 subf r0,r9,r0 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) ffc076e4: 7f 80 58 40 cmplw cr7,r0,r11 ffc076e8: 40 9c 00 84 bge- cr7,ffc0776c <== NEVER TAKEN % tty->rawInBuf.Size) < tty->lowwater) { tty->flow_ctrl &= ~FL_IREQXOF; ffc076ec: 80 1f 00 b8 lwz r0,184(r31) ffc076f0: 54 00 00 3c rlwinm r0,r0,0,0,30 ffc076f4: 90 1f 00 b8 stw r0,184(r31) /* if tx stopped and XON should be sent... */ if (((tty->flow_ctrl & (FL_MDXON | FL_ISNTXOF)) ffc076f8: 80 1f 00 b8 lwz r0,184(r31) ffc076fc: 70 00 02 02 andi. r0,r0,514 ffc07700: 2f 80 02 02 cmpwi cr7,r0,514 ffc07704: 40 be 00 38 bne+ cr7,ffc0773c <== ALWAYS TAKEN == (FL_MDXON | FL_ISNTXOF)) && ((tty->rawOutBufState == rob_idle) ffc07708: 80 1f 00 94 lwz r0,148(r31) <== NOT EXECUTED ffc0770c: 2f 80 00 00 cmpwi cr7,r0,0 <== NOT EXECUTED ffc07710: 41 9e 00 10 beq- cr7,ffc07720 <== NOT EXECUTED || (tty->flow_ctrl & FL_OSTOP))) { ffc07714: 80 1f 00 b8 lwz r0,184(r31) <== NOT EXECUTED ffc07718: 70 09 00 20 andi. r9,r0,32 <== NOT EXECUTED ffc0771c: 41 82 00 20 beq- ffc0773c <== NOT EXECUTED /* XON should be sent now... */ (*tty->device.write)( ffc07720: 80 1f 00 a4 lwz r0,164(r31) <== NOT EXECUTED ffc07724: 7f 04 c3 78 mr r4,r24 <== NOT EXECUTED ffc07728: 80 7f 00 10 lwz r3,16(r31) <== NOT EXECUTED ffc0772c: 38 a0 00 01 li r5,1 <== NOT EXECUTED ffc07730: 7c 09 03 a6 mtctr r0 <== NOT EXECUTED ffc07734: 4e 80 04 21 bctrl <== NOT EXECUTED ffc07738: 48 00 00 34 b ffc0776c <== NOT EXECUTED tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1); } else if (tty->flow_ctrl & FL_MDRTS) { ffc0773c: 80 1f 00 b8 lwz r0,184(r31) ffc07740: 70 09 01 00 andi. r9,r0,256 ffc07744: 41 82 00 28 beq- ffc0776c <== ALWAYS TAKEN tty->flow_ctrl &= ~FL_IRTSOFF; ffc07748: 80 1f 00 b8 lwz r0,184(r31) <== NOT EXECUTED ffc0774c: 54 00 07 b8 rlwinm r0,r0,0,30,28 <== NOT EXECUTED ffc07750: 90 1f 00 b8 stw r0,184(r31) <== NOT EXECUTED /* activate RTS line */ if (tty->device.startRemoteTx != NULL) { ffc07754: 80 1f 00 b0 lwz r0,176(r31) <== NOT EXECUTED ffc07758: 2f 80 00 00 cmpwi cr7,r0,0 <== NOT EXECUTED ffc0775c: 41 9e 00 10 beq- cr7,ffc0776c <== NOT EXECUTED tty->device.startRemoteTx(tty->minor); ffc07760: 80 7f 00 10 lwz r3,16(r31) <== NOT EXECUTED ffc07764: 7c 09 03 a6 mtctr r0 <== NOT EXECUTED ffc07768: 4e 80 04 21 bctrl <== NOT EXECUTED } } } /* continue processing new character */ if (tty->termios.c_lflag & ICANON) { ffc0776c: 80 1f 00 3c lwz r0,60(r31) ffc07770: 70 09 00 02 andi. r9,r0,2 ffc07774: 41 82 00 20 beq- ffc07794 <== NEVER TAKEN if (siproc (c, tty)) ffc07778: 7f 43 d3 78 mr r3,r26 ffc0777c: 7f e4 fb 78 mr r4,r31 ffc07780: 4b ff fc 39 bl ffc073b8 wait = 0; ffc07784: 30 63 ff ff addic r3,r3,-1 ffc07788: 7c 63 19 10 subfe r3,r3,r3 ffc0778c: 7f bd 18 38 and r29,r29,r3 ffc07790: 48 00 00 2c b ffc077bc } else { siproc (c, tty); ffc07794: 7f 43 d3 78 mr r3,r26 <== NOT EXECUTED ffc07798: 7f e4 fb 78 mr r4,r31 <== NOT EXECUTED ffc0779c: 4b ff fc 1d bl ffc073b8 <== NOT EXECUTED if (tty->ccount >= tty->termios.c_cc[VMIN]) ffc077a0: 88 1f 00 47 lbz r0,71(r31) <== NOT EXECUTED ffc077a4: 81 3f 00 20 lwz r9,32(r31) <== NOT EXECUTED wait = 0; ffc077a8: 7f 89 00 00 cmpw cr7,r9,r0 <== NOT EXECUTED ffc077ac: 7c 00 00 26 mfcr r0 <== NOT EXECUTED ffc077b0: 54 00 ef fe rlwinm r0,r0,29,31,31 <== NOT EXECUTED ffc077b4: 7c 00 00 d0 neg r0,r0 <== NOT EXECUTED ffc077b8: 7f bd 00 38 and r29,r29,r0 <== NOT EXECUTED } timeout = tty->rawInBufSemaphoreTimeout; ffc077bc: 83 5f 00 70 lwz r26,112(r31) while ( wait ) { /* * Process characters read from raw queue */ while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) && ffc077c0: 81 3f 00 5c lwz r9,92(r31) ffc077c4: 80 1f 00 60 lwz r0,96(r31) ffc077c8: 7f 89 00 00 cmpw cr7,r9,r0 ffc077cc: 41 9e 00 1c beq- cr7,ffc077e8 (tty->ccount < (CBUFSIZE-1))) { ffc077d0: 39 37 21 84 addi r9,r23,8580 ffc077d4: 81 29 00 08 lwz r9,8(r9) ffc077d8: 38 09 ff ff addi r0,r9,-1 while ( wait ) { /* * Process characters read from raw queue */ while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) && ffc077dc: 81 3f 00 20 lwz r9,32(r31) ffc077e0: 7f 89 00 00 cmpw cr7,r9,r0 ffc077e4: 41 9c fe b8 blt+ cr7,ffc0769c <== ALWAYS TAKEN } /* * Wait for characters */ if ( wait ) { ffc077e8: 2f 9d 00 00 cmpwi cr7,r29,0 ffc077ec: 41 be 00 1c beq+ cr7,ffc07808 sc = rtems_semaphore_obtain( ffc077f0: 80 7f 00 68 lwz r3,104(r31) ffc077f4: 7f 45 d3 78 mr r5,r26 ffc077f8: 80 9f 00 6c lwz r4,108(r31) ffc077fc: 48 00 12 29 bl ffc08a24 tty->rawInBuf.Semaphore, tty->rawInBufSemaphoreOptions, timeout); if (sc != RTEMS_SUCCESSFUL) ffc07800: 2f 83 00 00 cmpwi cr7,r3,0 ffc07804: 41 9e ff bc beq+ cr7,ffc077c0 <== ALWAYS TAKEN } return RTEMS_SUCCESSFUL; } rtems_status_code rtems_termios_read (void *arg) ffc07808: 38 1b 00 01 addi r0,r27,1 ffc0780c: 3b 39 ff ff addi r25,r25,-1 ffc07810: 7c 09 03 a6 mtctr r0 ffc07814: 48 00 00 1c b ffc07830 if (sc != RTEMS_SUCCESSFUL) tty->cindex = tty->ccount = 0; } while (count && (tty->cindex < tty->ccount)) { *buffer++ = tty->cbuf[tty->cindex++]; ffc07818: 81 7f 00 1c lwz r11,28(r31) count--; ffc0781c: 3b 7b ff ff addi r27,r27,-1 if (sc != RTEMS_SUCCESSFUL) tty->cindex = tty->ccount = 0; } while (count && (tty->cindex < tty->ccount)) { *buffer++ = tty->cbuf[tty->cindex++]; ffc07820: 7c 0b 48 ae lbzx r0,r11,r9 ffc07824: 39 29 00 01 addi r9,r9,1 ffc07828: 9c 19 00 01 stbu r0,1(r25) ffc0782c: 91 3f 00 24 stw r9,36(r31) sc = fillBufferQueue (tty); if (sc != RTEMS_SUCCESSFUL) tty->cindex = tty->ccount = 0; } while (count && (tty->cindex < tty->ccount)) { ffc07830: 42 40 00 14 bdz- ffc07844 ffc07834: 81 3f 00 24 lwz r9,36(r31) ffc07838: 80 1f 00 20 lwz r0,32(r31) ffc0783c: 7f 89 00 00 cmpw cr7,r9,r0 ffc07840: 41 9c ff d8 blt+ cr7,ffc07818 *buffer++ = tty->cbuf[tty->cindex++]; count--; } args->bytes_moved = args->count - count; ffc07844: 80 1e 00 14 lwz r0,20(r30) ffc07848: 7f 7b 00 50 subf r27,r27,r0 ffc0784c: 93 7e 00 1c stw r27,28(r30) tty->tty_rcvwakeup = 0; ffc07850: 38 00 00 00 li r0,0 rtems_semaphore_release (tty->isem); ffc07854: 80 7f 00 14 lwz r3,20(r31) while (count && (tty->cindex < tty->ccount)) { *buffer++ = tty->cbuf[tty->cindex++]; count--; } args->bytes_moved = args->count - count; tty->tty_rcvwakeup = 0; ffc07858: 90 1f 00 e4 stw r0,228(r31) rtems_semaphore_release (tty->isem); ffc0785c: 48 00 12 f1 bl ffc08b4c return sc; } ffc07860: 39 61 00 30 addi r11,r1,48 ffc07864: 7f 83 e3 78 mr r3,r28 ffc07868: 48 01 19 28 b ffc19190 <_restgpr_23_x> =============================================================================== ffc07bf4 : * 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) { ffc07bf4: 94 21 ff e8 stwu r1,-24(r1) ffc07bf8: 7c 08 02 a6 mflr r0 ffc07bfc: 90 01 00 1c stw r0,28(r1) int nToSend; rtems_interrupt_level level; int len; /* check for XOF/XON to send */ if ((tty->flow_ctrl & (FL_MDXOF | FL_IREQXOF | FL_ISNTXOF)) ffc07c00: 80 03 00 b8 lwz r0,184(r3) * 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) { ffc07c04: bf a1 00 0c stmw r29,12(r1) ffc07c08: 7c 7f 1b 78 mr r31,r3 int nToSend; rtems_interrupt_level level; int len; /* check for XOF/XON to send */ if ((tty->flow_ctrl & (FL_MDXOF | FL_IREQXOF | FL_ISNTXOF)) ffc07c0c: 70 00 04 03 andi. r0,r0,1027 ffc07c10: 2f 80 04 01 cmpwi cr7,r0,1025 ffc07c14: 40 be 00 3c bne+ cr7,ffc07c50 <== ALWAYS TAKEN == (FL_MDXOF | FL_IREQXOF)) { /* XOFF should be sent now... */ (*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTOP]), 1); ffc07c18: 80 03 00 a4 lwz r0,164(r3) <== NOT EXECUTED ffc07c1c: 38 9f 00 4a addi r4,r31,74 <== NOT EXECUTED ffc07c20: 38 a0 00 01 li r5,1 <== NOT EXECUTED ffc07c24: 80 63 00 10 lwz r3,16(r3) <== NOT EXECUTED ffc07c28: 7c 09 03 a6 mtctr r0 <== NOT EXECUTED ffc07c2c: 4e 80 04 21 bctrl <== NOT EXECUTED rtems_interrupt_disable(level); ffc07c30: 4b ff e6 51 bl ffc06280 <== NOT EXECUTED tty->t_dqlen--; ffc07c34: 81 3f 00 90 lwz r9,144(r31) <== NOT EXECUTED ffc07c38: 38 09 ff ff addi r0,r9,-1 <== NOT EXECUTED ffc07c3c: 90 1f 00 90 stw r0,144(r31) <== NOT EXECUTED tty->flow_ctrl |= FL_ISNTXOF; ffc07c40: 80 1f 00 b8 lwz r0,184(r31) <== NOT EXECUTED ffc07c44: 60 00 00 02 ori r0,r0,2 <== NOT EXECUTED ffc07c48: 90 1f 00 b8 stw r0,184(r31) <== NOT EXECUTED rtems_interrupt_enable(level); ffc07c4c: 48 00 00 48 b ffc07c94 <== NOT EXECUTED nToSend = 1; } else if ((tty->flow_ctrl & (FL_IREQXOF | FL_ISNTXOF)) == FL_ISNTXOF) { ffc07c50: 80 03 00 b8 lwz r0,184(r3) ffc07c54: 54 00 07 be clrlwi r0,r0,30 ffc07c58: 2f 80 00 02 cmpwi cr7,r0,2 ffc07c5c: 40 be 00 44 bne+ cr7,ffc07ca0 <== 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); ffc07c60: 80 03 00 a4 lwz r0,164(r3) <== NOT EXECUTED ffc07c64: 38 9f 00 49 addi r4,r31,73 <== NOT EXECUTED ffc07c68: 38 a0 00 01 li r5,1 <== NOT EXECUTED ffc07c6c: 80 63 00 10 lwz r3,16(r3) <== NOT EXECUTED ffc07c70: 7c 09 03 a6 mtctr r0 <== NOT EXECUTED ffc07c74: 4e 80 04 21 bctrl <== NOT EXECUTED rtems_interrupt_disable(level); ffc07c78: 4b ff e6 09 bl ffc06280 <== NOT EXECUTED tty->t_dqlen--; ffc07c7c: 81 3f 00 90 lwz r9,144(r31) <== NOT EXECUTED ffc07c80: 38 09 ff ff addi r0,r9,-1 <== NOT EXECUTED ffc07c84: 90 1f 00 90 stw r0,144(r31) <== NOT EXECUTED tty->flow_ctrl &= ~FL_ISNTXOF; ffc07c88: 80 1f 00 b8 lwz r0,184(r31) <== NOT EXECUTED ffc07c8c: 54 00 07 fa rlwinm r0,r0,0,31,29 <== NOT EXECUTED ffc07c90: 90 1f 00 b8 stw r0,184(r31) <== NOT EXECUTED ffc07c94: 7c 60 01 24 mtmsr r3 <== NOT EXECUTED rtems_interrupt_enable(level); nToSend = 1; ffc07c98: 3b c0 00 01 li r30,1 <== NOT EXECUTED ffc07c9c: 48 00 01 34 b ffc07dd0 <== NOT EXECUTED } else { if ( tty->rawOutBuf.Head == tty->rawOutBuf.Tail ) { ffc07ca0: 81 23 00 80 lwz r9,128(r3) ffc07ca4: 80 03 00 84 lwz r0,132(r3) ffc07ca8: 7f 89 00 00 cmpw cr7,r9,r0 ffc07cac: 40 9e 00 20 bne- cr7,ffc07ccc /* * buffer was empty */ if (tty->rawOutBufState == rob_wait) { ffc07cb0: 80 03 00 94 lwz r0,148(r3) /* * this should never happen... */ rtems_semaphore_release (tty->rawOutBuf.Semaphore); } return 0; ffc07cb4: 3b c0 00 00 li r30,0 } else { if ( tty->rawOutBuf.Head == tty->rawOutBuf.Tail ) { /* * buffer was empty */ if (tty->rawOutBufState == rob_wait) { ffc07cb8: 2f 80 00 02 cmpwi cr7,r0,2 ffc07cbc: 40 be 01 14 bne+ cr7,ffc07dd0 <== ALWAYS TAKEN /* * this should never happen... */ rtems_semaphore_release (tty->rawOutBuf.Semaphore); ffc07cc0: 80 63 00 8c lwz r3,140(r3) <== NOT EXECUTED ffc07cc4: 48 00 0e 89 bl ffc08b4c <== NOT EXECUTED ffc07cc8: 48 00 01 08 b ffc07dd0 <== NOT EXECUTED } return 0; } rtems_interrupt_disable(level); ffc07ccc: 4b ff e5 b5 bl ffc06280 len = tty->t_dqlen; tty->t_dqlen = 0; ffc07cd0: 38 00 00 00 li r0,0 } return 0; } rtems_interrupt_disable(level); len = tty->t_dqlen; ffc07cd4: 83 bf 00 90 lwz r29,144(r31) tty->t_dqlen = 0; ffc07cd8: 90 1f 00 90 stw r0,144(r31) ffc07cdc: 7c 60 01 24 mtmsr r3 rtems_interrupt_enable(level); newTail = (tty->rawOutBuf.Tail + len) % tty->rawOutBuf.Size; ffc07ce0: 80 1f 00 84 lwz r0,132(r31) ffc07ce4: 81 3f 00 88 lwz r9,136(r31) ffc07ce8: 7c 1d 02 14 add r0,r29,r0 ffc07cec: 7f a0 4b 96 divwu r29,r0,r9 ffc07cf0: 7f bd 49 d6 mullw r29,r29,r9 ffc07cf4: 7f bd 00 50 subf r29,r29,r0 tty->rawOutBuf.Tail = newTail; if (tty->rawOutBufState == rob_wait) { ffc07cf8: 80 1f 00 94 lwz r0,148(r31) len = tty->t_dqlen; tty->t_dqlen = 0; rtems_interrupt_enable(level); newTail = (tty->rawOutBuf.Tail + len) % tty->rawOutBuf.Size; tty->rawOutBuf.Tail = newTail; ffc07cfc: 93 bf 00 84 stw r29,132(r31) if (tty->rawOutBufState == rob_wait) { ffc07d00: 2f 80 00 02 cmpwi cr7,r0,2 ffc07d04: 40 be 00 0c bne+ cr7,ffc07d10 /* * wake up any pending writer task */ rtems_semaphore_release (tty->rawOutBuf.Semaphore); ffc07d08: 80 7f 00 8c lwz r3,140(r31) ffc07d0c: 48 00 0e 41 bl ffc08b4c } if (newTail == tty->rawOutBuf.Head) { ffc07d10: 80 1f 00 80 lwz r0,128(r31) ffc07d14: 7f 9d 00 00 cmpw cr7,r29,r0 ffc07d18: 40 be 00 30 bne+ cr7,ffc07d48 /* * Buffer has become empty */ tty->rawOutBufState = rob_idle; ffc07d1c: 38 00 00 00 li r0,0 ffc07d20: 90 1f 00 94 stw r0,148(r31) nToSend = 0; ffc07d24: 3b c0 00 00 li r30,0 /* * check to see if snd wakeup callback was set */ if ( tty->tty_snd.sw_pfn != NULL) { ffc07d28: 80 1f 00 d4 lwz r0,212(r31) ffc07d2c: 2f 80 00 00 cmpwi cr7,r0,0 ffc07d30: 41 9e 00 9c beq- cr7,ffc07dcc <== ALWAYS TAKEN (*tty->tty_snd.sw_pfn)(&tty->termios, tty->tty_snd.sw_arg); ffc07d34: 38 7f 00 30 addi r3,r31,48 <== NOT EXECUTED ffc07d38: 80 9f 00 d8 lwz r4,216(r31) <== NOT EXECUTED ffc07d3c: 7c 09 03 a6 mtctr r0 <== NOT EXECUTED ffc07d40: 4e 80 04 21 bctrl <== NOT EXECUTED ffc07d44: 48 00 00 88 b ffc07dcc <== NOT EXECUTED } } /* check, whether output should stop due to received XOFF */ else if ((tty->flow_ctrl & (FL_MDXON | FL_ORCVXOF)) ffc07d48: 80 1f 00 b8 lwz r0,184(r31) ffc07d4c: 70 00 02 10 andi. r0,r0,528 ffc07d50: 2f 80 02 10 cmpwi cr7,r0,528 ffc07d54: 40 be 00 28 bne+ cr7,ffc07d7c <== 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); ffc07d58: 4b ff e5 29 bl ffc06280 <== NOT EXECUTED tty->flow_ctrl |= FL_OSTOP; ffc07d5c: 80 1f 00 b8 lwz r0,184(r31) <== NOT EXECUTED ffc07d60: 60 00 00 20 ori r0,r0,32 <== NOT EXECUTED ffc07d64: 90 1f 00 b8 stw r0,184(r31) <== NOT EXECUTED tty->rawOutBufState = rob_busy; /*apm*/ ffc07d68: 38 00 00 01 li r0,1 <== NOT EXECUTED ffc07d6c: 90 1f 00 94 stw r0,148(r31) <== NOT EXECUTED ffc07d70: 7c 60 01 24 mtmsr r3 <== NOT EXECUTED rtems_interrupt_enable(level); nToSend = 0; ffc07d74: 3b c0 00 00 li r30,0 <== NOT EXECUTED ffc07d78: 48 00 00 54 b ffc07dcc <== NOT EXECUTED } else { /* * Buffer not empty, start tranmitter */ if (newTail > tty->rawOutBuf.Head) ffc07d7c: 80 1f 00 80 lwz r0,128(r31) ffc07d80: 7f 9d 00 40 cmplw cr7,r29,r0 ffc07d84: 40 9d 00 0c ble- cr7,ffc07d90 nToSend = tty->rawOutBuf.Size - newTail; ffc07d88: 83 df 00 88 lwz r30,136(r31) ffc07d8c: 48 00 00 08 b ffc07d94 else nToSend = tty->rawOutBuf.Head - newTail; ffc07d90: 83 df 00 80 lwz r30,128(r31) /* 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)) { ffc07d94: 80 1f 00 b8 lwz r0,184(r31) * Buffer not empty, start tranmitter */ if (newTail > tty->rawOutBuf.Head) nToSend = tty->rawOutBuf.Size - newTail; else nToSend = tty->rawOutBuf.Head - newTail; ffc07d98: 7f dd f0 50 subf r30,r29,r30 /* 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)) { ffc07d9c: 70 09 06 00 andi. r9,r0,1536 ffc07da0: 41 82 00 08 beq- ffc07da8 nToSend = 1; ffc07da4: 3b c0 00 01 li r30,1 } tty->rawOutBufState = rob_busy; /*apm*/ ffc07da8: 38 00 00 01 li r0,1 (*tty->device.write)( ffc07dac: 80 9f 00 7c lwz r4,124(r31) /* to allow fast reaction on incoming flow ctrl and low latency*/ /* for outgoing flow control */ if (tty->flow_ctrl & (FL_MDXON | FL_MDXOF)) { nToSend = 1; } tty->rawOutBufState = rob_busy; /*apm*/ ffc07db0: 90 1f 00 94 stw r0,148(r31) (*tty->device.write)( ffc07db4: 7f c5 f3 78 mr r5,r30 ffc07db8: 7c 84 ea 14 add r4,r4,r29 ffc07dbc: 80 1f 00 a4 lwz r0,164(r31) ffc07dc0: 80 7f 00 10 lwz r3,16(r31) ffc07dc4: 7c 09 03 a6 mtctr r0 ffc07dc8: 4e 80 04 21 bctrl tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend); } tty->rawOutBuf.Tail = newTail; /*apm*/ ffc07dcc: 93 bf 00 84 stw r29,132(r31) } return nToSend; } ffc07dd0: 39 61 00 18 addi r11,r1,24 ffc07dd4: 7f c3 f3 78 mr r3,r30 ffc07dd8: 48 01 13 d0 b ffc191a8 <_restgpr_29_x> =============================================================================== ffc07b78 : /* * this task actually processes any receive events */ static rtems_task rtems_termios_rxdaemon(rtems_task_argument argument) { ffc07b78: 94 21 ff d8 stwu r1,-40(r1) ffc07b7c: 7c 08 02 a6 mflr r0 ffc07b80: 90 01 00 2c stw r0,44(r1) ffc07b84: bf a1 00 1c stmw r29,28(r1) ffc07b88: 7c 7f 1b 78 mr r31,r3 while (1) { /* * wait for rtems event */ rtems_event_receive( ffc07b8c: 3b a1 00 0c addi r29,r1,12 if (c != EOF) { /* * pollRead did call enqueue on its own */ c_buf = c; rtems_termios_enqueue_raw_characters ( tty,&c_buf,1); ffc07b90: 3b c1 00 08 addi r30,r1,8 while (1) { /* * wait for rtems event */ rtems_event_receive( ffc07b94: 38 60 00 03 li r3,3 ffc07b98: 38 80 00 02 li r4,2 ffc07b9c: 38 a0 00 00 li r5,0 ffc07ba0: 7f a6 eb 78 mr r6,r29 ffc07ba4: 48 00 08 29 bl ffc083cc (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) { ffc07ba8: 80 01 00 0c lwz r0,12(r1) ffc07bac: 70 09 00 01 andi. r9,r0,1 ffc07bb0: 41 a2 00 14 beq+ ffc07bc4 <== ALWAYS TAKEN tty->rxTaskId = 0; ffc07bb4: 38 00 00 00 li r0,0 <== NOT EXECUTED ffc07bb8: 90 1f 00 c4 stw r0,196(r31) <== NOT EXECUTED rtems_task_delete(RTEMS_SELF); ffc07bbc: 38 60 00 00 li r3,0 <== NOT EXECUTED ffc07bc0: 48 00 11 89 bl ffc08d48 <== NOT EXECUTED } /* * do something */ c = tty->device.pollRead(tty->minor); ffc07bc4: 80 1f 00 a0 lwz r0,160(r31) ffc07bc8: 80 7f 00 10 lwz r3,16(r31) ffc07bcc: 7c 09 03 a6 mtctr r0 ffc07bd0: 4e 80 04 21 bctrl if (c != EOF) { ffc07bd4: 2f 83 ff ff cmpwi cr7,r3,-1 ffc07bd8: 41 9e ff bc beq+ cr7,ffc07b94 /* * pollRead did call enqueue on its own */ c_buf = c; ffc07bdc: 98 61 00 08 stb r3,8(r1) rtems_termios_enqueue_raw_characters ( tty,&c_buf,1); ffc07be0: 7f c4 f3 78 mr r4,r30 ffc07be4: 7f e3 fb 78 mr r3,r31 ffc07be8: 38 a0 00 01 li r5,1 ffc07bec: 4b ff fc a9 bl ffc07894 ffc07bf0: 4b ff ff a4 b ffc07b94 =============================================================================== ffc07ddc : /* * this task actually processes any transmit events */ static rtems_task rtems_termios_txdaemon(rtems_task_argument argument) { ffc07ddc: 94 21 ff d8 stwu r1,-40(r1) ffc07de0: 7c 08 02 a6 mflr r0 ffc07de4: bf a1 00 1c stmw r29,28(r1) } /* * call any line discipline start function */ if (rtems_termios_linesw[tty->t_line].l_start != NULL) { ffc07de8: 3f c0 00 00 lis r30,0 /* * this task actually processes any transmit events */ static rtems_task rtems_termios_txdaemon(rtems_task_argument argument) { ffc07dec: 7c 7f 1b 78 mr r31,r3 ffc07df0: 90 01 00 2c stw r0,44(r1) while (1) { /* * wait for rtems event */ rtems_event_receive( ffc07df4: 3b a1 00 08 addi r29,r1,8 } /* * call any line discipline start function */ if (rtems_termios_linesw[tty->t_line].l_start != NULL) { ffc07df8: 3b de 28 fc addi r30,r30,10492 while (1) { /* * wait for rtems event */ rtems_event_receive( ffc07dfc: 38 60 00 03 li r3,3 ffc07e00: 38 80 00 02 li r4,2 ffc07e04: 38 a0 00 00 li r5,0 ffc07e08: 7f a6 eb 78 mr r6,r29 ffc07e0c: 48 00 05 c1 bl ffc083cc (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) { ffc07e10: 80 01 00 08 lwz r0,8(r1) ffc07e14: 70 09 00 01 andi. r9,r0,1 ffc07e18: 41 a2 00 14 beq+ ffc07e2c <== ALWAYS TAKEN tty->txTaskId = 0; ffc07e1c: 38 00 00 00 li r0,0 <== NOT EXECUTED ffc07e20: 90 1f 00 c8 stw r0,200(r31) <== NOT EXECUTED rtems_task_delete(RTEMS_SELF); ffc07e24: 38 60 00 00 li r3,0 <== NOT EXECUTED ffc07e28: 48 00 0f 21 bl ffc08d48 <== NOT EXECUTED } /* * call any line discipline start function */ if (rtems_termios_linesw[tty->t_line].l_start != NULL) { ffc07e2c: 81 3f 00 cc lwz r9,204(r31) ffc07e30: 55 29 28 34 rlwinm r9,r9,5,0,26 ffc07e34: 7d 3e 4a 14 add r9,r30,r9 ffc07e38: 80 09 00 14 lwz r0,20(r9) ffc07e3c: 2f 80 00 00 cmpwi cr7,r0,0 ffc07e40: 41 9e 00 10 beq- cr7,ffc07e50 <== ALWAYS TAKEN rtems_termios_linesw[tty->t_line].l_start(tty); ffc07e44: 7f e3 fb 78 mr r3,r31 <== NOT EXECUTED ffc07e48: 7c 09 03 a6 mtctr r0 <== NOT EXECUTED ffc07e4c: 4e 80 04 21 bctrl <== NOT EXECUTED } /* * try to push further characters to device */ rtems_termios_refill_transmitter(tty); ffc07e50: 7f e3 fb 78 mr r3,r31 ffc07e54: 4b ff fd a1 bl ffc07bf4 } ffc07e58: 4b ff ff a4 b ffc07dfc =============================================================================== ffc07424 : rtems_termios_puts (&c, 1, tty); } rtems_status_code rtems_termios_write (void *arg) { ffc07424: 94 21 ff e0 stwu r1,-32(r1) ffc07428: 7c 08 02 a6 mflr r0 rtems_libio_rw_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; rtems_status_code sc; sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); ffc0742c: 38 80 00 00 li r4,0 rtems_termios_puts (&c, 1, tty); } rtems_status_code rtems_termios_write (void *arg) { ffc07430: 90 01 00 24 stw r0,36(r1) rtems_libio_rw_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; rtems_status_code sc; sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); ffc07434: 38 a0 00 00 li r5,0 rtems_status_code rtems_termios_write (void *arg) { rtems_libio_rw_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; ffc07438: 81 23 00 00 lwz r9,0(r3) rtems_termios_puts (&c, 1, tty); } rtems_status_code rtems_termios_write (void *arg) { ffc0743c: bf 61 00 0c stmw r27,12(r1) ffc07440: 7c 7e 1b 78 mr r30,r3 rtems_libio_rw_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; ffc07444: 83 e9 00 38 lwz r31,56(r9) rtems_status_code sc; sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); ffc07448: 80 7f 00 18 lwz r3,24(r31) ffc0744c: 48 00 15 d9 bl ffc08a24 if (sc != RTEMS_SUCCESSFUL) ffc07450: 7c 7d 1b 79 mr. r29,r3 ffc07454: 40 82 00 90 bne- ffc074e4 <== NEVER TAKEN return sc; if (rtems_termios_linesw[tty->t_line].l_write != NULL) { ffc07458: 80 1f 00 cc lwz r0,204(r31) ffc0745c: 3d 20 00 00 lis r9,0 ffc07460: 39 29 28 fc addi r9,r9,10492 ffc07464: 54 00 28 34 rlwinm r0,r0,5,0,26 ffc07468: 7d 29 02 14 add r9,r9,r0 ffc0746c: 80 09 00 0c lwz r0,12(r9) ffc07470: 2f 80 00 00 cmpwi cr7,r0,0 ffc07474: 41 9e 00 1c beq- cr7,ffc07490 sc = rtems_termios_linesw[tty->t_line].l_write(tty,args); ffc07478: 7f e3 fb 78 mr r3,r31 ffc0747c: 7c 09 03 a6 mtctr r0 ffc07480: 7f c4 f3 78 mr r4,r30 ffc07484: 4e 80 04 21 bctrl ffc07488: 7c 7d 1b 78 mr r29,r3 ffc0748c: 48 00 00 50 b ffc074dc rtems_semaphore_release (tty->osem); return sc; } if (tty->termios.c_oflag & OPOST) { ffc07490: 80 1f 00 34 lwz r0,52(r31) ffc07494: 80 9e 00 14 lwz r4,20(r30) ffc07498: 70 09 00 01 andi. r9,r0,1 ffc0749c: 80 7e 00 10 lwz r3,16(r30) ffc074a0: 41 82 00 2c beq- ffc074cc <== NEVER TAKEN uint32_t count = args->count; ffc074a4: 7c 9c 23 78 mr r28,r4 } rtems_termios_puts (&c, 1, tty); } rtems_status_code rtems_termios_write (void *arg) ffc074a8: 3b 63 ff ff addi r27,r3,-1 return sc; } if (tty->termios.c_oflag & OPOST) { uint32_t count = args->count; char *buffer = args->buffer; while (count--) ffc074ac: 48 00 00 14 b ffc074c0 oproc (*buffer++, tty); ffc074b0: 8c 7b 00 01 lbzu r3,1(r27) ffc074b4: 7f e4 fb 78 mr r4,r31 ffc074b8: 3b 9c ff ff addi r28,r28,-1 ffc074bc: 4b ff f9 49 bl ffc06e04 return sc; } if (tty->termios.c_oflag & OPOST) { uint32_t count = args->count; char *buffer = args->buffer; while (count--) ffc074c0: 2f 9c 00 00 cmpwi cr7,r28,0 ffc074c4: 40 9e ff ec bne+ cr7,ffc074b0 ffc074c8: 48 00 00 0c b ffc074d4 oproc (*buffer++, tty); args->bytes_moved = args->count; } else { rtems_termios_puts (args->buffer, args->count, tty); ffc074cc: 7f e5 fb 78 mr r5,r31 <== NOT EXECUTED ffc074d0: 4b ff f8 0d bl ffc06cdc <== NOT EXECUTED args->bytes_moved = args->count; ffc074d4: 80 1e 00 14 lwz r0,20(r30) ffc074d8: 90 1e 00 1c stw r0,28(r30) } rtems_semaphore_release (tty->osem); ffc074dc: 80 7f 00 18 lwz r3,24(r31) ffc074e0: 48 00 16 6d bl ffc08b4c return sc; } ffc074e4: 39 61 00 20 addi r11,r1,32 ffc074e8: 7f a3 eb 78 mr r3,r29 ffc074ec: 48 01 1c b4 b ffc191a0 <_restgpr_27_x> =============================================================================== ffc1885c : */ rtems_status_code rtems_timer_cancel( rtems_id id ) { ffc1885c: 94 21 ff e8 stwu r1,-24(r1) ffc18860: 7c 08 02 a6 mflr r0 ffc18864: 7c 64 1b 78 mr r4,r3 Objects_Id id, Objects_Locations *location ) { return (Timer_Control *) _Objects_Get( &_Timer_Information, id, location ); ffc18868: 3c 60 00 00 lis r3,0 ffc1886c: 90 01 00 1c stw r0,28(r1) ffc18870: 38 63 79 7c addi r3,r3,31100 ffc18874: 38 a1 00 08 addi r5,r1,8 ffc18878: 48 00 32 81 bl ffc1baf8 <_Objects_Get> Timer_Control *the_timer; Objects_Locations location; the_timer = _Timer_Get( id, &location ); switch ( location ) { ffc1887c: 80 01 00 08 lwz r0,8(r1) ffc18880: 2f 80 00 00 cmpwi cr7,r0,0 ffc18884: 40 9e 00 24 bne- cr7,ffc188a8 case OBJECTS_LOCAL: if ( !_Timer_Is_dormant_class( the_timer->the_class ) ) ffc18888: 80 03 00 38 lwz r0,56(r3) ffc1888c: 2f 80 00 04 cmpwi cr7,r0,4 ffc18890: 41 9e 00 0c beq- cr7,ffc1889c <== NEVER TAKEN (void) _Watchdog_Remove( &the_timer->Ticker ); ffc18894: 38 63 00 10 addi r3,r3,16 ffc18898: 48 00 54 b5 bl ffc1dd4c <_Watchdog_Remove> _Thread_Enable_dispatch(); ffc1889c: 48 00 40 51 bl ffc1c8ec <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; ffc188a0: 38 60 00 00 li r3,0 ffc188a4: 48 00 00 08 b ffc188ac #endif case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; ffc188a8: 38 60 00 04 li r3,4 } ffc188ac: 80 01 00 1c lwz r0,28(r1) ffc188b0: 38 21 00 18 addi r1,r1,24 ffc188b4: 7c 08 03 a6 mtlr r0 ffc188b8: 4e 80 00 20 blr =============================================================================== ffc18ddc : rtems_id id, rtems_time_of_day *wall_time, rtems_timer_service_routine_entry routine, void *user_data ) { ffc18ddc: 94 21 ff c8 stwu r1,-56(r1) Timer_Control *the_timer; Objects_Locations location; rtems_interval seconds; Timer_server_Control *timer_server = _Timer_server; ffc18de0: 3d 20 00 00 lis r9,0 rtems_id id, rtems_time_of_day *wall_time, rtems_timer_service_routine_entry routine, void *user_data ) { ffc18de4: 7c 08 02 a6 mflr r0 ffc18de8: bf 01 00 18 stmw r24,24(r1) ffc18dec: 7c 7f 1b 78 mr r31,r3 ffc18df0: 7c 9c 23 78 mr r28,r4 Timer_Control *the_timer; Objects_Locations location; rtems_interval seconds; Timer_server_Control *timer_server = _Timer_server; ffc18df4: 83 a9 29 3c lwz r29,10556(r9) rtems_id id, rtems_time_of_day *wall_time, rtems_timer_service_routine_entry routine, void *user_data ) { ffc18df8: 7c be 2b 78 mr r30,r5 ffc18dfc: 90 01 00 3c stw r0,60(r1) ffc18e00: 7c da 33 78 mr r26,r6 Timer_Control *the_timer; Objects_Locations location; rtems_interval seconds; Timer_server_Control *timer_server = _Timer_server; if ( !timer_server ) ffc18e04: 2f 9d 00 00 cmpwi cr7,r29,0 return RTEMS_INCORRECT_STATE; ffc18e08: 3b 20 00 0e li r25,14 Timer_Control *the_timer; Objects_Locations location; rtems_interval seconds; Timer_server_Control *timer_server = _Timer_server; if ( !timer_server ) ffc18e0c: 41 9e 00 c8 beq- cr7,ffc18ed4 return RTEMS_INCORRECT_STATE; if ( !_TOD_Is_set ) ffc18e10: 3d 20 00 00 lis r9,0 ffc18e14: 88 09 28 e4 lbz r0,10468(r9) return RTEMS_NOT_DEFINED; ffc18e18: 3b 20 00 0b li r25,11 Timer_server_Control *timer_server = _Timer_server; if ( !timer_server ) return RTEMS_INCORRECT_STATE; if ( !_TOD_Is_set ) ffc18e1c: 2f 80 00 00 cmpwi cr7,r0,0 ffc18e20: 41 9e 00 b4 beq- cr7,ffc18ed4 <== NEVER TAKEN return RTEMS_NOT_DEFINED; if ( !routine ) ffc18e24: 2f 85 00 00 cmpwi cr7,r5,0 return RTEMS_INVALID_ADDRESS; ffc18e28: 3b 20 00 09 li r25,9 return RTEMS_INCORRECT_STATE; if ( !_TOD_Is_set ) return RTEMS_NOT_DEFINED; if ( !routine ) ffc18e2c: 41 9e 00 a8 beq- cr7,ffc18ed4 return RTEMS_INVALID_ADDRESS; if ( !_TOD_Validate( wall_time ) ) ffc18e30: 7c 83 23 78 mr r3,r4 ffc18e34: 4b ff cc 5d bl ffc15a90 <_TOD_Validate> return RTEMS_INVALID_CLOCK; ffc18e38: 3b 20 00 14 li r25,20 return RTEMS_NOT_DEFINED; if ( !routine ) return RTEMS_INVALID_ADDRESS; if ( !_TOD_Validate( wall_time ) ) ffc18e3c: 2f 83 00 00 cmpwi cr7,r3,0 ffc18e40: 41 9e 00 94 beq- cr7,ffc18ed4 return RTEMS_INVALID_CLOCK; seconds = _TOD_To_seconds( wall_time ); ffc18e44: 7f 83 e3 78 mr r3,r28 if ( seconds <= _TOD_Seconds_since_epoch() ) ffc18e48: 3f 60 00 00 lis r27,0 return RTEMS_INVALID_ADDRESS; if ( !_TOD_Validate( wall_time ) ) return RTEMS_INVALID_CLOCK; seconds = _TOD_To_seconds( wall_time ); ffc18e4c: 4b ff cb b9 bl ffc15a04 <_TOD_To_seconds> if ( seconds <= _TOD_Seconds_since_epoch() ) ffc18e50: 80 1b 28 f8 lwz r0,10488(r27) return RTEMS_INVALID_ADDRESS; if ( !_TOD_Validate( wall_time ) ) return RTEMS_INVALID_CLOCK; seconds = _TOD_To_seconds( wall_time ); ffc18e54: 7c 7c 1b 78 mr r28,r3 if ( seconds <= _TOD_Seconds_since_epoch() ) ffc18e58: 7f 83 00 40 cmplw cr7,r3,r0 ffc18e5c: 40 9d 00 78 ble- cr7,ffc18ed4 ffc18e60: 3c 60 00 00 lis r3,0 ffc18e64: 38 63 79 7c addi r3,r3,31100 ffc18e68: 7f e4 fb 78 mr r4,r31 ffc18e6c: 38 a1 00 08 addi r5,r1,8 ffc18e70: 48 00 2c 89 bl ffc1baf8 <_Objects_Get> return RTEMS_INVALID_CLOCK; the_timer = _Timer_Get( id, &location ); switch ( location ) { ffc18e74: 83 01 00 08 lwz r24,8(r1) ffc18e78: 7c 79 1b 78 mr r25,r3 ffc18e7c: 2f 98 00 00 cmpwi cr7,r24,0 ffc18e80: 40 9e 00 50 bne- cr7,ffc18ed0 case OBJECTS_LOCAL: (void) _Watchdog_Remove( &the_timer->Ticker ); ffc18e84: 38 63 00 10 addi r3,r3,16 ffc18e88: 48 00 4e c5 bl ffc1dd4c <_Watchdog_Remove> the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK; ffc18e8c: 38 00 00 03 li r0,3 ffc18e90: 90 19 00 38 stw r0,56(r25) _Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data ); the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch(); (*timer_server->schedule_operation)( timer_server, the_timer ); ffc18e94: 7f 24 cb 78 mr r4,r25 ffc18e98: 7f a3 eb 78 mr r3,r29 case OBJECTS_LOCAL: (void) _Watchdog_Remove( &the_timer->Ticker ); the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK; _Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data ); the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch(); ffc18e9c: 80 1b 28 f8 lwz r0,10488(r27) Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; ffc18ea0: 93 19 00 18 stw r24,24(r25) ffc18ea4: 7f 80 e0 50 subf r28,r0,r28 (*timer_server->schedule_operation)( timer_server, the_timer ); ffc18ea8: 80 1d 00 04 lwz r0,4(r29) the_watchdog->routine = routine; ffc18eac: 93 d9 00 2c stw r30,44(r25) ffc18eb0: 7c 09 03 a6 mtctr r0 the_watchdog->id = id; ffc18eb4: 93 f9 00 30 stw r31,48(r25) the_watchdog->user_data = user_data; ffc18eb8: 93 59 00 34 stw r26,52(r25) case OBJECTS_LOCAL: (void) _Watchdog_Remove( &the_timer->Ticker ); the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK; _Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data ); the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch(); ffc18ebc: 93 99 00 1c stw r28,28(r25) (*timer_server->schedule_operation)( timer_server, the_timer ); _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; ffc18ec0: 3b 20 00 00 li r25,0 (void) _Watchdog_Remove( &the_timer->Ticker ); the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK; _Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data ); the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch(); (*timer_server->schedule_operation)( timer_server, the_timer ); ffc18ec4: 4e 80 04 21 bctrl _Thread_Enable_dispatch(); ffc18ec8: 48 00 3a 25 bl ffc1c8ec <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; ffc18ecc: 48 00 00 08 b ffc18ed4 #endif case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; ffc18ed0: 3b 20 00 04 li r25,4 } ffc18ed4: 39 61 00 38 addi r11,r1,56 ffc18ed8: 7f 23 cb 78 mr r3,r25 ffc18edc: 4b ff 54 ac b ffc0e388 <_restgpr_24_x> =============================================================================== ffc09130 : static int rtems_verror( rtems_error_code_t error_flag, const char *printf_format, va_list arglist ) { ffc09130: 94 21 ff e0 stwu r1,-32(r1) ffc09134: 7c 08 02 a6 mflr r0 ffc09138: 90 01 00 24 stw r0,36(r1) int local_errno = 0; int chars_written = 0; rtems_status_code status; if (error_flag & RTEMS_ERROR_PANIC) { ffc0913c: 74 60 20 00 andis. r0,r3,8192 static int rtems_verror( rtems_error_code_t error_flag, const char *printf_format, va_list arglist ) { ffc09140: bf 41 00 08 stmw r26,8(r1) ffc09144: 7c 7d 1b 78 mr r29,r3 ffc09148: 7c 9a 23 78 mr r26,r4 ffc0914c: 7c bb 2b 78 mr r27,r5 int local_errno = 0; int chars_written = 0; rtems_status_code status; if (error_flag & RTEMS_ERROR_PANIC) { ffc09150: 41 82 00 40 beq- ffc09190 if (rtems_panic_in_progress++) ffc09154: 3d 60 00 00 lis r11,0 ffc09158: 81 2b 28 2c lwz r9,10284(r11) ffc0915c: 2f 89 00 00 cmpwi cr7,r9,0 ffc09160: 38 09 00 01 addi r0,r9,1 ffc09164: 90 0b 28 2c stw r0,10284(r11) ffc09168: 41 9e 00 14 beq- cr7,ffc0917c <== ALWAYS TAKEN rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; ffc0916c: 3d 20 00 00 lis r9,0 <== NOT EXECUTED ffc09170: 81 69 28 4c lwz r11,10316(r9) <== NOT EXECUTED ffc09174: 38 0b 00 01 addi r0,r11,1 <== NOT EXECUTED ffc09178: 90 09 28 4c stw r0,10316(r9) <== NOT EXECUTED _Thread_Disable_dispatch(); /* disable task switches */ /* don't aggravate things */ if (rtems_panic_in_progress > 2) ffc0917c: 3d 20 00 00 lis r9,0 ffc09180: 80 09 28 2c lwz r0,10284(r9) return 0; ffc09184: 3b e0 00 00 li r31,0 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) ffc09188: 2f 80 00 02 cmpwi cr7,r0,2 ffc0918c: 41 9d 01 14 bgt- cr7,ffc092a0 <== NEVER TAKEN return 0; } (void) fflush(stdout); /* in case stdout/stderr same */ ffc09190: 3d 20 00 00 lis r9,0 ffc09194: 81 29 27 c8 lwz r9,10184(r9) status = error_flag & ~RTEMS_ERROR_MASK; ffc09198: 57 bc 01 00 rlwinm r28,r29,0,4,0 rtems_error_code_t error_flag, const char *printf_format, va_list arglist ) { int local_errno = 0; ffc0919c: 3b c0 00 00 li r30,0 /* don't aggravate things */ if (rtems_panic_in_progress > 2) return 0; } (void) fflush(stdout); /* in case stdout/stderr same */ ffc091a0: 80 69 00 08 lwz r3,8(r9) ffc091a4: 48 00 d2 3d bl ffc163e0 status = error_flag & ~RTEMS_ERROR_MASK; if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */ ffc091a8: 77 a0 40 00 andis. r0,r29,16384 ffc091ac: 41 a2 00 0c beq+ ffc091b8 local_errno = errno; ffc091b0: 48 00 cd 9d bl ffc15f4c <__errno> ffc091b4: 83 c3 00 00 lwz r30,0(r3) #if defined(RTEMS_MULTIPROCESSING) if (_System_state_Is_multiprocessing) fprintf(stderr, "[%" PRIu32 "] ", _Configuration_MP_table->node); #endif chars_written += vfprintf(stderr, printf_format, arglist); ffc091b8: 3f a0 00 00 lis r29,0 ffc091bc: 81 3d 27 c8 lwz r9,10184(r29) ffc091c0: 7f 44 d3 78 mr r4,r26 ffc091c4: 7f 65 db 78 mr r5,r27 ffc091c8: 80 69 00 0c lwz r3,12(r9) ffc091cc: 48 01 43 ad bl ffc1d578 if (status) ffc091d0: 2f 9c 00 00 cmpwi cr7,r28,0 #if defined(RTEMS_MULTIPROCESSING) if (_System_state_Is_multiprocessing) fprintf(stderr, "[%" PRIu32 "] ", _Configuration_MP_table->node); #endif chars_written += vfprintf(stderr, printf_format, arglist); ffc091d4: 7c 7f 1b 78 mr r31,r3 if (status) ffc091d8: 41 be 00 30 beq+ cr7,ffc09208 chars_written += fprintf(stderr, " (status: %s)", rtems_status_text(status)); ffc091dc: 81 3d 27 c8 lwz r9,10184(r29) ffc091e0: 7f 83 e3 78 mr r3,r28 ffc091e4: 83 a9 00 0c lwz r29,12(r9) ffc091e8: 4b ff ff 1d bl ffc09104 ffc091ec: 3c 80 ff c2 lis r4,-62 ffc091f0: 7c 65 1b 78 mr r5,r3 ffc091f4: 38 84 73 d0 addi r4,r4,29648 ffc091f8: 7f a3 eb 78 mr r3,r29 ffc091fc: 4c c6 31 82 crclr 4*cr1+eq ffc09200: 48 00 d7 15 bl ffc16914 #endif chars_written += vfprintf(stderr, printf_format, arglist); if (status) chars_written += ffc09204: 7f ff 1a 14 add r31,r31,r3 fprintf(stderr, " (status: %s)", rtems_status_text(status)); if (local_errno) { ffc09208: 2f 9e 00 00 cmpwi cr7,r30,0 ffc0920c: 41 9e 00 68 beq- cr7,ffc09274 if ((local_errno > 0) && *strerror(local_errno)) ffc09210: 40 9d 00 40 ble- cr7,ffc09250 ffc09214: 7f c3 f3 78 mr r3,r30 ffc09218: 48 00 e5 f9 bl ffc17810 ffc0921c: 88 03 00 00 lbz r0,0(r3) ffc09220: 2f 80 00 00 cmpwi cr7,r0,0 ffc09224: 41 be 00 2c beq+ cr7,ffc09250 <== NEVER TAKEN chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno)); ffc09228: 3d 20 00 00 lis r9,0 ffc0922c: 81 29 27 c8 lwz r9,10184(r9) ffc09230: 7f c3 f3 78 mr r3,r30 ffc09234: 83 a9 00 0c lwz r29,12(r9) ffc09238: 48 00 e5 d9 bl ffc17810 ffc0923c: 3c 80 ff c2 lis r4,-62 ffc09240: 7c 65 1b 78 mr r5,r3 ffc09244: 38 84 73 de addi r4,r4,29662 ffc09248: 7f a3 eb 78 mr r3,r29 ffc0924c: 48 00 00 1c b ffc09268 else chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno); ffc09250: 3d 20 00 00 lis r9,0 ffc09254: 81 29 27 c8 lwz r9,10184(r9) ffc09258: 3c 80 ff c2 lis r4,-62 ffc0925c: 38 84 73 eb addi r4,r4,29675 ffc09260: 80 69 00 0c lwz r3,12(r9) ffc09264: 7f c5 f3 78 mr r5,r30 ffc09268: 4c c6 31 82 crclr 4*cr1+eq ffc0926c: 48 00 d6 a9 bl ffc16914 ffc09270: 7f ff 1a 14 add r31,r31,r3 } chars_written += fprintf(stderr, "\n"); ffc09274: 3f c0 00 00 lis r30,0 ffc09278: 81 3e 27 c8 lwz r9,10184(r30) ffc0927c: 3c 80 ff c2 lis r4,-62 ffc09280: 38 84 77 12 addi r4,r4,30482 ffc09284: 80 69 00 0c lwz r3,12(r9) ffc09288: 4c c6 31 82 crclr 4*cr1+eq ffc0928c: 48 00 d6 89 bl ffc16914 (void) fflush(stderr); ffc09290: 81 3e 27 c8 lwz r9,10184(r30) chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno)); else chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno); } chars_written += fprintf(stderr, "\n"); ffc09294: 7f e3 fa 14 add r31,r3,r31 (void) fflush(stderr); ffc09298: 80 69 00 0c lwz r3,12(r9) ffc0929c: 48 00 d1 45 bl ffc163e0 return chars_written; } ffc092a0: 39 61 00 20 addi r11,r1,32 ffc092a4: 7f e3 fb 78 mr r3,r31 ffc092a8: 4b ff 8c dc b ffc01f84 <_restgpr_26_x> =============================================================================== ffc04a0c : /* * Extract an integer value from the database */ static int scanInt(FILE *fp, int *val) { ffc04a0c: 94 21 ff d8 stwu r1,-40(r1) ffc04a10: 7c 08 02 a6 mflr r0 ffc04a14: bf 01 00 08 stmw r24,8(r1) int c; unsigned int i = 0; unsigned int limit = INT_MAX; ffc04a18: 3f 80 7f ff lis r28,32767 /* * Extract an integer value from the database */ static int scanInt(FILE *fp, int *val) { ffc04a1c: 7c 7e 1b 78 mr r30,r3 ffc04a20: 90 01 00 2c stw r0,44(r1) ffc04a24: 7c 9b 23 78 mr r27,r4 int c; unsigned int i = 0; unsigned int limit = INT_MAX; int sign = 0; ffc04a28: 3b a0 00 00 li r29,0 static int scanInt(FILE *fp, int *val) { int c; unsigned int i = 0; unsigned int limit = INT_MAX; ffc04a2c: 63 9c ff ff ori r28,r28,65535 */ static int scanInt(FILE *fp, int *val) { int c; unsigned int i = 0; ffc04a30: 3b e0 00 00 li r31,0 unsigned int limit = INT_MAX; int sign = 0; int d; for (;;) { c = getc(fp); ffc04a34: 3f 00 00 00 lis r24,0 limit++; continue; } sign = 1; } if (!isdigit(c)) ffc04a38: 3f 20 00 00 lis r25,0 return 0; d = c - '0'; if ((i > (limit / 10)) ffc04a3c: 3b 40 00 0a li r26,10 unsigned int limit = INT_MAX; int sign = 0; int d; for (;;) { c = getc(fp); ffc04a40: 81 3e 00 04 lwz r9,4(r30) ffc04a44: 38 09 ff ff addi r0,r9,-1 ffc04a48: 2f 80 00 00 cmpwi cr7,r0,0 ffc04a4c: 90 1e 00 04 stw r0,4(r30) ffc04a50: 40 bc 00 14 bge+ cr7,ffc04a64 <== ALWAYS TAKEN ffc04a54: 80 78 27 68 lwz r3,10088(r24) <== NOT EXECUTED ffc04a58: 7f c4 f3 78 mr r4,r30 <== NOT EXECUTED ffc04a5c: 48 00 eb cd bl ffc13628 <__srget_r> <== NOT EXECUTED ffc04a60: 48 00 00 14 b ffc04a74 <== NOT EXECUTED ffc04a64: 81 3e 00 00 lwz r9,0(r30) ffc04a68: 88 69 00 00 lbz r3,0(r9) ffc04a6c: 39 29 00 01 addi r9,r9,1 ffc04a70: 91 3e 00 00 stw r9,0(r30) if (c == ':') ffc04a74: 2f 03 00 3a cmpwi cr6,r3,58 ffc04a78: 2f 9d 00 00 cmpwi cr7,r29,0 ffc04a7c: 41 9a 00 68 beq- cr6,ffc04ae4 break; if (sign == 0) { ffc04a80: 40 9e 00 1c bne- cr7,ffc04a9c if (c == '-') { ffc04a84: 2f 83 00 2d cmpwi cr7,r3,45 sign = -1; limit++; continue; } sign = 1; ffc04a88: 3b a0 00 01 li r29,1 for (;;) { c = getc(fp); if (c == ':') break; if (sign == 0) { if (c == '-') { ffc04a8c: 40 be 00 10 bne+ cr7,ffc04a9c sign = -1; limit++; ffc04a90: 3b 9c 00 01 addi r28,r28,1 c = getc(fp); if (c == ':') break; if (sign == 0) { if (c == '-') { sign = -1; ffc04a94: 3b a0 ff ff li r29,-1 limit++; continue; ffc04a98: 4b ff ff a8 b ffc04a40 } sign = 1; } if (!isdigit(c)) ffc04a9c: 81 39 27 64 lwz r9,10084(r25) ffc04aa0: 7d 29 1a 14 add r9,r9,r3 ffc04aa4: 88 09 00 01 lbz r0,1(r9) ffc04aa8: 70 09 00 04 andi. r9,r0,4 ffc04aac: 41 82 00 4c beq- ffc04af8 return 0; d = c - '0'; if ((i > (limit / 10)) ffc04ab0: 7c 1c d3 96 divwu r0,r28,r26 ffc04ab4: 7f 9f 00 40 cmplw cr7,r31,r0 ffc04ab8: 41 9d 00 40 bgt- cr7,ffc04af8 || ((i == (limit / 10)) && (d > (limit % 10)))) ffc04abc: 7f 9f 00 00 cmpw cr7,r31,r0 } sign = 1; } if (!isdigit(c)) return 0; d = c - '0'; ffc04ac0: 38 63 ff d0 addi r3,r3,-48 if ((i > (limit / 10)) || ((i == (limit / 10)) && (d > (limit % 10)))) ffc04ac4: 40 be 00 14 bne+ cr7,ffc04ad8 ffc04ac8: 1c 1f 00 0a mulli r0,r31,10 ffc04acc: 7c 00 e0 50 subf r0,r0,r28 ffc04ad0: 7f 83 00 40 cmplw cr7,r3,r0 ffc04ad4: 41 9d 00 24 bgt- cr7,ffc04af8 <== ALWAYS TAKEN return 0; i = i * 10 + d; ffc04ad8: 1f ff 00 0a mulli r31,r31,10 ffc04adc: 7f e3 fa 14 add r31,r3,r31 ffc04ae0: 4b ff ff 60 b ffc04a40 } if (sign == 0) ffc04ae4: 41 9e 00 14 beq- cr7,ffc04af8 <== NEVER TAKEN return 0; *val = i * sign; ffc04ae8: 7f fd f9 d6 mullw r31,r29,r31 return 1; ffc04aec: 38 60 00 01 li r3,1 return 0; i = i * 10 + d; } if (sign == 0) return 0; *val = i * sign; ffc04af0: 93 fb 00 00 stw r31,0(r27) return 1; ffc04af4: 48 00 00 08 b ffc04afc || ((i == (limit / 10)) && (d > (limit % 10)))) return 0; i = i * 10 + d; } if (sign == 0) return 0; ffc04af8: 38 60 00 00 li r3,0 *val = i * sign; return 1; } ffc04afc: 39 61 00 28 addi r11,r1,40 ffc04b00: 4b ff bd ac b ffc008ac <_restgpr_24_x> =============================================================================== ffc04c04 : FILE *fp, struct group *grp, char *buffer, size_t bufsize ) { ffc04c04: 94 21 ff c8 stwu r1,-56(r1) ffc04c08: 7c 08 02 a6 mflr r0 int grgid; char *grmem, *cp; int memcount; if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0) ffc04c0c: 38 e0 00 00 li r7,0 FILE *fp, struct group *grp, char *buffer, size_t bufsize ) { ffc04c10: bf 61 00 24 stmw r27,36(r1) int grgid; char *grmem, *cp; int memcount; if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0) ffc04c14: 3b 81 00 18 addi r28,r1,24 ffc04c18: 3b a1 00 1c addi r29,r1,28 FILE *fp, struct group *grp, char *buffer, size_t bufsize ) { ffc04c1c: 90 a1 00 18 stw r5,24(r1) int grgid; char *grmem, *cp; int memcount; if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0) ffc04c20: 7f 85 e3 78 mr r5,r28 FILE *fp, struct group *grp, char *buffer, size_t bufsize ) { ffc04c24: 7c 7b 1b 78 mr r27,r3 ffc04c28: 90 c1 00 1c stw r6,28(r1) int grgid; char *grmem, *cp; int memcount; if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0) ffc04c2c: 7f a6 eb 78 mr r6,r29 FILE *fp, struct group *grp, char *buffer, size_t bufsize ) { ffc04c30: 7c 9f 23 78 mr r31,r4 ffc04c34: 90 01 00 3c stw r0,60(r1) int grgid; char *grmem, *cp; int memcount; if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0) ffc04c38: 4b ff fe cd bl ffc04b04 ffc04c3c: 2f 83 00 00 cmpwi cr7,r3,0 || !scanString(fp, &grp->gr_passwd, &buffer, &bufsize, 0) || !scanInt(fp, &grgid) || !scanString(fp, &grmem, &buffer, &bufsize, 1)) return 0; ffc04c40: 3b c0 00 00 li r30,0 { int grgid; char *grmem, *cp; int memcount; if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0) ffc04c44: 41 be 01 04 beq+ cr7,ffc04d48 || !scanString(fp, &grp->gr_passwd, &buffer, &bufsize, 0) ffc04c48: 7f 63 db 78 mr r3,r27 ffc04c4c: 38 9f 00 04 addi r4,r31,4 ffc04c50: 7f 85 e3 78 mr r5,r28 ffc04c54: 7f a6 eb 78 mr r6,r29 ffc04c58: 38 e0 00 00 li r7,0 ffc04c5c: 4b ff fe a9 bl ffc04b04 ffc04c60: 2f 83 00 00 cmpwi cr7,r3,0 ffc04c64: 41 be 00 e4 beq+ cr7,ffc04d48 <== NEVER TAKEN || !scanInt(fp, &grgid) ffc04c68: 7f 63 db 78 mr r3,r27 ffc04c6c: 38 81 00 08 addi r4,r1,8 ffc04c70: 4b ff fd 9d bl ffc04a0c ffc04c74: 2f 83 00 00 cmpwi cr7,r3,0 ffc04c78: 41 be 00 d0 beq+ cr7,ffc04d48 <== NEVER TAKEN || !scanString(fp, &grmem, &buffer, &bufsize, 1)) ffc04c7c: 7f 63 db 78 mr r3,r27 ffc04c80: 38 81 00 0c addi r4,r1,12 ffc04c84: 7f 85 e3 78 mr r5,r28 ffc04c88: 7f a6 eb 78 mr r6,r29 ffc04c8c: 38 e0 00 01 li r7,1 ffc04c90: 4b ff fe 75 bl ffc04b04 ffc04c94: 2f 83 00 00 cmpwi cr7,r3,0 ffc04c98: 41 9e 00 b0 beq- cr7,ffc04d48 <== NEVER TAKEN return 0; grp->gr_gid = grgid; ffc04c9c: 80 01 00 08 lwz r0,8(r1) /* * Determine number of members */ for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { ffc04ca0: 81 61 00 0c lwz r11,12(r1) if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0) || !scanString(fp, &grp->gr_passwd, &buffer, &bufsize, 0) || !scanInt(fp, &grgid) || !scanString(fp, &grmem, &buffer, &bufsize, 1)) return 0; grp->gr_gid = grgid; ffc04ca4: b0 1f 00 08 sth r0,8(r31) /* * Determine number of members */ for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { ffc04ca8: 38 00 00 01 li r0,1 } /* * Extract a single group record from the database */ static int scangr( ffc04cac: 39 2b ff ff addi r9,r11,-1 grp->gr_gid = grgid; /* * Determine number of members */ for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { ffc04cb0: 48 00 00 14 b ffc04cc4 if(*cp == ',') memcount++; ffc04cb4: 69 48 00 2c xori r8,r10,44 ffc04cb8: 21 08 00 00 subfic r8,r8,0 ffc04cbc: 7d 00 01 94 addze r8,r0 ffc04cc0: 7d 00 43 78 mr r0,r8 grp->gr_gid = grgid; /* * Determine number of members */ for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { ffc04cc4: 8d 49 00 01 lbzu r10,1(r9) ffc04cc8: 2f 8a 00 00 cmpwi cr7,r10,0 ffc04ccc: 40 9e ff e8 bne+ cr7,ffc04cb4 } /* * Hack to produce (hopefully) a suitably-aligned array of pointers */ if (bufsize < (((memcount+1)*sizeof(char *)) + 15)) ffc04cd0: 54 09 10 3a rlwinm r9,r0,2,0,29 ffc04cd4: 38 09 00 13 addi r0,r9,19 ffc04cd8: 81 21 00 1c lwz r9,28(r1) return 0; ffc04cdc: 3b c0 00 00 li r30,0 } /* * Hack to produce (hopefully) a suitably-aligned array of pointers */ if (bufsize < (((memcount+1)*sizeof(char *)) + 15)) ffc04ce0: 7f 89 00 40 cmplw cr7,r9,r0 ffc04ce4: 41 9c 00 64 blt- cr7,ffc04d48 <== NEVER TAKEN return 0; grp->gr_mem = (char **)(((uintptr_t)buffer + 15) & ~15); ffc04ce8: 81 21 00 18 lwz r9,24(r1) ffc04cec: 39 29 00 0f addi r9,r9,15 ffc04cf0: 55 29 00 36 rlwinm r9,r9,0,0,27 ffc04cf4: 91 3f 00 0c stw r9,12(r31) /* * Fill in pointer array */ grp->gr_mem[0] = grmem; ffc04cf8: 91 69 00 00 stw r11,0(r9) for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { ffc04cfc: 39 20 00 01 li r9,1 } /* * Extract a single group record from the database */ static int scangr( ffc04d00: 81 61 00 0c lwz r11,12(r1) ffc04d04: 39 6b ff ff addi r11,r11,-1 /* * Fill in pointer array */ grp->gr_mem[0] = grmem; for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { ffc04d08: 48 00 00 24 b ffc04d2c if(*cp == ',') { ffc04d0c: 2f 80 00 2c cmpwi cr7,r0,44 ffc04d10: 40 be 00 1c bne+ cr7,ffc04d2c *cp = '\0'; ffc04d14: 99 4b 00 00 stb r10,0(r11) grp->gr_mem[memcount++] = cp + 1; ffc04d18: 55 20 10 3a rlwinm r0,r9,2,0,29 } /* * Extract a single group record from the database */ static int scangr( ffc04d1c: 38 eb 00 01 addi r7,r11,1 */ grp->gr_mem[0] = grmem; for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { if(*cp == ',') { *cp = '\0'; grp->gr_mem[memcount++] = cp + 1; ffc04d20: 81 1f 00 0c lwz r8,12(r31) ffc04d24: 39 29 00 01 addi r9,r9,1 ffc04d28: 7c e8 01 2e stwx r7,r8,r0 /* * Fill in pointer array */ grp->gr_mem[0] = grmem; for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { ffc04d2c: 8c 0b 00 01 lbzu r0,1(r11) ffc04d30: 2f 80 00 00 cmpwi cr7,r0,0 ffc04d34: 40 9e ff d8 bne+ cr7,ffc04d0c if(*cp == ',') { *cp = '\0'; grp->gr_mem[memcount++] = cp + 1; } } grp->gr_mem[memcount] = NULL; ffc04d38: 81 7f 00 0c lwz r11,12(r31) ffc04d3c: 55 29 10 3a rlwinm r9,r9,2,0,29 return 1; ffc04d40: 3b c0 00 01 li r30,1 if(*cp == ',') { *cp = '\0'; grp->gr_mem[memcount++] = cp + 1; } } grp->gr_mem[memcount] = NULL; ffc04d44: 7c 0b 49 2e stwx r0,r11,r9 return 1; } ffc04d48: 39 61 00 38 addi r11,r1,56 ffc04d4c: 7f c3 f3 78 mr r3,r30 ffc04d50: 4b ff bb 68 b ffc008b8 <_restgpr_27_x> =============================================================================== ffc04d54 : FILE *fp, struct passwd *pwd, char *buffer, size_t bufsize ) { ffc04d54: 94 21 ff c8 stwu r1,-56(r1) ffc04d58: 7c 08 02 a6 mflr r0 int pwuid, pwgid; if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0) ffc04d5c: 38 e0 00 00 li r7,0 FILE *fp, struct passwd *pwd, char *buffer, size_t bufsize ) { ffc04d60: bf 61 00 24 stmw r27,36(r1) int pwuid, pwgid; if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0) ffc04d64: 3b 81 00 18 addi r28,r1,24 ffc04d68: 3b a1 00 1c addi r29,r1,28 FILE *fp, struct passwd *pwd, char *buffer, size_t bufsize ) { ffc04d6c: 90 a1 00 18 stw r5,24(r1) int pwuid, pwgid; if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0) ffc04d70: 7f 85 e3 78 mr r5,r28 FILE *fp, struct passwd *pwd, char *buffer, size_t bufsize ) { ffc04d74: 7c 7e 1b 78 mr r30,r3 ffc04d78: 90 c1 00 1c stw r6,28(r1) int pwuid, pwgid; if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0) ffc04d7c: 7f a6 eb 78 mr r6,r29 FILE *fp, struct passwd *pwd, char *buffer, size_t bufsize ) { ffc04d80: 7c 9f 23 78 mr r31,r4 ffc04d84: 90 01 00 3c stw r0,60(r1) int pwuid, pwgid; if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0) ffc04d88: 4b ff fd 7d bl ffc04b04 ffc04d8c: 2f 83 00 00 cmpwi cr7,r3,0 || !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; ffc04d90: 3b 60 00 00 li r27,0 size_t bufsize ) { int pwuid, pwgid; if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0) ffc04d94: 41 be 00 e0 beq+ cr7,ffc04e74 || !scanString(fp, &pwd->pw_passwd, &buffer, &bufsize, 0) ffc04d98: 7f c3 f3 78 mr r3,r30 ffc04d9c: 38 9f 00 04 addi r4,r31,4 ffc04da0: 7f 85 e3 78 mr r5,r28 ffc04da4: 7f a6 eb 78 mr r6,r29 ffc04da8: 38 e0 00 00 li r7,0 ffc04dac: 4b ff fd 59 bl ffc04b04 ffc04db0: 2f 83 00 00 cmpwi cr7,r3,0 ffc04db4: 41 be 00 c0 beq+ cr7,ffc04e74 <== NEVER TAKEN || !scanInt(fp, &pwuid) ffc04db8: 7f c3 f3 78 mr r3,r30 ffc04dbc: 38 81 00 08 addi r4,r1,8 ffc04dc0: 4b ff fc 4d bl ffc04a0c ffc04dc4: 2f 83 00 00 cmpwi cr7,r3,0 ffc04dc8: 41 be 00 ac beq+ cr7,ffc04e74 || !scanInt(fp, &pwgid) ffc04dcc: 7f c3 f3 78 mr r3,r30 ffc04dd0: 38 81 00 0c addi r4,r1,12 ffc04dd4: 4b ff fc 39 bl ffc04a0c ffc04dd8: 2f 83 00 00 cmpwi cr7,r3,0 ffc04ddc: 41 be 00 98 beq+ cr7,ffc04e74 || !scanString(fp, &pwd->pw_comment, &buffer, &bufsize, 0) ffc04de0: 7f c3 f3 78 mr r3,r30 ffc04de4: 38 9f 00 0c addi r4,r31,12 ffc04de8: 7f 85 e3 78 mr r5,r28 ffc04dec: 7f a6 eb 78 mr r6,r29 ffc04df0: 38 e0 00 00 li r7,0 ffc04df4: 4b ff fd 11 bl ffc04b04 ffc04df8: 2f 83 00 00 cmpwi cr7,r3,0 ffc04dfc: 41 be 00 78 beq+ cr7,ffc04e74 <== NEVER TAKEN || !scanString(fp, &pwd->pw_gecos, &buffer, &bufsize, 0) ffc04e00: 7f c3 f3 78 mr r3,r30 ffc04e04: 38 9f 00 10 addi r4,r31,16 ffc04e08: 7f 85 e3 78 mr r5,r28 ffc04e0c: 7f a6 eb 78 mr r6,r29 ffc04e10: 38 e0 00 00 li r7,0 ffc04e14: 4b ff fc f1 bl ffc04b04 ffc04e18: 2f 83 00 00 cmpwi cr7,r3,0 ffc04e1c: 41 be 00 58 beq+ cr7,ffc04e74 <== NEVER TAKEN || !scanString(fp, &pwd->pw_dir, &buffer, &bufsize, 0) ffc04e20: 7f c3 f3 78 mr r3,r30 ffc04e24: 38 9f 00 14 addi r4,r31,20 ffc04e28: 7f 85 e3 78 mr r5,r28 ffc04e2c: 7f a6 eb 78 mr r6,r29 ffc04e30: 38 e0 00 00 li r7,0 ffc04e34: 4b ff fc d1 bl ffc04b04 ffc04e38: 2f 83 00 00 cmpwi cr7,r3,0 ffc04e3c: 41 be 00 38 beq+ cr7,ffc04e74 <== NEVER TAKEN || !scanString(fp, &pwd->pw_shell, &buffer, &bufsize, 1)) ffc04e40: 7f c3 f3 78 mr r3,r30 ffc04e44: 38 9f 00 18 addi r4,r31,24 ffc04e48: 7f 85 e3 78 mr r5,r28 ffc04e4c: 7f a6 eb 78 mr r6,r29 ffc04e50: 38 e0 00 01 li r7,1 ffc04e54: 4b ff fc b1 bl ffc04b04 ffc04e58: 2f 83 00 00 cmpwi cr7,r3,0 ffc04e5c: 41 9e 00 18 beq- cr7,ffc04e74 return 0; pwd->pw_uid = pwuid; ffc04e60: 80 01 00 08 lwz r0,8(r1) pwd->pw_gid = pwgid; return 1; ffc04e64: 3b 60 00 01 li r27,1 || !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; pwd->pw_uid = pwuid; ffc04e68: b0 1f 00 08 sth r0,8(r31) pwd->pw_gid = pwgid; ffc04e6c: 80 01 00 0c lwz r0,12(r1) ffc04e70: b0 1f 00 0a sth r0,10(r31) return 1; } ffc04e74: 39 61 00 38 addi r11,r1,56 ffc04e78: 7f 63 db 78 mr r3,r27 ffc04e7c: 4b ff ba 3c b ffc008b8 <_restgpr_27_x> =============================================================================== ffc08340 : int sched_get_priority_max( int policy ) { switch ( policy ) { ffc08340: 2b 83 00 04 cmplwi cr7,r3,4 #include int sched_get_priority_max( int policy ) { ffc08344: 94 21 ff f8 stwu r1,-8(r1) ffc08348: 7c 08 02 a6 mflr r0 ffc0834c: 90 01 00 0c stw r0,12(r1) switch ( policy ) { ffc08350: 41 9d 00 14 bgt- cr7,ffc08364 ffc08354: 38 00 00 01 li r0,1 ffc08358: 7c 03 18 30 slw r3,r0,r3 ffc0835c: 70 60 00 17 andi. r0,r3,23 ffc08360: 40 82 00 18 bne- ffc08378 <== ALWAYS TAKEN case SCHED_RR: case SCHED_SPORADIC: break; default: rtems_set_errno_and_return_minus_one( EINVAL ); ffc08364: 48 00 8e 71 bl ffc111d4 <__errno> ffc08368: 38 00 00 16 li r0,22 ffc0836c: 90 03 00 00 stw r0,0(r3) ffc08370: 38 60 ff ff li r3,-1 ffc08374: 48 00 00 10 b ffc08384 } return POSIX_SCHEDULER_MAXIMUM_PRIORITY; ffc08378: 3d 20 00 00 lis r9,0 ffc0837c: 88 69 27 4c lbz r3,10060(r9) ffc08380: 38 63 ff ff addi r3,r3,-1 } ffc08384: 80 01 00 0c lwz r0,12(r1) ffc08388: 38 21 00 08 addi r1,r1,8 ffc0838c: 7c 08 03 a6 mtlr r0 ffc08390: 4e 80 00 20 blr =============================================================================== ffc08394 : int sched_get_priority_min( int policy ) { switch ( policy ) { ffc08394: 2b 83 00 04 cmplwi cr7,r3,4 #include int sched_get_priority_min( int policy ) { ffc08398: 94 21 ff f8 stwu r1,-8(r1) ffc0839c: 7c 08 02 a6 mflr r0 ffc083a0: 90 01 00 0c stw r0,12(r1) switch ( policy ) { ffc083a4: 41 9d 00 18 bgt- cr7,ffc083bc ffc083a8: 38 00 00 01 li r0,1 ffc083ac: 7c 00 18 30 slw r0,r0,r3 ffc083b0: 70 09 00 17 andi. r9,r0,23 default: rtems_set_errno_and_return_minus_one( EINVAL ); } return POSIX_SCHEDULER_MINIMUM_PRIORITY; ffc083b4: 38 60 00 01 li r3,1 int sched_get_priority_min( int policy ) { switch ( policy ) { ffc083b8: 40 82 00 14 bne- ffc083cc <== ALWAYS TAKEN case SCHED_RR: case SCHED_SPORADIC: break; default: rtems_set_errno_and_return_minus_one( EINVAL ); ffc083bc: 48 00 8e 19 bl ffc111d4 <__errno> ffc083c0: 38 00 00 16 li r0,22 ffc083c4: 90 03 00 00 stw r0,0(r3) ffc083c8: 38 60 ff ff li r3,-1 } return POSIX_SCHEDULER_MINIMUM_PRIORITY; } ffc083cc: 80 01 00 0c lwz r0,12(r1) ffc083d0: 38 21 00 08 addi r1,r1,8 ffc083d4: 7c 08 03 a6 mtlr r0 ffc083d8: 4e 80 00 20 blr =============================================================================== ffc083dc : int sched_rr_get_interval( pid_t pid, struct timespec *interval ) { ffc083dc: 7c 2b 0b 78 mr r11,r1 ffc083e0: 94 21 ff e8 stwu r1,-24(r1) ffc083e4: 7c 08 02 a6 mflr r0 ffc083e8: 48 01 49 71 bl ffc1cd58 <_savegpr_31> /* * Only supported for the "calling process" (i.e. this node). */ if ( pid && pid != getpid() ) ffc083ec: 7c 7f 1b 79 mr. r31,r3 int sched_rr_get_interval( pid_t pid, struct timespec *interval ) { ffc083f0: 90 01 00 1c stw r0,28(r1) /* * Only supported for the "calling process" (i.e. this node). */ if ( pid && pid != getpid() ) ffc083f4: 41 a2 00 24 beq+ ffc08418 <== NEVER TAKEN ffc083f8: 90 81 00 08 stw r4,8(r1) ffc083fc: 4b ff c8 11 bl ffc04c0c ffc08400: 7f 9f 18 00 cmpw cr7,r31,r3 ffc08404: 80 81 00 08 lwz r4,8(r1) ffc08408: 41 be 00 10 beq+ cr7,ffc08418 rtems_set_errno_and_return_minus_one( ESRCH ); ffc0840c: 48 00 8d c9 bl ffc111d4 <__errno> ffc08410: 38 00 00 03 li r0,3 ffc08414: 48 00 00 14 b ffc08428 if ( !interval ) ffc08418: 2f 84 00 00 cmpwi cr7,r4,0 ffc0841c: 40 be 00 18 bne+ cr7,ffc08434 rtems_set_errno_and_return_minus_one( EINVAL ); ffc08420: 48 00 8d b5 bl ffc111d4 <__errno> ffc08424: 38 00 00 16 li r0,22 ffc08428: 90 03 00 00 stw r0,0(r3) ffc0842c: 38 60 ff ff li r3,-1 ffc08430: 48 00 00 14 b ffc08444 _Timespec_From_ticks( _Thread_Ticks_per_timeslice, interval ); ffc08434: 3d 20 00 00 lis r9,0 ffc08438: 80 69 28 0c lwz r3,10252(r9) ffc0843c: 48 00 3d 9d bl ffc0c1d8 <_Timespec_From_ticks> return 0; ffc08440: 38 60 00 00 li r3,0 } ffc08444: 39 61 00 18 addi r11,r1,24 ffc08448: 4b ff 87 9c b ffc00be4 <_restgpr_31_x> =============================================================================== ffc0af60 : rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; ffc0af60: 3d 20 00 00 lis r9,0 int oflag, ... /* mode_t mode, */ /* unsigned int value */ ) { ffc0af64: 94 21 ff b8 stwu r1,-72(r1) ffc0af68: 7c 08 02 a6 mflr r0 ffc0af6c: 81 69 28 08 lwz r11,10248(r9) ffc0af70: 90 01 00 4c stw r0,76(r1) ffc0af74: 38 0b 00 01 addi r0,r11,1 ffc0af78: bf 61 00 34 stmw r27,52(r1) ffc0af7c: 7c 7f 1b 78 mr r31,r3 ffc0af80: 7c 9e 23 78 mr r30,r4 ffc0af84: 90 a1 00 28 stw r5,40(r1) ffc0af88: 90 c1 00 2c stw r6,44(r1) ffc0af8c: 90 09 28 08 stw r0,10248(r9) POSIX_Semaphore_Control *the_semaphore; Objects_Locations location; _Thread_Disable_dispatch(); if ( oflag & O_CREAT ) { ffc0af90: 70 9c 02 00 andi. r28,r4,512 /* unsigned int value */ ) { va_list arg; mode_t mode; unsigned int value = 0; ffc0af94: 3b a0 00 00 li r29,0 POSIX_Semaphore_Control *the_semaphore; Objects_Locations location; _Thread_Disable_dispatch(); if ( oflag & O_CREAT ) { ffc0af98: 41 a2 00 20 beq+ ffc0afb8 va_start(arg, oflag); ffc0af9c: 38 01 00 50 addi r0,r1,80 ffc0afa0: 90 01 00 18 stw r0,24(r1) ffc0afa4: 39 21 00 20 addi r9,r1,32 mode = (mode_t) va_arg( arg, unsigned int ); value = va_arg( arg, unsigned int ); ffc0afa8: 38 00 00 04 li r0,4 Objects_Locations location; _Thread_Disable_dispatch(); if ( oflag & O_CREAT ) { va_start(arg, oflag); ffc0afac: 91 21 00 1c stw r9,28(r1) mode = (mode_t) va_arg( arg, unsigned int ); value = va_arg( arg, unsigned int ); ffc0afb0: 98 01 00 14 stb r0,20(r1) ffc0afb4: 83 a9 00 0c lwz r29,12(r9) va_end(arg); } status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id ); ffc0afb8: 7f e3 fb 78 mr r3,r31 ffc0afbc: 38 81 00 08 addi r4,r1,8 ffc0afc0: 48 00 6b 19 bl ffc11ad8 <_POSIX_Semaphore_Name_to_id> * 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 ) { ffc0afc4: 7c 7b 1b 79 mr. r27,r3 ffc0afc8: 41 82 00 24 beq- ffc0afec /* * 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) ) ) { ffc0afcc: 2f 9b 00 02 cmpwi cr7,r27,2 ffc0afd0: 40 9e 00 0c bne- cr7,ffc0afdc <== NEVER TAKEN ffc0afd4: 2f 9c 00 00 cmpwi cr7,r28,0 ffc0afd8: 40 9e 00 68 bne- cr7,ffc0b040 _Thread_Enable_dispatch(); ffc0afdc: 48 00 32 71 bl ffc0e24c <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one_cast( status, sem_t * ); ffc0afe0: 48 00 9c 2d bl ffc14c0c <__errno> ffc0afe4: 93 63 00 00 stw r27,0(r3) ffc0afe8: 48 00 00 20 b ffc0b008 /* * Check for existence with creation. */ if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) { ffc0afec: 73 de 0a 00 andi. r30,r30,2560 ffc0aff0: 2f 9e 0a 00 cmpwi cr7,r30,2560 ffc0aff4: 40 be 00 1c bne+ cr7,ffc0b010 _Thread_Enable_dispatch(); ffc0aff8: 48 00 32 55 bl ffc0e24c <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * ); ffc0affc: 48 00 9c 11 bl ffc14c0c <__errno> ffc0b000: 38 00 00 11 li r0,17 ffc0b004: 90 03 00 00 stw r0,0(r3) ffc0b008: 38 60 ff ff li r3,-1 ffc0b00c: 48 00 00 64 b ffc0b070 ffc0b010: 80 81 00 08 lwz r4,8(r1) ffc0b014: 3c 60 00 00 lis r3,0 ffc0b018: 38 a1 00 10 addi r5,r1,16 ffc0b01c: 38 63 30 ac addi r3,r3,12460 ffc0b020: 48 00 23 9d bl ffc0d3bc <_Objects_Get> } the_semaphore = _POSIX_Semaphore_Get( &the_semaphore_id, &location ); the_semaphore->open_count += 1; ffc0b024: 81 23 00 18 lwz r9,24(r3) if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) { _Thread_Enable_dispatch(); rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * ); } the_semaphore = _POSIX_Semaphore_Get( &the_semaphore_id, &location ); ffc0b028: 90 61 00 0c stw r3,12(r1) the_semaphore->open_count += 1; ffc0b02c: 38 09 00 01 addi r0,r9,1 ffc0b030: 90 03 00 18 stw r0,24(r3) _Thread_Enable_dispatch(); ffc0b034: 48 00 32 19 bl ffc0e24c <_Thread_Enable_dispatch> _Thread_Enable_dispatch(); ffc0b038: 48 00 32 15 bl ffc0e24c <_Thread_Enable_dispatch> goto return_id; ffc0b03c: 48 00 00 2c b ffc0b068 /* * 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( ffc0b040: 7f e3 fb 78 mr r3,r31 ffc0b044: 38 80 00 00 li r4,0 ffc0b048: 7f a5 eb 78 mr r5,r29 ffc0b04c: 38 c1 00 0c addi r6,r1,12 ffc0b050: 48 00 69 15 bl ffc11964 <_POSIX_Semaphore_Create_support> ffc0b054: 7c 7f 1b 78 mr r31,r3 /* * errno was set by Create_support, so don't set it again. */ _Thread_Enable_dispatch(); ffc0b058: 48 00 31 f5 bl ffc0e24c <_Thread_Enable_dispatch> if ( status == -1 ) ffc0b05c: 2f 9f ff ff cmpwi cr7,r31,-1 return SEM_FAILED; ffc0b060: 38 60 ff ff li r3,-1 * errno was set by Create_support, so don't set it again. */ _Thread_Enable_dispatch(); if ( status == -1 ) ffc0b064: 41 9e 00 0c beq- cr7,ffc0b070 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; ffc0b068: 80 61 00 0c lwz r3,12(r1) ffc0b06c: 38 63 00 08 addi r3,r3,8 #endif return id; } ffc0b070: 39 61 00 48 addi r11,r1,72 ffc0b074: 4b ff 8d 20 b ffc03d94 <_restgpr_27_x> =============================================================================== ffc081c4 : struct sigaction *oact ) { ISR_Level level; if ( oact ) ffc081c4: 7c a9 2b 79 mr. r9,r5 int sigaction( int sig, const struct sigaction *act, struct sigaction *oact ) { ffc081c8: 94 21 ff e8 stwu r1,-24(r1) ffc081cc: 7c 08 02 a6 mflr r0 ffc081d0: bf 81 00 08 stmw r28,8(r1) ffc081d4: 7c 9f 23 78 mr r31,r4 ffc081d8: 90 01 00 1c stw r0,28(r1) ISR_Level level; if ( oact ) ffc081dc: 41 82 00 1c beq- ffc081f8 *oact = _POSIX_signals_Vectors[ sig ]; ffc081e0: 1c 03 00 0c mulli r0,r3,12 ffc081e4: 3d 60 00 00 lis r11,0 ffc081e8: 39 6b 31 e0 addi r11,r11,12768 ffc081ec: 7d 6b 02 14 add r11,r11,r0 ffc081f0: 7c ab 64 aa lswi r5,r11,12 ffc081f4: 7c a9 65 aa stswi r5,r9,12 if ( !sig ) ffc081f8: 2f 83 00 00 cmpwi cr7,r3,0 ffc081fc: 41 9e 00 18 beq- cr7,ffc08214 static inline bool is_valid_signo( int signo ) { return ((signo) >= 1 && (signo) <= 32 ); ffc08200: 38 03 ff ff addi r0,r3,-1 rtems_set_errno_and_return_minus_one( EINVAL ); if ( !is_valid_signo(sig) ) ffc08204: 2b 80 00 1f cmplwi cr7,r0,31 ffc08208: 41 9d 00 0c bgt- cr7,ffc08214 * * NOTE: Solaris documentation claims to "silently enforce" this which * contradicts the POSIX specification. */ if ( sig == SIGKILL ) ffc0820c: 2f 83 00 09 cmpwi cr7,r3,9 ffc08210: 40 be 00 18 bne+ cr7,ffc08228 rtems_set_errno_and_return_minus_one( EINVAL ); ffc08214: 48 00 93 31 bl ffc11544 <__errno> ffc08218: 38 00 00 16 li r0,22 ffc0821c: 90 03 00 00 stw r0,0(r3) ffc08220: 38 00 ff ff li r0,-1 ffc08224: 48 00 00 6c b ffc08290 /* * Evaluate the new action structure and set the global signal vector * appropriately. */ if ( act ) { ffc08228: 2f 9f 00 00 cmpwi cr7,r31,0 * 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; ffc0822c: 38 00 00 00 li r0,0 /* * Evaluate the new action structure and set the global signal vector * appropriately. */ if ( act ) { ffc08230: 41 9e 00 60 beq- cr7,ffc08290 <== NEVER TAKEN static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc08234: 7f c0 00 a6 mfmsr r30 ffc08238: 7c 10 42 a6 mfsprg r0,0 ffc0823c: 7f c0 00 78 andc r0,r30,r0 ffc08240: 7c 00 01 24 mtmsr r0 * Unless the user is installing the default signal actions, then * we can just copy the provided sigaction structure into the vectors. */ _ISR_Disable( level ); if ( act->sa_handler == SIG_DFL ) { ffc08244: 80 1f 00 08 lwz r0,8(r31) ffc08248: 3f 80 00 00 lis r28,0 ffc0824c: 3b 9c 31 e0 addi r28,r28,12768 ffc08250: 2f 80 00 00 cmpwi cr7,r0,0 ffc08254: 1f a3 00 0c mulli r29,r3,12 ffc08258: 40 be 00 20 bne+ cr7,ffc08278 _POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ]; ffc0825c: 3d 20 ff c2 lis r9,-62 ffc08260: 39 29 02 60 addi r9,r9,608 ffc08264: 7d 7c ea 14 add r11,r28,r29 ffc08268: 7d 29 ea 14 add r9,r9,r29 ffc0826c: 7c a9 64 aa lswi r5,r9,12 ffc08270: 7c ab 65 aa stswi r5,r11,12 ffc08274: 48 00 00 14 b ffc08288 } else { _POSIX_signals_Clear_process_signals( sig ); ffc08278: 48 00 60 d1 bl ffc0e348 <_POSIX_signals_Clear_process_signals> _POSIX_signals_Vectors[ sig ] = *act; ffc0827c: 7d 3c ea 14 add r9,r28,r29 ffc08280: 7c bf 64 aa lswi r5,r31,12 ffc08284: 7c a9 65 aa stswi r5,r9,12 return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc08288: 7f c0 01 24 mtmsr r30 * 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; ffc0828c: 38 00 00 00 li r0,0 } ffc08290: 39 61 00 18 addi r11,r1,24 ffc08294: 7c 03 03 78 mr r3,r0 ffc08298: 4b ff 86 98 b ffc00930 <_restgpr_28_x> =============================================================================== ffc086f4 : int sigtimedwait( const sigset_t *set, siginfo_t *info, const struct timespec *timeout ) { ffc086f4: 94 21 ff d0 stwu r1,-48(r1) ffc086f8: 7c 08 02 a6 mflr r0 ffc086fc: bf 61 00 1c stmw r27,28(r1) ISR_Level level; /* * Error check parameters before disabling interrupts. */ if ( !set ) ffc08700: 7c 7d 1b 79 mr. r29,r3 int sigtimedwait( const sigset_t *set, siginfo_t *info, const struct timespec *timeout ) { ffc08704: 7c 9f 23 78 mr r31,r4 ffc08708: 90 01 00 34 stw r0,52(r1) ffc0870c: 7c be 2b 78 mr r30,r5 ISR_Level level; /* * Error check parameters before disabling interrupts. */ if ( !set ) ffc08710: 41 82 00 2c beq- ffc0873c /* NOTE: This is very specifically a RELATIVE not ABSOLUTE time * in the Open Group specification. */ interval = 0; if ( timeout ) { ffc08714: 2f 85 00 00 cmpwi cr7,r5,0 ffc08718: 41 9e 00 30 beq- cr7,ffc08748 if ( !_Timespec_Is_valid( timeout ) ) ffc0871c: 7c a3 2b 78 mr r3,r5 ffc08720: 48 00 3e 0d bl ffc0c52c <_Timespec_Is_valid> ffc08724: 2f 83 00 00 cmpwi cr7,r3,0 ffc08728: 41 9e 00 14 beq- cr7,ffc0873c rtems_set_errno_and_return_minus_one( EINVAL ); interval = _Timespec_To_ticks( timeout ); ffc0872c: 7f c3 f3 78 mr r3,r30 ffc08730: 48 00 3e 81 bl ffc0c5b0 <_Timespec_To_ticks> if ( !interval ) ffc08734: 7c 64 1b 79 mr. r4,r3 ffc08738: 40 a2 00 14 bne+ ffc0874c <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); ffc0873c: 48 00 95 09 bl ffc11c44 <__errno> ffc08740: 38 00 00 16 li r0,22 ffc08744: 48 00 01 7c b ffc088c0 /* NOTE: This is very specifically a RELATIVE not ABSOLUTE time * in the Open Group specification. */ interval = 0; ffc08748: 38 80 00 00 li r4,0 /* * Initialize local variables. */ the_info = ( info ) ? info : &signal_information; ffc0874c: 2f 9f 00 00 cmpwi cr7,r31,0 ffc08750: 40 be 00 08 bne+ cr7,ffc08758 ffc08754: 3b e1 00 08 addi r31,r1,8 the_thread = _Thread_Executing; ffc08758: 3d 20 00 00 lis r9,0 ffc0875c: 81 29 31 90 lwz r9,12688(r9) api = the_thread->API_Extensions[ THREAD_API_POSIX ]; ffc08760: 83 69 01 34 lwz r27,308(r9) static inline uint32_t ppc_interrupt_disable( void ) { uint32_t level; uint32_t mask; __asm__ volatile ( ffc08764: 7f 80 00 a6 mfmsr r28 ffc08768: 7c 10 42 a6 mfsprg r0,0 ffc0876c: 7f 80 00 78 andc r0,r28,r0 ffc08770: 7c 00 01 24 mtmsr r0 */ /* API signals pending? */ _ISR_Disable( level ); if ( *set & api->signals_pending ) { ffc08774: 80 1d 00 00 lwz r0,0(r29) ffc08778: 80 7b 00 d4 lwz r3,212(r27) ffc0877c: 7c 0b 18 39 and. r11,r0,r3 ffc08780: 41 a2 00 40 beq+ ffc087c0 /* XXX real info later */ the_info->si_signo = _POSIX_signals_Get_lowest( api->signals_pending ); ffc08784: 4b ff ff 19 bl ffc0869c <_POSIX_signals_Get_lowest> _POSIX_signals_Clear_signals( ffc08788: 7f e5 fb 78 mr r5,r31 /* API signals pending? */ _ISR_Disable( level ); if ( *set & api->signals_pending ) { /* XXX real info later */ the_info->si_signo = _POSIX_signals_Get_lowest( api->signals_pending ); ffc0878c: 90 7f 00 00 stw r3,0(r31) ffc08790: 7c 64 1b 78 mr r4,r3 _POSIX_signals_Clear_signals( ffc08794: 38 c0 00 00 li r6,0 ffc08798: 7f 63 db 78 mr r3,r27 ffc0879c: 38 e0 00 00 li r7,0 ffc087a0: 48 00 63 6d bl ffc0eb0c <_POSIX_signals_Clear_signals> return level; } static inline void ppc_interrupt_enable( uint32_t level ) { __asm__ volatile ( ffc087a4: 7f 80 01 24 mtmsr r28 false, false ); _ISR_Enable( level ); the_info->si_code = SI_USER; ffc087a8: 38 00 00 01 li r0,1 the_info->si_value.sival_int = 0; return the_info->si_signo; ffc087ac: 83 df 00 00 lwz r30,0(r31) false, false ); _ISR_Enable( level ); the_info->si_code = SI_USER; ffc087b0: 90 1f 00 04 stw r0,4(r31) the_info->si_value.sival_int = 0; ffc087b4: 38 00 00 00 li r0,0 ffc087b8: 90 1f 00 08 stw r0,8(r31) return the_info->si_signo; ffc087bc: 48 00 01 0c b ffc088c8 } /* Process pending signals? */ if ( *set & _POSIX_signals_Pending ) { ffc087c0: 3d 60 00 00 lis r11,0 ffc087c4: 80 6b 28 c4 lwz r3,10436(r11) ffc087c8: 7c 0b 18 39 and. r11,r0,r3 ffc087cc: 41 a2 00 40 beq+ ffc0880c signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending ); ffc087d0: 4b ff fe cd bl ffc0869c <_POSIX_signals_Get_lowest> _POSIX_signals_Clear_signals( api, signo, the_info, true, false ); ffc087d4: 7f e5 fb 78 mr r5,r31 } /* Process pending signals? */ if ( *set & _POSIX_signals_Pending ) { signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending ); ffc087d8: 7c 7e 1b 78 mr r30,r3 _POSIX_signals_Clear_signals( api, signo, the_info, true, false ); ffc087dc: 7f c4 f3 78 mr r4,r30 ffc087e0: 7f 63 db 78 mr r3,r27 ffc087e4: 38 c0 00 01 li r6,1 ffc087e8: 38 e0 00 00 li r7,0 ffc087ec: 48 00 63 21 bl ffc0eb0c <_POSIX_signals_Clear_signals> ffc087f0: 7f 80 01 24 mtmsr r28 _ISR_Enable( level ); the_info->si_signo = signo; the_info->si_code = SI_USER; ffc087f4: 38 00 00 01 li r0,1 if ( *set & _POSIX_signals_Pending ) { signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending ); _POSIX_signals_Clear_signals( api, signo, the_info, true, false ); _ISR_Enable( level ); the_info->si_signo = signo; ffc087f8: 93 df 00 00 stw r30,0(r31) the_info->si_code = SI_USER; ffc087fc: 90 1f 00 04 stw r0,4(r31) the_info->si_value.sival_int = 0; ffc08800: 38 00 00 00 li r0,0 ffc08804: 90 1f 00 08 stw r0,8(r31) return signo; ffc08808: 48 00 00 c0 b ffc088c8 ffc0880c: 3d 60 00 00 lis r11,0 ffc08810: 81 4b 28 78 lwz r10,10360(r11) } the_info->si_signo = -1; ffc08814: 38 00 ff ff li r0,-1 ffc08818: 90 1f 00 00 stw r0,0(r31) ffc0881c: 38 0a 00 01 addi r0,r10,1 ffc08820: 90 0b 28 78 stw r0,10360(r11) _Thread_Disable_dispatch(); the_thread->Wait.queue = &_POSIX_signals_Wait_queue; the_thread->Wait.return_code = EINTR; ffc08824: 38 00 00 04 li r0,4 ffc08828: 90 09 00 34 stw r0,52(r9) } the_info->si_signo = -1; _Thread_Disable_dispatch(); the_thread->Wait.queue = &_POSIX_signals_Wait_queue; ffc0882c: 3d 60 00 00 lis r11,0 ffc08830: 39 6b 33 6c addi r11,r11,13164 the_thread->Wait.return_code = EINTR; the_thread->Wait.option = *set; ffc08834: 80 1d 00 00 lwz r0,0(r29) } the_info->si_signo = -1; _Thread_Disable_dispatch(); the_thread->Wait.queue = &_POSIX_signals_Wait_queue; ffc08838: 91 69 00 44 stw r11,68(r9) the_thread->Wait.return_code = EINTR; the_thread->Wait.option = *set; ffc0883c: 90 09 00 30 stw r0,48(r9) 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; ffc08840: 38 00 00 01 li r0,1 the_thread->Wait.return_argument = the_info; ffc08844: 93 e9 00 28 stw r31,40(r9) ffc08848: 90 0b 00 30 stw r0,48(r11) ffc0884c: 7f 80 01 24 mtmsr r28 _Thread_queue_Enter_critical_section( &_POSIX_signals_Wait_queue ); _ISR_Enable( level ); _Thread_queue_Enqueue( &_POSIX_signals_Wait_queue, interval ); ffc08850: 3c 60 00 00 lis r3,0 ffc08854: 3c a0 ff c1 lis r5,-63 ffc08858: 38 63 33 6c addi r3,r3,13164 ffc0885c: 38 a5 c1 70 addi r5,r5,-16016 ffc08860: 48 00 35 59 bl ffc0bdb8 <_Thread_queue_Enqueue_with_handler> _Thread_Enable_dispatch(); ffc08864: 48 00 30 29 bl ffc0b88c <_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 ); ffc08868: 80 9f 00 00 lwz r4,0(r31) ffc0886c: 7f 63 db 78 mr r3,r27 ffc08870: 7f e5 fb 78 mr r5,r31 ffc08874: 38 c0 00 00 li r6,0 ffc08878: 38 e0 00 00 li r7,0 ffc0887c: 48 00 62 91 bl ffc0eb0c <_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) ffc08880: 3d 20 00 00 lis r9,0 ffc08884: 81 29 31 90 lwz r9,12688(r9) ffc08888: 80 09 00 34 lwz r0,52(r9) ffc0888c: 2f 80 00 04 cmpwi cr7,r0,4 ffc08890: 40 9e 00 20 bne- cr7,ffc088b0 || !(*set & signo_to_mask( the_info->si_signo )) ) { ffc08894: 83 df 00 00 lwz r30,0(r31) ffc08898: 39 20 00 01 li r9,1 ffc0889c: 38 1e ff ff addi r0,r30,-1 ffc088a0: 7d 29 00 30 slw r9,r9,r0 ffc088a4: 80 1d 00 00 lwz r0,0(r29) ffc088a8: 7d 2b 00 39 and. r11,r9,r0 ffc088ac: 40 a2 00 1c bne+ ffc088c8 errno = _Thread_Executing->Wait.return_code; ffc088b0: 48 00 93 95 bl ffc11c44 <__errno> ffc088b4: 3d 20 00 00 lis r9,0 ffc088b8: 81 29 31 90 lwz r9,12688(r9) ffc088bc: 80 09 00 34 lwz r0,52(r9) ffc088c0: 90 03 00 00 stw r0,0(r3) return -1; ffc088c4: 3b c0 ff ff li r30,-1 } return the_info->si_signo; } ffc088c8: 39 61 00 30 addi r11,r1,48 ffc088cc: 7f c3 f3 78 mr r3,r30 ffc088d0: 4b ff 84 14 b ffc00ce4 <_restgpr_27_x> =============================================================================== ffc0ac34 : int sigwait( const sigset_t *set, int *sig ) { ffc0ac34: 7c 2b 0b 78 mr r11,r1 ffc0ac38: 94 21 ff f0 stwu r1,-16(r1) ffc0ac3c: 7c 08 02 a6 mflr r0 int status; status = sigtimedwait( set, NULL, NULL ); ffc0ac40: 38 a0 00 00 li r5,0 int sigwait( const sigset_t *set, int *sig ) { ffc0ac44: 4b ff 7d 41 bl ffc02984 <_savegpr_31> ffc0ac48: 7c 9f 23 78 mr r31,r4 int status; status = sigtimedwait( set, NULL, NULL ); ffc0ac4c: 38 80 00 00 li r4,0 int sigwait( const sigset_t *set, int *sig ) { ffc0ac50: 90 01 00 14 stw r0,20(r1) int status; status = sigtimedwait( set, NULL, NULL ); ffc0ac54: 4b ff fd dd bl ffc0aa30 if ( status != -1 ) { ffc0ac58: 2f 83 ff ff cmpwi cr7,r3,-1 ffc0ac5c: 41 9e 00 18 beq- cr7,ffc0ac74 if ( sig ) ffc0ac60: 2f 9f 00 00 cmpwi cr7,r31,0 *sig = status; return 0; ffc0ac64: 38 00 00 00 li r0,0 int status; status = sigtimedwait( set, NULL, NULL ); if ( status != -1 ) { if ( sig ) ffc0ac68: 41 9e 00 14 beq- cr7,ffc0ac7c <== NEVER TAKEN *sig = status; ffc0ac6c: 90 7f 00 00 stw r3,0(r31) ffc0ac70: 48 00 00 0c b ffc0ac7c return 0; } return errno; ffc0ac74: 48 00 8f 41 bl ffc13bb4 <__errno> ffc0ac78: 80 03 00 00 lwz r0,0(r3) } ffc0ac7c: 39 61 00 10 addi r11,r1,16 ffc0ac80: 7c 03 03 78 mr r3,r0 ffc0ac84: 4b ff 7d 4c b ffc029d0 <_restgpr_31_x> =============================================================================== ffc073b8 : /* * Process input character, with semaphore. */ static int siproc (unsigned char c, struct rtems_termios_tty *tty) { ffc073b8: 94 21 ff f0 stwu r1,-16(r1) ffc073bc: 7c 08 02 a6 mflr r0 ffc073c0: 90 01 00 14 stw r0,20(r1) int i; /* * Obtain output semaphore if character will be echoed */ if (tty->termios.c_lflag & (ECHO|ECHOE|ECHOK|ECHONL|ECHOPRT|ECHOCTL|ECHOKE)) { ffc073c4: 80 04 00 3c lwz r0,60(r4) /* * Process input character, with semaphore. */ static int siproc (unsigned char c, struct rtems_termios_tty *tty) { ffc073c8: bf c1 00 08 stmw r30,8(r1) ffc073cc: 7c 7e 1b 78 mr r30,r3 int i; /* * Obtain output semaphore if character will be echoed */ if (tty->termios.c_lflag & (ECHO|ECHOE|ECHOK|ECHONL|ECHOPRT|ECHOCTL|ECHOKE)) { ffc073d0: 70 09 0e 78 andi. r9,r0,3704 /* * Process input character, with semaphore. */ static int siproc (unsigned char c, struct rtems_termios_tty *tty) { ffc073d4: 7c 9f 23 78 mr r31,r4 int i; /* * Obtain output semaphore if character will be echoed */ if (tty->termios.c_lflag & (ECHO|ECHOE|ECHOK|ECHONL|ECHOPRT|ECHOCTL|ECHOKE)) { ffc073d8: 41 a2 00 38 beq+ ffc07410 <== NEVER TAKEN rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); ffc073dc: 80 64 00 18 lwz r3,24(r4) ffc073e0: 38 a0 00 00 li r5,0 ffc073e4: 38 80 00 00 li r4,0 ffc073e8: 48 00 16 3d bl ffc08a24 i = iproc (c, tty); ffc073ec: 7f c3 f3 78 mr r3,r30 ffc073f0: 7f e4 fb 78 mr r4,r31 ffc073f4: 4b ff fe 15 bl ffc07208 ffc073f8: 7c 7e 1b 78 mr r30,r3 rtems_semaphore_release (tty->osem); ffc073fc: 80 7f 00 18 lwz r3,24(r31) ffc07400: 48 00 17 4d bl ffc08b4c } else { i = iproc (c, tty); } return i; } ffc07404: 39 61 00 10 addi r11,r1,16 ffc07408: 7f c3 f3 78 mr r3,r30 ffc0740c: 48 01 1d a0 b ffc191ac <_restgpr_30_x> ffc07410: 80 01 00 14 lwz r0,20(r1) <== NOT EXECUTED ffc07414: bb c1 00 08 lmw r30,8(r1) <== NOT EXECUTED ffc07418: 38 21 00 10 addi r1,r1,16 <== NOT EXECUTED ffc0741c: 7c 08 03 a6 mtlr r0 <== 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); ffc07420: 4b ff fd e8 b ffc07208 <== NOT EXECUTED =============================================================================== ffc07cac : #include int statvfs (const char *path, struct statvfs *sb) { ffc07cac: 94 21 ff c8 stwu r1,-56(r1) ffc07cb0: 7c 08 02 a6 mflr r0 ffc07cb4: bf a1 00 2c stmw r29,44(r1) ffc07cb8: 7c 7f 1b 78 mr r31,r3 ffc07cbc: 7c 9e 23 78 mr r30,r4 ffc07cc0: 90 01 00 3c stw r0,60(r1) * 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 ) ) ffc07cc4: 48 00 d7 e5 bl ffc154a8 ffc07cc8: 7c 64 1b 78 mr r4,r3 ffc07ccc: 7f e3 fb 78 mr r3,r31 ffc07cd0: 3b e1 00 08 addi r31,r1,8 ffc07cd4: 38 a0 00 00 li r5,0 ffc07cd8: 7f e6 fb 78 mr r6,r31 ffc07cdc: 38 e0 00 01 li r7,1 ffc07ce0: 4b ff ea 15 bl ffc066f4 return -1; ffc07ce4: 3b a0 ff ff li r29,-1 * 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 ) ) ffc07ce8: 2f 83 00 00 cmpwi cr7,r3,0 ffc07cec: 40 be 00 3c bne+ cr7,ffc07d28 <== NEVER TAKEN return -1; mt_entry = loc.mt_entry; ffc07cf0: 83 a1 00 18 lwz r29,24(r1) fs_mount_root = &mt_entry->mt_fs_root; memset (sb, 0, sizeof (struct statvfs)); ffc07cf4: 38 80 00 00 li r4,0 ffc07cf8: 38 a0 00 38 li r5,56 ffc07cfc: 7f c3 f3 78 mr r3,r30 ffc07d00: 48 00 c5 39 bl ffc14238 result = ( fs_mount_root->ops->statvfs_h )( fs_mount_root, sb ); ffc07d04: 81 3d 00 28 lwz r9,40(r29) ffc07d08: 38 7d 00 1c addi r3,r29,28 ffc07d0c: 80 09 00 44 lwz r0,68(r9) ffc07d10: 7f c4 f3 78 mr r4,r30 ffc07d14: 7c 09 03 a6 mtctr r0 ffc07d18: 4e 80 04 21 bctrl ffc07d1c: 7c 7d 1b 78 mr r29,r3 rtems_filesystem_freenode( &loc ); ffc07d20: 7f e3 fb 78 mr r3,r31 ffc07d24: 4b ff ea c5 bl ffc067e8 return result; } ffc07d28: 39 61 00 38 addi r11,r1,56 ffc07d2c: 7f a3 eb 78 mr r3,r29 ffc07d30: 4b ff a9 30 b ffc02660 <_restgpr_29_x> =============================================================================== ffc0673c : fdatasync(fn); } /* iterate over all FILE *'s for this thread */ static void sync_per_thread(Thread_Control *t) { ffc0673c: 94 21 ff f0 stwu r1,-16(r1) ffc06740: 7c 08 02 a6 mflr r0 ffc06744: 90 01 00 14 stw r0,20(r1) /* * The sync_wrapper() function will operate on the current thread's * reent structure so we will temporarily use that. */ this_reent = t->libc_reent; ffc06748: 80 03 01 2c lwz r0,300(r3) fdatasync(fn); } /* iterate over all FILE *'s for this thread */ static void sync_per_thread(Thread_Control *t) { ffc0674c: bf c1 00 08 stmw r30,8(r1) /* * The sync_wrapper() function will operate on the current thread's * reent structure so we will temporarily use that. */ this_reent = t->libc_reent; if ( this_reent ) { ffc06750: 2f 80 00 00 cmpwi cr7,r0,0 ffc06754: 41 9e 00 30 beq- cr7,ffc06784 <== NEVER TAKEN current_reent = _Thread_Executing->libc_reent; ffc06758: 3f e0 00 00 lis r31,0 ffc0675c: 3b ff 31 24 addi r31,r31,12580 ffc06760: 81 3f 00 0c lwz r9,12(r31) _Thread_Executing->libc_reent = this_reent; _fwalk (t->libc_reent, sync_wrapper); ffc06764: 3c 80 ff c0 lis r4,-64 ffc06768: 38 84 67 8c addi r4,r4,26508 * The sync_wrapper() function will operate on the current thread's * reent structure so we will temporarily use that. */ this_reent = t->libc_reent; if ( this_reent ) { current_reent = _Thread_Executing->libc_reent; ffc0676c: 83 c9 01 2c lwz r30,300(r9) _Thread_Executing->libc_reent = this_reent; ffc06770: 90 09 01 2c stw r0,300(r9) _fwalk (t->libc_reent, sync_wrapper); ffc06774: 80 63 01 2c lwz r3,300(r3) ffc06778: 48 00 c0 d5 bl ffc1284c <_fwalk> _Thread_Executing->libc_reent = current_reent; ffc0677c: 81 3f 00 0c lwz r9,12(r31) ffc06780: 93 c9 01 2c stw r30,300(r9) } } ffc06784: 39 61 00 10 addi r11,r1,16 ffc06788: 4b ff a5 9c b ffc00d24 <_restgpr_30_x> =============================================================================== ffc0dfc8 : int fd, int opt, struct termios *tp ) { switch (opt) { ffc0dfc8: 2c 04 00 00 cmpwi r4,0 int tcsetattr( int fd, int opt, struct termios *tp ) { ffc0dfcc: 94 21 ff f0 stwu r1,-16(r1) ffc0dfd0: 7c 08 02 a6 mflr r0 ffc0dfd4: bf c1 00 08 stmw r30,8(r1) ffc0dfd8: 7c 7e 1b 78 mr r30,r3 ffc0dfdc: 7c bf 2b 78 mr r31,r5 ffc0dfe0: 90 01 00 14 stw r0,20(r1) switch (opt) { ffc0dfe4: 41 82 00 3c beq- ffc0e020 ffc0dfe8: 2f 84 00 01 cmpwi cr7,r4,1 ffc0dfec: 41 9e 00 18 beq- cr7,ffc0e004 default: rtems_set_errno_and_return_minus_one( ENOTSUP ); ffc0dff0: 48 00 41 79 bl ffc12168 <__errno> ffc0dff4: 38 00 00 86 li r0,134 ffc0dff8: 90 03 00 00 stw r0,0(r3) ffc0dffc: 38 00 ff ff li r0,-1 ffc0e000: 48 00 00 38 b ffc0e038 case TCSADRAIN: if (ioctl( fd, RTEMS_IO_TCDRAIN, NULL ) < 0) ffc0e004: 38 80 00 03 li r4,3 ffc0e008: 38 a0 00 00 li r5,0 ffc0e00c: 4c c6 31 82 crclr 4*cr1+eq ffc0e010: 4b ff fb 4d bl ffc0db5c return -1; ffc0e014: 38 00 ff ff li r0,-1 switch (opt) { default: rtems_set_errno_and_return_minus_one( ENOTSUP ); case TCSADRAIN: if (ioctl( fd, RTEMS_IO_TCDRAIN, NULL ) < 0) ffc0e018: 2f 83 00 00 cmpwi cr7,r3,0 ffc0e01c: 41 9c 00 1c blt- cr7,ffc0e038 <== NEVER TAKEN return -1; /* * Fall through to.... */ case TCSANOW: return ioctl( fd, RTEMS_IO_SET_ATTRIBUTES, tp ); ffc0e020: 7f c3 f3 78 mr r3,r30 ffc0e024: 38 80 00 02 li r4,2 ffc0e028: 7f e5 fb 78 mr r5,r31 ffc0e02c: 4c c6 31 82 crclr 4*cr1+eq ffc0e030: 4b ff fb 2d bl ffc0db5c ffc0e034: 7c 60 1b 78 mr r0,r3 } } ffc0e038: 39 61 00 10 addi r11,r1,16 ffc0e03c: 7c 03 03 78 mr r3,r0 ffc0e040: 4b ff 29 d8 b ffc00a18 <_restgpr_30_x> =============================================================================== ffc07928 : timer_t *timerid ) { POSIX_Timer_Control *ptimer; if ( clock_id != CLOCK_REALTIME ) ffc07928: 2f 83 00 01 cmpwi cr7,r3,1 int timer_create( clockid_t clock_id, struct sigevent *evp, timer_t *timerid ) { ffc0792c: 94 21 ff f0 stwu r1,-16(r1) ffc07930: 7c 08 02 a6 mflr r0 ffc07934: bf c1 00 08 stmw r30,8(r1) ffc07938: 7c 9f 23 78 mr r31,r4 ffc0793c: 7c be 2b 78 mr r30,r5 ffc07940: 90 01 00 14 stw r0,20(r1) POSIX_Timer_Control *ptimer; if ( clock_id != CLOCK_REALTIME ) ffc07944: 40 9e 00 3c bne- cr7,ffc07980 rtems_set_errno_and_return_minus_one( EINVAL ); if ( !timerid ) ffc07948: 2f 85 00 00 cmpwi cr7,r5,0 ffc0794c: 41 9e 00 34 beq- cr7,ffc07980 /* * The data of the structure evp are checked in order to verify if they * are coherent. */ if (evp != NULL) { ffc07950: 2f 84 00 00 cmpwi cr7,r4,0 ffc07954: 41 9e 00 38 beq- cr7,ffc0798c /* The structure has data */ if ( ( evp->sigev_notify != SIGEV_NONE ) && ffc07958: 81 24 00 00 lwz r9,0(r4) ffc0795c: 38 09 ff ff addi r0,r9,-1 ffc07960: 2b 80 00 01 cmplwi cr7,r0,1 ffc07964: 41 9d 00 1c bgt- cr7,ffc07980 <== 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 ) ffc07968: 81 24 00 04 lwz r9,4(r4) ffc0796c: 2f 89 00 00 cmpwi cr7,r9,0 ffc07970: 41 9e 00 10 beq- cr7,ffc07980 <== NEVER TAKEN static inline bool is_valid_signo( int signo ) { return ((signo) >= 1 && (signo) <= 32 ); ffc07974: 39 29 ff ff addi r9,r9,-1 rtems_set_errno_and_return_minus_one( EINVAL ); if ( !is_valid_signo(evp->sigev_signo) ) ffc07978: 2b 89 00 1f cmplwi cr7,r9,31 ffc0797c: 40 bd 00 10 ble+ cr7,ffc0798c <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); ffc07980: 48 00 98 19 bl ffc11198 <__errno> ffc07984: 38 00 00 16 li r0,22 ffc07988: 48 00 00 34 b ffc079bc rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; ffc0798c: 3d 20 00 00 lis r9,0 ffc07990: 81 69 28 54 lwz r11,10324(r9) ffc07994: 38 0b 00 01 addi r0,r11,1 ffc07998: 90 09 28 54 stw r0,10324(r9) * 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 ); ffc0799c: 3c 60 00 00 lis r3,0 ffc079a0: 38 63 2f 4c addi r3,r3,12108 ffc079a4: 48 00 21 2d bl ffc09ad0 <_Objects_Allocate> /* * Allocate a timer */ ptimer = _POSIX_Timer_Allocate(); if ( !ptimer ) { ffc079a8: 2c 03 00 00 cmpwi r3,0 ffc079ac: 40 a2 00 1c bne+ ffc079c8 _Thread_Enable_dispatch(); ffc079b0: 48 00 34 21 bl ffc0add0 <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one( EAGAIN ); ffc079b4: 48 00 97 e5 bl ffc11198 <__errno> ffc079b8: 38 00 00 0b li r0,11 ffc079bc: 90 03 00 00 stw r0,0(r3) ffc079c0: 38 60 ff ff li r3,-1 ffc079c4: 48 00 00 88 b ffc07a4c } /* The data of the created timer are stored to use them later */ ptimer->state = POSIX_TIMER_STATE_CREATE_NEW; ffc079c8: 38 00 00 02 li r0,2 ffc079cc: 98 03 00 3c stb r0,60(r3) ptimer->thread_id = _Thread_Executing->Object.id; ffc079d0: 3d 20 00 00 lis r9,0 if ( evp != NULL ) { ffc079d4: 2f 9f 00 00 cmpwi cr7,r31,0 } /* The data of the created timer are stored to use them later */ ptimer->state = POSIX_TIMER_STATE_CREATE_NEW; ptimer->thread_id = _Thread_Executing->Object.id; ffc079d8: 81 29 31 90 lwz r9,12688(r9) ffc079dc: 80 09 00 08 lwz r0,8(r9) ffc079e0: 90 03 00 38 stw r0,56(r3) if ( evp != NULL ) { ffc079e4: 41 9e 00 1c beq- cr7,ffc07a00 ptimer->inf.sigev_notify = evp->sigev_notify; ffc079e8: 80 1f 00 00 lwz r0,0(r31) ffc079ec: 90 03 00 40 stw r0,64(r3) ptimer->inf.sigev_signo = evp->sigev_signo; ffc079f0: 80 1f 00 04 lwz r0,4(r31) ffc079f4: 90 03 00 44 stw r0,68(r3) ptimer->inf.sigev_value = evp->sigev_value; ffc079f8: 80 1f 00 08 lwz r0,8(r31) ffc079fc: 90 03 00 48 stw r0,72(r3) uint32_t name ) { _Objects_Set_local_object( information, _Objects_Get_index( the_object->id ), ffc07a00: 81 23 00 08 lwz r9,8(r3) #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; ffc07a04: 3d 60 00 00 lis r11,0 ffc07a08: 81 4b 2f 68 lwz r10,12136(r11) } ptimer->overrun = 0; ffc07a0c: 38 00 00 00 li r0,0 ffc07a10: 55 2b 13 ba rlwinm r11,r9,2,14,29 ffc07a14: 90 03 00 68 stw r0,104(r3) ptimer->timer_data.it_value.tv_sec = 0; ffc07a18: 90 03 00 5c stw r0,92(r3) ptimer->timer_data.it_value.tv_nsec = 0; ffc07a1c: 90 03 00 60 stw r0,96(r3) ptimer->timer_data.it_interval.tv_sec = 0; ffc07a20: 90 03 00 54 stw r0,84(r3) ptimer->timer_data.it_interval.tv_nsec = 0; ffc07a24: 90 03 00 58 stw r0,88(r3) Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; ffc07a28: 90 03 00 18 stw r0,24(r3) the_watchdog->routine = routine; ffc07a2c: 90 03 00 2c stw r0,44(r3) the_watchdog->id = id; ffc07a30: 90 03 00 30 stw r0,48(r3) the_watchdog->user_data = user_data; ffc07a34: 90 03 00 34 stw r0,52(r3) ffc07a38: 7c 6a 59 2e stwx r3,r10,r11 _Objects_Get_index( the_object->id ), the_object ); /* ASSERT: information->is_string == false */ the_object->name.name_u32 = name; ffc07a3c: 90 03 00 0c stw r0,12(r3) _Watchdog_Initialize( &ptimer->Timer, NULL, 0, NULL ); _Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0); *timerid = ptimer->Object.id; ffc07a40: 91 3e 00 00 stw r9,0(r30) _Thread_Enable_dispatch(); ffc07a44: 48 00 33 8d bl ffc0add0 <_Thread_Enable_dispatch> return 0; ffc07a48: 38 60 00 00 li r3,0 } ffc07a4c: 39 61 00 10 addi r11,r1,16 ffc07a50: 4b ff 8b d0 b ffc00620 <_restgpr_30_x> =============================================================================== ffc07a54 : timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue ) { ffc07a54: 94 21 ff c0 stwu r1,-64(r1) ffc07a58: 7c 08 02 a6 mflr r0 ffc07a5c: bf 61 00 2c stmw r27,44(r1) Objects_Locations location; bool activated; uint32_t initial_period; struct itimerspec normalize; if ( !value ) ffc07a60: 7c bd 2b 79 mr. r29,r5 timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue ) { ffc07a64: 7c 7f 1b 78 mr r31,r3 ffc07a68: 90 01 00 44 stw r0,68(r1) ffc07a6c: 7c 9c 23 78 mr r28,r4 ffc07a70: 7c de 33 78 mr r30,r6 Objects_Locations location; bool activated; uint32_t initial_period; struct itimerspec normalize; if ( !value ) ffc07a74: 41 82 01 68 beq- ffc07bdc <== 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) ) ) { ffc07a78: 38 7d 00 08 addi r3,r29,8 ffc07a7c: 48 00 40 31 bl ffc0baac <_Timespec_Is_valid> ffc07a80: 2f 83 00 00 cmpwi cr7,r3,0 ffc07a84: 41 9e 01 58 beq- cr7,ffc07bdc rtems_set_errno_and_return_minus_one( EINVAL ); } if ( !_Timespec_Is_valid( &(value->it_interval) ) ) { ffc07a88: 7f a3 eb 78 mr r3,r29 ffc07a8c: 48 00 40 21 bl ffc0baac <_Timespec_Is_valid> ffc07a90: 2f 83 00 00 cmpwi cr7,r3,0 ffc07a94: 41 9e 01 48 beq- cr7,ffc07bdc rtems_set_errno_and_return_minus_one( EINVAL ); } if ( flags != TIMER_ABSTIME && flags != POSIX_TIMER_RELATIVE ) { ffc07a98: 2f 9c 00 04 cmpwi cr7,r28,4 ffc07a9c: 41 9e 00 0c beq- cr7,ffc07aa8 ffc07aa0: 2f 9c 00 00 cmpwi cr7,r28,0 ffc07aa4: 40 9e 01 38 bne- cr7,ffc07bdc <== NEVER TAKEN } normalize = *value; /* Convert absolute to relative time */ if (flags == TIMER_ABSTIME) { ffc07aa8: 2f 9c 00 04 cmpwi cr7,r28,4 if ( flags != TIMER_ABSTIME && flags != POSIX_TIMER_RELATIVE ) { rtems_set_errno_and_return_minus_one( EINVAL ); } normalize = *value; ffc07aac: 39 21 00 14 addi r9,r1,20 ffc07ab0: 7c bd 84 aa lswi r5,r29,16 ffc07ab4: 7c a9 85 aa stswi r5,r9,16 /* Convert absolute to relative time */ if (flags == TIMER_ABSTIME) { ffc07ab8: 40 be 00 38 bne+ cr7,ffc07af0 struct timespec now; _TOD_Get( &now ); ffc07abc: 3b 81 00 0c addi r28,r1,12 ffc07ac0: 7f 83 e3 78 mr r3,r28 /* Check for seconds in the past */ if ( _Timespec_Greater_than( &now, &normalize.it_value ) ) ffc07ac4: 3b 61 00 1c addi r27,r1,28 normalize = *value; /* Convert absolute to relative time */ if (flags == TIMER_ABSTIME) { struct timespec now; _TOD_Get( &now ); ffc07ac8: 48 00 1a 95 bl ffc0955c <_TOD_Get> /* Check for seconds in the past */ if ( _Timespec_Greater_than( &now, &normalize.it_value ) ) ffc07acc: 7f 83 e3 78 mr r3,r28 ffc07ad0: 7f 64 db 78 mr r4,r27 ffc07ad4: 48 00 3f 9d bl ffc0ba70 <_Timespec_Greater_than> ffc07ad8: 2f 83 00 00 cmpwi cr7,r3,0 ffc07adc: 40 9e 01 00 bne- cr7,ffc07bdc <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); _Timespec_Subtract( &now, &normalize.it_value, &normalize.it_value ); ffc07ae0: 7f 83 e3 78 mr r3,r28 ffc07ae4: 7f 64 db 78 mr r4,r27 ffc07ae8: 7f 65 db 78 mr r5,r27 ffc07aec: 48 00 40 01 bl ffc0baec <_Timespec_Subtract> timer_t id, Objects_Locations *location ) { return (POSIX_Timer_Control *) _Objects_Get( &_POSIX_Timer_Information, (Objects_Id) id, location ); ffc07af0: 3c 60 00 00 lis r3,0 ffc07af4: 7f e4 fb 78 mr r4,r31 ffc07af8: 38 63 2f 4c addi r3,r3,12108 ffc07afc: 38 a1 00 08 addi r5,r1,8 ffc07b00: 48 00 24 dd bl ffc09fdc <_Objects_Get> * something with the structure of times of the timer: to stop, start * or start it again */ ptimer = _POSIX_Timer_Get( timerid, &location ); switch ( location ) { ffc07b04: 80 01 00 08 lwz r0,8(r1) ffc07b08: 7c 7f 1b 78 mr r31,r3 ffc07b0c: 2f 80 00 00 cmpwi cr7,r0,0 ffc07b10: 40 9e 00 cc bne- cr7,ffc07bdc <== NEVER TAKEN 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 ) { ffc07b14: 80 01 00 1c lwz r0,28(r1) ffc07b18: 2f 80 00 00 cmpwi cr7,r0,0 ffc07b1c: 40 9e 00 48 bne- cr7,ffc07b64 ffc07b20: 80 01 00 20 lwz r0,32(r1) ffc07b24: 2f 80 00 00 cmpwi cr7,r0,0 ffc07b28: 40 be 00 3c bne+ cr7,ffc07b64 /* Stop the timer */ (void) _Watchdog_Remove( &ptimer->Timer ); ffc07b2c: 38 63 00 10 addi r3,r3,16 ffc07b30: 48 00 44 f9 bl ffc0c028 <_Watchdog_Remove> /* The old data of the timer are returned */ if ( ovalue ) ffc07b34: 2f 9e 00 00 cmpwi cr7,r30,0 ffc07b38: 41 9e 00 10 beq- cr7,ffc07b48 *ovalue = ptimer->timer_data; ffc07b3c: 39 3f 00 54 addi r9,r31,84 ffc07b40: 7c a9 84 aa lswi r5,r9,16 ffc07b44: 7c be 85 aa stswi r5,r30,16 /* The new data are set */ ptimer->timer_data = normalize; ffc07b48: 39 3f 00 54 addi r9,r31,84 ffc07b4c: 39 61 00 14 addi r11,r1,20 /* Indicates that the timer is created and stopped */ ptimer->state = POSIX_TIMER_STATE_CREATE_STOP; ffc07b50: 38 00 00 04 li r0,4 (void) _Watchdog_Remove( &ptimer->Timer ); /* The old data of the timer are returned */ if ( ovalue ) *ovalue = ptimer->timer_data; /* The new data are set */ ptimer->timer_data = normalize; ffc07b54: 7c ab 84 aa lswi r5,r11,16 ffc07b58: 7c a9 85 aa stswi r5,r9,16 /* Indicates that the timer is created and stopped */ ptimer->state = POSIX_TIMER_STATE_CREATE_STOP; ffc07b5c: 98 1f 00 3c stb r0,60(r31) ffc07b60: 48 00 00 70 b ffc07bd0 _Thread_Enable_dispatch(); return 0; } /* Convert from seconds and nanoseconds to ticks */ ptimer->ticks = _Timespec_To_ticks( &value->it_interval ); ffc07b64: 7f a3 eb 78 mr r3,r29 ffc07b68: 48 00 3f c9 bl ffc0bb30 <_Timespec_To_ticks> ffc07b6c: 90 7f 00 64 stw r3,100(r31) initial_period = _Timespec_To_ticks( &normalize.it_value ); ffc07b70: 38 61 00 1c addi r3,r1,28 ffc07b74: 48 00 3f bd bl ffc0bb30 <_Timespec_To_ticks> activated = _POSIX_Timer_Insert_helper( ffc07b78: 80 bf 00 08 lwz r5,8(r31) ffc07b7c: 3c c0 ff c0 lis r6,-64 return 0; } /* Convert from seconds and nanoseconds to ticks */ ptimer->ticks = _Timespec_To_ticks( &value->it_interval ); initial_period = _Timespec_To_ticks( &normalize.it_value ); ffc07b80: 7c 64 1b 78 mr r4,r3 activated = _POSIX_Timer_Insert_helper( ffc07b84: 38 c6 7b f4 addi r6,r6,31732 ffc07b88: 38 7f 00 10 addi r3,r31,16 ffc07b8c: 7f e7 fb 78 mr r7,r31 ffc07b90: 48 00 68 b5 bl ffc0e444 <_POSIX_Timer_Insert_helper> initial_period, ptimer->Object.id, _POSIX_Timer_TSR, ptimer ); if ( !activated ) { ffc07b94: 2f 83 00 00 cmpwi cr7,r3,0 ffc07b98: 41 9e 00 38 beq- cr7,ffc07bd0 /* * The timer has been started and is running. So we return the * old ones in "ovalue" */ if ( ovalue ) ffc07b9c: 2f 9e 00 00 cmpwi cr7,r30,0 ffc07ba0: 41 9e 00 10 beq- cr7,ffc07bb0 *ovalue = ptimer->timer_data; ffc07ba4: 39 3f 00 54 addi r9,r31,84 ffc07ba8: 7c a9 84 aa lswi r5,r9,16 ffc07bac: 7c be 85 aa stswi r5,r30,16 ptimer->timer_data = normalize; ffc07bb0: 39 3f 00 54 addi r9,r31,84 ffc07bb4: 39 61 00 14 addi r11,r1,20 /* Indicate that the time is running */ ptimer->state = POSIX_TIMER_STATE_CREATE_RUN; ffc07bb8: 38 00 00 03 li r0,3 * The timer has been started and is running. So we return the * old ones in "ovalue" */ if ( ovalue ) *ovalue = ptimer->timer_data; ptimer->timer_data = normalize; ffc07bbc: 7c ab 84 aa lswi r5,r11,16 ffc07bc0: 7c a9 85 aa stswi r5,r9,16 /* Indicate that the time is running */ ptimer->state = POSIX_TIMER_STATE_CREATE_RUN; _TOD_Get( &ptimer->time ); ffc07bc4: 38 7f 00 6c addi r3,r31,108 if ( ovalue ) *ovalue = ptimer->timer_data; ptimer->timer_data = normalize; /* Indicate that the time is running */ ptimer->state = POSIX_TIMER_STATE_CREATE_RUN; ffc07bc8: 98 1f 00 3c stb r0,60(r31) _TOD_Get( &ptimer->time ); ffc07bcc: 48 00 19 91 bl ffc0955c <_TOD_Get> _Thread_Enable_dispatch(); ffc07bd0: 48 00 32 01 bl ffc0add0 <_Thread_Enable_dispatch> return 0; ffc07bd4: 38 60 00 00 li r3,0 ffc07bd8: 48 00 00 14 b ffc07bec #endif case OBJECTS_ERROR: break; } rtems_set_errno_and_return_minus_one( EINVAL ); ffc07bdc: 48 00 95 bd bl ffc11198 <__errno> ffc07be0: 38 00 00 16 li r0,22 ffc07be4: 90 03 00 00 stw r0,0(r3) ffc07be8: 38 60 ff ff li r3,-1 } ffc07bec: 39 61 00 40 addi r11,r1,64 ffc07bf0: 4b ff 8a 24 b ffc00614 <_restgpr_27_x> =============================================================================== ffc077b4 : useconds_t ualarm( useconds_t useconds, useconds_t interval ) { ffc077b4: 94 21 ff d8 stwu r1,-40(r1) ffc077b8: 7c 08 02 a6 mflr r0 ffc077bc: bf a1 00 1c stmw r29,28(r1) /* * Initialize the timer used to implement alarm(). */ if ( !the_timer->routine ) { ffc077c0: 3f a0 00 00 lis r29,0 ffc077c4: 3b bd 35 54 addi r29,r29,13652 useconds_t ualarm( useconds_t useconds, useconds_t interval ) { ffc077c8: 90 01 00 2c stw r0,44(r1) ffc077cc: 7c 7e 1b 78 mr r30,r3 /* * Initialize the timer used to implement alarm(). */ if ( !the_timer->routine ) { ffc077d0: 80 1d 00 1c lwz r0,28(r29) ffc077d4: 2f 80 00 00 cmpwi cr7,r0,0 ffc077d8: 40 be 00 24 bne+ cr7,ffc077fc Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; ffc077dc: 3d 20 ff c0 lis r9,-64 Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; ffc077e0: 90 1d 00 08 stw r0,8(r29) the_watchdog->routine = routine; ffc077e4: 39 29 77 6c addi r9,r9,30572 ffc077e8: 91 3d 00 1c stw r9,28(r29) useconds_t ualarm( useconds_t useconds, useconds_t interval ) { useconds_t remaining = 0; ffc077ec: 3b e0 00 00 li r31,0 the_watchdog->id = id; ffc077f0: 90 1d 00 20 stw r0,32(r29) the_watchdog->user_data = user_data; ffc077f4: 90 1d 00 24 stw r0,36(r29) ffc077f8: 48 00 00 58 b ffc07850 if ( !the_timer->routine ) { _Watchdog_Initialize( the_timer, _POSIX_signals_Ualarm_TSR, 0, NULL ); } else { Watchdog_States state; state = _Watchdog_Remove( the_timer ); ffc077fc: 7f a3 eb 78 mr r3,r29 ffc07800: 48 00 42 f5 bl ffc0baf4 <_Watchdog_Remove> useconds_t ualarm( useconds_t useconds, useconds_t interval ) { useconds_t remaining = 0; ffc07804: 3b e0 00 00 li r31,0 _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) ) { ffc07808: 38 63 ff fe addi r3,r3,-2 ffc0780c: 2b 83 00 01 cmplwi cr7,r3,1 ffc07810: 41 bd 00 40 bgt+ cr7,ffc07850 <== 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); ffc07814: 80 1d 00 0c lwz r0,12(r29) /* remaining is now in ticks */ _Timespec_From_ticks( ticks, &tp ); ffc07818: 38 81 00 08 addi r4,r1,8 * 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); ffc0781c: 80 7d 00 14 lwz r3,20(r29) ffc07820: 7c 63 02 14 add r3,r3,r0 ffc07824: 80 1d 00 18 lwz r0,24(r29) /* remaining is now in ticks */ _Timespec_From_ticks( ticks, &tp ); ffc07828: 7c 60 18 50 subf r3,r0,r3 ffc0782c: 48 00 3c a5 bl ffc0b4d0 <_Timespec_From_ticks> remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND; ffc07830: 81 21 00 08 lwz r9,8(r1) ffc07834: 3c 00 00 0f lis r0,15 remaining += tp.tv_nsec / 1000; ffc07838: 83 e1 00 0c lwz r31,12(r1) ticks = the_timer->initial; ticks -= (the_timer->stop_time - the_timer->start_time); /* remaining is now in ticks */ _Timespec_From_ticks( ticks, &tp ); remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND; ffc0783c: 60 00 42 40 ori r0,r0,16960 ffc07840: 7c 00 49 d6 mullw r0,r0,r9 remaining += tp.tv_nsec / 1000; ffc07844: 39 20 03 e8 li r9,1000 ffc07848: 7f ff 4b d6 divw r31,r31,r9 ffc0784c: 7f ff 02 14 add r31,r31,r0 /* * 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 ) { ffc07850: 2f 9e 00 00 cmpwi cr7,r30,0 ffc07854: 41 be 00 50 beq+ cr7,ffc078a4 Watchdog_Interval ticks; tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND; ffc07858: 3c 00 00 0f lis r0,15 ffc0785c: 60 00 42 40 ori r0,r0,16960 ffc07860: 7d 3e 03 96 divwu r9,r30,r0 tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000; ffc07864: 7c 09 01 d6 mullw r0,r9,r0 * less than a single clock tick, then fudge it to a clock tick. */ if ( useconds ) { Watchdog_Interval ticks; tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND; ffc07868: 91 21 00 08 stw r9,8(r1) tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000; ffc0786c: 7f c0 f0 50 subf r30,r0,r30 ffc07870: 1f de 03 e8 mulli r30,r30,1000 ffc07874: 93 c1 00 0c stw r30,12(r1) ticks = _Timespec_To_ticks( &tp ); ffc07878: 3b c1 00 08 addi r30,r1,8 ffc0787c: 7f c3 f3 78 mr r3,r30 ffc07880: 48 00 3c c5 bl ffc0b544 <_Timespec_To_ticks> if ( ticks == 0 ) ticks = 1; _Watchdog_Insert_ticks( the_timer, _Timespec_To_ticks( &tp ) ); ffc07884: 7f c3 f3 78 mr r3,r30 ffc07888: 48 00 3c bd bl ffc0b544 <_Timespec_To_ticks> Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; ffc0788c: 3c 80 00 00 lis r4,0 ffc07890: 38 84 35 54 addi r4,r4,13652 ffc07894: 90 64 00 0c stw r3,12(r4) _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); ffc07898: 3c 60 00 00 lis r3,0 ffc0789c: 38 63 2d a8 addi r3,r3,11688 ffc078a0: 48 00 40 f9 bl ffc0b998 <_Watchdog_Insert> } return remaining; } ffc078a4: 39 61 00 28 addi r11,r1,40 ffc078a8: 7f e3 fb 78 mr r3,r31 ffc078ac: 4b ff 8c 4c b ffc004f8 <_restgpr_29_x> =============================================================================== ffc07ee4 : #include int unlink( const char *path ) { ffc07ee4: 94 21 ff a8 stwu r1,-88(r1) ffc07ee8: 7d 80 00 26 mfcr r12 ffc07eec: 7c 08 02 a6 mflr r0 ffc07ef0: bf 41 00 40 stmw r26,64(r1) ffc07ef4: 7c 7c 1b 78 mr r28,r3 ffc07ef8: 90 01 00 5c stw r0,92(r1) ffc07efc: 91 81 00 3c stw r12,60(r1) /* * Get the node to be unlinked. Find the parent path first. */ parentpathlen = rtems_filesystem_dirname ( path ); ffc07f00: 4b ff d1 6d bl ffc0506c if ( parentpathlen == 0 ) ffc07f04: 7c 7b 1b 79 mr. r27,r3 ffc07f08: 38 c1 00 0c addi r6,r1,12 ffc07f0c: 40 82 00 1c bne- ffc07f28 rtems_filesystem_get_start_loc( path, &i, &parentloc ); ffc07f10: 7f 83 e3 78 mr r3,r28 ffc07f14: 38 81 00 08 addi r4,r1,8 ffc07f18: 7c c5 33 78 mr r5,r6 ffc07f1c: 4b ff e2 89 bl ffc061a4 const char *name; rtems_filesystem_location_info_t parentloc; rtems_filesystem_location_info_t loc; int i; int result; bool free_parentloc = false; ffc07f20: 3b a0 00 00 li r29,0 ffc07f24: 48 00 00 28 b ffc07f4c parentpathlen = rtems_filesystem_dirname ( path ); if ( parentpathlen == 0 ) rtems_filesystem_get_start_loc( path, &i, &parentloc ); else { result = rtems_filesystem_evaluate_path( path, parentpathlen, ffc07f28: 7f 83 e3 78 mr r3,r28 ffc07f2c: 7f 64 db 78 mr r4,r27 ffc07f30: 38 a0 00 02 li r5,2 ffc07f34: 38 e0 00 00 li r7,0 ffc07f38: 4b ff d0 d9 bl ffc05010 RTEMS_LIBIO_PERMS_WRITE, &parentloc, false ); if ( result != 0 ) return -1; ffc07f3c: 3b 40 ff ff li r26,-1 else { result = rtems_filesystem_evaluate_path( path, parentpathlen, RTEMS_LIBIO_PERMS_WRITE, &parentloc, false ); if ( result != 0 ) ffc07f40: 2f 83 00 00 cmpwi cr7,r3,0 ffc07f44: 40 9e 00 e4 bne- cr7,ffc08028 <== NEVER TAKEN return -1; free_parentloc = true; ffc07f48: 3b a0 00 01 li r29,1 /* * Start from the parent to find the node that should be under it. */ loc = parentloc; ffc07f4c: 3b e1 00 20 addi r31,r1,32 ffc07f50: 3b c1 00 0c addi r30,r1,12 ffc07f54: 7c be a4 aa lswi r5,r30,20 ffc07f58: 7c bf a5 aa stswi r5,r31,20 name = path + parentpathlen; ffc07f5c: 7f 9c da 14 add r28,r28,r27 name += rtems_filesystem_prefix_separators( name, strlen( name ) ); ffc07f60: 7f 83 e3 78 mr r3,r28 ffc07f64: 48 00 d4 f5 bl ffc15458 ffc07f68: 7c 64 1b 78 mr r4,r3 ffc07f6c: 7f 83 e3 78 mr r3,r28 ffc07f70: 4b ff d1 45 bl ffc050b4 ffc07f74: 7f 9c 1a 14 add r28,r28,r3 result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), ffc07f78: 7f 83 e3 78 mr r3,r28 ffc07f7c: 48 00 d4 dd bl ffc15458 ffc07f80: 38 a0 00 00 li r5,0 ffc07f84: 7c 64 1b 78 mr r4,r3 ffc07f88: 7f e6 fb 78 mr r6,r31 ffc07f8c: 7f 83 e3 78 mr r3,r28 ffc07f90: 38 e0 00 00 li r7,0 ffc07f94: 4b ff cf f9 bl ffc04f8c 0, &loc, false ); if ( result != 0 ) { ffc07f98: 2f 83 00 00 cmpwi cr7,r3,0 ffc07f9c: 41 be 00 14 beq+ cr7,ffc07fb0 if ( free_parentloc ) ffc07fa0: 2f 9d 00 00 cmpwi cr7,r29,0 rtems_filesystem_freenode( &parentloc ); return -1; ffc07fa4: 3b 40 ff ff li r26,-1 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 ) ffc07fa8: 41 be 00 80 beq+ cr7,ffc08028 <== NEVER TAKEN ffc07fac: 48 00 00 74 b ffc08020 rtems_filesystem_freenode( &parentloc ); return -1; } if ( (*loc.ops->node_type_h)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) { ffc07fb0: 81 21 00 2c lwz r9,44(r1) ffc07fb4: 7f e3 fb 78 mr r3,r31 ffc07fb8: 2e 1d 00 00 cmpwi cr4,r29,0 ffc07fbc: 80 09 00 10 lwz r0,16(r9) ffc07fc0: 7c 09 03 a6 mtctr r0 ffc07fc4: 4e 80 04 21 bctrl ffc07fc8: 2f 83 00 01 cmpwi cr7,r3,1 ffc07fcc: 40 be 00 2c bne+ cr7,ffc07ff8 rtems_filesystem_freenode( &loc ); ffc07fd0: 7f e3 fb 78 mr r3,r31 ffc07fd4: 4b ff d1 31 bl ffc05104 if ( free_parentloc ) ffc07fd8: 41 b2 00 0c beq+ cr4,ffc07fe4 rtems_filesystem_freenode( &parentloc ); ffc07fdc: 7f c3 f3 78 mr r3,r30 ffc07fe0: 4b ff d1 25 bl ffc05104 rtems_set_errno_and_return_minus_one( EISDIR ); ffc07fe4: 48 00 c2 d5 bl ffc142b8 <__errno> ffc07fe8: 38 00 00 15 li r0,21 ffc07fec: 90 03 00 00 stw r0,0(r3) ffc07ff0: 3b 40 ff ff li r26,-1 ffc07ff4: 48 00 00 34 b ffc08028 } result = (*loc.ops->unlink_h)( &parentloc, &loc ); ffc07ff8: 81 21 00 2c lwz r9,44(r1) ffc07ffc: 7f c3 f3 78 mr r3,r30 ffc08000: 7f e4 fb 78 mr r4,r31 ffc08004: 80 09 00 0c lwz r0,12(r9) ffc08008: 7c 09 03 a6 mtctr r0 ffc0800c: 4e 80 04 21 bctrl ffc08010: 7c 7a 1b 78 mr r26,r3 rtems_filesystem_freenode( &loc ); ffc08014: 7f e3 fb 78 mr r3,r31 ffc08018: 4b ff d0 ed bl ffc05104 if ( free_parentloc ) ffc0801c: 41 b2 00 0c beq+ cr4,ffc08028 rtems_filesystem_freenode( &parentloc ); ffc08020: 7f c3 f3 78 mr r3,r30 ffc08024: 4b ff d0 e1 bl ffc05104 return result; } ffc08028: 81 81 00 3c lwz r12,60(r1) ffc0802c: 39 61 00 58 addi r11,r1,88 ffc08030: 7f 43 d3 78 mr r3,r26 ffc08034: 7d 80 81 20 mtcrf 8,r12 ffc08038: 48 01 11 64 b ffc1919c <_restgpr_26_x> =============================================================================== ffc081e8 : */ int unmount( const char *path ) { ffc081e8: 94 21 ff d0 stwu r1,-48(r1) ffc081ec: 7c 08 02 a6 mflr r0 ffc081f0: bf c1 00 28 stmw r30,40(r1) ffc081f4: 7c 7f 1b 78 mr r31,r3 ffc081f8: 90 01 00 34 stw r0,52(r1) * 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 ) ) ffc081fc: 48 00 a5 85 bl ffc12780 ffc08200: 7c 64 1b 78 mr r4,r3 ffc08204: 7f e3 fb 78 mr r3,r31 ffc08208: 3b e1 00 08 addi r31,r1,8 ffc0820c: 38 a0 00 00 li r5,0 ffc08210: 7f e6 fb 78 mr r6,r31 ffc08214: 38 e0 00 01 li r7,1 ffc08218: 4b ff cd 09 bl ffc04f20 ffc0821c: 2f 83 00 00 cmpwi cr7,r3,0 ffc08220: 40 9e 01 1c bne- cr7,ffc0833c return -1; mt_entry = loc.mt_entry; ffc08224: 83 c1 00 18 lwz r30,24(r1) /* * Verify this is the root node for the file system to be unmounted. */ if ( fs_root_loc->node_access != loc.node_access ){ ffc08228: 80 01 00 08 lwz r0,8(r1) ffc0822c: 81 3e 00 1c lwz r9,28(r30) ffc08230: 7f 89 00 00 cmpw cr7,r9,r0 ffc08234: 41 be 00 18 beq+ cr7,ffc0824c rtems_filesystem_freenode( &loc ); ffc08238: 7f e3 fb 78 mr r3,r31 ffc0823c: 4b ff cd d9 bl ffc05014 rtems_set_errno_and_return_minus_one( EACCES ); ffc08240: 48 00 8e 95 bl ffc110d4 <__errno> ffc08244: 38 00 00 0d li r0,13 ffc08248: 48 00 00 50 b ffc08298 /* * Free the loc node and just use the nodes from the mt_entry . */ rtems_filesystem_freenode( &loc ); ffc0824c: 7f e3 fb 78 mr r3,r31 ffc08250: 4b ff cd c5 bl ffc05014 * 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 ) ffc08254: 3d 20 00 00 lis r9,0 ffc08258: 81 29 27 d4 lwz r9,10196(r9) ffc0825c: 80 09 00 14 lwz r0,20(r9) ffc08260: 7f 80 f0 00 cmpw cr7,r0,r30 ffc08264: 41 9e 00 2c beq- cr7,ffc08290 /* * Verify there are no file systems below the path specified */ if ( rtems_filesystem_mount_iterate( is_fs_below_mount_point, ffc08268: 3c 60 ff c1 lis r3,-63 ffc0826c: 80 9e 00 2c lwz r4,44(r30) ffc08270: 38 63 81 d4 addi r3,r3,-32300 ffc08274: 4b ff d7 c5 bl ffc05a38 ffc08278: 2f 83 00 00 cmpwi cr7,r3,0 ffc0827c: 40 9e 00 14 bne- cr7,ffc08290 * 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 ) ffc08280: 7f c3 f3 78 mr r3,r30 ffc08284: 4b ff d1 91 bl ffc05414 ffc08288: 2f 83 00 01 cmpwi cr7,r3,1 ffc0828c: 40 be 00 14 bne+ cr7,ffc082a0 rtems_set_errno_and_return_minus_one( EBUSY ); ffc08290: 48 00 8e 45 bl ffc110d4 <__errno> ffc08294: 38 00 00 10 li r0,16 ffc08298: 90 03 00 00 stw r0,0(r3) ffc0829c: 48 00 00 a0 b ffc0833c * 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 ) ffc082a0: 81 3e 00 14 lwz r9,20(r30) ffc082a4: 7f c3 f3 78 mr r3,r30 return -1; ffc082a8: 3b e0 ff ff li r31,-1 * 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 ) ffc082ac: 80 09 00 28 lwz r0,40(r9) ffc082b0: 7c 09 03 a6 mtctr r0 ffc082b4: 4e 80 04 21 bctrl ffc082b8: 2f 83 00 00 cmpwi cr7,r3,0 ffc082bc: 40 be 00 84 bne+ cr7,ffc08340 <== 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){ ffc082c0: 81 3e 00 28 lwz r9,40(r30) ffc082c4: 7f c3 f3 78 mr r3,r30 ffc082c8: 80 09 00 2c lwz r0,44(r9) ffc082cc: 7c 09 03 a6 mtctr r0 ffc082d0: 4e 80 04 21 bctrl ffc082d4: 2f 83 00 00 cmpwi cr7,r3,0 ffc082d8: 41 be 00 28 beq+ cr7,ffc08300 <== ALWAYS TAKEN if (( fs_mount_loc->ops->mount_h )( mt_entry ) != 0 ) ffc082dc: 81 3e 00 14 lwz r9,20(r30) <== NOT EXECUTED ffc082e0: 7f c3 f3 78 mr r3,r30 <== NOT EXECUTED ffc082e4: 80 09 00 20 lwz r0,32(r9) <== NOT EXECUTED ffc082e8: 7c 09 03 a6 mtctr r0 <== NOT EXECUTED ffc082ec: 4e 80 04 21 bctrl <== NOT EXECUTED ffc082f0: 2f 83 00 00 cmpwi cr7,r3,0 <== NOT EXECUTED ffc082f4: 41 be 00 4c beq+ cr7,ffc08340 <== NOT EXECUTED rtems_fatal_error_occurred( 0 ); ffc082f8: 38 60 00 00 li r3,0 <== NOT EXECUTED ffc082fc: 48 00 11 b1 bl ffc094ac <== 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 ); ffc08300: 3f e0 00 00 lis r31,0 ffc08304: 80 7f 28 60 lwz r3,10336(r31) ffc08308: 38 80 00 00 li r4,0 ffc0830c: 38 a0 00 00 li r5,0 ffc08310: 48 00 0a 1d bl ffc08d2c */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); ffc08314: 7f c3 f3 78 mr r3,r30 ffc08318: 48 00 15 95 bl ffc098ac <_Chain_Extract> } static inline void rtems_libio_unlock( void ) { rtems_semaphore_release( rtems_libio_semaphore ); ffc0831c: 80 7f 28 60 lwz r3,10336(r31) */ rtems_filesystem_freenode( fs_mount_loc ); free( mt_entry ); return 0; ffc08320: 3b e0 00 00 li r31,0 ffc08324: 48 00 0b 31 bl ffc08e54 /* * 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 ); ffc08328: 38 7e 00 08 addi r3,r30,8 ffc0832c: 4b ff cc e9 bl ffc05014 free( mt_entry ); ffc08330: 7f c3 f3 78 mr r3,r30 ffc08334: 4b ff cd 0d bl ffc05040 return 0; ffc08338: 48 00 00 08 b ffc08340 * 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; ffc0833c: 3b e0 ff ff li r31,-1 rtems_filesystem_freenode( fs_mount_loc ); free( mt_entry ); return 0; } ffc08340: 39 61 00 30 addi r11,r1,48 ffc08344: 7f e3 fb 78 mr r3,r31 ffc08348: 48 00 e8 70 b ffc16bb8 <_restgpr_30_x> =============================================================================== ffc08044 : */ void vprintk( const char *fmt, va_list ap ) { ffc08044: 94 21 ff a8 stwu r1,-88(r1) ffc08048: 7c 08 02 a6 mflr r0 ffc0804c: be 81 00 28 stmw r20,40(r1) ffc08050: 7c 7f 1b 78 mr r31,r3 ffc08054: 7c 9e 23 78 mr r30,r4 ffc08058: 90 01 00 5c stw r0,92(r1) unsigned_num = n; } toPrint[count++] = (char) unsigned_num; for (n=maxwidth ; n > count; n-- ) BSP_output_char(lead); ffc0805c: 3f 60 00 00 lis r27,0 * console is not yet initialized or in ISR's. * * Arguments: * as in printf: fmt - format string, ... - unnamed arguments. */ void vprintk( ffc08060: 3a 81 00 08 addi r20,r1,8 for (n=maxwidth ; n > count; n-- ) BSP_output_char(lead); for (n = 0; n < count; n++) { BSP_output_char("0123456789ABCDEF"[(int)(toPrint[count-(n+1)])]); ffc08064: 3e a0 ff c2 lis r21,-62 char *s, *str; str = va_arg(ap, char *); if ( str == NULL ) { str = ""; ffc08068: 3e c0 ff c2 lis r22,-62 void vprintk( const char *fmt, va_list ap ) { for (; *fmt != '\0'; fmt++) { ffc0806c: 48 00 03 28 b ffc08394 bool minus = false; bool sign = false; char lead = ' '; char c; if (*fmt != '%') { ffc08070: 2f 83 00 25 cmpwi cr7,r3,37 ffc08074: 40 9e 01 f4 bne- cr7,ffc08268 BSP_output_char(*fmt); continue; } fmt++; if (*fmt == '0' ) { ffc08078: 8c 1f 00 01 lbzu r0,1(r31) unsigned base = 0; unsigned width = 0; bool lflag = false; bool minus = false; bool sign = false; char lead = ' '; ffc0807c: 3a e0 00 20 li r23,32 if (*fmt != '%') { BSP_output_char(*fmt); continue; } fmt++; if (*fmt == '0' ) { ffc08080: 2f 80 00 30 cmpwi cr7,r0,48 ffc08084: 40 be 00 0c bne+ cr7,ffc08090 lead = '0'; fmt++; ffc08088: 3b ff 00 01 addi r31,r31,1 BSP_output_char(*fmt); continue; } fmt++; if (*fmt == '0' ) { lead = '0'; ffc0808c: 3a e0 00 30 li r23,48 fmt++; } if (*fmt == '-' ) { ffc08090: 88 1f 00 00 lbz r0,0(r31) { for (; *fmt != '\0'; fmt++) { unsigned base = 0; unsigned width = 0; bool lflag = false; bool minus = false; ffc08094: 3b 00 00 00 li r24,0 fmt++; if (*fmt == '0' ) { lead = '0'; fmt++; } if (*fmt == '-' ) { ffc08098: 2f 80 00 2d cmpwi cr7,r0,45 ffc0809c: 40 be 00 0c bne+ cr7,ffc080a8 minus = true; fmt++; ffc080a0: 3b ff 00 01 addi r31,r31,1 if (*fmt == '0' ) { lead = '0'; fmt++; } if (*fmt == '-' ) { minus = true; ffc080a4: 3b 00 00 01 li r24,1 { for (; *fmt != '\0'; fmt++) { unsigned base = 0; unsigned width = 0; bool lflag = false; bool minus = false; ffc080a8: 3b 80 00 00 li r28,0 ffc080ac: 48 00 00 10 b ffc080bc if (*fmt == '-' ) { minus = true; fmt++; } while (*fmt >= '0' && *fmt <= '9' ) { width *= 10; ffc080b0: 1f 9c 00 0a mulli r28,r28,10 width += ((unsigned) *fmt - '0'); fmt++; ffc080b4: 3b ff 00 01 addi r31,r31,1 minus = true; fmt++; } while (*fmt >= '0' && *fmt <= '9' ) { width *= 10; width += ((unsigned) *fmt - '0'); ffc080b8: 7f 80 e2 14 add r28,r0,r28 } if (*fmt == '-' ) { minus = true; fmt++; } while (*fmt >= '0' && *fmt <= '9' ) { ffc080bc: 88 7f 00 00 lbz r3,0(r31) ffc080c0: 38 03 ff d0 addi r0,r3,-48 ffc080c4: 54 09 06 3e clrlwi r9,r0,24 ffc080c8: 2b 89 00 09 cmplwi cr7,r9,9 ffc080cc: 40 9d ff e4 ble+ cr7,ffc080b0 width *= 10; width += ((unsigned) *fmt - '0'); fmt++; } if ((c = *fmt) == 'l') { ffc080d0: 2f 83 00 6c cmpwi cr7,r3,108 } if (*fmt == '-' ) { minus = true; fmt++; } while (*fmt >= '0' && *fmt <= '9' ) { ffc080d4: 7f 99 e3 78 mr r25,r28 width *= 10; width += ((unsigned) *fmt - '0'); fmt++; } if ((c = *fmt) == 'l') { ffc080d8: 40 be 00 08 bne+ cr7,ffc080e0 lflag = true; c = *++fmt; ffc080dc: 8c 7f 00 01 lbzu r3,1(r31) } if ( c == 'c' ) { ffc080e0: 2f 83 00 63 cmpwi cr7,r3,99 ffc080e4: 40 be 00 40 bne+ cr7,ffc08124 /* need a cast here since va_arg() only takes fully promoted types */ char chr = (char) va_arg(ap, int); ffc080e8: 89 7e 00 00 lbz r11,0(r30) ffc080ec: 2b 8b 00 08 cmplwi cr7,r11,8 ffc080f0: 40 9c 00 1c bge- cr7,ffc0810c <== NEVER TAKEN ffc080f4: 81 3e 00 08 lwz r9,8(r30) ffc080f8: 55 60 10 3a rlwinm r0,r11,2,0,29 ffc080fc: 39 6b 00 01 addi r11,r11,1 ffc08100: 7d 29 02 14 add r9,r9,r0 ffc08104: 99 7e 00 00 stb r11,0(r30) ffc08108: 48 00 00 10 b ffc08118 ffc0810c: 81 3e 00 04 lwz r9,4(r30) <== NOT EXECUTED ffc08110: 38 09 00 04 addi r0,r9,4 <== NOT EXECUTED ffc08114: 90 1e 00 04 stw r0,4(r30) <== NOT EXECUTED BSP_output_char(chr); ffc08118: 80 1b 27 6c lwz r0,10092(r27) ffc0811c: 88 69 00 03 lbz r3,3(r9) ffc08120: 48 00 01 4c b ffc0826c continue; } if ( c == 's' ) { ffc08124: 2f 83 00 73 cmpwi cr7,r3,115 ffc08128: 40 be 00 e8 bne+ cr7,ffc08210 unsigned i, len; char *s, *str; str = va_arg(ap, char *); ffc0812c: 89 7e 00 00 lbz r11,0(r30) ffc08130: 2b 8b 00 08 cmplwi cr7,r11,8 ffc08134: 40 9c 00 1c bge- cr7,ffc08150 <== NEVER TAKEN ffc08138: 81 3e 00 08 lwz r9,8(r30) ffc0813c: 55 60 10 3a rlwinm r0,r11,2,0,29 ffc08140: 39 6b 00 01 addi r11,r11,1 ffc08144: 7d 29 02 14 add r9,r9,r0 ffc08148: 99 7e 00 00 stb r11,0(r30) ffc0814c: 48 00 00 10 b ffc0815c ffc08150: 81 3e 00 04 lwz r9,4(r30) <== NOT EXECUTED ffc08154: 38 09 00 04 addi r0,r9,4 <== NOT EXECUTED ffc08158: 90 1e 00 04 stw r0,4(r30) <== NOT EXECUTED ffc0815c: 83 49 00 00 lwz r26,0(r9) if ( str == NULL ) { ffc08160: 2f 9a 00 00 cmpwi cr7,r26,0 ffc08164: 40 be 00 08 bne+ cr7,ffc0816c str = ""; ffc08168: 3b 56 ab 43 addi r26,r22,-21693 } /* calculate length of string */ for ( len=0, s=str ; *s ; len++, s++ ) ffc0816c: 3b a0 00 00 li r29,0 ffc08170: 48 00 00 08 b ffc08178 ffc08174: 3b bd 00 01 addi r29,r29,1 ffc08178: 7c 1a e8 ae lbzx r0,r26,r29 ffc0817c: 2f 80 00 00 cmpwi cr7,r0,0 ffc08180: 40 9e ff f4 bne+ cr7,ffc08174 ; /* leading spaces */ if ( !minus ) ffc08184: 2f 98 00 00 cmpwi cr7,r24,0 ffc08188: 7f b9 eb 78 mr r25,r29 ffc0818c: 41 9e 00 1c beq- cr7,ffc081a8 ffc08190: 48 00 00 20 b ffc081b0 for ( i=len ; i BSP_output_char(' '); /* no width option */ if (width == 0) { ffc081b0: 2f 9c 00 00 cmpwi cr7,r28,0 ffc081b4: 40 9e 00 10 bne- cr7,ffc081c4 width = len; } /* output the string */ for ( i=0 ; i ffc081c0: 7f bc eb 78 mr r28,r29 * console is not yet initialized or in ISR's. * * Arguments: * as in printf: fmt - format string, ... - unnamed arguments. */ void vprintk( ffc081c4: 3b 5a ff ff addi r26,r26,-1 ffc081c8: 48 00 00 10 b ffc081d8 width = len; } /* output the string */ for ( i=0 ; i BSP_output_char(*str); /* trailing spaces */ if ( minus ) ffc081e4: 2f 98 00 00 cmpwi cr7,r24,0 ffc081e8: 41 9e 01 a8 beq- cr7,ffc08390 ffc081ec: 48 00 00 18 b ffc08204 for ( i=len ; i ffc0820c: 48 00 01 84 b ffc08390 continue; } /* must be a numeric format or something unsupported */ if ( c == 'o' || c == 'O' ) { ffc08210: 2f 83 00 6f cmpwi cr7,r3,111 ffc08214: 41 9e 00 64 beq- cr7,ffc08278 ffc08218: 2f 83 00 4f cmpwi cr7,r3,79 ffc0821c: 41 9e 00 5c beq- cr7,ffc08278 base = 8; sign = false; } else if ( c == 'i' || c == 'I' || ffc08220: 2f 83 00 69 cmpwi cr7,r3,105 ffc08224: 41 9e 00 60 beq- cr7,ffc08284 ffc08228: 2f 83 00 49 cmpwi cr7,r3,73 ffc0822c: 41 9e 00 58 beq- cr7,ffc08284 ffc08230: 2f 83 00 64 cmpwi cr7,r3,100 ffc08234: 41 9e 00 50 beq- cr7,ffc08284 c == 'd' || c == 'D' ) { ffc08238: 2f 83 00 44 cmpwi cr7,r3,68 ffc0823c: 41 9e 00 48 beq- cr7,ffc08284 base = 10; sign = true; } else if ( c == 'u' || c == 'U' ) { ffc08240: 2f 83 00 75 cmpwi cr7,r3,117 ffc08244: 41 9e 00 48 beq- cr7,ffc0828c ffc08248: 2f 83 00 55 cmpwi cr7,r3,85 ffc0824c: 41 9e 00 40 beq- cr7,ffc0828c base = 10; sign = false; } else if ( c == 'x' || c == 'X' ) { ffc08250: 2f 83 00 78 cmpwi cr7,r3,120 ffc08254: 41 9e 00 44 beq- cr7,ffc08298 ffc08258: 2f 83 00 58 cmpwi cr7,r3,88 ffc0825c: 41 9e 00 3c beq- cr7,ffc08298 base = 16; sign = false; } else if ( c == 'p' ) { ffc08260: 2f 83 00 70 cmpwi cr7,r3,112 ffc08264: 41 9e 00 34 beq- cr7,ffc08298 base = 16; sign = false; lflag = true; } else { BSP_output_char(c); ffc08268: 80 1b 27 6c lwz r0,10092(r27) ffc0826c: 7c 09 03 a6 mtctr r0 ffc08270: 4e 80 04 21 bctrl continue; ffc08274: 48 00 01 1c b ffc08390 continue; } /* must be a numeric format or something unsupported */ if ( c == 'o' || c == 'O' ) { base = 8; sign = false; ffc08278: 38 00 00 00 li r0,0 ffc0827c: 3b a0 00 08 li r29,8 ffc08280: 48 00 00 20 b ffc082a0 } else if ( c == 'i' || c == 'I' || c == 'd' || c == 'D' ) { base = 10; sign = true; ffc08284: 38 00 00 01 li r0,1 ffc08288: 48 00 00 08 b ffc08290 } else if ( c == 'u' || c == 'U' ) { base = 10; sign = false; ffc0828c: 38 00 00 00 li r0,0 ffc08290: 3b a0 00 0a li r29,10 ffc08294: 48 00 00 0c b ffc082a0 } else if ( c == 'x' || c == 'X' ) { base = 16; sign = false; } else if ( c == 'p' ) { base = 16; sign = false; lflag = true; ffc08298: 38 00 00 00 li r0,0 ffc0829c: 3b a0 00 10 li r29,16 BSP_output_char(c); continue; } printNum( lflag ? va_arg(ap, long) : (long) va_arg(ap, int), ffc082a0: 89 7e 00 00 lbz r11,0(r30) ffc082a4: 2b 8b 00 08 cmplwi cr7,r11,8 ffc082a8: 40 9c 00 1c bge- cr7,ffc082c4 ffc082ac: 81 5e 00 08 lwz r10,8(r30) ffc082b0: 55 69 10 3a rlwinm r9,r11,2,0,29 ffc082b4: 39 6b 00 01 addi r11,r11,1 ffc082b8: 7d 2a 4a 14 add r9,r10,r9 ffc082bc: 99 7e 00 00 stb r11,0(r30) } else { BSP_output_char(c); continue; } printNum( ffc082c0: 48 00 00 10 b ffc082d0 lflag ? va_arg(ap, long) : (long) va_arg(ap, int), ffc082c4: 81 3e 00 04 lwz r9,4(r30) ffc082c8: 39 69 00 04 addi r11,r9,4 ffc082cc: 91 7e 00 04 stw r11,4(r30) unsigned long unsigned_num; unsigned long n; unsigned count; char toPrint[20]; if ( sign && (num < 0) ) { ffc082d0: 2f 80 00 00 cmpwi cr7,r0,0 } else { BSP_output_char(c); continue; } printNum( ffc082d4: 83 49 00 00 lwz r26,0(r9) unsigned long unsigned_num; unsigned long n; unsigned count; char toPrint[20]; if ( sign && (num < 0) ) { ffc082d8: 41 9e 00 30 beq- cr7,ffc08308 ffc082dc: 2f 9a 00 00 cmpwi cr7,r26,0 ffc082e0: 40 bc 00 28 bge+ cr7,ffc08308 BSP_output_char('-'); ffc082e4: 80 1b 27 6c lwz r0,10092(r27) ffc082e8: 38 60 00 2d li r3,45 unsigned_num = (unsigned long) -num; ffc082ec: 7f 5a 00 d0 neg r26,r26 unsigned long n; unsigned count; char toPrint[20]; if ( sign && (num < 0) ) { BSP_output_char('-'); ffc082f0: 7c 09 03 a6 mtctr r0 ffc082f4: 4e 80 04 21 bctrl unsigned_num = (unsigned long) -num; if (maxwidth) maxwidth--; ffc082f8: 2f 9c 00 00 cmpwi cr7,r28,0 ffc082fc: 41 9e 00 10 beq- cr7,ffc0830c ffc08300: 3b 3c ff ff addi r25,r28,-1 ffc08304: 48 00 00 08 b ffc0830c } else { unsigned_num = (unsigned long) num; ffc08308: 7f 99 e3 78 mr r25,r28 } count = 0; ffc0830c: 3b 80 00 00 li r28,0 ffc08310: 48 00 00 14 b ffc08324 while ((n = unsigned_num / base) > 0) { toPrint[count++] = (char) (unsigned_num - (n * base)); ffc08314: 7d 60 e9 d6 mullw r11,r0,r29 ffc08318: 7f 4b d0 50 subf r26,r11,r26 ffc0831c: 9b 49 00 08 stb r26,8(r9) ffc08320: 7c 1a 03 78 mr r26,r0 } else { unsigned_num = (unsigned long) num; } count = 0; while ((n = unsigned_num / base) > 0) { ffc08324: 7c 1a eb 96 divwu r0,r26,r29 ffc08328: 2f 80 00 00 cmpwi cr7,r0,0 ffc0832c: 7d 21 e2 14 add r9,r1,r28 ffc08330: 3b 9c 00 01 addi r28,r28,1 ffc08334: 40 9e ff e0 bne+ cr7,ffc08314 toPrint[count++] = (char) (unsigned_num - (n * base)); unsigned_num = n; } toPrint[count++] = (char) unsigned_num; ffc08338: 9b 49 00 08 stb r26,8(r9) for (n=maxwidth ; n > count; n-- ) ffc0833c: 7f 3d cb 78 mr r29,r25 ffc08340: 48 00 00 18 b ffc08358 BSP_output_char(lead); ffc08344: 80 1b 27 6c lwz r0,10092(r27) ffc08348: 7e e3 bb 78 mr r3,r23 toPrint[count++] = (char) (unsigned_num - (n * base)); unsigned_num = n; } toPrint[count++] = (char) unsigned_num; for (n=maxwidth ; n > count; n-- ) ffc0834c: 3b bd ff ff addi r29,r29,-1 BSP_output_char(lead); ffc08350: 7c 09 03 a6 mtctr r0 ffc08354: 4e 80 04 21 bctrl toPrint[count++] = (char) (unsigned_num - (n * base)); unsigned_num = n; } toPrint[count++] = (char) unsigned_num; for (n=maxwidth ; n > count; n-- ) ffc08358: 7f 9d e0 40 cmplw cr7,r29,r28 ffc0835c: 41 9d ff e8 bgt+ cr7,ffc08344 * console is not yet initialized or in ISR's. * * Arguments: * as in printf: fmt - format string, ... - unnamed arguments. */ void vprintk( ffc08360: 7f 54 e2 14 add r26,r20,r28 ffc08364: 3b a0 00 00 li r29,0 ffc08368: 48 00 00 20 b ffc08388 for (n=maxwidth ; n > count; n-- ) BSP_output_char(lead); for (n = 0; n < count; n++) { BSP_output_char("0123456789ABCDEF"[(int)(toPrint[count-(n+1)])]); ffc0836c: 8d 3a ff ff lbzu r9,-1(r26) ffc08370: 39 75 ab 44 addi r11,r21,-21692 ffc08374: 80 1b 27 6c lwz r0,10092(r27) toPrint[count++] = (char) unsigned_num; for (n=maxwidth ; n > count; n-- ) BSP_output_char(lead); for (n = 0; n < count; n++) { ffc08378: 3b bd 00 01 addi r29,r29,1 BSP_output_char("0123456789ABCDEF"[(int)(toPrint[count-(n+1)])]); ffc0837c: 7c 6b 48 ae lbzx r3,r11,r9 ffc08380: 7c 09 03 a6 mtctr r0 ffc08384: 4e 80 04 21 bctrl toPrint[count++] = (char) unsigned_num; for (n=maxwidth ; n > count; n-- ) BSP_output_char(lead); for (n = 0; n < count; n++) { ffc08388: 7f 9d e0 40 cmplw cr7,r29,r28 ffc0838c: 41 9c ff e0 blt+ cr7,ffc0836c void vprintk( const char *fmt, va_list ap ) { for (; *fmt != '\0'; fmt++) { ffc08390: 3b ff 00 01 addi r31,r31,1 ffc08394: 88 7f 00 00 lbz r3,0(r31) ffc08398: 2f 83 00 00 cmpwi cr7,r3,0 ffc0839c: 40 9e fc d4 bne+ cr7,ffc08070 sign, width, lead ); } } ffc083a0: 39 61 00 58 addi r11,r1,88 ffc083a4: 48 01 0d e0 b ffc19184 <_restgpr_20_x> =============================================================================== ffc19978 : ssize_t write( int fd, const void *buffer, size_t count ) { ffc19978: 7c 08 02 a6 mflr r0 ffc1997c: 7c 2b 0b 78 mr r11,r1 ffc19980: 94 21 ff f0 stwu r1,-16(r1) ssize_t rc; rtems_libio_t *iop; rtems_libio_check_fd( fd ); ffc19984: 3d 40 00 00 lis r10,0 ssize_t write( int fd, const void *buffer, size_t count ) { ffc19988: 90 01 00 14 stw r0,20(r1) ffc1998c: 4b ff f7 d9 bl ffc19164 <_savegpr_31> ssize_t rc; rtems_libio_t *iop; rtems_libio_check_fd( fd ); ffc19990: 80 0a 27 2c lwz r0,10028(r10) ffc19994: 7f 83 00 40 cmplw cr7,r3,r0 ffc19998: 40 9c 00 20 bge- cr7,ffc199b8 iop = rtems_libio_iop( fd ); ffc1999c: 3d 40 00 00 lis r10,0 ffc199a0: 83 ea 27 e8 lwz r31,10216(r10) ffc199a4: 54 63 30 32 rlwinm r3,r3,6,0,25 ffc199a8: 7f ff 1a 14 add r31,r31,r3 rtems_libio_check_is_open( iop ); ffc199ac: 80 1f 00 18 lwz r0,24(r31) ffc199b0: 70 0a 01 00 andi. r10,r0,256 ffc199b4: 40 a2 00 10 bne+ ffc199c4 ffc199b8: 4b ff a9 01 bl ffc142b8 <__errno> ffc199bc: 38 00 00 09 li r0,9 ffc199c0: 48 00 00 28 b ffc199e8 rtems_libio_check_buffer( buffer ); ffc199c4: 2f 84 00 00 cmpwi cr7,r4,0 ffc199c8: 41 9e 00 18 beq- cr7,ffc199e0 <== NEVER TAKEN rtems_libio_check_count( count ); ffc199cc: 2f 85 00 00 cmpwi cr7,r5,0 ffc199d0: 38 60 00 00 li r3,0 ffc199d4: 41 9e 00 5c beq- cr7,ffc19a30 rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE ); ffc199d8: 70 09 00 04 andi. r9,r0,4 ffc199dc: 40 a2 00 18 bne+ ffc199f4 ffc199e0: 4b ff a8 d9 bl ffc142b8 <__errno> ffc199e4: 38 00 00 16 li r0,22 ffc199e8: 90 03 00 00 stw r0,0(r3) ffc199ec: 38 60 ff ff li r3,-1 ffc199f0: 48 00 00 40 b ffc19a30 /* * Now process the write() request. */ rc = (*iop->pathinfo.handlers->write_h)( iop, buffer, count ); ffc199f4: 81 3f 00 24 lwz r9,36(r31) ffc199f8: 7f e3 fb 78 mr r3,r31 ffc199fc: 80 09 00 0c lwz r0,12(r9) ffc19a00: 7c 09 03 a6 mtctr r0 ffc19a04: 4e 80 04 21 bctrl if ( rc > 0 ) ffc19a08: 2c 03 00 00 cmpwi r3,0 ffc19a0c: 40 81 00 24 ble- ffc19a30 iop->offset += rc; ffc19a10: 81 7f 00 10 lwz r11,16(r31) ffc19a14: 7c 6a 1b 78 mr r10,r3 ffc19a18: 81 9f 00 14 lwz r12,20(r31) ffc19a1c: 7c 69 fe 70 srawi r9,r3,31 ffc19a20: 7d 4a 60 14 addc r10,r10,r12 ffc19a24: 7d 29 59 14 adde r9,r9,r11 ffc19a28: 91 3f 00 10 stw r9,16(r31) ffc19a2c: 91 5f 00 14 stw r10,20(r31) return rc; } ffc19a30: 39 61 00 10 addi r11,r1,16 ffc19a34: 4b ff f7 7c b ffc191b0 <_restgpr_31_x> =============================================================================== ffc0870c : ssize_t writev( int fd, const struct iovec *iov, int iovcnt ) { ffc0870c: 94 21 ff d8 stwu r1,-40(r1) ffc08710: 7c 08 02 a6 mflr r0 int bytes; rtems_libio_t *iop; ssize_t old; bool all_zeros; rtems_libio_check_fd( fd ); ffc08714: 3d 20 00 00 lis r9,0 ssize_t writev( int fd, const struct iovec *iov, int iovcnt ) { ffc08718: 90 01 00 2c stw r0,44(r1) int bytes; rtems_libio_t *iop; ssize_t old; bool all_zeros; rtems_libio_check_fd( fd ); ffc0871c: 80 09 27 0c lwz r0,9996(r9) ssize_t writev( int fd, const struct iovec *iov, int iovcnt ) { ffc08720: bf 21 00 0c stmw r25,12(r1) ffc08724: 7c ba 2b 78 mr r26,r5 int bytes; rtems_libio_t *iop; ssize_t old; bool all_zeros; rtems_libio_check_fd( fd ); ffc08728: 7f 83 00 40 cmplw cr7,r3,r0 ffc0872c: 40 9c 00 20 bge- cr7,ffc0874c iop = rtems_libio_iop( fd ); ffc08730: 3d 20 00 00 lis r9,0 ffc08734: 83 69 27 cc lwz r27,10188(r9) ffc08738: 54 63 30 32 rlwinm r3,r3,6,0,25 ffc0873c: 7f 7b 1a 14 add r27,r27,r3 rtems_libio_check_is_open( iop ); ffc08740: 80 1b 00 18 lwz r0,24(r27) ffc08744: 70 09 01 00 andi. r9,r0,256 ffc08748: 40 a2 00 10 bne+ ffc08758 ffc0874c: 48 00 8c 71 bl ffc113bc <__errno> ffc08750: 38 00 00 09 li r0,9 ffc08754: 48 00 00 78 b ffc087cc rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE ); ffc08758: 70 09 00 04 andi. r9,r0,4 ffc0875c: 41 82 00 68 beq- ffc087c4 <== NEVER TAKEN /* * Argument validation on IO vector */ if ( !iov ) ffc08760: 2f 84 00 00 cmpwi cr7,r4,0 ffc08764: 41 9e 00 60 beq- cr7,ffc087c4 rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt <= 0 ) ffc08768: 2f 85 00 00 cmpwi cr7,r5,0 ffc0876c: 40 9d 00 58 ble- cr7,ffc087c4 rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt > IOV_MAX ) ffc08770: 2f 85 04 00 cmpwi cr7,r5,1024 ffc08774: 41 9d 00 50 bgt- cr7,ffc087c4 <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); ffc08778: 7c 9c 23 78 mr r28,r4 rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt <= 0 ) rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt > IOV_MAX ) ffc0877c: 7c a9 03 a6 mtctr r5 ffc08780: 7c 89 23 78 mr r9,r4 ffc08784: 38 00 00 01 li r0,1 ffc08788: 39 60 00 00 li r11,0 ffc0878c: 48 00 00 08 b ffc08794 * 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++ ) { ffc08790: 7d 4b 53 78 mr r11,r10 /* * 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 ) ffc08794: 81 49 00 00 lwz r10,0(r9) ffc08798: 2f 8a 00 00 cmpwi cr7,r10,0 ffc0879c: 41 9e 00 28 beq- cr7,ffc087c4 rtems_set_errno_and_return_minus_one( EINVAL ); if ( iov[v].iov_len ) ffc087a0: 81 49 00 04 lwz r10,4(r9) all_zeros = false; ffc087a4: 31 0a ff ff addic r8,r10,-1 ffc087a8: 7d 08 41 10 subfe r8,r8,r8 /* check for wrap */ old = total; total += iov[v].iov_len; ffc087ac: 7d 4b 52 14 add r10,r11,r10 if ( total < old || total > SSIZE_MAX ) ffc087b0: 7f 8a 58 00 cmpw cr7,r10,r11 */ if ( iov[v].iov_base == 0 ) rtems_set_errno_and_return_minus_one( EINVAL ); if ( iov[v].iov_len ) all_zeros = false; ffc087b4: 7c 00 40 38 and r0,r0,r8 /* check for wrap */ old = total; total += iov[v].iov_len; if ( total < old || total > SSIZE_MAX ) ffc087b8: 41 9c 00 0c blt- cr7,ffc087c4 ffc087bc: 2f 8a 7f ff cmpwi cr7,r10,32767 ffc087c0: 40 bd 00 14 ble+ cr7,ffc087d4 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); ffc087c4: 48 00 8b f9 bl ffc113bc <__errno> ffc087c8: 38 00 00 16 li r0,22 ffc087cc: 90 03 00 00 stw r0,0(r3) ffc087d0: 48 00 00 90 b ffc08860 * 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++ ) { ffc087d4: 39 29 00 08 addi r9,r9,8 ffc087d8: 42 00 ff b8 bdnz+ ffc08790 } /* * A writev with all zeros is supposed to have no effect per OpenGroup. */ if ( all_zeros == true ) { ffc087dc: 2f 80 00 00 cmpwi cr7,r0,0 return 0; ffc087e0: 3b a0 00 00 li r29,0 } /* * A writev with all zeros is supposed to have no effect per OpenGroup. */ if ( all_zeros == true ) { ffc087e4: 40 9e 00 80 bne- cr7,ffc08864 ffc087e8: 3b 20 00 00 li r25,0 /* * Now process the writev(). */ for ( total=0, v=0 ; v < iovcnt ; v++ ) { /* all zero lengths has no effect */ if ( iov[v].iov_len == 0 ) ffc087ec: 80 bc 00 04 lwz r5,4(r28) ffc087f0: 2f 85 00 00 cmpwi cr7,r5,0 ffc087f4: 41 be 00 58 beq+ cr7,ffc0884c <== NEVER TAKEN continue; bytes = (*iop->pathinfo.handlers->write_h)( ffc087f8: 81 3b 00 24 lwz r9,36(r27) ffc087fc: 7f 63 db 78 mr r3,r27 ffc08800: 80 9c 00 00 lwz r4,0(r28) ffc08804: 80 09 00 0c lwz r0,12(r9) ffc08808: 7c 09 03 a6 mtctr r0 ffc0880c: 4e 80 04 21 bctrl iop, iov[v].iov_base, iov[v].iov_len ); if ( bytes < 0 ) ffc08810: 2c 03 00 00 cmpwi r3,0 ffc08814: 41 80 00 4c blt- ffc08860 <== NEVER TAKEN return -1; if ( bytes > 0 ) { ffc08818: 41 82 00 28 beq- ffc08840 <== NEVER TAKEN iop->offset += bytes; ffc0881c: 81 3b 00 10 lwz r9,16(r27) ffc08820: 7c 7f 1b 78 mr r31,r3 ffc08824: 81 5b 00 14 lwz r10,20(r27) ffc08828: 7c 7e fe 70 srawi r30,r3,31 total += bytes; ffc0882c: 7f bd 1a 14 add r29,r29,r3 if ( bytes < 0 ) return -1; if ( bytes > 0 ) { iop->offset += bytes; ffc08830: 7d 4a f8 14 addc r10,r10,r31 ffc08834: 7d 29 f1 14 adde r9,r9,r30 ffc08838: 91 3b 00 10 stw r9,16(r27) ffc0883c: 91 5b 00 14 stw r10,20(r27) total += bytes; } if (bytes != iov[ v ].iov_len) ffc08840: 80 1c 00 04 lwz r0,4(r28) ffc08844: 7f 83 00 00 cmpw cr7,r3,r0 ffc08848: 40 9e 00 1c bne- cr7,ffc08864 <== NEVER TAKEN } /* * Now process the writev(). */ for ( total=0, v=0 ; v < iovcnt ; v++ ) { ffc0884c: 3b 39 00 01 addi r25,r25,1 ffc08850: 7f 99 d0 00 cmpw cr7,r25,r26 ffc08854: 3b 9c 00 08 addi r28,r28,8 ffc08858: 41 9c ff 94 blt+ cr7,ffc087ec ffc0885c: 48 00 00 08 b ffc08864 iov[v].iov_base, iov[v].iov_len ); if ( bytes < 0 ) return -1; ffc08860: 3b a0 ff ff li r29,-1 if (bytes != iov[ v ].iov_len) break; } return total; } ffc08864: 39 61 00 28 addi r11,r1,40 ffc08868: 7f a3 eb 78 mr r3,r29 ffc0886c: 4b ff 83 74 b ffc00be0 <_restgpr_25_x>