=============================================================================== 0800b650 : #define MAXSYMLINK 5 int IMFS_Set_handlers( rtems_filesystem_location_info_t *loc ) { 800b650: 37 9c ff f0 addi sp,sp,-16 800b654: 5b 8b 00 10 sw (sp+16),r11 800b658: 5b 8c 00 0c sw (sp+12),r12 800b65c: 5b 8d 00 08 sw (sp+8),r13 800b660: 5b 9d 00 04 sw (sp+4),ra 800b664: b8 20 58 00 mv r11,r1 IMFS_jnode_t *node = loc->node_access; IMFS_fs_info_t *fs_info; fs_info = loc->mt_entry->fs_info; 800b668: 28 21 00 10 lw r1,(r1+16) switch( node->type ) { 800b66c: 34 02 00 06 mvi r2,6 ) { IMFS_jnode_t *node = loc->node_access; IMFS_fs_info_t *fs_info; fs_info = loc->mt_entry->fs_info; 800b670: 28 2c 00 34 lw r12,(r1+52) switch( node->type ) { 800b674: 29 61 00 00 lw r1,(r11+0) 800b678: 28 21 00 4c lw r1,(r1+76) 800b67c: 34 21 ff ff addi r1,r1,-1 800b680: 54 22 00 14 bgu r1,r2,800b6d0 <== NEVER TAKEN 800b684: 78 0d 08 01 mvhi r13,0x801 800b688: 34 02 00 02 mvi r2,2 800b68c: f8 00 2e 2c calli 8016f3c <__ashlsi3> 800b690: 39 ad 83 74 ori r13,r13,0x8374 800b694: b5 a1 08 00 add r1,r13,r1 800b698: 28 21 00 00 lw r1,(r1+0) 800b69c: c0 20 00 00 b r1 case IMFS_DIRECTORY: loc->handlers = fs_info->directory_handlers; 800b6a0: 29 81 00 0c lw r1,(r12+12) 800b6a4: e0 00 00 0a bi 800b6cc break; case IMFS_DEVICE: loc->handlers = &IMFS_device_handlers; 800b6a8: 78 01 08 01 mvhi r1,0x801 800b6ac: 38 21 83 a0 ori r1,r1,0x83a0 800b6b0: e0 00 00 07 bi 800b6cc break; case IMFS_SYM_LINK: case IMFS_HARD_LINK: loc->handlers = &IMFS_link_handlers; 800b6b4: 78 01 08 01 mvhi r1,0x801 800b6b8: 38 21 84 10 ori r1,r1,0x8410 800b6bc: e0 00 00 04 bi 800b6cc break; case IMFS_LINEAR_FILE: loc->handlers = fs_info->memfile_handlers; break; case IMFS_MEMORY_FILE: loc->handlers = fs_info->memfile_handlers; 800b6c0: 29 81 00 08 lw r1,(r12+8) 800b6c4: e0 00 00 02 bi 800b6cc break; case IMFS_FIFO: loc->handlers = fs_info->fifo_handlers; 800b6c8: 29 81 00 10 lw r1,(r12+16) 800b6cc: 59 61 00 08 sw (r11+8),r1 break; } return 0; } 800b6d0: 34 01 00 00 mvi r1,0 800b6d4: 2b 9d 00 04 lw ra,(sp+4) 800b6d8: 2b 8b 00 10 lw r11,(sp+16) 800b6dc: 2b 8c 00 0c lw r12,(sp+12) 800b6e0: 2b 8d 00 08 lw r13,(sp+8) 800b6e4: 37 9c 00 10 addi sp,sp,16 800b6e8: c3 a0 00 00 ret =============================================================================== 0800b4b4 : IMFS_jnode_types_t type, const char *name, mode_t mode, const IMFS_types_union *info ) { 800b4b4: 37 9c ff e8 addi sp,sp,-24 800b4b8: 5b 8b 00 18 sw (sp+24),r11 800b4bc: 5b 8c 00 14 sw (sp+20),r12 800b4c0: 5b 8d 00 10 sw (sp+16),r13 800b4c4: 5b 8e 00 0c sw (sp+12),r14 800b4c8: 5b 8f 00 08 sw (sp+8),r15 800b4cc: 5b 9d 00 04 sw (sp+4),ra /* * MUST have a parent node to call this routine. */ if ( parent_loc == NULL ) return NULL; 800b4d0: 34 0b 00 00 mvi r11,0 IMFS_jnode_types_t type, const char *name, mode_t mode, const IMFS_types_union *info ) { 800b4d4: b8 40 60 00 mv r12,r2 800b4d8: b8 a0 68 00 mv r13,r5 800b4dc: b8 60 10 00 mv r2,r3 IMFS_fs_info_t *fs_info; /* * MUST have a parent node to call this routine. */ if ( parent_loc == NULL ) 800b4e0: 44 20 00 43 be r1,r0,800b5ec <== NEVER TAKEN return NULL; parent = parent_loc->node_access; 800b4e4: 28 2f 00 00 lw r15,(r1+0) fs_info = parent_loc->mt_entry->fs_info; 800b4e8: 28 21 00 10 lw r1,(r1+16) 800b4ec: 28 2e 00 34 lw r14,(r1+52) /* * Reject creation of FIFOs if support is disabled. */ if ( type == IMFS_FIFO && 800b4f0: 34 01 00 07 mvi r1,7 800b4f4: 5d 81 00 05 bne r12,r1,800b508 800b4f8: 29 c1 00 10 lw r1,(r14+16) 800b4fc: 78 05 08 01 mvhi r5,0x801 800b500: 38 a5 83 0c ori r5,r5,0x830c 800b504: 44 25 00 3a be r1,r5,800b5ec return NULL; /* * Allocate filesystem node and fill in basic information */ node = IMFS_allocate_node( type, name, mode & ~rtems_filesystem_umask ); 800b508: 78 05 08 01 mvhi r5,0x801 800b50c: 38 a5 91 08 ori r5,r5,0x9108 800b510: 28 a1 00 00 lw r1,(r5+0) 800b514: 28 23 00 2c lw r3,(r1+44) 800b518: b9 80 08 00 mv r1,r12 800b51c: a4 60 18 00 not r3,r3 800b520: a0 83 18 00 and r3,r4,r3 800b524: fb ff ff bb calli 800b410 800b528: b8 20 58 00 mv r11,r1 if ( !node ) 800b52c: 44 20 00 30 be r1,r0,800b5ec return NULL; /* * Set the type specific information */ if ( type == IMFS_DIRECTORY ) { 800b530: 34 01 00 01 mvi r1,1 800b534: 5d 81 00 07 bne r12,r1,800b550 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 ); 800b538: 35 61 00 54 addi r1,r11,84 head->next = tail; 800b53c: 59 61 00 50 sw (r11+80),r1 */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { Chain_Node *head = _Chain_Head( the_chain ); 800b540: 35 61 00 50 addi r1,r11,80 Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; head->previous = NULL; 800b544: 59 60 00 54 sw (r11+84),r0 tail->previous = head; 800b548: 59 61 00 58 sw (r11+88),r1 800b54c: e0 00 00 20 bi 800b5cc rtems_chain_initialize_empty(&node->info.directory.Entries); } else if ( type == IMFS_HARD_LINK ) { 800b550: 34 01 00 03 mvi r1,3 800b554: 45 81 00 03 be r12,r1,800b560 node->info.hard_link.link_node = info->hard_link.link_node; } else if ( type == IMFS_SYM_LINK ) { 800b558: 34 01 00 04 mvi r1,4 800b55c: 5d 81 00 04 bne r12,r1,800b56c node->info.sym_link.name = info->sym_link.name; 800b560: 29 a1 00 00 lw r1,(r13+0) 800b564: 59 61 00 50 sw (r11+80),r1 800b568: e0 00 00 19 bi 800b5cc } else if ( type == IMFS_DEVICE ) { 800b56c: 34 01 00 02 mvi r1,2 800b570: 5d 81 00 06 bne r12,r1,800b588 node->info.device.major = info->device.major; 800b574: 29 a1 00 00 lw r1,(r13+0) 800b578: 59 61 00 50 sw (r11+80),r1 node->info.device.minor = info->device.minor; 800b57c: 29 a1 00 04 lw r1,(r13+4) 800b580: 59 61 00 54 sw (r11+84),r1 800b584: e0 00 00 12 bi 800b5cc } else if ( type == IMFS_LINEAR_FILE ) { 800b588: 34 01 00 06 mvi r1,6 800b58c: 5d 81 00 05 bne r12,r1,800b5a0 node->info.linearfile.size = 0; 800b590: 59 60 00 50 sw (r11+80),r0 800b594: 59 60 00 54 sw (r11+84),r0 node->info.linearfile.direct = 0; 800b598: 59 60 00 58 sw (r11+88),r0 800b59c: e0 00 00 0c bi 800b5cc } else if ( type == IMFS_MEMORY_FILE ) { 800b5a0: 34 01 00 05 mvi r1,5 800b5a4: 5d 81 00 07 bne r12,r1,800b5c0 node->info.file.size = 0; 800b5a8: 59 60 00 50 sw (r11+80),r0 800b5ac: 59 60 00 54 sw (r11+84),r0 node->info.file.indirect = 0; 800b5b0: 59 60 00 58 sw (r11+88),r0 node->info.file.doubly_indirect = 0; 800b5b4: 59 60 00 5c sw (r11+92),r0 node->info.file.triply_indirect = 0; 800b5b8: 59 60 00 60 sw (r11+96),r0 800b5bc: e0 00 00 04 bi 800b5cc } else if ( type == IMFS_FIFO ) { 800b5c0: 34 01 00 07 mvi r1,7 800b5c4: 5d 81 00 02 bne r12,r1,800b5cc <== NEVER TAKEN node->info.fifo.pipe = NULL; 800b5c8: 59 60 00 50 sw (r11+80),r0 /* * This node MUST have a parent, so put it in that directory list. */ node->Parent = parent; node->st_ino = ++fs_info->ino_count; 800b5cc: 29 c1 00 04 lw r1,(r14+4) } /* * This node MUST have a parent, so put it in that directory list. */ node->Parent = parent; 800b5d0: 59 6f 00 08 sw (r11+8),r15 800b5d4: b9 60 10 00 mv r2,r11 node->st_ino = ++fs_info->ino_count; 800b5d8: 34 21 00 01 addi r1,r1,1 800b5dc: 59 c1 00 04 sw (r14+4),r1 800b5e0: 59 61 00 38 sw (r11+56),r1 800b5e4: 35 e1 00 50 addi r1,r15,80 800b5e8: fb ff e5 52 calli 8004b30 <_Chain_Append> rtems_chain_append( &parent->info.directory.Entries, &node->Node ); return node; } 800b5ec: b9 60 08 00 mv r1,r11 800b5f0: 2b 9d 00 04 lw ra,(sp+4) 800b5f4: 2b 8b 00 18 lw r11,(sp+24) 800b5f8: 2b 8c 00 14 lw r12,(sp+20) 800b5fc: 2b 8d 00 10 lw r13,(sp+16) 800b600: 2b 8e 00 0c lw r14,(sp+12) 800b604: 2b 8f 00 08 lw r15,(sp+8) 800b608: 37 9c 00 18 addi sp,sp,24 800b60c: c3 a0 00 00 ret =============================================================================== 0800b7e0 : const char *pathname, /* IN */ size_t pathnamelen, /* IN */ int flags, /* IN */ rtems_filesystem_location_info_t *pathloc /* IN/OUT */ ) { 800b7e0: 37 9c ff 84 addi sp,sp,-124 800b7e4: 5b 8b 00 40 sw (sp+64),r11 800b7e8: 5b 8c 00 3c sw (sp+60),r12 800b7ec: 5b 8d 00 38 sw (sp+56),r13 800b7f0: 5b 8e 00 34 sw (sp+52),r14 800b7f4: 5b 8f 00 30 sw (sp+48),r15 800b7f8: 5b 90 00 2c sw (sp+44),r16 800b7fc: 5b 91 00 28 sw (sp+40),r17 800b800: 5b 92 00 24 sw (sp+36),r18 800b804: 5b 93 00 20 sw (sp+32),r19 800b808: 5b 94 00 1c sw (sp+28),r20 800b80c: 5b 95 00 18 sw (sp+24),r21 800b810: 5b 96 00 14 sw (sp+20),r22 800b814: 5b 97 00 10 sw (sp+16),r23 800b818: 5b 98 00 0c sw (sp+12),r24 800b81c: 5b 99 00 08 sw (sp+8),r25 800b820: 5b 9d 00 04 sw (sp+4),ra 800b824: b8 20 90 00 mv r18,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 ) ) { 800b828: 34 01 ff f8 mvi r1,-8 800b82c: a0 61 08 00 and r1,r3,r1 const char *pathname, /* IN */ size_t pathnamelen, /* IN */ int flags, /* IN */ rtems_filesystem_location_info_t *pathloc /* IN/OUT */ ) { 800b830: b8 40 78 00 mv r15,r2 800b834: b8 60 88 00 mv r17,r3 800b838: b8 80 58 00 mv r11,r4 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 ) ) { 800b83c: 44 20 00 04 be r1,r0,800b84c <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EIO ); 800b840: f8 00 17 17 calli 801149c <__errno> <== NOT EXECUTED 800b844: 34 02 00 05 mvi r2,5 <== NOT EXECUTED 800b848: e0 00 00 91 bi 800ba8c <== NOT EXECUTED case IMFS_UP_DIR: /* * Am I at the root of all filesystems? (chroot'ed?) */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) 800b84c: 78 13 08 01 mvhi r19,0x801 /* * This was filled in by the caller and is valid in the * mount table. */ node = pathloc->node_access; 800b850: 28 8c 00 00 lw r12,(r4+0) rtems_filesystem_location_info_t *pathloc /* IN/OUT */ ) { int i = 0; int len; IMFS_token_types type = IMFS_CURRENT_DIR; 800b854: 34 0e 00 01 mvi r14,1 size_t pathnamelen, /* IN */ int flags, /* IN */ rtems_filesystem_location_info_t *pathloc /* IN/OUT */ ) { int i = 0; 800b858: 34 10 00 00 mvi r16,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 ); 800b85c: 37 96 00 44 addi r22,sp,68 /* * I cannot move out of this directory without execute permission. */ if ( type != IMFS_NO_MORE_PATH ) if ( node->type == IMFS_DIRECTORY ) 800b860: 34 15 00 01 mvi r21,1 if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) ) rtems_set_errno_and_return_minus_one( EACCES ); node = pathloc->node_access; switch( type ) { 800b864: 34 19 00 03 mvi r25,3 * It would be a design error if we evaluated the link and * was broken. */ IMFS_assert( node ); } else if ( node->type == IMFS_SYM_LINK ) { 800b868: 34 14 00 04 mvi r20,4 /* * In contrast to a hard link, it is possible to have a broken * symbolic link. */ node = pathloc->node_access; if ( result == -1 ) 800b86c: 34 18 ff ff mvi r24,-1 if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) ) rtems_set_errno_and_return_minus_one( EACCES ); node = pathloc->node_access; switch( type ) { 800b870: 34 17 00 02 mvi r23,2 case IMFS_UP_DIR: /* * Am I at the root of all filesystems? (chroot'ed?) */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) 800b874: 3a 73 91 08 ori r19,r19,0x9108 /* * Evaluate all tokens until we are done or an error occurs. */ while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) { 800b878: e0 00 00 5a bi 800b9e0 type = IMFS_get_token( &pathname[i], pathnamelen, token, &len ); 800b87c: b6 50 08 00 add r1,r18,r16 800b880: b9 e0 10 00 mv r2,r15 800b884: ba c0 18 00 mv r3,r22 800b888: 37 84 00 7c addi r4,sp,124 800b88c: f8 00 02 11 calli 800c0d0 800b890: b8 20 70 00 mv r14,r1 pathnamelen -= len; i += len; if ( !pathloc->node_access ) 800b894: 29 61 00 00 lw r1,(r11+0) */ while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) { type = IMFS_get_token( &pathname[i], pathnamelen, token, &len ); pathnamelen -= len; 800b898: 2b 8d 00 7c lw r13,(sp+124) i += len; if ( !pathloc->node_access ) 800b89c: 44 20 00 49 be r1,r0,800b9c0 <== 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 ) 800b8a0: 45 c0 00 07 be r14,r0,800b8bc if ( node->type == IMFS_DIRECTORY ) 800b8a4: 29 81 00 4c lw r1,(r12+76) 800b8a8: 5c 35 00 05 bne r1,r21,800b8bc if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) ) 800b8ac: b9 60 08 00 mv r1,r11 800b8b0: 34 02 00 01 mvi r2,1 800b8b4: fb ff ff 8e calli 800b6ec 800b8b8: 44 20 00 73 be r1,r0,800ba84 */ while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) { type = IMFS_get_token( &pathname[i], pathnamelen, token, &len ); pathnamelen -= len; 800b8bc: c9 ed 78 00 sub r15,r15,r13 i += len; 800b8c0: b6 0d 80 00 add r16,r16,r13 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; 800b8c4: 29 6c 00 00 lw r12,(r11+0) switch( type ) { 800b8c8: 45 d9 00 14 be r14,r25,800b918 800b8cc: 45 d4 00 42 be r14,r20,800b9d4 800b8d0: 5d d7 00 44 bne r14,r23,800b9e0 case IMFS_UP_DIR: /* * Am I at the root of all filesystems? (chroot'ed?) */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) 800b8d4: 2a 61 00 00 lw r1,(r19+0) 800b8d8: 28 21 00 18 lw r1,(r1+24) 800b8dc: 45 81 00 41 be r12,r1,800b9e0 /* * Am I at the root of this mounted filesystem? */ if (pathloc->node_access == pathloc->mt_entry->mt_fs_root.node_access) { 800b8e0: 29 64 00 10 lw r4,(r11+16) /* * Am I at the root of this mounted filesystem? */ if (pathloc->node_access == 800b8e4: 28 81 00 1c lw r1,(r4+28) 800b8e8: 5d 81 00 07 bne r12,r1,800b904 */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) { break; /* Throw out the .. in this case */ } else { newloc = pathloc->mt_entry->mt_point_node; 800b8ec: 28 85 00 08 lw r5,(r4+8) 800b8f0: 28 82 00 0c lw r2,(r4+12) 800b8f4: 28 81 00 10 lw r1,(r4+16) 800b8f8: 28 83 00 14 lw r3,(r4+20) 800b8fc: 28 84 00 18 lw r4,(r4+24) 800b900: e0 00 00 46 bi 800ba18 pathnamelen+len, flags,pathloc); } } else { if ( !node->Parent ) 800b904: 29 8c 00 08 lw r12,(r12+8) 800b908: 5d 80 00 31 bne r12,r0,800b9cc rtems_set_errno_and_return_minus_one( ENOENT ); 800b90c: f8 00 16 e4 calli 801149c <__errno> 800b910: 58 2e 00 00 sw (r1+0),r14 800b914: e0 00 00 5f bi 800ba90 case IMFS_NAME: /* * If we are at a link follow it. */ if ( node->type == IMFS_HARD_LINK ) { 800b918: 29 81 00 4c lw r1,(r12+76) 800b91c: 5c 2e 00 06 bne r1,r14,800b934 IMFS_evaluate_hard_link( pathloc, 0 ); 800b920: b9 60 08 00 mv r1,r11 800b924: 34 02 00 00 mvi r2,0 800b928: fb ff ff 97 calli 800b784 node = pathloc->node_access; 800b92c: 29 6c 00 00 lw r12,(r11+0) 800b930: e0 00 00 08 bi 800b950 * It would be a design error if we evaluated the link and * was broken. */ IMFS_assert( node ); } else if ( node->type == IMFS_SYM_LINK ) { 800b934: 5c 34 00 07 bne r1,r20,800b950 result = IMFS_evaluate_sym_link( pathloc, 0 ); 800b938: b9 60 08 00 mv r1,r11 800b93c: 34 02 00 00 mvi r2,0 800b940: f8 00 00 68 calli 800bae0 800b944: b8 20 68 00 mv r13,r1 /* * In contrast to a hard link, it is possible to have a broken * symbolic link. */ node = pathloc->node_access; 800b948: 29 6c 00 00 lw r12,(r11+0) if ( result == -1 ) 800b94c: 44 38 00 52 be r1,r24,800ba94 <== NEVER TAKEN } /* * Only a directory can be decended into. */ if ( node->type != IMFS_DIRECTORY ) 800b950: 29 81 00 4c lw r1,(r12+76) 800b954: 44 35 00 04 be r1,r21,800b964 rtems_set_errno_and_return_minus_one( ENOTDIR ); 800b958: f8 00 16 d1 calli 801149c <__errno> 800b95c: 34 02 00 14 mvi r2,20 800b960: e0 00 00 4b bi 800ba8c /* * 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 ) { 800b964: 29 8d 00 5c lw r13,(r12+92) 800b968: 45 a0 00 11 be r13,r0,800b9ac newloc = node->info.directory.mt_fs->mt_fs_root; 800b96c: 29 a4 00 1c lw r4,(r13+28) 800b970: 29 a2 00 20 lw r2,(r13+32) 800b974: 29 a1 00 24 lw r1,(r13+36) 800b978: 29 a3 00 28 lw r3,(r13+40) 800b97c: 29 a5 00 2c lw r5,(r13+44) 800b980: 5b 84 00 68 sw (sp+104),r4 800b984: 5b 82 00 6c sw (sp+108),r2 800b988: 5b 81 00 70 sw (sp+112),r1 800b98c: 5b 83 00 74 sw (sp+116),r3 800b990: 5b 85 00 78 sw (sp+120),r5 *pathloc = newloc; 800b994: 59 64 00 00 sw (r11+0),r4 800b998: 59 62 00 04 sw (r11+4),r2 800b99c: 59 61 00 08 sw (r11+8),r1 800b9a0: 59 63 00 0c sw (r11+12),r3 800b9a4: 59 65 00 10 sw (r11+16),r5 800b9a8: e0 00 00 26 bi 800ba40 } /* * Otherwise find the token name in the present location. */ node = IMFS_find_match_in_dir( node, token ); 800b9ac: b9 80 08 00 mv r1,r12 800b9b0: ba c0 10 00 mv r2,r22 800b9b4: f8 00 01 a1 calli 800c038 800b9b8: b8 20 60 00 mv r12,r1 if ( !node ) 800b9bc: 5c 2d 00 04 bne r1,r13,800b9cc rtems_set_errno_and_return_minus_one( ENOENT ); 800b9c0: f8 00 16 b7 calli 801149c <__errno> 800b9c4: 34 02 00 02 mvi r2,2 800b9c8: e0 00 00 31 bi 800ba8c /* * Set the node access to the point we have found. */ pathloc->node_access = node; 800b9cc: 59 6c 00 00 sw (r11+0),r12 800b9d0: e0 00 00 04 bi 800b9e0 case IMFS_NO_MORE_PATH: case IMFS_CURRENT_DIR: break; case IMFS_INVALID_TOKEN: rtems_set_errno_and_return_minus_one( ENAMETOOLONG ); 800b9d4: f8 00 16 b2 calli 801149c <__errno> 800b9d8: 34 02 00 5b mvi r2,91 800b9dc: e0 00 00 2c bi 800ba8c /* * Evaluate all tokens until we are done or an error occurs. */ while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) { 800b9e0: 7d c1 00 04 cmpnei r1,r14,4 800b9e4: 7d ce 00 00 cmpnei r14,r14,0 800b9e8: a0 2e 70 00 and r14,r1,r14 800b9ec: 5d c0 ff a4 bne r14,r0,800b87c * 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 ) { 800b9f0: 29 82 00 4c lw r2,(r12+76) 800b9f4: 34 01 00 01 mvi r1,1 800b9f8: 5c 41 00 1c bne r2,r1,800ba68 if ( node->info.directory.mt_fs != NULL ) { 800b9fc: 29 84 00 5c lw r4,(r12+92) 800ba00: 44 80 00 1a be r4,r0,800ba68 newloc = node->info.directory.mt_fs->mt_fs_root; 800ba04: 28 85 00 1c lw r5,(r4+28) 800ba08: 28 82 00 20 lw r2,(r4+32) 800ba0c: 28 81 00 24 lw r1,(r4+36) 800ba10: 28 83 00 28 lw r3,(r4+40) 800ba14: 28 84 00 2c lw r4,(r4+44) 800ba18: 5b 85 00 68 sw (sp+104),r5 800ba1c: 5b 82 00 6c sw (sp+108),r2 800ba20: 5b 81 00 70 sw (sp+112),r1 800ba24: 5b 83 00 74 sw (sp+116),r3 800ba28: 5b 84 00 78 sw (sp+120),r4 *pathloc = newloc; 800ba2c: 59 65 00 00 sw (r11+0),r5 800ba30: 59 62 00 04 sw (r11+4),r2 800ba34: 59 61 00 08 sw (r11+8),r1 800ba38: 59 63 00 0c sw (r11+12),r3 800ba3c: 59 64 00 10 sw (r11+16),r4 return (*pathloc->ops->evalpath_h)( &pathname[i-len], 800ba40: 2b 82 00 7c lw r2,(sp+124) 800ba44: 28 65 00 00 lw r5,(r3+0) 800ba48: b9 60 20 00 mv r4,r11 800ba4c: ca 02 08 00 sub r1,r16,r2 800ba50: b6 41 08 00 add r1,r18,r1 800ba54: b5 e2 10 00 add r2,r15,r2 800ba58: ba 20 18 00 mv r3,r17 800ba5c: d8 a0 00 00 call r5 800ba60: b8 20 68 00 mv r13,r1 800ba64: e0 00 00 0c bi 800ba94 flags, pathloc ); } else { result = IMFS_Set_handlers( pathloc ); } } else { result = IMFS_Set_handlers( pathloc ); 800ba68: b9 60 08 00 mv r1,r11 800ba6c: fb ff fe f9 calli 800b650 800ba70: b8 20 68 00 mv r13,r1 /* * Verify we have the correct permissions for this node. */ if ( !IMFS_evaluate_permission( pathloc, flags ) ) 800ba74: ba 20 10 00 mv r2,r17 800ba78: b9 60 08 00 mv r1,r11 800ba7c: fb ff ff 1c calli 800b6ec 800ba80: 5c 20 00 05 bne r1,r0,800ba94 rtems_set_errno_and_return_minus_one( EACCES ); 800ba84: f8 00 16 86 calli 801149c <__errno> 800ba88: 34 02 00 0d mvi r2,13 800ba8c: 58 22 00 00 sw (r1+0),r2 800ba90: 34 0d ff ff mvi r13,-1 return result; } 800ba94: b9 a0 08 00 mv r1,r13 800ba98: 2b 9d 00 04 lw ra,(sp+4) 800ba9c: 2b 8b 00 40 lw r11,(sp+64) 800baa0: 2b 8c 00 3c lw r12,(sp+60) 800baa4: 2b 8d 00 38 lw r13,(sp+56) 800baa8: 2b 8e 00 34 lw r14,(sp+52) 800baac: 2b 8f 00 30 lw r15,(sp+48) 800bab0: 2b 90 00 2c lw r16,(sp+44) 800bab4: 2b 91 00 28 lw r17,(sp+40) 800bab8: 2b 92 00 24 lw r18,(sp+36) 800babc: 2b 93 00 20 lw r19,(sp+32) 800bac0: 2b 94 00 1c lw r20,(sp+28) 800bac4: 2b 95 00 18 lw r21,(sp+24) 800bac8: 2b 96 00 14 lw r22,(sp+20) 800bacc: 2b 97 00 10 lw r23,(sp+16) 800bad0: 2b 98 00 0c lw r24,(sp+12) 800bad4: 2b 99 00 08 lw r25,(sp+8) 800bad8: 37 9c 00 7c addi sp,sp,124 800badc: c3 a0 00 00 ret =============================================================================== 0800bc7c : int IMFS_evaluate_for_make( const char *path, /* IN */ rtems_filesystem_location_info_t *pathloc, /* IN/OUT */ const char **name /* OUT */ ) { 800bc7c: 37 9c ff 84 addi sp,sp,-124 800bc80: 5b 8b 00 40 sw (sp+64),r11 800bc84: 5b 8c 00 3c sw (sp+60),r12 800bc88: 5b 8d 00 38 sw (sp+56),r13 800bc8c: 5b 8e 00 34 sw (sp+52),r14 800bc90: 5b 8f 00 30 sw (sp+48),r15 800bc94: 5b 90 00 2c sw (sp+44),r16 800bc98: 5b 91 00 28 sw (sp+40),r17 800bc9c: 5b 92 00 24 sw (sp+36),r18 800bca0: 5b 93 00 20 sw (sp+32),r19 800bca4: 5b 94 00 1c sw (sp+28),r20 800bca8: 5b 95 00 18 sw (sp+24),r21 800bcac: 5b 96 00 14 sw (sp+20),r22 800bcb0: 5b 97 00 10 sw (sp+16),r23 800bcb4: 5b 98 00 0c sw (sp+12),r24 800bcb8: 5b 99 00 08 sw (sp+8),r25 800bcbc: 5b 9d 00 04 sw (sp+4),ra case IMFS_UP_DIR: /* * Am I at the root of all filesystems? (chroot'ed?) */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) 800bcc0: 78 10 08 01 mvhi r16,0x801 int IMFS_evaluate_for_make( const char *path, /* IN */ rtems_filesystem_location_info_t *pathloc, /* IN/OUT */ const char **name /* OUT */ ) { 800bcc4: b8 20 78 00 mv r15,r1 800bcc8: b8 40 58 00 mv r11,r2 800bccc: b8 60 88 00 mv r17,r3 /* * This was filled in by the caller and is valid in the * mount table. */ node = pathloc->node_access; 800bcd0: 28 4c 00 00 lw r12,(r2+0) /* * Get the path length. */ pathlen = strlen( path ); 800bcd4: f8 00 1a 53 calli 8012620 800bcd8: b8 20 90 00 mv r18,r1 const char *path, /* IN */ rtems_filesystem_location_info_t *pathloc, /* IN/OUT */ const char **name /* OUT */ ) { int i = 0; 800bcdc: 34 0e 00 00 mvi r14,0 * Evaluate all tokens until we are done or an error occurs. */ while( !done ) { type = IMFS_get_token( &path[i], pathlen, token, &len ); 800bce0: 37 98 00 44 addi r24,sp,68 /* * I cannot move out of this directory without execute permission. */ if ( type != IMFS_NO_MORE_PATH ) if ( node->type == IMFS_DIRECTORY ) 800bce4: 34 17 00 01 mvi r23,1 if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) ) rtems_set_errno_and_return_minus_one( EACCES ); node = pathloc->node_access; switch( type ) { 800bce8: 34 16 00 02 mvi r22,2 case IMFS_UP_DIR: /* * Am I at the root of all filesystems? (chroot'ed?) */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) 800bcec: 3a 10 91 08 ori r16,r16,0x9108 if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) ) rtems_set_errno_and_return_minus_one( EACCES ); node = pathloc->node_access; switch( type ) { 800bcf0: 34 15 00 03 mvi r21,3 result = IMFS_evaluate_link( pathloc, 0 ); if ( result == -1 ) return -1; } else if ( node->type == IMFS_SYM_LINK ) { 800bcf4: 34 14 00 04 mvi r20,4 result = IMFS_evaluate_link( pathloc, 0 ); if ( result == -1 ) 800bcf8: 34 13 ff ff mvi r19,-1 * Evaluate all tokens until we are done or an error occurs. */ while( !done ) { type = IMFS_get_token( &path[i], pathlen, token, &len ); 800bcfc: ba 40 10 00 mv r2,r18 800bd00: b5 ee 08 00 add r1,r15,r14 800bd04: bb 00 18 00 mv r3,r24 800bd08: 37 84 00 7c addi r4,sp,124 800bd0c: f8 00 00 f1 calli 800c0d0 800bd10: b8 20 68 00 mv r13,r1 pathlen -= len; 800bd14: 2b 99 00 7c lw r25,(sp+124) i += len; if ( !pathloc->node_access ) 800bd18: 29 61 00 00 lw r1,(r11+0) */ while( !done ) { type = IMFS_get_token( &path[i], pathlen, token, &len ); pathlen -= len; 800bd1c: ca 59 90 00 sub r18,r18,r25 i += len; if ( !pathloc->node_access ) 800bd20: 44 20 00 68 be r1,r0,800bec0 <== NEVER TAKEN /* * I cannot move out of this directory without execute permission. */ if ( type != IMFS_NO_MORE_PATH ) 800bd24: 45 a0 00 07 be r13,r0,800bd40 if ( node->type == IMFS_DIRECTORY ) 800bd28: 29 81 00 4c lw r1,(r12+76) 800bd2c: 5c 37 00 05 bne r1,r23,800bd40 if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) ) 800bd30: b9 60 08 00 mv r1,r11 800bd34: 34 02 00 01 mvi r2,1 800bd38: fb ff fe 6d calli 800b6ec 800bd3c: 44 20 00 74 be r1,r0,800bf0c while( !done ) { type = IMFS_get_token( &path[i], pathlen, token, &len ); pathlen -= len; i += len; 800bd40: b5 d9 70 00 add r14,r14,r25 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; 800bd44: 29 6c 00 00 lw r12,(r11+0) switch( type ) { 800bd48: 45 b6 00 07 be r13,r22,800bd64 800bd4c: 55 b6 00 03 bgu r13,r22,800bd58 800bd50: 5d a0 ff eb bne r13,r0,800bcfc 800bd54: e0 00 00 4c bi 800be84 800bd58: 45 b5 00 1e be r13,r21,800bdd0 800bd5c: 5d b4 ff e8 bne r13,r20,800bcfc <== NEVER TAKEN 800bd60: e0 00 00 4c bi 800be90 case IMFS_UP_DIR: /* * Am I at the root of all filesystems? (chroot'ed?) */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) 800bd64: 2a 01 00 00 lw r1,(r16+0) 800bd68: 28 21 00 18 lw r1,(r1+24) 800bd6c: 45 81 ff e4 be r12,r1,800bcfc /* * Am I at the root of this mounted filesystem? */ if (pathloc->node_access == pathloc->mt_entry->mt_fs_root.node_access){ 800bd70: 29 64 00 10 lw r4,(r11+16) 800bd74: 28 81 00 1c lw r1,(r4+28) 800bd78: 5d 81 00 11 bne r12,r1,800bdbc if ( pathloc->node_access == rtems_filesystem_root.node_access ) { break; } else { newloc = pathloc->mt_entry->mt_point_node; 800bd7c: 28 85 00 08 lw r5,(r4+8) 800bd80: 28 83 00 0c lw r3,(r4+12) 800bd84: 28 81 00 10 lw r1,(r4+16) 800bd88: 28 82 00 14 lw r2,(r4+20) 800bd8c: 28 84 00 18 lw r4,(r4+24) 800bd90: 5b 85 00 68 sw (sp+104),r5 800bd94: 5b 83 00 6c sw (sp+108),r3 800bd98: 5b 81 00 70 sw (sp+112),r1 800bd9c: 5b 82 00 74 sw (sp+116),r2 800bda0: 5b 84 00 78 sw (sp+120),r4 *pathloc = newloc; 800bda4: 59 65 00 00 sw (r11+0),r5 800bda8: 59 63 00 04 sw (r11+4),r3 800bdac: 59 61 00 08 sw (r11+8),r1 800bdb0: 59 62 00 0c sw (r11+12),r2 800bdb4: 59 64 00 10 sw (r11+16),r4 800bdb8: e0 00 00 23 bi 800be44 return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name ); } } else { if ( !node->Parent ) 800bdbc: 29 8c 00 08 lw r12,(r12+8) 800bdc0: 5d 80 00 2f bne r12,r0,800be7c rtems_set_errno_and_return_minus_one( ENOENT ); 800bdc4: f8 00 15 b6 calli 801149c <__errno> 800bdc8: 58 2d 00 00 sw (r1+0),r13 800bdcc: e0 00 00 53 bi 800bf18 pathloc->node_access = node; break; case IMFS_NAME: if ( node->type == IMFS_HARD_LINK ) { 800bdd0: 29 81 00 4c lw r1,(r12+76) 800bdd4: 44 35 00 02 be r1,r21,800bddc result = IMFS_evaluate_link( pathloc, 0 ); if ( result == -1 ) return -1; } else if ( node->type == IMFS_SYM_LINK ) { 800bdd8: 5c 34 00 06 bne r1,r20,800bdf0 result = IMFS_evaluate_link( pathloc, 0 ); 800bddc: b9 60 08 00 mv r1,r11 800bde0: 34 02 00 00 mvi r2,0 800bde4: fb ff ff 69 calli 800bb88 800bde8: b8 20 60 00 mv r12,r1 if ( result == -1 ) 800bdec: 44 33 00 4c be r1,r19,800bf1c <== NEVER TAKEN return -1; } node = pathloc->node_access; 800bdf0: 29 64 00 00 lw r4,(r11+0) if ( !node ) 800bdf4: 44 80 00 3f be r4,r0,800bef0 <== NEVER TAKEN /* * Only a directory can be decended into. */ if ( node->type != IMFS_DIRECTORY ) 800bdf8: 28 81 00 4c lw r1,(r4+76) 800bdfc: 5c 37 00 3d bne r1,r23,800bef0 /* * 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 ) { 800be00: 28 8d 00 5c lw r13,(r4+92) 800be04: 45 a0 00 19 be r13,r0,800be68 newloc = node->info.directory.mt_fs->mt_fs_root; 800be08: 29 a4 00 1c lw r4,(r13+28) 800be0c: 29 a3 00 20 lw r3,(r13+32) 800be10: 29 a1 00 24 lw r1,(r13+36) 800be14: 29 a2 00 28 lw r2,(r13+40) 800be18: 29 a5 00 2c lw r5,(r13+44) 800be1c: 5b 84 00 68 sw (sp+104),r4 800be20: 5b 83 00 6c sw (sp+108),r3 800be24: 5b 81 00 70 sw (sp+112),r1 800be28: 5b 82 00 74 sw (sp+116),r2 800be2c: 5b 85 00 78 sw (sp+120),r5 *pathloc = newloc; 800be30: 59 64 00 00 sw (r11+0),r4 800be34: 59 63 00 04 sw (r11+4),r3 800be38: 59 61 00 08 sw (r11+8),r1 800be3c: 59 62 00 0c sw (r11+12),r2 800be40: 59 65 00 10 sw (r11+16),r5 return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name ); 800be44: 2b 81 00 7c lw r1,(sp+124) 800be48: 28 44 00 04 lw r4,(r2+4) 800be4c: ba 20 18 00 mv r3,r17 800be50: c9 c1 70 00 sub r14,r14,r1 800be54: b5 ee 08 00 add r1,r15,r14 800be58: b9 60 10 00 mv r2,r11 800be5c: d8 80 00 00 call r4 800be60: b8 20 60 00 mv r12,r1 800be64: e0 00 00 2e bi 800bf1c /* * Otherwise find the token name in the present location. */ node = IMFS_find_match_in_dir( node, token ); 800be68: b8 80 08 00 mv r1,r4 800be6c: bb 00 10 00 mv r2,r24 800be70: f8 00 00 72 calli 800c038 800be74: b8 20 60 00 mv r12,r1 /* * If there is no node we have found the name of the node we * wish to create. */ if ( ! node ) 800be78: 44 2d 00 09 be r1,r13,800be9c done = true; else pathloc->node_access = node; 800be7c: 59 6c 00 00 sw (r11+0),r12 800be80: e3 ff ff 9f bi 800bcfc break; case IMFS_NO_MORE_PATH: rtems_set_errno_and_return_minus_one( EEXIST ); 800be84: f8 00 15 86 calli 801149c <__errno> 800be88: 34 02 00 11 mvi r2,17 800be8c: e0 00 00 22 bi 800bf14 break; case IMFS_INVALID_TOKEN: rtems_set_errno_and_return_minus_one( ENAMETOOLONG ); 800be90: f8 00 15 83 calli 801149c <__errno> 800be94: 34 02 00 5b mvi r2,91 800be98: e0 00 00 1f bi 800bf14 case IMFS_CURRENT_DIR: break; } } *name = &path[ i - len ]; 800be9c: 2b 81 00 7c lw r1,(sp+124) 800bea0: c9 c1 08 00 sub r1,r14,r1 800bea4: b5 e1 08 00 add r1,r15,r1 800bea8: 5a 21 00 00 sw (r17+0),r1 * 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( 800beac: b5 ee 70 00 add r14,r15,r14 /* * 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++) { 800beb0: e0 00 00 07 bi 800becc if ( !IMFS_is_separator( path[ i ] ) ) 800beb4: fb ff de 71 calli 8003878 800beb8: 35 ce 00 01 addi r14,r14,1 800bebc: 5c 20 00 04 bne r1,r0,800becc rtems_set_errno_and_return_minus_one( ENOENT ); 800bec0: f8 00 15 77 calli 801149c <__errno> 800bec4: 34 02 00 02 mvi r2,2 800bec8: e0 00 00 13 bi 800bf14 /* * 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++) { 800becc: 41 c1 00 00 lbu r1,(r14+0) 800bed0: 5c 20 ff f9 bne r1,r0,800beb4 /* * Verify we can execute and write to this directory. */ result = IMFS_Set_handlers( pathloc ); 800bed4: b9 60 08 00 mv r1,r11 800bed8: fb ff fd de calli 800b650 800bedc: b8 20 60 00 mv r12,r1 /* * The returned node must be a directory */ node = pathloc->node_access; if ( node->type != IMFS_DIRECTORY ) 800bee0: 29 61 00 00 lw r1,(r11+0) 800bee4: 28 22 00 4c lw r2,(r1+76) 800bee8: 34 01 00 01 mvi r1,1 800beec: 44 41 00 04 be r2,r1,800befc <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( ENOTDIR ); 800bef0: f8 00 15 6b calli 801149c <__errno> 800bef4: 34 02 00 14 mvi r2,20 800bef8: e0 00 00 07 bi 800bf14 /* * We must have Write and execute permission on the returned node. */ if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_WX ) ) 800befc: b9 60 08 00 mv r1,r11 800bf00: 34 02 00 03 mvi r2,3 800bf04: fb ff fd fa calli 800b6ec 800bf08: 5c 20 00 05 bne r1,r0,800bf1c rtems_set_errno_and_return_minus_one( EACCES ); 800bf0c: f8 00 15 64 calli 801149c <__errno> 800bf10: 34 02 00 0d mvi r2,13 800bf14: 58 22 00 00 sw (r1+0),r2 800bf18: 34 0c ff ff mvi r12,-1 return result; } 800bf1c: b9 80 08 00 mv r1,r12 800bf20: 2b 9d 00 04 lw ra,(sp+4) 800bf24: 2b 8b 00 40 lw r11,(sp+64) 800bf28: 2b 8c 00 3c lw r12,(sp+60) 800bf2c: 2b 8d 00 38 lw r13,(sp+56) 800bf30: 2b 8e 00 34 lw r14,(sp+52) 800bf34: 2b 8f 00 30 lw r15,(sp+48) 800bf38: 2b 90 00 2c lw r16,(sp+44) 800bf3c: 2b 91 00 28 lw r17,(sp+40) 800bf40: 2b 92 00 24 lw r18,(sp+36) 800bf44: 2b 93 00 20 lw r19,(sp+32) 800bf48: 2b 94 00 1c lw r20,(sp+28) 800bf4c: 2b 95 00 18 lw r21,(sp+24) 800bf50: 2b 96 00 14 lw r22,(sp+20) 800bf54: 2b 97 00 10 lw r23,(sp+16) 800bf58: 2b 98 00 0c lw r24,(sp+12) 800bf5c: 2b 99 00 08 lw r25,(sp+8) 800bf60: 37 9c 00 7c addi sp,sp,124 800bf64: c3 a0 00 00 ret =============================================================================== 0800b6ec : */ int IMFS_evaluate_permission( rtems_filesystem_location_info_t *node, int flags ) { 800b6ec: 37 9c ff f0 addi sp,sp,-16 800b6f0: 5b 8b 00 10 sw (sp+16),r11 800b6f4: 5b 8c 00 0c sw (sp+12),r12 800b6f8: 5b 8d 00 08 sw (sp+8),r13 800b6fc: 5b 9d 00 04 sw (sp+4),ra 800b700: b8 40 60 00 mv r12,r2 uid_t st_uid; gid_t st_gid; IMFS_jnode_t *jnode; int flags_to_test; if ( !rtems_libio_is_valid_perms( flags ) ) 800b704: 34 02 ff f8 mvi r2,-8 800b708: a1 82 10 00 and r2,r12,r2 800b70c: 44 40 00 06 be r2,r0,800b724 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EPERM ); 800b710: f8 00 17 63 calli 801149c <__errno> <== NOT EXECUTED 800b714: 34 02 00 01 mvi r2,1 <== NOT EXECUTED 800b718: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED 800b71c: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED 800b720: e0 00 00 13 bi 800b76c <== NOT EXECUTED jnode = node->node_access; 800b724: 28 2b 00 00 lw r11,(r1+0) #if defined(RTEMS_POSIX_API) st_uid = geteuid(); 800b728: f8 00 03 a6 calli 800c5c0 800b72c: b8 20 68 00 mv r13,r1 st_gid = getegid(); 800b730: f8 00 03 9f calli 800c5ac 800b734: b8 20 10 00 mv r2,r1 * Check if I am owner or a group member or someone else. */ flags_to_test = flags; if ( st_uid == jnode->st_uid ) 800b738: 2d 61 00 3c lhu r1,(r11+60) 800b73c: 5c 2d 00 04 bne r1,r13,800b74c flags_to_test <<= 6; 800b740: b9 80 08 00 mv r1,r12 800b744: 34 02 00 06 mvi r2,6 800b748: e0 00 00 05 bi 800b75c else if ( st_gid == jnode->st_gid ) 800b74c: 2d 63 00 3e lhu r3,(r11+62) 800b750: b9 80 08 00 mv r1,r12 800b754: 5c 62 00 03 bne r3,r2,800b760 <== NEVER TAKEN flags_to_test <<= 3; 800b758: 34 02 00 03 mvi r2,3 800b75c: f8 00 2d f8 calli 8016f3c <__ashlsi3> /* * If all of the flags are set we have permission * to do this. */ if ( ( flags_to_test & jnode->st_mode) == flags_to_test ) 800b760: 29 62 00 30 lw r2,(r11+48) 800b764: a0 22 10 00 and r2,r1,r2 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 ); 800b768: e4 41 08 00 cmpe r1,r2,r1 */ if ( ( flags_to_test & jnode->st_mode) == flags_to_test ) return 1; return 0; } 800b76c: 2b 9d 00 04 lw ra,(sp+4) 800b770: 2b 8b 00 10 lw r11,(sp+16) 800b774: 2b 8c 00 0c lw r12,(sp+12) 800b778: 2b 8d 00 08 lw r13,(sp+8) 800b77c: 37 9c 00 10 addi sp,sp,16 800b780: c3 a0 00 00 ret =============================================================================== 08001f84 : rtems_off64_t IMFS_fifo_lseek( rtems_libio_t *iop, rtems_off64_t offset, int whence ) { 8001f84: 37 9c ff f8 addi sp,sp,-8 8001f88: 5b 8b 00 08 sw (sp+8),r11 8001f8c: 5b 9d 00 04 sw (sp+4),ra 8001f90: b8 20 28 00 mv r5,r1 off_t err = pipe_lseek(LIBIO2PIPE(iop), offset, whence, iop); 8001f94: 28 21 00 1c lw r1,(r1+28) 8001f98: b8 60 10 00 mv r2,r3 8001f9c: b8 80 18 00 mv r3,r4 8001fa0: 28 21 00 50 lw r1,(r1+80) 8001fa4: b8 a0 20 00 mv r4,r5 8001fa8: f8 00 22 ce calli 800aae0 8001fac: b8 20 58 00 mv r11,r1 IMFS_FIFO_RETURN(err); 8001fb0: 4c 20 00 07 bge r1,r0,8001fcc <== NEVER TAKEN 8001fb4: f8 00 33 50 calli 800ecf4 <__errno> 8001fb8: c8 0b 58 00 sub r11,r0,r11 8001fbc: 58 2b 00 00 sw (r1+0),r11 8001fc0: 34 01 ff ff mvi r1,-1 8001fc4: 34 0b ff ff mvi r11,-1 8001fc8: e0 00 00 03 bi 8001fd4 8001fcc: 34 02 00 1f mvi r2,31 <== NOT EXECUTED 8001fd0: f8 00 79 35 calli 80204a4 <__ashrsi3> <== NOT EXECUTED } 8001fd4: b9 60 10 00 mv r2,r11 8001fd8: 2b 9d 00 04 lw ra,(sp+4) 8001fdc: 2b 8b 00 08 lw r11,(sp+8) 8001fe0: 37 9c 00 08 addi sp,sp,8 8001fe4: c3 a0 00 00 ret =============================================================================== 08002074 : ssize_t IMFS_fifo_write( rtems_libio_t *iop, const void *buffer, size_t count ) { 8002074: 37 9c ff ec addi sp,sp,-20 8002078: 5b 8b 00 0c sw (sp+12),r11 800207c: 5b 8c 00 08 sw (sp+8),r12 8002080: 5b 9d 00 04 sw (sp+4),ra IMFS_jnode_t *jnode = iop->pathinfo.node_access; 8002084: 28 2c 00 1c lw r12,(r1+28) ssize_t IMFS_fifo_write( rtems_libio_t *iop, const void *buffer, size_t count ) { 8002088: b8 20 20 00 mv r4,r1 IMFS_jnode_t *jnode = iop->pathinfo.node_access; int err = pipe_write(JNODE2PIPE(jnode), buffer, count, iop); 800208c: 29 81 00 50 lw r1,(r12+80) 8002090: f8 00 21 f8 calli 800a870 8002094: b8 20 58 00 mv r11,r1 if (err > 0) { 8002098: 4c 01 00 09 bge r0,r1,80020bc IMFS_mtime_ctime_update(jnode); 800209c: 34 02 00 00 mvi r2,0 80020a0: 37 81 00 10 addi r1,sp,16 80020a4: f8 00 04 e2 calli 800342c 80020a8: 2b 81 00 10 lw r1,(sp+16) 80020ac: b9 60 10 00 mv r2,r11 80020b0: 59 81 00 44 sw (r12+68),r1 80020b4: 59 81 00 48 sw (r12+72),r1 80020b8: e0 00 00 07 bi 80020d4 } IMFS_FIFO_RETURN(err); 80020bc: 34 02 00 00 mvi r2,0 80020c0: 44 20 00 05 be r1,r0,80020d4 <== NEVER TAKEN 80020c4: f8 00 33 0c calli 800ecf4 <__errno> 80020c8: c8 0b 58 00 sub r11,r0,r11 80020cc: 58 2b 00 00 sw (r1+0),r11 80020d0: 34 02 ff ff mvi r2,-1 } 80020d4: b8 40 08 00 mv r1,r2 80020d8: 2b 9d 00 04 lw ra,(sp+4) 80020dc: 2b 8b 00 0c lw r11,(sp+12) 80020e0: 2b 8c 00 08 lw r12,(sp+8) 80020e4: 37 9c 00 14 addi sp,sp,20 80020e8: c3 a0 00 00 ret =============================================================================== 0800c038 : IMFS_jnode_t *IMFS_find_match_in_dir( IMFS_jnode_t *directory, char *name ) { 800c038: 37 9c ff f0 addi sp,sp,-16 800c03c: 5b 8b 00 10 sw (sp+16),r11 800c040: 5b 8c 00 0c sw (sp+12),r12 800c044: 5b 8d 00 08 sw (sp+8),r13 800c048: 5b 9d 00 04 sw (sp+4),ra 800c04c: b8 20 58 00 mv r11,r1 800c050: b8 40 68 00 mv r13,r2 /* * Check for "." and ".." */ if ( !strcmp( name, dotname ) ) 800c054: b8 40 08 00 mv r1,r2 800c058: 78 02 08 01 mvhi r2,0x801 800c05c: 38 42 83 90 ori r2,r2,0x8390 800c060: f8 00 18 f9 calli 8012444 800c064: 44 20 00 14 be r1,r0,800c0b4 <== NEVER TAKEN return directory; if ( !strcmp( name, dotdotname ) ) 800c068: 78 02 08 01 mvhi r2,0x801 800c06c: b9 a0 08 00 mv r1,r13 800c070: 38 42 83 94 ori r2,r2,0x8394 800c074: f8 00 18 f4 calli 8012444 800c078: 5c 20 00 03 bne r1,r0,800c084 <== ALWAYS TAKEN return directory->Parent; 800c07c: 29 6b 00 08 lw r11,(r11+8) <== NOT EXECUTED 800c080: e0 00 00 0d bi 800c0b4 <== NOT EXECUTED if ( !strcmp( name, the_jnode->name ) ) return the_jnode; } return 0; } 800c084: 29 6c 00 50 lw r12,(r11+80) RTEMS_INLINE_ROUTINE bool _Chain_Is_tail( Chain_Control *the_chain, const Chain_Node *the_node ) { return (the_node == _Chain_Tail(the_chain)); 800c088: 35 6b 00 54 addi r11,r11,84 if ( !strcmp( name, dotdotname ) ) return directory->Parent; the_chain = &directory->info.directory.Entries; for ( the_node = rtems_chain_first( the_chain ); 800c08c: e0 00 00 06 bi 800c0a4 !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 ) ) 800c090: b9 a0 08 00 mv r1,r13 800c094: 35 82 00 0c addi r2,r12,12 800c098: f8 00 18 eb calli 8012444 800c09c: 44 20 00 05 be r1,r0,800c0b0 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 ) { 800c0a0: 29 8c 00 00 lw r12,(r12+0) if ( !strcmp( name, dotdotname ) ) return directory->Parent; the_chain = &directory->info.directory.Entries; for ( the_node = rtems_chain_first( the_chain ); 800c0a4: 5d 8b ff fb bne r12,r11,800c090 if ( !strcmp( name, the_jnode->name ) ) return the_jnode; } return 0; 800c0a8: 34 0b 00 00 mvi r11,0 800c0ac: e0 00 00 02 bi 800c0b4 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; 800c0b0: b9 80 58 00 mv r11,r12 if ( !strcmp( name, the_jnode->name ) ) return the_jnode; } return 0; } 800c0b4: b9 60 08 00 mv r1,r11 800c0b8: 2b 9d 00 04 lw ra,(sp+4) 800c0bc: 2b 8b 00 10 lw r11,(sp+16) 800c0c0: 2b 8c 00 0c lw r12,(sp+12) 800c0c4: 2b 8d 00 08 lw r13,(sp+8) 800c0c8: 37 9c 00 10 addi sp,sp,16 800c0cc: c3 a0 00 00 ret =============================================================================== 0800bf68 : ((IMFS_jnode_t *)( rtems_chain_head( jnode_get_control( jnode ) )->next)) int IMFS_fsunmount( rtems_filesystem_mount_table_entry_t *temp_mt_entry ) { 800bf68: 37 9c ff d8 addi sp,sp,-40 800bf6c: 5b 8b 00 14 sw (sp+20),r11 800bf70: 5b 8c 00 10 sw (sp+16),r12 800bf74: 5b 8d 00 0c sw (sp+12),r13 800bf78: 5b 8e 00 08 sw (sp+8),r14 800bf7c: 5b 9d 00 04 sw (sp+4),ra /* * 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; 800bf80: 28 2b 00 1c lw r11,(r1+28) loc = temp_mt_entry->mt_fs_root; 800bf84: 28 25 00 20 lw r5,(r1+32) 800bf88: 28 24 00 24 lw r4,(r1+36) 800bf8c: 28 23 00 28 lw r3,(r1+40) 800bf90: 28 22 00 2c lw r2,(r1+44) 800bf94: 5b 8b 00 18 sw (sp+24),r11 800bf98: 5b 85 00 1c sw (sp+28),r5 800bf9c: 5b 84 00 20 sw (sp+32),r4 800bfa0: 5b 83 00 24 sw (sp+36),r3 800bfa4: 5b 82 00 28 sw (sp+40),r2 /* * Set this to null to indicate that it is being unmounted. */ temp_mt_entry->mt_fs_root.node_access = NULL; 800bfa8: 58 20 00 1c sw (r1+28),r0 do { next = jnode->Parent; loc.node_access = (void *)jnode; IMFS_Set_handlers( &loc ); 800bfac: 37 8c 00 18 addi r12,sp,24 if ( jnode->type != IMFS_DIRECTORY ) { 800bfb0: 34 0d 00 01 mvi r13,1 temp_mt_entry->mt_fs_root.node_access = NULL; do { next = jnode->Parent; loc.node_access = (void *)jnode; IMFS_Set_handlers( &loc ); 800bfb4: b9 80 08 00 mv r1,r12 */ temp_mt_entry->mt_fs_root.node_access = NULL; do { next = jnode->Parent; 800bfb8: 29 6e 00 08 lw r14,(r11+8) loc.node_access = (void *)jnode; 800bfbc: 5b 8b 00 18 sw (sp+24),r11 IMFS_Set_handlers( &loc ); 800bfc0: fb ff fd a4 calli 800b650 if ( jnode->type != IMFS_DIRECTORY ) { 800bfc4: 29 61 00 4c lw r1,(r11+76) 800bfc8: 5c 2d 00 04 bne r1,r13,800bfd8 result = IMFS_unlink( NULL, &loc ); if (result != 0) return -1; jnode = next; } else if ( jnode_has_no_children( jnode ) ) { 800bfcc: 29 62 00 50 lw r2,(r11+80) RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); 800bfd0: 35 61 00 54 addi r1,r11,84 800bfd4: 5c 41 00 06 bne r2,r1,800bfec result = IMFS_unlink( NULL, &loc ); 800bfd8: 34 01 00 00 mvi r1,0 800bfdc: b9 80 10 00 mv r2,r12 800bfe0: fb ff d8 32 calli 80020a8 if (result != 0) 800bfe4: 5c 20 00 0b bne r1,r0,800c010 <== NEVER TAKEN return -1; jnode = next; 800bfe8: b9 c0 58 00 mv r11,r14 } if ( jnode != NULL ) { 800bfec: 45 60 00 0b be r11,r0,800c018 if ( jnode->type == IMFS_DIRECTORY ) { 800bff0: 29 61 00 4c lw r1,(r11+76) 800bff4: 5c 2d ff f0 bne r1,r13,800bfb4 <== NEVER TAKEN } } } while (jnode != NULL); return 0; } 800bff8: 29 61 00 50 lw r1,(r11+80) 800bffc: 35 62 00 54 addi r2,r11,84 return -1; jnode = next; } if ( jnode != NULL ) { if ( jnode->type == IMFS_DIRECTORY ) { if ( jnode_has_children( jnode ) ) 800c000: 44 22 ff ed be r1,r2,800bfb4 jnode = jnode_get_first_child( jnode ); 800c004: b8 20 58 00 mv r11,r1 } } } while (jnode != NULL); 800c008: 5c 20 ff eb bne r1,r0,800bfb4 <== ALWAYS TAKEN 800c00c: e0 00 00 03 bi 800c018 return -1; jnode = next; } else if ( jnode_has_no_children( jnode ) ) { result = IMFS_unlink( NULL, &loc ); if (result != 0) return -1; 800c010: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED 800c014: e0 00 00 02 bi 800c01c <== NOT EXECUTED jnode = jnode_get_first_child( jnode ); } } } while (jnode != NULL); return 0; 800c018: 34 01 00 00 mvi r1,0 } 800c01c: 2b 9d 00 04 lw ra,(sp+4) 800c020: 2b 8b 00 14 lw r11,(sp+20) 800c024: 2b 8c 00 10 lw r12,(sp+16) 800c028: 2b 8d 00 0c lw r13,(sp+12) 800c02c: 2b 8e 00 08 lw r14,(sp+8) 800c030: 37 9c 00 28 addi sp,sp,40 800c034: c3 a0 00 00 ret =============================================================================== 0800c0d0 : const char *path, int pathlen, char *token, int *token_len ) { 800c0d0: 37 9c ff e0 addi sp,sp,-32 800c0d4: 5b 8b 00 20 sw (sp+32),r11 800c0d8: 5b 8c 00 1c sw (sp+28),r12 800c0dc: 5b 8d 00 18 sw (sp+24),r13 800c0e0: 5b 8e 00 14 sw (sp+20),r14 800c0e4: 5b 8f 00 10 sw (sp+16),r15 800c0e8: 5b 90 00 0c sw (sp+12),r16 800c0ec: 5b 91 00 08 sw (sp+8),r17 800c0f0: 5b 9d 00 04 sw (sp+4),ra register int i = 0; 800c0f4: 34 0b 00 00 mvi r11,0 const char *path, int pathlen, char *token, int *token_len ) { 800c0f8: b8 20 78 00 mv r15,r1 800c0fc: b8 40 70 00 mv r14,r2 800c100: b8 60 68 00 mv r13,r3 800c104: b8 80 80 00 mv r16,r4 register char c; /* * Copy a name into token. (Remember NULL is a token.) */ c = path[i]; 800c108: 40 2c 00 00 lbu r12,(r1+0) while ( (!IMFS_is_separator(c)) && (i < pathlen) && (i <= IMFS_NAME_MAX) ) { token[i] = c; if ( i == IMFS_NAME_MAX ) 800c10c: 34 11 00 20 mvi r17,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) ) { 800c110: e0 00 00 07 bi 800c12c #include #include "imfs.h" #include IMFS_token_types IMFS_get_token( 800c114: b5 ab 08 00 add r1,r13,r11 * 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; 800c118: 30 2c 00 00 sb (r1+0),r12 if ( i == IMFS_NAME_MAX ) 800c11c: 45 71 00 27 be r11,r17,800c1b8 return IMFS_INVALID_TOKEN; if ( !IMFS_is_valid_name_char(c) ) type = IMFS_INVALID_TOKEN; c = path [++i]; 800c120: 35 6b 00 01 addi r11,r11,1 #include #include "imfs.h" #include IMFS_token_types IMFS_get_token( 800c124: b5 eb 08 00 add r1,r15,r11 return IMFS_INVALID_TOKEN; if ( !IMFS_is_valid_name_char(c) ) type = IMFS_INVALID_TOKEN; c = path [++i]; 800c128: 40 2c 00 00 lbu r12,(r1+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) ) { 800c12c: b9 80 08 00 mv r1,r12 800c130: fb ff dd d2 calli 8003878 800c134: 5c 20 00 03 bne r1,r0,800c140 800c138: e9 cb 10 00 cmpg r2,r14,r11 800c13c: 5c 41 ff f6 bne r2,r1,800c114 <== ALWAYS TAKEN /* * Copy a seperator into token. */ if ( i == 0 ) { 800c140: 5d 60 00 08 bne r11,r0,800c160 token[i] = c; 800c144: 31 ac 00 00 sb (r13+0),r12 if ( (token[i] != '\0') && pathlen ) { 800c148: 7d ce 00 00 cmpnei r14,r14,0 800c14c: 7d 8c 00 00 cmpnei r12,r12,0 800c150: a1 8e 60 00 and r12,r12,r14 800c154: 5d 8b 00 09 bne r12,r11,800c178 i++; type = IMFS_CURRENT_DIR; } else { type = IMFS_NO_MORE_PATH; 800c158: 34 0c 00 00 mvi r12,0 800c15c: e0 00 00 09 bi 800c180 } } else if (token[ i-1 ] != '\0') { 800c160: b5 ab 08 00 add r1,r13,r11 800c164: 40 22 ff ff lbu r2,(r1+-1) char *token, int *token_len ) { register int i = 0; IMFS_token_types type = IMFS_NAME; 800c168: 34 0c 00 03 mvi r12,3 i++; type = IMFS_CURRENT_DIR; } else { type = IMFS_NO_MORE_PATH; } } else if (token[ i-1 ] != '\0') { 800c16c: 44 40 00 05 be r2,r0,800c180 <== NEVER TAKEN token[i] = '\0'; 800c170: 30 20 00 00 sb (r1+0),r0 800c174: e0 00 00 03 bi 800c180 if ( i == 0 ) { token[i] = c; if ( (token[i] != '\0') && pathlen ) { i++; type = IMFS_CURRENT_DIR; 800c178: 34 0c 00 01 mvi r12,1 if ( i == 0 ) { token[i] = c; if ( (token[i] != '\0') && pathlen ) { i++; 800c17c: 34 0b 00 01 mvi r11,1 /* * Set token_len to the number of characters copied. */ *token_len = i; 800c180: 5a 0b 00 00 sw (r16+0),r11 /* * If we copied something that was not a seperator see if * it was a special name. */ if ( type == IMFS_NAME ) { 800c184: 34 01 00 03 mvi r1,3 800c188: 5d 81 00 11 bne r12,r1,800c1cc if ( strcmp( token, "..") == 0 ) 800c18c: 78 02 08 01 mvhi r2,0x801 800c190: b9 a0 08 00 mv r1,r13 800c194: 38 42 83 98 ori r2,r2,0x8398 800c198: f8 00 18 ab calli 8012444 800c19c: 44 20 00 09 be r1,r0,800c1c0 type = IMFS_UP_DIR; else if ( strcmp( token, "." ) == 0 ) 800c1a0: 78 02 08 01 mvhi r2,0x801 800c1a4: b9 a0 08 00 mv r1,r13 800c1a8: 38 42 83 9c ori r2,r2,0x839c 800c1ac: f8 00 18 a6 calli 8012444 800c1b0: 44 20 00 06 be r1,r0,800c1c8 800c1b4: e0 00 00 06 bi 800c1cc while ( (!IMFS_is_separator(c)) && (i < pathlen) && (i <= IMFS_NAME_MAX) ) { token[i] = c; if ( i == IMFS_NAME_MAX ) return IMFS_INVALID_TOKEN; 800c1b8: 34 0c 00 04 mvi r12,4 800c1bc: e0 00 00 04 bi 800c1cc * it was a special name. */ if ( type == IMFS_NAME ) { if ( strcmp( token, "..") == 0 ) type = IMFS_UP_DIR; 800c1c0: 34 0c 00 02 mvi r12,2 800c1c4: e0 00 00 02 bi 800c1cc else if ( strcmp( token, "." ) == 0 ) type = IMFS_CURRENT_DIR; 800c1c8: 34 0c 00 01 mvi r12,1 } return type; } 800c1cc: b9 80 08 00 mv r1,r12 800c1d0: 2b 9d 00 04 lw ra,(sp+4) 800c1d4: 2b 8b 00 20 lw r11,(sp+32) 800c1d8: 2b 8c 00 1c lw r12,(sp+28) 800c1dc: 2b 8d 00 18 lw r13,(sp+24) 800c1e0: 2b 8e 00 14 lw r14,(sp+20) 800c1e4: 2b 8f 00 10 lw r15,(sp+16) 800c1e8: 2b 90 00 0c lw r16,(sp+12) 800c1ec: 2b 91 00 08 lw r17,(sp+8) 800c1f0: 37 9c 00 20 addi sp,sp,32 800c1f4: c3 a0 00 00 ret =============================================================================== 08001c2c : const rtems_filesystem_operations_table *op_table, const rtems_filesystem_file_handlers_r *memfile_handlers, const rtems_filesystem_file_handlers_r *directory_handlers, const rtems_filesystem_file_handlers_r *fifo_handlers ) { 8001c2c: 37 9c ff e0 addi sp,sp,-32 8001c30: 5b 8b 00 20 sw (sp+32),r11 8001c34: 5b 8c 00 1c sw (sp+28),r12 8001c38: 5b 8d 00 18 sw (sp+24),r13 8001c3c: 5b 8e 00 14 sw (sp+20),r14 8001c40: 5b 8f 00 10 sw (sp+16),r15 8001c44: 5b 90 00 0c sw (sp+12),r16 8001c48: 5b 91 00 08 sw (sp+8),r17 8001c4c: 5b 9d 00 04 sw (sp+4),ra 8001c50: b8 20 58 00 mv r11,r1 IMFS_jnode_t *jnode; /* * determine/check value for imfs_memfile_bytes_per_block */ IMFS_determine_bytes_per_block(&imfs_memfile_bytes_per_block, 8001c54: 78 01 08 01 mvhi r1,0x801 8001c58: 38 21 90 14 ori r1,r1,0x9014 8001c5c: 28 2c 00 00 lw r12,(r1+0) const rtems_filesystem_operations_table *op_table, const rtems_filesystem_file_handlers_r *memfile_handlers, const rtems_filesystem_file_handlers_r *directory_handlers, const rtems_filesystem_file_handlers_r *fifo_handlers ) { 8001c60: b8 40 88 00 mv r17,r2 8001c64: b8 60 80 00 mv r16,r3 8001c68: b8 80 70 00 mv r14,r4 8001c6c: b8 a0 78 00 mv r15,r5 IMFS_jnode_t *jnode; /* * determine/check value for imfs_memfile_bytes_per_block */ IMFS_determine_bytes_per_block(&imfs_memfile_bytes_per_block, 8001c70: 34 0d 00 06 mvi r13,6 int bit_mask; /* * check, whether requested bytes per block is valid */ for (bit_mask = 16; !is_valid && (bit_mask <= 512); bit_mask <<= 1) { 8001c74: 34 01 00 10 mvi r1,16 if (bit_mask == requested_bytes_per_block) { 8001c78: 44 2c 00 07 be r1,r12,8001c94 is_valid = true; break; } if(bit_mask > requested_bytes_per_block) 8001c7c: 48 2c 00 05 bg r1,r12,8001c90 int bit_mask; /* * check, whether requested bytes per block is valid */ for (bit_mask = 16; !is_valid && (bit_mask <= 512); bit_mask <<= 1) { 8001c80: 34 02 00 01 mvi r2,1 8001c84: 35 ad ff ff addi r13,r13,-1 8001c88: f8 00 54 ad calli 8016f3c <__ashlsi3> 8001c8c: 5d a0 ff fb bne r13,r0,8001c78 <== ALWAYS TAKEN if(bit_mask > requested_bytes_per_block) break; } *dest_bytes_per_block = ((is_valid) ? requested_bytes_per_block : default_bytes_per_block); 8001c90: 34 0c 00 80 mvi r12,128 break; } if(bit_mask > requested_bytes_per_block) break; } *dest_bytes_per_block = ((is_valid) 8001c94: 78 01 08 01 mvhi r1,0x801 8001c98: 38 21 97 18 ori r1,r1,0x9718 8001c9c: 58 2c 00 00 sw (r1+0),r12 /* * Create the root node * * NOTE: UNIX root is 755 and owned by root/root (0/0). */ temp_mt_entry->mt_fs_root.node_access = IMFS_create_root_node(); 8001ca0: f8 00 26 5c calli 800b610 temp_mt_entry->mt_fs_root.handlers = directory_handlers; temp_mt_entry->mt_fs_root.ops = op_table; temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS; 8001ca4: 78 02 08 01 mvhi r2,0x801 /* * Create the root node * * NOTE: UNIX root is 755 and owned by root/root (0/0). */ temp_mt_entry->mt_fs_root.node_access = IMFS_create_root_node(); 8001ca8: 59 61 00 1c sw (r11+28),r1 temp_mt_entry->mt_fs_root.handlers = directory_handlers; temp_mt_entry->mt_fs_root.ops = op_table; temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS; 8001cac: 38 42 83 44 ori r2,r2,0x8344 8001cb0: 34 03 00 30 mvi r3,48 /* * Create the root node * * NOTE: UNIX root is 755 and owned by root/root (0/0). */ temp_mt_entry->mt_fs_root.node_access = IMFS_create_root_node(); 8001cb4: b8 20 60 00 mv r12,r1 temp_mt_entry->mt_fs_root.handlers = directory_handlers; 8001cb8: 59 6e 00 24 sw (r11+36),r14 temp_mt_entry->mt_fs_root.ops = op_table; 8001cbc: 59 71 00 28 sw (r11+40),r17 temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS; 8001cc0: 35 61 00 38 addi r1,r11,56 8001cc4: f8 00 40 ac calli 8011f74 /* * Create custom file system data. */ fs_info = calloc( 1, sizeof( IMFS_fs_info_t ) ); 8001cc8: 34 02 00 14 mvi r2,20 8001ccc: 34 01 00 01 mvi r1,1 8001cd0: f8 00 01 ec calli 8002480 8001cd4: b8 20 10 00 mv r2,r1 if ( !fs_info ) { 8001cd8: 5c 20 00 08 bne r1,r0,8001cf8 free(temp_mt_entry->mt_fs_root.node_access); 8001cdc: b9 80 08 00 mv r1,r12 8001ce0: f8 00 02 79 calli 80026c4 rtems_set_errno_and_return_minus_one(ENOMEM); 8001ce4: f8 00 3d ee calli 801149c <__errno> 8001ce8: 34 02 00 0c mvi r2,12 8001cec: 58 22 00 00 sw (r1+0),r2 8001cf0: 34 01 ff ff mvi r1,-1 8001cf4: e0 00 00 0f bi 8001d30 /* * Set st_ino for the root to 1. */ fs_info->instance = imfs_instance++; 8001cf8: 78 06 08 01 mvhi r6,0x801 8001cfc: 38 c6 97 1c ori r6,r6,0x971c fs_info = calloc( 1, sizeof( IMFS_fs_info_t ) ); if ( !fs_info ) { free(temp_mt_entry->mt_fs_root.node_access); rtems_set_errno_and_return_minus_one(ENOMEM); } temp_mt_entry->fs_info = fs_info; 8001d00: 59 61 00 34 sw (r11+52),r1 /* * Set st_ino for the root to 1. */ fs_info->instance = imfs_instance++; 8001d04: 28 c1 00 00 lw r1,(r6+0) fs_info->ino_count = 1; fs_info->memfile_handlers = memfile_handlers; 8001d08: 58 50 00 08 sw (r2+8),r16 fs_info->directory_handlers = directory_handlers; 8001d0c: 58 4e 00 0c sw (r2+12),r14 /* * Set st_ino for the root to 1. */ fs_info->instance = imfs_instance++; 8001d10: 58 41 00 00 sw (r2+0),r1 8001d14: 34 21 00 01 addi r1,r1,1 8001d18: 58 c1 00 00 sw (r6+0),r1 fs_info->ino_count = 1; 8001d1c: 34 01 00 01 mvi r1,1 8001d20: 58 41 00 04 sw (r2+4),r1 fs_info->memfile_handlers = memfile_handlers; fs_info->directory_handlers = directory_handlers; fs_info->fifo_handlers = fifo_handlers; 8001d24: 58 4f 00 10 sw (r2+16),r15 jnode = temp_mt_entry->mt_fs_root.node_access; jnode->st_ino = fs_info->ino_count; 8001d28: 59 81 00 38 sw (r12+56),r1 return 0; 8001d2c: 34 01 00 00 mvi r1,0 } 8001d30: 2b 9d 00 04 lw ra,(sp+4) 8001d34: 2b 8b 00 20 lw r11,(sp+32) 8001d38: 2b 8c 00 1c lw r12,(sp+28) 8001d3c: 2b 8d 00 18 lw r13,(sp+24) 8001d40: 2b 8e 00 14 lw r14,(sp+20) 8001d44: 2b 8f 00 10 lw r15,(sp+16) 8001d48: 2b 90 00 0c lw r16,(sp+12) 8001d4c: 2b 91 00 08 lw r17,(sp+8) 8001d50: 37 9c 00 20 addi sp,sp,32 8001d54: c3 a0 00 00 ret =============================================================================== 0800fd88 : */ MEMFILE_STATIC int IMFS_memfile_extend( IMFS_jnode_t *the_jnode, off_t new_length ) { 800fd88: 37 9c ff e0 addi sp,sp,-32 800fd8c: 5b 8b 00 20 sw (sp+32),r11 800fd90: 5b 8c 00 1c sw (sp+28),r12 800fd94: 5b 8d 00 18 sw (sp+24),r13 800fd98: 5b 8e 00 14 sw (sp+20),r14 800fd9c: 5b 8f 00 10 sw (sp+16),r15 800fda0: 5b 90 00 0c sw (sp+12),r16 800fda4: 5b 91 00 08 sw (sp+8),r17 800fda8: 5b 9d 00 04 sw (sp+4),ra 800fdac: b8 20 60 00 mv r12,r1 IMFS_assert( the_jnode->type == IMFS_MEMORY_FILE ); /* * Verify new file size is supported */ if ( new_length >= IMFS_MEMFILE_MAXIMUM_SIZE ) 800fdb0: 78 01 08 01 mvhi r1,0x801 800fdb4: 38 21 97 18 ori r1,r1,0x9718 800fdb8: 28 2b 00 00 lw r11,(r1+0) */ MEMFILE_STATIC int IMFS_memfile_extend( IMFS_jnode_t *the_jnode, off_t new_length ) { 800fdbc: b8 40 68 00 mv r13,r2 IMFS_assert( the_jnode->type == IMFS_MEMORY_FILE ); /* * Verify new file size is supported */ if ( new_length >= IMFS_MEMFILE_MAXIMUM_SIZE ) 800fdc0: 34 02 00 02 mvi r2,2 800fdc4: b9 60 08 00 mv r1,r11 800fdc8: f8 00 1c ab calli 8017074 <__lshrsi3> 800fdcc: b8 20 70 00 mv r14,r1 800fdd0: b9 c0 10 00 mv r2,r14 800fdd4: 34 21 00 01 addi r1,r1,1 800fdd8: f8 00 1c ce calli 8017110 <__mulsi3> 800fddc: b9 c0 10 00 mv r2,r14 800fde0: 34 21 00 01 addi r1,r1,1 800fde4: f8 00 1c cb calli 8017110 <__mulsi3> 800fde8: 34 21 ff ff addi r1,r1,-1 800fdec: b9 60 10 00 mv r2,r11 800fdf0: f8 00 1c c8 calli 8017110 <__mulsi3> 800fdf4: 54 2d 00 04 bgu r1,r13,800fe04 rtems_set_errno_and_return_minus_one( EINVAL ); 800fdf8: f8 00 05 a9 calli 801149c <__errno> 800fdfc: 34 02 00 16 mvi r2,22 800fe00: e0 00 00 26 bi 800fe98 /* * Verify new file size is actually larger than current size */ if ( new_length <= the_jnode->info.file.size ) 800fe04: b9 a0 08 00 mv r1,r13 800fe08: 34 02 00 1f mvi r2,31 800fe0c: f8 00 1c 73 calli 8016fd8 <__ashrsi3> 800fe10: 29 8f 00 50 lw r15,(r12+80) 800fe14: b8 20 70 00 mv r14,r1 800fe18: 29 90 00 54 lw r16,(r12+84) 800fe1c: 48 2f 00 04 bg r1,r15,800fe2c <== NEVER TAKEN 800fe20: 5c 2f 00 25 bne r1,r15,800feb4 <== NEVER TAKEN 800fe24: 55 b0 00 02 bgu r13,r16,800fe2c 800fe28: e0 00 00 23 bi 800feb4 return 0; /* * Calculate the number of range of blocks to allocate */ new_blocks = new_length / IMFS_MEMFILE_BYTES_PER_BLOCK; 800fe2c: b9 60 10 00 mv r2,r11 800fe30: b9 a0 08 00 mv r1,r13 800fe34: f8 00 1c c3 calli 8017140 <__divsi3> old_blocks = the_jnode->info.file.size / IMFS_MEMFILE_BYTES_PER_BLOCK; 800fe38: 34 02 00 1f mvi r2,31 return 0; /* * Calculate the number of range of blocks to allocate */ new_blocks = new_length / IMFS_MEMFILE_BYTES_PER_BLOCK; 800fe3c: b8 20 88 00 mv r17,r1 old_blocks = the_jnode->info.file.size / IMFS_MEMFILE_BYTES_PER_BLOCK; 800fe40: b9 60 08 00 mv r1,r11 800fe44: f8 00 1c 65 calli 8016fd8 <__ashrsi3> 800fe48: b8 20 18 00 mv r3,r1 800fe4c: b9 60 20 00 mv r4,r11 800fe50: b9 e0 08 00 mv r1,r15 800fe54: ba 00 10 00 mv r2,r16 800fe58: f8 00 14 73 calli 8015024 <__divdi3> 800fe5c: b8 40 78 00 mv r15,r2 /* * Now allocate each of those blocks. */ for ( block=old_blocks ; block<=new_blocks ; block++ ) { 800fe60: b8 40 58 00 mv r11,r2 800fe64: e0 00 00 11 bi 800fea8 if ( IMFS_memfile_addblock( the_jnode, block ) ) { 800fe68: b9 80 08 00 mv r1,r12 800fe6c: b9 60 10 00 mv r2,r11 800fe70: fb ff ff 23 calli 800fafc 800fe74: 44 20 00 0c be r1,r0,800fea4 800fe78: e0 00 00 05 bi 800fe8c for ( ; block>=old_blocks ; block-- ) { IMFS_memfile_remove_block( the_jnode, block ); 800fe7c: b9 60 10 00 mv r2,r11 800fe80: b9 80 08 00 mv r1,r12 800fe84: fb ff ff b5 calli 800fd58 /* * 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-- ) { 800fe88: 35 6b ff ff addi r11,r11,-1 800fe8c: 51 6f ff fc bgeu r11,r15,800fe7c IMFS_memfile_remove_block( the_jnode, block ); } rtems_set_errno_and_return_minus_one( ENOSPC ); 800fe90: f8 00 05 83 calli 801149c <__errno> 800fe94: 34 02 00 1c mvi r2,28 800fe98: 58 22 00 00 sw (r1+0),r2 800fe9c: 34 01 ff ff mvi r1,-1 800fea0: e0 00 00 06 bi 800feb8 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++ ) { 800fea4: 35 6b 00 01 addi r11,r11,1 800fea8: 52 2b ff f0 bgeu r17,r11,800fe68 } /* * Set the new length of the file. */ the_jnode->info.file.size = new_length; 800feac: 59 8e 00 50 sw (r12+80),r14 800feb0: 59 8d 00 54 sw (r12+84),r13 /* * Verify new file size is actually larger than current size */ if ( new_length <= the_jnode->info.file.size ) return 0; 800feb4: 34 01 00 00 mvi r1,0 /* * Set the new length of the file. */ the_jnode->info.file.size = new_length; return 0; } 800feb8: 2b 9d 00 04 lw ra,(sp+4) 800febc: 2b 8b 00 20 lw r11,(sp+32) 800fec0: 2b 8c 00 1c lw r12,(sp+28) 800fec4: 2b 8d 00 18 lw r13,(sp+24) 800fec8: 2b 8e 00 14 lw r14,(sp+20) 800fecc: 2b 8f 00 10 lw r15,(sp+16) 800fed0: 2b 90 00 0c lw r16,(sp+12) 800fed4: 2b 91 00 08 lw r17,(sp+8) 800fed8: 37 9c 00 20 addi sp,sp,32 800fedc: c3 a0 00 00 ret =============================================================================== 0800f640 : #endif IMFS_jnode_t *the_jnode, unsigned int block, int malloc_it ) { 800f640: 37 9c ff e0 addi sp,sp,-32 800f644: 5b 8b 00 20 sw (sp+32),r11 800f648: 5b 8c 00 1c sw (sp+28),r12 800f64c: 5b 8d 00 18 sw (sp+24),r13 800f650: 5b 8e 00 14 sw (sp+20),r14 800f654: 5b 8f 00 10 sw (sp+16),r15 800f658: 5b 90 00 0c sw (sp+12),r16 800f65c: 5b 91 00 08 sw (sp+8),r17 800f660: 5b 9d 00 04 sw (sp+4),ra 800f664: b8 20 68 00 mv r13,r1 my_block = block; /* * Is the block number in the simple indirect portion? */ if ( my_block <= LAST_INDIRECT ) { 800f668: 78 01 08 01 mvhi r1,0x801 800f66c: 38 21 97 18 ori r1,r1,0x9718 800f670: 28 21 00 00 lw r1,(r1+0) #endif IMFS_jnode_t *the_jnode, unsigned int block, int malloc_it ) { 800f674: b8 40 70 00 mv r14,r2 my_block = block; /* * Is the block number in the simple indirect portion? */ if ( my_block <= LAST_INDIRECT ) { 800f678: 34 02 00 02 mvi r2,2 #endif IMFS_jnode_t *the_jnode, unsigned int block, int malloc_it ) { 800f67c: b8 60 78 00 mv r15,r3 my_block = block; /* * Is the block number in the simple indirect portion? */ if ( my_block <= LAST_INDIRECT ) { 800f680: f8 00 1e 7d calli 8017074 <__lshrsi3> 800f684: b8 20 60 00 mv r12,r1 800f688: 34 21 ff ff addi r1,r1,-1 800f68c: 55 c1 00 12 bgu r14,r1,800f6d4 p = info->indirect; 800f690: 29 ac 00 58 lw r12,(r13+88) if ( malloc_it ) { 800f694: 45 e0 00 0c be r15,r0,800f6c4 if ( !p ) { 800f698: 5d 80 00 05 bne r12,r0,800f6ac p = memfile_alloc_block(); 800f69c: fb ff ff d9 calli 800f600 if ( !p ) return 0; 800f6a0: 34 0b 00 00 mvi r11,0 if ( malloc_it ) { if ( !p ) { p = memfile_alloc_block(); if ( !p ) 800f6a4: 44 2c 00 81 be r1,r12,800f8a8 <== NEVER TAKEN return 0; info->indirect = p; 800f6a8: 59 a1 00 58 sw (r13+88),r1 } return &info->indirect[ my_block ]; 800f6ac: b9 c0 08 00 mv r1,r14 800f6b0: 34 02 00 02 mvi r2,2 800f6b4: f8 00 1e 22 calli 8016f3c <__ashlsi3> 800f6b8: 29 ab 00 58 lw r11,(r13+88) 800f6bc: b5 61 58 00 add r11,r11,r1 800f6c0: e0 00 00 7a bi 800f8a8 } if ( !p ) return 0; 800f6c4: 34 0b 00 00 mvi r11,0 return &info->indirect[ my_block ]; 800f6c8: b9 c0 08 00 mv r1,r14 info->indirect = p; } return &info->indirect[ my_block ]; } if ( !p ) 800f6cc: 5d 8b 00 74 bne r12,r11,800f89c <== ALWAYS TAKEN 800f6d0: e0 00 00 76 bi 800f8a8 <== NOT EXECUTED /* * Is the block number in the doubly indirect portion? */ if ( my_block <= LAST_DOUBLY_INDIRECT ) { 800f6d4: 35 81 00 01 addi r1,r12,1 800f6d8: b9 80 10 00 mv r2,r12 800f6dc: f8 00 1e 8d calli 8017110 <__mulsi3> 800f6e0: b8 20 80 00 mv r16,r1 800f6e4: 34 21 ff ff addi r1,r1,-1 800f6e8: 55 c1 00 2b bgu r14,r1,800f794 my_block -= FIRST_DOUBLY_INDIRECT; 800f6ec: c9 cc 70 00 sub r14,r14,r12 singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; 800f6f0: b9 80 10 00 mv r2,r12 800f6f4: b9 c0 08 00 mv r1,r14 800f6f8: f8 00 1e fb calli 80172e4 <__umodsi3> doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; 800f6fc: b9 80 10 00 mv r2,r12 */ if ( my_block <= LAST_DOUBLY_INDIRECT ) { my_block -= FIRST_DOUBLY_INDIRECT; singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; 800f700: b8 20 80 00 mv r16,r1 doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; 800f704: b9 c0 08 00 mv r1,r14 800f708: f8 00 1e e7 calli 80172a4 <__udivsi3> 800f70c: b8 20 70 00 mv r14,r1 p = info->doubly_indirect; 800f710: 29 ac 00 5c lw r12,(r13+92) if ( malloc_it ) { 800f714: 45 e0 00 17 be r15,r0,800f770 if ( !p ) { 800f718: 5d 80 00 06 bne r12,r0,800f730 p = memfile_alloc_block(); 800f71c: fb ff ff b9 calli 800f600 800f720: b8 20 60 00 mv r12,r1 if ( !p ) return 0; 800f724: 34 0b 00 00 mvi r11,0 p = info->doubly_indirect; if ( malloc_it ) { if ( !p ) { p = memfile_alloc_block(); if ( !p ) 800f728: 44 20 00 60 be r1,r0,800f8a8 <== NEVER TAKEN return 0; info->doubly_indirect = p; 800f72c: 59 a1 00 5c sw (r13+92),r1 } p1 = (block_p *)p[ doubly ]; 800f730: b9 c0 08 00 mv r1,r14 800f734: 34 02 00 02 mvi r2,2 800f738: f8 00 1e 01 calli 8016f3c <__ashlsi3> 800f73c: b5 81 60 00 add r12,r12,r1 800f740: 29 8d 00 00 lw r13,(r12+0) if ( !p1 ) { 800f744: 5d a0 00 06 bne r13,r0,800f75c p1 = memfile_alloc_block(); 800f748: fb ff ff ae calli 800f600 800f74c: b8 20 68 00 mv r13,r1 if ( !p1 ) return 0; 800f750: 34 0b 00 00 mvi r11,0 } p1 = (block_p *)p[ doubly ]; if ( !p1 ) { p1 = memfile_alloc_block(); if ( !p1 ) 800f754: 44 20 00 55 be r1,r0,800f8a8 <== NEVER TAKEN return 0; p[ doubly ] = (block_p) p1; 800f758: 59 81 00 00 sw (r12+0),r1 } return (block_p *)&p1[ singly ]; 800f75c: ba 00 08 00 mv r1,r16 800f760: 34 02 00 02 mvi r2,2 800f764: f8 00 1d f6 calli 8016f3c <__ashlsi3> 800f768: b5 a1 58 00 add r11,r13,r1 800f76c: e0 00 00 4f bi 800f8a8 } if ( !p ) return 0; 800f770: 34 0b 00 00 mvi r11,0 } return (block_p *)&p1[ singly ]; } if ( !p ) 800f774: 45 8b 00 4d be r12,r11,800f8a8 <== NEVER TAKEN return 0; p = (block_p *)p[ doubly ]; 800f778: 34 02 00 02 mvi r2,2 800f77c: f8 00 1d f0 calli 8016f3c <__ashlsi3> 800f780: b5 81 08 00 add r1,r12,r1 800f784: 28 2c 00 00 lw r12,(r1+0) if ( !p ) return 0; return (block_p *)&p[ singly ]; 800f788: ba 00 08 00 mv r1,r16 if ( !p ) return 0; p = (block_p *)p[ doubly ]; if ( !p ) 800f78c: 5d 80 00 44 bne r12,r0,800f89c <== ALWAYS TAKEN 800f790: e0 00 00 46 bi 800f8a8 <== NOT EXECUTED } /* * Is the block number in the triply indirect portion? */ if ( my_block <= LAST_TRIPLY_INDIRECT ) { 800f794: 36 01 00 01 addi r1,r16,1 800f798: b9 80 10 00 mv r2,r12 800f79c: f8 00 1e 5d calli 8017110 <__mulsi3> 800f7a0: 34 21 ff ff addi r1,r1,-1 } /* * This means the requested block number is out of range. */ return 0; 800f7a4: 34 0b 00 00 mvi r11,0 } /* * Is the block number in the triply indirect portion? */ if ( my_block <= LAST_TRIPLY_INDIRECT ) { 800f7a8: 55 c1 00 40 bgu r14,r1,800f8a8 <== NEVER TAKEN my_block -= FIRST_TRIPLY_INDIRECT; 800f7ac: c9 d0 70 00 sub r14,r14,r16 singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; 800f7b0: b9 80 10 00 mv r2,r12 800f7b4: b9 c0 08 00 mv r1,r14 800f7b8: f8 00 1e cb calli 80172e4 <__umodsi3> doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; 800f7bc: b9 80 10 00 mv r2,r12 * 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; 800f7c0: b8 20 88 00 mv r17,r1 doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; 800f7c4: b9 c0 08 00 mv r1,r14 800f7c8: f8 00 1e b7 calli 80172a4 <__udivsi3> triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS; 800f7cc: b9 80 10 00 mv r2,r12 */ if ( my_block <= LAST_TRIPLY_INDIRECT ) { my_block -= FIRST_TRIPLY_INDIRECT; singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; 800f7d0: b8 20 70 00 mv r14,r1 triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS; 800f7d4: f8 00 1e b4 calli 80172a4 <__udivsi3> doubly %= IMFS_MEMFILE_BLOCK_SLOTS; 800f7d8: b9 80 10 00 mv r2,r12 if ( my_block <= LAST_TRIPLY_INDIRECT ) { my_block -= FIRST_TRIPLY_INDIRECT; singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS; 800f7dc: b8 20 80 00 mv r16,r1 doubly %= IMFS_MEMFILE_BLOCK_SLOTS; 800f7e0: b9 c0 08 00 mv r1,r14 800f7e4: f8 00 1e c0 calli 80172e4 <__umodsi3> 800f7e8: b8 20 70 00 mv r14,r1 p = info->triply_indirect; 800f7ec: 29 ac 00 60 lw r12,(r13+96) if ( malloc_it ) { 800f7f0: 45 e0 00 1d be r15,r0,800f864 if ( !p ) { 800f7f4: 5d 80 00 05 bne r12,r0,800f808 p = memfile_alloc_block(); 800f7f8: fb ff ff 82 calli 800f600 800f7fc: b8 20 60 00 mv r12,r1 if ( !p ) 800f800: 44 20 00 2a be r1,r0,800f8a8 <== NEVER TAKEN return 0; info->triply_indirect = p; 800f804: 59 a1 00 60 sw (r13+96),r1 } p1 = (block_p *) p[ triply ]; 800f808: ba 00 08 00 mv r1,r16 800f80c: 34 02 00 02 mvi r2,2 800f810: f8 00 1d cb calli 8016f3c <__ashlsi3> 800f814: b5 81 60 00 add r12,r12,r1 800f818: 29 8d 00 00 lw r13,(r12+0) if ( !p1 ) { 800f81c: 5d a0 00 06 bne r13,r0,800f834 p1 = memfile_alloc_block(); 800f820: fb ff ff 78 calli 800f600 800f824: b8 20 68 00 mv r13,r1 if ( !p1 ) return 0; 800f828: 34 0b 00 00 mvi r11,0 } p1 = (block_p *) p[ triply ]; if ( !p1 ) { p1 = memfile_alloc_block(); if ( !p1 ) 800f82c: 44 20 00 1f be r1,r0,800f8a8 <== NEVER TAKEN return 0; p[ triply ] = (block_p) p1; 800f830: 59 81 00 00 sw (r12+0),r1 } p2 = (block_p *)p1[ doubly ]; 800f834: b9 c0 08 00 mv r1,r14 800f838: 34 02 00 02 mvi r2,2 800f83c: f8 00 1d c0 calli 8016f3c <__ashlsi3> 800f840: b5 a1 68 00 add r13,r13,r1 800f844: 29 ac 00 00 lw r12,(r13+0) if ( !p2 ) { 800f848: 5d 80 00 14 bne r12,r0,800f898 p2 = memfile_alloc_block(); 800f84c: fb ff ff 6d calli 800f600 800f850: b8 20 60 00 mv r12,r1 if ( !p2 ) return 0; 800f854: 34 0b 00 00 mvi r11,0 } p2 = (block_p *)p1[ doubly ]; if ( !p2 ) { p2 = memfile_alloc_block(); if ( !p2 ) 800f858: 44 20 00 14 be r1,r0,800f8a8 <== NEVER TAKEN return 0; p1[ doubly ] = (block_p) p2; 800f85c: 59 a1 00 00 sw (r13+0),r1 800f860: e0 00 00 0e bi 800f898 } return (block_p *)&p2[ singly ]; } if ( !p ) 800f864: 45 8b 00 11 be r12,r11,800f8a8 <== NEVER TAKEN return 0; p1 = (block_p *) p[ triply ]; 800f868: ba 00 08 00 mv r1,r16 800f86c: 34 02 00 02 mvi r2,2 800f870: f8 00 1d b3 calli 8016f3c <__ashlsi3> 800f874: b5 81 08 00 add r1,r12,r1 800f878: 28 2c 00 00 lw r12,(r1+0) if ( !p1 ) 800f87c: 45 80 00 0b be r12,r0,800f8a8 <== NEVER TAKEN return 0; p2 = (block_p *)p1[ doubly ]; 800f880: b9 c0 08 00 mv r1,r14 800f884: 34 02 00 02 mvi r2,2 800f888: f8 00 1d ad calli 8016f3c <__ashlsi3> 800f88c: b5 81 08 00 add r1,r12,r1 800f890: 28 2c 00 00 lw r12,(r1+0) if ( !p2 ) 800f894: 45 80 00 05 be r12,r0,800f8a8 <== NEVER TAKEN return 0; return (block_p *)&p2[ singly ]; 800f898: ba 20 08 00 mv r1,r17 800f89c: 34 02 00 02 mvi r2,2 800f8a0: f8 00 1d a7 calli 8016f3c <__ashlsi3> 800f8a4: b5 81 58 00 add r11,r12,r1 /* * This means the requested block number is out of range. */ return 0; } 800f8a8: b9 60 08 00 mv r1,r11 800f8ac: 2b 9d 00 04 lw ra,(sp+4) 800f8b0: 2b 8b 00 20 lw r11,(sp+32) 800f8b4: 2b 8c 00 1c lw r12,(sp+28) 800f8b8: 2b 8d 00 18 lw r13,(sp+24) 800f8bc: 2b 8e 00 14 lw r14,(sp+20) 800f8c0: 2b 8f 00 10 lw r15,(sp+16) 800f8c4: 2b 90 00 0c lw r16,(sp+12) 800f8c8: 2b 91 00 08 lw r17,(sp+8) 800f8cc: 37 9c 00 20 addi sp,sp,32 800f8d0: c3 a0 00 00 ret =============================================================================== 0800f8d4 : IMFS_jnode_t *the_jnode, off_t start, unsigned char *destination, unsigned int length ) { 800f8d4: 37 9c ff d4 addi sp,sp,-44 800f8d8: 5b 8b 00 24 sw (sp+36),r11 800f8dc: 5b 8c 00 20 sw (sp+32),r12 800f8e0: 5b 8d 00 1c sw (sp+28),r13 800f8e4: 5b 8e 00 18 sw (sp+24),r14 800f8e8: 5b 8f 00 14 sw (sp+20),r15 800f8ec: 5b 90 00 10 sw (sp+16),r16 800f8f0: 5b 91 00 0c sw (sp+12),r17 800f8f4: 5b 92 00 08 sw (sp+8),r18 800f8f8: 5b 9d 00 04 sw (sp+4),ra 800f8fc: b8 40 70 00 mv r14,r2 * 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) { 800f900: 28 22 00 4c lw r2,(r1+76) IMFS_jnode_t *the_jnode, off_t start, unsigned char *destination, unsigned int length ) { 800f904: b8 20 60 00 mv r12,r1 800f908: 28 2d 00 50 lw r13,(r1+80) 800f90c: 28 2f 00 54 lw r15,(r1+84) * 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) { 800f910: 34 01 00 06 mvi r1,6 IMFS_jnode_t *the_jnode, off_t start, unsigned char *destination, unsigned int length ) { 800f914: b8 60 80 00 mv r16,r3 800f918: b8 80 58 00 mv r11,r4 * 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) { 800f91c: 5c 41 00 15 bne r2,r1,800f970 unsigned char *file_ptr; file_ptr = (unsigned char *)the_jnode->info.linearfile.direct; if (my_length > (the_jnode->info.linearfile.size - start)) 800f920: 34 02 00 1f mvi r2,31 800f924: b9 c0 08 00 mv r1,r14 800f928: f8 00 1d ac calli 8016fd8 <__ashrsi3> 800f92c: c9 ee 18 00 sub r3,r15,r14 800f930: f4 6f 10 00 cmpgu r2,r3,r15 800f934: c9 a1 08 00 sub r1,r13,r1 800f938: c8 22 68 00 sub r13,r1,r2 my_length = length; if (the_jnode->type == IMFS_LINEAR_FILE) { unsigned char *file_ptr; file_ptr = (unsigned char *)the_jnode->info.linearfile.direct; 800f93c: 29 91 00 58 lw r17,(r12+88) if (my_length > (the_jnode->info.linearfile.size - start)) 800f940: 48 0d 00 04 bg r0,r13,800f950 <== NEVER TAKEN 800f944: 5c 0d 00 05 bne r0,r13,800f958 <== NEVER TAKEN 800f948: 55 63 00 02 bgu r11,r3,800f950 <== ALWAYS TAKEN 800f94c: e0 00 00 03 bi 800f958 <== NOT EXECUTED my_length = the_jnode->info.linearfile.size - start; 800f950: c9 ee 68 00 sub r13,r15,r14 800f954: e0 00 00 02 bi 800f95c /* * Linear files (as created from a tar file are easier to handle * than block files). */ my_length = length; 800f958: b9 60 68 00 mv r13,r11 <== 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); 800f95c: ba 00 08 00 mv r1,r16 800f960: b6 2e 10 00 add r2,r17,r14 800f964: b9 a0 18 00 mv r3,r13 800f968: f8 00 09 83 calli 8011f74 800f96c: e0 00 00 47 bi 800fa88 /* * 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; 800f970: b4 8e 08 00 add r1,r4,r14 if ( last_byte > the_jnode->info.file.size ) 800f974: 48 0d 00 04 bg r0,r13,800f984 <== NEVER TAKEN 800f978: 5d a0 00 04 bne r13,r0,800f988 <== NEVER TAKEN 800f97c: 54 2f 00 02 bgu r1,r15,800f984 800f980: e0 00 00 02 bi 800f988 my_length = the_jnode->info.file.size - start; 800f984: c9 ee 58 00 sub r11,r15,r14 */ /* * Phase 1: possibly the last part of one block */ start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK; 800f988: 78 01 08 01 mvhi r1,0x801 800f98c: 38 21 97 18 ori r1,r1,0x9718 800f990: 28 32 00 00 lw r18,(r1+0) 800f994: b9 c0 08 00 mv r1,r14 unsigned int last_byte; unsigned int copied; unsigned int start_offset; unsigned char *dest; dest = destination; 800f998: ba 00 78 00 mv r15,r16 */ /* * Phase 1: possibly the last part of one block */ start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK; 800f99c: ba 40 10 00 mv r2,r18 800f9a0: f8 00 1e 18 calli 8017200 <__modsi3> 800f9a4: b8 20 88 00 mv r17,r1 block = start / IMFS_MEMFILE_BYTES_PER_BLOCK; 800f9a8: ba 40 10 00 mv r2,r18 800f9ac: b9 c0 08 00 mv r1,r14 800f9b0: f8 00 1d e4 calli 8017140 <__divsi3> 800f9b4: b8 20 70 00 mv r14,r1 */ last_byte = start + length; if ( last_byte > the_jnode->info.file.size ) my_length = the_jnode->info.file.size - start; copied = 0; 800f9b8: 34 0d 00 00 mvi r13,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 ) { 800f9bc: 46 20 00 12 be r17,r0,800fa04 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 ); 800f9c0: b9 80 08 00 mv r1,r12 800f9c4: b9 c0 10 00 mv r2,r14 800f9c8: 34 03 00 00 mvi r3,0 800f9cc: fb ff ff 1d calli 800f640 if ( !block_ptr ) 800f9d0: 44 20 00 33 be r1,r0,800fa9c <== 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; 800f9d4: ca 51 90 00 sub r18,r18,r17 800f9d8: b9 60 68 00 mv r13,r11 800f9dc: 52 4b 00 02 bgeu r18,r11,800f9e4 800f9e0: ba 40 68 00 mv r13,r18 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 ); 800f9e4: 28 22 00 00 lw r2,(r1+0) 800f9e8: b9 a0 18 00 mv r3,r13 800f9ec: ba 00 08 00 mv r1,r16 800f9f0: b4 51 10 00 add r2,r2,r17 800f9f4: f8 00 09 60 calli 8011f74 dest += to_copy; 800f9f8: b6 0d 78 00 add r15,r16,r13 block++; 800f9fc: 35 ce 00 01 addi r14,r14,1 my_length -= to_copy; 800fa00: c9 6d 58 00 sub r11,r11,r13 } /* * Phase 2: all of zero of more blocks */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; 800fa04: 78 01 08 01 mvhi r1,0x801 800fa08: 38 21 97 18 ori r1,r1,0x9718 800fa0c: 28 30 00 00 lw r16,(r1+0) while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { 800fa10: b8 20 88 00 mv r17,r1 800fa14: e0 00 00 0f bi 800fa50 block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); 800fa18: b9 c0 10 00 mv r2,r14 800fa1c: b9 80 08 00 mv r1,r12 800fa20: 34 03 00 00 mvi r3,0 800fa24: fb ff ff 07 calli 800f640 800fa28: b8 20 10 00 mv r2,r1 if ( !block_ptr ) 800fa2c: 44 20 00 1c be r1,r0,800fa9c <== NEVER TAKEN return copied; memcpy( dest, &(*block_ptr)[ 0 ], to_copy ); 800fa30: 28 42 00 00 lw r2,(r2+0) 800fa34: b9 e0 08 00 mv r1,r15 800fa38: ba 00 18 00 mv r3,r16 800fa3c: f8 00 09 4e calli 8011f74 dest += to_copy; 800fa40: b5 f0 78 00 add r15,r15,r16 block++; 800fa44: 35 ce 00 01 addi r14,r14,1 my_length -= to_copy; 800fa48: c9 70 58 00 sub r11,r11,r16 copied += to_copy; 800fa4c: b5 b0 68 00 add r13,r13,r16 /* * Phase 2: all of zero of more blocks */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { 800fa50: 2a 21 00 00 lw r1,(r17+0) 800fa54: 51 61 ff f1 bgeu r11,r1,800fa18 /* * Phase 3: possibly the first part of one block */ IMFS_assert( my_length < IMFS_MEMFILE_BYTES_PER_BLOCK ); if ( my_length ) { 800fa58: 45 60 00 0c be r11,r0,800fa88 block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); 800fa5c: b9 c0 10 00 mv r2,r14 800fa60: b9 80 08 00 mv r1,r12 800fa64: 34 03 00 00 mvi r3,0 800fa68: fb ff fe f6 calli 800f640 800fa6c: b8 20 10 00 mv r2,r1 if ( !block_ptr ) 800fa70: 44 20 00 0b be r1,r0,800fa9c <== NEVER TAKEN return copied; memcpy( dest, &(*block_ptr)[ 0 ], my_length ); 800fa74: 28 42 00 00 lw r2,(r2+0) 800fa78: b9 e0 08 00 mv r1,r15 800fa7c: b9 60 18 00 mv r3,r11 800fa80: f8 00 09 3d calli 8011f74 copied += my_length; 800fa84: b5 6d 68 00 add r13,r11,r13 } IMFS_update_atime( the_jnode ); 800fa88: 37 81 00 28 addi r1,sp,40 800fa8c: 34 02 00 00 mvi r2,0 800fa90: fb ff cb 3b calli 800277c 800fa94: 2b 81 00 28 lw r1,(sp+40) 800fa98: 59 81 00 40 sw (r12+64),r1 return copied; } 800fa9c: b9 a0 08 00 mv r1,r13 800faa0: 2b 9d 00 04 lw ra,(sp+4) 800faa4: 2b 8b 00 24 lw r11,(sp+36) 800faa8: 2b 8c 00 20 lw r12,(sp+32) 800faac: 2b 8d 00 1c lw r13,(sp+28) 800fab0: 2b 8e 00 18 lw r14,(sp+24) 800fab4: 2b 8f 00 14 lw r15,(sp+20) 800fab8: 2b 90 00 10 lw r16,(sp+16) 800fabc: 2b 91 00 0c lw r17,(sp+12) 800fac0: 2b 92 00 08 lw r18,(sp+8) 800fac4: 37 9c 00 2c addi sp,sp,44 800fac8: c3 a0 00 00 ret =============================================================================== 0800fbec : * is better to stick to simple, easy to understand algorithms. */ int IMFS_memfile_remove( IMFS_jnode_t *the_jnode ) { 800fbec: 37 9c ff e0 addi sp,sp,-32 800fbf0: 5b 8b 00 20 sw (sp+32),r11 800fbf4: 5b 8c 00 1c sw (sp+28),r12 800fbf8: 5b 8d 00 18 sw (sp+24),r13 800fbfc: 5b 8e 00 14 sw (sp+20),r14 800fc00: 5b 8f 00 10 sw (sp+16),r15 800fc04: 5b 90 00 0c sw (sp+12),r16 800fc08: 5b 91 00 08 sw (sp+8),r17 800fc0c: 5b 9d 00 04 sw (sp+4),ra 800fc10: b8 20 58 00 mv r11,r1 /* * 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; 800fc14: 78 01 08 01 mvhi r1,0x801 800fc18: 38 21 97 18 ori r1,r1,0x9718 800fc1c: 28 21 00 00 lw r1,(r1+0) 800fc20: 34 02 00 02 mvi r2,2 800fc24: f8 00 1d 14 calli 8017074 <__lshrsi3> 800fc28: b8 20 60 00 mv r12,r1 * + doubly indirect * + triply indirect */ info = &the_jnode->info.file; if ( info->indirect ) { 800fc2c: 29 61 00 58 lw r1,(r11+88) 800fc30: 44 20 00 04 be r1,r0,800fc40 memfile_free_blocks_in_table( &info->indirect, to_free ); 800fc34: 35 61 00 58 addi r1,r11,88 800fc38: b9 80 10 00 mv r2,r12 800fc3c: fb ff ff d0 calli 800fb7c } if ( info->doubly_indirect ) { 800fc40: 29 61 00 5c lw r1,(r11+92) 800fc44: 44 20 00 15 be r1,r0,800fc98 for ( i=0 ; iindirect ) { memfile_free_blocks_in_table( &info->indirect, to_free ); } if ( info->doubly_indirect ) { 800fc4c: 34 0f 00 00 mvi r15,0 800fc50: 34 0e 00 00 mvi r14,0 for ( i=0 ; i if ( info->doubly_indirect[i] ) { 800fc5c: 29 61 00 5c lw r1,(r11+92) 800fc60: b4 2f 08 00 add r1,r1,r15 800fc64: 28 22 00 00 lw r2,(r1+0) 800fc68: 44 40 00 03 be r2,r0,800fc74 <== NEVER TAKEN memfile_free_blocks_in_table( 800fc6c: b9 80 10 00 mv r2,r12 800fc70: fb ff ff c3 calli 800fb7c if ( info->indirect ) { memfile_free_blocks_in_table( &info->indirect, to_free ); } if ( info->doubly_indirect ) { for ( i=0 ; i 800fc88: 54 2e ff f5 bgu r1,r14,800fc5c 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 ); 800fc8c: 35 61 00 5c addi r1,r11,92 800fc90: b9 80 10 00 mv r2,r12 800fc94: fb ff ff ba calli 800fb7c } if ( info->triply_indirect ) { 800fc98: 29 61 00 60 lw r1,(r11+96) 800fc9c: 44 20 00 24 be r1,r0,800fd2c for ( i=0 ; idoubly_indirect, to_free ); } if ( info->triply_indirect ) { 800fca4: 34 0f 00 00 mvi r15,0 800fca8: 34 10 00 00 mvi r16,0 for ( i=0 ; i p = (block_p *) info->triply_indirect[i]; 800fcb4: 29 61 00 60 lw r1,(r11+96) 800fcb8: b4 2f 08 00 add r1,r1,r15 800fcbc: 28 2d 00 00 lw r13,(r1+0) if ( !p ) /* ensure we have a valid pointer */ 800fcc0: 45 a0 00 18 be r13,r0,800fd20 <== NEVER TAKEN 800fcc4: 34 11 00 00 mvi r17,0 800fcc8: e0 00 00 08 bi 800fce8 break; for ( j=0 ; j <== NEVER TAKEN memfile_free_blocks_in_table( (block_p **)&p[j], to_free); 800fcd4: b9 a0 08 00 mv r1,r13 800fcd8: b9 80 10 00 mv r2,r12 800fcdc: fb ff ff a8 calli 800fb7c if ( info->triply_indirect ) { for ( i=0 ; itriply_indirect[i]; if ( !p ) /* ensure we have a valid pointer */ break; for ( j=0 ; j 800fcf4: 54 31 ff f6 bgu r1,r17,800fccc if ( p[j] ) { memfile_free_blocks_in_table( (block_p **)&p[j], to_free); } } memfile_free_blocks_in_table( 800fcf8: 29 61 00 60 lw r1,(r11+96) 800fcfc: b9 80 10 00 mv r2,r12 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 800fd1c: 54 30 ff e6 bgu r1,r16,800fcb4 } } memfile_free_blocks_in_table( (block_p **)&info->triply_indirect[i], to_free ); } memfile_free_blocks_in_table( 800fd20: 35 61 00 60 addi r1,r11,96 800fd24: b9 80 10 00 mv r2,r12 800fd28: fb ff ff 95 calli 800fb7c (block_p **)&info->triply_indirect, to_free ); } return 0; } 800fd2c: 34 01 00 00 mvi r1,0 800fd30: 2b 9d 00 04 lw ra,(sp+4) 800fd34: 2b 8b 00 20 lw r11,(sp+32) 800fd38: 2b 8c 00 1c lw r12,(sp+28) 800fd3c: 2b 8d 00 18 lw r13,(sp+24) 800fd40: 2b 8e 00 14 lw r14,(sp+20) 800fd44: 2b 8f 00 10 lw r15,(sp+16) 800fd48: 2b 90 00 0c lw r16,(sp+12) 800fd4c: 2b 91 00 08 lw r17,(sp+8) 800fd50: 37 9c 00 20 addi sp,sp,32 800fd54: c3 a0 00 00 ret =============================================================================== 0800fee0 : IMFS_jnode_t *the_jnode, off_t start, const unsigned char *source, unsigned int length ) { 800fee0: 37 9c ff d0 addi sp,sp,-48 800fee4: 5b 8b 00 28 sw (sp+40),r11 800fee8: 5b 8c 00 24 sw (sp+36),r12 800feec: 5b 8d 00 20 sw (sp+32),r13 800fef0: 5b 8e 00 1c sw (sp+28),r14 800fef4: 5b 8f 00 18 sw (sp+24),r15 800fef8: 5b 90 00 14 sw (sp+20),r16 800fefc: 5b 91 00 10 sw (sp+16),r17 800ff00: 5b 92 00 0c sw (sp+12),r18 800ff04: 5b 93 00 08 sw (sp+8),r19 800ff08: 5b 9d 00 04 sw (sp+4),ra 800ff0c: b8 20 58 00 mv r11,r1 * 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 ) { 800ff10: 28 21 00 50 lw r1,(r1+80) IMFS_jnode_t *the_jnode, off_t start, const unsigned char *source, unsigned int length ) { 800ff14: b8 40 60 00 mv r12,r2 800ff18: b8 60 88 00 mv r17,r3 800ff1c: b8 80 80 00 mv r16,r4 /* * 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; 800ff20: b4 82 10 00 add r2,r4,r2 if ( last_byte > the_jnode->info.file.size ) { 800ff24: 48 01 00 05 bg r0,r1,800ff38 <== NEVER TAKEN 800ff28: 5c 20 00 0c bne r1,r0,800ff58 <== NEVER TAKEN 800ff2c: 29 61 00 54 lw r1,(r11+84) 800ff30: 54 41 00 02 bgu r2,r1,800ff38 <== ALWAYS TAKEN 800ff34: e0 00 00 09 bi 800ff58 <== NOT EXECUTED status = IMFS_memfile_extend( the_jnode, last_byte ); 800ff38: b9 60 08 00 mv r1,r11 800ff3c: fb ff ff 93 calli 800fd88 if ( status ) 800ff40: 44 20 00 06 be r1,r0,800ff58 rtems_set_errno_and_return_minus_one( ENOSPC ); 800ff44: f8 00 05 56 calli 801149c <__errno> 800ff48: 34 02 00 1c mvi r2,28 800ff4c: 58 22 00 00 sw (r1+0),r2 800ff50: 34 05 ff ff mvi r5,-1 800ff54: e0 00 00 48 bi 8010074 */ /* * Phase 1: possibly the last part of one block */ start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK; 800ff58: 78 01 08 01 mvhi r1,0x801 800ff5c: 38 21 97 18 ori r1,r1,0x9718 800ff60: 28 33 00 00 lw r19,(r1+0) 800ff64: b9 80 08 00 mv r1,r12 unsigned int last_byte; unsigned int start_offset; int copied; const unsigned char *src; src = source; 800ff68: ba 20 78 00 mv r15,r17 */ /* * Phase 1: possibly the last part of one block */ start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK; 800ff6c: ba 60 10 00 mv r2,r19 800ff70: f8 00 1c a4 calli 8017200 <__modsi3> 800ff74: b8 20 90 00 mv r18,r1 block = start / IMFS_MEMFILE_BYTES_PER_BLOCK; 800ff78: ba 60 10 00 mv r2,r19 800ff7c: b9 80 08 00 mv r1,r12 800ff80: f8 00 1c 70 calli 8017140 <__divsi3> 800ff84: b8 20 70 00 mv r14,r1 if ( start_offset ) { 800ff88: ba 00 68 00 mv r13,r16 status = IMFS_memfile_extend( the_jnode, last_byte ); if ( status ) rtems_set_errno_and_return_minus_one( ENOSPC ); } copied = 0; 800ff8c: 34 0c 00 00 mvi r12,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 ) { 800ff90: 46 40 00 12 be r18,r0,800ffd8 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 ); 800ff94: b9 60 08 00 mv r1,r11 800ff98: b9 c0 10 00 mv r2,r14 800ff9c: 34 03 00 00 mvi r3,0 800ffa0: fb ff fd a8 calli 800f640 if ( !block_ptr ) return copied; 800ffa4: 34 05 00 00 mvi r5,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 ) 800ffa8: 44 20 00 33 be r1,r0,8010074 <== 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; 800ffac: ca 72 60 00 sub r12,r19,r18 800ffb0: 52 0c 00 02 bgeu r16,r12,800ffb8 800ffb4: ba 00 60 00 mv r12,r16 block, to_copy, src ); #endif memcpy( &(*block_ptr)[ start_offset ], src, to_copy ); 800ffb8: 28 21 00 00 lw r1,(r1+0) 800ffbc: ba 20 10 00 mv r2,r17 800ffc0: b9 80 18 00 mv r3,r12 800ffc4: b4 32 08 00 add r1,r1,r18 800ffc8: f8 00 07 eb calli 8011f74 src += to_copy; 800ffcc: b6 2c 78 00 add r15,r17,r12 block++; 800ffd0: 35 ce 00 01 addi r14,r14,1 my_length -= to_copy; 800ffd4: ca 0c 68 00 sub r13,r16,r12 /* * Phase 2: all of zero of more blocks */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; 800ffd8: 78 01 08 01 mvhi r1,0x801 800ffdc: 38 21 97 18 ori r1,r1,0x9718 800ffe0: 28 30 00 00 lw r16,(r1+0) while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { 800ffe4: b8 20 88 00 mv r17,r1 800ffe8: e0 00 00 0e bi 8010020 block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); 800ffec: b9 60 08 00 mv r1,r11 800fff0: b9 c0 10 00 mv r2,r14 800fff4: 34 03 00 00 mvi r3,0 800fff8: fb ff fd 92 calli 800f640 if ( !block_ptr ) 800fffc: 44 20 00 1d be r1,r0,8010070 <== 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 ); 8010000: 28 21 00 00 lw r1,(r1+0) 8010004: b9 e0 10 00 mv r2,r15 8010008: ba 00 18 00 mv r3,r16 801000c: f8 00 07 da calli 8011f74 src += to_copy; 8010010: b5 f0 78 00 add r15,r15,r16 block++; 8010014: 35 ce 00 01 addi r14,r14,1 my_length -= to_copy; 8010018: c9 b0 68 00 sub r13,r13,r16 * 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( 801001c: b5 90 60 00 add r12,r12,r16 /* * Phase 2: all of zero of more blocks */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { 8010020: 2a 21 00 00 lw r1,(r17+0) 8010024: 51 a1 ff f2 bgeu r13,r1,800ffec * 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 ) { 8010028: 45 a0 00 0c be r13,r0,8010058 block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); 801002c: b9 60 08 00 mv r1,r11 8010030: b9 c0 10 00 mv r2,r14 8010034: 34 03 00 00 mvi r3,0 8010038: fb ff fd 82 calli 800f640 if ( !block_ptr ) 801003c: b9 80 28 00 mv r5,r12 8010040: 44 20 00 0d be r1,r0,8010074 <== 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 ); 8010044: 28 21 00 00 lw r1,(r1+0) 8010048: b9 e0 10 00 mv r2,r15 801004c: b9 a0 18 00 mv r3,r13 8010050: f8 00 07 c9 calli 8011f74 my_length = 0; copied += to_copy; 8010054: b5 8d 60 00 add r12,r12,r13 } IMFS_mtime_ctime_update( the_jnode ); 8010058: 37 81 00 2c addi r1,sp,44 801005c: 34 02 00 00 mvi r2,0 8010060: fb ff c9 c7 calli 800277c 8010064: 2b 81 00 2c lw r1,(sp+44) 8010068: 59 61 00 44 sw (r11+68),r1 801006c: 59 61 00 48 sw (r11+72),r1 */ 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 ) 8010070: b9 80 28 00 mv r5,r12 } IMFS_mtime_ctime_update( the_jnode ); return copied; } 8010074: b8 a0 08 00 mv r1,r5 8010078: 2b 9d 00 04 lw ra,(sp+4) 801007c: 2b 8b 00 28 lw r11,(sp+40) 8010080: 2b 8c 00 24 lw r12,(sp+36) 8010084: 2b 8d 00 20 lw r13,(sp+32) 8010088: 2b 8e 00 1c lw r14,(sp+28) 801008c: 2b 8f 00 18 lw r15,(sp+24) 8010090: 2b 90 00 14 lw r16,(sp+20) 8010094: 2b 91 00 10 lw r17,(sp+16) 8010098: 2b 92 00 0c lw r18,(sp+12) 801009c: 2b 93 00 08 lw r19,(sp+8) 80100a0: 37 9c 00 30 addi sp,sp,48 80100a4: c3 a0 00 00 ret =============================================================================== 08001f08 : #include int IMFS_mount( rtems_filesystem_mount_table_entry_t *mt_entry ) { 8001f08: 37 9c ff fc addi sp,sp,-4 8001f0c: 5b 9d 00 04 sw (sp+4),ra IMFS_jnode_t *node; node = mt_entry->mt_point_node.node_access; 8001f10: 28 22 00 08 lw r2,(r1+8) /* * Is the node that we are mounting onto a directory node ? */ if ( node->type != IMFS_DIRECTORY ) 8001f14: 34 03 00 01 mvi r3,1 8001f18: 28 44 00 4c lw r4,(r2+76) 8001f1c: 44 83 00 06 be r4,r3,8001f34 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( ENOTDIR ); 8001f20: f8 00 3d 5f calli 801149c <__errno> <== NOT EXECUTED 8001f24: 34 02 00 14 mvi r2,20 <== NOT EXECUTED 8001f28: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED 8001f2c: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED 8001f30: e0 00 00 03 bi 8001f3c <== 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; 8001f34: 58 41 00 5c sw (r2+92),r1 return 0; 8001f38: 34 01 00 00 mvi r1,0 } 8001f3c: 2b 9d 00 04 lw ra,(sp+4) 8001f40: 37 9c 00 04 addi sp,sp,4 8001f44: c3 a0 00 00 ret =============================================================================== 08003860 : * This routine prints the contents of the specified jnode. */ void IMFS_print_jnode( IMFS_jnode_t *the_jnode ) { 8003860: 37 9c ff f0 addi sp,sp,-16 8003864: 5b 8b 00 10 sw (sp+16),r11 8003868: 5b 8c 00 0c sw (sp+12),r12 800386c: 5b 8d 00 08 sw (sp+8),r13 8003870: 5b 9d 00 04 sw (sp+4),ra IMFS_assert( the_jnode ); fprintf(stdout, "%s", the_jnode->name ); 8003874: 78 0c 08 02 mvhi r12,0x802 8003878: 39 8c 81 c0 ori r12,r12,0x81c0 800387c: 29 82 00 00 lw r2,(r12+0) * This routine prints the contents of the specified jnode. */ void IMFS_print_jnode( IMFS_jnode_t *the_jnode ) { 8003880: b8 20 58 00 mv r11,r1 IMFS_assert( the_jnode ); fprintf(stdout, "%s", the_jnode->name ); 8003884: 34 21 00 0c addi r1,r1,12 8003888: 28 42 00 08 lw r2,(r2+8) 800388c: f8 00 38 16 calli 80118e4 switch( the_jnode->type ) { 8003890: 29 63 00 4c lw r3,(r11+76) 8003894: 34 02 00 06 mvi r2,6 8003898: 34 61 ff ff addi r1,r3,-1 800389c: 54 22 00 2d bgu r1,r2,8003950 <== NEVER TAKEN 80038a0: 78 0d 08 02 mvhi r13,0x802 80038a4: 34 02 00 02 mvi r2,2 80038a8: f8 00 80 56 calli 8023a00 <__ashlsi3> 80038ac: 39 ad 59 1c ori r13,r13,0x591c 80038b0: b5 a1 08 00 add r1,r13,r1 80038b4: 28 21 00 00 lw r1,(r1+0) 80038b8: c0 20 00 00 b r1 case IMFS_DIRECTORY: fprintf(stdout, "/" ); 80038bc: 29 82 00 00 lw r2,(r12+0) 80038c0: 34 01 00 2f mvi r1,47 80038c4: 28 42 00 08 lw r2,(r2+8) 80038c8: f8 00 37 c3 calli 80117d4 break; 80038cc: e0 00 00 27 bi 8003968 case IMFS_DEVICE: fprintf(stdout, " (device %" PRId32 ", %" PRId32 ")", 80038d0: 29 81 00 00 lw r1,(r12+0) 80038d4: 78 02 08 02 mvhi r2,0x802 80038d8: 38 42 58 38 ori r2,r2,0x5838 80038dc: 28 21 00 08 lw r1,(r1+8) 80038e0: 29 63 00 50 lw r3,(r11+80) 80038e4: 29 64 00 54 lw r4,(r11+84) 80038e8: e0 00 00 07 bi 8003904 the_jnode->info.device.major, the_jnode->info.device.minor ); break; case IMFS_LINEAR_FILE: fprintf(stdout, " (file %" PRId32 " %p)", 80038ec: 29 81 00 00 lw r1,(r12+0) 80038f0: 29 63 00 54 lw r3,(r11+84) 80038f4: 29 64 00 58 lw r4,(r11+88) 80038f8: 28 21 00 08 lw r1,(r1+8) 80038fc: 78 02 08 02 mvhi r2,0x802 8003900: 38 42 58 4c ori r2,r2,0x584c 8003904: f8 00 37 8d calli 8011738 (uint32_t)the_jnode->info.linearfile.size, the_jnode->info.linearfile.direct ); break; 8003908: e0 00 00 18 bi 8003968 the_jnode->info.file.indirect, the_jnode->info.file.doubly_indirect, the_jnode->info.file.triply_indirect ); #else fprintf(stdout, " (file %" PRId32 ")", 800390c: 29 81 00 00 lw r1,(r12+0) 8003910: 29 63 00 54 lw r3,(r11+84) 8003914: 78 02 08 02 mvhi r2,0x802 8003918: 28 21 00 08 lw r1,(r1+8) 800391c: 38 42 58 5c ori r2,r2,0x585c 8003920: f8 00 37 86 calli 8011738 (uint32_t)the_jnode->info.file.size ); #endif break; 8003924: e0 00 00 11 bi 8003968 case IMFS_HARD_LINK: fprintf(stdout, " links not printed\n" ); return; case IMFS_SYM_LINK: fprintf(stdout, " links not printed\n" ); 8003928: 78 01 08 02 mvhi r1,0x802 800392c: 29 82 00 00 lw r2,(r12+0) 8003930: 38 21 58 68 ori r1,r1,0x5868 8003934: e0 00 00 04 bi 8003944 return; case IMFS_FIFO: fprintf(stdout, " FIFO not printed\n" ); 8003938: 29 82 00 00 lw r2,(r12+0) 800393c: 78 01 08 02 mvhi r1,0x802 8003940: 38 21 58 7c ori r1,r1,0x587c 8003944: 28 42 00 08 lw r2,(r2+8) 8003948: f8 00 37 e7 calli 80118e4 return; 800394c: e0 00 00 0a bi 8003974 default: fprintf(stdout, " bad type %d\n", the_jnode->type ); 8003950: 29 81 00 00 lw r1,(r12+0) 8003954: 78 02 08 02 mvhi r2,0x802 <== NOT EXECUTED 8003958: 38 42 58 90 ori r2,r2,0x5890 <== NOT EXECUTED 800395c: 28 21 00 08 lw r1,(r1+8) <== NOT EXECUTED 8003960: f8 00 37 76 calli 8011738 <== NOT EXECUTED return; 8003964: e0 00 00 04 bi 8003974 <== NOT EXECUTED } puts(""); 8003968: 78 01 08 02 mvhi r1,0x802 800396c: 38 21 54 00 ori r1,r1,0x5400 8003970: f8 00 3f 54 calli 80136c0 } 8003974: 2b 9d 00 04 lw ra,(sp+4) 8003978: 2b 8b 00 10 lw r11,(sp+16) 800397c: 2b 8c 00 0c lw r12,(sp+12) 8003980: 2b 8d 00 08 lw r13,(sp+8) 8003984: 37 9c 00 10 addi sp,sp,16 8003988: c3 a0 00 00 ret =============================================================================== 08001f84 : 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 */ ) { 8001f84: 37 9c ff ec addi sp,sp,-20 8001f88: 5b 8b 00 0c sw (sp+12),r11 8001f8c: 5b 8c 00 08 sw (sp+8),r12 8001f90: 5b 9d 00 04 sw (sp+4),ra IMFS_jnode_t *the_jnode; IMFS_jnode_t *new_parent; the_jnode = old_loc->node_access; 8001f94: 28 4b 00 00 lw r11,(r2+0) 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 */ ) { 8001f98: b8 60 60 00 mv r12,r3 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 ); 8001f9c: b8 80 10 00 mv r2,r4 8001fa0: 35 61 00 0c addi r1,r11,12 8001fa4: 34 03 00 20 mvi r3,32 8001fa8: f8 00 41 cd calli 80126dc if ( the_jnode->Parent != NULL ) 8001fac: 29 61 00 08 lw r1,(r11+8) 8001fb0: 44 20 00 03 be r1,r0,8001fbc <== NEVER TAKEN */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); 8001fb4: b9 60 08 00 mv r1,r11 8001fb8: f8 00 0a ea calli 8004b60 <_Chain_Extract> rtems_chain_extract( (rtems_chain_node *) the_jnode ); new_parent = new_parent_loc->node_access; 8001fbc: 29 81 00 00 lw r1,(r12+0) RTEMS_INLINE_ROUTINE void rtems_chain_append( rtems_chain_control *the_chain, rtems_chain_node *the_node ) { _Chain_Append( the_chain, the_node ); 8001fc0: b9 60 10 00 mv r2,r11 the_jnode->Parent = new_parent; 8001fc4: 59 61 00 08 sw (r11+8),r1 8001fc8: 34 21 00 50 addi r1,r1,80 8001fcc: f8 00 0a d9 calli 8004b30 <_Chain_Append> rtems_chain_append( &new_parent->info.directory.Entries, &the_jnode->Node ); /* * Update the time. */ IMFS_update_ctime( the_jnode ); 8001fd0: 37 81 00 10 addi r1,sp,16 8001fd4: 34 02 00 00 mvi r2,0 8001fd8: f8 00 01 e9 calli 800277c 8001fdc: 2b 81 00 10 lw r1,(sp+16) 8001fe0: 59 61 00 48 sw (r11+72),r1 return 0; } 8001fe4: 34 01 00 00 mvi r1,0 8001fe8: 2b 9d 00 04 lw ra,(sp+4) 8001fec: 2b 8b 00 0c lw r11,(sp+12) 8001ff0: 2b 8c 00 08 lw r12,(sp+8) 8001ff4: 37 9c 00 14 addi sp,sp,20 8001ff8: c3 a0 00 00 ret =============================================================================== 0800c2f4 : int IMFS_stat( rtems_filesystem_location_info_t *loc, struct stat *buf ) { 800c2f4: 37 9c ff ec addi sp,sp,-20 800c2f8: 5b 8b 00 14 sw (sp+20),r11 800c2fc: 5b 8c 00 10 sw (sp+16),r12 800c300: 5b 8d 00 0c sw (sp+12),r13 800c304: 5b 8e 00 08 sw (sp+8),r14 800c308: 5b 9d 00 04 sw (sp+4),ra IMFS_fs_info_t *fs_info; IMFS_jnode_t *the_jnode; IMFS_device_t *io; the_jnode = loc->node_access; 800c30c: 28 2b 00 00 lw r11,(r1+0) int IMFS_stat( rtems_filesystem_location_info_t *loc, struct stat *buf ) { 800c310: b8 20 70 00 mv r14,r1 800c314: b8 40 60 00 mv r12,r2 IMFS_device_t *io; the_jnode = loc->node_access; switch ( the_jnode->type ) { 800c318: 29 61 00 4c lw r1,(r11+76) 800c31c: 34 02 00 05 mvi r2,5 800c320: 34 21 ff fe addi r1,r1,-2 800c324: 54 22 00 12 bgu r1,r2,800c36c <== NEVER TAKEN 800c328: 78 0d 08 01 mvhi r13,0x801 800c32c: 34 02 00 02 mvi r2,2 800c330: f8 00 2b 03 calli 8016f3c <__ashlsi3> 800c334: 39 ad 84 80 ori r13,r13,0x8480 800c338: b5 a1 08 00 add r1,r13,r1 800c33c: 28 21 00 00 lw r1,(r1+0) 800c340: c0 20 00 00 b r1 case IMFS_DEVICE: io = &the_jnode->info.device; buf->st_rdev = rtems_filesystem_make_dev_t( io->major, io->minor ); 800c344: 29 61 00 54 lw r1,(r11+84) rtems_device_minor_number _minor ) { union __rtems_dev_t temp; temp.__overlay.major = _major; 800c348: 29 62 00 50 lw r2,(r11+80) 800c34c: 59 81 00 1c sw (r12+28),r1 800c350: 59 82 00 18 sw (r12+24),r2 break; 800c354: e0 00 00 0b bi 800c380 case IMFS_LINEAR_FILE: case IMFS_MEMORY_FILE: buf->st_size = the_jnode->info.file.size; 800c358: 29 61 00 54 lw r1,(r11+84) 800c35c: 59 81 00 20 sw (r12+32),r1 break; 800c360: e0 00 00 08 bi 800c380 case IMFS_SYM_LINK: buf->st_size = 0; break; case IMFS_FIFO: buf->st_size = 0; 800c364: 59 80 00 20 sw (r12+32),r0 break; 800c368: e0 00 00 06 bi 800c380 default: rtems_set_errno_and_return_minus_one( ENOTSUP ); 800c36c: f8 00 14 4c calli 801149c <__errno> 800c370: 34 02 00 86 mvi r2,134 800c374: 58 22 00 00 sw (r1+0),r2 800c378: 34 01 ff ff mvi r1,-1 800c37c: e0 00 00 18 bi 800c3dc /* * The device number of the IMFS is the major number and the minor is the * instance. */ fs_info = loc->mt_entry->fs_info; 800c380: 29 c1 00 10 lw r1,(r14+16) buf->st_dev = rtems_filesystem_make_dev_t( IMFS_DEVICE_MAJOR_NUMBER, fs_info->instance ); 800c384: 28 21 00 34 lw r1,(r1+52) 800c388: 28 22 00 00 lw r2,(r1+0) 800c38c: 38 01 ff fe mvu r1,0xfffe /* * 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 = 800c390: 59 81 00 00 sw (r12+0),r1 rtems_filesystem_make_dev_t( IMFS_DEVICE_MAJOR_NUMBER, fs_info->instance ); buf->st_mode = the_jnode->st_mode; 800c394: 29 61 00 30 lw r1,(r11+48) /* * 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 = 800c398: 59 82 00 04 sw (r12+4),r2 rtems_filesystem_make_dev_t( IMFS_DEVICE_MAJOR_NUMBER, fs_info->instance ); buf->st_mode = the_jnode->st_mode; 800c39c: 59 81 00 0c sw (r12+12),r1 buf->st_nlink = the_jnode->st_nlink; 800c3a0: 2d 61 00 34 lhu r1,(r11+52) 800c3a4: 0d 81 00 10 sh (r12+16),r1 buf->st_ino = the_jnode->st_ino; 800c3a8: 29 61 00 38 lw r1,(r11+56) 800c3ac: 59 81 00 08 sw (r12+8),r1 buf->st_uid = the_jnode->st_uid; 800c3b0: 2d 61 00 3c lhu r1,(r11+60) 800c3b4: 0d 81 00 12 sh (r12+18),r1 buf->st_gid = the_jnode->st_gid; 800c3b8: 2d 61 00 3e lhu r1,(r11+62) 800c3bc: 0d 81 00 14 sh (r12+20),r1 buf->st_atime = the_jnode->stat_atime; 800c3c0: 29 61 00 40 lw r1,(r11+64) 800c3c4: 59 81 00 24 sw (r12+36),r1 buf->st_mtime = the_jnode->stat_mtime; 800c3c8: 29 61 00 44 lw r1,(r11+68) 800c3cc: 59 81 00 2c sw (r12+44),r1 buf->st_ctime = the_jnode->stat_ctime; 800c3d0: 29 61 00 48 lw r1,(r11+72) 800c3d4: 59 81 00 34 sw (r12+52),r1 return 0; 800c3d8: 34 01 00 00 mvi r1,0 } 800c3dc: 2b 9d 00 04 lw ra,(sp+4) 800c3e0: 2b 8b 00 14 lw r11,(sp+20) 800c3e4: 2b 8c 00 10 lw r12,(sp+16) 800c3e8: 2b 8d 00 0c lw r13,(sp+12) 800c3ec: 2b 8e 00 08 lw r14,(sp+8) 800c3f0: 37 9c 00 14 addi sp,sp,20 800c3f4: c3 a0 00 00 ret =============================================================================== 080020a8 : int IMFS_unlink( rtems_filesystem_location_info_t *parentloc, /* IN */ rtems_filesystem_location_info_t *loc /* IN */ ) { 80020a8: 37 9c ff d0 addi sp,sp,-48 80020ac: 5b 8b 00 14 sw (sp+20),r11 80020b0: 5b 8c 00 10 sw (sp+16),r12 80020b4: 5b 8d 00 0c sw (sp+12),r13 80020b8: 5b 8e 00 08 sw (sp+8),r14 80020bc: 5b 9d 00 04 sw (sp+4),ra IMFS_jnode_t *node; rtems_filesystem_location_info_t the_link; int result = 0; node = loc->node_access; 80020c0: 28 4c 00 00 lw r12,(r2+0) int IMFS_unlink( rtems_filesystem_location_info_t *parentloc, /* IN */ rtems_filesystem_location_info_t *loc /* IN */ ) { 80020c4: b8 40 58 00 mv r11,r2 80020c8: b8 20 68 00 mv r13,r1 /* * If this is the last last pointer to the node * free the node. */ if ( node->type == IMFS_HARD_LINK ) { 80020cc: 29 82 00 4c lw r2,(r12+76) 80020d0: 34 01 00 03 mvi r1,3 80020d4: 5c 41 00 28 bne r2,r1,8002174 if ( !node->info.hard_link.link_node ) 80020d8: 29 81 00 50 lw r1,(r12+80) 80020dc: 5c 20 00 06 bne r1,r0,80020f4 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); 80020e0: f8 00 3c ef calli 801149c <__errno> <== NOT EXECUTED 80020e4: 34 02 00 16 mvi r2,22 <== NOT EXECUTED 80020e8: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED 80020ec: 34 02 ff ff mvi r2,-1 <== NOT EXECUTED 80020f0: e0 00 00 27 bi 800218c <== NOT EXECUTED the_link = *loc; 80020f4: 29 64 00 08 lw r4,(r11+8) 80020f8: 29 63 00 0c lw r3,(r11+12) 80020fc: 29 65 00 04 lw r5,(r11+4) 8002100: 29 62 00 10 lw r2,(r11+16) the_link.node_access = node->info.hard_link.link_node; IMFS_Set_handlers( &the_link ); 8002104: 37 8e 00 18 addi r14,sp,24 if ( !node->info.hard_link.link_node ) rtems_set_errno_and_return_minus_one( EINVAL ); the_link = *loc; the_link.node_access = node->info.hard_link.link_node; 8002108: 5b 81 00 18 sw (sp+24),r1 IMFS_Set_handlers( &the_link ); 800210c: b9 c0 08 00 mv r1,r14 if ( node->type == IMFS_HARD_LINK ) { if ( !node->info.hard_link.link_node ) rtems_set_errno_and_return_minus_one( EINVAL ); the_link = *loc; 8002110: 5b 84 00 20 sw (sp+32),r4 8002114: 5b 83 00 24 sw (sp+36),r3 8002118: 5b 85 00 1c sw (sp+28),r5 800211c: 5b 82 00 28 sw (sp+40),r2 the_link.node_access = node->info.hard_link.link_node; IMFS_Set_handlers( &the_link ); 8002120: f8 00 25 4c calli 800b650 /* * 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) 8002124: 29 83 00 50 lw r3,(r12+80) 8002128: 34 01 00 01 mvi r1,1 800212c: 2c 64 00 34 lhu r4,(r3+52) 8002130: 5c 81 00 09 bne r4,r1,8002154 { result = (*the_link.handlers->rmnod_h)( parentloc, &the_link ); 8002134: 2b 81 00 20 lw r1,(sp+32) 8002138: b9 c0 10 00 mv r2,r14 800213c: 28 23 00 34 lw r3,(r1+52) 8002140: b9 a0 08 00 mv r1,r13 8002144: d8 60 00 00 call r3 if ( result != 0 ) return -1; 8002148: 34 02 ff ff mvi r2,-1 */ if ( node->info.hard_link.link_node->st_nlink == 1) { result = (*the_link.handlers->rmnod_h)( parentloc, &the_link ); if ( result != 0 ) 800214c: 44 20 00 0a be r1,r0,8002174 8002150: e0 00 00 0f bi 800218c return -1; } else { node->info.hard_link.link_node->st_nlink --; 8002154: 34 84 ff ff addi r4,r4,-1 IMFS_update_ctime( node->info.hard_link.link_node ); 8002158: 34 02 00 00 mvi r2,0 if ( result != 0 ) return -1; } else { node->info.hard_link.link_node->st_nlink --; 800215c: 0c 64 00 34 sh (r3+52),r4 IMFS_update_ctime( node->info.hard_link.link_node ); 8002160: 37 81 00 2c addi r1,sp,44 8002164: f8 00 01 86 calli 800277c 8002168: 29 81 00 50 lw r1,(r12+80) 800216c: 2b 82 00 2c lw r2,(sp+44) 8002170: 58 22 00 48 sw (r1+72),r2 /* * Now actually free the node we were asked to free. */ result = (*loc->handlers->rmnod_h)( parentloc, loc ); 8002174: 29 61 00 08 lw r1,(r11+8) 8002178: b9 60 10 00 mv r2,r11 800217c: 28 23 00 34 lw r3,(r1+52) 8002180: b9 a0 08 00 mv r1,r13 8002184: d8 60 00 00 call r3 8002188: b8 20 10 00 mv r2,r1 return result; } 800218c: b8 40 08 00 mv r1,r2 8002190: 2b 9d 00 04 lw ra,(sp+4) 8002194: 2b 8b 00 14 lw r11,(sp+20) 8002198: 2b 8c 00 10 lw r12,(sp+16) 800219c: 2b 8d 00 0c lw r13,(sp+12) 80021a0: 2b 8e 00 08 lw r14,(sp+8) 80021a4: 37 9c 00 30 addi sp,sp,48 80021a8: c3 a0 00 00 ret =============================================================================== 080021ac : #include int IMFS_unmount( rtems_filesystem_mount_table_entry_t *mt_entry ) { 80021ac: 37 9c ff fc addi sp,sp,-4 80021b0: 5b 9d 00 04 sw (sp+4),ra IMFS_jnode_t *node; node = mt_entry->mt_point_node.node_access; 80021b4: 28 21 00 08 lw r1,(r1+8) /* * Is the node that we are mounting onto a directory node ? */ if ( node->type != IMFS_DIRECTORY ) 80021b8: 34 02 00 01 mvi r2,1 80021bc: 28 23 00 4c lw r3,(r1+76) 80021c0: 44 62 00 04 be r3,r2,80021d0 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( ENOTDIR ); 80021c4: f8 00 3c b6 calli 801149c <__errno> <== NOT EXECUTED 80021c8: 34 02 00 14 mvi r2,20 <== NOT EXECUTED 80021cc: e0 00 00 05 bi 80021e0 <== NOT EXECUTED /* * Did the node indicate that there was a directory mounted here? */ if ( node->info.directory.mt_fs == NULL ) 80021d0: 28 22 00 5c lw r2,(r1+92) 80021d4: 5c 40 00 06 bne r2,r0,80021ec <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); /* XXX */ 80021d8: f8 00 3c b1 calli 801149c <__errno> <== NOT EXECUTED 80021dc: 34 02 00 16 mvi r2,22 <== NOT EXECUTED 80021e0: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED 80021e4: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED 80021e8: e0 00 00 03 bi 80021f4 <== 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; 80021ec: 58 20 00 5c sw (r1+92),r0 return 0; 80021f0: 34 01 00 00 mvi r1,0 } 80021f4: 2b 9d 00 04 lw ra,(sp+4) 80021f8: 37 9c 00 04 addi sp,sp,4 80021fc: c3 a0 00 00 ret =============================================================================== 08001074 : static rtems_printk_plugin_t print_handler; void Stack_check_Dump_threads_usage( Thread_Control *the_thread ) { 8001074: 37 9c ff d4 addi sp,sp,-44 8001078: 5b 8b 00 24 sw (sp+36),r11 800107c: 5b 8c 00 20 sw (sp+32),r12 8001080: 5b 8d 00 1c sw (sp+28),r13 8001084: 5b 8e 00 18 sw (sp+24),r14 8001088: 5b 8f 00 14 sw (sp+20),r15 800108c: 5b 90 00 10 sw (sp+16),r16 8001090: 5b 91 00 0c sw (sp+12),r17 8001094: 5b 92 00 08 sw (sp+8),r18 8001098: 5b 9d 00 04 sw (sp+4),ra 800109c: b8 20 68 00 mv r13,r1 /* * Obtain interrupt stack information */ #if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) if (the_thread == (Thread_Control *) -1) { 80010a0: 34 01 ff ff mvi r1,-1 80010a4: 5d a1 00 08 bne r13,r1,80010c4 if (!Stack_check_Interrupt_stack.area) 80010a8: 78 0c 08 01 mvhi r12,0x801 80010ac: 39 8c 77 a0 ori r12,r12,0x77a0 80010b0: 29 81 00 04 lw r1,(r12+4) return; stack = &Stack_check_Interrupt_stack; the_thread = 0; current = 0; 80010b4: 34 10 00 00 mvi r16,0 #if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) if (the_thread == (Thread_Control *) -1) { if (!Stack_check_Interrupt_stack.area) return; stack = &Stack_check_Interrupt_stack; the_thread = 0; 80010b8: 34 0d 00 00 mvi r13,0 /* * Obtain interrupt stack information */ #if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) if (the_thread == (Thread_Control *) -1) { if (!Stack_check_Interrupt_stack.area) 80010bc: 5c 20 00 04 bne r1,r0,80010cc <== ALWAYS TAKEN 80010c0: e0 00 00 54 bi 8001210 <== NOT EXECUTED current = 0; } else #endif { stack = &the_thread->Start.Initial_stack; current = (void *)_CPU_Context_Get_SP( &the_thread->Registers ); 80010c4: 29 b0 01 08 lw r16,(r13+264) the_thread = 0; current = 0; } else #endif { stack = &the_thread->Start.Initial_stack; 80010c8: 35 ac 00 b8 addi r12,r13,184 current = (void *)_CPU_Context_Get_SP( &the_thread->Registers ); } low = Stack_check_usable_stack_start(stack); size = Stack_check_usable_stack_size(stack); 80010cc: 29 8f 00 00 lw r15,(r12+0) { const uint32_t *base, *ebase; uint32_t length; base = s; length = n/4; 80010d0: 34 02 00 02 mvi r2,2 { stack = &the_thread->Start.Initial_stack; current = (void *)_CPU_Context_Get_SP( &the_thread->Registers ); } low = Stack_check_usable_stack_start(stack); 80010d4: 29 8b 00 04 lw r11,(r12+4) size = Stack_check_usable_stack_size(stack); 80010d8: 35 ef ff f0 addi r15,r15,-16 { const uint32_t *base, *ebase; uint32_t length; base = s; length = n/4; 80010dc: b9 e0 08 00 mv r1,r15 80010e0: f8 00 4f 12 calli 8014d28 <__lshrsi3> * start at lower memory and find first word that does not * match pattern */ base += PATTERN_SIZE_WORDS; for (ebase = base + length; base < ebase; base++) 80010e4: 34 02 00 02 mvi r2,2 80010e8: f8 00 4e c2 calli 8014bf0 <__ashlsi3> if (*base != U32_PATTERN) 80010ec: 78 03 08 01 mvhi r3,0x801 { stack = &the_thread->Start.Initial_stack; current = (void *)_CPU_Context_Get_SP( &the_thread->Registers ); } low = Stack_check_usable_stack_start(stack); 80010f0: 35 71 00 10 addi r17,r11,16 * match pattern */ base += PATTERN_SIZE_WORDS; for (ebase = base + length; base < ebase; base++) if (*base != U32_PATTERN) 80010f4: 38 63 60 f0 ori r3,r3,0x60f0 /* * start at lower memory and find first word that does not * match pattern */ base += PATTERN_SIZE_WORDS; 80010f8: 35 6b 00 20 addi r11,r11,32 for (ebase = base + length; base < ebase; base++) 80010fc: b5 61 08 00 add r1,r11,r1 if (*base != U32_PATTERN) 8001100: 28 62 00 00 lw r2,(r3+0) 8001104: e0 00 00 04 bi 8001114 8001108: 29 63 00 00 lw r3,(r11+0) 800110c: 5c 62 00 05 bne r3,r2,8001120 * start at lower memory and find first word that does not * match pattern */ base += PATTERN_SIZE_WORDS; for (ebase = base + length; base < ebase; base++) 8001110: 35 6b 00 04 addi r11,r11,4 8001114: 54 2b ff fd bgu r1,r11,8001108 <== 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; 8001118: 34 0e 00 00 mvi r14,0 <== NOT EXECUTED 800111c: e0 00 00 05 bi 8001130 <== NOT EXECUTED 8001120: 34 0e 00 00 mvi r14,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 ) 8001124: 45 60 00 03 be r11,r0,8001130 <== NEVER TAKEN used = Stack_check_Calculate_used( low, size, high_water_mark ); 8001128: b6 2f 70 00 add r14,r17,r15 800112c: c9 cb 70 00 sub r14,r14,r11 8001130: 78 04 08 01 mvhi r4,0x801 8001134: 78 02 08 01 mvhi r2,0x801 8001138: 38 84 77 00 ori r4,r4,0x7700 800113c: 38 42 76 fc ori r2,r2,0x76fc else used = 0; #if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) if ( the_thread ) 8001140: 45 a0 00 0f be r13,r0,800117c #endif { (*print_handler)( 8001144: 29 ab 00 08 lw r11,(r13+8) 8001148: 28 52 00 00 lw r18,(r2+0) 800114c: 37 83 00 28 addi r3,sp,40 8001150: b9 60 08 00 mv r1,r11 8001154: 34 02 00 05 mvi r2,5 8001158: 28 91 00 00 lw r17,(r4+0) 800115c: f8 00 11 fc calli 800594c 8001160: 78 02 08 01 mvhi r2,0x801 8001164: b8 20 20 00 mv r4,r1 8001168: 38 42 5f 58 ori r2,r2,0x5f58 800116c: ba 40 08 00 mv r1,r18 8001170: b9 60 18 00 mv r3,r11 8001174: da 20 00 00 call r17 8001178: e0 00 00 07 bi 8001194 rtems_object_get_name( the_thread->Object.id, sizeof(name), name ) ); } #if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) else { (*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 ); 800117c: 28 41 00 00 lw r1,(r2+0) 8001180: 28 84 00 00 lw r4,(r4+0) 8001184: 78 02 08 01 mvhi r2,0x801 8001188: 38 42 5f 68 ori r2,r2,0x5f68 800118c: 34 03 ff ff mvi r3,-1 8001190: d8 80 00 00 call r4 (*print_handler)( print_context, " %010p - %010p %010p %8" PRId32 " ", stack->area, stack->area + stack->size - 1, 8001194: 29 84 00 00 lw r4,(r12+0) else { (*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 ); } #endif (*print_handler)( 8001198: 78 0b 08 01 mvhi r11,0x801 800119c: 78 0d 08 01 mvhi r13,0x801 print_context, " %010p - %010p %010p %8" PRId32 " ", stack->area, stack->area + stack->size - 1, 80011a0: 29 83 00 04 lw r3,(r12+4) else { (*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 ); } #endif (*print_handler)( 80011a4: 39 6b 77 00 ori r11,r11,0x7700 80011a8: 39 ad 76 fc ori r13,r13,0x76fc 80011ac: 29 67 00 00 lw r7,(r11+0) 80011b0: 29 a1 00 00 lw r1,(r13+0) print_context, " %010p - %010p %010p %8" PRId32 " ", stack->area, stack->area + stack->size - 1, 80011b4: 34 84 ff ff addi r4,r4,-1 else { (*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 ); } #endif (*print_handler)( 80011b8: 78 02 08 01 mvhi r2,0x801 80011bc: 38 42 5f 78 ori r2,r2,0x5f78 80011c0: b4 64 20 00 add r4,r3,r4 80011c4: ba 00 28 00 mv r5,r16 80011c8: b9 e0 30 00 mv r6,r15 80011cc: d8 e0 00 00 call r7 stack->area + stack->size - 1, current, size ); if (Stack_check_Initialized == 0) { 80011d0: 78 01 08 01 mvhi r1,0x801 80011d4: 38 21 77 04 ori r1,r1,0x7704 80011d8: 28 21 00 00 lw r1,(r1+0) 80011dc: 5c 20 00 07 bne r1,r0,80011f8 <== ALWAYS TAKEN (*print_handler)( print_context, "Unavailable\n" ); 80011e0: 29 63 00 00 lw r3,(r11+0) <== NOT EXECUTED 80011e4: 29 a1 00 00 lw r1,(r13+0) <== NOT EXECUTED 80011e8: 78 02 08 01 mvhi r2,0x801 <== NOT EXECUTED 80011ec: 38 42 5f 98 ori r2,r2,0x5f98 <== NOT EXECUTED 80011f0: d8 60 00 00 call r3 <== NOT EXECUTED 80011f4: e0 00 00 07 bi 8001210 <== NOT EXECUTED } else { (*print_handler)( print_context, "%8" PRId32 "\n", used ); 80011f8: 29 64 00 00 lw r4,(r11+0) 80011fc: 29 a1 00 00 lw r1,(r13+0) 8001200: 78 02 08 01 mvhi r2,0x801 8001204: 38 42 5f a8 ori r2,r2,0x5fa8 8001208: b9 c0 18 00 mv r3,r14 800120c: d8 80 00 00 call r4 } } 8001210: 2b 9d 00 04 lw ra,(sp+4) 8001214: 2b 8b 00 24 lw r11,(sp+36) 8001218: 2b 8c 00 20 lw r12,(sp+32) 800121c: 2b 8d 00 1c lw r13,(sp+28) 8001220: 2b 8e 00 18 lw r14,(sp+24) 8001224: 2b 8f 00 14 lw r15,(sp+20) 8001228: 2b 90 00 10 lw r16,(sp+16) 800122c: 2b 91 00 0c lw r17,(sp+12) 8001230: 2b 92 00 08 lw r18,(sp+8) 8001234: 37 9c 00 2c addi sp,sp,44 8001238: c3 a0 00 00 ret =============================================================================== 0800123c : /* * Stack_check_Initialize */ void Stack_check_Initialize( void ) { 800123c: 37 9c ff fc addi sp,sp,-4 8001240: 5b 9d 00 04 sw (sp+4),ra static uint32_t pattern[ 4 ] = { 0xFEEDF00D, 0x0BAD0D06, /* FEED FOOD to BAD DOG */ 0xDEADF00D, 0x600D0D06 /* DEAD FOOD but GOOD DOG */ }; if ( Stack_check_Initialized ) 8001244: 78 01 08 01 mvhi r1,0x801 8001248: 38 21 77 04 ori r1,r1,0x7704 800124c: 28 23 00 00 lw r3,(r1+0) 8001250: 5c 60 00 24 bne r3,r0,80012e0 /* * Dope the pattern and fill areas */ p = Stack_check_Pattern.pattern; for ( i = 0; i < PATTERN_SIZE_WORDS; i++ ) { p[i] = pattern[ i%4 ]; 8001254: 78 04 08 01 mvhi r4,0x801 8001258: 38 84 60 f4 ori r4,r4,0x60f4 800125c: 28 82 00 00 lw r2,(r4+0) 8001260: 78 01 08 01 mvhi r1,0x801 8001264: 78 04 08 01 mvhi r4,0x801 8001268: 38 21 77 90 ori r1,r1,0x7790 800126c: 38 84 60 f8 ori r4,r4,0x60f8 8001270: 58 22 00 00 sw (r1+0),r2 8001274: 28 82 00 00 lw r2,(r4+0) 8001278: 78 04 08 01 mvhi r4,0x801 800127c: 38 84 60 fc ori r4,r4,0x60fc 8001280: 58 22 00 04 sw (r1+4),r2 8001284: 28 82 00 00 lw r2,(r4+0) 8001288: 78 04 08 01 mvhi r4,0x801 800128c: 38 84 61 00 ori r4,r4,0x6100 8001290: 58 22 00 08 sw (r1+8),r2 8001294: 28 82 00 00 lw r2,(r4+0) 8001298: 58 22 00 0c sw (r1+12),r2 /* * If appropriate, setup the interrupt stack for high water testing * also. */ #if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) if (_CPU_Interrupt_stack_low && _CPU_Interrupt_stack_high) { 800129c: 78 02 08 01 mvhi r2,0x801 80012a0: 38 42 7e 18 ori r2,r2,0x7e18 80012a4: 28 41 00 00 lw r1,(r2+0) 80012a8: 44 23 00 0a be r1,r3,80012d0 <== NEVER TAKEN 80012ac: 28 43 00 04 lw r3,(r2+4) 80012b0: 44 60 00 08 be r3,r0,80012d0 <== NEVER TAKEN Stack_check_Interrupt_stack.area = _CPU_Interrupt_stack_low; 80012b4: 78 02 08 01 mvhi r2,0x801 80012b8: 38 42 77 a0 ori r2,r2,0x77a0 Stack_check_Interrupt_stack.size = (char *) _CPU_Interrupt_stack_high - 80012bc: c8 61 18 00 sub r3,r3,r1 * If appropriate, setup the interrupt stack for high water testing * also. */ #if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) if (_CPU_Interrupt_stack_low && _CPU_Interrupt_stack_high) { Stack_check_Interrupt_stack.area = _CPU_Interrupt_stack_low; 80012c0: 58 41 00 04 sw (r2+4),r1 Stack_check_Interrupt_stack.size = (char *) _CPU_Interrupt_stack_high - 80012c4: 58 43 00 00 sw (r2+0),r3 (char *) _CPU_Interrupt_stack_low; Stack_check_Dope_stack(&Stack_check_Interrupt_stack); 80012c8: 34 02 00 a5 mvi r2,165 80012cc: f8 00 3b ba calli 80101b4 } #endif Stack_check_Initialized = 1; 80012d0: 78 01 08 01 mvhi r1,0x801 80012d4: 38 21 77 04 ori r1,r1,0x7704 80012d8: 34 02 00 01 mvi r2,1 80012dc: 58 22 00 00 sw (r1+0),r2 } 80012e0: 2b 9d 00 04 lw ra,(sp+4) 80012e4: 37 9c 00 04 addi sp,sp,4 80012e8: c3 a0 00 00 ret =============================================================================== 08006034 <_CORE_RWLock_Release>: */ CORE_RWLock_Status _CORE_RWLock_Release( CORE_RWLock_Control *the_rwlock ) { 8006034: 37 9c ff f4 addi sp,sp,-12 8006038: 5b 8b 00 0c sw (sp+12),r11 800603c: 5b 8c 00 08 sw (sp+8),r12 8006040: 5b 9d 00 04 sw (sp+4),ra 8006044: b8 20 58 00 mv r11,r1 ISR_Level level; Thread_Control *executing = _Thread_Executing; 8006048: 78 01 08 01 mvhi r1,0x801 800604c: 38 21 8d 74 ori r1,r1,0x8d74 8006050: 28 22 00 0c lw r2,(r1+12) * Otherwise, we have to block. * If locked for reading and no waiters, then OK to read. * If any thread is waiting, then we wait. */ _ISR_Disable( level ); 8006054: 90 00 08 00 rcsr r1,IE 8006058: 34 03 ff fe mvi r3,-2 800605c: a0 23 18 00 and r3,r1,r3 8006060: d0 03 00 00 wcsr IE,r3 if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){ 8006064: 29 63 00 44 lw r3,(r11+68) 8006068: 5c 60 00 05 bne r3,r0,800607c <_CORE_RWLock_Release+0x48> _ISR_Enable( level ); 800606c: d0 01 00 00 wcsr IE,r1 executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE; 8006070: 34 01 00 02 mvi r1,2 8006074: 58 41 00 34 sw (r2+52),r1 return CORE_RWLOCK_SUCCESSFUL; 8006078: e0 00 00 26 bi 8006110 <_CORE_RWLock_Release+0xdc> } if ( the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_READING ) { 800607c: 34 04 00 01 mvi r4,1 8006080: 5c 64 00 07 bne r3,r4,800609c <_CORE_RWLock_Release+0x68> the_rwlock->number_of_readers -= 1; 8006084: 29 63 00 48 lw r3,(r11+72) 8006088: 34 63 ff ff addi r3,r3,-1 800608c: 59 63 00 48 sw (r11+72),r3 if ( the_rwlock->number_of_readers != 0 ) { 8006090: 44 60 00 03 be r3,r0,800609c <_CORE_RWLock_Release+0x68> /* must be unlocked again */ _ISR_Enable( level ); 8006094: d0 01 00 00 wcsr IE,r1 return CORE_RWLOCK_SUCCESSFUL; 8006098: e0 00 00 1e bi 8006110 <_CORE_RWLock_Release+0xdc> } } /* CORE_RWLOCK_LOCKED_FOR_WRITING or READING with readers */ executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL; 800609c: 58 40 00 34 sw (r2+52),r0 /* * Implicitly transition to "unlocked" and find another thread interested * in obtaining this rwlock. */ the_rwlock->current_state = CORE_RWLOCK_UNLOCKED; 80060a0: 59 60 00 44 sw (r11+68),r0 _ISR_Enable( level ); 80060a4: d0 01 00 00 wcsr IE,r1 next = _Thread_queue_Dequeue( &the_rwlock->Wait_queue ); 80060a8: b9 60 08 00 mv r1,r11 80060ac: f8 00 07 a7 calli 8007f48 <_Thread_queue_Dequeue> if ( next ) { 80060b0: 44 20 00 18 be r1,r0,8006110 <_CORE_RWLock_Release+0xdc> if ( next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) { 80060b4: 28 22 00 30 lw r2,(r1+48) 80060b8: 34 01 00 01 mvi r1,1 80060bc: 5c 41 00 04 bne r2,r1,80060cc <_CORE_RWLock_Release+0x98> the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_WRITING; 80060c0: 34 01 00 02 mvi r1,2 80060c4: 59 61 00 44 sw (r11+68),r1 return CORE_RWLOCK_SUCCESSFUL; 80060c8: e0 00 00 12 bi 8006110 <_CORE_RWLock_Release+0xdc> } /* * Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING */ the_rwlock->number_of_readers += 1; 80060cc: 29 62 00 48 lw r2,(r11+72) the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING; 80060d0: 59 61 00 44 sw (r11+68),r1 /* * Now see if more readers can be let go. */ while ( 1 ) { next = _Thread_queue_First( &the_rwlock->Wait_queue ); if ( !next || 80060d4: 34 0c 00 01 mvi r12,1 } /* * Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING */ the_rwlock->number_of_readers += 1; 80060d8: 34 42 00 01 addi r2,r2,1 80060dc: 59 62 00 48 sw (r11+72),r2 /* * Now see if more readers can be let go. */ while ( 1 ) { next = _Thread_queue_First( &the_rwlock->Wait_queue ); 80060e0: b9 60 08 00 mv r1,r11 80060e4: f8 00 09 20 calli 8008564 <_Thread_queue_First> 80060e8: b8 20 10 00 mv r2,r1 if ( !next || 80060ec: 44 20 00 09 be r1,r0,8006110 <_CORE_RWLock_Release+0xdc> 80060f0: 28 21 00 30 lw r1,(r1+48) 80060f4: 44 2c 00 07 be r1,r12,8006110 <_CORE_RWLock_Release+0xdc> <== NEVER TAKEN next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) return CORE_RWLOCK_SUCCESSFUL; the_rwlock->number_of_readers += 1; 80060f8: 29 61 00 48 lw r1,(r11+72) 80060fc: 34 21 00 01 addi r1,r1,1 8006100: 59 61 00 48 sw (r11+72),r1 _Thread_queue_Extract( &the_rwlock->Wait_queue, next ); 8006104: b9 60 08 00 mv r1,r11 8006108: f8 00 08 cd calli 800843c <_Thread_queue_Extract> } 800610c: e3 ff ff f5 bi 80060e0 <_CORE_RWLock_Release+0xac> } /* indentation is to match _ISR_Disable at top */ return CORE_RWLOCK_SUCCESSFUL; } 8006110: 34 01 00 00 mvi r1,0 8006114: 2b 9d 00 04 lw ra,(sp+4) 8006118: 2b 8b 00 0c lw r11,(sp+12) 800611c: 2b 8c 00 08 lw r12,(sp+8) 8006120: 37 9c 00 0c addi sp,sp,12 8006124: c3 a0 00 00 ret =============================================================================== 08006128 <_CORE_RWLock_Timeout>: void _CORE_RWLock_Timeout( Objects_Id id, void *ignored ) { 8006128: 37 9c ff f8 addi sp,sp,-8 800612c: 5b 9d 00 04 sw (sp+4),ra Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); 8006130: 37 82 00 08 addi r2,sp,8 8006134: f8 00 06 98 calli 8007b94 <_Thread_Get> switch ( location ) { 8006138: 2b 82 00 08 lw r2,(sp+8) 800613c: 5c 40 00 07 bne r2,r0,8006158 <_CORE_RWLock_Timeout+0x30> <== NEVER TAKEN #if defined(RTEMS_MULTIPROCESSING) case OBJECTS_REMOTE: /* impossible */ #endif break; case OBJECTS_LOCAL: _Thread_queue_Process_timeout( the_thread ); 8006140: f8 00 09 63 calli 80086cc <_Thread_queue_Process_timeout> */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; 8006144: 78 01 08 01 mvhi r1,0x801 8006148: 38 21 88 a8 ori r1,r1,0x88a8 800614c: 28 22 00 00 lw r2,(r1+0) 8006150: 34 42 ff ff addi r2,r2,-1 8006154: 58 22 00 00 sw (r1+0),r2 _Thread_Unnest_dispatch(); break; } } 8006158: 2b 9d 00 04 lw ra,(sp+4) 800615c: 37 9c 00 08 addi sp,sp,8 8006160: c3 a0 00 00 ret =============================================================================== 08015644 <_CORE_message_queue_Broadcast>: Objects_Id id __attribute__((unused)), CORE_message_queue_API_mp_support_callout api_message_queue_mp_support __attribute__((unused)), #endif uint32_t *count ) { 8015644: 37 9c ff e4 addi sp,sp,-28 8015648: 5b 8b 00 1c sw (sp+28),r11 801564c: 5b 8c 00 18 sw (sp+24),r12 8015650: 5b 8d 00 14 sw (sp+20),r13 8015654: 5b 8e 00 10 sw (sp+16),r14 8015658: 5b 8f 00 0c sw (sp+12),r15 801565c: 5b 90 00 08 sw (sp+8),r16 8015660: 5b 9d 00 04 sw (sp+4),ra 8015664: b8 40 80 00 mv r16,r2 Thread_Control *the_thread; uint32_t number_broadcasted; Thread_Wait_information *waitp; if ( size > the_message_queue->maximum_message_size ) { 8015668: 28 22 00 4c lw r2,(r1+76) Objects_Id id __attribute__((unused)), CORE_message_queue_API_mp_support_callout api_message_queue_mp_support __attribute__((unused)), #endif uint32_t *count ) { 801566c: b8 20 58 00 mv r11,r1 8015670: b8 60 68 00 mv r13,r3 8015674: b8 c0 78 00 mv r15,r6 Thread_Control *the_thread; uint32_t number_broadcasted; Thread_Wait_information *waitp; if ( size > the_message_queue->maximum_message_size ) { return CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE; 8015678: 34 01 00 01 mvi r1,1 { Thread_Control *the_thread; uint32_t number_broadcasted; Thread_Wait_information *waitp; if ( size > the_message_queue->maximum_message_size ) { 801567c: 54 62 00 13 bgu r3,r2,80156c8 <_CORE_message_queue_Broadcast+0x84><== NEVER TAKEN * NOTE: This check is critical because threads can block on * send and receive and this ensures that we are broadcasting * the message to threads waiting to receive -- not to send. */ if ( the_message_queue->number_of_pending_messages != 0 ) { 8015680: 29 61 00 48 lw r1,(r11+72) 8015684: 34 0c 00 00 mvi r12,0 8015688: 44 20 00 0a be r1,r0,80156b0 <_CORE_message_queue_Broadcast+0x6c> *count = 0; 801568c: 58 c0 00 00 sw (r6+0),r0 8015690: e0 00 00 0d bi 80156c4 <_CORE_message_queue_Broadcast+0x80> const void *source, void *destination, size_t size ) { memcpy(destination, source, size); 8015694: 29 c1 00 2c lw r1,(r14+44) 8015698: ba 00 10 00 mv r2,r16 801569c: b9 a0 18 00 mv r3,r13 80156a0: f8 00 2a 6d calli 8020054 buffer, waitp->return_argument_second.mutable_object, size ); *(size_t *) the_thread->Wait.return_argument = size; 80156a4: 29 c1 00 28 lw r1,(r14+40) */ number_broadcasted = 0; while ((the_thread = _Thread_queue_Dequeue(&the_message_queue->Wait_queue))) { waitp = &the_thread->Wait; number_broadcasted += 1; 80156a8: 35 8c 00 01 addi r12,r12,1 buffer, waitp->return_argument_second.mutable_object, size ); *(size_t *) the_thread->Wait.return_argument = size; 80156ac: 58 2d 00 00 sw (r1+0),r13 /* * There must be no pending messages if there is a thread waiting to * receive a message. */ number_broadcasted = 0; while ((the_thread = 80156b0: b9 60 08 00 mv r1,r11 80156b4: f8 00 0d 47 calli 8018bd0 <_Thread_queue_Dequeue> 80156b8: b8 20 70 00 mv r14,r1 80156bc: 5c 20 ff f6 bne r1,r0,8015694 <_CORE_message_queue_Broadcast+0x50> if ( !_Objects_Is_local_id( the_thread->Object.id ) ) (*api_message_queue_mp_support) ( the_thread, id ); #endif } *count = number_broadcasted; 80156c0: 59 ec 00 00 sw (r15+0),r12 return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL; 80156c4: 34 01 00 00 mvi r1,0 } 80156c8: 2b 9d 00 04 lw ra,(sp+4) 80156cc: 2b 8b 00 1c lw r11,(sp+28) 80156d0: 2b 8c 00 18 lw r12,(sp+24) 80156d4: 2b 8d 00 14 lw r13,(sp+20) 80156d8: 2b 8e 00 10 lw r14,(sp+16) 80156dc: 2b 8f 00 0c lw r15,(sp+12) 80156e0: 2b 90 00 08 lw r16,(sp+8) 80156e4: 37 9c 00 1c addi sp,sp,28 80156e8: c3 a0 00 00 ret =============================================================================== 0800dabc <_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 ) { 800dabc: 37 9c ff e4 addi sp,sp,-28 800dac0: 5b 8b 00 1c sw (sp+28),r11 800dac4: 5b 8c 00 18 sw (sp+24),r12 800dac8: 5b 8d 00 14 sw (sp+20),r13 800dacc: 5b 8e 00 10 sw (sp+16),r14 800dad0: 5b 8f 00 0c sw (sp+12),r15 800dad4: 5b 90 00 08 sw (sp+8),r16 800dad8: 5b 9d 00 04 sw (sp+4),ra 800dadc: b8 20 58 00 mv r11,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; 800dae0: 58 20 00 48 sw (r1+72),r0 the_message_queue->maximum_message_size = maximum_message_size; 800dae4: 58 24 00 4c sw (r1+76),r4 CORE_message_queue_Control *the_message_queue, CORE_message_queue_Notify_Handler the_handler, void *the_argument ) { the_message_queue->notify_handler = the_handler; 800dae8: 58 20 00 60 sw (r1+96),r0 the_message_queue->notify_argument = the_argument; 800daec: 58 20 00 64 sw (r1+100),r0 ) { size_t message_buffering_required; size_t allocated_message_size; the_message_queue->maximum_pending_messages = maximum_pending_messages; 800daf0: 59 63 00 44 sw (r11+68),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)) { 800daf4: 20 81 00 03 andi r1,r4,0x3 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 ) { 800daf8: b8 40 80 00 mv r16,r2 800dafc: b8 60 70 00 mv r14,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)) { 800db00: b8 80 60 00 mv r12,r4 800db04: 44 20 00 06 be r1,r0,800db1c <_CORE_message_queue_Initialize+0x60> allocated_message_size += sizeof(uint32_t); 800db08: 34 8c 00 04 addi r12,r4,4 allocated_message_size &= ~(sizeof(uint32_t) - 1); 800db0c: 34 01 ff fc mvi r1,-4 800db10: a1 81 60 00 and r12,r12,r1 } if (allocated_message_size < maximum_message_size) return false; 800db14: 34 0d 00 00 mvi r13,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) 800db18: 54 8c 00 1c bgu r4,r12,800db88 <_CORE_message_queue_Initialize+0xcc><== 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)); 800db1c: 35 8f 00 14 addi r15,r12,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 * 800db20: b9 e0 08 00 mv r1,r15 800db24: b9 c0 10 00 mv r2,r14 800db28: f8 00 5e 7d calli 802551c <__mulsi3> (allocated_message_size + sizeof(CORE_message_queue_Buffer_control)); if (message_buffering_required < allocated_message_size) return false; 800db2c: 34 0d 00 00 mvi r13,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) 800db30: 55 81 00 16 bgu r12,r1,800db88 <_CORE_message_queue_Initialize+0xcc><== NEVER TAKEN /* * Attempt to allocate the message memory */ the_message_queue->message_buffers = (CORE_message_queue_Buffer *) _Workspace_Allocate( message_buffering_required ); 800db34: f8 00 0e 9c calli 80115a4 <_Workspace_Allocate> return false; /* * Attempt to allocate the message memory */ the_message_queue->message_buffers = (CORE_message_queue_Buffer *) 800db38: 59 61 00 5c sw (r11+92),r1 _Workspace_Allocate( message_buffering_required ); 800db3c: b8 20 28 00 mv r5,r1 if (the_message_queue->message_buffers == 0) 800db40: 44 20 00 12 be r1,r0,800db88 <_CORE_message_queue_Initialize+0xcc> /* * Initialize the pool of inactive messages, pending messages, * and set of waiting threads. */ _Chain_Initialize ( 800db44: b8 a0 10 00 mv r2,r5 800db48: 35 61 00 68 addi r1,r11,104 800db4c: b9 c0 18 00 mv r3,r14 800db50: b9 e0 20 00 mv r4,r15 800db54: f8 00 19 e5 calli 80142e8 <_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 ); 800db58: 35 61 00 54 addi r1,r11,84 head->next = tail; 800db5c: 59 61 00 50 sw (r11+80),r1 */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { Chain_Node *head = _Chain_Head( the_chain ); 800db60: 35 61 00 50 addi r1,r11,80 Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; head->previous = NULL; tail->previous = head; 800db64: 59 61 00 58 sw (r11+88),r1 { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; head->previous = NULL; 800db68: 59 60 00 54 sw (r11+84),r0 allocated_message_size + sizeof( CORE_message_queue_Buffer_control ) ); _Chain_Initialize_empty( &the_message_queue->Pending_messages ); _Thread_queue_Initialize( 800db6c: 2a 02 00 00 lw r2,(r16+0) 800db70: b9 60 08 00 mv r1,r11 800db74: 34 03 00 80 mvi r3,128 800db78: 64 42 00 01 cmpei r2,r2,1 800db7c: 34 04 00 06 mvi r4,6 800db80: f8 00 0b 59 calli 80108e4 <_Thread_queue_Initialize> THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO, STATES_WAITING_FOR_MESSAGE, CORE_MESSAGE_QUEUE_STATUS_TIMEOUT ); return true; 800db84: 34 0d 00 01 mvi r13,1 } 800db88: b9 a0 08 00 mv r1,r13 800db8c: 2b 9d 00 04 lw ra,(sp+4) 800db90: 2b 8b 00 1c lw r11,(sp+28) 800db94: 2b 8c 00 18 lw r12,(sp+24) 800db98: 2b 8d 00 14 lw r13,(sp+20) 800db9c: 2b 8e 00 10 lw r14,(sp+16) 800dba0: 2b 8f 00 0c lw r15,(sp+12) 800dba4: 2b 90 00 08 lw r16,(sp+8) 800dba8: 37 9c 00 1c addi sp,sp,28 800dbac: c3 a0 00 00 ret =============================================================================== 0800dbb0 <_CORE_message_queue_Seize>: void *buffer, size_t *size_p, bool wait, Watchdog_Interval timeout ) { 800dbb0: 37 9c ff f0 addi sp,sp,-16 800dbb4: 5b 8b 00 10 sw (sp+16),r11 800dbb8: 5b 8c 00 0c sw (sp+12),r12 800dbbc: 5b 8d 00 08 sw (sp+8),r13 800dbc0: 5b 9d 00 04 sw (sp+4),ra ISR_Level level; CORE_message_queue_Buffer_control *the_message; Thread_Control *executing; executing = _Thread_Executing; 800dbc4: 78 07 08 02 mvhi r7,0x802 800dbc8: 38 e7 8f 4c ori r7,r7,0x8f4c 800dbcc: 28 e7 00 0c lw r7,(r7+12) void *buffer, size_t *size_p, bool wait, Watchdog_Interval timeout ) { 800dbd0: b8 20 58 00 mv r11,r1 800dbd4: 20 a5 00 ff andi r5,r5,0xff 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; 800dbd8: 58 e0 00 34 sw (r7+52),r0 void *buffer, size_t *size_p, bool wait, Watchdog_Interval timeout ) { 800dbdc: b8 60 08 00 mv r1,r3 CORE_message_queue_Buffer_control *the_message; Thread_Control *executing; executing = _Thread_Executing; executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL; _ISR_Disable( level ); 800dbe0: 90 00 40 00 rcsr r8,IE 800dbe4: 34 03 ff fe mvi r3,-2 800dbe8: a1 03 18 00 and r3,r8,r3 800dbec: d0 03 00 00 wcsr IE,r3 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 ); } 800dbf0: 29 6c 00 50 lw r12,(r11+80) RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); 800dbf4: 35 63 00 54 addi r3,r11,84 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected( Chain_Control *the_chain ) { if ( !_Chain_Is_empty(the_chain)) 800dbf8: 45 83 00 07 be r12,r3,800dc14 <_CORE_message_queue_Seize+0x64> Chain_Control *the_chain ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *old_first = head->next; Chain_Node *new_first = old_first->next; 800dbfc: 29 83 00 00 lw r3,(r12+0) */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_first_unprotected( Chain_Control *the_chain ) { Chain_Node *head = _Chain_Head( the_chain ); 800dc00: 35 69 00 50 addi r9,r11,80 Chain_Node *old_first = head->next; Chain_Node *new_first = old_first->next; head->next = new_first; 800dc04: 59 63 00 50 sw (r11+80),r3 new_first->previous = head; 800dc08: 58 69 00 04 sw (r3+4),r9 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 ) { 800dc0c: 5d 80 00 04 bne r12,r0,800dc1c <_CORE_message_queue_Seize+0x6c><== ALWAYS TAKEN 800dc10: e0 00 00 25 bi 800dca4 <_CORE_message_queue_Seize+0xf4> <== NOT EXECUTED ) { if ( !_Chain_Is_empty(the_chain)) return _Chain_Get_first_unprotected(the_chain); else return NULL; 800dc14: 34 0c 00 00 mvi r12,0 800dc18: e0 00 00 23 bi 800dca4 <_CORE_message_queue_Seize+0xf4> the_message_queue->number_of_pending_messages -= 1; 800dc1c: 29 62 00 48 lw r2,(r11+72) 800dc20: 34 42 ff ff addi r2,r2,-1 800dc24: 59 62 00 48 sw (r11+72),r2 _ISR_Enable( level ); 800dc28: d0 08 00 00 wcsr IE,r8 *size_p = the_message->Contents.size; 800dc2c: 29 83 00 0c lw r3,(r12+12) _Thread_Executing->Wait.count = 800dc30: 78 02 08 02 mvhi r2,0x802 800dc34: 38 42 8f 4c ori r2,r2,0x8f4c 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; 800dc38: 58 83 00 00 sw (r4+0),r3 _Thread_Executing->Wait.count = 800dc3c: 29 84 00 08 lw r4,(r12+8) 800dc40: 28 42 00 0c lw r2,(r2+12) _CORE_message_queue_Get_message_priority( the_message ); _CORE_message_queue_Copy_buffer( the_message->Contents.buffer, 800dc44: 35 8d 00 10 addi r13,r12,16 if ( the_message != NULL ) { the_message_queue->number_of_pending_messages -= 1; _ISR_Enable( level ); *size_p = the_message->Contents.size; _Thread_Executing->Wait.count = 800dc48: 58 44 00 24 sw (r2+36),r4 const void *source, void *destination, size_t size ) { memcpy(destination, source, size); 800dc4c: b9 a0 10 00 mv r2,r13 800dc50: f8 00 27 9b calli 8017abc * 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 ); 800dc54: b9 60 08 00 mv r1,r11 800dc58: f8 00 09 c5 calli 801036c <_Thread_queue_Dequeue> 800dc5c: b8 20 20 00 mv r4,r1 if ( !the_thread ) { 800dc60: 5c 20 00 05 bne r1,r0,800dc74 <_CORE_message_queue_Seize+0xc4> 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 ); 800dc64: 35 61 00 68 addi r1,r11,104 800dc68: b9 80 10 00 mv r2,r12 800dc6c: fb ff ff 64 calli 800d9fc <_Chain_Append> _CORE_message_queue_Free_message_buffer( the_message_queue, the_message ); return; 800dc70: e0 00 00 1e bi 800dce8 <_CORE_message_queue_Seize+0x138> CORE_message_queue_Buffer_control *the_message, int priority ) { #if defined(RTEMS_SCORE_COREMSG_ENABLE_MESSAGE_PRIORITY) the_message->priority = priority; 800dc74: 28 21 00 24 lw r1,(r1+36) */ _CORE_message_queue_Set_message_priority( the_message, the_thread->Wait.count ); the_message->Contents.size = (size_t) the_thread->Wait.option; 800dc78: 28 83 00 30 lw r3,(r4+48) const void *source, void *destination, size_t size ) { memcpy(destination, source, size); 800dc7c: 28 82 00 2c lw r2,(r4+44) CORE_message_queue_Buffer_control *the_message, int priority ) { #if defined(RTEMS_SCORE_COREMSG_ENABLE_MESSAGE_PRIORITY) the_message->priority = priority; 800dc80: 59 81 00 08 sw (r12+8),r1 800dc84: 59 83 00 0c sw (r12+12),r3 const void *source, void *destination, size_t size ) { memcpy(destination, source, size); 800dc88: b9 a0 08 00 mv r1,r13 800dc8c: f8 00 27 8c calli 8017abc the_thread->Wait.return_argument_second.immutable_object, the_message->Contents.buffer, the_message->Contents.size ); _CORE_message_queue_Insert_message( 800dc90: 29 83 00 08 lw r3,(r12+8) 800dc94: b9 60 08 00 mv r1,r11 800dc98: b9 80 10 00 mv r2,r12 800dc9c: f8 00 19 a0 calli 801431c <_CORE_message_queue_Insert_message> the_message_queue, the_message, _CORE_message_queue_Get_message_priority( the_message ) ); return; 800dca0: e0 00 00 12 bi 800dce8 <_CORE_message_queue_Seize+0x138> } #endif } if ( !wait ) { 800dca4: 5c ac 00 05 bne r5,r12,800dcb8 <_CORE_message_queue_Seize+0x108> _ISR_Enable( level ); 800dca8: d0 08 00 00 wcsr IE,r8 executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT; 800dcac: 34 01 00 04 mvi r1,4 800dcb0: 58 e1 00 34 sw (r7+52),r1 return; 800dcb4: e0 00 00 0d bi 800dce8 <_CORE_message_queue_Seize+0x138> 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; 800dcb8: 34 03 00 01 mvi r3,1 800dcbc: 59 63 00 30 sw (r11+48),r3 } _Thread_queue_Enter_critical_section( &the_message_queue->Wait_queue ); executing->Wait.queue = &the_message_queue->Wait_queue; 800dcc0: 58 eb 00 44 sw (r7+68),r11 executing->Wait.id = id; 800dcc4: 58 e2 00 20 sw (r7+32),r2 executing->Wait.return_argument_second.mutable_object = buffer; 800dcc8: 58 e1 00 2c sw (r7+44),r1 executing->Wait.return_argument = size_p; 800dccc: 58 e4 00 28 sw (r7+40),r4 /* Wait.count will be filled in with the message priority */ _ISR_Enable( level ); 800dcd0: d0 08 00 00 wcsr IE,r8 _Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout ); 800dcd4: 78 03 08 01 mvhi r3,0x801 800dcd8: b9 60 08 00 mv r1,r11 800dcdc: b8 c0 10 00 mv r2,r6 800dce0: 38 63 0a 24 ori r3,r3,0xa24 800dce4: f8 00 0a 15 calli 8010538 <_Thread_queue_Enqueue_with_handler> } 800dce8: 2b 9d 00 04 lw ra,(sp+4) 800dcec: 2b 8b 00 10 lw r11,(sp+16) 800dcf0: 2b 8c 00 0c lw r12,(sp+12) 800dcf4: 2b 8d 00 08 lw r13,(sp+8) 800dcf8: 37 9c 00 10 addi sp,sp,16 800dcfc: c3 a0 00 00 ret =============================================================================== 08004d18 <_CORE_mutex_Seize>: Objects_Id _id, bool _wait, Watchdog_Interval _timeout, ISR_Level _level ) { 8004d18: 37 9c ff e8 addi sp,sp,-24 8004d1c: 5b 8b 00 14 sw (sp+20),r11 8004d20: 5b 8c 00 10 sw (sp+16),r12 8004d24: 5b 8d 00 0c sw (sp+12),r13 8004d28: 5b 8e 00 08 sw (sp+8),r14 8004d2c: 5b 9d 00 04 sw (sp+4),ra 8004d30: b8 20 58 00 mv r11,r1 _CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level ); 8004d34: 78 01 08 01 mvhi r1,0x801 8004d38: 38 21 99 60 ori r1,r1,0x9960 8004d3c: 28 21 00 00 lw r1,(r1+0) Objects_Id _id, bool _wait, Watchdog_Interval _timeout, ISR_Level _level ) { 8004d40: 5b 85 00 18 sw (sp+24),r5 8004d44: b8 40 70 00 mv r14,r2 8004d48: b8 80 68 00 mv r13,r4 8004d4c: 20 6c 00 ff andi r12,r3,0xff _CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level ); 8004d50: 44 20 00 0b be r1,r0,8004d7c <_CORE_mutex_Seize+0x64> 8004d54: 45 80 00 0a be r12,r0,8004d7c <_CORE_mutex_Seize+0x64> <== NEVER TAKEN 8004d58: 78 01 08 01 mvhi r1,0x801 8004d5c: 38 21 9a d8 ori r1,r1,0x9ad8 8004d60: 28 21 00 00 lw r1,(r1+0) 8004d64: 34 02 00 01 mvi r2,1 8004d68: 50 41 00 05 bgeu r2,r1,8004d7c <_CORE_mutex_Seize+0x64> 8004d6c: 34 01 00 00 mvi r1,0 8004d70: 34 02 00 00 mvi r2,0 8004d74: 34 03 00 12 mvi r3,18 8004d78: f8 00 02 0a calli 80055a0 <_Internal_error_Occurred> 8004d7c: b9 60 08 00 mv r1,r11 8004d80: 37 82 00 18 addi r2,sp,24 8004d84: f8 00 25 f5 calli 800e558 <_CORE_mutex_Seize_interrupt_trylock> 8004d88: 44 20 00 19 be r1,r0,8004dec <_CORE_mutex_Seize+0xd4> 8004d8c: 78 01 08 01 mvhi r1,0x801 8004d90: 38 21 9e 2c ori r1,r1,0x9e2c 8004d94: 5d 80 00 07 bne r12,r0,8004db0 <_CORE_mutex_Seize+0x98> 8004d98: 2b 82 00 18 lw r2,(sp+24) 8004d9c: d0 02 00 00 wcsr IE,r2 8004da0: 28 21 00 0c lw r1,(r1+12) 8004da4: 34 02 00 01 mvi r2,1 8004da8: 58 22 00 34 sw (r1+52),r2 8004dac: e0 00 00 10 bi 8004dec <_CORE_mutex_Seize+0xd4> 8004db0: 28 21 00 0c lw r1,(r1+12) 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; 8004db4: 34 02 00 01 mvi r2,1 8004db8: 59 62 00 30 sw (r11+48),r2 8004dbc: 58 2b 00 44 sw (r1+68),r11 8004dc0: 58 2e 00 20 sw (r1+32),r14 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 8004dc4: 78 01 08 01 mvhi r1,0x801 8004dc8: 38 21 99 60 ori r1,r1,0x9960 8004dcc: 28 22 00 00 lw r2,(r1+0) 8004dd0: 34 42 00 01 addi r2,r2,1 8004dd4: 58 22 00 00 sw (r1+0),r2 8004dd8: 2b 81 00 18 lw r1,(sp+24) 8004ddc: d0 01 00 00 wcsr IE,r1 8004de0: b9 60 08 00 mv r1,r11 8004de4: b9 a0 10 00 mv r2,r13 8004de8: fb ff ff ab calli 8004c94 <_CORE_mutex_Seize_interrupt_blocking> } 8004dec: 2b 9d 00 04 lw ra,(sp+4) 8004df0: 2b 8b 00 14 lw r11,(sp+20) 8004df4: 2b 8c 00 10 lw r12,(sp+16) 8004df8: 2b 8d 00 0c lw r13,(sp+12) 8004dfc: 2b 8e 00 08 lw r14,(sp+8) 8004e00: 37 9c 00 18 addi sp,sp,24 8004e04: c3 a0 00 00 ret =============================================================================== 08004f80 <_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 ) { 8004f80: 37 9c ff f8 addi sp,sp,-8 8004f84: 5b 8b 00 08 sw (sp+8),r11 8004f88: 5b 9d 00 04 sw (sp+4),ra 8004f8c: b8 20 58 00 mv r11,r1 ISR_Level level; CORE_semaphore_Status status; status = CORE_SEMAPHORE_STATUS_SUCCESSFUL; if ( (the_thread = _Thread_queue_Dequeue(&the_semaphore->Wait_queue)) ) { 8004f90: f8 00 07 64 calli 8006d20 <_Thread_queue_Dequeue> { Thread_Control *the_thread; ISR_Level level; CORE_semaphore_Status status; status = CORE_SEMAPHORE_STATUS_SUCCESSFUL; 8004f94: 34 02 00 00 mvi r2,0 if ( (the_thread = _Thread_queue_Dequeue(&the_semaphore->Wait_queue)) ) { 8004f98: 5c 20 00 0d bne r1,r0,8004fcc <_CORE_semaphore_Surrender+0x4c> if ( !_Objects_Is_local_id( the_thread->Object.id ) ) (*api_semaphore_mp_support) ( the_thread, id ); #endif } else { _ISR_Disable( level ); 8004f9c: 90 00 08 00 rcsr r1,IE 8004fa0: 34 02 ff fe mvi r2,-2 8004fa4: a0 22 10 00 and r2,r1,r2 8004fa8: d0 02 00 00 wcsr IE,r2 if ( the_semaphore->count < the_semaphore->Attributes.maximum_count ) 8004fac: 29 63 00 48 lw r3,(r11+72) 8004fb0: 29 64 00 40 lw r4,(r11+64) the_semaphore->count += 1; else status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED; 8004fb4: 34 02 00 04 mvi r2,4 (*api_semaphore_mp_support) ( the_thread, id ); #endif } else { _ISR_Disable( level ); if ( the_semaphore->count < the_semaphore->Attributes.maximum_count ) 8004fb8: 50 64 00 04 bgeu r3,r4,8004fc8 <_CORE_semaphore_Surrender+0x48><== NEVER TAKEN the_semaphore->count += 1; 8004fbc: 34 63 00 01 addi r3,r3,1 8004fc0: 59 63 00 48 sw (r11+72),r3 { Thread_Control *the_thread; ISR_Level level; CORE_semaphore_Status status; status = CORE_SEMAPHORE_STATUS_SUCCESSFUL; 8004fc4: 34 02 00 00 mvi r2,0 _ISR_Disable( level ); if ( the_semaphore->count < the_semaphore->Attributes.maximum_count ) the_semaphore->count += 1; else status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED; _ISR_Enable( level ); 8004fc8: d0 01 00 00 wcsr IE,r1 } return status; } 8004fcc: b8 40 08 00 mv r1,r2 8004fd0: 2b 9d 00 04 lw ra,(sp+4) 8004fd4: 2b 8b 00 08 lw r11,(sp+8) 8004fd8: 37 9c 00 08 addi sp,sp,8 8004fdc: c3 a0 00 00 ret =============================================================================== 0800d954 <_Event_Surrender>: */ void _Event_Surrender( Thread_Control *the_thread ) { 800d954: 37 9c ff f8 addi sp,sp,-8 800d958: 5b 8b 00 08 sw (sp+8),r11 800d95c: 5b 9d 00 04 sw (sp+4),ra 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 ]; 800d960: 28 24 01 1c lw r4,(r1+284) option_set = (rtems_option) the_thread->Wait.option; 800d964: 28 28 00 30 lw r8,(r1+48) */ void _Event_Surrender( Thread_Control *the_thread ) { 800d968: b8 20 58 00 mv r11,r1 api = the_thread->API_Extensions[ THREAD_API_RTEMS ]; option_set = (rtems_option) the_thread->Wait.option; _ISR_Disable( level ); 800d96c: 90 00 08 00 rcsr r1,IE 800d970: 34 07 ff fe mvi r7,-2 800d974: a0 27 38 00 and r7,r1,r7 800d978: d0 07 00 00 wcsr IE,r7 pending_events = api->pending_events; 800d97c: 28 85 00 00 lw r5,(r4+0) event_condition = (rtems_event_set) the_thread->Wait.count; 800d980: 29 66 00 24 lw r6,(r11+36) RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Get( rtems_event_set the_event_set, rtems_event_set the_event_condition ) { return ( the_event_set & the_event_condition ); 800d984: a0 c5 10 00 and r2,r6,r5 seized_events = _Event_sets_Get( pending_events, event_condition ); /* * No events were seized in this operation */ if ( _Event_sets_Is_empty( seized_events ) ) { 800d988: 5c 40 00 03 bne r2,r0,800d994 <_Event_Surrender+0x40> _ISR_Enable( level ); 800d98c: d0 01 00 00 wcsr IE,r1 return; 800d990: e0 00 00 3d bi 800da84 <_Event_Surrender+0x130> /* * 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() && 800d994: 78 03 08 01 mvhi r3,0x801 800d998: 38 63 9e 2c ori r3,r3,0x9e2c 800d99c: 28 69 00 08 lw r9,(r3+8) 800d9a0: 45 20 00 1a be r9,r0,800da08 <_Event_Surrender+0xb4> 800d9a4: 28 63 00 0c lw r3,(r3+12) 800d9a8: 5d 63 00 18 bne r11,r3,800da08 <_Event_Surrender+0xb4> _Thread_Is_executing( the_thread ) && ((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) || 800d9ac: 78 03 08 01 mvhi r3,0x801 800d9b0: 38 63 a3 20 ori r3,r3,0xa320 800d9b4: 28 6a 00 00 lw r10,(r3+0) /* * 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 ) && 800d9b8: 34 09 00 02 mvi r9,2 800d9bc: 45 49 00 04 be r10,r9,800d9cc <_Event_Surrender+0x78> <== NEVER TAKEN ((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) || (_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) { 800d9c0: 28 69 00 00 lw r9,(r3+0) * 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) || 800d9c4: 34 03 00 01 mvi r3,1 800d9c8: 5d 23 00 10 bne r9,r3,800da08 <_Event_Surrender+0xb4> <== NEVER TAKEN (_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) { if ( seized_events == event_condition || _Options_Is_any(option_set) ) { 800d9cc: 44 46 00 03 be r2,r6,800d9d8 <_Event_Surrender+0x84> <== ALWAYS TAKEN */ RTEMS_INLINE_ROUTINE bool _Options_Is_any ( rtems_option option_set ) { return (option_set & RTEMS_EVENT_ANY) ? true : false; 800d9d0: 21 08 00 02 andi r8,r8,0x2 <== NOT EXECUTED 800d9d4: 45 00 00 0b be r8,r0,800da00 <_Event_Surrender+0xac> <== NOT EXECUTED 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) ); 800d9d8: a4 40 18 00 not r3,r2 800d9dc: a0 65 28 00 and r5,r3,r5 api->pending_events = _Event_sets_Clear( pending_events,seized_events ); the_thread->Wait.count = 0; *(rtems_event_set *)the_thread->Wait.return_argument = seized_events; 800d9e0: 29 63 00 28 lw r3,(r11+40) if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) && ((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) || (_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) { if ( seized_events == event_condition || _Options_Is_any(option_set) ) { api->pending_events = _Event_sets_Clear( pending_events,seized_events ); 800d9e4: 58 85 00 00 sw (r4+0),r5 the_thread->Wait.count = 0; 800d9e8: 59 60 00 24 sw (r11+36),r0 *(rtems_event_set *)the_thread->Wait.return_argument = seized_events; 800d9ec: 58 62 00 00 sw (r3+0),r2 _Event_Sync_state = THREAD_BLOCKING_OPERATION_SATISFIED; 800d9f0: 78 02 08 01 mvhi r2,0x801 800d9f4: 38 42 a3 20 ori r2,r2,0xa320 800d9f8: 34 03 00 03 mvi r3,3 800d9fc: 58 43 00 00 sw (r2+0),r3 } _ISR_Enable( level ); 800da00: d0 01 00 00 wcsr IE,r1 return; 800da04: e0 00 00 20 bi 800da84 <_Event_Surrender+0x130> */ RTEMS_INLINE_ROUTINE bool _States_Is_waiting_for_event ( States_Control the_states ) { return (the_states & STATES_WAITING_FOR_EVENT); 800da08: 29 63 00 10 lw r3,(r11+16) 800da0c: 20 63 01 00 andi r3,r3,0x100 } /* * Otherwise, this is a normal send to another thread */ if ( _States_Is_waiting_for_event( the_thread->current_state ) ) { 800da10: 44 60 00 1c be r3,r0,800da80 <_Event_Surrender+0x12c> if ( seized_events == event_condition || _Options_Is_any( option_set ) ) { 800da14: 44 46 00 03 be r2,r6,800da20 <_Event_Surrender+0xcc> 800da18: 21 08 00 02 andi r8,r8,0x2 800da1c: 45 00 00 19 be r8,r0,800da80 <_Event_Surrender+0x12c> <== NEVER TAKEN 800da20: a4 40 18 00 not r3,r2 800da24: a0 65 28 00 and r5,r3,r5 api->pending_events = _Event_sets_Clear( pending_events, seized_events ); the_thread->Wait.count = 0; *(rtems_event_set *)the_thread->Wait.return_argument = seized_events; 800da28: 29 63 00 28 lw r3,(r11+40) /* * Otherwise, this is a normal send to another thread */ if ( _States_Is_waiting_for_event( the_thread->current_state ) ) { if ( seized_events == event_condition || _Options_Is_any( option_set ) ) { api->pending_events = _Event_sets_Clear( pending_events, seized_events ); 800da2c: 58 85 00 00 sw (r4+0),r5 the_thread->Wait.count = 0; 800da30: 59 60 00 24 sw (r11+36),r0 *(rtems_event_set *)the_thread->Wait.return_argument = seized_events; 800da34: 58 62 00 00 sw (r3+0),r2 _ISR_Flash( level ); 800da38: d0 01 00 00 wcsr IE,r1 800da3c: d0 07 00 00 wcsr IE,r7 if ( !_Watchdog_Is_active( &the_thread->Timer ) ) { 800da40: 29 63 00 50 lw r3,(r11+80) 800da44: 34 02 00 02 mvi r2,2 800da48: 44 62 00 03 be r3,r2,800da54 <_Event_Surrender+0x100> _ISR_Enable( level ); 800da4c: d0 01 00 00 wcsr IE,r1 800da50: e0 00 00 06 bi 800da68 <_Event_Surrender+0x114> RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate( Watchdog_Control *the_watchdog ) { the_watchdog->state = WATCHDOG_REMOVE_IT; 800da54: 34 02 00 03 mvi r2,3 800da58: 59 62 00 50 sw (r11+80),r2 _Thread_Unblock( the_thread ); } else { _Watchdog_Deactivate( &the_thread->Timer ); _ISR_Enable( level ); 800da5c: d0 01 00 00 wcsr IE,r1 (void) _Watchdog_Remove( &the_thread->Timer ); 800da60: 35 61 00 48 addi r1,r11,72 800da64: fb ff e8 6e calli 8007c1c <_Watchdog_Remove> RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); 800da68: 78 03 08 01 mvhi r3,0x801 800da6c: 38 63 81 bc ori r3,r3,0x81bc 800da70: 28 62 00 00 lw r2,(r3+0) 800da74: b9 60 08 00 mv r1,r11 800da78: f8 00 05 6d calli 800f02c <_Thread_Clear_state> 800da7c: e0 00 00 02 bi 800da84 <_Event_Surrender+0x130> _Thread_Unblock( the_thread ); } return; } } _ISR_Enable( level ); 800da80: d0 01 00 00 wcsr IE,r1 } 800da84: 2b 9d 00 04 lw ra,(sp+4) 800da88: 2b 8b 00 08 lw r11,(sp+8) 800da8c: 37 9c 00 08 addi sp,sp,8 800da90: c3 a0 00 00 ret =============================================================================== 0800da94 <_Event_Timeout>: void _Event_Timeout( Objects_Id id, void *ignored ) { 800da94: 37 9c ff f8 addi sp,sp,-8 800da98: 5b 9d 00 04 sw (sp+4),ra Thread_Control *the_thread; Objects_Locations location; ISR_Level level; the_thread = _Thread_Get( id, &location ); 800da9c: 37 82 00 08 addi r2,sp,8 800daa0: fb ff e3 b3 calli 800696c <_Thread_Get> switch ( location ) { 800daa4: 2b 82 00 08 lw r2,(sp+8) 800daa8: 5c 40 00 1d bne r2,r0,800db1c <_Event_Timeout+0x88> <== NEVER TAKEN * * If it is not satisfied, then it is "nothing happened" and * this is the "timeout" transition. After a request is satisfied, * a timeout is not allowed to occur. */ _ISR_Disable( level ); 800daac: 90 00 18 00 rcsr r3,IE 800dab0: 34 02 ff fe mvi r2,-2 800dab4: a0 62 10 00 and r2,r3,r2 800dab8: d0 02 00 00 wcsr IE,r2 RTEMS_INLINE_ROUTINE bool _Thread_Is_executing ( const Thread_Control *the_thread ) { return ( the_thread == _Thread_Executing ); 800dabc: 78 02 08 01 mvhi r2,0x801 800dac0: 38 42 9e 2c ori r2,r2,0x9e2c return; } #endif the_thread->Wait.count = 0; if ( _Thread_Is_executing( the_thread ) ) { 800dac4: 28 42 00 0c lw r2,(r2+12) _ISR_Enable( level ); return; } #endif the_thread->Wait.count = 0; 800dac8: 58 20 00 24 sw (r1+36),r0 if ( _Thread_Is_executing( the_thread ) ) { 800dacc: 5c 22 00 08 bne r1,r2,800daec <_Event_Timeout+0x58> if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) 800dad0: 78 02 08 01 mvhi r2,0x801 800dad4: 38 42 a3 20 ori r2,r2,0xa320 800dad8: 28 45 00 00 lw r5,(r2+0) 800dadc: 34 04 00 01 mvi r4,1 800dae0: 5c a4 00 03 bne r5,r4,800daec <_Event_Timeout+0x58> _Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT; 800dae4: 34 04 00 02 mvi r4,2 800dae8: 58 44 00 00 sw (r2+0),r4 } the_thread->Wait.return_code = RTEMS_TIMEOUT; 800daec: 34 02 00 06 mvi r2,6 800daf0: 58 22 00 34 sw (r1+52),r2 _ISR_Enable( level ); 800daf4: d0 03 00 00 wcsr IE,r3 RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); 800daf8: 78 03 08 01 mvhi r3,0x801 800dafc: 38 63 81 bc ori r3,r3,0x81bc 800db00: 28 62 00 00 lw r2,(r3+0) 800db04: f8 00 05 4a calli 800f02c <_Thread_Clear_state> */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; 800db08: 78 01 08 01 mvhi r1,0x801 800db0c: 38 21 99 60 ori r1,r1,0x9960 800db10: 28 22 00 00 lw r2,(r1+0) 800db14: 34 42 ff ff addi r2,r2,-1 800db18: 58 22 00 00 sw (r1+0),r2 case OBJECTS_REMOTE: /* impossible */ #endif case OBJECTS_ERROR: break; } } 800db1c: 2b 9d 00 04 lw ra,(sp+4) 800db20: 37 9c 00 08 addi sp,sp,8 800db24: c3 a0 00 00 ret =============================================================================== 08009e28 <_Heap_Extend>: Heap_Control *heap, void *extend_area_begin_ptr, uintptr_t extend_area_size, uintptr_t *extended_size_ptr ) { 8009e28: 37 9c ff b8 addi sp,sp,-72 8009e2c: 5b 8b 00 40 sw (sp+64),r11 8009e30: 5b 8c 00 3c sw (sp+60),r12 8009e34: 5b 8d 00 38 sw (sp+56),r13 8009e38: 5b 8e 00 34 sw (sp+52),r14 8009e3c: 5b 8f 00 30 sw (sp+48),r15 8009e40: 5b 90 00 2c sw (sp+44),r16 8009e44: 5b 91 00 28 sw (sp+40),r17 8009e48: 5b 92 00 24 sw (sp+36),r18 8009e4c: 5b 93 00 20 sw (sp+32),r19 8009e50: 5b 94 00 1c sw (sp+28),r20 8009e54: 5b 95 00 18 sw (sp+24),r21 8009e58: 5b 96 00 14 sw (sp+20),r22 8009e5c: 5b 97 00 10 sw (sp+16),r23 8009e60: 5b 98 00 0c sw (sp+12),r24 8009e64: 5b 99 00 08 sw (sp+8),r25 8009e68: 5b 9d 00 04 sw (sp+4),ra 8009e6c: b8 40 70 00 mv r14,r2 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; 8009e70: 5b 80 00 48 sw (sp+72),r0 Heap_Block *extend_last_block = NULL; 8009e74: 5b 80 00 44 sw (sp+68),r0 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; 8009e78: b5 c3 68 00 add r13,r14,r3 Heap_Control *heap, void *extend_area_begin_ptr, uintptr_t extend_area_size, uintptr_t *extended_size_ptr ) { 8009e7c: b8 80 a0 00 mv r20,r4 8009e80: b8 20 58 00 mv r11,r1 8009e84: b8 60 10 00 mv r2,r3 Heap_Statistics *const stats = &heap->stats; Heap_Block *const first_block = heap->first_block; 8009e88: 28 35 00 20 lw r21,(r1+32) 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; uintptr_t const page_size = heap->page_size; 8009e8c: 28 36 00 10 lw r22,(r1+16) uintptr_t const min_block_size = heap->min_block_size; 8009e90: 28 24 00 14 lw r4,(r1+20) 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; 8009e94: 28 37 00 30 lw r23,(r1+48) 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; 8009e98: 34 0c 00 00 mvi r12,0 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 ) { 8009e9c: 55 cd 00 8e bgu r14,r13,800a0d4 <_Heap_Extend+0x2ac> return false; } extend_area_ok = _Heap_Get_first_and_last_block( 8009ea0: b9 c0 08 00 mv r1,r14 8009ea4: ba c0 18 00 mv r3,r22 8009ea8: 37 85 00 48 addi r5,sp,72 8009eac: 37 86 00 44 addi r6,sp,68 8009eb0: fb ff e8 34 calli 8003f80 <_Heap_Get_first_and_last_block> page_size, min_block_size, &extend_first_block, &extend_last_block ); if (!extend_area_ok ) { 8009eb4: 44 20 00 88 be r1,r0,800a0d4 <_Heap_Extend+0x2ac> 8009eb8: ba a0 78 00 mv r15,r21 8009ebc: 34 11 00 00 mvi r17,0 8009ec0: 34 13 00 00 mvi r19,0 8009ec4: 34 10 00 00 mvi r16,0 return false; } do { uintptr_t const sub_area_begin = (start_block != first_block) ? (uintptr_t) start_block : heap->area_begin; 8009ec8: 29 61 00 18 lw r1,(r11+24) - 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; 8009ecc: 34 18 ff fe mvi r24,-2 8009ed0: e0 00 00 02 bi 8009ed8 <_Heap_Extend+0xb0> 8009ed4: b9 e0 08 00 mv r1,r15 uintptr_t const sub_area_end = start_block->prev_size; 8009ed8: 29 f2 00 00 lw r18,(r15+0) Heap_Block *const end_block = _Heap_Block_of_alloc_area( sub_area_end, page_size ); if ( sub_area_end > extend_area_begin && extend_area_end > sub_area_begin 8009edc: f5 a1 18 00 cmpgu r3,r13,r1 8009ee0: f6 4e 10 00 cmpgu r2,r18,r14 (uintptr_t) start_block : heap->area_begin; uintptr_t const sub_area_end = start_block->prev_size; Heap_Block *const end_block = _Heap_Block_of_alloc_area( sub_area_end, page_size ); if ( 8009ee4: a0 62 10 00 and r2,r3,r2 8009ee8: 5c 40 00 7a bne r2,r0,800a0d0 <_Heap_Extend+0x2a8> sub_area_end > extend_area_begin && extend_area_end > sub_area_begin ) { return false; } if ( extend_area_end == sub_area_begin ) { 8009eec: 45 a1 00 03 be r13,r1,8009ef8 <_Heap_Extend+0xd0> merge_below_block = start_block; } else if ( extend_area_end < sub_area_end ) { 8009ef0: 56 4d 00 04 bgu r18,r13,8009f00 <_Heap_Extend+0xd8> 8009ef4: e0 00 00 04 bi 8009f04 <_Heap_Extend+0xdc> sub_area_end > extend_area_begin && extend_area_end > sub_area_begin ) { return false; } if ( extend_area_end == sub_area_begin ) { 8009ef8: b9 e0 80 00 mv r16,r15 8009efc: e0 00 00 02 bi 8009f04 <_Heap_Extend+0xdc> merge_below_block = start_block; } else if ( extend_area_end < sub_area_end ) { 8009f00: b9 e0 98 00 mv r19,r15 RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down( uintptr_t value, uintptr_t alignment ) { return value - (value % alignment); 8009f04: ba 40 08 00 mv r1,r18 8009f08: ba c0 10 00 mv r2,r22 8009f0c: 36 59 ff f8 addi r25,r18,-8 8009f10: f8 00 21 2f calli 80123cc <__umodsi3> uintptr_t alloc_begin, uintptr_t page_size ) { return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size ) - HEAP_BLOCK_HEADER_SIZE); 8009f14: cb 21 08 00 sub r1,r25,r1 link_below_block = start_block; } if ( sub_area_end == extend_area_begin ) { 8009f18: 5d d2 00 04 bne r14,r18,8009f28 <_Heap_Extend+0x100> start_block->prev_size = extend_area_end; 8009f1c: 59 ed 00 00 sw (r15+0),r13 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 ) 8009f20: b8 20 60 00 mv r12,r1 8009f24: e0 00 00 04 bi 8009f34 <_Heap_Extend+0x10c> merge_above_block = end_block; } else if ( sub_area_end < extend_area_begin ) { 8009f28: 55 d2 00 02 bgu r14,r18,8009f30 <_Heap_Extend+0x108> 8009f2c: e0 00 00 02 bi 8009f34 <_Heap_Extend+0x10c> 8009f30: b8 20 88 00 mv r17,r1 - 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; 8009f34: 28 2f 00 04 lw r15,(r1+4) 8009f38: a3 0f 78 00 and r15,r24,r15 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); 8009f3c: b4 2f 78 00 add r15,r1,r15 link_above_block = end_block; } start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) ); } while ( start_block != first_block ); 8009f40: 5d f5 ff e5 bne r15,r21,8009ed4 <_Heap_Extend+0xac> if ( extend_area_begin < heap->area_begin ) { 8009f44: 29 61 00 18 lw r1,(r11+24) 8009f48: 51 c1 00 03 bgeu r14,r1,8009f54 <_Heap_Extend+0x12c> heap->area_begin = extend_area_begin; 8009f4c: 59 6e 00 18 sw (r11+24),r14 8009f50: e0 00 00 04 bi 8009f60 <_Heap_Extend+0x138> } else if ( heap->area_end < extend_area_end ) { 8009f54: 29 61 00 1c lw r1,(r11+28) 8009f58: 50 2d 00 02 bgeu r1,r13,8009f60 <_Heap_Extend+0x138> heap->area_end = extend_area_end; 8009f5c: 59 6d 00 1c sw (r11+28),r13 } extend_first_block_size = (uintptr_t) extend_last_block - (uintptr_t) extend_first_block; 8009f60: 2b 81 00 44 lw r1,(sp+68) 8009f64: 2b 82 00 48 lw r2,(sp+72) heap->area_begin = extend_area_begin; } else if ( heap->area_end < extend_area_end ) { heap->area_end = extend_area_end; } extend_first_block_size = 8009f68: c8 22 18 00 sub r3,r1,r2 (uintptr_t) extend_last_block - (uintptr_t) extend_first_block; extend_first_block->prev_size = extend_area_end; 8009f6c: 58 4d 00 00 sw (r2+0),r13 extend_first_block->size_and_flag = extend_first_block_size | HEAP_PREV_BLOCK_USED; 8009f70: 38 64 00 01 ori r4,r3,0x1 _Heap_Protection_block_initialize( heap, extend_first_block ); extend_last_block->prev_size = extend_first_block_size; 8009f74: 58 23 00 00 sw (r1+0),r3 extend_last_block->size_and_flag = 0; _Heap_Protection_block_initialize( heap, extend_last_block ); if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) { 8009f78: 29 63 00 20 lw r3,(r11+32) 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 = 8009f7c: 58 44 00 04 sw (r2+4),r4 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; 8009f80: 58 20 00 04 sw (r1+4),r0 _Heap_Protection_block_initialize( heap, extend_last_block ); if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) { 8009f84: 50 43 00 03 bgeu r2,r3,8009f90 <_Heap_Extend+0x168> heap->first_block = extend_first_block; 8009f88: 59 62 00 20 sw (r11+32),r2 8009f8c: e0 00 00 04 bi 8009f9c <_Heap_Extend+0x174> } else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) { 8009f90: 29 62 00 24 lw r2,(r11+36) 8009f94: 50 41 00 02 bgeu r2,r1,8009f9c <_Heap_Extend+0x174> heap->last_block = extend_last_block; 8009f98: 59 61 00 24 sw (r11+36),r1 } if ( merge_below_block != NULL ) { 8009f9c: 46 00 00 12 be r16,r0,8009fe4 <_Heap_Extend+0x1bc> Heap_Control *heap, uintptr_t extend_area_begin, Heap_Block *first_block ) { uintptr_t const page_size = heap->page_size; 8009fa0: 29 6f 00 10 lw r15,(r11+16) uintptr_t const new_first_block_alloc_begin = _Heap_Align_up( extend_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size ); 8009fa4: 35 ce 00 08 addi r14,r14,8 RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_up( uintptr_t value, uintptr_t alignment ) { uintptr_t remainder = value % alignment; 8009fa8: b9 c0 08 00 mv r1,r14 8009fac: b9 e0 10 00 mv r2,r15 8009fb0: f8 00 21 07 calli 80123cc <__umodsi3> if ( remainder != 0 ) { 8009fb4: 44 20 00 03 be r1,r0,8009fc0 <_Heap_Extend+0x198> <== ALWAYS TAKEN return value - remainder + alignment; 8009fb8: b5 cf 70 00 add r14,r14,r15 <== NOT EXECUTED 8009fbc: c9 c1 70 00 sub r14,r14,r1 <== NOT EXECUTED 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; 8009fc0: 2a 01 00 00 lw r1,(r16+0) ) { 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 = 8009fc4: 35 c2 ff f8 addi r2,r14,-8 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; 8009fc8: 59 c1 ff f8 sw (r14+-8),r1 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 = 8009fcc: ca 02 08 00 sub r1,r16,r2 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; 8009fd0: 38 21 00 01 ori r1,r1,0x1 8009fd4: 58 41 00 04 sw (r2+4),r1 _Heap_Free_block( heap, new_first_block ); 8009fd8: b9 60 08 00 mv r1,r11 8009fdc: fb ff ff 86 calli 8009df4 <_Heap_Free_block> 8009fe0: e0 00 00 06 bi 8009ff8 <_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 ) { 8009fe4: 46 70 00 05 be r19,r16,8009ff8 <_Heap_Extend+0x1d0> _Heap_Link_below( 8009fe8: 2b 81 00 44 lw r1,(sp+68) { 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; 8009fec: ca 61 98 00 sub r19,r19,r1 8009ff0: 3a 73 00 01 ori r19,r19,0x1 ) { uintptr_t const last_block_begin = (uintptr_t) last_block; uintptr_t const link_begin = (uintptr_t) link; last_block->size_and_flag = 8009ff4: 58 33 00 04 sw (r1+4),r19 link_below_block, extend_last_block ); } if ( merge_above_block != NULL ) { 8009ff8: 45 80 00 14 be r12,r0,800a048 <_Heap_Extend+0x220> RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down( uintptr_t value, uintptr_t alignment ) { return value - (value % alignment); 8009ffc: 29 62 00 10 lw r2,(r11+16) ) { 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, 800a000: 35 ad ff f8 addi r13,r13,-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( 800a004: c9 ac 68 00 sub r13,r13,r12 800a008: b9 a0 08 00 mv r1,r13 800a00c: f8 00 20 f0 calli 80123cc <__umodsi3> ); 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) 800a010: 29 83 00 04 lw r3,(r12+4) 800a014: c9 a1 08 00 sub r1,r13,r1 page_size ); Heap_Block *const new_last_block = _Heap_Block_at( last_block, last_block_new_size ); new_last_block->size_and_flag = 800a018: b4 2c 10 00 add r2,r1,r12 (last_block->size_and_flag - last_block_new_size) 800a01c: c8 61 18 00 sub r3,r3,r1 | HEAP_PREV_BLOCK_USED; 800a020: 38 63 00 01 ori r3,r3,0x1 page_size ); Heap_Block *const new_last_block = _Heap_Block_at( last_block, last_block_new_size ); new_last_block->size_and_flag = 800a024: 58 43 00 04 sw (r2+4),r3 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; 800a028: 29 82 00 04 lw r2,(r12+4) 800a02c: 20 42 00 01 andi r2,r2,0x1 block->size_and_flag = size | flag; 800a030: b8 22 08 00 or r1,r1,r2 800a034: 59 81 00 04 sw (r12+4),r1 (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 ); 800a038: b9 80 10 00 mv r2,r12 800a03c: b9 60 08 00 mv r1,r11 800a040: fb ff ff 6d calli 8009df4 <_Heap_Free_block> 800a044: e0 00 00 0c bi 800a074 <_Heap_Extend+0x24c> ); } if ( merge_above_block != NULL ) { _Heap_Merge_above( heap, merge_above_block, extend_area_end ); } else if ( link_above_block != NULL ) { 800a048: 46 2c 00 0b be r17,r12,800a074 <_Heap_Extend+0x24c> 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; 800a04c: 2a 21 00 04 lw r1,(r17+4) ) { 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 ); 800a050: 2b 83 00 48 lw r3,(sp+72) } if ( merge_above_block != NULL ) { _Heap_Merge_above( heap, merge_above_block, extend_area_end ); } else if ( link_above_block != NULL ) { _Heap_Link_above( 800a054: 2b 82 00 44 lw r2,(sp+68) 800a058: 20 21 00 01 andi r1,r1,0x1 ) { 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 ); 800a05c: c8 71 18 00 sub r3,r3,r17 block->size_and_flag = size | flag; 800a060: b8 61 08 00 or r1,r3,r1 800a064: 5a 21 00 04 sw (r17+4),r1 last_block->size_and_flag |= HEAP_PREV_BLOCK_USED; 800a068: 28 41 00 04 lw r1,(r2+4) 800a06c: 38 21 00 01 ori r1,r1,0x1 800a070: 58 41 00 04 sw (r2+4),r1 extend_first_block, extend_last_block ); } if ( merge_below_block == NULL && merge_above_block == NULL ) { 800a074: 65 8c 00 00 cmpei r12,r12,0 800a078: 66 10 00 00 cmpei r16,r16,0 800a07c: a1 90 60 00 and r12,r12,r16 800a080: 45 80 00 04 be r12,r0,800a090 <_Heap_Extend+0x268> _Heap_Free_block( heap, extend_first_block ); 800a084: 2b 82 00 48 lw r2,(sp+72) 800a088: b9 60 08 00 mv r1,r11 800a08c: fb ff ff 5a calli 8009df4 <_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 800a090: 29 61 00 24 lw r1,(r11+36) * 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( 800a094: 29 63 00 20 lw r3,(r11+32) stats->size += extended_size; if ( extended_size_ptr != NULL ) *extended_size_ptr = extended_size; return true; 800a098: 34 0c 00 01 mvi r12,1 RTEMS_INLINE_ROUTINE void _Heap_Block_set_size( Heap_Block *block, uintptr_t size ) { uintptr_t flag = block->size_and_flag & HEAP_PREV_BLOCK_USED; 800a09c: 28 22 00 04 lw r2,(r1+4) * 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( 800a0a0: c8 61 18 00 sub r3,r3,r1 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; 800a0a4: 20 42 00 01 andi r2,r2,0x1 block->size_and_flag = size | flag; 800a0a8: b8 62 10 00 or r2,r3,r2 800a0ac: 58 22 00 04 sw (r1+4),r2 _Heap_Free_block( heap, extend_first_block ); } _Heap_Set_last_block_size( heap ); extended_size = stats->free_size - free_size; 800a0b0: 29 61 00 30 lw r1,(r11+48) /* Statistics */ stats->size += extended_size; 800a0b4: 29 62 00 2c lw r2,(r11+44) _Heap_Free_block( heap, extend_first_block ); } _Heap_Set_last_block_size( heap ); extended_size = stats->free_size - free_size; 800a0b8: c8 37 08 00 sub r1,r1,r23 /* Statistics */ stats->size += extended_size; 800a0bc: b4 41 10 00 add r2,r2,r1 800a0c0: 59 62 00 2c sw (r11+44),r2 if ( extended_size_ptr != NULL ) 800a0c4: 46 80 00 04 be r20,r0,800a0d4 <_Heap_Extend+0x2ac> <== NEVER TAKEN *extended_size_ptr = extended_size; 800a0c8: 5a 81 00 00 sw (r20+0),r1 800a0cc: e0 00 00 02 bi 800a0d4 <_Heap_Extend+0x2ac> _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; 800a0d0: 34 0c 00 00 mvi r12,0 if ( extended_size_ptr != NULL ) *extended_size_ptr = extended_size; return true; } 800a0d4: b9 80 08 00 mv r1,r12 800a0d8: 2b 9d 00 04 lw ra,(sp+4) 800a0dc: 2b 8b 00 40 lw r11,(sp+64) 800a0e0: 2b 8c 00 3c lw r12,(sp+60) 800a0e4: 2b 8d 00 38 lw r13,(sp+56) 800a0e8: 2b 8e 00 34 lw r14,(sp+52) 800a0ec: 2b 8f 00 30 lw r15,(sp+48) 800a0f0: 2b 90 00 2c lw r16,(sp+44) 800a0f4: 2b 91 00 28 lw r17,(sp+40) 800a0f8: 2b 92 00 24 lw r18,(sp+36) 800a0fc: 2b 93 00 20 lw r19,(sp+32) 800a100: 2b 94 00 1c lw r20,(sp+28) 800a104: 2b 95 00 18 lw r21,(sp+24) 800a108: 2b 96 00 14 lw r22,(sp+20) 800a10c: 2b 97 00 10 lw r23,(sp+16) 800a110: 2b 98 00 0c lw r24,(sp+12) 800a114: 2b 99 00 08 lw r25,(sp+8) 800a118: 37 9c 00 48 addi sp,sp,72 800a11c: c3 a0 00 00 ret =============================================================================== 0800e930 <_Heap_Free>: return do_free; } #endif bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr ) { 800e930: 37 9c ff f4 addi sp,sp,-12 800e934: 5b 8b 00 0c sw (sp+12),r11 800e938: 5b 8c 00 08 sw (sp+8),r12 800e93c: 5b 9d 00 04 sw (sp+4),ra 800e940: b8 20 58 00 mv r11,r1 800e944: 34 4c ff f8 addi r12,r2,-8 800e948: b8 40 08 00 mv r1,r2 800e94c: 29 62 00 10 lw r2,(r11+16) 800e950: f8 00 22 65 calli 80172e4 <__umodsi3> 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 800e954: 29 67 00 20 lw r7,(r11+32) uintptr_t alloc_begin, uintptr_t page_size ) { return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size ) - HEAP_BLOCK_HEADER_SIZE); 800e958: c9 81 18 00 sub r3,r12,r1 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; 800e95c: 34 01 00 00 mvi r1,0 800e960: 54 e3 00 03 bgu r7,r3,800e96c <_Heap_Free+0x3c> 800e964: 29 61 00 24 lw r1,(r11+36) 800e968: f0 23 08 00 cmpgeu r1,r1,r3 uintptr_t next_block_size = 0; bool next_is_free = false; _Heap_Protection_block_check( heap, block ); if ( !_Heap_Is_block_in_heap( heap, block ) ) { 800e96c: b8 20 10 00 mv r2,r1 return false; 800e970: 34 01 00 00 mvi r1,0 uintptr_t next_block_size = 0; bool next_is_free = false; _Heap_Protection_block_check( heap, block ); if ( !_Heap_Is_block_in_heap( heap, block ) ) { 800e974: 44 40 00 66 be r2,r0,800eb0c <_Heap_Free+0x1dc> --stats->used_blocks; ++stats->frees; stats->free_size += block_size; return( true ); } 800e978: 28 66 00 04 lw r6,(r3+4) - 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; 800e97c: 34 04 ff fe mvi r4,-2 800e980: a0 c4 20 00 and r4,r6,r4 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); 800e984: b4 64 10 00 add r2,r3,r4 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; 800e988: 54 e2 00 03 bgu r7,r2,800e994 <_Heap_Free+0x64> <== NEVER TAKEN 800e98c: 29 61 00 24 lw r1,(r11+36) 800e990: f0 22 08 00 cmpgeu r1,r1,r2 block_size = _Heap_Block_size( block ); next_block = _Heap_Block_at( block, block_size ); _Heap_Protection_block_check( heap, next_block ); if ( !_Heap_Is_block_in_heap( heap, next_block ) ) { 800e994: b8 20 28 00 mv r5,r1 _HAssert( false ); return false; 800e998: 34 01 00 00 mvi r1,0 block_size = _Heap_Block_size( block ); next_block = _Heap_Block_at( block, block_size ); _Heap_Protection_block_check( heap, next_block ); if ( !_Heap_Is_block_in_heap( heap, next_block ) ) { 800e99c: 44 a0 00 5c be r5,r0,800eb0c <_Heap_Free+0x1dc> <== NEVER TAKEN --stats->used_blocks; ++stats->frees; stats->free_size += block_size; return( true ); } 800e9a0: 28 45 00 04 lw r5,(r2+4) 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; 800e9a4: 20 a8 00 01 andi r8,r5,0x1 if ( !_Heap_Is_block_in_heap( heap, next_block ) ) { _HAssert( false ); return false; } if ( !_Heap_Is_prev_used( next_block ) ) { 800e9a8: 45 00 00 59 be r8,r0,800eb0c <_Heap_Free+0x1dc> <== NEVER TAKEN 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 800e9ac: 29 69 00 24 lw r9,(r11+36) - 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; 800e9b0: 34 01 ff fe mvi r1,-2 800e9b4: a0 a1 28 00 and r5,r5,r1 && !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size )); 800e9b8: 34 08 00 00 mvi r8,0 800e9bc: 45 22 00 05 be r9,r2,800e9d0 <_Heap_Free+0xa0> --stats->used_blocks; ++stats->frees; stats->free_size += block_size; return( true ); } 800e9c0: b4 45 08 00 add r1,r2,r5 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; 800e9c4: 28 28 00 04 lw r8,(r1+4) 800e9c8: 21 08 00 01 andi r8,r8,0x1 return do_free; } #endif bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr ) 800e9cc: 65 08 00 00 cmpei r8,r8,0 800e9d0: 20 c6 00 01 andi r6,r6,0x1 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 800e9d4: 21 08 00 ff andi r8,r8,0xff && !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size )); if ( !_Heap_Is_prev_used( block ) ) { 800e9d8: 5c c0 00 24 bne r6,r0,800ea68 <_Heap_Free+0x138> uintptr_t const prev_size = block->prev_size; 800e9dc: 28 66 00 00 lw r6,(r3+0) 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; 800e9e0: 34 01 00 00 mvi r1,0 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); 800e9e4: c8 66 18 00 sub r3,r3,r6 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; 800e9e8: 54 e3 00 02 bgu r7,r3,800e9f0 <_Heap_Free+0xc0> <== NEVER TAKEN 800e9ec: f1 23 08 00 cmpgeu r1,r9,r3 Heap_Block * const prev_block = _Heap_Block_at( block, -prev_size ); if ( !_Heap_Is_block_in_heap( heap, prev_block ) ) { 800e9f0: b8 20 38 00 mv r7,r1 _HAssert( false ); return( false ); 800e9f4: 34 01 00 00 mvi r1,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 ) ) { 800e9f8: 44 e0 00 45 be r7,r0,800eb0c <_Heap_Free+0x1dc> <== 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; 800e9fc: 28 67 00 04 lw r7,(r3+4) 800ea00: 20 e7 00 01 andi r7,r7,0x1 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) ) { 800ea04: 44 e0 00 42 be r7,r0,800eb0c <_Heap_Free+0x1dc> <== NEVER TAKEN _HAssert( false ); return( false ); } if ( next_is_free ) { /* coalesce both */ 800ea08: 45 00 00 0f be r8,r0,800ea44 <_Heap_Free+0x114> return _Heap_Free_list_tail(heap)->prev; } RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block ) { Heap_Block *next = block->next; 800ea0c: 28 41 00 08 lw r1,(r2+8) Heap_Block *prev = block->prev; 800ea10: 28 42 00 0c lw r2,(r2+12) uintptr_t const size = block_size + prev_size + next_block_size; 800ea14: b4 85 28 00 add r5,r4,r5 800ea18: b4 a6 30 00 add r6,r5,r6 prev->next = next; 800ea1c: 58 41 00 08 sw (r2+8),r1 next->prev = prev; 800ea20: 58 22 00 0c sw (r1+12),r2 _Heap_Free_list_remove( next_block ); stats->free_blocks -= 1; 800ea24: 29 61 00 38 lw r1,(r11+56) 800ea28: 34 21 ff ff addi r1,r1,-1 800ea2c: 59 61 00 38 sw (r11+56),r1 prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED; 800ea30: 38 c1 00 01 ori r1,r6,0x1 800ea34: 58 61 00 04 sw (r3+4),r1 next_block = _Heap_Block_at( prev_block, size ); _HAssert(!_Heap_Is_prev_used( next_block)); next_block->prev_size = size; 800ea38: b4 66 18 00 add r3,r3,r6 800ea3c: 58 66 00 00 sw (r3+0),r6 800ea40: e0 00 00 29 bi 800eae4 <_Heap_Free+0x1b4> } else { /* coalesce prev */ uintptr_t const size = block_size + prev_size; 800ea44: b4 86 30 00 add r6,r4,r6 prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED; 800ea48: 38 c1 00 01 ori r1,r6,0x1 800ea4c: 58 61 00 04 sw (r3+4),r1 next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED; 800ea50: 28 43 00 04 lw r3,(r2+4) 800ea54: 34 01 ff fe mvi r1,-2 next_block->prev_size = size; 800ea58: 58 46 00 00 sw (r2+0),r6 _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; next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED; 800ea5c: a0 61 08 00 and r1,r3,r1 800ea60: 58 41 00 04 sw (r2+4),r1 800ea64: e0 00 00 20 bi 800eae4 <_Heap_Free+0x1b4> next_block->prev_size = size; } } else if ( next_is_free ) { /* coalesce next */ 800ea68: 45 00 00 0d be r8,r0,800ea9c <_Heap_Free+0x16c> uintptr_t const size = block_size + next_block_size; 800ea6c: b4 a4 08 00 add r1,r5,r4 RTEMS_INLINE_ROUTINE void _Heap_Free_list_replace( Heap_Block *old_block, Heap_Block *new_block ) { Heap_Block *next = old_block->next; 800ea70: 28 45 00 08 lw r5,(r2+8) Heap_Block *prev = old_block->prev; 800ea74: 28 42 00 0c lw r2,(r2+12) new_block->next = next; 800ea78: 58 65 00 08 sw (r3+8),r5 new_block->prev = prev; 800ea7c: 58 62 00 0c sw (r3+12),r2 next->prev = new_block; prev->next = new_block; 800ea80: 58 43 00 08 sw (r2+8),r3 _Heap_Free_list_replace( next_block, block ); block->size_and_flag = size | HEAP_PREV_BLOCK_USED; 800ea84: 38 22 00 01 ori r2,r1,0x1 Heap_Block *prev = old_block->prev; new_block->next = next; new_block->prev = prev; next->prev = new_block; 800ea88: 58 a3 00 0c sw (r5+12),r3 800ea8c: 58 62 00 04 sw (r3+4),r2 next_block = _Heap_Block_at( block, size ); next_block->prev_size = size; 800ea90: b4 61 18 00 add r3,r3,r1 800ea94: 58 61 00 00 sw (r3+0),r1 800ea98: e0 00 00 13 bi 800eae4 <_Heap_Free+0x1b4> RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_after( Heap_Block *block_before, Heap_Block *new_block ) { Heap_Block *next = block_before->next; 800ea9c: 29 61 00 08 lw r1,(r11+8) new_block->next = next; new_block->prev = block_before; 800eaa0: 58 6b 00 0c sw (r3+12),r11 /* 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; next_block->prev_size = block_size; 800eaa4: 58 44 00 00 sw (r2+0),r4 Heap_Block *new_block ) { Heap_Block *next = block_before->next; new_block->next = next; 800eaa8: 58 61 00 08 sw (r3+8),r1 new_block->prev = block_before; block_before->next = new_block; next->prev = new_block; 800eaac: 58 23 00 0c sw (r1+12),r3 next_block->prev_size = size; } else { /* no coalesce */ /* Add 'block' to the head of the free blocks list as it tends to produce less fragmentation than adding to the tail. */ _Heap_Free_list_insert_after( _Heap_Free_list_head( heap), block ); block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED; 800eab0: 38 81 00 01 ori r1,r4,0x1 800eab4: 58 61 00 04 sw (r3+4),r1 { Heap_Block *next = block_before->next; new_block->next = next; new_block->prev = block_before; block_before->next = new_block; 800eab8: 59 63 00 08 sw (r11+8),r3 next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED; 800eabc: 28 43 00 04 lw r3,(r2+4) 800eac0: 34 01 ff fe mvi r1,-2 800eac4: a0 61 08 00 and r1,r3,r1 800eac8: 58 41 00 04 sw (r2+4),r1 next_block->prev_size = block_size; /* Statistics */ ++stats->free_blocks; 800eacc: 29 61 00 38 lw r1,(r11+56) if ( stats->max_free_blocks < stats->free_blocks ) { 800ead0: 29 62 00 3c lw r2,(r11+60) 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; 800ead4: 34 21 00 01 addi r1,r1,1 800ead8: 59 61 00 38 sw (r11+56),r1 if ( stats->max_free_blocks < stats->free_blocks ) { 800eadc: 50 41 00 02 bgeu r2,r1,800eae4 <_Heap_Free+0x1b4> stats->max_free_blocks = stats->free_blocks; 800eae0: 59 61 00 3c sw (r11+60),r1 } } /* Statistics */ --stats->used_blocks; 800eae4: 29 61 00 40 lw r1,(r11+64) 800eae8: 34 21 ff ff addi r1,r1,-1 800eaec: 59 61 00 40 sw (r11+64),r1 ++stats->frees; 800eaf0: 29 61 00 50 lw r1,(r11+80) 800eaf4: 34 21 00 01 addi r1,r1,1 800eaf8: 59 61 00 50 sw (r11+80),r1 stats->free_size += block_size; 800eafc: 29 61 00 30 lw r1,(r11+48) 800eb00: b4 24 20 00 add r4,r1,r4 800eb04: 59 64 00 30 sw (r11+48),r4 return( true ); 800eb08: 34 01 00 01 mvi r1,1 } 800eb0c: 2b 9d 00 04 lw ra,(sp+4) 800eb10: 2b 8b 00 0c lw r11,(sp+12) 800eb14: 2b 8c 00 08 lw r12,(sp+8) 800eb18: 37 9c 00 0c addi sp,sp,12 800eb1c: c3 a0 00 00 ret =============================================================================== 0800eb20 <_Heap_Resize_block>: void *alloc_begin_ptr, uintptr_t new_alloc_size, uintptr_t *old_size, uintptr_t *new_size ) { 800eb20: 37 9c ff e4 addi sp,sp,-28 800eb24: 5b 8b 00 1c sw (sp+28),r11 800eb28: 5b 8c 00 18 sw (sp+24),r12 800eb2c: 5b 8d 00 14 sw (sp+20),r13 800eb30: 5b 8e 00 10 sw (sp+16),r14 800eb34: 5b 8f 00 0c sw (sp+12),r15 800eb38: 5b 90 00 08 sw (sp+8),r16 800eb3c: 5b 9d 00 04 sw (sp+4),ra 800eb40: b8 20 58 00 mv r11,r1 RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down( uintptr_t value, uintptr_t alignment ) { return value - (value % alignment); 800eb44: 34 50 ff f8 addi r16,r2,-8 800eb48: b8 40 08 00 mv r1,r2 800eb4c: b8 40 60 00 mv r12,r2 800eb50: 29 62 00 10 lw r2,(r11+16) 800eb54: b8 80 78 00 mv r15,r4 800eb58: b8 a0 68 00 mv r13,r5 800eb5c: b8 60 70 00 mv r14,r3 800eb60: f8 00 21 e1 calli 80172e4 <__umodsi3> 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; 800eb64: 29 62 00 20 lw r2,(r11+32) uintptr_t const alloc_begin = (uintptr_t) alloc_begin_ptr; Heap_Block *const block = _Heap_Block_of_alloc_area( alloc_begin, page_size ); *old_size = 0; 800eb68: 59 e0 00 00 sw (r15+0),r0 uintptr_t alloc_begin, uintptr_t page_size ) { return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size ) - HEAP_BLOCK_HEADER_SIZE); 800eb6c: ca 01 30 00 sub r6,r16,r1 *new_size = 0; 800eb70: 59 a0 00 00 sw (r13+0),r0 new_alloc_size, old_size, new_size ); } else { return HEAP_RESIZE_FATAL_ERROR; 800eb74: 34 01 00 02 mvi r1,2 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; 800eb78: 54 46 00 38 bgu r2,r6,800ec58 <_Heap_Resize_block+0x138> 800eb7c: 29 62 00 24 lw r2,(r11+36) 800eb80: 54 c2 00 36 bgu r6,r2,800ec58 <_Heap_Resize_block+0x138> <== NEVER TAKEN - HEAP_BLOCK_HEADER_SIZE); } RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block ) { return block->size_and_flag & ~HEAP_PREV_BLOCK_USED; 800eb84: 28 c2 00 04 lw r2,(r6+4) 800eb88: 34 01 ff fe mvi r1,-2 800eb8c: a0 22 10 00 and r2,r1,r2 { Heap_Statistics *const stats = &heap->stats; uintptr_t const block_begin = (uintptr_t) block; uintptr_t block_size = _Heap_Block_size( block ); uintptr_t block_end = block_begin + block_size; 800eb90: b4 c2 38 00 add r7,r6,r2 800eb94: 28 e8 00 04 lw r8,(r7+4) uintptr_t alloc_size = block_end - alloc_begin + HEAP_ALLOC_BONUS; 800eb98: c8 ec 48 00 sub r9,r7,r12 800eb9c: 35 29 00 04 addi r9,r9,4 800eba0: a0 28 40 00 and r8,r1,r8 new_size ); } else { return HEAP_RESIZE_FATAL_ERROR; } } 800eba4: b4 e8 08 00 add r1,r7,r8 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; 800eba8: 28 23 00 04 lw r3,(r1+4) bool next_block_is_free = _Heap_Is_free( next_block );; _HAssert( _Heap_Is_block_in_heap( heap, next_block ) ); _HAssert( _Heap_Is_prev_used( next_block ) ); *old_size = alloc_size; 800ebac: 59 e9 00 00 sw (r15+0),r9 800ebb0: 20 63 00 01 andi r3,r3,0x1 RTEMS_INLINE_ROUTINE bool _Heap_Is_free( const Heap_Block *block ) { return !_Heap_Is_used( block ); 800ebb4: 18 63 00 01 xori r3,r3,0x1 if ( next_block_is_free ) { 800ebb8: 44 60 00 03 be r3,r0,800ebc4 <_Heap_Resize_block+0xa4> block_size += next_block_size; 800ebbc: b4 48 10 00 add r2,r2,r8 alloc_size += next_block_size; 800ebc0: b5 28 48 00 add r9,r9,r8 } if ( new_alloc_size > alloc_size ) { return HEAP_RESIZE_UNSATISFIED; 800ebc4: 34 01 00 01 mvi r1,1 if ( next_block_is_free ) { block_size += next_block_size; alloc_size += next_block_size; } if ( new_alloc_size > alloc_size ) { 800ebc8: 55 c9 00 24 bgu r14,r9,800ec58 <_Heap_Resize_block+0x138> return HEAP_RESIZE_UNSATISFIED; } if ( next_block_is_free ) { 800ebcc: 44 60 00 13 be r3,r0,800ec18 <_Heap_Resize_block+0xf8> 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; 800ebd0: 28 c1 00 04 lw r1,(r6+4) } RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block ) { Heap_Block *next = block->next; Heap_Block *prev = block->prev; 800ebd4: 28 e3 00 0c lw r3,(r7+12) 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; 800ebd8: 20 21 00 01 andi r1,r1,0x1 block->size_and_flag = size | flag; 800ebdc: b8 41 08 00 or r1,r2,r1 800ebe0: 58 c1 00 04 sw (r6+4),r1 return _Heap_Free_list_tail(heap)->prev; } RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block ) { Heap_Block *next = block->next; 800ebe4: 28 e1 00 08 lw r1,(r7+8) RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); 800ebe8: b4 46 10 00 add r2,r2,r6 RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block ) { Heap_Block *next = block->next; Heap_Block *prev = block->prev; prev->next = next; 800ebec: 58 61 00 08 sw (r3+8),r1 next->prev = prev; 800ebf0: 58 23 00 0c sw (r1+12),r3 _Heap_Block_set_size( block, block_size ); _Heap_Free_list_remove( next_block ); next_block = _Heap_Block_at( block, block_size ); next_block->size_and_flag |= HEAP_PREV_BLOCK_USED; 800ebf4: 28 41 00 04 lw r1,(r2+4) 800ebf8: 38 21 00 01 ori r1,r1,0x1 800ebfc: 58 41 00 04 sw (r2+4),r1 /* Statistics */ --stats->free_blocks; 800ec00: 29 61 00 38 lw r1,(r11+56) 800ec04: 34 21 ff ff addi r1,r1,-1 800ec08: 59 61 00 38 sw (r11+56),r1 stats->free_size -= next_block_size; 800ec0c: 29 61 00 30 lw r1,(r11+48) 800ec10: c8 28 40 00 sub r8,r1,r8 800ec14: 59 68 00 30 sw (r11+48),r8 } block = _Heap_Block_allocate( heap, block, alloc_begin, new_alloc_size ); 800ec18: b9 80 18 00 mv r3,r12 800ec1c: b8 c0 10 00 mv r2,r6 800ec20: b9 60 08 00 mv r1,r11 800ec24: b9 c0 20 00 mv r4,r14 800ec28: fb ff da 02 calli 8005430 <_Heap_Block_allocate> - HEAP_BLOCK_HEADER_SIZE); } RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block ) { return block->size_and_flag & ~HEAP_PREV_BLOCK_USED; 800ec2c: 28 23 00 04 lw r3,(r1+4) 800ec30: 34 02 ff fe mvi r2,-2 800ec34: a0 43 10 00 and r2,r2,r3 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); 800ec38: 34 42 00 04 addi r2,r2,4 block_size = _Heap_Block_size( block ); next_block = _Heap_Block_at( block, block_size ); *new_size = (uintptr_t) next_block - alloc_begin + HEAP_ALLOC_BONUS; 800ec3c: c8 4c 60 00 sub r12,r2,r12 800ec40: b4 2c 08 00 add r1,r1,r12 800ec44: 59 a1 00 00 sw (r13+0),r1 /* Statistics */ ++stats->resizes; 800ec48: 29 61 00 54 lw r1,(r11+84) 800ec4c: 34 21 00 01 addi r1,r1,1 800ec50: 59 61 00 54 sw (r11+84),r1 return HEAP_RESIZE_SUCCESSFUL; 800ec54: 34 01 00 00 mvi r1,0 new_size ); } else { return HEAP_RESIZE_FATAL_ERROR; } } 800ec58: 2b 9d 00 04 lw ra,(sp+4) 800ec5c: 2b 8b 00 1c lw r11,(sp+28) 800ec60: 2b 8c 00 18 lw r12,(sp+24) 800ec64: 2b 8d 00 14 lw r13,(sp+20) 800ec68: 2b 8e 00 10 lw r14,(sp+16) 800ec6c: 2b 8f 00 0c lw r15,(sp+12) 800ec70: 2b 90 00 08 lw r16,(sp+8) 800ec74: 37 9c 00 1c addi sp,sp,28 800ec78: c3 a0 00 00 ret =============================================================================== 0800ec7c <_Heap_Size_of_alloc_area>: bool _Heap_Size_of_alloc_area( Heap_Control *heap, void *alloc_begin_ptr, uintptr_t *alloc_size ) { 800ec7c: 37 9c ff ec addi sp,sp,-20 800ec80: 5b 8b 00 14 sw (sp+20),r11 800ec84: 5b 8c 00 10 sw (sp+16),r12 800ec88: 5b 8d 00 0c sw (sp+12),r13 800ec8c: 5b 8e 00 08 sw (sp+8),r14 800ec90: 5b 9d 00 04 sw (sp+4),ra 800ec94: b8 20 58 00 mv r11,r1 RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down( uintptr_t value, uintptr_t alignment ) { return value - (value % alignment); 800ec98: 34 4e ff f8 addi r14,r2,-8 800ec9c: b8 40 08 00 mv r1,r2 800eca0: b8 40 60 00 mv r12,r2 800eca4: 29 62 00 10 lw r2,(r11+16) 800eca8: b8 60 68 00 mv r13,r3 800ecac: f8 00 21 8e calli 80172e4 <__umodsi3> 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 800ecb0: 29 62 00 20 lw r2,(r11+32) uintptr_t alloc_begin, uintptr_t page_size ) { return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size ) - HEAP_BLOCK_HEADER_SIZE); 800ecb4: c9 c1 20 00 sub r4,r14,r1 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; 800ecb8: 34 01 00 00 mvi r1,0 800ecbc: 54 44 00 03 bgu r2,r4,800ecc8 <_Heap_Size_of_alloc_area+0x4c> 800ecc0: 29 61 00 24 lw r1,(r11+36) 800ecc4: f0 24 08 00 cmpgeu r1,r1,r4 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 ) ) { 800ecc8: b8 20 18 00 mv r3,r1 return false; 800eccc: 34 01 00 00 mvi r1,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 ) ) { 800ecd0: 44 60 00 13 be r3,r0,800ed1c <_Heap_Size_of_alloc_area+0xa0> - 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; 800ecd4: 28 83 00 04 lw r3,(r4+4) 800ecd8: 34 01 ff fe mvi r1,-2 800ecdc: a0 23 08 00 and r1,r1,r3 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); 800ece0: b4 81 20 00 add r4,r4,r1 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; 800ece4: 34 01 00 00 mvi r1,0 800ece8: 54 44 00 03 bgu r2,r4,800ecf4 <_Heap_Size_of_alloc_area+0x78><== NEVER TAKEN 800ecec: 29 61 00 24 lw r1,(r11+36) 800ecf0: f0 24 08 00 cmpgeu r1,r1,r4 } block_size = _Heap_Block_size( block ); next_block = _Heap_Block_at( block, block_size ); if ( 800ecf4: b8 20 10 00 mv r2,r1 !_Heap_Is_block_in_heap( heap, next_block ) || !_Heap_Is_prev_used( next_block ) ) { return false; 800ecf8: 34 01 00 00 mvi r1,0 } block_size = _Heap_Block_size( block ); next_block = _Heap_Block_at( block, block_size ); if ( 800ecfc: 44 40 00 08 be r2,r0,800ed1c <_Heap_Size_of_alloc_area+0xa0><== 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; 800ed00: 28 82 00 04 lw r2,(r4+4) 800ed04: 20 42 00 01 andi r2,r2,0x1 !_Heap_Is_block_in_heap( heap, next_block ) || !_Heap_Is_prev_used( next_block ) 800ed08: 44 40 00 05 be r2,r0,800ed1c <_Heap_Size_of_alloc_area+0xa0><== NEVER TAKEN ) { return false; } *alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin; 800ed0c: c8 8c 20 00 sub r4,r4,r12 800ed10: 34 84 00 04 addi r4,r4,4 800ed14: 59 a4 00 00 sw (r13+0),r4 return true; 800ed18: 34 01 00 01 mvi r1,1 } 800ed1c: 2b 9d 00 04 lw ra,(sp+4) 800ed20: 2b 8b 00 14 lw r11,(sp+20) 800ed24: 2b 8c 00 10 lw r12,(sp+16) 800ed28: 2b 8d 00 0c lw r13,(sp+12) 800ed2c: 2b 8e 00 08 lw r14,(sp+8) 800ed30: 37 9c 00 14 addi sp,sp,20 800ed34: c3 a0 00 00 ret =============================================================================== 08004bfc <_Heap_Walk>: bool _Heap_Walk( Heap_Control *heap, int source, bool dump ) { 8004bfc: 37 9c ff a0 addi sp,sp,-96 8004c00: 5b 8b 00 50 sw (sp+80),r11 8004c04: 5b 8c 00 4c sw (sp+76),r12 8004c08: 5b 8d 00 48 sw (sp+72),r13 8004c0c: 5b 8e 00 44 sw (sp+68),r14 8004c10: 5b 8f 00 40 sw (sp+64),r15 8004c14: 5b 90 00 3c sw (sp+60),r16 8004c18: 5b 91 00 38 sw (sp+56),r17 8004c1c: 5b 92 00 34 sw (sp+52),r18 8004c20: 5b 93 00 30 sw (sp+48),r19 8004c24: 5b 94 00 2c sw (sp+44),r20 8004c28: 5b 95 00 28 sw (sp+40),r21 8004c2c: 5b 96 00 24 sw (sp+36),r22 8004c30: 5b 97 00 20 sw (sp+32),r23 8004c34: 5b 98 00 1c sw (sp+28),r24 8004c38: 5b 99 00 18 sw (sp+24),r25 8004c3c: 5b 9b 00 14 sw (sp+20),fp 8004c40: 5b 9d 00 10 sw (sp+16),ra 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; 8004c44: 78 0d 08 00 mvhi r13,0x800 bool _Heap_Walk( Heap_Control *heap, int source, bool dump ) { 8004c48: 20 63 00 ff andi r3,r3,0xff 8004c4c: b8 20 60 00 mv r12,r1 8004c50: b8 40 70 00 mv r14,r2 uintptr_t const page_size = heap->page_size; 8004c54: 28 33 00 10 lw r19,(r1+16) uintptr_t const min_block_size = heap->min_block_size; 8004c58: 28 35 00 14 lw r21,(r1+20) Heap_Block *const first_block = heap->first_block; 8004c5c: 28 34 00 20 lw r20,(r1+32) Heap_Block *const last_block = heap->last_block; 8004c60: 28 36 00 24 lw r22,(r1+36) Heap_Block *block = first_block; Heap_Walk_printer printer = dump ? _Heap_Walk_print : _Heap_Walk_print_nothing; 8004c64: 39 ad 4b 64 ori r13,r13,0x4b64 8004c68: 44 60 00 03 be r3,r0,8004c74 <_Heap_Walk+0x78> 8004c6c: 78 0d 08 00 mvhi r13,0x800 8004c70: 39 ad 4b 88 ori r13,r13,0x4b88 if ( !_System_state_Is_up( _System_state_Get() ) ) { 8004c74: 78 03 08 01 mvhi r3,0x801 8004c78: 38 63 6a a8 ori r3,r3,0x6aa8 8004c7c: 28 67 00 00 lw r7,(r3+0) 8004c80: 34 02 00 03 mvi r2,3 return true; 8004c84: 34 03 00 01 mvi 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() ) ) { 8004c88: 5c e2 01 08 bne r7,r2,80050a8 <_Heap_Walk+0x4ac> <== NEVER TAKEN 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)( 8004c8c: 29 81 00 08 lw r1,(r12+8) 8004c90: 29 86 00 18 lw r6,(r12+24) 8004c94: 29 87 00 1c lw r7,(r12+28) 8004c98: 5b 81 00 08 sw (sp+8),r1 8004c9c: 29 81 00 0c lw r1,(r12+12) 8004ca0: 78 03 08 01 mvhi r3,0x801 8004ca4: 5b 96 00 04 sw (sp+4),r22 8004ca8: 5b 81 00 0c sw (sp+12),r1 8004cac: 34 02 00 00 mvi r2,0 8004cb0: b9 c0 08 00 mv r1,r14 8004cb4: 38 63 41 d0 ori r3,r3,0x41d0 8004cb8: ba 60 20 00 mv r4,r19 8004cbc: ba a0 28 00 mv r5,r21 8004cc0: ba 80 40 00 mv r8,r20 8004cc4: d9 a0 00 00 call r13 heap->area_begin, heap->area_end, first_block, last_block, first_free_block, last_free_block ); if ( page_size == 0 ) { 8004cc8: 5e 60 00 06 bne r19,r0,8004ce0 <_Heap_Walk+0xe4> (*printer)( source, true, "page size is zero\n" ); 8004ccc: 78 03 08 01 mvhi r3,0x801 8004cd0: b9 c0 08 00 mv r1,r14 8004cd4: 34 02 00 01 mvi r2,1 8004cd8: 38 63 42 64 ori r3,r3,0x4264 8004cdc: e0 00 00 25 bi 8004d70 <_Heap_Walk+0x174> ) { #if (CPU_ALIGNMENT == 0) return true; #else return (((uintptr_t)address % CPU_ALIGNMENT) == 0); 8004ce0: 22 6f 00 07 andi r15,r19,0x7 return false; } if ( !_Addresses_Is_aligned( (void *) page_size ) ) { 8004ce4: 45 e0 00 07 be r15,r0,8004d00 <_Heap_Walk+0x104> (*printer)( 8004ce8: 78 03 08 01 mvhi r3,0x801 8004cec: b9 c0 08 00 mv r1,r14 8004cf0: 34 02 00 01 mvi r2,1 8004cf4: 38 63 42 78 ori r3,r3,0x4278 8004cf8: ba 60 20 00 mv r4,r19 8004cfc: e0 00 01 04 bi 800510c <_Heap_Walk+0x510> RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment ) { return (value % alignment) == 0; 8004d00: ba a0 08 00 mv r1,r21 8004d04: ba 60 10 00 mv r2,r19 8004d08: fb ff ef 9c calli 8000b78 <__umodsi3> 8004d0c: b8 20 58 00 mv r11,r1 ); return false; } if ( !_Heap_Is_aligned( min_block_size, page_size ) ) { 8004d10: 44 2f 00 07 be r1,r15,8004d2c <_Heap_Walk+0x130> (*printer)( 8004d14: 78 03 08 01 mvhi r3,0x801 8004d18: b9 c0 08 00 mv r1,r14 8004d1c: 34 02 00 01 mvi r2,1 8004d20: 38 63 42 98 ori r3,r3,0x4298 8004d24: ba a0 20 00 mv r4,r21 8004d28: e0 00 00 f9 bi 800510c <_Heap_Walk+0x510> 8004d2c: 36 81 00 08 addi r1,r20,8 8004d30: ba 60 10 00 mv r2,r19 8004d34: fb ff ef 91 calli 8000b78 <__umodsi3> ); return false; } if ( 8004d38: 44 2b 00 07 be r1,r11,8004d54 <_Heap_Walk+0x158> !_Heap_Is_aligned( _Heap_Alloc_area_of_block( first_block ), page_size ) ) { (*printer)( 8004d3c: 78 03 08 01 mvhi r3,0x801 8004d40: b9 c0 08 00 mv r1,r14 8004d44: 34 02 00 01 mvi r2,1 8004d48: 38 63 42 bc ori r3,r3,0x42bc 8004d4c: ba 80 20 00 mv r4,r20 8004d50: e0 00 00 ef bi 800510c <_Heap_Walk+0x510> 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; 8004d54: 2a 82 00 04 lw r2,(r20+4) 8004d58: 20 42 00 01 andi r2,r2,0x1 ); return false; } if ( !_Heap_Is_prev_used( first_block ) ) { 8004d5c: 5c 41 00 07 bne r2,r1,8004d78 <_Heap_Walk+0x17c> (*printer)( 8004d60: 78 03 08 01 mvhi r3,0x801 8004d64: b9 c0 08 00 mv r1,r14 8004d68: 34 02 00 01 mvi r2,1 8004d6c: 38 63 42 f0 ori r3,r3,0x42f0 8004d70: d9 a0 00 00 call r13 8004d74: e0 00 00 40 bi 8004e74 <_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; 8004d78: 2a cf 00 04 lw r15,(r22+4) 8004d7c: 34 02 ff fe mvi r2,-2 8004d80: a0 4f 78 00 and r15,r2,r15 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); 8004d84: b6 cf 78 00 add r15,r22,r15 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; 8004d88: 29 e2 00 04 lw r2,(r15+4) 8004d8c: 20 42 00 01 andi r2,r2,0x1 ); return false; } if ( _Heap_Is_free( last_block ) ) { 8004d90: 5c 41 00 06 bne r2,r1,8004da8 <_Heap_Walk+0x1ac> (*printer)( 8004d94: 78 03 08 01 mvhi r3,0x801 8004d98: b9 c0 08 00 mv r1,r14 8004d9c: 34 02 00 01 mvi r2,1 8004da0: 38 63 43 20 ori r3,r3,0x4320 8004da4: e3 ff ff f3 bi 8004d70 <_Heap_Walk+0x174> ); return false; } if ( 8004da8: 45 f4 00 06 be r15,r20,8004dc0 <_Heap_Walk+0x1c4> <== ALWAYS TAKEN _Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block ) { (*printer)( 8004dac: 78 03 08 01 mvhi r3,0x801 <== NOT EXECUTED 8004db0: b9 c0 08 00 mv r1,r14 <== NOT EXECUTED 8004db4: 34 02 00 01 mvi r2,1 <== NOT EXECUTED 8004db8: 38 63 43 38 ori r3,r3,0x4338 <== NOT EXECUTED 8004dbc: e3 ff ff ed bi 8004d70 <_Heap_Walk+0x174> <== NOT EXECUTED int source, Heap_Walk_printer printer, Heap_Control *heap ) { uintptr_t const page_size = heap->page_size; 8004dc0: 29 92 00 10 lw r18,(r12+16) block = next_block; } while ( block != first_block ); return true; } 8004dc4: 29 8b 00 08 lw r11,(r12+8) Heap_Walk_printer printer, Heap_Control *heap ) { uintptr_t const page_size = heap->page_size; const Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap ); 8004dc8: b9 80 80 00 mv r16,r12 - 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; 8004dcc: 34 11 ff fe mvi r17,-2 8004dd0: e0 00 00 2d bi 8004e84 <_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; 8004dd4: 29 83 00 20 lw r3,(r12+32) 8004dd8: 34 01 00 00 mvi r1,0 8004ddc: 54 6b 00 03 bgu r3,r11,8004de8 <_Heap_Walk+0x1ec> 8004de0: 29 81 00 24 lw r1,(r12+36) 8004de4: f0 2b 08 00 cmpgeu r1,r1,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 ) ) { 8004de8: 5c 20 00 06 bne r1,r0,8004e00 <_Heap_Walk+0x204> (*printer)( 8004dec: 78 03 08 01 mvhi r3,0x801 8004df0: b9 c0 08 00 mv r1,r14 8004df4: 34 02 00 01 mvi r2,1 8004df8: 38 63 43 68 ori r3,r3,0x4368 8004dfc: e0 00 00 14 bi 8004e4c <_Heap_Walk+0x250> RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment ) { return (value % alignment) == 0; 8004e00: 35 61 00 08 addi r1,r11,8 8004e04: ba 40 10 00 mv r2,r18 8004e08: fb ff ef 5c calli 8000b78 <__umodsi3> ); return false; } if ( 8004e0c: 44 20 00 06 be r1,r0,8004e24 <_Heap_Walk+0x228> !_Heap_Is_aligned( _Heap_Alloc_area_of_block( free_block ), page_size ) ) { (*printer)( 8004e10: 78 03 08 01 mvhi r3,0x801 8004e14: b9 c0 08 00 mv r1,r14 8004e18: 34 02 00 01 mvi r2,1 8004e1c: 38 63 43 88 ori r3,r3,0x4388 8004e20: e0 00 00 0b bi 8004e4c <_Heap_Walk+0x250> - 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; 8004e24: 29 63 00 04 lw r3,(r11+4) 8004e28: a2 23 18 00 and r3,r17,r3 block = next_block; } while ( block != first_block ); return true; } 8004e2c: b5 63 18 00 add r3,r11,r3 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; 8004e30: 28 63 00 04 lw r3,(r3+4) 8004e34: 20 63 00 01 andi r3,r3,0x1 ); return false; } if ( _Heap_Is_used( free_block ) ) { 8004e38: 44 61 00 07 be r3,r1,8004e54 <_Heap_Walk+0x258> (*printer)( 8004e3c: 78 03 08 01 mvhi r3,0x801 8004e40: b9 c0 08 00 mv r1,r14 8004e44: 34 02 00 01 mvi r2,1 8004e48: 38 63 43 b8 ori r3,r3,0x43b8 8004e4c: b9 60 20 00 mv r4,r11 8004e50: e0 00 00 af bi 800510c <_Heap_Walk+0x510> ); return false; } if ( free_block->prev != prev_block ) { 8004e54: 29 65 00 0c lw r5,(r11+12) 8004e58: 44 b0 00 09 be r5,r16,8004e7c <_Heap_Walk+0x280> (*printer)( 8004e5c: 78 03 08 01 mvhi r3,0x801 8004e60: b9 c0 08 00 mv r1,r14 8004e64: 34 02 00 01 mvi r2,1 8004e68: 38 63 43 d4 ori r3,r3,0x43d4 8004e6c: b9 60 20 00 mv r4,r11 8004e70: d9 a0 00 00 call r13 if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; } if ( !_Heap_Walk_check_control( source, printer, heap ) ) { return false; 8004e74: 34 03 00 00 mvi r3,0 8004e78: e0 00 00 8c bi 80050a8 <_Heap_Walk+0x4ac> return false; } prev_block = free_block; free_block = free_block->next; 8004e7c: b9 60 80 00 mv r16,r11 8004e80: 29 6b 00 08 lw r11,(r11+8) 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 ) { 8004e84: 5d 6c ff d4 bne r11,r12,8004dd4 <_Heap_Walk+0x1d8> 8004e88: e0 00 00 03 bi 8004e94 <_Heap_Walk+0x298> block->prev_size ); } block = next_block; } while ( block != first_block ); 8004e8c: ba 20 78 00 mv r15,r17 8004e90: e0 00 00 15 bi 8004ee4 <_Heap_Walk+0x2e8> "block 0x%08x: size %u\n", block, block_size ); } else { (*printer)( 8004e94: 78 01 08 01 mvhi r1,0x801 8004e98: 38 21 45 84 ori r1,r1,0x4584 8004e9c: 5b 81 00 54 sw (sp+84),r1 if ( !_Heap_Is_prev_used( next_block ) ) { if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) { return false; } } else if (prev_used) { (*printer)( 8004ea0: 78 01 08 01 mvhi r1,0x801 8004ea4: 38 21 45 6c ori r1,r1,0x456c 8004ea8: 5b 81 00 58 sw (sp+88),r1 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)( 8004eac: 78 01 08 01 mvhi r1,0x801 8004eb0: 38 21 41 98 ori r1,r1,0x4198 8004eb4: 5b 81 00 5c sw (sp+92),r1 8004eb8: 78 01 08 01 mvhi r1,0x801 8004ebc: 38 21 41 b4 ori r1,r1,0x41b4 8004ec0: 78 1b 08 01 mvhi fp,0x801 " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), block->next, block->next == last_free_block ? " (= last free)" : (block->next == free_list_tail ? " (= tail)" : "") 8004ec4: 78 17 08 01 mvhi r23,0x801 8004ec8: 78 19 08 01 mvhi r25,0x801 block, block_size, block->prev, block->prev == first_free_block ? " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), 8004ecc: 78 18 08 01 mvhi r24,0x801 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)( 8004ed0: 5b 81 00 60 sw (sp+96),r1 8004ed4: 3b 7b 44 c8 ori fp,fp,0x44c8 " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), block->next, block->next == last_free_block ? " (= last free)" : (block->next == free_list_tail ? " (= tail)" : "") 8004ed8: 3a f7 45 38 ori r23,r23,0x4538 8004edc: 3b 39 41 c4 ori r25,r25,0x41c4 block, block_size, block->prev, block->prev == first_free_block ? " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), 8004ee0: 3b 18 41 a8 ori r24,r24,0x41a8 block = next_block; } while ( block != first_block ); return true; } 8004ee4: 29 f2 00 04 lw r18,(r15+4) - 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; 8004ee8: 34 01 ff fe mvi r1,-2 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; 8004eec: 29 84 00 20 lw r4,(r12+32) - 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; 8004ef0: a2 41 80 00 and r16,r18,r1 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); 8004ef4: b5 f0 88 00 add r17,r15,r16 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; 8004ef8: 34 06 00 00 mvi r6,0 8004efc: 54 91 00 03 bgu r4,r17,8004f08 <_Heap_Walk+0x30c> <== NEVER TAKEN 8004f00: 29 86 00 24 lw r6,(r12+36) 8004f04: f0 d1 30 00 cmpgeu r6,r6,r17 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 ) ) { 8004f08: 5c c0 00 06 bne r6,r0,8004f20 <_Heap_Walk+0x324> (*printer)( 8004f0c: 78 03 08 01 mvhi r3,0x801 8004f10: b9 c0 08 00 mv r1,r14 8004f14: 34 02 00 01 mvi r2,1 8004f18: 38 63 44 08 ori r3,r3,0x4408 8004f1c: e0 00 00 1f bi 8004f98 <_Heap_Walk+0x39c> RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment ) { return (value % alignment) == 0; 8004f20: ba 00 08 00 mv r1,r16 8004f24: ba 60 10 00 mv r2,r19 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; 8004f28: fd f6 58 00 cmpne r11,r15,r22 8004f2c: fb ff ef 13 calli 8000b78 <__umodsi3> ); return false; } if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) { 8004f30: 44 20 00 09 be r1,r0,8004f54 <_Heap_Walk+0x358> 8004f34: 45 60 00 08 be r11,r0,8004f54 <_Heap_Walk+0x358> (*printer)( 8004f38: 78 03 08 01 mvhi r3,0x801 8004f3c: b9 c0 08 00 mv r1,r14 8004f40: 34 02 00 01 mvi r2,1 8004f44: 38 63 44 38 ori r3,r3,0x4438 8004f48: b9 e0 20 00 mv r4,r15 8004f4c: ba 00 28 00 mv r5,r16 8004f50: e3 ff ff c8 bi 8004e70 <_Heap_Walk+0x274> ); return false; } if ( block_size < min_block_size && is_not_last_block ) { 8004f54: 52 15 00 0b bgeu r16,r21,8004f80 <_Heap_Walk+0x384> 8004f58: 45 60 00 0a be r11,r0,8004f80 <_Heap_Walk+0x384> <== NEVER TAKEN (*printer)( 8004f5c: 78 03 08 01 mvhi r3,0x801 8004f60: b9 c0 08 00 mv r1,r14 8004f64: 34 02 00 01 mvi r2,1 8004f68: 38 63 44 68 ori r3,r3,0x4468 8004f6c: b9 e0 20 00 mv r4,r15 8004f70: ba 00 28 00 mv r5,r16 8004f74: ba a0 30 00 mv r6,r21 8004f78: d9 a0 00 00 call r13 8004f7c: e3 ff ff be bi 8004e74 <_Heap_Walk+0x278> ); return false; } if ( next_block_begin <= block_begin && is_not_last_block ) { 8004f80: 56 2f 00 09 bgu r17,r15,8004fa4 <_Heap_Walk+0x3a8> 8004f84: 45 60 00 08 be r11,r0,8004fa4 <_Heap_Walk+0x3a8> (*printer)( 8004f88: 78 03 08 01 mvhi r3,0x801 8004f8c: b9 c0 08 00 mv r1,r14 8004f90: 34 02 00 01 mvi r2,1 8004f94: 38 63 44 94 ori r3,r3,0x4494 8004f98: b9 e0 20 00 mv r4,r15 8004f9c: ba 20 28 00 mv r5,r17 8004fa0: e3 ff ff b4 bi 8004e70 <_Heap_Walk+0x274> 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; 8004fa4: 2a 24 00 04 lw r4,(r17+4) 8004fa8: 22 52 00 01 andi r18,r18,0x1 8004fac: 20 84 00 01 andi r4,r4,0x1 ); return false; } if ( !_Heap_Is_prev_used( next_block ) ) { 8004fb0: 5c 80 00 2d bne r4,r0,8005064 <_Heap_Walk+0x468> 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 ? 8004fb4: 29 e6 00 0c lw r6,(r15+12) 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)( 8004fb8: 29 85 00 08 lw r5,(r12+8) block = next_block; } while ( block != first_block ); return true; } 8004fbc: 29 84 00 0c lw r4,(r12+12) 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)( 8004fc0: 2b 87 00 5c lw r7,(sp+92) 8004fc4: 44 c5 00 04 be r6,r5,8004fd4 <_Heap_Walk+0x3d8> block, block_size, block->prev, block->prev == first_free_block ? " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), 8004fc8: ba e0 38 00 mv r7,r23 8004fcc: 5c cc 00 02 bne r6,r12,8004fd4 <_Heap_Walk+0x3d8> 8004fd0: bb 00 38 00 mv r7,r24 block->next, block->next == last_free_block ? 8004fd4: 29 e8 00 08 lw r8,(r15+8) 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)( 8004fd8: 2b 89 00 60 lw r9,(sp+96) 8004fdc: 45 04 00 04 be r8,r4,8004fec <_Heap_Walk+0x3f0> " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), block->next, block->next == last_free_block ? " (= last free)" : (block->next == free_list_tail ? " (= tail)" : "") 8004fe0: ba e0 48 00 mv r9,r23 8004fe4: 5d 0c 00 02 bne r8,r12,8004fec <_Heap_Walk+0x3f0> 8004fe8: bb 20 48 00 mv r9,r25 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)( 8004fec: 5b 89 00 04 sw (sp+4),r9 8004ff0: b9 c0 08 00 mv r1,r14 8004ff4: 34 02 00 00 mvi r2,0 8004ff8: bb 60 18 00 mv r3,fp 8004ffc: b9 e0 20 00 mv r4,r15 8005000: ba 00 28 00 mv r5,r16 8005004: d9 a0 00 00 call r13 block->next == last_free_block ? " (= last free)" : (block->next == free_list_tail ? " (= tail)" : "") ); if ( block_size != next_block->prev_size ) { 8005008: 2a 26 00 00 lw r6,(r17+0) 800500c: 46 06 00 0a be r16,r6,8005034 <_Heap_Walk+0x438> (*printer)( 8005010: 78 03 08 01 mvhi r3,0x801 8005014: b9 c0 08 00 mv r1,r14 8005018: 34 02 00 01 mvi r2,1 800501c: 38 63 45 00 ori r3,r3,0x4500 8005020: b9 e0 20 00 mv r4,r15 8005024: ba 00 28 00 mv r5,r16 8005028: ba 20 38 00 mv r7,r17 800502c: d9 a0 00 00 call r13 8005030: e3 ff ff 91 bi 8004e74 <_Heap_Walk+0x278> ); return false; } if ( !prev_used ) { 8005034: 5e 40 00 06 bne r18,r0,800504c <_Heap_Walk+0x450> (*printer)( 8005038: 78 03 08 01 mvhi r3,0x801 800503c: b9 c0 08 00 mv r1,r14 8005040: 34 02 00 01 mvi r2,1 8005044: 38 63 45 3c ori r3,r3,0x453c 8005048: e0 00 00 30 bi 8005108 <_Heap_Walk+0x50c> block = next_block; } while ( block != first_block ); return true; } 800504c: 29 85 00 08 lw r5,(r12+8) 8005050: e0 00 00 03 bi 800505c <_Heap_Walk+0x460> { 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 ) { 8005054: 44 af 00 13 be r5,r15,80050a0 <_Heap_Walk+0x4a4> return true; } free_block = free_block->next; 8005058: 28 a5 00 08 lw r5,(r5+8) ) { 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 ) { 800505c: 5c ac ff fe bne r5,r12,8005054 <_Heap_Walk+0x458> 8005060: e0 00 00 26 bi 80050f8 <_Heap_Walk+0x4fc> if ( !_Heap_Is_prev_used( next_block ) ) { if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) { return false; } } else if (prev_used) { 8005064: 46 40 00 08 be r18,r0,8005084 <_Heap_Walk+0x488> (*printer)( 8005068: 2b 83 00 58 lw r3,(sp+88) 800506c: b9 c0 08 00 mv r1,r14 8005070: 34 02 00 00 mvi r2,0 8005074: b9 e0 20 00 mv r4,r15 8005078: ba 00 28 00 mv r5,r16 800507c: d9 a0 00 00 call r13 8005080: e0 00 00 08 bi 80050a0 <_Heap_Walk+0x4a4> "block 0x%08x: size %u\n", block, block_size ); } else { (*printer)( 8005084: 2b 83 00 54 lw r3,(sp+84) 8005088: 29 e6 00 00 lw r6,(r15+0) 800508c: b9 c0 08 00 mv r1,r14 8005090: 34 02 00 00 mvi r2,0 8005094: b9 e0 20 00 mv r4,r15 8005098: ba 00 28 00 mv r5,r16 800509c: d9 a0 00 00 call r13 block->prev_size ); } block = next_block; } while ( block != first_block ); 80050a0: 5e 91 ff 7b bne r20,r17,8004e8c <_Heap_Walk+0x290> return true; 80050a4: 34 03 00 01 mvi r3,1 } 80050a8: b8 60 08 00 mv r1,r3 80050ac: 2b 9d 00 10 lw ra,(sp+16) 80050b0: 2b 8b 00 50 lw r11,(sp+80) 80050b4: 2b 8c 00 4c lw r12,(sp+76) 80050b8: 2b 8d 00 48 lw r13,(sp+72) 80050bc: 2b 8e 00 44 lw r14,(sp+68) 80050c0: 2b 8f 00 40 lw r15,(sp+64) 80050c4: 2b 90 00 3c lw r16,(sp+60) 80050c8: 2b 91 00 38 lw r17,(sp+56) 80050cc: 2b 92 00 34 lw r18,(sp+52) 80050d0: 2b 93 00 30 lw r19,(sp+48) 80050d4: 2b 94 00 2c lw r20,(sp+44) 80050d8: 2b 95 00 28 lw r21,(sp+40) 80050dc: 2b 96 00 24 lw r22,(sp+36) 80050e0: 2b 97 00 20 lw r23,(sp+32) 80050e4: 2b 98 00 1c lw r24,(sp+28) 80050e8: 2b 99 00 18 lw r25,(sp+24) 80050ec: 2b 9b 00 14 lw fp,(sp+20) 80050f0: 37 9c 00 60 addi sp,sp,96 80050f4: c3 a0 00 00 ret return false; } if ( !_Heap_Walk_is_in_free_list( heap, block ) ) { (*printer)( 80050f8: 78 03 08 01 mvhi r3,0x801 80050fc: b9 c0 08 00 mv r1,r14 8005100: 34 02 00 01 mvi r2,1 8005104: 38 63 45 ac ori r3,r3,0x45ac 8005108: b9 e0 20 00 mv r4,r15 800510c: d9 a0 00 00 call r13 8005110: e3 ff ff 59 bi 8004e74 <_Heap_Walk+0x278> =============================================================================== 08004508 <_IO_Manager_initialization>: * workspace. * */ void _IO_Manager_initialization(void) { 8004508: 37 9c ff e8 addi sp,sp,-24 800450c: 5b 8b 00 18 sw (sp+24),r11 8004510: 5b 8c 00 14 sw (sp+20),r12 8004514: 5b 8d 00 10 sw (sp+16),r13 8004518: 5b 8e 00 0c sw (sp+12),r14 800451c: 5b 8f 00 08 sw (sp+8),r15 8004520: 5b 9d 00 04 sw (sp+4),ra 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; 8004524: 78 01 08 01 mvhi r1,0x801 8004528: 38 21 90 ac ori r1,r1,0x90ac drivers_in_table = Configuration.number_of_device_drivers; 800452c: 28 2d 00 34 lw r13,(r1+52) number_of_drivers = Configuration.maximum_drivers; 8004530: 28 2b 00 30 lw r11,(r1+48) 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; 8004534: 28 2e 00 38 lw r14,(r1+56) /* * 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 ) 8004538: 51 ab 00 03 bgeu r13,r11,8004544 <_IO_Manager_initialization+0x3c> /* * 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 ) { 800453c: 5d 6d 00 0a bne r11,r13,8004564 <_IO_Manager_initialization+0x5c><== ALWAYS TAKEN 8004540: e0 00 00 02 bi 8004548 <_IO_Manager_initialization+0x40> <== NOT EXECUTED /* * 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 ) 8004544: b9 a0 58 00 mv r11,r13 * 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; 8004548: 78 01 08 01 mvhi r1,0x801 800454c: 38 21 a2 9c ori r1,r1,0xa29c 8004550: 58 2e 00 00 sw (r1+0),r14 _IO_Number_of_drivers = number_of_drivers; 8004554: 78 01 08 01 mvhi r1,0x801 8004558: 38 21 a2 98 ori r1,r1,0xa298 800455c: 58 2b 00 00 sw (r1+0),r11 return; 8004560: e0 00 00 27 bi 80045fc <_IO_Manager_initialization+0xf4> * 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 ) 8004564: 34 02 00 01 mvi r2,1 8004568: b9 60 08 00 mv r1,r11 800456c: f8 00 4a 74 calli 8016f3c <__ashlsi3> 8004570: 34 02 00 03 mvi r2,3 8004574: b4 2b 08 00 add r1,r1,r11 8004578: f8 00 4a 71 calli 8016f3c <__ashlsi3> 800457c: b8 20 78 00 mv r15,r1 * 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( 8004580: f8 00 0e 01 calli 8007d84 <_Workspace_Allocate_or_fatal_error> sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); _IO_Number_of_drivers = number_of_drivers; 8004584: 78 02 08 01 mvhi r2,0x801 8004588: 38 42 a2 98 ori r2,r2,0xa298 /* * 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 *) 800458c: 78 0c 08 01 mvhi r12,0x801 _Workspace_Allocate_or_fatal_error( sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); _IO_Number_of_drivers = number_of_drivers; 8004590: 58 4b 00 00 sw (r2+0),r11 memset( 8004594: b9 e0 18 00 mv r3,r15 /* * 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 *) 8004598: 39 8c a2 9c ori r12,r12,0xa29c _Workspace_Allocate_or_fatal_error( sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); _IO_Number_of_drivers = number_of_drivers; memset( 800459c: 34 02 00 00 mvi r2,0 /* * 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 *) 80045a0: 59 81 00 00 sw (r12+0),r1 _Workspace_Allocate_or_fatal_error( sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); _IO_Number_of_drivers = number_of_drivers; memset( 80045a4: f8 00 36 b5 calli 8012078 _IO_Driver_address_table, 0, sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); for ( index = 0 ; index < drivers_in_table ; index++ ) 80045a8: 34 03 00 00 mvi r3,0 80045ac: 34 04 00 00 mvi r4,0 80045b0: e0 00 00 12 bi 80045f8 <_IO_Manager_initialization+0xf0> _IO_Driver_address_table[index] = driver_table[index]; 80045b4: 29 82 00 00 lw r2,(r12+0) * registration. The driver table is now allocated in the * workspace. * */ void _IO_Manager_initialization(void) 80045b8: b5 c3 08 00 add r1,r14,r3 _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]; 80045bc: 28 29 00 00 lw r9,(r1+0) 80045c0: 28 28 00 04 lw r8,(r1+4) 80045c4: 28 27 00 08 lw r7,(r1+8) 80045c8: 28 26 00 0c lw r6,(r1+12) 80045cc: 28 25 00 10 lw r5,(r1+16) 80045d0: 28 21 00 14 lw r1,(r1+20) 80045d4: b4 43 10 00 add r2,r2,r3 80045d8: 58 49 00 00 sw (r2+0),r9 80045dc: 58 48 00 04 sw (r2+4),r8 80045e0: 58 47 00 08 sw (r2+8),r7 80045e4: 58 46 00 0c sw (r2+12),r6 80045e8: 58 45 00 10 sw (r2+16),r5 80045ec: 58 41 00 14 sw (r2+20),r1 memset( _IO_Driver_address_table, 0, sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); for ( index = 0 ; index < drivers_in_table ; index++ ) 80045f0: 34 84 00 01 addi r4,r4,1 80045f4: 34 63 00 18 addi r3,r3,24 80045f8: 55 a4 ff ef bgu r13,r4,80045b4 <_IO_Manager_initialization+0xac> _IO_Driver_address_table[index] = driver_table[index]; } 80045fc: 2b 9d 00 04 lw ra,(sp+4) 8004600: 2b 8b 00 18 lw r11,(sp+24) 8004604: 2b 8c 00 14 lw r12,(sp+20) 8004608: 2b 8d 00 10 lw r13,(sp+16) 800460c: 2b 8e 00 0c lw r14,(sp+12) 8004610: 2b 8f 00 08 lw r15,(sp+8) 8004614: 37 9c 00 18 addi sp,sp,24 8004618: c3 a0 00 00 ret =============================================================================== 08005664 <_Objects_Allocate>: */ Objects_Control *_Objects_Allocate( Objects_Information *information ) { 8005664: 37 9c ff ec addi sp,sp,-20 8005668: 5b 8b 00 14 sw (sp+20),r11 800566c: 5b 8c 00 10 sw (sp+16),r12 8005670: 5b 8d 00 0c sw (sp+12),r13 8005674: 5b 8e 00 08 sw (sp+8),r14 8005678: 5b 9d 00 04 sw (sp+4),ra 800567c: b8 20 58 00 mv r11,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 ) 8005680: 28 21 00 18 lw r1,(r1+24) return NULL; 8005684: 34 0c 00 00 mvi r12,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 ) 8005688: 44 20 00 1e be r1,r0,8005700 <_Objects_Allocate+0x9c> <== 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 ); 800568c: 35 6d 00 20 addi r13,r11,32 8005690: b9 a0 08 00 mv r1,r13 8005694: fb ff fd 3d calli 8004b88 <_Chain_Get> 8005698: b8 20 60 00 mv r12,r1 800569c: b8 20 70 00 mv r14,r1 if ( information->auto_extend ) { 80056a0: 41 61 00 12 lbu r1,(r11+18) 80056a4: 44 20 00 17 be r1,r0,8005700 <_Objects_Allocate+0x9c> /* * If the list is empty then we are out of objects and need to * extend information base. */ if ( !the_object ) { 80056a8: 5d 80 00 07 bne r12,r0,80056c4 <_Objects_Allocate+0x60> _Objects_Extend_information( information ); 80056ac: b9 60 08 00 mv r1,r11 80056b0: f8 00 00 32 calli 8005778 <_Objects_Extend_information> the_object = (Objects_Control *) _Chain_Get( &information->Inactive ); 80056b4: b9 a0 08 00 mv r1,r13 80056b8: fb ff fd 34 calli 8004b88 <_Chain_Get> 80056bc: b8 20 60 00 mv r12,r1 } if ( the_object ) { 80056c0: 44 2e 00 10 be r1,r14,8005700 <_Objects_Allocate+0x9c> uint32_t block; block = (uint32_t) _Objects_Get_index( the_object->id ) - 80056c4: 2d 82 00 0a lhu r2,(r12+10) 80056c8: 2d 61 00 0a lhu r1,(r11+10) _Objects_Get_index( information->minimum_id ); block /= information->allocation_size; 80056cc: c8 41 08 00 sub r1,r2,r1 80056d0: 2d 62 00 14 lhu r2,(r11+20) 80056d4: f8 00 46 f4 calli 80172a4 <__udivsi3> information->inactive_per_block[ block ]--; 80056d8: 34 02 00 02 mvi r2,2 80056dc: f8 00 46 18 calli 8016f3c <__ashlsi3> 80056e0: 29 62 00 30 lw r2,(r11+48) 80056e4: b4 41 08 00 add r1,r2,r1 80056e8: 28 22 00 00 lw r2,(r1+0) 80056ec: 34 42 ff ff addi r2,r2,-1 80056f0: 58 22 00 00 sw (r1+0),r2 information->inactive--; 80056f4: 2d 61 00 2c lhu r1,(r11+44) 80056f8: 34 21 ff ff addi r1,r1,-1 80056fc: 0d 61 00 2c sh (r11+44),r1 ); } #endif return the_object; } 8005700: b9 80 08 00 mv r1,r12 8005704: 2b 9d 00 04 lw ra,(sp+4) 8005708: 2b 8b 00 14 lw r11,(sp+20) 800570c: 2b 8c 00 10 lw r12,(sp+16) 8005710: 2b 8d 00 0c lw r13,(sp+12) 8005714: 2b 8e 00 08 lw r14,(sp+8) 8005718: 37 9c 00 14 addi sp,sp,20 800571c: c3 a0 00 00 ret =============================================================================== 0800ed84 <_Objects_Get_information>: Objects_Information *_Objects_Get_information( Objects_APIs the_api, uint16_t the_class ) { 800ed84: 37 9c ff ec addi sp,sp,-20 800ed88: 5b 8b 00 14 sw (sp+20),r11 800ed8c: 5b 8c 00 10 sw (sp+16),r12 800ed90: 5b 8d 00 0c sw (sp+12),r13 800ed94: 5b 8e 00 08 sw (sp+8),r14 800ed98: 5b 9d 00 04 sw (sp+4),ra 800ed9c: 20 4c ff ff andi r12,r2,0xffff 800eda0: b8 20 70 00 mv r14,r1 Objects_Information *info; int the_class_api_maximum; if ( !the_class ) return NULL; 800eda4: 34 0b 00 00 mvi r11,0 ) { Objects_Information *info; int the_class_api_maximum; if ( !the_class ) 800eda8: 45 80 00 16 be r12,r0,800ee00 <_Objects_Get_information+0x7c> /* * 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 ); 800edac: f8 00 09 09 calli 80111d0 <_Objects_API_maximum_class> if ( the_class_api_maximum == 0 ) 800edb0: 44 20 00 14 be r1,r0,800ee00 <_Objects_Get_information+0x7c> return NULL; if ( the_class > (uint32_t) the_class_api_maximum ) 800edb4: 55 81 00 13 bgu r12,r1,800ee00 <_Objects_Get_information+0x7c> return NULL; if ( !_Objects_Information_table[ the_api ] ) 800edb8: 78 0d 08 01 mvhi r13,0x801 800edbc: b9 c0 08 00 mv r1,r14 800edc0: 34 02 00 02 mvi r2,2 800edc4: 39 ad 98 fc ori r13,r13,0x98fc 800edc8: f8 00 20 5d calli 8016f3c <__ashlsi3> 800edcc: b5 a1 08 00 add r1,r13,r1 800edd0: 28 2d 00 00 lw r13,(r1+0) 800edd4: 45 a0 00 0b be r13,r0,800ee00 <_Objects_Get_information+0x7c><== NEVER TAKEN return NULL; info = _Objects_Information_table[ the_api ][ the_class ]; 800edd8: b9 80 08 00 mv r1,r12 800eddc: 34 02 00 02 mvi r2,2 800ede0: f8 00 20 57 calli 8016f3c <__ashlsi3> 800ede4: b5 a1 08 00 add r1,r13,r1 800ede8: 28 2b 00 00 lw r11,(r1+0) if ( !info ) 800edec: 45 60 00 05 be r11,r0,800ee00 <_Objects_Get_information+0x7c><== 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 ) 800edf0: 2d 61 00 10 lhu r1,(r11+16) return NULL; 800edf4: 7c 21 00 00 cmpnei r1,r1,0 800edf8: c8 01 08 00 sub r1,r0,r1 800edfc: a1 61 58 00 and r11,r11,r1 #endif return info; } 800ee00: b9 60 08 00 mv r1,r11 800ee04: 2b 9d 00 04 lw ra,(sp+4) 800ee08: 2b 8b 00 14 lw r11,(sp+20) 800ee0c: 2b 8c 00 10 lw r12,(sp+16) 800ee10: 2b 8d 00 0c lw r13,(sp+12) 800ee14: 2b 8e 00 08 lw r14,(sp+8) 800ee18: 37 9c 00 14 addi sp,sp,20 800ee1c: c3 a0 00 00 ret =============================================================================== 08017898 <_Objects_Get_no_protection>: Objects_Control *_Objects_Get_no_protection( Objects_Information *information, Objects_Id id, Objects_Locations *location ) { 8017898: 37 9c ff f4 addi sp,sp,-12 801789c: 5b 8b 00 0c sw (sp+12),r11 80178a0: 5b 8c 00 08 sw (sp+8),r12 80178a4: 5b 9d 00 04 sw (sp+4),ra 80178a8: b8 20 20 00 mv r4,r1 /* * 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; 80178ac: 28 21 00 08 lw r1,(r1+8) Objects_Control *_Objects_Get_no_protection( Objects_Information *information, Objects_Id id, Objects_Locations *location ) { 80178b0: b8 60 58 00 mv r11,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; 80178b4: c8 41 08 00 sub r1,r2,r1 if ( information->maximum >= index ) { 80178b8: 2c 82 00 10 lhu r2,(r4+16) /* * 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; 80178bc: 34 21 00 01 addi r1,r1,1 if ( information->maximum >= index ) { 80178c0: 54 22 00 09 bgu r1,r2,80178e4 <_Objects_Get_no_protection+0x4c> if ( (the_object = information->local_table[ index ]) != NULL ) { 80178c4: 28 8c 00 1c lw r12,(r4+28) 80178c8: 34 02 00 02 mvi r2,2 80178cc: fb ff d9 62 calli 800de54 <__ashlsi3> 80178d0: b5 81 08 00 add r1,r12,r1 80178d4: 28 21 00 00 lw r1,(r1+0) 80178d8: 44 20 00 03 be r1,r0,80178e4 <_Objects_Get_no_protection+0x4c><== NEVER TAKEN *location = OBJECTS_LOCAL; 80178dc: 59 60 00 00 sw (r11+0),r0 return the_object; 80178e0: e0 00 00 04 bi 80178f0 <_Objects_Get_no_protection+0x58> /* * This isn't supported or required yet for Global objects so * if it isn't local, we don't find it. */ *location = OBJECTS_ERROR; 80178e4: 34 01 00 01 mvi r1,1 80178e8: 59 61 00 00 sw (r11+0),r1 return NULL; 80178ec: 34 01 00 00 mvi r1,0 } 80178f0: 2b 9d 00 04 lw ra,(sp+4) 80178f4: 2b 8b 00 0c lw r11,(sp+12) 80178f8: 2b 8c 00 08 lw r12,(sp+8) 80178fc: 37 9c 00 0c addi sp,sp,12 8017900: c3 a0 00 00 ret =============================================================================== 08006260 <_Objects_Id_to_name>: */ Objects_Name_or_id_lookup_errors _Objects_Id_to_name ( Objects_Id id, Objects_Name *name ) { 8006260: 37 9c ff e8 addi sp,sp,-24 8006264: 5b 8b 00 14 sw (sp+20),r11 8006268: 5b 8c 00 10 sw (sp+16),r12 800626c: 5b 8d 00 0c sw (sp+12),r13 8006270: 5b 8e 00 08 sw (sp+8),r14 8006274: 5b 9d 00 04 sw (sp+4),ra 8006278: b8 40 70 00 mv r14,r2 /* * Caller is trusted for name != NULL. */ tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id; 800627c: b8 20 58 00 mv r11,r1 8006280: 5c 20 00 05 bne r1,r0,8006294 <_Objects_Id_to_name+0x34> 8006284: 78 01 08 02 mvhi r1,0x802 8006288: 38 21 0d fc ori r1,r1,0xdfc 800628c: 28 21 00 0c lw r1,(r1+12) 8006290: 28 2b 00 08 lw r11,(r1+8) */ RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API( Objects_Id id ) { return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS); 8006294: 34 02 00 18 mvi r2,24 8006298: b9 60 08 00 mv r1,r11 800629c: f8 00 58 9f calli 801c518 <__lshrsi3> 80062a0: 20 21 00 07 andi r1,r1,0x7 */ RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid( uint32_t the_api ) { if ( !the_api || the_api > OBJECTS_APIS_LAST ) 80062a4: 34 23 ff ff addi r3,r1,-1 80062a8: 34 02 00 02 mvi r2,2 the_api = _Objects_Get_API( tmpId ); if ( !_Objects_Is_api_valid( the_api ) ) return OBJECTS_INVALID_ID; 80062ac: 34 0d 00 03 mvi r13,3 80062b0: 54 62 00 14 bgu r3,r2,8006300 <_Objects_Id_to_name+0xa0> 80062b4: e0 00 00 1b bi 8006320 <_Objects_Id_to_name+0xc0> */ RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class( Objects_Id id ) { return (uint32_t) 80062b8: 34 02 00 1b mvi r2,27 80062bc: b9 60 08 00 mv r1,r11 80062c0: f8 00 58 96 calli 801c518 <__lshrsi3> if ( !_Objects_Information_table[ the_api ] ) return OBJECTS_INVALID_ID; the_class = _Objects_Get_class( tmpId ); information = _Objects_Information_table[ the_api ][ the_class ]; 80062c4: 34 02 00 02 mvi r2,2 80062c8: fb ff ec dd calli 800163c <__ashlsi3> 80062cc: b5 81 08 00 add r1,r12,r1 80062d0: 28 21 00 00 lw r1,(r1+0) if ( !information ) 80062d4: 44 20 00 0b be r1,r0,8006300 <_Objects_Id_to_name+0xa0> <== NEVER TAKEN return OBJECTS_INVALID_ID; #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) if ( information->is_string ) 80062d8: 40 2c 00 38 lbu r12,(r1+56) 80062dc: 5d 80 00 09 bne r12,r0,8006300 <_Objects_Id_to_name+0xa0> <== NEVER TAKEN return OBJECTS_INVALID_ID; #endif the_object = _Objects_Get( information, tmpId, &ignored_location ); 80062e0: b9 60 10 00 mv r2,r11 80062e4: 37 83 00 18 addi r3,sp,24 80062e8: fb ff ff b8 calli 80061c8 <_Objects_Get> if ( !the_object ) 80062ec: 44 2c 00 05 be r1,r12,8006300 <_Objects_Id_to_name+0xa0> return OBJECTS_INVALID_ID; *name = the_object->name; 80062f0: 28 21 00 0c lw r1,(r1+12) _Thread_Enable_dispatch(); return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL; 80062f4: 34 0d 00 00 mvi r13,0 the_object = _Objects_Get( information, tmpId, &ignored_location ); if ( !the_object ) return OBJECTS_INVALID_ID; *name = the_object->name; 80062f8: 59 c1 00 00 sw (r14+0),r1 _Thread_Enable_dispatch(); 80062fc: f8 00 03 65 calli 8007090 <_Thread_Enable_dispatch> return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL; } 8006300: b9 a0 08 00 mv r1,r13 8006304: 2b 9d 00 04 lw ra,(sp+4) 8006308: 2b 8b 00 14 lw r11,(sp+20) 800630c: 2b 8c 00 10 lw r12,(sp+16) 8006310: 2b 8d 00 0c lw r13,(sp+12) 8006314: 2b 8e 00 08 lw r14,(sp+8) 8006318: 37 9c 00 18 addi sp,sp,24 800631c: c3 a0 00 00 ret the_api = _Objects_Get_API( tmpId ); if ( !_Objects_Is_api_valid( the_api ) ) return OBJECTS_INVALID_ID; if ( !_Objects_Information_table[ the_api ] ) 8006320: 78 0c 08 02 mvhi r12,0x802 8006324: 34 02 00 02 mvi r2,2 8006328: 39 8c 08 cc ori r12,r12,0x8cc 800632c: fb ff ec c4 calli 800163c <__ashlsi3> 8006330: b5 81 08 00 add r1,r12,r1 8006334: 28 2c 00 00 lw r12,(r1+0) 8006338: 5d 80 ff e0 bne r12,r0,80062b8 <_Objects_Id_to_name+0x58> 800633c: e3 ff ff f1 bi 8006300 <_Objects_Id_to_name+0xa0> =============================================================================== 08005c90 <_Objects_Initialize_information>: , bool supports_global, Objects_Thread_queue_Extract_callout extract #endif ) { 8005c90: 37 9c ff e4 addi sp,sp,-28 8005c94: 5b 8b 00 1c sw (sp+28),r11 8005c98: 5b 8c 00 18 sw (sp+24),r12 8005c9c: 5b 8d 00 14 sw (sp+20),r13 8005ca0: 5b 8e 00 10 sw (sp+16),r14 8005ca4: 5b 8f 00 0c sw (sp+12),r15 8005ca8: 5b 90 00 08 sw (sp+8),r16 8005cac: 5b 9d 00 04 sw (sp+4),ra 8005cb0: 20 6d ff ff andi r13,r3,0xffff 8005cb4: b8 20 58 00 mv r11,r1 8005cb8: 20 a5 ff ff andi r5,r5,0xffff uint32_t index; #endif information->the_api = the_api; information->the_class = the_class; information->size = size; 8005cbc: 58 25 00 18 sw (r1+24),r5 information->local_table = 0; information->inactive_per_block = 0; information->object_blocks = 0; information->inactive = 0; #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) information->is_string = is_string; 8005cc0: 30 26 00 38 sb (r1+56),r6 uint32_t maximum_per_allocation; #if defined(RTEMS_MULTIPROCESSING) uint32_t index; #endif information->the_api = the_api; 8005cc4: 59 62 00 00 sw (r11+0),r2 information->the_class = the_class; 8005cc8: 0c 2d 00 04 sh (r1+4),r13 information->size = size; information->local_table = 0; 8005ccc: 58 20 00 1c sw (r1+28),r0 information->inactive_per_block = 0; 8005cd0: 58 20 00 30 sw (r1+48),r0 information->object_blocks = 0; 8005cd4: 58 20 00 34 sw (r1+52),r0 information->inactive = 0; 8005cd8: 0c 20 00 2c sh (r1+44),r0 /* * Set the maximum value to 0. It will be updated when objects are * added to the inactive set from _Objects_Extend_information() */ information->maximum = 0; 8005cdc: 0c 20 00 10 sh (r1+16),r0 , bool supports_global, Objects_Thread_queue_Extract_callout extract #endif ) { 8005ce0: b8 40 70 00 mv r14,r2 information->maximum = 0; /* * Register this Object Class in the Object Information Table. */ _Objects_Information_table[ the_api ][ the_class ] = information; 8005ce4: b8 40 08 00 mv r1,r2 8005ce8: 78 0f 08 01 mvhi r15,0x801 8005cec: 34 02 00 02 mvi r2,2 , bool supports_global, Objects_Thread_queue_Extract_callout extract #endif ) { 8005cf0: b8 80 60 00 mv r12,r4 8005cf4: b8 e0 80 00 mv r16,r7 information->maximum = 0; /* * Register this Object Class in the Object Information Table. */ _Objects_Information_table[ the_api ][ the_class ] = information; 8005cf8: 39 ef 98 fc ori r15,r15,0x98fc 8005cfc: f8 00 44 90 calli 8016f3c <__ashlsi3> 8005d00: b5 e1 08 00 add r1,r15,r1 8005d04: 28 2f 00 00 lw r15,(r1+0) 8005d08: 34 02 00 02 mvi r2,2 8005d0c: b9 a0 08 00 mv r1,r13 8005d10: f8 00 44 8b calli 8016f3c <__ashlsi3> 8005d14: b5 e1 08 00 add r1,r15,r1 8005d18: 58 2b 00 00 sw (r1+0),r11 /* * Are we operating in limited or unlimited (e.g. auto-extend) mode. */ information->auto_extend = (maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false; 8005d1c: 34 02 00 1f mvi r2,31 8005d20: b9 80 08 00 mv r1,r12 8005d24: f8 00 44 d4 calli 8017074 <__lshrsi3> maximum_per_allocation = maximum & ~OBJECTS_UNLIMITED_OBJECTS; 8005d28: 78 03 08 01 mvhi r3,0x801 8005d2c: 38 63 81 b0 ori r3,r3,0x81b0 /* * Are we operating in limited or unlimited (e.g. auto-extend) mode. */ information->auto_extend = (maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false; 8005d30: 20 22 00 ff andi r2,r1,0xff maximum_per_allocation = maximum & ~OBJECTS_UNLIMITED_OBJECTS; 8005d34: 28 61 00 00 lw r1,(r3+0) _Objects_Information_table[ the_api ][ the_class ] = information; /* * Are we operating in limited or unlimited (e.g. auto-extend) mode. */ information->auto_extend = 8005d38: 31 62 00 12 sb (r11+18),r2 (maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false; maximum_per_allocation = maximum & ~OBJECTS_UNLIMITED_OBJECTS; 8005d3c: a1 81 60 00 and r12,r12,r1 /* * Unlimited and maximum of zero is illogical. */ if ( information->auto_extend && maximum_per_allocation == 0) { 8005d40: 44 40 00 06 be r2,r0,8005d58 <_Objects_Initialize_information+0xc8> 8005d44: 5d 80 00 05 bne r12,r0,8005d58 <_Objects_Initialize_information+0xc8><== ALWAYS TAKEN _Internal_error_Occurred( 8005d48: 34 01 00 00 mvi r1,0 <== NOT EXECUTED 8005d4c: 34 02 00 01 mvi r2,1 <== NOT EXECUTED 8005d50: 34 03 00 13 mvi r3,19 <== NOT EXECUTED 8005d54: fb ff fe 13 calli 80055a0 <_Internal_error_Occurred> <== NOT EXECUTED information->allocation_size = maximum_per_allocation; /* * Provide a null local table entry for the case of any empty table. */ information->local_table = &null_local_table; 8005d58: 78 01 08 01 mvhi r1,0x801 8005d5c: 38 21 97 24 ori r1,r1,0x9724 8005d60: 59 61 00 1c sw (r11+28),r1 8005d64: 34 02 00 18 mvi r2,24 8005d68: b9 c0 08 00 mv r1,r14 } /* * The allocation unit is the maximum value */ information->allocation_size = maximum_per_allocation; 8005d6c: 0d 6c 00 14 sh (r11+20),r12 8005d70: f8 00 44 73 calli 8016f3c <__ashlsi3> 8005d74: 78 0e 00 01 mvhi r14,0x1 8005d78: b8 2e 70 00 or r14,r1,r14 (( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) | 8005d7c: 34 02 00 1b mvi r2,27 8005d80: b9 a0 08 00 mv r1,r13 8005d84: f8 00 44 6e calli 8016f3c <__ashlsi3> information->local_table = &null_local_table; /* * Calculate minimum and maximum Id's */ minimum_index = (maximum_per_allocation == 0) ? 0 : 1; 8005d88: 7d 82 00 00 cmpnei r2,r12,0 8005d8c: b9 c1 08 00 or r1,r14,r1 uint32_t the_class, uint32_t node, uint32_t index ) { return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) | 8005d90: b8 22 08 00 or r1,r1,r2 information->minimum_id = 8005d94: 59 61 00 08 sw (r11+8),r1 /* * Calculate the maximum name length */ name_length = maximum_name_length; if ( name_length & (OBJECTS_NAME_ALIGNMENT-1) ) 8005d98: 22 01 00 03 andi r1,r16,0x3 8005d9c: ba 00 38 00 mv r7,r16 8005da0: 44 20 00 04 be r1,r0,8005db0 <_Objects_Initialize_information+0x120> name_length = (name_length + OBJECTS_NAME_ALIGNMENT) & 8005da4: 36 07 00 04 addi r7,r16,4 8005da8: 34 01 ff fc mvi r1,-4 8005dac: a0 e1 38 00 and r7,r7,r1 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 ); 8005db0: 35 61 00 24 addi r1,r11,36 head->next = tail; 8005db4: 59 61 00 20 sw (r11+32),r1 */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { Chain_Node *head = _Chain_Head( the_chain ); 8005db8: 35 61 00 20 addi r1,r11,32 ~(OBJECTS_NAME_ALIGNMENT-1); information->name_length = name_length; 8005dbc: 0d 67 00 3a sh (r11+58),r7 Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; head->previous = NULL; 8005dc0: 59 60 00 24 sw (r11+36),r0 tail->previous = head; 8005dc4: 59 61 00 28 sw (r11+40),r1 _Chain_Initialize_empty( &information->Inactive ); /* * Initialize objects .. if there are any */ if ( maximum_per_allocation ) { 8005dc8: 45 80 00 03 be r12,r0,8005dd4 <_Objects_Initialize_information+0x144> /* * Always have the maximum size available so the current performance * figures are create are met. If the user moves past the maximum * number then a performance hit is taken. */ _Objects_Extend_information( information ); 8005dcc: b9 60 08 00 mv r1,r11 8005dd0: fb ff fe 6a calli 8005778 <_Objects_Extend_information> _Chain_Initialize_empty( &information->global_table[ index ] ); } else information->global_table = NULL; #endif } 8005dd4: 2b 9d 00 04 lw ra,(sp+4) 8005dd8: 2b 8b 00 1c lw r11,(sp+28) 8005ddc: 2b 8c 00 18 lw r12,(sp+24) 8005de0: 2b 8d 00 14 lw r13,(sp+20) 8005de4: 2b 8e 00 10 lw r14,(sp+16) 8005de8: 2b 8f 00 0c lw r15,(sp+12) 8005dec: 2b 90 00 08 lw r16,(sp+8) 8005df0: 37 9c 00 1c addi sp,sp,28 8005df4: c3 a0 00 00 ret =============================================================================== 08004e60 <_Objects_Set_name>: bool _Objects_Set_name( Objects_Information *information, Objects_Control *the_object, const char *name ) { 8004e60: 37 9c ff ec addi sp,sp,-20 8004e64: 5b 8b 00 14 sw (sp+20),r11 8004e68: 5b 8c 00 10 sw (sp+16),r12 8004e6c: 5b 8d 00 0c sw (sp+12),r13 8004e70: 5b 8e 00 08 sw (sp+8),r14 8004e74: 5b 9d 00 04 sw (sp+4),ra 8004e78: b8 20 70 00 mv r14,r1 8004e7c: b8 40 68 00 mv r13,r2 size_t length; const char *s; s = name; length = strnlen( name, information->name_length ); 8004e80: 2d c2 00 3a lhu r2,(r14+58) 8004e84: b8 60 08 00 mv r1,r3 bool _Objects_Set_name( Objects_Information *information, Objects_Control *the_object, const char *name ) { 8004e88: b8 60 58 00 mv r11,r3 size_t length; const char *s; s = name; length = strnlen( name, information->name_length ); 8004e8c: f8 00 27 4d calli 800ebc0 8004e90: b8 20 60 00 mv r12,r1 #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) if ( information->is_string ) { 8004e94: 41 c1 00 38 lbu r1,(r14+56) 8004e98: 44 20 00 12 be r1,r0,8004ee0 <_Objects_Set_name+0x80> <== NEVER TAKEN char *d; d = _Workspace_Allocate( length + 1 ); 8004e9c: 35 81 00 01 addi r1,r12,1 8004ea0: f8 00 07 cf calli 8006ddc <_Workspace_Allocate> 8004ea4: b8 20 70 00 mv r14,r1 if ( !d ) return false; 8004ea8: 34 03 00 00 mvi r3,0 #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) if ( information->is_string ) { char *d; d = _Workspace_Allocate( length + 1 ); if ( !d ) 8004eac: 44 20 00 26 be r1,r0,8004f44 <_Objects_Set_name+0xe4> return false; if ( the_object->name.name_p ) { 8004eb0: 29 a1 00 0c lw r1,(r13+12) 8004eb4: 44 20 00 03 be r1,r0,8004ec0 <_Objects_Set_name+0x60> _Workspace_Free( (void *)the_object->name.name_p ); 8004eb8: f8 00 07 d4 calli 8006e08 <_Workspace_Free> the_object->name.name_p = NULL; 8004ebc: 59 a0 00 0c sw (r13+12),r0 } strncpy( d, name, length ); 8004ec0: b9 80 18 00 mv r3,r12 8004ec4: b9 c0 08 00 mv r1,r14 8004ec8: b9 60 10 00 mv r2,r11 d[length] = '\0'; 8004ecc: b5 cc 60 00 add r12,r14,r12 if ( the_object->name.name_p ) { _Workspace_Free( (void *)the_object->name.name_p ); the_object->name.name_p = NULL; } strncpy( d, name, length ); 8004ed0: f8 00 27 09 calli 800eaf4 d[length] = '\0'; 8004ed4: 31 80 00 00 sb (r12+0),r0 the_object->name.name_p = d; 8004ed8: 59 ae 00 0c sw (r13+12),r14 8004edc: e0 00 00 19 bi 8004f40 <_Objects_Set_name+0xe0> } else #endif { the_object->name.name_u32 = _Objects_Build_name( 8004ee0: 41 61 00 00 lbu r1,(r11+0) 8004ee4: 34 02 00 18 mvi r2,24 8004ee8: f8 00 59 24 calli 801b378 <__ashlsi3> 8004eec: 34 02 00 01 mvi r2,1 8004ef0: b8 20 70 00 mv r14,r1 8004ef4: 78 01 00 20 mvhi r1,0x20 8004ef8: 50 4c 00 04 bgeu r2,r12,8004f08 <_Objects_Set_name+0xa8> 8004efc: 41 61 00 01 lbu r1,(r11+1) 8004f00: 34 02 00 10 mvi r2,16 8004f04: f8 00 59 1d calli 801b378 <__ashlsi3> 8004f08: 34 02 00 02 mvi r2,2 8004f0c: b8 2e 70 00 or r14,r1,r14 8004f10: 34 01 20 00 mvi r1,8192 8004f14: 50 4c 00 04 bgeu r2,r12,8004f24 <_Objects_Set_name+0xc4> 8004f18: 41 61 00 02 lbu r1,(r11+2) 8004f1c: 34 02 00 08 mvi r2,8 8004f20: f8 00 59 16 calli 801b378 <__ashlsi3> 8004f24: 34 03 00 03 mvi r3,3 8004f28: b9 c1 08 00 or r1,r14,r1 8004f2c: 34 02 00 20 mvi r2,32 8004f30: 50 6c 00 02 bgeu r3,r12,8004f38 <_Objects_Set_name+0xd8> 8004f34: 41 62 00 03 lbu r2,(r11+3) 8004f38: b8 22 10 00 or r2,r1,r2 8004f3c: 59 a2 00 0c sw (r13+12),r2 ((3 < length) ? s[ 3 ] : ' ') ); } return true; 8004f40: 34 03 00 01 mvi r3,1 } 8004f44: b8 60 08 00 mv r1,r3 8004f48: 2b 9d 00 04 lw ra,(sp+4) 8004f4c: 2b 8b 00 14 lw r11,(sp+20) 8004f50: 2b 8c 00 10 lw r12,(sp+16) 8004f54: 2b 8d 00 0c lw r13,(sp+12) 8004f58: 2b 8e 00 08 lw r14,(sp+8) 8004f5c: 37 9c 00 14 addi sp,sp,20 8004f60: c3 a0 00 00 ret =============================================================================== 08003f54 <_POSIX_Condition_variables_Wait_support>: pthread_cond_t *cond, pthread_mutex_t *mutex, Watchdog_Interval timeout, bool already_timedout ) { 8003f54: 37 9c ff e0 addi sp,sp,-32 8003f58: 5b 8b 00 1c sw (sp+28),r11 8003f5c: 5b 8c 00 18 sw (sp+24),r12 8003f60: 5b 8d 00 14 sw (sp+20),r13 8003f64: 5b 8e 00 10 sw (sp+16),r14 8003f68: 5b 8f 00 0c sw (sp+12),r15 8003f6c: 5b 90 00 08 sw (sp+8),r16 8003f70: 5b 9d 00 04 sw (sp+4),ra 8003f74: b8 20 70 00 mv r14,r1 8003f78: b8 40 60 00 mv r12,r2 register POSIX_Condition_variables_Control *the_cond; Objects_Locations location; int status; int mutex_status; if ( !_POSIX_Mutex_Get( mutex, &location ) ) { 8003f7c: b8 40 08 00 mv r1,r2 8003f80: 37 82 00 20 addi r2,sp,32 pthread_cond_t *cond, pthread_mutex_t *mutex, Watchdog_Interval timeout, bool already_timedout ) { 8003f84: b8 60 78 00 mv r15,r3 8003f88: 20 90 00 ff andi r16,r4,0xff register POSIX_Condition_variables_Control *the_cond; Objects_Locations location; int status; int mutex_status; if ( !_POSIX_Mutex_Get( mutex, &location ) ) { 8003f8c: f8 00 00 62 calli 8004114 <_POSIX_Mutex_Get> return EINVAL; 8003f90: 34 0b 00 16 mvi r11,22 register POSIX_Condition_variables_Control *the_cond; Objects_Locations location; int status; int mutex_status; if ( !_POSIX_Mutex_Get( mutex, &location ) ) { 8003f94: 44 20 00 33 be r1,r0,8004060 <_POSIX_Condition_variables_Wait_support+0x10c><== NEVER TAKEN */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; 8003f98: 78 05 08 01 mvhi r5,0x801 8003f9c: 38 a5 78 a8 ori r5,r5,0x78a8 8003fa0: 28 a1 00 00 lw r1,(r5+0) return EINVAL; } _Thread_Unnest_dispatch(); the_cond = _POSIX_Condition_variables_Get( cond, &location ); 8003fa4: 37 82 00 20 addi r2,sp,32 8003fa8: 34 21 ff ff addi r1,r1,-1 8003fac: 58 a1 00 00 sw (r5+0),r1 8003fb0: b9 c0 08 00 mv r1,r14 8003fb4: fb ff ff 4d calli 8003ce8 <_POSIX_Condition_variables_Get> switch ( location ) { 8003fb8: 2b 85 00 20 lw r5,(sp+32) return EINVAL; } _Thread_Unnest_dispatch(); the_cond = _POSIX_Condition_variables_Get( cond, &location ); 8003fbc: b8 20 68 00 mv r13,r1 switch ( location ) { 8003fc0: 5c a0 00 28 bne r5,r0,8004060 <_POSIX_Condition_variables_Wait_support+0x10c><== NEVER TAKEN case OBJECTS_LOCAL: if ( the_cond->Mutex && ( the_cond->Mutex != *mutex ) ) { 8003fc4: 28 21 00 14 lw r1,(r1+20) 8003fc8: 44 25 00 05 be r1,r5,8003fdc <_POSIX_Condition_variables_Wait_support+0x88> 8003fcc: 29 82 00 00 lw r2,(r12+0) 8003fd0: 44 22 00 03 be r1,r2,8003fdc <_POSIX_Condition_variables_Wait_support+0x88> _Thread_Enable_dispatch(); 8003fd4: f8 00 0d f1 calli 8007798 <_Thread_Enable_dispatch> return EINVAL; 8003fd8: e0 00 00 22 bi 8004060 <_POSIX_Condition_variables_Wait_support+0x10c> } (void) pthread_mutex_unlock( mutex ); 8003fdc: b9 80 08 00 mv r1,r12 8003fe0: f8 00 01 17 calli 800443c _Thread_Enable_dispatch(); return EINVAL; } */ if ( !already_timedout ) { 8003fe4: 5e 00 00 19 bne r16,r0,8004048 <_POSIX_Condition_variables_Wait_support+0xf4><== NEVER TAKEN the_cond->Mutex = *mutex; 8003fe8: 29 81 00 00 lw r1,(r12+0) _Thread_queue_Enter_critical_section( &the_cond->Wait_queue ); _Thread_Executing->Wait.return_code = 0; 8003fec: 78 0b 08 01 mvhi r11,0x801 8003ff0: 39 6b 7d 74 ori r11,r11,0x7d74 8003ff4: 29 64 00 0c lw r4,(r11+12) return EINVAL; } */ if ( !already_timedout ) { the_cond->Mutex = *mutex; 8003ff8: 59 a1 00 14 sw (r13+20),r1 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; 8003ffc: 34 01 00 01 mvi r1,1 8004000: 59 a1 00 48 sw (r13+72),r1 _Thread_queue_Enter_critical_section( &the_cond->Wait_queue ); _Thread_Executing->Wait.return_code = 0; 8004004: 58 80 00 34 sw (r4+52),r0 _Thread_Executing->Wait.queue = &the_cond->Wait_queue; _Thread_Executing->Wait.id = *cond; 8004008: 29 c1 00 00 lw r1,(r14+0) if ( !already_timedout ) { the_cond->Mutex = *mutex; _Thread_queue_Enter_critical_section( &the_cond->Wait_queue ); _Thread_Executing->Wait.return_code = 0; _Thread_Executing->Wait.queue = &the_cond->Wait_queue; 800400c: 35 ad 00 18 addi r13,r13,24 _Thread_Executing->Wait.id = *cond; _Thread_queue_Enqueue( &the_cond->Wait_queue, timeout ); 8004010: 78 03 08 00 mvhi r3,0x800 the_cond->Mutex = *mutex; _Thread_queue_Enter_critical_section( &the_cond->Wait_queue ); _Thread_Executing->Wait.return_code = 0; _Thread_Executing->Wait.queue = &the_cond->Wait_queue; _Thread_Executing->Wait.id = *cond; 8004014: 58 81 00 20 sw (r4+32),r1 if ( !already_timedout ) { the_cond->Mutex = *mutex; _Thread_queue_Enter_critical_section( &the_cond->Wait_queue ); _Thread_Executing->Wait.return_code = 0; _Thread_Executing->Wait.queue = &the_cond->Wait_queue; 8004018: 58 8d 00 44 sw (r4+68),r13 _Thread_Executing->Wait.id = *cond; _Thread_queue_Enqueue( &the_cond->Wait_queue, timeout ); 800401c: b9 a0 08 00 mv r1,r13 8004020: b9 e0 10 00 mv r2,r15 8004024: 38 63 82 04 ori r3,r3,0x8204 8004028: f8 00 0f 0c calli 8007c58 <_Thread_queue_Enqueue_with_handler> _Thread_Enable_dispatch(); 800402c: f8 00 0d db calli 8007798 <_Thread_Enable_dispatch> * a POSIX signal, then pthread_cond_wait returns spuriously, * according to the POSIX standard. It means that pthread_cond_wait * returns a success status, except for the fact that it was not * woken up a pthread_cond_signal or a pthread_cond_broadcast. */ status = _Thread_Executing->Wait.return_code; 8004030: 29 61 00 0c lw r1,(r11+12) 8004034: 28 2b 00 34 lw r11,(r1+52) if ( status == EINTR ) status = 0; 8004038: 7d 61 00 04 cmpnei r1,r11,4 800403c: c8 01 08 00 sub r1,r0,r1 8004040: a1 61 58 00 and r11,r11,r1 8004044: e0 00 00 03 bi 8004050 <_POSIX_Condition_variables_Wait_support+0xfc> } else { _Thread_Enable_dispatch(); 8004048: f8 00 0d d4 calli 8007798 <_Thread_Enable_dispatch> status = ETIMEDOUT; 800404c: 34 0b 00 74 mvi r11,116 /* * When we get here the dispatch disable level is 0. */ mutex_status = pthread_mutex_lock( mutex ); 8004050: b9 80 08 00 mv r1,r12 8004054: f8 00 00 c7 calli 8004370 if ( mutex_status ) 8004058: 44 20 00 02 be r1,r0,8004060 <_POSIX_Condition_variables_Wait_support+0x10c> return EINVAL; 800405c: 34 0b 00 16 mvi r11,22 case OBJECTS_ERROR: break; } return EINVAL; } 8004060: b9 60 08 00 mv r1,r11 8004064: 2b 9d 00 04 lw ra,(sp+4) 8004068: 2b 8b 00 1c lw r11,(sp+28) 800406c: 2b 8c 00 18 lw r12,(sp+24) 8004070: 2b 8d 00 14 lw r13,(sp+20) 8004074: 2b 8e 00 10 lw r14,(sp+16) 8004078: 2b 8f 00 0c lw r15,(sp+12) 800407c: 2b 90 00 08 lw r16,(sp+8) 8004080: 37 9c 00 20 addi sp,sp,32 8004084: c3 a0 00 00 ret =============================================================================== 08008d7c <_POSIX_Message_queue_Receive_support>: size_t msg_len, unsigned int *msg_prio, bool wait, Watchdog_Interval timeout ) { 8008d7c: 37 9c ff dc addi sp,sp,-36 8008d80: 5b 8b 00 18 sw (sp+24),r11 8008d84: 5b 8c 00 14 sw (sp+20),r12 8008d88: 5b 8d 00 10 sw (sp+16),r13 8008d8c: 5b 8e 00 0c sw (sp+12),r14 8008d90: 5b 8f 00 08 sw (sp+8),r15 8008d94: 5b 9d 00 04 sw (sp+4),ra 8008d98: b8 20 58 00 mv r11,r1 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( 8008d9c: 78 01 08 02 mvhi r1,0x802 8008da0: b8 40 60 00 mv r12,r2 8008da4: b8 60 78 00 mv r15,r3 8008da8: b9 60 10 00 mv r2,r11 8008dac: 38 21 a2 58 ori r1,r1,0xa258 8008db0: 37 83 00 24 addi r3,sp,36 8008db4: 5b 86 00 1c sw (sp+28),r6 8008db8: b8 80 68 00 mv r13,r4 8008dbc: 20 ae 00 ff andi r14,r5,0xff 8008dc0: f8 00 0c c6 calli 800c0d8 <_Objects_Get> Objects_Locations location; size_t length_out; bool do_wait; the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location ); switch ( location ) { 8008dc4: 2b 82 00 24 lw r2,(sp+36) 8008dc8: 2b 86 00 1c lw r6,(sp+28) 8008dcc: 5c 40 00 2f bne r2,r0,8008e88 <_POSIX_Message_queue_Receive_support+0x10c> case OBJECTS_LOCAL: if ( (the_mq_fd->oflag & O_ACCMODE) == O_WRONLY ) { 8008dd0: 28 28 00 14 lw r8,(r1+20) 8008dd4: 34 02 00 01 mvi r2,1 8008dd8: 21 03 00 03 andi r3,r8,0x3 8008ddc: 5c 62 00 03 bne r3,r2,8008de8 <_POSIX_Message_queue_Receive_support+0x6c> _Thread_Enable_dispatch(); 8008de0: f8 00 10 41 calli 800cee4 <_Thread_Enable_dispatch> 8008de4: e0 00 00 29 bi 8008e88 <_POSIX_Message_queue_Receive_support+0x10c> rtems_set_errno_and_return_minus_one( EBADF ); } the_mq = the_mq_fd->Queue; 8008de8: 28 27 00 10 lw r7,(r1+16) if ( msg_len < the_mq->Message_queue.maximum_message_size ) { 8008dec: 28 e1 00 68 lw r1,(r7+104) 8008df0: 51 e1 00 05 bgeu r15,r1,8008e04 <_POSIX_Message_queue_Receive_support+0x88> _Thread_Enable_dispatch(); 8008df4: f8 00 10 3c calli 800cee4 <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one( EMSGSIZE ); 8008df8: f8 00 2e e5 calli 801498c <__errno> 8008dfc: 34 02 00 7a mvi r2,122 8008e00: e0 00 00 24 bi 8008e90 <_POSIX_Message_queue_Receive_support+0x114> /* * Now if something goes wrong, we return a "length" of -1 * to indicate an error. */ length_out = -1; 8008e04: 34 01 ff ff mvi r1,-1 8008e08: 5b 81 00 20 sw (sp+32),r1 /* * A timed receive with a bad time will do a poll regardless. */ if ( wait ) 8008e0c: 34 05 00 00 mvi r5,0 8008e10: 45 c0 00 03 be r14,r0,8008e1c <_POSIX_Message_queue_Receive_support+0xa0><== NEVER TAKEN do_wait = (the_mq_fd->oflag & O_NONBLOCK) ? false : true; 8008e14: 21 05 40 00 andi r5,r8,0x4000 8008e18: 64 a5 00 00 cmpei r5,r5,0 do_wait = wait; /* * Now perform the actual message receive */ _CORE_message_queue_Seize( 8008e1c: b9 60 10 00 mv r2,r11 timeout ); _Thread_Enable_dispatch(); *msg_prio = _POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count); 8008e20: 78 0b 08 02 mvhi r11,0x802 do_wait = wait; /* * Now perform the actual message receive */ _CORE_message_queue_Seize( 8008e24: 34 e1 00 1c addi r1,r7,28 8008e28: b9 80 18 00 mv r3,r12 8008e2c: 37 84 00 20 addi r4,sp,32 timeout ); _Thread_Enable_dispatch(); *msg_prio = _POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count); 8008e30: 39 6b a2 c4 ori r11,r11,0xa2c4 do_wait = wait; /* * Now perform the actual message receive */ _CORE_message_queue_Seize( 8008e34: f8 00 07 8b calli 800ac60 <_CORE_message_queue_Seize> &length_out, do_wait, timeout ); _Thread_Enable_dispatch(); 8008e38: f8 00 10 2b calli 800cee4 <_Thread_Enable_dispatch> *msg_prio = _POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count); 8008e3c: 29 6c 00 0c lw r12,(r11+12) 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); 8008e40: 34 02 00 1f mvi r2,31 8008e44: 29 81 00 24 lw r1,(r12+36) 8008e48: f8 00 6e 2e calli 8024700 <__ashrsi3> 8008e4c: 29 82 00 24 lw r2,(r12+36) 8008e50: 98 22 10 00 xor r2,r1,r2 8008e54: c8 41 08 00 sub r1,r2,r1 do_wait, timeout ); _Thread_Enable_dispatch(); *msg_prio = 8008e58: 59 a1 00 00 sw (r13+0),r1 _POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count); if ( !_Thread_Executing->Wait.return_code ) 8008e5c: 29 81 00 34 lw r1,(r12+52) 8008e60: 5c 20 00 03 bne r1,r0,8008e6c <_POSIX_Message_queue_Receive_support+0xf0> return length_out; 8008e64: 2b 81 00 20 lw r1,(sp+32) 8008e68: e0 00 00 0c bi 8008e98 <_POSIX_Message_queue_Receive_support+0x11c> rtems_set_errno_and_return_minus_one( 8008e6c: f8 00 2e c8 calli 801498c <__errno> 8008e70: b8 20 60 00 mv r12,r1 8008e74: 29 61 00 0c lw r1,(r11+12) 8008e78: 28 21 00 34 lw r1,(r1+52) 8008e7c: f8 00 00 b9 calli 8009160 <_POSIX_Message_queue_Translate_core_message_queue_return_code> 8008e80: 59 81 00 00 sw (r12+0),r1 8008e84: e0 00 00 04 bi 8008e94 <_POSIX_Message_queue_Receive_support+0x118> #endif case OBJECTS_ERROR: break; } rtems_set_errno_and_return_minus_one( EBADF ); 8008e88: f8 00 2e c1 calli 801498c <__errno> 8008e8c: 34 02 00 09 mvi r2,9 8008e90: 58 22 00 00 sw (r1+0),r2 8008e94: 34 01 ff ff mvi r1,-1 } 8008e98: 2b 9d 00 04 lw ra,(sp+4) 8008e9c: 2b 8b 00 18 lw r11,(sp+24) 8008ea0: 2b 8c 00 14 lw r12,(sp+20) 8008ea4: 2b 8d 00 10 lw r13,(sp+16) 8008ea8: 2b 8e 00 0c lw r14,(sp+12) 8008eac: 2b 8f 00 08 lw r15,(sp+8) 8008eb0: 37 9c 00 24 addi sp,sp,36 8008eb4: c3 a0 00 00 ret =============================================================================== 080085f8 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch>: #include void _POSIX_Thread_Evaluate_cancellation_and_enable_dispatch( Thread_Control *the_thread ) { 80085f8: 37 9c ff fc addi sp,sp,-4 80085fc: 5b 9d 00 04 sw (sp+4),ra POSIX_API_Control *thread_support; thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ]; 8008600: 28 22 01 20 lw r2,(r1+288) if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE && 8008604: 28 43 00 d8 lw r3,(r2+216) 8008608: 5c 60 00 0e bne r3,r0,8008640 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x48><== NEVER TAKEN 800860c: 28 44 00 dc lw r4,(r2+220) 8008610: 34 03 00 01 mvi r3,1 8008614: 5c 83 00 0b bne r4,r3,8008640 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x48> thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS && 8008618: 28 42 00 e0 lw r2,(r2+224) 800861c: 44 40 00 09 be r2,r0,8008640 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x48> */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; 8008620: 78 02 08 01 mvhi r2,0x801 8008624: 38 42 58 98 ori r2,r2,0x5898 8008628: 28 43 00 00 lw r3,(r2+0) 800862c: 34 63 ff ff addi r3,r3,-1 8008630: 58 43 00 00 sw (r2+0),r3 thread_support->cancelation_requested ) { _Thread_Unnest_dispatch(); _POSIX_Thread_Exit( the_thread, PTHREAD_CANCELED ); 8008634: 34 02 ff ff mvi r2,-1 8008638: f8 00 02 62 calli 8008fc0 <_POSIX_Thread_Exit> 800863c: e0 00 00 02 bi 8008644 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x4c> } else _Thread_Enable_dispatch(); 8008640: fb ff f3 7d calli 8005434 <_Thread_Enable_dispatch> } 8008644: 2b 9d 00 04 lw ra,(sp+4) 8008648: 37 9c 00 04 addi sp,sp,4 800864c: c3 a0 00 00 ret =============================================================================== 0800a060 <_POSIX_Thread_Translate_sched_param>: int policy, struct sched_param *param, Thread_CPU_budget_algorithms *budget_algorithm, Thread_CPU_budget_algorithm_callout *budget_callout ) { 800a060: 37 9c ff e8 addi sp,sp,-24 800a064: 5b 8b 00 18 sw (sp+24),r11 800a068: 5b 8c 00 14 sw (sp+20),r12 800a06c: 5b 8d 00 10 sw (sp+16),r13 800a070: 5b 8e 00 0c sw (sp+12),r14 800a074: 5b 8f 00 08 sw (sp+8),r15 800a078: 5b 9d 00 04 sw (sp+4),ra 800a07c: b8 20 68 00 mv r13,r1 if ( !_POSIX_Priority_Is_valid( param->sched_priority ) ) 800a080: 28 41 00 00 lw r1,(r2+0) int policy, struct sched_param *param, Thread_CPU_budget_algorithms *budget_algorithm, Thread_CPU_budget_algorithm_callout *budget_callout ) { 800a084: b8 40 58 00 mv r11,r2 800a088: b8 60 70 00 mv r14,r3 800a08c: b8 80 78 00 mv r15,r4 if ( !_POSIX_Priority_Is_valid( param->sched_priority ) ) 800a090: fb ff ff ec calli 800a040 <_POSIX_Priority_Is_valid> return EINVAL; 800a094: 34 0c 00 16 mvi r12,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 ) ) 800a098: 44 20 00 2a be r1,r0,800a140 <_POSIX_Thread_Translate_sched_param+0xe0><== NEVER TAKEN return EINVAL; *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; 800a09c: 59 c0 00 00 sw (r14+0),r0 *budget_callout = NULL; 800a0a0: 59 e0 00 00 sw (r15+0),r0 if ( policy == SCHED_OTHER ) { 800a0a4: 5d a0 00 04 bne r13,r0,800a0b4 <_POSIX_Thread_Translate_sched_param+0x54> *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; 800a0a8: 34 01 00 01 mvi r1,1 800a0ac: 59 c1 00 00 sw (r14+0),r1 800a0b0: e0 00 00 23 bi 800a13c <_POSIX_Thread_Translate_sched_param+0xdc> return 0; } if ( policy == SCHED_FIFO ) { 800a0b4: 34 01 00 01 mvi r1,1 *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; return 0; 800a0b8: 34 0c 00 00 mvi r12,0 if ( policy == SCHED_OTHER ) { *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; return 0; } if ( policy == SCHED_FIFO ) { 800a0bc: 45 a1 00 21 be r13,r1,800a140 <_POSIX_Thread_Translate_sched_param+0xe0> *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; return 0; } if ( policy == SCHED_RR ) { 800a0c0: 34 01 00 02 mvi r1,2 800a0c4: 5d a1 00 03 bne r13,r1,800a0d0 <_POSIX_Thread_Translate_sched_param+0x70> *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE; 800a0c8: 59 cd 00 00 sw (r14+0),r13 return 0; 800a0cc: e0 00 00 1d bi 800a140 <_POSIX_Thread_Translate_sched_param+0xe0> } if ( policy == SCHED_SPORADIC ) { 800a0d0: 34 01 00 04 mvi r1,4 *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT; *budget_callout = _POSIX_Threads_Sporadic_budget_callout; return 0; } return EINVAL; 800a0d4: 34 0c 00 16 mvi r12,22 if ( policy == SCHED_RR ) { *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE; return 0; } if ( policy == SCHED_SPORADIC ) { 800a0d8: 5d a1 00 1a bne r13,r1,800a140 <_POSIX_Thread_Translate_sched_param+0xe0> if ( (param->sched_ss_repl_period.tv_sec == 0) && 800a0dc: 29 61 00 08 lw r1,(r11+8) 800a0e0: 5c 20 00 03 bne r1,r0,800a0ec <_POSIX_Thread_Translate_sched_param+0x8c> 800a0e4: 29 62 00 0c lw r2,(r11+12) 800a0e8: 44 41 00 16 be r2,r1,800a140 <_POSIX_Thread_Translate_sched_param+0xe0> (param->sched_ss_repl_period.tv_nsec == 0) ) return EINVAL; if ( (param->sched_ss_init_budget.tv_sec == 0) && 800a0ec: 29 61 00 10 lw r1,(r11+16) 800a0f0: 5c 20 00 04 bne r1,r0,800a100 <_POSIX_Thread_Translate_sched_param+0xa0> 800a0f4: 29 62 00 14 lw r2,(r11+20) (param->sched_ss_init_budget.tv_nsec == 0) ) return EINVAL; 800a0f8: 34 0c 00 16 mvi r12,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) && 800a0fc: 44 41 00 11 be r2,r1,800a140 <_POSIX_Thread_Translate_sched_param+0xe0> (param->sched_ss_init_budget.tv_nsec == 0) ) return EINVAL; if ( _Timespec_To_ticks( ¶m->sched_ss_repl_period ) < 800a100: 35 61 00 08 addi r1,r11,8 800a104: fb ff f4 98 calli 8007364 <_Timespec_To_ticks> 800a108: b8 20 68 00 mv r13,r1 _Timespec_To_ticks( ¶m->sched_ss_init_budget ) ) 800a10c: 35 61 00 10 addi r1,r11,16 800a110: fb ff f4 95 calli 8007364 <_Timespec_To_ticks> return EINVAL; 800a114: 34 0c 00 16 mvi r12,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 ) < 800a118: 54 2d 00 0a bgu r1,r13,800a140 <_POSIX_Thread_Translate_sched_param+0xe0> _Timespec_To_ticks( ¶m->sched_ss_init_budget ) ) return EINVAL; if ( !_POSIX_Priority_Is_valid( param->sched_ss_low_priority ) ) 800a11c: 29 61 00 04 lw r1,(r11+4) 800a120: fb ff ff c8 calli 800a040 <_POSIX_Priority_Is_valid> 800a124: 44 20 00 07 be r1,r0,800a140 <_POSIX_Thread_Translate_sched_param+0xe0> return EINVAL; *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT; 800a128: 34 01 00 03 mvi r1,3 800a12c: 59 c1 00 00 sw (r14+0),r1 *budget_callout = _POSIX_Threads_Sporadic_budget_callout; 800a130: 78 01 08 00 mvhi r1,0x800 800a134: 38 21 38 00 ori r1,r1,0x3800 800a138: 59 e1 00 00 sw (r15+0),r1 return 0; 800a13c: 34 0c 00 00 mvi r12,0 } return EINVAL; } 800a140: b9 80 08 00 mv r1,r12 800a144: 2b 9d 00 04 lw ra,(sp+4) 800a148: 2b 8b 00 18 lw r11,(sp+24) 800a14c: 2b 8c 00 14 lw r12,(sp+20) 800a150: 2b 8d 00 10 lw r13,(sp+16) 800a154: 2b 8e 00 0c lw r14,(sp+12) 800a158: 2b 8f 00 08 lw r15,(sp+8) 800a15c: 37 9c 00 18 addi sp,sp,24 800a160: c3 a0 00 00 ret =============================================================================== 08003480 <_POSIX_Threads_Initialize_user_threads_body>: * * Output parameters: NONE */ void _POSIX_Threads_Initialize_user_threads_body(void) { 8003480: 37 9c ff a8 addi sp,sp,-88 8003484: 5b 8b 00 14 sw (sp+20),r11 8003488: 5b 8c 00 10 sw (sp+16),r12 800348c: 5b 8d 00 0c sw (sp+12),r13 8003490: 5b 8e 00 08 sw (sp+8),r14 8003494: 5b 9d 00 04 sw (sp+4),ra 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; 8003498: 78 01 08 01 mvhi r1,0x801 800349c: 38 21 f0 a8 ori r1,r1,0xf0a8 maximum = Configuration_POSIX_API.number_of_initialization_threads; 80034a0: 28 2e 00 30 lw r14,(r1+48) 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; 80034a4: 28 2c 00 34 lw r12,(r1+52) maximum = Configuration_POSIX_API.number_of_initialization_threads; if ( !user_threads || maximum == 0 ) 80034a8: 65 c2 00 00 cmpei r2,r14,0 80034ac: 65 81 00 00 cmpei r1,r12,0 80034b0: b8 41 08 00 or r1,r2,r1 80034b4: 5c 20 00 18 bne r1,r0,8003514 <_POSIX_Threads_Initialize_user_threads_body+0x94><== NEVER TAKEN 80034b8: 34 0d 00 00 mvi r13,0 for ( index=0 ; index < maximum ; index++ ) { /* * There is no way for these calls to fail in this situation. */ (void) pthread_attr_init( &attr ); 80034bc: 37 8b 00 18 addi r11,sp,24 80034c0: b9 60 08 00 mv r1,r11 80034c4: f8 00 1b 28 calli 800a164 (void) pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED ); 80034c8: 34 02 00 02 mvi r2,2 80034cc: b9 60 08 00 mv r1,r11 80034d0: f8 00 1b 32 calli 800a198 (void) pthread_attr_setstacksize(&attr, user_threads[ index ].stack_size); 80034d4: 29 82 00 04 lw r2,(r12+4) 80034d8: b9 60 08 00 mv r1,r11 80034dc: f8 00 1b 3b calli 800a1c8 status = pthread_create( 80034e0: 29 83 00 00 lw r3,(r12+0) 80034e4: 37 81 00 58 addi r1,sp,88 80034e8: b9 60 10 00 mv r2,r11 80034ec: 34 04 00 00 mvi r4,0 80034f0: fb ff fe ed calli 80030a4 80034f4: b8 20 18 00 mv r3,r1 &thread_id, &attr, user_threads[ index ].thread_entry, NULL ); if ( status ) 80034f8: 44 20 00 04 be r1,r0,8003508 <_POSIX_Threads_Initialize_user_threads_body+0x88> _Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status ); 80034fc: 34 01 00 02 mvi r1,2 8003500: 34 02 00 01 mvi r2,1 8003504: f8 00 07 1e calli 800517c <_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++ ) { 8003508: 35 ad 00 01 addi r13,r13,1 800350c: 35 8c 00 08 addi r12,r12,8 8003510: 55 cd ff ec bgu r14,r13,80034c0 <_POSIX_Threads_Initialize_user_threads_body+0x40><== NEVER TAKEN NULL ); if ( status ) _Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status ); } } 8003514: 2b 9d 00 04 lw ra,(sp+4) 8003518: 2b 8b 00 14 lw r11,(sp+20) 800351c: 2b 8c 00 10 lw r12,(sp+16) 8003520: 2b 8d 00 0c lw r13,(sp+12) 8003524: 2b 8e 00 08 lw r14,(sp+8) 8003528: 37 9c 00 58 addi sp,sp,88 800352c: c3 a0 00 00 ret =============================================================================== 0800d4e8 <_POSIX_Threads_Sporadic_budget_TSR>: */ void _POSIX_Threads_Sporadic_budget_TSR( Objects_Id id __attribute__((unused)), void *argument ) { 800d4e8: 37 9c ff f4 addi sp,sp,-12 800d4ec: 5b 8b 00 0c sw (sp+12),r11 800d4f0: 5b 8c 00 08 sw (sp+8),r12 800d4f4: 5b 9d 00 04 sw (sp+4),ra Thread_Control *the_thread; POSIX_API_Control *api; the_thread = argument; api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 800d4f8: 28 4c 01 20 lw r12,(r2+288) */ void _POSIX_Threads_Sporadic_budget_TSR( Objects_Id id __attribute__((unused)), void *argument ) { 800d4fc: b8 40 58 00 mv r11,r2 the_thread = argument; api = the_thread->API_Extensions[ THREAD_API_POSIX ]; /* ticks is guaranteed to be at least one */ ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_init_budget ); 800d500: 35 81 00 98 addi r1,r12,152 800d504: f8 00 07 e0 calli 800f484 <_Timespec_To_ticks> the_thread->cpu_time_budget = ticks; 800d508: 59 61 00 78 sw (r11+120),r1 RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core( int priority ) { return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1); 800d50c: 78 01 08 01 mvhi r1,0x801 800d510: 38 21 90 a8 ori r1,r1,0x90a8 800d514: 40 21 00 00 lbu r1,(r1+0) 800d518: 29 82 00 88 lw r2,(r12+136) 800d51c: c8 22 10 00 sub r2,r1,r2 */ #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 ) { 800d520: 29 61 00 1c lw r1,(r11+28) 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; 800d524: 59 62 00 18 sw (r11+24),r2 */ #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 ) { 800d528: 5c 20 00 06 bne r1,r0,800d540 <_POSIX_Threads_Sporadic_budget_TSR+0x58><== NEVER TAKEN /* * If this would make them less important, then do not change it. */ if ( the_thread->current_priority > new_priority ) { 800d52c: 29 61 00 14 lw r1,(r11+20) 800d530: 50 41 00 04 bgeu r2,r1,800d540 <_POSIX_Threads_Sporadic_budget_TSR+0x58> _Thread_Change_priority( the_thread, new_priority, true ); 800d534: b9 60 08 00 mv r1,r11 800d538: 34 03 00 01 mvi r3,1 800d53c: fb ff e4 00 calli 800653c <_Thread_Change_priority> #endif } } /* ticks is guaranteed to be at least one */ ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_repl_period ); 800d540: 35 81 00 90 addi r1,r12,144 800d544: f8 00 07 d0 calli 800f484 <_Timespec_To_ticks> Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 800d548: 59 81 00 b4 sw (r12+180),r1 _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 800d54c: 78 01 08 01 mvhi r1,0x801 800d550: 38 21 9a 40 ori r1,r1,0x9a40 800d554: 35 82 00 a8 addi r2,r12,168 800d558: fb ff e9 52 calli 8007aa0 <_Watchdog_Insert> _Watchdog_Insert_ticks( &api->Sporadic_timer, ticks ); } 800d55c: 2b 9d 00 04 lw ra,(sp+4) 800d560: 2b 8b 00 0c lw r11,(sp+12) 800d564: 2b 8c 00 08 lw r12,(sp+8) 800d568: 37 9c 00 0c addi sp,sp,12 800d56c: c3 a0 00 00 ret =============================================================================== 0800d570 <_POSIX_Threads_Sporadic_budget_callout>: * _POSIX_Threads_Sporadic_budget_callout */ void _POSIX_Threads_Sporadic_budget_callout( Thread_Control *the_thread ) { 800d570: 37 9c ff fc addi sp,sp,-4 800d574: 5b 9d 00 04 sw (sp+4),ra /* * 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 */ 800d578: 34 02 ff ff mvi r2,-1 ) { POSIX_API_Control *api; uint32_t new_priority; api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 800d57c: 28 25 01 20 lw r5,(r1+288) /* * 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 */ 800d580: 58 22 00 78 sw (r1+120),r2 800d584: 78 02 08 01 mvhi r2,0x801 800d588: 38 42 90 a8 ori r2,r2,0x90a8 800d58c: 40 44 00 00 lbu r4,(r2+0) 800d590: 28 a2 00 8c lw r2,(r5+140) 800d594: c8 82 10 00 sub r2,r4,r2 */ #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 ) { 800d598: 28 24 00 1c lw r4,(r1+28) * 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; 800d59c: 58 22 00 18 sw (r1+24),r2 */ #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 ) { 800d5a0: 5c 80 00 05 bne r4,r0,800d5b4 <_POSIX_Threads_Sporadic_budget_callout+0x44><== 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 ) { 800d5a4: 28 23 00 14 lw r3,(r1+20) 800d5a8: 50 62 00 03 bgeu r3,r2,800d5b4 <_POSIX_Threads_Sporadic_budget_callout+0x44><== NEVER TAKEN _Thread_Change_priority( the_thread, new_priority, true ); 800d5ac: 34 03 00 01 mvi r3,1 800d5b0: fb ff e3 e3 calli 800653c <_Thread_Change_priority> #if 0 printk( "lower priority\n" ); #endif } } } 800d5b4: 2b 9d 00 04 lw ra,(sp+4) 800d5b8: 37 9c 00 04 addi sp,sp,4 800d5bc: c3 a0 00 00 ret =============================================================================== 08003180 <_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) { 8003180: 37 9c ff f8 addi sp,sp,-8 8003184: 5b 8b 00 08 sw (sp+8),r11 8003188: 5b 9d 00 04 sw (sp+4),ra bool activated; ptimer = (POSIX_Timer_Control *)data; /* Increment the number of expirations. */ ptimer->overrun = ptimer->overrun + 1; 800318c: 28 41 00 68 lw r1,(r2+104) * This is the operation that is run when a timer expires */ void _POSIX_Timer_TSR( Objects_Id timer __attribute__((unused)), void *data) { 8003190: b8 40 58 00 mv r11,r2 bool activated; ptimer = (POSIX_Timer_Control *)data; /* Increment the number of expirations. */ ptimer->overrun = ptimer->overrun + 1; 8003194: 34 21 00 01 addi r1,r1,1 8003198: 58 41 00 68 sw (r2+104),r1 /* The timer must be reprogrammed */ if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) || 800319c: 28 41 00 54 lw r1,(r2+84) 80031a0: 5c 20 00 03 bne r1,r0,80031ac <_POSIX_Timer_TSR+0x2c> 80031a4: 28 42 00 58 lw r2,(r2+88) 80031a8: 44 41 00 0d be r2,r1,80031dc <_POSIX_Timer_TSR+0x5c> <== NEVER TAKEN ( ptimer->timer_data.it_interval.tv_nsec != 0 ) ) { activated = _POSIX_Timer_Insert_helper( 80031ac: 29 62 00 64 lw r2,(r11+100) 80031b0: 29 63 00 08 lw r3,(r11+8) 80031b4: 78 04 08 00 mvhi r4,0x800 80031b8: 35 61 00 10 addi r1,r11,16 80031bc: 38 84 31 80 ori r4,r4,0x3180 80031c0: b9 60 28 00 mv r5,r11 80031c4: f8 00 1a 6f calli 8009b80 <_POSIX_Timer_Insert_helper> ptimer->ticks, ptimer->Object.id, _POSIX_Timer_TSR, ptimer ); if ( !activated ) 80031c8: 44 20 00 0b be r1,r0,80031f4 <_POSIX_Timer_TSR+0x74> <== NEVER TAKEN return; /* Store the time when the timer was started again */ _TOD_Get( &ptimer->time ); 80031cc: 35 61 00 6c addi r1,r11,108 80031d0: f8 00 04 82 calli 80043d8 <_TOD_Get> /* The state really did not change but just to be safe */ ptimer->state = POSIX_TIMER_STATE_CREATE_RUN; 80031d4: 34 01 00 03 mvi r1,3 80031d8: e0 00 00 02 bi 80031e0 <_POSIX_Timer_TSR+0x60> } else { /* Indicates that the timer is stopped */ ptimer->state = POSIX_TIMER_STATE_CREATE_STOP; 80031dc: 34 01 00 04 mvi r1,4 80031e0: 31 61 00 3c sb (r11+60),r1 /* * 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 ) ) { 80031e4: 29 62 00 44 lw r2,(r11+68) 80031e8: 29 61 00 38 lw r1,(r11+56) 80031ec: f8 00 19 15 calli 8009640 } /* After the signal handler returns, the count of expirations of the * timer must be set to 0. */ ptimer->overrun = 0; 80031f0: 59 60 00 68 sw (r11+104),r0 } 80031f4: 2b 9d 00 04 lw ra,(sp+4) 80031f8: 2b 8b 00 08 lw r11,(sp+8) 80031fc: 37 9c 00 08 addi sp,sp,8 8003200: c3 a0 00 00 ret =============================================================================== 08010b60 <_POSIX_signals_Check_signal>: bool _POSIX_signals_Check_signal( POSIX_API_Control *api, int signo, bool is_global ) { 8010b60: 37 9c ff b0 addi sp,sp,-80 8010b64: 5b 8b 00 1c sw (sp+28),r11 8010b68: 5b 8c 00 18 sw (sp+24),r12 8010b6c: 5b 8d 00 14 sw (sp+20),r13 8010b70: 5b 8e 00 10 sw (sp+16),r14 8010b74: 5b 8f 00 0c sw (sp+12),r15 8010b78: 5b 90 00 08 sw (sp+8),r16 8010b7c: 5b 9d 00 04 sw (sp+4),ra 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, 8010b80: 37 90 00 48 addi r16,sp,72 bool _POSIX_signals_Check_signal( POSIX_API_Control *api, int signo, bool is_global ) { 8010b84: 20 64 00 ff andi r4,r3,0xff 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, 8010b88: 34 05 00 01 mvi r5,1 8010b8c: ba 00 18 00 mv r3,r16 bool _POSIX_signals_Check_signal( POSIX_API_Control *api, int signo, bool is_global ) { 8010b90: b8 20 68 00 mv r13,r1 8010b94: b8 40 58 00 mv r11,r2 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, 8010b98: f8 00 00 37 calli 8010c74 <_POSIX_signals_Clear_signals> is_global, true ) ) return false; 8010b9c: 34 0f 00 00 mvi r15,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, 8010ba0: 44 20 00 2b be r1,r0,8010c4c <_POSIX_signals_Check_signal+0xec> #endif /* * Just to prevent sending a signal which is currently being ignored. */ if ( _POSIX_signals_Vectors[ signo ].sa_handler == SIG_IGN ) 8010ba4: 34 02 00 01 mvi r2,1 8010ba8: b9 60 08 00 mv r1,r11 8010bac: f8 00 18 e4 calli 8016f3c <__ashlsi3> 8010bb0: 78 0c 08 01 mvhi r12,0x801 8010bb4: b4 2b 08 00 add r1,r1,r11 8010bb8: 34 02 00 02 mvi r2,2 8010bbc: f8 00 18 e0 calli 8016f3c <__ashlsi3> 8010bc0: 39 8c 9e 78 ori r12,r12,0x9e78 8010bc4: b5 81 60 00 add r12,r12,r1 8010bc8: 29 8e 00 08 lw r14,(r12+8) 8010bcc: 34 01 00 01 mvi r1,1 8010bd0: 45 c1 00 1f be r14,r1,8010c4c <_POSIX_signals_Check_signal+0xec><== NEVER TAKEN return false; /* * Block the signals requested in sa_mask */ saved_signals_blocked = api->signals_blocked; 8010bd4: 29 af 00 d0 lw r15,(r13+208) api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask; 8010bd8: 29 81 00 04 lw r1,(r12+4) /* * 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, 8010bdc: 34 03 00 28 mvi r3,40 /* * Block the signals requested in sa_mask */ saved_signals_blocked = api->signals_blocked; api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask; 8010be0: b8 2f 08 00 or r1,r1,r15 8010be4: 59 a1 00 d0 sw (r13+208),r1 /* * 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, 8010be8: 78 01 08 01 mvhi r1,0x801 8010bec: 38 21 9e 2c ori r1,r1,0x9e2c 8010bf0: 28 22 00 0c lw r2,(r1+12) 8010bf4: 37 81 00 20 addi r1,sp,32 8010bf8: 34 42 00 20 addi r2,r2,32 8010bfc: f8 00 04 de calli 8011f74 sizeof( Thread_Wait_information )); /* * Here, the signal handler function executes */ switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) { 8010c00: 29 82 00 00 lw r2,(r12+0) 8010c04: 34 01 00 02 mvi r1,2 8010c08: 5c 41 00 06 bne r2,r1,8010c20 <_POSIX_signals_Check_signal+0xc0> case SA_SIGINFO: (*_POSIX_signals_Vectors[ signo ].sa_sigaction)( 8010c0c: b9 60 08 00 mv r1,r11 8010c10: ba 00 10 00 mv r2,r16 8010c14: 34 03 00 00 mvi r3,0 8010c18: d9 c0 00 00 call r14 signo, &siginfo_struct, NULL /* context is undefined per 1003.1b-1993, p. 66 */ ); break; 8010c1c: e0 00 00 03 bi 8010c28 <_POSIX_signals_Check_signal+0xc8> default: (*_POSIX_signals_Vectors[ signo ].sa_handler)( signo ); 8010c20: b9 60 08 00 mv r1,r11 8010c24: d9 c0 00 00 call r14 } /* * Restore the blocking information */ memcpy( &_Thread_Executing->Wait, &stored_thread_wait_information, 8010c28: 78 01 08 01 mvhi r1,0x801 8010c2c: 38 21 9e 2c ori r1,r1,0x9e2c 8010c30: 28 21 00 0c lw r1,(r1+12) 8010c34: 37 82 00 20 addi r2,sp,32 8010c38: 34 03 00 28 mvi r3,40 8010c3c: 34 21 00 20 addi r1,r1,32 8010c40: f8 00 04 cd calli 8011f74 sizeof( Thread_Wait_information )); /* * Restore the previous set of blocked signals */ api->signals_blocked = saved_signals_blocked; 8010c44: 59 af 00 d0 sw (r13+208),r15 return true; 8010c48: 34 0f 00 01 mvi r15,1 } 8010c4c: b9 e0 08 00 mv r1,r15 8010c50: 2b 9d 00 04 lw ra,(sp+4) 8010c54: 2b 8b 00 1c lw r11,(sp+28) 8010c58: 2b 8c 00 18 lw r12,(sp+24) 8010c5c: 2b 8d 00 14 lw r13,(sp+20) 8010c60: 2b 8e 00 10 lw r14,(sp+16) 8010c64: 2b 8f 00 0c lw r15,(sp+12) 8010c68: 2b 90 00 08 lw r16,(sp+8) 8010c6c: 37 9c 00 50 addi sp,sp,80 8010c70: c3 a0 00 00 ret =============================================================================== 08011334 <_POSIX_signals_Clear_process_signals>: */ void _POSIX_signals_Clear_process_signals( int signo ) { 8011334: 37 9c ff ec addi sp,sp,-20 8011338: 5b 8b 00 14 sw (sp+20),r11 801133c: 5b 8c 00 10 sw (sp+16),r12 8011340: 5b 8d 00 0c sw (sp+12),r13 8011344: 5b 8e 00 08 sw (sp+8),r14 8011348: 5b 9d 00 04 sw (sp+4),ra 801134c: b8 20 60 00 mv r12,r1 clear_signal = true; mask = signo_to_mask( signo ); ISR_Level level; _ISR_Disable( level ); 8011350: 90 00 68 00 rcsr r13,IE 8011354: 34 01 ff fe mvi r1,-2 8011358: a1 a1 08 00 and r1,r13,r1 801135c: d0 01 00 00 wcsr IE,r1 if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) { 8011360: 34 02 00 01 mvi r2,1 8011364: b9 80 08 00 mv r1,r12 8011368: f8 00 16 f5 calli 8016f3c <__ashlsi3> 801136c: b4 2c 70 00 add r14,r1,r12 8011370: 34 02 00 02 mvi r2,2 8011374: 78 0b 08 01 mvhi r11,0x801 8011378: b9 c0 08 00 mv r1,r14 801137c: f8 00 16 f0 calli 8016f3c <__ashlsi3> 8011380: 39 6b 9e 78 ori r11,r11,0x9e78 8011384: b5 61 08 00 add r1,r11,r1 8011388: 28 22 00 00 lw r2,(r1+0) 801138c: 34 01 00 02 mvi r1,2 8011390: 5c 41 00 0a bne r2,r1,80113b8 <_POSIX_signals_Clear_process_signals+0x84> } if ( clear_signal ) { _POSIX_signals_Pending &= ~mask; } _ISR_Enable( level ); } 8011394: 34 02 00 02 mvi r2,2 8011398: 78 0b 08 01 mvhi r11,0x801 801139c: b9 c0 08 00 mv r1,r14 80113a0: f8 00 16 e7 calli 8016f3c <__ashlsi3> 80113a4: 39 6b a0 70 ori r11,r11,0xa070 80113a8: b5 61 08 00 add r1,r11,r1 RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); 80113ac: 34 22 00 04 addi r2,r1,4 ISR_Level level; _ISR_Disable( level ); if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) { if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) ) 80113b0: 28 21 00 00 lw r1,(r1+0) 80113b4: 5c 22 00 0a bne r1,r2,80113dc <_POSIX_signals_Clear_process_signals+0xa8><== NEVER TAKEN 80113b8: 35 82 ff ff addi r2,r12,-1 clear_signal = false; } if ( clear_signal ) { _POSIX_signals_Pending &= ~mask; 80113bc: 78 0b 08 01 mvhi r11,0x801 80113c0: 34 01 00 01 mvi r1,1 80113c4: f8 00 16 de calli 8016f3c <__ashlsi3> 80113c8: 39 6b a0 6c ori r11,r11,0xa06c 80113cc: 29 62 00 00 lw r2,(r11+0) 80113d0: a4 20 08 00 not r1,r1 80113d4: a0 22 08 00 and r1,r1,r2 80113d8: 59 61 00 00 sw (r11+0),r1 } _ISR_Enable( level ); 80113dc: d0 0d 00 00 wcsr IE,r13 } 80113e0: 2b 9d 00 04 lw ra,(sp+4) 80113e4: 2b 8b 00 14 lw r11,(sp+20) 80113e8: 2b 8c 00 10 lw r12,(sp+16) 80113ec: 2b 8d 00 0c lw r13,(sp+12) 80113f0: 2b 8e 00 08 lw r14,(sp+8) 80113f4: 37 9c 00 14 addi sp,sp,20 80113f8: c3 a0 00 00 ret =============================================================================== 08003dcc <_POSIX_signals_Get_lowest>: #include int _POSIX_signals_Get_lowest( sigset_t set ) { 8003dcc: 37 9c ff f0 addi sp,sp,-16 8003dd0: 5b 8b 00 10 sw (sp+16),r11 8003dd4: 5b 8c 00 0c sw (sp+12),r12 8003dd8: 5b 8d 00 08 sw (sp+8),r13 8003ddc: 5b 9d 00 04 sw (sp+4),ra int signo; for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { 8003de0: 34 0b 00 1b mvi r11,27 #include int _POSIX_signals_Get_lowest( sigset_t set ) { 8003de4: b8 20 60 00 mv r12,r1 int signo; for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { 8003de8: 34 0d 00 20 mvi r13,32 8003dec: 34 01 00 01 mvi r1,1 8003df0: 35 62 ff ff addi r2,r11,-1 8003df4: f8 00 67 7f calli 801dbf0 <__ashlsi3> if ( set & signo_to_mask( signo ) ) { 8003df8: a0 2c 08 00 and r1,r1,r12 8003dfc: 5c 20 00 0c bne r1,r0,8003e2c <_POSIX_signals_Get_lowest+0x60><== NEVER TAKEN sigset_t set ) { int signo; for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { 8003e00: 35 6b 00 01 addi r11,r11,1 8003e04: 5d 6d ff fa bne r11,r13,8003dec <_POSIX_signals_Get_lowest+0x20> 8003e08: 34 0b 00 01 mvi r11,1 */ #if (SIGHUP != 1) #error "Assumption that SIGHUP==1 violated!!" #endif for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) { 8003e0c: 34 0d 00 1b mvi r13,27 8003e10: 34 01 00 01 mvi r1,1 8003e14: 35 62 ff ff addi r2,r11,-1 8003e18: f8 00 67 76 calli 801dbf0 <__ashlsi3> if ( set & signo_to_mask( signo ) ) { 8003e1c: a0 2c 08 00 and r1,r1,r12 8003e20: 5c 20 00 03 bne r1,r0,8003e2c <_POSIX_signals_Get_lowest+0x60> */ #if (SIGHUP != 1) #error "Assumption that SIGHUP==1 violated!!" #endif for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) { 8003e24: 35 6b 00 01 addi r11,r11,1 8003e28: 5d 6d ff fa bne r11,r13,8003e10 <_POSIX_signals_Get_lowest+0x44><== ALWAYS TAKEN * a return 0. This routine will NOT be called unless a signal * is pending in the set passed in. */ found_it: return signo; } 8003e2c: b9 60 08 00 mv r1,r11 8003e30: 2b 9d 00 04 lw ra,(sp+4) 8003e34: 2b 8b 00 10 lw r11,(sp+16) 8003e38: 2b 8c 00 0c lw r12,(sp+12) 8003e3c: 2b 8d 00 08 lw r13,(sp+8) 8003e40: 37 9c 00 10 addi sp,sp,16 8003e44: c3 a0 00 00 ret =============================================================================== 08025f78 <_POSIX_signals_Unblock_thread>: bool _POSIX_signals_Unblock_thread( Thread_Control *the_thread, int signo, siginfo_t *info ) { 8025f78: 37 9c ff ec addi sp,sp,-20 8025f7c: 5b 8b 00 14 sw (sp+20),r11 8025f80: 5b 8c 00 10 sw (sp+16),r12 8025f84: 5b 8d 00 0c sw (sp+12),r13 8025f88: 5b 8e 00 08 sw (sp+8),r14 8025f8c: 5b 9d 00 04 sw (sp+4),ra 8025f90: b8 20 58 00 mv r11,r1 8025f94: b8 40 70 00 mv r14,r2 POSIX_API_Control *api; sigset_t mask; siginfo_t *the_info = NULL; api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 8025f98: 28 2c 01 20 lw r12,(r1+288) 8025f9c: 34 42 ff ff addi r2,r2,-1 8025fa0: 34 01 00 01 mvi r1,1 bool _POSIX_signals_Unblock_thread( Thread_Control *the_thread, int signo, siginfo_t *info ) { 8025fa4: b8 60 68 00 mv r13,r3 8025fa8: fb ff 6f bf calli 8001ea4 <__ashlsi3> /* * Is the thread is specifically waiting for a signal? */ if ( _States_Is_interruptible_signal( the_thread->current_state ) ) { 8025fac: 78 03 08 02 mvhi r3,0x802 8025fb0: 38 63 77 d0 ori r3,r3,0x77d0 8025fb4: 29 64 00 10 lw r4,(r11+16) 8025fb8: 28 62 00 00 lw r2,(r3+0) 8025fbc: a0 82 18 00 and r3,r4,r2 8025fc0: 5c 62 00 1c bne r3,r2,8026030 <_POSIX_signals_Unblock_thread+0xb8> if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) { 8025fc4: 29 62 00 30 lw r2,(r11+48) 8025fc8: a0 22 10 00 and r2,r1,r2 8025fcc: 5c 40 00 06 bne r2,r0,8025fe4 <_POSIX_signals_Unblock_thread+0x6c> 8025fd0: 29 82 00 d0 lw r2,(r12+208) /* * This should only be reached via pthread_kill(). */ return false; 8025fd4: 34 0c 00 00 mvi r12,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) ) { 8025fd8: a4 40 10 00 not r2,r2 8025fdc: a0 22 08 00 and r1,r1,r2 8025fe0: 44 2c 00 39 be r1,r12,80260c4 <_POSIX_signals_Unblock_thread+0x14c> the_thread->Wait.return_code = EINTR; 8025fe4: 34 01 00 04 mvi r1,4 8025fe8: 59 61 00 34 sw (r11+52),r1 the_info = (siginfo_t *) the_thread->Wait.return_argument; 8025fec: 29 61 00 28 lw r1,(r11+40) if ( !info ) { 8025ff0: 5d a0 00 06 bne r13,r0,8026008 <_POSIX_signals_Unblock_thread+0x90> the_info->si_signo = signo; the_info->si_code = SI_USER; 8025ff4: 34 02 00 01 mvi r2,1 the_thread->Wait.return_code = EINTR; the_info = (siginfo_t *) the_thread->Wait.return_argument; if ( !info ) { the_info->si_signo = signo; 8025ff8: 58 2e 00 00 sw (r1+0),r14 the_info->si_code = SI_USER; 8025ffc: 58 22 00 04 sw (r1+4),r2 the_info->si_value.sival_int = 0; 8026000: 58 20 00 08 sw (r1+8),r0 8026004: e0 00 00 07 bi 8026020 <_POSIX_signals_Unblock_thread+0xa8> } else { *the_info = *info; 8026008: 29 a3 00 00 lw r3,(r13+0) 802600c: 29 a2 00 04 lw r2,(r13+4) 8026010: 29 a4 00 08 lw r4,(r13+8) 8026014: 58 23 00 00 sw (r1+0),r3 8026018: 58 22 00 04 sw (r1+4),r2 802601c: 58 24 00 08 sw (r1+8),r4 } _Thread_queue_Extract_with_proxy( the_thread ); 8026020: b9 60 08 00 mv r1,r11 8026024: fb ff 9a 1c calli 800c894 <_Thread_queue_Extract_with_proxy> return true; 8026028: 34 0c 00 01 mvi r12,1 802602c: e0 00 00 26 bi 80260c4 <_POSIX_signals_Unblock_thread+0x14c> } /* * Thread is not waiting due to a sigwait. */ if ( ~api->signals_blocked & mask ) { 8026030: 29 82 00 d0 lw r2,(r12+208) } else if ( the_thread->current_state == STATES_READY ) { if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) ) _Thread_Dispatch_necessary = true; } } return false; 8026034: 34 0c 00 00 mvi r12,0 } /* * Thread is not waiting due to a sigwait. */ if ( ~api->signals_blocked & mask ) { 8026038: a4 40 10 00 not r2,r2 802603c: a0 22 08 00 and r1,r1,r2 8026040: 44 20 00 21 be r1,r0,80260c4 <_POSIX_signals_Unblock_thread+0x14c> 8026044: 78 01 10 00 mvhi r1,0x1000 8026048: a0 81 08 00 and r1,r4,r1 * 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 ) ) { 802604c: 44 20 00 15 be r1,r0,80260a0 <_POSIX_signals_Unblock_thread+0x128> */ RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue ( States_Control the_states ) { return (the_states & STATES_WAITING_ON_THREAD_QUEUE); 8026050: 78 02 08 02 mvhi r2,0x802 the_thread->Wait.return_code = EINTR; 8026054: 34 01 00 04 mvi r1,4 8026058: 38 42 75 84 ori r2,r2,0x7584 802605c: 59 61 00 34 sw (r11+52),r1 8026060: 28 41 00 00 lw r1,(r2+0) 8026064: a0 81 08 00 and r1,r4,r1 /* * 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) ) 8026068: 44 20 00 04 be r1,r0,8026078 <_POSIX_signals_Unblock_thread+0x100> _Thread_queue_Extract_with_proxy( the_thread ); 802606c: b9 60 08 00 mv r1,r11 8026070: fb ff 9a 09 calli 800c894 <_Thread_queue_Extract_with_proxy> 8026074: e0 00 00 14 bi 80260c4 <_POSIX_signals_Unblock_thread+0x14c> */ RTEMS_INLINE_ROUTINE bool _States_Is_delaying ( States_Control the_states ) { return (the_states & STATES_DELAYING); 8026078: 20 84 00 08 andi r4,r4,0x8 else if ( _States_Is_delaying(the_thread->current_state) ) { 802607c: 44 8c 00 12 be r4,r12,80260c4 <_POSIX_signals_Unblock_thread+0x14c><== NEVER TAKEN (void) _Watchdog_Remove( &the_thread->Timer ); 8026080: 35 61 00 48 addi r1,r11,72 8026084: fb ff 9c db calli 800d3f0 <_Watchdog_Remove> RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); 8026088: 78 03 08 02 mvhi r3,0x802 802608c: 38 63 73 d8 ori r3,r3,0x73d8 8026090: 28 62 00 00 lw r2,(r3+0) 8026094: b9 60 08 00 mv r1,r11 8026098: fb ff 96 cc calli 800bbc8 <_Thread_Clear_state> 802609c: e0 00 00 0a bi 80260c4 <_POSIX_signals_Unblock_thread+0x14c> _Thread_Unblock( the_thread ); } } else if ( the_thread->current_state == STATES_READY ) { 80260a0: 5c 8c 00 09 bne r4,r12,80260c4 <_POSIX_signals_Unblock_thread+0x14c><== NEVER TAKEN if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) ) 80260a4: 78 01 08 02 mvhi r1,0x802 80260a8: 38 21 9f 1c ori r1,r1,0x9f1c 80260ac: 28 22 00 08 lw r2,(r1+8) 80260b0: 44 4c 00 05 be r2,r12,80260c4 <_POSIX_signals_Unblock_thread+0x14c> 80260b4: 28 22 00 0c lw r2,(r1+12) 80260b8: 5d 62 00 03 bne r11,r2,80260c4 <_POSIX_signals_Unblock_thread+0x14c><== NEVER TAKEN _Thread_Dispatch_necessary = true; 80260bc: 34 02 00 01 mvi r2,1 80260c0: 30 22 00 18 sb (r1+24),r2 } } return false; } 80260c4: b9 80 08 00 mv r1,r12 80260c8: 2b 9d 00 04 lw ra,(sp+4) 80260cc: 2b 8b 00 14 lw r11,(sp+20) 80260d0: 2b 8c 00 10 lw r12,(sp+16) 80260d4: 2b 8d 00 0c lw r13,(sp+12) 80260d8: 2b 8e 00 08 lw r14,(sp+8) 80260dc: 37 9c 00 14 addi sp,sp,20 80260e0: c3 a0 00 00 ret =============================================================================== 0800426c <_RTEMS_tasks_Initialize_user_tasks_body>: * * Output parameters: NONE */ void _RTEMS_tasks_Initialize_user_tasks_body( void ) { 800426c: 37 9c ff e8 addi sp,sp,-24 8004270: 5b 8b 00 14 sw (sp+20),r11 8004274: 5b 8c 00 10 sw (sp+16),r12 8004278: 5b 8d 00 0c sw (sp+12),r13 800427c: 5b 8e 00 08 sw (sp+8),r14 8004280: 5b 9d 00 04 sw (sp+4),ra rtems_initialization_tasks_table *user_tasks; /* * Move information into local variables */ user_tasks = Configuration_RTEMS_API.User_initialization_tasks_table; 8004284: 78 01 08 01 mvhi r1,0x801 8004288: 38 21 90 74 ori r1,r1,0x9074 800428c: 28 2b 00 2c lw r11,(r1+44) maximum = Configuration_RTEMS_API.number_of_initialization_tasks; 8004290: 28 2e 00 28 lw r14,(r1+40) /* * Verify that we have a set of user tasks to iterate */ if ( !user_tasks ) 8004294: 34 0d 00 00 mvi r13,0 8004298: 5d 60 00 1a bne r11,r0,8004300 <_RTEMS_tasks_Initialize_user_tasks_body+0x94> 800429c: e0 00 00 1a bi 8004304 <_RTEMS_tasks_Initialize_user_tasks_body+0x98> /* * Now iterate over the initialization tasks and create/start them. */ for ( index=0 ; index < maximum ; index++ ) { return_value = rtems_task_create( 80042a0: 29 61 00 00 lw r1,(r11+0) 80042a4: 29 62 00 08 lw r2,(r11+8) 80042a8: 29 63 00 04 lw r3,(r11+4) 80042ac: 29 64 00 14 lw r4,(r11+20) 80042b0: 29 65 00 0c lw r5,(r11+12) 80042b4: 37 86 00 18 addi r6,sp,24 80042b8: f8 00 26 9a calli 800dd20 80042bc: b8 20 60 00 mv r12,r1 user_tasks[ index ].stack_size, user_tasks[ index ].mode_set, user_tasks[ index ].attribute_set, &id ); if ( !rtems_is_status_successful( return_value ) ) 80042c0: 44 20 00 05 be r1,r0,80042d4 <_RTEMS_tasks_Initialize_user_tasks_body+0x68><== ALWAYS TAKEN _Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value ); 80042c4: 34 01 00 01 mvi r1,1 <== NOT EXECUTED 80042c8: 34 02 00 01 mvi r2,1 <== NOT EXECUTED 80042cc: b9 80 18 00 mv r3,r12 <== NOT EXECUTED 80042d0: e0 00 00 0a bi 80042f8 <_RTEMS_tasks_Initialize_user_tasks_body+0x8c><== NOT EXECUTED return_value = rtems_task_start( 80042d4: 29 63 00 18 lw r3,(r11+24) 80042d8: 29 62 00 10 lw r2,(r11+16) 80042dc: 2b 81 00 18 lw r1,(sp+24) 80042e0: 35 6b 00 1c addi r11,r11,28 80042e4: f8 00 00 0f calli 8004320 80042e8: b8 20 18 00 mv r3,r1 id, user_tasks[ index ].entry_point, user_tasks[ index ].argument ); if ( !rtems_is_status_successful( return_value ) ) 80042ec: 44 2c 00 04 be r1,r12,80042fc <_RTEMS_tasks_Initialize_user_tasks_body+0x90> _Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value ); 80042f0: 34 01 00 01 mvi r1,1 80042f4: 34 02 00 01 mvi r2,1 80042f8: f8 00 04 aa calli 80055a0 <_Internal_error_Occurred> return; /* * Now iterate over the initialization tasks and create/start them. */ for ( index=0 ; index < maximum ; index++ ) { 80042fc: 35 ad 00 01 addi r13,r13,1 8004300: 55 cd ff e8 bgu r14,r13,80042a0 <_RTEMS_tasks_Initialize_user_tasks_body+0x34> user_tasks[ index ].argument ); if ( !rtems_is_status_successful( return_value ) ) _Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value ); } } 8004304: 2b 9d 00 04 lw ra,(sp+4) 8004308: 2b 8b 00 14 lw r11,(sp+20) 800430c: 2b 8c 00 10 lw r12,(sp+16) 8004310: 2b 8d 00 0c lw r13,(sp+12) 8004314: 2b 8e 00 08 lw r14,(sp+8) 8004318: 37 9c 00 18 addi sp,sp,24 800431c: c3 a0 00 00 ret =============================================================================== 08004608 <_Rate_monotonic_Timeout>: void _Rate_monotonic_Timeout( Objects_Id id, void *ignored ) { 8004608: 37 9c ff f4 addi sp,sp,-12 800460c: 5b 8b 00 08 sw (sp+8),r11 8004610: 5b 9d 00 04 sw (sp+4),ra 8004614: b8 20 10 00 mv r2,r1 8004618: 78 01 08 02 mvhi r1,0x802 800461c: 38 21 18 d0 ori r1,r1,0x18d0 8004620: 37 83 00 0c addi r3,sp,12 8004624: f8 00 08 e2 calli 80069ac <_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 ) { 8004628: 2b 82 00 0c lw r2,(sp+12) 800462c: b8 20 58 00 mv r11,r1 8004630: 5c 40 00 22 bne r2,r0,80046b8 <_Rate_monotonic_Timeout+0xb0><== NEVER TAKEN case OBJECTS_LOCAL: the_thread = the_period->owner; 8004634: 28 21 00 40 lw r1,(r1+64) */ RTEMS_INLINE_ROUTINE bool _States_Is_waiting_for_period ( States_Control the_states ) { return (the_states & STATES_WAITING_FOR_PERIOD); 8004638: 28 23 00 10 lw r3,(r1+16) 800463c: 20 63 40 00 andi r3,r3,0x4000 if ( _States_Is_waiting_for_period( the_thread->current_state ) && 8004640: 44 62 00 09 be r3,r2,8004664 <_Rate_monotonic_Timeout+0x5c> 8004644: 28 23 00 20 lw r3,(r1+32) 8004648: 29 62 00 08 lw r2,(r11+8) 800464c: 5c 62 00 06 bne r3,r2,8004664 <_Rate_monotonic_Timeout+0x5c> RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); 8004650: 78 03 08 01 mvhi r3,0x801 8004654: 38 63 ec 5c ori r3,r3,0xec5c 8004658: 28 62 00 00 lw r2,(r3+0) 800465c: f8 00 0b 6b calli 8007408 <_Thread_Clear_state> 8004660: e0 00 00 06 bi 8004678 <_Rate_monotonic_Timeout+0x70> _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 ) { 8004664: 29 62 00 38 lw r2,(r11+56) 8004668: 34 01 00 01 mvi r1,1 800466c: 5c 41 00 0c bne r2,r1,800469c <_Rate_monotonic_Timeout+0x94> the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING; 8004670: 34 01 00 03 mvi r1,3 8004674: 59 61 00 38 sw (r11+56),r1 _Rate_monotonic_Initiate_statistics( the_period ); 8004678: b9 60 08 00 mv r1,r11 800467c: fb ff fe 2e calli 8003f34 <_Rate_monotonic_Initiate_statistics> Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 8004680: 29 61 00 3c lw r1,(r11+60) _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 8004684: 35 62 00 10 addi r2,r11,16 Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 8004688: 59 61 00 1c sw (r11+28),r1 _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 800468c: 78 01 08 02 mvhi r1,0x802 8004690: 38 21 1a d8 ori r1,r1,0x1ad8 8004694: f8 00 10 fd calli 8008a88 <_Watchdog_Insert> 8004698: e0 00 00 03 bi 80046a4 <_Rate_monotonic_Timeout+0x9c> _Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length ); } else the_period->state = RATE_MONOTONIC_EXPIRED; 800469c: 34 01 00 04 mvi r1,4 80046a0: 59 61 00 38 sw (r11+56),r1 */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; 80046a4: 78 01 08 02 mvhi r1,0x802 80046a8: 38 21 19 f8 ori r1,r1,0x19f8 80046ac: 28 22 00 00 lw r2,(r1+0) 80046b0: 34 42 ff ff addi r2,r2,-1 80046b4: 58 22 00 00 sw (r1+0),r2 case OBJECTS_REMOTE: /* impossible */ #endif case OBJECTS_ERROR: break; } } 80046b8: 2b 9d 00 04 lw ra,(sp+4) 80046bc: 2b 8b 00 08 lw r11,(sp+8) 80046c0: 37 9c 00 0c addi sp,sp,12 80046c4: c3 a0 00 00 ret =============================================================================== 08003fc8 <_Rate_monotonic_Update_statistics>: void _Rate_monotonic_Update_statistics( Rate_monotonic_Control *the_period ) { 8003fc8: 37 9c ff e4 addi sp,sp,-28 8003fcc: 5b 8b 00 0c sw (sp+12),r11 8003fd0: 5b 8c 00 08 sw (sp+8),r12 8003fd4: 5b 9d 00 04 sw (sp+4),ra 8003fd8: b8 20 58 00 mv r11,r1 /* * Update the counts. */ stats = &the_period->Statistics; stats->count++; 8003fdc: 28 21 00 54 lw r1,(r1+84) if ( the_period->state == RATE_MONOTONIC_EXPIRED ) 8003fe0: 29 62 00 38 lw r2,(r11+56) /* * Update the counts. */ stats = &the_period->Statistics; stats->count++; 8003fe4: 34 21 00 01 addi r1,r1,1 8003fe8: 59 61 00 54 sw (r11+84),r1 if ( the_period->state == RATE_MONOTONIC_EXPIRED ) 8003fec: 34 01 00 04 mvi r1,4 8003ff0: 5c 41 00 04 bne r2,r1,8004000 <_Rate_monotonic_Update_statistics+0x38> stats->missed_count++; 8003ff4: 29 61 00 58 lw r1,(r11+88) 8003ff8: 34 21 00 01 addi r1,r1,1 8003ffc: 59 61 00 58 sw (r11+88),r1 /* * Grab status for time statistics. */ valid_status = _Rate_monotonic_Get_status( the_period, &since_last_period, &executed ); 8004000: 37 8c 00 18 addi r12,sp,24 stats->missed_count++; /* * Grab status for time statistics. */ valid_status = 8004004: b9 60 08 00 mv r1,r11 8004008: 37 82 00 10 addi r2,sp,16 800400c: b9 80 18 00 mv r3,r12 8004010: fb ff ff 90 calli 8003e50 <_Rate_monotonic_Get_status> _Rate_monotonic_Get_status( the_period, &since_last_period, &executed ); if (!valid_status) 8004014: 44 20 00 28 be r1,r0,80040b4 <_Rate_monotonic_Update_statistics+0xec><== NEVER TAKEN /* * Update CPU time */ #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ _Timestamp_Add_to( &stats->total_cpu_time, &executed ); 8004018: b9 80 10 00 mv r2,r12 800401c: 35 61 00 6c addi r1,r11,108 8004020: f8 00 11 37 calli 80084fc <_Timespec_Add_to> if ( _Timestamp_Less_than( &executed, &stats->min_cpu_time ) ) 8004024: b9 80 08 00 mv r1,r12 8004028: 35 62 00 5c addi r2,r11,92 800402c: f8 00 11 92 calli 8008674 <_Timespec_Less_than> 8004030: 44 20 00 05 be r1,r0,8004044 <_Rate_monotonic_Update_statistics+0x7c> stats->min_cpu_time = executed; 8004034: 2b 81 00 18 lw r1,(sp+24) 8004038: 59 61 00 5c sw (r11+92),r1 800403c: 2b 81 00 1c lw r1,(sp+28) 8004040: 59 61 00 60 sw (r11+96),r1 if ( _Timestamp_Greater_than( &executed, &stats->max_cpu_time ) ) 8004044: 37 81 00 18 addi r1,sp,24 8004048: 35 62 00 64 addi r2,r11,100 800404c: f8 00 11 7f calli 8008648 <_Timespec_Greater_than> 8004050: 44 20 00 05 be r1,r0,8004064 <_Rate_monotonic_Update_statistics+0x9c> stats->max_cpu_time = executed; 8004054: 2b 81 00 18 lw r1,(sp+24) 8004058: 59 61 00 64 sw (r11+100),r1 800405c: 2b 81 00 1c lw r1,(sp+28) 8004060: 59 61 00 68 sw (r11+104),r1 /* * Update Wall time */ #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ _Timestamp_Add_to( &stats->total_wall_time, &since_last_period ); 8004064: 37 8c 00 10 addi r12,sp,16 8004068: b9 80 10 00 mv r2,r12 800406c: 35 61 00 84 addi r1,r11,132 8004070: f8 00 11 23 calli 80084fc <_Timespec_Add_to> if ( _Timestamp_Less_than( &since_last_period, &stats->min_wall_time ) ) 8004074: b9 80 08 00 mv r1,r12 8004078: 35 62 00 74 addi r2,r11,116 800407c: f8 00 11 7e calli 8008674 <_Timespec_Less_than> 8004080: 44 20 00 05 be r1,r0,8004094 <_Rate_monotonic_Update_statistics+0xcc> stats->min_wall_time = since_last_period; 8004084: 2b 81 00 10 lw r1,(sp+16) 8004088: 59 61 00 74 sw (r11+116),r1 800408c: 2b 81 00 14 lw r1,(sp+20) 8004090: 59 61 00 78 sw (r11+120),r1 if ( _Timestamp_Greater_than( &since_last_period, &stats->max_wall_time ) ) 8004094: 37 81 00 10 addi r1,sp,16 8004098: 35 62 00 7c addi r2,r11,124 800409c: f8 00 11 6b calli 8008648 <_Timespec_Greater_than> 80040a0: 44 20 00 05 be r1,r0,80040b4 <_Rate_monotonic_Update_statistics+0xec> stats->max_wall_time = since_last_period; 80040a4: 2b 81 00 10 lw r1,(sp+16) 80040a8: 59 61 00 7c sw (r11+124),r1 80040ac: 2b 81 00 14 lw r1,(sp+20) 80040b0: 59 61 00 80 sw (r11+128),r1 stats->min_wall_time = since_last_period; if ( since_last_period > stats->max_wall_time ) stats->max_wall_time = since_last_period; #endif } 80040b4: 2b 9d 00 04 lw ra,(sp+4) 80040b8: 2b 8b 00 0c lw r11,(sp+12) 80040bc: 2b 8c 00 08 lw r12,(sp+8) 80040c0: 37 9c 00 1c addi sp,sp,28 80040c4: c3 a0 00 00 ret =============================================================================== 0800ee20 <_Scheduler_priority_Block>: void _Scheduler_priority_Block( Scheduler_Control *the_scheduler, Thread_Control *the_thread ) { 800ee20: 37 9c ff ec addi sp,sp,-20 800ee24: 5b 8b 00 14 sw (sp+20),r11 800ee28: 5b 8c 00 10 sw (sp+16),r12 800ee2c: 5b 8d 00 0c sw (sp+12),r13 800ee30: 5b 8e 00 08 sw (sp+8),r14 800ee34: 5b 9d 00 04 sw (sp+4),ra 800ee38: b8 40 60 00 mv r12,r2 RTEMS_INLINE_ROUTINE void _Scheduler_priority_Ready_queue_extract( Thread_Control *the_thread ) { Chain_Control *ready = the_thread->scheduler.priority->ready_chain; 800ee3c: 28 42 00 8c lw r2,(r2+140) 800ee40: 28 43 00 00 lw r3,(r2+0) if ( _Chain_Has_only_one_node( ready ) ) { 800ee44: 28 64 00 00 lw r4,(r3+0) 800ee48: 28 62 00 08 lw r2,(r3+8) 800ee4c: 5c 82 00 13 bne r4,r2,800ee98 <_Scheduler_priority_Block+0x78> 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 ); 800ee50: 34 62 00 04 addi r2,r3,4 head->next = tail; 800ee54: 58 62 00 00 sw (r3+0),r2 head->previous = NULL; 800ee58: 58 60 00 04 sw (r3+4),r0 tail->previous = head; 800ee5c: 58 63 00 08 sw (r3+8),r3 _Chain_Initialize_empty( ready ); _Priority_bit_map_Remove( &the_thread->scheduler.priority->Priority_map ); 800ee60: 29 82 00 8c lw r2,(r12+140) RTEMS_INLINE_ROUTINE void _Priority_bit_map_Remove ( Priority_bit_map_Information *the_priority_map ) { *the_priority_map->minor &= the_priority_map->block_minor; 800ee64: 28 44 00 04 lw r4,(r2+4) 800ee68: 2c 45 00 0e lhu r5,(r2+14) 800ee6c: 2c 83 00 00 lhu r3,(r4+0) 800ee70: a0 65 18 00 and r3,r3,r5 800ee74: 0c 83 00 00 sh (r4+0),r3 if ( *the_priority_map->minor == 0 ) 800ee78: 5c 60 00 0c bne r3,r0,800eea8 <_Scheduler_priority_Block+0x88> _Priority_Major_bit_map &= the_priority_map->block_major; 800ee7c: 78 03 08 01 mvhi r3,0x801 800ee80: 38 63 9e 48 ori r3,r3,0x9e48 800ee84: 2c 64 00 00 lhu r4,(r3+0) 800ee88: 2c 42 00 0c lhu r2,(r2+12) 800ee8c: a0 44 10 00 and r2,r2,r4 800ee90: 0c 62 00 00 sh (r3+0),r2 800ee94: e0 00 00 05 bi 800eea8 <_Scheduler_priority_Block+0x88> ) { Chain_Node *next; Chain_Node *previous; next = the_node->next; 800ee98: 29 83 00 00 lw r3,(r12+0) previous = the_node->previous; 800ee9c: 29 82 00 04 lw r2,(r12+4) next->previous = previous; 800eea0: 58 62 00 04 sw (r3+4),r2 previous->next = next; 800eea4: 58 43 00 00 sw (r2+0),r3 RTEMS_INLINE_ROUTINE bool _Thread_Is_heir ( const Thread_Control *the_thread ) { return ( the_thread == _Thread_Heir ); 800eea8: 78 02 08 01 mvhi r2,0x801 800eeac: 38 42 9e 2c ori r2,r2,0x9e2c { _Scheduler_priority_Ready_queue_extract(the_thread); /* TODO: flash critical section */ if ( _Thread_Is_heir( the_thread ) ) 800eeb0: 28 42 00 10 lw r2,(r2+16) 800eeb4: 5d 82 00 39 bne r12,r2,800ef98 <_Scheduler_priority_Block+0x178> 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 ); 800eeb8: 78 02 08 01 mvhi r2,0x801 800eebc: 38 42 9e 48 ori r2,r2,0x9e48 _Scheduler_priority_Block_body(the_scheduler, the_thread); } 800eec0: 28 2e 00 00 lw r14,(r1+0) 800eec4: 2c 41 00 00 lhu r1,(r2+0) 800eec8: 78 0b 08 01 mvhi r11,0x801 800eecc: 34 02 00 ff mvi r2,255 800eed0: 20 21 ff ff andi r1,r1,0xffff 800eed4: 39 6b 80 3c ori r11,r11,0x803c 800eed8: 54 22 00 05 bgu r1,r2,800eeec <_Scheduler_priority_Block+0xcc> 800eedc: b5 61 58 00 add r11,r11,r1 800eee0: 41 6d 00 00 lbu r13,(r11+0) 800eee4: 35 ad 00 08 addi r13,r13,8 800eee8: e0 00 00 05 bi 800eefc <_Scheduler_priority_Block+0xdc> 800eeec: 34 02 00 08 mvi r2,8 800eef0: f8 00 20 61 calli 8017074 <__lshrsi3> 800eef4: b5 61 58 00 add r11,r11,r1 800eef8: 41 6d 00 00 lbu r13,(r11+0) _Bitfield_Find_first_bit( _Priority_Bit_map[major], minor ); 800eefc: 34 02 00 01 mvi r2,1 800ef00: 78 0b 08 01 mvhi r11,0x801 800ef04: b9 a0 08 00 mv r1,r13 800ef08: f8 00 20 0d calli 8016f3c <__ashlsi3> 800ef0c: 39 6b 9e 50 ori r11,r11,0x9e50 800ef10: b5 61 58 00 add r11,r11,r1 800ef14: 2d 62 00 00 lhu r2,(r11+0) 800ef18: 34 01 00 ff mvi r1,255 800ef1c: 78 0b 08 01 mvhi r11,0x801 800ef20: 39 6b 80 3c ori r11,r11,0x803c 800ef24: 54 41 00 05 bgu r2,r1,800ef38 <_Scheduler_priority_Block+0x118> 800ef28: b5 62 58 00 add r11,r11,r2 800ef2c: 41 6b 00 00 lbu r11,(r11+0) 800ef30: 35 6b 00 08 addi r11,r11,8 800ef34: e0 00 00 06 bi 800ef4c <_Scheduler_priority_Block+0x12c> 800ef38: b8 40 08 00 mv r1,r2 800ef3c: 34 02 00 08 mvi r2,8 800ef40: f8 00 20 4d calli 8017074 <__lshrsi3> 800ef44: b5 61 58 00 add r11,r11,r1 800ef48: 41 6b 00 00 lbu r11,(r11+0) return (_Priority_Bits_index( major ) << 4) + 800ef4c: 34 02 00 04 mvi r2,4 800ef50: b9 a0 08 00 mv r1,r13 800ef54: f8 00 1f fa calli 8016f3c <__ashlsi3> 800ef58: b5 61 58 00 add r11,r11,r1 Chain_Control *the_ready_queue ) { Priority_Control index = _Priority_bit_map_Get_highest(); if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) ) 800ef5c: 34 02 00 01 mvi r2,1 800ef60: b9 60 08 00 mv r1,r11 800ef64: f8 00 1f f6 calli 8016f3c <__ashlsi3> 800ef68: 34 02 00 02 mvi r2,2 800ef6c: b4 2b 08 00 add r1,r1,r11 800ef70: f8 00 1f f3 calli 8016f3c <__ashlsi3> 800ef74: b5 c1 08 00 add r1,r14,r1 800ef78: 28 23 00 00 lw r3,(r1+0) RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); 800ef7c: 34 21 00 04 addi r1,r1,4 return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] ); return NULL; 800ef80: 34 02 00 00 mvi r2,0 Chain_Control *the_ready_queue ) { Priority_Control index = _Priority_bit_map_Get_highest(); if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) ) 800ef84: 44 61 00 02 be r3,r1,800ef8c <_Scheduler_priority_Block+0x16c><== NEVER TAKEN return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] ); 800ef88: b8 60 10 00 mv r2,r3 RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body( Scheduler_Control *the_scheduler ) { _Thread_Heir = _Scheduler_priority_Ready_queue_first( 800ef8c: 78 01 08 01 mvhi r1,0x801 800ef90: 38 21 9e 2c ori r1,r1,0x9e2c 800ef94: 58 22 00 10 sw (r1+16),r2 RTEMS_INLINE_ROUTINE bool _Thread_Is_executing ( const Thread_Control *the_thread ) { return ( the_thread == _Thread_Executing ); 800ef98: 78 01 08 01 mvhi r1,0x801 800ef9c: 38 21 9e 2c ori r1,r1,0x9e2c /* TODO: flash critical section */ if ( _Thread_Is_heir( the_thread ) ) _Scheduler_priority_Schedule_body(the_scheduler); if ( _Thread_Is_executing( the_thread ) ) 800efa0: 28 22 00 0c lw r2,(r1+12) 800efa4: 5d 82 00 03 bne r12,r2,800efb0 <_Scheduler_priority_Block+0x190> _Thread_Dispatch_necessary = true; 800efa8: 34 02 00 01 mvi r2,1 800efac: 30 22 00 18 sb (r1+24),r2 800efb0: 2b 9d 00 04 lw ra,(sp+4) 800efb4: 2b 8b 00 14 lw r11,(sp+20) 800efb8: 2b 8c 00 10 lw r12,(sp+16) 800efbc: 2b 8d 00 0c lw r13,(sp+12) 800efc0: 2b 8e 00 08 lw r14,(sp+8) 800efc4: 37 9c 00 14 addi sp,sp,20 800efc8: c3 a0 00 00 ret =============================================================================== 080061f4 <_Scheduler_priority_Schedule>: */ void _Scheduler_priority_Schedule( Scheduler_Control *the_scheduler ) { 80061f4: 37 9c ff f0 addi sp,sp,-16 80061f8: 5b 8b 00 10 sw (sp+16),r11 80061fc: 5b 8c 00 0c sw (sp+12),r12 8006200: 5b 8d 00 08 sw (sp+8),r13 8006204: 5b 9d 00 04 sw (sp+4),ra 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 ); 8006208: 78 02 08 01 mvhi r2,0x801 800620c: 38 42 9e 48 ori r2,r2,0x9e48 _Scheduler_priority_Schedule_body( the_scheduler ); } 8006210: 28 2d 00 00 lw r13,(r1+0) 8006214: 2c 41 00 00 lhu r1,(r2+0) 8006218: 78 0b 08 01 mvhi r11,0x801 800621c: 34 02 00 ff mvi r2,255 8006220: 20 21 ff ff andi r1,r1,0xffff 8006224: 39 6b 80 3c ori r11,r11,0x803c 8006228: 54 22 00 05 bgu r1,r2,800623c <_Scheduler_priority_Schedule+0x48> 800622c: b5 61 58 00 add r11,r11,r1 8006230: 41 6c 00 00 lbu r12,(r11+0) 8006234: 35 8c 00 08 addi r12,r12,8 8006238: e0 00 00 05 bi 800624c <_Scheduler_priority_Schedule+0x58> 800623c: 34 02 00 08 mvi r2,8 8006240: f8 00 43 8d calli 8017074 <__lshrsi3> 8006244: b5 61 58 00 add r11,r11,r1 8006248: 41 6c 00 00 lbu r12,(r11+0) _Bitfield_Find_first_bit( _Priority_Bit_map[major], minor ); 800624c: 34 02 00 01 mvi r2,1 8006250: 78 0b 08 01 mvhi r11,0x801 8006254: b9 80 08 00 mv r1,r12 8006258: f8 00 43 39 calli 8016f3c <__ashlsi3> 800625c: 39 6b 9e 50 ori r11,r11,0x9e50 8006260: b5 61 58 00 add r11,r11,r1 8006264: 2d 62 00 00 lhu r2,(r11+0) 8006268: 34 01 00 ff mvi r1,255 800626c: 78 0b 08 01 mvhi r11,0x801 8006270: 39 6b 80 3c ori r11,r11,0x803c 8006274: 54 41 00 05 bgu r2,r1,8006288 <_Scheduler_priority_Schedule+0x94> 8006278: b5 62 58 00 add r11,r11,r2 800627c: 41 6b 00 00 lbu r11,(r11+0) 8006280: 35 6b 00 08 addi r11,r11,8 8006284: e0 00 00 06 bi 800629c <_Scheduler_priority_Schedule+0xa8> 8006288: b8 40 08 00 mv r1,r2 800628c: 34 02 00 08 mvi r2,8 8006290: f8 00 43 79 calli 8017074 <__lshrsi3> 8006294: b5 61 58 00 add r11,r11,r1 8006298: 41 6b 00 00 lbu r11,(r11+0) return (_Priority_Bits_index( major ) << 4) + 800629c: 34 02 00 04 mvi r2,4 80062a0: b9 80 08 00 mv r1,r12 80062a4: f8 00 43 26 calli 8016f3c <__ashlsi3> 80062a8: b5 61 58 00 add r11,r11,r1 Chain_Control *the_ready_queue ) { Priority_Control index = _Priority_bit_map_Get_highest(); if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) ) 80062ac: 34 02 00 01 mvi r2,1 80062b0: b9 60 08 00 mv r1,r11 80062b4: f8 00 43 22 calli 8016f3c <__ashlsi3> 80062b8: 34 02 00 02 mvi r2,2 80062bc: b4 2b 08 00 add r1,r1,r11 80062c0: f8 00 43 1f calli 8016f3c <__ashlsi3> 80062c4: b5 a1 08 00 add r1,r13,r1 80062c8: 28 23 00 00 lw r3,(r1+0) RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); 80062cc: 34 21 00 04 addi r1,r1,4 return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] ); return NULL; 80062d0: 34 02 00 00 mvi r2,0 Chain_Control *the_ready_queue ) { Priority_Control index = _Priority_bit_map_Get_highest(); if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) ) 80062d4: 44 61 00 02 be r3,r1,80062dc <_Scheduler_priority_Schedule+0xe8><== NEVER TAKEN return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] ); 80062d8: b8 60 10 00 mv r2,r3 RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body( Scheduler_Control *the_scheduler ) { _Thread_Heir = _Scheduler_priority_Ready_queue_first( 80062dc: 78 01 08 01 mvhi r1,0x801 80062e0: 38 21 9e 2c ori r1,r1,0x9e2c 80062e4: 58 22 00 10 sw (r1+16),r2 80062e8: 2b 9d 00 04 lw ra,(sp+4) 80062ec: 2b 8b 00 10 lw r11,(sp+16) 80062f0: 2b 8c 00 0c lw r12,(sp+12) 80062f4: 2b 8d 00 08 lw r13,(sp+8) 80062f8: 37 9c 00 10 addi sp,sp,16 80062fc: c3 a0 00 00 ret =============================================================================== 08004248 <_TOD_Validate>: */ bool _TOD_Validate( const rtems_time_of_day *the_tod ) { 8004248: 37 9c ff f0 addi sp,sp,-16 800424c: 5b 8b 00 10 sw (sp+16),r11 8004250: 5b 8c 00 0c sw (sp+12),r12 8004254: 5b 8d 00 08 sw (sp+8),r13 8004258: 5b 9d 00 04 sw (sp+4),ra 800425c: b8 20 58 00 mv r11,r1 uint32_t days_in_month; uint32_t ticks_per_second; ticks_per_second = TOD_MICROSECONDS_PER_SECOND / rtems_configuration_get_microseconds_per_tick(); 8004260: 78 01 08 02 mvhi r1,0x802 8004264: 38 21 10 c4 ori r1,r1,0x10c4 8004268: 28 22 00 0c lw r2,(r1+12) (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; 800426c: 34 0c 00 00 mvi r12,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) || 8004270: 45 60 00 22 be r11,r0,80042f8 <_TOD_Validate+0xb0> <== NEVER TAKEN ) { uint32_t days_in_month; uint32_t ticks_per_second; ticks_per_second = TOD_MICROSECONDS_PER_SECOND / 8004274: 78 03 08 01 mvhi r3,0x801 8004278: 38 63 ea 2c ori r3,r3,0xea2c 800427c: 28 61 00 00 lw r1,(r3+0) 8004280: f8 00 64 44 calli 801d390 <__udivsi3> rtems_configuration_get_microseconds_per_tick(); if ((!the_tod) || 8004284: 29 62 00 18 lw r2,(r11+24) 8004288: 50 41 00 1c bgeu r2,r1,80042f8 <_TOD_Validate+0xb0> (the_tod->ticks >= ticks_per_second) || 800428c: 29 62 00 14 lw r2,(r11+20) 8004290: 34 01 00 3b mvi r1,59 8004294: 54 41 00 19 bgu r2,r1,80042f8 <_TOD_Validate+0xb0> (the_tod->second >= TOD_SECONDS_PER_MINUTE) || 8004298: 29 62 00 10 lw r2,(r11+16) 800429c: 54 41 00 17 bgu r2,r1,80042f8 <_TOD_Validate+0xb0> (the_tod->minute >= TOD_MINUTES_PER_HOUR) || 80042a0: 29 62 00 0c lw r2,(r11+12) 80042a4: 34 01 00 17 mvi r1,23 80042a8: 54 41 00 14 bgu r2,r1,80042f8 <_TOD_Validate+0xb0> (the_tod->hour >= TOD_HOURS_PER_DAY) || (the_tod->month == 0) || 80042ac: 29 61 00 04 lw r1,(r11+4) 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) || 80042b0: 44 20 00 12 be r1,r0,80042f8 <_TOD_Validate+0xb0> <== NEVER TAKEN (the_tod->month == 0) || 80042b4: 34 02 00 0c mvi r2,12 80042b8: 54 22 00 10 bgu r1,r2,80042f8 <_TOD_Validate+0xb0> (the_tod->month > TOD_MONTHS_PER_YEAR) || (the_tod->year < TOD_BASE_YEAR) || 80042bc: 29 62 00 00 lw r2,(r11+0) (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) || 80042c0: 34 03 07 c3 mvi r3,1987 80042c4: 50 62 00 0d bgeu r3,r2,80042f8 <_TOD_Validate+0xb0> (the_tod->year < TOD_BASE_YEAR) || (the_tod->day == 0) ) 80042c8: 29 6d 00 08 lw r13,(r11+8) (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) || 80042cc: 45 a0 00 0b be r13,r0,80042f8 <_TOD_Validate+0xb0> <== NEVER TAKEN 80042d0: 78 0b 08 01 mvhi r11,0x801 (the_tod->day == 0) ) return false; if ( (the_tod->year % 4) == 0 ) 80042d4: 20 42 00 03 andi r2,r2,0x3 80042d8: 39 6b f2 e4 ori r11,r11,0xf2e4 80042dc: 5c 40 00 02 bne r2,r0,80042e4 <_TOD_Validate+0x9c> days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ]; 80042e0: 34 21 00 0d addi r1,r1,13 else days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ]; 80042e4: 34 02 00 02 mvi r2,2 80042e8: fb ff f3 ee calli 80012a0 <__ashlsi3> 80042ec: b5 61 08 00 add r1,r11,r1 80042f0: 28 2c 00 00 lw r12,(r1+0) * false - if the the_tod is invalid * * NOTE: This routine only works for leap-years through 2099. */ bool _TOD_Validate( 80042f4: f1 8d 60 00 cmpgeu r12,r12,r13 if ( the_tod->day > days_in_month ) return false; return true; } 80042f8: b9 80 08 00 mv r1,r12 80042fc: 2b 9d 00 04 lw ra,(sp+4) 8004300: 2b 8b 00 10 lw r11,(sp+16) 8004304: 2b 8c 00 0c lw r12,(sp+12) 8004308: 2b 8d 00 08 lw r13,(sp+8) 800430c: 37 9c 00 10 addi sp,sp,16 8004310: c3 a0 00 00 ret =============================================================================== 0800653c <_Thread_Change_priority>: void _Thread_Change_priority( Thread_Control *the_thread, Priority_Control new_priority, bool prepend_it ) { 800653c: 37 9c ff e8 addi sp,sp,-24 8006540: 5b 8b 00 14 sw (sp+20),r11 8006544: 5b 8c 00 10 sw (sp+16),r12 8006548: 5b 8d 00 0c sw (sp+12),r13 800654c: 5b 8e 00 08 sw (sp+8),r14 8006550: 5b 9d 00 04 sw (sp+4),ra */ /* * Save original state */ original_state = the_thread->current_state; 8006554: 28 2e 00 10 lw r14,(r1+16) void _Thread_Change_priority( Thread_Control *the_thread, Priority_Control new_priority, bool prepend_it ) { 8006558: b8 20 58 00 mv r11,r1 /* * 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 ); 800655c: 5b 82 00 18 sw (sp+24),r2 void _Thread_Change_priority( Thread_Control *the_thread, Priority_Control new_priority, bool prepend_it ) { 8006560: 20 6d 00 ff andi r13,r3,0xff /* * 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 ); 8006564: f8 00 03 c1 calli 8007468 <_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 ) 8006568: 29 61 00 14 lw r1,(r11+20) 800656c: 2b 82 00 18 lw r2,(sp+24) 8006570: 44 22 00 03 be r1,r2,800657c <_Thread_Change_priority+0x40> _Thread_Set_priority( the_thread, new_priority ); 8006574: b9 60 08 00 mv r1,r11 8006578: f8 00 03 97 calli 80073d4 <_Thread_Set_priority> _ISR_Disable( level ); 800657c: 90 00 60 00 rcsr r12,IE 8006580: 34 05 ff fe mvi r5,-2 8006584: a1 85 28 00 and r5,r12,r5 8006588: d0 05 00 00 wcsr IE,r5 /* * 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; 800658c: 29 61 00 10 lw r1,(r11+16) if ( state != STATES_TRANSIENT ) { 8006590: 34 02 00 04 mvi r2,4 8006594: 21 c4 00 04 andi r4,r14,0x4 8006598: 44 22 00 0f be r1,r2,80065d4 <_Thread_Change_priority+0x98> /* Only clear the transient state if it wasn't set already */ if ( ! _States_Is_transient( original_state ) ) 800659c: 5c 80 00 04 bne r4,r0,80065ac <_Thread_Change_priority+0x70><== NEVER TAKEN RTEMS_INLINE_ROUTINE States_Control _States_Clear ( States_Control states_to_clear, States_Control current_state ) { return (current_state & ~states_to_clear); 80065a0: 34 02 ff fb mvi r2,-5 80065a4: a0 22 10 00 and r2,r1,r2 the_thread->current_state = _States_Clear( STATES_TRANSIENT, state ); 80065a8: 59 62 00 10 sw (r11+16),r2 _ISR_Enable( level ); 80065ac: d0 0c 00 00 wcsr IE,r12 */ RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue ( States_Control the_states ) { return (the_states & STATES_WAITING_ON_THREAD_QUEUE); 80065b0: 78 03 08 01 mvhi r3,0x801 80065b4: 38 63 81 b4 ori r3,r3,0x81b4 80065b8: 28 62 00 00 lw r2,(r3+0) 80065bc: a0 22 08 00 and r1,r1,r2 if ( _States_Is_waiting_on_thread_queue( state ) ) { 80065c0: 44 20 00 3d be r1,r0,80066b4 <_Thread_Change_priority+0x178> _Thread_queue_Requeue( the_thread->Wait.queue, the_thread ); 80065c4: 29 61 00 44 lw r1,(r11+68) 80065c8: b9 60 10 00 mv r2,r11 80065cc: f8 00 03 4d calli 8007300 <_Thread_queue_Requeue> 80065d0: e0 00 00 39 bi 80066b4 <_Thread_Change_priority+0x178> } return; } /* Only clear the transient state if it wasn't set already */ if ( ! _States_Is_transient( original_state ) ) { 80065d4: 5c 80 00 28 bne r4,r0,8006674 <_Thread_Change_priority+0x138><== NEVER TAKEN 80065d8: 78 02 08 01 mvhi r2,0x801 * Ready Queue with interrupts off. * * FIXME: hard-coded for priority scheduling. Might be ok since this * function is specific to priority scheduling? */ the_thread->current_state = _States_Clear( STATES_TRANSIENT, state ); 80065dc: 59 60 00 10 sw (r11+16),r0 80065e0: 29 61 00 8c lw r1,(r11+140) 80065e4: 38 42 9e 48 ori r2,r2,0x9e48 if ( prepend_it ) 80065e8: 45 a4 00 12 be r13,r4,8006630 <_Thread_Change_priority+0xf4> RTEMS_INLINE_ROUTINE void _Priority_bit_map_Add ( Priority_bit_map_Information *the_priority_map ) { *the_priority_map->minor |= the_priority_map->ready_minor; 80065ec: 28 23 00 04 lw r3,(r1+4) 80065f0: 2c 24 00 0a lhu r4,(r1+10) 80065f4: 2c 66 00 00 lhu r6,(r3+0) 80065f8: b8 c4 20 00 or r4,r6,r4 80065fc: 0c 64 00 00 sh (r3+0),r4 _Priority_Major_bit_map |= the_priority_map->ready_major; 8006600: 2c 43 00 00 lhu r3,(r2+0) 8006604: 2c 24 00 08 lhu r4,(r1+8) Thread_Control *the_thread ) { _Priority_bit_map_Add( &the_thread->scheduler.priority->Priority_map ); _Chain_Prepend_unprotected( the_thread->scheduler.priority->ready_chain, 8006608: 28 21 00 00 lw r1,(r1+0) 800660c: b8 83 18 00 or r3,r4,r3 8006610: 20 63 ff ff andi r3,r3,0xffff 8006614: 0c 43 00 00 sh (r2+0),r3 ) { Chain_Node *before_node; the_node->previous = after_node; before_node = after_node->next; 8006618: 28 22 00 00 lw r2,(r1+0) Chain_Node *the_node ) { Chain_Node *before_node; the_node->previous = after_node; 800661c: 59 61 00 04 sw (r11+4),r1 before_node = after_node->next; after_node->next = the_node; 8006620: 58 2b 00 00 sw (r1+0),r11 the_node->next = before_node; 8006624: 59 62 00 00 sw (r11+0),r2 before_node->previous = the_node; 8006628: 58 4b 00 04 sw (r2+4),r11 800662c: e0 00 00 12 bi 8006674 <_Thread_Change_priority+0x138> RTEMS_INLINE_ROUTINE void _Priority_bit_map_Add ( Priority_bit_map_Information *the_priority_map ) { *the_priority_map->minor |= the_priority_map->ready_minor; 8006630: 28 23 00 04 lw r3,(r1+4) 8006634: 2c 24 00 0a lhu r4,(r1+10) 8006638: 2c 66 00 00 lhu r6,(r3+0) 800663c: b8 c4 20 00 or r4,r6,r4 8006640: 0c 64 00 00 sh (r3+0),r4 _Priority_Major_bit_map |= the_priority_map->ready_major; 8006644: 2c 24 00 08 lhu r4,(r1+8) 8006648: 2c 43 00 00 lhu r3,(r2+0) Thread_Control *the_thread ) { _Priority_bit_map_Add( &the_thread->scheduler.priority->Priority_map ); _Chain_Append_unprotected( the_thread->scheduler.priority->ready_chain, 800664c: 28 21 00 00 lw r1,(r1+0) 8006650: b8 83 18 00 or r3,r4,r3 8006654: 20 63 ff ff andi r3,r3,0xffff 8006658: 0c 43 00 00 sh (r2+0),r3 Chain_Control *the_chain, Chain_Node *the_node ) { Chain_Node *tail = _Chain_Tail( the_chain ); Chain_Node *old_last = tail->previous; 800665c: 28 22 00 08 lw r2,(r1+8) RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected( Chain_Control *the_chain, Chain_Node *the_node ) { Chain_Node *tail = _Chain_Tail( the_chain ); 8006660: 34 23 00 04 addi r3,r1,4 Chain_Node *old_last = tail->previous; the_node->next = tail; 8006664: 59 63 00 00 sw (r11+0),r3 tail->previous = the_node; 8006668: 58 2b 00 08 sw (r1+8),r11 old_last->next = the_node; 800666c: 58 4b 00 00 sw (r2+0),r11 the_node->previous = old_last; 8006670: 59 62 00 04 sw (r11+4),r2 _Scheduler_priority_Ready_queue_enqueue_first( the_thread ); else _Scheduler_priority_Ready_queue_enqueue( the_thread ); } _ISR_Flash( level ); 8006674: d0 0c 00 00 wcsr IE,r12 8006678: d0 05 00 00 wcsr IE,r5 */ RTEMS_INLINE_ROUTINE void _Scheduler_Schedule( Scheduler_Control *the_scheduler ) { the_scheduler->Operations.schedule( the_scheduler ); 800667c: 78 01 08 01 mvhi r1,0x801 8006680: 38 21 99 e4 ori r1,r1,0x99e4 8006684: 28 22 00 04 lw r2,(r1+4) 8006688: d8 40 00 00 call r2 * is also the heir thread, and false otherwise. */ RTEMS_INLINE_ROUTINE bool _Thread_Is_executing_also_the_heir( void ) { return ( _Thread_Executing == _Thread_Heir ); 800668c: 78 01 08 01 mvhi r1,0x801 8006690: 38 21 9e 2c ori r1,r1,0x9e2c 8006694: 28 22 00 0c lw r2,(r1+12) * We altered the set of thread priorities. So let's figure out * who is the heir and if we need to switch to them. */ _Scheduler_Schedule(&_Scheduler); if ( !_Thread_Is_executing_also_the_heir() && 8006698: 28 23 00 10 lw r3,(r1+16) 800669c: 44 43 00 05 be r2,r3,80066b0 <_Thread_Change_priority+0x174> 80066a0: 40 42 00 74 lbu r2,(r2+116) 80066a4: 44 40 00 03 be r2,r0,80066b0 <_Thread_Change_priority+0x174> _Thread_Executing->is_preemptible ) _Thread_Dispatch_necessary = true; 80066a8: 34 02 00 01 mvi r2,1 80066ac: 30 22 00 18 sb (r1+24),r2 _ISR_Enable( level ); 80066b0: d0 0c 00 00 wcsr IE,r12 } 80066b4: 2b 9d 00 04 lw ra,(sp+4) 80066b8: 2b 8b 00 14 lw r11,(sp+20) 80066bc: 2b 8c 00 10 lw r12,(sp+16) 80066c0: 2b 8d 00 0c lw r13,(sp+12) 80066c4: 2b 8e 00 08 lw r14,(sp+8) 80066c8: 37 9c 00 18 addi sp,sp,24 80066cc: c3 a0 00 00 ret =============================================================================== 0800bdf0 <_Thread_Delay_ended>: void _Thread_Delay_ended( Objects_Id id, void *ignored __attribute__((unused)) ) { 800bdf0: 37 9c ff f8 addi sp,sp,-8 800bdf4: 5b 9d 00 04 sw (sp+4),ra Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); 800bdf8: 37 82 00 08 addi r2,sp,8 800bdfc: f8 00 00 7c calli 800bfec <_Thread_Get> switch ( location ) { 800be00: 2b 82 00 08 lw r2,(sp+8) 800be04: 5c 40 00 0a bne r2,r0,800be2c <_Thread_Delay_ended+0x3c> <== NEVER TAKEN #if defined(RTEMS_MULTIPROCESSING) case OBJECTS_REMOTE: /* impossible */ #endif break; case OBJECTS_LOCAL: _Thread_Clear_state( 800be08: 78 03 08 02 mvhi r3,0x802 800be0c: 38 63 75 8c ori r3,r3,0x758c 800be10: 28 62 00 00 lw r2,(r3+0) 800be14: fb ff ff 6d calli 800bbc8 <_Thread_Clear_state> 800be18: 78 01 08 02 mvhi r1,0x802 800be1c: 38 21 9a 50 ori r1,r1,0x9a50 800be20: 28 22 00 00 lw r2,(r1+0) 800be24: 34 42 ff ff addi r2,r2,-1 800be28: 58 22 00 00 sw (r1+0),r2 | STATES_INTERRUPTIBLE_BY_SIGNAL ); _Thread_Unnest_dispatch(); break; } } 800be2c: 2b 9d 00 04 lw ra,(sp+4) 800be30: 37 9c 00 08 addi sp,sp,8 800be34: c3 a0 00 00 ret =============================================================================== 080067b8 <_Thread_Dispatch>: * dispatch thread * no dispatch thread */ void _Thread_Dispatch( void ) { 80067b8: 37 9c ff c0 addi sp,sp,-64 80067bc: 5b 8b 00 30 sw (sp+48),r11 80067c0: 5b 8c 00 2c sw (sp+44),r12 80067c4: 5b 8d 00 28 sw (sp+40),r13 80067c8: 5b 8e 00 24 sw (sp+36),r14 80067cc: 5b 8f 00 20 sw (sp+32),r15 80067d0: 5b 90 00 1c sw (sp+28),r16 80067d4: 5b 91 00 18 sw (sp+24),r17 80067d8: 5b 92 00 14 sw (sp+20),r18 80067dc: 5b 93 00 10 sw (sp+16),r19 80067e0: 5b 94 00 0c sw (sp+12),r20 80067e4: 5b 95 00 08 sw (sp+8),r21 80067e8: 5b 9d 00 04 sw (sp+4),ra Thread_Control *executing; Thread_Control *heir; ISR_Level level; executing = _Thread_Executing; 80067ec: 78 01 08 01 mvhi r1,0x801 80067f0: 38 21 9e 2c ori r1,r1,0x9e2c 80067f4: 28 2d 00 0c lw r13,(r1+12) _ISR_Disable( level ); 80067f8: 90 00 20 00 rcsr r4,IE 80067fc: 34 01 ff fe mvi r1,-2 8006800: a0 81 08 00 and r1,r4,r1 8006804: d0 01 00 00 wcsr IE,r1 while ( _Thread_Dispatch_necessary == true ) { 8006808: 78 0c 08 01 mvhi r12,0x801 heir = _Thread_Heir; _Thread_Dispatch_disable_level = 1; 800680c: 78 11 08 01 mvhi r17,0x801 #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; 8006810: 78 0f 08 01 mvhi r15,0x801 #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ { Timestamp_Control uptime, ran; _TOD_Get_uptime( &uptime ); _Timestamp_Subtract( 8006814: 78 0e 08 01 mvhi r14,0x801 #endif /* * Switch libc's task specific data. */ if ( _Thread_libc_reent ) { 8006818: 78 10 08 01 mvhi r16,0x801 Thread_Control *heir; ISR_Level level; executing = _Thread_Executing; _ISR_Disable( level ); while ( _Thread_Dispatch_necessary == true ) { 800681c: 39 8c 9e 2c ori r12,r12,0x9e2c heir = _Thread_Heir; _Thread_Dispatch_disable_level = 1; 8006820: 3a 31 99 60 ori r17,r17,0x9960 8006824: 34 14 00 01 mvi r20,1 #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; 8006828: 39 ef 98 f8 ori r15,r15,0x98f8 _ISR_Enable( level ); #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ { Timestamp_Control uptime, ran; _TOD_Get_uptime( &uptime ); 800682c: 37 93 00 3c addi r19,sp,60 _Timestamp_Subtract( 8006830: 39 ce 9a 2c ori r14,r14,0x9a2c 8006834: 37 92 00 34 addi r18,sp,52 #endif /* * Switch libc's task specific data. */ if ( _Thread_libc_reent ) { 8006838: 3a 10 9a 04 ori r16,r16,0x9a04 #endif #endif executing = _Thread_Executing; _ISR_Disable( level ); 800683c: 34 15 ff fe mvi r21,-2 Thread_Control *heir; ISR_Level level; executing = _Thread_Executing; _ISR_Disable( level ); while ( _Thread_Dispatch_necessary == true ) { 8006840: e0 00 00 28 bi 80068e0 <_Thread_Dispatch+0x128> heir = _Thread_Heir; 8006844: 29 8b 00 10 lw r11,(r12+16) _Thread_Dispatch_disable_level = 1; 8006848: 5a 34 00 00 sw (r17+0),r20 _Thread_Dispatch_necessary = false; 800684c: 31 80 00 18 sb (r12+24),r0 _Thread_Executing = heir; 8006850: 59 8b 00 0c sw (r12+12),r11 /* * 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 ) 8006854: 45 6d 00 26 be r11,r13,80068ec <_Thread_Dispatch+0x134> */ #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 ) 8006858: 29 61 00 7c lw r1,(r11+124) 800685c: 5c 34 00 03 bne r1,r20,8006868 <_Thread_Dispatch+0xb0> heir->cpu_time_budget = _Thread_Ticks_per_timeslice; 8006860: 29 e1 00 00 lw r1,(r15+0) 8006864: 59 61 00 78 sw (r11+120),r1 _ISR_Enable( level ); 8006868: d0 04 00 00 wcsr IE,r4 #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ { Timestamp_Control uptime, ran; _TOD_Get_uptime( &uptime ); 800686c: ba 60 08 00 mv r1,r19 8006870: f8 00 1f 88 calli 800e690 <_TOD_Get_uptime> _Timestamp_Subtract( 8006874: b9 c0 08 00 mv r1,r14 8006878: ba 60 10 00 mv r2,r19 800687c: ba 40 18 00 mv r3,r18 8006880: f8 00 03 8e calli 80076b8 <_Timespec_Subtract> &_Thread_Time_of_last_context_switch, &uptime, &ran ); _Timestamp_Add_to( &executing->cpu_time_used, &ran ); 8006884: 35 a1 00 84 addi r1,r13,132 8006888: ba 40 10 00 mv r2,r18 800688c: f8 00 03 72 calli 8007654 <_Timespec_Add_to> _Thread_Time_of_last_context_switch = uptime; 8006890: 2b 81 00 3c lw r1,(sp+60) #endif /* * Switch libc's task specific data. */ if ( _Thread_libc_reent ) { 8006894: 2a 04 00 00 lw r4,(r16+0) &_Thread_Time_of_last_context_switch, &uptime, &ran ); _Timestamp_Add_to( &executing->cpu_time_used, &ran ); _Thread_Time_of_last_context_switch = uptime; 8006898: 59 c1 00 00 sw (r14+0),r1 800689c: 2b 81 00 40 lw r1,(sp+64) 80068a0: 59 c1 00 04 sw (r14+4),r1 #endif /* * Switch libc's task specific data. */ if ( _Thread_libc_reent ) { 80068a4: 44 80 00 05 be r4,r0,80068b8 <_Thread_Dispatch+0x100> <== NEVER TAKEN executing->libc_reent = *_Thread_libc_reent; 80068a8: 28 81 00 00 lw r1,(r4+0) 80068ac: 59 a1 01 18 sw (r13+280),r1 *_Thread_libc_reent = heir->libc_reent; 80068b0: 29 61 01 18 lw r1,(r11+280) 80068b4: 58 81 00 00 sw (r4+0),r1 } _User_extensions_Thread_switch( executing, heir ); 80068b8: b9 a0 08 00 mv r1,r13 80068bc: b9 60 10 00 mv r2,r11 80068c0: f8 00 04 5d calli 8007a34 <_User_extensions_Thread_switch> if ( executing->fp_context != NULL ) _Context_Save_fp( &executing->fp_context ); #endif #endif _Context_Switch( &executing->Registers, &heir->Registers ); 80068c4: 35 a1 00 c4 addi r1,r13,196 80068c8: 35 62 00 c4 addi r2,r11,196 80068cc: f8 00 05 3d calli 8007dc0 <_CPU_Context_switch> if ( executing->fp_context != NULL ) _Context_Restore_fp( &executing->fp_context ); #endif #endif executing = _Thread_Executing; 80068d0: 29 8d 00 0c lw r13,(r12+12) _ISR_Disable( level ); 80068d4: 90 00 20 00 rcsr r4,IE 80068d8: a0 95 08 00 and r1,r4,r21 80068dc: d0 01 00 00 wcsr IE,r1 Thread_Control *heir; ISR_Level level; executing = _Thread_Executing; _ISR_Disable( level ); while ( _Thread_Dispatch_necessary == true ) { 80068e0: 41 81 00 18 lbu r1,(r12+24) 80068e4: 20 21 00 ff andi r1,r1,0xff 80068e8: 5c 20 ff d7 bne r1,r0,8006844 <_Thread_Dispatch+0x8c> _ISR_Disable( level ); } post_switch: _Thread_Dispatch_disable_level = 0; 80068ec: 78 01 08 01 mvhi r1,0x801 80068f0: 38 21 99 60 ori r1,r1,0x9960 80068f4: 58 20 00 00 sw (r1+0),r0 _ISR_Enable( level ); 80068f8: d0 04 00 00 wcsr IE,r4 _API_extensions_Run_postswitch(); 80068fc: fb ff f8 3f calli 80049f8 <_API_extensions_Run_postswitch> } 8006900: 2b 9d 00 04 lw ra,(sp+4) 8006904: 2b 8b 00 30 lw r11,(sp+48) 8006908: 2b 8c 00 2c lw r12,(sp+44) 800690c: 2b 8d 00 28 lw r13,(sp+40) 8006910: 2b 8e 00 24 lw r14,(sp+36) 8006914: 2b 8f 00 20 lw r15,(sp+32) 8006918: 2b 90 00 1c lw r16,(sp+28) 800691c: 2b 91 00 18 lw r17,(sp+24) 8006920: 2b 92 00 14 lw r18,(sp+20) 8006924: 2b 93 00 10 lw r19,(sp+16) 8006928: 2b 94 00 0c lw r20,(sp+12) 800692c: 2b 95 00 08 lw r21,(sp+8) 8006930: 37 9c 00 40 addi sp,sp,64 8006934: c3 a0 00 00 ret =============================================================================== 08011218 <_Thread_Handler>: * * Output parameters: NONE */ void _Thread_Handler( void ) { 8011218: 37 9c ff f4 addi sp,sp,-12 801121c: 5b 8b 00 0c sw (sp+12),r11 8011220: 5b 8c 00 08 sw (sp+8),r12 8011224: 5b 9d 00 04 sw (sp+4),ra #if defined(EXECUTE_GLOBAL_CONSTRUCTORS) static char doneConstructors; char doneCons; #endif executing = _Thread_Executing; 8011228: 78 01 08 01 mvhi r1,0x801 801122c: 38 21 9e 2c ori r1,r1,0x9e2c 8011230: 28 2b 00 0c lw r11,(r1+12) /* * have to put level into a register for those cpu's that use * inline asm here */ level = executing->Start.isr_level; 8011234: 29 61 00 ac lw r1,(r11+172) _ISR_Set_level(level); 8011238: 64 21 00 00 cmpei r1,r1,0 801123c: d0 01 00 00 wcsr IE,r1 #if defined(EXECUTE_GLOBAL_CONSTRUCTORS) doneCons = doneConstructors; 8011240: 78 01 08 01 mvhi r1,0x801 8011244: 38 21 97 bc ori r1,r1,0x97bc 8011248: 40 2c 00 00 lbu r12,(r1+0) doneConstructors = 1; 801124c: 34 02 00 01 mvi r2,1 8011250: 30 22 00 00 sb (r1+0),r2 /* * 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 ); 8011254: b9 60 08 00 mv r1,r11 8011258: fb ff d9 6b calli 8007804 <_User_extensions_Thread_begin> /* * At this point, the dispatch disable level BETTER be 1. */ _Thread_Enable_dispatch(); 801125c: fb ff d5 b7 calli 8006938 <_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) */ { 8011260: 5d 80 00 02 bne r12,r0,8011268 <_Thread_Handler+0x50> INIT_NAME (); 8011264: fb ff bb 67 calli 8000000 } #endif if ( executing->Start.prototype == THREAD_START_NUMERIC ) { 8011268: 29 61 00 94 lw r1,(r11+148) 801126c: 5c 20 00 04 bne r1,r0,801127c <_Thread_Handler+0x64> executing->Wait.return_argument = (*(Thread_Entry_numeric) executing->Start.entry_point)( 8011270: 29 62 00 90 lw r2,(r11+144) 8011274: 29 61 00 9c lw r1,(r11+156) 8011278: e0 00 00 05 bi 801128c <_Thread_Handler+0x74> executing->Start.numeric_argument ); } #if defined(RTEMS_POSIX_API) else if ( executing->Start.prototype == THREAD_START_POINTER ) { 801127c: 34 02 00 01 mvi r2,1 8011280: 5c 22 00 05 bne r1,r2,8011294 <_Thread_Handler+0x7c> <== NEVER TAKEN executing->Wait.return_argument = (*(Thread_Entry_pointer) executing->Start.entry_point)( 8011284: 29 62 00 90 lw r2,(r11+144) 8011288: 29 61 00 98 lw r1,(r11+152) 801128c: d8 40 00 00 call r2 executing->Start.numeric_argument ); } #if defined(RTEMS_POSIX_API) else if ( executing->Start.prototype == THREAD_START_POINTER ) { executing->Wait.return_argument = 8011290: 59 61 00 28 sw (r11+40),r1 * 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 ); 8011294: b9 60 08 00 mv r1,r11 8011298: fb ff d9 73 calli 8007864 <_User_extensions_Thread_exitted> _Internal_error_Occurred( 801129c: 34 01 00 00 mvi r1,0 80112a0: 34 02 00 01 mvi r2,1 80112a4: 34 03 00 05 mvi r3,5 80112a8: fb ff d0 be calli 80055a0 <_Internal_error_Occurred> =============================================================================== 0800a330 <_Thread_Resume>: void _Thread_Resume( Thread_Control *the_thread, bool force ) { 800a330: 37 9c ff f8 addi sp,sp,-8 800a334: 5b 8b 00 08 sw (sp+8),r11 800a338: 5b 9d 00 04 sw (sp+4),ra 800a33c: b8 20 10 00 mv r2,r1 ISR_Level level; States_Control current_state; _ISR_Disable( level ); 800a340: 90 00 58 00 rcsr r11,IE 800a344: 34 01 ff fe mvi r1,-2 800a348: a1 61 08 00 and r1,r11,r1 800a34c: d0 01 00 00 wcsr IE,r1 current_state = the_thread->current_state; 800a350: 28 41 00 10 lw r1,(r2+16) if ( current_state & STATES_SUSPENDED ) { 800a354: 20 23 00 02 andi r3,r1,0x2 800a358: 44 60 00 09 be r3,r0,800a37c <_Thread_Resume+0x4c> <== NEVER TAKEN RTEMS_INLINE_ROUTINE States_Control _States_Clear ( States_Control states_to_clear, States_Control current_state ) { return (current_state & ~states_to_clear); 800a35c: 34 03 ff fd mvi r3,-3 800a360: a0 23 08 00 and r1,r1,r3 current_state = the_thread->current_state = _States_Clear(STATES_SUSPENDED, current_state); 800a364: 58 41 00 10 sw (r2+16),r1 if ( _States_Is_ready( current_state ) ) { 800a368: 5c 20 00 05 bne r1,r0,800a37c <_Thread_Resume+0x4c> RTEMS_INLINE_ROUTINE void _Scheduler_Unblock( Scheduler_Control *the_scheduler, Thread_Control *the_thread ) { the_scheduler->Operations.unblock( the_scheduler, the_thread ); 800a36c: 78 01 08 01 mvhi r1,0x801 800a370: 38 21 9a 34 ori r1,r1,0x9a34 800a374: 28 23 00 10 lw r3,(r1+16) 800a378: d8 60 00 00 call r3 _Scheduler_Unblock( &_Scheduler, the_thread ); } } _ISR_Enable( level ); 800a37c: d0 0b 00 00 wcsr IE,r11 } 800a380: 2b 9d 00 04 lw ra,(sp+4) 800a384: 2b 8b 00 08 lw r11,(sp+8) 800a388: 37 9c 00 08 addi sp,sp,8 800a38c: c3 a0 00 00 ret =============================================================================== 0800bce8 <_Thread_Tickle_timeslice>: * * Output parameters: NONE */ void _Thread_Tickle_timeslice( void ) { 800bce8: 37 9c ff f8 addi sp,sp,-8 800bcec: 5b 8b 00 08 sw (sp+8),r11 800bcf0: 5b 9d 00 04 sw (sp+4),ra Thread_Control *executing; executing = _Thread_Executing; 800bcf4: 78 01 08 01 mvhi r1,0x801 800bcf8: 38 21 ae dc ori r1,r1,0xaedc 800bcfc: 28 2b 00 0c lw r11,(r1+12) /* * If the thread is not preemptible or is not ready, then * just return. */ if ( !executing->is_preemptible ) 800bd00: 41 61 00 74 lbu r1,(r11+116) 800bd04: 44 20 00 1e be r1,r0,800bd7c <_Thread_Tickle_timeslice+0x94> return; if ( !_States_Is_ready( executing->current_state ) ) 800bd08: 29 61 00 10 lw r1,(r11+16) 800bd0c: 5c 20 00 1c bne r1,r0,800bd7c <_Thread_Tickle_timeslice+0x94><== NEVER TAKEN /* * The cpu budget algorithm determines what happens next. */ switch ( executing->budget_algorithm ) { 800bd10: 29 61 00 7c lw r1,(r11+124) 800bd14: 44 20 00 1a be r1,r0,800bd7c <_Thread_Tickle_timeslice+0x94> 800bd18: 34 02 00 02 mvi r2,2 800bd1c: 50 41 00 04 bgeu r2,r1,800bd2c <_Thread_Tickle_timeslice+0x44> 800bd20: 34 02 00 03 mvi r2,3 800bd24: 5c 22 00 16 bne r1,r2,800bd7c <_Thread_Tickle_timeslice+0x94><== NEVER TAKEN 800bd28: e0 00 00 0e bi 800bd60 <_Thread_Tickle_timeslice+0x78> 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 ) { 800bd2c: 29 61 00 78 lw r1,(r11+120) 800bd30: 34 21 ff ff addi r1,r1,-1 800bd34: 59 61 00 78 sw (r11+120),r1 800bd38: 48 20 00 11 bg r1,r0,800bd7c <_Thread_Tickle_timeslice+0x94> * always operates on the scheduler that 'owns' the currently executing * thread. */ RTEMS_INLINE_ROUTINE void _Scheduler_Yield( void ) { _Scheduler.Operations.yield( &_Scheduler ); 800bd3c: 78 01 08 01 mvhi r1,0x801 800bd40: 38 21 aa 94 ori r1,r1,0xaa94 800bd44: 28 22 00 08 lw r2,(r1+8) 800bd48: d8 40 00 00 call r2 * 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; 800bd4c: 78 01 08 01 mvhi r1,0x801 800bd50: 38 21 a9 a8 ori r1,r1,0xa9a8 800bd54: 28 21 00 00 lw r1,(r1+0) 800bd58: 59 61 00 78 sw (r11+120),r1 800bd5c: e0 00 00 08 bi 800bd7c <_Thread_Tickle_timeslice+0x94> } break; #if defined(RTEMS_SCORE_THREAD_ENABLE_SCHEDULER_CALLOUT) case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT: if ( --executing->cpu_time_budget == 0 ) 800bd60: 29 61 00 78 lw r1,(r11+120) 800bd64: 34 21 ff ff addi r1,r1,-1 800bd68: 59 61 00 78 sw (r11+120),r1 800bd6c: 5c 20 00 04 bne r1,r0,800bd7c <_Thread_Tickle_timeslice+0x94> (*executing->budget_callout)( executing ); 800bd70: 29 62 00 80 lw r2,(r11+128) 800bd74: b9 60 08 00 mv r1,r11 800bd78: d8 40 00 00 call r2 break; #endif } } 800bd7c: 2b 9d 00 04 lw ra,(sp+4) 800bd80: 2b 8b 00 08 lw r11,(sp+8) 800bd84: 37 9c 00 08 addi sp,sp,8 800bd88: c3 a0 00 00 ret =============================================================================== 0800efcc <_Thread_blocking_operation_Cancel>: Thread_blocking_operation_States sync_state __attribute__((unused)), #endif Thread_Control *the_thread, ISR_Level level ) { 800efcc: 37 9c ff f8 addi sp,sp,-8 800efd0: 5b 8b 00 08 sw (sp+8),r11 800efd4: 5b 9d 00 04 sw (sp+4),ra 800efd8: b8 40 58 00 mv r11,r2 #endif /* * The thread is not waiting on anything after this completes. */ the_thread->Wait.queue = NULL; 800efdc: 58 40 00 44 sw (r2+68),r0 /* * If the sync state is timed out, this is very likely not needed. * But better safe than sorry when it comes to critical sections. */ if ( _Watchdog_Is_active( &the_thread->Timer ) ) { 800efe0: 28 42 00 50 lw r2,(r2+80) 800efe4: 34 01 00 02 mvi r1,2 800efe8: 5c 41 00 07 bne r2,r1,800f004 <_Thread_blocking_operation_Cancel+0x38><== ALWAYS TAKEN RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate( Watchdog_Control *the_watchdog ) { the_watchdog->state = WATCHDOG_REMOVE_IT; 800efec: 34 01 00 03 mvi r1,3 <== NOT EXECUTED 800eff0: 59 61 00 50 sw (r11+80),r1 <== NOT EXECUTED _Watchdog_Deactivate( &the_thread->Timer ); _ISR_Enable( level ); 800eff4: d0 03 00 00 wcsr IE,r3 <== NOT EXECUTED (void) _Watchdog_Remove( &the_thread->Timer ); 800eff8: 35 61 00 48 addi r1,r11,72 <== NOT EXECUTED 800effc: fb ff e3 08 calli 8007c1c <_Watchdog_Remove> <== NOT EXECUTED 800f000: e0 00 00 02 bi 800f008 <_Thread_blocking_operation_Cancel+0x3c><== NOT EXECUTED } else _ISR_Enable( level ); 800f004: d0 03 00 00 wcsr IE,r3 RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); 800f008: 78 03 08 01 mvhi r3,0x801 800f00c: 38 63 81 bc ori r3,r3,0x81bc 800f010: 28 62 00 00 lw r2,(r3+0) 800f014: b9 60 08 00 mv r1,r11 800f018: f8 00 00 05 calli 800f02c <_Thread_Clear_state> #if defined(RTEMS_MULTIPROCESSING) if ( !_Objects_Is_local_id( the_thread->Object.id ) ) _Thread_MP_Free_proxy( the_thread ); #endif } 800f01c: 2b 9d 00 04 lw ra,(sp+4) 800f020: 2b 8b 00 08 lw r11,(sp+8) 800f024: 37 9c 00 08 addi sp,sp,8 800f028: c3 a0 00 00 ret =============================================================================== 0800f258 <_Thread_queue_Enqueue_fifo>: ) { Thread_blocking_operation_States sync_state; ISR_Level level; _ISR_Disable( level ); 800f258: 90 00 20 00 rcsr r4,IE 800f25c: 34 05 ff fe mvi r5,-2 800f260: a0 85 28 00 and r5,r4,r5 800f264: d0 05 00 00 wcsr IE,r5 sync_state = the_thread_queue->sync_state; 800f268: 28 25 00 30 lw r5,(r1+48) the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED; if (sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED) { 800f26c: 34 06 00 01 mvi r6,1 ISR_Level level; _ISR_Disable( level ); sync_state = the_thread_queue->sync_state; the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED; 800f270: 58 20 00 30 sw (r1+48),r0 if (sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED) { 800f274: 5c a6 00 0a bne r5,r6,800f29c <_Thread_queue_Enqueue_fifo+0x44><== NEVER TAKEN Chain_Control *the_chain, Chain_Node *the_node ) { Chain_Node *tail = _Chain_Tail( the_chain ); Chain_Node *old_last = tail->previous; 800f278: 28 23 00 08 lw r3,(r1+8) RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected( Chain_Control *the_chain, Chain_Node *the_node ) { Chain_Node *tail = _Chain_Tail( the_chain ); 800f27c: 34 26 00 04 addi r6,r1,4 Chain_Node *old_last = tail->previous; the_node->next = tail; 800f280: 58 46 00 00 sw (r2+0),r6 tail->previous = the_node; 800f284: 58 22 00 08 sw (r1+8),r2 old_last->next = the_node; 800f288: 58 62 00 00 sw (r3+0),r2 the_node->previous = old_last; 800f28c: 58 43 00 04 sw (r2+4),r3 _Chain_Append_unprotected( &the_thread_queue->Queues.Fifo, &the_thread->Object.Node ); the_thread->Wait.queue = the_thread_queue; 800f290: 58 41 00 44 sw (r2+68),r1 the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED; _ISR_Enable( level ); 800f294: d0 04 00 00 wcsr IE,r4 return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; 800f298: e0 00 00 02 bi 800f2a0 <_Thread_queue_Enqueue_fifo+0x48> * For example, the blocking thread could have been given * the mutex by an ISR or timed out. * * WARNING! Returning with interrupts disabled! */ *level_p = level; 800f29c: 58 64 00 00 sw (r3+0),r4 <== NOT EXECUTED return sync_state; } 800f2a0: b8 a0 08 00 mv r1,r5 800f2a4: c3 a0 00 00 ret =============================================================================== 08006fb0 <_Thread_queue_Enqueue_priority>: Thread_blocking_operation_States _Thread_queue_Enqueue_priority ( Thread_queue_Control *the_thread_queue, Thread_Control *the_thread, ISR_Level *level_p ) { 8006fb0: 37 9c ff cc addi sp,sp,-52 8006fb4: 5b 8b 00 34 sw (sp+52),r11 8006fb8: 5b 8c 00 30 sw (sp+48),r12 8006fbc: 5b 8d 00 2c sw (sp+44),r13 8006fc0: 5b 8e 00 28 sw (sp+40),r14 8006fc4: 5b 8f 00 24 sw (sp+36),r15 8006fc8: 5b 90 00 20 sw (sp+32),r16 8006fcc: 5b 91 00 1c sw (sp+28),r17 8006fd0: 5b 92 00 18 sw (sp+24),r18 8006fd4: 5b 93 00 14 sw (sp+20),r19 8006fd8: 5b 94 00 10 sw (sp+16),r20 8006fdc: 5b 95 00 0c sw (sp+12),r21 8006fe0: 5b 96 00 08 sw (sp+8),r22 8006fe4: 5b 9d 00 04 sw (sp+4),ra Priority_Control priority; States_Control block_state; _Chain_Initialize_empty( &the_thread->Wait.Block2n ); priority = the_thread->current_priority; 8006fe8: 28 50 00 14 lw r16,(r2+20) Thread_blocking_operation_States _Thread_queue_Enqueue_priority ( Thread_queue_Control *the_thread_queue, Thread_Control *the_thread, ISR_Level *level_p ) { 8006fec: b8 20 68 00 mv r13,r1 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 ); 8006ff0: 34 41 00 3c addi r1,r2,60 head->next = tail; 8006ff4: 58 41 00 38 sw (r2+56),r1 */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { Chain_Node *head = _Chain_Head( the_chain ); 8006ff8: 34 41 00 38 addi r1,r2,56 Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; head->previous = NULL; tail->previous = head; 8006ffc: 58 41 00 40 sw (r2+64),r1 { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; head->previous = NULL; 8007000: 58 40 00 3c sw (r2+60),r0 8007004: b8 40 60 00 mv r12,r2 RTEMS_INLINE_ROUTINE uint32_t _Thread_queue_Header_number ( Priority_Control the_priority ) { return (the_priority / TASK_QUEUE_DATA_PRIORITIES_PER_HEADER); 8007008: ba 00 08 00 mv r1,r16 800700c: 34 02 00 06 mvi r2,6 8007010: b8 60 a8 00 mv r21,r3 8007014: f8 00 40 18 calli 8017074 <__lshrsi3> 8007018: b8 20 70 00 mv r14,r1 the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; 800701c: 78 12 08 01 mvhi r18,0x801 RTEMS_INLINE_ROUTINE bool _Thread_queue_Is_reverse_search ( Priority_Control the_priority ) { return ( the_priority & TASK_QUEUE_DATA_REVERSE_SEARCH_MASK ); 8007020: 22 01 00 20 andi r1,r16,0x20 _Chain_Initialize_empty( &the_thread->Wait.Block2n ); priority = the_thread->current_priority; header_index = _Thread_queue_Header_number( priority ); header = &the_thread_queue->Queues.Priority[ header_index ]; block_state = the_thread_queue->state; 8007024: 29 b3 00 38 lw r19,(r13+56) the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; 8007028: 3a 52 90 a8 ori r18,r18,0x90a8 _ISR_Disable( level ); 800702c: 34 16 ff fe mvi r22,-2 priority = the_thread->current_priority; header_index = _Thread_queue_Header_number( priority ); header = &the_thread_queue->Queues.Priority[ header_index ]; block_state = the_thread_queue->state; if ( _Thread_queue_Is_reverse_search( priority ) ) 8007030: 5c 20 00 30 bne r1,r0,80070f0 <_Thread_queue_Enqueue_priority+0x140> goto restart_reverse_search; restart_forward_search: search_priority = PRIORITY_MINIMUM - 1; _ISR_Disable( level ); 8007034: 34 14 ff fe mvi r20,-2 8007038: 90 00 78 00 rcsr r15,IE 800703c: a1 f4 90 00 and r18,r15,r20 8007040: d0 12 00 00 wcsr IE,r18 * * WARNING! Returning with interrupts disabled! */ *level_p = level; return the_thread_queue->sync_state; } 8007044: 34 02 00 01 mvi r2,1 8007048: b9 c0 08 00 mv r1,r14 800704c: f8 00 3f bc calli 8016f3c <__ashlsi3> 8007050: b4 2e 08 00 add r1,r1,r14 8007054: 34 02 00 02 mvi r2,2 8007058: f8 00 3f b9 calli 8016f3c <__ashlsi3> 800705c: b5 a1 08 00 add r1,r13,r1 goto restart_reverse_search; restart_forward_search: search_priority = PRIORITY_MINIMUM - 1; _ISR_Disable( level ); search_thread = (Thread_Control *) _Chain_First( header ); 8007060: 28 2b 00 00 lw r11,(r1+0) if ( _Thread_queue_Is_reverse_search( priority ) ) goto restart_reverse_search; restart_forward_search: search_priority = PRIORITY_MINIMUM - 1; 8007064: 34 11 ff ff mvi r17,-1 _ISR_Disable( level ); search_thread = (Thread_Control *) _Chain_First( header ); while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) { 8007068: e0 00 00 0b bi 8007094 <_Thread_queue_Enqueue_priority+0xe4> search_priority = search_thread->current_priority; 800706c: 29 71 00 14 lw r17,(r11+20) if ( priority <= search_priority ) 8007070: 52 30 00 12 bgeu r17,r16,80070b8 <_Thread_queue_Enqueue_priority+0x108> break; search_priority = search_thread->current_priority; if ( priority <= search_priority ) break; #endif _ISR_Flash( level ); 8007074: d0 0f 00 00 wcsr IE,r15 8007078: d0 12 00 00 wcsr IE,r18 RTEMS_INLINE_ROUTINE bool _States_Are_set ( States_Control the_states, States_Control mask ) { return ( (the_states & mask) != STATES_READY); 800707c: 29 61 00 10 lw r1,(r11+16) 8007080: a2 61 08 00 and r1,r19,r1 if ( !_States_Are_set( search_thread->current_state, block_state) ) { 8007084: 5c 20 00 03 bne r1,r0,8007090 <_Thread_queue_Enqueue_priority+0xe0><== ALWAYS TAKEN _ISR_Enable( level ); 8007088: d0 0f 00 00 wcsr IE,r15 <== NOT EXECUTED goto restart_forward_search; 800708c: e3 ff ff eb bi 8007038 <_Thread_queue_Enqueue_priority+0x88><== NOT EXECUTED } search_thread = (Thread_Control *)search_thread->Object.Node.next; 8007090: 29 6b 00 00 lw r11,(r11+0) RTEMS_INLINE_ROUTINE bool _Chain_Is_tail( Chain_Control *the_chain, const Chain_Node *the_node ) { return (the_node == _Chain_Tail(the_chain)); 8007094: 34 02 00 01 mvi r2,1 8007098: b9 c0 08 00 mv r1,r14 800709c: f8 00 3f a8 calli 8016f3c <__ashlsi3> 80070a0: b4 2e 08 00 add r1,r1,r14 80070a4: 34 02 00 02 mvi r2,2 80070a8: f8 00 3f a5 calli 8016f3c <__ashlsi3> 80070ac: b5 a1 08 00 add r1,r13,r1 80070b0: 34 21 00 04 addi r1,r1,4 restart_forward_search: search_priority = PRIORITY_MINIMUM - 1; _ISR_Disable( level ); search_thread = (Thread_Control *) _Chain_First( header ); while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) { 80070b4: 5d 61 ff ee bne r11,r1,800706c <_Thread_queue_Enqueue_priority+0xbc> } search_thread = (Thread_Control *)search_thread->Object.Node.next; } if ( the_thread_queue->sync_state != 80070b8: 29 a3 00 30 lw r3,(r13+48) 80070bc: 34 02 00 01 mvi r2,1 80070c0: b9 e0 08 00 mv r1,r15 80070c4: 5c 62 00 43 bne r3,r2,80071d0 <_Thread_queue_Enqueue_priority+0x220><== NEVER TAKEN THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) goto synchronize; the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED; 80070c8: 59 a0 00 30 sw (r13+48),r0 if ( priority == search_priority ) 80070cc: 46 11 00 38 be r16,r17,80071ac <_Thread_queue_Enqueue_priority+0x1fc> goto equal_priority; search_node = (Chain_Node *) search_thread; previous_node = search_node->previous; 80070d0: 29 61 00 04 lw r1,(r11+4) the_node = (Chain_Node *) the_thread; the_node->next = search_node; 80070d4: 59 8b 00 00 sw (r12+0),r11 the_node->previous = previous_node; 80070d8: 59 81 00 04 sw (r12+4),r1 previous_node->next = the_node; 80070dc: 58 2c 00 00 sw (r1+0),r12 search_node->previous = the_node; 80070e0: 59 6c 00 04 sw (r11+4),r12 the_thread->Wait.queue = the_thread_queue; 80070e4: 59 8d 00 44 sw (r12+68),r13 _ISR_Enable( level ); 80070e8: d0 0f 00 00 wcsr IE,r15 80070ec: e0 00 00 2e bi 80071a4 <_Thread_queue_Enqueue_priority+0x1f4> return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; 80070f0: 42 51 00 00 lbu r17,(r18+0) 80070f4: 36 31 00 01 addi r17,r17,1 _ISR_Disable( level ); 80070f8: 90 00 78 00 rcsr r15,IE 80070fc: a1 f6 a0 00 and r20,r15,r22 8007100: d0 14 00 00 wcsr IE,r20 * * WARNING! Returning with interrupts disabled! */ *level_p = level; return the_thread_queue->sync_state; } 8007104: 34 02 00 01 mvi r2,1 8007108: b9 c0 08 00 mv r1,r14 800710c: f8 00 3f 8c calli 8016f3c <__ashlsi3> 8007110: b4 2e 08 00 add r1,r1,r14 8007114: 34 02 00 02 mvi r2,2 8007118: f8 00 3f 89 calli 8016f3c <__ashlsi3> 800711c: b5 a1 08 00 add r1,r13,r1 restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; _ISR_Disable( level ); search_thread = (Thread_Control *) _Chain_Last( header ); 8007120: 28 2b 00 08 lw r11,(r1+8) while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) { 8007124: e0 00 00 0b bi 8007150 <_Thread_queue_Enqueue_priority+0x1a0> search_priority = search_thread->current_priority; 8007128: 29 71 00 14 lw r17,(r11+20) if ( priority >= search_priority ) 800712c: 52 11 00 11 bgeu r16,r17,8007170 <_Thread_queue_Enqueue_priority+0x1c0> break; search_priority = search_thread->current_priority; if ( priority >= search_priority ) break; #endif _ISR_Flash( level ); 8007130: d0 0f 00 00 wcsr IE,r15 8007134: d0 14 00 00 wcsr IE,r20 8007138: 29 61 00 10 lw r1,(r11+16) 800713c: a2 61 08 00 and r1,r19,r1 if ( !_States_Are_set( search_thread->current_state, block_state) ) { 8007140: 5c 20 00 03 bne r1,r0,800714c <_Thread_queue_Enqueue_priority+0x19c><== ALWAYS TAKEN _ISR_Enable( level ); 8007144: d0 0f 00 00 wcsr IE,r15 <== NOT EXECUTED goto restart_reverse_search; 8007148: e3 ff ff ea bi 80070f0 <_Thread_queue_Enqueue_priority+0x140><== NOT EXECUTED } search_thread = (Thread_Control *) search_thread->Object.Node.previous; 800714c: 29 6b 00 04 lw r11,(r11+4) RTEMS_INLINE_ROUTINE bool _Chain_Is_head( Chain_Control *the_chain, const Chain_Node *the_node ) { return (the_node == _Chain_Head(the_chain)); 8007150: 34 02 00 01 mvi r2,1 8007154: b9 c0 08 00 mv r1,r14 8007158: f8 00 3f 79 calli 8016f3c <__ashlsi3> 800715c: b4 2e 08 00 add r1,r1,r14 8007160: 34 02 00 02 mvi r2,2 8007164: f8 00 3f 76 calli 8016f3c <__ashlsi3> 8007168: b5 a1 08 00 add r1,r13,r1 restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; _ISR_Disable( level ); search_thread = (Thread_Control *) _Chain_Last( header ); while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) { 800716c: 5d 61 ff ef bne r11,r1,8007128 <_Thread_queue_Enqueue_priority+0x178> } search_thread = (Thread_Control *) search_thread->Object.Node.previous; } if ( the_thread_queue->sync_state != 8007170: 29 a3 00 30 lw r3,(r13+48) 8007174: 34 02 00 01 mvi r2,1 8007178: b9 e0 08 00 mv r1,r15 800717c: 5c 62 00 15 bne r3,r2,80071d0 <_Thread_queue_Enqueue_priority+0x220><== NEVER TAKEN THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) goto synchronize; the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED; 8007180: 59 a0 00 30 sw (r13+48),r0 if ( priority == search_priority ) 8007184: 46 11 00 0a be r16,r17,80071ac <_Thread_queue_Enqueue_priority+0x1fc> goto equal_priority; search_node = (Chain_Node *) search_thread; next_node = search_node->next; 8007188: 29 61 00 00 lw r1,(r11+0) the_node = (Chain_Node *) the_thread; the_node->next = next_node; the_node->previous = search_node; 800718c: 59 8b 00 04 sw (r12+4),r11 search_node = (Chain_Node *) search_thread; next_node = search_node->next; the_node = (Chain_Node *) the_thread; the_node->next = next_node; 8007190: 59 81 00 00 sw (r12+0),r1 the_node->previous = search_node; search_node->next = the_node; 8007194: 59 6c 00 00 sw (r11+0),r12 next_node->previous = the_node; 8007198: 58 2c 00 04 sw (r1+4),r12 the_thread->Wait.queue = the_thread_queue; 800719c: 59 8d 00 44 sw (r12+68),r13 _ISR_Enable( level ); 80071a0: d0 0f 00 00 wcsr IE,r15 return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; 80071a4: 34 01 00 01 mvi r1,1 80071a8: e0 00 00 0c bi 80071d8 <_Thread_queue_Enqueue_priority+0x228> equal_priority: /* add at end of priority group */ search_node = _Chain_Tail( &search_thread->Wait.Block2n ); previous_node = search_node->previous; 80071ac: 29 61 00 40 lw r1,(r11+64) the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; equal_priority: /* add at end of priority group */ search_node = _Chain_Tail( &search_thread->Wait.Block2n ); 80071b0: 35 62 00 3c addi r2,r11,60 previous_node = search_node->previous; the_node = (Chain_Node *) the_thread; the_node->next = search_node; 80071b4: 59 82 00 00 sw (r12+0),r2 the_node->previous = previous_node; 80071b8: 59 81 00 04 sw (r12+4),r1 previous_node->next = the_node; 80071bc: 58 2c 00 00 sw (r1+0),r12 search_node->previous = the_node; 80071c0: 59 6c 00 40 sw (r11+64),r12 the_thread->Wait.queue = the_thread_queue; 80071c4: 59 8d 00 44 sw (r12+68),r13 _ISR_Enable( level ); 80071c8: d0 0f 00 00 wcsr IE,r15 80071cc: e3 ff ff f6 bi 80071a4 <_Thread_queue_Enqueue_priority+0x1f4> * For example, the blocking thread could have been given * the mutex by an ISR or timed out. * * WARNING! Returning with interrupts disabled! */ *level_p = level; 80071d0: 5a a1 00 00 sw (r21+0),r1 <== NOT EXECUTED return the_thread_queue->sync_state; 80071d4: 29 a1 00 30 lw r1,(r13+48) <== NOT EXECUTED } 80071d8: 2b 9d 00 04 lw ra,(sp+4) 80071dc: 2b 8b 00 34 lw r11,(sp+52) 80071e0: 2b 8c 00 30 lw r12,(sp+48) 80071e4: 2b 8d 00 2c lw r13,(sp+44) 80071e8: 2b 8e 00 28 lw r14,(sp+40) 80071ec: 2b 8f 00 24 lw r15,(sp+36) 80071f0: 2b 90 00 20 lw r16,(sp+32) 80071f4: 2b 91 00 1c lw r17,(sp+28) 80071f8: 2b 92 00 18 lw r18,(sp+24) 80071fc: 2b 93 00 14 lw r19,(sp+20) 8007200: 2b 94 00 10 lw r20,(sp+16) 8007204: 2b 95 00 0c lw r21,(sp+12) 8007208: 2b 96 00 08 lw r22,(sp+8) 800720c: 37 9c 00 34 addi sp,sp,52 8007210: c3 a0 00 00 ret =============================================================================== 08006eec <_Thread_queue_Enqueue_with_handler>: void _Thread_queue_Enqueue_with_handler( Thread_queue_Control *the_thread_queue, Watchdog_Interval timeout, Thread_queue_Timeout_callout handler ) { 8006eec: 37 9c ff e8 addi sp,sp,-24 8006ef0: 5b 8b 00 14 sw (sp+20),r11 8006ef4: 5b 8c 00 10 sw (sp+16),r12 8006ef8: 5b 8d 00 0c sw (sp+12),r13 8006efc: 5b 8e 00 08 sw (sp+8),r14 8006f00: 5b 9d 00 04 sw (sp+4),ra 8006f04: b8 20 60 00 mv r12,r1 Thread_queue_Control *, Thread_Control *, ISR_Level * ); the_thread = _Thread_Executing; 8006f08: 78 01 08 01 mvhi r1,0x801 8006f0c: 38 21 9e 2c ori r1,r1,0x9e2c 8006f10: 28 2b 00 0c lw r11,(r1+12) void _Thread_queue_Enqueue_with_handler( Thread_queue_Control *the_thread_queue, Watchdog_Interval timeout, Thread_queue_Timeout_callout handler ) { 8006f14: b8 40 68 00 mv r13,r2 else #endif /* * Set the blocking state for this thread queue in the thread. */ _Thread_Set_state( the_thread, the_thread_queue->state ); 8006f18: 29 82 00 38 lw r2,(r12+56) 8006f1c: b9 60 08 00 mv r1,r11 void _Thread_queue_Enqueue_with_handler( Thread_queue_Control *the_thread_queue, Watchdog_Interval timeout, Thread_queue_Timeout_callout handler ) { 8006f20: b8 60 70 00 mv r14,r3 else #endif /* * Set the blocking state for this thread queue in the thread. */ _Thread_Set_state( the_thread, the_thread_queue->state ); 8006f24: f8 00 01 38 calli 8007404 <_Thread_Set_state> /* * If the thread wants to timeout, then schedule its timer. */ if ( timeout ) { 8006f28: 45 a0 00 0b be r13,r0,8006f54 <_Thread_queue_Enqueue_with_handler+0x68> _Watchdog_Initialize( 8006f2c: 29 61 00 08 lw r1,(r11+8) Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 8006f30: 59 60 00 50 sw (r11+80),r0 the_watchdog->routine = routine; 8006f34: 59 6e 00 64 sw (r11+100),r14 the_watchdog->id = id; 8006f38: 59 61 00 68 sw (r11+104),r1 ) { the_watchdog->initial = units; _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 8006f3c: 78 01 08 01 mvhi r1,0x801 ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; the_watchdog->id = id; the_watchdog->user_data = user_data; 8006f40: 59 60 00 6c sw (r11+108),r0 Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 8006f44: 59 6d 00 54 sw (r11+84),r13 _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 8006f48: 38 21 9a 40 ori r1,r1,0x9a40 8006f4c: 35 62 00 48 addi r2,r11,72 8006f50: f8 00 02 d4 calli 8007aa0 <_Watchdog_Insert> } /* * Now enqueue the thread per the discipline for this thread queue. */ if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) 8006f54: 29 82 00 34 lw r2,(r12+52) enqueue_p = _Thread_queue_Enqueue_priority; else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */ enqueue_p = _Thread_queue_Enqueue_fifo; 8006f58: 78 04 08 00 mvhi r4,0x800 } /* * Now enqueue the thread per the discipline for this thread queue. */ if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) 8006f5c: 34 01 00 01 mvi r1,1 enqueue_p = _Thread_queue_Enqueue_priority; else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */ enqueue_p = _Thread_queue_Enqueue_fifo; 8006f60: 38 84 f2 58 ori r4,r4,0xf258 } /* * Now enqueue the thread per the discipline for this thread queue. */ if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) 8006f64: 5c 41 00 03 bne r2,r1,8006f70 <_Thread_queue_Enqueue_with_handler+0x84> enqueue_p = _Thread_queue_Enqueue_priority; 8006f68: 78 04 08 00 mvhi r4,0x800 8006f6c: 38 84 6f b0 ori r4,r4,0x6fb0 else /* must be THREAD_QUEUE_DISCIPLINE_FIFO */ enqueue_p = _Thread_queue_Enqueue_fifo; sync_state = (*enqueue_p)( the_thread_queue, the_thread, &level ); 8006f70: b9 60 10 00 mv r2,r11 8006f74: b9 80 08 00 mv r1,r12 8006f78: 37 83 00 18 addi r3,sp,24 8006f7c: d8 80 00 00 call r4 if ( sync_state != THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) 8006f80: 34 02 00 01 mvi r2,1 8006f84: 44 22 00 04 be r1,r2,8006f94 <_Thread_queue_Enqueue_with_handler+0xa8><== ALWAYS TAKEN _Thread_blocking_operation_Cancel( sync_state, the_thread, level ); 8006f88: 2b 83 00 18 lw r3,(sp+24) <== NOT EXECUTED 8006f8c: b9 60 10 00 mv r2,r11 <== NOT EXECUTED 8006f90: f8 00 20 0f calli 800efcc <_Thread_blocking_operation_Cancel><== NOT EXECUTED } 8006f94: 2b 9d 00 04 lw ra,(sp+4) 8006f98: 2b 8b 00 14 lw r11,(sp+20) 8006f9c: 2b 8c 00 10 lw r12,(sp+16) 8006fa0: 2b 8d 00 0c lw r13,(sp+12) 8006fa4: 2b 8e 00 08 lw r14,(sp+8) 8006fa8: 37 9c 00 18 addi sp,sp,24 8006fac: c3 a0 00 00 ret =============================================================================== 0800f3e0 <_Thread_queue_Process_timeout>: #include void _Thread_queue_Process_timeout( Thread_Control *the_thread ) { 800f3e0: 37 9c ff fc addi sp,sp,-4 800f3e4: 5b 9d 00 04 sw (sp+4),ra 800f3e8: b8 20 10 00 mv r2,r1 Thread_queue_Control *the_thread_queue = the_thread->Wait.queue; 800f3ec: 28 21 00 44 lw r1,(r1+68) * If it is not satisfied, then it is "nothing happened" and * this is the "timeout" transition. After a request is satisfied, * a timeout is not allowed to occur. */ if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SYNCHRONIZED && 800f3f0: 28 24 00 30 lw r4,(r1+48) 800f3f4: 44 80 00 0c be r4,r0,800f424 <_Thread_queue_Process_timeout+0x44> RTEMS_INLINE_ROUTINE bool _Thread_Is_executing ( const Thread_Control *the_thread ) { return ( the_thread == _Thread_Executing ); 800f3f8: 78 03 08 01 mvhi r3,0x801 800f3fc: 38 63 9e 2c ori r3,r3,0x9e2c 800f400: 28 63 00 0c lw r3,(r3+12) 800f404: 5c 43 00 08 bne r2,r3,800f424 <_Thread_queue_Process_timeout+0x44><== NEVER TAKEN _Thread_Is_executing( the_thread ) ) { if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SATISFIED ) { 800f408: 34 03 00 03 mvi r3,3 800f40c: 44 83 00 09 be r4,r3,800f430 <_Thread_queue_Process_timeout+0x50><== ALWAYS TAKEN the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status; 800f410: 28 23 00 3c lw r3,(r1+60) <== NOT EXECUTED 800f414: 58 43 00 34 sw (r2+52),r3 <== NOT EXECUTED the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT; 800f418: 34 02 00 02 mvi r2,2 <== NOT EXECUTED 800f41c: 58 22 00 30 sw (r1+48),r2 <== NOT EXECUTED 800f420: e0 00 00 04 bi 800f430 <_Thread_queue_Process_timeout+0x50><== NOT EXECUTED } } else { the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status; 800f424: 28 23 00 3c lw r3,(r1+60) 800f428: 58 43 00 34 sw (r2+52),r3 _Thread_queue_Extract( the_thread->Wait.queue, the_thread ); 800f42c: f8 00 07 a0 calli 80112ac <_Thread_queue_Extract> } } 800f430: 2b 9d 00 04 lw ra,(sp+4) 800f434: 37 9c 00 04 addi sp,sp,4 800f438: c3 a0 00 00 ret =============================================================================== 08007300 <_Thread_queue_Requeue>: void _Thread_queue_Requeue( Thread_queue_Control *the_thread_queue, Thread_Control *the_thread ) { 8007300: 37 9c ff ec addi sp,sp,-20 8007304: 5b 8b 00 10 sw (sp+16),r11 8007308: 5b 8c 00 0c sw (sp+12),r12 800730c: 5b 8d 00 08 sw (sp+8),r13 8007310: 5b 9d 00 04 sw (sp+4),ra 8007314: b8 20 58 00 mv r11,r1 8007318: b8 40 60 00 mv r12,r2 /* * Just in case the thread really wasn't blocked on a thread queue * when we get here. */ if ( !the_thread_queue ) 800731c: 44 20 00 19 be r1,r0,8007380 <_Thread_queue_Requeue+0x80> <== 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 ) { 8007320: 28 22 00 34 lw r2,(r1+52) 8007324: 34 01 00 01 mvi r1,1 8007328: 5c 41 00 16 bne r2,r1,8007380 <_Thread_queue_Requeue+0x80> <== NEVER TAKEN Thread_queue_Control *tq = the_thread_queue; ISR_Level level; ISR_Level level_ignored; _ISR_Disable( level ); 800732c: 90 00 68 00 rcsr r13,IE 8007330: 34 01 ff fe mvi r1,-2 8007334: a1 a1 08 00 and r1,r13,r1 8007338: d0 01 00 00 wcsr IE,r1 */ RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue ( States_Control the_states ) { return (the_states & STATES_WAITING_ON_THREAD_QUEUE); 800733c: 78 03 08 01 mvhi r3,0x801 8007340: 38 63 81 b4 ori r3,r3,0x81b4 8007344: 29 82 00 10 lw r2,(r12+16) 8007348: 28 61 00 00 lw r1,(r3+0) 800734c: a0 41 08 00 and r1,r2,r1 if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) { 8007350: 44 20 00 0b be r1,r0,800737c <_Thread_queue_Requeue+0x7c> <== 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; 8007354: 34 01 00 01 mvi r1,1 8007358: 59 61 00 30 sw (r11+48),r1 _Thread_queue_Enter_critical_section( tq ); _Thread_queue_Extract_priority_helper( tq, the_thread, true ); 800735c: b9 80 10 00 mv r2,r12 8007360: b9 60 08 00 mv r1,r11 8007364: 34 03 00 01 mvi r3,1 8007368: f8 00 1f d0 calli 800f2a8 <_Thread_queue_Extract_priority_helper> (void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored ); 800736c: b9 60 08 00 mv r1,r11 8007370: b9 80 10 00 mv r2,r12 8007374: 37 83 00 14 addi r3,sp,20 8007378: fb ff ff 0e calli 8006fb0 <_Thread_queue_Enqueue_priority> } _ISR_Enable( level ); 800737c: d0 0d 00 00 wcsr IE,r13 } } 8007380: 2b 9d 00 04 lw ra,(sp+4) 8007384: 2b 8b 00 10 lw r11,(sp+16) 8007388: 2b 8c 00 0c lw r12,(sp+12) 800738c: 2b 8d 00 08 lw r13,(sp+8) 8007390: 37 9c 00 14 addi sp,sp,20 8007394: c3 a0 00 00 ret =============================================================================== 08007398 <_Thread_queue_Timeout>: void _Thread_queue_Timeout( Objects_Id id, void *ignored __attribute__((unused)) ) { 8007398: 37 9c ff f8 addi sp,sp,-8 800739c: 5b 9d 00 04 sw (sp+4),ra Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); 80073a0: 37 82 00 08 addi r2,sp,8 80073a4: fb ff fd 72 calli 800696c <_Thread_Get> switch ( location ) { 80073a8: 2b 82 00 08 lw r2,(sp+8) 80073ac: 5c 40 00 07 bne r2,r0,80073c8 <_Thread_queue_Timeout+0x30> <== NEVER TAKEN #if defined(RTEMS_MULTIPROCESSING) case OBJECTS_REMOTE: /* impossible */ #endif break; case OBJECTS_LOCAL: _Thread_queue_Process_timeout( the_thread ); 80073b0: f8 00 20 0c calli 800f3e0 <_Thread_queue_Process_timeout> */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; 80073b4: 78 01 08 01 mvhi r1,0x801 80073b8: 38 21 99 60 ori r1,r1,0x9960 80073bc: 28 22 00 00 lw r2,(r1+0) 80073c0: 34 42 ff ff addi r2,r2,-1 80073c4: 58 22 00 00 sw (r1+0),r2 _Thread_Unnest_dispatch(); break; } } 80073c8: 2b 9d 00 04 lw ra,(sp+4) 80073cc: 37 9c 00 08 addi sp,sp,8 80073d0: c3 a0 00 00 ret =============================================================================== 080146bc <_Timer_server_Body>: * @a arg points to the corresponding timer server control block. */ static rtems_task _Timer_server_Body( rtems_task_argument arg ) { 80146bc: 37 9c ff a8 addi sp,sp,-88 80146c0: 5b 8b 00 40 sw (sp+64),r11 80146c4: 5b 8c 00 3c sw (sp+60),r12 80146c8: 5b 8d 00 38 sw (sp+56),r13 80146cc: 5b 8e 00 34 sw (sp+52),r14 80146d0: 5b 8f 00 30 sw (sp+48),r15 80146d4: 5b 90 00 2c sw (sp+44),r16 80146d8: 5b 91 00 28 sw (sp+40),r17 80146dc: 5b 92 00 24 sw (sp+36),r18 80146e0: 5b 93 00 20 sw (sp+32),r19 80146e4: 5b 94 00 1c sw (sp+28),r20 80146e8: 5b 95 00 18 sw (sp+24),r21 80146ec: 5b 96 00 14 sw (sp+20),r22 80146f0: 5b 97 00 10 sw (sp+16),r23 80146f4: 5b 98 00 0c sw (sp+12),r24 80146f8: 5b 99 00 08 sw (sp+8),r25 80146fc: 5b 9d 00 04 sw (sp+4),ra static void _Timer_server_Process_interval_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot; 8014700: 78 10 08 04 mvhi r16,0x804 * @a arg points to the corresponding timer server control block. */ static rtems_task _Timer_server_Body( rtems_task_argument arg ) { 8014704: b8 20 58 00 mv r11,r1 ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; 8014708: 37 82 00 54 addi r2,sp,84 801470c: 37 81 00 50 addi r1,sp,80 8014710: 37 8f 00 44 addi r15,sp,68 8014714: 37 91 00 48 addi r17,sp,72 static void _Timer_server_Process_tod_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch(); 8014718: 78 0e 08 04 mvhi r14,0x804 801471c: 5b 82 00 50 sw (sp+80),r2 head->previous = NULL; 8014720: 5b 80 00 54 sw (sp+84),r0 tail->previous = head; 8014724: 5b 81 00 58 sw (sp+88),r1 ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; 8014728: 5b 91 00 44 sw (sp+68),r17 head->previous = NULL; 801472c: 5b 80 00 48 sw (sp+72),r0 tail->previous = head; 8014730: 5b 8f 00 4c sw (sp+76),r15 Chain_Control *tmp; /* * Afterwards all timer inserts are directed to this chain and the interval * and TOD chains will be no more modified by other parties. */ ts->insert_chain = insert_chain; 8014734: b8 20 c8 00 mv r25,r1 static void _Timer_server_Process_interval_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot; 8014738: 3a 10 0e 10 ori r16,r16,0xe10 */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; watchdogs->last_snapshot = snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 801473c: 35 73 00 30 addi r19,r11,48 static void _Timer_server_Process_tod_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch(); 8014740: 39 ce 0d 88 ori r14,r14,0xd88 /* * 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 ); 8014744: 35 6d 00 68 addi r13,r11,104 Timer_Control *timer ) { if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) { _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); } else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) { 8014748: 34 18 00 03 mvi r24,3 * of zero it will be processed in the next iteration of the timer server * body loop. */ _Timer_server_Process_insertions( ts ); _ISR_Disable( level ); 801474c: 34 12 ff fe mvi r18,-2 */ RTEMS_INLINE_ROUTINE const Chain_Node *_Chain_Immutable_tail( const Chain_Control *the_chain ) { return &the_chain->Tail.Node; 8014750: b8 40 b8 00 mv r23,r2 _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; 8014754: 34 16 00 01 mvi r22,1 static void _Timer_server_Stop_interval_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog ); 8014758: 35 75 00 08 addi r21,r11,8 static void _Timer_server_Stop_tod_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog ); 801475c: 35 74 00 40 addi r20,r11,64 Chain_Control *tmp; /* * Afterwards all timer inserts are directed to this chain and the interval * and TOD chains will be no more modified by other parties. */ ts->insert_chain = insert_chain; 8014760: 59 79 00 78 sw (r11+120),r25 static void _Timer_server_Process_interval_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot; 8014764: 2a 02 00 00 lw r2,(r16+0) /* * We assume adequate unsigned arithmetic here. */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; 8014768: 29 63 00 3c lw r3,(r11+60) watchdogs->last_snapshot = snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 801476c: ba 60 08 00 mv r1,r19 /* * We assume adequate unsigned arithmetic here. */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; watchdogs->last_snapshot = snapshot; 8014770: 59 62 00 3c sw (r11+60),r2 _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 8014774: c8 43 10 00 sub r2,r2,r3 8014778: b9 e0 18 00 mv r3,r15 801477c: f8 00 15 86 calli 8019d94 <_Watchdog_Adjust_to_chain> Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch(); Watchdog_Interval last_snapshot = watchdogs->last_snapshot; 8014780: 29 64 00 74 lw r4,(r11+116) static void _Timer_server_Process_tod_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = (Watchdog_Interval) _TOD_Seconds_since_epoch(); 8014784: 29 cc 00 00 lw r12,(r14+0) /* * 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 ) { 8014788: 50 8c 00 06 bgeu r4,r12,80147a0 <_Timer_server_Body+0xe4> /* * 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 ); 801478c: b9 a0 08 00 mv r1,r13 8014790: c9 84 10 00 sub r2,r12,r4 8014794: b9 e0 18 00 mv r3,r15 8014798: f8 00 15 7f calli 8019d94 <_Watchdog_Adjust_to_chain> 801479c: e0 00 00 06 bi 80147b4 <_Timer_server_Body+0xf8> } else if ( snapshot < last_snapshot ) { 80147a0: 51 84 00 05 bgeu r12,r4,80147b4 <_Timer_server_Body+0xf8> /* * 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 ); 80147a4: b9 a0 08 00 mv r1,r13 80147a8: 34 02 00 01 mvi r2,1 80147ac: c8 8c 18 00 sub r3,r4,r12 80147b0: f8 00 15 42 calli 8019cb8 <_Watchdog_Adjust> } watchdogs->last_snapshot = snapshot; 80147b4: 59 6c 00 74 sw (r11+116),r12 static void _Timer_server_Insert_timer( Timer_server_Control *ts, Timer_Control *timer ) { if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) { 80147b8: 34 0c 00 01 mvi r12,1 } static void _Timer_server_Process_insertions( Timer_server_Control *ts ) { while ( true ) { Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain ); 80147bc: 29 63 00 78 lw r3,(r11+120) 80147c0: b8 60 08 00 mv r1,r3 80147c4: f8 00 03 84 calli 80155d4 <_Chain_Get> 80147c8: b8 20 10 00 mv r2,r1 if ( timer == NULL ) { 80147cc: 44 20 00 09 be r1,r0,80147f0 <_Timer_server_Body+0x134> <== ALWAYS TAKEN static void _Timer_server_Insert_timer( Timer_server_Control *ts, Timer_Control *timer ) { if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) { 80147d0: 28 23 00 38 lw r3,(r1+56) <== NOT EXECUTED _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); 80147d4: ba 60 08 00 mv r1,r19 <== NOT EXECUTED static void _Timer_server_Insert_timer( Timer_server_Control *ts, Timer_Control *timer ) { if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) { 80147d8: 44 6c 00 03 be r3,r12,80147e4 <_Timer_server_Body+0x128> <== NOT EXECUTED _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); } else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) { 80147dc: 5c 78 ff f8 bne r3,r24,80147bc <_Timer_server_Body+0x100> <== NOT EXECUTED _Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker ); 80147e0: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED 80147e4: 34 42 00 10 addi r2,r2,16 <== NOT EXECUTED 80147e8: f8 00 15 90 calli 8019e28 <_Watchdog_Insert> <== NOT EXECUTED 80147ec: e3 ff ff f4 bi 80147bc <_Timer_server_Body+0x100> <== NOT EXECUTED * of zero it will be processed in the next iteration of the timer server * body loop. */ _Timer_server_Process_insertions( ts ); _ISR_Disable( level ); 80147f0: 90 00 20 00 rcsr r4,IE 80147f4: a0 92 08 00 and r1,r4,r18 80147f8: d0 01 00 00 wcsr IE,r1 tmp = ts->insert_chain; 80147fc: 29 61 00 78 lw r1,(r11+120) if ( _Chain_Is_empty( insert_chain ) ) { 8014800: 2b 81 00 50 lw r1,(sp+80) 8014804: 34 03 00 01 mvi r3,1 8014808: 5c 37 00 03 bne r1,r23,8014814 <_Timer_server_Body+0x158> <== NEVER TAKEN ts->insert_chain = NULL; 801480c: 59 60 00 78 sw (r11+120),r0 do_loop = false; 8014810: 34 03 00 00 mvi r3,0 } _ISR_Enable( level ); 8014814: d0 04 00 00 wcsr IE,r4 * Afterwards all timer inserts are directed to this chain and the interval * and TOD chains will be no more modified by other parties. */ ts->insert_chain = insert_chain; while ( do_loop ) { 8014818: 5c 60 ff d3 bne r3,r0,8014764 <_Timer_server_Body+0xa8> <== NEVER TAKEN _Chain_Initialize_empty( &fire_chain ); while ( true ) { _Timer_server_Get_watchdogs_that_fire_now( ts, &insert_chain, &fire_chain ); if ( !_Chain_Is_empty( &fire_chain ) ) { 801481c: 2b 81 00 44 lw r1,(sp+68) 8014820: 44 31 00 13 be r1,r17,801486c <_Timer_server_Body+0x1b0> /* * It is essential that interrupts are disable here since an interrupt * service routine may remove a watchdog from the chain. */ _ISR_Disable( level ); 8014824: 90 00 18 00 rcsr r3,IE 8014828: a0 72 08 00 and r1,r3,r18 801482c: d0 01 00 00 wcsr IE,r1 initialized = false; } #endif return status; } 8014830: 2b 82 00 44 lw r2,(sp+68) */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected( Chain_Control *the_chain ) { if ( !_Chain_Is_empty(the_chain)) 8014834: 44 51 00 0c be r2,r17,8014864 <_Timer_server_Body+0x1a8> Chain_Control *the_chain ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *old_first = head->next; Chain_Node *new_first = old_first->next; 8014838: 28 44 00 00 lw r4,(r2+0) head->next = new_first; 801483c: 5b 84 00 44 sw (sp+68),r4 new_first->previous = head; 8014840: 58 8f 00 04 sw (r4+4),r15 * 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 ) { 8014844: 44 40 00 08 be r2,r0,8014864 <_Timer_server_Body+0x1a8> <== NEVER TAKEN watchdog->state = WATCHDOG_INACTIVE; 8014848: 58 40 00 08 sw (r2+8),r0 _ISR_Enable( level ); 801484c: d0 03 00 00 wcsr IE,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 ); 8014850: 28 43 00 1c lw r3,(r2+28) 8014854: 28 41 00 20 lw r1,(r2+32) 8014858: 28 42 00 24 lw r2,(r2+36) 801485c: d8 60 00 00 call r3 } 8014860: e3 ff ff f1 bi 8014824 <_Timer_server_Body+0x168> watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain ); if ( watchdog != NULL ) { watchdog->state = WATCHDOG_INACTIVE; _ISR_Enable( level ); } else { _ISR_Enable( level ); 8014864: d0 03 00 00 wcsr IE,r3 8014868: e3 ff ff be bi 8014760 <_Timer_server_Body+0xa4> * the active flag of the timer server is true. */ (*watchdog->routine)( watchdog->id, watchdog->user_data ); } } else { ts->active = false; 801486c: 31 60 00 7c sb (r11+124),r0 /* * Block until there is something to do. */ _Thread_Disable_dispatch(); 8014870: fb ff ff 53 calli 80145bc <_Thread_Disable_dispatch> _Thread_Set_state( ts->thread, STATES_DELAYING ); 8014874: 29 61 00 00 lw r1,(r11+0) 8014878: 34 02 00 08 mvi r2,8 801487c: f8 00 12 d7 calli 80193d8 <_Thread_Set_state> _Timer_server_Reset_interval_system_watchdog( ts ); 8014880: b9 60 08 00 mv r1,r11 8014884: fb ff ff 54 calli 80145d4 <_Timer_server_Reset_interval_system_watchdog> _Timer_server_Reset_tod_system_watchdog( ts ); 8014888: b9 60 08 00 mv r1,r11 801488c: fb ff ff 6f calli 8014648 <_Timer_server_Reset_tod_system_watchdog> _Thread_Enable_dispatch(); 8014890: f8 00 0f d6 calli 80187e8 <_Thread_Enable_dispatch> static void _Timer_server_Stop_interval_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog ); 8014894: ba a0 08 00 mv r1,r21 _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; 8014898: 31 76 00 7c sb (r11+124),r22 static void _Timer_server_Stop_interval_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog ); 801489c: f8 00 15 c2 calli 8019fa4 <_Watchdog_Remove> static void _Timer_server_Stop_tod_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog ); 80148a0: ba 80 08 00 mv r1,r20 80148a4: f8 00 15 c0 calli 8019fa4 <_Watchdog_Remove> 80148a8: e3 ff ff ae bi 8014760 <_Timer_server_Body+0xa4> =============================================================================== 080148ac <_Timer_server_Schedule_operation_method>: static void _Timer_server_Schedule_operation_method( Timer_server_Control *ts, Timer_Control *timer ) { 80148ac: 37 9c ff f4 addi sp,sp,-12 80148b0: 5b 8b 00 0c sw (sp+12),r11 80148b4: 5b 8c 00 08 sw (sp+8),r12 80148b8: 5b 9d 00 04 sw (sp+4),ra 80148bc: b8 20 58 00 mv r11,r1 if ( ts->insert_chain == NULL ) { 80148c0: 28 21 00 78 lw r1,(r1+120) static void _Timer_server_Schedule_operation_method( Timer_server_Control *ts, Timer_Control *timer ) { 80148c4: b8 40 60 00 mv r12,r2 if ( ts->insert_chain == NULL ) { 80148c8: 5c 20 00 43 bne r1,r0,80149d4 <_Timer_server_Schedule_operation_method+0x128><== NEVER TAKEN * is the reference point for the delta chain. Thus if we do not update the * reference point we have to add DT to the initial delta of the watchdog * being inserted. This could result in an integer overflow. */ _Thread_Disable_dispatch(); 80148cc: fb ff ff 3c calli 80145bc <_Thread_Disable_dispatch> if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) { 80148d0: 29 81 00 38 lw r1,(r12+56) 80148d4: 34 02 00 01 mvi r2,1 80148d8: 5c 22 00 1d bne r1,r2,801494c <_Timer_server_Schedule_operation_method+0xa0> /* * We have to advance the last known ticks value of the server and update * the watchdog chain accordingly. */ _ISR_Disable( level ); 80148dc: 90 00 10 00 rcsr r2,IE 80148e0: 34 01 ff fe mvi r1,-2 80148e4: a0 41 08 00 and r1,r2,r1 80148e8: d0 01 00 00 wcsr IE,r1 snapshot = _Watchdog_Ticks_since_boot; 80148ec: 78 01 08 04 mvhi r1,0x804 80148f0: 38 21 0e 10 ori r1,r1,0xe10 80148f4: 28 23 00 00 lw r3,(r1+0) initialized = false; } #endif return status; } 80148f8: 29 61 00 30 lw r1,(r11+48) * 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; 80148fc: 29 65 00 3c lw r5,(r11+60) RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); 8014900: 35 64 00 34 addi r4,r11,52 if ( !_Chain_Is_empty( &ts->Interval_watchdogs.Chain ) ) { 8014904: 44 24 00 07 be r1,r4,8014920 <_Timer_server_Schedule_operation_method+0x74> /* * We assume adequate unsigned arithmetic here. */ delta = snapshot - last_snapshot; delta_interval = first_watchdog->delta_interval; 8014908: 28 26 00 10 lw r6,(r1+16) first_watchdog = _Watchdog_First( &ts->Interval_watchdogs.Chain ); /* * We assume adequate unsigned arithmetic here. */ delta = snapshot - last_snapshot; 801490c: c8 65 28 00 sub r5,r3,r5 delta_interval = first_watchdog->delta_interval; if (delta_interval > delta) { delta_interval -= delta; } else { delta_interval = 0; 8014910: 34 04 00 00 mvi r4,0 * We assume adequate unsigned arithmetic here. */ delta = snapshot - last_snapshot; delta_interval = first_watchdog->delta_interval; if (delta_interval > delta) { 8014914: 50 a6 00 02 bgeu r5,r6,801491c <_Timer_server_Schedule_operation_method+0x70> delta_interval -= delta; 8014918: c8 c5 20 00 sub r4,r6,r5 } else { delta_interval = 0; } first_watchdog->delta_interval = delta_interval; 801491c: 58 24 00 10 sw (r1+16),r4 } ts->Interval_watchdogs.last_snapshot = snapshot; 8014920: 59 63 00 3c sw (r11+60),r3 _ISR_Enable( level ); 8014924: d0 02 00 00 wcsr IE,r2 _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); 8014928: 35 61 00 30 addi r1,r11,48 801492c: 35 82 00 10 addi r2,r12,16 8014930: f8 00 15 3e calli 8019e28 <_Watchdog_Insert> if ( !ts->active ) { 8014934: 41 61 00 7c lbu r1,(r11+124) 8014938: 20 21 00 ff andi r1,r1,0xff 801493c: 5c 20 00 24 bne r1,r0,80149cc <_Timer_server_Schedule_operation_method+0x120> _Timer_server_Reset_interval_system_watchdog( ts ); 8014940: b9 60 08 00 mv r1,r11 8014944: fb ff ff 24 calli 80145d4 <_Timer_server_Reset_interval_system_watchdog> 8014948: e0 00 00 21 bi 80149cc <_Timer_server_Schedule_operation_method+0x120> } } else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) { 801494c: 34 02 00 03 mvi r2,3 8014950: 5c 22 00 1f bne r1,r2,80149cc <_Timer_server_Schedule_operation_method+0x120> /* * We have to advance the last known seconds value of the server and update * the watchdog chain accordingly. */ _ISR_Disable( level ); 8014954: 90 00 30 00 rcsr r6,IE 8014958: 34 01 ff fe mvi r1,-2 801495c: a0 c1 08 00 and r1,r6,r1 8014960: d0 01 00 00 wcsr IE,r1 initialized = false; } #endif return status; } 8014964: 29 62 00 68 lw r2,(r11+104) /* * 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(); 8014968: 78 01 08 04 mvhi r1,0x804 last_snapshot = ts->TOD_watchdogs.last_snapshot; 801496c: 29 65 00 74 lw r5,(r11+116) /* * 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(); 8014970: 38 21 0d 88 ori r1,r1,0xd88 8014974: 35 63 00 6c addi r3,r11,108 8014978: 28 21 00 00 lw r1,(r1+0) last_snapshot = ts->TOD_watchdogs.last_snapshot; if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) { 801497c: 44 43 00 0a be r2,r3,80149a4 <_Timer_server_Schedule_operation_method+0xf8> first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain ); delta_interval = first_watchdog->delta_interval; 8014980: 28 44 00 10 lw r4,(r2+16) } } else { /* * Someone put us in the past. */ delta = last_snapshot - snapshot; 8014984: b4 85 18 00 add r3,r4,r5 delta_interval += delta; 8014988: c8 61 18 00 sub r3,r3,r1 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 ) { 801498c: 50 a1 00 05 bgeu r5,r1,80149a0 <_Timer_server_Schedule_operation_method+0xf4> /* * We advanced in time. */ delta = snapshot - last_snapshot; 8014990: c8 25 28 00 sub r5,r1,r5 if (delta_interval > delta) { delta_interval -= delta; } else { delta_interval = 0; 8014994: 34 03 00 00 mvi r3,0 if ( snapshot > last_snapshot ) { /* * We advanced in time. */ delta = snapshot - last_snapshot; if (delta_interval > delta) { 8014998: 50 a4 00 02 bgeu r5,r4,80149a0 <_Timer_server_Schedule_operation_method+0xf4><== NEVER TAKEN delta_interval -= delta; 801499c: c8 85 18 00 sub r3,r4,r5 * Someone put us in the past. */ delta = last_snapshot - snapshot; delta_interval += delta; } first_watchdog->delta_interval = delta_interval; 80149a0: 58 43 00 10 sw (r2+16),r3 } ts->TOD_watchdogs.last_snapshot = snapshot; 80149a4: 59 61 00 74 sw (r11+116),r1 _ISR_Enable( level ); 80149a8: d0 06 00 00 wcsr IE,r6 _Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker ); 80149ac: 35 61 00 68 addi r1,r11,104 80149b0: 35 82 00 10 addi r2,r12,16 80149b4: f8 00 15 1d calli 8019e28 <_Watchdog_Insert> if ( !ts->active ) { 80149b8: 41 61 00 7c lbu r1,(r11+124) 80149bc: 20 21 00 ff andi r1,r1,0xff 80149c0: 5c 20 00 03 bne r1,r0,80149cc <_Timer_server_Schedule_operation_method+0x120> _Timer_server_Reset_tod_system_watchdog( ts ); 80149c4: b9 60 08 00 mv r1,r11 80149c8: fb ff ff 20 calli 8014648 <_Timer_server_Reset_tod_system_watchdog> } } _Thread_Enable_dispatch(); 80149cc: f8 00 0f 87 calli 80187e8 <_Thread_Enable_dispatch> 80149d0: e0 00 00 03 bi 80149dc <_Timer_server_Schedule_operation_method+0x130> * 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 ); 80149d4: 29 61 00 78 lw r1,(r11+120) <== NOT EXECUTED 80149d8: f8 00 02 e9 calli 801557c <_Chain_Append> <== NOT EXECUTED } } 80149dc: 2b 9d 00 04 lw ra,(sp+4) 80149e0: 2b 8b 00 0c lw r11,(sp+12) 80149e4: 2b 8c 00 08 lw r12,(sp+8) 80149e8: 37 9c 00 0c addi sp,sp,12 80149ec: c3 a0 00 00 ret =============================================================================== 08007700 <_User_extensions_Handler_initialization>: #include #include #include void _User_extensions_Handler_initialization(void) { 8007700: 37 9c ff ec addi sp,sp,-20 8007704: 5b 8b 00 14 sw (sp+20),r11 8007708: 5b 8c 00 10 sw (sp+16),r12 800770c: 5b 8d 00 0c sw (sp+12),r13 8007710: 5b 8e 00 08 sw (sp+8),r14 8007714: 5b 9d 00 04 sw (sp+4),ra 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; 8007718: 78 02 08 01 mvhi r2,0x801 800771c: 38 42 90 ac ori r2,r2,0x90ac 8007720: 28 4e 00 3c lw r14,(r2+60) initial_extensions = Configuration.User_extension_table; 8007724: 28 4b 00 40 lw r11,(r2+64) ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; 8007728: 78 03 08 01 mvhi r3,0x801 800772c: 78 02 08 01 mvhi r2,0x801 8007730: 38 42 9a dc ori r2,r2,0x9adc 8007734: 38 63 9a e0 ori r3,r3,0x9ae0 8007738: 58 43 00 00 sw (r2+0),r3 head->previous = NULL; 800773c: 58 40 00 04 sw (r2+4),r0 tail->previous = head; 8007740: 58 42 00 08 sw (r2+8),r2 ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; 8007744: 78 03 08 01 mvhi r3,0x801 8007748: 78 02 08 01 mvhi r2,0x801 800774c: 38 42 99 64 ori r2,r2,0x9964 8007750: 38 63 99 68 ori r3,r3,0x9968 8007754: 58 43 00 00 sw (r2+0),r3 head->previous = NULL; 8007758: 58 40 00 04 sw (r2+4),r0 tail->previous = head; 800775c: 58 42 00 08 sw (r2+8),r2 _Chain_Initialize_empty( &_User_extensions_List ); _Chain_Initialize_empty( &_User_extensions_Switches_list ); if ( initial_extensions ) { 8007760: 45 60 00 22 be r11,r0,80077e8 <_User_extensions_Handler_initialization+0xe8><== NEVER TAKEN extension = (User_extensions_Control *) _Workspace_Allocate_or_fatal_error( number_of_extensions * sizeof( User_extensions_Control ) 8007764: 34 02 00 34 mvi r2,52 8007768: b9 c0 08 00 mv r1,r14 800776c: f8 00 3e 69 calli 8017110 <__mulsi3> 8007770: b8 20 68 00 mv r13,r1 _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( 8007774: f8 00 01 84 calli 8007d84 <_Workspace_Allocate_or_fatal_error> number_of_extensions * sizeof( User_extensions_Control ) ); memset ( 8007778: b9 a0 18 00 mv r3,r13 800777c: 34 02 00 00 mvi r2,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( 8007780: b8 20 60 00 mv r12,r1 extension, 0, number_of_extensions * sizeof( User_extensions_Control ) ); for ( i = 0 ; i < number_of_extensions ; i++ ) { 8007784: 34 0d 00 00 mvi r13,0 extension = (User_extensions_Control *) _Workspace_Allocate_or_fatal_error( number_of_extensions * sizeof( User_extensions_Control ) ); memset ( 8007788: f8 00 2a 3c calli 8012078 extension, 0, number_of_extensions * sizeof( User_extensions_Control ) ); for ( i = 0 ; i < number_of_extensions ; i++ ) { 800778c: e0 00 00 16 bi 80077e4 <_User_extensions_Handler_initialization+0xe4> RTEMS_INLINE_ROUTINE void _User_extensions_Add_set_with_table( User_extensions_Control *extension, const User_extensions_Table *extension_table ) { extension->Callouts = *extension_table; 8007790: 29 61 00 1c lw r1,(r11+28) 8007794: 29 68 00 00 lw r8,(r11+0) 8007798: 29 67 00 04 lw r7,(r11+4) 800779c: 29 66 00 08 lw r6,(r11+8) 80077a0: 29 65 00 0c lw r5,(r11+12) 80077a4: 29 64 00 10 lw r4,(r11+16) 80077a8: 29 63 00 14 lw r3,(r11+20) 80077ac: 29 62 00 18 lw r2,(r11+24) 80077b0: 59 81 00 30 sw (r12+48),r1 80077b4: 59 88 00 14 sw (r12+20),r8 80077b8: 59 87 00 18 sw (r12+24),r7 80077bc: 59 86 00 1c sw (r12+28),r6 80077c0: 59 85 00 20 sw (r12+32),r5 80077c4: 59 84 00 24 sw (r12+36),r4 80077c8: 59 83 00 28 sw (r12+40),r3 80077cc: 59 82 00 2c sw (r12+44),r2 _User_extensions_Add_set( extension ); 80077d0: b9 80 08 00 mv r1,r12 80077d4: f8 00 1f 4a calli 800f4fc <_User_extensions_Add_set> _User_extensions_Add_set_with_table (extension, &initial_extensions[i]); extension++; 80077d8: 35 8c 00 34 addi r12,r12,52 extension, 0, number_of_extensions * sizeof( User_extensions_Control ) ); for ( i = 0 ; i < number_of_extensions ; i++ ) { 80077dc: 35 ad 00 01 addi r13,r13,1 80077e0: 35 6b 00 20 addi r11,r11,32 80077e4: 55 cd ff eb bgu r14,r13,8007790 <_User_extensions_Handler_initialization+0x90> _User_extensions_Add_set_with_table (extension, &initial_extensions[i]); extension++; } } } 80077e8: 2b 9d 00 04 lw ra,(sp+4) 80077ec: 2b 8b 00 14 lw r11,(sp+20) 80077f0: 2b 8c 00 10 lw r12,(sp+16) 80077f4: 2b 8d 00 0c lw r13,(sp+12) 80077f8: 2b 8e 00 08 lw r14,(sp+8) 80077fc: 37 9c 00 14 addi sp,sp,20 8007800: c3 a0 00 00 ret =============================================================================== 080088a0 <_Watchdog_Adjust>: void _Watchdog_Adjust( Chain_Control *header, Watchdog_Adjust_directions direction, Watchdog_Interval units ) { 80088a0: 37 9c ff e4 addi sp,sp,-28 80088a4: 5b 8b 00 1c sw (sp+28),r11 80088a8: 5b 8c 00 18 sw (sp+24),r12 80088ac: 5b 8d 00 14 sw (sp+20),r13 80088b0: 5b 8e 00 10 sw (sp+16),r14 80088b4: 5b 8f 00 0c sw (sp+12),r15 80088b8: 5b 90 00 08 sw (sp+8),r16 80088bc: 5b 9d 00 04 sw (sp+4),ra 80088c0: b8 20 60 00 mv r12,r1 80088c4: b8 60 58 00 mv r11,r3 ISR_Level level; _ISR_Disable( level ); 80088c8: 90 00 08 00 rcsr r1,IE 80088cc: 34 03 ff fe mvi r3,-2 80088d0: a0 23 18 00 and r3,r1,r3 80088d4: d0 03 00 00 wcsr IE,r3 } } _ISR_Enable( level ); } 80088d8: 29 83 00 00 lw r3,(r12+0) RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); 80088dc: 35 8e 00 04 addi r14,r12,4 * hence the compiler must not assume *header to remain * unmodified across that call. * * Till Straumann, 7/2003 */ if ( !_Chain_Is_empty( header ) ) { 80088e0: 44 6e 00 1d be r3,r14,8008954 <_Watchdog_Adjust+0xb4> switch ( direction ) { 80088e4: 44 40 00 04 be r2,r0,80088f4 <_Watchdog_Adjust+0x54> 80088e8: 34 04 00 01 mvi r4,1 80088ec: 5c 44 00 1a bne r2,r4,8008954 <_Watchdog_Adjust+0xb4> <== NEVER TAKEN 80088f0: e0 00 00 04 bi 8008900 <_Watchdog_Adjust+0x60> 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; 80088f4: 34 10 00 01 mvi r16,1 _ISR_Enable( level ); _Watchdog_Tickle( header ); _ISR_Disable( level ); 80088f8: 34 0f ff fe mvi r15,-2 80088fc: e0 00 00 15 bi 8008950 <_Watchdog_Adjust+0xb0> * Till Straumann, 7/2003 */ if ( !_Chain_Is_empty( header ) ) { switch ( direction ) { case WATCHDOG_BACKWARD: _Watchdog_First( header )->delta_interval += units; 8008900: 28 62 00 10 lw r2,(r3+16) 8008904: b4 4b 58 00 add r11,r2,r11 8008908: 58 6b 00 10 sw (r3+16),r11 break; 800890c: e0 00 00 12 bi 8008954 <_Watchdog_Adjust+0xb4> RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First( Chain_Control *header ) { return ( (Watchdog_Control *) _Chain_First( header ) ); 8008910: 29 82 00 00 lw r2,(r12+0) case WATCHDOG_FORWARD: while ( units ) { if ( units < _Watchdog_First( header )->delta_interval ) { 8008914: 28 4d 00 10 lw r13,(r2+16) 8008918: 51 6d 00 04 bgeu r11,r13,8008928 <_Watchdog_Adjust+0x88> _Watchdog_First( header )->delta_interval -= units; 800891c: c9 ab 58 00 sub r11,r13,r11 8008920: 58 4b 00 10 sw (r2+16),r11 break; 8008924: e0 00 00 0c bi 8008954 <_Watchdog_Adjust+0xb4> } else { units -= _Watchdog_First( header )->delta_interval; _Watchdog_First( header )->delta_interval = 1; 8008928: 58 50 00 10 sw (r2+16),r16 _ISR_Enable( level ); 800892c: d0 01 00 00 wcsr IE,r1 _Watchdog_Tickle( header ); 8008930: b9 80 08 00 mv r1,r12 8008934: f8 00 00 9a calli 8008b9c <_Watchdog_Tickle> _ISR_Disable( level ); 8008938: 90 00 08 00 rcsr r1,IE 800893c: a0 2f 10 00 and r2,r1,r15 8008940: d0 02 00 00 wcsr IE,r2 if ( _Chain_Is_empty( header ) ) 8008944: 29 82 00 00 lw r2,(r12+0) 8008948: 44 4e 00 03 be r2,r14,8008954 <_Watchdog_Adjust+0xb4> while ( units ) { if ( units < _Watchdog_First( header )->delta_interval ) { _Watchdog_First( header )->delta_interval -= units; break; } else { units -= _Watchdog_First( header )->delta_interval; 800894c: c9 6d 58 00 sub r11,r11,r13 switch ( direction ) { case WATCHDOG_BACKWARD: _Watchdog_First( header )->delta_interval += units; break; case WATCHDOG_FORWARD: while ( units ) { 8008950: 5d 60 ff f0 bne r11,r0,8008910 <_Watchdog_Adjust+0x70> <== ALWAYS TAKEN } break; } } _ISR_Enable( level ); 8008954: d0 01 00 00 wcsr IE,r1 } 8008958: 2b 9d 00 04 lw ra,(sp+4) 800895c: 2b 8b 00 1c lw r11,(sp+28) 8008960: 2b 8c 00 18 lw r12,(sp+24) 8008964: 2b 8d 00 14 lw r13,(sp+20) 8008968: 2b 8e 00 10 lw r14,(sp+16) 800896c: 2b 8f 00 0c lw r15,(sp+12) 8008970: 2b 90 00 08 lw r16,(sp+8) 8008974: 37 9c 00 1c addi sp,sp,28 8008978: c3 a0 00 00 ret =============================================================================== 08007c1c <_Watchdog_Remove>: { ISR_Level level; Watchdog_States previous_state; Watchdog_Control *next_watchdog; _ISR_Disable( level ); 8007c1c: 90 00 28 00 rcsr r5,IE 8007c20: 34 02 ff fe mvi r2,-2 8007c24: a0 a2 10 00 and r2,r5,r2 8007c28: d0 02 00 00 wcsr IE,r2 previous_state = the_watchdog->state; 8007c2c: 28 23 00 08 lw r3,(r1+8) switch ( previous_state ) { 8007c30: 34 02 00 01 mvi r2,1 8007c34: 44 62 00 05 be r3,r2,8007c48 <_Watchdog_Remove+0x2c> 8007c38: 44 60 00 1b be r3,r0,8007ca4 <_Watchdog_Remove+0x88> 8007c3c: 34 02 00 03 mvi r2,3 8007c40: 54 62 00 19 bgu r3,r2,8007ca4 <_Watchdog_Remove+0x88> <== NEVER TAKEN 8007c44: e0 00 00 03 bi 8007c50 <_Watchdog_Remove+0x34> /* * 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; 8007c48: 58 20 00 08 sw (r1+8),r0 break; 8007c4c: e0 00 00 16 bi 8007ca4 <_Watchdog_Remove+0x88> } the_watchdog->stop_time = _Watchdog_Ticks_since_boot; _ISR_Enable( level ); return( previous_state ); } 8007c50: 28 22 00 00 lw r2,(r1+0) break; case WATCHDOG_ACTIVE: case WATCHDOG_REMOVE_IT: the_watchdog->state = WATCHDOG_INACTIVE; 8007c54: 58 20 00 08 sw (r1+8),r0 next_watchdog = _Watchdog_Next( the_watchdog ); if ( _Watchdog_Next(next_watchdog) ) 8007c58: 28 44 00 00 lw r4,(r2+0) 8007c5c: 44 80 00 05 be r4,r0,8007c70 <_Watchdog_Remove+0x54> next_watchdog->delta_interval += the_watchdog->delta_interval; 8007c60: 28 46 00 10 lw r6,(r2+16) 8007c64: 28 24 00 10 lw r4,(r1+16) 8007c68: b4 c4 20 00 add r4,r6,r4 8007c6c: 58 44 00 10 sw (r2+16),r4 if ( _Watchdog_Sync_count ) 8007c70: 78 04 08 01 mvhi r4,0x801 8007c74: 38 84 9a 8c ori r4,r4,0x9a8c 8007c78: 28 84 00 00 lw r4,(r4+0) 8007c7c: 44 80 00 07 be r4,r0,8007c98 <_Watchdog_Remove+0x7c> _Watchdog_Sync_level = _ISR_Nest_level; 8007c80: 78 04 08 01 mvhi r4,0x801 8007c84: 38 84 9e 2c ori r4,r4,0x9e2c 8007c88: 28 86 00 08 lw r6,(r4+8) 8007c8c: 78 04 08 01 mvhi r4,0x801 8007c90: 38 84 9a 24 ori r4,r4,0x9a24 8007c94: 58 86 00 00 sw (r4+0),r6 { Chain_Node *next; Chain_Node *previous; next = the_node->next; previous = the_node->previous; 8007c98: 28 24 00 04 lw r4,(r1+4) next->previous = previous; 8007c9c: 58 44 00 04 sw (r2+4),r4 previous->next = next; 8007ca0: 58 82 00 00 sw (r4+0),r2 _Chain_Extract_unprotected( &the_watchdog->Node ); break; } the_watchdog->stop_time = _Watchdog_Ticks_since_boot; 8007ca4: 78 02 08 01 mvhi r2,0x801 8007ca8: 38 42 9a 90 ori r2,r2,0x9a90 8007cac: 28 42 00 00 lw r2,(r2+0) 8007cb0: 58 22 00 18 sw (r1+24),r2 _ISR_Enable( level ); 8007cb4: d0 05 00 00 wcsr IE,r5 return( previous_state ); } 8007cb8: b8 60 08 00 mv r1,r3 8007cbc: c3 a0 00 00 ret =============================================================================== 080084ec <_Watchdog_Report_chain>: void _Watchdog_Report_chain( const char *name, Chain_Control *header ) { 80084ec: 37 9c ff ec addi sp,sp,-20 80084f0: 5b 8b 00 14 sw (sp+20),r11 80084f4: 5b 8c 00 10 sw (sp+16),r12 80084f8: 5b 8d 00 0c sw (sp+12),r13 80084fc: 5b 8e 00 08 sw (sp+8),r14 8008500: 5b 9d 00 04 sw (sp+4),ra 8008504: b8 20 70 00 mv r14,r1 8008508: b8 40 60 00 mv r12,r2 ISR_Level level; Chain_Node *node; _ISR_Disable( level ); 800850c: 90 00 68 00 rcsr r13,IE 8008510: 34 01 ff fe mvi r1,-2 8008514: a1 a1 08 00 and r1,r13,r1 8008518: d0 01 00 00 wcsr IE,r1 printk( "Watchdog Chain: %s %p\n", name, header ); 800851c: 78 01 08 01 mvhi r1,0x801 8008520: b9 80 18 00 mv r3,r12 8008524: 38 21 ee 24 ori r1,r1,0xee24 8008528: b9 c0 10 00 mv r2,r14 800852c: fb ff eb a8 calli 80033cc printk( "== end of %s \n", name ); } else { printk( "Chain is empty\n" ); } _ISR_Enable( level ); } 8008530: 29 8b 00 00 lw r11,(r12+0) RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); 8008534: 35 8c 00 04 addi r12,r12,4 ISR_Level level; Chain_Node *node; _ISR_Disable( level ); printk( "Watchdog Chain: %s %p\n", name, header ); if ( !_Chain_Is_empty( header ) ) { 8008538: 45 6c 00 0b be r11,r12,8008564 <_Watchdog_Report_chain+0x78> node != _Chain_Tail(header) ; node = node->next ) { Watchdog_Control *watch = (Watchdog_Control *) node; _Watchdog_Report( NULL, watch ); 800853c: b9 60 10 00 mv r2,r11 8008540: 34 01 00 00 mvi r1,0 8008544: f8 00 00 13 calli 8008590 <_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 ) 8008548: 29 6b 00 00 lw r11,(r11+0) Chain_Node *node; _ISR_Disable( level ); printk( "Watchdog Chain: %s %p\n", name, header ); if ( !_Chain_Is_empty( header ) ) { for ( node = _Chain_First( header ) ; 800854c: 5d 6c ff fc bne r11,r12,800853c <_Watchdog_Report_chain+0x50><== NEVER TAKEN { Watchdog_Control *watch = (Watchdog_Control *) node; _Watchdog_Report( NULL, watch ); } printk( "== end of %s \n", name ); 8008550: 78 01 08 01 mvhi r1,0x801 8008554: 38 21 ee 3c ori r1,r1,0xee3c 8008558: b9 c0 10 00 mv r2,r14 800855c: fb ff eb 9c calli 80033cc 8008560: e0 00 00 04 bi 8008570 <_Watchdog_Report_chain+0x84> } else { printk( "Chain is empty\n" ); 8008564: 78 01 08 01 mvhi r1,0x801 8008568: 38 21 ee 4c ori r1,r1,0xee4c 800856c: fb ff eb 98 calli 80033cc } _ISR_Enable( level ); 8008570: d0 0d 00 00 wcsr IE,r13 } 8008574: 2b 9d 00 04 lw ra,(sp+4) 8008578: 2b 8b 00 14 lw r11,(sp+20) 800857c: 2b 8c 00 10 lw r12,(sp+16) 8008580: 2b 8d 00 0c lw r13,(sp+12) 8008584: 2b 8e 00 08 lw r14,(sp+8) 8008588: 37 9c 00 14 addi sp,sp,20 800858c: c3 a0 00 00 ret =============================================================================== 0800c468 <_Watchdog_Tickle>: */ void _Watchdog_Tickle( Chain_Control *header ) { 800c468: 37 9c ff e4 addi sp,sp,-28 800c46c: 5b 8b 00 1c sw (sp+28),r11 800c470: 5b 8c 00 18 sw (sp+24),r12 800c474: 5b 8d 00 14 sw (sp+20),r13 800c478: 5b 8e 00 10 sw (sp+16),r14 800c47c: 5b 8f 00 0c sw (sp+12),r15 800c480: 5b 90 00 08 sw (sp+8),r16 800c484: 5b 9d 00 04 sw (sp+4),ra 800c488: b8 20 60 00 mv r12,r1 * See the comment in watchdoginsert.c and watchdogadjust.c * about why it's safe not to declare header a pointer to * volatile data - till, 2003/7 */ _ISR_Disable( level ); 800c48c: 90 00 18 00 rcsr r3,IE 800c490: 34 01 ff fe mvi r1,-2 800c494: a0 61 08 00 and r1,r3,r1 800c498: d0 01 00 00 wcsr IE,r1 } while ( !_Chain_Is_empty( header ) && (the_watchdog->delta_interval == 0) ); leave: _ISR_Enable(level); } 800c49c: 29 8b 00 00 lw r11,(r12+0) RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); 800c4a0: 35 8e 00 04 addi r14,r12,4 * See the comment in watchdoginsert.c and watchdogadjust.c * about why it's safe not to declare header a pointer to * volatile data - till, 2003/7 */ _ISR_Disable( level ); 800c4a4: b8 60 10 00 mv r2,r3 if ( _Chain_Is_empty( header ) ) 800c4a8: 45 6e 00 1a be r11,r14,800c510 <_Watchdog_Tickle+0xa8> * to be inserted has already had its delta_interval adjusted to 0, and * so is added to the head of the chain with a delta_interval of 0. * * Steven Johnson - 12/2005 (gcc-3.2.3 -O3 on powerpc) */ if (the_watchdog->delta_interval != 0) { 800c4ac: 29 61 00 10 lw r1,(r11+16) 800c4b0: 44 20 00 04 be r1,r0,800c4c0 <_Watchdog_Tickle+0x58> the_watchdog->delta_interval--; 800c4b4: 34 21 ff ff addi r1,r1,-1 800c4b8: 59 61 00 10 sw (r11+16),r1 if ( the_watchdog->delta_interval != 0 ) 800c4bc: 5c 20 00 15 bne r1,r0,800c510 <_Watchdog_Tickle+0xa8> */ void _Watchdog_Tickle( Chain_Control *header ) { 800c4c0: b8 60 68 00 mv r13,r3 do { watchdog_state = _Watchdog_Remove( the_watchdog ); _ISR_Enable( level ); switch( watchdog_state ) { 800c4c4: 34 10 00 02 mvi r16,2 case WATCHDOG_REMOVE_IT: break; } _ISR_Disable( level ); 800c4c8: 34 0f ff fe mvi r15,-2 800c4cc: e0 00 00 02 bi 800c4d4 <_Watchdog_Tickle+0x6c> 800c4d0: b8 40 68 00 mv r13,r2 if ( the_watchdog->delta_interval != 0 ) goto leave; } do { watchdog_state = _Watchdog_Remove( the_watchdog ); 800c4d4: b9 60 08 00 mv r1,r11 800c4d8: fb ff ff bb calli 800c3c4 <_Watchdog_Remove> _ISR_Enable( level ); 800c4dc: d0 0d 00 00 wcsr IE,r13 switch( watchdog_state ) { 800c4e0: 5c 30 00 05 bne r1,r16,800c4f4 <_Watchdog_Tickle+0x8c> <== NEVER TAKEN case WATCHDOG_ACTIVE: (*the_watchdog->routine)( 800c4e4: 29 63 00 1c lw r3,(r11+28) 800c4e8: 29 61 00 20 lw r1,(r11+32) 800c4ec: 29 62 00 24 lw r2,(r11+36) 800c4f0: d8 60 00 00 call r3 case WATCHDOG_REMOVE_IT: break; } _ISR_Disable( level ); 800c4f4: 90 00 10 00 rcsr r2,IE 800c4f8: a0 4f 08 00 and r1,r2,r15 800c4fc: d0 01 00 00 wcsr IE,r1 } while ( !_Chain_Is_empty( header ) && (the_watchdog->delta_interval == 0) ); leave: _ISR_Enable(level); } 800c500: 29 8b 00 00 lw r11,(r12+0) _ISR_Disable( level ); the_watchdog = _Watchdog_First( header ); } while ( !_Chain_Is_empty( header ) && (the_watchdog->delta_interval == 0) ); 800c504: 45 6e 00 03 be r11,r14,800c510 <_Watchdog_Tickle+0xa8> } _ISR_Disable( level ); the_watchdog = _Watchdog_First( header ); } while ( !_Chain_Is_empty( header ) && 800c508: 29 61 00 10 lw r1,(r11+16) 800c50c: 44 20 ff f1 be r1,r0,800c4d0 <_Watchdog_Tickle+0x68> (the_watchdog->delta_interval == 0) ); leave: _ISR_Enable(level); 800c510: d0 02 00 00 wcsr IE,r2 } 800c514: 2b 9d 00 04 lw ra,(sp+4) 800c518: 2b 8b 00 1c lw r11,(sp+28) 800c51c: 2b 8c 00 18 lw r12,(sp+24) 800c520: 2b 8d 00 14 lw r13,(sp+20) 800c524: 2b 8e 00 10 lw r14,(sp+16) 800c528: 2b 8f 00 0c lw r15,(sp+12) 800c52c: 2b 90 00 08 lw r16,(sp+8) 800c530: 37 9c 00 1c addi sp,sp,28 800c534: c3 a0 00 00 ret =============================================================================== 08006060 <_rename_r>: int _rename_r( struct _reent *ptr __attribute__((unused)), const char *old, const char *new ) { 8006060: 37 9c ff a0 addi sp,sp,-96 8006064: 5b 8b 00 1c sw (sp+28),r11 8006068: 5b 8c 00 18 sw (sp+24),r12 800606c: 5b 8d 00 14 sw (sp+20),r13 8006070: 5b 8e 00 10 sw (sp+16),r14 8006074: 5b 8f 00 0c sw (sp+12),r15 8006078: 5b 90 00 08 sw (sp+8),r16 800607c: 5b 9d 00 04 sw (sp+4),ra /* * Get the parent node of the old path to be renamed. Find the parent path. */ old_parent_pathlen = rtems_filesystem_dirname ( old ); 8006080: b8 40 08 00 mv r1,r2 int _rename_r( struct _reent *ptr __attribute__((unused)), const char *old, const char *new ) { 8006084: b8 40 58 00 mv r11,r2 8006088: b8 60 80 00 mv r16,r3 /* * Get the parent node of the old path to be renamed. Find the parent path. */ old_parent_pathlen = rtems_filesystem_dirname ( old ); 800608c: fb ff f9 8b calli 80046b8 8006090: b8 20 70 00 mv r14,r1 8006094: 37 84 00 34 addi r4,sp,52 if ( old_parent_pathlen == 0 ) 8006098: 5c 20 00 07 bne r1,r0,80060b4 <_rename_r+0x54> rtems_filesystem_get_start_loc( old, &i, &old_parent_loc ); 800609c: b9 60 08 00 mv r1,r11 80060a0: 37 82 00 60 addi r2,sp,96 80060a4: b8 80 18 00 mv r3,r4 80060a8: f8 00 00 fa calli 8006490 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; 80060ac: 34 0d 00 00 mvi r13,0 80060b0: e0 00 00 09 bi 80060d4 <_rename_r+0x74> 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, 80060b4: b9 60 08 00 mv r1,r11 80060b8: b9 c0 10 00 mv r2,r14 80060bc: 34 03 00 02 mvi r3,2 80060c0: 34 05 00 00 mvi r5,0 80060c4: fb ff f9 62 calli 800464c RTEMS_LIBIO_PERMS_WRITE, &old_parent_loc, false ); if ( result != 0 ) return -1; 80060c8: 34 0c ff ff mvi r12,-1 else { result = rtems_filesystem_evaluate_path( old, old_parent_pathlen, RTEMS_LIBIO_PERMS_WRITE, &old_parent_loc, false ); if ( result != 0 ) 80060cc: 5c 20 00 59 bne r1,r0,8006230 <_rename_r+0x1d0> <== NEVER TAKEN return -1; free_old_parentloc = true; 80060d0: 34 0d 00 01 mvi r13,1 /* * Start from the parent to find the node that should be under it. */ old_loc = old_parent_loc; 80060d4: 2b 81 00 34 lw r1,(sp+52) name = old + old_parent_pathlen; 80060d8: b5 6e 58 00 add r11,r11,r14 80060dc: 5b 8b 00 5c sw (sp+92),r11 /* * Start from the parent to find the node that should be under it. */ old_loc = old_parent_loc; 80060e0: 5b 81 00 48 sw (sp+72),r1 80060e4: 2b 81 00 38 lw r1,(sp+56) name = old + old_parent_pathlen; name += rtems_filesystem_prefix_separators( name, strlen( name ) ); result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), 80060e8: 37 8c 00 48 addi r12,sp,72 /* * Start from the parent to find the node that should be under it. */ old_loc = old_parent_loc; 80060ec: 5b 81 00 4c sw (sp+76),r1 80060f0: 2b 81 00 3c lw r1,(sp+60) 80060f4: 5b 81 00 50 sw (sp+80),r1 80060f8: 2b 81 00 40 lw r1,(sp+64) 80060fc: 5b 81 00 54 sw (sp+84),r1 8006100: 2b 81 00 44 lw r1,(sp+68) 8006104: 5b 81 00 58 sw (sp+88),r1 name = old + old_parent_pathlen; name += rtems_filesystem_prefix_separators( name, strlen( name ) ); 8006108: b9 60 08 00 mv r1,r11 800610c: f8 00 38 17 calli 8014168 8006110: b8 20 10 00 mv r2,r1 8006114: b9 60 08 00 mv r1,r11 8006118: fb ff f9 7c calli 8004708 800611c: b5 61 58 00 add r11,r11,r1 result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), 8006120: b9 60 08 00 mv r1,r11 * 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 ) ); 8006124: 5b 8b 00 5c sw (sp+92),r11 result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), 8006128: f8 00 38 10 calli 8014168 800612c: b8 20 10 00 mv r2,r1 8006130: 34 03 00 00 mvi r3,0 8006134: b9 60 08 00 mv r1,r11 8006138: b9 80 20 00 mv r4,r12 800613c: 34 05 00 00 mvi r5,0 8006140: fb ff f9 21 calli 80045c4 8006144: b8 20 78 00 mv r15,r1 0, &old_loc, false ); if ( result != 0 ) { 8006148: 44 20 00 05 be r1,r0,800615c <_rename_r+0xfc> if ( free_old_parentloc ) rtems_filesystem_freenode( &old_parent_loc ); return -1; 800614c: 34 0c ff ff mvi r12,-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 ); 8006150: 37 81 00 34 addi r1,sp,52 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 ) 8006154: 45 a0 00 37 be r13,r0,8006230 <_rename_r+0x1d0> <== NEVER TAKEN 8006158: e0 00 00 35 bi 800622c <_rename_r+0x1cc> /* * Get the parent of the new node we are renaming to. */ rtems_filesystem_get_start_loc( new, &i, &new_parent_loc ); 800615c: 37 8b 00 20 addi r11,sp,32 8006160: ba 00 08 00 mv r1,r16 8006164: 37 82 00 60 addi r2,sp,96 8006168: b9 60 18 00 mv r3,r11 800616c: f8 00 00 c9 calli 8006490 result = (*new_parent_loc.ops->evalformake_h)( &new[i], &new_parent_loc, &name ); 8006170: 2b 81 00 2c lw r1,(sp+44) 8006174: b9 60 10 00 mv r2,r11 8006178: 37 83 00 5c addi r3,sp,92 800617c: 28 24 00 04 lw r4,(r1+4) 8006180: 2b 81 00 60 lw r1,(sp+96) 8006184: b6 01 08 00 add r1,r16,r1 8006188: d8 80 00 00 call r4 800618c: b8 20 70 00 mv r14,r1 if ( result != 0 ) { 8006190: 44 2f 00 09 be r1,r15,80061b4 <_rename_r+0x154> rtems_filesystem_freenode( &new_parent_loc ); 8006194: b9 60 08 00 mv r1,r11 8006198: fb ff fa 00 calli 8004998 if ( free_old_parentloc ) 800619c: 45 a0 00 03 be r13,r0,80061a8 <_rename_r+0x148> <== NEVER TAKEN rtems_filesystem_freenode( &old_parent_loc ); 80061a0: 37 81 00 34 addi r1,sp,52 80061a4: fb ff f9 fd calli 8004998 rtems_filesystem_freenode( &old_loc ); 80061a8: 37 81 00 48 addi r1,sp,72 80061ac: fb ff f9 fb calli 8004998 80061b0: e0 00 00 0e bi 80061e8 <_rename_r+0x188> /* * 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 ) { 80061b4: 2b 81 00 30 lw r1,(sp+48) 80061b8: 2b 82 00 44 lw r2,(sp+68) 80061bc: 44 41 00 0d be r2,r1,80061f0 <_rename_r+0x190> rtems_filesystem_freenode( &new_parent_loc ); 80061c0: b9 60 08 00 mv r1,r11 80061c4: fb ff f9 f5 calli 8004998 if ( free_old_parentloc ) 80061c8: 45 ae 00 03 be r13,r14,80061d4 <_rename_r+0x174> rtems_filesystem_freenode( &old_parent_loc ); 80061cc: 37 81 00 34 addi r1,sp,52 80061d0: fb ff f9 f2 calli 8004998 rtems_filesystem_freenode( &old_loc ); 80061d4: 37 81 00 48 addi r1,sp,72 80061d8: fb ff f9 f0 calli 8004998 rtems_set_errno_and_return_minus_one( EXDEV ); 80061dc: f8 00 2a 49 calli 8010b00 <__errno> 80061e0: 34 02 00 12 mvi r2,18 80061e4: 58 22 00 00 sw (r1+0),r2 80061e8: 34 0c ff ff mvi r12,-1 80061ec: e0 00 00 11 bi 8006230 <_rename_r+0x1d0> } result = (*new_parent_loc.ops->rename_h)( &old_parent_loc, &old_loc, &new_parent_loc, name ); 80061f0: 2b 81 00 2c lw r1,(sp+44) 80061f4: 2b 84 00 5c lw r4,(sp+92) 80061f8: 37 8f 00 34 addi r15,sp,52 80061fc: 28 25 00 40 lw r5,(r1+64) 8006200: b9 80 10 00 mv r2,r12 8006204: b9 e0 08 00 mv r1,r15 8006208: b9 60 18 00 mv r3,r11 800620c: d8 a0 00 00 call r5 8006210: b8 20 60 00 mv r12,r1 rtems_filesystem_freenode( &new_parent_loc ); 8006214: b9 60 08 00 mv r1,r11 8006218: fb ff f9 e0 calli 8004998 if ( free_old_parentloc ) 800621c: 45 ae 00 03 be r13,r14,8006228 <_rename_r+0x1c8> rtems_filesystem_freenode( &old_parent_loc ); 8006220: b9 e0 08 00 mv r1,r15 8006224: fb ff f9 dd calli 8004998 rtems_filesystem_freenode( &old_loc ); 8006228: 37 81 00 48 addi r1,sp,72 800622c: fb ff f9 db calli 8004998 return result; } 8006230: b9 80 08 00 mv r1,r12 8006234: 2b 9d 00 04 lw ra,(sp+4) 8006238: 2b 8b 00 1c lw r11,(sp+28) 800623c: 2b 8c 00 18 lw r12,(sp+24) 8006240: 2b 8d 00 14 lw r13,(sp+20) 8006244: 2b 8e 00 10 lw r14,(sp+16) 8006248: 2b 8f 00 0c lw r15,(sp+12) 800624c: 2b 90 00 08 lw r16,(sp+8) 8006250: 37 9c 00 60 addi sp,sp,96 8006254: c3 a0 00 00 ret =============================================================================== 08003978 : * operation(s) cannot be canceled */ int aio_cancel(int fildes, struct aiocb *aiocbp) { 8003978: 37 9c ff e8 addi sp,sp,-24 800397c: 5b 8b 00 18 sw (sp+24),r11 8003980: 5b 8c 00 14 sw (sp+20),r12 8003984: 5b 8d 00 10 sw (sp+16),r13 8003988: 5b 8e 00 0c sw (sp+12),r14 800398c: 5b 8f 00 08 sw (sp+8),r15 8003990: 5b 9d 00 04 sw (sp+4),ra rtems_aio_request_chain *r_chain; int result; pthread_mutex_lock (&aio_request_queue.mutex); 8003994: 78 0b 08 01 mvhi r11,0x801 8003998: 39 6b 78 38 ori r11,r11,0x7838 * operation(s) cannot be canceled */ int aio_cancel(int fildes, struct aiocb *aiocbp) { 800399c: b8 20 70 00 mv r14,r1 rtems_aio_request_chain *r_chain; int result; pthread_mutex_lock (&aio_request_queue.mutex); 80039a0: b9 60 08 00 mv r1,r11 * operation(s) cannot be canceled */ int aio_cancel(int fildes, struct aiocb *aiocbp) { 80039a4: b8 40 60 00 mv r12,r2 rtems_aio_request_chain *r_chain; int result; pthread_mutex_lock (&aio_request_queue.mutex); 80039a8: f8 00 04 c9 calli 8004ccc if (fcntl (fildes, F_GETFD) < 0) { 80039ac: b9 c0 08 00 mv r1,r14 80039b0: 34 02 00 01 mvi r2,1 80039b4: f8 00 1d df calli 800b130 80039b8: 4c 20 00 06 bge r1,r0,80039d0 pthread_mutex_unlock(&aio_request_queue.mutex); 80039bc: b9 60 08 00 mv r1,r11 80039c0: f8 00 04 f6 calli 8004d98 rtems_set_errno_and_return_minus_one (EBADF); 80039c4: f8 00 2e e4 calli 800f554 <__errno> 80039c8: 34 02 00 09 mvi r2,9 80039cc: e0 00 00 32 bi 8003a94 } /* if aiocbp is NULL remove all request for given file descriptor */ if (aiocbp == NULL) { 80039d0: 5d 80 00 2b bne r12,r0,8003a7c AIO_printf ("Cancel all requests\n"); r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0); 80039d4: 78 01 08 01 mvhi r1,0x801 80039d8: 38 21 78 80 ori r1,r1,0x7880 80039dc: b9 c0 10 00 mv r2,r14 80039e0: 34 03 00 00 mvi r3,0 80039e4: f8 00 00 c1 calli 8003ce8 80039e8: b8 20 68 00 mv r13,r1 if (r_chain == NULL) { 80039ec: 5c 2c 00 17 bne r1,r12,8003a48 AIO_printf ("Request chain not on [WQ]\n"); if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) { 80039f0: 29 62 00 54 lw r2,(r11+84) 80039f4: 78 01 08 01 mvhi r1,0x801 80039f8: 38 21 78 90 ori r1,r1,0x7890 80039fc: 44 41 00 3f be r2,r1,8003af8 <== NEVER TAKEN r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0); 8003a00: 78 01 08 01 mvhi r1,0x801 8003a04: 38 21 78 8c ori r1,r1,0x788c 8003a08: b9 c0 10 00 mv r2,r14 8003a0c: 34 03 00 00 mvi r3,0 8003a10: f8 00 00 b6 calli 8003ce8 8003a14: b8 20 60 00 mv r12,r1 if (r_chain == NULL) { 8003a18: 44 2d 00 38 be r1,r13,8003af8 */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); 8003a1c: f8 00 0a 86 calli 8006434 <_Chain_Extract> } AIO_printf ("Request chain on [IQ]\n"); rtems_chain_extract (&r_chain->next_fd); rtems_aio_remove_fd (r_chain); 8003a20: b9 80 08 00 mv r1,r12 8003a24: f8 00 01 b2 calli 80040ec pthread_mutex_destroy (&r_chain->mutex); 8003a28: 35 8d 00 1c addi r13,r12,28 8003a2c: b9 a0 08 00 mv r1,r13 8003a30: f8 00 03 ed calli 80049e4 pthread_cond_destroy (&r_chain->mutex); 8003a34: b9 a0 08 00 mv r1,r13 8003a38: f8 00 02 ec calli 80045e8 free (r_chain); 8003a3c: b9 80 08 00 mv r1,r12 8003a40: fb ff f9 c8 calli 8002160 8003a44: e0 00 00 0a bi 8003a6c return AIO_ALLDONE; } AIO_printf ("Request chain on [WQ]\n"); pthread_mutex_lock (&r_chain->mutex); 8003a48: 34 2c 00 1c addi r12,r1,28 8003a4c: b9 80 08 00 mv r1,r12 8003a50: f8 00 04 9f calli 8004ccc 8003a54: b9 a0 08 00 mv r1,r13 8003a58: f8 00 0a 77 calli 8006434 <_Chain_Extract> rtems_chain_extract (&r_chain->next_fd); rtems_aio_remove_fd (r_chain); 8003a5c: b9 a0 08 00 mv r1,r13 8003a60: f8 00 01 a3 calli 80040ec pthread_mutex_unlock (&r_chain->mutex); 8003a64: b9 80 08 00 mv r1,r12 8003a68: f8 00 04 cc calli 8004d98 pthread_mutex_unlock (&aio_request_queue.mutex); 8003a6c: b9 60 08 00 mv r1,r11 8003a70: f8 00 04 ca calli 8004d98 return AIO_CANCELED; 8003a74: 34 0c 00 00 mvi r12,0 8003a78: e0 00 00 2f bi 8003b34 } else { AIO_printf ("Cancel request\n"); if (aiocbp->aio_fildes != fildes) { 8003a7c: 29 8f 00 00 lw r15,(r12+0) 8003a80: 45 ee 00 08 be r15,r14,8003aa0 pthread_mutex_unlock (&aio_request_queue.mutex); 8003a84: b9 60 08 00 mv r1,r11 8003a88: f8 00 04 c4 calli 8004d98 rtems_set_errno_and_return_minus_one (EINVAL); 8003a8c: f8 00 2e b2 calli 800f554 <__errno> 8003a90: 34 02 00 16 mvi r2,22 8003a94: 58 22 00 00 sw (r1+0),r2 8003a98: 34 0c ff ff mvi r12,-1 8003a9c: e0 00 00 26 bi 8003b34 } r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0); 8003aa0: 78 01 08 01 mvhi r1,0x801 8003aa4: 38 21 78 80 ori r1,r1,0x7880 8003aa8: b9 e0 10 00 mv r2,r15 8003aac: 34 03 00 00 mvi r3,0 8003ab0: f8 00 00 8e calli 8003ce8 8003ab4: b8 20 68 00 mv r13,r1 if (r_chain == NULL) { 8003ab8: 5c 20 00 14 bne r1,r0,8003b08 if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) { 8003abc: 29 62 00 54 lw r2,(r11+84) 8003ac0: 78 01 08 01 mvhi r1,0x801 8003ac4: 38 21 78 90 ori r1,r1,0x7890 8003ac8: 44 41 00 0c be r2,r1,8003af8 <== NEVER TAKEN r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0); 8003acc: 78 01 08 01 mvhi r1,0x801 8003ad0: 38 21 78 8c ori r1,r1,0x788c 8003ad4: b9 e0 10 00 mv r2,r15 8003ad8: 34 03 00 00 mvi r3,0 8003adc: f8 00 00 83 calli 8003ce8 if (r_chain == NULL) { 8003ae0: 44 20 ff e9 be r1,r0,8003a84 rtems_set_errno_and_return_minus_one (EINVAL); } AIO_printf ("Request on [IQ]\n"); result = rtems_aio_remove_req (&r_chain->perfd, aiocbp); 8003ae4: b9 80 10 00 mv r2,r12 8003ae8: 34 21 00 08 addi r1,r1,8 8003aec: f8 00 01 9e calli 8004164 8003af0: b8 20 60 00 mv r12,r1 8003af4: e0 00 00 0e bi 8003b2c pthread_mutex_unlock (&aio_request_queue.mutex); return result; } else { pthread_mutex_unlock (&aio_request_queue.mutex); 8003af8: b9 60 08 00 mv r1,r11 8003afc: f8 00 04 a7 calli 8004d98 return AIO_ALLDONE; 8003b00: 34 0c 00 02 mvi r12,2 8003b04: e0 00 00 0c bi 8003b34 } } AIO_printf ("Request on [WQ]\n"); pthread_mutex_lock (&r_chain->mutex); 8003b08: 34 2e 00 1c addi r14,r1,28 8003b0c: b9 c0 08 00 mv r1,r14 8003b10: f8 00 04 6f calli 8004ccc result = rtems_aio_remove_req (&r_chain->perfd, aiocbp); 8003b14: b9 80 10 00 mv r2,r12 8003b18: 35 a1 00 08 addi r1,r13,8 8003b1c: f8 00 01 92 calli 8004164 8003b20: b8 20 60 00 mv r12,r1 pthread_mutex_unlock (&r_chain->mutex); 8003b24: b9 c0 08 00 mv r1,r14 8003b28: f8 00 04 9c calli 8004d98 pthread_mutex_unlock (&aio_request_queue.mutex); 8003b2c: b9 60 08 00 mv r1,r11 8003b30: f8 00 04 9a calli 8004d98 return result; } return AIO_ALLDONE; } 8003b34: b9 80 08 00 mv r1,r12 8003b38: 2b 9d 00 04 lw ra,(sp+4) 8003b3c: 2b 8b 00 18 lw r11,(sp+24) 8003b40: 2b 8c 00 14 lw r12,(sp+20) 8003b44: 2b 8d 00 10 lw r13,(sp+16) 8003b48: 2b 8e 00 0c lw r14,(sp+12) 8003b4c: 2b 8f 00 08 lw r15,(sp+8) 8003b50: 37 9c 00 18 addi sp,sp,24 8003b54: c3 a0 00 00 ret =============================================================================== 08003b60 : int aio_fsync( int op, struct aiocb *aiocbp ) { 8003b60: 37 9c ff f4 addi sp,sp,-12 8003b64: 5b 8b 00 0c sw (sp+12),r11 8003b68: 5b 8c 00 08 sw (sp+8),r12 8003b6c: 5b 9d 00 04 sw (sp+4),ra 8003b70: b8 40 58 00 mv r11,r2 rtems_aio_request *req; int mode; if (op != O_SYNC) 8003b74: 34 02 20 00 mvi r2,8192 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); 8003b78: 34 0c 00 16 mvi r12,22 ) { rtems_aio_request *req; int mode; if (op != O_SYNC) 8003b7c: 5c 22 00 09 bne r1,r2,8003ba0 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); mode = fcntl (aiocbp->aio_fildes, F_GETFL); 8003b80: 29 61 00 00 lw r1,(r11+0) 8003b84: 34 02 00 03 mvi r2,3 8003b88: f8 00 1d 6a calli 800b130 if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR))) 8003b8c: 20 21 00 03 andi r1,r1,0x3 8003b90: 34 21 ff ff addi r1,r1,-1 8003b94: 34 02 00 01 mvi r2,1 8003b98: 50 41 00 09 bgeu r2,r1,8003bbc rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); 8003b9c: 34 0c 00 09 mvi r12,9 8003ba0: 34 01 ff ff mvi r1,-1 8003ba4: 59 6c 00 2c sw (r11+44),r12 8003ba8: 59 61 00 30 sw (r11+48),r1 8003bac: f8 00 2e 6a calli 800f554 <__errno> 8003bb0: 58 2c 00 00 sw (r1+0),r12 8003bb4: 34 01 ff ff mvi r1,-1 8003bb8: e0 00 00 09 bi 8003bdc req = malloc (sizeof (rtems_aio_request)); 8003bbc: 34 01 00 18 mvi r1,24 8003bc0: fb ff fb 20 calli 8002840 if (req == NULL) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); 8003bc4: 34 0c 00 0b mvi r12,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) 8003bc8: 44 20 ff f6 be r1,r0,8003ba0 <== NEVER TAKEN rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); req->aiocbp = aiocbp; 8003bcc: 58 2b 00 14 sw (r1+20),r11 req->aiocbp->aio_lio_opcode = LIO_SYNC; 8003bd0: 34 02 00 03 mvi r2,3 8003bd4: 59 62 00 28 sw (r11+40),r2 return rtems_aio_enqueue (req); 8003bd8: f8 00 01 7f calli 80041d4 } 8003bdc: 2b 9d 00 04 lw ra,(sp+4) 8003be0: 2b 8b 00 0c lw r11,(sp+12) 8003be4: 2b 8c 00 08 lw r12,(sp+8) 8003be8: 37 9c 00 0c addi sp,sp,12 8003bec: c3 a0 00 00 ret =============================================================================== 0800442c : * 0 - otherwise */ int aio_read (struct aiocb *aiocbp) { 800442c: 37 9c ff f4 addi sp,sp,-12 8004430: 5b 8b 00 0c sw (sp+12),r11 8004434: 5b 8c 00 08 sw (sp+8),r12 8004438: 5b 9d 00 04 sw (sp+4),ra 800443c: b8 20 58 00 mv r11,r1 rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); 8004440: 28 21 00 00 lw r1,(r1+0) 8004444: 34 02 00 03 mvi r2,3 if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR))) rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); 8004448: 34 0c 00 09 mvi r12,9 aio_read (struct aiocb *aiocbp) { rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); 800444c: f8 00 1b 39 calli 800b130 if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR))) 8004450: 20 21 00 03 andi r1,r1,0x3 8004454: 7c 22 00 02 cmpnei r2,r1,2 8004458: 7c 21 00 00 cmpnei r1,r1,0 800445c: a0 41 08 00 and r1,r2,r1 8004460: 5c 20 00 04 bne r1,r0,8004470 rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX) 8004464: 29 6c 00 10 lw r12,(r11+16) 8004468: 45 81 00 09 be r12,r1,800448c rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); 800446c: 34 0c 00 16 mvi r12,22 8004470: 34 01 ff ff mvi r1,-1 8004474: 59 6c 00 2c sw (r11+44),r12 8004478: 59 61 00 30 sw (r11+48),r1 800447c: f8 00 2c 36 calli 800f554 <__errno> 8004480: 58 2c 00 00 sw (r1+0),r12 8004484: 34 01 ff ff mvi r1,-1 8004488: e0 00 00 0d bi 80044bc if (aiocbp->aio_offset < 0) 800448c: 29 61 00 04 lw r1,(r11+4) 8004490: 4c 2c 00 02 bge r1,r12,8004498 8004494: e3 ff ff f6 bi 800446c rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); req = malloc (sizeof (rtems_aio_request)); 8004498: 34 01 00 18 mvi r1,24 800449c: fb ff f8 e9 calli 8002840 if (req == NULL) 80044a0: 5c 2c 00 03 bne r1,r12,80044ac <== ALWAYS TAKEN rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); 80044a4: 34 0c 00 0b mvi r12,11 <== NOT EXECUTED 80044a8: e3 ff ff f2 bi 8004470 <== NOT EXECUTED req->aiocbp = aiocbp; 80044ac: 58 2b 00 14 sw (r1+20),r11 req->aiocbp->aio_lio_opcode = LIO_READ; 80044b0: 34 02 00 01 mvi r2,1 80044b4: 59 62 00 28 sw (r11+40),r2 return rtems_aio_enqueue (req); 80044b8: fb ff ff 47 calli 80041d4 } 80044bc: 2b 9d 00 04 lw ra,(sp+4) 80044c0: 2b 8b 00 0c lw r11,(sp+12) 80044c4: 2b 8c 00 08 lw r12,(sp+8) 80044c8: 37 9c 00 0c addi sp,sp,12 80044cc: c3 a0 00 00 ret =============================================================================== 080044d8 : * 0 - otherwise */ int aio_write (struct aiocb *aiocbp) { 80044d8: 37 9c ff f4 addi sp,sp,-12 80044dc: 5b 8b 00 0c sw (sp+12),r11 80044e0: 5b 8c 00 08 sw (sp+8),r12 80044e4: 5b 9d 00 04 sw (sp+4),ra 80044e8: b8 20 58 00 mv r11,r1 rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); 80044ec: 28 21 00 00 lw r1,(r1+0) 80044f0: 34 02 00 03 mvi r2,3 80044f4: f8 00 1b 0f calli 800b130 if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR))) 80044f8: 20 21 00 03 andi r1,r1,0x3 80044fc: 34 21 ff ff addi r1,r1,-1 8004500: 34 02 00 01 mvi r2,1 8004504: 50 41 00 03 bgeu r2,r1,8004510 rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); 8004508: 34 0c 00 09 mvi r12,9 800450c: e0 00 00 04 bi 800451c if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX) 8004510: 29 61 00 10 lw r1,(r11+16) 8004514: 44 20 00 09 be r1,r0,8004538 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); 8004518: 34 0c 00 16 mvi r12,22 800451c: 34 01 ff ff mvi r1,-1 8004520: 59 6c 00 2c sw (r11+44),r12 8004524: 59 61 00 30 sw (r11+48),r1 8004528: f8 00 2c 0b calli 800f554 <__errno> 800452c: 58 2c 00 00 sw (r1+0),r12 8004530: 34 01 ff ff mvi r1,-1 8004534: e0 00 00 0c bi 8004564 if (aiocbp->aio_offset < 0) 8004538: 29 62 00 04 lw r2,(r11+4) 800453c: 4c 41 00 02 bge r2,r1,8004544 8004540: e3 ff ff f6 bi 8004518 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); req = malloc (sizeof (rtems_aio_request)); 8004544: 34 01 00 18 mvi r1,24 8004548: fb ff f8 be calli 8002840 if (req == NULL) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); 800454c: 34 0c 00 0b mvi r12,11 if (aiocbp->aio_offset < 0) rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); req = malloc (sizeof (rtems_aio_request)); if (req == NULL) 8004550: 44 20 ff f3 be r1,r0,800451c <== NEVER TAKEN rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); req->aiocbp = aiocbp; 8004554: 58 2b 00 14 sw (r1+20),r11 req->aiocbp->aio_lio_opcode = LIO_WRITE; 8004558: 34 02 00 02 mvi r2,2 800455c: 59 62 00 28 sw (r11+40),r2 return rtems_aio_enqueue (req); 8004560: fb ff ff 1d calli 80041d4 } 8004564: 2b 9d 00 04 lw ra,(sp+4) 8004568: 2b 8b 00 0c lw r11,(sp+12) 800456c: 2b 8c 00 08 lw r12,(sp+8) 8004570: 37 9c 00 0c addi sp,sp,12 8004574: c3 a0 00 00 ret =============================================================================== 080013f4 : #include int chroot( const char *pathname ) { 80013f4: 37 9c ff dc addi sp,sp,-36 80013f8: 5b 8b 00 10 sw (sp+16),r11 80013fc: 5b 8c 00 0c sw (sp+12),r12 8001400: 5b 8d 00 08 sw (sp+8),r13 8001404: 5b 9d 00 04 sw (sp+4),ra 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) { 8001408: 78 0b 08 01 mvhi r11,0x801 800140c: 39 6b 41 08 ori r11,r11,0x4108 8001410: 29 6c 00 00 lw r12,(r11+0) 8001414: 78 02 08 01 mvhi r2,0x801 8001418: 38 42 47 90 ori r2,r2,0x4790 #include int chroot( const char *pathname ) { 800141c: b8 20 68 00 mv r13,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) { 8001420: 5d 82 00 08 bne r12,r2,8001440 rtems_libio_set_private_env(); /* try to set a new private env*/ 8001424: f8 00 05 9c calli 8002a94 if (rtems_current_user_env == &rtems_global_user_env) /* not ok */ 8001428: 29 61 00 00 lw r1,(r11+0) 800142c: 5c 2c 00 05 bne r1,r12,8001440 rtems_set_errno_and_return_minus_one( ENOTSUP ); 8001430: f8 00 2d c3 calli 800cb3c <__errno> 8001434: 34 02 00 86 mvi r2,134 8001438: 58 22 00 00 sw (r1+0),r2 800143c: e0 00 00 0a bi 8001464 } result = chdir(pathname); 8001440: b9 a0 08 00 mv r1,r13 8001444: f8 00 1c 73 calli 8008610 8001448: b8 20 58 00 mv r11,r1 if (result) { 800144c: 44 20 00 08 be r1,r0,800146c rtems_set_errno_and_return_minus_one( errno ); 8001450: f8 00 2d bb calli 800cb3c <__errno> 8001454: b8 20 58 00 mv r11,r1 8001458: f8 00 2d b9 calli 800cb3c <__errno> 800145c: 28 21 00 00 lw r1,(r1+0) 8001460: 59 61 00 00 sw (r11+0),r1 8001464: 34 01 ff ff mvi r1,-1 8001468: e0 00 00 1a bi 80014d0 } /* clone the new root location */ if (rtems_filesystem_evaluate_path(".", 1, 0, &loc, 0)) { 800146c: 78 01 08 01 mvhi r1,0x801 8001470: 38 21 32 74 ori r1,r1,0x3274 8001474: 34 02 00 01 mvi r2,1 8001478: 34 03 00 00 mvi r3,0 800147c: 37 84 00 14 addi r4,sp,20 8001480: 34 05 00 00 mvi r5,0 8001484: f8 00 00 68 calli 8001624 8001488: 5c 2b ff f2 bne r1,r11,8001450 <== 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); 800148c: 78 0b 08 01 mvhi r11,0x801 8001490: 39 6b 41 08 ori r11,r11,0x4108 8001494: 29 61 00 00 lw r1,(r11+0) 8001498: 34 21 00 18 addi r1,r1,24 800149c: f8 00 00 aa calli 8001744 rtems_filesystem_root = loc; 80014a0: 29 61 00 00 lw r1,(r11+0) 80014a4: 2b 82 00 14 lw r2,(sp+20) 80014a8: 58 22 00 18 sw (r1+24),r2 80014ac: 2b 82 00 18 lw r2,(sp+24) 80014b0: 58 22 00 1c sw (r1+28),r2 80014b4: 2b 82 00 1c lw r2,(sp+28) 80014b8: 58 22 00 20 sw (r1+32),r2 80014bc: 2b 82 00 20 lw r2,(sp+32) 80014c0: 58 22 00 24 sw (r1+36),r2 80014c4: 2b 82 00 24 lw r2,(sp+36) 80014c8: 58 22 00 28 sw (r1+40),r2 return 0; 80014cc: 34 01 00 00 mvi r1,0 } 80014d0: 2b 9d 00 04 lw ra,(sp+4) 80014d4: 2b 8b 00 10 lw r11,(sp+16) 80014d8: 2b 8c 00 0c lw r12,(sp+12) 80014dc: 2b 8d 00 08 lw r13,(sp+8) 80014e0: 37 9c 00 24 addi sp,sp,36 80014e4: c3 a0 00 00 ret =============================================================================== 08002db0 : int clock_gettime( clockid_t clock_id, struct timespec *tp ) { 8002db0: 37 9c ff fc addi sp,sp,-4 8002db4: 5b 9d 00 04 sw (sp+4),ra 8002db8: b8 20 18 00 mv r3,r1 8002dbc: b8 40 08 00 mv r1,r2 if ( !tp ) 8002dc0: 44 40 00 11 be r2,r0,8002e04 rtems_set_errno_and_return_minus_one( EINVAL ); if ( clock_id == CLOCK_REALTIME ) { 8002dc4: 34 02 00 01 mvi r2,1 8002dc8: 5c 62 00 03 bne r3,r2,8002dd4 _TOD_Get(tp); 8002dcc: f8 00 06 fb calli 80049b8 <_TOD_Get> 8002dd0: e0 00 00 06 bi 8002de8 return 0; } #ifdef CLOCK_MONOTONIC if ( clock_id == CLOCK_MONOTONIC ) { 8002dd4: 34 02 00 04 mvi r2,4 8002dd8: 44 62 00 03 be r3,r2,8002de4 <== NEVER TAKEN return 0; } #endif #ifdef _POSIX_CPUTIME if ( clock_id == CLOCK_PROCESS_CPUTIME ) { 8002ddc: 34 02 00 02 mvi r2,2 8002de0: 5c 62 00 04 bne r3,r2,8002df0 _TOD_Get_uptime_as_timespec( tp ); 8002de4: f8 00 07 17 calli 8004a40 <_TOD_Get_uptime_as_timespec> return 0; 8002de8: 34 01 00 00 mvi r1,0 8002dec: e0 00 00 0a bi 8002e14 } #endif #ifdef _POSIX_THREAD_CPUTIME if ( clock_id == CLOCK_THREAD_CPUTIME ) 8002df0: 34 01 00 03 mvi r1,3 8002df4: 5c 61 00 04 bne r3,r1,8002e04 rtems_set_errno_and_return_minus_one( ENOSYS ); 8002df8: f8 00 2a b7 calli 800d8d4 <__errno> 8002dfc: 34 02 00 58 mvi r2,88 8002e00: e0 00 00 03 bi 8002e0c #endif rtems_set_errno_and_return_minus_one( EINVAL ); 8002e04: f8 00 2a b4 calli 800d8d4 <__errno> 8002e08: 34 02 00 16 mvi r2,22 8002e0c: 58 22 00 00 sw (r1+0),r2 8002e10: 34 01 ff ff mvi r1,-1 return 0; } 8002e14: 2b 9d 00 04 lw ra,(sp+4) 8002e18: 37 9c 00 04 addi sp,sp,4 8002e1c: c3 a0 00 00 ret =============================================================================== 08002e20 : int clock_settime( clockid_t clock_id, const struct timespec *tp ) { 8002e20: 37 9c ff fc addi sp,sp,-4 8002e24: 5b 9d 00 04 sw (sp+4),ra if ( !tp ) 8002e28: 44 40 00 1a be r2,r0,8002e90 <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); if ( clock_id == CLOCK_REALTIME ) { 8002e2c: 34 03 00 01 mvi r3,1 8002e30: 5c 23 00 11 bne r1,r3,8002e74 if ( tp->tv_sec < TOD_SECONDS_1970_THROUGH_1988 ) 8002e34: 78 04 08 01 mvhi r4,0x801 8002e38: 38 84 ea ec ori r4,r4,0xeaec 8002e3c: 28 43 00 00 lw r3,(r2+0) 8002e40: 28 81 00 00 lw r1,(r4+0) 8002e44: 54 61 00 02 bgu r3,r1,8002e4c 8002e48: e0 00 00 12 bi 8002e90 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 8002e4c: 78 01 08 02 mvhi r1,0x802 8002e50: 38 21 08 e8 ori r1,r1,0x8e8 8002e54: 28 23 00 00 lw r3,(r1+0) 8002e58: 34 63 00 01 addi r3,r3,1 8002e5c: 58 23 00 00 sw (r1+0),r3 rtems_set_errno_and_return_minus_one( EINVAL ); _Thread_Disable_dispatch(); _TOD_Set( tp ); 8002e60: b8 40 08 00 mv r1,r2 8002e64: f8 00 07 14 calli 8004ab4 <_TOD_Set> _Thread_Enable_dispatch(); 8002e68: f8 00 0d 3f calli 8006364 <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one( ENOSYS ); #endif else rtems_set_errno_and_return_minus_one( EINVAL ); return 0; 8002e6c: 34 01 00 00 mvi r1,0 8002e70: e0 00 00 0c bi 8002ea0 _Thread_Disable_dispatch(); _TOD_Set( tp ); _Thread_Enable_dispatch(); } #ifdef _POSIX_CPUTIME else if ( clock_id == CLOCK_PROCESS_CPUTIME ) 8002e74: 34 02 00 02 mvi r2,2 8002e78: 44 22 00 03 be r1,r2,8002e84 rtems_set_errno_and_return_minus_one( ENOSYS ); #endif #ifdef _POSIX_THREAD_CPUTIME else if ( clock_id == CLOCK_THREAD_CPUTIME ) 8002e7c: 34 02 00 03 mvi r2,3 8002e80: 5c 22 00 04 bne r1,r2,8002e90 rtems_set_errno_and_return_minus_one( ENOSYS ); 8002e84: f8 00 2a 94 calli 800d8d4 <__errno> 8002e88: 34 02 00 58 mvi r2,88 8002e8c: e0 00 00 03 bi 8002e98 #endif else rtems_set_errno_and_return_minus_one( EINVAL ); 8002e90: f8 00 2a 91 calli 800d8d4 <__errno> 8002e94: 34 02 00 16 mvi r2,22 8002e98: 58 22 00 00 sw (r1+0),r2 8002e9c: 34 01 ff ff mvi r1,-1 return 0; } 8002ea0: 2b 9d 00 04 lw ra,(sp+4) 8002ea4: 37 9c 00 04 addi sp,sp,4 8002ea8: c3 a0 00 00 ret =============================================================================== 080012b0 : static char *ctermid_name = "/dev/console"; char *ctermid( char *s ) { 80012b0: 37 9c ff f8 addi sp,sp,-8 <== NOT EXECUTED 80012b4: 5b 8b 00 08 sw (sp+8),r11 <== NOT EXECUTED 80012b8: 5b 9d 00 04 sw (sp+4),ra <== NOT EXECUTED 80012bc: 78 02 08 01 mvhi r2,0x801 <== NOT EXECUTED 80012c0: b8 20 58 00 mv r11,r1 <== NOT EXECUTED 80012c4: 38 42 00 40 ori r2,r2,0x40 <== NOT EXECUTED if ( !s ) 80012c8: 44 20 00 03 be r1,r0,80012d4 <== NOT EXECUTED /* * We have no way of knowing the length of the user provided buffer. * It may not be large enough but there is no way to know that. :( * So this is a potential buffer owerrun that we can do nothing about. */ strcpy( s, ctermid_name ); 80012cc: f8 00 28 02 calli 800b2d4 <== NOT EXECUTED return s; 80012d0: e0 00 00 02 bi 80012d8 <== NOT EXECUTED char *ctermid( char *s ) { if ( !s ) return ctermid_name; 80012d4: b8 40 58 00 mv r11,r2 <== NOT EXECUTED * It may not be large enough but there is no way to know that. :( * So this is a potential buffer owerrun that we can do nothing about. */ strcpy( s, ctermid_name ); return s; } 80012d8: b9 60 08 00 mv r1,r11 <== NOT EXECUTED 80012dc: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 80012e0: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED 80012e4: 37 9c 00 08 addi sp,sp,8 <== NOT EXECUTED 80012e8: c3 a0 00 00 ret <== NOT EXECUTED =============================================================================== 080066e0 : const char *pathname, size_t pathnamelen, int flags, rtems_filesystem_location_info_t *pathloc ) { 80066e0: 37 9c ff e0 addi sp,sp,-32 80066e4: 5b 8b 00 20 sw (sp+32),r11 80066e8: 5b 8c 00 1c sw (sp+28),r12 80066ec: 5b 8d 00 18 sw (sp+24),r13 80066f0: 5b 8e 00 14 sw (sp+20),r14 80066f4: 5b 8f 00 10 sw (sp+16),r15 80066f8: 5b 90 00 0c sw (sp+12),r16 80066fc: 5b 91 00 08 sw (sp+8),r17 8006700: 5b 9d 00 04 sw (sp+4),ra 8006704: b8 80 58 00 mv r11,r4 int i; rtems_device_name_t *device_name_table; /* see if 'flags' is valid */ if ( !rtems_libio_is_valid_perms( flags ) ) 8006708: 34 04 ff f8 mvi r4,-8 800670c: a0 64 20 00 and r4,r3,r4 const char *pathname, size_t pathnamelen, int flags, rtems_filesystem_location_info_t *pathloc ) { 8006710: b8 20 88 00 mv r17,r1 8006714: b8 40 80 00 mv r16,r2 int i; rtems_device_name_t *device_name_table; /* see if 'flags' is valid */ if ( !rtems_libio_is_valid_perms( flags ) ) 8006718: 44 80 00 04 be r4,r0,8006728 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EPERM ); 800671c: f8 00 0e 69 calli 800a0c0 <__errno> <== NOT EXECUTED 8006720: 34 02 00 01 mvi r2,1 <== NOT EXECUTED 8006724: e0 00 00 28 bi 80067c4 <== NOT EXECUTED /* get the device name table */ device_name_table = (rtems_device_name_t *)pathloc->node_access; 8006728: 29 6c 00 00 lw r12,(r11+0) if (!device_name_table) rtems_set_errno_and_return_minus_one( EFAULT ); for (i = 0; i < rtems_device_table_size; i++) { 800672c: 78 0d 08 01 mvhi r13,0x801 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) 8006730: 34 0e 00 00 mvi r14,0 rtems_set_errno_and_return_minus_one( EFAULT ); for (i = 0; i < rtems_device_table_size; i++) { 8006734: 39 ad 10 14 ori r13,r13,0x1014 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) 8006738: 5d 84 00 1f bne r12,r4,80067b4 rtems_set_errno_and_return_minus_one( EFAULT ); 800673c: f8 00 0e 61 calli 800a0c0 <__errno> 8006740: 34 02 00 0e mvi r2,14 8006744: e0 00 00 20 bi 80067c4 for (i = 0; i < rtems_device_table_size; i++) { if (!device_name_table[i].device_name) 8006748: 29 8f 00 00 lw r15,(r12+0) 800674c: 45 e0 00 18 be r15,r0,80067ac continue; if (strncmp(pathname, device_name_table[i].device_name, pathnamelen) != 0) 8006750: ba 20 08 00 mv r1,r17 8006754: b9 e0 10 00 mv r2,r15 8006758: ba 00 18 00 mv r3,r16 800675c: f8 00 12 a2 calli 800b1e4 8006760: b8 20 20 00 mv r4,r1 8006764: 5c 20 00 12 bne r1,r0,80067ac continue; if (device_name_table[i].device_name[pathnamelen] != '\0') 8006768: b5 f0 78 00 add r15,r15,r16 800676c: 41 e1 00 00 lbu r1,(r15+0) 8006770: 5c 24 00 0f bne r1,r4,80067ac <== NEVER TAKEN continue; /* find the device, set proper values */ pathloc->node_access = (void *)&device_name_table[i]; pathloc->handlers = &devFS_file_handlers; 8006774: 78 01 08 01 mvhi r1,0x801 8006778: 38 21 11 5c ori r1,r1,0x115c 800677c: 59 61 00 08 sw (r11+8),r1 pathloc->ops = &devFS_ops; 8006780: 78 01 08 01 mvhi r1,0x801 8006784: 38 21 11 14 ori r1,r1,0x1114 8006788: 59 61 00 0c sw (r11+12),r1 pathloc->mt_entry = rtems_filesystem_root.mt_entry; 800678c: 78 01 08 01 mvhi r1,0x801 8006790: 38 21 11 a0 ori r1,r1,0x11a0 8006794: 28 21 00 00 lw r1,(r1+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]; 8006798: 59 6c 00 00 sw (r11+0),r12 pathloc->handlers = &devFS_file_handlers; pathloc->ops = &devFS_ops; pathloc->mt_entry = rtems_filesystem_root.mt_entry; 800679c: 28 21 00 28 lw r1,(r1+40) 80067a0: 59 61 00 10 sw (r11+16),r1 return 0; 80067a4: 34 01 00 00 mvi r1,0 80067a8: e0 00 00 09 bi 80067cc /* 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++) { 80067ac: 35 ce 00 01 addi r14,r14,1 80067b0: 35 8c 00 14 addi r12,r12,20 80067b4: 29 a1 00 00 lw r1,(r13+0) 80067b8: 54 2e ff e4 bgu r1,r14,8006748 pathloc->mt_entry = rtems_filesystem_root.mt_entry; return 0; } /* no such file or directory */ rtems_set_errno_and_return_minus_one( ENOENT ); 80067bc: f8 00 0e 41 calli 800a0c0 <__errno> 80067c0: 34 02 00 02 mvi r2,2 80067c4: 58 22 00 00 sw (r1+0),r2 80067c8: 34 01 ff ff mvi r1,-1 } 80067cc: 2b 9d 00 04 lw ra,(sp+4) 80067d0: 2b 8b 00 20 lw r11,(sp+32) 80067d4: 2b 8c 00 1c lw r12,(sp+28) 80067d8: 2b 8d 00 18 lw r13,(sp+24) 80067dc: 2b 8e 00 14 lw r14,(sp+20) 80067e0: 2b 8f 00 10 lw r15,(sp+16) 80067e4: 2b 90 00 0c lw r16,(sp+12) 80067e8: 2b 91 00 08 lw r17,(sp+8) 80067ec: 37 9c 00 20 addi sp,sp,32 80067f0: c3 a0 00 00 ret =============================================================================== 080009d8 : const char *path, mode_t mode, dev_t dev, rtems_filesystem_location_info_t *pathloc ) { 80009d8: 37 9c ff d8 addi sp,sp,-40 80009dc: 5b 8b 00 28 sw (sp+40),r11 80009e0: 5b 8c 00 24 sw (sp+36),r12 80009e4: 5b 8d 00 20 sw (sp+32),r13 80009e8: 5b 8e 00 1c sw (sp+28),r14 80009ec: 5b 8f 00 18 sw (sp+24),r15 80009f0: 5b 90 00 14 sw (sp+20),r16 80009f4: 5b 91 00 10 sw (sp+16),r17 80009f8: 5b 92 00 0c sw (sp+12),r18 80009fc: 5b 93 00 08 sw (sp+8),r19 8000a00: 5b 9d 00 04 sw (sp+4),ra 8000a04: b8 40 88 00 mv r17,r2 * 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') && 8000a08: 40 22 00 00 lbu r2,(r1+0) const char *path, mode_t mode, dev_t dev, rtems_filesystem_location_info_t *pathloc ) { 8000a0c: b8 20 58 00 mv r11,r1 * 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') && 8000a10: 34 01 00 64 mvi r1,100 const char *path, mode_t mode, dev_t dev, rtems_filesystem_location_info_t *pathloc ) { 8000a14: b8 60 98 00 mv r19,r3 8000a18: b8 80 90 00 mv r18,r4 * 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') && 8000a1c: 5c 41 00 0a bne r2,r1,8000a44 8000a20: 41 62 00 01 lbu r2,(r11+1) 8000a24: 34 01 00 65 mvi r1,101 8000a28: 5c 41 00 07 bne r2,r1,8000a44 <== NEVER TAKEN 8000a2c: 41 62 00 02 lbu r2,(r11+2) 8000a30: 34 01 00 76 mvi r1,118 8000a34: 5c 41 00 04 bne r2,r1,8000a44 <== NEVER TAKEN (path[2] == 'v') && (path[3] == '\0')) 8000a38: 41 62 00 03 lbu r2,(r11+3) return 0; 8000a3c: 34 01 00 00 mvi r1,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')) 8000a40: 44 40 00 3d be r2,r0,8000b34 return 0; /* must be a character device or a block device */ if (!S_ISBLK(mode) && !S_ISCHR(mode)) 8000a44: 22 22 f0 00 andi r2,r17,0xf000 8000a48: 7c 41 20 00 cmpnei r1,r2,8192 8000a4c: 7c 42 60 00 cmpnei r2,r2,24576 8000a50: a0 22 08 00 and r1,r1,r2 8000a54: 44 20 00 04 be r1,r0,8000a64 rtems_set_errno_and_return_minus_one( EINVAL ); 8000a58: f8 00 25 9a calli 800a0c0 <__errno> 8000a5c: 34 02 00 16 mvi r2,22 8000a60: e0 00 00 0b bi 8000a8c 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; 8000a64: 28 af 00 00 lw r15,(r5+0) if (!device_name_table) 8000a68: 45 e1 00 07 be r15,r1,8000a84 rtems_set_errno_and_return_minus_one( EFAULT ); for (slot = -1, i = 0; i < rtems_device_table_size; i++){ 8000a6c: 78 0d 08 01 mvhi r13,0x801 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; if (!device_name_table) 8000a70: b9 e0 80 00 mv r16,r15 8000a74: 34 0c ff ff mvi r12,-1 8000a78: 34 0e 00 00 mvi r14,0 rtems_set_errno_and_return_minus_one( EFAULT ); for (slot = -1, i = 0; i < rtems_device_table_size; i++){ 8000a7c: 39 ad 10 14 ori r13,r13,0x1014 8000a80: e0 00 00 11 bi 8000ac4 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 ); 8000a84: f8 00 25 8f calli 800a0c0 <__errno> 8000a88: 34 02 00 0e mvi r2,14 8000a8c: 58 22 00 00 sw (r1+0),r2 8000a90: 34 01 ff ff mvi r1,-1 8000a94: e0 00 00 28 bi 8000b34 for (slot = -1, i = 0; i < rtems_device_table_size; i++){ if (device_name_table[i].device_name == NULL) 8000a98: 2a 02 00 00 lw r2,(r16+0) 8000a9c: 44 40 00 07 be r2,r0,8000ab8 slot = i; else if (strcmp(path, device_name_table[i].device_name) == 0) 8000aa0: b9 60 08 00 mv r1,r11 8000aa4: f8 00 29 71 calli 800b068 8000aa8: 5c 20 00 05 bne r1,r0,8000abc rtems_set_errno_and_return_minus_one( EEXIST ); 8000aac: f8 00 25 85 calli 800a0c0 <__errno> 8000ab0: 34 02 00 11 mvi r2,17 8000ab4: e3 ff ff f6 bi 8000a8c 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; 8000ab8: b9 c0 60 00 mv r12,r14 /* 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++){ 8000abc: 35 ce 00 01 addi r14,r14,1 8000ac0: 36 10 00 14 addi r16,r16,20 8000ac4: 29 a1 00 00 lw r1,(r13+0) 8000ac8: 54 2e ff f4 bgu r1,r14,8000a98 else if (strcmp(path, device_name_table[i].device_name) == 0) rtems_set_errno_and_return_minus_one( EEXIST ); } if (slot == -1) 8000acc: 34 01 ff ff mvi r1,-1 8000ad0: 5d 81 00 04 bne r12,r1,8000ae0 rtems_set_errno_and_return_minus_one( ENOMEM ); 8000ad4: f8 00 25 7b calli 800a0c0 <__errno> 8000ad8: 34 02 00 0c mvi r2,12 8000adc: e3 ff ff ec bi 8000a8c _ISR_Disable(level); 8000ae0: 90 00 68 00 rcsr r13,IE 8000ae4: 34 01 ff fe mvi r1,-2 8000ae8: a1 a1 08 00 and r1,r13,r1 8000aec: d0 01 00 00 wcsr IE,r1 device_name_table[slot].device_name = (char *)path; 8000af0: 34 02 00 02 mvi r2,2 8000af4: b9 80 08 00 mv r1,r12 8000af8: f8 00 38 0a calli 800eb20 <__ashlsi3> 8000afc: 34 02 00 02 mvi r2,2 8000b00: b8 20 60 00 mv r12,r1 8000b04: f8 00 38 07 calli 800eb20 <__ashlsi3> 8000b08: b5 81 08 00 add r1,r12,r1 8000b0c: b5 e1 60 00 add r12,r15,r1 8000b10: 59 8b 00 00 sw (r12+0),r11 device_name_table[slot].device_name_length = strlen(path); 8000b14: b9 60 08 00 mv r1,r11 8000b18: f8 00 29 84 calli 800b128 8000b1c: 59 81 00 04 sw (r12+4),r1 device_name_table[slot].major = major; 8000b20: 59 93 00 08 sw (r12+8),r19 device_name_table[slot].minor = minor; 8000b24: 59 92 00 0c sw (r12+12),r18 device_name_table[slot].mode = mode; 8000b28: 59 91 00 10 sw (r12+16),r17 _ISR_Enable(level); 8000b2c: d0 0d 00 00 wcsr IE,r13 return 0; 8000b30: 34 01 00 00 mvi r1,0 } 8000b34: 2b 9d 00 04 lw ra,(sp+4) 8000b38: 2b 8b 00 28 lw r11,(sp+40) 8000b3c: 2b 8c 00 24 lw r12,(sp+36) 8000b40: 2b 8d 00 20 lw r13,(sp+32) 8000b44: 2b 8e 00 1c lw r14,(sp+28) 8000b48: 2b 8f 00 18 lw r15,(sp+24) 8000b4c: 2b 90 00 14 lw r16,(sp+20) 8000b50: 2b 91 00 10 lw r17,(sp+16) 8000b54: 2b 92 00 0c lw r18,(sp+12) 8000b58: 2b 93 00 08 lw r19,(sp+8) 8000b5c: 37 9c 00 28 addi sp,sp,40 8000b60: c3 a0 00 00 ret =============================================================================== 08004884 : /* * Drain output queue */ static void drainOutput (struct rtems_termios_tty *tty) { 8004884: 37 9c ff f0 addi sp,sp,-16 8004888: 5b 8b 00 10 sw (sp+16),r11 800488c: 5b 8c 00 0c sw (sp+12),r12 8004890: 5b 8d 00 08 sw (sp+8),r13 8004894: 5b 9d 00 04 sw (sp+4),ra 8004898: b8 20 58 00 mv r11,r1 rtems_interrupt_level level; rtems_status_code sc; if (tty->device.outputUsesInterrupts != TERMIOS_POLLED) { 800489c: 28 21 00 b4 lw r1,(r1+180) 80048a0: 44 20 00 17 be r1,r0,80048fc rtems_interrupt_disable (level); 80048a4: 90 00 08 00 rcsr r1,IE 80048a8: 34 02 ff fe mvi r2,-2 80048ac: a0 22 10 00 and r2,r1,r2 80048b0: d0 02 00 00 wcsr IE,r2 while (tty->rawOutBuf.Tail != tty->rawOutBuf.Head) { tty->rawOutBufState = rob_wait; 80048b4: 34 0d 00 02 mvi r13,2 rtems_interrupt_enable (level); sc = rtems_semaphore_obtain( tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); rtems_interrupt_disable (level); 80048b8: 34 0c ff fe mvi r12,-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) { 80048bc: e0 00 00 0c bi 80048ec tty->rawOutBufState = rob_wait; 80048c0: 59 6d 00 94 sw (r11+148),r13 <== NOT EXECUTED rtems_interrupt_enable (level); 80048c4: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED sc = rtems_semaphore_obtain( 80048c8: 29 61 00 8c lw r1,(r11+140) <== NOT EXECUTED 80048cc: 34 02 00 00 mvi r2,0 <== NOT EXECUTED 80048d0: 34 03 00 00 mvi r3,0 <== NOT EXECUTED 80048d4: f8 00 0a 0e calli 800710c <== NOT EXECUTED tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) 80048d8: 44 20 00 02 be r1,r0,80048e0 <== NOT EXECUTED rtems_fatal_error_occurred (sc); 80048dc: f8 00 0b ef calli 8007898 <== NOT EXECUTED rtems_interrupt_disable (level); 80048e0: 90 00 08 00 rcsr r1,IE <== NOT EXECUTED 80048e4: a0 2c 10 00 and r2,r1,r12 <== NOT EXECUTED 80048e8: d0 02 00 00 wcsr IE,r2 <== 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) { 80048ec: 29 63 00 84 lw r3,(r11+132) 80048f0: 29 62 00 80 lw r2,(r11+128) 80048f4: 5c 62 ff f3 bne r3,r2,80048c0 <== NEVER TAKEN tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); rtems_interrupt_disable (level); } rtems_interrupt_enable (level); 80048f8: d0 01 00 00 wcsr IE,r1 } } 80048fc: 2b 9d 00 04 lw ra,(sp+4) 8004900: 2b 8b 00 10 lw r11,(sp+16) 8004904: 2b 8c 00 0c lw r12,(sp+12) 8004908: 2b 8d 00 08 lw r13,(sp+8) 800490c: 37 9c 00 10 addi sp,sp,16 8004910: c3 a0 00 00 ret =============================================================================== 08005654 : /* * Echo a typed character */ static void echo (unsigned char c, struct rtems_termios_tty *tty) { 8005654: 37 9c ff f4 addi sp,sp,-12 8005658: 5b 8b 00 08 sw (sp+8),r11 800565c: 5b 9d 00 04 sw (sp+4),ra 8005660: b8 40 58 00 mv r11,r2 if ((tty->termios.c_lflag & ECHOCTL) && 8005664: 28 42 00 3c lw r2,(r2+60) 8005668: 20 42 02 00 andi r2,r2,0x200 800566c: 44 40 00 19 be r2,r0,80056d0 <== NEVER TAKEN iscntrl(c) && (c != '\t') && (c != '\n')) { 8005670: 78 02 08 02 mvhi r2,0x802 8005674: 38 42 34 14 ori r2,r2,0x3414 8005678: 28 42 00 00 lw r2,(r2+0) 800567c: 7c 23 00 09 cmpnei r3,r1,9 8005680: b4 41 10 00 add r2,r2,r1 8005684: 40 42 00 01 lbu r2,(r2+1) 8005688: 20 42 00 20 andi r2,r2,0x20 * Echo a typed character */ static void echo (unsigned char c, struct rtems_termios_tty *tty) { if ((tty->termios.c_lflag & ECHOCTL) && 800568c: 7c 42 00 00 cmpnei r2,r2,0 iscntrl(c) && (c != '\t') && (c != '\n')) { 8005690: a0 43 10 00 and r2,r2,r3 8005694: 44 40 00 0f be r2,r0,80056d0 8005698: 34 02 00 0a mvi r2,10 800569c: 44 22 00 0d be r1,r2,80056d0 char echobuf[2]; echobuf[0] = '^'; 80056a0: 34 02 00 5e mvi r2,94 echobuf[1] = c ^ 0x40; 80056a4: 18 21 00 40 xori r1,r1,0x40 { if ((tty->termios.c_lflag & ECHOCTL) && iscntrl(c) && (c != '\t') && (c != '\n')) { char echobuf[2]; echobuf[0] = '^'; 80056a8: 33 82 00 0c sb (sp+12),r2 echobuf[1] = c ^ 0x40; 80056ac: 33 81 00 0d sb (sp+13),r1 rtems_termios_puts (echobuf, 2, tty); 80056b0: 34 02 00 02 mvi r2,2 80056b4: 37 81 00 0c addi r1,sp,12 80056b8: b9 60 18 00 mv r3,r11 80056bc: fb ff ff 34 calli 800538c tty->column += 2; 80056c0: 29 61 00 28 lw r1,(r11+40) 80056c4: 34 21 00 02 addi r1,r1,2 80056c8: 59 61 00 28 sw (r11+40),r1 */ static void echo (unsigned char c, struct rtems_termios_tty *tty) { if ((tty->termios.c_lflag & ECHOCTL) && iscntrl(c) && (c != '\t') && (c != '\n')) { 80056cc: e0 00 00 03 bi 80056d8 echobuf[0] = '^'; echobuf[1] = c ^ 0x40; rtems_termios_puts (echobuf, 2, tty); tty->column += 2; } else { oproc (c, tty); 80056d0: b9 60 10 00 mv r2,r11 80056d4: fb ff ff 84 calli 80054e4 } } 80056d8: 2b 9d 00 04 lw ra,(sp+4) 80056dc: 2b 8b 00 08 lw r11,(sp+8) 80056e0: 37 9c 00 0c addi sp,sp,12 80056e4: c3 a0 00 00 ret =============================================================================== 08002690 : void endgrent(void) { 8002690: 37 9c ff fc addi sp,sp,-4 8002694: 5b 9d 00 04 sw (sp+4),ra if (group_fp != NULL) 8002698: 78 01 08 01 mvhi r1,0x801 800269c: 38 21 66 f4 ori r1,r1,0x66f4 80026a0: 28 21 00 00 lw r1,(r1+0) 80026a4: 44 20 00 02 be r1,r0,80026ac <== NEVER TAKEN fclose(group_fp); 80026a8: f8 00 2c a5 calli 800d93c } 80026ac: 2b 9d 00 04 lw ra,(sp+4) 80026b0: 37 9c 00 04 addi sp,sp,4 80026b4: c3 a0 00 00 ret =============================================================================== 080024c8 : void endpwent(void) { 80024c8: 37 9c ff fc addi sp,sp,-4 80024cc: 5b 9d 00 04 sw (sp+4),ra if (passwd_fp != NULL) 80024d0: 78 01 08 01 mvhi r1,0x801 80024d4: 38 21 67 d0 ori r1,r1,0x67d0 80024d8: 28 21 00 00 lw r1,(r1+0) 80024dc: 44 20 00 02 be r1,r0,80024e4 <== NEVER TAKEN fclose(passwd_fp); 80024e0: f8 00 2d 17 calli 800d93c } 80024e4: 2b 9d 00 04 lw ra,(sp+4) 80024e8: 37 9c 00 04 addi sp,sp,4 80024ec: c3 a0 00 00 ret =============================================================================== 080056e8 : * 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) { 80056e8: 37 9c ff e0 addi sp,sp,-32 80056ec: 5b 8b 00 20 sw (sp+32),r11 80056f0: 5b 8c 00 1c sw (sp+28),r12 80056f4: 5b 8d 00 18 sw (sp+24),r13 80056f8: 5b 8e 00 14 sw (sp+20),r14 80056fc: 5b 8f 00 10 sw (sp+16),r15 8005700: 5b 90 00 0c sw (sp+12),r16 8005704: 5b 91 00 08 sw (sp+8),r17 8005708: 5b 9d 00 04 sw (sp+4),ra 800570c: b8 20 58 00 mv r11,r1 if (tty->ccount == 0) 8005710: 28 21 00 20 lw r1,(r1+32) * 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) { 8005714: b8 40 78 00 mv r15,r2 if (tty->ccount == 0) 8005718: 44 20 00 6c be r1,r0,80058c8 return; if (lineFlag) { 800571c: 44 40 00 62 be r2,r0,80058a4 if (!(tty->termios.c_lflag & ECHO)) { 8005720: 29 6c 00 3c lw r12,(r11+60) 8005724: 21 81 00 08 andi r1,r12,0x8 8005728: 5c 20 00 03 bne r1,r0,8005734 <== ALWAYS TAKEN tty->ccount = 0; 800572c: 59 60 00 20 sw (r11+32),r0 <== NOT EXECUTED return; 8005730: e0 00 00 66 bi 80058c8 <== NOT EXECUTED } if (!(tty->termios.c_lflag & ECHOE)) { 8005734: 21 8c 00 10 andi r12,r12,0x10 8005738: 5d 80 00 5b bne r12,r0,80058a4 <== ALWAYS TAKEN tty->ccount = 0; echo (tty->termios.c_cc[VKILL], tty); 800573c: 41 61 00 44 lbu r1,(r11+68) <== NOT EXECUTED if (!(tty->termios.c_lflag & ECHO)) { tty->ccount = 0; return; } if (!(tty->termios.c_lflag & ECHOE)) { tty->ccount = 0; 8005740: 59 60 00 20 sw (r11+32),r0 <== NOT EXECUTED echo (tty->termios.c_cc[VKILL], tty); 8005744: b9 60 10 00 mv r2,r11 <== NOT EXECUTED 8005748: fb ff ff c3 calli 8005654 <== NOT EXECUTED if (tty->termios.c_lflag & ECHOK) 800574c: 29 61 00 3c lw r1,(r11+60) <== NOT EXECUTED 8005750: 20 21 00 20 andi r1,r1,0x20 <== NOT EXECUTED 8005754: 44 2c 00 5d be r1,r12,80058c8 <== NOT EXECUTED echo ('\n', tty); 8005758: 34 01 00 0a mvi r1,10 <== NOT EXECUTED 800575c: e0 00 00 0d bi 8005790 <== NOT EXECUTED return; } } while (tty->ccount) { unsigned char c = tty->cbuf[--tty->ccount]; 8005760: 29 64 00 1c lw r4,(r11+28) 8005764: 34 21 ff ff addi r1,r1,-1 8005768: 59 61 00 20 sw (r11+32),r1 800576c: b4 81 10 00 add r2,r4,r1 8005770: 40 4c 00 00 lbu r12,(r2+0) if (tty->termios.c_lflag & ECHO) { 8005774: 29 62 00 3c lw r2,(r11+60) 8005778: 20 43 00 08 andi r3,r2,0x8 800577c: 44 60 00 48 be r3,r0,800589c <== NEVER TAKEN if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) { 8005780: 5d e0 00 07 bne r15,r0,800579c 8005784: 20 43 00 10 andi r3,r2,0x10 8005788: 5c 6f 00 05 bne r3,r15,800579c <== ALWAYS TAKEN echo (tty->termios.c_cc[VERASE], tty); 800578c: 41 61 00 43 lbu r1,(r11+67) <== NOT EXECUTED 8005790: b9 60 10 00 mv r2,r11 <== NOT EXECUTED 8005794: fb ff ff b0 calli 8005654 <== NOT EXECUTED 8005798: e0 00 00 4c bi 80058c8 <== NOT EXECUTED } else if (c == '\t') { 800579c: 5d 91 00 20 bne r12,r17,800581c int col = tty->read_start_column; 80057a0: 29 6c 00 2c lw r12,(r11+44) */ while (i != tty->ccount) { c = tty->cbuf[i++]; if (c == '\t') { col = (col | 7) + 1; } else if (iscntrl (c)) { 80057a4: 29 a6 00 00 lw r6,(r13+0) 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; 80057a8: 34 03 00 00 mvi r3,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) 80057ac: 20 42 02 00 andi r2,r2,0x200 int i = 0; /* * Find the character before the tab */ while (i != tty->ccount) { 80057b0: e0 00 00 0f bi 80057ec * Erase a character or line * 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) 80057b4: b4 83 28 00 add r5,r4,r3 /* * Find the character before the tab */ while (i != tty->ccount) { c = tty->cbuf[i++]; 80057b8: 40 a5 00 00 lbu r5,(r5+0) 80057bc: 34 63 00 01 addi r3,r3,1 if (c == '\t') { 80057c0: 5c b1 00 03 bne r5,r17,80057cc col = (col | 7) + 1; 80057c4: 39 8c 00 07 ori r12,r12,0x7 80057c8: e0 00 00 08 bi 80057e8 } else if (iscntrl (c)) { 80057cc: b4 c5 28 00 add r5,r6,r5 80057d0: 40 a5 00 01 lbu r5,(r5+1) 80057d4: 20 a5 00 20 andi r5,r5,0x20 80057d8: 44 a0 00 04 be r5,r0,80057e8 <== ALWAYS TAKEN if (tty->termios.c_lflag & ECHOCTL) 80057dc: 44 40 00 04 be r2,r0,80057ec <== NOT EXECUTED col += 2; 80057e0: 35 8c 00 02 addi r12,r12,2 <== NOT EXECUTED 80057e4: e0 00 00 02 bi 80057ec <== NOT EXECUTED } else { col++; 80057e8: 35 8c 00 01 addi r12,r12,1 int i = 0; /* * Find the character before the tab */ while (i != tty->ccount) { 80057ec: 5c 61 ff f2 bne r3,r1,80057b4 80057f0: e0 00 00 08 bi 8005810 /* * Back up over the tab */ while (tty->column > col) { rtems_termios_puts ("\b", 1, tty); 80057f4: ba 00 08 00 mv r1,r16 80057f8: 34 02 00 01 mvi r2,1 80057fc: b9 60 18 00 mv r3,r11 8005800: fb ff fe e3 calli 800538c tty->column--; 8005804: 29 61 00 28 lw r1,(r11+40) 8005808: 34 21 ff ff addi r1,r1,-1 800580c: 59 61 00 28 sw (r11+40),r1 } /* * Back up over the tab */ while (tty->column > col) { 8005810: 29 61 00 28 lw r1,(r11+40) 8005814: 48 2c ff f8 bg r1,r12,80057f4 8005818: e0 00 00 21 bi 800589c rtems_termios_puts ("\b", 1, tty); tty->column--; } } else { if (iscntrl (c) && (tty->termios.c_lflag & ECHOCTL)) { 800581c: 29 a1 00 00 lw r1,(r13+0) 8005820: 35 8c 00 01 addi r12,r12,1 8005824: b4 2c 08 00 add r1,r1,r12 8005828: 40 21 00 00 lbu r1,(r1+0) 800582c: 20 21 00 20 andi r1,r1,0x20 8005830: 44 20 00 0b be r1,r0,800585c <== ALWAYS TAKEN 8005834: 20 42 02 00 andi r2,r2,0x200 <== NOT EXECUTED 8005838: 44 40 00 09 be r2,r0,800585c <== NOT EXECUTED rtems_termios_puts ("\b \b", 3, tty); 800583c: b9 c0 08 00 mv r1,r14 <== NOT EXECUTED 8005840: 34 02 00 03 mvi r2,3 <== NOT EXECUTED 8005844: b9 60 18 00 mv r3,r11 <== NOT EXECUTED 8005848: fb ff fe d1 calli 800538c <== NOT EXECUTED if (tty->column) 800584c: 29 61 00 28 lw r1,(r11+40) <== NOT EXECUTED 8005850: 44 20 00 03 be r1,r0,800585c <== NOT EXECUTED tty->column--; 8005854: 34 21 ff ff addi r1,r1,-1 <== NOT EXECUTED 8005858: 59 61 00 28 sw (r11+40),r1 <== NOT EXECUTED } if (!iscntrl (c) || (tty->termios.c_lflag & ECHOCTL)) { 800585c: 29 a1 00 00 lw r1,(r13+0) 8005860: b4 2c 60 00 add r12,r1,r12 8005864: 41 81 00 00 lbu r1,(r12+0) 8005868: 20 21 00 20 andi r1,r1,0x20 800586c: 44 20 00 04 be r1,r0,800587c <== ALWAYS TAKEN 8005870: 29 61 00 3c lw r1,(r11+60) <== NOT EXECUTED 8005874: 20 21 02 00 andi r1,r1,0x200 <== NOT EXECUTED 8005878: 44 20 00 09 be r1,r0,800589c <== NOT EXECUTED rtems_termios_puts ("\b \b", 3, tty); 800587c: b9 c0 08 00 mv r1,r14 8005880: 34 02 00 03 mvi r2,3 8005884: b9 60 18 00 mv r3,r11 8005888: fb ff fe c1 calli 800538c if (tty->column) 800588c: 29 61 00 28 lw r1,(r11+40) 8005890: 44 20 00 03 be r1,r0,800589c <== NEVER TAKEN tty->column--; 8005894: 34 21 ff ff addi r1,r1,-1 8005898: 59 61 00 28 sw (r11+40),r1 } } } if (!lineFlag) 800589c: 5d e0 00 09 bne r15,r0,80058c0 80058a0: e0 00 00 0a bi 80058c8 80058a4: 78 0d 08 02 mvhi r13,0x802 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); 80058a8: 78 0e 08 02 mvhi r14,0x802 /* * Back up over the tab */ while (tty->column > col) { rtems_termios_puts ("\b", 1, tty); 80058ac: 78 10 08 02 mvhi r16,0x802 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); } else if (c == '\t') { 80058b0: 34 11 00 09 mvi r17,9 80058b4: 39 ad 34 14 ori r13,r13,0x3414 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); 80058b8: 39 ce 14 d0 ori r14,r14,0x14d0 /* * Back up over the tab */ while (tty->column > col) { rtems_termios_puts ("\b", 1, tty); 80058bc: 3a 10 14 cc ori r16,r16,0x14cc echo ('\n', tty); return; } } while (tty->ccount) { 80058c0: 29 61 00 20 lw r1,(r11+32) 80058c4: 5c 20 ff a7 bne r1,r0,8005760 } } if (!lineFlag) break; } } 80058c8: 2b 9d 00 04 lw ra,(sp+4) 80058cc: 2b 8b 00 20 lw r11,(sp+32) 80058d0: 2b 8c 00 1c lw r12,(sp+28) 80058d4: 2b 8d 00 18 lw r13,(sp+24) 80058d8: 2b 8e 00 14 lw r14,(sp+20) 80058dc: 2b 8f 00 10 lw r15,(sp+16) 80058e0: 2b 90 00 0c lw r16,(sp+12) 80058e4: 2b 91 00 08 lw r17,(sp+8) 80058e8: 37 9c 00 20 addi sp,sp,32 80058ec: c3 a0 00 00 ret =============================================================================== 08001e44 : int fcntl( int fd, int cmd, ... ) { 8001e44: 37 9c ff c4 addi sp,sp,-60 8001e48: 5b 8b 00 20 sw (sp+32),r11 8001e4c: 5b 8c 00 1c sw (sp+28),r12 8001e50: 5b 8d 00 18 sw (sp+24),r13 8001e54: 5b 8e 00 14 sw (sp+20),r14 8001e58: 5b 8f 00 10 sw (sp+16),r15 8001e5c: 5b 90 00 0c sw (sp+12),r16 8001e60: 5b 91 00 08 sw (sp+8),r17 8001e64: 5b 9d 00 04 sw (sp+4),ra 8001e68: 5b 82 00 24 sw (sp+36),r2 8001e6c: b8 40 68 00 mv r13,r2 int fd2; int flags; int mask; int ret = 0; rtems_libio_check_fd( fd ); 8001e70: 78 02 08 01 mvhi r2,0x801 int fcntl( int fd, int cmd, ... ) { 8001e74: 5b 83 00 28 sw (sp+40),r3 8001e78: 5b 84 00 2c sw (sp+44),r4 8001e7c: 5b 85 00 30 sw (sp+48),r5 8001e80: 5b 86 00 34 sw (sp+52),r6 8001e84: 5b 87 00 38 sw (sp+56),r7 8001e88: 5b 88 00 3c sw (sp+60),r8 int fd2; int flags; int mask; int ret = 0; rtems_libio_check_fd( fd ); 8001e8c: 38 42 60 10 ori r2,r2,0x6010 8001e90: 28 51 00 00 lw r17,(r2+0) ... ) { int ret; va_list ap; va_start( ap, cmd ); 8001e94: 37 8e 00 28 addi r14,sp,40 int fd2; int flags; int mask; int ret = 0; rtems_libio_check_fd( fd ); 8001e98: 56 21 00 02 bgu r17,r1,8001ea0 8001e9c: e0 00 00 0a bi 8001ec4 iop = rtems_libio_iop( fd ); 8001ea0: 78 02 08 01 mvhi r2,0x801 8001ea4: 38 42 67 6c ori r2,r2,0x676c 8001ea8: 28 50 00 00 lw r16,(r2+0) 8001eac: 34 02 00 06 mvi r2,6 8001eb0: f8 00 46 b7 calli 801398c <__ashlsi3> 8001eb4: b6 01 58 00 add r11,r16,r1 rtems_libio_check_is_open(iop); 8001eb8: 29 6c 00 18 lw r12,(r11+24) 8001ebc: 21 81 01 00 andi r1,r12,0x100 8001ec0: 5c 20 00 04 bne r1,r0,8001ed0 8001ec4: f8 00 2e 93 calli 800d910 <__errno> 8001ec8: 34 02 00 09 mvi r2,9 8001ecc: e0 00 00 49 bi 8001ff0 /* * This switch should contain all the cases from POSIX. */ switch ( cmd ) { 8001ed0: 34 01 00 09 mvi r1,9 8001ed4: 55 a1 00 45 bgu r13,r1,8001fe8 8001ed8: 78 0f 08 01 mvhi r15,0x801 8001edc: b9 a0 08 00 mv r1,r13 8001ee0: 34 02 00 02 mvi r2,2 8001ee4: f8 00 46 aa calli 801398c <__ashlsi3> 8001ee8: 39 ef 4b e8 ori r15,r15,0x4be8 8001eec: b5 e1 08 00 add r1,r15,r1 8001ef0: 28 21 00 00 lw r1,(r1+0) 8001ef4: c0 20 00 00 b r1 case F_DUPFD: /* dup */ fd2 = va_arg( ap, int ); 8001ef8: 29 cc 00 00 lw r12,(r14+0) if ( fd2 ) 8001efc: 45 80 00 08 be r12,r0,8001f1c diop = rtems_libio_iop( fd2 ); 8001f00: 34 03 00 00 mvi r3,0 8001f04: 51 91 00 09 bgeu r12,r17,8001f28 <== NEVER TAKEN 8001f08: b9 80 08 00 mv r1,r12 8001f0c: 34 02 00 06 mvi r2,6 8001f10: f8 00 46 9f calli 801398c <__ashlsi3> 8001f14: b6 01 18 00 add r3,r16,r1 8001f18: e0 00 00 04 bi 8001f28 else { /* allocate a file control block */ diop = rtems_libio_allocate(); 8001f1c: f8 00 01 e6 calli 80026b4 8001f20: b8 20 18 00 mv r3,r1 if ( diop == 0 ) { 8001f24: 44 2c 00 3e be r1,r12,800201c <== NEVER TAKEN ret = -1; break; } } diop->flags = iop->flags; 8001f28: 29 61 00 18 lw r1,(r11+24) diop->pathinfo = iop->pathinfo; 8001f2c: 29 62 00 28 lw r2,(r11+40) 8001f30: 29 66 00 1c lw r6,(r11+28) ret = -1; break; } } diop->flags = iop->flags; 8001f34: 58 61 00 18 sw (r3+24),r1 diop->pathinfo = iop->pathinfo; 8001f38: 29 61 00 2c lw r1,(r11+44) 8001f3c: 29 65 00 20 lw r5,(r11+32) 8001f40: 29 64 00 24 lw r4,(r11+36) 8001f44: 58 61 00 2c sw (r3+44),r1 ret = (int) (diop - rtems_libio_iops); 8001f48: 78 01 08 01 mvhi r1,0x801 8001f4c: 38 21 67 6c ori r1,r1,0x676c 8001f50: 28 21 00 00 lw r1,(r1+0) break; } } diop->flags = iop->flags; diop->pathinfo = iop->pathinfo; 8001f54: 58 62 00 28 sw (r3+40),r2 8001f58: 58 66 00 1c sw (r3+28),r6 8001f5c: 58 65 00 20 sw (r3+32),r5 8001f60: 58 64 00 24 sw (r3+36),r4 ret = (int) (diop - rtems_libio_iops); 8001f64: c8 61 08 00 sub r1,r3,r1 8001f68: 34 02 00 06 mvi r2,6 8001f6c: f8 00 46 af calli 8013a28 <__ashrsi3> 8001f70: e0 00 00 0e bi 8001fa8 break; case F_GETFD: /* get f_flags */ ret = ((iop->flags & LIBIO_FLAGS_CLOSE_ON_EXEC) != 0); 8001f74: 21 8c 08 00 andi r12,r12,0x800 8001f78: 7d 8c 00 00 cmpnei r12,r12,0 8001f7c: e0 00 00 1f bi 8001ff8 * 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 ) ) 8001f80: 29 c1 00 00 lw r1,(r14+0) 8001f84: 44 20 00 03 be r1,r0,8001f90 iop->flags |= LIBIO_FLAGS_CLOSE_ON_EXEC; 8001f88: 39 8c 08 00 ori r12,r12,0x800 8001f8c: e0 00 00 03 bi 8001f98 else iop->flags &= ~LIBIO_FLAGS_CLOSE_ON_EXEC; 8001f90: 34 01 f7 ff mvi r1,-2049 8001f94: a1 81 60 00 and r12,r12,r1 8001f98: 59 6c 00 18 sw (r11+24),r12 8001f9c: e0 00 00 0e bi 8001fd4 break; case F_GETFL: /* more flags (cloexec) */ ret = rtems_libio_to_fcntl_flags( iop->flags ); 8001fa0: b9 80 08 00 mv r1,r12 8001fa4: f8 00 01 b0 calli 8002664 8001fa8: b8 20 60 00 mv r12,r1 /* * If we got this far successfully, then we give the optional * filesystem specific handler a chance to process this. */ if (ret >= 0) { 8001fac: 48 01 00 1d bg r0,r1,8002020 <== NEVER TAKEN 8001fb0: e0 00 00 12 bi 8001ff8 case F_GETFL: /* more flags (cloexec) */ ret = rtems_libio_to_fcntl_flags( iop->flags ); break; case F_SETFL: flags = rtems_libio_fcntl_flags( va_arg( ap, int ) ); 8001fb4: 29 c1 00 00 lw r1,(r14+0) 8001fb8: f8 00 01 95 calli 800260c /* * XXX If we are turning on append, should we seek to the end? */ iop->flags = (iop->flags & ~mask) | (flags & mask); 8001fbc: 29 63 00 18 lw r3,(r11+24) 8001fc0: 34 02 fd fe mvi r2,-514 8001fc4: 20 21 02 01 andi r1,r1,0x201 8001fc8: a0 43 10 00 and r2,r2,r3 8001fcc: b8 22 08 00 or r1,r1,r2 8001fd0: 59 61 00 18 sw (r11+24),r1 rtems_libio_t *iop; rtems_libio_t *diop; int fd2; int flags; int mask; int ret = 0; 8001fd4: 34 0c 00 00 mvi r12,0 8001fd8: e0 00 00 08 bi 8001ff8 errno = ENOTSUP; ret = -1; break; case F_GETOWN: /* for sockets. */ errno = ENOTSUP; 8001fdc: f8 00 2e 4d calli 800d910 <__errno> 8001fe0: 34 02 00 86 mvi r2,134 8001fe4: e0 00 00 03 bi 8001ff0 ret = -1; break; default: errno = EINVAL; 8001fe8: f8 00 2e 4a calli 800d910 <__errno> 8001fec: 34 02 00 16 mvi r2,22 8001ff0: 58 22 00 00 sw (r1+0),r2 8001ff4: e0 00 00 0a bi 800201c * If we got this far successfully, then we give the optional * filesystem specific handler a chance to process this. */ if (ret >= 0) { int err = (*iop->pathinfo.handlers->fcntl_h)( cmd, iop ); 8001ff8: 29 61 00 24 lw r1,(r11+36) 8001ffc: b9 60 10 00 mv r2,r11 8002000: 28 23 00 30 lw r3,(r1+48) 8002004: b9 a0 08 00 mv r1,r13 8002008: d8 60 00 00 call r3 800200c: b8 20 58 00 mv r11,r1 if (err) { 8002010: 44 20 00 04 be r1,r0,8002020 <== ALWAYS TAKEN errno = err; 8002014: f8 00 2e 3f calli 800d910 <__errno> <== NOT EXECUTED 8002018: 58 2b 00 00 sw (r1+0),r11 <== NOT EXECUTED ret = -1; 800201c: 34 0c ff ff mvi r12,-1 va_list ap; va_start( ap, cmd ); ret = vfcntl(fd,cmd,ap); va_end(ap); return ret; } 8002020: b9 80 08 00 mv r1,r12 8002024: 2b 9d 00 04 lw ra,(sp+4) 8002028: 2b 8b 00 20 lw r11,(sp+32) 800202c: 2b 8c 00 1c lw r12,(sp+28) 8002030: 2b 8d 00 18 lw r13,(sp+24) 8002034: 2b 8e 00 14 lw r14,(sp+20) 8002038: 2b 8f 00 10 lw r15,(sp+16) 800203c: 2b 90 00 0c lw r16,(sp+12) 8002040: 2b 91 00 08 lw r17,(sp+8) 8002044: 37 9c 00 3c addi sp,sp,60 8002048: c3 a0 00 00 ret =============================================================================== 0800a2a4 : */ int fifo_open( pipe_control_t **pipep, rtems_libio_t *iop ) { 800a2a4: 37 9c ff d4 addi sp,sp,-44 800a2a8: 5b 8b 00 24 sw (sp+36),r11 800a2ac: 5b 8c 00 20 sw (sp+32),r12 800a2b0: 5b 8d 00 1c sw (sp+28),r13 800a2b4: 5b 8e 00 18 sw (sp+24),r14 800a2b8: 5b 8f 00 14 sw (sp+20),r15 800a2bc: 5b 90 00 10 sw (sp+16),r16 800a2c0: 5b 91 00 0c sw (sp+12),r17 800a2c4: 5b 92 00 08 sw (sp+8),r18 800a2c8: 5b 9d 00 04 sw (sp+4),ra static rtems_status_code pipe_lock(void) { rtems_status_code sc = RTEMS_SUCCESSFUL; if (pipe_semaphore == RTEMS_ID_NONE) { 800a2cc: 78 0b 08 02 mvhi r11,0x802 800a2d0: 39 6b 37 0c ori r11,r11,0x370c */ int fifo_open( pipe_control_t **pipep, rtems_libio_t *iop ) { 800a2d4: b8 20 78 00 mv r15,r1 static rtems_status_code pipe_lock(void) { rtems_status_code sc = RTEMS_SUCCESSFUL; if (pipe_semaphore == RTEMS_ID_NONE) { 800a2d8: 29 61 00 00 lw r1,(r11+0) */ int fifo_open( pipe_control_t **pipep, rtems_libio_t *iop ) { 800a2dc: b8 40 70 00 mv r14,r2 static rtems_status_code pipe_lock(void) { rtems_status_code sc = RTEMS_SUCCESSFUL; if (pipe_semaphore == RTEMS_ID_NONE) { 800a2e0: 5c 20 00 18 bne r1,r0,800a340 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 ); 800a2e4: 78 01 08 02 mvhi r1,0x802 800a2e8: 38 21 37 88 ori r1,r1,0x3788 800a2ec: 28 21 00 00 lw r1,(r1+0) 800a2f0: 34 02 00 00 mvi r2,0 800a2f4: 34 03 00 00 mvi r3,0 800a2f8: fb ff eb 85 calli 800510c rtems_libio_lock(); if (pipe_semaphore == RTEMS_ID_NONE) { 800a2fc: 29 61 00 00 lw r1,(r11+0) free(pipe); } static rtems_status_code pipe_lock(void) { rtems_status_code sc = RTEMS_SUCCESSFUL; 800a300: 34 0c 00 00 mvi r12,0 if (pipe_semaphore == RTEMS_ID_NONE) { rtems_libio_lock(); if (pipe_semaphore == RTEMS_ID_NONE) { 800a304: 5c 2c 00 0a bne r1,r12,800a32c <== NEVER TAKEN sc = rtems_semaphore_create( 800a308: 78 02 08 02 mvhi r2,0x802 800a30c: 38 42 21 70 ori r2,r2,0x2170 800a310: 28 41 00 00 lw r1,(r2+0) 800a314: 34 03 00 54 mvi r3,84 800a318: 34 02 00 01 mvi r2,1 800a31c: 34 04 00 00 mvi r4,0 800a320: b9 60 28 00 mv r5,r11 800a324: fb ff ea ce calli 8004e5c 800a328: b8 20 60 00 mv r12,r1 } static inline void rtems_libio_unlock( void ) { rtems_semaphore_release( rtems_libio_semaphore ); 800a32c: 78 01 08 02 mvhi r1,0x802 800a330: 38 21 37 88 ori r1,r1,0x3788 800a334: 28 21 00 00 lw r1,(r1+0) 800a338: fb ff eb c5 calli 800524c } rtems_libio_unlock(); } if (sc == RTEMS_SUCCESSFUL) { 800a33c: 5d 80 00 08 bne r12,r0,800a35c sc = rtems_semaphore_obtain(pipe_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 800a340: 78 01 08 02 mvhi r1,0x802 800a344: 38 21 37 0c ori r1,r1,0x370c 800a348: 28 21 00 00 lw r1,(r1+0) 800a34c: 34 02 00 00 mvi r2,0 800a350: 34 03 00 00 mvi r3,0 800a354: fb ff eb 6e calli 800510c } if (sc == RTEMS_SUCCESSFUL) { 800a358: 44 20 00 03 be r1,r0,800a364 <== ALWAYS TAKEN 800a35c: 34 0c ff f4 mvi r12,-12 800a360: e0 00 00 cd bi 800a694 err = pipe_lock(); if (err) return err; pipe = *pipep; 800a364: 29 eb 00 00 lw r11,(r15+0) 800a368: 34 0c 00 00 mvi r12,0 if (pipe == NULL) { 800a36c: 5d 60 00 55 bne r11,r0,800a4c0 { static char c = 'a'; pipe_control_t *pipe; int err = -ENOMEM; pipe = malloc(sizeof(pipe_control_t)); 800a370: 34 01 00 34 mvi r1,52 800a374: fb ff e6 3f calli 8003c70 800a378: b8 20 58 00 mv r11,r1 800a37c: b8 20 80 00 mv r16,r1 if (pipe == NULL) 800a380: 44 20 00 4e be r1,r0,800a4b8 return err; memset(pipe, 0, sizeof(pipe_control_t)); 800a384: 34 02 00 00 mvi r2,0 800a388: 34 03 00 34 mvi r3,52 800a38c: f8 00 17 b6 calli 8010264 pipe->Size = PIPE_BUF; 800a390: 34 01 02 00 mvi r1,512 800a394: 59 61 00 04 sw (r11+4),r1 pipe->Buffer = malloc(pipe->Size); 800a398: fb ff e6 36 calli 8003c70 800a39c: 59 61 00 00 sw (r11+0),r1 if (! pipe->Buffer) 800a3a0: 44 20 00 44 be r1,r0,800a4b0 <== NEVER TAKEN goto err_buf; err = -ENOMEM; if (rtems_barrier_create( rtems_build_name ('P', 'I', 'r', c), 800a3a4: 78 0d 08 02 mvhi r13,0x802 if (! pipe->Buffer) goto err_buf; err = -ENOMEM; if (rtems_barrier_create( 800a3a8: 78 03 08 02 mvhi r3,0x802 800a3ac: 38 63 21 74 ori r3,r3,0x2174 rtems_build_name ('P', 'I', 'r', c), 800a3b0: 39 ad 31 28 ori r13,r13,0x3128 800a3b4: 41 a2 00 00 lbu r2,(r13+0) if (! pipe->Buffer) goto err_buf; err = -ENOMEM; if (rtems_barrier_create( 800a3b8: 28 61 00 00 lw r1,(r3+0) 800a3bc: 35 64 00 2c addi r4,r11,44 800a3c0: 34 03 00 00 mvi r3,0 800a3c4: b8 41 08 00 or r1,r2,r1 800a3c8: 34 02 00 00 mvi r2,0 800a3cc: f8 00 07 22 calli 800c054 800a3d0: 5c 20 00 36 bne r1,r0,800a4a8 rtems_build_name ('P', 'I', 'r', c), RTEMS_BARRIER_MANUAL_RELEASE, 0, &pipe->readBarrier) != RTEMS_SUCCESSFUL) goto err_rbar; if (rtems_barrier_create( 800a3d4: 78 03 08 02 mvhi r3,0x802 800a3d8: 38 63 21 78 ori r3,r3,0x2178 rtems_build_name ('P', 'I', 'w', c), 800a3dc: 41 a2 00 00 lbu r2,(r13+0) 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( 800a3e0: 28 61 00 00 lw r1,(r3+0) 800a3e4: 35 64 00 30 addi r4,r11,48 800a3e8: 34 03 00 00 mvi r3,0 800a3ec: b8 41 08 00 or r1,r2,r1 800a3f0: 34 02 00 00 mvi r2,0 800a3f4: f8 00 07 18 calli 800c054 800a3f8: 5c 20 00 2a bne r1,r0,800a4a0 rtems_build_name ('P', 'I', 'w', c), RTEMS_BARRIER_MANUAL_RELEASE, 0, &pipe->writeBarrier) != RTEMS_SUCCESSFUL) goto err_wbar; if (rtems_semaphore_create( 800a3fc: 78 03 08 02 mvhi r3,0x802 800a400: 38 63 21 7c ori r3,r3,0x217c rtems_build_name ('P', 'I', 's', c), 1, 800a404: 41 a2 00 00 lbu r2,(r13+0) 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( 800a408: 28 61 00 00 lw r1,(r3+0) 800a40c: 34 04 00 00 mvi r4,0 800a410: 34 03 00 10 mvi r3,16 800a414: b8 41 08 00 or r1,r2,r1 800a418: 35 65 00 28 addi r5,r11,40 800a41c: 34 02 00 01 mvi r2,1 800a420: fb ff ea 8f calli 8004e5c 800a424: 5c 20 00 1d bne r1,r0,800a498 Objects_Id id, Objects_Locations *location ) { return (Barrier_Control *) _Objects_Get( &_Barrier_Information, id, location ); 800a428: 29 62 00 2c lw r2,(r11+44) 800a42c: 78 10 08 02 mvhi r16,0x802 800a430: 3a 10 41 70 ori r16,r16,0x4170 /* 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 800a434: 37 92 00 28 addi r18,sp,40 800a438: ba 40 18 00 mv r3,r18 800a43c: ba 00 08 00 mv r1,r16 800a440: fb ff f1 b5 calli 8006b14 <_Objects_Get> |= STATES_INTERRUPTIBLE_BY_SIGNAL; 800a444: 28 22 00 4c lw r2,(r1+76) 800a448: 78 11 10 00 mvhi r17,0x1000 800a44c: b8 51 10 00 or r2,r2,r17 800a450: 58 22 00 4c sw (r1+76),r2 _Thread_Enable_dispatch(); 800a454: fb ff f4 e3 calli 80077e0 <_Thread_Enable_dispatch> 800a458: 29 62 00 30 lw r2,(r11+48) 800a45c: ba 40 18 00 mv r3,r18 800a460: ba 00 08 00 mv r1,r16 800a464: fb ff f1 ac calli 8006b14 <_Objects_Get> _Barrier_Get(pipe->writeBarrier, &location)->Barrier.Wait_queue.state |= STATES_INTERRUPTIBLE_BY_SIGNAL; 800a468: 28 22 00 4c lw r2,(r1+76) 800a46c: b8 51 88 00 or r17,r2,r17 800a470: 58 31 00 4c sw (r1+76),r17 _Thread_Enable_dispatch(); 800a474: fb ff f4 db calli 80077e0 <_Thread_Enable_dispatch> #ifdef RTEMS_POSIX_API pipe_interruptible(pipe); #endif *pipep = pipe; if (c ++ == 'z') 800a478: 41 a1 00 00 lbu r1,(r13+0) 800a47c: 34 22 00 01 addi r2,r1,1 800a480: 31 a2 00 00 sb (r13+0),r2 800a484: 34 02 00 7a mvi r2,122 800a488: 5c 22 00 0e bne r1,r2,800a4c0 c = 'a'; 800a48c: 34 01 00 61 mvi r1,97 800a490: 31 a1 00 00 sb (r13+0),r1 800a494: e0 00 00 0b bi 800a4c0 return 0; err_sem: rtems_barrier_delete(pipe->writeBarrier); 800a498: 29 61 00 30 lw r1,(r11+48) 800a49c: f8 00 07 2a calli 800c144 err_wbar: rtems_barrier_delete(pipe->readBarrier); 800a4a0: 2a 01 00 2c lw r1,(r16+44) 800a4a4: f8 00 07 28 calli 800c144 err_rbar: free(pipe->Buffer); 800a4a8: 2a 01 00 00 lw r1,(r16+0) 800a4ac: fb ff e3 a8 calli 800334c err_buf: free(pipe); 800a4b0: ba 00 08 00 mv r1,r16 800a4b4: fb ff e3 a6 calli 800334c if (err) goto out; } if (! PIPE_LOCK(pipe)) err = -EINTR; 800a4b8: 34 0c ff f4 mvi r12,-12 800a4bc: e0 00 00 0e bi 800a4f4 err = pipe_alloc(&pipe); if (err) goto out; } if (! PIPE_LOCK(pipe)) 800a4c0: 29 61 00 28 lw r1,(r11+40) 800a4c4: 34 02 00 00 mvi r2,0 800a4c8: 34 03 00 00 mvi r3,0 800a4cc: fb ff eb 10 calli 800510c 800a4d0: 44 20 00 02 be r1,r0,800a4d8 <== ALWAYS TAKEN err = -EINTR; 800a4d4: 34 0c ff fc mvi r12,-4 <== NOT EXECUTED if (*pipep == NULL) { 800a4d8: 29 e1 00 00 lw r1,(r15+0) 800a4dc: 5c 20 00 06 bne r1,r0,800a4f4 if (err) 800a4e0: 45 81 00 04 be r12,r1,800a4f0 <== ALWAYS TAKEN pipe_free(pipe); 800a4e4: b9 60 08 00 mv r1,r11 <== NOT EXECUTED 800a4e8: fb ff ff 2b calli 800a194 <== NOT EXECUTED 800a4ec: e0 00 00 02 bi 800a4f4 <== NOT EXECUTED else *pipep = pipe; 800a4f0: 59 eb 00 00 sw (r15+0),r11 } out: pipe_unlock(); 800a4f4: fb ff ff 1f calli 800a170 pipe_control_t *pipe; unsigned int prevCounter; int err; err = pipe_new(pipep); if (err) 800a4f8: 5d 80 00 67 bne r12,r0,800a694 return err; pipe = *pipep; switch (LIBIO_ACCMODE(iop)) { 800a4fc: 29 c1 00 18 lw r1,(r14+24) 800a500: 34 02 00 04 mvi r2,4 int err; err = pipe_new(pipep); if (err) return err; pipe = *pipep; 800a504: 29 eb 00 00 lw r11,(r15+0) switch (LIBIO_ACCMODE(iop)) { 800a508: 20 21 00 06 andi r1,r1,0x6 800a50c: 44 22 00 24 be r1,r2,800a59c 800a510: 34 02 00 06 mvi r2,6 800a514: 44 22 00 45 be r1,r2,800a628 800a518: 34 02 00 02 mvi r2,2 800a51c: 5c 22 00 57 bne r1,r2,800a678 <== NEVER TAKEN case LIBIO_FLAGS_READ: pipe->readerCounter ++; 800a520: 29 61 00 20 lw r1,(r11+32) 800a524: 34 21 00 01 addi r1,r1,1 800a528: 59 61 00 20 sw (r11+32),r1 if (pipe->Readers ++ == 0) 800a52c: 29 61 00 10 lw r1,(r11+16) 800a530: 34 22 00 01 addi r2,r1,1 800a534: 59 62 00 10 sw (r11+16),r2 800a538: 5c 20 00 04 bne r1,r0,800a548 <== NEVER TAKEN PIPE_WAKEUPWRITERS(pipe); 800a53c: 29 61 00 30 lw r1,(r11+48) 800a540: 37 82 00 2c addi r2,sp,44 800a544: f8 00 07 30 calli 800c204 if (pipe->Writers == 0) { 800a548: 29 61 00 14 lw r1,(r11+20) 800a54c: 5c 20 00 4b bne r1,r0,800a678 /* Not an error */ if (LIBIO_NODELAY(iop)) 800a550: 29 c2 00 18 lw r2,(r14+24) 800a554: 20 42 00 01 andi r2,r2,0x1 800a558: 5c 41 00 48 bne r2,r1,800a678 break; prevCounter = pipe->writerCounter; 800a55c: 29 70 00 24 lw r16,(r11+36) err = -EINTR; /* Wait until a writer opens the pipe */ do { PIPE_UNLOCK(pipe); 800a560: 29 61 00 28 lw r1,(r11+40) 800a564: fb ff eb 3a calli 800524c if (! PIPE_READWAIT(pipe)) 800a568: 29 61 00 2c lw r1,(r11+44) 800a56c: 34 02 00 00 mvi r2,0 800a570: f8 00 07 42 calli 800c278 800a574: b8 20 68 00 mv r13,r1 800a578: 5c 20 00 43 bne r1,r0,800a684 <== NEVER TAKEN goto out_error; if (! PIPE_LOCK(pipe)) 800a57c: 29 61 00 28 lw r1,(r11+40) 800a580: 34 02 00 00 mvi r2,0 800a584: 34 03 00 00 mvi r3,0 800a588: fb ff ea e1 calli 800510c 800a58c: 5c 2d 00 3e bne r1,r13,800a684 <== NEVER TAKEN goto out_error; } while (prevCounter == pipe->writerCounter); 800a590: 29 61 00 24 lw r1,(r11+36) 800a594: 46 01 ff f3 be r16,r1,800a560 <== NEVER TAKEN 800a598: e0 00 00 38 bi 800a678 } break; case LIBIO_FLAGS_WRITE: pipe->writerCounter ++; 800a59c: 29 61 00 24 lw r1,(r11+36) 800a5a0: 34 21 00 01 addi r1,r1,1 800a5a4: 59 61 00 24 sw (r11+36),r1 if (pipe->Writers ++ == 0) 800a5a8: 29 61 00 14 lw r1,(r11+20) 800a5ac: 34 22 00 01 addi r2,r1,1 800a5b0: 59 62 00 14 sw (r11+20),r2 800a5b4: 5c 20 00 04 bne r1,r0,800a5c4 <== NEVER TAKEN PIPE_WAKEUPREADERS(pipe); 800a5b8: 29 61 00 2c lw r1,(r11+44) 800a5bc: 37 82 00 2c addi r2,sp,44 800a5c0: f8 00 07 11 calli 800c204 if (pipe->Readers == 0 && LIBIO_NODELAY(iop)) { 800a5c4: 29 61 00 10 lw r1,(r11+16) 800a5c8: 5c 20 00 2c bne r1,r0,800a678 800a5cc: 29 c2 00 18 lw r2,(r14+24) 800a5d0: 20 42 00 01 andi r2,r2,0x1 800a5d4: 44 41 00 05 be r2,r1,800a5e8 PIPE_UNLOCK(pipe); 800a5d8: 29 61 00 28 lw r1,(r11+40) err = -ENXIO; 800a5dc: 34 0c ff fa mvi r12,-6 if (pipe->Writers ++ == 0) PIPE_WAKEUPREADERS(pipe); if (pipe->Readers == 0 && LIBIO_NODELAY(iop)) { PIPE_UNLOCK(pipe); 800a5e0: fb ff eb 1b calli 800524c err = -ENXIO; goto out_error; 800a5e4: e0 00 00 29 bi 800a688 } if (pipe->Readers == 0) { prevCounter = pipe->readerCounter; 800a5e8: 29 70 00 20 lw r16,(r11+32) err = -EINTR; do { PIPE_UNLOCK(pipe); 800a5ec: 29 61 00 28 lw r1,(r11+40) 800a5f0: fb ff eb 17 calli 800524c if (! PIPE_WRITEWAIT(pipe)) 800a5f4: 29 61 00 30 lw r1,(r11+48) 800a5f8: 34 02 00 00 mvi r2,0 800a5fc: f8 00 07 1f calli 800c278 800a600: b8 20 68 00 mv r13,r1 800a604: 5c 20 00 20 bne r1,r0,800a684 <== NEVER TAKEN goto out_error; if (! PIPE_LOCK(pipe)) 800a608: 29 61 00 28 lw r1,(r11+40) 800a60c: 34 02 00 00 mvi r2,0 800a610: 34 03 00 00 mvi r3,0 800a614: fb ff ea be calli 800510c 800a618: 5c 2d 00 1b bne r1,r13,800a684 <== NEVER TAKEN goto out_error; } while (prevCounter == pipe->readerCounter); 800a61c: 29 61 00 20 lw r1,(r11+32) 800a620: 46 01 ff f3 be r16,r1,800a5ec <== NEVER TAKEN 800a624: e0 00 00 15 bi 800a678 } break; case LIBIO_FLAGS_READ_WRITE: pipe->readerCounter ++; 800a628: 29 61 00 20 lw r1,(r11+32) 800a62c: 34 21 00 01 addi r1,r1,1 800a630: 59 61 00 20 sw (r11+32),r1 if (pipe->Readers ++ == 0) 800a634: 29 61 00 10 lw r1,(r11+16) 800a638: 34 22 00 01 addi r2,r1,1 800a63c: 59 62 00 10 sw (r11+16),r2 800a640: 5c 20 00 04 bne r1,r0,800a650 <== NEVER TAKEN PIPE_WAKEUPWRITERS(pipe); 800a644: 29 61 00 30 lw r1,(r11+48) 800a648: 37 82 00 2c addi r2,sp,44 800a64c: f8 00 06 ee calli 800c204 pipe->writerCounter ++; 800a650: 29 61 00 24 lw r1,(r11+36) 800a654: 34 21 00 01 addi r1,r1,1 800a658: 59 61 00 24 sw (r11+36),r1 if (pipe->Writers ++ == 0) 800a65c: 29 61 00 14 lw r1,(r11+20) 800a660: 34 22 00 01 addi r2,r1,1 800a664: 59 62 00 14 sw (r11+20),r2 800a668: 5c 20 00 04 bne r1,r0,800a678 <== NEVER TAKEN PIPE_WAKEUPREADERS(pipe); 800a66c: 29 61 00 2c lw r1,(r11+44) 800a670: 37 82 00 2c addi r2,sp,44 800a674: f8 00 06 e4 calli 800c204 break; } PIPE_UNLOCK(pipe); 800a678: 29 61 00 28 lw r1,(r11+40) 800a67c: fb ff ea f4 calli 800524c return 0; 800a680: e0 00 00 05 bi 800a694 goto out_error; } if (pipe->Readers == 0) { prevCounter = pipe->readerCounter; err = -EINTR; 800a684: 34 0c ff fc mvi r12,-4 <== NOT EXECUTED PIPE_UNLOCK(pipe); return 0; out_error: pipe_release(pipep, iop); 800a688: b9 e0 08 00 mv r1,r15 800a68c: b9 c0 10 00 mv r2,r14 800a690: fb ff fe d3 calli 800a1dc return err; } 800a694: b9 80 08 00 mv r1,r12 800a698: 2b 9d 00 04 lw ra,(sp+4) 800a69c: 2b 8b 00 24 lw r11,(sp+36) 800a6a0: 2b 8c 00 20 lw r12,(sp+32) 800a6a4: 2b 8d 00 1c lw r13,(sp+28) 800a6a8: 2b 8e 00 18 lw r14,(sp+24) 800a6ac: 2b 8f 00 14 lw r15,(sp+20) 800a6b0: 2b 90 00 10 lw r16,(sp+16) 800a6b4: 2b 91 00 0c lw r17,(sp+12) 800a6b8: 2b 92 00 08 lw r18,(sp+8) 800a6bc: 37 9c 00 2c addi sp,sp,44 800a6c0: c3 a0 00 00 ret =============================================================================== 080020f8 : long fpathconf( int fd, int name ) { 80020f8: 37 9c ff f0 addi sp,sp,-16 80020fc: 5b 8b 00 10 sw (sp+16),r11 8002100: 5b 8c 00 0c sw (sp+12),r12 8002104: 5b 8d 00 08 sw (sp+8),r13 8002108: 5b 9d 00 04 sw (sp+4),ra long return_value; rtems_libio_t *iop; rtems_filesystem_limits_and_options_t *the_limits; rtems_libio_check_fd(fd); 800210c: 78 03 08 01 mvhi r3,0x801 8002110: 38 63 60 10 ori r3,r3,0x6010 long fpathconf( int fd, int name ) { 8002114: b8 40 68 00 mv r13,r2 long return_value; rtems_libio_t *iop; rtems_filesystem_limits_and_options_t *the_limits; rtems_libio_check_fd(fd); 8002118: 28 62 00 00 lw r2,(r3+0) 800211c: 54 41 00 02 bgu r2,r1,8002124 8002120: e0 00 00 0a bi 8002148 iop = rtems_libio_iop(fd); 8002124: 34 02 00 06 mvi r2,6 8002128: 78 0b 08 01 mvhi r11,0x801 800212c: f8 00 46 18 calli 801398c <__ashlsi3> 8002130: 39 6b 67 6c ori r11,r11,0x676c 8002134: 29 63 00 00 lw r3,(r11+0) 8002138: b4 61 18 00 add r3,r3,r1 rtems_libio_check_is_open(iop); 800213c: 28 61 00 18 lw r1,(r3+24) 8002140: 20 22 01 00 andi r2,r1,0x100 8002144: 5c 40 00 04 bne r2,r0,8002154 <== ALWAYS TAKEN 8002148: f8 00 2d f2 calli 800d910 <__errno> 800214c: 34 02 00 09 mvi r2,9 8002150: e0 00 00 28 bi 80021f0 rtems_libio_check_permissions(iop, LIBIO_FLAGS_READ); 8002154: 20 21 00 02 andi r1,r1,0x2 8002158: 44 20 00 24 be r1,r0,80021e8 * Now process the information request. */ the_limits = &iop->pathinfo.mt_entry->pathconf_limits_and_options; switch ( name ) { 800215c: 34 01 00 0b mvi r1,11 /* * Now process the information request. */ the_limits = &iop->pathinfo.mt_entry->pathconf_limits_and_options; 8002160: 28 6b 00 2c lw r11,(r3+44) switch ( name ) { 8002164: 55 a1 00 21 bgu r13,r1,80021e8 8002168: 78 0c 08 01 mvhi r12,0x801 800216c: b9 a0 08 00 mv r1,r13 8002170: 34 02 00 02 mvi r2,2 8002174: f8 00 46 06 calli 801398c <__ashlsi3> 8002178: 39 8c 4c 10 ori r12,r12,0x4c10 800217c: b5 81 08 00 add r1,r12,r1 8002180: 28 21 00 00 lw r1,(r1+0) 8002184: c0 20 00 00 b r1 case _PC_LINK_MAX: return_value = the_limits->link_max; 8002188: 29 61 00 38 lw r1,(r11+56) break; 800218c: e0 00 00 1b bi 80021f8 case _PC_MAX_CANON: return_value = the_limits->max_canon; 8002190: 29 61 00 3c lw r1,(r11+60) break; 8002194: e0 00 00 19 bi 80021f8 case _PC_MAX_INPUT: return_value = the_limits->max_input; 8002198: 29 61 00 40 lw r1,(r11+64) break; 800219c: e0 00 00 17 bi 80021f8 case _PC_NAME_MAX: return_value = the_limits->name_max; 80021a0: 29 61 00 44 lw r1,(r11+68) break; 80021a4: e0 00 00 15 bi 80021f8 case _PC_PATH_MAX: return_value = the_limits->path_max; 80021a8: 29 61 00 48 lw r1,(r11+72) break; 80021ac: e0 00 00 13 bi 80021f8 case _PC_PIPE_BUF: return_value = the_limits->pipe_buf; 80021b0: 29 61 00 4c lw r1,(r11+76) break; 80021b4: e0 00 00 11 bi 80021f8 case _PC_CHOWN_RESTRICTED: return_value = the_limits->posix_chown_restrictions; 80021b8: 29 61 00 54 lw r1,(r11+84) break; 80021bc: e0 00 00 0f bi 80021f8 case _PC_NO_TRUNC: return_value = the_limits->posix_no_trunc; 80021c0: 29 61 00 58 lw r1,(r11+88) break; 80021c4: e0 00 00 0d bi 80021f8 case _PC_VDISABLE: return_value = the_limits->posix_vdisable; 80021c8: 29 61 00 64 lw r1,(r11+100) break; 80021cc: e0 00 00 0b bi 80021f8 case _PC_ASYNC_IO: return_value = the_limits->posix_async_io; 80021d0: 29 61 00 50 lw r1,(r11+80) break; 80021d4: e0 00 00 09 bi 80021f8 case _PC_PRIO_IO: return_value = the_limits->posix_prio_io; 80021d8: 29 61 00 5c lw r1,(r11+92) break; 80021dc: e0 00 00 07 bi 80021f8 case _PC_SYNC_IO: return_value = the_limits->posix_sync_io; 80021e0: 29 61 00 60 lw r1,(r11+96) break; 80021e4: e0 00 00 05 bi 80021f8 default: rtems_set_errno_and_return_minus_one( EINVAL ); 80021e8: f8 00 2d ca calli 800d910 <__errno> 80021ec: 34 02 00 16 mvi r2,22 80021f0: 58 22 00 00 sw (r1+0),r2 80021f4: 34 01 ff ff mvi r1,-1 break; } return return_value; } 80021f8: 2b 9d 00 04 lw ra,(sp+4) 80021fc: 2b 8b 00 10 lw r11,(sp+16) 8002200: 2b 8c 00 0c lw r12,(sp+12) 8002204: 2b 8d 00 08 lw r13,(sp+8) 8002208: 37 9c 00 10 addi sp,sp,16 800220c: c3 a0 00 00 ret =============================================================================== 080026c4 : #include void free( void *ptr ) { 80026c4: 37 9c ff f4 addi sp,sp,-12 80026c8: 5b 8b 00 0c sw (sp+12),r11 80026cc: 5b 8c 00 08 sw (sp+8),r12 80026d0: 5b 9d 00 04 sw (sp+4),ra 80026d4: b8 20 58 00 mv r11,r1 MSBUMP(free_calls, 1); 80026d8: 78 01 08 01 mvhi r1,0x801 80026dc: 38 21 98 40 ori r1,r1,0x9840 80026e0: 28 22 00 0c lw r2,(r1+12) 80026e4: 34 42 00 01 addi r2,r2,1 80026e8: 58 22 00 0c sw (r1+12),r2 if ( !ptr ) 80026ec: 45 60 00 1f be r11,r0,8002768 return; /* * Do not attempt to free memory if in a critical section or ISR. */ if ( _System_state_Is_up(_System_state_Get()) && 80026f0: 78 01 08 01 mvhi r1,0x801 80026f4: 38 21 9a d8 ori r1,r1,0x9ad8 80026f8: 28 22 00 00 lw r2,(r1+0) 80026fc: 34 01 00 03 mvi r1,3 8002700: 5c 41 00 06 bne r2,r1,8002718 <== NEVER TAKEN !malloc_is_system_state_OK() ) { 8002704: f8 00 00 80 calli 8002904 return; /* * Do not attempt to free memory if in a critical section or ISR. */ if ( _System_state_Is_up(_System_state_Get()) && 8002708: 5c 20 00 04 bne r1,r0,8002718 !malloc_is_system_state_OK() ) { malloc_deferred_free(ptr); 800270c: b9 60 08 00 mv r1,r11 8002710: f8 00 00 9d calli 8002984 return; 8002714: e0 00 00 15 bi 8002768 } /* * If configured, update the statistics */ if ( rtems_malloc_statistics_helpers ) 8002718: 78 01 08 01 mvhi r1,0x801 800271c: 38 21 96 c0 ori r1,r1,0x96c0 8002720: 28 21 00 00 lw r1,(r1+0) 8002724: 44 20 00 04 be r1,r0,8002734 (*rtems_malloc_statistics_helpers->at_free)(ptr); 8002728: 28 22 00 08 lw r2,(r1+8) 800272c: b9 60 08 00 mv r1,r11 8002730: d8 40 00 00 call r2 if ( !_Protected_heap_Free( RTEMS_Malloc_Heap, ptr ) ) { 8002734: 78 0c 08 01 mvhi r12,0x801 8002738: 39 8c 90 1c ori r12,r12,0x901c 800273c: 29 81 00 00 lw r1,(r12+0) 8002740: b9 60 10 00 mv r2,r11 8002744: f8 00 0e 0f calli 8005f80 <_Protected_heap_Free> 8002748: 5c 20 00 08 bne r1,r0,8002768 printk( "Program heap: free of bad pointer %p -- range %p - %p \n", ptr, RTEMS_Malloc_Heap->area_begin, 800274c: 29 84 00 00 lw r4,(r12+0) */ 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", 8002750: 78 01 08 01 mvhi r1,0x801 8002754: 38 21 7f 80 ori r1,r1,0x7f80 8002758: 28 83 00 18 lw r3,(r4+24) 800275c: 28 84 00 1c lw r4,(r4+28) 8002760: b9 60 10 00 mv r2,r11 8002764: f8 00 03 bb calli 8003650 RTEMS_Malloc_Heap->area_begin, RTEMS_Malloc_Heap->area_end ); } } 8002768: 2b 9d 00 04 lw ra,(sp+4) 800276c: 2b 8b 00 0c lw r11,(sp+12) 8002770: 2b 8c 00 08 lw r12,(sp+8) 8002774: 37 9c 00 0c addi sp,sp,12 8002778: c3 a0 00 00 ret =============================================================================== 08002a50 : * NOTE: this must be called with * thread dispatching disabled! */ static void free_user_env(void *venv) { 8002a50: 37 9c ff f8 addi sp,sp,-8 8002a54: 5b 8b 00 08 sw (sp+8),r11 8002a58: 5b 9d 00 04 sw (sp+4),ra 8002a5c: b8 20 58 00 mv r11,r1 rtems_user_env_t *env = (rtems_user_env_t*) venv ; if (env != &rtems_global_user_env 8002a60: 78 01 08 01 mvhi r1,0x801 8002a64: 38 21 47 90 ori r1,r1,0x4790 8002a68: 45 61 00 07 be r11,r1,8002a84 <== NEVER TAKEN #ifdef HAVE_USERENV_REFCNT && --env->refcnt <= 0 #endif ) { rtems_filesystem_freenode( &env->current_directory); 8002a6c: 35 61 00 04 addi r1,r11,4 8002a70: fb ff fb 35 calli 8001744 rtems_filesystem_freenode( &env->root_directory); 8002a74: 35 61 00 18 addi r1,r11,24 8002a78: fb ff fb 33 calli 8001744 free(env); 8002a7c: b9 60 08 00 mv r1,r11 8002a80: fb ff fb 39 calli 8001764 } } 8002a84: 2b 9d 00 04 lw ra,(sp+4) 8002a88: 2b 8b 00 08 lw r11,(sp+8) 8002a8c: 37 9c 00 08 addi sp,sp,8 8002a90: c3 a0 00 00 ret =============================================================================== 080139b0 : int getdents( int dd_fd, char *dd_buf, int dd_len ) { 80139b0: 37 9c ff dc addi sp,sp,-36 80139b4: 5b 8b 00 10 sw (sp+16),r11 80139b8: 5b 8c 00 0c sw (sp+12),r12 80139bc: 5b 8d 00 08 sw (sp+8),r13 80139c0: 5b 9d 00 04 sw (sp+4),ra rtems_filesystem_location_info_t loc; /* * Get the file control block structure associated with the file descriptor */ iop = rtems_libio_iop( dd_fd ); 80139c4: 78 04 08 01 mvhi r4,0x801 80139c8: 38 84 70 10 ori r4,r4,0x7010 int getdents( int dd_fd, char *dd_buf, int dd_len ) { 80139cc: b8 40 68 00 mv r13,r2 rtems_filesystem_location_info_t loc; /* * Get the file control block structure associated with the file descriptor */ iop = rtems_libio_iop( dd_fd ); 80139d0: 28 82 00 00 lw r2,(r4+0) int getdents( int dd_fd, char *dd_buf, int dd_len ) { 80139d4: b8 60 60 00 mv r12,r3 rtems_filesystem_location_info_t loc; /* * Get the file control block structure associated with the file descriptor */ iop = rtems_libio_iop( dd_fd ); 80139d8: 34 0b 00 00 mvi r11,0 80139dc: 50 22 00 07 bgeu r1,r2,80139f8 <== NEVER TAKEN 80139e0: 78 0b 08 01 mvhi r11,0x801 80139e4: 39 6b 78 78 ori r11,r11,0x7878 80139e8: 34 02 00 06 mvi r2,6 80139ec: fb ff b5 ca calli 8001114 <__ashlsi3> 80139f0: 29 6b 00 00 lw r11,(r11+0) 80139f4: b5 61 58 00 add r11,r11,r1 /* * Make sure we are working on a directory */ loc = iop->pathinfo; 80139f8: 29 64 00 20 lw r4,(r11+32) 80139fc: 29 61 00 28 lw r1,(r11+40) 8013a00: 29 65 00 1c lw r5,(r11+28) 8013a04: 29 62 00 2c lw r2,(r11+44) 8013a08: 29 63 00 24 lw r3,(r11+36) 8013a0c: 5b 84 00 18 sw (sp+24),r4 if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) 8013a10: 28 24 00 10 lw r4,(r1+16) iop = rtems_libio_iop( dd_fd ); /* * Make sure we are working on a directory */ loc = iop->pathinfo; 8013a14: 5b 81 00 20 sw (sp+32),r1 8013a18: 5b 82 00 24 sw (sp+36),r2 8013a1c: 5b 85 00 14 sw (sp+20),r5 8013a20: 5b 83 00 1c sw (sp+28),r3 if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) 8013a24: 37 81 00 14 addi r1,sp,20 8013a28: d8 80 00 00 call r4 8013a2c: 34 02 00 01 mvi r2,1 8013a30: 44 22 00 06 be r1,r2,8013a48 rtems_set_errno_and_return_minus_one( ENOTDIR ); 8013a34: fb ff e6 bc calli 800d524 <__errno> 8013a38: 34 02 00 14 mvi r2,20 8013a3c: 58 22 00 00 sw (r1+0),r2 8013a40: 34 01 ff ff mvi r1,-1 8013a44: e0 00 00 07 bi 8013a60 /* * 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 ); 8013a48: 29 61 00 24 lw r1,(r11+36) 8013a4c: b9 a0 10 00 mv r2,r13 8013a50: b9 80 18 00 mv r3,r12 8013a54: 28 24 00 08 lw r4,(r1+8) 8013a58: b9 60 08 00 mv r1,r11 8013a5c: d8 80 00 00 call r4 } 8013a60: 2b 9d 00 04 lw ra,(sp+4) 8013a64: 2b 8b 00 10 lw r11,(sp+16) 8013a68: 2b 8c 00 0c lw r12,(sp+12) 8013a6c: 2b 8d 00 08 lw r13,(sp+8) 8013a70: 37 9c 00 24 addi sp,sp,36 8013a74: c3 a0 00 00 ret =============================================================================== 08010558 : 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 ) 8010558: 28 22 00 1c lw r2,(r1+28) 801055c: 34 03 00 01 mvi r3,1 8010560: 28 44 00 4c lw r4,(r2+76) return -1; /* It wasn't a directory --> return error */ 8010564: 34 02 ff ff mvi r2,-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 ) 8010568: 5c 83 00 04 bne r4,r3,8010578 <== NEVER TAKEN return -1; /* It wasn't a directory --> return error */ iop->offset = 0; 801056c: 58 20 00 10 sw (r1+16),r0 8010570: 58 20 00 14 sw (r1+20),r0 return 0; 8010574: 34 02 00 00 mvi r2,0 } 8010578: b8 40 08 00 mv r1,r2 801057c: c3 a0 00 00 ret =============================================================================== 080107b4 : int imfs_dir_rmnod( rtems_filesystem_location_info_t *parent_pathloc, /* IN */ rtems_filesystem_location_info_t *pathloc /* IN */ ) { 80107b4: 37 9c ff f8 addi sp,sp,-8 80107b8: 5b 8b 00 08 sw (sp+8),r11 80107bc: 5b 9d 00 04 sw (sp+4),ra IMFS_jnode_t *the_jnode; the_jnode = (IMFS_jnode_t *) pathloc->node_access; 80107c0: 28 4b 00 00 lw r11,(r2+0) /* * You cannot remove a node that still has children */ if ( ! rtems_chain_is_empty( &the_jnode->info.directory.Entries ) ) 80107c4: 29 63 00 50 lw r3,(r11+80) RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); 80107c8: 35 61 00 54 addi r1,r11,84 80107cc: 44 61 00 04 be r3,r1,80107dc rtems_set_errno_and_return_minus_one( ENOTEMPTY ); 80107d0: f8 00 03 33 calli 801149c <__errno> 80107d4: 34 02 00 5a mvi r2,90 80107d8: e0 00 00 06 bi 80107f0 /* * You cannot remove the file system root node. */ if ( pathloc->mt_entry->mt_fs_root.node_access == pathloc->node_access ) 80107dc: 28 41 00 10 lw r1,(r2+16) 80107e0: 28 21 00 1c lw r1,(r1+28) 80107e4: 5c 2b 00 06 bne r1,r11,80107fc rtems_set_errno_and_return_minus_one( EBUSY ); 80107e8: f8 00 03 2d calli 801149c <__errno> 80107ec: 34 02 00 10 mvi r2,16 80107f0: 58 22 00 00 sw (r1+0),r2 80107f4: 34 01 ff ff mvi r1,-1 80107f8: e0 00 00 08 bi 8010818 /* * You cannot remove a mountpoint. */ if ( the_jnode->info.directory.mt_fs != NULL ) 80107fc: 29 61 00 5c lw r1,(r11+92) 8010800: 5c 20 ff fa bne r1,r0,80107e8 <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EBUSY ); IMFS_create_orphan( the_jnode ); 8010804: b9 60 08 00 mv r1,r11 8010808: fb ff ee 7c calli 800c1f8 IMFS_check_node_remove( the_jnode ); 801080c: b9 60 08 00 mv r1,r11 8010810: fb ff ee 8e calli 800c248 return 0; 8010814: 34 01 00 00 mvi r1,0 } 8010818: 2b 9d 00 04 lw ra,(sp+4) 801081c: 2b 8b 00 08 lw r11,(sp+8) 8010820: 37 9c 00 08 addi sp,sp,8 8010824: c3 a0 00 00 ret =============================================================================== 08002054 : /* * Initialize useable but dummy databases */ void init_etc_passwd_group(void) { 8002054: 37 9c ff f0 addi sp,sp,-16 8002058: 5b 8b 00 10 sw (sp+16),r11 800205c: 5b 8c 00 0c sw (sp+12),r12 8002060: 5b 8d 00 08 sw (sp+8),r13 8002064: 5b 9d 00 04 sw (sp+4),ra FILE *fp; static char etc_passwd_initted = 0; if (etc_passwd_initted) 8002068: 78 01 08 01 mvhi r1,0x801 800206c: 38 21 68 b8 ori r1,r1,0x68b8 8002070: 40 2d 00 00 lbu r13,(r1+0) 8002074: 5d a0 00 2f bne r13,r0,8002130 return; etc_passwd_initted = 1; 8002078: 34 02 00 01 mvi r2,1 800207c: 30 22 00 00 sb (r1+0),r2 mkdir("/etc", 0777); 8002080: 78 01 08 01 mvhi r1,0x801 8002084: 34 02 01 ff mvi r2,511 8002088: 38 21 4b 40 ori r1,r1,0x4b40 800208c: f8 00 02 9d calli 8002b00 /* * Initialize /etc/passwd */ if ((fp = fopen("/etc/passwd", "r")) != NULL) { 8002090: 78 0b 08 01 mvhi r11,0x801 8002094: 39 6b 4b 48 ori r11,r11,0x4b48 8002098: 78 02 08 01 mvhi r2,0x801 800209c: b9 60 08 00 mv r1,r11 80020a0: 38 42 4b 54 ori r2,r2,0x4b54 80020a4: f8 00 30 55 calli 800e1f8 80020a8: b8 20 60 00 mv r12,r1 80020ac: 5c 2d 00 0c bne r1,r13,80020dc fclose(fp); } else if ((fp = fopen("/etc/passwd", "w")) != NULL) { 80020b0: 78 02 08 01 mvhi r2,0x801 80020b4: b9 60 08 00 mv r1,r11 80020b8: 38 42 4b 58 ori r2,r2,0x4b58 80020bc: f8 00 30 4f calli 800e1f8 80020c0: b8 20 58 00 mv r11,r1 80020c4: 44 2c 00 07 be r1,r12,80020e0 <== NEVER TAKEN fprintf(fp, "root:*:0:0:root::/:/bin/sh\n" 80020c8: 78 01 08 01 mvhi r1,0x801 80020cc: 38 21 4b 5c ori r1,r1,0x4b5c 80020d0: b9 60 10 00 mv r2,r11 80020d4: f8 00 30 80 calli 800e2d4 "rtems:*:1:1:RTEMS Application::/:/bin/sh\n" "tty:!:2:2:tty owner::/:/bin/false\n" ); fclose(fp); 80020d8: b9 60 08 00 mv r1,r11 80020dc: f8 00 2e 18 calli 800d93c } /* * Initialize /etc/group */ if ((fp = fopen("/etc/group", "r")) != NULL) { 80020e0: 78 0b 08 01 mvhi r11,0x801 80020e4: 39 6b 4b c4 ori r11,r11,0x4bc4 80020e8: 78 02 08 01 mvhi r2,0x801 80020ec: b9 60 08 00 mv r1,r11 80020f0: 38 42 4b 54 ori r2,r2,0x4b54 80020f4: f8 00 30 41 calli 800e1f8 80020f8: b8 20 60 00 mv r12,r1 80020fc: 5c 20 00 0c bne r1,r0,800212c fclose(fp); } else if ((fp = fopen("/etc/group", "w")) != NULL) { 8002100: 78 02 08 01 mvhi r2,0x801 8002104: b9 60 08 00 mv r1,r11 8002108: 38 42 4b 58 ori r2,r2,0x4b58 800210c: f8 00 30 3b calli 800e1f8 8002110: b8 20 58 00 mv r11,r1 8002114: 44 2c 00 07 be r1,r12,8002130 <== NEVER TAKEN fprintf( fp, "root:x:0:root\n" 8002118: 78 01 08 01 mvhi r1,0x801 800211c: 38 21 4b d0 ori r1,r1,0x4bd0 8002120: b9 60 10 00 mv r2,r11 8002124: f8 00 30 6c calli 800e2d4 "rtems:x:1:rtems\n" "tty:x:2:tty\n" ); fclose(fp); 8002128: b9 60 08 00 mv r1,r11 800212c: f8 00 2e 04 calli 800d93c } } 8002130: 2b 9d 00 04 lw ra,(sp+4) 8002134: 2b 8b 00 10 lw r11,(sp+16) 8002138: 2b 8c 00 0c lw r12,(sp+12) 800213c: 2b 8d 00 08 lw r13,(sp+8) 8002140: 37 9c 00 10 addi sp,sp,16 8002144: c3 a0 00 00 ret =============================================================================== 080058f0 : /* * Process a single input character */ static int iproc (unsigned char c, struct rtems_termios_tty *tty) { 80058f0: 37 9c ff f4 addi sp,sp,-12 80058f4: 5b 8b 00 0c sw (sp+12),r11 80058f8: 5b 8c 00 08 sw (sp+8),r12 80058fc: 5b 9d 00 04 sw (sp+4),ra 8005900: b8 40 58 00 mv r11,r2 if (tty->termios.c_iflag & ISTRIP) 8005904: 28 42 00 30 lw r2,(r2+48) /* * Process a single input character */ static int iproc (unsigned char c, struct rtems_termios_tty *tty) { 8005908: b8 20 60 00 mv r12,r1 if (tty->termios.c_iflag & ISTRIP) 800590c: 20 41 00 20 andi r1,r2,0x20 8005910: 44 20 00 02 be r1,r0,8005918 <== ALWAYS TAKEN c &= 0x7f; 8005914: 21 8c 00 7f andi r12,r12,0x7f <== NOT EXECUTED if (tty->termios.c_iflag & IUCLC) 8005918: 20 41 02 00 andi r1,r2,0x200 800591c: 44 20 00 0b be r1,r0,8005948 c = tolower (c); 8005920: 78 01 08 02 mvhi r1,0x802 8005924: 38 21 34 14 ori r1,r1,0x3414 8005928: 28 21 00 00 lw r1,(r1+0) 800592c: b4 2c 08 00 add r1,r1,r12 8005930: 40 23 00 01 lbu r3,(r1+1) 8005934: 34 01 00 01 mvi r1,1 8005938: 20 63 00 03 andi r3,r3,0x3 800593c: 5c 61 00 02 bne r3,r1,8005944 8005940: 35 8c 00 20 addi r12,r12,32 8005944: 21 8c 00 ff andi r12,r12,0xff if (c == '\r') { 8005948: 34 01 00 0d mvi r1,13 800594c: 5d 81 00 08 bne r12,r1,800596c if (tty->termios.c_iflag & IGNCR) 8005950: 20 43 00 80 andi r3,r2,0x80 return 0; 8005954: 34 01 00 00 mvi r1,0 if (tty->termios.c_iflag & IUCLC) c = tolower (c); if (c == '\r') { if (tty->termios.c_iflag & IGNCR) 8005958: 5c 60 00 4e bne r3,r0,8005a90 <== NEVER TAKEN return 0; if (tty->termios.c_iflag & ICRNL) 800595c: 20 42 01 00 andi r2,r2,0x100 8005960: 44 43 00 0a be r2,r3,8005988 <== NEVER TAKEN c = '\n'; 8005964: 34 0c 00 0a mvi r12,10 8005968: e0 00 00 08 bi 8005988 } else if ((c == '\n') && (tty->termios.c_iflag & INLCR)) { 800596c: 34 01 00 0a mvi r1,10 8005970: 5d 81 00 05 bne r12,r1,8005984 8005974: 20 42 00 40 andi r2,r2,0x40 8005978: 44 40 00 04 be r2,r0,8005988 <== ALWAYS TAKEN c = '\r'; 800597c: 34 0c 00 0d mvi r12,13 <== NOT EXECUTED 8005980: e0 00 00 02 bi 8005988 <== NOT EXECUTED } if ((c != '\0') && (tty->termios.c_lflag & ICANON)) { 8005984: 45 80 00 2f be r12,r0,8005a40 <== NEVER TAKEN 8005988: 29 62 00 3c lw r2,(r11+60) 800598c: 20 41 00 02 andi r1,r2,0x2 8005990: 44 20 00 2c be r1,r0,8005a40 if (c == tty->termios.c_cc[VERASE]) { 8005994: 41 61 00 43 lbu r1,(r11+67) 8005998: 5c 2c 00 04 bne r1,r12,80059a8 erase (tty, 0); 800599c: b9 60 08 00 mv r1,r11 80059a0: 34 02 00 00 mvi r2,0 80059a4: e0 00 00 05 bi 80059b8 return 0; } else if (c == tty->termios.c_cc[VKILL]) { 80059a8: 41 61 00 44 lbu r1,(r11+68) 80059ac: 5c 2c 00 05 bne r1,r12,80059c0 erase (tty, 1); 80059b0: b9 60 08 00 mv r1,r11 80059b4: 34 02 00 01 mvi r2,1 80059b8: fb ff ff 4c calli 80056e8 80059bc: e0 00 00 34 bi 8005a8c return 0; } else if (c == tty->termios.c_cc[VEOF]) { 80059c0: 41 63 00 45 lbu r3,(r11+69) return 1; 80059c4: 34 01 00 01 mvi r1,1 } else if (c == tty->termios.c_cc[VKILL]) { erase (tty, 1); return 0; } else if (c == tty->termios.c_cc[VEOF]) { 80059c8: 44 6c 00 32 be r3,r12,8005a90 <== NEVER TAKEN return 1; } else if (c == '\n') { 80059cc: 34 01 00 0a mvi r1,10 80059d0: 5d 81 00 0b bne r12,r1,80059fc if (tty->termios.c_lflag & (ECHO | ECHONL)) 80059d4: 20 42 00 48 andi r2,r2,0x48 80059d8: 44 40 00 03 be r2,r0,80059e4 <== NEVER TAKEN echo (c, tty); 80059dc: b9 60 10 00 mv r2,r11 80059e0: fb ff ff 1d calli 8005654 tty->cbuf[tty->ccount++] = c; 80059e4: 29 61 00 20 lw r1,(r11+32) 80059e8: 29 62 00 1c lw r2,(r11+28) 80059ec: 34 03 00 0a mvi r3,10 80059f0: b4 41 10 00 add r2,r2,r1 80059f4: 30 43 00 00 sb (r2+0),r3 80059f8: e0 00 00 0e bi 8005a30 return 1; } else if ((c == tty->termios.c_cc[VEOL]) || 80059fc: 41 61 00 4c lbu r1,(r11+76) 8005a00: 44 2c 00 03 be r1,r12,8005a0c <== NEVER TAKEN 8005a04: 41 61 00 51 lbu r1,(r11+81) 8005a08: 5c 2c 00 0e bne r1,r12,8005a40 <== ALWAYS TAKEN (c == tty->termios.c_cc[VEOL2])) { if (tty->termios.c_lflag & ECHO) 8005a0c: 20 42 00 08 andi r2,r2,0x8 <== NOT EXECUTED 8005a10: 44 40 00 04 be r2,r0,8005a20 <== NOT EXECUTED echo (c, tty); 8005a14: b9 80 08 00 mv r1,r12 <== NOT EXECUTED 8005a18: b9 60 10 00 mv r2,r11 <== NOT EXECUTED 8005a1c: fb ff ff 0e calli 8005654 <== NOT EXECUTED tty->cbuf[tty->ccount++] = c; 8005a20: 29 61 00 20 lw r1,(r11+32) <== NOT EXECUTED 8005a24: 29 62 00 1c lw r2,(r11+28) <== NOT EXECUTED 8005a28: b4 41 10 00 add r2,r2,r1 <== NOT EXECUTED 8005a2c: 30 4c 00 00 sb (r2+0),r12 <== NOT EXECUTED 8005a30: 34 21 00 01 addi r1,r1,1 8005a34: 59 61 00 20 sw (r11+32),r1 return 1; 8005a38: 34 01 00 01 mvi r1,1 8005a3c: e0 00 00 15 bi 8005a90 } /* * FIXME: Should do IMAXBEL handling somehow */ if (tty->ccount < (CBUFSIZE-1)) { 8005a40: 78 01 08 02 mvhi r1,0x802 8005a44: 38 21 33 40 ori r1,r1,0x3340 8005a48: 28 22 00 00 lw r2,(r1+0) 8005a4c: 29 63 00 20 lw r3,(r11+32) if (tty->termios.c_lflag & ECHO) echo (c, tty); tty->cbuf[tty->ccount++] = c; } return 0; 8005a50: 34 01 00 00 mvi r1,0 } /* * FIXME: Should do IMAXBEL handling somehow */ if (tty->ccount < (CBUFSIZE-1)) { 8005a54: 34 42 ff ff addi r2,r2,-1 8005a58: 4c 62 00 0e bge r3,r2,8005a90 <== NEVER TAKEN if (tty->termios.c_lflag & ECHO) 8005a5c: 29 61 00 3c lw r1,(r11+60) 8005a60: 20 21 00 08 andi r1,r1,0x8 8005a64: 44 20 00 04 be r1,r0,8005a74 <== NEVER TAKEN echo (c, tty); 8005a68: b9 80 08 00 mv r1,r12 8005a6c: b9 60 10 00 mv r2,r11 8005a70: fb ff fe f9 calli 8005654 tty->cbuf[tty->ccount++] = c; 8005a74: 29 61 00 20 lw r1,(r11+32) 8005a78: 29 62 00 1c lw r2,(r11+28) 8005a7c: b4 41 10 00 add r2,r2,r1 8005a80: 30 4c 00 00 sb (r2+0),r12 8005a84: 34 21 00 01 addi r1,r1,1 8005a88: 59 61 00 20 sw (r11+32),r1 } return 0; 8005a8c: 34 01 00 00 mvi r1,0 } 8005a90: 2b 9d 00 04 lw ra,(sp+4) 8005a94: 2b 8b 00 0c lw r11,(sp+12) 8005a98: 2b 8c 00 08 lw r12,(sp+8) 8005a9c: 37 9c 00 0c addi sp,sp,12 8005aa0: c3 a0 00 00 ret =============================================================================== 08025c60 : int killinfo( pid_t pid, int sig, const union sigval *value ) { 8025c60: 37 9c ff dc addi sp,sp,-36 8025c64: 5b 8b 00 18 sw (sp+24),r11 8025c68: 5b 8c 00 14 sw (sp+20),r12 8025c6c: 5b 8d 00 10 sw (sp+16),r13 8025c70: 5b 8e 00 0c sw (sp+12),r14 8025c74: 5b 8f 00 08 sw (sp+8),r15 8025c78: 5b 9d 00 04 sw (sp+4),ra 8025c7c: b8 20 60 00 mv r12,r1 8025c80: b8 40 58 00 mv r11,r2 8025c84: b8 60 68 00 mv r13,r3 POSIX_signals_Siginfo_node *psiginfo; /* * Only supported for the "calling process" (i.e. this node). */ if ( pid != getpid() ) 8025c88: fb ff fe e8 calli 8025828 8025c8c: 45 81 00 04 be r12,r1,8025c9c rtems_set_errno_and_return_minus_one( ESRCH ); 8025c90: fb ff b4 ea calli 8013038 <__errno> 8025c94: 34 02 00 03 mvi r2,3 8025c98: e0 00 00 04 bi 8025ca8 /* * Validate the signal passed. */ if ( !sig ) 8025c9c: 5d 60 00 06 bne r11,r0,8025cb4 rtems_set_errno_and_return_minus_one( EINVAL ); 8025ca0: fb ff b4 e6 calli 8013038 <__errno> 8025ca4: 34 02 00 16 mvi r2,22 8025ca8: 58 22 00 00 sw (r1+0),r2 8025cac: 34 01 ff ff mvi r1,-1 8025cb0: e0 00 00 9f bi 8025f2c static inline bool is_valid_signo( int signo ) { return ((signo) >= 1 && (signo) <= 32 ); 8025cb4: 35 6f ff ff addi r15,r11,-1 if ( !is_valid_signo(sig) ) 8025cb8: 34 01 00 1f mvi r1,31 8025cbc: 50 2f 00 02 bgeu r1,r15,8025cc4 8025cc0: e3 ff ff f8 bi 8025ca0 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 ) 8025cc4: 34 02 00 01 mvi r2,1 8025cc8: b9 60 08 00 mv r1,r11 8025ccc: fb ff 70 76 calli 8001ea4 <__ashlsi3> 8025cd0: 34 02 00 02 mvi r2,2 8025cd4: 78 0c 08 02 mvhi r12,0x802 8025cd8: b4 2b 08 00 add r1,r1,r11 8025cdc: fb ff 70 72 calli 8001ea4 <__ashlsi3> 8025ce0: 39 8c 9f 68 ori r12,r12,0x9f68 8025ce4: b5 81 08 00 add r1,r12,r1 8025ce8: 28 22 00 08 lw r2,(r1+8) 8025cec: 34 0e 00 01 mvi r14,1 return 0; 8025cf0: 34 01 00 00 mvi r1,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 ) 8025cf4: 44 4e 00 8e be r2,r14,8025f2c /* * 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 ) ) 8025cf8: 65 62 00 04 cmpei r2,r11,4 8025cfc: 65 61 00 08 cmpei r1,r11,8 8025d00: b8 41 08 00 or r1,r2,r1 8025d04: 5c 20 00 03 bne r1,r0,8025d10 8025d08: 34 01 00 0b mvi r1,11 8025d0c: 5d 61 00 05 bne r11,r1,8025d20 return pthread_kill( pthread_self(), sig ); 8025d10: f8 00 01 3a calli 80261f8 8025d14: b9 60 10 00 mv r2,r11 8025d18: f8 00 00 f3 calli 80260e4 8025d1c: e0 00 00 84 bi 8025f2c static inline sigset_t signo_to_mask( uint32_t sig ) { return 1u << (sig - 1); 8025d20: 34 01 00 01 mvi r1,1 8025d24: b9 e0 10 00 mv r2,r15 8025d28: fb ff 70 5f calli 8001ea4 <__ashlsi3> /* * Build up a siginfo structure */ siginfo = &siginfo_struct; siginfo->si_signo = sig; 8025d2c: 5b 8b 00 1c sw (sp+28),r11 siginfo->si_code = SI_USER; 8025d30: 5b 8e 00 20 sw (sp+32),r14 8025d34: b8 20 60 00 mv r12,r1 if ( !value ) { 8025d38: 5d a0 00 03 bne r13,r0,8025d44 siginfo->si_value.sival_int = 0; 8025d3c: 5b 80 00 24 sw (sp+36),r0 8025d40: e0 00 00 03 bi 8025d4c } else { siginfo->si_value = *value; 8025d44: 29 a1 00 00 lw r1,(r13+0) 8025d48: 5b 81 00 24 sw (sp+36),r1 8025d4c: 78 01 08 02 mvhi r1,0x802 8025d50: 38 21 9a 50 ori r1,r1,0x9a50 8025d54: 28 22 00 00 lw r2,(r1+0) 8025d58: 34 42 00 01 addi r2,r2,1 8025d5c: 58 22 00 00 sw (r1+0),r2 /* * 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; 8025d60: 78 01 08 02 mvhi r1,0x802 8025d64: 38 21 9f 1c ori r1,r1,0x9f1c 8025d68: 28 23 00 0c lw r3,(r1+12) api = the_thread->API_Extensions[ THREAD_API_POSIX ]; if ( _POSIX_signals_Is_interested( api, mask ) ) { 8025d6c: 28 61 01 20 lw r1,(r3+288) 8025d70: 28 21 00 d0 lw r1,(r1+208) 8025d74: a4 20 08 00 not r1,r1 8025d78: a1 81 08 00 and r1,r12,r1 8025d7c: 5c 20 00 3f bne r1,r0,8025e78 } DEBUG_STEP("\n"); _Thread_Enable_dispatch(); return 0; } 8025d80: 78 01 08 02 mvhi r1,0x802 8025d84: 38 21 a0 f4 ori r1,r1,0xa0f4 8025d88: 28 22 00 00 lw r2,(r1+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 ); 8025d8c: 78 01 08 02 mvhi r1,0x802 8025d90: 38 21 a0 f8 ori r1,r1,0xa0f8 8025d94: e0 00 00 0b bi 8025dc0 #endif /* * Is this thread is actually blocked waiting for the signal? */ if (the_thread->Wait.option & mask) 8025d98: 28 44 00 30 lw r4,(r2+48) 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; 8025d9c: b8 40 18 00 mv r3,r2 api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 8025da0: 28 45 01 20 lw r5,(r2+288) #endif /* * Is this thread is actually blocked waiting for the signal? */ if (the_thread->Wait.option & mask) 8025da4: a1 84 20 00 and r4,r12,r4 8025da8: 5c 80 00 34 bne r4,r0,8025e78 /* * Is this thread is blocked waiting for another signal but has * not blocked this one? */ if (~api->signals_blocked & mask) 8025dac: 28 a5 00 d0 lw r5,(r5+208) 8025db0: a4 a0 28 00 not r5,r5 8025db4: a1 85 28 00 and r5,r12,r5 8025db8: 5c a4 00 30 bne r5,r4,8025e78 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 ) { 8025dbc: 28 42 00 00 lw r2,(r2+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 ); 8025dc0: 5c 41 ff f6 bne r2,r1,8025d98 * NOTES: * * + rtems internal threads do not receive signals. */ interested = NULL; interested_priority = PRIORITY_MAXIMUM + 1; 8025dc4: 78 01 08 02 mvhi r1,0x802 8025dc8: 38 21 90 c0 ori r1,r1,0x90c0 8025dcc: 40 21 00 00 lbu r1,(r1+0) */ #define _POSIX_signals_Is_interested( _api, _mask ) \ ( ~(_api)->signals_blocked & (_mask) ) int killinfo( 8025dd0: 78 02 08 02 mvhi r2,0x802 * NOTES: * * + rtems internal threads do not receive signals. */ interested = NULL; interested_priority = PRIORITY_MAXIMUM + 1; 8025dd4: 78 04 08 02 mvhi r4,0x802 */ #define _POSIX_signals_Is_interested( _api, _mask ) \ ( ~(_api)->signals_blocked & (_mask) ) int killinfo( 8025dd8: 38 42 99 ec ori r2,r2,0x99ec * NOTES: * * + rtems internal threads do not receive signals. */ interested = NULL; interested_priority = PRIORITY_MAXIMUM + 1; 8025ddc: 34 21 00 01 addi r1,r1,1 8025de0: 38 84 99 f4 ori r4,r4,0x99f4 */ #define _POSIX_signals_Is_interested( _api, _mask ) \ ( ~(_api)->signals_blocked & (_mask) ) int killinfo( 8025de4: 34 4d 00 10 addi r13,r2,16 * * NOTES: * * + rtems internal threads do not receive signals. */ interested = NULL; 8025de8: 34 03 00 00 mvi r3,0 */ RTEMS_INLINE_ROUTINE bool _States_Is_interruptible_by_signal ( States_Control the_states ) { return (the_states & STATES_INTERRUPTIBLE_BY_SIGNAL); 8025dec: 78 08 10 00 mvhi r8,0x1000 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 ] ) 8025df0: 28 85 00 00 lw r5,(r4+0) 8025df4: 44 a0 00 1e be r5,r0,8025e6c <== NEVER TAKEN continue; the_info = _Objects_Information_table[ the_api ][ 1 ]; 8025df8: 28 a5 00 04 lw r5,(r5+4) #endif maximum = the_info->maximum; object_table = the_info->local_table; for ( index = 1 ; index <= maximum ; index++ ) { 8025dfc: 34 06 00 01 mvi r6,1 */ if ( !the_info ) continue; #endif maximum = the_info->maximum; 8025e00: 2c ae 00 10 lhu r14,(r5+16) 8025e04: 28 a7 00 1c lw r7,(r5+28) object_table = the_info->local_table; for ( index = 1 ; index <= maximum ; index++ ) { 8025e08: e0 00 00 18 bi 8025e68 the_thread = (Thread_Control *) object_table[ index ]; 8025e0c: 28 e2 00 04 lw r2,(r7+4) if ( !the_thread ) 8025e10: 44 40 00 14 be r2,r0,8025e60 /* * If this thread is of lower priority than the interested thread, * go on to the next thread. */ if ( the_thread->current_priority > interested_priority ) 8025e14: 28 45 00 14 lw r5,(r2+20) 8025e18: 54 a1 00 12 bgu r5,r1,8025e60 #if defined(RTEMS_DEBUG) if ( !api ) continue; #endif if ( !_POSIX_signals_Is_interested( api, mask ) ) 8025e1c: 28 49 01 20 lw r9,(r2+288) 8025e20: 29 29 00 d0 lw r9,(r9+208) 8025e24: a5 20 48 00 not r9,r9 8025e28: a1 89 48 00 and r9,r12,r9 8025e2c: 45 20 00 0d be r9,r0,8025e60 * * 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 ) { 8025e30: 54 25 00 0a bgu r1,r5,8025e58 * and blocking interruptibutable by signal. * * If the interested thread is ready, don't think about changing. */ if ( interested && !_States_Is_ready( interested->current_state ) ) { 8025e34: 44 60 00 0b be r3,r0,8025e60 <== NEVER TAKEN 8025e38: 28 69 00 10 lw r9,(r3+16) 8025e3c: 45 20 00 09 be r9,r0,8025e60 <== NEVER TAKEN /* preferred ready over blocked */ DEBUG_STEP("5"); if ( _States_Is_ready( the_thread->current_state ) ) { 8025e40: 28 4a 00 10 lw r10,(r2+16) 8025e44: 45 40 00 05 be r10,r0,8025e58 8025e48: a1 28 48 00 and r9,r9,r8 continue; } DEBUG_STEP("6"); /* prefer blocked/interruptible over blocked/not interruptible */ if ( !_States_Is_interruptible_by_signal(interested->current_state) ) { 8025e4c: 5d 20 00 05 bne r9,r0,8025e60 8025e50: a1 48 50 00 and r10,r10,r8 DEBUG_STEP("7"); if ( _States_Is_interruptible_by_signal(the_thread->current_state) ) { 8025e54: 45 49 00 03 be r10,r9,8025e60 */ if ( interested && !_States_Is_ready( interested->current_state ) ) { /* preferred ready over blocked */ DEBUG_STEP("5"); if ( _States_Is_ready( the_thread->current_state ) ) { 8025e58: b8 a0 08 00 mv r1,r5 8025e5c: b8 40 18 00 mv r3,r2 #endif maximum = the_info->maximum; object_table = the_info->local_table; for ( index = 1 ; index <= maximum ; index++ ) { 8025e60: 34 c6 00 01 addi r6,r6,1 8025e64: 34 e7 00 04 addi r7,r7,4 8025e68: 51 c6 ff e9 bgeu r14,r6,8025e0c 8025e6c: 34 84 00 04 addi r4,r4,4 * + 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++) { 8025e70: 5c 8d ff e0 bne r4,r13,8025df0 } } } } if ( interested ) { 8025e74: 44 60 00 06 be r3,r0,8025e8c /* * 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 ) ) { 8025e78: b8 60 08 00 mv r1,r3 8025e7c: b9 60 10 00 mv r2,r11 8025e80: 37 83 00 1c addi r3,sp,28 8025e84: f8 00 00 3d calli 8025f78 <_POSIX_signals_Unblock_thread> 8025e88: 5c 20 00 27 bne r1,r0,8025f24 /* * 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 ); 8025e8c: b9 80 08 00 mv r1,r12 8025e90: f8 00 00 2f calli 8025f4c <_POSIX_signals_Set_process_signals> if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) { 8025e94: b9 60 08 00 mv r1,r11 8025e98: 34 02 00 01 mvi r2,1 8025e9c: fb ff 70 02 calli 8001ea4 <__ashlsi3> 8025ea0: b4 2b 58 00 add r11,r1,r11 8025ea4: 34 02 00 02 mvi r2,2 8025ea8: 78 0c 08 02 mvhi r12,0x802 8025eac: b9 60 08 00 mv r1,r11 8025eb0: fb ff 6f fd calli 8001ea4 <__ashlsi3> 8025eb4: 39 8c 9f 68 ori r12,r12,0x9f68 8025eb8: b5 81 08 00 add r1,r12,r1 8025ebc: 28 22 00 00 lw r2,(r1+0) 8025ec0: 34 01 00 02 mvi r1,2 8025ec4: 5c 41 00 18 bne r2,r1,8025f24 psiginfo = (POSIX_signals_Siginfo_node *) _Chain_Get( &_POSIX_signals_Inactive_siginfo ); 8025ec8: 78 01 08 02 mvhi r1,0x802 8025ecc: 38 21 a0 e8 ori r1,r1,0xa0e8 8025ed0: fb ff 8f e0 calli 8009e50 <_Chain_Get> 8025ed4: b8 20 60 00 mv r12,r1 if ( !psiginfo ) { 8025ed8: 5c 20 00 05 bne r1,r0,8025eec _Thread_Enable_dispatch(); 8025edc: fb ff 98 37 calli 800bfb8 <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one( EAGAIN ); 8025ee0: fb ff b4 56 calli 8013038 <__errno> 8025ee4: 34 02 00 0b mvi r2,11 8025ee8: e3 ff ff 70 bi 8025ca8 } psiginfo->Info = *siginfo; 8025eec: 2b 81 00 1c lw r1,(sp+28) _Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node ); 8025ef0: 34 02 00 02 mvi r2,2 if ( !psiginfo ) { _Thread_Enable_dispatch(); rtems_set_errno_and_return_minus_one( EAGAIN ); } psiginfo->Info = *siginfo; 8025ef4: 59 81 00 08 sw (r12+8),r1 8025ef8: 2b 81 00 20 lw r1,(sp+32) 8025efc: 59 81 00 0c sw (r12+12),r1 8025f00: 2b 81 00 24 lw r1,(sp+36) 8025f04: 59 81 00 10 sw (r12+16),r1 _Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node ); 8025f08: b9 60 08 00 mv r1,r11 8025f0c: fb ff 6f e6 calli 8001ea4 <__ashlsi3> 8025f10: 78 02 08 02 mvhi r2,0x802 8025f14: 38 42 a1 60 ori r2,r2,0xa160 8025f18: b4 22 08 00 add r1,r1,r2 8025f1c: b9 80 10 00 mv r2,r12 8025f20: fb ff 8f b6 calli 8009df8 <_Chain_Append> } DEBUG_STEP("\n"); _Thread_Enable_dispatch(); 8025f24: fb ff 98 25 calli 800bfb8 <_Thread_Enable_dispatch> return 0; 8025f28: 34 01 00 00 mvi r1,0 } 8025f2c: 2b 9d 00 04 lw ra,(sp+4) 8025f30: 2b 8b 00 18 lw r11,(sp+24) 8025f34: 2b 8c 00 14 lw r12,(sp+20) 8025f38: 2b 8d 00 10 lw r13,(sp+16) 8025f3c: 2b 8e 00 0c lw r14,(sp+12) 8025f40: 2b 8f 00 08 lw r15,(sp+8) 8025f44: 37 9c 00 24 addi sp,sp,36 8025f48: c3 a0 00 00 ret =============================================================================== 08017638 : extern void _wrapup_reent(struct _reent *); extern void _reclaim_reent(struct _reent *); void libc_wrapup(void) { 8017638: 37 9c ff f4 addi sp,sp,-12 801763c: 5b 8b 00 0c sw (sp+12),r11 8017640: 5b 8c 00 08 sw (sp+8),r12 8017644: 5b 9d 00 04 sw (sp+4),ra /* * In case RTEMS is already down, don't do this. It could be * dangerous. */ if (!_System_state_Is_up(_System_state_Get())) 8017648: 78 01 08 01 mvhi r1,0x801 801764c: 38 21 9a d8 ori r1,r1,0x9ad8 8017650: 28 22 00 00 lw r2,(r1+0) 8017654: 34 01 00 03 mvi r1,3 8017658: 5c 41 00 16 bne r2,r1,80176b0 <== NEVER TAKEN /* * This was already done if the user called exit() directly . _wrapup_reent(0); */ if (_REENT != _global_impure_ptr) { 801765c: 78 01 08 01 mvhi r1,0x801 8017660: 78 0b 08 01 mvhi r11,0x801 8017664: 38 21 87 88 ori r1,r1,0x8788 8017668: 39 6b 91 e0 ori r11,r11,0x91e0 801766c: 28 2c 00 00 lw r12,(r1+0) 8017670: 29 61 00 00 lw r1,(r11+0) 8017674: 44 2c 00 04 be r1,r12,8017684 _wrapup_reent(_global_impure_ptr); 8017678: b9 80 08 00 mv r1,r12 801767c: f8 00 01 1c calli 8017aec <_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; 8017680: 59 6c 00 00 sw (r11+0),r12 * * Should this be changed to do *all* file streams? * _fwalk (_REENT, fclose); */ fclose (stdin); 8017684: 78 0b 08 01 mvhi r11,0x801 8017688: 39 6b 91 e0 ori r11,r11,0x91e0 801768c: 29 61 00 00 lw r1,(r11+0) 8017690: 28 21 00 04 lw r1,(r1+4) 8017694: fb ff e7 e2 calli 801161c fclose (stdout); 8017698: 29 61 00 00 lw r1,(r11+0) 801769c: 28 21 00 08 lw r1,(r1+8) 80176a0: fb ff e7 df calli 801161c fclose (stderr); 80176a4: 29 61 00 00 lw r1,(r11+0) 80176a8: 28 21 00 0c lw r1,(r1+12) 80176ac: fb ff e7 dc calli 801161c } 80176b0: 2b 9d 00 04 lw ra,(sp+4) 80176b4: 2b 8b 00 0c lw r11,(sp+12) 80176b8: 2b 8c 00 08 lw r12,(sp+8) 80176bc: 37 9c 00 0c addi sp,sp,12 80176c0: c3 a0 00 00 ret =============================================================================== 08002aac : #include "malloc_p.h" void *malloc( size_t size ) { 8002aac: 37 9c ff f4 addi sp,sp,-12 8002ab0: 5b 8b 00 0c sw (sp+12),r11 8002ab4: 5b 8c 00 08 sw (sp+8),r12 8002ab8: 5b 9d 00 04 sw (sp+4),ra void *return_this; MSBUMP(malloc_calls, 1); 8002abc: 78 03 08 01 mvhi r3,0x801 8002ac0: 38 63 98 40 ori r3,r3,0x9840 #include "malloc_p.h" void *malloc( size_t size ) { 8002ac4: b8 20 60 00 mv r12,r1 void *return_this; MSBUMP(malloc_calls, 1); 8002ac8: 28 61 00 04 lw r1,(r3+4) /* * Validate the parameters */ if ( !size ) return (void *) 0; 8002acc: 34 0b 00 00 mvi r11,0 size_t size ) { void *return_this; MSBUMP(malloc_calls, 1); 8002ad0: 34 21 00 01 addi r1,r1,1 8002ad4: 58 61 00 04 sw (r3+4),r1 /* * If some free's have been deferred, then do them now. */ malloc_deferred_frees_process(); 8002ad8: fb ff ff 9d calli 800294c /* * Validate the parameters */ if ( !size ) 8002adc: 45 80 00 2d be r12,r0,8002b90 return (void *) 0; /* * Do not attempt to allocate memory if not in correct system state. */ if ( _System_state_Is_up(_System_state_Get()) && 8002ae0: 78 01 08 01 mvhi r1,0x801 8002ae4: 38 21 9a d8 ori r1,r1,0x9ad8 8002ae8: 28 22 00 00 lw r2,(r1+0) 8002aec: 34 01 00 03 mvi r1,3 8002af0: 5c 41 00 03 bne r2,r1,8002afc !malloc_is_system_state_OK() ) 8002af4: fb ff ff 84 calli 8002904 return (void *) 0; /* * Do not attempt to allocate memory if not in correct system state. */ if ( _System_state_Is_up(_System_state_Get()) && 8002af8: 44 20 00 26 be r1,r0,8002b90 <== 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 ); 8002afc: 78 01 08 01 mvhi r1,0x801 8002b00: 38 21 90 1c ori r1,r1,0x901c 8002b04: 28 21 00 00 lw r1,(r1+0) 8002b08: b9 80 10 00 mv r2,r12 8002b0c: 34 03 00 00 mvi r3,0 8002b10: 34 04 00 00 mvi r4,0 8002b14: f8 00 0d 01 calli 8005f18 <_Protected_heap_Allocate_aligned_with_boundary> 8002b18: b8 20 58 00 mv r11,r1 * If this fails then return a NULL pointer. */ return_this = _Protected_heap_Allocate( RTEMS_Malloc_Heap, size ); if ( !return_this ) { 8002b1c: 5c 20 00 0f bne r1,r0,8002b58 if (rtems_malloc_sbrk_helpers) 8002b20: 78 01 08 01 mvhi r1,0x801 8002b24: 38 21 96 c4 ori r1,r1,0x96c4 8002b28: 28 21 00 00 lw r1,(r1+0) 8002b2c: 44 2b 00 06 be r1,r11,8002b44 return_this = (*rtems_malloc_sbrk_helpers->extend)( size ); 8002b30: 28 22 00 04 lw r2,(r1+4) 8002b34: b9 80 08 00 mv r1,r12 8002b38: d8 40 00 00 call r2 8002b3c: b8 20 58 00 mv r11,r1 if ( !return_this ) { 8002b40: 5c 20 00 06 bne r1,r0,8002b58 errno = ENOMEM; 8002b44: f8 00 3a 56 calli 801149c <__errno> 8002b48: 34 02 00 0c mvi r2,12 8002b4c: 58 22 00 00 sw (r1+0),r2 return (void *) 0; 8002b50: 34 0b 00 00 mvi r11,0 8002b54: e0 00 00 0f bi 8002b90 } /* * If the user wants us to dirty the allocated memory, then do it. */ if ( rtems_malloc_dirty_helper ) 8002b58: 78 01 08 01 mvhi r1,0x801 8002b5c: 38 21 96 c8 ori r1,r1,0x96c8 8002b60: 28 23 00 00 lw r3,(r1+0) 8002b64: 44 60 00 04 be r3,r0,8002b74 (*rtems_malloc_dirty_helper)( return_this, size ); 8002b68: b9 60 08 00 mv r1,r11 8002b6c: b9 80 10 00 mv r2,r12 8002b70: d8 60 00 00 call r3 /* * If configured, update the statistics */ if ( rtems_malloc_statistics_helpers ) 8002b74: 78 01 08 01 mvhi r1,0x801 8002b78: 38 21 96 c0 ori r1,r1,0x96c0 8002b7c: 28 21 00 00 lw r1,(r1+0) 8002b80: 44 20 00 04 be r1,r0,8002b90 (*rtems_malloc_statistics_helpers->at_malloc)(return_this); 8002b84: 28 22 00 04 lw r2,(r1+4) 8002b88: b9 60 08 00 mv r1,r11 8002b8c: d8 40 00 00 call r2 return return_this; } 8002b90: b9 60 08 00 mv r1,r11 8002b94: 2b 9d 00 04 lw ra,(sp+4) 8002b98: 2b 8b 00 0c lw r11,(sp+12) 8002b9c: 2b 8c 00 08 lw r12,(sp+8) 8002ba0: 37 9c 00 0c addi sp,sp,12 8002ba4: c3 a0 00 00 ret =============================================================================== 08001afc : } void *malloc_sbrk_extend_and_allocate( size_t size ) { 8001afc: 37 9c ff ec addi sp,sp,-20 8001b00: 5b 8b 00 14 sw (sp+20),r11 8001b04: 5b 8c 00 10 sw (sp+16),r12 8001b08: 5b 8d 00 0c sw (sp+12),r13 8001b0c: 5b 8e 00 08 sw (sp+8),r14 8001b10: 5b 9d 00 04 sw (sp+4),ra * 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; 8001b14: 78 03 08 01 mvhi r3,0x801 8001b18: 38 63 48 f0 ori r3,r3,0x48f0 8001b1c: 28 6b 00 00 lw r11,(r3+0) } void *malloc_sbrk_extend_and_allocate( size_t size ) { 8001b20: b8 20 70 00 mv r14,r1 */ sbrk_amount = RTEMS_Malloc_Sbrk_amount; if ( sbrk_amount == 0 ) return (void *) 0; 8001b24: 34 0d 00 00 mvi r13,0 * in "page" amounts. */ sbrk_amount = RTEMS_Malloc_Sbrk_amount; if ( sbrk_amount == 0 ) 8001b28: 45 60 00 22 be r11,r0,8001bb0 <== NEVER TAKEN return (void *) 0; the_size = ((size + sbrk_amount) / sbrk_amount * sbrk_amount); 8001b2c: b9 60 10 00 mv r2,r11 8001b30: b4 2b 08 00 add r1,r1,r11 8001b34: f8 00 42 16 calli 801238c <__udivsi3> 8001b38: b9 60 10 00 mv r2,r11 8001b3c: f8 00 41 af calli 80121f8 <__mulsi3> 8001b40: b8 20 60 00 mv r12,r1 starting_address = (void *) sbrk(the_size); 8001b44: fb ff fa 34 calli 8000414 8001b48: b8 20 10 00 mv r2,r1 if ( starting_address == (void*) -1 ) 8001b4c: 34 01 ff ff mvi r1,-1 8001b50: 44 41 00 18 be r2,r1,8001bb0 return (void *) 0; if ( !_Protected_heap_Extend( 8001b54: 78 0b 08 01 mvhi r11,0x801 8001b58: 39 6b 40 1c ori r11,r11,0x401c 8001b5c: 29 61 00 00 lw r1,(r11+0) 8001b60: b9 80 18 00 mv r3,r12 8001b64: f8 00 0c 7d calli 8004d58 <_Protected_heap_Extend> 8001b68: 5c 20 00 07 bne r1,r0,8001b84 RTEMS_Malloc_Heap, starting_address, the_size) ) { sbrk(-the_size); 8001b6c: c8 0c 08 00 sub r1,r0,r12 8001b70: fb ff fa 29 calli 8000414 errno = ENOMEM; 8001b74: f8 00 2c 2e calli 800cc2c <__errno> 8001b78: 34 02 00 0c mvi r2,12 8001b7c: 58 22 00 00 sw (r1+0),r2 return (void *) 0; 8001b80: e0 00 00 0c bi 8001bb0 } MSBUMP(space_available, the_size); 8001b84: 78 04 08 01 mvhi r4,0x801 8001b88: 38 84 48 c0 ori r4,r4,0x48c0 8001b8c: 28 81 00 00 lw r1,(r4+0) 8001b90: b9 c0 10 00 mv r2,r14 8001b94: 34 03 00 00 mvi r3,0 8001b98: b5 81 60 00 add r12,r12,r1 8001b9c: 29 61 00 00 lw r1,(r11+0) 8001ba0: 58 8c 00 00 sw (r4+0),r12 8001ba4: 34 04 00 00 mvi r4,0 8001ba8: f8 00 0c 52 calli 8004cf0 <_Protected_heap_Allocate_aligned_with_boundary> 8001bac: b8 20 68 00 mv r13,r1 return_this = _Protected_heap_Allocate( RTEMS_Malloc_Heap, size ); return return_this; } 8001bb0: b9 a0 08 00 mv r1,r13 8001bb4: 2b 9d 00 04 lw ra,(sp+4) 8001bb8: 2b 8b 00 14 lw r11,(sp+20) 8001bbc: 2b 8c 00 10 lw r12,(sp+16) 8001bc0: 2b 8d 00 0c lw r13,(sp+12) 8001bc4: 2b 8e 00 08 lw r14,(sp+8) 8001bc8: 37 9c 00 14 addi sp,sp,20 8001bcc: c3 a0 00 00 ret =============================================================================== 080101b0 : */ int memfile_ftruncate( rtems_libio_t *iop, rtems_off64_t length ) { 80101b0: 37 9c ff f0 addi sp,sp,-16 80101b4: 5b 8b 00 08 sw (sp+8),r11 80101b8: 5b 9d 00 04 sw (sp+4),ra IMFS_jnode_t *the_jnode; the_jnode = iop->pathinfo.node_access; 80101bc: 28 2b 00 1c lw r11,(r1+28) * 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 ) 80101c0: 29 64 00 50 lw r4,(r11+80) 80101c4: 48 44 00 05 bg r2,r4,80101d8 <== NEVER TAKEN 80101c8: 5c 82 00 08 bne r4,r2,80101e8 <== NEVER TAKEN 80101cc: 29 64 00 54 lw r4,(r11+84) 80101d0: 54 64 00 02 bgu r3,r4,80101d8 80101d4: e0 00 00 05 bi 80101e8 return IMFS_memfile_extend( the_jnode, length ); 80101d8: b9 60 08 00 mv r1,r11 80101dc: b8 60 10 00 mv r2,r3 80101e0: fb ff fe ea calli 800fd88 80101e4: e0 00 00 0b bi 8010210 /* * 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; 80101e8: 59 62 00 50 sw (r11+80),r2 80101ec: 59 63 00 54 sw (r11+84),r3 iop->size = the_jnode->info.file.size; 80101f0: 58 22 00 08 sw (r1+8),r2 80101f4: 58 23 00 0c sw (r1+12),r3 IMFS_update_atime( the_jnode ); 80101f8: 34 02 00 00 mvi r2,0 80101fc: 37 81 00 0c addi r1,sp,12 8010200: fb ff c9 5f calli 800277c 8010204: 2b 81 00 0c lw r1,(sp+12) 8010208: 59 61 00 40 sw (r11+64),r1 return 0; 801020c: 34 01 00 00 mvi r1,0 } 8010210: 2b 9d 00 04 lw ra,(sp+4) 8010214: 2b 8b 00 08 lw r11,(sp+8) 8010218: 37 9c 00 10 addi sp,sp,16 801021c: c3 a0 00 00 ret =============================================================================== 08010220 : rtems_off64_t memfile_lseek( rtems_libio_t *iop, rtems_off64_t offset, int whence ) { 8010220: 37 9c ff f4 addi sp,sp,-12 8010224: 5b 8b 00 0c sw (sp+12),r11 8010228: 5b 8c 00 08 sw (sp+8),r12 801022c: 5b 9d 00 04 sw (sp+4),ra IMFS_jnode_t *the_jnode; the_jnode = iop->pathinfo.node_access; 8010230: 28 2c 00 1c lw r12,(r1+28) rtems_off64_t memfile_lseek( rtems_libio_t *iop, rtems_off64_t offset, int whence ) { 8010234: b8 20 58 00 mv r11,r1 IMFS_jnode_t *the_jnode; the_jnode = iop->pathinfo.node_access; if (the_jnode->type == IMFS_LINEAR_FILE) { 8010238: 34 01 00 06 mvi r1,6 801023c: 29 82 00 4c lw r2,(r12+76) 8010240: 5c 41 00 0c bne r2,r1,8010270 if (iop->offset > the_jnode->info.linearfile.size) 8010244: 29 81 00 50 lw r1,(r12+80) 8010248: 29 63 00 10 lw r3,(r11+16) 801024c: 29 82 00 54 lw r2,(r12+84) 8010250: 48 61 00 05 bg r3,r1,8010264 <== NEVER TAKEN 8010254: 5c 61 00 15 bne r3,r1,80102a8 <== NEVER TAKEN 8010258: 29 63 00 14 lw r3,(r11+20) 801025c: 54 62 00 02 bgu r3,r2,8010264 <== NEVER TAKEN 8010260: e0 00 00 12 bi 80102a8 iop->offset = the_jnode->info.linearfile.size; 8010264: 59 61 00 10 sw (r11+16),r1 <== NOT EXECUTED 8010268: 59 62 00 14 sw (r11+20),r2 <== NOT EXECUTED 801026c: e0 00 00 0f bi 80102a8 <== NOT EXECUTED } else { /* Must be a block file (IMFS_MEMORY_FILE). */ if (IMFS_memfile_extend( the_jnode, iop->offset )) 8010270: 29 62 00 14 lw r2,(r11+20) 8010274: b9 80 08 00 mv r1,r12 8010278: fb ff fe c4 calli 800fd88 801027c: 44 20 00 07 be r1,r0,8010298 rtems_set_errno_and_return_minus_one( ENOSPC ); 8010280: f8 00 04 87 calli 801149c <__errno> 8010284: 34 02 00 1c mvi r2,28 8010288: 58 22 00 00 sw (r1+0),r2 801028c: 34 01 ff ff mvi r1,-1 8010290: 34 02 ff ff mvi r2,-1 8010294: e0 00 00 07 bi 80102b0 iop->size = the_jnode->info.file.size; 8010298: 29 81 00 50 lw r1,(r12+80) 801029c: 59 61 00 08 sw (r11+8),r1 80102a0: 29 81 00 54 lw r1,(r12+84) 80102a4: 59 61 00 0c sw (r11+12),r1 } return iop->offset; 80102a8: 29 61 00 10 lw r1,(r11+16) 80102ac: 29 62 00 14 lw r2,(r11+20) } 80102b0: 2b 9d 00 04 lw ra,(sp+4) 80102b4: 2b 8b 00 0c lw r11,(sp+12) 80102b8: 2b 8c 00 08 lw r12,(sp+8) 80102bc: 37 9c 00 0c addi sp,sp,12 80102c0: c3 a0 00 00 ret =============================================================================== 080100fc : rtems_libio_t *iop, const char *pathname, uint32_t flag, uint32_t mode ) { 80100fc: 37 9c ff f4 addi sp,sp,-12 8010100: 5b 8b 00 0c sw (sp+12),r11 8010104: 5b 8c 00 08 sw (sp+8),r12 8010108: 5b 9d 00 04 sw (sp+4),ra 801010c: b8 20 60 00 mv r12,r1 IMFS_jnode_t *the_jnode; the_jnode = iop->pathinfo.node_access; 8010110: 28 2b 00 1c lw r11,(r1+28) /* * Perform 'copy on write' for linear files */ if ((iop->flags & (LIBIO_FLAGS_WRITE | LIBIO_FLAGS_APPEND)) 8010114: 28 21 00 18 lw r1,(r1+24) 8010118: 20 21 02 04 andi r1,r1,0x204 801011c: 44 20 00 13 be r1,r0,8010168 && (the_jnode->type == IMFS_LINEAR_FILE)) { 8010120: 29 62 00 4c lw r2,(r11+76) 8010124: 34 01 00 06 mvi r1,6 8010128: 5c 41 00 10 bne r2,r1,8010168 <== ALWAYS TAKEN uint32_t count = the_jnode->info.linearfile.size; 801012c: 29 64 00 54 lw r4,(r11+84) <== NOT EXECUTED const unsigned char *buffer = the_jnode->info.linearfile.direct; the_jnode->type = IMFS_MEMORY_FILE; 8010130: 34 01 00 05 mvi r1,5 <== 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; 8010134: 29 63 00 58 lw r3,(r11+88) <== NOT EXECUTED the_jnode->type = IMFS_MEMORY_FILE; 8010138: 59 61 00 4c sw (r11+76),r1 <== NOT EXECUTED the_jnode->info.file.size = 0; 801013c: 59 60 00 50 sw (r11+80),r0 <== NOT EXECUTED 8010140: 59 60 00 54 sw (r11+84),r0 <== NOT EXECUTED the_jnode->info.file.indirect = 0; 8010144: 59 60 00 58 sw (r11+88),r0 <== NOT EXECUTED the_jnode->info.file.doubly_indirect = 0; 8010148: 59 60 00 5c sw (r11+92),r0 <== NOT EXECUTED the_jnode->info.file.triply_indirect = 0; 801014c: 59 60 00 60 sw (r11+96),r0 <== NOT EXECUTED if ((count != 0) 8010150: 44 80 00 06 be r4,r0,8010168 <== NOT EXECUTED && (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1)) 8010154: 34 02 00 00 mvi r2,0 <== NOT EXECUTED 8010158: b9 60 08 00 mv r1,r11 <== NOT EXECUTED 801015c: fb ff ff 61 calli 800fee0 <== NOT EXECUTED return -1; 8010160: 34 02 ff ff mvi r2,-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)) 8010164: 44 22 00 0d be r1,r2,8010198 <== NOT EXECUTED return -1; } if (iop->flags & LIBIO_FLAGS_APPEND) 8010168: 29 81 00 18 lw r1,(r12+24) 801016c: 20 21 02 00 andi r1,r1,0x200 8010170: 44 20 00 05 be r1,r0,8010184 iop->offset = the_jnode->info.file.size; 8010174: 29 61 00 50 lw r1,(r11+80) 8010178: 59 81 00 10 sw (r12+16),r1 801017c: 29 61 00 54 lw r1,(r11+84) 8010180: 59 81 00 14 sw (r12+20),r1 iop->size = the_jnode->info.file.size; 8010184: 29 61 00 50 lw r1,(r11+80) return 0; 8010188: 34 02 00 00 mvi r2,0 return -1; } if (iop->flags & LIBIO_FLAGS_APPEND) iop->offset = the_jnode->info.file.size; iop->size = the_jnode->info.file.size; 801018c: 59 81 00 08 sw (r12+8),r1 8010190: 29 61 00 54 lw r1,(r11+84) 8010194: 59 81 00 0c sw (r12+12),r1 return 0; } 8010198: b8 40 08 00 mv r1,r2 801019c: 2b 9d 00 04 lw ra,(sp+4) 80101a0: 2b 8b 00 0c lw r11,(sp+12) 80101a4: 2b 8c 00 08 lw r12,(sp+8) 80101a8: 37 9c 00 0c addi sp,sp,12 80101ac: c3 a0 00 00 ret =============================================================================== 08002d74 : const char *target, const char *filesystemtype, rtems_filesystem_options_t options, const void *data ) { 8002d74: 37 9c ff b0 addi sp,sp,-80 8002d78: 5b 8b 00 3c sw (sp+60),r11 8002d7c: 5b 8c 00 38 sw (sp+56),r12 8002d80: 5b 8d 00 34 sw (sp+52),r13 8002d84: 5b 8e 00 30 sw (sp+48),r14 8002d88: 5b 8f 00 2c sw (sp+44),r15 8002d8c: 5b 90 00 28 sw (sp+40),r16 8002d90: 5b 91 00 24 sw (sp+36),r17 8002d94: 5b 92 00 20 sw (sp+32),r18 8002d98: 5b 93 00 1c sw (sp+28),r19 8002d9c: 5b 94 00 18 sw (sp+24),r20 8002da0: 5b 95 00 14 sw (sp+20),r21 8002da4: 5b 96 00 10 sw (sp+16),r22 8002da8: 5b 97 00 0c sw (sp+12),r23 8002dac: 5b 98 00 08 sw (sp+8),r24 8002db0: 5b 9d 00 04 sw (sp+4),ra 8002db4: b8 20 88 00 mv r17,r1 /* * Are the file system options valid? */ if ( options != RTEMS_FILESYSTEM_READ_ONLY && 8002db8: 34 01 00 01 mvi r1,1 const char *target, const char *filesystemtype, rtems_filesystem_options_t options, const void *data ) { 8002dbc: b8 40 78 00 mv r15,r2 8002dc0: b8 60 98 00 mv r19,r3 8002dc4: b8 80 b0 00 mv r22,r4 8002dc8: b8 a0 c0 00 mv r24,r5 /* * Are the file system options valid? */ if ( options != RTEMS_FILESYSTEM_READ_ONLY && 8002dcc: 50 24 00 02 bgeu r1,r4,8002dd4 8002dd0: e0 00 00 05 bi 8002de4 rtems_set_errno_and_return_minus_one( EINVAL ); /* * Get mount handler */ mount_h = rtems_filesystem_get_mount_handler( filesystemtype ); 8002dd4: b8 60 08 00 mv r1,r3 8002dd8: f8 00 27 16 calli 800ca30 8002ddc: b8 20 a0 00 mv r20,r1 if ( !mount_h ) 8002de0: 5c 20 00 04 bne r1,r0,8002df0 rtems_set_errno_and_return_minus_one( EINVAL ); 8002de4: f8 00 39 ae calli 801149c <__errno> 8002de8: 34 02 00 16 mvi r2,22 8002dec: e0 00 00 37 bi 8002ec8 { 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; 8002df0: 7d ee 00 00 cmpnei r14,r15,0 const char *target_or_null, const char *filesystemtype, size_t *target_length_ptr ) { const char *target = target_or_null != NULL ? target_or_null : "/"; 8002df4: b9 e0 60 00 mv r12,r15 8002df8: 5d c0 00 03 bne r14,r0,8002e04 8002dfc: 78 0c 08 01 mvhi r12,0x801 8002e00: 39 8c 7f 68 ori r12,r12,0x7f68 size_t filesystemtype_size = strlen( filesystemtype ) + 1; 8002e04: ba 60 08 00 mv r1,r19 8002e08: f8 00 3e 06 calli 8012620 8002e0c: 34 30 00 01 addi r16,r1,1 size_t source_size = source_or_null != NULL ? strlen( source_or_null ) + 1 : 0; 8002e10: 34 0d 00 00 mvi r13,0 8002e14: 46 20 00 04 be r17,r0,8002e24 8002e18: ba 20 08 00 mv r1,r17 8002e1c: f8 00 3e 01 calli 8012620 8002e20: 34 2d 00 01 addi r13,r1,1 size_t target_size = strlen( target ) + 1; 8002e24: b9 80 08 00 mv r1,r12 8002e28: f8 00 3d fe calli 8012620 size_t size = sizeof( rtems_filesystem_mount_table_entry_t ) + filesystemtype_size + source_size + target_size; 8002e2c: 36 03 00 74 addi r3,r16,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; 8002e30: 34 37 00 01 addi r23,r1,1 size_t size = sizeof( rtems_filesystem_mount_table_entry_t ) + filesystemtype_size + source_size + target_size; 8002e34: b4 6d 18 00 add r3,r3,r13 { 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; 8002e38: b8 20 a8 00 mv r21,r1 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 ); 8002e3c: b4 77 10 00 add r2,r3,r23 8002e40: 34 01 00 01 mvi r1,1 8002e44: fb ff fd 8f calli 8002480 8002e48: b8 20 58 00 mv r11,r1 if ( mt_entry != NULL ) { 8002e4c: 44 20 00 1d be r1,r0,8002ec0 <== NEVER TAKEN char *str = (char *) mt_entry + sizeof( *mt_entry ); 8002e50: 34 32 00 74 addi r18,r1,116 memcpy( str, filesystemtype, filesystemtype_size ); 8002e54: ba 00 18 00 mv r3,r16 8002e58: ba 60 10 00 mv r2,r19 8002e5c: ba 40 08 00 mv r1,r18 8002e60: f8 00 3c 45 calli 8011f74 mt_entry->type = str; str += filesystemtype_size; 8002e64: b6 50 80 00 add r16,r18,r16 memcpy( str, source_or_null, source_size ); 8002e68: b9 a0 18 00 mv r3,r13 8002e6c: ba 20 10 00 mv r2,r17 8002e70: ba 00 08 00 mv r1,r16 mt_entry->dev = str; str += source_size; 8002e74: b6 0d 68 00 add r13,r16,r13 if ( mt_entry != NULL ) { char *str = (char *) mt_entry + sizeof( *mt_entry ); memcpy( str, filesystemtype, filesystemtype_size ); mt_entry->type = str; 8002e78: 59 72 00 6c sw (r11+108),r18 str += filesystemtype_size; memcpy( str, source_or_null, source_size ); 8002e7c: f8 00 3c 3e calli 8011f74 mt_entry->dev = str; str += source_size; memcpy( str, target, target_size ); 8002e80: b9 80 10 00 mv r2,r12 8002e84: ba e0 18 00 mv r3,r23 8002e88: b9 a0 08 00 mv r1,r13 memcpy( str, filesystemtype, filesystemtype_size ); mt_entry->type = str; str += filesystemtype_size; memcpy( str, source_or_null, source_size ); mt_entry->dev = str; 8002e8c: 59 70 00 70 sw (r11+112),r16 str += source_size; memcpy( str, target, target_size ); 8002e90: f8 00 3c 39 calli 8011f74 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; 8002e94: 78 03 08 01 mvhi r3,0x801 8002e98: b8 60 10 00 mv r2,r3 8002e9c: 35 61 00 38 addi r1,r11,56 8002ea0: 38 42 7f bc ori r2,r2,0x7fbc 8002ea4: 34 03 00 30 mvi r3,48 memcpy( str, source_or_null, source_size ); mt_entry->dev = str; str += source_size; memcpy( str, target, target_size ); mt_entry->target = str; 8002ea8: 59 6d 00 68 sw (r11+104),r13 &target_length ); if ( !mt_entry ) rtems_set_errno_and_return_minus_one( ENOMEM ); mt_entry->mt_fs_root.mt_entry = mt_entry; 8002eac: 59 6b 00 2c sw (r11+44),r11 mt_entry->options = options; 8002eb0: 59 76 00 30 sw (r11+48),r22 mt_entry->pathconf_limits_and_options = rtems_filesystem_default_pathconf; 8002eb4: f8 00 3c 30 calli 8011f74 /* * The mount_point should be a directory with read/write/execute * permissions in the existing tree. */ if ( has_target ) { 8002eb8: 45 c0 00 2f be r14,r0,8002f74 8002ebc: e0 00 00 06 bi 8002ed4 target, filesystemtype, &target_length ); if ( !mt_entry ) rtems_set_errno_and_return_minus_one( ENOMEM ); 8002ec0: f8 00 39 77 calli 801149c <__errno> <== NOT EXECUTED 8002ec4: 34 02 00 0c mvi r2,12 <== NOT EXECUTED 8002ec8: 58 22 00 00 sw (r1+0),r2 8002ecc: 34 0d ff ff mvi r13,-1 8002ed0: e0 00 00 5a bi 8003038 * The mount_point should be a directory with read/write/execute * permissions in the existing tree. */ if ( has_target ) { if ( rtems_filesystem_evaluate_path( 8002ed4: 37 8c 00 40 addi r12,sp,64 8002ed8: ba a0 10 00 mv r2,r21 8002edc: b9 e0 08 00 mv r1,r15 8002ee0: 34 03 00 07 mvi r3,7 8002ee4: b9 80 20 00 mv r4,r12 8002ee8: 34 05 00 01 mvi r5,1 8002eec: fb ff fd a6 calli 8002584 8002ef0: 34 02 ff ff mvi r2,-1 8002ef4: 44 22 00 4a be r1,r2,800301c <== NEVER TAKEN /* * Test to see if it is a directory */ if ( loc.ops->node_type_h( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) { 8002ef8: 2b 81 00 4c lw r1,(sp+76) 8002efc: 28 23 00 10 lw r3,(r1+16) 8002f00: b9 80 08 00 mv r1,r12 8002f04: d8 60 00 00 call r3 8002f08: 34 02 00 01 mvi r2,1 8002f0c: 44 22 00 04 be r1,r2,8002f1c errno = ENOTDIR; 8002f10: f8 00 39 63 calli 801149c <__errno> 8002f14: 34 02 00 14 mvi r2,20 8002f18: e0 00 00 20 bi 8002f98 /* * You can only mount one file system onto a single mount point. */ if ( rtems_filesystem_mount_iterate( is_node_fs_root, loc.node_access ) ) { 8002f1c: 2b 82 00 40 lw r2,(sp+64) 8002f20: 78 01 08 00 mvhi r1,0x800 8002f24: 38 21 2c 90 ori r1,r1,0x2c90 8002f28: fb ff ff 71 calli 8002cec 8002f2c: b8 20 68 00 mv r13,r1 8002f30: 44 20 00 04 be r1,r0,8002f40 errno = EBUSY; 8002f34: f8 00 39 5a calli 801149c <__errno> 8002f38: 34 02 00 10 mvi r2,16 8002f3c: e0 00 00 17 bi 8002f98 * 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; 8002f40: 2b 81 00 40 lw r1,(sp+64) mt_entry->mt_point_node.handlers = loc.handlers; mt_entry->mt_point_node.ops = loc.ops; mt_entry->mt_point_node.mt_entry = loc.mt_entry; 8002f44: 2b 82 00 50 lw r2,(sp+80) * 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; 8002f48: 59 61 00 08 sw (r11+8),r1 mt_entry->mt_point_node.handlers = loc.handlers; 8002f4c: 2b 81 00 48 lw r1,(sp+72) mt_entry->mt_point_node.ops = loc.ops; mt_entry->mt_point_node.mt_entry = loc.mt_entry; 8002f50: 59 62 00 18 sw (r11+24),r2 * 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; 8002f54: 59 61 00 10 sw (r11+16),r1 mt_entry->mt_point_node.ops = loc.ops; 8002f58: 2b 81 00 4c lw r1,(sp+76) /* * 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 ) ) { 8002f5c: 28 23 00 20 lw r3,(r1+32) * 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; 8002f60: 59 61 00 14 sw (r11+20),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 ) ) { 8002f64: b9 60 08 00 mv r1,r11 8002f68: d8 60 00 00 call r3 8002f6c: 44 2d 00 0d be r1,r13,8002fa0 <== ALWAYS TAKEN 8002f70: e0 00 00 2c bi 8003020 <== NOT EXECUTED stop = (*routine)( mt_entry, routine_arg ); } rtems_libio_unlock(); return stop; } 8002f74: 78 04 08 01 mvhi r4,0x801 8002f78: 38 84 90 fc ori r4,r4,0x90fc } } else { /* * Do we already have a base file system ? */ if ( !rtems_chain_is_empty( &mount_chain ) ) { 8002f7c: 28 81 00 00 lw r1,(r4+0) 8002f80: 78 03 08 01 mvhi r3,0x801 8002f84: 38 63 91 00 ori r3,r3,0x9100 ) { 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; 8002f88: 34 0c 00 00 mvi r12,0 } } else { /* * Do we already have a base file system ? */ if ( !rtems_chain_is_empty( &mount_chain ) ) { 8002f8c: 44 23 00 05 be r1,r3,8002fa0 <== ALWAYS TAKEN errno = EINVAL; 8002f90: f8 00 39 43 calli 801149c <__errno> <== NOT EXECUTED 8002f94: 34 02 00 16 mvi r2,22 <== NOT EXECUTED 8002f98: 58 22 00 00 sw (r1+0),r2 goto cleanup_and_bail; 8002f9c: e0 00 00 21 bi 8003020 * 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 ) ) { 8002fa0: b9 60 08 00 mv r1,r11 8002fa4: bb 00 10 00 mv r2,r24 8002fa8: da 80 00 00 call r20 8002fac: 44 20 00 06 be r1,r0,8002fc4 /* * Try to undo the mount operation */ loc.ops->unmount_h( mt_entry ); 8002fb0: 2b 81 00 4c lw r1,(sp+76) 8002fb4: 28 22 00 28 lw r2,(r1+40) 8002fb8: b9 60 08 00 mv r1,r11 8002fbc: d8 40 00 00 call r2 goto cleanup_and_bail; 8002fc0: e0 00 00 18 bi 8003020 } /* * Add the mount table entry to the mount table chain */ rtems_libio_lock(); 8002fc4: fb ff ff 36 calli 8002c9c 8002fc8: 78 01 08 01 mvhi r1,0x801 8002fcc: 38 21 90 fc ori r1,r1,0x90fc 8002fd0: b9 60 10 00 mv r2,r11 rtems_libio_unlock(); if ( !has_target ) rtems_filesystem_root = mt_entry->mt_fs_root; return 0; 8002fd4: 34 0d 00 00 mvi r13,0 8002fd8: f8 00 06 d6 calli 8004b30 <_Chain_Append> /* * Add the mount table entry to the mount table chain */ rtems_libio_lock(); rtems_chain_append( &mount_chain, &mt_entry->Node ); rtems_libio_unlock(); 8002fdc: fb ff ff 3b calli 8002cc8 if ( !has_target ) 8002fe0: 5d cd 00 16 bne r14,r13,8003038 rtems_filesystem_root = mt_entry->mt_fs_root; 8002fe4: 78 01 08 01 mvhi r1,0x801 8002fe8: 38 21 91 08 ori r1,r1,0x9108 8002fec: 28 21 00 00 lw r1,(r1+0) 8002ff0: 29 66 00 1c lw r6,(r11+28) 8002ff4: 29 65 00 20 lw r5,(r11+32) 8002ff8: 29 64 00 24 lw r4,(r11+36) 8002ffc: 29 63 00 28 lw r3,(r11+40) 8003000: 29 62 00 2c lw r2,(r11+44) 8003004: 58 26 00 18 sw (r1+24),r6 8003008: 58 25 00 1c sw (r1+28),r5 800300c: 58 24 00 20 sw (r1+32),r4 8003010: 58 23 00 24 sw (r1+36),r3 8003014: 58 22 00 28 sw (r1+40),r2 8003018: e0 00 00 08 bi 8003038 ) { 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; 800301c: 34 0c 00 00 mvi r12,0 <== NOT EXECUTED return 0; cleanup_and_bail: free( mt_entry ); 8003020: b9 60 08 00 mv r1,r11 8003024: fb ff fd a8 calli 80026c4 if ( loc_to_free ) rtems_filesystem_freenode( loc_to_free ); return -1; 8003028: 34 0d ff ff mvi r13,-1 cleanup_and_bail: free( mt_entry ); if ( loc_to_free ) 800302c: 45 80 00 03 be r12,r0,8003038 <== NEVER TAKEN rtems_filesystem_freenode( loc_to_free ); 8003030: b9 80 08 00 mv r1,r12 8003034: fb ff fd 9c calli 80026a4 return -1; } 8003038: b9 a0 08 00 mv r1,r13 800303c: 2b 9d 00 04 lw ra,(sp+4) 8003040: 2b 8b 00 3c lw r11,(sp+60) 8003044: 2b 8c 00 38 lw r12,(sp+56) 8003048: 2b 8d 00 34 lw r13,(sp+52) 800304c: 2b 8e 00 30 lw r14,(sp+48) 8003050: 2b 8f 00 2c lw r15,(sp+44) 8003054: 2b 90 00 28 lw r16,(sp+40) 8003058: 2b 91 00 24 lw r17,(sp+36) 800305c: 2b 92 00 20 lw r18,(sp+32) 8003060: 2b 93 00 1c lw r19,(sp+28) 8003064: 2b 94 00 18 lw r20,(sp+24) 8003068: 2b 95 00 14 lw r21,(sp+20) 800306c: 2b 96 00 10 lw r22,(sp+16) 8003070: 2b 97 00 0c lw r23,(sp+12) 8003074: 2b 98 00 08 lw r24,(sp+8) 8003078: 37 9c 00 50 addi sp,sp,80 800307c: c3 a0 00 00 ret =============================================================================== 08002020 : const char *target, const char *filesystemtype, rtems_filesystem_options_t options, const void *data ) { 8002020: 37 9c ff e8 addi sp,sp,-24 8002024: 5b 8b 00 0c sw (sp+12),r11 8002028: 5b 8c 00 08 sw (sp+8),r12 800202c: 5b 9d 00 04 sw (sp+4),ra 8002030: b8 20 60 00 mv r12,r1 8002034: b8 40 58 00 mv r11,r2 int rv = -1; if (target != NULL) { 8002038: 44 40 00 0f be r2,r0,8002074 rv = rtems_mkdir(target, S_IRWXU | S_IRWXG | S_IRWXO); 800203c: b8 40 08 00 mv r1,r2 8002040: 34 02 01 ff mvi r2,511 8002044: 5b 83 00 18 sw (sp+24),r3 8002048: 5b 84 00 14 sw (sp+20),r4 800204c: 5b 85 00 10 sw (sp+16),r5 8002050: f8 00 02 91 calli 8002a94 if (rv == 0) { 8002054: 2b 83 00 18 lw r3,(sp+24) 8002058: 2b 84 00 14 lw r4,(sp+20) 800205c: 2b 85 00 10 lw r5,(sp+16) 8002060: 5c 20 00 09 bne r1,r0,8002084 <== NEVER TAKEN rv = mount( 8002064: b9 80 08 00 mv r1,r12 8002068: b9 60 10 00 mv r2,r11 800206c: f8 00 00 44 calli 800217c 8002070: e0 00 00 05 bi 8002084 options, data ); } } else { errno = EINVAL; 8002074: f8 00 2a 49 calli 800c998 <__errno> 8002078: 34 02 00 16 mvi r2,22 800207c: 58 22 00 00 sw (r1+0),r2 const char *filesystemtype, rtems_filesystem_options_t options, const void *data ) { int rv = -1; 8002080: 34 01 ff ff mvi r1,-1 } else { errno = EINVAL; } return rv; } 8002084: 2b 9d 00 04 lw ra,(sp+4) 8002088: 2b 8b 00 0c lw r11,(sp+12) 800208c: 2b 8c 00 08 lw r12,(sp+8) 8002090: 37 9c 00 18 addi sp,sp,24 8002094: c3 a0 00 00 ret =============================================================================== 080032a8 : void newlib_delete_hook( rtems_tcb *current_task, rtems_tcb *deleted_task ) { 80032a8: 37 9c ff f0 addi sp,sp,-16 80032ac: 5b 8b 00 10 sw (sp+16),r11 80032b0: 5b 8c 00 0c sw (sp+12),r12 80032b4: 5b 8d 00 08 sw (sp+8),r13 80032b8: 5b 9d 00 04 sw (sp+4),ra 80032bc: b8 20 68 00 mv r13,r1 80032c0: b8 40 60 00 mv r12,r2 /* * The reentrancy structure was allocated by newlib using malloc() */ if (current_task == deleted_task) { 80032c4: 5c 22 00 05 bne r1,r2,80032d8 ptr = _REENT; 80032c8: 78 02 08 01 mvhi r2,0x801 80032cc: 38 42 91 e0 ori r2,r2,0x91e0 80032d0: 28 4b 00 00 lw r11,(r2+0) 80032d4: e0 00 00 02 bi 80032dc } else { ptr = deleted_task->libc_reent; 80032d8: 28 4b 01 18 lw r11,(r2+280) } if (ptr && ptr != _global_impure_ptr) { 80032dc: 45 60 00 0b be r11,r0,8003308 <== NEVER TAKEN 80032e0: 78 02 08 01 mvhi r2,0x801 80032e4: 38 42 87 88 ori r2,r2,0x8788 80032e8: 28 41 00 00 lw r1,(r2+0) 80032ec: 45 61 00 07 be r11,r1,8003308 _reclaim_reent(ptr); */ /* * Just in case there are some buffers lying around. */ _fwalk(ptr, newlib_free_buffers); 80032f0: 78 02 08 00 mvhi r2,0x800 80032f4: b9 60 08 00 mv r1,r11 80032f8: 38 42 30 84 ori r2,r2,0x3084 80032fc: f8 00 3a b6 calli 8011dd4 <_fwalk> #if REENT_MALLOCED free(ptr); #else _Workspace_Free(ptr); 8003300: b9 60 08 00 mv r1,r11 8003304: f8 00 12 97 calli 8007d60 <_Workspace_Free> #endif } deleted_task->libc_reent = NULL; 8003308: 59 80 01 18 sw (r12+280),r0 /* * Require the switch back to another task to install its own */ if ( current_task == deleted_task ) { 800330c: 5d ac 00 04 bne r13,r12,800331c _REENT = 0; 8003310: 78 01 08 01 mvhi r1,0x801 8003314: 38 21 91 e0 ori r1,r1,0x91e0 8003318: 58 20 00 00 sw (r1+0),r0 } } 800331c: 2b 9d 00 04 lw ra,(sp+4) 8003320: 2b 8b 00 10 lw r11,(sp+16) 8003324: 2b 8c 00 0c lw r12,(sp+12) 8003328: 2b 8d 00 08 lw r13,(sp+8) 800332c: 37 9c 00 10 addi sp,sp,16 8003330: c3 a0 00 00 ret =============================================================================== 08003084 : */ int newlib_free_buffers( FILE *fp ) { 8003084: 37 9c ff f8 addi sp,sp,-8 8003088: 5b 8b 00 08 sw (sp+8),r11 800308c: 5b 9d 00 04 sw (sp+4),ra 8003090: b8 20 58 00 mv r11,r1 switch ( fileno(fp) ) { 8003094: f8 00 3a 17 calli 80118f0 8003098: 34 02 00 02 mvi r2,2 800309c: 54 22 00 0c bgu r1,r2,80030cc <== NEVER TAKEN case 0: case 1: case 2: if (fp->_flags & __SMBF) { 80030a0: 2d 61 00 0c lhu r1,(r11+12) 80030a4: 20 21 00 80 andi r1,r1,0x80 80030a8: 44 20 00 0b be r1,r0,80030d4 <== ALWAYS TAKEN free( fp->_bf._base ); 80030ac: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED 80030b0: fb ff fd 85 calli 80026c4 <== NOT EXECUTED fp->_flags &= ~__SMBF; 80030b4: 2d 61 00 0c lhu r1,(r11+12) <== NOT EXECUTED fp->_bf._base = fp->_p = (unsigned char *) NULL; 80030b8: 59 60 00 00 sw (r11+0),r0 <== NOT EXECUTED 80030bc: 59 60 00 10 sw (r11+16),r0 <== NOT EXECUTED case 0: case 1: case 2: if (fp->_flags & __SMBF) { free( fp->_bf._base ); fp->_flags &= ~__SMBF; 80030c0: 20 21 ff 7f andi r1,r1,0xff7f <== NOT EXECUTED 80030c4: 0d 61 00 0c sh (r11+12),r1 <== NOT EXECUTED 80030c8: e0 00 00 03 bi 80030d4 <== NOT EXECUTED fp->_bf._base = fp->_p = (unsigned char *) NULL; } break; default: fclose(fp); 80030cc: b9 60 08 00 mv r1,r11 <== NOT EXECUTED 80030d0: f8 00 39 53 calli 801161c <== NOT EXECUTED } return 0; } 80030d4: 34 01 00 00 mvi r1,0 80030d8: 2b 9d 00 04 lw ra,(sp+4) 80030dc: 2b 8b 00 08 lw r11,(sp+8) 80030e0: 37 9c 00 08 addi sp,sp,8 80030e4: c3 a0 00 00 ret =============================================================================== 080033b8 : int open( const char *pathname, int flags, ... ) { 80033b8: 37 9c ff ac addi sp,sp,-84 80033bc: 5b 8b 00 24 sw (sp+36),r11 80033c0: 5b 8c 00 20 sw (sp+32),r12 80033c4: 5b 8d 00 1c sw (sp+28),r13 80033c8: 5b 8e 00 18 sw (sp+24),r14 80033cc: 5b 8f 00 14 sw (sp+20),r15 80033d0: 5b 90 00 10 sw (sp+16),r16 80033d4: 5b 91 00 0c sw (sp+12),r17 80033d8: 5b 92 00 08 sw (sp+8),r18 80033dc: 5b 9d 00 04 sw (sp+4),ra 80033e0: b8 20 78 00 mv r15,r1 /* * Set the Evaluation flags */ eval_flags = 0; status = flags + 1; 80033e4: 34 41 00 01 addi r1,r2,1 int open( const char *pathname, int flags, ... ) { 80033e8: 5b 82 00 3c sw (sp+60),r2 80033ec: b8 40 70 00 mv r14,r2 80033f0: 5b 83 00 40 sw (sp+64),r3 80033f4: 5b 84 00 44 sw (sp+68),r4 80033f8: 5b 85 00 48 sw (sp+72),r5 80033fc: 5b 86 00 4c sw (sp+76),r6 8003400: 5b 87 00 50 sw (sp+80),r7 8003404: 5b 88 00 54 sw (sp+84),r8 /* * Set the Evaluation flags */ eval_flags = 0; status = flags + 1; if ( ( status & _FREAD ) == _FREAD ) 8003408: 20 22 00 01 andi r2,r1,0x1 int eval_flags; /* * Set the Evaluation flags */ eval_flags = 0; 800340c: 34 10 00 00 mvi r16,0 status = flags + 1; if ( ( status & _FREAD ) == _FREAD ) 8003410: 44 40 00 02 be r2,r0,8003418 eval_flags |= RTEMS_LIBIO_PERMS_READ; 8003414: 34 10 00 04 mvi r16,4 if ( ( status & _FWRITE ) == _FWRITE ) 8003418: 20 21 00 02 andi r1,r1,0x2 800341c: 44 20 00 02 be r1,r0,8003424 eval_flags |= RTEMS_LIBIO_PERMS_WRITE; 8003420: 3a 10 00 02 ori r16,r16,0x2 va_start(ap, flags); mode = va_arg( ap, int ); 8003424: 2b 92 00 40 lw r18,(sp+64) * 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(); 8003428: f8 00 24 a9 calli 800c6cc 800342c: b8 20 58 00 mv r11,r1 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; 8003430: 34 0d 00 00 mvi r13,0 */ /* allocate a file control block */ iop = rtems_libio_allocate(); if ( iop == 0 ) { rc = ENFILE; 8003434: 34 0c 00 17 mvi r12,23 * descriptors are obtained using socket(), not open(). */ /* allocate a file control block */ iop = rtems_libio_allocate(); if ( iop == 0 ) { 8003438: 44 20 00 62 be r1,r0,80035c0 } /* * See if the file exists. */ status = rtems_filesystem_evaluate_path( 800343c: b9 e0 08 00 mv r1,r15 8003440: f8 00 3c 78 calli 8012620 8003444: 37 91 00 28 addi r17,sp,40 8003448: b8 20 10 00 mv r2,r1 800344c: ba 00 18 00 mv r3,r16 8003450: b9 e0 08 00 mv r1,r15 8003454: ba 20 20 00 mv r4,r17 8003458: 34 05 00 01 mvi r5,1 800345c: fb ff fc 4a calli 8002584 pathname, strlen( pathname ), eval_flags, &loc, true ); if ( status == -1 ) { 8003460: 34 02 ff ff mvi r2,-1 8003464: 5c 22 00 1c bne r1,r2,80034d4 if ( errno != ENOENT ) { 8003468: f8 00 38 0d calli 801149c <__errno> 800346c: 28 22 00 00 lw r2,(r1+0) 8003470: 34 01 00 02 mvi r1,2 8003474: 5c 41 00 0a bne r2,r1,800349c rc = errno; goto done; } /* If the file does not exist and we are not trying to create it--> error */ if ( !(flags & O_CREAT) ) { 8003478: 21 c1 02 00 andi r1,r14,0x200 rc = ENOENT; 800347c: 34 0c 00 02 mvi r12,2 rc = errno; goto done; } /* If the file does not exist and we are not trying to create it--> error */ if ( !(flags & O_CREAT) ) { 8003480: 44 20 00 50 be r1,r0,80035c0 rc = ENOENT; goto done; } /* Create the node for the new regular file */ rc = mknod( pathname, S_IFREG | mode, 0LL ); 8003484: b9 e0 08 00 mv r1,r15 8003488: 3a 42 80 00 ori r2,r18,0x8000 800348c: 34 03 00 00 mvi r3,0 8003490: 34 04 00 00 mvi r4,0 8003494: fb ff fd ce calli 8002bcc if ( rc ) { 8003498: 44 20 00 04 be r1,r0,80034a8 <== ALWAYS TAKEN rc = errno; 800349c: f8 00 38 00 calli 801149c <__errno> 80034a0: 28 2c 00 00 lw r12,(r1+0) goto done; 80034a4: e0 00 00 46 bi 80035bc /* * 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( 80034a8: b9 e0 08 00 mv r1,r15 80034ac: f8 00 3c 5d calli 8012620 80034b0: b8 20 10 00 mv r2,r1 80034b4: 34 03 00 00 mvi r3,0 80034b8: b9 e0 08 00 mv r1,r15 80034bc: ba 20 20 00 mv r4,r17 80034c0: 34 05 00 01 mvi r5,1 80034c4: fb ff fc 30 calli 8002584 pathname, strlen( pathname ), 0x0, &loc, true ); if ( status != 0 ) { /* The file did not exist */ rc = EACCES; 80034c8: 34 0c 00 0d mvi r12,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 */ 80034cc: 5d a1 00 3d bne r13,r1,80035c0 <== NEVER TAKEN 80034d0: e0 00 00 06 bi 80034e8 rc = EACCES; goto done; } } else if ((flags & (O_EXCL|O_CREAT)) == (O_EXCL|O_CREAT)) { 80034d4: 21 c2 0a 00 andi r2,r14,0xa00 80034d8: 34 01 0a 00 mvi r1,2560 /* We were trying to create a file that already exists */ rc = EEXIST; loc_to_free = &loc; 80034dc: ba 20 68 00 mv r13,r17 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; 80034e0: 34 0c 00 11 mvi r12,17 if ( status != 0 ) { /* The file did not exist */ rc = EACCES; goto done; } } else if ((flags & (O_EXCL|O_CREAT)) == (O_EXCL|O_CREAT)) { 80034e4: 44 41 00 37 be r2,r1,80035c0 /* * Fill in the file control block based on the loc structure * returned by successful path evaluation. */ iop->flags |= rtems_libio_fcntl_flags( flags ); 80034e8: b9 c0 08 00 mv r1,r14 80034ec: 29 6c 00 18 lw r12,(r11+24) 80034f0: f8 00 24 4d calli 800c624 iop->pathinfo = loc; 80034f4: 2b 82 00 28 lw r2,(sp+40) /* * Fill in the file control block based on the loc structure * returned by successful path evaluation. */ iop->flags |= rtems_libio_fcntl_flags( flags ); 80034f8: b8 2c 08 00 or r1,r1,r12 80034fc: 59 61 00 18 sw (r11+24),r1 iop->pathinfo = loc; 8003500: 59 62 00 1c sw (r11+28),r2 8003504: 2b 82 00 2c lw r2,(sp+44) 8003508: 2b 81 00 30 lw r1,(sp+48) rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode ); 800350c: b9 c0 18 00 mv r3,r14 /* * 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; 8003510: 59 62 00 20 sw (r11+32),r2 8003514: 2b 82 00 34 lw r2,(sp+52) rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode ); 8003518: 28 25 00 00 lw r5,(r1+0) /* * 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; 800351c: 59 61 00 24 sw (r11+36),r1 8003520: 59 62 00 28 sw (r11+40),r2 8003524: 2b 82 00 38 lw r2,(sp+56) rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode ); 8003528: b9 60 08 00 mv r1,r11 800352c: ba 40 20 00 mv r4,r18 /* * 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; 8003530: 59 62 00 2c sw (r11+44),r2 rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode ); 8003534: b9 e0 10 00 mv r2,r15 8003538: d8 a0 00 00 call r5 if ( rc ) { 800353c: 44 20 00 05 be r1,r0,8003550 rc = errno; 8003540: f8 00 37 d7 calli 801149c <__errno> 8003544: 28 2c 00 00 lw r12,(r1+0) rc = EEXIST; loc_to_free = &loc; goto done; } loc_to_free = &loc; 8003548: 37 8d 00 28 addi r13,sp,40 iop->pathinfo = loc; rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode ); if ( rc ) { rc = errno; goto done; 800354c: e0 00 00 1c bi 80035bc } /* * Optionally truncate the file. */ if ( (flags & O_TRUNC) == O_TRUNC ) { 8003550: 21 ce 04 00 andi r14,r14,0x400 8003554: 45 c1 00 25 be r14,r1,80035e8 rc = ftruncate( iop - rtems_libio_iops, 0 ); 8003558: 78 01 08 01 mvhi r1,0x801 800355c: 38 21 98 28 ori r1,r1,0x9828 8003560: 28 21 00 00 lw r1,(r1+0) 8003564: 34 02 00 06 mvi r2,6 rc = EEXIST; loc_to_free = &loc; goto done; } loc_to_free = &loc; 8003568: 37 8d 00 28 addi r13,sp,40 /* * Optionally truncate the file. */ if ( (flags & O_TRUNC) == O_TRUNC ) { rc = ftruncate( iop - rtems_libio_iops, 0 ); 800356c: c9 61 08 00 sub r1,r11,r1 8003570: f8 00 4e 9a calli 8016fd8 <__ashrsi3> 8003574: 34 02 00 00 mvi r2,0 8003578: f8 00 23 cd calli 800c4ac 800357c: b8 20 60 00 mv r12,r1 if ( rc ) { 8003580: 44 20 00 0f be r1,r0,80035bc if(errno) rc = errno; 8003584: f8 00 37 c6 calli 801149c <__errno> 8003588: 28 21 00 00 lw r1,(r1+0) 800358c: 44 20 00 03 be r1,r0,8003598 <== NEVER TAKEN 8003590: f8 00 37 c3 calli 801149c <__errno> 8003594: 28 2c 00 00 lw r12,(r1+0) close( iop - rtems_libio_iops ); 8003598: 78 01 08 01 mvhi r1,0x801 800359c: 38 21 98 28 ori r1,r1,0x9828 80035a0: 28 21 00 00 lw r1,(r1+0) 80035a4: 34 02 00 06 mvi r2,6 /* those are released by close(): */ iop = 0; loc_to_free = NULL; 80035a8: 34 0d 00 00 mvi r13,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 ); 80035ac: c9 61 08 00 sub r1,r11,r1 80035b0: f8 00 4e 8a calli 8016fd8 <__ashrsi3> 80035b4: f8 00 23 91 calli 800c3f8 /* those are released by close(): */ iop = 0; 80035b8: 34 0b 00 00 mvi r11,0 * Single exit and clean up path. */ done: va_end(ap); if ( rc ) { 80035bc: 45 80 00 0b be r12,r0,80035e8 if ( iop ) 80035c0: 45 60 00 03 be r11,r0,80035cc rtems_libio_free( iop ); 80035c4: b9 60 08 00 mv r1,r11 80035c8: f8 00 24 6f calli 800c784 if ( loc_to_free ) 80035cc: 45 a0 00 03 be r13,r0,80035d8 rtems_filesystem_freenode( loc_to_free ); 80035d0: b9 a0 08 00 mv r1,r13 80035d4: fb ff fc 34 calli 80026a4 rtems_set_errno_and_return_minus_one( rc ); 80035d8: f8 00 37 b1 calli 801149c <__errno> 80035dc: 58 2c 00 00 sw (r1+0),r12 80035e0: 34 01 ff ff mvi r1,-1 80035e4: e0 00 00 07 bi 8003600 } return iop - rtems_libio_iops; 80035e8: 78 01 08 01 mvhi r1,0x801 80035ec: 38 21 98 28 ori r1,r1,0x9828 80035f0: 28 21 00 00 lw r1,(r1+0) 80035f4: 34 02 00 06 mvi r2,6 80035f8: c9 61 08 00 sub r1,r11,r1 80035fc: f8 00 4e 77 calli 8016fd8 <__ashrsi3> } 8003600: 2b 9d 00 04 lw ra,(sp+4) 8003604: 2b 8b 00 24 lw r11,(sp+36) 8003608: 2b 8c 00 20 lw r12,(sp+32) 800360c: 2b 8d 00 1c lw r13,(sp+28) 8003610: 2b 8e 00 18 lw r14,(sp+24) 8003614: 2b 8f 00 14 lw r15,(sp+20) 8003618: 2b 90 00 10 lw r16,(sp+16) 800361c: 2b 91 00 0c lw r17,(sp+12) 8003620: 2b 92 00 08 lw r18,(sp+8) 8003624: 37 9c 00 54 addi sp,sp,84 8003628: c3 a0 00 00 ret =============================================================================== 08003334 : /* * This is a replaceable stub which opens the console, if present. */ void open_dev_console(void) { 8003334: 37 9c ff f4 addi sp,sp,-12 8003338: 5b 8b 00 0c sw (sp+12),r11 800333c: 5b 8c 00 08 sw (sp+8),r12 8003340: 5b 9d 00 04 sw (sp+4),ra int stderr_fd; /* * Attempt to open /dev/console. */ if ((stdin_fd = open("/dev/console", O_RDONLY, 0)) == -1) { 8003344: 78 0b 08 01 mvhi r11,0x801 8003348: 39 6b 7e e4 ori r11,r11,0x7ee4 800334c: b9 60 08 00 mv r1,r11 8003350: 34 02 00 00 mvi r2,0 8003354: 34 03 00 00 mvi r3,0 8003358: f8 00 00 18 calli 80033b8 800335c: 34 0c ff ff mvi r12,-1 8003360: 44 2c 00 11 be r1,r12,80033a4 /* * But if we find /dev/console once, we better find it twice more * or something is REALLY wrong. */ if ((stdout_fd = open("/dev/console", O_WRONLY, 0)) == -1) 8003364: 34 02 00 01 mvi r2,1 8003368: b9 60 08 00 mv r1,r11 800336c: 34 03 00 00 mvi r3,0 8003370: f8 00 00 12 calli 80033b8 rtems_fatal_error_occurred( 0x55544431 ); /* error STD1 */ 8003374: 78 02 08 01 mvhi r2,0x801 8003378: 38 42 7f f0 ori r2,r2,0x7ff0 /* * But if we find /dev/console once, we better find it twice more * or something is REALLY wrong. */ if ((stdout_fd = open("/dev/console", O_WRONLY, 0)) == -1) 800337c: 44 2c 00 08 be r1,r12,800339c <== NEVER TAKEN rtems_fatal_error_occurred( 0x55544431 ); /* error STD1 */ if ((stderr_fd = open("/dev/console", O_WRONLY, 0)) == -1) 8003380: b9 60 08 00 mv r1,r11 8003384: 34 02 00 01 mvi r2,1 8003388: 34 03 00 00 mvi r3,0 800338c: f8 00 00 0b calli 80033b8 8003390: 5c 2c 00 05 bne r1,r12,80033a4 <== ALWAYS TAKEN rtems_fatal_error_occurred( 0x55544432 ); /* error STD2 */ 8003394: 78 02 08 01 mvhi r2,0x801 <== NOT EXECUTED 8003398: 38 42 7f f4 ori r2,r2,0x7ff4 <== NOT EXECUTED 800339c: 28 41 00 00 lw r1,(r2+0) <== NOT EXECUTED 80033a0: f8 00 04 54 calli 80044f0 <== NOT EXECUTED } 80033a4: 2b 9d 00 04 lw ra,(sp+4) 80033a8: 2b 8b 00 0c lw r11,(sp+12) 80033ac: 2b 8c 00 08 lw r12,(sp+8) 80033b0: 37 9c 00 0c addi sp,sp,12 80033b4: c3 a0 00 00 ret =============================================================================== 080054e4 : /* * Handle output processing */ static void oproc (unsigned char c, struct rtems_termios_tty *tty) { 80054e4: 37 9c ff f4 addi sp,sp,-12 80054e8: 5b 8b 00 08 sw (sp+8),r11 80054ec: 5b 9d 00 04 sw (sp+4),ra 80054f0: 33 81 00 0c sb (sp+12),r1 int i; if (tty->termios.c_oflag & OPOST) { 80054f4: 28 41 00 34 lw r1,(r2+52) /* * Handle output processing */ static void oproc (unsigned char c, struct rtems_termios_tty *tty) { 80054f8: b8 40 58 00 mv r11,r2 int i; if (tty->termios.c_oflag & OPOST) { 80054fc: 20 22 00 01 andi r2,r1,0x1 8005500: 44 40 00 4d be r2,r0,8005634 <== NEVER TAKEN switch (c) { 8005504: 43 82 00 0c lbu r2,(sp+12) 8005508: 34 03 00 09 mvi r3,9 800550c: 44 43 00 21 be r2,r3,8005590 8005510: 54 43 00 04 bgu r2,r3,8005520 <== ALWAYS TAKEN 8005514: 34 03 00 08 mvi r3,8 <== NOT EXECUTED 8005518: 5c 43 00 30 bne r2,r3,80055d8 <== NOT EXECUTED 800551c: e0 00 00 2b bi 80055c8 <== NOT EXECUTED 8005520: 34 03 00 0a mvi r3,10 8005524: 44 43 00 04 be r2,r3,8005534 8005528: 34 03 00 0d mvi r3,13 800552c: 5c 43 00 2b bne r2,r3,80055d8 <== ALWAYS TAKEN 8005530: e0 00 00 0c bi 8005560 <== NOT EXECUTED case '\n': if (tty->termios.c_oflag & ONLRET) 8005534: 20 22 00 20 andi r2,r1,0x20 8005538: 44 40 00 02 be r2,r0,8005540 <== ALWAYS TAKEN tty->column = 0; 800553c: 59 60 00 28 sw (r11+40),r0 <== NOT EXECUTED if (tty->termios.c_oflag & ONLCR) { 8005540: 20 21 00 04 andi r1,r1,0x4 8005544: 44 20 00 3c be r1,r0,8005634 <== NEVER TAKEN rtems_termios_puts ("\r", 1, tty); 8005548: 78 01 08 02 mvhi r1,0x802 800554c: 38 21 14 bc ori r1,r1,0x14bc 8005550: 34 02 00 01 mvi r2,1 8005554: b9 60 18 00 mv r3,r11 8005558: fb ff ff 8d calli 800538c 800555c: e0 00 00 0b bi 8005588 tty->column = 0; } break; case '\r': if ((tty->termios.c_oflag & ONOCR) && (tty->column == 0)) 8005560: 20 22 00 10 andi r2,r1,0x10 <== NOT EXECUTED 8005564: 44 40 00 03 be r2,r0,8005570 <== NOT EXECUTED 8005568: 29 62 00 28 lw r2,(r11+40) <== NOT EXECUTED 800556c: 44 40 00 36 be r2,r0,8005644 <== NOT EXECUTED return; if (tty->termios.c_oflag & OCRNL) { 8005570: 20 22 00 08 andi r2,r1,0x8 <== NOT EXECUTED 8005574: 44 40 00 05 be r2,r0,8005588 <== NOT EXECUTED c = '\n'; 8005578: 34 02 00 0a mvi r2,10 <== NOT EXECUTED 800557c: 33 82 00 0c sb (sp+12),r2 <== NOT EXECUTED if (tty->termios.c_oflag & ONLRET) 8005580: 20 21 00 20 andi r1,r1,0x20 <== NOT EXECUTED 8005584: 44 20 00 2c be r1,r0,8005634 <== NOT EXECUTED tty->column = 0; break; } tty->column = 0; 8005588: 59 60 00 28 sw (r11+40),r0 break; 800558c: e0 00 00 2a bi 8005634 case '\t': i = 8 - (tty->column & 7); 8005590: 29 63 00 28 lw r3,(r11+40) 8005594: 34 04 00 08 mvi r4,8 if ((tty->termios.c_oflag & TABDLY) == XTABS) { 8005598: 20 21 18 00 andi r1,r1,0x1800 } tty->column = 0; break; case '\t': i = 8 - (tty->column & 7); 800559c: 20 62 00 07 andi r2,r3,0x7 80055a0: c8 82 10 00 sub r2,r4,r2 if ((tty->termios.c_oflag & TABDLY) == XTABS) { 80055a4: 34 04 18 00 mvi r4,6144 80055a8: b4 43 18 00 add r3,r2,r3 80055ac: 5c 24 00 05 bne r1,r4,80055c0 <== NEVER TAKEN tty->column += i; rtems_termios_puts ( " ", i, tty); 80055b0: 78 01 08 02 mvhi r1,0x802 break; case '\t': i = 8 - (tty->column & 7); if ((tty->termios.c_oflag & TABDLY) == XTABS) { tty->column += i; 80055b4: 59 63 00 28 sw (r11+40),r3 rtems_termios_puts ( " ", i, tty); 80055b8: 38 21 14 c0 ori r1,r1,0x14c0 80055bc: e0 00 00 20 bi 800563c return; } tty->column += i; 80055c0: 59 63 00 28 sw (r11+40),r3 <== NOT EXECUTED break; 80055c4: e0 00 00 1c bi 8005634 <== NOT EXECUTED case '\b': if (tty->column > 0) 80055c8: 29 61 00 28 lw r1,(r11+40) <== NOT EXECUTED 80055cc: 4c 01 00 1a bge r0,r1,8005634 <== NOT EXECUTED tty->column--; 80055d0: 34 21 ff ff addi r1,r1,-1 <== NOT EXECUTED 80055d4: e0 00 00 17 bi 8005630 <== NOT EXECUTED break; default: if (tty->termios.c_oflag & OLCUC) 80055d8: 20 21 00 02 andi r1,r1,0x2 80055dc: 44 20 00 0b be r1,r0,8005608 <== ALWAYS TAKEN c = toupper(c); 80055e0: 78 01 08 02 mvhi r1,0x802 <== NOT EXECUTED 80055e4: 38 21 34 14 ori r1,r1,0x3414 <== NOT EXECUTED 80055e8: 28 21 00 00 lw r1,(r1+0) <== NOT EXECUTED 80055ec: b4 22 08 00 add r1,r1,r2 <== NOT EXECUTED 80055f0: 40 23 00 01 lbu r3,(r1+1) <== NOT EXECUTED 80055f4: 34 01 00 02 mvi r1,2 <== NOT EXECUTED 80055f8: 20 63 00 03 andi r3,r3,0x3 <== NOT EXECUTED 80055fc: 5c 61 00 02 bne r3,r1,8005604 <== NOT EXECUTED 8005600: 34 42 ff e0 addi r2,r2,-32 <== NOT EXECUTED 8005604: 33 82 00 0c sb (sp+12),r2 <== NOT EXECUTED if (!iscntrl(c)) 8005608: 78 01 08 02 mvhi r1,0x802 800560c: 38 21 34 14 ori r1,r1,0x3414 8005610: 43 82 00 0c lbu r2,(sp+12) 8005614: 28 21 00 00 lw r1,(r1+0) 8005618: b4 22 08 00 add r1,r1,r2 800561c: 40 21 00 01 lbu r1,(r1+1) 8005620: 20 21 00 20 andi r1,r1,0x20 8005624: 5c 20 00 04 bne r1,r0,8005634 <== NEVER TAKEN tty->column++; 8005628: 29 61 00 28 lw r1,(r11+40) 800562c: 34 21 00 01 addi r1,r1,1 8005630: 59 61 00 28 sw (r11+40),r1 break; } } rtems_termios_puts (&c, 1, tty); 8005634: 37 81 00 0c addi r1,sp,12 8005638: 34 02 00 01 mvi r2,1 800563c: b9 60 18 00 mv r3,r11 8005640: fb ff ff 53 calli 800538c } 8005644: 2b 9d 00 04 lw ra,(sp+4) 8005648: 2b 8b 00 08 lw r11,(sp+8) 800564c: 37 9c 00 0c addi sp,sp,12 8005650: c3 a0 00 00 ret =============================================================================== 08009238 : * Called by pipe() to create an anonymous pipe. */ int pipe_create( int filsdes[2] ) { 8009238: 37 9c ff d8 addi sp,sp,-40 800923c: 5b 8b 00 18 sw (sp+24),r11 8009240: 5b 8c 00 14 sw (sp+20),r12 8009244: 5b 8d 00 10 sw (sp+16),r13 8009248: 5b 8e 00 0c sw (sp+12),r14 800924c: 5b 8f 00 08 sw (sp+8),r15 8009250: 5b 9d 00 04 sw (sp+4),ra 8009254: b8 20 70 00 mv r14,r1 rtems_libio_t *iop; int err = 0; if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0) 8009258: 78 01 08 01 mvhi r1,0x801 800925c: 38 21 e9 f8 ori r1,r1,0xe9f8 8009260: 34 02 01 ff mvi r2,511 8009264: f8 00 06 42 calli 800ab6c 8009268: b8 20 78 00 mv r15,r1 return -1; 800926c: 34 0d ff ff mvi r13,-1 ) { rtems_libio_t *iop; int err = 0; if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0) 8009270: 5c 20 00 43 bne r1,r0,800937c <== NEVER TAKEN return -1; /* /tmp/.fifoXXXX */ char fifopath[15]; memcpy(fifopath, "/tmp/.fifo", 10); 8009274: 78 02 08 01 mvhi r2,0x801 8009278: 38 42 ea 00 ori r2,r2,0xea00 800927c: 28 43 00 00 lw r3,(r2+0) 8009280: 28 41 00 04 lw r1,(r2+4) 8009284: 37 8b 00 1c addi r11,sp,28 8009288: 5b 83 00 1c sw (sp+28),r3 800928c: 59 61 00 04 sw (r11+4),r1 8009290: 2c 41 00 08 lhu r1,(r2+8) sprintf(fifopath + 10, "%04x", rtems_pipe_no ++); 8009294: 78 02 08 02 mvhi r2,0x802 8009298: 38 42 07 0c ori r2,r2,0x70c 800929c: 2c 43 00 00 lhu r3,(r2+0) if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0) return -1; /* /tmp/.fifoXXXX */ char fifopath[15]; memcpy(fifopath, "/tmp/.fifo", 10); 80092a0: 0d 61 00 08 sh (r11+8),r1 sprintf(fifopath + 10, "%04x", rtems_pipe_no ++); 80092a4: 34 61 00 01 addi r1,r3,1 80092a8: 0c 41 00 00 sh (r2+0),r1 80092ac: 78 02 08 01 mvhi r2,0x801 80092b0: 38 42 ea 0c ori r2,r2,0xea0c 80092b4: 37 81 00 26 addi r1,sp,38 80092b8: f8 00 17 ed calli 800f26c /* Try creating FIFO file until find an available file name */ while (mkfifo(fifopath, S_IRUSR|S_IWUSR) != 0) { 80092bc: b9 60 08 00 mv r1,r11 80092c0: 34 02 01 80 mvi r2,384 80092c4: f8 00 05 5f calli 800a840 80092c8: b8 20 60 00 mv r12,r1 80092cc: 44 2f 00 03 be r1,r15,80092d8 if (errno != EEXIST){ 80092d0: f8 00 14 71 calli 800e494 <__errno> 80092d4: e0 00 00 2a bi 800937c 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); 80092d8: b9 60 08 00 mv r1,r11 80092dc: 34 02 40 00 mvi r2,16384 80092e0: fb ff e9 73 calli 80038ac 80092e4: 59 c1 00 00 sw (r14+0),r1 if (filsdes[0] < 0) { 80092e8: 4c 2c 00 05 bge r1,r12,80092fc err = errno; 80092ec: f8 00 14 6a calli 800e494 <__errno> 80092f0: 28 2c 00 00 lw r12,(r1+0) /* 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); 80092f4: b9 60 08 00 mv r1,r11 80092f8: e0 00 00 1b bi 8009364 } else { /* Reset open file to blocking mode */ iop = rtems_libio_iop(filsdes[0]); 80092fc: 78 02 08 02 mvhi r2,0x802 8009300: 38 42 00 10 ori r2,r2,0x10 8009304: 28 44 00 00 lw r4,(r2+0) 8009308: 34 02 00 00 mvi r2,0 800930c: 50 24 00 07 bgeu r1,r4,8009328 <== NEVER TAKEN 8009310: 34 02 00 06 mvi r2,6 8009314: 78 0b 08 02 mvhi r11,0x802 8009318: f8 00 4f 6b calli 801d0c4 <__ashlsi3> 800931c: 39 6b 07 84 ori r11,r11,0x784 8009320: 29 62 00 00 lw r2,(r11+0) 8009324: b4 41 10 00 add r2,r2,r1 iop->flags &= ~LIBIO_FLAGS_NO_DELAY; 8009328: 28 43 00 18 lw r3,(r2+24) 800932c: 34 01 ff fe mvi r1,-2 int pipe_create( int filsdes[2] ) { rtems_libio_t *iop; int err = 0; 8009330: 34 0c 00 00 mvi r12,0 unlink(fifopath); } else { /* Reset open file to blocking mode */ iop = rtems_libio_iop(filsdes[0]); iop->flags &= ~LIBIO_FLAGS_NO_DELAY; 8009334: a0 61 08 00 and r1,r3,r1 8009338: 58 41 00 18 sw (r2+24),r1 filsdes[1] = open(fifopath, O_WRONLY); 800933c: 37 81 00 1c addi r1,sp,28 8009340: 34 02 00 01 mvi r2,1 8009344: fb ff e9 5a calli 80038ac 8009348: 59 c1 00 04 sw (r14+4),r1 if (filsdes[1] < 0) { 800934c: 4c 20 00 05 bge r1,r0,8009360 err = errno; 8009350: f8 00 14 51 calli 800e494 <__errno> 8009354: 28 2c 00 00 lw r12,(r1+0) close(filsdes[0]); 8009358: 29 c1 00 00 lw r1,(r14+0) 800935c: fb ff e4 a5 calli 80025f0 } unlink(fifopath); 8009360: 37 81 00 1c addi r1,sp,28 8009364: fb ff ea 64 calli 8003cf4 } if(err != 0) rtems_set_errno_and_return_minus_one(err); return 0; 8009368: 34 0d 00 00 mvi r13,0 err = errno; close(filsdes[0]); } unlink(fifopath); } if(err != 0) 800936c: 45 80 00 04 be r12,r0,800937c rtems_set_errno_and_return_minus_one(err); 8009370: f8 00 14 49 calli 800e494 <__errno> 8009374: 58 2c 00 00 sw (r1+0),r12 8009378: 34 0d ff ff mvi r13,-1 return 0; } 800937c: b9 a0 08 00 mv r1,r13 8009380: 2b 9d 00 04 lw ra,(sp+4) 8009384: 2b 8b 00 18 lw r11,(sp+24) 8009388: 2b 8c 00 14 lw r12,(sp+20) 800938c: 2b 8d 00 10 lw r13,(sp+16) 8009390: 2b 8e 00 0c lw r14,(sp+12) 8009394: 2b 8f 00 08 lw r15,(sp+8) 8009398: 37 9c 00 28 addi sp,sp,40 800939c: c3 a0 00 00 ret =============================================================================== 0800aa68 : pipe_control_t *pipe, uint32_t cmd, void *buffer, rtems_libio_t *iop ) { 800aa68: 37 9c ff f4 addi sp,sp,-12 800aa6c: 5b 8b 00 0c sw (sp+12),r11 800aa70: 5b 8c 00 08 sw (sp+8),r12 800aa74: 5b 9d 00 04 sw (sp+4),ra 800aa78: b8 60 60 00 mv r12,r3 if (cmd == FIONREAD) { 800aa7c: 78 03 08 02 mvhi r3,0x802 800aa80: 38 63 21 80 ori r3,r3,0x2180 pipe_control_t *pipe, uint32_t cmd, void *buffer, rtems_libio_t *iop ) { 800aa84: b8 20 58 00 mv r11,r1 if (cmd == FIONREAD) { 800aa88: 28 61 00 00 lw r1,(r3+0) *(unsigned int *)buffer = pipe->Length; PIPE_UNLOCK(pipe); return 0; } return -EINVAL; 800aa8c: 34 04 ff ea mvi r4,-22 uint32_t cmd, void *buffer, rtems_libio_t *iop ) { if (cmd == FIONREAD) { 800aa90: 5c 41 00 0e bne r2,r1,800aac8 if (buffer == NULL) return -EFAULT; 800aa94: 34 04 ff f2 mvi r4,-14 void *buffer, rtems_libio_t *iop ) { if (cmd == FIONREAD) { if (buffer == NULL) 800aa98: 45 80 00 0c be r12,r0,800aac8 return -EFAULT; if (! PIPE_LOCK(pipe)) 800aa9c: 29 61 00 28 lw r1,(r11+40) 800aaa0: 34 02 00 00 mvi r2,0 800aaa4: 34 03 00 00 mvi r3,0 800aaa8: fb ff e9 99 calli 800510c return -EINTR; 800aaac: 34 04 ff fc mvi r4,-4 { if (cmd == FIONREAD) { if (buffer == NULL) return -EFAULT; if (! PIPE_LOCK(pipe)) 800aab0: 5c 20 00 06 bne r1,r0,800aac8 <== NEVER TAKEN return -EINTR; /* Return length of pipe */ *(unsigned int *)buffer = pipe->Length; 800aab4: 29 61 00 0c lw r1,(r11+12) 800aab8: 59 81 00 00 sw (r12+0),r1 PIPE_UNLOCK(pipe); 800aabc: 29 61 00 28 lw r1,(r11+40) 800aac0: fb ff e9 e3 calli 800524c return 0; 800aac4: 34 04 00 00 mvi r4,0 } return -EINVAL; } 800aac8: b8 80 08 00 mv r1,r4 800aacc: 2b 9d 00 04 lw ra,(sp+4) 800aad0: 2b 8b 00 0c lw r11,(sp+12) 800aad4: 2b 8c 00 08 lw r12,(sp+8) 800aad8: 37 9c 00 0c addi sp,sp,12 800aadc: c3 a0 00 00 ret =============================================================================== 0800a6c4 : pipe_control_t *pipe, void *buffer, size_t count, rtems_libio_t *iop ) { 800a6c4: 37 9c ff d8 addi sp,sp,-40 800a6c8: 5b 8b 00 24 sw (sp+36),r11 800a6cc: 5b 8c 00 20 sw (sp+32),r12 800a6d0: 5b 8d 00 1c sw (sp+28),r13 800a6d4: 5b 8e 00 18 sw (sp+24),r14 800a6d8: 5b 8f 00 14 sw (sp+20),r15 800a6dc: 5b 90 00 10 sw (sp+16),r16 800a6e0: 5b 91 00 0c sw (sp+12),r17 800a6e4: 5b 92 00 08 sw (sp+8),r18 800a6e8: 5b 9d 00 04 sw (sp+4),ra 800a6ec: b8 20 58 00 mv r11,r1 int chunk, chunk1, read = 0, ret = 0; if (! PIPE_LOCK(pipe)) 800a6f0: 28 21 00 28 lw r1,(r1+40) pipe_control_t *pipe, void *buffer, size_t count, rtems_libio_t *iop ) { 800a6f4: b8 40 78 00 mv r15,r2 800a6f8: b8 60 80 00 mv r16,r3 int chunk, chunk1, read = 0, ret = 0; if (! PIPE_LOCK(pipe)) 800a6fc: 34 02 00 00 mvi r2,0 800a700: 34 03 00 00 mvi r3,0 pipe_control_t *pipe, void *buffer, size_t count, rtems_libio_t *iop ) { 800a704: b8 80 88 00 mv r17,r4 int chunk, chunk1, read = 0, ret = 0; if (! PIPE_LOCK(pipe)) 800a708: fb ff ea 81 calli 800510c return -EINTR; 800a70c: 34 0d ff fc mvi r13,-4 rtems_libio_t *iop ) { int chunk, chunk1, read = 0, ret = 0; if (! PIPE_LOCK(pipe)) 800a710: 34 0c 00 00 mvi r12,0 } /* Wait until pipe is no more empty or no writer exists */ pipe->waitingReaders ++; PIPE_UNLOCK(pipe); if (! PIPE_READWAIT(pipe)) 800a714: 34 12 ff fc mvi r18,-4 rtems_libio_t *iop ) { int chunk, chunk1, read = 0, ret = 0; if (! PIPE_LOCK(pipe)) 800a718: 44 20 00 40 be r1,r0,800a818 <== ALWAYS TAKEN 800a71c: e0 00 00 49 bi 800a840 <== NOT EXECUTED return -EINTR; while (read < count) { while (PIPE_EMPTY(pipe)) { /* Not an error */ if (pipe->Writers == 0) 800a720: 29 61 00 14 lw r1,(r11+20) 800a724: 44 2d 00 3e be r1,r13,800a81c <== NEVER TAKEN goto out_locked; if (LIBIO_NODELAY(iop)) { 800a728: 2a 2d 00 18 lw r13,(r17+24) 800a72c: 21 ad 00 01 andi r13,r13,0x1 800a730: 5d a0 00 3d bne r13,r0,800a824 <== NEVER TAKEN ret = -EAGAIN; goto out_locked; } /* Wait until pipe is no more empty or no writer exists */ pipe->waitingReaders ++; 800a734: 29 61 00 18 lw r1,(r11+24) 800a738: 34 21 00 01 addi r1,r1,1 800a73c: 59 61 00 18 sw (r11+24),r1 PIPE_UNLOCK(pipe); 800a740: 29 61 00 28 lw r1,(r11+40) 800a744: fb ff ea c2 calli 800524c if (! PIPE_READWAIT(pipe)) 800a748: 29 61 00 2c lw r1,(r11+44) 800a74c: 34 02 00 00 mvi r2,0 800a750: f8 00 06 ca calli 800c278 800a754: fc 2d 68 00 cmpne r13,r1,r13 ret = -EINTR; if (! PIPE_LOCK(pipe)) { 800a758: 29 61 00 28 lw r1,(r11+40) } /* Wait until pipe is no more empty or no writer exists */ pipe->waitingReaders ++; PIPE_UNLOCK(pipe); if (! PIPE_READWAIT(pipe)) 800a75c: c8 0d 68 00 sub r13,r0,r13 ret = -EINTR; if (! PIPE_LOCK(pipe)) { 800a760: 34 02 00 00 mvi r2,0 800a764: 34 03 00 00 mvi r3,0 } /* Wait until pipe is no more empty or no writer exists */ pipe->waitingReaders ++; PIPE_UNLOCK(pipe); if (! PIPE_READWAIT(pipe)) 800a768: a1 b2 68 00 and r13,r13,r18 ret = -EINTR; if (! PIPE_LOCK(pipe)) { 800a76c: fb ff ea 68 calli 800510c 800a770: 5c 20 00 31 bne r1,r0,800a834 <== NEVER TAKEN /* WARN waitingReaders not restored! */ ret = -EINTR; goto out_nolock; } pipe->waitingReaders --; 800a774: 29 62 00 18 lw r2,(r11+24) 800a778: 34 42 ff ff addi r2,r2,-1 800a77c: 59 62 00 18 sw (r11+24),r2 if (ret != 0) 800a780: 5d a1 00 2a bne r13,r1,800a828 <== NEVER TAKEN if (! PIPE_LOCK(pipe)) return -EINTR; while (read < count) { while (PIPE_EMPTY(pipe)) { 800a784: 29 6d 00 0c lw r13,(r11+12) 800a788: 45 a0 ff e6 be r13,r0,800a720 if (ret != 0) goto out_locked; } /* Read chunk bytes */ chunk = MIN(count - read, pipe->Length); 800a78c: ca 0c 08 00 sub r1,r16,r12 800a790: 50 2d 00 02 bgeu r1,r13,800a798 800a794: b8 20 68 00 mv r13,r1 chunk1 = pipe->Size - pipe->Start; 800a798: 29 65 00 08 lw r5,(r11+8) 800a79c: 29 6e 00 04 lw r14,(r11+4) 800a7a0: 29 66 00 00 lw r6,(r11+0) 800a7a4: b5 ec 08 00 add r1,r15,r12 800a7a8: c9 c5 70 00 sub r14,r14,r5 if (chunk > chunk1) { memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk1); memcpy(buffer + read + chunk1, pipe->Buffer, chunk - chunk1); } else memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk); 800a7ac: b4 c5 10 00 add r2,r6,r5 800a7b0: b9 a0 18 00 mv r3,r13 } /* Read chunk bytes */ chunk = MIN(count - read, pipe->Length); chunk1 = pipe->Size - pipe->Start; if (chunk > chunk1) { 800a7b4: 4d cd 00 08 bge r14,r13,800a7d4 memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk1); 800a7b8: b4 c5 10 00 add r2,r6,r5 800a7bc: b9 c0 18 00 mv r3,r14 800a7c0: f8 00 16 1b calli 801002c memcpy(buffer + read + chunk1, pipe->Buffer, chunk - chunk1); 800a7c4: 29 62 00 00 lw r2,(r11+0) 800a7c8: b5 8e 08 00 add r1,r12,r14 800a7cc: b5 e1 08 00 add r1,r15,r1 800a7d0: c9 ae 18 00 sub r3,r13,r14 } else memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk); 800a7d4: f8 00 16 16 calli 801002c pipe->Start += chunk; 800a7d8: 29 61 00 08 lw r1,(r11+8) pipe->Start %= pipe->Size; 800a7dc: 29 62 00 04 lw r2,(r11+4) 800a7e0: b5 a1 08 00 add r1,r13,r1 800a7e4: f8 00 57 f3 calli 80207b0 <__umodsi3> 800a7e8: 59 61 00 08 sw (r11+8),r1 pipe->Length -= chunk; 800a7ec: 29 61 00 0c lw r1,(r11+12) 800a7f0: c8 2d 08 00 sub r1,r1,r13 800a7f4: 59 61 00 0c sw (r11+12),r1 /* For buffering optimization */ if (PIPE_EMPTY(pipe)) 800a7f8: 5c 20 00 02 bne r1,r0,800a800 pipe->Start = 0; 800a7fc: 59 60 00 08 sw (r11+8),r0 if (pipe->waitingWriters > 0) 800a800: 29 61 00 1c lw r1,(r11+28) 800a804: 44 20 00 04 be r1,r0,800a814 PIPE_WAKEUPWRITERS(pipe); 800a808: 29 61 00 30 lw r1,(r11+48) 800a80c: 37 82 00 28 addi r2,sp,40 800a810: f8 00 06 7d calli 800c204 read += chunk; 800a814: b5 8d 60 00 add r12,r12,r13 int chunk, chunk1, read = 0, ret = 0; if (! PIPE_LOCK(pipe)) return -EINTR; while (read < count) { 800a818: 56 0c ff db bgu r16,r12,800a784 while (PIPE_EMPTY(pipe)) { /* Not an error */ if (pipe->Writers == 0) 800a81c: 34 0d 00 00 mvi r13,0 800a820: e0 00 00 02 bi 800a828 goto out_locked; if (LIBIO_NODELAY(iop)) { ret = -EAGAIN; 800a824: 34 0d ff f5 mvi r13,-11 PIPE_WAKEUPWRITERS(pipe); read += chunk; } out_locked: PIPE_UNLOCK(pipe); 800a828: 29 61 00 28 lw r1,(r11+40) 800a82c: fb ff ea 88 calli 800524c 800a830: e0 00 00 02 bi 800a838 PIPE_UNLOCK(pipe); if (! PIPE_READWAIT(pipe)) ret = -EINTR; if (! PIPE_LOCK(pipe)) { /* WARN waitingReaders not restored! */ ret = -EINTR; 800a834: 34 0d ff fc mvi r13,-4 <== NOT EXECUTED out_locked: PIPE_UNLOCK(pipe); out_nolock: if (read > 0) 800a838: 4c 0c 00 02 bge r0,r12,800a840 800a83c: b9 80 68 00 mv r13,r12 return read; return ret; } 800a840: b9 a0 08 00 mv r1,r13 800a844: 2b 9d 00 04 lw ra,(sp+4) 800a848: 2b 8b 00 24 lw r11,(sp+36) 800a84c: 2b 8c 00 20 lw r12,(sp+32) 800a850: 2b 8d 00 1c lw r13,(sp+28) 800a854: 2b 8e 00 18 lw r14,(sp+24) 800a858: 2b 8f 00 14 lw r15,(sp+20) 800a85c: 2b 90 00 10 lw r16,(sp+16) 800a860: 2b 91 00 0c lw r17,(sp+12) 800a864: 2b 92 00 08 lw r18,(sp+8) 800a868: 37 9c 00 28 addi sp,sp,40 800a86c: c3 a0 00 00 ret =============================================================================== 0800a1dc : */ void pipe_release( pipe_control_t **pipep, rtems_libio_t *iop ) { 800a1dc: 37 9c ff ec addi sp,sp,-20 800a1e0: 5b 8b 00 10 sw (sp+16),r11 800a1e4: 5b 8c 00 0c sw (sp+12),r12 800a1e8: 5b 8d 00 08 sw (sp+8),r13 800a1ec: 5b 9d 00 04 sw (sp+4),ra 800a1f0: b8 20 68 00 mv r13,r1 pipe_control_t *pipe = *pipep; 800a1f4: 28 2b 00 00 lw r11,(r1+0) /* WARN pipe not released! */ if (!PIPE_LOCK(pipe)) rtems_fatal_error_occurred(0xdeadbeef); #endif mode = LIBIO_ACCMODE(iop); 800a1f8: 28 41 00 18 lw r1,(r2+24) 800a1fc: 20 2c 00 06 andi r12,r1,0x6 if (mode & LIBIO_FLAGS_READ) 800a200: 20 21 00 02 andi r1,r1,0x2 800a204: 44 20 00 04 be r1,r0,800a214 pipe->Readers --; 800a208: 29 61 00 10 lw r1,(r11+16) 800a20c: 34 21 ff ff addi r1,r1,-1 800a210: 59 61 00 10 sw (r11+16),r1 if (mode & LIBIO_FLAGS_WRITE) 800a214: 21 81 00 04 andi r1,r12,0x4 800a218: 44 20 00 04 be r1,r0,800a228 pipe->Writers --; 800a21c: 29 61 00 14 lw r1,(r11+20) 800a220: 34 21 ff ff addi r1,r1,-1 800a224: 59 61 00 14 sw (r11+20),r1 PIPE_UNLOCK(pipe); 800a228: 29 61 00 28 lw r1,(r11+40) 800a22c: fb ff ec 08 calli 800524c if (pipe->Readers == 0 && pipe->Writers == 0) { 800a230: 29 62 00 10 lw r2,(r11+16) 800a234: 5c 40 00 07 bne r2,r0,800a250 800a238: 29 61 00 14 lw r1,(r11+20) 800a23c: 5c 22 00 05 bne r1,r2,800a250 #if 0 /* To delete an anonymous pipe file when all users closed it */ if (pipe->Anonymous) delfile = TRUE; #endif pipe_free(pipe); 800a240: b9 60 08 00 mv r1,r11 800a244: fb ff ff d4 calli 800a194 *pipep = NULL; 800a248: 59 a0 00 00 sw (r13+0),r0 800a24c: e0 00 00 0f bi 800a288 } else if (pipe->Readers == 0 && mode != LIBIO_FLAGS_WRITE) 800a250: 7d 81 00 04 cmpnei r1,r12,4 800a254: 64 42 00 00 cmpei r2,r2,0 800a258: a0 22 10 00 and r2,r1,r2 800a25c: 44 40 00 03 be r2,r0,800a268 /* Notify waiting Writers that all their partners left */ PIPE_WAKEUPWRITERS(pipe); 800a260: 29 61 00 30 lw r1,(r11+48) 800a264: e0 00 00 07 bi 800a280 else if (pipe->Writers == 0 && mode != LIBIO_FLAGS_READ) 800a268: 29 61 00 14 lw r1,(r11+20) 800a26c: 7d 8c 00 02 cmpnei r12,r12,2 800a270: 64 21 00 00 cmpei r1,r1,0 800a274: a1 81 60 00 and r12,r12,r1 800a278: 45 82 00 04 be r12,r2,800a288 <== NEVER TAKEN PIPE_WAKEUPREADERS(pipe); 800a27c: 29 61 00 2c lw r1,(r11+44) 800a280: 37 82 00 14 addi r2,sp,20 800a284: f8 00 07 e0 calli 800c204 pipe_unlock(); 800a288: fb ff ff ba calli 800a170 iop->flags &= ~LIBIO_FLAGS_OPEN; if(iop->pathinfo.ops->unlink_h(&iop->pathinfo)) return; #endif } 800a28c: 2b 9d 00 04 lw ra,(sp+4) 800a290: 2b 8b 00 10 lw r11,(sp+16) 800a294: 2b 8c 00 0c lw r12,(sp+12) 800a298: 2b 8d 00 08 lw r13,(sp+8) 800a29c: 37 9c 00 14 addi sp,sp,20 800a2a0: c3 a0 00 00 ret =============================================================================== 0800a870 : pipe_control_t *pipe, const void *buffer, size_t count, rtems_libio_t *iop ) { 800a870: 37 9c ff d4 addi sp,sp,-44 800a874: 5b 8b 00 28 sw (sp+40),r11 800a878: 5b 8c 00 24 sw (sp+36),r12 800a87c: 5b 8d 00 20 sw (sp+32),r13 800a880: 5b 8e 00 1c sw (sp+28),r14 800a884: 5b 8f 00 18 sw (sp+24),r15 800a888: 5b 90 00 14 sw (sp+20),r16 800a88c: 5b 91 00 10 sw (sp+16),r17 800a890: 5b 92 00 0c sw (sp+12),r18 800a894: 5b 93 00 08 sw (sp+8),r19 800a898: 5b 9d 00 04 sw (sp+4),ra int chunk, chunk1, written = 0, ret = 0; /* Write nothing */ if (count == 0) return 0; 800a89c: 34 0d 00 00 mvi r13,0 pipe_control_t *pipe, const void *buffer, size_t count, rtems_libio_t *iop ) { 800a8a0: b8 20 58 00 mv r11,r1 800a8a4: b8 40 88 00 mv r17,r2 800a8a8: b8 60 70 00 mv r14,r3 800a8ac: b8 80 90 00 mv r18,r4 int chunk, chunk1, written = 0, ret = 0; /* Write nothing */ if (count == 0) 800a8b0: 44 60 00 61 be r3,r0,800aa34 <== NEVER TAKEN return 0; if (! PIPE_LOCK(pipe)) 800a8b4: 28 21 00 28 lw r1,(r1+40) 800a8b8: 34 02 00 00 mvi r2,0 800a8bc: 34 03 00 00 mvi r3,0 800a8c0: fb ff ea 13 calli 800510c return -EINTR; 800a8c4: 34 0d ff fc mvi r13,-4 /* Write nothing */ if (count == 0) return 0; if (! PIPE_LOCK(pipe)) 800a8c8: 5c 20 00 5b bne r1,r0,800aa34 <== NEVER TAKEN return -EINTR; if (pipe->Readers == 0) { 800a8cc: 29 62 00 10 lw r2,(r11+16) 800a8d0: 44 41 00 48 be r2,r1,800a9f0 ret = -EPIPE; goto out_locked; } /* Write of PIPE_BUF bytes or less shall not be interleaved */ chunk = count <= pipe->Size ? count : 1; 800a8d4: 29 61 00 04 lw r1,(r11+4) 800a8d8: 34 10 00 01 mvi r16,1 800a8dc: 55 c1 00 02 bgu r14,r1,800a8e4 <== NEVER TAKEN 800a8e0: b9 c0 80 00 mv r16,r14 /* Wait until there is chunk bytes space or no reader exists */ pipe->waitingWriters ++; PIPE_UNLOCK(pipe); if (! PIPE_WRITEWAIT(pipe)) ret = -EINTR; 800a8e4: 34 0c 00 00 mvi r12,0 } /* Wait until there is chunk bytes space or no reader exists */ pipe->waitingWriters ++; PIPE_UNLOCK(pipe); if (! PIPE_WRITEWAIT(pipe)) 800a8e8: 34 13 ff fc mvi r19,-4 800a8ec: e0 00 00 3e bi 800a9e4 /* 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)) { 800a8f0: 2a 4d 00 18 lw r13,(r18+24) 800a8f4: 21 ad 00 01 andi r13,r13,0x1 800a8f8: 5d a0 00 41 bne r13,r0,800a9fc ret = -EAGAIN; goto out_locked; } /* Wait until there is chunk bytes space or no reader exists */ pipe->waitingWriters ++; 800a8fc: 29 61 00 1c lw r1,(r11+28) 800a900: 34 21 00 01 addi r1,r1,1 800a904: 59 61 00 1c sw (r11+28),r1 PIPE_UNLOCK(pipe); 800a908: 29 61 00 28 lw r1,(r11+40) 800a90c: fb ff ea 50 calli 800524c if (! PIPE_WRITEWAIT(pipe)) 800a910: 29 61 00 30 lw r1,(r11+48) 800a914: 34 02 00 00 mvi r2,0 800a918: f8 00 06 58 calli 800c278 800a91c: fc 2d 68 00 cmpne r13,r1,r13 ret = -EINTR; if (! PIPE_LOCK(pipe)) { 800a920: 29 61 00 28 lw r1,(r11+40) } /* Wait until there is chunk bytes space or no reader exists */ pipe->waitingWriters ++; PIPE_UNLOCK(pipe); if (! PIPE_WRITEWAIT(pipe)) 800a924: c8 0d 68 00 sub r13,r0,r13 ret = -EINTR; if (! PIPE_LOCK(pipe)) { 800a928: 34 02 00 00 mvi r2,0 800a92c: 34 03 00 00 mvi r3,0 } /* Wait until there is chunk bytes space or no reader exists */ pipe->waitingWriters ++; PIPE_UNLOCK(pipe); if (! PIPE_WRITEWAIT(pipe)) 800a930: a1 b3 68 00 and r13,r13,r19 ret = -EINTR; if (! PIPE_LOCK(pipe)) { 800a934: fb ff e9 f6 calli 800510c 800a938: 5c 20 00 3c bne r1,r0,800aa28 <== NEVER TAKEN /* WARN waitingWriters not restored! */ ret = -EINTR; goto out_nolock; } pipe->waitingWriters --; 800a93c: 29 62 00 1c lw r2,(r11+28) 800a940: 34 42 ff ff addi r2,r2,-1 800a944: 59 62 00 1c sw (r11+28),r2 if (ret != 0) 800a948: 5d a1 00 30 bne r13,r1,800aa08 <== NEVER TAKEN goto out_locked; if (pipe->Readers == 0) { 800a94c: 29 61 00 10 lw r1,(r11+16) 800a950: 44 2d 00 2d be r1,r13,800aa04 <== 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) { 800a954: 29 6f 00 04 lw r15,(r11+4) 800a958: 29 61 00 0c lw r1,(r11+12) 800a95c: c9 e1 68 00 sub r13,r15,r1 800a960: 56 0d ff e4 bgu r16,r13,800a8f0 ret = -EPIPE; goto out_locked; } } chunk = MIN(count - written, PIPE_SPACE(pipe)); 800a964: c9 cc 10 00 sub r2,r14,r12 800a968: 50 4d 00 02 bgeu r2,r13,800a970 800a96c: b8 40 68 00 mv r13,r2 chunk1 = pipe->Size - PIPE_WSTART(pipe); 800a970: 29 62 00 08 lw r2,(r11+8) 800a974: b4 22 08 00 add r1,r1,r2 800a978: b9 e0 10 00 mv r2,r15 800a97c: f8 00 57 8d calli 80207b0 <__umodsi3> 800a980: c9 e1 78 00 sub r15,r15,r1 800a984: 29 63 00 00 lw r3,(r11+0) 800a988: b6 2c 10 00 add r2,r17,r12 if (chunk > chunk1) { 800a98c: 4d ed 00 09 bge r15,r13,800a9b0 memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk1); 800a990: b4 61 08 00 add r1,r3,r1 800a994: b9 e0 18 00 mv r3,r15 800a998: f8 00 15 a5 calli 801002c memcpy(pipe->Buffer, buffer + written + chunk1, chunk - chunk1); 800a99c: b5 ec 10 00 add r2,r15,r12 800a9a0: 29 61 00 00 lw r1,(r11+0) 800a9a4: b6 22 10 00 add r2,r17,r2 800a9a8: c9 af 18 00 sub r3,r13,r15 800a9ac: e0 00 00 03 bi 800a9b8 } else memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk); 800a9b0: b4 61 08 00 add r1,r3,r1 800a9b4: b9 a0 18 00 mv r3,r13 800a9b8: f8 00 15 9d calli 801002c pipe->Length += chunk; 800a9bc: 29 61 00 0c lw r1,(r11+12) 800a9c0: b4 2d 08 00 add r1,r1,r13 800a9c4: 59 61 00 0c sw (r11+12),r1 if (pipe->waitingReaders > 0) 800a9c8: 29 61 00 18 lw r1,(r11+24) 800a9cc: 44 20 00 04 be r1,r0,800a9dc PIPE_WAKEUPREADERS(pipe); 800a9d0: 29 61 00 2c lw r1,(r11+44) 800a9d4: 37 82 00 2c addi r2,sp,44 800a9d8: f8 00 06 0b calli 800c204 written += chunk; 800a9dc: b5 8d 60 00 add r12,r12,r13 /* Write of more than PIPE_BUF bytes can be interleaved */ chunk = 1; 800a9e0: 34 10 00 01 mvi r16,1 } /* Write of PIPE_BUF bytes or less shall not be interleaved */ chunk = count <= pipe->Size ? count : 1; while (written < count) { 800a9e4: 55 cc ff dc bgu r14,r12,800a954 800a9e8: 34 0d 00 00 mvi r13,0 800a9ec: e0 00 00 07 bi 800aa08 if (! PIPE_LOCK(pipe)) return -EINTR; if (pipe->Readers == 0) { ret = -EPIPE; 800a9f0: 34 0d ff e0 mvi r13,-32 const void *buffer, size_t count, rtems_libio_t *iop ) { int chunk, chunk1, written = 0, ret = 0; 800a9f4: 34 0c 00 00 mvi r12,0 800a9f8: e0 00 00 04 bi 800aa08 chunk = count <= pipe->Size ? count : 1; while (written < count) { while (PIPE_SPACE(pipe) < chunk) { if (LIBIO_NODELAY(iop)) { ret = -EAGAIN; 800a9fc: 34 0d ff f5 mvi r13,-11 800aa00: e0 00 00 02 bi 800aa08 pipe->waitingWriters --; if (ret != 0) goto out_locked; if (pipe->Readers == 0) { ret = -EPIPE; 800aa04: 34 0d ff e0 mvi r13,-32 <== NOT EXECUTED /* Write of more than PIPE_BUF bytes can be interleaved */ chunk = 1; } out_locked: PIPE_UNLOCK(pipe); 800aa08: 29 61 00 28 lw r1,(r11+40) 800aa0c: fb ff ea 10 calli 800524c out_nolock: #ifdef RTEMS_POSIX_API /* Signal SIGPIPE */ if (ret == -EPIPE) 800aa10: 34 01 ff e0 mvi r1,-32 800aa14: 5d a1 00 06 bne r13,r1,800aa2c kill(getpid(), SIGPIPE); 800aa18: f8 00 02 52 calli 800b360 800aa1c: 34 02 00 0d mvi r2,13 800aa20: f8 00 03 36 calli 800b6f8 800aa24: e0 00 00 02 bi 800aa2c PIPE_UNLOCK(pipe); if (! PIPE_WRITEWAIT(pipe)) ret = -EINTR; if (! PIPE_LOCK(pipe)) { /* WARN waitingWriters not restored! */ ret = -EINTR; 800aa28: 34 0d ff fc mvi r13,-4 <== NOT EXECUTED /* Signal SIGPIPE */ if (ret == -EPIPE) kill(getpid(), SIGPIPE); #endif if (written > 0) 800aa2c: 4c 0c 00 02 bge r0,r12,800aa34 800aa30: b9 80 68 00 mv r13,r12 return written; return ret; } 800aa34: b9 a0 08 00 mv r1,r13 800aa38: 2b 9d 00 04 lw ra,(sp+4) 800aa3c: 2b 8b 00 28 lw r11,(sp+40) 800aa40: 2b 8c 00 24 lw r12,(sp+36) 800aa44: 2b 8d 00 20 lw r13,(sp+32) 800aa48: 2b 8e 00 1c lw r14,(sp+28) 800aa4c: 2b 8f 00 18 lw r15,(sp+24) 800aa50: 2b 90 00 14 lw r16,(sp+20) 800aa54: 2b 91 00 10 lw r17,(sp+16) 800aa58: 2b 92 00 0c lw r18,(sp+12) 800aa5c: 2b 93 00 08 lw r19,(sp+8) 800aa60: 37 9c 00 2c addi sp,sp,44 800aa64: c3 a0 00 00 ret =============================================================================== 08008430 : pthread_attr_t *attr, int policy ) { if ( !attr || !attr->is_initialized ) return EINVAL; 8008430: 34 03 00 16 mvi r3,22 int pthread_attr_setschedpolicy( pthread_attr_t *attr, int policy ) { if ( !attr || !attr->is_initialized ) 8008434: 44 20 00 0c be r1,r0,8008464 8008438: 28 24 00 00 lw r4,(r1+0) 800843c: 44 80 00 0a be r4,r0,8008464 return EINVAL; switch ( policy ) { 8008440: 48 02 00 08 bg r0,r2,8008460 8008444: 34 03 00 02 mvi r3,2 8008448: 4c 62 00 03 bge r3,r2,8008454 800844c: 34 03 00 04 mvi r3,4 8008450: 5c 43 00 04 bne r2,r3,8008460 <== NEVER TAKEN case SCHED_OTHER: case SCHED_FIFO: case SCHED_RR: case SCHED_SPORADIC: attr->schedpolicy = policy; 8008454: 58 22 00 14 sw (r1+20),r2 return 0; 8008458: 34 03 00 00 mvi r3,0 800845c: e0 00 00 02 bi 8008464 default: return ENOTSUP; 8008460: 34 03 00 86 mvi r3,134 } } 8008464: b8 60 08 00 mv r1,r3 8008468: c3 a0 00 00 ret =============================================================================== 08003410 : int pthread_barrier_init( pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count ) { 8003410: 37 9c ff dc addi sp,sp,-36 8003414: 5b 8b 00 14 sw (sp+20),r11 8003418: 5b 8c 00 10 sw (sp+16),r12 800341c: 5b 8d 00 0c sw (sp+12),r13 8003420: 5b 8e 00 08 sw (sp+8),r14 8003424: 5b 9d 00 04 sw (sp+4),ra /* * Error check parameters */ if ( !barrier ) return EINVAL; 8003428: 34 04 00 16 mvi r4,22 int pthread_barrier_init( pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count ) { 800342c: b8 20 68 00 mv r13,r1 8003430: b8 60 58 00 mv r11,r3 const pthread_barrierattr_t *the_attr; /* * Error check parameters */ if ( !barrier ) 8003434: 44 20 00 2a be r1,r0,80034dc return EINVAL; if ( count == 0 ) 8003438: 44 60 00 29 be r3,r0,80034dc return EINVAL; /* * If the user passed in NULL, use the default attributes */ if ( attr ) { 800343c: 5c 40 00 05 bne r2,r0,8003450 the_attr = attr; } else { (void) pthread_barrierattr_init( &my_attr ); 8003440: 37 8c 00 18 addi r12,sp,24 8003444: b9 80 08 00 mv r1,r12 8003448: fb ff ff bb calli 8003334 the_attr = &my_attr; 800344c: b9 80 10 00 mv r2,r12 } /* * Now start error checking the attributes that we are going to use */ if ( !the_attr->is_initialized ) 8003450: 28 41 00 00 lw r1,(r2+0) return EINVAL; 8003454: 34 04 00 16 mvi r4,22 } /* * Now start error checking the attributes that we are going to use */ if ( !the_attr->is_initialized ) 8003458: 44 20 00 21 be r1,r0,80034dc return EINVAL; switch ( the_attr->process_shared ) { 800345c: 28 4e 00 04 lw r14,(r2+4) 8003460: 5d c0 00 1f bne r14,r0,80034dc <== NEVER TAKEN rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 8003464: 78 02 08 01 mvhi r2,0x801 8003468: 38 42 68 a8 ori r2,r2,0x68a8 800346c: 28 41 00 00 lw r1,(r2+0) } /* * Convert from POSIX attributes to Core Barrier attributes */ the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE; 8003470: 5b 80 00 20 sw (sp+32),r0 the_attributes.maximum_count = count; 8003474: 5b 8b 00 24 sw (sp+36),r11 8003478: 34 21 00 01 addi r1,r1,1 800347c: 58 41 00 00 sw (r2+0),r1 * 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 ); 8003480: 78 0c 08 01 mvhi r12,0x801 8003484: 39 8c 6b fc ori r12,r12,0x6bfc 8003488: b9 80 08 00 mv r1,r12 800348c: f8 00 07 e3 calli 8005418 <_Objects_Allocate> 8003490: b8 20 58 00 mv r11,r1 */ _Thread_Disable_dispatch(); /* prevents deletion */ the_barrier = _POSIX_Barrier_Allocate(); if ( !the_barrier ) { 8003494: 5c 2e 00 04 bne r1,r14,80034a4 _Thread_Enable_dispatch(); 8003498: f8 00 0c 63 calli 8006624 <_Thread_Enable_dispatch> return EAGAIN; 800349c: 34 04 00 0b mvi r4,11 80034a0: e0 00 00 0f bi 80034dc } _CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes ); 80034a4: 34 21 00 10 addi r1,r1,16 80034a8: 37 82 00 20 addi r2,sp,32 80034ac: f8 00 04 e8 calli 800484c <_CORE_barrier_Initialize> uint32_t name ) { _Objects_Set_local_object( information, _Objects_Get_index( the_object->id ), 80034b0: 29 6e 00 08 lw r14,(r11+8) #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 80034b4: 29 8c 00 1c lw r12,(r12+28) 80034b8: 34 02 00 02 mvi r2,2 80034bc: 21 c1 ff ff andi r1,r14,0xffff 80034c0: f8 00 3d fa calli 8012ca8 <__ashlsi3> 80034c4: b5 81 08 00 add r1,r12,r1 80034c8: 58 2b 00 00 sw (r1+0),r11 _Objects_Get_index( the_object->id ), the_object ); /* ASSERT: information->is_string == false */ the_object->name.name_u32 = name; 80034cc: 59 60 00 0c sw (r11+12),r0 ); /* * Exit the critical section and return the user an operational barrier */ *barrier = the_barrier->Object.id; 80034d0: 59 ae 00 00 sw (r13+0),r14 _Thread_Enable_dispatch(); 80034d4: f8 00 0c 54 calli 8006624 <_Thread_Enable_dispatch> return 0; 80034d8: 34 04 00 00 mvi r4,0 } 80034dc: b8 80 08 00 mv r1,r4 80034e0: 2b 9d 00 04 lw ra,(sp+4) 80034e4: 2b 8b 00 14 lw r11,(sp+20) 80034e8: 2b 8c 00 10 lw r12,(sp+16) 80034ec: 2b 8d 00 0c lw r13,(sp+12) 80034f0: 2b 8e 00 08 lw r14,(sp+8) 80034f4: 37 9c 00 24 addi sp,sp,36 80034f8: c3 a0 00 00 ret =============================================================================== 08002c8c : void pthread_cleanup_push( void (*routine)( void * ), void *arg ) { 8002c8c: 37 9c ff f4 addi sp,sp,-12 8002c90: 5b 8b 00 0c sw (sp+12),r11 8002c94: 5b 8c 00 08 sw (sp+8),r12 8002c98: 5b 9d 00 04 sw (sp+4),ra 8002c9c: b8 20 58 00 mv r11,r1 8002ca0: b8 40 60 00 mv r12,r2 /* * 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 ) 8002ca4: 44 20 00 13 be r1,r0,8002cf0 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 8002ca8: 78 03 08 01 mvhi r3,0x801 8002cac: 38 63 68 90 ori r3,r3,0x6890 8002cb0: 28 61 00 00 lw r1,(r3+0) 8002cb4: 34 21 00 01 addi r1,r1,1 8002cb8: 58 61 00 00 sw (r3+0),r1 return; _Thread_Disable_dispatch(); handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) ); 8002cbc: 34 01 00 10 mvi r1,16 8002cc0: f8 00 11 87 calli 80072dc <_Workspace_Allocate> 8002cc4: b8 20 10 00 mv r2,r1 if ( handler ) { 8002cc8: 44 20 00 09 be r1,r0,8002cec <== NEVER TAKEN thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; 8002ccc: 78 03 08 01 mvhi r3,0x801 8002cd0: 38 63 6d 5c ori r3,r3,0x6d5c 8002cd4: 28 61 00 0c lw r1,(r3+12) handler_stack = &thread_support->Cancellation_Handlers; 8002cd8: 28 21 01 20 lw r1,(r1+288) handler->routine = routine; 8002cdc: 58 4b 00 08 sw (r2+8),r11 handler->arg = arg; 8002ce0: 58 4c 00 0c sw (r2+12),r12 _Chain_Append( handler_stack, &handler->Node ); 8002ce4: 34 21 00 e4 addi r1,r1,228 8002ce8: f8 00 04 f8 calli 80040c8 <_Chain_Append> } _Thread_Enable_dispatch(); 8002cec: f8 00 0c 3d calli 8005de0 <_Thread_Enable_dispatch> } 8002cf0: 2b 9d 00 04 lw ra,(sp+4) 8002cf4: 2b 8b 00 0c lw r11,(sp+12) 8002cf8: 2b 8c 00 08 lw r12,(sp+8) 8002cfc: 37 9c 00 0c addi sp,sp,12 8002d00: c3 a0 00 00 ret =============================================================================== 08003d54 : int pthread_cond_init( pthread_cond_t *cond, const pthread_condattr_t *attr ) { 8003d54: 37 9c ff ec addi sp,sp,-20 8003d58: 5b 8b 00 14 sw (sp+20),r11 8003d5c: 5b 8c 00 10 sw (sp+16),r12 8003d60: 5b 8d 00 0c sw (sp+12),r13 8003d64: 5b 8e 00 08 sw (sp+8),r14 8003d68: 5b 9d 00 04 sw (sp+4),ra 8003d6c: b8 20 70 00 mv r14,r1 8003d70: b8 40 58 00 mv r11,r2 POSIX_Condition_variables_Control *the_cond; const pthread_condattr_t *the_attr; if ( attr ) the_attr = attr; 8003d74: 5c 40 00 03 bne r2,r0,8003d80 else the_attr = &_POSIX_Condition_variables_Default_attributes; 8003d78: 78 0b 08 01 mvhi r11,0x801 8003d7c: 39 6b 5a d8 ori r11,r11,0x5ad8 /* * Be careful about attributes when global!!! */ if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED ) 8003d80: 29 63 00 04 lw r3,(r11+4) 8003d84: 34 02 00 01 mvi r2,1 return EINVAL; 8003d88: 34 01 00 16 mvi r1,22 else the_attr = &_POSIX_Condition_variables_Default_attributes; /* * Be careful about attributes when global!!! */ if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED ) 8003d8c: 44 62 00 26 be r3,r2,8003e24 <== NEVER TAKEN return EINVAL; if ( !the_attr->is_initialized ) 8003d90: 29 62 00 00 lw r2,(r11+0) 8003d94: 44 40 00 24 be r2,r0,8003e24 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 8003d98: 78 02 08 01 mvhi r2,0x801 8003d9c: 38 42 78 a8 ori r2,r2,0x78a8 8003da0: 28 41 00 00 lw r1,(r2+0) 8003da4: 34 21 00 01 addi r1,r1,1 8003da8: 58 41 00 00 sw (r2+0),r1 RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control *_POSIX_Condition_variables_Allocate( void ) { return (POSIX_Condition_variables_Control *) _Objects_Allocate( &_POSIX_Condition_variables_Information ); 8003dac: 78 0d 08 01 mvhi r13,0x801 8003db0: 39 ad 7c 94 ori r13,r13,0x7c94 8003db4: b9 a0 08 00 mv r1,r13 8003db8: f8 00 09 84 calli 80063c8 <_Objects_Allocate> 8003dbc: b8 20 60 00 mv r12,r1 _Thread_Disable_dispatch(); the_cond = _POSIX_Condition_variables_Allocate(); if ( !the_cond ) { 8003dc0: 5c 20 00 04 bne r1,r0,8003dd0 _Thread_Enable_dispatch(); 8003dc4: f8 00 0e 75 calli 8007798 <_Thread_Enable_dispatch> return ENOMEM; 8003dc8: 34 01 00 0c mvi r1,12 8003dcc: e0 00 00 16 bi 8003e24 the_cond->process_shared = the_attr->process_shared; the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX; _Thread_queue_Initialize( 8003dd0: 78 04 08 01 mvhi r4,0x801 if ( !the_cond ) { _Thread_Enable_dispatch(); return ENOMEM; } the_cond->process_shared = the_attr->process_shared; 8003dd4: 29 61 00 04 lw r1,(r11+4) the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX; _Thread_queue_Initialize( 8003dd8: 38 84 5a e0 ori r4,r4,0x5ae0 8003ddc: 28 83 00 00 lw r3,(r4+0) if ( !the_cond ) { _Thread_Enable_dispatch(); return ENOMEM; } the_cond->process_shared = the_attr->process_shared; 8003de0: 59 81 00 10 sw (r12+16),r1 the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX; _Thread_queue_Initialize( 8003de4: 34 04 00 74 mvi r4,116 8003de8: 35 81 00 18 addi r1,r12,24 8003dec: 34 02 00 00 mvi r2,0 return ENOMEM; } the_cond->process_shared = the_attr->process_shared; the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX; 8003df0: 59 80 00 14 sw (r12+20),r0 _Thread_queue_Initialize( 8003df4: f8 00 10 b4 calli 80080c4 <_Thread_queue_Initialize> uint32_t name ) { _Objects_Set_local_object( information, _Objects_Get_index( the_object->id ), 8003df8: 29 8b 00 08 lw r11,(r12+8) #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 8003dfc: 29 ad 00 1c lw r13,(r13+28) 8003e00: 34 02 00 02 mvi r2,2 8003e04: 21 61 ff ff andi r1,r11,0xffff 8003e08: f8 00 3f 5f calli 8013b84 <__ashlsi3> 8003e0c: b5 a1 10 00 add r2,r13,r1 8003e10: 58 4c 00 00 sw (r2+0),r12 _Objects_Get_index( the_object->id ), the_object ); /* ASSERT: information->is_string == false */ the_object->name.name_u32 = name; 8003e14: 59 80 00 0c sw (r12+12),r0 &_POSIX_Condition_variables_Information, &the_cond->Object, 0 ); *cond = the_cond->Object.id; 8003e18: 59 cb 00 00 sw (r14+0),r11 _Thread_Enable_dispatch(); 8003e1c: f8 00 0e 5f calli 8007798 <_Thread_Enable_dispatch> return 0; 8003e20: 34 01 00 00 mvi r1,0 } 8003e24: 2b 9d 00 04 lw ra,(sp+4) 8003e28: 2b 8b 00 14 lw r11,(sp+20) 8003e2c: 2b 8c 00 10 lw r12,(sp+16) 8003e30: 2b 8d 00 0c lw r13,(sp+12) 8003e34: 2b 8e 00 08 lw r14,(sp+8) 8003e38: 37 9c 00 14 addi sp,sp,20 8003e3c: c3 a0 00 00 ret =============================================================================== 08003bc8 : int pthread_condattr_destroy( pthread_condattr_t *attr ) { if ( !attr || attr->is_initialized == false ) return EINVAL; 8003bc8: 34 02 00 16 mvi r2,22 int pthread_condattr_destroy( pthread_condattr_t *attr ) { if ( !attr || attr->is_initialized == false ) 8003bcc: 44 20 00 05 be r1,r0,8003be0 8003bd0: 28 23 00 00 lw r3,(r1+0) 8003bd4: 44 60 00 03 be r3,r0,8003be0 <== NEVER TAKEN return EINVAL; attr->is_initialized = false; 8003bd8: 58 20 00 00 sw (r1+0),r0 return 0; 8003bdc: 34 02 00 00 mvi r2,0 } 8003be0: b8 40 08 00 mv r1,r2 8003be4: c3 a0 00 00 ret =============================================================================== 080030a4 : pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)( void * ), void *arg ) { 80030a4: 37 9c ff a0 addi sp,sp,-96 80030a8: 5b 8b 00 3c sw (sp+60),r11 80030ac: 5b 8c 00 38 sw (sp+56),r12 80030b0: 5b 8d 00 34 sw (sp+52),r13 80030b4: 5b 8e 00 30 sw (sp+48),r14 80030b8: 5b 8f 00 2c sw (sp+44),r15 80030bc: 5b 90 00 28 sw (sp+40),r16 80030c0: 5b 91 00 24 sw (sp+36),r17 80030c4: 5b 92 00 20 sw (sp+32),r18 80030c8: 5b 93 00 1c sw (sp+28),r19 80030cc: 5b 94 00 18 sw (sp+24),r20 80030d0: 5b 95 00 14 sw (sp+20),r21 80030d4: 5b 9d 00 10 sw (sp+16),ra struct sched_param schedparam; Objects_Name name; int rc; if ( !start_routine ) return EFAULT; 80030d8: 34 0d 00 0e mvi r13,14 pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)( void * ), void *arg ) { 80030dc: b8 20 88 00 mv r17,r1 80030e0: b8 60 80 00 mv r16,r3 80030e4: b8 80 90 00 mv r18,r4 int schedpolicy = SCHED_RR; struct sched_param schedparam; Objects_Name name; int rc; if ( !start_routine ) 80030e8: 44 60 00 a5 be r3,r0,800337c return EFAULT; the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes; 80030ec: b8 40 58 00 mv r11,r2 80030f0: 5c 40 00 03 bne r2,r0,80030fc 80030f4: 78 0b 08 01 mvhi r11,0x801 80030f8: 39 6b d9 fc ori r11,r11,0xd9fc if ( !the_attr->is_initialized ) 80030fc: 29 61 00 00 lw r1,(r11+0) return EINVAL; 8003100: 34 0d 00 16 mvi r13,22 if ( !start_routine ) return EFAULT; the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes; if ( !the_attr->is_initialized ) 8003104: 44 20 00 9e be r1,r0,800337c * 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) ) 8003108: 29 61 00 04 lw r1,(r11+4) 800310c: 44 20 00 06 be r1,r0,8003124 8003110: 78 02 08 01 mvhi r2,0x801 8003114: 38 42 f0 e0 ori r2,r2,0xf0e0 8003118: 29 63 00 08 lw r3,(r11+8) 800311c: 28 41 00 00 lw r1,(r2+0) 8003120: 54 23 00 97 bgu r1,r3,800337c * 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 ) { 8003124: 29 62 00 10 lw r2,(r11+16) 8003128: 34 01 00 01 mvi r1,1 800312c: 44 41 00 05 be r2,r1,8003140 8003130: 34 01 00 02 mvi r1,2 schedpolicy = the_attr->schedpolicy; schedparam = the_attr->schedparam; break; default: return EINVAL; 8003134: 34 0d 00 16 mvi r13,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 ) { 8003138: 5c 41 00 91 bne r2,r1,800337c 800313c: e0 00 00 14 bi 800318c case PTHREAD_INHERIT_SCHED: api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; 8003140: 78 02 08 01 mvhi r2,0x801 8003144: 38 42 fd 64 ori r2,r2,0xfd64 8003148: 28 41 00 0c lw r1,(r2+12) 800314c: 28 22 01 20 lw r2,(r1+288) schedpolicy = api->schedpolicy; schedparam = api->schedparam; 8003150: 28 48 00 88 lw r8,(r2+136) 8003154: 28 47 00 8c lw r7,(r2+140) 8003158: 28 46 00 90 lw r6,(r2+144) 800315c: 28 45 00 94 lw r5,(r2+148) 8003160: 28 44 00 98 lw r4,(r2+152) 8003164: 28 43 00 9c lw r3,(r2+156) * attributes structure. */ switch ( the_attr->inheritsched ) { case PTHREAD_INHERIT_SCHED: api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; schedpolicy = api->schedpolicy; 8003168: 28 4f 00 84 lw r15,(r2+132) schedparam = api->schedparam; 800316c: 28 41 00 a0 lw r1,(r2+160) 8003170: 5b 88 00 40 sw (sp+64),r8 8003174: 5b 87 00 44 sw (sp+68),r7 8003178: 5b 86 00 48 sw (sp+72),r6 800317c: 5b 85 00 4c sw (sp+76),r5 8003180: 5b 84 00 50 sw (sp+80),r4 8003184: 5b 83 00 54 sw (sp+84),r3 8003188: e0 00 00 0f bi 80031c4 break; case PTHREAD_EXPLICIT_SCHED: schedpolicy = the_attr->schedpolicy; schedparam = the_attr->schedparam; 800318c: 29 67 00 18 lw r7,(r11+24) 8003190: 29 66 00 1c lw r6,(r11+28) 8003194: 29 65 00 20 lw r5,(r11+32) 8003198: 29 64 00 24 lw r4,(r11+36) 800319c: 29 63 00 28 lw r3,(r11+40) 80031a0: 29 62 00 2c lw r2,(r11+44) schedpolicy = api->schedpolicy; schedparam = api->schedparam; break; case PTHREAD_EXPLICIT_SCHED: schedpolicy = the_attr->schedpolicy; 80031a4: 29 6f 00 14 lw r15,(r11+20) schedparam = the_attr->schedparam; 80031a8: 29 61 00 30 lw r1,(r11+48) 80031ac: 5b 87 00 40 sw (sp+64),r7 80031b0: 5b 86 00 44 sw (sp+68),r6 80031b4: 5b 85 00 48 sw (sp+72),r5 80031b8: 5b 84 00 4c sw (sp+76),r4 80031bc: 5b 83 00 50 sw (sp+80),r3 80031c0: 5b 82 00 54 sw (sp+84),r2 /* * Check the contentionscope since rtems only supports PROCESS wide * contention (i.e. no system wide contention). */ if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS ) 80031c4: 29 6c 00 0c lw r12,(r11+12) schedparam = api->schedparam; break; case PTHREAD_EXPLICIT_SCHED: schedpolicy = the_attr->schedpolicy; schedparam = the_attr->schedparam; 80031c8: 5b 81 00 58 sw (sp+88),r1 /* * 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; 80031cc: 34 0d 00 86 mvi r13,134 /* * Check the contentionscope since rtems only supports PROCESS wide * contention (i.e. no system wide contention). */ if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS ) 80031d0: 5d 80 00 6b bne r12,r0,800337c return ENOTSUP; /* * Interpret the scheduling parameters. */ if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) ) 80031d4: 2b 81 00 40 lw r1,(sp+64) return EINVAL; 80031d8: 34 0d 00 16 mvi r13,22 return ENOTSUP; /* * Interpret the scheduling parameters. */ if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) ) 80031dc: f8 00 1b 99 calli 800a040 <_POSIX_Priority_Is_valid> 80031e0: 44 2c 00 67 be r1,r12,800337c <== NEVER TAKEN RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core( int priority ) { return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1); 80031e4: 78 02 08 01 mvhi r2,0x801 80031e8: 38 42 f0 e4 ori r2,r2,0xf0e4 80031ec: 40 54 00 00 lbu r20,(r2+0) core_priority = _POSIX_Priority_To_core( schedparam.sched_priority ); /* * Set the core scheduling policy information. */ rc = _POSIX_Thread_Translate_sched_param( 80031f0: b9 e0 08 00 mv r1,r15 80031f4: 37 82 00 40 addi r2,sp,64 80031f8: 37 83 00 60 addi r3,sp,96 80031fc: 37 84 00 5c addi r4,sp,92 * Interpret the scheduling parameters. */ if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) ) return EINVAL; core_priority = _POSIX_Priority_To_core( schedparam.sched_priority ); 8003200: 2b 93 00 40 lw r19,(sp+64) /* * Set the core scheduling policy information. */ rc = _POSIX_Thread_Translate_sched_param( 8003204: f8 00 1b 97 calli 800a060 <_POSIX_Thread_Translate_sched_param> 8003208: b8 20 68 00 mv r13,r1 schedpolicy, &schedparam, &budget_algorithm, &budget_callout ); if ( rc ) 800320c: 5c 20 00 5c bne r1,r0,800337c <== NEVER TAKEN #endif /* * Lock the allocator mutex for protection */ _RTEMS_Lock_allocator(); 8003210: 78 0c 08 01 mvhi r12,0x801 8003214: 39 8c f9 58 ori r12,r12,0xf958 8003218: 29 81 00 00 lw r1,(r12+0) 800321c: f8 00 04 f5 calli 80045f0 <_API_Mutex_Lock> * _POSIX_Threads_Allocate */ RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void ) { return (Thread_Control *) _Objects_Allocate( &_POSIX_Threads_Information ); 8003220: 78 02 08 01 mvhi r2,0x801 8003224: b8 40 08 00 mv r1,r2 8003228: 38 21 fa 6c ori r1,r1,0xfa6c 800322c: f8 00 08 05 calli 8005240 <_Objects_Allocate> 8003230: b8 20 70 00 mv r14,r1 * Allocate the thread control block. * * NOTE: Global threads are not currently supported. */ the_thread = _POSIX_Threads_Allocate(); if ( !the_thread ) { 8003234: 5c 2d 00 03 bne r1,r13,8003240 _RTEMS_Unlock_allocator(); 8003238: 29 81 00 00 lw r1,(r12+0) 800323c: e0 00 00 21 bi 80032c0 static inline size_t _POSIX_Threads_Ensure_minimum_stack ( size_t size ) { if ( size >= PTHREAD_MINIMUM_STACK_SIZE ) 8003240: 78 02 08 01 mvhi r2,0x801 8003244: 38 42 f0 e0 ori r2,r2,0xf0e0 8003248: 28 41 00 00 lw r1,(r2+0) /* * Initialize the core thread for this task. */ name.name_p = NULL; /* posix threads don't have a name by default */ status = _Thread_Initialize( 800324c: 29 6c 00 08 lw r12,(r11+8) static inline size_t _POSIX_Threads_Ensure_minimum_stack ( size_t size ) { if ( size >= PTHREAD_MINIMUM_STACK_SIZE ) 8003250: 34 02 00 01 mvi r2,1 8003254: f8 00 63 6f calli 801c010 <__ashlsi3> /* * Initialize the core thread for this task. */ name.name_p = NULL; /* posix threads don't have a name by default */ status = _Thread_Initialize( 8003258: 29 75 00 04 lw r21,(r11+4) static inline size_t _POSIX_Threads_Ensure_minimum_stack ( size_t size ) { if ( size >= PTHREAD_MINIMUM_STACK_SIZE ) 800325c: b8 20 28 00 mv r5,r1 /* * Initialize the core thread for this task. */ name.name_p = NULL; /* posix threads don't have a name by default */ status = _Thread_Initialize( 8003260: 50 2c 00 02 bgeu r1,r12,8003268 8003264: b9 80 28 00 mv r5,r12 8003268: 2b 81 00 5c lw r1,(sp+92) 800326c: 78 0c 08 01 mvhi r12,0x801 8003270: 2b 88 00 60 lw r8,(sp+96) 8003274: 39 8c fa 6c ori r12,r12,0xfa6c 8003278: 5b 81 00 04 sw (sp+4),r1 800327c: b8 a0 20 00 mv r4,r5 8003280: b9 80 08 00 mv r1,r12 8003284: b9 c0 10 00 mv r2,r14 8003288: ba a0 18 00 mv r3,r21 800328c: 34 05 00 00 mvi r5,0 8003290: ca 93 30 00 sub r6,r20,r19 8003294: 34 07 00 01 mvi r7,1 8003298: 5b 80 00 08 sw (sp+8),r0 800329c: 5b 80 00 0c sw (sp+12),r0 80032a0: f8 00 0c c5 calli 80065b4 <_Thread_Initialize> budget_callout, 0, /* isr level */ name /* posix threads don't have a name */ ); if ( !status ) { 80032a4: 5c 20 00 0a bne r1,r0,80032cc <== ALWAYS TAKEN RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free ( Thread_Control *the_pthread ) { _Objects_Free( &_POSIX_Threads_Information, &the_pthread->Object ); 80032a8: b9 80 08 00 mv r1,r12 <== NOT EXECUTED 80032ac: b9 c0 10 00 mv r2,r14 <== NOT EXECUTED 80032b0: f8 00 08 e0 calli 8005630 <_Objects_Free> <== NOT EXECUTED _POSIX_Threads_Free( the_thread ); _RTEMS_Unlock_allocator(); 80032b4: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED 80032b8: 38 21 f9 58 ori r1,r1,0xf958 <== NOT EXECUTED 80032bc: 28 21 00 00 lw r1,(r1+0) <== NOT EXECUTED 80032c0: f8 00 04 e9 calli 8004664 <_API_Mutex_Unlock> return EAGAIN; 80032c4: 34 0d 00 0b mvi r13,11 80032c8: e0 00 00 2d bi 800337c } /* * finish initializing the per API structure */ api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 80032cc: 29 cc 01 20 lw r12,(r14+288) api->Attributes = *the_attr; 80032d0: b9 60 10 00 mv r2,r11 80032d4: 34 03 00 40 mvi r3,64 80032d8: b9 80 08 00 mv r1,r12 80032dc: f8 00 2a dd calli 800de50 api->detachstate = the_attr->detachstate; 80032e0: 29 61 00 3c lw r1,(r11+60) api->schedparam = schedparam; /* * POSIX threads are allocated and started in one operation. */ status = _Thread_Start( 80032e4: 34 02 00 01 mvi r2,1 */ api = the_thread->API_Extensions[ THREAD_API_POSIX ]; api->Attributes = *the_attr; api->detachstate = the_attr->detachstate; api->schedpolicy = schedpolicy; 80032e8: 59 8f 00 84 sw (r12+132),r15 * finish initializing the per API structure */ api = the_thread->API_Extensions[ THREAD_API_POSIX ]; api->Attributes = *the_attr; api->detachstate = the_attr->detachstate; 80032ec: 59 81 00 40 sw (r12+64),r1 api->schedpolicy = schedpolicy; api->schedparam = schedparam; 80032f0: 2b 81 00 40 lw r1,(sp+64) /* * POSIX threads are allocated and started in one operation. */ status = _Thread_Start( 80032f4: ba 00 18 00 mv r3,r16 80032f8: ba 40 20 00 mv r4,r18 api = the_thread->API_Extensions[ THREAD_API_POSIX ]; api->Attributes = *the_attr; api->detachstate = the_attr->detachstate; api->schedpolicy = schedpolicy; api->schedparam = schedparam; 80032fc: 59 81 00 88 sw (r12+136),r1 8003300: 2b 81 00 44 lw r1,(sp+68) /* * POSIX threads are allocated and started in one operation. */ status = _Thread_Start( 8003304: 34 05 00 00 mvi r5,0 api = the_thread->API_Extensions[ THREAD_API_POSIX ]; api->Attributes = *the_attr; api->detachstate = the_attr->detachstate; api->schedpolicy = schedpolicy; api->schedparam = schedparam; 8003308: 59 81 00 8c sw (r12+140),r1 800330c: 2b 81 00 48 lw r1,(sp+72) 8003310: 59 81 00 90 sw (r12+144),r1 8003314: 2b 81 00 4c lw r1,(sp+76) 8003318: 59 81 00 94 sw (r12+148),r1 800331c: 2b 81 00 50 lw r1,(sp+80) 8003320: 59 81 00 98 sw (r12+152),r1 8003324: 2b 81 00 54 lw r1,(sp+84) 8003328: 59 81 00 9c sw (r12+156),r1 800332c: 2b 81 00 58 lw r1,(sp+88) 8003330: 59 81 00 a0 sw (r12+160),r1 /* * POSIX threads are allocated and started in one operation. */ status = _Thread_Start( 8003334: b9 c0 08 00 mv r1,r14 8003338: f8 00 0f 84 calli 8007148 <_Thread_Start> _RTEMS_Unlock_allocator(); return EINVAL; } #endif if ( schedpolicy == SCHED_SPORADIC ) { 800333c: 34 01 00 04 mvi r1,4 8003340: 5d e1 00 09 bne r15,r1,8003364 _Watchdog_Insert_ticks( 8003344: 35 81 00 90 addi r1,r12,144 8003348: f8 00 10 07 calli 8007364 <_Timespec_To_ticks> ) { the_watchdog->initial = units; _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 800334c: 78 02 08 01 mvhi r2,0x801 Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 8003350: 59 81 00 b4 sw (r12+180),r1 _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 8003354: b8 40 08 00 mv r1,r2 8003358: 38 21 f9 78 ori r1,r1,0xf978 800335c: 35 82 00 a8 addi r2,r12,168 8003360: f8 00 11 36 calli 8007838 <_Watchdog_Insert> } /* * Return the id and indicate we successfully created the thread */ *thread = the_thread->Object.id; 8003364: 29 c1 00 08 lw r1,(r14+8) 8003368: 5a 21 00 00 sw (r17+0),r1 _RTEMS_Unlock_allocator(); 800336c: 78 01 08 01 mvhi r1,0x801 8003370: 38 21 f9 58 ori r1,r1,0xf958 8003374: 28 21 00 00 lw r1,(r1+0) 8003378: f8 00 04 bb calli 8004664 <_API_Mutex_Unlock> return 0; } 800337c: b9 a0 08 00 mv r1,r13 8003380: 2b 9d 00 10 lw ra,(sp+16) 8003384: 2b 8b 00 3c lw r11,(sp+60) 8003388: 2b 8c 00 38 lw r12,(sp+56) 800338c: 2b 8d 00 34 lw r13,(sp+52) 8003390: 2b 8e 00 30 lw r14,(sp+48) 8003394: 2b 8f 00 2c lw r15,(sp+44) 8003398: 2b 90 00 28 lw r16,(sp+40) 800339c: 2b 91 00 24 lw r17,(sp+36) 80033a0: 2b 92 00 20 lw r18,(sp+32) 80033a4: 2b 93 00 1c lw r19,(sp+28) 80033a8: 2b 94 00 18 lw r20,(sp+24) 80033ac: 2b 95 00 14 lw r21,(sp+20) 80033b0: 37 9c 00 60 addi sp,sp,96 80033b4: c3 a0 00 00 ret =============================================================================== 08010e94 : void pthread_exit( void *value_ptr ) { 8010e94: 37 9c ff fc addi sp,sp,-4 8010e98: 5b 9d 00 04 sw (sp+4),ra _POSIX_Thread_Exit( _Thread_Executing, value_ptr ); 8010e9c: 78 03 08 01 mvhi r3,0x801 8010ea0: 38 63 9e 2c ori r3,r3,0x9e2c } void pthread_exit( void *value_ptr ) { 8010ea4: b8 20 10 00 mv r2,r1 _POSIX_Thread_Exit( _Thread_Executing, value_ptr ); 8010ea8: 28 61 00 0c lw r1,(r3+12) 8010eac: fb ff ff d4 calli 8010dfc <_POSIX_Thread_Exit> } 8010eb0: 2b 9d 00 04 lw ra,(sp+4) 8010eb4: 37 9c 00 04 addi sp,sp,4 <== NOT EXECUTED 8010eb8: c3 a0 00 00 ret <== NOT EXECUTED =============================================================================== 0800565c : int pthread_mutex_timedlock( pthread_mutex_t *mutex, const struct timespec *abstime ) { 800565c: 37 9c ff ec addi sp,sp,-20 8005660: 5b 8b 00 10 sw (sp+16),r11 8005664: 5b 8c 00 0c sw (sp+12),r12 8005668: 5b 8d 00 08 sw (sp+8),r13 800566c: 5b 9d 00 04 sw (sp+4),ra 8005670: b8 20 68 00 mv r13,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 ); 8005674: b8 40 08 00 mv r1,r2 8005678: 37 82 00 14 addi r2,sp,20 800567c: f8 00 00 41 calli 8005780 <_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, 8005680: 64 2c 00 03 cmpei r12,r1,3 if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE ) do_wait = false; lock_status = _POSIX_Mutex_Lock_support( mutex, do_wait, ticks ); 8005684: 2b 83 00 14 lw r3,(sp+20) * * 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 ); 8005688: b8 20 58 00 mv r11,r1 if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE ) do_wait = false; lock_status = _POSIX_Mutex_Lock_support( mutex, do_wait, ticks ); 800568c: b9 80 10 00 mv r2,r12 8005690: b9 a0 08 00 mv r1,r13 8005694: fb ff ff a3 calli 8005520 <_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) ) { 8005698: 5d 80 00 0b bne r12,r0,80056c4 800569c: 34 02 00 10 mvi r2,16 80056a0: 5c 22 00 09 bne r1,r2,80056c4 <== NEVER TAKEN if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID ) 80056a4: 45 60 00 05 be r11,r0,80056b8 <== NEVER TAKEN return EINVAL; if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST || 80056a8: 35 6b ff ff addi r11,r11,-1 80056ac: 34 02 00 01 mvi r2,1 80056b0: 50 4b 00 04 bgeu r2,r11,80056c0 <== ALWAYS TAKEN 80056b4: e0 00 00 04 bi 80056c4 <== NOT EXECUTED * 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; 80056b8: 34 01 00 16 mvi r1,22 <== NOT EXECUTED 80056bc: e0 00 00 02 bi 80056c4 <== NOT EXECUTED if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST || status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; 80056c0: 34 01 00 74 mvi r1,116 } return lock_status; } 80056c4: 2b 9d 00 04 lw ra,(sp+4) 80056c8: 2b 8b 00 10 lw r11,(sp+16) 80056cc: 2b 8c 00 0c lw r12,(sp+12) 80056d0: 2b 8d 00 08 lw r13,(sp+8) 80056d4: 37 9c 00 14 addi sp,sp,20 80056d8: c3 a0 00 00 ret =============================================================================== 08002960 : const pthread_mutexattr_t *attr, int *type ) { if ( !attr ) return EINVAL; 8002960: 34 03 00 16 mvi r3,22 int pthread_mutexattr_gettype( const pthread_mutexattr_t *attr, int *type ) { if ( !attr ) 8002964: 44 20 00 07 be r1,r0,8002980 return EINVAL; if ( !attr->is_initialized ) 8002968: 28 24 00 00 lw r4,(r1+0) 800296c: 44 80 00 05 be r4,r0,8002980 return EINVAL; if ( !type ) 8002970: 44 40 00 04 be r2,r0,8002980 <== NEVER TAKEN return EINVAL; *type = attr->type; 8002974: 28 21 00 10 lw r1,(r1+16) return 0; 8002978: 34 03 00 00 mvi r3,0 return EINVAL; if ( !type ) return EINVAL; *type = attr->type; 800297c: 58 41 00 00 sw (r2+0),r1 return 0; } 8002980: b8 60 08 00 mv r1,r3 8002984: c3 a0 00 00 ret =============================================================================== 0800518c : pthread_mutexattr_t *attr, int pshared ) { if ( !attr || !attr->is_initialized ) return EINVAL; 800518c: 34 03 00 16 mvi r3,22 int pthread_mutexattr_setpshared( pthread_mutexattr_t *attr, int pshared ) { if ( !attr || !attr->is_initialized ) 8005190: 44 20 00 07 be r1,r0,80051ac 8005194: 28 24 00 00 lw r4,(r1+0) 8005198: 44 80 00 05 be r4,r0,80051ac return EINVAL; switch ( pshared ) { 800519c: 34 04 00 01 mvi r4,1 80051a0: 54 44 00 03 bgu r2,r4,80051ac <== NEVER TAKEN case PTHREAD_PROCESS_SHARED: case PTHREAD_PROCESS_PRIVATE: attr->process_shared = pshared; 80051a4: 58 22 00 04 sw (r1+4),r2 return 0; 80051a8: 34 03 00 00 mvi r3,0 default: return EINVAL; } } 80051ac: b8 60 08 00 mv r1,r3 80051b0: c3 a0 00 00 ret =============================================================================== 080029d4 : pthread_mutexattr_t *attr, int type ) { if ( !attr || !attr->is_initialized ) return EINVAL; 80029d4: 34 03 00 16 mvi r3,22 int pthread_mutexattr_settype( pthread_mutexattr_t *attr, int type ) { if ( !attr || !attr->is_initialized ) 80029d8: 44 20 00 07 be r1,r0,80029f4 80029dc: 28 24 00 00 lw r4,(r1+0) 80029e0: 44 80 00 05 be r4,r0,80029f4 <== NEVER TAKEN return EINVAL; switch ( type ) { 80029e4: 34 04 00 03 mvi r4,3 80029e8: 54 44 00 03 bgu r2,r4,80029f4 case PTHREAD_MUTEX_NORMAL: case PTHREAD_MUTEX_RECURSIVE: case PTHREAD_MUTEX_ERRORCHECK: case PTHREAD_MUTEX_DEFAULT: attr->type = type; 80029ec: 58 22 00 10 sw (r1+16),r2 return 0; 80029f0: 34 03 00 00 mvi r3,0 default: return EINVAL; } } 80029f4: b8 60 08 00 mv r1,r3 80029f8: c3 a0 00 00 ret =============================================================================== 080038a8 : int pthread_once( pthread_once_t *once_control, void (*init_routine)(void) ) { 80038a8: 37 9c ff ec addi sp,sp,-20 80038ac: 5b 8b 00 10 sw (sp+16),r11 80038b0: 5b 8c 00 0c sw (sp+12),r12 80038b4: 5b 8d 00 08 sw (sp+8),r13 80038b8: 5b 9d 00 04 sw (sp+4),ra 80038bc: b8 20 58 00 mv r11,r1 80038c0: b8 40 60 00 mv r12,r2 if ( !once_control || !init_routine ) 80038c4: 64 21 00 00 cmpei r1,r1,0 80038c8: 64 42 00 00 cmpei r2,r2,0 80038cc: b8 41 10 00 or r2,r2,r1 return EINVAL; 80038d0: 34 01 00 16 mvi r1,22 int pthread_once( pthread_once_t *once_control, void (*init_routine)(void) ) { if ( !once_control || !init_routine ) 80038d4: 5c 40 00 13 bne r2,r0,8003920 return EINVAL; if ( !once_control->init_executed ) { 80038d8: 29 6d 00 04 lw r13,(r11+4) once_control->init_executed = true; (*init_routine)(); } rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); } return 0; 80038dc: 34 01 00 00 mvi r1,0 ) { if ( !once_control || !init_routine ) return EINVAL; if ( !once_control->init_executed ) { 80038e0: 5d a2 00 10 bne r13,r2,8003920 rtems_mode saveMode; rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode); 80038e4: 34 01 01 00 mvi r1,256 80038e8: 34 02 01 00 mvi r2,256 80038ec: 37 83 00 14 addi r3,sp,20 80038f0: f8 00 01 96 calli 8003f48 if ( !once_control->init_executed ) { 80038f4: 29 61 00 04 lw r1,(r11+4) 80038f8: 5c 2d 00 05 bne r1,r13,800390c <== NEVER TAKEN once_control->is_initialized = true; 80038fc: 34 01 00 01 mvi r1,1 8003900: 59 61 00 00 sw (r11+0),r1 once_control->init_executed = true; 8003904: 59 61 00 04 sw (r11+4),r1 (*init_routine)(); 8003908: d9 80 00 00 call r12 } rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); 800390c: 2b 81 00 14 lw r1,(sp+20) 8003910: 34 02 01 00 mvi r2,256 8003914: 37 83 00 14 addi r3,sp,20 8003918: f8 00 01 8c calli 8003f48 } return 0; 800391c: 34 01 00 00 mvi r1,0 } 8003920: 2b 9d 00 04 lw ra,(sp+4) 8003924: 2b 8b 00 10 lw r11,(sp+16) 8003928: 2b 8c 00 0c lw r12,(sp+12) 800392c: 2b 8d 00 08 lw r13,(sp+8) 8003930: 37 9c 00 14 addi sp,sp,20 8003934: c3 a0 00 00 ret =============================================================================== 08004260 : int pthread_rwlock_init( pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr ) { 8004260: 37 9c ff e0 addi sp,sp,-32 8004264: 5b 8b 00 14 sw (sp+20),r11 8004268: 5b 8c 00 10 sw (sp+16),r12 800426c: 5b 8d 00 0c sw (sp+12),r13 8004270: 5b 8e 00 08 sw (sp+8),r14 8004274: 5b 9d 00 04 sw (sp+4),ra /* * Error check parameters */ if ( !rwlock ) return EINVAL; 8004278: 34 03 00 16 mvi r3,22 int pthread_rwlock_init( pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr ) { 800427c: b8 20 68 00 mv r13,r1 const pthread_rwlockattr_t *the_attr; /* * Error check parameters */ if ( !rwlock ) 8004280: 44 20 00 28 be r1,r0,8004320 return EINVAL; /* * If the user passed in NULL, use the default attributes */ if ( attr ) { 8004284: 5c 40 00 05 bne r2,r0,8004298 the_attr = attr; } else { (void) pthread_rwlockattr_init( &default_attr ); 8004288: 37 8b 00 18 addi r11,sp,24 800428c: b9 60 08 00 mv r1,r11 8004290: f8 00 02 ff calli 8004e8c the_attr = &default_attr; 8004294: b9 60 10 00 mv r2,r11 } /* * Now start error checking the attributes that we are going to use */ if ( !the_attr->is_initialized ) 8004298: 28 41 00 00 lw r1,(r2+0) return EINVAL; 800429c: 34 03 00 16 mvi r3,22 } /* * Now start error checking the attributes that we are going to use */ if ( !the_attr->is_initialized ) 80042a0: 44 20 00 20 be r1,r0,8004320 <== NEVER TAKEN return EINVAL; switch ( the_attr->process_shared ) { 80042a4: 28 4e 00 04 lw r14,(r2+4) 80042a8: 5d c0 00 1e bne r14,r0,8004320 <== NEVER TAKEN rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 80042ac: 78 02 08 01 mvhi r2,0x801 80042b0: 38 42 88 a8 ori r2,r2,0x88a8 80042b4: 28 41 00 00 lw r1,(r2+0) */ RTEMS_INLINE_ROUTINE void _CORE_RWLock_Initialize_attributes( CORE_RWLock_Attributes *the_attributes ) { the_attributes->XXX = 0; 80042b8: 5b 80 00 20 sw (sp+32),r0 80042bc: 34 21 00 01 addi r1,r1,1 80042c0: 58 41 00 00 sw (r2+0),r1 * 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 ); 80042c4: 78 0c 08 01 mvhi r12,0x801 80042c8: 39 8c 8a 3c ori r12,r12,0x8a3c 80042cc: b9 80 08 00 mv r1,r12 80042d0: f8 00 09 a1 calli 8006954 <_Objects_Allocate> 80042d4: b8 20 58 00 mv r11,r1 */ _Thread_Disable_dispatch(); /* prevents deletion */ the_rwlock = _POSIX_RWLock_Allocate(); if ( !the_rwlock ) { 80042d8: 5c 2e 00 04 bne r1,r14,80042e8 _Thread_Enable_dispatch(); 80042dc: f8 00 0e 21 calli 8007b60 <_Thread_Enable_dispatch> return EAGAIN; 80042e0: 34 03 00 0b mvi r3,11 80042e4: e0 00 00 0f bi 8004320 } _CORE_RWLock_Initialize( &the_rwlock->RWLock, &the_attributes ); 80042e8: 34 21 00 10 addi r1,r1,16 80042ec: 37 82 00 20 addi r2,sp,32 80042f0: f8 00 06 de calli 8005e68 <_CORE_RWLock_Initialize> uint32_t name ) { _Objects_Set_local_object( information, _Objects_Get_index( the_object->id ), 80042f4: 29 6e 00 08 lw r14,(r11+8) #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 80042f8: 29 8c 00 1c lw r12,(r12+28) 80042fc: 34 02 00 02 mvi r2,2 8004300: 21 c1 ff ff andi r1,r14,0xffff 8004304: f8 00 40 fe calli 80146fc <__ashlsi3> 8004308: b5 81 08 00 add r1,r12,r1 800430c: 58 2b 00 00 sw (r1+0),r11 _Objects_Get_index( the_object->id ), the_object ); /* ASSERT: information->is_string == false */ the_object->name.name_u32 = name; 8004310: 59 60 00 0c sw (r11+12),r0 &_POSIX_RWLock_Information, &the_rwlock->Object, 0 ); *rwlock = the_rwlock->Object.id; 8004314: 59 ae 00 00 sw (r13+0),r14 _Thread_Enable_dispatch(); 8004318: f8 00 0e 12 calli 8007b60 <_Thread_Enable_dispatch> return 0; 800431c: 34 03 00 00 mvi r3,0 } 8004320: b8 60 08 00 mv r1,r3 8004324: 2b 9d 00 04 lw ra,(sp+4) 8004328: 2b 8b 00 14 lw r11,(sp+20) 800432c: 2b 8c 00 10 lw r12,(sp+16) 8004330: 2b 8d 00 0c lw r13,(sp+12) 8004334: 2b 8e 00 08 lw r14,(sp+8) 8004338: 37 9c 00 20 addi sp,sp,32 800433c: c3 a0 00 00 ret =============================================================================== 080043c8 : int pthread_rwlock_timedrdlock( pthread_rwlock_t *rwlock, const struct timespec *abstime ) { 80043c8: 37 9c ff e0 addi sp,sp,-32 80043cc: 5b 8b 00 18 sw (sp+24),r11 80043d0: 5b 8c 00 14 sw (sp+20),r12 80043d4: 5b 8d 00 10 sw (sp+16),r13 80043d8: 5b 8e 00 0c sw (sp+12),r14 80043dc: 5b 8f 00 08 sw (sp+8),r15 80043e0: 5b 9d 00 04 sw (sp+4),ra 80043e4: b8 20 70 00 mv r14,r1 Watchdog_Interval ticks; bool do_wait = true; POSIX_Absolute_timeout_conversion_results_t status; if ( !rwlock ) return EINVAL; 80043e8: 34 0b 00 16 mvi r11,22 int pthread_rwlock_timedrdlock( pthread_rwlock_t *rwlock, const struct timespec *abstime ) { 80043ec: b8 40 08 00 mv r1,r2 Objects_Locations location; Watchdog_Interval ticks; bool do_wait = true; POSIX_Absolute_timeout_conversion_results_t status; if ( !rwlock ) 80043f0: 45 c0 00 25 be r14,r0,8004484 * * 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 ); 80043f4: 37 82 00 1c addi r2,sp,28 80043f8: f8 00 1c 13 calli 800b444 <_POSIX_Absolute_timeout_to_ticks> 80043fc: 29 c2 00 00 lw r2,(r14+0) 8004400: b8 20 60 00 mv r12,r1 8004404: 78 01 08 01 mvhi r1,0x801 8004408: 38 21 8a 3c ori r1,r1,0x8a3c 800440c: 37 83 00 20 addi r3,sp,32 8004410: f8 00 0a b6 calli 8006ee8 <_Objects_Get> if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE ) do_wait = false; the_rwlock = _POSIX_RWLock_Get( rwlock, &location ); switch ( location ) { 8004414: 2b 8f 00 20 lw r15,(sp+32) 8004418: 5d e0 00 1b bne r15,r0,8004484 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, 800441c: 65 8d 00 03 cmpei r13,r12,3 case OBJECTS_LOCAL: _CORE_RWLock_Obtain_for_reading( 8004420: 29 c2 00 00 lw r2,(r14+0) 8004424: 2b 84 00 1c lw r4,(sp+28) 8004428: 34 21 00 10 addi r1,r1,16 800442c: b9 a0 18 00 mv r3,r13 8004430: 34 05 00 00 mvi r5,0 8004434: f8 00 06 9a calli 8005e9c <_CORE_RWLock_Obtain_for_reading> do_wait, ticks, NULL ); _Thread_Enable_dispatch(); 8004438: f8 00 0d ca calli 8007b60 <_Thread_Enable_dispatch> if ( !do_wait ) { 800443c: 5d af 00 0c bne r13,r15,800446c if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) { 8004440: 78 01 08 01 mvhi r1,0x801 8004444: 38 21 8d 74 ori r1,r1,0x8d74 8004448: 28 21 00 0c lw r1,(r1+12) 800444c: 28 22 00 34 lw r2,(r1+52) 8004450: 34 01 00 02 mvi r1,2 8004454: 5c 41 00 06 bne r2,r1,800446c if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID ) 8004458: 45 8d 00 0b be r12,r13,8004484 <== NEVER TAKEN return EINVAL; if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST || 800445c: 35 8c ff ff addi r12,r12,-1 8004460: 34 01 00 01 mvi r1,1 status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; 8004464: 34 0b 00 74 mvi r11,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 || 8004468: 50 2c 00 07 bgeu r1,r12,8004484 <== ALWAYS TAKEN return ETIMEDOUT; } } return _POSIX_RWLock_Translate_core_RWLock_return_code( (CORE_RWLock_Status) _Thread_Executing->Wait.return_code 800446c: 78 01 08 01 mvhi r1,0x801 8004470: 38 21 8d 74 ori r1,r1,0x8d74 8004474: 28 21 00 0c lw r1,(r1+12) status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; } } return _POSIX_RWLock_Translate_core_RWLock_return_code( 8004478: 28 21 00 34 lw r1,(r1+52) 800447c: f8 00 00 43 calli 8004588 <_POSIX_RWLock_Translate_core_RWLock_return_code> 8004480: b8 20 58 00 mv r11,r1 case OBJECTS_ERROR: break; } return EINVAL; } 8004484: b9 60 08 00 mv r1,r11 8004488: 2b 9d 00 04 lw ra,(sp+4) 800448c: 2b 8b 00 18 lw r11,(sp+24) 8004490: 2b 8c 00 14 lw r12,(sp+20) 8004494: 2b 8d 00 10 lw r13,(sp+16) 8004498: 2b 8e 00 0c lw r14,(sp+12) 800449c: 2b 8f 00 08 lw r15,(sp+8) 80044a0: 37 9c 00 20 addi sp,sp,32 80044a4: c3 a0 00 00 ret =============================================================================== 080044a8 : int pthread_rwlock_timedwrlock( pthread_rwlock_t *rwlock, const struct timespec *abstime ) { 80044a8: 37 9c ff e0 addi sp,sp,-32 80044ac: 5b 8b 00 18 sw (sp+24),r11 80044b0: 5b 8c 00 14 sw (sp+20),r12 80044b4: 5b 8d 00 10 sw (sp+16),r13 80044b8: 5b 8e 00 0c sw (sp+12),r14 80044bc: 5b 8f 00 08 sw (sp+8),r15 80044c0: 5b 9d 00 04 sw (sp+4),ra 80044c4: b8 20 70 00 mv r14,r1 Watchdog_Interval ticks; bool do_wait = true; POSIX_Absolute_timeout_conversion_results_t status; if ( !rwlock ) return EINVAL; 80044c8: 34 0b 00 16 mvi r11,22 int pthread_rwlock_timedwrlock( pthread_rwlock_t *rwlock, const struct timespec *abstime ) { 80044cc: b8 40 08 00 mv r1,r2 Objects_Locations location; Watchdog_Interval ticks; bool do_wait = true; POSIX_Absolute_timeout_conversion_results_t status; if ( !rwlock ) 80044d0: 45 c0 00 25 be r14,r0,8004564 * * 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 ); 80044d4: 37 82 00 1c addi r2,sp,28 80044d8: f8 00 1b db calli 800b444 <_POSIX_Absolute_timeout_to_ticks> 80044dc: 29 c2 00 00 lw r2,(r14+0) 80044e0: b8 20 60 00 mv r12,r1 80044e4: 78 01 08 01 mvhi r1,0x801 80044e8: 38 21 8a 3c ori r1,r1,0x8a3c 80044ec: 37 83 00 20 addi r3,sp,32 80044f0: f8 00 0a 7e calli 8006ee8 <_Objects_Get> if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE ) do_wait = false; the_rwlock = _POSIX_RWLock_Get( rwlock, &location ); switch ( location ) { 80044f4: 2b 8f 00 20 lw r15,(sp+32) 80044f8: 5d e0 00 1b bne r15,r0,8004564 (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, 80044fc: 65 8d 00 03 cmpei r13,r12,3 case OBJECTS_LOCAL: _CORE_RWLock_Obtain_for_writing( 8004500: 29 c2 00 00 lw r2,(r14+0) 8004504: 2b 84 00 1c lw r4,(sp+28) 8004508: 34 21 00 10 addi r1,r1,16 800450c: b9 a0 18 00 mv r3,r13 8004510: 34 05 00 00 mvi r5,0 8004514: f8 00 06 a4 calli 8005fa4 <_CORE_RWLock_Obtain_for_writing> do_wait, ticks, NULL ); _Thread_Enable_dispatch(); 8004518: f8 00 0d 92 calli 8007b60 <_Thread_Enable_dispatch> if ( !do_wait && 800451c: 5d af 00 0c bne r13,r15,800454c (_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) { 8004520: 78 01 08 01 mvhi r1,0x801 8004524: 38 21 8d 74 ori r1,r1,0x8d74 8004528: 28 21 00 0c lw r1,(r1+12) ticks, NULL ); _Thread_Enable_dispatch(); if ( !do_wait && 800452c: 28 22 00 34 lw r2,(r1+52) 8004530: 34 01 00 02 mvi r1,2 8004534: 5c 41 00 06 bne r2,r1,800454c (_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) { if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID ) 8004538: 45 8d 00 0b be r12,r13,8004564 <== NEVER TAKEN return EINVAL; if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST || 800453c: 35 8c ff ff addi r12,r12,-1 8004540: 34 01 00 01 mvi r1,1 status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; 8004544: 34 0b 00 74 mvi r11,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 || 8004548: 50 2c 00 07 bgeu r1,r12,8004564 <== 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 800454c: 78 01 08 01 mvhi r1,0x801 8004550: 38 21 8d 74 ori r1,r1,0x8d74 8004554: 28 21 00 0c lw r1,(r1+12) if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST || status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; } return _POSIX_RWLock_Translate_core_RWLock_return_code( 8004558: 28 21 00 34 lw r1,(r1+52) 800455c: f8 00 00 0b calli 8004588 <_POSIX_RWLock_Translate_core_RWLock_return_code> 8004560: b8 20 58 00 mv r11,r1 case OBJECTS_ERROR: break; } return EINVAL; } 8004564: b9 60 08 00 mv r1,r11 8004568: 2b 9d 00 04 lw ra,(sp+4) 800456c: 2b 8b 00 18 lw r11,(sp+24) 8004570: 2b 8c 00 14 lw r12,(sp+20) 8004574: 2b 8d 00 10 lw r13,(sp+16) 8004578: 2b 8e 00 0c lw r14,(sp+12) 800457c: 2b 8f 00 08 lw r15,(sp+8) 8004580: 37 9c 00 20 addi sp,sp,32 8004584: c3 a0 00 00 ret =============================================================================== 08004eac : pthread_rwlockattr_t *attr, int pshared ) { if ( !attr ) return EINVAL; 8004eac: 34 03 00 16 mvi r3,22 int pthread_rwlockattr_setpshared( pthread_rwlockattr_t *attr, int pshared ) { if ( !attr ) 8004eb0: 44 20 00 07 be r1,r0,8004ecc return EINVAL; if ( !attr->is_initialized ) 8004eb4: 28 24 00 00 lw r4,(r1+0) 8004eb8: 44 80 00 05 be r4,r0,8004ecc return EINVAL; switch ( pshared ) { 8004ebc: 34 04 00 01 mvi r4,1 8004ec0: 54 44 00 03 bgu r2,r4,8004ecc <== NEVER TAKEN case PTHREAD_PROCESS_SHARED: case PTHREAD_PROCESS_PRIVATE: attr->process_shared = pshared; 8004ec4: 58 22 00 04 sw (r1+4),r2 return 0; 8004ec8: 34 03 00 00 mvi r3,0 default: return EINVAL; } } 8004ecc: b8 60 08 00 mv r1,r3 8004ed0: c3 a0 00 00 ret =============================================================================== 08006128 : int pthread_setschedparam( pthread_t thread, int policy, struct sched_param *param ) { 8006128: 37 9c ff dc addi sp,sp,-36 800612c: 5b 8b 00 18 sw (sp+24),r11 8006130: 5b 8c 00 14 sw (sp+20),r12 8006134: 5b 8d 00 10 sw (sp+16),r13 8006138: 5b 8e 00 0c sw (sp+12),r14 800613c: 5b 8f 00 08 sw (sp+8),r15 8006140: 5b 9d 00 04 sw (sp+4),ra /* * Check all the parameters */ if ( !param ) return EINVAL; 8006144: 34 0e 00 16 mvi r14,22 int pthread_setschedparam( pthread_t thread, int policy, struct sched_param *param ) { 8006148: b8 20 58 00 mv r11,r1 800614c: b8 40 78 00 mv r15,r2 8006150: b8 60 60 00 mv r12,r3 int rc; /* * Check all the parameters */ if ( !param ) 8006154: 44 60 00 46 be r3,r0,800626c <== NEVER TAKEN return EINVAL; rc = _POSIX_Thread_Translate_sched_param( 8006158: b8 40 08 00 mv r1,r2 800615c: 37 84 00 20 addi r4,sp,32 8006160: b8 60 10 00 mv r2,r3 8006164: 37 83 00 24 addi r3,sp,36 8006168: f8 00 19 f5 calli 800c93c <_POSIX_Thread_Translate_sched_param> 800616c: b8 20 70 00 mv r14,r1 policy, param, &budget_algorithm, &budget_callout ); if ( rc ) 8006170: 5c 20 00 3f bne r1,r0,800626c <== NEVER TAKEN 8006174: 78 03 08 01 mvhi r3,0x801 8006178: b8 60 08 00 mv r1,r3 800617c: 38 21 aa cc ori r1,r1,0xaacc 8006180: b9 60 10 00 mv r2,r11 8006184: 37 83 00 1c addi r3,sp,28 8006188: f8 00 07 a5 calli 800801c <_Objects_Get> 800618c: b8 20 68 00 mv r13,r1 /* * Actually change the scheduling policy and parameters */ the_thread = _POSIX_Threads_Get( thread, &location ); switch ( location ) { 8006190: 2b 81 00 1c lw r1,(sp+28) 8006194: 5c 2e 00 35 bne r1,r14,8006268 <== NEVER TAKEN case OBJECTS_LOCAL: api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 8006198: 29 ab 01 20 lw r11,(r13+288) if ( api->schedpolicy == SCHED_SPORADIC ) 800619c: 34 01 00 04 mvi r1,4 80061a0: 29 62 00 84 lw r2,(r11+132) 80061a4: 5c 41 00 03 bne r2,r1,80061b0 (void) _Watchdog_Remove( &api->Sporadic_timer ); 80061a8: 35 61 00 a8 addi r1,r11,168 80061ac: f8 00 10 41 calli 800a2b0 <_Watchdog_Remove> api->schedpolicy = policy; 80061b0: 59 6f 00 84 sw (r11+132),r15 api->schedparam = *param; 80061b4: 29 81 00 14 lw r1,(r12+20) 80061b8: 29 82 00 00 lw r2,(r12+0) 80061bc: 29 86 00 04 lw r6,(r12+4) 80061c0: 29 85 00 08 lw r5,(r12+8) 80061c4: 29 84 00 0c lw r4,(r12+12) 80061c8: 29 83 00 10 lw r3,(r12+16) 80061cc: 29 87 00 18 lw r7,(r12+24) 80061d0: 59 61 00 9c sw (r11+156),r1 the_thread->budget_algorithm = budget_algorithm; 80061d4: 2b 81 00 24 lw r1,(sp+36) if ( api->schedpolicy == SCHED_SPORADIC ) (void) _Watchdog_Remove( &api->Sporadic_timer ); api->schedpolicy = policy; api->schedparam = *param; 80061d8: 59 62 00 88 sw (r11+136),r2 80061dc: 59 66 00 8c sw (r11+140),r6 80061e0: 59 65 00 90 sw (r11+144),r5 80061e4: 59 64 00 94 sw (r11+148),r4 80061e8: 59 63 00 98 sw (r11+152),r3 80061ec: 59 67 00 a0 sw (r11+160),r7 the_thread->budget_algorithm = budget_algorithm; 80061f0: 59 a1 00 7c sw (r13+124),r1 the_thread->budget_callout = budget_callout; 80061f4: 2b 81 00 20 lw r1,(sp+32) 80061f8: 59 a1 00 80 sw (r13+128),r1 switch ( api->schedpolicy ) { 80061fc: 48 0f 00 19 bg r0,r15,8006260 <== NEVER TAKEN 8006200: 34 01 00 02 mvi r1,2 8006204: 4c 2f 00 04 bge r1,r15,8006214 8006208: 34 01 00 04 mvi r1,4 800620c: 5d e1 00 15 bne r15,r1,8006260 <== NEVER TAKEN 8006210: e0 00 00 0e bi 8006248 case SCHED_OTHER: case SCHED_FIFO: case SCHED_RR: the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice; 8006214: 78 01 08 01 mvhi r1,0x801 8006218: 38 21 a8 90 ori r1,r1,0xa890 800621c: 28 21 00 00 lw r1,(r1+0) the_thread->real_priority = _POSIX_Priority_To_core( api->schedparam.sched_priority ); _Thread_Change_priority( 8006220: 34 03 00 01 mvi r3,1 switch ( api->schedpolicy ) { case SCHED_OTHER: case SCHED_FIFO: case SCHED_RR: the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice; 8006224: 59 a1 00 78 sw (r13+120),r1 8006228: 78 01 08 01 mvhi r1,0x801 800622c: 38 21 a0 e4 ori r1,r1,0xa0e4 8006230: 40 21 00 00 lbu r1,(r1+0) 8006234: c8 22 10 00 sub r2,r1,r2 the_thread->real_priority = 8006238: 59 a2 00 18 sw (r13+24),r2 _POSIX_Priority_To_core( api->schedparam.sched_priority ); _Thread_Change_priority( 800623c: b9 a0 08 00 mv r1,r13 8006240: f8 00 09 96 calli 8008898 <_Thread_Change_priority> the_thread, the_thread->real_priority, true ); break; 8006244: e0 00 00 07 bi 8006260 case SCHED_SPORADIC: api->ss_high_priority = api->schedparam.sched_priority; 8006248: 59 62 00 a4 sw (r11+164),r2 _Watchdog_Remove( &api->Sporadic_timer ); 800624c: 35 61 00 a8 addi r1,r11,168 8006250: f8 00 10 18 calli 800a2b0 <_Watchdog_Remove> _POSIX_Threads_Sporadic_budget_TSR( 0, the_thread ); 8006254: 34 01 00 00 mvi r1,0 8006258: b9 a0 10 00 mv r2,r13 800625c: fb ff ff 62 calli 8005fe4 <_POSIX_Threads_Sporadic_budget_TSR> break; } _Thread_Enable_dispatch(); 8006260: f8 00 0a c4 calli 8008d70 <_Thread_Enable_dispatch> return 0; 8006264: e0 00 00 02 bi 800626c #endif case OBJECTS_ERROR: break; } return ESRCH; 8006268: 34 0e 00 03 mvi r14,3 } 800626c: b9 c0 08 00 mv r1,r14 8006270: 2b 9d 00 04 lw ra,(sp+4) 8006274: 2b 8b 00 18 lw r11,(sp+24) 8006278: 2b 8c 00 14 lw r12,(sp+20) 800627c: 2b 8d 00 10 lw r13,(sp+16) 8006280: 2b 8e 00 0c lw r14,(sp+12) 8006284: 2b 8f 00 08 lw r15,(sp+8) 8006288: 37 9c 00 24 addi sp,sp,36 800628c: c3 a0 00 00 ret =============================================================================== 080035d4 : * * 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183 */ void pthread_testcancel( void ) { 80035d4: 37 9c ff f8 addi sp,sp,-8 80035d8: 5b 8b 00 08 sw (sp+8),r11 80035dc: 5b 9d 00 04 sw (sp+4),ra * 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() ) 80035e0: 78 01 08 01 mvhi r1,0x801 80035e4: 38 21 6d 5c ori r1,r1,0x6d5c 80035e8: 28 22 00 08 lw r2,(r1+8) 80035ec: 5c 40 00 14 bne r2,r0,800363c <== NEVER TAKEN return; thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; 80035f0: 28 21 00 0c lw r1,(r1+12) 80035f4: 28 22 01 20 lw r2,(r1+288) 80035f8: 78 01 08 01 mvhi r1,0x801 80035fc: 38 21 68 90 ori r1,r1,0x6890 8003600: 28 23 00 00 lw r3,(r1+0) 8003604: 34 63 00 01 addi r3,r3,1 8003608: 58 23 00 00 sw (r1+0),r3 _Thread_Disable_dispatch(); if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE && 800360c: 28 41 00 d8 lw r1,(r2+216) */ void pthread_testcancel( void ) { POSIX_API_Control *thread_support; bool cancel = false; 8003610: 34 0b 00 00 mvi r11,0 return; thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; _Thread_Disable_dispatch(); if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE && 8003614: 5c 2b 00 03 bne r1,r11,8003620 <== 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)); 8003618: 28 4b 00 e0 lw r11,(r2+224) 800361c: 7d 6b 00 00 cmpnei r11,r11,0 thread_support->cancelation_requested ) cancel = true; _Thread_Enable_dispatch(); 8003620: f8 00 09 f0 calli 8005de0 <_Thread_Enable_dispatch> if ( cancel ) 8003624: 45 60 00 06 be r11,r0,800363c _POSIX_Thread_Exit( _Thread_Executing, PTHREAD_CANCELED ); 8003628: 78 01 08 01 mvhi r1,0x801 800362c: 38 21 6d 5c ori r1,r1,0x6d5c 8003630: 28 21 00 0c lw r1,(r1+12) 8003634: 34 02 ff ff mvi r2,-1 8003638: f8 00 18 e3 calli 80099c4 <_POSIX_Thread_Exit> } 800363c: 2b 9d 00 04 lw ra,(sp+4) 8003640: 2b 8b 00 08 lw r11,(sp+8) 8003644: 37 9c 00 08 addi sp,sp,8 8003648: c3 a0 00 00 ret =============================================================================== 080176e0 : ssize_t read( int fd, void *buffer, size_t count ) { 80176e0: 37 9c ff ec addi sp,sp,-20 80176e4: 5b 8b 00 10 sw (sp+16),r11 80176e8: 5b 8c 00 0c sw (sp+12),r12 80176ec: 5b 8d 00 08 sw (sp+8),r13 80176f0: 5b 9d 00 04 sw (sp+4),ra ssize_t rc; rtems_libio_t *iop; rtems_libio_check_fd( fd ); 80176f4: 78 04 08 01 mvhi r4,0x801 80176f8: 38 84 90 10 ori r4,r4,0x9010 ssize_t read( int fd, void *buffer, size_t count ) { 80176fc: b8 40 68 00 mv r13,r2 ssize_t rc; rtems_libio_t *iop; rtems_libio_check_fd( fd ); 8017700: 28 82 00 00 lw r2,(r4+0) 8017704: 54 41 00 02 bgu r2,r1,801770c <== ALWAYS TAKEN 8017708: e0 00 00 0c bi 8017738 <== NOT EXECUTED iop = rtems_libio_iop( fd ); 801770c: 78 0b 08 01 mvhi r11,0x801 8017710: 34 02 00 06 mvi r2,6 8017714: 39 6b 98 28 ori r11,r11,0x9828 8017718: 5b 83 00 14 sw (sp+20),r3 801771c: fb ff fe 08 calli 8016f3c <__ashlsi3> 8017720: 29 6b 00 00 lw r11,(r11+0) rtems_libio_check_is_open( iop ); 8017724: 2b 83 00 14 lw r3,(sp+20) { ssize_t rc; rtems_libio_t *iop; rtems_libio_check_fd( fd ); iop = rtems_libio_iop( fd ); 8017728: b5 61 58 00 add r11,r11,r1 rtems_libio_check_is_open( iop ); 801772c: 29 61 00 18 lw r1,(r11+24) 8017730: 20 22 01 00 andi r2,r1,0x100 8017734: 5c 40 00 04 bne r2,r0,8017744 8017738: fb ff e7 59 calli 801149c <__errno> 801773c: 34 02 00 09 mvi r2,9 8017740: e0 00 00 08 bi 8017760 rtems_libio_check_buffer( buffer ); 8017744: 45 a0 00 05 be r13,r0,8017758 <== NEVER TAKEN rtems_libio_check_count( count ); 8017748: 34 0c 00 00 mvi r12,0 801774c: 44 60 00 19 be r3,r0,80177b0 rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ ); 8017750: 20 21 00 02 andi r1,r1,0x2 8017754: 5c 20 00 06 bne r1,r0,801776c 8017758: fb ff e7 51 calli 801149c <__errno> 801775c: 34 02 00 16 mvi r2,22 8017760: 58 22 00 00 sw (r1+0),r2 8017764: 34 0c ff ff mvi r12,-1 8017768: e0 00 00 12 bi 80177b0 /* * Now process the read(). */ rc = (*iop->pathinfo.handlers->read_h)( iop, buffer, count ); 801776c: 29 61 00 24 lw r1,(r11+36) 8017770: b9 a0 10 00 mv r2,r13 8017774: 28 24 00 08 lw r4,(r1+8) 8017778: b9 60 08 00 mv r1,r11 801777c: d8 80 00 00 call r4 8017780: b8 20 60 00 mv r12,r1 if ( rc > 0 ) 8017784: 4c 01 00 0b bge r0,r1,80177b0 iop->offset += rc; 8017788: 34 02 00 1f mvi r2,31 801778c: fb ff fe 13 calli 8016fd8 <__ashrsi3> 8017790: 29 62 00 14 lw r2,(r11+20) 8017794: 29 64 00 10 lw r4,(r11+16) 8017798: b5 82 10 00 add r2,r12,r2 801779c: f5 82 18 00 cmpgu r3,r12,r2 80177a0: b4 24 08 00 add r1,r1,r4 80177a4: b4 61 08 00 add r1,r3,r1 80177a8: 59 61 00 10 sw (r11+16),r1 80177ac: 59 62 00 14 sw (r11+20),r2 return rc; } 80177b0: b9 80 08 00 mv r1,r12 80177b4: 2b 9d 00 04 lw ra,(sp+4) 80177b8: 2b 8b 00 10 lw r11,(sp+16) 80177bc: 2b 8c 00 0c lw r12,(sp+12) 80177c0: 2b 8d 00 08 lw r13,(sp+8) 80177c4: 37 9c 00 14 addi sp,sp,20 80177c8: c3 a0 00 00 ret =============================================================================== 08004d98 : ssize_t readlink( const char *pathname, char *buf, size_t bufsize ) { 8004d98: 37 9c ff d8 addi sp,sp,-40 8004d9c: 5b 8b 00 14 sw (sp+20),r11 8004da0: 5b 8c 00 10 sw (sp+16),r12 8004da4: 5b 8d 00 0c sw (sp+12),r13 8004da8: 5b 8e 00 08 sw (sp+8),r14 8004dac: 5b 9d 00 04 sw (sp+4),ra 8004db0: b8 20 60 00 mv r12,r1 8004db4: b8 40 68 00 mv r13,r2 8004db8: b8 60 70 00 mv r14,r3 rtems_filesystem_location_info_t loc; int result; if (!buf) 8004dbc: 5c 40 00 06 bne r2,r0,8004dd4 rtems_set_errno_and_return_minus_one( EFAULT ); 8004dc0: f8 00 2b 8e calli 800fbf8 <__errno> 8004dc4: 34 02 00 0e mvi r2,14 8004dc8: 58 22 00 00 sw (r1+0),r2 8004dcc: 34 0c ff ff mvi r12,-1 8004dd0: e0 00 00 20 bi 8004e50 result = rtems_filesystem_evaluate_path( pathname, strlen( pathname ), 8004dd4: f8 00 33 3a calli 8011abc 8004dd8: 37 8b 00 18 addi r11,sp,24 8004ddc: b8 20 10 00 mv r2,r1 8004de0: 34 03 00 00 mvi r3,0 8004de4: b9 80 08 00 mv r1,r12 8004de8: b9 60 20 00 mv r4,r11 8004dec: 34 05 00 00 mvi r5,0 8004df0: fb ff fa e8 calli 8003990 0, &loc, false ); if ( result != 0 ) return -1; 8004df4: 34 0c ff ff mvi r12,-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 ) 8004df8: 5c 20 00 16 bne r1,r0,8004e50 <== NEVER TAKEN return -1; if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK ){ 8004dfc: 2b 81 00 24 lw r1,(sp+36) 8004e00: 28 22 00 10 lw r2,(r1+16) 8004e04: b9 60 08 00 mv r1,r11 8004e08: d8 40 00 00 call r2 8004e0c: 34 02 00 04 mvi r2,4 8004e10: 44 22 00 07 be r1,r2,8004e2c rtems_filesystem_freenode( &loc ); 8004e14: b9 60 08 00 mv r1,r11 8004e18: fb ff fb 26 calli 8003ab0 rtems_set_errno_and_return_minus_one( EINVAL ); 8004e1c: f8 00 2b 77 calli 800fbf8 <__errno> 8004e20: 34 02 00 16 mvi r2,22 8004e24: 58 22 00 00 sw (r1+0),r2 8004e28: e0 00 00 0a bi 8004e50 } result = (*loc.ops->readlink_h)( &loc, buf, bufsize ); 8004e2c: 2b 81 00 24 lw r1,(sp+36) 8004e30: b9 a0 10 00 mv r2,r13 8004e34: b9 c0 18 00 mv r3,r14 8004e38: 28 24 00 3c lw r4,(r1+60) 8004e3c: b9 60 08 00 mv r1,r11 8004e40: d8 80 00 00 call r4 8004e44: b8 20 60 00 mv r12,r1 rtems_filesystem_freenode( &loc ); 8004e48: b9 60 08 00 mv r1,r11 8004e4c: fb ff fb 19 calli 8003ab0 return result; } 8004e50: b9 80 08 00 mv r1,r12 8004e54: 2b 9d 00 04 lw ra,(sp+4) 8004e58: 2b 8b 00 14 lw r11,(sp+20) 8004e5c: 2b 8c 00 10 lw r12,(sp+16) 8004e60: 2b 8d 00 0c lw r13,(sp+12) 8004e64: 2b 8e 00 08 lw r14,(sp+8) 8004e68: 37 9c 00 28 addi sp,sp,40 8004e6c: c3 a0 00 00 ret =============================================================================== 0800365c : ssize_t readv( int fd, const struct iovec *iov, int iovcnt ) { 800365c: 37 9c ff e4 addi sp,sp,-28 8003660: 5b 8b 00 1c sw (sp+28),r11 8003664: 5b 8c 00 18 sw (sp+24),r12 8003668: 5b 8d 00 14 sw (sp+20),r13 800366c: 5b 8e 00 10 sw (sp+16),r14 8003670: 5b 8f 00 0c sw (sp+12),r15 8003674: 5b 90 00 08 sw (sp+8),r16 8003678: 5b 9d 00 04 sw (sp+4),ra 800367c: b8 60 78 00 mv r15,r3 int v; int bytes; rtems_libio_t *iop; bool all_zeros; rtems_libio_check_fd( fd ); 8003680: 78 03 08 01 mvhi r3,0x801 8003684: 38 63 60 10 ori r3,r3,0x6010 ssize_t readv( int fd, const struct iovec *iov, int iovcnt ) { 8003688: b8 40 68 00 mv r13,r2 int v; int bytes; rtems_libio_t *iop; bool all_zeros; rtems_libio_check_fd( fd ); 800368c: 28 62 00 00 lw r2,(r3+0) 8003690: 54 41 00 02 bgu r2,r1,8003698 8003694: e0 00 00 0a bi 80036bc iop = rtems_libio_iop( fd ); 8003698: 78 0b 08 01 mvhi r11,0x801 800369c: 34 02 00 06 mvi r2,6 80036a0: 39 6b 67 6c ori r11,r11,0x676c 80036a4: f8 00 3e 15 calli 8012ef8 <__ashlsi3> 80036a8: 29 6c 00 00 lw r12,(r11+0) 80036ac: b5 81 60 00 add r12,r12,r1 rtems_libio_check_is_open( iop ); 80036b0: 29 81 00 18 lw r1,(r12+24) 80036b4: 20 22 01 00 andi r2,r1,0x100 80036b8: 5c 40 00 04 bne r2,r0,80036c8 80036bc: f8 00 28 22 calli 800d744 <__errno> 80036c0: 34 02 00 09 mvi r2,9 80036c4: e0 00 00 16 bi 800371c rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ ); 80036c8: 20 21 00 02 andi r1,r1,0x2 80036cc: 44 20 00 12 be r1,r0,8003714 <== NEVER TAKEN /* * Argument validation on IO vector */ if ( !iov ) 80036d0: 45 a0 00 11 be r13,r0,8003714 rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt <= 0 ) 80036d4: 49 e0 00 02 bg r15,r0,80036dc 80036d8: e0 00 00 0f bi 8003714 rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt > IOV_MAX ) 80036dc: 34 01 04 00 mvi r1,1024 80036e0: 4c 2f 00 02 bge r1,r15,80036e8 <== ALWAYS TAKEN 80036e4: e0 00 00 0c bi 8003714 <== NOT EXECUTED 80036e8: b9 a0 08 00 mv r1,r13 80036ec: 34 02 00 01 mvi r2,1 80036f0: 34 04 00 00 mvi r4,0 80036f4: 34 03 00 00 mvi r3,0 80036f8: e0 00 00 02 bi 8003700 if ( iov[v].iov_base == 0 ) rtems_set_errno_and_return_minus_one( EINVAL ); /* check for wrap */ old = total; total += iov[v].iov_len; 80036fc: b8 c0 18 00 mv r3,r6 /* * 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 ) 8003700: 28 25 00 00 lw r5,(r1+0) 8003704: 44 a0 00 04 be r5,r0,8003714 rtems_set_errno_and_return_minus_one( EINVAL ); /* check for wrap */ old = total; total += iov[v].iov_len; 8003708: 28 25 00 04 lw r5,(r1+4) 800370c: b4 65 30 00 add r6,r3,r5 if ( total < old ) 8003710: 4c c3 00 05 bge r6,r3,8003724 rtems_set_errno_and_return_minus_one( EINVAL ); 8003714: f8 00 28 0c calli 800d744 <__errno> 8003718: 34 02 00 16 mvi r2,22 800371c: 58 22 00 00 sw (r1+0),r2 8003720: e0 00 00 24 bi 80037b0 if ( iov[v].iov_len ) all_zeros = false; 8003724: 64 a5 00 00 cmpei r5,r5,0 * 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++ ) { 8003728: 34 84 00 01 addi r4,r4,1 total += iov[v].iov_len; if ( total < old ) rtems_set_errno_and_return_minus_one( EINVAL ); if ( iov[v].iov_len ) all_zeros = false; 800372c: c8 05 28 00 sub r5,r0,r5 8003730: a0 45 10 00 and r2,r2,r5 * 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++ ) { 8003734: 34 21 00 08 addi r1,r1,8 8003738: 49 e4 ff f1 bg r15,r4,80036fc * A readv with all zeros logically has no effect. Even though * OpenGroup didn't address this case as they did with writev(), * we will handle it the same way for symmetry. */ if ( all_zeros == true ) { return 0; 800373c: 34 0b 00 00 mvi r11,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 ) { 8003740: 5c 40 00 1d bne r2,r0,80037b4 8003744: 34 10 00 00 mvi r16,0 /* * Now process the readv(). */ for ( total=0, v=0 ; v < iovcnt ; v++ ) { bytes = (*iop->pathinfo.handlers->read_h)( 8003748: 29 81 00 24 lw r1,(r12+36) 800374c: 29 a2 00 00 lw r2,(r13+0) 8003750: 29 a3 00 04 lw r3,(r13+4) 8003754: 28 24 00 08 lw r4,(r1+8) 8003758: b9 80 08 00 mv r1,r12 800375c: d8 80 00 00 call r4 8003760: b8 20 70 00 mv r14,r1 iop, iov[v].iov_base, iov[v].iov_len ); if ( bytes < 0 ) 8003764: 48 01 00 13 bg r0,r1,80037b0 <== NEVER TAKEN return -1; if ( bytes > 0 ) { 8003768: 44 20 00 0c be r1,r0,8003798 <== NEVER TAKEN iop->offset += bytes; 800376c: 34 02 00 1f mvi r2,31 8003770: f8 00 3e 09 calli 8012f94 <__ashrsi3> 8003774: 29 82 00 14 lw r2,(r12+20) 8003778: 29 84 00 10 lw r4,(r12+16) total += bytes; 800377c: b5 6e 58 00 add r11,r11,r14 if ( bytes < 0 ) return -1; if ( bytes > 0 ) { iop->offset += bytes; 8003780: b5 c2 10 00 add r2,r14,r2 8003784: f5 c2 18 00 cmpgu r3,r14,r2 8003788: b4 24 08 00 add r1,r1,r4 800378c: b4 61 08 00 add r1,r3,r1 8003790: 59 81 00 10 sw (r12+16),r1 8003794: 59 82 00 14 sw (r12+20),r2 total += bytes; } if (bytes != iov[ v ].iov_len) 8003798: 29 a1 00 04 lw r1,(r13+4) 800379c: 5d c1 00 06 bne r14,r1,80037b4 <== NEVER TAKEN } /* * Now process the readv(). */ for ( total=0, v=0 ; v < iovcnt ; v++ ) { 80037a0: 36 10 00 01 addi r16,r16,1 80037a4: 35 ad 00 08 addi r13,r13,8 80037a8: 49 f0 ff e8 bg r15,r16,8003748 80037ac: e0 00 00 02 bi 80037b4 iov[v].iov_base, iov[v].iov_len ); if ( bytes < 0 ) return -1; 80037b0: 34 0b ff ff mvi r11,-1 if (bytes != iov[ v ].iov_len) break; } return total; } 80037b4: b9 60 08 00 mv r1,r11 80037b8: 2b 9d 00 04 lw ra,(sp+4) 80037bc: 2b 8b 00 1c lw r11,(sp+28) 80037c0: 2b 8c 00 18 lw r12,(sp+24) 80037c4: 2b 8d 00 14 lw r13,(sp+20) 80037c8: 2b 8e 00 10 lw r14,(sp+16) 80037cc: 2b 8f 00 0c lw r15,(sp+12) 80037d0: 2b 90 00 08 lw r16,(sp+8) 80037d4: 37 9c 00 1c addi sp,sp,28 80037d8: c3 a0 00 00 ret =============================================================================== 0800368c : void *realloc( void *ptr, size_t size ) { 800368c: 37 9c ff e8 addi sp,sp,-24 8003690: 5b 8b 00 14 sw (sp+20),r11 8003694: 5b 8c 00 10 sw (sp+16),r12 8003698: 5b 8d 00 0c sw (sp+12),r13 800369c: 5b 8e 00 08 sw (sp+8),r14 80036a0: 5b 9d 00 04 sw (sp+4),ra 80036a4: b8 20 58 00 mv r11,r1 uintptr_t old_size; char *new_area; MSBUMP(realloc_calls, 1); 80036a8: 78 01 08 01 mvhi r1,0x801 80036ac: 38 21 98 40 ori r1,r1,0x9840 void *realloc( void *ptr, size_t size ) { 80036b0: b8 40 60 00 mv r12,r2 uintptr_t old_size; char *new_area; MSBUMP(realloc_calls, 1); 80036b4: 28 22 00 10 lw r2,(r1+16) 80036b8: 34 42 00 01 addi r2,r2,1 80036bc: 58 22 00 10 sw (r1+16),r2 /* * Do not attempt to allocate memory if in a critical section or ISR. */ if (_System_state_Is_up(_System_state_Get())) { 80036c0: 78 01 08 01 mvhi r1,0x801 80036c4: 38 21 9a d8 ori r1,r1,0x9ad8 80036c8: 28 22 00 00 lw r2,(r1+0) 80036cc: 34 01 00 03 mvi r1,3 80036d0: 5c 41 00 09 bne r2,r1,80036f4 <== NEVER TAKEN if (_Thread_Dispatch_disable_level > 0) 80036d4: 78 01 08 01 mvhi r1,0x801 80036d8: 38 21 99 60 ori r1,r1,0x9960 80036dc: 28 22 00 00 lw r2,(r1+0) 80036e0: 5c 40 00 33 bne r2,r0,80037ac <== NEVER TAKEN return (void *) 0; if (_ISR_Nest_level > 0) 80036e4: 78 01 08 01 mvhi r1,0x801 80036e8: 38 21 9e 2c ori r1,r1,0x9e2c 80036ec: 28 21 00 08 lw r1,(r1+8) 80036f0: 5c 22 00 2f bne r1,r2,80037ac <== NEVER TAKEN } /* * Continue with realloc(). */ if ( !ptr ) 80036f4: 5d 60 00 05 bne r11,r0,8003708 return malloc( size ); 80036f8: b9 80 08 00 mv r1,r12 80036fc: fb ff fc ec calli 8002aac 8003700: b8 20 58 00 mv r11,r1 8003704: e0 00 00 2b bi 80037b0 if ( !size ) { 8003708: 5d 80 00 04 bne r12,r0,8003718 <== ALWAYS TAKEN free( ptr ); 800370c: b9 60 08 00 mv r1,r11 <== NOT EXECUTED 8003710: fb ff fb ed calli 80026c4 <== NOT EXECUTED 8003714: e0 00 00 26 bi 80037ac <== NOT EXECUTED return (void *) 0; } if ( !_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, ptr, &old_size) ) { 8003718: 78 0d 08 01 mvhi r13,0x801 800371c: 39 ad 90 1c ori r13,r13,0x901c 8003720: 29 a1 00 00 lw r1,(r13+0) 8003724: b9 60 10 00 mv r2,r11 8003728: 37 83 00 18 addi r3,sp,24 800372c: f8 00 0a 2b calli 8005fd8 <_Protected_heap_Get_block_size> 8003730: 5c 20 00 05 bne r1,r0,8003744 errno = EINVAL; 8003734: f8 00 37 5a calli 801149c <__errno> 8003738: 34 02 00 16 mvi r2,22 800373c: 58 22 00 00 sw (r1+0),r2 8003740: e0 00 00 1b bi 80037ac } /* * Now resize it. */ if ( _Protected_heap_Resize_block( RTEMS_Malloc_Heap, ptr, size ) ) { 8003744: 29 a1 00 00 lw r1,(r13+0) 8003748: b9 60 10 00 mv r2,r11 800374c: b9 80 18 00 mv r3,r12 8003750: f8 00 0a 3c calli 8006040 <_Protected_heap_Resize_block> 8003754: b8 20 70 00 mv r14,r1 8003758: 5c 20 00 16 bne r1,r0,80037b0 * 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 ); 800375c: b9 80 08 00 mv r1,r12 8003760: fb ff fc d3 calli 8002aac MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */ 8003764: 78 02 08 01 mvhi r2,0x801 8003768: 38 42 98 40 ori r2,r2,0x9840 * 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 ); 800376c: b8 20 68 00 mv r13,r1 MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */ 8003770: 28 41 00 04 lw r1,(r2+4) 8003774: 34 21 ff ff addi r1,r1,-1 8003778: 58 41 00 04 sw (r2+4),r1 if ( !new_area ) { 800377c: 45 ae 00 0c be r13,r14,80037ac return (void *) 0; } memcpy( new_area, ptr, (size < old_size) ? size : old_size ); 8003780: 2b 81 00 18 lw r1,(sp+24) 8003784: b9 80 18 00 mv r3,r12 8003788: 50 2c 00 02 bgeu r1,r12,8003790 <== NEVER TAKEN 800378c: b8 20 18 00 mv r3,r1 8003790: b9 60 10 00 mv r2,r11 8003794: b9 a0 08 00 mv r1,r13 8003798: f8 00 39 f7 calli 8011f74 free( ptr ); 800379c: b9 60 08 00 mv r1,r11 80037a0: fb ff fb c9 calli 80026c4 return new_area; 80037a4: b9 a0 58 00 mv r11,r13 80037a8: e0 00 00 02 bi 80037b0 new_area = malloc( size ); MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */ if ( !new_area ) { return (void *) 0; 80037ac: 34 0b 00 00 mvi r11,0 memcpy( new_area, ptr, (size < old_size) ? size : old_size ); free( ptr ); return new_area; } 80037b0: b9 60 08 00 mv r1,r11 80037b4: 2b 9d 00 04 lw ra,(sp+4) 80037b8: 2b 8b 00 14 lw r11,(sp+20) 80037bc: 2b 8c 00 10 lw r12,(sp+16) 80037c0: 2b 8d 00 0c lw r13,(sp+12) 80037c4: 2b 8e 00 08 lw r14,(sp+8) 80037c8: 37 9c 00 18 addi sp,sp,24 80037cc: c3 a0 00 00 ret =============================================================================== 0800281c : #include int rmdir( const char *pathname ) { 800281c: 37 9c ff c0 addi sp,sp,-64 8002820: 5b 8b 00 14 sw (sp+20),r11 8002824: 5b 8c 00 10 sw (sp+16),r12 8002828: 5b 8d 00 0c sw (sp+12),r13 800282c: 5b 8e 00 08 sw (sp+8),r14 8002830: 5b 9d 00 04 sw (sp+4),ra 8002834: b8 20 70 00 mv r14,r1 /* * Get the parent node of the node we wish to remove. Find the parent path. */ parentpathlen = rtems_filesystem_dirname ( pathname ); 8002838: fb ff fb d2 calli 8001780 800283c: b8 20 58 00 mv r11,r1 8002840: 37 84 00 2c addi r4,sp,44 if ( parentpathlen == 0 ) 8002844: 5c 20 00 07 bne r1,r0,8002860 rtems_filesystem_get_start_loc( pathname, &i, &parentloc ); 8002848: b9 c0 08 00 mv r1,r14 800284c: 37 82 00 40 addi r2,sp,64 8002850: b8 80 18 00 mv r3,r4 8002854: f8 00 00 4e calli 800298c const char *name; rtems_filesystem_location_info_t parentloc; rtems_filesystem_location_info_t loc; int i; int result; bool free_parentloc = false; 8002858: 34 0d 00 00 mvi r13,0 800285c: e0 00 00 09 bi 8002880 parentpathlen = rtems_filesystem_dirname ( pathname ); if ( parentpathlen == 0 ) rtems_filesystem_get_start_loc( pathname, &i, &parentloc ); else { result = rtems_filesystem_evaluate_path(pathname, parentpathlen, 8002860: b9 c0 08 00 mv r1,r14 8002864: b9 60 10 00 mv r2,r11 8002868: 34 03 00 02 mvi r3,2 800286c: 34 05 00 00 mvi r5,0 8002870: fb ff fb a9 calli 8001714 RTEMS_LIBIO_PERMS_WRITE, &parentloc, false ); if ( result != 0 ) return -1; 8002874: 34 0c ff ff mvi r12,-1 else { result = rtems_filesystem_evaluate_path(pathname, parentpathlen, RTEMS_LIBIO_PERMS_WRITE, &parentloc, false ); if ( result != 0 ) 8002878: 5c 20 00 3d bne r1,r0,800296c <== NEVER TAKEN return -1; free_parentloc = true; 800287c: 34 0d 00 01 mvi r13,1 /* * Start from the parent to find the node that should be under it. */ loc = parentloc; 8002880: 2b 81 00 2c lw r1,(sp+44) name = pathname + parentpathlen; 8002884: b5 cb 58 00 add r11,r14,r11 /* * Start from the parent to find the node that should be under it. */ loc = parentloc; 8002888: 5b 81 00 18 sw (sp+24),r1 800288c: 2b 81 00 30 lw r1,(sp+48) 8002890: 5b 81 00 1c sw (sp+28),r1 8002894: 2b 81 00 34 lw r1,(sp+52) 8002898: 5b 81 00 20 sw (sp+32),r1 800289c: 2b 81 00 38 lw r1,(sp+56) 80028a0: 5b 81 00 24 sw (sp+36),r1 80028a4: 2b 81 00 3c lw r1,(sp+60) 80028a8: 5b 81 00 28 sw (sp+40),r1 name = pathname + parentpathlen; name += rtems_filesystem_prefix_separators( name, strlen( name ) ); 80028ac: b9 60 08 00 mv r1,r11 80028b0: f8 00 2e 09 calli 800e0d4 80028b4: b8 20 10 00 mv r2,r1 80028b8: b9 60 08 00 mv r1,r11 80028bc: fb ff fb c5 calli 80017d0 80028c0: b5 61 60 00 add r12,r11,r1 result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), 80028c4: b9 80 08 00 mv r1,r12 80028c8: f8 00 2e 03 calli 800e0d4 80028cc: 37 8b 00 18 addi r11,sp,24 80028d0: b8 20 10 00 mv r2,r1 80028d4: 34 03 00 00 mvi r3,0 80028d8: b9 80 08 00 mv r1,r12 80028dc: b9 60 20 00 mv r4,r11 80028e0: 34 05 00 00 mvi r5,0 80028e4: fb ff fb 6a calli 800168c 0, &loc, false ); if ( result != 0 ) { 80028e8: 44 20 00 05 be r1,r0,80028fc if ( free_parentloc ) rtems_filesystem_freenode( &parentloc ); return -1; 80028ec: 34 0c ff ff mvi r12,-1 result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), 0, &loc, false ); if ( result != 0 ) { if ( free_parentloc ) rtems_filesystem_freenode( &parentloc ); 80028f0: 37 81 00 2c addi r1,sp,44 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 ) 80028f4: 45 a0 00 1e be r13,r0,800296c 80028f8: e0 00 00 1c bi 8002968 } /* * Verify you can remove this node as a directory. */ if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) { 80028fc: 2b 81 00 24 lw r1,(sp+36) 8002900: 28 22 00 10 lw r2,(r1+16) 8002904: b9 60 08 00 mv r1,r11 8002908: d8 40 00 00 call r2 800290c: 34 02 00 01 mvi r2,1 8002910: 44 22 00 0b be r1,r2,800293c rtems_filesystem_freenode( &loc ); 8002914: b9 60 08 00 mv r1,r11 8002918: fb ff fb c7 calli 8001834 if ( free_parentloc ) 800291c: 45 a0 00 03 be r13,r0,8002928 <== NEVER TAKEN rtems_filesystem_freenode( &parentloc ); 8002920: 37 81 00 2c addi r1,sp,44 8002924: fb ff fb c4 calli 8001834 rtems_set_errno_and_return_minus_one( ENOTDIR ); 8002928: f8 00 29 8a calli 800cf50 <__errno> 800292c: 34 02 00 14 mvi r2,20 8002930: 58 22 00 00 sw (r1+0),r2 8002934: 34 0c ff ff mvi r12,-1 8002938: e0 00 00 0d bi 800296c /* * Use the filesystems rmnod to remove the node. */ result = (*loc.handlers->rmnod_h)( &parentloc, &loc ); 800293c: 2b 81 00 20 lw r1,(sp+32) 8002940: 37 8e 00 2c addi r14,sp,44 8002944: b9 60 10 00 mv r2,r11 8002948: 28 23 00 34 lw r3,(r1+52) 800294c: b9 c0 08 00 mv r1,r14 8002950: d8 60 00 00 call r3 8002954: b8 20 60 00 mv r12,r1 rtems_filesystem_freenode( &loc ); 8002958: b9 60 08 00 mv r1,r11 800295c: fb ff fb b6 calli 8001834 if ( free_parentloc ) 8002960: 45 a0 00 03 be r13,r0,800296c rtems_filesystem_freenode( &parentloc ); 8002964: b9 c0 08 00 mv r1,r14 8002968: fb ff fb b3 calli 8001834 return result; } 800296c: b9 80 08 00 mv r1,r12 8002970: 2b 9d 00 04 lw ra,(sp+4) 8002974: 2b 8b 00 14 lw r11,(sp+20) 8002978: 2b 8c 00 10 lw r12,(sp+16) 800297c: 2b 8d 00 0c lw r13,(sp+12) 8002980: 2b 8e 00 08 lw r14,(sp+8) 8002984: 37 9c 00 40 addi sp,sp,64 8002988: c3 a0 00 00 ret =============================================================================== 080041d4 : * errno - otherwise */ int rtems_aio_enqueue (rtems_aio_request *req) { 80041d4: 37 9c ff bc addi sp,sp,-68 80041d8: 5b 8b 00 20 sw (sp+32),r11 80041dc: 5b 8c 00 1c sw (sp+28),r12 80041e0: 5b 8d 00 18 sw (sp+24),r13 80041e4: 5b 8e 00 14 sw (sp+20),r14 80041e8: 5b 8f 00 10 sw (sp+16),r15 80041ec: 5b 90 00 0c sw (sp+12),r16 80041f0: 5b 91 00 08 sw (sp+8),r17 80041f4: 5b 9d 00 04 sw (sp+4),ra 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); 80041f8: 78 0c 08 01 mvhi r12,0x801 80041fc: 39 8c 78 38 ori r12,r12,0x7838 * errno - otherwise */ int rtems_aio_enqueue (rtems_aio_request *req) { 8004200: b8 20 58 00 mv r11,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); 8004204: b9 80 08 00 mv r1,r12 8004208: f8 00 02 b1 calli 8004ccc 800420c: b8 20 70 00 mv r14,r1 if (result != 0) { 8004210: 44 20 00 04 be r1,r0,8004220 <== ALWAYS TAKEN free (req); 8004214: b9 60 08 00 mv r1,r11 <== NOT EXECUTED 8004218: fb ff f7 d2 calli 8002160 <== NOT EXECUTED return result; 800421c: e0 00 00 79 bi 8004400 <== 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); 8004220: f8 00 05 46 calli 8005738 8004224: 37 82 00 40 addi r2,sp,64 8004228: 37 83 00 24 addi r3,sp,36 800422c: f8 00 04 04 calli 800523c req->caller_thread = pthread_self (); 8004230: f8 00 05 42 calli 8005738 req->priority = param.sched_priority - req->aiocbp->aio_reqprio; 8004234: 29 62 00 14 lw r2,(r11+20) /* _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 (); 8004238: 59 61 00 10 sw (r11+16),r1 req->priority = param.sched_priority - req->aiocbp->aio_reqprio; 800423c: 2b 83 00 24 lw r3,(sp+36) 8004240: 28 41 00 10 lw r1,(r2+16) 8004244: c8 61 08 00 sub r1,r3,r1 8004248: 59 61 00 0c sw (r11+12),r1 req->policy = policy; 800424c: 2b 81 00 40 lw r1,(sp+64) 8004250: 59 61 00 08 sw (r11+8),r1 req->aiocbp->error_code = EINPROGRESS; 8004254: 34 01 00 77 mvi r1,119 8004258: 58 41 00 2c sw (r2+44),r1 req->aiocbp->return_value = 0; if ((aio_request_queue.idle_threads == 0) && 800425c: 29 81 00 68 lw r1,(r12+104) 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; 8004260: 58 40 00 30 sw (r2+48),r0 if ((aio_request_queue.idle_threads == 0) && 8004264: 5c 2e 00 34 bne r1,r14,8004334 <== NEVER TAKEN 8004268: 29 83 00 64 lw r3,(r12+100) 800426c: 34 01 00 04 mvi r1,4 8004270: 48 61 00 31 bg r3,r1,8004334 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); 8004274: 28 42 00 00 lw r2,(r2+0) 8004278: 78 01 08 01 mvhi r1,0x801 800427c: 38 21 78 80 ori r1,r1,0x7880 8004280: 34 03 00 01 mvi r3,1 8004284: fb ff fe 99 calli 8003ce8 if (r_chain->new_fd == 1) { 8004288: 28 22 00 18 lw r2,(r1+24) 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); 800428c: b8 20 68 00 mv r13,r1 8004290: 34 31 00 08 addi r17,r1,8 8004294: 34 2f 00 1c addi r15,r1,28 8004298: 34 30 00 20 addi r16,r1,32 if (r_chain->new_fd == 1) { 800429c: 34 01 00 01 mvi r1,1 80042a0: 5c 41 00 1c bne r2,r1,8004310 RTEMS_INLINE_ROUTINE void _Chain_Prepend( Chain_Control *the_chain, Chain_Node *the_node ) { _Chain_Insert(_Chain_Head(the_chain), the_node); 80042a4: b9 60 10 00 mv r2,r11 80042a8: ba 20 08 00 mv r1,r17 80042ac: f8 00 08 7b calli 8006498 <_Chain_Insert> rtems_chain_prepend (&r_chain->perfd, &req->next_prio); r_chain->new_fd = 0; pthread_mutex_init (&r_chain->mutex, NULL); 80042b0: 34 02 00 00 mvi r2,0 chain = &aio_request_queue.work_req; r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1); if (r_chain->new_fd == 1) { rtems_chain_prepend (&r_chain->perfd, &req->next_prio); r_chain->new_fd = 0; 80042b4: 59 a0 00 18 sw (r13+24),r0 pthread_mutex_init (&r_chain->mutex, NULL); 80042b8: b9 e0 08 00 mv r1,r15 80042bc: f8 00 02 27 calli 8004b58 pthread_cond_init (&r_chain->cond, NULL); 80042c0: 34 02 00 00 mvi r2,0 80042c4: ba 00 08 00 mv r1,r16 80042c8: f8 00 01 02 calli 80046d0 AIO_printf ("New thread \n"); result = pthread_create (&thid, &aio_request_queue.attr, 80042cc: 78 02 08 01 mvhi r2,0x801 80042d0: 78 03 08 00 mvhi r3,0x800 80042d4: 37 81 00 44 addi r1,sp,68 80042d8: 38 42 78 40 ori r2,r2,0x7840 80042dc: 38 63 3e 0c ori r3,r3,0x3e0c 80042e0: b9 a0 20 00 mv r4,r13 80042e4: f8 00 03 11 calli 8004f28 80042e8: b8 20 58 00 mv r11,r1 rtems_aio_handle, (void *) r_chain); if (result != 0) { 80042ec: 44 20 00 05 be r1,r0,8004300 <== ALWAYS TAKEN pthread_mutex_unlock (&aio_request_queue.mutex); 80042f0: b9 80 08 00 mv r1,r12 <== NOT EXECUTED 80042f4: f8 00 02 a9 calli 8004d98 <== NOT EXECUTED return result; 80042f8: b9 60 70 00 mv r14,r11 <== NOT EXECUTED 80042fc: e0 00 00 41 bi 8004400 <== NOT EXECUTED } ++aio_request_queue.active_threads; 8004300: 29 81 00 64 lw r1,(r12+100) 8004304: 34 21 00 01 addi r1,r1,1 8004308: 59 81 00 64 sw (r12+100),r1 800430c: e0 00 00 3a bi 80043f4 } else { /* put request in the fd chain it belongs to */ pthread_mutex_lock (&r_chain->mutex); 8004310: b9 e0 08 00 mv r1,r15 8004314: f8 00 02 6e calli 8004ccc rtems_aio_insert_prio (&r_chain->perfd, req); 8004318: ba 20 08 00 mv r1,r17 800431c: b9 60 10 00 mv r2,r11 8004320: fb ff ff 5d calli 8004094 pthread_cond_signal (&r_chain->cond); 8004324: ba 00 08 00 mv r1,r16 8004328: f8 00 01 25 calli 80047bc pthread_mutex_unlock (&r_chain->mutex); 800432c: b9 e0 08 00 mv r1,r15 8004330: e0 00 00 11 bi 8004374 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, 8004334: 28 42 00 00 lw r2,(r2+0) 8004338: 78 01 08 01 mvhi r1,0x801 800433c: 38 21 78 80 ori r1,r1,0x7880 8004340: 34 03 00 00 mvi r3,0 8004344: fb ff fe 69 calli 8003ce8 8004348: b8 20 60 00 mv r12,r1 req->aiocbp->aio_fildes, 0); if (r_chain != NULL) 800434c: 44 20 00 0c be r1,r0,800437c { pthread_mutex_lock (&r_chain->mutex); 8004350: 34 2d 00 1c addi r13,r1,28 8004354: b9 a0 08 00 mv r1,r13 8004358: f8 00 02 5d calli 8004ccc rtems_aio_insert_prio (&r_chain->perfd, req); 800435c: 35 81 00 08 addi r1,r12,8 8004360: b9 60 10 00 mv r2,r11 8004364: fb ff ff 4c calli 8004094 pthread_cond_signal (&r_chain->cond); 8004368: 35 81 00 20 addi r1,r12,32 800436c: f8 00 01 14 calli 80047bc pthread_mutex_unlock (&r_chain->mutex); 8004370: b9 a0 08 00 mv r1,r13 8004374: f8 00 02 89 calli 8004d98 8004378: e0 00 00 1f bi 80043f4 } else { /* or to the idle chain */ chain = &aio_request_queue.idle_req; r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1); 800437c: 29 62 00 14 lw r2,(r11+20) 8004380: 78 01 08 01 mvhi r1,0x801 8004384: 34 03 00 01 mvi r3,1 8004388: 28 42 00 00 lw r2,(r2+0) 800438c: 38 21 78 8c ori r1,r1,0x788c 8004390: fb ff fe 56 calli 8003ce8 if (r_chain->new_fd == 1) { 8004394: 28 23 00 18 lw r3,(r1+24) 8004398: 34 02 00 01 mvi r2,1 } else { /* or to the idle chain */ chain = &aio_request_queue.idle_req; r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1); 800439c: b8 20 60 00 mv r12,r1 80043a0: 34 21 00 08 addi r1,r1,8 if (r_chain->new_fd == 1) { 80043a4: 5c 62 00 0b bne r3,r2,80043d0 80043a8: b9 60 10 00 mv r2,r11 80043ac: f8 00 08 3b calli 8006498 <_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; pthread_mutex_init (&r_chain->mutex, NULL); 80043b0: 35 81 00 1c addi r1,r12,28 if (r_chain->new_fd == 1) { /* If this is a new fd chain we signal the idle threads that might be waiting for requests */ AIO_printf (" New chain on waiting queue \n "); rtems_chain_prepend (&r_chain->perfd, &req->next_prio); r_chain->new_fd = 0; 80043b4: 59 80 00 18 sw (r12+24),r0 pthread_mutex_init (&r_chain->mutex, NULL); 80043b8: 34 02 00 00 mvi r2,0 80043bc: f8 00 01 e7 calli 8004b58 pthread_cond_init (&r_chain->cond, NULL); 80043c0: 35 81 00 20 addi r1,r12,32 80043c4: 34 02 00 00 mvi r2,0 80043c8: f8 00 00 c2 calli 80046d0 80043cc: e0 00 00 03 bi 80043d8 } else /* just insert the request in the existing fd chain */ rtems_aio_insert_prio (&r_chain->perfd, req); 80043d0: b9 60 10 00 mv r2,r11 80043d4: fb ff ff 30 calli 8004094 if (aio_request_queue.idle_threads > 0) 80043d8: 78 01 08 01 mvhi r1,0x801 80043dc: 38 21 78 38 ori r1,r1,0x7838 80043e0: 28 21 00 68 lw r1,(r1+104) 80043e4: 4c 01 00 04 bge r0,r1,80043f4 <== ALWAYS TAKEN pthread_cond_signal (&aio_request_queue.new_req); 80043e8: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED 80043ec: 38 21 78 3c ori r1,r1,0x783c <== NOT EXECUTED 80043f0: f8 00 00 f3 calli 80047bc <== NOT EXECUTED } } pthread_mutex_unlock (&aio_request_queue.mutex); 80043f4: 78 01 08 01 mvhi r1,0x801 80043f8: 38 21 78 38 ori r1,r1,0x7838 80043fc: f8 00 02 67 calli 8004d98 return 0; } 8004400: b9 c0 08 00 mv r1,r14 8004404: 2b 9d 00 04 lw ra,(sp+4) 8004408: 2b 8b 00 20 lw r11,(sp+32) 800440c: 2b 8c 00 1c lw r12,(sp+28) 8004410: 2b 8d 00 18 lw r13,(sp+24) 8004414: 2b 8e 00 14 lw r14,(sp+20) 8004418: 2b 8f 00 10 lw r15,(sp+16) 800441c: 2b 90 00 0c lw r16,(sp+12) 8004420: 2b 91 00 08 lw r17,(sp+8) 8004424: 37 9c 00 44 addi sp,sp,68 8004428: c3 a0 00 00 ret =============================================================================== 08003e0c : * NULL - if error */ static void * rtems_aio_handle (void *arg) { 8003e0c: 37 9c ff a4 addi sp,sp,-92 8003e10: 5b 8b 00 34 sw (sp+52),r11 8003e14: 5b 8c 00 30 sw (sp+48),r12 8003e18: 5b 8d 00 2c sw (sp+44),r13 8003e1c: 5b 8e 00 28 sw (sp+40),r14 8003e20: 5b 8f 00 24 sw (sp+36),r15 8003e24: 5b 90 00 20 sw (sp+32),r16 8003e28: 5b 91 00 1c sw (sp+28),r17 8003e2c: 5b 92 00 18 sw (sp+24),r18 8003e30: 5b 93 00 14 sw (sp+20),r19 8003e34: 5b 94 00 10 sw (sp+16),r20 8003e38: 5b 95 00 0c sw (sp+12),r21 8003e3c: 5b 96 00 08 sw (sp+8),r22 8003e40: 5b 9d 00 04 sw (sp+4),ra 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); 8003e44: 78 0b 08 01 mvhi r11,0x801 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)) { 8003e48: 78 11 08 01 mvhi r17,0x801 --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, 8003e4c: 78 10 08 01 mvhi r16,0x801 * NULL - if error */ static void * rtems_aio_handle (void *arg) { 8003e50: b8 20 60 00 mv r12,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); 8003e54: 39 6b 78 38 ori r11,r11,0x7838 if (rtems_chain_is_empty (chain)) { clock_gettime (CLOCK_REALTIME, &timeout); 8003e58: 37 8e 00 54 addi r14,sp,84 &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) { 8003e5c: 34 14 00 74 mvi r20,116 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)) { 8003e60: 3a 31 78 90 ori r17,r17,0x7890 --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, 8003e64: 3a 10 78 3c ori r16,r16,0x783c 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); 8003e68: 37 93 00 38 addi r19,sp,56 rtems_chain_extract (node); pthread_mutex_unlock (&r_chain->mutex); switch (req->aiocbp->aio_lio_opcode) { 8003e6c: 34 16 00 02 mvi r22,2 default: result = -1; } if (result == -1) { req->aiocbp->return_value = -1; 8003e70: 34 12 ff ff mvi r18,-1 rtems_chain_extract (node); pthread_mutex_unlock (&r_chain->mutex); switch (req->aiocbp->aio_lio_opcode) { 8003e74: 34 15 00 03 mvi r21,3 /* 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); 8003e78: 35 8f 00 1c addi r15,r12,28 8003e7c: b9 e0 08 00 mv r1,r15 8003e80: f8 00 03 93 calli 8004ccc if (result != 0) 8003e84: 5c 20 00 74 bne r1,r0,8004054 <== NEVER TAKEN } } AIO_printf ("Thread finished\n"); return NULL; } 8003e88: 29 8d 00 08 lw r13,(r12+8) RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); 8003e8c: 35 81 00 0c addi r1,r12,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)) { 8003e90: 45 a1 00 2e be r13,r1,8003f48 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); 8003e94: f8 00 06 29 calli 8005738 8003e98: 37 82 00 5c addi r2,sp,92 8003e9c: ba 60 18 00 mv r3,r19 8003ea0: f8 00 04 e7 calli 800523c param.sched_priority = req->priority; 8003ea4: 29 a1 00 0c lw r1,(r13+12) 8003ea8: 5b 81 00 38 sw (sp+56),r1 pthread_setschedparam (pthread_self(), req->policy, ¶m); 8003eac: f8 00 06 23 calli 8005738 8003eb0: 29 a2 00 08 lw r2,(r13+8) 8003eb4: ba 60 18 00 mv r3,r19 8003eb8: f8 00 06 25 calli 800574c */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); 8003ebc: b9 a0 08 00 mv r1,r13 8003ec0: f8 00 09 5d calli 8006434 <_Chain_Extract> rtems_chain_extract (node); pthread_mutex_unlock (&r_chain->mutex); 8003ec4: b9 e0 08 00 mv r1,r15 8003ec8: f8 00 03 b4 calli 8004d98 switch (req->aiocbp->aio_lio_opcode) { 8003ecc: 29 a4 00 14 lw r4,(r13+20) 8003ed0: 28 81 00 28 lw r1,(r4+40) 8003ed4: 44 36 00 0a be r1,r22,8003efc 8003ed8: 44 35 00 0f be r1,r21,8003f14 <== NEVER TAKEN 8003edc: 34 02 00 01 mvi r2,1 8003ee0: 5c 22 00 10 bne r1,r2,8003f20 <== NEVER TAKEN case LIO_READ: AIO_printf ("read\n"); result = pread (req->aiocbp->aio_fildes, 8003ee4: 28 82 00 08 lw r2,(r4+8) 8003ee8: 28 83 00 0c lw r3,(r4+12) 8003eec: 28 81 00 00 lw r1,(r4+0) 8003ef0: 28 84 00 04 lw r4,(r4+4) 8003ef4: f8 00 31 47 calli 8010410 (void *) req->aiocbp->aio_buf, req->aiocbp->aio_nbytes, req->aiocbp->aio_offset); break; 8003ef8: e0 00 00 09 bi 8003f1c case LIO_WRITE: AIO_printf ("write\n"); result = pwrite (req->aiocbp->aio_fildes, 8003efc: 28 82 00 08 lw r2,(r4+8) 8003f00: 28 83 00 0c lw r3,(r4+12) 8003f04: 28 81 00 00 lw r1,(r4+0) 8003f08: 28 84 00 04 lw r4,(r4+4) 8003f0c: f8 00 31 85 calli 8010520 (void *) req->aiocbp->aio_buf, req->aiocbp->aio_nbytes, req->aiocbp->aio_offset); break; 8003f10: e0 00 00 03 bi 8003f1c case LIO_SYNC: AIO_printf ("sync\n"); result = fsync (req->aiocbp->aio_fildes); 8003f14: 28 81 00 00 lw r1,(r4+0) <== NOT EXECUTED 8003f18: f8 00 1d 11 calli 800b35c <== NOT EXECUTED break; default: result = -1; } if (result == -1) { 8003f1c: 5c 32 00 07 bne r1,r18,8003f38 <== ALWAYS TAKEN req->aiocbp->return_value = -1; 8003f20: 29 ad 00 14 lw r13,(r13+20) <== NOT EXECUTED 8003f24: 59 b2 00 30 sw (r13+48),r18 <== NOT EXECUTED req->aiocbp->error_code = errno; 8003f28: f8 00 2d 8b calli 800f554 <__errno> <== NOT EXECUTED 8003f2c: 28 21 00 00 lw r1,(r1+0) <== NOT EXECUTED 8003f30: 59 a1 00 2c sw (r13+44),r1 <== NOT EXECUTED 8003f34: e3 ff ff d1 bi 8003e78 <== NOT EXECUTED } else { req->aiocbp->return_value = result; 8003f38: 29 a2 00 14 lw r2,(r13+20) 8003f3c: 58 41 00 30 sw (r2+48),r1 req->aiocbp->error_code = 0; 8003f40: 58 40 00 2c sw (r2+44),r0 8003f44: e3 ff ff cd bi 8003e78 struct timespec timeout; AIO_printf ("Chain is empty [WQ], wait for work\n"); pthread_mutex_unlock (&r_chain->mutex); 8003f48: b9 e0 08 00 mv r1,r15 8003f4c: f8 00 03 93 calli 8004d98 pthread_mutex_lock (&aio_request_queue.mutex); 8003f50: b9 60 08 00 mv r1,r11 8003f54: f8 00 03 5e calli 8004ccc if (rtems_chain_is_empty (chain)) 8003f58: 29 81 00 08 lw r1,(r12+8) 8003f5c: 5c 2d 00 3b bne r1,r13,8004048 <== NEVER TAKEN { clock_gettime (CLOCK_REALTIME, &timeout); 8003f60: b9 c0 10 00 mv r2,r14 8003f64: 34 01 00 01 mvi r1,1 8003f68: f8 00 01 84 calli 8004578 timeout.tv_sec += 3; 8003f6c: 2b 81 00 54 lw r1,(sp+84) timeout.tv_nsec = 0; result = pthread_cond_timedwait (&r_chain->cond, 8003f70: 35 8d 00 20 addi r13,r12,32 8003f74: b9 60 10 00 mv r2,r11 pthread_mutex_lock (&aio_request_queue.mutex); if (rtems_chain_is_empty (chain)) { clock_gettime (CLOCK_REALTIME, &timeout); timeout.tv_sec += 3; 8003f78: 34 21 00 03 addi r1,r1,3 8003f7c: 5b 81 00 54 sw (sp+84),r1 timeout.tv_nsec = 0; result = pthread_cond_timedwait (&r_chain->cond, 8003f80: b9 c0 18 00 mv r3,r14 8003f84: b9 a0 08 00 mv r1,r13 if (rtems_chain_is_empty (chain)) { clock_gettime (CLOCK_REALTIME, &timeout); timeout.tv_sec += 3; timeout.tv_nsec = 0; 8003f88: 5b 80 00 58 sw (sp+88),r0 result = pthread_cond_timedwait (&r_chain->cond, 8003f8c: f8 00 02 30 calli 800484c &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) { 8003f90: 5c 34 00 2e bne r1,r20,8004048 <== NEVER TAKEN 8003f94: b9 80 08 00 mv r1,r12 8003f98: f8 00 09 27 calli 8006434 <_Chain_Extract> rtems_chain_extract (&r_chain->next_fd); pthread_mutex_destroy (&r_chain->mutex); 8003f9c: b9 e0 08 00 mv r1,r15 8003fa0: f8 00 02 91 calli 80049e4 pthread_cond_destroy (&r_chain->cond); 8003fa4: b9 a0 08 00 mv r1,r13 8003fa8: f8 00 01 90 calli 80045e8 free (r_chain); 8003fac: b9 80 08 00 mv r1,r12 8003fb0: fb ff f8 6c calli 8002160 /* 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)) { 8003fb4: 29 61 00 54 lw r1,(r11+84) 8003fb8: 5c 31 00 19 bne r1,r17,800401c AIO_printf ("Chain is empty [IQ], wait for work\n"); ++aio_request_queue.idle_threads; 8003fbc: 29 61 00 68 lw r1,(r11+104) --aio_request_queue.active_threads; clock_gettime (CLOCK_REALTIME, &timeout); 8003fc0: b9 c0 10 00 mv r2,r14 /* 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; 8003fc4: 34 21 00 01 addi r1,r1,1 8003fc8: 59 61 00 68 sw (r11+104),r1 --aio_request_queue.active_threads; 8003fcc: 29 61 00 64 lw r1,(r11+100) 8003fd0: 34 21 ff ff addi r1,r1,-1 8003fd4: 59 61 00 64 sw (r11+100),r1 clock_gettime (CLOCK_REALTIME, &timeout); 8003fd8: 34 01 00 01 mvi r1,1 8003fdc: f8 00 01 67 calli 8004578 timeout.tv_sec += 3; 8003fe0: 2b 81 00 54 lw r1,(sp+84) timeout.tv_nsec = 0; result = pthread_cond_timedwait (&aio_request_queue.new_req, 8003fe4: b9 60 10 00 mv r2,r11 8003fe8: b9 c0 18 00 mv r3,r14 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; 8003fec: 34 21 00 03 addi r1,r1,3 8003ff0: 5b 81 00 54 sw (sp+84),r1 timeout.tv_nsec = 0; result = pthread_cond_timedwait (&aio_request_queue.new_req, 8003ff4: ba 00 08 00 mv r1,r16 ++aio_request_queue.idle_threads; --aio_request_queue.active_threads; clock_gettime (CLOCK_REALTIME, &timeout); timeout.tv_sec += 3; timeout.tv_nsec = 0; 8003ff8: 5b 80 00 58 sw (sp+88),r0 result = pthread_cond_timedwait (&aio_request_queue.new_req, 8003ffc: f8 00 02 14 calli 800484c &aio_request_queue.mutex, &timeout); /* If no new fd chain was added in the idle requests then this thread is finished */ if (result == ETIMEDOUT) { 8004000: 5c 34 00 07 bne r1,r20,800401c <== NEVER TAKEN AIO_printf ("Etimeout\n"); --aio_request_queue.idle_threads; 8004004: 29 61 00 68 lw r1,(r11+104) 8004008: 34 21 ff ff addi r1,r1,-1 800400c: 59 61 00 68 sw (r11+104),r1 pthread_mutex_unlock (&aio_request_queue.mutex); 8004010: b9 60 08 00 mv r1,r11 8004014: f8 00 03 61 calli 8004d98 return NULL; 8004018: e0 00 00 0f bi 8004054 } } /* 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; 800401c: 29 61 00 68 lw r1,(r11+104) } } AIO_printf ("Thread finished\n"); return NULL; } 8004020: 29 6c 00 54 lw r12,(r11+84) } } /* 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; 8004024: 34 21 ff ff addi r1,r1,-1 8004028: 59 61 00 68 sw (r11+104),r1 ++aio_request_queue.active_threads; 800402c: 29 61 00 64 lw r1,(r11+100) 8004030: 34 21 00 01 addi r1,r1,1 8004034: 59 61 00 64 sw (r11+100),r1 8004038: b9 80 08 00 mv r1,r12 800403c: f8 00 08 fe calli 8006434 <_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); 8004040: b9 80 08 00 mv r1,r12 8004044: fb ff ff 5f calli 8003dc0 } } /* 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); 8004048: b9 60 08 00 mv r1,r11 800404c: f8 00 03 53 calli 8004d98 8004050: e3 ff ff 8a bi 8003e78 } } AIO_printf ("Thread finished\n"); return NULL; } 8004054: 34 01 00 00 mvi r1,0 8004058: 2b 9d 00 04 lw ra,(sp+4) 800405c: 2b 8b 00 34 lw r11,(sp+52) 8004060: 2b 8c 00 30 lw r12,(sp+48) 8004064: 2b 8d 00 2c lw r13,(sp+44) 8004068: 2b 8e 00 28 lw r14,(sp+40) 800406c: 2b 8f 00 24 lw r15,(sp+36) 8004070: 2b 90 00 20 lw r16,(sp+32) 8004074: 2b 91 00 1c lw r17,(sp+28) 8004078: 2b 92 00 18 lw r18,(sp+24) 800407c: 2b 93 00 14 lw r19,(sp+20) 8004080: 2b 94 00 10 lw r20,(sp+16) 8004084: 2b 95 00 0c lw r21,(sp+12) 8004088: 2b 96 00 08 lw r22,(sp+8) 800408c: 37 9c 00 5c addi sp,sp,92 8004090: c3 a0 00 00 ret =============================================================================== 08003bf0 : * 0 - if initialization succeeded */ int rtems_aio_init (void) { 8003bf0: 37 9c ff f4 addi sp,sp,-12 8003bf4: 5b 8b 00 0c sw (sp+12),r11 8003bf8: 5b 8c 00 08 sw (sp+8),r12 8003bfc: 5b 9d 00 04 sw (sp+4),ra int result = 0; result = pthread_attr_init (&aio_request_queue.attr); 8003c00: 78 0c 08 01 mvhi r12,0x801 8003c04: 39 8c 78 40 ori r12,r12,0x7840 8003c08: b9 80 08 00 mv r1,r12 8003c0c: f8 00 04 b0 calli 8004ecc 8003c10: b8 20 58 00 mv r11,r1 if (result != 0) 8003c14: 5c 20 00 2f bne r1,r0,8003cd0 <== NEVER TAKEN return result; result = 8003c18: b9 80 08 00 mv r1,r12 8003c1c: 34 02 00 00 mvi r2,0 8003c20: f8 00 04 b8 calli 8004f00 pthread_attr_setdetachstate (&aio_request_queue.attr, PTHREAD_CREATE_DETACHED); if (result != 0) 8003c24: 44 2b 00 03 be r1,r11,8003c30 <== ALWAYS TAKEN pthread_attr_destroy (&aio_request_queue.attr); 8003c28: b9 80 08 00 mv r1,r12 <== NOT EXECUTED 8003c2c: f8 00 04 a0 calli 8004eac <== NOT EXECUTED result = pthread_mutex_init (&aio_request_queue.mutex, NULL); 8003c30: 78 01 08 01 mvhi r1,0x801 8003c34: 38 21 78 38 ori r1,r1,0x7838 8003c38: 34 02 00 00 mvi r2,0 8003c3c: f8 00 03 c7 calli 8004b58 if (result != 0) 8003c40: 44 20 00 04 be r1,r0,8003c50 <== ALWAYS TAKEN pthread_attr_destroy (&aio_request_queue.attr); 8003c44: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED 8003c48: 38 21 78 40 ori r1,r1,0x7840 <== NOT EXECUTED 8003c4c: f8 00 04 98 calli 8004eac <== NOT EXECUTED result = pthread_cond_init (&aio_request_queue.new_req, NULL); 8003c50: 78 01 08 01 mvhi r1,0x801 8003c54: 38 21 78 3c ori r1,r1,0x783c 8003c58: 34 02 00 00 mvi r2,0 8003c5c: f8 00 02 9d calli 80046d0 8003c60: b8 20 58 00 mv r11,r1 if (result != 0) { 8003c64: 44 20 00 07 be r1,r0,8003c80 <== ALWAYS TAKEN pthread_mutex_destroy (&aio_request_queue.mutex); 8003c68: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED 8003c6c: 38 21 78 38 ori r1,r1,0x7838 <== NOT EXECUTED 8003c70: f8 00 03 5d calli 80049e4 <== NOT EXECUTED pthread_attr_destroy (&aio_request_queue.attr); 8003c74: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED 8003c78: 38 21 78 40 ori r1,r1,0x7840 <== NOT EXECUTED 8003c7c: f8 00 04 8c calli 8004eac <== NOT EXECUTED ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; 8003c80: 78 02 08 01 mvhi r2,0x801 8003c84: 78 01 08 01 mvhi r1,0x801 8003c88: 38 42 78 38 ori r2,r2,0x7838 8003c8c: 38 21 78 84 ori r1,r1,0x7884 8003c90: 58 41 00 48 sw (r2+72),r1 head->previous = NULL; tail->previous = head; 8003c94: 78 01 08 01 mvhi r1,0x801 8003c98: 38 21 78 80 ori r1,r1,0x7880 8003c9c: 58 41 00 50 sw (r2+80),r1 ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; 8003ca0: 78 01 08 01 mvhi r1,0x801 8003ca4: 38 21 78 90 ori r1,r1,0x7890 8003ca8: 58 41 00 54 sw (r2+84),r1 head->previous = NULL; tail->previous = head; 8003cac: 78 01 08 01 mvhi r1,0x801 8003cb0: 38 21 78 8c ori r1,r1,0x788c 8003cb4: 58 41 00 5c sw (r2+92),r1 rtems_chain_initialize_empty (&aio_request_queue.work_req); rtems_chain_initialize_empty (&aio_request_queue.idle_req); aio_request_queue.active_threads = 0; aio_request_queue.idle_threads = 0; aio_request_queue.initialized = AIO_QUEUE_INITIALIZED; 8003cb8: 38 01 b0 0b mvu r1,0xb00b { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; head->previous = NULL; 8003cbc: 58 40 00 4c sw (r2+76),r0 8003cc0: 58 40 00 58 sw (r2+88),r0 } rtems_chain_initialize_empty (&aio_request_queue.work_req); rtems_chain_initialize_empty (&aio_request_queue.idle_req); aio_request_queue.active_threads = 0; 8003cc4: 58 40 00 64 sw (r2+100),r0 aio_request_queue.idle_threads = 0; 8003cc8: 58 40 00 68 sw (r2+104),r0 aio_request_queue.initialized = AIO_QUEUE_INITIALIZED; 8003ccc: 58 41 00 60 sw (r2+96),r1 return result; } 8003cd0: b9 60 08 00 mv r1,r11 8003cd4: 2b 9d 00 04 lw ra,(sp+4) 8003cd8: 2b 8b 00 0c lw r11,(sp+12) 8003cdc: 2b 8c 00 08 lw r12,(sp+8) 8003ce0: 37 9c 00 0c addi sp,sp,12 8003ce4: c3 a0 00 00 ret =============================================================================== 08004094 : * NONE */ void rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req) { 8004094: 37 9c ff fc addi sp,sp,-4 8004098: 5b 9d 00 04 sw (sp+4),ra } } AIO_printf ("Thread finished\n"); return NULL; } 800409c: 28 23 00 00 lw r3,(r1+0) 80040a0: 34 25 00 04 addi r5,r1,4 * NONE */ void rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req) { 80040a4: b8 40 20 00 mv r4,r2 rtems_chain_node *node; AIO_printf ("FD exists \n"); node = rtems_chain_first (chain); if (rtems_chain_is_empty (chain)) { 80040a8: 44 65 00 0d be r3,r5,80040dc <== 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; 80040ac: 28 61 00 14 lw r1,(r3+20) while (req->aiocbp->aio_reqprio > prio && 80040b0: 28 42 00 14 lw r2,(r2+20) 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; 80040b4: 28 21 00 10 lw r1,(r1+16) while (req->aiocbp->aio_reqprio > prio && 80040b8: 28 42 00 10 lw r2,(r2+16) 80040bc: e0 00 00 04 bi 80040cc } } AIO_printf ("Thread finished\n"); return NULL; } 80040c0: 28 63 00 00 lw r3,(r3+0) 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; 80040c4: 28 61 00 14 lw r1,(r3+20) <== NOT EXECUTED 80040c8: 28 21 00 10 lw r1,(r1+16) <== 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 && 80040cc: 4c 22 00 02 bge r1,r2,80040d4 <== ALWAYS TAKEN 80040d0: 5c 65 ff fc bne r3,r5,80040c0 RTEMS_INLINE_ROUTINE void rtems_chain_insert( rtems_chain_node *after_node, rtems_chain_node *the_node ) { _Chain_Insert( after_node, the_node ); 80040d4: 28 61 00 04 lw r1,(r3+4) 80040d8: b8 80 10 00 mv r2,r4 80040dc: f8 00 08 ef calli 8006498 <_Chain_Insert> } rtems_chain_insert (node->previous, &req->next_prio); } } 80040e0: 2b 9d 00 04 lw ra,(sp+4) 80040e4: 37 9c 00 04 addi sp,sp,4 80040e8: c3 a0 00 00 ret =============================================================================== 08003dc0 : * NONE */ void rtems_aio_move_to_work (rtems_aio_request_chain *r_chain) { 8003dc0: 37 9c ff fc addi sp,sp,-4 8003dc4: 5b 9d 00 04 sw (sp+4),ra } } AIO_printf ("Thread finished\n"); return NULL; } 8003dc8: 78 03 08 01 mvhi r3,0x801 8003dcc: 38 63 78 38 ori r3,r3,0x7838 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 && 8003dd0: 78 04 08 01 mvhi r4,0x801 * NONE */ void rtems_aio_move_to_work (rtems_aio_request_chain *r_chain) { 8003dd4: b8 20 10 00 mv r2,r1 } } AIO_printf ("Thread finished\n"); return NULL; } 8003dd8: 28 63 00 48 lw r3,(r3+72) 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 && 8003ddc: 28 21 00 14 lw r1,(r1+20) 8003de0: 38 84 78 84 ori r4,r4,0x7884 8003de4: e0 00 00 02 bi 8003dec } } AIO_printf ("Thread finished\n"); return NULL; } 8003de8: 28 63 00 00 lw r3,(r3+0) 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 && 8003dec: 28 65 00 14 lw r5,(r3+20) 8003df0: 4c a1 00 02 bge r5,r1,8003df8 8003df4: 5c 64 ff fd bne r3,r4,8003de8 <== ALWAYS TAKEN 8003df8: 28 61 00 04 lw r1,(r3+4) 8003dfc: f8 00 09 a7 calli 8006498 <_Chain_Insert> node = rtems_chain_next (node); temp = (rtems_aio_request_chain *) node; } rtems_chain_insert (rtems_chain_previous (node), &r_chain->next_fd); } 8003e00: 2b 9d 00 04 lw ra,(sp+4) 8003e04: 37 9c 00 04 addi sp,sp,4 8003e08: c3 a0 00 00 ret =============================================================================== 08004164 : * 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) { 8004164: 37 9c ff f8 addi sp,sp,-8 8004168: 5b 8b 00 08 sw (sp+8),r11 800416c: 5b 9d 00 04 sw (sp+4),ra } } AIO_printf ("Thread finished\n"); return NULL; } 8004170: 28 2b 00 00 lw r11,(r1+0) RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); 8004174: 34 23 00 04 addi r3,r1,4 */ int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp) { if (rtems_chain_is_empty (chain)) return AIO_ALLDONE; 8004178: 34 01 00 02 mvi r1,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)) 800417c: 5d 63 00 04 bne r11,r3,800418c 8004180: e0 00 00 11 bi 80041c4 } } AIO_printf ("Thread finished\n"); return NULL; } 8004184: 28 2b 00 00 lw r11,(r1+0) <== 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) { 8004188: 45 63 00 0e be r11,r3,80041c0 <== NOT EXECUTED 800418c: 29 64 00 14 lw r4,(r11+20) node = rtems_chain_next (node); current = (rtems_aio_request *) node; 8004190: b9 60 08 00 mv r1,r11 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) { 8004194: 5c 82 ff fc bne r4,r2,8004184 <== NEVER TAKEN 8004198: f8 00 08 a7 calli 8006434 <_Chain_Extract> if (rtems_chain_is_tail (chain, node)) return AIO_NOTCANCELED; else { rtems_chain_extract (node); current->aiocbp->error_code = ECANCELED; 800419c: 29 61 00 14 lw r1,(r11+20) 80041a0: 34 02 00 8c mvi r2,140 80041a4: 58 22 00 2c sw (r1+44),r2 current->aiocbp->return_value = -1; 80041a8: 34 02 ff ff mvi r2,-1 80041ac: 58 22 00 30 sw (r1+48),r2 free (current); 80041b0: b9 60 08 00 mv r1,r11 80041b4: fb ff f7 eb calli 8002160 } return AIO_CANCELED; 80041b8: 34 01 00 00 mvi r1,0 80041bc: e0 00 00 02 bi 80041c4 node = rtems_chain_next (node); current = (rtems_aio_request *) node; } if (rtems_chain_is_tail (chain, node)) return AIO_NOTCANCELED; 80041c0: 34 01 00 01 mvi r1,1 <== NOT EXECUTED current->aiocbp->return_value = -1; free (current); } return AIO_CANCELED; } 80041c4: 2b 9d 00 04 lw ra,(sp+4) 80041c8: 2b 8b 00 08 lw r11,(sp+8) 80041cc: 37 9c 00 08 addi sp,sp,8 80041d0: c3 a0 00 00 ret =============================================================================== 080036d0 : rtems_chain_control *chain, rtems_chain_node *node, rtems_id task, rtems_event_set events ) { 80036d0: 37 9c ff f4 addi sp,sp,-12 80036d4: 5b 8b 00 0c sw (sp+12),r11 80036d8: 5b 8c 00 08 sw (sp+8),r12 80036dc: 5b 9d 00 04 sw (sp+4),ra 80036e0: b8 60 60 00 mv r12,r3 80036e4: b8 80 58 00 mv r11,r4 RTEMS_INLINE_ROUTINE bool rtems_chain_append_with_empty_check( rtems_chain_control *chain, rtems_chain_node *node ) { return _Chain_Append_with_empty_check( chain, node ); 80036e8: f8 00 01 a5 calli 8003d7c <_Chain_Append_with_empty_check> rtems_status_code sc = RTEMS_SUCCESSFUL; 80036ec: 34 05 00 00 mvi r5,0 bool was_empty = rtems_chain_append_with_empty_check( chain, node ); if ( was_empty ) { 80036f0: 44 20 00 05 be r1,r0,8003704 <== NEVER TAKEN sc = rtems_event_send( task, events ); 80036f4: b9 80 08 00 mv r1,r12 80036f8: b9 60 10 00 mv r2,r11 80036fc: f8 00 18 91 calli 8009940 8003700: b8 20 28 00 mv r5,r1 } return sc; } 8003704: b8 a0 08 00 mv r1,r5 8003708: 2b 9d 00 04 lw ra,(sp+4) 800370c: 2b 8b 00 0c lw r11,(sp+12) 8003710: 2b 8c 00 08 lw r12,(sp+8) 8003714: 37 9c 00 0c addi sp,sp,12 8003718: c3 a0 00 00 ret =============================================================================== 0800376c : rtems_chain_control *chain, rtems_event_set events, rtems_interval timeout, rtems_chain_node **node_ptr ) { 800376c: 37 9c ff e4 addi sp,sp,-28 8003770: 5b 8b 00 18 sw (sp+24),r11 8003774: 5b 8c 00 14 sw (sp+20),r12 8003778: 5b 8d 00 10 sw (sp+16),r13 800377c: 5b 8e 00 0c sw (sp+12),r14 8003780: 5b 8f 00 08 sw (sp+8),r15 8003784: 5b 9d 00 04 sw (sp+4),ra 8003788: b8 20 78 00 mv r15,r1 800378c: b8 40 70 00 mv r14,r2 8003790: b8 60 68 00 mv r13,r3 8003794: b8 80 60 00 mv r12,r4 8003798: e0 00 00 08 bi 80037b8 while ( sc == RTEMS_SUCCESSFUL && (node = rtems_chain_get( chain )) == NULL ) { rtems_event_set out; sc = rtems_event_receive( 800379c: b9 c0 08 00 mv r1,r14 80037a0: 34 02 00 00 mvi r2,0 80037a4: b9 a0 18 00 mv r3,r13 80037a8: 37 84 00 1c addi r4,sp,28 80037ac: fb ff fd d2 calli 8002ef4 80037b0: b8 20 28 00 mv r5,r1 ) { rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_chain_node *node = NULL; while ( 80037b4: 5c 2b 00 06 bne r1,r11,80037cc <== ALWAYS TAKEN */ RTEMS_INLINE_ROUTINE rtems_chain_node *rtems_chain_get( rtems_chain_control *the_chain ) { return _Chain_Get( the_chain ); 80037b8: b9 e0 08 00 mv r1,r15 80037bc: f8 00 01 a6 calli 8003e54 <_Chain_Get> 80037c0: b8 20 58 00 mv r11,r1 sc == RTEMS_SUCCESSFUL && (node = rtems_chain_get( chain )) == NULL 80037c4: 44 20 ff f6 be r1,r0,800379c 80037c8: 34 05 00 00 mvi r5,0 } *node_ptr = node; return sc; } 80037cc: b8 a0 08 00 mv r1,r5 timeout, &out ); } *node_ptr = node; 80037d0: 59 8b 00 00 sw (r12+0),r11 return sc; } 80037d4: 2b 9d 00 04 lw ra,(sp+4) 80037d8: 2b 8b 00 18 lw r11,(sp+24) 80037dc: 2b 8c 00 14 lw r12,(sp+20) 80037e0: 2b 8d 00 10 lw r13,(sp+16) 80037e4: 2b 8e 00 0c lw r14,(sp+12) 80037e8: 2b 8f 00 08 lw r15,(sp+8) 80037ec: 37 9c 00 1c addi sp,sp,28 80037f0: c3 a0 00 00 ret =============================================================================== 080037f4 : rtems_chain_control *chain, rtems_chain_node *node, rtems_id task, rtems_event_set events ) { 80037f4: 37 9c ff f4 addi sp,sp,-12 80037f8: 5b 8b 00 0c sw (sp+12),r11 80037fc: 5b 8c 00 08 sw (sp+8),r12 8003800: 5b 9d 00 04 sw (sp+4),ra 8003804: b8 60 60 00 mv r12,r3 8003808: b8 80 58 00 mv r11,r4 RTEMS_INLINE_ROUTINE bool rtems_chain_prepend_with_empty_check( rtems_chain_control *chain, rtems_chain_node *node ) { return _Chain_Prepend_with_empty_check( chain, node ); 800380c: f8 00 01 ac calli 8003ebc <_Chain_Prepend_with_empty_check> rtems_status_code sc = RTEMS_SUCCESSFUL; 8003810: 34 05 00 00 mvi r5,0 bool was_empty = rtems_chain_prepend_with_empty_check( chain, node ); if (was_empty) { 8003814: 44 20 00 05 be r1,r0,8003828 <== NEVER TAKEN sc = rtems_event_send( task, events ); 8003818: b9 80 08 00 mv r1,r12 800381c: b9 60 10 00 mv r2,r11 8003820: f8 00 18 48 calli 8009940 8003824: b8 20 28 00 mv r5,r1 } return sc; } 8003828: b8 a0 08 00 mv r1,r5 800382c: 2b 9d 00 04 lw ra,(sp+4) 8003830: 2b 8b 00 0c lw r11,(sp+12) 8003834: 2b 8c 00 08 lw r12,(sp+8) 8003838: 37 9c 00 0c addi sp,sp,12 800383c: c3 a0 00 00 ret =============================================================================== 08010a04 : * error code - if unsuccessful */ rtems_status_code rtems_clock_set_nanoseconds_extension( rtems_nanoseconds_extension_routine routine ) { 8010a04: b8 20 18 00 mv r3,r1 if ( !routine ) return RTEMS_INVALID_ADDRESS; 8010a08: 34 01 00 09 mvi r1,9 */ rtems_status_code rtems_clock_set_nanoseconds_extension( rtems_nanoseconds_extension_routine routine ) { if ( !routine ) 8010a0c: 44 60 00 05 be r3,r0,8010a20 <== ALWAYS TAKEN return RTEMS_INVALID_ADDRESS; _Watchdog_Nanoseconds_since_tick_handler = routine; 8010a10: 78 02 08 03 mvhi r2,0x803 8010a14: 38 42 c1 40 ori r2,r2,0xc140 8010a18: 58 43 00 00 sw (r2+0),r3 <== NOT EXECUTED return RTEMS_SUCCESSFUL; 8010a1c: 34 01 00 00 mvi r1,0 <== NOT EXECUTED } 8010a20: c3 a0 00 00 ret =============================================================================== 08001a40 : void rtems_cpu_usage_report_with_plugin( void *context, rtems_printk_plugin_t print ) { 8001a40: 37 9c ff 7c addi sp,sp,-132 8001a44: 5b 8b 00 44 sw (sp+68),r11 8001a48: 5b 8c 00 40 sw (sp+64),r12 8001a4c: 5b 8d 00 3c sw (sp+60),r13 8001a50: 5b 8e 00 38 sw (sp+56),r14 8001a54: 5b 8f 00 34 sw (sp+52),r15 8001a58: 5b 90 00 30 sw (sp+48),r16 8001a5c: 5b 91 00 2c sw (sp+44),r17 8001a60: 5b 92 00 28 sw (sp+40),r18 8001a64: 5b 93 00 24 sw (sp+36),r19 8001a68: 5b 94 00 20 sw (sp+32),r20 8001a6c: 5b 95 00 1c sw (sp+28),r21 8001a70: 5b 96 00 18 sw (sp+24),r22 8001a74: 5b 97 00 14 sw (sp+20),r23 8001a78: 5b 98 00 10 sw (sp+16),r24 8001a7c: 5b 99 00 0c sw (sp+12),r25 8001a80: 5b 9b 00 08 sw (sp+8),fp 8001a84: 5b 9d 00 04 sw (sp+4),ra 8001a88: b8 20 70 00 mv r14,r1 8001a8c: b8 40 68 00 mv r13,r2 Timestamp_Control uptime, total, ran, last_context_switch; #else uint32_t total_units = 0; #endif if ( !print ) 8001a90: 44 40 00 65 be r2,r0,8001c24 <== NEVER TAKEN * When not using nanosecond CPU usage resolution, we have to count * the number of "ticks" we gave credit for to give the user a rough * guideline as to what each number means proportionally. */ #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ last_context_switch = _Thread_Time_of_last_context_switch; 8001a94: 78 03 08 02 mvhi r3,0x802 8001a98: 38 63 97 a4 ori r3,r3,0x97a4 8001a9c: 28 61 00 00 lw r1,(r3+0) _TOD_Get_uptime( &uptime ); 8001aa0: 37 8b 00 78 addi r11,sp,120 _Timestamp_Subtract( &CPU_usage_Uptime_at_last_reset, &uptime, &total ); 8001aa4: 37 90 00 70 addi r16,sp,112 * When not using nanosecond CPU usage resolution, we have to count * the number of "ticks" we gave credit for to give the user a rough * guideline as to what each number means proportionally. */ #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ last_context_switch = _Thread_Time_of_last_context_switch; 8001aa8: 5b 81 00 60 sw (sp+96),r1 8001aac: 28 61 00 04 lw r1,(r3+4) } } } #endif (*print)( 8001ab0: 78 0c 08 02 mvhi r12,0x802 if ( !the_thread ) continue; rtems_object_get_name( the_thread->Object.id, sizeof(name), name ); (*print)( 8001ab4: 78 12 08 01 mvhi r18,0x801 * When not using nanosecond CPU usage resolution, we have to count * the number of "ticks" we gave credit for to give the user a rough * guideline as to what each number means proportionally. */ #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ last_context_switch = _Thread_Time_of_last_context_switch; 8001ab8: 5b 81 00 64 sw (sp+100),r1 _TOD_Get_uptime( &uptime ); 8001abc: b9 60 08 00 mv r1,r11 8001ac0: f8 00 0f 6e calli 8005878 <_TOD_Get_uptime> _Timestamp_Subtract( &CPU_usage_Uptime_at_last_reset, &uptime, &total ); 8001ac4: 78 01 08 02 mvhi r1,0x802 8001ac8: 38 21 9c 30 ori r1,r1,0x9c30 8001acc: b9 60 10 00 mv r2,r11 8001ad0: ba 00 18 00 mv r3,r16 8001ad4: f8 00 1a 66 calli 800846c <_Timespec_Subtract> } } } #endif (*print)( 8001ad8: 78 02 08 01 mvhi r2,0x801 8001adc: b9 c0 08 00 mv r1,r14 8001ae0: 38 42 ea 78 ori r2,r2,0xea78 /* * 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 ) { 8001ae4: 78 0f 08 02 mvhi r15,0x802 /* * Print the information */ (*print)( context, 8001ae8: 78 11 08 01 mvhi r17,0x801 } } } #endif (*print)( 8001aec: d9 a0 00 00 call r13 8001af0: 39 8c 96 78 ori r12,r12,0x9678 the_thread = (Thread_Control *)information->local_table[ i ]; if ( !the_thread ) continue; rtems_object_get_name( the_thread->Object.id, sizeof(name), name ); 8001af4: 37 97 00 48 addi r23,sp,72 (*print)( 8001af8: 3a 52 eb ec ori r18,r18,0xebec /* * 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 ) { 8001afc: 39 ef 9b e4 ori r15,r15,0x9be4 Timestamp_Control used; _Timestamp_Subtract( &last_context_switch, &uptime, &used ); _Timestamp_Add_to( &ran, &used ); }; _Timestamp_Divide( &ran, &total, &ival, &fval ); 8001b00: 37 96 00 68 addi r22,sp,104 8001b04: 37 9b 00 80 addi fp,sp,128 /* * Print the information */ (*print)( context, 8001b08: 3a 31 ec 00 ori r17,r17,0xec00 * since the last context switch. */ ran = the_thread->cpu_time_used; if ( _Thread_Executing->Object.id == the_thread->Object.id ) { Timestamp_Control used; _Timestamp_Subtract( &last_context_switch, &uptime, &used ); 8001b0c: 37 99 00 60 addi r25,sp,96 8001b10: b9 60 c0 00 mv r24,r11 8001b14: 37 95 00 58 addi r21,sp,88 #if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG) if ( !_Objects_Information_table[ api_index ] ) continue; #endif information = _Objects_Information_table[ api_index ][ 1 ]; 8001b18: 29 81 00 00 lw r1,(r12+0) if ( information ) { 8001b1c: 34 14 00 04 mvi r20,4 8001b20: 34 13 00 01 mvi r19,1 #if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG) if ( !_Objects_Information_table[ api_index ] ) continue; #endif information = _Objects_Information_table[ api_index ][ 1 ]; 8001b24: 28 30 00 04 lw r16,(r1+4) if ( information ) { 8001b28: 5e 00 00 2f bne r16,r0,8001be4 <== ALWAYS TAKEN 8001b2c: e0 00 00 30 bi 8001bec <== NOT EXECUTED for ( i=1 ; i <= information->maximum ; i++ ) { the_thread = (Thread_Control *)information->local_table[ i ]; 8001b30: 2a 01 00 1c lw r1,(r16+28) 8001b34: b4 34 08 00 add r1,r1,r20 8001b38: 28 2b 00 00 lw r11,(r1+0) if ( !the_thread ) 8001b3c: 45 60 00 28 be r11,r0,8001bdc <== NEVER TAKEN continue; rtems_object_get_name( the_thread->Object.id, sizeof(name), name ); 8001b40: 29 61 00 08 lw r1,(r11+8) 8001b44: 34 02 00 0d mvi r2,13 8001b48: ba e0 18 00 mv r3,r23 8001b4c: f8 00 0a 03 calli 8004358 (*print)( 8001b50: 29 63 00 08 lw r3,(r11+8) 8001b54: ba 40 10 00 mv r2,r18 8001b58: b9 c0 08 00 mv r1,r14 8001b5c: ba e0 20 00 mv r4,r23 8001b60: d9 a0 00 00 call r13 #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; 8001b64: 29 61 00 84 lw r1,(r11+132) 8001b68: 5b 81 00 68 sw (sp+104),r1 8001b6c: 29 61 00 88 lw r1,(r11+136) 8001b70: 5b 81 00 6c sw (sp+108),r1 if ( _Thread_Executing->Object.id == the_thread->Object.id ) { 8001b74: 29 e1 00 0c lw r1,(r15+12) 8001b78: 28 22 00 08 lw r2,(r1+8) 8001b7c: 29 61 00 08 lw r1,(r11+8) 8001b80: 5c 41 00 08 bne r2,r1,8001ba0 Timestamp_Control used; _Timestamp_Subtract( &last_context_switch, &uptime, &used ); 8001b84: bb 20 08 00 mv r1,r25 8001b88: bb 00 10 00 mv r2,r24 8001b8c: ba a0 18 00 mv r3,r21 8001b90: f8 00 1a 37 calli 800846c <_Timespec_Subtract> _Timestamp_Add_to( &ran, &used ); 8001b94: ba c0 08 00 mv r1,r22 8001b98: ba a0 10 00 mv r2,r21 8001b9c: f8 00 19 c3 calli 80082a8 <_Timespec_Add_to> }; _Timestamp_Divide( &ran, &total, &ival, &fval ); 8001ba0: 37 83 00 84 addi r3,sp,132 8001ba4: bb 60 20 00 mv r4,fp 8001ba8: ba c0 08 00 mv r1,r22 8001bac: 37 82 00 70 addi r2,sp,112 8001bb0: f8 00 19 d7 calli 800830c <_Timespec_Divide> /* * Print the information */ (*print)( context, 8001bb4: 2b 81 00 6c lw r1,(sp+108) 8001bb8: 34 02 03 e8 mvi r2,1000 8001bbc: f8 00 6d f5 calli 801d390 <__udivsi3> 8001bc0: 2b 83 00 68 lw r3,(sp+104) 8001bc4: 2b 85 00 84 lw r5,(sp+132) 8001bc8: 2b 86 00 80 lw r6,(sp+128) 8001bcc: b8 20 20 00 mv r4,r1 8001bd0: ba 20 10 00 mv r2,r17 8001bd4: b9 c0 08 00 mv r1,r14 8001bd8: d9 a0 00 00 call r13 continue; #endif information = _Objects_Information_table[ api_index ][ 1 ]; if ( information ) { for ( i=1 ; i <= information->maximum ; i++ ) { 8001bdc: 36 73 00 01 addi r19,r19,1 8001be0: 36 94 00 04 addi r20,r20,4 8001be4: 2e 01 00 10 lhu r1,(r16+16) 8001be8: 50 33 ff d2 bgeu r1,r19,8001b30 " ID | NAME | TICKS | PERCENT\n" #endif "------------+----------------------------------------+---------------+---------\n" ); for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) { 8001bec: 78 01 08 02 mvhi r1,0x802 continue; #endif information = _Objects_Information_table[ api_index ][ 1 ]; if ( information ) { for ( i=1 ; i <= information->maximum ; i++ ) { 8001bf0: 35 8c 00 04 addi r12,r12,4 " ID | NAME | TICKS | PERCENT\n" #endif "------------+----------------------------------------+---------------+---------\n" ); for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) { 8001bf4: 38 21 96 84 ori r1,r1,0x9684 8001bf8: 5d 81 ff c8 bne r12,r1,8001b18 } } } #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ (*print)( 8001bfc: 2b 81 00 74 lw r1,(sp+116) 8001c00: 34 02 03 e8 mvi r2,1000 8001c04: 78 0b 08 01 mvhi r11,0x801 8001c08: f8 00 6d e2 calli 801d390 <__udivsi3> 8001c0c: 2b 83 00 70 lw r3,(sp+112) 8001c10: 39 6b ec 18 ori r11,r11,0xec18 8001c14: b8 20 20 00 mv r4,r1 8001c18: b9 60 10 00 mv r2,r11 8001c1c: b9 c0 08 00 mv r1,r14 8001c20: d9 a0 00 00 call r13 "-------------------------------------------------------------------------------\n", _Watchdog_Ticks_since_boot - CPU_usage_Ticks_at_last_reset, total_units ); #endif } 8001c24: 2b 9d 00 04 lw ra,(sp+4) 8001c28: 2b 8b 00 44 lw r11,(sp+68) 8001c2c: 2b 8c 00 40 lw r12,(sp+64) 8001c30: 2b 8d 00 3c lw r13,(sp+60) 8001c34: 2b 8e 00 38 lw r14,(sp+56) 8001c38: 2b 8f 00 34 lw r15,(sp+52) 8001c3c: 2b 90 00 30 lw r16,(sp+48) 8001c40: 2b 91 00 2c lw r17,(sp+44) 8001c44: 2b 92 00 28 lw r18,(sp+40) 8001c48: 2b 93 00 24 lw r19,(sp+36) 8001c4c: 2b 94 00 20 lw r20,(sp+32) 8001c50: 2b 95 00 1c lw r21,(sp+28) 8001c54: 2b 96 00 18 lw r22,(sp+24) 8001c58: 2b 97 00 14 lw r23,(sp+20) 8001c5c: 2b 98 00 10 lw r24,(sp+16) 8001c60: 2b 99 00 0c lw r25,(sp+12) 8001c64: 2b 9b 00 08 lw fp,(sp+8) 8001c68: 37 9c 00 84 addi sp,sp,132 8001c6c: c3 a0 00 00 ret =============================================================================== 080112dc : [RTEMS_IO_ERROR] = EIO, [RTEMS_PROXY_BLOCKING] = EIO }; int rtems_deviceio_errno(rtems_status_code sc) { 80112dc: 37 9c ff f8 addi sp,sp,-8 80112e0: 5b 8b 00 08 sw (sp+8),r11 80112e4: 5b 9d 00 04 sw (sp+4),ra if (sc == RTEMS_SUCCESSFUL) { return 0; 80112e8: 34 02 00 00 mvi r2,0 [RTEMS_PROXY_BLOCKING] = EIO }; int rtems_deviceio_errno(rtems_status_code sc) { if (sc == RTEMS_SUCCESSFUL) { 80112ec: 44 20 00 0d be r1,r0,8011320 return 0; } else { int eno = EINVAL; if ((unsigned) sc <= RTEMS_STATUS_CODES_LAST) { 80112f0: 34 02 00 1c mvi r2,28 int rtems_deviceio_errno(rtems_status_code sc) { if (sc == RTEMS_SUCCESSFUL) { return 0; } else { int eno = EINVAL; 80112f4: 34 0b 00 16 mvi r11,22 if ((unsigned) sc <= RTEMS_STATUS_CODES_LAST) { 80112f8: 54 22 00 07 bgu r1,r2,8011314 <== NEVER TAKEN eno = status_code_to_errno [sc]; 80112fc: 78 0b 08 01 mvhi r11,0x801 8011300: 34 02 00 02 mvi r2,2 8011304: 39 6b 87 14 ori r11,r11,0x8714 8011308: f8 00 17 0d calli 8016f3c <__ashlsi3> 801130c: b5 61 08 00 add r1,r11,r1 8011310: 28 2b 00 00 lw r11,(r1+0) } errno = eno; 8011314: f8 00 00 62 calli 801149c <__errno> 8011318: 58 2b 00 00 sw (r1+0),r11 return -1; 801131c: 34 02 ff ff mvi r2,-1 } } 8011320: b8 40 08 00 mv r1,r2 8011324: 2b 9d 00 04 lw ra,(sp+4) 8011328: 2b 8b 00 08 lw r11,(sp+8) 801132c: 37 9c 00 08 addi sp,sp,8 8011330: c3 a0 00 00 ret =============================================================================== 0800ca30 : rtems_filesystem_fsmount_me_t rtems_filesystem_get_mount_handler( const char *type ) { 800ca30: 37 9c ff f4 addi sp,sp,-12 800ca34: 5b 9d 00 04 sw (sp+4),ra find_arg fa = { 800ca38: 5b 81 00 08 sw (sp+8),r1 800ca3c: 5b 80 00 0c sw (sp+12),r0 .type = type, .mount_h = NULL }; if ( type != NULL ) { 800ca40: 44 20 00 05 be r1,r0,800ca54 <== NEVER TAKEN rtems_filesystem_iterate( find_handler, &fa ); 800ca44: 78 01 08 00 mvhi r1,0x800 800ca48: 38 21 c8 cc ori r1,r1,0xc8cc 800ca4c: 37 82 00 08 addi r2,sp,8 800ca50: fb ff ff c7 calli 800c96c } return fa.mount_h; } 800ca54: 2b 81 00 0c lw r1,(sp+12) 800ca58: 2b 9d 00 04 lw ra,(sp+4) 800ca5c: 37 9c 00 0c addi sp,sp,12 800ca60: c3 a0 00 00 ret =============================================================================== 08002334 : * configuration is a single instantiation of the IMFS or miniIMFS with * a single "/dev" directory in it. */ void rtems_filesystem_initialize( void ) { 8002334: 37 9c ff dc addi sp,sp,-36 8002338: 5b 8b 00 10 sw (sp+16),r11 800233c: 5b 8c 00 0c sw (sp+12),r12 8002340: 5b 8d 00 08 sw (sp+8),r13 8002344: 5b 9d 00 04 sw (sp+4),ra /* * Set the default umask to "022". */ rtems_filesystem_umask = 022; 8002348: 78 0b 08 01 mvhi r11,0x801 800234c: 39 6b 91 08 ori r11,r11,0x9108 8002350: 29 62 00 00 lw r2,(r11+0) 8002354: 34 01 00 12 mvi r1,18 8002358: 58 41 00 2c sw (r2+44),r1 /* * mount the first filesystem. */ if ( rtems_filesystem_mount_table_size == 0 ) 800235c: 78 01 08 01 mvhi r1,0x801 8002360: 38 21 7e 60 ori r1,r1,0x7e60 8002364: 28 21 00 00 lw r1,(r1+0) rtems_fatal_error_occurred( 0xABCD0001 ); 8002368: 78 02 08 01 mvhi r2,0x801 800236c: 38 42 7f 74 ori r2,r2,0x7f74 rtems_filesystem_umask = 022; /* * mount the first filesystem. */ if ( rtems_filesystem_mount_table_size == 0 ) 8002370: 44 20 00 0e be r1,r0,80023a8 <== NEVER TAKEN rtems_fatal_error_occurred( 0xABCD0001 ); mt = &rtems_filesystem_mount_table[0]; 8002374: 78 01 08 01 mvhi r1,0x801 8002378: 38 21 90 18 ori r1,r1,0x9018 800237c: 28 24 00 00 lw r4,(r1+0) status = mount( mt->device, mt->mount_point, mt->type, mt->fsoptions, NULL ); 8002380: 34 05 00 00 mvi r5,0 8002384: 28 82 00 0c lw r2,(r4+12) 8002388: 28 81 00 08 lw r1,(r4+8) 800238c: 28 83 00 00 lw r3,(r4+0) 8002390: 28 84 00 04 lw r4,(r4+4) 8002394: f8 00 02 78 calli 8002d74 if ( status == -1 ) 8002398: 34 02 ff ff mvi r2,-1 800239c: 5c 22 00 05 bne r1,r2,80023b0 <== ALWAYS TAKEN rtems_fatal_error_occurred( 0xABCD0002 ); 80023a0: 78 02 08 01 mvhi r2,0x801 <== NOT EXECUTED 80023a4: 38 42 7f 78 ori r2,r2,0x7f78 <== NOT EXECUTED 80023a8: 28 41 00 00 lw r1,(r2+0) <== NOT EXECUTED 80023ac: f8 00 08 51 calli 80044f0 <== NOT EXECUTED rtems_filesystem_link_counts = 0; 80023b0: 29 61 00 00 lw r1,(r11+0) * gonna hit performance. * * Till Straumann, 10/25/2002 */ /* Clone the root pathloc */ rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0); 80023b4: 78 0c 08 01 mvhi r12,0x801 80023b8: 39 8c 7f 68 ori r12,r12,0x7f68 80023bc: 37 8d 00 14 addi r13,sp,20 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; 80023c0: 0c 20 00 30 sh (r1+48),r0 * gonna hit performance. * * Till Straumann, 10/25/2002 */ /* Clone the root pathloc */ rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0); 80023c4: 34 02 00 01 mvi r2,1 80023c8: 34 03 00 00 mvi r3,0 80023cc: b9 a0 20 00 mv r4,r13 80023d0: 34 05 00 00 mvi r5,0 80023d4: b9 80 08 00 mv r1,r12 80023d8: f8 00 00 6b calli 8002584 rtems_filesystem_root = loc; 80023dc: 29 61 00 00 lw r1,(r11+0) 80023e0: 2b 82 00 14 lw r2,(sp+20) /* One more clone for the current node */ rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0); 80023e4: 34 03 00 00 mvi r3,0 80023e8: b9 a0 20 00 mv r4,r13 * * Till Straumann, 10/25/2002 */ /* Clone the root pathloc */ rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0); rtems_filesystem_root = loc; 80023ec: 58 22 00 18 sw (r1+24),r2 80023f0: 2b 82 00 18 lw r2,(sp+24) /* One more clone for the current node */ rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0); 80023f4: 34 05 00 00 mvi r5,0 * * Till Straumann, 10/25/2002 */ /* Clone the root pathloc */ rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0); rtems_filesystem_root = loc; 80023f8: 58 22 00 1c sw (r1+28),r2 80023fc: 2b 82 00 1c lw r2,(sp+28) 8002400: 58 22 00 20 sw (r1+32),r2 8002404: 2b 82 00 20 lw r2,(sp+32) 8002408: 58 22 00 24 sw (r1+36),r2 800240c: 2b 82 00 24 lw r2,(sp+36) 8002410: 58 22 00 28 sw (r1+40),r2 /* One more clone for the current node */ rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0); 8002414: 34 02 00 01 mvi r2,1 8002418: b9 80 08 00 mv r1,r12 800241c: f8 00 00 5a calli 8002584 rtems_filesystem_current = loc; 8002420: 29 61 00 00 lw r1,(r11+0) 8002424: 2b 82 00 14 lw r2,(sp+20) 8002428: 58 22 00 04 sw (r1+4),r2 800242c: 2b 82 00 18 lw r2,(sp+24) 8002430: 58 22 00 08 sw (r1+8),r2 8002434: 2b 82 00 1c lw r2,(sp+28) 8002438: 58 22 00 0c sw (r1+12),r2 800243c: 2b 82 00 20 lw r2,(sp+32) 8002440: 58 22 00 10 sw (r1+16),r2 8002444: 2b 82 00 24 lw r2,(sp+36) 8002448: 58 22 00 14 sw (r1+20),r2 * * 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); 800244c: 78 01 08 01 mvhi r1,0x801 8002450: 34 02 01 ff mvi r2,511 8002454: 38 21 7f 6c ori r1,r1,0x7f6c 8002458: f8 00 01 d4 calli 8002ba8 if ( status != 0 ) rtems_fatal_error_occurred( 0xABCD0003 ); 800245c: 78 02 08 01 mvhi r2,0x801 8002460: 38 42 7f 7c ori r2,r2,0x7f7c * 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); if ( status != 0 ) 8002464: 5c 20 ff d1 bne r1,r0,80023a8 <== NEVER TAKEN * it will be mounted onto is created. Moreover, if it is going to * use a device, then it is REALLY unfair to attempt this * before device drivers are initialized. So we return via a base * filesystem image and nothing auto-mounted at this point. */ } 8002468: 2b 9d 00 04 lw ra,(sp+4) 800246c: 2b 8b 00 10 lw r11,(sp+16) 8002470: 2b 8c 00 0c lw r12,(sp+12) 8002474: 2b 8d 00 08 lw r13,(sp+8) 8002478: 37 9c 00 24 addi sp,sp,36 800247c: c3 a0 00 00 ret =============================================================================== 0800c96c : bool rtems_filesystem_iterate( rtems_per_filesystem_routine routine, void *routine_arg ) { 800c96c: 37 9c ff e8 addi sp,sp,-24 800c970: 5b 8b 00 18 sw (sp+24),r11 800c974: 5b 8c 00 14 sw (sp+20),r12 800c978: 5b 8d 00 10 sw (sp+16),r13 800c97c: 5b 8e 00 0c sw (sp+12),r14 800c980: 5b 8f 00 08 sw (sp+8),r15 800c984: 5b 9d 00 04 sw (sp+4),ra const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0]; 800c988: 78 0b 08 01 mvhi r11,0x801 bool rtems_filesystem_iterate( rtems_per_filesystem_routine routine, void *routine_arg ) { 800c98c: b8 20 70 00 mv r14,r1 800c990: b8 40 78 00 mv r15,r2 const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0]; rtems_chain_node *node = NULL; bool stop = false; 800c994: 34 03 00 00 mvi r3,0 bool rtems_filesystem_iterate( rtems_per_filesystem_routine routine, void *routine_arg ) { const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0]; 800c998: 39 6b 7e 40 ori r11,r11,0x7e40 rtems_chain_node *node = NULL; bool stop = false; while ( table_entry->type && !stop ) { 800c99c: e0 00 00 06 bi 800c9b4 stop = (*routine)( table_entry, routine_arg ); 800c9a0: b9 60 08 00 mv r1,r11 800c9a4: b9 e0 10 00 mv r2,r15 800c9a8: d9 c0 00 00 call r14 800c9ac: b8 20 18 00 mv r3,r1 ++table_entry; 800c9b0: 35 6b 00 08 addi r11,r11,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 ) { 800c9b4: 29 61 00 00 lw r1,(r11+0) 800c9b8: 44 20 00 03 be r1,r0,800c9c4 800c9bc: 44 60 ff f9 be r3,r0,800c9a0 800c9c0: e0 00 00 13 bi 800ca0c 800c9c4: b8 60 58 00 mv r11,r3 stop = (*routine)( table_entry, routine_arg ); ++table_entry; } if ( !stop ) { 800c9c8: 5c 23 00 11 bne r1,r3,800ca0c rtems_libio_lock(); 800c9cc: fb ff ff d4 calli 800c91c } } rtems_libio_unlock(); rtems_set_errno_and_return_minus_one( ENOENT ); } 800c9d0: 78 03 08 01 mvhi r3,0x801 800c9d4: 38 63 91 48 ori r3,r3,0x9148 ++table_entry; } if ( !stop ) { rtems_libio_lock(); for ( 800c9d8: 78 0d 08 01 mvhi r13,0x801 } } rtems_libio_unlock(); rtems_set_errno_and_return_minus_one( ENOENT ); } 800c9dc: 28 6c 00 00 lw r12,(r3+0) ++table_entry; } if ( !stop ) { rtems_libio_lock(); for ( 800c9e0: 39 ad 91 4c ori r13,r13,0x914c 800c9e4: e0 00 00 06 bi 800c9fc !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 ); 800c9e8: 35 81 00 08 addi r1,r12,8 800c9ec: b9 e0 10 00 mv r2,r15 800c9f0: d9 c0 00 00 call r14 } } rtems_libio_unlock(); rtems_set_errno_and_return_minus_one( ENOENT ); } 800c9f4: 29 8c 00 00 lw r12,(r12+0) !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 ); 800c9f8: b8 20 58 00 mv r11,r1 ++table_entry; } if ( !stop ) { rtems_libio_lock(); for ( 800c9fc: 45 8d 00 02 be r12,r13,800ca04 node = rtems_chain_first( &filesystem_chain ); !rtems_chain_is_tail( &filesystem_chain, node ) && !stop; 800ca00: 45 60 ff fa be r11,r0,800c9e8 <== ALWAYS TAKEN ) { const filesystem_node *fsn = (filesystem_node *) node; stop = (*routine)( &fsn->entry, routine_arg ); } rtems_libio_unlock(); 800ca04: fb ff ff d1 calli 800c948 800ca08: b9 60 18 00 mv r3,r11 } return stop; } 800ca0c: b8 60 08 00 mv r1,r3 800ca10: 2b 9d 00 04 lw ra,(sp+4) 800ca14: 2b 8b 00 18 lw r11,(sp+24) 800ca18: 2b 8c 00 14 lw r12,(sp+20) 800ca1c: 2b 8d 00 10 lw r13,(sp+16) 800ca20: 2b 8e 00 0c lw r14,(sp+12) 800ca24: 2b 8f 00 08 lw r15,(sp+8) 800ca28: 37 9c 00 18 addi sp,sp,24 800ca2c: c3 a0 00 00 ret =============================================================================== 08002cec : bool rtems_filesystem_mount_iterate( rtems_per_filesystem_mount_routine routine, void *routine_arg ) { 8002cec: 37 9c ff e8 addi sp,sp,-24 8002cf0: 5b 8b 00 18 sw (sp+24),r11 8002cf4: 5b 8c 00 14 sw (sp+20),r12 8002cf8: 5b 8d 00 10 sw (sp+16),r13 8002cfc: 5b 8e 00 0c sw (sp+12),r14 8002d00: 5b 8f 00 08 sw (sp+8),r15 8002d04: 5b 9d 00 04 sw (sp+4),ra 8002d08: b8 20 78 00 mv r15,r1 8002d0c: b8 40 70 00 mv r14,r2 rtems_chain_node *node = NULL; bool stop = false; rtems_libio_lock(); 8002d10: fb ff ff e3 calli 8002c9c stop = (*routine)( mt_entry, routine_arg ); } rtems_libio_unlock(); return stop; } 8002d14: 78 03 08 01 mvhi r3,0x801 8002d18: 38 63 90 fc ori r3,r3,0x90fc { rtems_chain_node *node = NULL; bool stop = false; rtems_libio_lock(); for ( 8002d1c: 78 0d 08 01 mvhi r13,0x801 stop = (*routine)( mt_entry, routine_arg ); } rtems_libio_unlock(); return stop; } 8002d20: 28 6b 00 00 lw r11,(r3+0) rtems_per_filesystem_mount_routine routine, void *routine_arg ) { rtems_chain_node *node = NULL; bool stop = false; 8002d24: 34 0c 00 00 mvi r12,0 rtems_libio_lock(); for ( 8002d28: 39 ad 91 00 ori r13,r13,0x9100 8002d2c: e0 00 00 06 bi 8002d44 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 ); 8002d30: b9 60 08 00 mv r1,r11 8002d34: b9 c0 10 00 mv r2,r14 8002d38: d9 e0 00 00 call r15 } rtems_libio_unlock(); return stop; } 8002d3c: 29 6b 00 00 lw r11,(r11+0) 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 ); 8002d40: b8 20 60 00 mv r12,r1 { rtems_chain_node *node = NULL; bool stop = false; rtems_libio_lock(); for ( 8002d44: 45 6d 00 02 be r11,r13,8002d4c node = rtems_chain_first( &mount_chain ); !rtems_chain_is_tail( &mount_chain, node ) && !stop; 8002d48: 45 80 ff fa be r12,r0,8002d30 <== 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(); 8002d4c: fb ff ff df calli 8002cc8 return stop; } 8002d50: b9 80 08 00 mv r1,r12 8002d54: 2b 9d 00 04 lw ra,(sp+4) 8002d58: 2b 8b 00 18 lw r11,(sp+24) 8002d5c: 2b 8c 00 14 lw r12,(sp+20) 8002d60: 2b 8d 00 10 lw r13,(sp+16) 8002d64: 2b 8e 00 0c lw r14,(sp+12) 8002d68: 2b 8f 00 08 lw r15,(sp+8) 8002d6c: 37 9c 00 18 addi sp,sp,24 8002d70: c3 a0 00 00 ret =============================================================================== 08002640 : int rtems_filesystem_prefix_separators( const char *pathname, int pathnamelen ) { 8002640: 37 9c ff f0 addi sp,sp,-16 8002644: 5b 8b 00 10 sw (sp+16),r11 8002648: 5b 8c 00 0c sw (sp+12),r12 800264c: 5b 8d 00 08 sw (sp+8),r13 8002650: 5b 9d 00 04 sw (sp+4),ra /* * Eat any separators at start of the path. */ int stripped = 0; 8002654: 34 0b 00 00 mvi r11,0 int rtems_filesystem_prefix_separators( const char *pathname, int pathnamelen ) { 8002658: b8 20 68 00 mv r13,r1 800265c: b8 40 60 00 mv r12,r2 /* * Eat any separators at start of the path. */ int stripped = 0; while ( *pathname && pathnamelen && rtems_filesystem_is_separator( *pathname ) ) 8002660: e0 00 00 02 bi 8002668 { pathname++; pathnamelen--; stripped++; 8002664: 35 6b 00 01 addi r11,r11,1 } return len; } int rtems_filesystem_prefix_separators( 8002668: b5 ab 08 00 add r1,r13,r11 { /* * Eat any separators at start of the path. */ int stripped = 0; while ( *pathname && pathnamelen && rtems_filesystem_is_separator( *pathname ) ) 800266c: 40 21 00 00 lbu r1,(r1+0) 8002670: fd 8b 18 00 cmpne r3,r12,r11 8002674: 7c 22 00 00 cmpnei r2,r1,0 8002678: a0 62 10 00 and r2,r3,r2 800267c: 44 40 00 03 be r2,r0,8002688 <== NEVER TAKEN 8002680: f8 00 04 7e calli 8003878 8002684: 5c 20 ff f8 bne r1,r0,8002664 pathname++; pathnamelen--; stripped++; } return stripped; } 8002688: b9 60 08 00 mv r1,r11 800268c: 2b 9d 00 04 lw ra,(sp+4) 8002690: 2b 8b 00 10 lw r11,(sp+16) 8002694: 2b 8c 00 0c lw r12,(sp+12) 8002698: 2b 8d 00 08 lw r13,(sp+8) 800269c: 37 9c 00 10 addi sp,sp,16 80026a0: c3 a0 00 00 ret =============================================================================== 08001f10 : int rtems_gxx_key_create (__gthread_key_t *key, void (*dtor) (void *)) { 8001f10: 37 9c ff f0 addi sp,sp,-16 8001f14: 5b 8b 00 10 sw (sp+16),r11 8001f18: 5b 8c 00 0c sw (sp+12),r12 8001f1c: 5b 8d 00 08 sw (sp+8),r13 8001f20: 5b 9d 00 04 sw (sp+4),ra 8001f24: b8 20 68 00 mv r13,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 ) ); 8001f28: 34 01 00 08 mvi r1,8 } return 0; } int rtems_gxx_key_create (__gthread_key_t *key, void (*dtor) (void *)) { 8001f2c: b8 40 60 00 mv r12,r2 * 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 ) ); 8001f30: f8 00 01 4a calli 8002458 *key = new_key; 8001f34: 59 a1 00 00 sw (r13+0),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 ) ); 8001f38: b8 20 58 00 mv r11,r1 *key = new_key; new_key->val = NULL; 8001f3c: 58 20 00 00 sw (r1+0),r0 new_key->dtor = dtor; 8001f40: 58 2c 00 04 sw (r1+4),r12 "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 ); 8001f44: b9 60 10 00 mv r2,r11 8001f48: 34 01 00 00 mvi r1,0 8001f4c: b9 80 18 00 mv r3,r12 8001f50: f8 00 07 5a calli 8003cb8 if ( status == RTEMS_SUCCESSFUL ) return 0; 8001f54: 34 02 00 00 mvi r2,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 ) 8001f58: 44 20 00 04 be r1,r0,8001f68 <== ALWAYS TAKEN return 0; free( new_key ); 8001f5c: b9 60 08 00 mv r1,r11 <== NOT EXECUTED 8001f60: fb ff ff 72 calli 8001d28 <== NOT EXECUTED return -1; 8001f64: 34 02 ff ff mvi r2,-1 <== NOT EXECUTED } 8001f68: b8 40 08 00 mv r1,r2 8001f6c: 2b 9d 00 04 lw ra,(sp+4) 8001f70: 2b 8b 00 10 lw r11,(sp+16) 8001f74: 2b 8c 00 0c lw r12,(sp+12) 8001f78: 2b 8d 00 08 lw r13,(sp+8) 8001f7c: 37 9c 00 10 addi sp,sp,16 8001f80: c3 a0 00 00 ret =============================================================================== 08001f90 : int rtems_gxx_key_delete (__gthread_key_t key) { 8001f90: 37 9c ff f8 addi sp,sp,-8 8001f94: 5b 8b 00 08 sw (sp+8),r11 8001f98: 5b 9d 00 04 sw (sp+4),ra 8001f9c: b8 20 58 00 mv r11,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 ); 8001fa0: b9 60 10 00 mv r2,r11 8001fa4: 34 01 00 00 mvi r1,0 8001fa8: f8 00 07 73 calli 8003d74 if ( status == RTEMS_SUCCESSFUL ) { 8001fac: 5c 20 00 04 bne r1,r0,8001fbc <== NEVER TAKEN /* Hmm - hopefully all tasks using this key have gone away... */ if ( key ) free( *(void **)key ); 8001fb0: 45 61 00 03 be r11,r1,8001fbc <== NEVER TAKEN 8001fb4: 29 61 00 00 lw r1,(r11+0) 8001fb8: fb ff ff 5c calli 8001d28 return 0; } key = NULL; return 0; } 8001fbc: 34 01 00 00 mvi r1,0 8001fc0: 2b 9d 00 04 lw ra,(sp+4) 8001fc4: 2b 8b 00 08 lw r11,(sp+8) 8001fc8: 37 9c 00 08 addi sp,sp,8 8001fcc: c3 a0 00 00 ret =============================================================================== 08001e90 : /* 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)) { 8001e90: 37 9c ff e8 addi sp,sp,-24 8001e94: 5b 8b 00 14 sw (sp+20),r11 8001e98: 5b 8c 00 10 sw (sp+16),r12 8001e9c: 5b 8d 00 0c sw (sp+12),r13 8001ea0: 5b 8e 00 08 sw (sp+8),r14 8001ea4: 5b 9d 00 04 sw (sp+4),ra #ifdef DEBUG_GXX_WRAPPERS printk( "gxx_wrappers: once=%x, func=%x\n", *once, func ); #endif if ( *(volatile __gthread_once_t *)once == 0 ) { 8001ea8: 28 2d 00 00 lw r13,(r1+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)) { 8001eac: b8 20 58 00 mv r11,r1 8001eb0: b8 40 70 00 mv r14,r2 #ifdef DEBUG_GXX_WRAPPERS printk( "gxx_wrappers: once=%x, func=%x\n", *once, func ); #endif if ( *(volatile __gthread_once_t *)once == 0 ) { 8001eb4: 5d a0 00 0f bne r13,r0,8001ef0 rtems_mode saveMode; __gthread_once_t o; rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode); 8001eb8: 34 01 01 00 mvi r1,256 8001ebc: 34 02 01 00 mvi r2,256 8001ec0: 37 83 00 18 addi r3,sp,24 8001ec4: f8 00 06 f4 calli 8003a94 if ( (o = *(volatile __gthread_once_t *)once) == 0 ) { 8001ec8: 29 6c 00 00 lw r12,(r11+0) 8001ecc: 5d 8d 00 03 bne r12,r13,8001ed8 <== NEVER TAKEN *(volatile __gthread_once_t *)once = 1; 8001ed0: 34 01 00 01 mvi r1,1 8001ed4: 59 61 00 00 sw (r11+0),r1 } rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); 8001ed8: 2b 81 00 18 lw r1,(sp+24) 8001edc: 34 02 01 00 mvi r2,256 8001ee0: 37 83 00 18 addi r3,sp,24 8001ee4: f8 00 06 ec calli 8003a94 if ( o == 0 ) 8001ee8: 5d 80 00 02 bne r12,r0,8001ef0 <== NEVER TAKEN (*func)(); 8001eec: d9 c0 00 00 call r14 } return 0; } 8001ef0: 34 01 00 00 mvi r1,0 8001ef4: 2b 9d 00 04 lw ra,(sp+4) 8001ef8: 2b 8b 00 14 lw r11,(sp+20) 8001efc: 2b 8c 00 10 lw r12,(sp+16) 8001f00: 2b 8d 00 0c lw r13,(sp+12) 8001f04: 2b 8e 00 08 lw r14,(sp+8) 8001f08: 37 9c 00 18 addi sp,sp,24 8001f0c: c3 a0 00 00 ret =============================================================================== 08002040 : int rtems_gxx_setspecific(__gthread_key_t key, const void *ptr) { 8002040: 37 9c ff f4 addi sp,sp,-12 8002044: 5b 8b 00 0c sw (sp+12),r11 8002048: 5b 8c 00 08 sw (sp+8),r12 800204c: 5b 9d 00 04 sw (sp+4),ra 8002050: b8 20 58 00 mv r11,r1 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 ); 8002054: 29 63 00 04 lw r3,(r11+4) #endif return p; } int rtems_gxx_setspecific(__gthread_key_t key, const void *ptr) { 8002058: b8 40 60 00 mv r12,r2 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 ); 800205c: 34 01 00 00 mvi r1,0 8002060: b9 60 10 00 mv r2,r11 8002064: f8 00 07 15 calli 8003cb8 if ( status == RTEMS_SUCCESSFUL ) { /* now let's set the proper value */ key->val = (void *)ptr; return 0; } return -1; 8002068: 34 03 ff ff mvi r3,-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 ) { 800206c: 5c 20 00 03 bne r1,r0,8002078 <== NEVER TAKEN /* now let's set the proper value */ key->val = (void *)ptr; 8002070: 59 6c 00 00 sw (r11+0),r12 return 0; 8002074: 34 03 00 00 mvi r3,0 } return -1; } 8002078: b8 60 08 00 mv r1,r3 800207c: 2b 9d 00 04 lw ra,(sp+4) 8002080: 2b 8b 00 0c lw r11,(sp+12) 8002084: 2b 8c 00 08 lw r12,(sp+8) 8002088: 37 9c 00 0c addi sp,sp,12 800208c: c3 a0 00 00 ret =============================================================================== 08006cac : void *rtems_heap_allocate_aligned_with_boundary( size_t size, uintptr_t alignment, uintptr_t boundary ) { 8006cac: 37 9c ff f0 addi sp,sp,-16 8006cb0: 5b 8b 00 10 sw (sp+16),r11 8006cb4: 5b 8c 00 0c sw (sp+12),r12 8006cb8: 5b 8d 00 08 sw (sp+8),r13 8006cbc: 5b 9d 00 04 sw (sp+4),ra if ( 8006cc0: 78 05 08 02 mvhi r5,0x802 8006cc4: 38 a5 63 70 ori r5,r5,0x6370 void *rtems_heap_allocate_aligned_with_boundary( size_t size, uintptr_t alignment, uintptr_t boundary ) { 8006cc8: b8 40 60 00 mv r12,r2 if ( 8006ccc: 28 a2 00 00 lw r2,(r5+0) void *rtems_heap_allocate_aligned_with_boundary( size_t size, uintptr_t alignment, uintptr_t boundary ) { 8006cd0: b8 20 68 00 mv r13,r1 if ( 8006cd4: 34 01 00 03 mvi r1,3 void *rtems_heap_allocate_aligned_with_boundary( size_t size, uintptr_t alignment, uintptr_t boundary ) { 8006cd8: b8 60 58 00 mv r11,r3 if ( 8006cdc: 5c 41 00 04 bne r2,r1,8006cec <== NEVER TAKEN _System_state_Is_up( _System_state_Get() ) && !malloc_is_system_state_OK() 8006ce0: fb ff fb 11 calli 8005924 ) { return NULL; 8006ce4: 34 05 00 00 mvi r5,0 uintptr_t boundary ) { if ( _System_state_Is_up( _System_state_Get() ) && !malloc_is_system_state_OK() 8006ce8: 44 20 00 0a be r1,r0,8006d10 ) { return NULL; } malloc_deferred_frees_process(); 8006cec: fb ff fb 20 calli 800596c /* FIXME: Statistics, boundary checks */ return _Protected_heap_Allocate_aligned_with_boundary( 8006cf0: 78 05 08 02 mvhi r5,0x802 8006cf4: 38 a5 50 1c ori r5,r5,0x501c 8006cf8: 28 a1 00 00 lw r1,(r5+0) 8006cfc: b9 a0 10 00 mv r2,r13 8006d00: b9 80 18 00 mv r3,r12 8006d04: b9 60 20 00 mv r4,r11 8006d08: f8 00 0e 0d calli 800a53c <_Protected_heap_Allocate_aligned_with_boundary> 8006d0c: b8 20 28 00 mv r5,r1 RTEMS_Malloc_Heap, size, alignment, boundary ); } 8006d10: b8 a0 08 00 mv r1,r5 8006d14: 2b 9d 00 04 lw ra,(sp+4) 8006d18: 2b 8b 00 10 lw r11,(sp+16) 8006d1c: 2b 8c 00 0c lw r12,(sp+12) 8006d20: 2b 8d 00 08 lw r13,(sp+8) 8006d24: 37 9c 00 10 addi sp,sp,16 8006d28: c3 a0 00 00 ret =============================================================================== 08006028 : #include #include void rtems_iterate_over_all_threads(rtems_per_thread_routine routine) { 8006028: 37 9c ff e4 addi sp,sp,-28 800602c: 5b 8b 00 1c sw (sp+28),r11 8006030: 5b 8c 00 18 sw (sp+24),r12 8006034: 5b 8d 00 14 sw (sp+20),r13 8006038: 5b 8e 00 10 sw (sp+16),r14 800603c: 5b 8f 00 0c sw (sp+12),r15 8006040: 5b 90 00 08 sw (sp+8),r16 8006044: 5b 9d 00 04 sw (sp+4),ra 8006048: b8 20 78 00 mv r15,r1 uint32_t i; uint32_t api_index; Thread_Control *the_thread; Objects_Information *information; if ( !routine ) 800604c: 44 20 00 17 be r1,r0,80060a8 <== NEVER TAKEN #endif #include #include void rtems_iterate_over_all_threads(rtems_per_thread_routine routine) 8006050: 78 02 08 02 mvhi r2,0x802 uint32_t i; uint32_t api_index; Thread_Control *the_thread; Objects_Information *information; if ( !routine ) 8006054: 78 0b 08 02 mvhi r11,0x802 #endif #include #include void rtems_iterate_over_all_threads(rtems_per_thread_routine routine) 8006058: 38 42 96 74 ori r2,r2,0x9674 uint32_t i; uint32_t api_index; Thread_Control *the_thread; Objects_Information *information; if ( !routine ) 800605c: 39 6b 96 78 ori r11,r11,0x9678 #endif #include #include void rtems_iterate_over_all_threads(rtems_per_thread_routine routine) 8006060: 34 50 00 10 addi r16,r2,16 #if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG) if ( !_Objects_Information_table[ api_index ] ) continue; #endif information = _Objects_Information_table[ api_index ][ 1 ]; 8006064: 29 61 00 00 lw r1,(r11+0) if ( !information ) 8006068: 34 0e 00 04 mvi r14,4 800606c: 34 0d 00 01 mvi r13,1 #if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG) if ( !_Objects_Information_table[ api_index ] ) continue; #endif information = _Objects_Information_table[ api_index ][ 1 ]; 8006070: 28 2c 00 04 lw r12,(r1+4) if ( !information ) 8006074: 5d 80 00 09 bne r12,r0,8006098 8006078: e0 00 00 0a bi 80060a0 continue; for ( i=1 ; i <= information->maximum ; i++ ) { the_thread = (Thread_Control *)information->local_table[ i ]; 800607c: 29 81 00 1c lw r1,(r12+28) 8006080: b4 2e 08 00 add r1,r1,r14 8006084: 28 21 00 00 lw r1,(r1+0) if ( !the_thread ) 8006088: 44 20 00 02 be r1,r0,8006090 continue; (*routine)(the_thread); 800608c: d9 e0 00 00 call r15 information = _Objects_Information_table[ api_index ][ 1 ]; if ( !information ) continue; for ( i=1 ; i <= information->maximum ; i++ ) { 8006090: 35 ad 00 01 addi r13,r13,1 8006094: 35 ce 00 04 addi r14,r14,4 8006098: 2d 81 00 10 lhu r1,(r12+16) 800609c: 50 2d ff f8 bgeu r1,r13,800607c 80060a0: 35 6b 00 04 addi r11,r11,4 Objects_Information *information; if ( !routine ) return; for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) { 80060a4: 5d 70 ff f0 bne r11,r16,8006064 (*routine)(the_thread); } } } 80060a8: 2b 9d 00 04 lw ra,(sp+4) 80060ac: 2b 8b 00 1c lw r11,(sp+28) 80060b0: 2b 8c 00 18 lw r12,(sp+24) 80060b4: 2b 8d 00 14 lw r13,(sp+20) 80060b8: 2b 8e 00 10 lw r14,(sp+16) 80060bc: 2b 8f 00 0c lw r15,(sp+12) 80060c0: 2b 90 00 08 lw r16,(sp+8) 80060c4: 37 9c 00 1c addi sp,sp,28 80060c8: c3 a0 00 00 ret =============================================================================== 0800c784 : */ void rtems_libio_free( rtems_libio_t *iop ) { 800c784: 37 9c ff f8 addi sp,sp,-8 800c788: 5b 8b 00 08 sw (sp+8),r11 800c78c: 5b 9d 00 04 sw (sp+4),ra 800c790: b8 20 58 00 mv r11,r1 rtems_libio_lock(); 800c794: fb ff ff 90 calli 800c5d4 if (iop->sem) 800c798: 29 61 00 30 lw r1,(r11+48) 800c79c: 44 20 00 02 be r1,r0,800c7a4 <== NEVER TAKEN rtems_semaphore_delete(iop->sem); 800c7a0: fb ff dd f6 calli 8003f78 iop->flags &= ~LIBIO_FLAGS_OPEN; 800c7a4: 29 62 00 18 lw r2,(r11+24) 800c7a8: 34 01 fe ff mvi r1,-257 800c7ac: a0 41 08 00 and r1,r2,r1 800c7b0: 59 61 00 18 sw (r11+24),r1 iop->data1 = rtems_libio_iop_freelist; 800c7b4: 78 01 08 01 mvhi r1,0x801 800c7b8: 38 21 98 2c ori r1,r1,0x982c 800c7bc: 28 22 00 00 lw r2,(r1+0) rtems_libio_iop_freelist = iop; 800c7c0: 58 2b 00 00 sw (r1+0),r11 if (iop->sem) rtems_semaphore_delete(iop->sem); iop->flags &= ~LIBIO_FLAGS_OPEN; iop->data1 = rtems_libio_iop_freelist; 800c7c4: 59 62 00 38 sw (r11+56),r2 rtems_libio_iop_freelist = iop; rtems_libio_unlock(); 800c7c8: fb ff ff 8e calli 800c600 } 800c7cc: 2b 9d 00 04 lw ra,(sp+4) 800c7d0: 2b 8b 00 08 lw r11,(sp+8) 800c7d4: 37 9c 00 08 addi sp,sp,8 800c7d8: c3 a0 00 00 ret =============================================================================== 0800282c : * * Called by BSP startup code to initialize the libio subsystem. */ void rtems_libio_init( void ) { 800282c: 37 9c ff f4 addi sp,sp,-12 8002830: 5b 8b 00 0c sw (sp+12),r11 8002834: 5b 8c 00 08 sw (sp+8),r12 8002838: 5b 9d 00 04 sw (sp+4),ra rtems_status_code rc; uint32_t i; rtems_libio_t *iop; if (rtems_libio_number_iops > 0) 800283c: 78 01 08 01 mvhi r1,0x801 8002840: 38 21 90 10 ori r1,r1,0x9010 8002844: 28 2c 00 00 lw r12,(r1+0) 8002848: 45 80 00 19 be r12,r0,80028ac <== NEVER TAKEN { rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops, 800284c: b9 80 08 00 mv r1,r12 8002850: 34 02 00 40 mvi r2,64 8002854: fb ff ff 0b calli 8002480 8002858: b8 20 58 00 mv r11,r1 800285c: 78 01 08 01 mvhi r1,0x801 8002860: 38 21 98 28 ori r1,r1,0x9828 8002864: 58 2b 00 00 sw (r1+0),r11 sizeof(rtems_libio_t)); if (rtems_libio_iops == NULL) rtems_fatal_error_occurred(RTEMS_NO_MEMORY); 8002868: 34 01 00 1a mvi r1,26 if (rtems_libio_number_iops > 0) { rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops, sizeof(rtems_libio_t)); if (rtems_libio_iops == NULL) 800286c: 45 60 00 1b be r11,r0,80028d8 rtems_fatal_error_occurred(RTEMS_NO_MEMORY); iop = rtems_libio_iop_freelist = rtems_libio_iops; 8002870: 78 01 08 01 mvhi r1,0x801 8002874: 38 21 98 2c ori r1,r1,0x982c 8002878: 58 2b 00 00 sw (r1+0),r11 for (i = 0 ; (i + 1) < rtems_libio_number_iops ; i++, iop++) 800287c: 34 02 00 00 mvi r2,0 rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops, sizeof(rtems_libio_t)); if (rtems_libio_iops == NULL) rtems_fatal_error_occurred(RTEMS_NO_MEMORY); iop = rtems_libio_iop_freelist = rtems_libio_iops; 8002880: b9 60 08 00 mv r1,r11 for (i = 0 ; (i + 1) < rtems_libio_number_iops ; i++, iop++) 8002884: e0 00 00 02 bi 800288c iop->data1 = iop + 1; 8002888: 58 21 ff f8 sw (r1+-8),r1 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++) 800288c: 34 42 00 01 addi r2,r2,1 8002890: 34 21 00 40 addi r1,r1,64 8002894: 55 82 ff fd bgu r12,r2,8002888 iop->data1 = iop + 1; iop->data1 = NULL; 8002898: b9 80 08 00 mv r1,r12 800289c: 34 02 00 06 mvi r2,6 80028a0: f8 00 51 a7 calli 8016f3c <__ashlsi3> 80028a4: b5 61 08 00 add r1,r11,r1 80028a8: 58 20 ff f8 sw (r1+-8),r0 /* * Create the binary semaphore used to provide mutual exclusion * on the IOP Table. */ rc = rtems_semaphore_create( 80028ac: 78 02 08 01 mvhi r2,0x801 80028b0: 38 42 7f b8 ori r2,r2,0x7fb8 80028b4: 28 41 00 00 lw r1,(r2+0) 80028b8: 78 05 08 01 mvhi r5,0x801 80028bc: 34 03 00 54 mvi r3,84 80028c0: 34 02 00 01 mvi r2,1 80028c4: 34 04 00 00 mvi r4,0 80028c8: 38 a5 98 30 ori r5,r5,0x9830 80028cc: f8 00 05 2e calli 8003d84 80028d0: b8 20 18 00 mv r3,r1 1, RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY, RTEMS_NO_PRIORITY, &rtems_libio_semaphore ); if ( rc != RTEMS_SUCCESSFUL ) 80028d4: 44 20 00 02 be r1,r0,80028dc <== ALWAYS TAKEN rtems_fatal_error_occurred( rc ); 80028d8: f8 00 07 06 calli 80044f0 /* * Initialize the base file system infrastructure. */ if (rtems_fs_init_helper) 80028dc: 78 02 08 01 mvhi r2,0x801 80028e0: 38 42 90 0c ori r2,r2,0x900c 80028e4: 28 41 00 00 lw r1,(r2+0) 80028e8: 44 23 00 02 be r1,r3,80028f0 <== NEVER TAKEN (* rtems_fs_init_helper)(); 80028ec: d8 20 00 00 call r1 } 80028f0: 2b 9d 00 04 lw ra,(sp+4) 80028f4: 2b 8b 00 0c lw r11,(sp+12) 80028f8: 2b 8c 00 08 lw r12,(sp+8) 80028fc: 37 9c 00 0c addi sp,sp,12 8002900: c3 a0 00 00 ret =============================================================================== 08002a94 : rtems_status_code rtems_libio_set_private_env(void) { 8002a94: 37 9c ff c8 addi sp,sp,-56 8002a98: 5b 8b 00 10 sw (sp+16),r11 8002a9c: 5b 8c 00 0c sw (sp+12),r12 8002aa0: 5b 8d 00 08 sw (sp+8),r13 8002aa4: 5b 9d 00 04 sw (sp+4),ra 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); 8002aa8: 78 0b 08 01 mvhi r11,0x801 } rtems_status_code rtems_libio_set_private_env(void) { rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_id task_id = rtems_task_self(); 8002aac: f8 00 03 1b calli 8003718 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); 8002ab0: 39 6b 32 5c ori r11,r11,0x325c 8002ab4: 34 02 00 01 mvi r2,1 } rtems_status_code rtems_libio_set_private_env(void) { rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_id task_id = rtems_task_self(); 8002ab8: b8 20 68 00 mv r13,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); 8002abc: 34 03 00 00 mvi r3,0 8002ac0: b9 60 08 00 mv r1,r11 8002ac4: 37 84 00 28 addi r4,sp,40 8002ac8: 34 05 00 00 mvi r5,0 8002acc: fb ff fa d6 calli 8001624 8002ad0: b8 20 60 00 mv r12,r1 error_1: rtems_filesystem_freenode(&root_loc); error_0: return RTEMS_NO_MEMORY; 8002ad4: 34 02 00 1a mvi r2,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) 8002ad8: 5c 20 00 43 bne r1,r0,8002be4 <== NEVER TAKEN goto error_0; rv = rtems_filesystem_evaluate_path("/", 1, 0, ¤t_loc, 0); 8002adc: b9 60 08 00 mv r1,r11 8002ae0: 34 02 00 01 mvi r2,1 8002ae4: 34 03 00 00 mvi r3,0 8002ae8: 37 84 00 14 addi r4,sp,20 8002aec: 34 05 00 00 mvi r5,0 8002af0: fb ff fa cd calli 8001624 if (rv != 0) 8002af4: 5c 2c 00 39 bne r1,r12,8002bd8 <== 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 8002af8: 78 02 08 01 mvhi r2,0x801 8002afc: 38 42 41 08 ori r2,r2,0x4108 8002b00: 28 41 00 00 lw r1,(r2+0) /* * Bharath: I'm not sure if the check can be reduced to * if( rtems_current_user_env->task_id != task_id ) { */ if ( 8002b04: 78 02 08 01 mvhi r2,0x801 8002b08: 38 42 47 90 ori r2,r2,0x4790 8002b0c: 44 22 00 03 be r1,r2,8002b18 rtems_current_user_env == &rtems_global_user_env || rtems_current_user_env->task_id != task_id 8002b10: 28 21 00 00 lw r1,(r1+0) 8002b14: 44 2d 00 0e be r1,r13,8002b4c ) { new_env = malloc(sizeof(rtems_user_env_t)); 8002b18: 34 01 00 48 mvi r1,72 8002b1c: fb ff fc d5 calli 8001e70 8002b20: b8 20 60 00 mv r12,r1 if (new_env == NULL) 8002b24: 44 20 00 2b be r1,r0,8002bd0 #ifdef HAVE_USERENV_REFCNT new_env->refcnt = 1; #endif sc = rtems_task_variable_add( 8002b28: 78 0b 08 01 mvhi r11,0x801 8002b2c: 39 6b 41 08 ori r11,r11,0x4108 8002b30: 78 03 08 00 mvhi r3,0x800 8002b34: 34 01 00 00 mvi r1,0 8002b38: b9 60 10 00 mv r2,r11 8002b3c: 38 63 2a 50 ori r3,r3,0x2a50 8002b40: f8 00 03 1b calli 80037ac RTEMS_SELF, (void*)&rtems_current_user_env, (void(*)(void *))free_user_env ); if (sc != RTEMS_SUCCESSFUL) 8002b44: 5c 20 00 21 bne r1,r0,8002bc8 goto error_3; rtems_current_user_env = new_env; 8002b48: 59 6c 00 00 sw (r11+0),r12 } /* Inherit the global values */ *rtems_current_user_env = rtems_global_user_env; 8002b4c: 78 02 08 01 mvhi r2,0x801 8002b50: 38 42 41 08 ori r2,r2,0x4108 8002b54: 28 4b 00 00 lw r11,(r2+0) 8002b58: 78 02 08 01 mvhi r2,0x801 8002b5c: 38 42 47 90 ori r2,r2,0x4790 8002b60: b9 60 08 00 mv r1,r11 8002b64: 34 03 00 48 mvi r3,72 8002b68: f8 00 2a ab calli 800d614 * 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; 8002b6c: 2b 81 00 28 lw r1,(sp+40) } /* Inherit the global values */ *rtems_current_user_env = rtems_global_user_env; rtems_current_user_env->task_id = task_id; 8002b70: 59 6d 00 00 sw (r11+0),r13 * be freed when deleting the environment. */ rtems_filesystem_root = root_loc; rtems_filesystem_current = current_loc; return RTEMS_SUCCESSFUL; 8002b74: 34 02 00 00 mvi r2,0 * 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; 8002b78: 59 61 00 18 sw (r11+24),r1 8002b7c: 2b 81 00 2c lw r1,(sp+44) 8002b80: 59 61 00 1c sw (r11+28),r1 8002b84: 2b 81 00 30 lw r1,(sp+48) 8002b88: 59 61 00 20 sw (r11+32),r1 8002b8c: 2b 81 00 34 lw r1,(sp+52) 8002b90: 59 61 00 24 sw (r11+36),r1 8002b94: 2b 81 00 38 lw r1,(sp+56) 8002b98: 59 61 00 28 sw (r11+40),r1 rtems_filesystem_current = current_loc; 8002b9c: 2b 81 00 14 lw r1,(sp+20) 8002ba0: 59 61 00 04 sw (r11+4),r1 8002ba4: 2b 81 00 18 lw r1,(sp+24) 8002ba8: 59 61 00 08 sw (r11+8),r1 8002bac: 2b 81 00 1c lw r1,(sp+28) 8002bb0: 59 61 00 0c sw (r11+12),r1 8002bb4: 2b 81 00 20 lw r1,(sp+32) 8002bb8: 59 61 00 10 sw (r11+16),r1 8002bbc: 2b 81 00 24 lw r1,(sp+36) 8002bc0: 59 61 00 14 sw (r11+20),r1 return RTEMS_SUCCESSFUL; 8002bc4: e0 00 00 08 bi 8002be4 error_3: free(new_env); 8002bc8: b9 80 08 00 mv r1,r12 8002bcc: fb ff fa e6 calli 8001764 error_2: rtems_filesystem_freenode(¤t_loc); 8002bd0: 37 81 00 14 addi r1,sp,20 8002bd4: fb ff fa dc calli 8001744 error_1: rtems_filesystem_freenode(&root_loc); 8002bd8: 37 81 00 28 addi r1,sp,40 8002bdc: fb ff fa da calli 8001744 error_0: return RTEMS_NO_MEMORY; 8002be0: 34 02 00 1a mvi r2,26 } 8002be4: b8 40 08 00 mv r1,r2 8002be8: 2b 9d 00 04 lw ra,(sp+4) 8002bec: 2b 8b 00 10 lw r11,(sp+16) 8002bf0: 2b 8c 00 0c lw r12,(sp+12) 8002bf4: 2b 8d 00 08 lw r13,(sp+8) 8002bf8: 37 9c 00 38 addi sp,sp,56 8002bfc: c3 a0 00 00 ret =============================================================================== 08002c00 : * 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) { 8002c00: 37 9c ff e8 addi sp,sp,-24 8002c04: 5b 8b 00 14 sw (sp+20),r11 8002c08: 5b 8c 00 10 sw (sp+16),r12 8002c0c: 5b 8d 00 0c sw (sp+12),r13 8002c10: 5b 8e 00 08 sw (sp+8),r14 8002c14: 5b 9d 00 04 sw (sp+4),ra 8002c18: b8 20 70 00 mv r14,r1 rtems_id current_task_id; /* * get current task id */ current_task_id = rtems_task_self(); 8002c1c: f8 00 02 bf calli 8003718 8002c20: b8 20 68 00 mv r13,r1 * 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; 8002c24: 34 0c 00 00 mvi r12,0 /* * 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 ) 8002c28: 45 c1 00 11 be r14,r1,8002c6c <== NEVER TAKEN return RTEMS_SUCCESSFUL; /* * Try to get the requested user environment */ sc = rtems_task_variable_get( 8002c2c: 78 0b 08 01 mvhi r11,0x801 8002c30: 39 6b 41 08 ori r11,r11,0x4108 8002c34: b9 c0 08 00 mv r1,r14 8002c38: b9 60 10 00 mv r2,r11 8002c3c: 37 83 00 18 addi r3,sp,24 8002c40: f8 00 03 0a calli 8003868 8002c44: b8 20 60 00 mv r12,r1 (void*)&shared_user_env ); /* * If it was not successful, return the error code */ if (sc != RTEMS_SUCCESSFUL) 8002c48: 5c 20 00 09 bne r1,r0,8002c6c * 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) { 8002c4c: 29 61 00 00 lw r1,(r11+0) 8002c50: 28 22 00 00 lw r2,(r1+0) 8002c54: 5c 4d 00 02 bne r2,r13,8002c5c rtems_user_env_t *tmp = rtems_current_user_env; free_user_env( tmp ); 8002c58: fb ff ff 7e calli 8002a50 } /* the current_user_env is the same pointer that remote env */ rtems_current_user_env = shared_user_env; 8002c5c: 2b 82 00 18 lw r2,(sp+24) 8002c60: 78 01 08 01 mvhi r1,0x801 8002c64: 38 21 41 08 ori r1,r1,0x4108 8002c68: 58 22 00 00 sw (r1+0),r2 #ifdef HAVE_USERENV_REFCNT rtems_current_user_env->refcnt++; #endif return RTEMS_SUCCESSFUL; } 8002c6c: b9 80 08 00 mv r1,r12 8002c70: 2b 9d 00 04 lw ra,(sp+4) 8002c74: 2b 8b 00 14 lw r11,(sp+20) 8002c78: 2b 8c 00 10 lw r12,(sp+16) 8002c7c: 2b 8d 00 0c lw r13,(sp+12) 8002c80: 2b 8e 00 08 lw r14,(sp+8) 8002c84: 37 9c 00 18 addi sp,sp,24 8002c88: c3 a0 00 00 ret =============================================================================== 0800c67c : uint32_t flags ) { uint32_t fcntl_flags = 0; if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) { 800c67c: 20 24 00 06 andi r4,r1,0x6 800c680: 34 03 00 06 mvi r3,6 fcntl_flags |= O_RDWR; 800c684: 34 02 00 02 mvi r2,2 uint32_t flags ) { uint32_t fcntl_flags = 0; if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) { 800c688: 44 83 00 06 be r4,r3,800c6a0 fcntl_flags |= O_RDWR; } else if ( (flags & LIBIO_FLAGS_READ) == LIBIO_FLAGS_READ) { 800c68c: 20 23 00 02 andi r3,r1,0x2 fcntl_flags |= O_RDONLY; 800c690: 34 02 00 00 mvi r2,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) { 800c694: 5c 60 00 03 bne r3,r0,800c6a0 <== ALWAYS TAKEN fcntl_flags |= O_RDONLY; } else if ( (flags & LIBIO_FLAGS_WRITE) == LIBIO_FLAGS_WRITE) { 800c698: 20 22 00 04 andi r2,r1,0x4 <== NOT EXECUTED ) { uint32_t fcntl_flags = 0; if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) { fcntl_flags |= O_RDWR; 800c69c: 7c 42 00 00 cmpnei r2,r2,0 <== 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 ) { 800c6a0: 20 23 00 01 andi r3,r1,0x1 800c6a4: 44 60 00 02 be r3,r0,800c6ac fcntl_flags |= O_NONBLOCK; 800c6a8: 38 42 40 00 ori r2,r2,0x4000 } if ( (flags & LIBIO_FLAGS_APPEND) == LIBIO_FLAGS_APPEND ) { 800c6ac: 20 23 02 00 andi r3,r1,0x200 800c6b0: 44 60 00 02 be r3,r0,800c6b8 fcntl_flags |= O_APPEND; 800c6b4: 38 42 00 08 ori r2,r2,0x8 } if ( (flags & LIBIO_FLAGS_CREATE) == LIBIO_FLAGS_CREATE ) { 800c6b8: 20 21 04 00 andi r1,r1,0x400 800c6bc: 44 20 00 02 be r1,r0,800c6c4 fcntl_flags |= O_CREAT; 800c6c0: 38 42 02 00 ori r2,r2,0x200 } return fcntl_flags; } 800c6c4: b8 40 08 00 mv r1,r2 800c6c8: c3 a0 00 00 ret =============================================================================== 08005e08 : * size and thus we skip updating the statistics. */ static void rtems_malloc_statistics_at_free( void *pointer ) { 8005e08: 37 9c ff f8 addi sp,sp,-8 8005e0c: 5b 9d 00 04 sw (sp+4),ra uintptr_t size; if (_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &size) ) { 8005e10: 78 03 08 02 mvhi r3,0x802 8005e14: 38 63 50 1c ori r3,r3,0x501c * size and thus we skip updating the statistics. */ static void rtems_malloc_statistics_at_free( void *pointer ) { 8005e18: b8 20 10 00 mv r2,r1 uintptr_t size; if (_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &size) ) { 8005e1c: 28 61 00 00 lw r1,(r3+0) 8005e20: 37 83 00 08 addi r3,sp,8 8005e24: f8 00 12 0f calli 800a660 <_Protected_heap_Get_block_size> 8005e28: 44 20 00 0b be r1,r0,8005e54 <== NEVER TAKEN MSBUMP(lifetime_freed, size); 8005e2c: 78 01 08 02 mvhi r1,0x802 8005e30: 38 21 60 98 ori r1,r1,0x6098 8005e34: 2b 83 00 08 lw r3,(sp+8) 8005e38: 28 22 00 2c lw r2,(r1+44) 8005e3c: 28 24 00 28 lw r4,(r1+40) 8005e40: b4 62 10 00 add r2,r3,r2 8005e44: f4 62 18 00 cmpgu r3,r3,r2 8005e48: 58 22 00 2c sw (r1+44),r2 8005e4c: b4 64 18 00 add r3,r3,r4 8005e50: 58 23 00 28 sw (r1+40),r3 } } 8005e54: 2b 9d 00 04 lw ra,(sp+4) 8005e58: 37 9c 00 08 addi sp,sp,8 8005e5c: c3 a0 00 00 ret =============================================================================== 08005e60 : } static void rtems_malloc_statistics_at_malloc( void *pointer ) { 8005e60: 37 9c ff f8 addi sp,sp,-8 8005e64: 5b 9d 00 04 sw (sp+4),ra uintptr_t actual_size = 0; 8005e68: 5b 80 00 08 sw (sp+8),r0 } static void rtems_malloc_statistics_at_malloc( void *pointer ) { 8005e6c: b8 20 10 00 mv r2,r1 uintptr_t actual_size = 0; uint32_t current_depth; rtems_malloc_statistics_t *s = &rtems_malloc_statistics; if ( !pointer ) 8005e70: 44 20 00 15 be r1,r0,8005ec4 <== NEVER TAKEN return; _Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &actual_size); 8005e74: 78 03 08 02 mvhi r3,0x802 8005e78: 38 63 50 1c ori r3,r3,0x501c 8005e7c: 28 61 00 00 lw r1,(r3+0) 8005e80: 37 83 00 08 addi r3,sp,8 8005e84: f8 00 11 f7 calli 800a660 <_Protected_heap_Get_block_size> MSBUMP(lifetime_allocated, actual_size); 8005e88: 78 01 08 02 mvhi r1,0x802 8005e8c: 38 21 60 98 ori r1,r1,0x6098 8005e90: 2b 83 00 08 lw r3,(sp+8) 8005e94: 28 22 00 24 lw r2,(r1+36) 8005e98: 28 24 00 20 lw r4,(r1+32) 8005e9c: b4 62 10 00 add r2,r3,r2 8005ea0: f4 62 18 00 cmpgu r3,r3,r2 8005ea4: 58 22 00 24 sw (r1+36),r2 8005ea8: b4 64 18 00 add r3,r3,r4 8005eac: 58 23 00 20 sw (r1+32),r3 current_depth = (uint32_t) (s->lifetime_allocated - s->lifetime_freed); 8005eb0: 28 23 00 2c lw r3,(r1+44) 8005eb4: c8 43 10 00 sub r2,r2,r3 if (current_depth > s->max_depth) 8005eb8: 28 23 00 18 lw r3,(r1+24) 8005ebc: 50 62 00 02 bgeu r3,r2,8005ec4 s->max_depth = current_depth; 8005ec0: 58 22 00 18 sw (r1+24),r2 } 8005ec4: 2b 9d 00 04 lw ra,(sp+4) 8005ec8: 37 9c 00 08 addi sp,sp,8 8005ecc: c3 a0 00 00 ret =============================================================================== 0800cbd4 : int rtems_memalign( void **pointer, size_t alignment, size_t size ) { 800cbd4: 37 9c ff ec addi sp,sp,-20 800cbd8: 5b 8b 00 14 sw (sp+20),r11 800cbdc: 5b 8c 00 10 sw (sp+16),r12 800cbe0: 5b 8d 00 0c sw (sp+12),r13 800cbe4: 5b 8e 00 08 sw (sp+8),r14 800cbe8: 5b 9d 00 04 sw (sp+4),ra /* * Parameter error checks */ if ( !pointer ) return EINVAL; 800cbec: 34 0c 00 16 mvi r12,22 int rtems_memalign( void **pointer, size_t alignment, size_t size ) { 800cbf0: b8 20 58 00 mv r11,r1 800cbf4: b8 40 68 00 mv r13,r2 800cbf8: b8 60 70 00 mv r14,r3 void *return_this; /* * Parameter error checks */ if ( !pointer ) 800cbfc: 44 20 00 1d be r1,r0,800cc70 return EINVAL; *pointer = NULL; 800cc00: 58 20 00 00 sw (r1+0),r0 /* * Do not attempt to allocate memory if not in correct system state. */ if ( _System_state_Is_up(_System_state_Get()) && 800cc04: 78 01 08 01 mvhi r1,0x801 800cc08: 38 21 9a d8 ori r1,r1,0x9ad8 800cc0c: 28 22 00 00 lw r2,(r1+0) 800cc10: 34 01 00 03 mvi r1,3 800cc14: 5c 41 00 03 bne r2,r1,800cc20 <== NEVER TAKEN !malloc_is_system_state_OK() ) 800cc18: fb ff d7 3b calli 8002904 *pointer = NULL; /* * Do not attempt to allocate memory if not in correct system state. */ if ( _System_state_Is_up(_System_state_Get()) && 800cc1c: 44 20 00 15 be r1,r0,800cc70 <== NEVER TAKEN return EINVAL; /* * If some free's have been deferred, then do them now. */ malloc_deferred_frees_process(); 800cc20: fb ff d7 4b calli 800294c Heap_Control *heap, uintptr_t size, uintptr_t alignment ) { return 800cc24: 78 01 08 01 mvhi r1,0x801 800cc28: 38 21 90 1c ori r1,r1,0x901c 800cc2c: 28 21 00 00 lw r1,(r1+0) 800cc30: b9 a0 18 00 mv r3,r13 800cc34: b9 c0 10 00 mv r2,r14 800cc38: 34 04 00 00 mvi r4,0 800cc3c: fb ff e4 b7 calli 8005f18 <_Protected_heap_Allocate_aligned_with_boundary> 800cc40: b8 20 68 00 mv r13,r1 RTEMS_Malloc_Heap, size, alignment ); if ( !return_this ) return ENOMEM; 800cc44: 34 0c 00 0c mvi r12,12 return_this = _Protected_heap_Allocate_aligned( RTEMS_Malloc_Heap, size, alignment ); if ( !return_this ) 800cc48: 44 20 00 0a be r1,r0,800cc70 return ENOMEM; /* * If configured, update the more involved statistics */ if ( rtems_malloc_statistics_helpers ) 800cc4c: 78 02 08 01 mvhi r2,0x801 800cc50: 38 42 96 c0 ori r2,r2,0x96c0 800cc54: 28 41 00 00 lw r1,(r2+0) 800cc58: 44 20 00 04 be r1,r0,800cc68 (*rtems_malloc_statistics_helpers->at_malloc)(pointer); 800cc5c: 28 22 00 04 lw r2,(r1+4) 800cc60: b9 60 08 00 mv r1,r11 800cc64: d8 40 00 00 call r2 *pointer = return_this; 800cc68: 59 6d 00 00 sw (r11+0),r13 return 0; 800cc6c: 34 0c 00 00 mvi r12,0 } 800cc70: b9 80 08 00 mv r1,r12 800cc74: 2b 9d 00 04 lw ra,(sp+4) 800cc78: 2b 8b 00 14 lw r11,(sp+20) 800cc7c: 2b 8c 00 10 lw r12,(sp+16) 800cc80: 2b 8d 00 0c lw r13,(sp+12) 800cc84: 2b 8e 00 08 lw r14,(sp+8) 800cc88: 37 9c 00 14 addi sp,sp,20 800cc8c: c3 a0 00 00 ret =============================================================================== 0800ab6c : return (retval); } int rtems_mkdir(const char *path, mode_t mode) { 800ab6c: 37 9c ff 84 addi sp,sp,-124 800ab70: 5b 8b 00 34 sw (sp+52),r11 800ab74: 5b 8c 00 30 sw (sp+48),r12 800ab78: 5b 8d 00 2c sw (sp+44),r13 800ab7c: 5b 8e 00 28 sw (sp+40),r14 800ab80: 5b 8f 00 24 sw (sp+36),r15 800ab84: 5b 90 00 20 sw (sp+32),r16 800ab88: 5b 91 00 1c sw (sp+28),r17 800ab8c: 5b 92 00 18 sw (sp+24),r18 800ab90: 5b 93 00 14 sw (sp+20),r19 800ab94: 5b 94 00 10 sw (sp+16),r20 800ab98: 5b 95 00 0c sw (sp+12),r21 800ab9c: 5b 96 00 08 sw (sp+8),r22 800aba0: 5b 9d 00 04 sw (sp+4),ra 800aba4: b8 40 b0 00 mv r22,r2 int success = 0; char *dup_path = strdup(path); 800aba8: f8 00 12 b9 calli 800f68c 800abac: b8 20 60 00 mv r12,r1 if (dup_path != NULL) { success = build(dup_path, mode); free(dup_path); } return success != 0 ? 0 : -1; 800abb0: 34 01 ff ff mvi r1,-1 rtems_mkdir(const char *path, mode_t mode) { int success = 0; char *dup_path = strdup(path); if (dup_path != NULL) { 800abb4: 45 80 00 4d be r12,r0,800ace8 <== NEVER TAKEN char *p; p = path; oumask = 0; retval = 1; if (p[0] == '/') /* Skip leading '/'. */ 800abb8: 41 8b 00 00 lbu r11,(r12+0) 800abbc: 34 0e 00 00 mvi r14,0 800abc0: 34 01 00 01 mvi r1,1 ++p; 800abc4: 65 6b 00 2f cmpei r11,r11,47 retval = 0; break; } } if (!last) *p = '/'; 800abc8: 34 15 00 2f mvi r21,47 p = path; oumask = 0; retval = 1; if (p[0] == '/') /* Skip leading '/'. */ ++p; 800abcc: b5 8b 58 00 add r11,r12,r11 first = 0; } if (last) (void)umask(oumask); if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) { if (errno == EEXIST || errno == EISDIR) { 800abd0: 34 14 00 11 mvi r20,17 if (stat(path, &sb) < 0) { 800abd4: 37 93 00 38 addi r19,sp,56 retval = 0; break; } else if (!S_ISDIR(sb.st_mode)) { 800abd8: 34 12 40 00 mvi r18,16384 first = 0; } if (last) (void)umask(oumask); if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) { if (errno == EEXIST || errno == EISDIR) { 800abdc: 34 11 00 15 mvi r17,21 * * We change the user's umask and then restore it, * instead of doing chmod's. */ oumask = umask(0); numask = oumask & ~(S_IWUSR | S_IXUSR); 800abe0: 34 10 ff 3f mvi r16,-193 if (p[0] == '/') /* Skip leading '/'. */ ++p; for (first = 1, last = 0; !last ; ++p) { if (p[0] == '\0') last = 1; else if (p[0] != '/') 800abe4: 34 0f 00 2f mvi r15,47 oumask = 0; retval = 1; if (p[0] == '/') /* Skip leading '/'. */ ++p; for (first = 1, last = 0; !last ; ++p) { if (p[0] == '\0') 800abe8: 41 64 00 00 lbu r4,(r11+0) last = 1; 800abec: 34 03 00 01 mvi r3,1 oumask = 0; retval = 1; if (p[0] == '/') /* Skip leading '/'. */ ++p; for (first = 1, last = 0; !last ; ++p) { if (p[0] == '\0') 800abf0: 44 80 00 03 be r4,r0,800abfc last = 1; else if (p[0] != '/') 800abf4: 5c 8f 00 33 bne r4,r15,800acc0 800abf8: 34 03 00 00 mvi r3,0 continue; *p = '\0'; 800abfc: 31 60 00 00 sb (r11+0),r0 if (!last && p[1] == '\0') 800ac00: 34 0d 00 01 mvi r13,1 800ac04: 5c 60 00 03 bne r3,r0,800ac10 800ac08: 41 6d 00 01 lbu r13,(r11+1) 800ac0c: 65 ad 00 00 cmpei r13,r13,0 last = 1; if (first) { 800ac10: 44 20 00 06 be r1,r0,800ac28 * mkdir [-m mode] dir * * We change the user's umask and then restore it, * instead of doing chmod's. */ oumask = umask(0); 800ac14: 34 01 00 00 mvi r1,0 800ac18: f8 00 00 79 calli 800adfc 800ac1c: b8 20 70 00 mv r14,r1 numask = oumask & ~(S_IWUSR | S_IXUSR); (void)umask(numask); 800ac20: a0 30 08 00 and r1,r1,r16 800ac24: f8 00 00 76 calli 800adfc first = 0; } if (last) (void)umask(oumask); if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) { 800ac28: 34 03 01 ff mvi r3,511 oumask = umask(0); numask = oumask & ~(S_IWUSR | S_IXUSR); (void)umask(numask); first = 0; } if (last) 800ac2c: 45 a0 00 04 be r13,r0,800ac3c (void)umask(oumask); 800ac30: b9 c0 08 00 mv r1,r14 800ac34: f8 00 00 72 calli 800adfc if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) { 800ac38: ba c0 18 00 mv r3,r22 800ac3c: b9 80 08 00 mv r1,r12 800ac40: b8 60 10 00 mv r2,r3 800ac44: fb ff e1 16 calli 800309c 800ac48: 4c 20 00 1b bge r1,r0,800acb4 if (errno == EEXIST || errno == EISDIR) { 800ac4c: f8 00 0e 12 calli 800e494 <__errno> 800ac50: 28 21 00 00 lw r1,(r1+0) 800ac54: 44 34 00 04 be r1,r20,800ac64 800ac58: f8 00 0e 0f calli 800e494 <__errno> 800ac5c: 28 21 00 00 lw r1,(r1+0) 800ac60: 5c 31 00 1a bne r1,r17,800acc8 <== ALWAYS TAKEN if (stat(path, &sb) < 0) { 800ac64: b9 80 08 00 mv r1,r12 800ac68: ba 60 10 00 mv r2,r19 800ac6c: f8 00 00 32 calli 800ad34 800ac70: 48 01 00 16 bg r0,r1,800acc8 <== NEVER TAKEN retval = 0; break; } else if (!S_ISDIR(sb.st_mode)) { 800ac74: 2b 81 00 44 lw r1,(sp+68) 800ac78: 20 21 f0 00 andi r1,r1,0xf000 800ac7c: 44 32 00 0c be r1,r18,800acac if (last) 800ac80: 45 a0 00 06 be r13,r0,800ac98 errno = EEXIST; 800ac84: f8 00 0e 04 calli 800e494 <__errno> 800ac88: 34 02 00 11 mvi r2,17 800ac8c: 58 22 00 00 sw (r1+0),r2 else errno = ENOTDIR; retval = 0; 800ac90: 34 0b 00 00 mvi r11,0 800ac94: e0 00 00 11 bi 800acd8 break; } else if (!S_ISDIR(sb.st_mode)) { if (last) errno = EEXIST; else errno = ENOTDIR; 800ac98: f8 00 0d ff calli 800e494 <__errno> 800ac9c: 34 02 00 14 mvi r2,20 800aca0: 58 22 00 00 sw (r1+0),r2 retval = 0; 800aca4: 34 0b 00 00 mvi r11,0 800aca8: e0 00 00 0a bi 800acd0 break; } if (last) 800acac: 5d a0 00 1e bne r13,r0,800ad24 800acb0: e0 00 00 02 bi 800acb8 } else { retval = 0; break; } } if (!last) 800acb4: 5d a0 00 1e bne r13,r0,800ad2c *p = '/'; 800acb8: 31 75 00 00 sb (r11+0),r21 800acbc: 34 01 00 00 mvi r1,0 p = path; oumask = 0; retval = 1; if (p[0] == '/') /* Skip leading '/'. */ ++p; for (first = 1, last = 0; !last ; ++p) { 800acc0: 35 6b 00 01 addi r11,r11,1 800acc4: e3 ff ff c9 bi 800abe8 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; 800acc8: 34 0b 00 00 mvi r11,0 } } if (!last) *p = '/'; } if (!first && !last) 800accc: 5d a0 00 03 bne r13,r0,800acd8 <== ALWAYS TAKEN (void)umask(oumask); 800acd0: b9 c0 08 00 mv r1,r14 800acd4: f8 00 00 4a calli 800adfc int success = 0; char *dup_path = strdup(path); if (dup_path != NULL) { success = build(dup_path, mode); free(dup_path); 800acd8: b9 80 08 00 mv r1,r12 800acdc: fb ff de e4 calli 800286c } return success != 0 ? 0 : -1; 800ace0: 7d 61 00 00 cmpnei r1,r11,0 800ace4: 34 21 ff ff addi r1,r1,-1 } 800ace8: 2b 9d 00 04 lw ra,(sp+4) 800acec: 2b 8b 00 34 lw r11,(sp+52) 800acf0: 2b 8c 00 30 lw r12,(sp+48) 800acf4: 2b 8d 00 2c lw r13,(sp+44) 800acf8: 2b 8e 00 28 lw r14,(sp+40) 800acfc: 2b 8f 00 24 lw r15,(sp+36) 800ad00: 2b 90 00 20 lw r16,(sp+32) 800ad04: 2b 91 00 1c lw r17,(sp+28) 800ad08: 2b 92 00 18 lw r18,(sp+24) 800ad0c: 2b 93 00 14 lw r19,(sp+20) 800ad10: 2b 94 00 10 lw r20,(sp+16) 800ad14: 2b 95 00 0c lw r21,(sp+12) 800ad18: 2b 96 00 08 lw r22,(sp+8) 800ad1c: 37 9c 00 7c addi sp,sp,124 800ad20: c3 a0 00 00 ret errno = ENOTDIR; retval = 0; break; } if (last) retval = 2; 800ad24: 34 0b 00 02 mvi r11,2 800ad28: e3 ff ff ec bi 800acd8 } else { retval = 0; break; } } if (!last) 800ad2c: 34 0b 00 01 mvi r11,1 800ad30: e3 ff ff ea bi 800acd8 =============================================================================== 08011920 : uint32_t length, uint32_t buffer_size, rtems_attribute attribute_set, rtems_id *id ) { 8011920: 37 9c ff d8 addi sp,sp,-40 8011924: 5b 8b 00 28 sw (sp+40),r11 8011928: 5b 8c 00 24 sw (sp+36),r12 801192c: 5b 8d 00 20 sw (sp+32),r13 8011930: 5b 8e 00 1c sw (sp+28),r14 8011934: 5b 8f 00 18 sw (sp+24),r15 8011938: 5b 90 00 14 sw (sp+20),r16 801193c: 5b 91 00 10 sw (sp+16),r17 8011940: 5b 92 00 0c sw (sp+12),r18 8011944: 5b 93 00 08 sw (sp+8),r19 8011948: 5b 9d 00 04 sw (sp+4),ra register Partition_Control *the_partition; if ( !rtems_is_name_valid( name ) ) return RTEMS_INVALID_NAME; 801194c: 34 07 00 03 mvi r7,3 uint32_t length, uint32_t buffer_size, rtems_attribute attribute_set, rtems_id *id ) { 8011950: b8 20 88 00 mv r17,r1 8011954: b8 40 70 00 mv r14,r2 8011958: b8 60 78 00 mv r15,r3 801195c: b8 80 60 00 mv r12,r4 8011960: b8 a0 98 00 mv r19,r5 8011964: b8 c0 80 00 mv r16,r6 register Partition_Control *the_partition; if ( !rtems_is_name_valid( name ) ) 8011968: 44 20 00 36 be r1,r0,8011a40 return RTEMS_INVALID_NAME; if ( !starting_address ) return RTEMS_INVALID_ADDRESS; 801196c: 34 07 00 09 mvi r7,9 register Partition_Control *the_partition; if ( !rtems_is_name_valid( name ) ) return RTEMS_INVALID_NAME; if ( !starting_address ) 8011970: 44 40 00 34 be r2,r0,8011a40 return RTEMS_INVALID_ADDRESS; if ( !id ) 8011974: 44 c0 00 33 be r6,r0,8011a40 <== NEVER TAKEN return RTEMS_INVALID_ADDRESS; if ( length == 0 || buffer_size == 0 || length < buffer_size || 8011978: 64 82 00 00 cmpei r2,r4,0 801197c: 64 61 00 00 cmpei r1,r3,0 !_Partition_Is_buffer_size_aligned( buffer_size ) ) return RTEMS_INVALID_SIZE; 8011980: 34 07 00 08 mvi r7,8 return RTEMS_INVALID_ADDRESS; if ( !id ) return RTEMS_INVALID_ADDRESS; if ( length == 0 || buffer_size == 0 || length < buffer_size || 8011984: b8 41 08 00 or r1,r2,r1 8011988: 5c 20 00 2e bne r1,r0,8011a40 801198c: 54 83 00 2d bgu r4,r3,8011a40 */ RTEMS_INLINE_ROUTINE bool _Partition_Is_buffer_size_aligned ( uint32_t buffer_size ) { return ((buffer_size % CPU_PARTITION_ALIGNMENT) == 0); 8011990: 20 81 00 07 andi r1,r4,0x7 8011994: 5c 20 00 2b bne r1,r0,8011a40 ) { #if (CPU_ALIGNMENT == 0) return true; #else return (((uintptr_t)address % CPU_ALIGNMENT) == 0); 8011998: 21 d2 00 07 andi r18,r14,0x7 !_Partition_Is_buffer_size_aligned( buffer_size ) ) return RTEMS_INVALID_SIZE; if ( !_Addresses_Is_aligned( starting_address ) ) return RTEMS_INVALID_ADDRESS; 801199c: 34 07 00 09 mvi r7,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 ) ) 80119a0: 5e 41 00 28 bne r18,r1,8011a40 80119a4: 78 02 08 04 mvhi r2,0x804 80119a8: 38 42 0c e0 ori r2,r2,0xce0 80119ac: 28 41 00 00 lw r1,(r2+0) 80119b0: 34 21 00 01 addi r1,r1,1 80119b4: 58 41 00 00 sw (r2+0),r1 * 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 ); 80119b8: 78 0d 08 04 mvhi r13,0x804 80119bc: 39 ad 0b 38 ori r13,r13,0xb38 80119c0: b9 a0 08 00 mv r1,r13 80119c4: f8 00 16 16 calli 801721c <_Objects_Allocate> 80119c8: b8 20 58 00 mv r11,r1 _Thread_Disable_dispatch(); /* prevents deletion */ the_partition = _Partition_Allocate(); if ( !the_partition ) { 80119cc: 5c 32 00 04 bne r1,r18,80119dc _Thread_Enable_dispatch(); 80119d0: f8 00 1b 86 calli 80187e8 <_Thread_Enable_dispatch> return RTEMS_TOO_MANY; 80119d4: 34 07 00 05 mvi r7,5 80119d8: e0 00 00 1a bi 8011a40 } #endif the_partition->starting_address = starting_address; the_partition->length = length; the_partition->buffer_size = buffer_size; 80119dc: 58 2c 00 18 sw (r1+24),r12 the_partition->attribute_set = attribute_set; the_partition->number_of_used_blocks = 0; _Chain_Initialize( &the_partition->Memory, starting_address, length / buffer_size, buffer_size ); 80119e0: b9 80 10 00 mv r2,r12 _Thread_Enable_dispatch(); return RTEMS_TOO_MANY; } #endif the_partition->starting_address = starting_address; 80119e4: 58 2e 00 10 sw (r1+16),r14 the_partition->length = length; 80119e8: 58 2f 00 14 sw (r1+20),r15 the_partition->buffer_size = buffer_size; the_partition->attribute_set = attribute_set; 80119ec: 58 33 00 1c sw (r1+28),r19 the_partition->number_of_used_blocks = 0; 80119f0: 58 20 00 20 sw (r1+32),r0 _Chain_Initialize( &the_partition->Memory, starting_address, 80119f4: 34 32 00 24 addi r18,r1,36 length / buffer_size, buffer_size ); 80119f8: b9 e0 08 00 mv r1,r15 80119fc: f8 00 7f ce calli 8031934 <__udivsi3> 8011a00: b8 20 18 00 mv r3,r1 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, 8011a04: b9 80 20 00 mv r4,r12 8011a08: ba 40 08 00 mv r1,r18 8011a0c: b9 c0 10 00 mv r2,r14 8011a10: f8 00 0f 00 calli 8015610 <_Chain_Initialize> Objects_Name name ) { _Objects_Set_local_object( information, _Objects_Get_index( the_object->id ), 8011a14: 29 6c 00 08 lw r12,(r11+8) #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 8011a18: 29 ad 00 1c lw r13,(r13+28) 8011a1c: 34 02 00 02 mvi r2,2 8011a20: 21 81 ff ff andi r1,r12,0xffff 8011a24: fb ff f1 0c calli 800de54 <__ashlsi3> 8011a28: b5 a1 08 00 add r1,r13,r1 8011a2c: 58 2b 00 00 sw (r1+0),r11 information, _Objects_Get_index( the_object->id ), the_object ); the_object->name = name; 8011a30: 59 71 00 0c sw (r11+12),r17 &_Partition_Information, &the_partition->Object, (Objects_Name) name ); *id = the_partition->Object.id; 8011a34: 5a 0c 00 00 sw (r16+0),r12 name, 0 /* Not used */ ); #endif _Thread_Enable_dispatch(); 8011a38: f8 00 1b 6c calli 80187e8 <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 8011a3c: 34 07 00 00 mvi r7,0 } 8011a40: b8 e0 08 00 mv r1,r7 8011a44: 2b 9d 00 04 lw ra,(sp+4) 8011a48: 2b 8b 00 28 lw r11,(sp+40) 8011a4c: 2b 8c 00 24 lw r12,(sp+36) 8011a50: 2b 8d 00 20 lw r13,(sp+32) 8011a54: 2b 8e 00 1c lw r14,(sp+28) 8011a58: 2b 8f 00 18 lw r15,(sp+24) 8011a5c: 2b 90 00 14 lw r16,(sp+20) 8011a60: 2b 91 00 10 lw r17,(sp+16) 8011a64: 2b 92 00 0c lw r18,(sp+12) 8011a68: 2b 93 00 08 lw r19,(sp+8) 8011a6c: 37 9c 00 28 addi sp,sp,40 8011a70: c3 a0 00 00 ret =============================================================================== 0800b800 : rtems_status_code rtems_rate_monotonic_get_status( rtems_id id, rtems_rate_monotonic_period_status *status ) { 800b800: 37 9c ff e4 addi sp,sp,-28 800b804: 5b 8b 00 08 sw (sp+8),r11 800b808: 5b 9d 00 04 sw (sp+4),ra 800b80c: b8 20 18 00 mv r3,r1 800b810: b8 40 58 00 mv r11,r2 Rate_monotonic_Period_time_t since_last_period; Rate_monotonic_Control *the_period; bool valid_status; if ( !status ) return RTEMS_INVALID_ADDRESS; 800b814: 34 01 00 09 mvi r1,9 Objects_Locations location; Rate_monotonic_Period_time_t since_last_period; Rate_monotonic_Control *the_period; bool valid_status; if ( !status ) 800b818: 44 40 00 26 be r2,r0,800b8b0 <== NEVER TAKEN 800b81c: 78 01 08 02 mvhi r1,0x802 800b820: b8 60 10 00 mv r2,r3 800b824: 38 21 18 d0 ori r1,r1,0x18d0 800b828: 37 83 00 1c addi r3,sp,28 800b82c: fb ff ec 60 calli 80069ac <_Objects_Get> return RTEMS_INVALID_ADDRESS; the_period = _Rate_monotonic_Get( id, &location ); switch ( location ) { 800b830: 2b 83 00 1c lw r3,(sp+28) 800b834: 5c 60 00 1e bne r3,r0,800b8ac <== NEVER TAKEN case OBJECTS_LOCAL: status->owner = the_period->owner->Object.id; 800b838: 28 24 00 40 lw r4,(r1+64) status->state = the_period->state; 800b83c: 28 22 00 38 lw r2,(r1+56) the_period = _Rate_monotonic_Get( id, &location ); switch ( location ) { case OBJECTS_LOCAL: status->owner = the_period->owner->Object.id; 800b840: 28 84 00 08 lw r4,(r4+8) status->state = the_period->state; 800b844: 59 62 00 04 sw (r11+4),r2 the_period = _Rate_monotonic_Get( id, &location ); switch ( location ) { case OBJECTS_LOCAL: status->owner = the_period->owner->Object.id; 800b848: 59 64 00 00 sw (r11+0),r4 status->state = the_period->state; /* * If the period is inactive, there is no information. */ if ( status->state == RATE_MONOTONIC_INACTIVE ) { 800b84c: 5c 43 00 06 bne r2,r3,800b864 #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ _Timespec_Set_to_zero( &status->since_last_period ); 800b850: 59 60 00 08 sw (r11+8),r0 800b854: 59 60 00 0c sw (r11+12),r0 _Timespec_Set_to_zero( &status->executed_since_last_period ); 800b858: 59 60 00 10 sw (r11+16),r0 800b85c: 59 60 00 14 sw (r11+20),r0 800b860: e0 00 00 10 bi 800b8a0 } else { /* * Grab the current status. */ valid_status = 800b864: 37 82 00 0c addi r2,sp,12 800b868: 37 83 00 14 addi r3,sp,20 800b86c: fb ff e1 79 calli 8003e50 <_Rate_monotonic_Get_status> _Rate_monotonic_Get_status( the_period, &since_last_period, &executed ); if (!valid_status) { 800b870: 5c 20 00 04 bne r1,r0,800b880 _Thread_Enable_dispatch(); 800b874: fb ff ef aa calli 800771c <_Thread_Enable_dispatch> return RTEMS_NOT_DEFINED; 800b878: 34 01 00 0b mvi r1,11 800b87c: e0 00 00 0d bi 800b8b0 } #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ _Timestamp_To_timespec( 800b880: 2b 81 00 0c lw r1,(sp+12) 800b884: 59 61 00 08 sw (r11+8),r1 800b888: 2b 81 00 10 lw r1,(sp+16) 800b88c: 59 61 00 0c sw (r11+12),r1 &since_last_period, &status->since_last_period ); _Timestamp_To_timespec( 800b890: 2b 81 00 14 lw r1,(sp+20) 800b894: 59 61 00 10 sw (r11+16),r1 800b898: 2b 81 00 18 lw r1,(sp+24) 800b89c: 59 61 00 14 sw (r11+20),r1 status->since_last_period = since_last_period; status->executed_since_last_period = executed; #endif } _Thread_Enable_dispatch(); 800b8a0: fb ff ef 9f calli 800771c <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 800b8a4: 34 01 00 00 mvi r1,0 800b8a8: e0 00 00 02 bi 800b8b0 #endif case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 800b8ac: 34 01 00 04 mvi r1,4 } 800b8b0: 2b 9d 00 04 lw ra,(sp+4) 800b8b4: 2b 8b 00 08 lw r11,(sp+8) 800b8b8: 37 9c 00 1c addi sp,sp,28 800b8bc: c3 a0 00 00 ret =============================================================================== 080040c8 : rtems_status_code rtems_rate_monotonic_period( rtems_id id, rtems_interval length ) { 80040c8: 37 9c ff e8 addi sp,sp,-24 80040cc: 5b 8b 00 14 sw (sp+20),r11 80040d0: 5b 8c 00 10 sw (sp+16),r12 80040d4: 5b 8d 00 0c sw (sp+12),r13 80040d8: 5b 8e 00 08 sw (sp+8),r14 80040dc: 5b 9d 00 04 sw (sp+4),ra 80040e0: b8 20 60 00 mv r12,r1 Objects_Id id, Objects_Locations *location ) { return (Rate_monotonic_Control *) _Objects_Get( &_Rate_monotonic_Information, id, location ); 80040e4: 78 01 08 02 mvhi r1,0x802 80040e8: b8 40 68 00 mv r13,r2 80040ec: 38 21 18 d0 ori r1,r1,0x18d0 80040f0: b9 80 10 00 mv r2,r12 80040f4: 37 83 00 18 addi r3,sp,24 80040f8: f8 00 0a 2d calli 80069ac <_Objects_Get> 80040fc: b8 20 58 00 mv r11,r1 rtems_rate_monotonic_period_states local_state; ISR_Level level; the_period = _Rate_monotonic_Get( id, &location ); switch ( location ) { 8004100: 2b 81 00 18 lw r1,(sp+24) 8004104: 5c 20 00 5f bne r1,r0,8004280 RTEMS_INLINE_ROUTINE bool _Thread_Is_executing ( const Thread_Control *the_thread ) { return ( the_thread == _Thread_Executing ); 8004108: 78 03 08 02 mvhi r3,0x802 800410c: 38 63 1e c4 ori r3,r3,0x1ec4 case OBJECTS_LOCAL: if ( !_Thread_Is_executing( the_period->owner ) ) { 8004110: 29 62 00 40 lw r2,(r11+64) 8004114: 28 61 00 0c lw r1,(r3+12) 8004118: 44 41 00 04 be r2,r1,8004128 _Thread_Enable_dispatch(); 800411c: f8 00 0d 80 calli 800771c <_Thread_Enable_dispatch> return RTEMS_NOT_OWNER_OF_RESOURCE; 8004120: 34 0c 00 17 mvi r12,23 8004124: e0 00 00 58 bi 8004284 } if ( length == RTEMS_PERIOD_STATUS ) { 8004128: 5d a0 00 0d bne r13,r0,800415c switch ( the_period->state ) { 800412c: 29 61 00 38 lw r1,(r11+56) 8004130: 34 02 00 04 mvi r2,4 8004134: 34 0c 00 00 mvi r12,0 8004138: 54 22 00 07 bgu r1,r2,8004154 <== NEVER TAKEN 800413c: 78 0b 08 01 mvhi r11,0x801 8004140: 34 02 00 02 mvi r2,2 8004144: fb ff f4 52 calli 800128c <__ashlsi3> 8004148: 39 6b ea f0 ori r11,r11,0xeaf0 800414c: b5 61 08 00 add r1,r11,r1 8004150: 28 2c 00 00 lw r12,(r1+0) case RATE_MONOTONIC_ACTIVE: default: /* unreached -- only to remove warnings */ return_value = RTEMS_SUCCESSFUL; break; } _Thread_Enable_dispatch(); 8004154: f8 00 0d 72 calli 800771c <_Thread_Enable_dispatch> return( return_value ); 8004158: e0 00 00 4b bi 8004284 } _ISR_Disable( level ); 800415c: 90 00 70 00 rcsr r14,IE 8004160: 34 01 ff fe mvi r1,-2 8004164: a1 c1 08 00 and r1,r14,r1 8004168: d0 01 00 00 wcsr IE,r1 if ( the_period->state == RATE_MONOTONIC_INACTIVE ) { 800416c: 29 63 00 38 lw r3,(r11+56) 8004170: 5c 60 00 13 bne r3,r0,80041bc _ISR_Enable( level ); 8004174: d0 0e 00 00 wcsr IE,r14 /* * Baseline statistics information for the beginning of a period. */ _Rate_monotonic_Initiate_statistics( the_period ); 8004178: b9 60 08 00 mv r1,r11 800417c: fb ff ff 6e calli 8003f34 <_Rate_monotonic_Initiate_statistics> the_period->state = RATE_MONOTONIC_ACTIVE; 8004180: 34 01 00 02 mvi r1,2 Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; 8004184: 78 03 08 00 mvhi r3,0x800 8004188: 59 61 00 38 sw (r11+56),r1 800418c: 38 63 46 08 ori r3,r3,0x4608 ) { the_watchdog->initial = units; _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 8004190: 78 01 08 02 mvhi r1,0x802 Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 8004194: 59 60 00 18 sw (r11+24),r0 the_watchdog->routine = routine; 8004198: 59 63 00 2c sw (r11+44),r3 the_watchdog->id = id; 800419c: 59 6c 00 30 sw (r11+48),r12 the_watchdog->user_data = user_data; 80041a0: 59 60 00 34 sw (r11+52),r0 _Rate_monotonic_Timeout, id, NULL ); the_period->next_length = length; 80041a4: 59 6d 00 3c sw (r11+60),r13 Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 80041a8: 59 6d 00 1c sw (r11+28),r13 _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 80041ac: 38 21 1a d8 ori r1,r1,0x1ad8 80041b0: 35 62 00 10 addi r2,r11,16 80041b4: f8 00 12 35 calli 8008a88 <_Watchdog_Insert> 80041b8: e0 00 00 1f bi 8004234 _Watchdog_Insert_ticks( &the_period->Timer, length ); _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } if ( the_period->state == RATE_MONOTONIC_ACTIVE ) { 80041bc: 34 01 00 02 mvi r1,2 80041c0: 5c 61 00 20 bne r3,r1,8004240 /* * Update statistics from the concluding period. */ _Rate_monotonic_Update_statistics( the_period ); 80041c4: b9 60 08 00 mv r1,r11 80041c8: fb ff ff 80 calli 8003fc8 <_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; 80041cc: 34 01 00 01 mvi r1,1 80041d0: 59 61 00 38 sw (r11+56),r1 the_period->next_length = length; 80041d4: 59 6d 00 3c sw (r11+60),r13 _ISR_Enable( level ); 80041d8: d0 0e 00 00 wcsr IE,r14 _Thread_Executing->Wait.id = the_period->Object.id; 80041dc: 78 01 08 02 mvhi r1,0x802 80041e0: 38 21 1e c4 ori r1,r1,0x1ec4 80041e4: 29 62 00 08 lw r2,(r11+8) 80041e8: 28 21 00 0c lw r1,(r1+12) 80041ec: 58 22 00 20 sw (r1+32),r2 _Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); 80041f0: 34 02 40 00 mvi r2,16384 80041f4: f8 00 0f ec calli 80081a4 <_Thread_Set_state> /* * Did the watchdog timer expire while we were actually blocking * on it? */ _ISR_Disable( level ); 80041f8: 90 00 08 00 rcsr r1,IE 80041fc: 34 02 ff fe mvi r2,-2 8004200: a0 22 10 00 and r2,r1,r2 8004204: d0 02 00 00 wcsr IE,r2 local_state = the_period->state; the_period->state = RATE_MONOTONIC_ACTIVE; 8004208: 34 03 00 02 mvi r3,2 /* * Did the watchdog timer expire while we were actually blocking * on it? */ _ISR_Disable( level ); local_state = the_period->state; 800420c: 29 62 00 38 lw r2,(r11+56) the_period->state = RATE_MONOTONIC_ACTIVE; 8004210: 59 63 00 38 sw (r11+56),r3 _ISR_Enable( level ); 8004214: d0 01 00 00 wcsr IE,r1 /* * 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 ) 8004218: 34 01 00 03 mvi r1,3 800421c: 5c 41 00 06 bne r2,r1,8004234 _Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); 8004220: 78 01 08 02 mvhi r1,0x802 8004224: 38 21 1e c4 ori r1,r1,0x1ec4 8004228: 28 21 00 0c lw r1,(r1+12) 800422c: 34 02 40 00 mvi r2,16384 8004230: f8 00 0c 76 calli 8007408 <_Thread_Clear_state> _Thread_Enable_dispatch(); 8004234: f8 00 0d 3a calli 800771c <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 8004238: 34 0c 00 00 mvi r12,0 800423c: e0 00 00 12 bi 8004284 #endif case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 8004240: 34 0c 00 04 mvi r12,4 _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } if ( the_period->state == RATE_MONOTONIC_EXPIRED ) { 8004244: 5c 6c 00 10 bne r3,r12,8004284 <== NEVER TAKEN /* * Update statistics from the concluding period */ _Rate_monotonic_Update_statistics( the_period ); 8004248: b9 60 08 00 mv r1,r11 800424c: fb ff ff 5f calli 8003fc8 <_Rate_monotonic_Update_statistics> _ISR_Enable( level ); 8004250: d0 0e 00 00 wcsr IE,r14 the_period->state = RATE_MONOTONIC_ACTIVE; 8004254: 34 01 00 02 mvi r1,2 8004258: 59 61 00 38 sw (r11+56),r1 800425c: 78 01 08 02 mvhi r1,0x802 8004260: 38 21 1a d8 ori r1,r1,0x1ad8 8004264: 35 62 00 10 addi r2,r11,16 the_period->next_length = length; 8004268: 59 6d 00 3c sw (r11+60),r13 Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 800426c: 59 6d 00 1c sw (r11+28),r13 _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 8004270: f8 00 12 06 calli 8008a88 <_Watchdog_Insert> _Watchdog_Insert_ticks( &the_period->Timer, length ); _Thread_Enable_dispatch(); return RTEMS_TIMEOUT; 8004274: 34 0c 00 06 mvi r12,6 the_period->state = RATE_MONOTONIC_ACTIVE; the_period->next_length = length; _Watchdog_Insert_ticks( &the_period->Timer, length ); _Thread_Enable_dispatch(); 8004278: f8 00 0d 29 calli 800771c <_Thread_Enable_dispatch> return RTEMS_TIMEOUT; 800427c: e0 00 00 02 bi 8004284 #endif case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 8004280: 34 0c 00 04 mvi r12,4 } 8004284: b9 80 08 00 mv r1,r12 8004288: 2b 9d 00 04 lw ra,(sp+4) 800428c: 2b 8b 00 14 lw r11,(sp+20) 8004290: 2b 8c 00 10 lw r12,(sp+16) 8004294: 2b 8d 00 0c lw r13,(sp+12) 8004298: 2b 8e 00 08 lw r14,(sp+8) 800429c: 37 9c 00 18 addi sp,sp,24 80042a0: c3 a0 00 00 ret =============================================================================== 080042a4 : */ void rtems_rate_monotonic_report_statistics_with_plugin( void *context, rtems_printk_plugin_t print ) { 80042a4: 37 9c ff 5c addi sp,sp,-164 80042a8: 5b 8b 00 44 sw (sp+68),r11 80042ac: 5b 8c 00 40 sw (sp+64),r12 80042b0: 5b 8d 00 3c sw (sp+60),r13 80042b4: 5b 8e 00 38 sw (sp+56),r14 80042b8: 5b 8f 00 34 sw (sp+52),r15 80042bc: 5b 90 00 30 sw (sp+48),r16 80042c0: 5b 91 00 2c sw (sp+44),r17 80042c4: 5b 92 00 28 sw (sp+40),r18 80042c8: 5b 93 00 24 sw (sp+36),r19 80042cc: 5b 94 00 20 sw (sp+32),r20 80042d0: 5b 95 00 1c sw (sp+28),r21 80042d4: 5b 96 00 18 sw (sp+24),r22 80042d8: 5b 97 00 14 sw (sp+20),r23 80042dc: 5b 98 00 10 sw (sp+16),r24 80042e0: 5b 99 00 0c sw (sp+12),r25 80042e4: 5b 9b 00 08 sw (sp+8),fp 80042e8: 5b 9d 00 04 sw (sp+4),ra 80042ec: b8 20 60 00 mv r12,r1 80042f0: b8 40 58 00 mv r11,r2 rtems_id id; rtems_rate_monotonic_period_statistics the_stats; rtems_rate_monotonic_period_status the_status; char name[5]; if ( !print ) 80042f4: 44 40 00 72 be r2,r0,80044bc <== NEVER TAKEN return; (*print)( context, "Period information by period\n" ); 80042f8: 78 02 08 01 mvhi r2,0x801 80042fc: 38 42 eb 04 ori r2,r2,0xeb04 8004300: d9 60 00 00 call r11 #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ (*print)( context, "--- CPU times are in seconds ---\n" ); 8004304: 78 02 08 01 mvhi r2,0x801 8004308: 38 42 eb 24 ori r2,r2,0xeb24 800430c: b9 80 08 00 mv r1,r12 8004310: d9 60 00 00 call r11 (*print)( context, "--- Wall times are in seconds ---\n" ); 8004314: 78 02 08 01 mvhi r2,0x801 8004318: 38 42 eb 48 ori r2,r2,0xeb48 800431c: b9 80 08 00 mv r1,r12 8004320: d9 60 00 00 call r11 Be sure to test the various cases. (*print)( context,"\ 1234567890123456789012345678901234567890123456789012345678901234567890123456789\ \n"); */ (*print)( context, " ID OWNER COUNT MISSED " 8004324: 78 02 08 01 mvhi r2,0x801 8004328: 38 42 eb 6c ori r2,r2,0xeb6c 800432c: b9 80 08 00 mv r1,r12 8004330: d9 60 00 00 call r11 #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ " " #endif " WALL TIME\n" ); (*print)( context, " " 8004334: 78 02 08 01 mvhi r2,0x801 8004338: b9 80 08 00 mv r1,r12 800433c: 38 42 eb b8 ori r2,r2,0xebb8 8004340: d9 60 00 00 call r11 /* * 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 ; 8004344: 78 01 08 02 mvhi r1,0x802 8004348: 38 21 18 d0 ori r1,r1,0x18d0 rtems_object_get_name( the_status.owner, sizeof(name), name ); /* * Print part of report line that is not dependent on granularity */ (*print)( context, 800434c: 78 11 08 01 mvhi r17,0x801 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, 8004350: 78 10 08 01 mvhi r16,0x801 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, 8004354: 78 0f 08 01 mvhi r15,0x801 /* * If the count is zero, don't print statistics */ if (the_stats.count == 0) { (*print)( context, "\n" ); 8004358: 78 0e 08 01 mvhi r14,0x801 /* * 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 ; 800435c: 28 2d 00 08 lw r13,(r1+8) id <= _Rate_monotonic_Information.maximum_id ; 8004360: b8 20 a0 00 mv r20,r1 id++ ) { status = rtems_rate_monotonic_get_statistics( id, &the_stats ); 8004364: 37 99 00 48 addi r25,sp,72 #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 ); 8004368: 37 98 00 80 addi r24,sp,128 #endif rtems_object_get_name( the_status.owner, sizeof(name), name ); 800436c: 37 93 00 a0 addi r19,sp,160 /* * Print part of report line that is not dependent on granularity */ (*print)( context, 8004370: 3a 31 ec 04 ori r17,r17,0xec04 { #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; 8004374: 37 97 00 60 addi r23,sp,96 _Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average ); 8004378: 37 92 00 98 addi r18,sp,152 (*print)( context, 800437c: 3a 10 ec 1c ori r16,r16,0xec1c { #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; 8004380: 37 96 00 78 addi r22,sp,120 _Timespec_Divide_by_integer(total_wall, the_stats.count, &wall_average); (*print)( context, 8004384: 39 ef ec 3c ori r15,r15,0xec3c /* * If the count is zero, don't print statistics */ if (the_stats.count == 0) { (*print)( context, "\n" ); 8004388: 39 ce e1 40 ori r14,r14,0xe140 /* * 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 ; 800438c: e0 00 00 4a bi 80044b4 id <= _Rate_monotonic_Information.maximum_id ; id++ ) { status = rtems_rate_monotonic_get_statistics( id, &the_stats ); 8004390: b9 a0 08 00 mv r1,r13 8004394: bb 20 10 00 mv r2,r25 8004398: f8 00 1c e8 calli 800b738 800439c: b8 20 a8 00 mv r21,r1 if ( status != RTEMS_SUCCESSFUL ) 80043a0: 5c 20 00 44 bne r1,r0,80044b0 #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 ); 80043a4: bb 00 10 00 mv r2,r24 80043a8: b9 a0 08 00 mv r1,r13 80043ac: f8 00 1d 15 calli 800b800 #endif rtems_object_get_name( the_status.owner, sizeof(name), name ); 80043b0: 2b 81 00 80 lw r1,(sp+128) 80043b4: 34 02 00 05 mvi r2,5 80043b8: ba 60 18 00 mv r3,r19 80043bc: f8 00 00 c3 calli 80046c8 /* * Print part of report line that is not dependent on granularity */ (*print)( context, 80043c0: 2b 85 00 48 lw r5,(sp+72) 80043c4: 2b 86 00 4c lw r6,(sp+76) 80043c8: ba 20 10 00 mv r2,r17 80043cc: b9 80 08 00 mv r1,r12 80043d0: b9 a0 18 00 mv r3,r13 80043d4: ba 60 20 00 mv r4,r19 80043d8: d9 60 00 00 call r11 ); /* * If the count is zero, don't print statistics */ if (the_stats.count == 0) { 80043dc: 2b 82 00 48 lw r2,(sp+72) 80043e0: 5c 55 00 05 bne r2,r21,80043f4 (*print)( context, "\n" ); 80043e4: b9 80 08 00 mv r1,r12 80043e8: b9 c0 10 00 mv r2,r14 80043ec: d9 60 00 00 call r11 continue; 80043f0: e0 00 00 30 bi 80044b0 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 ); 80043f4: ba 40 18 00 mv r3,r18 80043f8: ba e0 08 00 mv r1,r23 80043fc: f8 00 10 59 calli 8008560 <_Timespec_Divide_by_integer> (*print)( context, 8004400: 2b 81 00 54 lw r1,(sp+84) 8004404: 34 02 03 e8 mvi r2,1000 8004408: f8 00 62 48 calli 801cd28 <__divsi3> 800440c: b8 20 d8 00 mv fp,r1 8004410: 2b 81 00 5c lw r1,(sp+92) 8004414: 34 02 03 e8 mvi r2,1000 8004418: f8 00 62 44 calli 801cd28 <__divsi3> 800441c: b8 20 a8 00 mv r21,r1 8004420: 2b 81 00 9c lw r1,(sp+156) 8004424: 34 02 03 e8 mvi r2,1000 8004428: f8 00 62 40 calli 801cd28 <__divsi3> 800442c: 2b 85 00 58 lw r5,(sp+88) 8004430: 2b 87 00 98 lw r7,(sp+152) 8004434: 2b 83 00 50 lw r3,(sp+80) 8004438: b8 20 40 00 mv r8,r1 800443c: bb 60 20 00 mv r4,fp 8004440: ba a0 30 00 mv r6,r21 8004444: ba 00 10 00 mv r2,r16 8004448: b9 80 08 00 mv r1,r12 800444c: d9 60 00 00 call r11 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); 8004450: 2b 82 00 48 lw r2,(sp+72) 8004454: ba 40 18 00 mv r3,r18 8004458: ba c0 08 00 mv r1,r22 800445c: f8 00 10 41 calli 8008560 <_Timespec_Divide_by_integer> (*print)( context, 8004460: 2b 81 00 6c lw r1,(sp+108) 8004464: 34 02 03 e8 mvi r2,1000 8004468: f8 00 62 30 calli 801cd28 <__divsi3> 800446c: b8 20 d8 00 mv fp,r1 8004470: 2b 81 00 74 lw r1,(sp+116) 8004474: 34 02 03 e8 mvi r2,1000 8004478: f8 00 62 2c calli 801cd28 <__divsi3> 800447c: b8 20 a8 00 mv r21,r1 8004480: 2b 81 00 9c lw r1,(sp+156) 8004484: 34 02 03 e8 mvi r2,1000 8004488: f8 00 62 28 calli 801cd28 <__divsi3> 800448c: 2b 83 00 68 lw r3,(sp+104) 8004490: 2b 85 00 70 lw r5,(sp+112) 8004494: 2b 87 00 98 lw r7,(sp+152) 8004498: b8 20 40 00 mv r8,r1 800449c: b9 e0 10 00 mv r2,r15 80044a0: b9 80 08 00 mv r1,r12 80044a4: bb 60 20 00 mv r4,fp 80044a8: ba a0 30 00 mv r6,r21 80044ac: d9 60 00 00 call r11 * 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++ ) { 80044b0: 35 ad 00 01 addi r13,r13,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 ; 80044b4: 2a 81 00 0c lw r1,(r20+12) 80044b8: 50 2d ff b6 bgeu r1,r13,8004390 the_stats.min_wall_time, the_stats.max_wall_time, ival_wall, fval_wall ); #endif } } } 80044bc: 2b 9d 00 04 lw ra,(sp+4) 80044c0: 2b 8b 00 44 lw r11,(sp+68) 80044c4: 2b 8c 00 40 lw r12,(sp+64) 80044c8: 2b 8d 00 3c lw r13,(sp+60) 80044cc: 2b 8e 00 38 lw r14,(sp+56) 80044d0: 2b 8f 00 34 lw r15,(sp+52) 80044d4: 2b 90 00 30 lw r16,(sp+48) 80044d8: 2b 91 00 2c lw r17,(sp+44) 80044dc: 2b 92 00 28 lw r18,(sp+40) 80044e0: 2b 93 00 24 lw r19,(sp+36) 80044e4: 2b 94 00 20 lw r20,(sp+32) 80044e8: 2b 95 00 1c lw r21,(sp+28) 80044ec: 2b 96 00 18 lw r22,(sp+24) 80044f0: 2b 97 00 14 lw r23,(sp+20) 80044f4: 2b 98 00 10 lw r24,(sp+16) 80044f8: 2b 99 00 0c lw r25,(sp+12) 80044fc: 2b 9b 00 08 lw fp,(sp+8) 8004500: 37 9c 00 a4 addi sp,sp,164 8004504: c3 a0 00 00 ret =============================================================================== 08013348 : rtems_status_code rtems_signal_send( rtems_id id, rtems_signal_set signal_set ) { 8013348: 37 9c ff f4 addi sp,sp,-12 801334c: 5b 8b 00 08 sw (sp+8),r11 8013350: 5b 9d 00 04 sw (sp+4),ra Objects_Locations location; RTEMS_API_Control *api; ASR_Information *asr; if ( !signal_set ) return RTEMS_INVALID_NUMBER; 8013354: 34 03 00 0a mvi r3,10 rtems_status_code rtems_signal_send( rtems_id id, rtems_signal_set signal_set ) { 8013358: b8 40 58 00 mv r11,r2 register Thread_Control *the_thread; Objects_Locations location; RTEMS_API_Control *api; ASR_Information *asr; if ( !signal_set ) 801335c: 44 40 00 29 be r2,r0,8013400 return RTEMS_INVALID_NUMBER; the_thread = _Thread_Get( id, &location ); 8013360: 37 82 00 0c addi r2,sp,12 8013364: f8 00 15 2e calli 801881c <_Thread_Get> switch ( location ) { 8013368: 2b 82 00 0c lw r2,(sp+12) case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 801336c: 34 03 00 04 mvi r3,4 if ( !signal_set ) return RTEMS_INVALID_NUMBER; the_thread = _Thread_Get( id, &location ); switch ( location ) { 8013370: 5c 40 00 24 bne r2,r0,8013400 case OBJECTS_LOCAL: api = the_thread->API_Extensions[ THREAD_API_RTEMS ]; 8013374: 28 23 01 1c lw r3,(r1+284) asr = &api->Signal; if ( ! _ASR_Is_null_handler( asr->handler ) ) { 8013378: 28 64 00 0c lw r4,(r3+12) 801337c: 44 82 00 1f be r4,r2,80133f8 if ( asr->is_enabled ) { 8013380: 40 62 00 08 lbu r2,(r3+8) 8013384: 44 40 00 12 be r2,r0,80133cc rtems_signal_set *signal_set ) { ISR_Level _level; _ISR_Disable( _level ); 8013388: 90 00 10 00 rcsr r2,IE 801338c: 34 04 ff fe mvi r4,-2 8013390: a0 44 20 00 and r4,r2,r4 8013394: d0 04 00 00 wcsr IE,r4 *signal_set |= signals; 8013398: 28 64 00 14 lw r4,(r3+20) 801339c: b8 8b 58 00 or r11,r4,r11 80133a0: 58 6b 00 14 sw (r3+20),r11 _ISR_Enable( _level ); 80133a4: d0 02 00 00 wcsr IE,r2 _ASR_Post_signals( signal_set, &asr->signals_posted ); if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) ) 80133a8: 78 02 08 04 mvhi r2,0x804 80133ac: 38 42 11 b4 ori r2,r2,0x11b4 80133b0: 28 43 00 08 lw r3,(r2+8) 80133b4: 44 60 00 0e be r3,r0,80133ec 80133b8: 28 43 00 0c lw r3,(r2+12) 80133bc: 5c 23 00 0c bne r1,r3,80133ec <== NEVER TAKEN _Thread_Dispatch_necessary = true; 80133c0: 34 01 00 01 mvi r1,1 80133c4: 30 41 00 18 sb (r2+24),r1 80133c8: e0 00 00 09 bi 80133ec rtems_signal_set *signal_set ) { ISR_Level _level; _ISR_Disable( _level ); 80133cc: 90 00 08 00 rcsr r1,IE 80133d0: 34 02 ff fe mvi r2,-2 80133d4: a0 22 10 00 and r2,r1,r2 80133d8: d0 02 00 00 wcsr IE,r2 *signal_set |= signals; 80133dc: 28 62 00 18 lw r2,(r3+24) 80133e0: b8 4b 58 00 or r11,r2,r11 80133e4: 58 6b 00 18 sw (r3+24),r11 _ISR_Enable( _level ); 80133e8: d0 01 00 00 wcsr IE,r1 } else { _ASR_Post_signals( signal_set, &asr->signals_pending ); } _Thread_Enable_dispatch(); 80133ec: f8 00 14 ff calli 80187e8 <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 80133f0: 34 03 00 00 mvi r3,0 80133f4: e0 00 00 03 bi 8013400 } _Thread_Enable_dispatch(); 80133f8: f8 00 14 fc calli 80187e8 <_Thread_Enable_dispatch> return RTEMS_NOT_DEFINED; 80133fc: 34 03 00 0b mvi r3,11 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 8013400: b8 60 08 00 mv r1,r3 8013404: 2b 9d 00 04 lw ra,(sp+4) 8013408: 2b 8b 00 08 lw r11,(sp+8) 801340c: 37 9c 00 0c addi sp,sp,12 8013410: c3 a0 00 00 ret =============================================================================== 08001328 : Thread_Control *the_thread ) { Stack_check_Control *the_pattern; if ( the_thread->Object.id == 0 ) /* skip system tasks */ 8001328: 28 22 00 08 lw r2,(r1+8) 800132c: 44 40 00 0c be r2,r0,800135c <== NEVER TAKEN return; the_pattern = Stack_check_Get_pattern_area(&the_thread->Start.Initial_stack); *the_pattern = Stack_check_Pattern; 8001330: 28 22 00 bc lw r2,(r1+188) 8001334: 78 01 08 01 mvhi r1,0x801 8001338: 38 21 77 90 ori r1,r1,0x7790 800133c: 28 25 00 00 lw r5,(r1+0) 8001340: 28 24 00 04 lw r4,(r1+4) 8001344: 28 23 00 08 lw r3,(r1+8) 8001348: 28 21 00 0c lw r1,(r1+12) 800134c: 58 45 00 08 sw (r2+8),r5 8001350: 58 44 00 0c sw (r2+12),r4 8001354: 58 43 00 10 sw (r2+16),r3 8001358: 58 41 00 14 sw (r2+20),r1 800135c: c3 a0 00 00 ret =============================================================================== 080012ec : */ bool rtems_stack_checker_create_extension( Thread_Control *running __attribute__((unused)), Thread_Control *the_thread ) { 80012ec: 37 9c ff f8 addi sp,sp,-8 80012f0: 5b 8b 00 08 sw (sp+8),r11 80012f4: 5b 9d 00 04 sw (sp+4),ra 80012f8: b8 40 58 00 mv r11,r2 Stack_check_Initialize(); 80012fc: fb ff ff d0 calli 800123c if (the_thread) 8001300: 45 60 00 05 be r11,r0,8001314 <== NEVER TAKEN Stack_check_Dope_stack(&the_thread->Start.Initial_stack); 8001304: 29 61 00 bc lw r1,(r11+188) 8001308: 29 63 00 b8 lw r3,(r11+184) 800130c: 34 02 00 a5 mvi r2,165 8001310: f8 00 3b a9 calli 80101b4 return true; } 8001314: 34 01 00 01 mvi r1,1 8001318: 2b 9d 00 04 lw ra,(sp+4) 800131c: 2b 8b 00 08 lw r11,(sp+8) 8001320: 37 9c 00 08 addi sp,sp,8 8001324: c3 a0 00 00 ret =============================================================================== 08001490 : /* * Check if blown */ bool rtems_stack_checker_is_blown( void ) { 8001490: 37 9c ff f4 addi sp,sp,-12 8001494: 5b 9b 00 08 sw (sp+8),fp 8001498: 34 1b 00 0c mvi fp,12 800149c: b7 7c d8 00 add fp,fp,sp 80014a0: 5b 8b 00 0c sw (sp+12),r11 80014a4: 5b 9d 00 04 sw (sp+4),ra Stack_Control *the_stack = &_Thread_Executing->Start.Initial_stack; 80014a8: 78 01 08 01 mvhi r1,0x801 80014ac: 38 21 7e 18 ori r1,r1,0x7e18 80014b0: 28 22 00 0c lw r2,(r1+12) { #if defined(__GNUC__) void *sp = __builtin_frame_address(0); if ( sp < the_stack->area ) { return false; 80014b4: 34 0b 00 00 mvi r11,0 ) { #if defined(__GNUC__) void *sp = __builtin_frame_address(0); if ( sp < the_stack->area ) { 80014b8: 28 41 00 bc lw r1,(r2+188) 80014bc: 54 3b 00 04 bgu r1,fp,80014cc <== NEVER TAKEN return false; } if ( sp > (the_stack->area + the_stack->size) ) { 80014c0: 28 4b 00 b8 lw r11,(r2+184) } /* * Check if blown */ bool rtems_stack_checker_is_blown( void ) 80014c4: b4 2b 58 00 add r11,r1,r11 80014c8: f1 7b 58 00 cmpgeu r11,r11,fp /* * The stack checker must be initialized before the pattern is there * to check. */ if ( Stack_check_Initialized ) { 80014cc: 78 02 08 01 mvhi r2,0x801 80014d0: 38 42 77 04 ori r2,r2,0x7704 80014d4: 28 43 00 00 lw r3,(r2+0) */ bool rtems_stack_checker_is_blown( void ) { Stack_Control *the_stack = &_Thread_Executing->Start.Initial_stack; bool sp_ok; bool pattern_ok = true; 80014d8: 34 02 00 01 mvi r2,1 /* * The stack checker must be initialized before the pattern is there * to check. */ if ( Stack_check_Initialized ) { 80014dc: 44 60 00 07 be r3,r0,80014f8 <== NEVER TAKEN pattern_ok = (!memcmp( 80014e0: 78 02 08 01 mvhi r2,0x801 80014e4: 38 42 77 90 ori r2,r2,0x7790 80014e8: 34 21 00 08 addi r1,r1,8 80014ec: 34 03 00 10 mvi r3,16 80014f0: f8 00 3a cf calli 801002c 80014f4: 64 22 00 00 cmpei r2,r1,0 /* * Let's report as much as we can. */ if ( !sp_ok || !pattern_ok ) { 80014f8: 45 60 00 02 be r11,r0,8001500 <== NEVER TAKEN 80014fc: 5c 40 00 05 bne r2,r0,8001510 <== ALWAYS TAKEN Stack_check_report_blown_task( _Thread_Executing, pattern_ok ); 8001500: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED 8001504: 38 21 7e 18 ori r1,r1,0x7e18 <== NOT EXECUTED 8001508: 28 21 00 0c lw r1,(r1+12) <== NOT EXECUTED 800150c: fb ff ff 95 calli 8001360 <== NOT EXECUTED /* * The Stack Pointer and the Pattern Area are OK so return false. */ return false; } 8001510: 34 01 00 00 mvi r1,0 8001514: 2b 9d 00 04 lw ra,(sp+4) 8001518: 2b 8b 00 0c lw r11,(sp+12) 800151c: 2b 9b 00 08 lw fp,(sp+8) 8001520: 37 9c 00 0c addi sp,sp,12 8001524: c3 a0 00 00 ret =============================================================================== 08001528 : void rtems_stack_checker_report_usage_with_plugin( void *context, rtems_printk_plugin_t print ) { 8001528: 37 9c ff ec addi sp,sp,-20 800152c: 5b 8b 00 14 sw (sp+20),r11 8001530: 5b 8c 00 10 sw (sp+16),r12 8001534: 5b 8d 00 0c sw (sp+12),r13 8001538: 5b 8e 00 08 sw (sp+8),r14 800153c: 5b 9d 00 04 sw (sp+4),ra 8001540: b8 20 70 00 mv r14,r1 8001544: b8 40 68 00 mv r13,r2 if ( !print ) 8001548: 44 40 00 15 be r2,r0,800159c <== NEVER TAKEN return; print_context = context; print_handler = print; 800154c: 78 0b 08 01 mvhi r11,0x801 8001550: 39 6b 77 00 ori r11,r11,0x7700 ) { if ( !print ) return; print_context = context; 8001554: 78 0c 08 01 mvhi r12,0x801 8001558: 39 8c 76 fc ori r12,r12,0x76fc print_handler = print; 800155c: 59 62 00 00 sw (r11+0),r2 (*print)( context, "Stack usage by thread\n"); 8001560: 78 02 08 01 mvhi r2,0x801 8001564: 38 42 60 8c ori r2,r2,0x608c ) { if ( !print ) return; print_context = context; 8001568: 59 81 00 00 sw (r12+0),r1 print_handler = print; (*print)( context, "Stack usage by thread\n"); 800156c: d9 a0 00 00 call r13 (*print)( context, 8001570: 78 02 08 01 mvhi r2,0x801 8001574: 38 42 60 a4 ori r2,r2,0x60a4 8001578: b9 c0 08 00 mv r1,r14 800157c: d9 a0 00 00 call r13 " 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 ); 8001580: 78 01 08 00 mvhi r1,0x800 8001584: 38 21 10 74 ori r1,r1,0x1074 8001588: f8 00 16 ab calli 8007034 #if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) /* dump interrupt stack info if any */ Stack_check_Dump_threads_usage((Thread_Control *) -1); 800158c: 34 01 ff ff mvi r1,-1 8001590: fb ff fe b9 calli 8001074 #endif print_context = NULL; 8001594: 59 80 00 00 sw (r12+0),r0 print_handler = NULL; 8001598: 59 60 00 00 sw (r11+0),r0 } 800159c: 2b 9d 00 04 lw ra,(sp+4) 80015a0: 2b 8b 00 14 lw r11,(sp+20) 80015a4: 2b 8c 00 10 lw r12,(sp+16) 80015a8: 2b 8d 00 0c lw r13,(sp+12) 80015ac: 2b 8e 00 08 lw r14,(sp+8) 80015b0: 37 9c 00 14 addi sp,sp,20 80015b4: c3 a0 00 00 ret =============================================================================== 08001418 : */ void rtems_stack_checker_switch_extension( Thread_Control *running __attribute__((unused)), Thread_Control *heir __attribute__((unused)) ) { 8001418: 37 9c ff f0 addi sp,sp,-16 800141c: 5b 9b 00 08 sw (sp+8),fp 8001420: 34 1b 00 10 mvi fp,16 8001424: b7 7c d8 00 add fp,fp,sp 8001428: 5b 8b 00 10 sw (sp+16),r11 800142c: 5b 8c 00 0c sw (sp+12),r12 8001430: 5b 9d 00 04 sw (sp+4),ra 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); 8001434: 28 22 00 bc lw r2,(r1+188) */ void rtems_stack_checker_switch_extension( Thread_Control *running __attribute__((unused)), Thread_Control *heir __attribute__((unused)) ) { 8001438: b8 20 58 00 mv r11,r1 { #if defined(__GNUC__) void *sp = __builtin_frame_address(0); if ( sp < the_stack->area ) { return false; 800143c: 34 0c 00 00 mvi r12,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); 8001440: 34 41 00 08 addi r1,r2,8 ) { #if defined(__GNUC__) void *sp = __builtin_frame_address(0); if ( sp < the_stack->area ) { 8001444: 54 5b 00 04 bgu r2,fp,8001454 <== NEVER TAKEN return false; } if ( sp > (the_stack->area + the_stack->size) ) { 8001448: 29 6c 00 b8 lw r12,(r11+184) } /* * rtems_stack_checker_switch_extension */ void rtems_stack_checker_switch_extension( 800144c: b4 4c 10 00 add r2,r2,r12 8001450: f0 5b 60 00 cmpgeu r12,r2,fp /* * 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, 8001454: 78 02 08 01 mvhi r2,0x801 8001458: 38 42 77 90 ori r2,r2,0x7790 800145c: 34 03 00 10 mvi r3,16 8001460: f8 00 3a f3 calli 801002c 8001464: 64 22 00 00 cmpei r2,r1,0 (void *) Stack_check_Pattern.pattern, PATTERN_SIZE_BYTES)); if ( !sp_ok || !pattern_ok ) { 8001468: 45 80 00 02 be r12,r0,8001470 800146c: 5c 40 00 03 bne r2,r0,8001478 Stack_check_report_blown_task( running, pattern_ok ); 8001470: b9 60 08 00 mv r1,r11 8001474: fb ff ff bb calli 8001360 } } 8001478: 2b 9d 00 04 lw ra,(sp+4) 800147c: 2b 8b 00 10 lw r11,(sp+16) 8001480: 2b 8c 00 0c lw r12,(sp+12) 8001484: 2b 9b 00 08 lw fp,(sp+8) 8001488: 37 9c 00 10 addi sp,sp,16 800148c: c3 a0 00 00 ret =============================================================================== 0800902c : #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 800902c: 37 9c ff e4 addi sp,sp,-28 8009030: 5b 8b 00 18 sw (sp+24),r11 8009034: 5b 8c 00 14 sw (sp+20),r12 8009038: 5b 8d 00 10 sw (sp+16),r13 800903c: 5b 8e 00 0c sw (sp+12),r14 8009040: 5b 8f 00 08 sw (sp+8),r15 8009044: 5b 9d 00 04 sw (sp+4),ra STRING_TO_INPUT_TYPE result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 8009048: 34 04 00 09 mvi r4,9 #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 800904c: b8 20 70 00 mv r14,r1 8009050: b8 40 58 00 mv r11,r2 8009054: b8 60 78 00 mv r15,r3 STRING_TO_INPUT_TYPE result; char *end; if ( !n ) 8009058: 44 40 00 21 be r2,r0,80090dc return RTEMS_INVALID_ADDRESS; errno = 0; 800905c: f8 00 11 0b calli 800d488 <__errno> 8009060: 58 20 00 00 sw (r1+0),r0 *n = 0; 8009064: 59 60 00 00 sw (r11+0),r0 8009068: 59 60 00 04 sw (r11+4),r0 #ifdef STRING_TO_FLOAT result = STRING_TO_METHOD( s, &end ); 800906c: b9 c0 08 00 mv r1,r14 8009070: 37 82 00 1c addi r2,sp,28 8009074: f8 00 1c 10 calli 80100b4 8009078: b8 20 68 00 mv r13,r1 800907c: b8 40 60 00 mv r12,r2 #elif defined(STRING_TO_INTEGER) result = STRING_TO_METHOD( s, &end, base ); #endif /* If the user wants the end pointer back, then return it. */ if ( endptr ) 8009080: 45 e0 00 03 be r15,r0,800908c *endptr = end; 8009084: 2b 81 00 1c lw r1,(sp+28) 8009088: 59 e1 00 00 sw (r15+0),r1 /* nothing was converted */ if ( end == s ) 800908c: 2b 81 00 1c lw r1,(sp+28) return RTEMS_NOT_DEFINED; 8009090: 34 04 00 0b mvi r4,11 /* If the user wants the end pointer back, then return it. */ if ( endptr ) *endptr = end; /* nothing was converted */ if ( end == s ) 8009094: 44 2e 00 12 be r1,r14,80090dc return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 8009098: 78 04 08 02 mvhi r4,0x802 800909c: 38 84 0f 3c ori r4,r4,0xf3c 80090a0: 28 83 00 00 lw r3,(r4+0) 80090a4: b9 a0 08 00 mv r1,r13 80090a8: b9 80 10 00 mv r2,r12 80090ac: 34 04 ff ff mvi r4,-1 80090b0: f8 00 4b 28 calli 801bd50 <__gedf2> 80090b4: 48 20 00 02 bg r1,r0,80090bc 80090b8: e0 00 00 06 bi 80090d0 80090bc: f8 00 10 f3 calli 800d488 <__errno> 80090c0: 28 22 00 00 lw r2,(r1+0) 80090c4: 34 01 00 22 mvi r1,34 return RTEMS_INVALID_NUMBER; 80090c8: 34 04 00 0a mvi r4,10 return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 80090cc: 44 41 00 04 be r2,r1,80090dc <== ALWAYS TAKEN #endif #if defined(STRING_TO_POINTER) *n = (STRING_TO_TYPE) (uintptr_t)result; #else *n = (STRING_TO_TYPE) result; 80090d0: 59 6d 00 00 sw (r11+0),r13 80090d4: 59 6c 00 04 sw (r11+4),r12 #endif return RTEMS_SUCCESSFUL; 80090d8: 34 04 00 00 mvi r4,0 } 80090dc: b8 80 08 00 mv r1,r4 80090e0: 2b 9d 00 04 lw ra,(sp+4) 80090e4: 2b 8b 00 18 lw r11,(sp+24) 80090e8: 2b 8c 00 14 lw r12,(sp+20) 80090ec: 2b 8d 00 10 lw r13,(sp+16) 80090f0: 2b 8e 00 0c lw r14,(sp+12) 80090f4: 2b 8f 00 08 lw r15,(sp+8) 80090f8: 37 9c 00 1c addi sp,sp,28 80090fc: c3 a0 00 00 ret =============================================================================== 08009100 : #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 8009100: 37 9c ff e8 addi sp,sp,-24 8009104: 5b 8b 00 14 sw (sp+20),r11 8009108: 5b 8c 00 10 sw (sp+16),r12 800910c: 5b 8d 00 0c sw (sp+12),r13 8009110: 5b 8e 00 08 sw (sp+8),r14 8009114: 5b 9d 00 04 sw (sp+4),ra STRING_TO_INPUT_TYPE result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 8009118: 34 04 00 09 mvi r4,9 #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 800911c: b8 20 68 00 mv r13,r1 8009120: b8 40 58 00 mv r11,r2 8009124: b8 60 70 00 mv r14,r3 STRING_TO_INPUT_TYPE result; char *end; if ( !n ) 8009128: 44 40 00 1c be r2,r0,8009198 return RTEMS_INVALID_ADDRESS; errno = 0; 800912c: f8 00 10 d7 calli 800d488 <__errno> 8009130: 58 20 00 00 sw (r1+0),r0 *n = 0; 8009134: 59 60 00 00 sw (r11+0),r0 #ifdef STRING_TO_FLOAT result = STRING_TO_METHOD( s, &end ); 8009138: b9 a0 08 00 mv r1,r13 800913c: 37 82 00 18 addi r2,sp,24 8009140: f8 00 1b e9 calli 80100e4 8009144: b8 20 60 00 mv r12,r1 #elif defined(STRING_TO_INTEGER) result = STRING_TO_METHOD( s, &end, base ); #endif /* If the user wants the end pointer back, then return it. */ if ( endptr ) 8009148: 45 c0 00 03 be r14,r0,8009154 *endptr = end; 800914c: 2b 81 00 18 lw r1,(sp+24) 8009150: 59 c1 00 00 sw (r14+0),r1 /* nothing was converted */ if ( end == s ) 8009154: 2b 81 00 18 lw r1,(sp+24) return RTEMS_NOT_DEFINED; 8009158: 34 04 00 0b mvi r4,11 /* If the user wants the end pointer back, then return it. */ if ( endptr ) *endptr = end; /* nothing was converted */ if ( end == s ) 800915c: 44 2d 00 0f be r1,r13,8009198 return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 8009160: 78 03 08 02 mvhi r3,0x802 8009164: 38 63 0f 40 ori r3,r3,0xf40 8009168: 28 62 00 00 lw r2,(r3+0) 800916c: b9 80 08 00 mv r1,r12 8009170: f8 00 44 fe calli 801a568 <__gesf2> 8009174: 48 20 00 02 bg r1,r0,800917c 8009178: e0 00 00 06 bi 8009190 800917c: f8 00 10 c3 calli 800d488 <__errno> 8009180: 28 22 00 00 lw r2,(r1+0) 8009184: 34 01 00 22 mvi r1,34 return RTEMS_INVALID_NUMBER; 8009188: 34 04 00 0a mvi r4,10 return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 800918c: 44 41 00 03 be r2,r1,8009198 <== ALWAYS TAKEN #endif #if defined(STRING_TO_POINTER) *n = (STRING_TO_TYPE) (uintptr_t)result; #else *n = (STRING_TO_TYPE) result; 8009190: 59 6c 00 00 sw (r11+0),r12 #endif return RTEMS_SUCCESSFUL; 8009194: 34 04 00 00 mvi r4,0 } 8009198: b8 80 08 00 mv r1,r4 800919c: 2b 9d 00 04 lw ra,(sp+4) 80091a0: 2b 8b 00 14 lw r11,(sp+20) 80091a4: 2b 8c 00 10 lw r12,(sp+16) 80091a8: 2b 8d 00 0c lw r13,(sp+12) 80091ac: 2b 8e 00 08 lw r14,(sp+8) 80091b0: 37 9c 00 18 addi sp,sp,24 80091b4: c3 a0 00 00 ret =============================================================================== 0800926c : #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 800926c: 37 9c ff e4 addi sp,sp,-28 8009270: 5b 8b 00 18 sw (sp+24),r11 8009274: 5b 8c 00 14 sw (sp+20),r12 8009278: 5b 8d 00 10 sw (sp+16),r13 800927c: 5b 8e 00 0c sw (sp+12),r14 8009280: 5b 8f 00 08 sw (sp+8),r15 8009284: 5b 9d 00 04 sw (sp+4),ra STRING_TO_INPUT_TYPE result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 8009288: 34 05 00 09 mvi r5,9 #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 800928c: b8 20 70 00 mv r14,r1 8009290: b8 40 58 00 mv r11,r2 8009294: b8 60 78 00 mv r15,r3 8009298: b8 80 60 00 mv r12,r4 STRING_TO_INPUT_TYPE result; char *end; if ( !n ) 800929c: 44 40 00 22 be r2,r0,8009324 return RTEMS_INVALID_ADDRESS; errno = 0; 80092a0: f8 00 10 7a calli 800d488 <__errno> 80092a4: 58 20 00 00 sw (r1+0),r0 #ifdef STRING_TO_FLOAT result = STRING_TO_METHOD( s, &end ); #elif defined(STRING_TO_POINTER) result = STRING_TO_METHOD( s, &end, 16 ); #elif defined(STRING_TO_INTEGER) result = STRING_TO_METHOD( s, &end, base ); 80092a8: b9 80 18 00 mv r3,r12 if ( !n ) return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; 80092ac: 59 60 00 00 sw (r11+0),r0 80092b0: 59 60 00 04 sw (r11+4),r0 #ifdef STRING_TO_FLOAT result = STRING_TO_METHOD( s, &end ); #elif defined(STRING_TO_POINTER) result = STRING_TO_METHOD( s, &end, 16 ); #elif defined(STRING_TO_INTEGER) result = STRING_TO_METHOD( s, &end, base ); 80092b4: b9 c0 08 00 mv r1,r14 80092b8: 37 82 00 1c addi r2,sp,28 80092bc: f8 00 1c 4b calli 80103e8 80092c0: b8 20 68 00 mv r13,r1 80092c4: b8 40 60 00 mv r12,r2 #endif /* If the user wants the end pointer back, then return it. */ if ( endptr ) 80092c8: 45 e0 00 03 be r15,r0,80092d4 *endptr = end; 80092cc: 2b 81 00 1c lw r1,(sp+28) 80092d0: 59 e1 00 00 sw (r15+0),r1 /* nothing was converted */ if ( end == s ) 80092d4: 2b 81 00 1c lw r1,(sp+28) return RTEMS_NOT_DEFINED; 80092d8: 34 05 00 0b mvi r5,11 /* If the user wants the end pointer back, then return it. */ if ( endptr ) *endptr = end; /* nothing was converted */ if ( end == s ) 80092dc: 44 2e 00 12 be r1,r14,8009324 return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 80092e0: 78 02 08 02 mvhi r2,0x802 80092e4: 38 42 07 a0 ori r2,r2,0x7a0 80092e8: 28 41 00 00 lw r1,(r2+0) 80092ec: 5d a1 00 03 bne r13,r1,80092f8 80092f0: 34 01 ff ff mvi r1,-1 80092f4: 45 81 00 04 be r12,r1,8009304 <== ALWAYS TAKEN return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MIN /* there was an underflow */ if ( (result == STRING_TO_MIN) && (errno == ERANGE)) 80092f8: 78 01 80 00 mvhi r1,0x8000 80092fc: 5d a1 00 07 bne r13,r1,8009318 8009300: 5d 80 00 06 bne r12,r0,8009318 <== NEVER TAKEN 8009304: f8 00 10 61 calli 800d488 <__errno> 8009308: 28 22 00 00 lw r2,(r1+0) 800930c: 34 01 00 22 mvi r1,34 return RTEMS_INVALID_NUMBER; 8009310: 34 05 00 0a mvi r5,10 return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MIN /* there was an underflow */ if ( (result == STRING_TO_MIN) && (errno == ERANGE)) 8009314: 44 41 00 04 be r2,r1,8009324 #endif #if defined(STRING_TO_POINTER) *n = (STRING_TO_TYPE) (uintptr_t)result; #else *n = (STRING_TO_TYPE) result; 8009318: 59 6d 00 00 sw (r11+0),r13 800931c: 59 6c 00 04 sw (r11+4),r12 #endif return RTEMS_SUCCESSFUL; 8009320: 34 05 00 00 mvi r5,0 } 8009324: b8 a0 08 00 mv r1,r5 8009328: 2b 9d 00 04 lw ra,(sp+4) 800932c: 2b 8b 00 18 lw r11,(sp+24) 8009330: 2b 8c 00 14 lw r12,(sp+20) 8009334: 2b 8d 00 10 lw r13,(sp+16) 8009338: 2b 8e 00 0c lw r14,(sp+12) 800933c: 2b 8f 00 08 lw r15,(sp+8) 8009340: 37 9c 00 1c addi sp,sp,28 8009344: c3 a0 00 00 ret =============================================================================== 08009404 : #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 8009404: 37 9c ff e8 addi sp,sp,-24 8009408: 5b 8b 00 14 sw (sp+20),r11 800940c: 5b 8c 00 10 sw (sp+16),r12 8009410: 5b 8d 00 0c sw (sp+12),r13 8009414: 5b 8e 00 08 sw (sp+8),r14 8009418: 5b 9d 00 04 sw (sp+4),ra STRING_TO_INPUT_TYPE result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 800941c: 34 04 00 09 mvi r4,9 #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 8009420: b8 20 68 00 mv r13,r1 8009424: b8 40 58 00 mv r11,r2 8009428: b8 60 70 00 mv r14,r3 STRING_TO_INPUT_TYPE result; char *end; if ( !n ) 800942c: 44 40 00 18 be r2,r0,800948c return RTEMS_INVALID_ADDRESS; errno = 0; 8009430: f8 00 10 16 calli 800d488 <__errno> 8009434: 58 20 00 00 sw (r1+0),r0 *n = 0; 8009438: 59 60 00 00 sw (r11+0),r0 #ifdef STRING_TO_FLOAT result = STRING_TO_METHOD( s, &end ); #elif defined(STRING_TO_POINTER) result = STRING_TO_METHOD( s, &end, 16 ); 800943c: b9 a0 08 00 mv r1,r13 8009440: 37 82 00 18 addi r2,sp,24 8009444: 34 03 00 10 mvi r3,16 8009448: f8 00 1d 53 calli 8010994 800944c: b8 20 60 00 mv r12,r1 #elif defined(STRING_TO_INTEGER) result = STRING_TO_METHOD( s, &end, base ); #endif /* If the user wants the end pointer back, then return it. */ if ( endptr ) 8009450: 45 c0 00 03 be r14,r0,800945c *endptr = end; 8009454: 2b 81 00 18 lw r1,(sp+24) 8009458: 59 c1 00 00 sw (r14+0),r1 /* nothing was converted */ if ( end == s ) 800945c: 2b 81 00 18 lw r1,(sp+24) return RTEMS_NOT_DEFINED; 8009460: 34 04 00 0b mvi r4,11 /* If the user wants the end pointer back, then return it. */ if ( endptr ) *endptr = end; /* nothing was converted */ if ( end == s ) 8009464: 44 2d 00 0a be r1,r13,800948c return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 8009468: 34 01 ff ff mvi r1,-1 800946c: 5d 81 00 06 bne r12,r1,8009484 <== ALWAYS TAKEN 8009470: f8 00 10 06 calli 800d488 <__errno> <== NOT EXECUTED 8009474: 28 22 00 00 lw r2,(r1+0) <== NOT EXECUTED 8009478: 34 01 00 22 mvi r1,34 <== NOT EXECUTED return RTEMS_INVALID_NUMBER; 800947c: 34 04 00 0a mvi r4,10 <== NOT EXECUTED return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 8009480: 44 41 00 03 be r2,r1,800948c <== NOT EXECUTED if ( (result == STRING_TO_MIN) && (errno == ERANGE)) return RTEMS_INVALID_NUMBER; #endif #if defined(STRING_TO_POINTER) *n = (STRING_TO_TYPE) (uintptr_t)result; 8009484: 59 6c 00 00 sw (r11+0),r12 #else *n = (STRING_TO_TYPE) result; #endif return RTEMS_SUCCESSFUL; 8009488: 34 04 00 00 mvi r4,0 } 800948c: b8 80 08 00 mv r1,r4 8009490: 2b 9d 00 04 lw ra,(sp+4) 8009494: 2b 8b 00 14 lw r11,(sp+20) 8009498: 2b 8c 00 10 lw r12,(sp+16) 800949c: 2b 8d 00 0c lw r13,(sp+12) 80094a0: 2b 8e 00 08 lw r14,(sp+8) 80094a4: 37 9c 00 18 addi sp,sp,24 80094a8: c3 a0 00 00 ret =============================================================================== 0800953c : #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 800953c: 37 9c ff e8 addi sp,sp,-24 8009540: 5b 8b 00 14 sw (sp+20),r11 8009544: 5b 8c 00 10 sw (sp+16),r12 8009548: 5b 8d 00 0c sw (sp+12),r13 800954c: 5b 8e 00 08 sw (sp+8),r14 8009550: 5b 9d 00 04 sw (sp+4),ra STRING_TO_INPUT_TYPE result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 8009554: 34 05 00 09 mvi r5,9 #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 8009558: b8 20 68 00 mv r13,r1 800955c: b8 40 58 00 mv r11,r2 8009560: b8 60 70 00 mv r14,r3 8009564: b8 80 60 00 mv r12,r4 STRING_TO_INPUT_TYPE result; char *end; if ( !n ) 8009568: 44 40 00 18 be r2,r0,80095c8 return RTEMS_INVALID_ADDRESS; errno = 0; 800956c: f8 00 0f c7 calli 800d488 <__errno> 8009570: 58 20 00 00 sw (r1+0),r0 #ifdef STRING_TO_FLOAT result = STRING_TO_METHOD( s, &end ); #elif defined(STRING_TO_POINTER) result = STRING_TO_METHOD( s, &end, 16 ); #elif defined(STRING_TO_INTEGER) result = STRING_TO_METHOD( s, &end, base ); 8009574: b9 80 18 00 mv r3,r12 if ( !n ) return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; 8009578: 59 60 00 00 sw (r11+0),r0 #ifdef STRING_TO_FLOAT result = STRING_TO_METHOD( s, &end ); #elif defined(STRING_TO_POINTER) result = STRING_TO_METHOD( s, &end, 16 ); #elif defined(STRING_TO_INTEGER) result = STRING_TO_METHOD( s, &end, base ); 800957c: b9 a0 08 00 mv r1,r13 8009580: 37 82 00 18 addi r2,sp,24 8009584: f8 00 1d 04 calli 8010994 8009588: b8 20 60 00 mv r12,r1 #endif /* If the user wants the end pointer back, then return it. */ if ( endptr ) 800958c: 45 c0 00 03 be r14,r0,8009598 *endptr = end; 8009590: 2b 81 00 18 lw r1,(sp+24) 8009594: 59 c1 00 00 sw (r14+0),r1 /* nothing was converted */ if ( end == s ) 8009598: 2b 81 00 18 lw r1,(sp+24) return RTEMS_NOT_DEFINED; 800959c: 34 05 00 0b mvi r5,11 /* If the user wants the end pointer back, then return it. */ if ( endptr ) *endptr = end; /* nothing was converted */ if ( end == s ) 80095a0: 44 2d 00 0a be r1,r13,80095c8 return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 80095a4: 34 01 ff ff mvi r1,-1 80095a8: 5d 81 00 06 bne r12,r1,80095c0 80095ac: f8 00 0f b7 calli 800d488 <__errno> 80095b0: 28 22 00 00 lw r2,(r1+0) 80095b4: 34 01 00 22 mvi r1,34 return RTEMS_INVALID_NUMBER; 80095b8: 34 05 00 0a mvi r5,10 return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 80095bc: 44 41 00 03 be r2,r1,80095c8 <== ALWAYS TAKEN #endif #if defined(STRING_TO_POINTER) *n = (STRING_TO_TYPE) (uintptr_t)result; #else *n = (STRING_TO_TYPE) result; 80095c0: 59 6c 00 00 sw (r11+0),r12 #endif return RTEMS_SUCCESSFUL; 80095c4: 34 05 00 00 mvi r5,0 } 80095c8: b8 a0 08 00 mv r1,r5 80095cc: 2b 9d 00 04 lw ra,(sp+4) 80095d0: 2b 8b 00 14 lw r11,(sp+20) 80095d4: 2b 8c 00 10 lw r12,(sp+16) 80095d8: 2b 8d 00 0c lw r13,(sp+12) 80095dc: 2b 8e 00 08 lw r14,(sp+8) 80095e0: 37 9c 00 18 addi sp,sp,24 80095e4: c3 a0 00 00 ret =============================================================================== 080096ac : #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 80096ac: 37 9c ff e8 addi sp,sp,-24 80096b0: 5b 8b 00 14 sw (sp+20),r11 80096b4: 5b 8c 00 10 sw (sp+16),r12 80096b8: 5b 8d 00 0c sw (sp+12),r13 80096bc: 5b 8e 00 08 sw (sp+8),r14 80096c0: 5b 9d 00 04 sw (sp+4),ra STRING_TO_INPUT_TYPE result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 80096c4: 34 05 00 09 mvi r5,9 #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 80096c8: b8 20 68 00 mv r13,r1 80096cc: b8 40 58 00 mv r11,r2 80096d0: b8 60 70 00 mv r14,r3 80096d4: b8 80 60 00 mv r12,r4 STRING_TO_INPUT_TYPE result; char *end; if ( !n ) 80096d8: 44 40 00 18 be r2,r0,8009738 return RTEMS_INVALID_ADDRESS; errno = 0; 80096dc: f8 00 0f 6b calli 800d488 <__errno> 80096e0: 58 20 00 00 sw (r1+0),r0 #ifdef STRING_TO_FLOAT result = STRING_TO_METHOD( s, &end ); #elif defined(STRING_TO_POINTER) result = STRING_TO_METHOD( s, &end, 16 ); #elif defined(STRING_TO_INTEGER) result = STRING_TO_METHOD( s, &end, base ); 80096e4: b9 80 18 00 mv r3,r12 if ( !n ) return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; 80096e8: 59 60 00 00 sw (r11+0),r0 #ifdef STRING_TO_FLOAT result = STRING_TO_METHOD( s, &end ); #elif defined(STRING_TO_POINTER) result = STRING_TO_METHOD( s, &end, 16 ); #elif defined(STRING_TO_INTEGER) result = STRING_TO_METHOD( s, &end, base ); 80096ec: b9 a0 08 00 mv r1,r13 80096f0: 37 82 00 18 addi r2,sp,24 80096f4: f8 00 1c a8 calli 8010994 80096f8: b8 20 60 00 mv r12,r1 #endif /* If the user wants the end pointer back, then return it. */ if ( endptr ) 80096fc: 45 c0 00 03 be r14,r0,8009708 *endptr = end; 8009700: 2b 81 00 18 lw r1,(sp+24) 8009704: 59 c1 00 00 sw (r14+0),r1 /* nothing was converted */ if ( end == s ) 8009708: 2b 81 00 18 lw r1,(sp+24) return RTEMS_NOT_DEFINED; 800970c: 34 05 00 0b mvi r5,11 /* If the user wants the end pointer back, then return it. */ if ( endptr ) *endptr = end; /* nothing was converted */ if ( end == s ) 8009710: 44 2d 00 0a be r1,r13,8009738 return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 8009714: 34 01 ff ff mvi r1,-1 8009718: 5d 81 00 06 bne r12,r1,8009730 800971c: f8 00 0f 5b calli 800d488 <__errno> 8009720: 28 22 00 00 lw r2,(r1+0) 8009724: 34 01 00 22 mvi r1,34 return RTEMS_INVALID_NUMBER; 8009728: 34 05 00 0a mvi r5,10 return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 800972c: 44 41 00 03 be r2,r1,8009738 <== ALWAYS TAKEN #endif #if defined(STRING_TO_POINTER) *n = (STRING_TO_TYPE) (uintptr_t)result; #else *n = (STRING_TO_TYPE) result; 8009730: 59 6c 00 00 sw (r11+0),r12 #endif return RTEMS_SUCCESSFUL; 8009734: 34 05 00 00 mvi r5,0 } 8009738: b8 a0 08 00 mv r1,r5 800973c: 2b 9d 00 04 lw ra,(sp+4) 8009740: 2b 8b 00 14 lw r11,(sp+20) 8009744: 2b 8c 00 10 lw r12,(sp+16) 8009748: 2b 8d 00 0c lw r13,(sp+12) 800974c: 2b 8e 00 08 lw r14,(sp+8) 8009750: 37 9c 00 18 addi sp,sp,24 8009754: c3 a0 00 00 ret =============================================================================== 080095e8 : #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 80095e8: 37 9c ff e4 addi sp,sp,-28 80095ec: 5b 8b 00 18 sw (sp+24),r11 80095f0: 5b 8c 00 14 sw (sp+20),r12 80095f4: 5b 8d 00 10 sw (sp+16),r13 80095f8: 5b 8e 00 0c sw (sp+12),r14 80095fc: 5b 8f 00 08 sw (sp+8),r15 8009600: 5b 9d 00 04 sw (sp+4),ra STRING_TO_INPUT_TYPE result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 8009604: 34 05 00 09 mvi r5,9 #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 8009608: b8 20 70 00 mv r14,r1 800960c: b8 40 58 00 mv r11,r2 8009610: b8 60 78 00 mv r15,r3 8009614: b8 80 60 00 mv r12,r4 STRING_TO_INPUT_TYPE result; char *end; if ( !n ) 8009618: 44 40 00 1c be r2,r0,8009688 return RTEMS_INVALID_ADDRESS; errno = 0; 800961c: f8 00 0f 9b calli 800d488 <__errno> 8009620: 58 20 00 00 sw (r1+0),r0 #ifdef STRING_TO_FLOAT result = STRING_TO_METHOD( s, &end ); #elif defined(STRING_TO_POINTER) result = STRING_TO_METHOD( s, &end, 16 ); #elif defined(STRING_TO_INTEGER) result = STRING_TO_METHOD( s, &end, base ); 8009624: b9 80 18 00 mv r3,r12 if ( !n ) return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; 8009628: 59 60 00 00 sw (r11+0),r0 800962c: 59 60 00 04 sw (r11+4),r0 #ifdef STRING_TO_FLOAT result = STRING_TO_METHOD( s, &end ); #elif defined(STRING_TO_POINTER) result = STRING_TO_METHOD( s, &end, 16 ); #elif defined(STRING_TO_INTEGER) result = STRING_TO_METHOD( s, &end, base ); 8009630: b9 c0 08 00 mv r1,r14 8009634: 37 82 00 1c addi r2,sp,28 8009638: f8 00 1c e5 calli 80109cc 800963c: b8 20 60 00 mv r12,r1 8009640: b8 40 68 00 mv r13,r2 #endif /* If the user wants the end pointer back, then return it. */ if ( endptr ) 8009644: 45 e0 00 03 be r15,r0,8009650 *endptr = end; 8009648: 2b 81 00 1c lw r1,(sp+28) 800964c: 59 e1 00 00 sw (r15+0),r1 /* nothing was converted */ if ( end == s ) 8009650: 2b 81 00 1c lw r1,(sp+28) return RTEMS_NOT_DEFINED; 8009654: 34 05 00 0b mvi r5,11 /* If the user wants the end pointer back, then return it. */ if ( endptr ) *endptr = end; /* nothing was converted */ if ( end == s ) 8009658: 44 2e 00 0c be r1,r14,8009688 return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 800965c: 34 01 ff ff mvi r1,-1 8009660: 5d 81 00 07 bne r12,r1,800967c 8009664: 5d ac 00 06 bne r13,r12,800967c <== NEVER TAKEN 8009668: f8 00 0f 88 calli 800d488 <__errno> 800966c: 28 22 00 00 lw r2,(r1+0) 8009670: 34 01 00 22 mvi r1,34 return RTEMS_INVALID_NUMBER; 8009674: 34 05 00 0a mvi r5,10 return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 8009678: 44 41 00 04 be r2,r1,8009688 <== ALWAYS TAKEN #endif #if defined(STRING_TO_POINTER) *n = (STRING_TO_TYPE) (uintptr_t)result; #else *n = (STRING_TO_TYPE) result; 800967c: 59 6c 00 00 sw (r11+0),r12 8009680: 59 6d 00 04 sw (r11+4),r13 #endif return RTEMS_SUCCESSFUL; 8009684: 34 05 00 00 mvi r5,0 } 8009688: b8 a0 08 00 mv r1,r5 800968c: 2b 9d 00 04 lw ra,(sp+4) 8009690: 2b 8b 00 18 lw r11,(sp+24) 8009694: 2b 8c 00 14 lw r12,(sp+20) 8009698: 2b 8d 00 10 lw r13,(sp+16) 800969c: 2b 8e 00 0c lw r14,(sp+12) 80096a0: 2b 8f 00 08 lw r15,(sp+8) 80096a4: 37 9c 00 1c addi sp,sp,28 80096a8: c3 a0 00 00 ret =============================================================================== 08000ec0 : int rtems_tarfs_load( char *mountpoint, uint8_t *tar_image, size_t tar_size ) { 8000ec0: 37 9c fe 20 addi sp,sp,-480 8000ec4: 5b 8b 00 44 sw (sp+68),r11 8000ec8: 5b 8c 00 40 sw (sp+64),r12 8000ecc: 5b 8d 00 3c sw (sp+60),r13 8000ed0: 5b 8e 00 38 sw (sp+56),r14 8000ed4: 5b 8f 00 34 sw (sp+52),r15 8000ed8: 5b 90 00 30 sw (sp+48),r16 8000edc: 5b 91 00 2c sw (sp+44),r17 8000ee0: 5b 92 00 28 sw (sp+40),r18 8000ee4: 5b 93 00 24 sw (sp+36),r19 8000ee8: 5b 94 00 20 sw (sp+32),r20 8000eec: 5b 95 00 1c sw (sp+28),r21 8000ef0: 5b 96 00 18 sw (sp+24),r22 8000ef4: 5b 97 00 14 sw (sp+20),r23 8000ef8: 5b 98 00 10 sw (sp+16),r24 8000efc: 5b 99 00 0c sw (sp+12),r25 8000f00: 5b 9b 00 08 sw (sp+8),fp 8000f04: 5b 9d 00 04 sw (sp+4),ra 8000f08: b8 20 98 00 mv r19,r1 8000f0c: b8 40 a0 00 mv r20,r2 8000f10: 5b 83 00 50 sw (sp+80),r3 int offset; unsigned long nblocks; IMFS_jnode_t *node; int status; status = rtems_filesystem_evaluate_path( 8000f14: f8 00 43 50 calli 8011c54 8000f18: b8 20 10 00 mv r2,r1 8000f1c: 34 03 00 00 mvi r3,0 8000f20: ba 60 08 00 mv r1,r19 8000f24: 37 84 01 cc addi r4,sp,460 8000f28: 34 05 00 00 mvi r5,0 8000f2c: f8 00 03 3d calli 8001c20 8000f30: b8 20 60 00 mv r12,r1 strlen(mountpoint), 0, &root_loc, 0 ); if (status != 0) 8000f34: 5c 20 00 71 bne r1,r0,80010f8 return -1; if (root_loc.ops != &IMFS_ops && root_loc.ops != &fifoIMFS_ops) 8000f38: 2b 81 01 d8 lw r1,(sp+472) 8000f3c: 78 04 08 02 mvhi r4,0x802 8000f40: 38 84 13 48 ori r4,r4,0x1348 8000f44: 34 0b 00 00 mvi r11,0 8000f48: 44 24 00 08 be r1,r4,8000f68 8000f4c: 78 04 08 02 mvhi r4,0x802 8000f50: 38 84 1b c0 ori r4,r4,0x1bc0 8000f54: b9 80 58 00 mv r11,r12 8000f58: 5c 24 00 68 bne r1,r4,80010f8 <== ALWAYS TAKEN 8000f5c: e0 00 00 03 bi 8000f68 <== NOT EXECUTED 8000f60: b9 c0 58 00 mv r11,r14 8000f64: e0 00 00 0c bi 8000f94 /* * Read a header. */ hdr_ptr = (char *) &tar_image[offset]; offset += 512; if (strncmp(&hdr_ptr[257], "ustar", 5)) 8000f68: 78 11 08 02 mvhi r17,0x802 * - 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, "/"); 8000f6c: 78 0f 08 01 mvhi r15,0x801 /* * Read a header. */ hdr_ptr = (char *) &tar_image[offset]; offset += 512; if (strncmp(&hdr_ptr[257], "ustar", 5)) 8000f70: 3a 31 13 90 ori r17,r17,0x1390 break; strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE); 8000f74: 37 90 01 54 addi r16,sp,340 * 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) { 8000f78: 34 1b 00 30 mvi fp,48 const char *name; loc = root_loc; if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) { 8000f7c: 37 92 01 b8 addi r18,sp,440 ); node->info.linearfile.size = file_size; node->info.linearfile.direct = &tar_image[offset]; } nblocks = (((file_size) + 511) & ~511) / 512; 8000f80: 34 19 fe 00 mvi r25,-512 * - 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); 8000f84: 37 8d 00 54 addi r13,sp,84 if (full_filename[strlen(full_filename)-1] != '/') 8000f88: 37 98 00 53 addi r24,sp,83 8000f8c: 34 17 00 2f mvi r23,47 strcat(full_filename, "/"); 8000f90: 39 ef e7 e4 ori r15,r15,0xe7e4 /* * Create an IMFS node structure pointing to tar image memory. */ offset = 0; while (1) { if (offset + 512 > tar_size) 8000f94: 2b 81 00 50 lw r1,(sp+80) 8000f98: 35 6e 02 00 addi r14,r11,512 8000f9c: 55 c1 00 58 bgu r14,r1,80010fc <== NEVER TAKEN break; /* * Read a header. */ hdr_ptr = (char *) &tar_image[offset]; 8000fa0: b6 8b 58 00 add r11,r20,r11 offset += 512; if (strncmp(&hdr_ptr[257], "ustar", 5)) 8000fa4: 35 61 01 01 addi r1,r11,257 8000fa8: ba 20 10 00 mv r2,r17 8000fac: 34 03 00 05 mvi r3,5 8000fb0: f8 00 43 58 calli 8011d10 8000fb4: 5c 20 00 52 bne r1,r0,80010fc <== NEVER TAKEN break; strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE); 8000fb8: 34 03 00 63 mvi r3,99 8000fbc: b9 60 10 00 mv r2,r11 8000fc0: ba 00 08 00 mv r1,r16 8000fc4: f8 00 43 a0 calli 8011e44 filename[MAX_NAME_FIELD_SIZE] = '\0'; linkflag = hdr_ptr[156]; file_mode = _rtems_octal2ulong(&hdr_ptr[100], 8); 8000fc8: 34 02 00 08 mvi r2,8 offset += 512; if (strncmp(&hdr_ptr[257], "ustar", 5)) break; strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE); filename[MAX_NAME_FIELD_SIZE] = '\0'; 8000fcc: 33 80 01 b7 sb (sp+439),r0 linkflag = hdr_ptr[156]; file_mode = _rtems_octal2ulong(&hdr_ptr[100], 8); 8000fd0: 35 61 00 64 addi r1,r11,100 break; strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE); filename[MAX_NAME_FIELD_SIZE] = '\0'; linkflag = hdr_ptr[156]; 8000fd4: 41 76 00 9c lbu r22,(r11+156) file_mode = _rtems_octal2ulong(&hdr_ptr[100], 8); 8000fd8: f8 00 1a 12 calli 8007820 <_rtems_octal2ulong> 8000fdc: 5b 81 00 4c sw (sp+76),r1 file_size = _rtems_octal2ulong(&hdr_ptr[124], 12); 8000fe0: 34 02 00 0c mvi r2,12 8000fe4: 35 61 00 7c addi r1,r11,124 8000fe8: f8 00 1a 0e calli 8007820 <_rtems_octal2ulong> hdr_chksum = _rtems_octal2ulong(&hdr_ptr[148], 8); 8000fec: 34 02 00 08 mvi r2,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); 8000ff0: b8 20 a8 00 mv r21,r1 hdr_chksum = _rtems_octal2ulong(&hdr_ptr[148], 8); 8000ff4: 35 61 00 94 addi r1,r11,148 8000ff8: f8 00 1a 0a calli 8007820 <_rtems_octal2ulong> 8000ffc: b8 20 10 00 mv r2,r1 if (_rtems_tar_header_checksum(hdr_ptr) != hdr_chksum) 8001000: b9 60 08 00 mv r1,r11 8001004: 5b 82 00 48 sw (sp+72),r2 8001008: f8 00 1a 25 calli 800789c <_rtems_tar_header_checksum> 800100c: 2b 82 00 48 lw r2,(sp+72) 8001010: 5c 22 00 3b bne r1,r2,80010fc <== 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) { 8001014: 34 01 00 35 mvi r1,53 8001018: 5e c1 00 13 bne r22,r1,8001064 strcpy(full_filename, mountpoint); 800101c: ba 60 10 00 mv r2,r19 8001020: b9 a0 08 00 mv r1,r13 8001024: f8 00 41 d8 calli 8011784 if (full_filename[strlen(full_filename)-1] != '/') 8001028: b9 a0 08 00 mv r1,r13 800102c: f8 00 43 0a calli 8011c54 8001030: b7 01 08 00 add r1,r24,r1 8001034: 40 21 00 00 lbu r1,(r1+0) 8001038: 44 37 00 04 be r1,r23,8001048 <== ALWAYS TAKEN strcat(full_filename, "/"); 800103c: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED 8001040: b9 e0 10 00 mv r2,r15 <== NOT EXECUTED 8001044: f8 00 41 79 calli 8011628 <== NOT EXECUTED strcat(full_filename, filename); 8001048: ba 00 10 00 mv r2,r16 800104c: b9 a0 08 00 mv r1,r13 8001050: f8 00 41 76 calli 8011628 mkdir(full_filename, S_IRWXU | S_IRWXG | S_IRWXO); 8001054: b9 a0 08 00 mv r1,r13 8001058: 34 02 01 ff mvi r2,511 800105c: f8 00 05 9b calli 80026c8 8001060: e3 ff ff c0 bi 8000f60 * 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) { 8001064: 5e db ff bf bne r22,fp,8000f60 <== NEVER TAKEN const char *name; loc = root_loc; 8001068: 2b 81 01 cc lw r1,(sp+460) if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) { 800106c: ba 40 10 00 mv r2,r18 8001070: 37 83 01 e0 addi r3,sp,480 * should not have this path. */ else if (linkflag == REGTYPE) { const char *name; loc = root_loc; 8001074: 5b 81 01 b8 sw (sp+440),r1 8001078: 2b 81 01 d0 lw r1,(sp+464) 800107c: 5b 81 01 bc sw (sp+444),r1 8001080: 2b 81 01 d4 lw r1,(sp+468) 8001084: 5b 81 01 c0 sw (sp+448),r1 8001088: 2b 81 01 d8 lw r1,(sp+472) 800108c: 5b 81 01 c4 sw (sp+452),r1 8001090: 2b 81 01 dc lw r1,(sp+476) 8001094: 5b 81 01 c8 sw (sp+456),r1 if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) { 8001098: ba 00 08 00 mv r1,r16 800109c: f8 00 1d bd calli 8008790 80010a0: 5c 20 00 0e bne r1,r0,80010d8 <== NEVER TAKEN node = IMFS_create_node( &loc, IMFS_LINEAR_FILE, (char *)name, (file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG, 80010a4: 2b 81 00 4c lw r1,(sp+76) else if (linkflag == REGTYPE) { const char *name; loc = root_loc; if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) { node = IMFS_create_node( 80010a8: 2b 83 01 e0 lw r3,(sp+480) 80010ac: 34 02 00 06 mvi r2,6 &loc, IMFS_LINEAR_FILE, (char *)name, (file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG, 80010b0: 20 24 01 ff andi r4,r1,0x1ff else if (linkflag == REGTYPE) { const char *name; loc = root_loc; if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) { node = IMFS_create_node( 80010b4: 38 84 80 00 ori r4,r4,0x8000 80010b8: ba 40 08 00 mv r1,r18 80010bc: 34 05 00 00 mvi r5,0 80010c0: f8 00 1b c2 calli 8007fc8 80010c4: b8 20 20 00 mv r4,r1 &loc, IMFS_LINEAR_FILE, (char *)name, (file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG, NULL ); node->info.linearfile.size = file_size; 80010c8: 58 20 00 50 sw (r1+80),r0 80010cc: 58 35 00 54 sw (r1+84),r21 node->info.linearfile.direct = &tar_image[offset]; 80010d0: b6 8e 08 00 add r1,r20,r14 80010d4: 58 81 00 58 sw (r4+88),r1 } nblocks = (((file_size) + 511) & ~511) / 512; 80010d8: 36 a1 01 ff addi r1,r21,511 80010dc: 34 02 00 09 mvi r2,9 80010e0: a0 39 08 00 and r1,r1,r25 80010e4: f8 00 73 22 calli 801dd6c <__lshrsi3> offset += 512 * nblocks; 80010e8: 34 02 00 09 mvi r2,9 80010ec: f8 00 72 d2 calli 801dc34 <__ashlsi3> 80010f0: b4 2e 70 00 add r14,r1,r14 80010f4: e3 ff ff 9b bi 8000f60 ); if (status != 0) return -1; if (root_loc.ops != &IMFS_ops && root_loc.ops != &fifoIMFS_ops) return -1; 80010f8: 34 0c ff ff mvi r12,-1 nblocks = (((file_size) + 511) & ~511) / 512; offset += 512 * nblocks; } } return status; } 80010fc: b9 80 08 00 mv r1,r12 8001100: 2b 9d 00 04 lw ra,(sp+4) 8001104: 2b 8b 00 44 lw r11,(sp+68) 8001108: 2b 8c 00 40 lw r12,(sp+64) 800110c: 2b 8d 00 3c lw r13,(sp+60) 8001110: 2b 8e 00 38 lw r14,(sp+56) 8001114: 2b 8f 00 34 lw r15,(sp+52) 8001118: 2b 90 00 30 lw r16,(sp+48) 800111c: 2b 91 00 2c lw r17,(sp+44) 8001120: 2b 92 00 28 lw r18,(sp+40) 8001124: 2b 93 00 24 lw r19,(sp+36) 8001128: 2b 94 00 20 lw r20,(sp+32) 800112c: 2b 95 00 1c lw r21,(sp+28) 8001130: 2b 96 00 18 lw r22,(sp+24) 8001134: 2b 97 00 14 lw r23,(sp+20) 8001138: 2b 98 00 10 lw r24,(sp+16) 800113c: 2b 99 00 0c lw r25,(sp+12) 8001140: 2b 9b 00 08 lw fp,(sp+8) 8001144: 37 9c 01 e0 addi sp,sp,480 8001148: c3 a0 00 00 ret =============================================================================== 0800df0c : rtems_status_code rtems_task_mode( rtems_mode mode_set, rtems_mode mask, rtems_mode *previous_mode_set ) { 800df0c: 37 9c ff e0 addi sp,sp,-32 800df10: 5b 8b 00 20 sw (sp+32),r11 800df14: 5b 8c 00 1c sw (sp+28),r12 800df18: 5b 8d 00 18 sw (sp+24),r13 800df1c: 5b 8e 00 14 sw (sp+20),r14 800df20: 5b 8f 00 10 sw (sp+16),r15 800df24: 5b 90 00 0c sw (sp+12),r16 800df28: 5b 91 00 08 sw (sp+8),r17 800df2c: 5b 9d 00 04 sw (sp+4),ra bool is_asr_enabled = false; bool needs_asr_dispatching = false; rtems_mode old_mode; if ( !previous_mode_set ) return RTEMS_INVALID_ADDRESS; 800df30: 34 04 00 09 mvi r4,9 rtems_status_code rtems_task_mode( rtems_mode mode_set, rtems_mode mask, rtems_mode *previous_mode_set ) { 800df34: b8 20 68 00 mv r13,r1 800df38: b8 40 70 00 mv r14,r2 800df3c: b8 60 80 00 mv r16,r3 ASR_Information *asr; bool is_asr_enabled = false; bool needs_asr_dispatching = false; rtems_mode old_mode; if ( !previous_mode_set ) 800df40: 44 60 00 51 be r3,r0,800e084 return RTEMS_INVALID_ADDRESS; executing = _Thread_Executing; 800df44: 78 01 08 01 mvhi r1,0x801 800df48: 38 21 9e 2c ori r1,r1,0x9e2c 800df4c: 28 2c 00 0c lw r12,(r1+12) api = executing->API_Extensions[ THREAD_API_RTEMS ]; asr = &api->Signal; old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT; 800df50: 41 8f 00 74 lbu r15,(r12+116) if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE ) 800df54: 29 81 00 7c lw r1,(r12+124) if ( !previous_mode_set ) return RTEMS_INVALID_ADDRESS; executing = _Thread_Executing; api = executing->API_Extensions[ THREAD_API_RTEMS ]; 800df58: 29 8b 01 1c lw r11,(r12+284) asr = &api->Signal; old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT; 800df5c: 65 ef 00 00 cmpei r15,r15,0 800df60: c8 0f 78 00 sub r15,r0,r15 800df64: 21 ef 01 00 andi r15,r15,0x100 if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE ) 800df68: 44 20 00 02 be r1,r0,800df70 old_mode |= RTEMS_NO_TIMESLICE; else old_mode |= RTEMS_TIMESLICE; 800df6c: 39 ef 02 00 ori r15,r15,0x200 old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR; 800df70: 41 71 00 08 lbu r17,(r11+8) old_mode |= _ISR_Get_level(); 800df74: fb ff e7 f8 calli 8007f54 <_CPU_ISR_Get_level> if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE ) old_mode |= RTEMS_NO_TIMESLICE; else old_mode |= RTEMS_TIMESLICE; old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR; 800df78: 66 31 00 00 cmpei r17,r17,0 800df7c: c8 11 88 00 sub r17,r0,r17 800df80: 22 31 04 00 andi r17,r17,0x400 800df84: ba 21 08 00 or r1,r17,r1 old_mode |= _ISR_Get_level(); 800df88: b8 2f 78 00 or r15,r1,r15 *previous_mode_set = old_mode; 800df8c: 5a 0f 00 00 sw (r16+0),r15 /* * These are generic thread scheduling characteristics. */ if ( mask & RTEMS_PREEMPT_MASK ) 800df90: 21 c1 01 00 andi r1,r14,0x100 800df94: 44 20 00 04 be r1,r0,800dfa4 */ RTEMS_INLINE_ROUTINE bool _Modes_Is_preempt ( Modes_Control mode_set ) { return (mode_set & RTEMS_PREEMPT_MASK) == RTEMS_PREEMPT; 800df98: 21 a1 01 00 andi r1,r13,0x100 executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false; 800df9c: 64 21 00 00 cmpei r1,r1,0 800dfa0: 31 81 00 74 sb (r12+116),r1 if ( mask & RTEMS_TIMESLICE_MASK ) { 800dfa4: 21 c1 02 00 andi r1,r14,0x200 800dfa8: 44 20 00 0b be r1,r0,800dfd4 */ RTEMS_INLINE_ROUTINE bool _Modes_Is_timeslice ( Modes_Control mode_set ) { return (mode_set & RTEMS_TIMESLICE_MASK) == RTEMS_TIMESLICE; 800dfac: 21 a1 02 00 andi r1,r13,0x200 if ( _Modes_Is_timeslice(mode_set) ) { 800dfb0: 44 20 00 08 be r1,r0,800dfd0 executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; 800dfb4: 34 01 00 01 mvi r1,1 800dfb8: 59 81 00 7c sw (r12+124),r1 executing->cpu_time_budget = _Thread_Ticks_per_timeslice; 800dfbc: 78 01 08 01 mvhi r1,0x801 800dfc0: 38 21 98 f8 ori r1,r1,0x98f8 800dfc4: 28 21 00 00 lw r1,(r1+0) 800dfc8: 59 81 00 78 sw (r12+120),r1 800dfcc: e0 00 00 02 bi 800dfd4 } else executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; 800dfd0: 59 80 00 7c sw (r12+124),r0 } /* * Set the new interrupt level */ if ( mask & RTEMS_INTERRUPT_MASK ) 800dfd4: 21 c1 00 01 andi r1,r14,0x1 800dfd8: 44 20 00 04 be r1,r0,800dfe8 */ RTEMS_INLINE_ROUTINE ISR_Level _Modes_Get_interrupt_level ( Modes_Control mode_set ) { return ( mode_set & RTEMS_INTERRUPT_MASK ); 800dfdc: 21 a1 00 01 andi r1,r13,0x1 */ RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level ( Modes_Control mode_set ) { _ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) ); 800dfe0: 64 21 00 00 cmpei r1,r1,0 800dfe4: d0 01 00 00 wcsr IE,r1 * This is specific to the RTEMS API */ is_asr_enabled = false; needs_asr_dispatching = false; if ( mask & RTEMS_ASR_MASK ) { 800dfe8: 21 ce 04 00 andi r14,r14,0x400 /* * This is specific to the RTEMS API */ is_asr_enabled = false; needs_asr_dispatching = false; 800dfec: 34 03 00 00 mvi r3,0 if ( mask & RTEMS_ASR_MASK ) { 800dff0: 45 c0 00 11 be r14,r0,800e034 */ RTEMS_INLINE_ROUTINE bool _Modes_Is_asr_disabled ( Modes_Control mode_set ) { return (mode_set & RTEMS_ASR_MASK) == RTEMS_NO_ASR; 800dff4: 21 ad 04 00 andi r13,r13,0x400 is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true; if ( is_asr_enabled != asr->is_enabled ) { 800dff8: 41 61 00 08 lbu r1,(r11+8) * Output: * *previous_mode_set - previous mode set * always return RTEMS_SUCCESSFUL; */ rtems_status_code rtems_task_mode( 800dffc: 65 ad 00 00 cmpei r13,r13,0 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 ) { 800e000: 44 2d 00 0d be r1,r13,800e034 asr->is_enabled = is_asr_enabled; 800e004: 31 6d 00 08 sb (r11+8),r13 ) { rtems_signal_set _signals; ISR_Level _level; _ISR_Disable( _level ); 800e008: 90 00 08 00 rcsr r1,IE 800e00c: 34 02 ff fe mvi r2,-2 800e010: a0 22 10 00 and r2,r1,r2 800e014: d0 02 00 00 wcsr IE,r2 _signals = information->signals_pending; 800e018: 29 62 00 18 lw r2,(r11+24) information->signals_pending = information->signals_posted; 800e01c: 29 63 00 14 lw r3,(r11+20) information->signals_posted = _signals; 800e020: 59 62 00 14 sw (r11+20),r2 rtems_signal_set _signals; ISR_Level _level; _ISR_Disable( _level ); _signals = information->signals_pending; information->signals_pending = information->signals_posted; 800e024: 59 63 00 18 sw (r11+24),r3 information->signals_posted = _signals; _ISR_Enable( _level ); 800e028: d0 01 00 00 wcsr IE,r1 _ASR_Swap_signals( asr ); if ( _ASR_Are_signals_pending( asr ) ) { 800e02c: 29 63 00 14 lw r3,(r11+20) /* * This is specific to the RTEMS API */ is_asr_enabled = false; needs_asr_dispatching = false; 800e030: 7c 63 00 00 cmpnei r3,r3,0 needs_asr_dispatching = true; } } } if ( _System_state_Is_up( _System_state_Get() ) ) { 800e034: 78 01 08 01 mvhi r1,0x801 800e038: 38 21 9a d8 ori r1,r1,0x9ad8 800e03c: 28 22 00 00 lw r2,(r1+0) 800e040: 34 01 00 03 mvi r1,3 if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) ) _Thread_Dispatch(); } return RTEMS_SUCCESSFUL; 800e044: 34 04 00 00 mvi r4,0 needs_asr_dispatching = true; } } } if ( _System_state_Is_up( _System_state_Get() ) ) { 800e048: 5c 41 00 0f bne r2,r1,800e084 <== NEVER TAKEN bool are_signals_pending ) { Thread_Control *executing; executing = _Thread_Executing; 800e04c: 78 01 08 01 mvhi r1,0x801 800e050: 38 21 9e 2c ori r1,r1,0x9e2c 800e054: 28 22 00 0c lw r2,(r1+12) if ( are_signals_pending || 800e058: 5c 60 00 05 bne r3,r0,800e06c 800e05c: 28 21 00 10 lw r1,(r1+16) 800e060: 44 41 00 09 be r2,r1,800e084 (!_Thread_Is_heir( executing ) && executing->is_preemptible) ) { 800e064: 40 41 00 74 lbu r1,(r2+116) 800e068: 44 20 00 07 be r1,r0,800e084 <== NEVER TAKEN _Thread_Dispatch_necessary = true; 800e06c: 78 01 08 01 mvhi r1,0x801 800e070: 38 21 9e 2c ori r1,r1,0x9e2c 800e074: 34 02 00 01 mvi r2,1 800e078: 30 22 00 18 sb (r1+24),r2 if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) ) _Thread_Dispatch(); 800e07c: fb ff e1 cf calli 80067b8 <_Thread_Dispatch> } return RTEMS_SUCCESSFUL; 800e080: 34 04 00 00 mvi r4,0 } 800e084: b8 80 08 00 mv r1,r4 800e088: 2b 9d 00 04 lw ra,(sp+4) 800e08c: 2b 8b 00 20 lw r11,(sp+32) 800e090: 2b 8c 00 1c lw r12,(sp+28) 800e094: 2b 8d 00 18 lw r13,(sp+24) 800e098: 2b 8e 00 14 lw r14,(sp+20) 800e09c: 2b 8f 00 10 lw r15,(sp+16) 800e0a0: 2b 90 00 0c lw r16,(sp+12) 800e0a4: 2b 91 00 08 lw r17,(sp+8) 800e0a8: 37 9c 00 20 addi sp,sp,32 800e0ac: c3 a0 00 00 ret =============================================================================== 0800849c : rtems_status_code rtems_task_set_priority( rtems_id id, rtems_task_priority new_priority, rtems_task_priority *old_priority ) { 800849c: 37 9c ff f0 addi sp,sp,-16 80084a0: 5b 8b 00 0c sw (sp+12),r11 80084a4: 5b 8c 00 08 sw (sp+8),r12 80084a8: 5b 9d 00 04 sw (sp+4),ra 80084ac: b8 40 58 00 mv r11,r2 80084b0: b8 60 60 00 mv r12,r3 register Thread_Control *the_thread; Objects_Locations location; if ( new_priority != RTEMS_CURRENT_PRIORITY && 80084b4: 44 40 00 06 be r2,r0,80084cc 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 ) ); 80084b8: 78 02 08 01 mvhi r2,0x801 80084bc: 38 42 a0 c0 ori r2,r2,0xa0c0 80084c0: 40 43 00 00 lbu r3,(r2+0) !_RTEMS_tasks_Priority_is_valid( new_priority ) ) return RTEMS_INVALID_PRIORITY; 80084c4: 34 02 00 13 mvi r2,19 ) { register Thread_Control *the_thread; Objects_Locations location; if ( new_priority != RTEMS_CURRENT_PRIORITY && 80084c8: 55 63 00 16 bgu r11,r3,8008520 !_RTEMS_tasks_Priority_is_valid( new_priority ) ) return RTEMS_INVALID_PRIORITY; if ( !old_priority ) return RTEMS_INVALID_ADDRESS; 80084cc: 34 02 00 09 mvi r2,9 if ( new_priority != RTEMS_CURRENT_PRIORITY && !_RTEMS_tasks_Priority_is_valid( new_priority ) ) return RTEMS_INVALID_PRIORITY; if ( !old_priority ) 80084d0: 45 80 00 14 be r12,r0,8008520 return RTEMS_INVALID_ADDRESS; the_thread = _Thread_Get( id, &location ); 80084d4: 37 82 00 10 addi r2,sp,16 80084d8: f8 00 0a 89 calli 800aefc <_Thread_Get> switch ( location ) { 80084dc: 2b 82 00 10 lw r2,(sp+16) 80084e0: 5c 40 00 0f bne r2,r0,800851c case OBJECTS_LOCAL: /* XXX need helper to "convert" from core priority */ *old_priority = the_thread->current_priority; 80084e4: 28 23 00 14 lw r3,(r1+20) 80084e8: 59 83 00 00 sw (r12+0),r3 if ( new_priority != RTEMS_CURRENT_PRIORITY ) { 80084ec: 45 62 00 09 be r11,r2,8008510 the_thread->real_priority = new_priority; if ( the_thread->resource_count == 0 || 80084f0: 28 22 00 1c lw r2,(r1+28) 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; 80084f4: 58 2b 00 18 sw (r1+24),r11 if ( the_thread->resource_count == 0 || 80084f8: 44 40 00 03 be r2,r0,8008504 80084fc: 28 22 00 14 lw r2,(r1+20) 8008500: 51 62 00 04 bgeu r11,r2,8008510 <== ALWAYS TAKEN the_thread->current_priority > new_priority ) _Thread_Change_priority( the_thread, new_priority, false ); 8008504: b9 60 10 00 mv r2,r11 8008508: 34 03 00 00 mvi r3,0 800850c: f8 00 09 20 calli 800a98c <_Thread_Change_priority> } _Thread_Enable_dispatch(); 8008510: f8 00 0a 6e calli 800aec8 <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 8008514: 34 02 00 00 mvi r2,0 8008518: e0 00 00 02 bi 8008520 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 800851c: 34 02 00 04 mvi r2,4 } 8008520: b8 40 08 00 mv r1,r2 8008524: 2b 9d 00 04 lw ra,(sp+4) 8008528: 2b 8b 00 0c lw r11,(sp+12) 800852c: 2b 8c 00 08 lw r12,(sp+8) 8008530: 37 9c 00 10 addi sp,sp,16 8008534: c3 a0 00 00 ret =============================================================================== 080046c0 : #include int rtems_termios_baud_to_index( rtems_termios_baud_t termios_baud ) { 80046c0: b8 20 10 00 mv r2,r1 case B134: baud_index = 4; break; case B150: baud_index = 5; break; case B200: baud_index = 6; break; case B300: baud_index = 7; break; case B600: baud_index = 8; break; case B1200: baud_index = 9; break; 80046c4: 34 01 00 09 mvi r1,9 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 80046c8: 44 41 00 38 be r2,r1,80047a8 80046cc: 48 41 00 19 bg r2,r1,8004730 case B0: baud_index = 0; break; case B50: baud_index = 1; break; case B75: baud_index = 2; break; case B110: baud_index = 3; break; case B134: baud_index = 4; break; 80046d0: 34 01 00 04 mvi r1,4 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 80046d4: 44 41 00 35 be r2,r1,80047a8 80046d8: 48 41 00 0c bg r2,r1,8004708 case B0: baud_index = 0; break; case B50: baud_index = 1; break; 80046dc: 34 01 00 01 mvi r1,1 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 80046e0: 44 41 00 32 be r2,r1,80047a8 80046e4: 48 41 00 04 bg r2,r1,80046f4 case B0: baud_index = 0; break; 80046e8: 34 01 00 00 mvi r1,0 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 80046ec: 5c 40 00 2e bne r2,r0,80047a4 80046f0: c3 a0 00 00 ret case B0: baud_index = 0; break; case B50: baud_index = 1; break; case B75: baud_index = 2; break; 80046f4: 34 01 00 02 mvi r1,2 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 80046f8: 44 41 00 2c be r2,r1,80047a8 case B0: baud_index = 0; break; case B50: baud_index = 1; break; case B75: baud_index = 2; break; case B110: baud_index = 3; break; 80046fc: 34 01 00 03 mvi r1,3 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004700: 5c 41 00 29 bne r2,r1,80047a4 <== NEVER TAKEN 8004704: c3 a0 00 00 ret case B50: baud_index = 1; break; case B75: baud_index = 2; break; case B110: baud_index = 3; break; case B134: baud_index = 4; break; case B150: baud_index = 5; break; case B200: baud_index = 6; break; 8004708: 34 01 00 06 mvi r1,6 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 800470c: 44 41 00 27 be r2,r1,80047a8 8004710: 34 03 00 06 mvi r3,6 case B0: baud_index = 0; break; case B50: baud_index = 1; break; case B75: baud_index = 2; break; case B110: baud_index = 3; break; case B134: baud_index = 4; break; case B150: baud_index = 5; break; 8004714: 34 01 00 05 mvi r1,5 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004718: 48 62 00 24 bg r3,r2,80047a8 case B75: baud_index = 2; break; case B110: baud_index = 3; break; case B134: baud_index = 4; break; case B150: baud_index = 5; break; case B200: baud_index = 6; break; case B300: baud_index = 7; break; 800471c: 34 01 00 07 mvi r1,7 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004720: 44 41 00 22 be r2,r1,80047a8 case B110: baud_index = 3; break; case B134: baud_index = 4; break; case B150: baud_index = 5; break; case B200: baud_index = 6; break; case B300: baud_index = 7; break; case B600: baud_index = 8; break; 8004724: 34 01 00 08 mvi r1,8 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004728: 5c 41 00 1f bne r2,r1,80047a4 <== NEVER TAKEN 800472c: c3 a0 00 00 ret case B1200: baud_index = 9; break; case B1800: baud_index = 10; break; case B2400: baud_index = 11; break; case B4800: baud_index = 12; break; case B9600: baud_index = 13; break; case B19200: baud_index = 14; break; 8004730: 34 01 00 0e mvi r1,14 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004734: 44 41 00 1d be r2,r1,80047a8 8004738: 48 41 00 0b bg r2,r1,8004764 case B200: baud_index = 6; break; case B300: baud_index = 7; break; case B600: baud_index = 8; break; case B1200: baud_index = 9; break; case B1800: baud_index = 10; break; case B2400: baud_index = 11; break; 800473c: 34 01 00 0b mvi r1,11 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004740: 44 41 00 1a be r2,r1,80047a8 8004744: 34 03 00 0b mvi r3,11 case B150: baud_index = 5; break; case B200: baud_index = 6; break; case B300: baud_index = 7; break; case B600: baud_index = 8; break; case B1200: baud_index = 9; break; case B1800: baud_index = 10; break; 8004748: 34 01 00 0a mvi r1,10 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 800474c: 48 62 00 17 bg r3,r2,80047a8 case B300: baud_index = 7; break; case B600: baud_index = 8; break; case B1200: baud_index = 9; break; case B1800: baud_index = 10; break; case B2400: baud_index = 11; break; case B4800: baud_index = 12; break; 8004750: 34 01 00 0c mvi r1,12 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004754: 44 41 00 15 be r2,r1,80047a8 case B600: baud_index = 8; break; case B1200: baud_index = 9; break; case B1800: baud_index = 10; break; case B2400: baud_index = 11; break; case B4800: baud_index = 12; break; case B9600: baud_index = 13; break; 8004758: 34 01 00 0d mvi r1,13 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 800475c: 5c 41 00 12 bne r2,r1,80047a4 <== NEVER TAKEN 8004760: c3 a0 00 00 ret 8004764: 34 03 10 02 mvi r3,4098 case B4800: baud_index = 12; break; case B9600: baud_index = 13; break; case B19200: baud_index = 14; break; case B38400: baud_index = 15; break; case B57600: baud_index = 16; break; case B115200: baud_index = 17; break; 8004768: 34 01 00 11 mvi r1,17 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 800476c: 44 43 00 0f be r2,r3,80047a8 8004770: 48 43 00 07 bg r2,r3,800478c case B1800: baud_index = 10; break; case B2400: baud_index = 11; break; case B4800: baud_index = 12; break; case B9600: baud_index = 13; break; case B19200: baud_index = 14; break; case B38400: baud_index = 15; break; 8004774: 34 01 00 0f mvi r1,15 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004778: 44 41 00 0c be r2,r1,80047a8 800477c: 34 03 10 01 mvi r3,4097 case B2400: baud_index = 11; break; case B4800: baud_index = 12; break; case B9600: baud_index = 13; break; case B19200: baud_index = 14; break; case B38400: baud_index = 15; break; case B57600: baud_index = 16; break; 8004780: 34 01 00 10 mvi r1,16 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004784: 5c 43 00 08 bne r2,r3,80047a4 <== NEVER TAKEN 8004788: c3 a0 00 00 ret 800478c: 34 03 10 03 mvi r3,4099 case B9600: baud_index = 13; break; case B19200: baud_index = 14; break; case B38400: baud_index = 15; break; case B57600: baud_index = 16; break; case B115200: baud_index = 17; break; case B230400: baud_index = 18; break; 8004790: 34 01 00 12 mvi r1,18 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004794: 44 43 00 05 be r2,r3,80047a8 8004798: 34 03 10 04 mvi r3,4100 case B19200: baud_index = 14; break; case B38400: baud_index = 15; break; case B57600: baud_index = 16; break; case B115200: baud_index = 17; break; case B230400: baud_index = 18; break; case B460800: baud_index = 19; break; 800479c: 34 01 00 13 mvi r1,19 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 80047a0: 44 43 00 02 be r2,r3,80047a8 <== ALWAYS TAKEN case B38400: baud_index = 15; break; case B57600: baud_index = 16; break; case B115200: baud_index = 17; break; case B230400: baud_index = 18; break; case B460800: baud_index = 19; break; default: baud_index = -1; break; 80047a4: 34 01 ff ff mvi r1,-1 } return baud_index; } 80047a8: c3 a0 00 00 ret =============================================================================== 08004dcc : } } rtems_status_code rtems_termios_close (void *arg) { 8004dcc: 37 9c ff ec addi sp,sp,-20 8004dd0: 5b 8b 00 14 sw (sp+20),r11 8004dd4: 5b 8c 00 10 sw (sp+16),r12 8004dd8: 5b 8d 00 0c sw (sp+12),r13 8004ddc: 5b 8e 00 08 sw (sp+8),r14 8004de0: 5b 9d 00 04 sw (sp+4),ra 8004de4: b8 20 70 00 mv r14,r1 rtems_libio_open_close_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 8004de8: 28 21 00 00 lw r1,(r1+0) rtems_status_code sc; sc = rtems_semaphore_obtain( 8004dec: 78 02 08 02 mvhi r2,0x802 8004df0: 38 42 3b 10 ori r2,r2,0x3b10 rtems_status_code rtems_termios_close (void *arg) { rtems_libio_open_close_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 8004df4: 28 2b 00 38 lw r11,(r1+56) rtems_status_code sc; sc = rtems_semaphore_obtain( 8004df8: 28 41 00 00 lw r1,(r2+0) 8004dfc: 34 03 00 00 mvi r3,0 8004e00: 34 02 00 00 mvi r2,0 8004e04: f8 00 08 c2 calli 800710c rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) 8004e08: 5c 20 00 25 bne r1,r0,8004e9c <== NEVER TAKEN rtems_fatal_error_occurred (sc); if (--tty->refcount == 0) { 8004e0c: 29 6d 00 08 lw r13,(r11+8) 8004e10: 35 ad ff ff addi r13,r13,-1 8004e14: 59 6d 00 08 sw (r11+8),r13 8004e18: 5d a1 00 51 bne r13,r1,8004f5c <== NEVER TAKEN if (rtems_termios_linesw[tty->t_line].l_close != NULL) { 8004e1c: 29 61 00 cc lw r1,(r11+204) 8004e20: 78 0c 08 02 mvhi r12,0x802 8004e24: 34 02 00 05 mvi r2,5 8004e28: 39 8c 39 44 ori r12,r12,0x3944 8004e2c: fb ff f3 5c calli 8001b9c <__ashlsi3> 8004e30: b5 81 08 00 add r1,r12,r1 8004e34: 28 2c 00 04 lw r12,(r1+4) 8004e38: 45 8d 00 04 be r12,r13,8004e48 /* * call discipline-specific close */ sc = rtems_termios_linesw[tty->t_line].l_close(tty); 8004e3c: b9 60 08 00 mv r1,r11 8004e40: d9 80 00 00 call r12 8004e44: e0 00 00 0a bi 8004e6c } else { /* * default: just flush output buffer */ sc = rtems_semaphore_obtain(tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 8004e48: 29 61 00 18 lw r1,(r11+24) 8004e4c: 34 02 00 00 mvi r2,0 8004e50: 34 03 00 00 mvi r3,0 8004e54: f8 00 08 ae calli 800710c if (sc != RTEMS_SUCCESSFUL) { 8004e58: 5d 81 00 11 bne r12,r1,8004e9c <== NEVER TAKEN rtems_fatal_error_occurred (sc); } drainOutput (tty); 8004e5c: b9 60 08 00 mv r1,r11 8004e60: fb ff fe 89 calli 8004884 rtems_semaphore_release (tty->osem); 8004e64: 29 61 00 18 lw r1,(r11+24) 8004e68: f8 00 08 f9 calli 800724c } if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { 8004e6c: 29 62 00 b4 lw r2,(r11+180) 8004e70: 34 01 00 02 mvi r1,2 8004e74: 5c 41 00 0b bne r2,r1,8004ea0 /* * send "terminate" to I/O tasks */ sc = rtems_event_send( tty->rxTaskId, TERMIOS_RX_TERMINATE_EVENT ); 8004e78: 29 61 00 c4 lw r1,(r11+196) 8004e7c: 34 02 00 01 mvi r2,1 8004e80: f8 00 07 57 calli 8006bdc 8004e84: b8 20 60 00 mv r12,r1 if (sc != RTEMS_SUCCESSFUL) 8004e88: 5c 20 00 05 bne r1,r0,8004e9c <== NEVER TAKEN rtems_fatal_error_occurred (sc); sc = rtems_event_send( tty->txTaskId, TERMIOS_TX_TERMINATE_EVENT ); 8004e8c: 29 61 00 c8 lw r1,(r11+200) 8004e90: 34 02 00 01 mvi r2,1 8004e94: f8 00 07 52 calli 8006bdc if (sc != RTEMS_SUCCESSFUL) 8004e98: 44 2c 00 02 be r1,r12,8004ea0 <== ALWAYS TAKEN rtems_fatal_error_occurred (sc); 8004e9c: f8 00 0a 7f calli 8007898 <== NOT EXECUTED } if (tty->device.lastClose) 8004ea0: 29 64 00 9c lw r4,(r11+156) 8004ea4: 44 80 00 05 be r4,r0,8004eb8 <== ALWAYS TAKEN (*tty->device.lastClose)(tty->major, tty->minor, arg); 8004ea8: 29 61 00 0c lw r1,(r11+12) <== NOT EXECUTED 8004eac: 29 62 00 10 lw r2,(r11+16) <== NOT EXECUTED 8004eb0: b9 c0 18 00 mv r3,r14 <== NOT EXECUTED 8004eb4: d8 80 00 00 call r4 <== NOT EXECUTED if (tty->forw == NULL) { 8004eb8: 29 62 00 00 lw r2,(r11+0) 8004ebc: 29 61 00 04 lw r1,(r11+4) 8004ec0: 5c 40 00 07 bne r2,r0,8004edc <== NEVER TAKEN rtems_termios_ttyTail = tty->back; 8004ec4: 78 03 08 02 mvhi r3,0x802 8004ec8: 38 63 3b 14 ori r3,r3,0x3b14 8004ecc: 58 61 00 00 sw (r3+0),r1 if ( rtems_termios_ttyTail != NULL ) { 8004ed0: 44 22 00 04 be r1,r2,8004ee0 <== ALWAYS TAKEN rtems_termios_ttyTail->forw = NULL; 8004ed4: 58 20 00 00 sw (r1+0),r0 <== NOT EXECUTED 8004ed8: e0 00 00 02 bi 8004ee0 <== NOT EXECUTED } } else { tty->forw->back = tty->back; 8004edc: 58 41 00 04 sw (r2+4),r1 <== NOT EXECUTED } if (tty->back == NULL) { 8004ee0: 29 62 00 04 lw r2,(r11+4) 8004ee4: 29 61 00 00 lw r1,(r11+0) 8004ee8: 5c 40 00 07 bne r2,r0,8004f04 <== NEVER TAKEN rtems_termios_ttyHead = tty->forw; 8004eec: 78 03 08 02 mvhi r3,0x802 8004ef0: 38 63 3b 18 ori r3,r3,0x3b18 8004ef4: 58 61 00 00 sw (r3+0),r1 if ( rtems_termios_ttyHead != NULL ) { 8004ef8: 44 22 00 04 be r1,r2,8004f08 <== ALWAYS TAKEN rtems_termios_ttyHead->back = NULL; 8004efc: 58 20 00 04 sw (r1+4),r0 <== NOT EXECUTED 8004f00: e0 00 00 02 bi 8004f08 <== NOT EXECUTED } } else { tty->back->forw = tty->forw; 8004f04: 58 41 00 00 sw (r2+0),r1 <== NOT EXECUTED } rtems_semaphore_delete (tty->isem); 8004f08: 29 61 00 14 lw r1,(r11+20) 8004f0c: f8 00 08 51 calli 8007050 rtems_semaphore_delete (tty->osem); 8004f10: 29 61 00 18 lw r1,(r11+24) 8004f14: f8 00 08 4f calli 8007050 rtems_semaphore_delete (tty->rawOutBuf.Semaphore); 8004f18: 29 61 00 8c lw r1,(r11+140) 8004f1c: f8 00 08 4d calli 8007050 if ((tty->device.pollRead == NULL) || 8004f20: 29 61 00 a0 lw r1,(r11+160) 8004f24: 44 20 00 04 be r1,r0,8004f34 8004f28: 29 62 00 b4 lw r2,(r11+180) 8004f2c: 34 01 00 02 mvi r1,2 8004f30: 5c 41 00 03 bne r2,r1,8004f3c (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)) rtems_semaphore_delete (tty->rawInBuf.Semaphore); 8004f34: 29 61 00 68 lw r1,(r11+104) 8004f38: f8 00 08 46 calli 8007050 free (tty->rawInBuf.theBuf); 8004f3c: 29 61 00 58 lw r1,(r11+88) 8004f40: fb ff f8 a3 calli 80031cc free (tty->rawOutBuf.theBuf); 8004f44: 29 61 00 7c lw r1,(r11+124) 8004f48: fb ff f8 a1 calli 80031cc free (tty->cbuf); 8004f4c: 29 61 00 1c lw r1,(r11+28) 8004f50: fb ff f8 9f calli 80031cc free (tty); 8004f54: b9 60 08 00 mv r1,r11 8004f58: fb ff f8 9d calli 80031cc } rtems_semaphore_release (rtems_termios_ttyMutex); 8004f5c: 78 01 08 02 mvhi r1,0x802 8004f60: 38 21 3b 10 ori r1,r1,0x3b10 8004f64: 28 21 00 00 lw r1,(r1+0) 8004f68: f8 00 08 b9 calli 800724c return RTEMS_SUCCESSFUL; } 8004f6c: 34 01 00 00 mvi r1,0 8004f70: 2b 9d 00 04 lw ra,(sp+4) 8004f74: 2b 8b 00 14 lw r11,(sp+20) 8004f78: 2b 8c 00 10 lw r12,(sp+16) 8004f7c: 2b 8d 00 0c lw r13,(sp+12) 8004f80: 2b 8e 00 08 lw r14,(sp+8) 8004f84: 37 9c 00 14 addi sp,sp,20 8004f88: c3 a0 00 00 ret =============================================================================== 08006590 : * for each transmitted character. * It returns number of characters left to transmit */ int rtems_termios_dequeue_characters (void *ttyp, int len) { 8006590: 37 9c ff f8 addi sp,sp,-8 8006594: 5b 8b 00 08 sw (sp+8),r11 8006598: 5b 9d 00 04 sw (sp+4),ra rtems_status_code sc; /* * sum up character count already sent */ tty->t_dqlen += len; 800659c: 28 24 00 90 lw r4,(r1+144) 80065a0: b4 82 10 00 add r2,r4,r2 if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { 80065a4: 28 24 00 b4 lw r4,(r1+180) rtems_status_code sc; /* * sum up character count already sent */ tty->t_dqlen += len; 80065a8: 58 22 00 90 sw (r1+144),r2 if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { 80065ac: 34 02 00 02 mvi r2,2 80065b0: 5c 82 00 06 bne r4,r2,80065c8 /* * send wake up to transmitter task */ sc = rtems_event_send(tty->txTaskId, TERMIOS_TX_START_EVENT); 80065b4: 28 21 00 c8 lw r1,(r1+200) if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); return 0; /* nothing to output in IRQ... */ 80065b8: 34 0b 00 00 mvi r11,0 if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { /* * send wake up to transmitter task */ sc = rtems_event_send(tty->txTaskId, TERMIOS_TX_START_EVENT); 80065bc: f8 00 01 88 calli 8006bdc if (sc != RTEMS_SUCCESSFUL) 80065c0: 44 20 00 0e be r1,r0,80065f8 <== ALWAYS TAKEN rtems_fatal_error_occurred (sc); 80065c4: f8 00 04 b5 calli 8007898 <== NOT EXECUTED return 0; /* nothing to output in IRQ... */ } if (tty->t_line == PPPDISC ) { 80065c8: 28 23 00 cc lw r3,(r1+204) 80065cc: 34 02 00 05 mvi r2,5 80065d0: 5c 62 00 08 bne r3,r2,80065f0 /* * call any line discipline start function */ if (rtems_termios_linesw[tty->t_line].l_start != NULL) { 80065d4: 78 02 08 02 mvhi r2,0x802 80065d8: 38 42 39 44 ori r2,r2,0x3944 80065dc: 28 42 00 b4 lw r2,(r2+180) rtems_termios_linesw[tty->t_line].l_start(tty); } return 0; /* nothing to output in IRQ... */ 80065e0: 34 0b 00 00 mvi r11,0 if (tty->t_line == PPPDISC ) { /* * call any line discipline start function */ if (rtems_termios_linesw[tty->t_line].l_start != NULL) { 80065e4: 44 40 00 05 be r2,r0,80065f8 <== NEVER TAKEN rtems_termios_linesw[tty->t_line].l_start(tty); 80065e8: d8 40 00 00 call r2 80065ec: e0 00 00 03 bi 80065f8 } return 0; /* nothing to output in IRQ... */ } return rtems_termios_refill_transmitter(tty); 80065f0: fb ff ff 4a calli 8006318 80065f4: b8 20 58 00 mv r11,r1 } 80065f8: b9 60 08 00 mv r1,r11 80065fc: 2b 9d 00 04 lw ra,(sp+4) 8006600: 2b 8b 00 08 lw r11,(sp+8) 8006604: 37 9c 00 08 addi sp,sp,8 8006608: c3 a0 00 00 ret =============================================================================== 08005f78 : * 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) { 8005f78: 37 9c ff bc addi sp,sp,-68 8005f7c: 5b 8b 00 44 sw (sp+68),r11 8005f80: 5b 8c 00 40 sw (sp+64),r12 8005f84: 5b 8d 00 3c sw (sp+60),r13 8005f88: 5b 8e 00 38 sw (sp+56),r14 8005f8c: 5b 8f 00 34 sw (sp+52),r15 8005f90: 5b 90 00 30 sw (sp+48),r16 8005f94: 5b 91 00 2c sw (sp+44),r17 8005f98: 5b 92 00 28 sw (sp+40),r18 8005f9c: 5b 93 00 24 sw (sp+36),r19 8005fa0: 5b 94 00 20 sw (sp+32),r20 8005fa4: 5b 95 00 1c sw (sp+28),r21 8005fa8: 5b 96 00 18 sw (sp+24),r22 8005fac: 5b 97 00 14 sw (sp+20),r23 8005fb0: 5b 98 00 10 sw (sp+16),r24 8005fb4: 5b 99 00 0c sw (sp+12),r25 8005fb8: 5b 9b 00 08 sw (sp+8),fp 8005fbc: 5b 9d 00 04 sw (sp+4),ra 8005fc0: b8 20 58 00 mv r11,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) { 8005fc4: 28 21 00 cc lw r1,(r1+204) * 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) { 8005fc8: b8 40 68 00 mv r13,r2 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) { 8005fcc: 78 0c 08 02 mvhi r12,0x802 8005fd0: 34 02 00 05 mvi r2,5 * 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) { 8005fd4: b8 60 78 00 mv r15,r3 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) { 8005fd8: 39 8c 39 44 ori r12,r12,0x3944 8005fdc: fb ff ee f0 calli 8001b9c <__ashlsi3> 8005fe0: b5 81 08 00 add r1,r12,r1 8005fe4: 28 21 00 10 lw r1,(r1+16) 8005fe8: b9 e0 70 00 mv r14,r15 8005fec: 5c 20 00 17 bne r1,r0,8006048 8005ff0: 34 12 00 00 mvi r18,0 8005ff4: 34 0c 00 00 mvi r12,0 flow_rcv = true; } } if (flow_rcv) { /* restart output according to FL_ORCVXOF flag */ if ((tty->flow_ctrl & (FL_ORCVXOF | FL_OSTOP)) == FL_OSTOP) { 8005ff8: 34 1b 00 20 mvi fp,32 /* disable interrupts */ rtems_interrupt_disable(level); 8005ffc: 34 11 ff fe mvi r17,-2 tty->flow_ctrl &= ~FL_OSTOP; 8006000: 34 19 ff df mvi r25,-33 /* * 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); 8006004: 35 78 00 30 addi r24,r11,48 if ((((newTail - tty->rawInBuf.Head + tty->rawInBuf.Size) % tty->rawInBuf.Size) > tty->highwater) && !(tty->flow_ctrl & FL_IREQXOF)) { /* incoming data stream should be stopped */ tty->flow_ctrl |= FL_IREQXOF; if ((tty->flow_ctrl & (FL_MDXOF | FL_ISNTXOF)) 8006008: 34 17 04 00 mvi r23,1024 /* call write function here */ tty->flow_ctrl |= FL_ISNTXOF; (*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTOP]), 1); } } else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) == (FL_MDRTS) ) { 800600c: 34 16 01 00 mvi r22,256 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, 8006010: 35 75 00 4a addi r21,r11,74 flow_rcv = true; } else if (c == tty->termios.c_cc[VSTART]) { /* VSTART received */ /* restart output */ tty->flow_ctrl &= ~FL_ORCVXOF; 8006014: 34 14 ff ef mvi r20,-17 8006018: e0 00 00 87 bi 8006234 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); 800601c: 29 61 00 cc lw r1,(r11+204) 8006020: 34 02 00 05 mvi r2,5 bool flow_rcv = false; /* true, if flow control char received */ rtems_interrupt_level level; if (rtems_termios_linesw[tty->t_line].l_rint != NULL) { while (len--) { c = *buf++; 8006024: 41 af 00 00 lbu r15,(r13+0) rtems_termios_linesw[tty->t_line].l_rint(c,tty); 8006028: fb ff ee dd calli 8001b9c <__ashlsi3> 800602c: b5 81 10 00 add r2,r12,r1 8006030: 28 43 00 10 lw r3,(r2+16) 8006034: b9 e0 08 00 mv r1,r15 8006038: b9 60 10 00 mv r2,r11 bool flow_rcv = false; /* true, if flow control char received */ rtems_interrupt_level level; if (rtems_termios_linesw[tty->t_line].l_rint != NULL) { while (len--) { c = *buf++; 800603c: 35 ad 00 01 addi r13,r13,1 rtems_termios_linesw[tty->t_line].l_rint(c,tty); 8006040: d8 60 00 00 call r3 8006044: 35 ce ff ff addi r14,r14,-1 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--) { 8006048: 5d c0 ff f5 bne r14,r0,800601c } /* * check to see if rcv wakeup callback was set */ if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) { 800604c: 29 61 00 e4 lw r1,(r11+228) (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg); tty->tty_rcvwakeup = 1; } return 0; 8006050: 34 0c 00 00 mvi r12,0 } /* * check to see if rcv wakeup callback was set */ if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) { 8006054: 5c 2c 00 7e bne r1,r12,800624c <== NEVER TAKEN 8006058: 29 63 00 dc lw r3,(r11+220) (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg); tty->tty_rcvwakeup = 1; } return 0; 800605c: b9 c0 60 00 mv r12,r14 } /* * check to see if rcv wakeup callback was set */ if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) { 8006060: 44 60 00 7b be r3,r0,800624c <== NEVER TAKEN (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg); 8006064: 29 62 00 e0 lw r2,(r11+224) 8006068: 35 61 00 30 addi r1,r11,48 800606c: d8 60 00 00 call r3 tty->tty_rcvwakeup = 1; 8006070: 34 01 00 01 mvi r1,1 8006074: 59 61 00 e4 sw (r11+228),r1 8006078: e0 00 00 75 bi 800624c while (len--) { c = *buf++; /* FIXME: implement IXANY: any character restarts output */ /* if incoming XON/XOFF controls outgoing stream: */ if (tty->flow_ctrl & FL_MDXON) { 800607c: 29 61 00 b8 lw r1,(r11+184) } return 0; } while (len--) { c = *buf++; 8006080: 41 b0 00 00 lbu r16,(r13+0) 8006084: 35 ad 00 01 addi r13,r13,1 /* FIXME: implement IXANY: any character restarts output */ /* if incoming XON/XOFF controls outgoing stream: */ if (tty->flow_ctrl & FL_MDXON) { 8006088: 20 21 02 00 andi r1,r1,0x200 800608c: 44 20 00 11 be r1,r0,80060d0 /* if received char is V_STOP and V_START (both are equal value) */ if (c == tty->termios.c_cc[VSTOP]) { 8006090: 41 64 00 4a lbu r4,(r11+74) 8006094: 41 63 00 49 lbu r3,(r11+73) 8006098: 5c 90 00 0a bne r4,r16,80060c0 if (c == tty->termios.c_cc[VSTART]) { 800609c: 5c 64 00 04 bne r3,r4,80060ac <== ALWAYS TAKEN /* received VSTOP and VSTART==VSTOP? */ /* then toggle "stop output" status */ tty->flow_ctrl = tty->flow_ctrl ^ FL_ORCVXOF; 80060a0: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED 80060a4: 18 21 00 10 xori r1,r1,0x10 <== NOT EXECUTED 80060a8: e0 00 00 03 bi 80060b4 <== NOT EXECUTED } else { /* VSTOP received (other code than VSTART) */ /* stop output */ tty->flow_ctrl |= FL_ORCVXOF; 80060ac: 29 61 00 b8 lw r1,(r11+184) 80060b0: 38 21 00 10 ori r1,r1,0x10 80060b4: 59 61 00 b8 sw (r11+184),r1 * 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) { 80060b8: 34 12 00 01 mvi r18,1 80060bc: e0 00 00 06 bi 80060d4 /* stop output */ tty->flow_ctrl |= FL_ORCVXOF; } flow_rcv = true; } else if (c == tty->termios.c_cc[VSTART]) { 80060c0: 5c 70 00 04 bne r3,r16,80060d0 <== ALWAYS TAKEN /* VSTART received */ /* restart output */ tty->flow_ctrl &= ~FL_ORCVXOF; 80060c4: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED 80060c8: a0 34 08 00 and r1,r1,r20 <== NOT EXECUTED 80060cc: e3 ff ff fa bi 80060b4 <== NOT EXECUTED flow_rcv = true; } } if (flow_rcv) { 80060d0: 46 40 00 15 be r18,r0,8006124 <== ALWAYS TAKEN /* restart output according to FL_ORCVXOF flag */ if ((tty->flow_ctrl & (FL_ORCVXOF | FL_OSTOP)) == FL_OSTOP) { 80060d4: 29 61 00 b8 lw r1,(r11+184) 80060d8: 20 21 00 30 andi r1,r1,0x30 80060dc: 5c 3b 00 55 bne r1,fp,8006230 <== ALWAYS TAKEN /* disable interrupts */ rtems_interrupt_disable(level); 80060e0: 90 00 70 00 rcsr r14,IE <== NOT EXECUTED 80060e4: a1 d1 08 00 and r1,r14,r17 <== NOT EXECUTED 80060e8: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED tty->flow_ctrl &= ~FL_OSTOP; 80060ec: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED 80060f0: a0 39 08 00 and r1,r1,r25 <== NOT EXECUTED 80060f4: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED /* check for chars in output buffer (or rob_state?) */ if (tty->rawOutBufState != rob_idle) { 80060f8: 29 61 00 94 lw r1,(r11+148) <== NOT EXECUTED 80060fc: 44 20 00 08 be r1,r0,800611c <== NOT EXECUTED /* if chars available, call write function... */ (*tty->device.write)( tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail], 1); 8006100: 29 63 00 84 lw r3,(r11+132) <== 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)( 8006104: 29 62 00 7c lw r2,(r11+124) <== NOT EXECUTED 8006108: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED 800610c: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED 8006110: b4 43 10 00 add r2,r2,r3 <== NOT EXECUTED 8006114: 34 03 00 01 mvi r3,1 <== NOT EXECUTED 8006118: d8 80 00 00 call r4 <== NOT EXECUTED tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail], 1); } /* reenable interrupts */ rtems_interrupt_enable(level); 800611c: d0 0e 00 00 wcsr IE,r14 <== NOT EXECUTED 8006120: e0 00 00 44 bi 8006230 <== NOT EXECUTED } } else { newTail = (tty->rawInBuf.Tail + 1) % tty->rawInBuf.Size; 8006124: 29 63 00 60 lw r3,(r11+96) 8006128: 29 62 00 64 lw r2,(r11+100) 800612c: 34 61 00 01 addi r1,r3,1 8006130: f8 00 64 11 calli 801f174 <__umodsi3> 8006134: b8 20 70 00 mv r14,r1 /* if chars_in_buffer > highwater */ rtems_interrupt_disable(level); 8006138: 90 00 98 00 rcsr r19,IE 800613c: a2 71 08 00 and r1,r19,r17 8006140: d0 01 00 00 wcsr IE,r1 if ((((newTail - tty->rawInBuf.Head + tty->rawInBuf.Size) 8006144: 29 61 00 5c lw r1,(r11+92) 8006148: 29 63 00 64 lw r3,(r11+100) % tty->rawInBuf.Size) > tty->highwater) && 800614c: 29 62 00 64 lw r2,(r11+100) } } 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) 8006150: c8 61 18 00 sub r3,r3,r1 % tty->rawInBuf.Size) > tty->highwater) && 8006154: b4 6e 08 00 add r1,r3,r14 8006158: f8 00 64 07 calli 801f174 <__umodsi3> } } 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) 800615c: 29 62 00 c0 lw r2,(r11+192) 8006160: 50 41 00 22 bgeu r2,r1,80061e8 <== ALWAYS TAKEN % tty->rawInBuf.Size) > tty->highwater) && !(tty->flow_ctrl & FL_IREQXOF)) { 8006164: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED 8006168: 20 21 00 01 andi r1,r1,0x1 <== 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) && 800616c: 5c 20 00 1f bne r1,r0,80061e8 <== NOT EXECUTED !(tty->flow_ctrl & FL_IREQXOF)) { /* incoming data stream should be stopped */ tty->flow_ctrl |= FL_IREQXOF; 8006170: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED 8006174: 38 21 00 01 ori r1,r1,0x1 <== NOT EXECUTED 8006178: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED if ((tty->flow_ctrl & (FL_MDXOF | FL_ISNTXOF)) 800617c: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED 8006180: 20 21 04 02 andi r1,r1,0x402 <== NOT EXECUTED 8006184: 5c 37 00 0f bne r1,r23,80061c0 <== NOT EXECUTED == (FL_MDXOF ) ) { if ((tty->flow_ctrl & FL_OSTOP) || 8006188: 29 63 00 b8 lw r3,(r11+184) <== NOT EXECUTED 800618c: 20 63 00 20 andi r3,r3,0x20 <== NOT EXECUTED 8006190: 5c 60 00 03 bne r3,r0,800619c <== NOT EXECUTED 8006194: 29 61 00 94 lw r1,(r11+148) <== NOT EXECUTED 8006198: 5c 23 00 14 bne r1,r3,80061e8 <== 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; 800619c: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED (*tty->device.write)(tty->minor, 80061a0: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED 80061a4: ba a0 10 00 mv r2,r21 <== 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; 80061a8: 38 21 00 02 ori r1,r1,0x2 <== NOT EXECUTED 80061ac: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED (*tty->device.write)(tty->minor, 80061b0: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED 80061b4: 34 03 00 01 mvi r3,1 <== NOT EXECUTED 80061b8: d8 80 00 00 call r4 <== NOT EXECUTED 80061bc: e0 00 00 0b bi 80061e8 <== NOT EXECUTED (void *)&(tty->termios.c_cc[VSTOP]), 1); } } else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) == (FL_MDRTS) ) { 80061c0: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED 80061c4: 20 21 01 04 andi r1,r1,0x104 <== NOT EXECUTED 80061c8: 5c 36 00 08 bne r1,r22,80061e8 <== NOT EXECUTED tty->flow_ctrl |= FL_IRTSOFF; 80061cc: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED /* deactivate RTS line */ if (tty->device.stopRemoteTx != NULL) { 80061d0: 29 63 00 ac lw r3,(r11+172) <== NOT EXECUTED tty->flow_ctrl |= FL_ISNTXOF; (*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTOP]), 1); } } else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) == (FL_MDRTS) ) { tty->flow_ctrl |= FL_IRTSOFF; 80061d4: 38 21 00 04 ori r1,r1,0x4 <== NOT EXECUTED 80061d8: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED /* deactivate RTS line */ if (tty->device.stopRemoteTx != NULL) { 80061dc: 44 60 00 03 be r3,r0,80061e8 <== NOT EXECUTED tty->device.stopRemoteTx(tty->minor); 80061e0: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED 80061e4: d8 60 00 00 call r3 <== NOT EXECUTED } } } /* reenable interrupts */ rtems_interrupt_enable(level); 80061e8: d0 13 00 00 wcsr IE,r19 if (newTail == tty->rawInBuf.Head) { 80061ec: 29 61 00 5c lw r1,(r11+92) 80061f0: 5d c1 00 03 bne r14,r1,80061fc <== ALWAYS TAKEN dropped++; 80061f4: 35 8c 00 01 addi r12,r12,1 <== NOT EXECUTED 80061f8: e0 00 00 0e bi 8006230 <== NOT EXECUTED } else { tty->rawInBuf.theBuf[newTail] = c; 80061fc: 29 61 00 58 lw r1,(r11+88) 8006200: b4 2e 08 00 add r1,r1,r14 8006204: 30 30 00 00 sb (r1+0),r16 tty->rawInBuf.Tail = newTail; /* * check to see if rcv wakeup callback was set */ if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) { 8006208: 29 64 00 e4 lw r4,(r11+228) if (newTail == tty->rawInBuf.Head) { dropped++; } else { tty->rawInBuf.theBuf[newTail] = c; tty->rawInBuf.Tail = newTail; 800620c: 59 6e 00 60 sw (r11+96),r14 /* * check to see if rcv wakeup callback was set */ if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) { 8006210: 5c 80 00 08 bne r4,r0,8006230 <== NEVER TAKEN 8006214: 29 63 00 dc lw r3,(r11+220) 8006218: 44 64 00 06 be r3,r4,8006230 <== ALWAYS TAKEN (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg); 800621c: 29 62 00 e0 lw r2,(r11+224) <== NOT EXECUTED 8006220: bb 00 08 00 mv r1,r24 <== NOT EXECUTED 8006224: d8 60 00 00 call r3 <== NOT EXECUTED tty->tty_rcvwakeup = 1; 8006228: 34 01 00 01 mvi r1,1 <== NOT EXECUTED 800622c: 59 61 00 e4 sw (r11+228),r1 <== NOT EXECUTED 8006230: 35 ef ff ff addi r15,r15,-1 tty->tty_rcvwakeup = 1; } return 0; } while (len--) { 8006234: 5d e0 ff 92 bne r15,r0,800607c } } } } tty->rawInBufDropped += dropped; 8006238: 29 61 00 78 lw r1,(r11+120) 800623c: b4 2c 08 00 add r1,r1,r12 8006240: 59 61 00 78 sw (r11+120),r1 rtems_semaphore_release (tty->rawInBuf.Semaphore); 8006244: 29 61 00 68 lw r1,(r11+104) 8006248: f8 00 04 01 calli 800724c return dropped; } 800624c: b9 80 08 00 mv r1,r12 8006250: 2b 9d 00 04 lw ra,(sp+4) 8006254: 2b 8b 00 44 lw r11,(sp+68) 8006258: 2b 8c 00 40 lw r12,(sp+64) 800625c: 2b 8d 00 3c lw r13,(sp+60) 8006260: 2b 8e 00 38 lw r14,(sp+56) 8006264: 2b 8f 00 34 lw r15,(sp+52) 8006268: 2b 90 00 30 lw r16,(sp+48) 800626c: 2b 91 00 2c lw r17,(sp+44) 8006270: 2b 92 00 28 lw r18,(sp+40) 8006274: 2b 93 00 24 lw r19,(sp+36) 8006278: 2b 94 00 20 lw r20,(sp+32) 800627c: 2b 95 00 1c lw r21,(sp+28) 8006280: 2b 96 00 18 lw r22,(sp+24) 8006284: 2b 97 00 14 lw r23,(sp+20) 8006288: 2b 98 00 10 lw r24,(sp+16) 800628c: 2b 99 00 0c lw r25,(sp+12) 8006290: 2b 9b 00 08 lw fp,(sp+8) 8006294: 37 9c 00 44 addi sp,sp,68 8006298: c3 a0 00 00 ret =============================================================================== 080047f0 : struct rtems_termios_tty *rtems_termios_ttyTail; rtems_id rtems_termios_ttyMutex; void rtems_termios_initialize (void) { 80047f0: 37 9c ff f8 addi sp,sp,-8 80047f4: 5b 8b 00 08 sw (sp+8),r11 80047f8: 5b 9d 00 04 sw (sp+4),ra rtems_status_code sc; /* * Create the mutex semaphore for the tty list */ if (!rtems_termios_ttyMutex) { 80047fc: 78 05 08 02 mvhi r5,0x802 8004800: 38 a5 3b 10 ori r5,r5,0x3b10 8004804: 28 ab 00 00 lw r11,(r5+0) 8004808: 5d 60 00 0a bne r11,r0,8004830 <== NEVER TAKEN sc = rtems_semaphore_create ( 800480c: 78 02 08 02 mvhi r2,0x802 8004810: 38 42 14 94 ori r2,r2,0x1494 8004814: 28 41 00 00 lw r1,(r2+0) 8004818: 34 03 00 54 mvi r3,84 800481c: 34 02 00 01 mvi r2,1 8004820: 34 04 00 00 mvi r4,0 8004824: f8 00 09 8e calli 8006e5c rtems_build_name ('T', 'R', 'm', 'i'), 1, RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY, RTEMS_NO_PRIORITY, &rtems_termios_ttyMutex); if (sc != RTEMS_SUCCESSFUL) 8004828: 44 2b 00 02 be r1,r11,8004830 <== ALWAYS TAKEN rtems_fatal_error_occurred (sc); 800482c: f8 00 0c 1b calli 8007898 <== NOT EXECUTED } } 8004830: 2b 9d 00 04 lw ra,(sp+4) 8004834: 2b 8b 00 08 lw r11,(sp+8) 8004838: 37 9c 00 08 addi sp,sp,8 800483c: c3 a0 00 00 ret =============================================================================== 08004fb8 : } } rtems_status_code rtems_termios_ioctl (void *arg) { 8004fb8: 37 9c ff e8 addi sp,sp,-24 8004fbc: 5b 8b 00 18 sw (sp+24),r11 8004fc0: 5b 8c 00 14 sw (sp+20),r12 8004fc4: 5b 8d 00 10 sw (sp+16),r13 8004fc8: 5b 8e 00 0c sw (sp+12),r14 8004fcc: 5b 8f 00 08 sw (sp+8),r15 8004fd0: 5b 9d 00 04 sw (sp+4),ra 8004fd4: b8 20 60 00 mv r12,r1 rtems_libio_ioctl_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 8004fd8: 28 21 00 00 lw r1,(r1+0) 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); 8004fdc: 34 02 00 00 mvi r2,0 8004fe0: 34 03 00 00 mvi r3,0 rtems_status_code rtems_termios_ioctl (void *arg) { rtems_libio_ioctl_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 8004fe4: 28 2b 00 38 lw r11,(r1+56) struct ttywakeup *wakeup = (struct ttywakeup *)args->buffer; rtems_status_code sc; args->ioctl_return = 0; 8004fe8: 59 80 00 0c sw (r12+12),r0 rtems_status_code rtems_termios_ioctl (void *arg) { rtems_libio_ioctl_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; struct ttywakeup *wakeup = (struct ttywakeup *)args->buffer; 8004fec: 29 8e 00 08 lw r14,(r12+8) rtems_status_code sc; args->ioctl_return = 0; sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 8004ff0: 29 61 00 18 lw r1,(r11+24) 8004ff4: f8 00 08 46 calli 800710c 8004ff8: b8 20 68 00 mv r13,r1 if (sc != RTEMS_SUCCESSFUL) { 8004ffc: 5c 20 00 da bne r1,r0,8005364 <== NEVER TAKEN args->ioctl_return = sc; return sc; } switch (args->command) { 8005000: 29 82 00 04 lw r2,(r12+4) 8005004: 34 01 00 04 mvi r1,4 8005008: 44 41 00 a6 be r2,r1,80052a0 <== NEVER TAKEN 800500c: 54 41 00 07 bgu r2,r1,8005028 8005010: 34 01 00 02 mvi r1,2 8005014: 44 41 00 27 be r2,r1,80050b0 8005018: 54 41 00 9a bgu r2,r1,8005280 800501c: 34 01 00 01 mvi r1,1 8005020: 5c 41 00 12 bne r2,r1,8005068 <== NEVER TAKEN 8005024: e0 00 00 1e bi 800509c 8005028: 78 03 08 02 mvhi r3,0x802 800502c: 38 63 14 b0 ori r3,r3,0x14b0 8005030: 28 61 00 00 lw r1,(r3+0) 8005034: 44 41 00 be be r2,r1,800532c <== NEVER TAKEN 8005038: 54 41 00 04 bgu r2,r1,8005048 800503c: 34 01 00 05 mvi r1,5 8005040: 5c 41 00 0a bne r2,r1,8005068 8005044: e0 00 00 92 bi 800528c 8005048: 78 03 08 02 mvhi r3,0x802 800504c: 38 63 14 b4 ori r3,r3,0x14b4 8005050: 28 61 00 00 lw r1,(r3+0) 8005054: 44 41 00 b2 be r2,r1,800531c <== NEVER TAKEN 8005058: 78 03 08 02 mvhi r3,0x802 800505c: 38 63 14 b8 ori r3,r3,0x14b8 8005060: 28 61 00 00 lw r1,(r3+0) 8005064: 44 41 00 94 be r2,r1,80052b4 default: if (rtems_termios_linesw[tty->t_line].l_ioctl != NULL) { 8005068: 29 61 00 cc lw r1,(r11+204) 800506c: 78 0d 08 02 mvhi r13,0x802 8005070: 34 02 00 05 mvi r2,5 8005074: 39 ad 39 44 ori r13,r13,0x3944 8005078: fb ff f2 c9 calli 8001b9c <__ashlsi3> 800507c: b5 a1 08 00 add r1,r13,r1 8005080: 28 23 00 18 lw r3,(r1+24) sc = rtems_termios_linesw[tty->t_line].l_ioctl(tty,args); } else { sc = RTEMS_INVALID_NUMBER; 8005084: 34 0d 00 0a mvi r13,10 args->ioctl_return = sc; return sc; } switch (args->command) { default: if (rtems_termios_linesw[tty->t_line].l_ioctl != NULL) { 8005088: 44 60 00 b5 be r3,r0,800535c <== NEVER TAKEN sc = rtems_termios_linesw[tty->t_line].l_ioctl(tty,args); 800508c: b9 60 08 00 mv r1,r11 8005090: b9 80 10 00 mv r2,r12 8005094: d8 60 00 00 call r3 8005098: e0 00 00 9f bi 8005314 sc = RTEMS_INVALID_NUMBER; } break; case RTEMS_IO_GET_ATTRIBUTES: *(struct termios *)args->buffer = tty->termios; 800509c: 29 81 00 08 lw r1,(r12+8) 80050a0: 35 62 00 30 addi r2,r11,48 80050a4: 34 03 00 24 mvi r3,36 80050a8: f8 00 31 f9 calli 801188c break; 80050ac: e0 00 00 ac bi 800535c case RTEMS_IO_SET_ATTRIBUTES: tty->termios = *(struct termios *)args->buffer; 80050b0: 29 82 00 08 lw r2,(r12+8) 80050b4: 35 61 00 30 addi r1,r11,48 80050b8: 34 03 00 24 mvi r3,36 80050bc: f8 00 31 f4 calli 801188c /* * check for flow control options to be switched off */ /* check for outgoing XON/XOFF flow control switched off */ if (( tty->flow_ctrl & FL_MDXON) && 80050c0: 29 61 00 b8 lw r1,(r11+184) 80050c4: 20 21 02 00 andi r1,r1,0x200 80050c8: 44 20 00 1d be r1,r0,800513c !(tty->termios.c_iflag & IXON)) { 80050cc: 29 61 00 30 lw r1,(r11+48) 80050d0: 20 21 04 00 andi r1,r1,0x400 /* * check for flow control options to be switched off */ /* check for outgoing XON/XOFF flow control switched off */ if (( tty->flow_ctrl & FL_MDXON) && 80050d4: 5c 20 00 1a bne r1,r0,800513c <== ALWAYS TAKEN !(tty->termios.c_iflag & IXON)) { /* clear related flags in flow_ctrl */ tty->flow_ctrl &= ~(FL_MDXON | FL_ORCVXOF); 80050d8: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED 80050dc: 34 01 fd ef mvi r1,-529 <== NOT EXECUTED 80050e0: a0 41 08 00 and r1,r2,r1 <== NOT EXECUTED 80050e4: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED /* has output been stopped due to received XOFF? */ if (tty->flow_ctrl & FL_OSTOP) { 80050e8: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED 80050ec: 20 21 00 20 andi r1,r1,0x20 <== NOT EXECUTED 80050f0: 44 20 00 13 be r1,r0,800513c <== NOT EXECUTED /* disable interrupts */ rtems_interrupt_disable(level); 80050f4: 90 00 70 00 rcsr r14,IE <== NOT EXECUTED 80050f8: 34 01 ff fe mvi r1,-2 <== NOT EXECUTED 80050fc: a1 c1 08 00 and r1,r14,r1 <== NOT EXECUTED 8005100: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED tty->flow_ctrl &= ~FL_OSTOP; 8005104: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED 8005108: 34 01 ff df mvi r1,-33 <== NOT EXECUTED 800510c: a0 41 08 00 and r1,r2,r1 <== NOT EXECUTED 8005110: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED /* check for chars in output buffer (or rob_state?) */ if (tty->rawOutBufState != rob_idle) { 8005114: 29 61 00 94 lw r1,(r11+148) <== NOT EXECUTED 8005118: 44 20 00 08 be r1,r0,8005138 <== NOT EXECUTED /* if chars available, call write function... */ (*tty->device.write)( 800511c: 29 63 00 7c lw r3,(r11+124) <== NOT EXECUTED tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1); 8005120: 29 62 00 84 lw r2,(r11+132) <== 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)( 8005124: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED 8005128: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED 800512c: b4 62 10 00 add r2,r3,r2 <== NOT EXECUTED 8005130: 34 03 00 01 mvi r3,1 <== NOT EXECUTED 8005134: d8 80 00 00 call r4 <== NOT EXECUTED tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1); } /* reenable interrupts */ rtems_interrupt_enable(level); 8005138: d0 0e 00 00 wcsr IE,r14 <== NOT EXECUTED } } /* check for incoming XON/XOFF flow control switched off */ if (( tty->flow_ctrl & FL_MDXOF) && !(tty->termios.c_iflag & IXOFF)) { 800513c: 29 61 00 b8 lw r1,(r11+184) 8005140: 20 21 04 00 andi r1,r1,0x400 8005144: 44 20 00 0c be r1,r0,8005174 <== ALWAYS TAKEN 8005148: 29 61 00 30 lw r1,(r11+48) <== NOT EXECUTED 800514c: 20 21 10 00 andi r1,r1,0x1000 <== NOT EXECUTED 8005150: 5c 20 00 09 bne r1,r0,8005174 <== NOT EXECUTED /* clear related flags in flow_ctrl */ tty->flow_ctrl &= ~(FL_MDXOF); 8005154: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED 8005158: 34 01 fb ff mvi r1,-1025 <== NOT EXECUTED 800515c: a0 41 08 00 and r1,r2,r1 <== NOT EXECUTED 8005160: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED /* FIXME: what happens, if we had sent XOFF but not yet XON? */ tty->flow_ctrl &= ~(FL_ISNTXOF); 8005164: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED 8005168: 34 01 ff fd mvi r1,-3 <== NOT EXECUTED 800516c: a0 41 08 00 and r1,r2,r1 <== NOT EXECUTED 8005170: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED } /* check for incoming RTS/CTS flow control switched off */ if (( tty->flow_ctrl & FL_MDRTS) && !(tty->termios.c_cflag & CRTSCTS)) { 8005174: 29 61 00 b8 lw r1,(r11+184) 8005178: 20 21 01 00 andi r1,r1,0x100 800517c: 44 20 00 12 be r1,r0,80051c4 <== ALWAYS TAKEN 8005180: 29 61 00 38 lw r1,(r11+56) <== NOT EXECUTED 8005184: 48 01 00 10 bg r0,r1,80051c4 <== NOT EXECUTED /* clear related flags in flow_ctrl */ tty->flow_ctrl &= ~(FL_MDRTS); 8005188: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED 800518c: 34 01 fe ff mvi r1,-257 <== NOT EXECUTED 8005190: a0 41 08 00 and r1,r2,r1 <== NOT EXECUTED 8005194: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED /* restart remote Tx, if it was stopped */ if ((tty->flow_ctrl & FL_IRTSOFF) && (tty->device.startRemoteTx != NULL)) { 8005198: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED 800519c: 20 21 00 04 andi r1,r1,0x4 <== NOT EXECUTED 80051a0: 44 20 00 05 be r1,r0,80051b4 <== NOT EXECUTED 80051a4: 29 62 00 b0 lw r2,(r11+176) <== NOT EXECUTED 80051a8: 44 40 00 03 be r2,r0,80051b4 <== NOT EXECUTED tty->device.startRemoteTx(tty->minor); 80051ac: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED 80051b0: d8 40 00 00 call r2 <== NOT EXECUTED } tty->flow_ctrl &= ~(FL_IRTSOFF); 80051b4: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED 80051b8: 34 01 ff fb mvi r1,-5 <== NOT EXECUTED 80051bc: a0 41 08 00 and r1,r2,r1 <== NOT EXECUTED 80051c0: 59 61 00 b8 sw (r11+184),r1 <== 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) { 80051c4: 29 61 00 38 lw r1,(r11+56) 80051c8: 4c 20 00 04 bge r1,r0,80051d8 <== ALWAYS TAKEN tty->flow_ctrl |= FL_MDRTS; 80051cc: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED 80051d0: 38 21 01 00 ori r1,r1,0x100 <== NOT EXECUTED 80051d4: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED } /* check for incoming XON/XOF flow control switched on */ if (tty->termios.c_iflag & IXOFF) { 80051d8: 29 61 00 30 lw r1,(r11+48) 80051dc: 20 22 10 00 andi r2,r1,0x1000 80051e0: 44 40 00 04 be r2,r0,80051f0 tty->flow_ctrl |= FL_MDXOF; 80051e4: 29 62 00 b8 lw r2,(r11+184) 80051e8: 38 42 04 00 ori r2,r2,0x400 80051ec: 59 62 00 b8 sw (r11+184),r2 } /* check for outgoing XON/XOF flow control switched on */ if (tty->termios.c_iflag & IXON) { 80051f0: 20 21 04 00 andi r1,r1,0x400 80051f4: 44 20 00 04 be r1,r0,8005204 tty->flow_ctrl |= FL_MDXON; 80051f8: 29 61 00 b8 lw r1,(r11+184) 80051fc: 38 21 02 00 ori r1,r1,0x200 8005200: 59 61 00 b8 sw (r11+184),r1 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) { 8005204: 29 6e 00 3c lw r14,(r11+60) 8005208: 21 ce 00 02 andi r14,r14,0x2 800520c: 5d c0 00 11 bne r14,r0,8005250 tty->rawInBufSemaphoreOptions = RTEMS_WAIT; tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT; tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT; } else { tty->vtimeTicks = tty->termios.c_cc[VTIME] * 8005210: 41 6f 00 46 lbu r15,(r11+70) rtems_clock_get_ticks_per_second() / 10; 8005214: f8 00 05 e9 calli 80069b8 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] * 8005218: b9 e0 10 00 mv r2,r15 800521c: f8 00 67 61 calli 801efa0 <__mulsi3> rtems_clock_get_ticks_per_second() / 10; 8005220: 34 02 00 0a mvi r2,10 8005224: f8 00 67 c4 calli 801f134 <__udivsi3> if (tty->termios.c_cc[VTIME]) { 8005228: 41 62 00 46 lbu r2,(r11+70) 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] * 800522c: 59 61 00 54 sw (r11+84),r1 8005230: 41 63 00 47 lbu r3,(r11+71) rtems_clock_get_ticks_per_second() / 10; if (tty->termios.c_cc[VTIME]) { 8005234: 44 4e 00 06 be r2,r14,800524c tty->rawInBufSemaphoreOptions = RTEMS_WAIT; 8005238: 59 60 00 6c sw (r11+108),r0 tty->rawInBufSemaphoreTimeout = tty->vtimeTicks; 800523c: 59 61 00 70 sw (r11+112),r1 if (tty->termios.c_cc[VMIN]) 8005240: 5c 60 00 06 bne r3,r0,8005258 tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT; else tty->rawInBufSemaphoreFirstTimeout = tty->vtimeTicks; 8005244: 59 61 00 74 sw (r11+116),r1 8005248: e0 00 00 08 bi 8005268 } else { if (tty->termios.c_cc[VMIN]) { 800524c: 44 62 00 05 be r3,r2,8005260 <== ALWAYS TAKEN tty->rawInBufSemaphoreOptions = RTEMS_WAIT; 8005250: 59 60 00 6c sw (r11+108),r0 tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT; 8005254: 59 60 00 70 sw (r11+112),r0 tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT; 8005258: 59 60 00 74 sw (r11+116),r0 800525c: e0 00 00 03 bi 8005268 } else { tty->rawInBufSemaphoreOptions = RTEMS_NO_WAIT; 8005260: 34 01 00 01 mvi r1,1 8005264: 59 61 00 6c sw (r11+108),r1 } } } if (tty->device.setAttributes) 8005268: 29 63 00 a8 lw r3,(r11+168) 800526c: 44 60 00 3c be r3,r0,800535c <== NEVER TAKEN (*tty->device.setAttributes)(tty->minor, &tty->termios); 8005270: 29 61 00 10 lw r1,(r11+16) 8005274: 35 62 00 30 addi r2,r11,48 8005278: d8 60 00 00 call r3 800527c: e0 00 00 38 bi 800535c break; case RTEMS_IO_TCDRAIN: drainOutput (tty); 8005280: b9 60 08 00 mv r1,r11 8005284: fb ff fd 80 calli 8004884 break; 8005288: e0 00 00 35 bi 800535c case RTEMS_IO_SNDWAKEUP: tty->tty_snd = *wakeup; 800528c: 29 c1 00 00 lw r1,(r14+0) 8005290: 59 61 00 d4 sw (r11+212),r1 8005294: 29 c1 00 04 lw r1,(r14+4) 8005298: 59 61 00 d8 sw (r11+216),r1 break; 800529c: e0 00 00 30 bi 800535c case RTEMS_IO_RCVWAKEUP: tty->tty_rcv = *wakeup; 80052a0: 29 c1 00 00 lw r1,(r14+0) 80052a4: 59 61 00 dc sw (r11+220),r1 80052a8: 29 c1 00 04 lw r1,(r14+4) 80052ac: 59 61 00 e0 sw (r11+224),r1 break; 80052b0: e0 00 00 2b bi 800535c #if 1 /* FIXME */ case TIOCSETD: /* * close old line discipline */ if (rtems_termios_linesw[tty->t_line].l_close != NULL) { 80052b4: 29 61 00 cc lw r1,(r11+204) 80052b8: 34 02 00 05 mvi r2,5 80052bc: 78 0e 08 02 mvhi r14,0x802 80052c0: fb ff f2 37 calli 8001b9c <__ashlsi3> 80052c4: 39 ce 39 44 ori r14,r14,0x3944 80052c8: b5 c1 08 00 add r1,r14,r1 80052cc: 28 22 00 04 lw r2,(r1+4) 80052d0: 44 40 00 04 be r2,r0,80052e0 sc = rtems_termios_linesw[tty->t_line].l_close(tty); 80052d4: b9 60 08 00 mv r1,r11 80052d8: d8 40 00 00 call r2 80052dc: b8 20 68 00 mv r13,r1 } tty->t_line=*(int*)(args->buffer); 80052e0: 29 81 00 08 lw r1,(r12+8) tty->t_sc = NULL; /* ensure that no more valid data */ /* * open new line discipline */ if (rtems_termios_linesw[tty->t_line].l_open != NULL) { 80052e4: 34 02 00 05 mvi r2,5 80052e8: 78 0e 08 02 mvhi r14,0x802 * 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); 80052ec: 28 21 00 00 lw r1,(r1+0) tty->t_sc = NULL; /* ensure that no more valid data */ 80052f0: 59 60 00 d0 sw (r11+208),r0 /* * open new line discipline */ if (rtems_termios_linesw[tty->t_line].l_open != NULL) { 80052f4: 39 ce 39 44 ori r14,r14,0x3944 * 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); 80052f8: 59 61 00 cc sw (r11+204),r1 tty->t_sc = NULL; /* ensure that no more valid data */ /* * open new line discipline */ if (rtems_termios_linesw[tty->t_line].l_open != NULL) { 80052fc: fb ff f2 28 calli 8001b9c <__ashlsi3> 8005300: b5 c1 08 00 add r1,r14,r1 8005304: 28 22 00 00 lw r2,(r1+0) 8005308: 44 40 00 15 be r2,r0,800535c <== NEVER TAKEN sc = rtems_termios_linesw[tty->t_line].l_open(tty); 800530c: b9 60 08 00 mv r1,r11 8005310: d8 40 00 00 call r2 8005314: b8 20 68 00 mv r13,r1 8005318: e0 00 00 11 bi 800535c } break; case TIOCGETD: *(int*)(args->buffer)=tty->t_line; 800531c: 29 81 00 08 lw r1,(r12+8) 8005320: 29 62 00 cc lw r2,(r11+204) 8005324: 58 22 00 00 sw (r1+0),r2 break; 8005328: e0 00 00 0d bi 800535c #endif case FIONREAD: { int rawnc = tty->rawInBuf.Tail - tty->rawInBuf.Head; 800532c: 29 62 00 60 lw r2,(r11+96) <== NOT EXECUTED 8005330: 29 61 00 5c lw r1,(r11+92) <== NOT EXECUTED 8005334: c8 41 08 00 sub r1,r2,r1 <== NOT EXECUTED if ( rawnc < 0 ) 8005338: 4c 20 00 03 bge r1,r0,8005344 <== NOT EXECUTED rawnc += tty->rawInBuf.Size; 800533c: 29 62 00 64 lw r2,(r11+100) <== NOT EXECUTED 8005340: b4 22 08 00 add r1,r1,r2 <== NOT EXECUTED /* Half guess that this is the right operation */ *(int *)args->buffer = tty->ccount - tty->cindex + rawnc; 8005344: 29 64 00 20 lw r4,(r11+32) <== NOT EXECUTED 8005348: 29 62 00 24 lw r2,(r11+36) <== NOT EXECUTED 800534c: 29 83 00 08 lw r3,(r12+8) <== NOT EXECUTED 8005350: c8 82 10 00 sub r2,r4,r2 <== NOT EXECUTED 8005354: b4 41 08 00 add r1,r2,r1 <== NOT EXECUTED 8005358: 58 61 00 00 sw (r3+0),r1 <== NOT EXECUTED } break; } rtems_semaphore_release (tty->osem); 800535c: 29 61 00 18 lw r1,(r11+24) 8005360: f8 00 07 bb calli 800724c args->ioctl_return = sc; return sc; } 8005364: b9 a0 08 00 mv r1,r13 } break; } rtems_semaphore_release (tty->osem); args->ioctl_return = sc; 8005368: 59 8d 00 0c sw (r12+12),r13 return sc; } 800536c: 2b 9d 00 04 lw ra,(sp+4) 8005370: 2b 8b 00 18 lw r11,(sp+24) 8005374: 2b 8c 00 14 lw r12,(sp+20) 8005378: 2b 8d 00 10 lw r13,(sp+16) 800537c: 2b 8e 00 0c lw r14,(sp+12) 8005380: 2b 8f 00 08 lw r15,(sp+8) 8005384: 37 9c 00 18 addi sp,sp,24 8005388: c3 a0 00 00 ret =============================================================================== 08004914 : rtems_device_major_number major, rtems_device_minor_number minor, void *arg, const rtems_termios_callbacks *callbacks ) { 8004914: 37 9c ff d4 addi sp,sp,-44 8004918: 5b 8b 00 2c sw (sp+44),r11 800491c: 5b 8c 00 28 sw (sp+40),r12 8004920: 5b 8d 00 24 sw (sp+36),r13 8004924: 5b 8e 00 20 sw (sp+32),r14 8004928: 5b 8f 00 1c sw (sp+28),r15 800492c: 5b 90 00 18 sw (sp+24),r16 8004930: 5b 91 00 14 sw (sp+20),r17 8004934: 5b 92 00 10 sw (sp+16),r18 8004938: 5b 93 00 0c sw (sp+12),r19 800493c: 5b 94 00 08 sw (sp+8),r20 8004940: 5b 9d 00 04 sw (sp+4),ra 8004944: b8 20 88 00 mv r17,r1 struct rtems_termios_tty *tty; /* * See if the device has already been opened */ sc = rtems_semaphore_obtain( 8004948: 78 01 08 02 mvhi r1,0x802 800494c: 38 21 3b 10 ori r1,r1,0x3b10 8004950: 28 21 00 00 lw r1,(r1+0) rtems_device_major_number major, rtems_device_minor_number minor, void *arg, const rtems_termios_callbacks *callbacks ) { 8004954: b8 40 90 00 mv r18,r2 8004958: b8 60 a0 00 mv r20,r3 struct rtems_termios_tty *tty; /* * See if the device has already been opened */ sc = rtems_semaphore_obtain( 800495c: 34 02 00 00 mvi r2,0 8004960: 34 03 00 00 mvi r3,0 rtems_device_major_number major, rtems_device_minor_number minor, void *arg, const rtems_termios_callbacks *callbacks ) { 8004964: b8 80 68 00 mv r13,r4 struct rtems_termios_tty *tty; /* * See if the device has already been opened */ sc = rtems_semaphore_obtain( 8004968: f8 00 09 e9 calli 800710c 800496c: b8 20 78 00 mv r15,r1 rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) 8004970: 5c 20 01 02 bne r1,r0,8004d78 <== NEVER TAKEN return sc; for (tty = rtems_termios_ttyHead ; tty != NULL ; tty = tty->forw) { 8004974: 78 01 08 02 mvhi r1,0x802 8004978: 38 21 3b 18 ori r1,r1,0x3b18 800497c: 28 2e 00 00 lw r14,(r1+0) 8004980: b9 c0 60 00 mv r12,r14 8004984: e0 00 00 06 bi 800499c if ((tty->major == major) && (tty->minor == minor)) 8004988: 29 81 00 0c lw r1,(r12+12) <== NOT EXECUTED 800498c: 5c 31 00 03 bne r1,r17,8004998 <== NOT EXECUTED 8004990: 29 81 00 10 lw r1,(r12+16) <== NOT EXECUTED 8004994: 44 32 00 d8 be r1,r18,8004cf4 <== NOT EXECUTED 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) { 8004998: 29 8c 00 00 lw r12,(r12+0) <== NOT EXECUTED 800499c: 5d 80 ff fb bne r12,r0,8004988 <== NEVER TAKEN 80049a0: e0 00 01 04 bi 8004db0 return RTEMS_NO_MEMORY; } /* * allocate raw input buffer */ tty->rawInBuf.Size = RAW_INPUT_BUFFER_SIZE; 80049a4: 78 01 08 02 mvhi r1,0x802 80049a8: 38 21 33 44 ori r1,r1,0x3344 80049ac: 28 21 00 00 lw r1,(r1+0) 80049b0: 59 81 00 64 sw (r12+100),r1 tty->rawInBuf.theBuf = malloc (tty->rawInBuf.Size); 80049b4: 29 81 00 64 lw r1,(r12+100) 80049b8: fb ff fb c8 calli 80038d8 80049bc: 59 81 00 58 sw (r12+88),r1 80049c0: b8 20 80 00 mv r16,r1 if (tty->rawInBuf.theBuf == NULL) { 80049c4: 5c 20 00 09 bne r1,r0,80049e8 free(tty); 80049c8: b9 80 08 00 mv r1,r12 80049cc: fb ff fa 00 calli 80031cc rtems_semaphore_release (rtems_termios_ttyMutex); 80049d0: 78 01 08 02 mvhi r1,0x802 80049d4: 38 21 3b 10 ori r1,r1,0x3b10 80049d8: 28 21 00 00 lw r1,(r1+0) return RTEMS_NO_MEMORY; 80049dc: 34 0f 00 1a mvi r15,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); 80049e0: f8 00 0a 1b calli 800724c return RTEMS_NO_MEMORY; 80049e4: e0 00 00 e5 bi 8004d78 } /* * allocate raw output buffer */ tty->rawOutBuf.Size = RAW_OUTPUT_BUFFER_SIZE; 80049e8: 78 01 08 02 mvhi r1,0x802 80049ec: 38 21 33 48 ori r1,r1,0x3348 80049f0: 28 21 00 00 lw r1,(r1+0) 80049f4: 59 81 00 88 sw (r12+136),r1 tty->rawOutBuf.theBuf = malloc (tty->rawOutBuf.Size); 80049f8: 29 81 00 88 lw r1,(r12+136) 80049fc: fb ff fb b7 calli 80038d8 8004a00: 59 81 00 7c sw (r12+124),r1 8004a04: b8 20 98 00 mv r19,r1 if (tty->rawOutBuf.theBuf == NULL) { 8004a08: 44 20 00 09 be r1,r0,8004a2c return RTEMS_NO_MEMORY; } /* * allocate cooked buffer */ tty->cbuf = malloc (CBUFSIZE); 8004a0c: 78 01 08 02 mvhi r1,0x802 8004a10: 38 21 33 40 ori r1,r1,0x3340 8004a14: 28 21 00 00 lw r1,(r1+0) 8004a18: fb ff fb b0 calli 80038d8 8004a1c: 59 81 00 1c sw (r12+28),r1 if (tty->cbuf == NULL) { 8004a20: 5c 20 00 06 bne r1,r0,8004a38 <== ALWAYS TAKEN free((void *)(tty->rawOutBuf.theBuf)); 8004a24: ba 60 08 00 mv r1,r19 <== NOT EXECUTED 8004a28: fb ff f9 e9 calli 80031cc <== NOT EXECUTED free((void *)(tty->rawInBuf.theBuf)); 8004a2c: ba 00 08 00 mv r1,r16 8004a30: fb ff f9 e7 calli 80031cc 8004a34: e3 ff ff e5 bi 80049c8 return RTEMS_NO_MEMORY; } /* * Initialize wakeup callbacks */ tty->tty_snd.sw_pfn = NULL; 8004a38: 59 80 00 d4 sw (r12+212),r0 tty->tty_snd.sw_arg = NULL; 8004a3c: 59 80 00 d8 sw (r12+216),r0 tty->tty_rcv.sw_pfn = NULL; 8004a40: 59 80 00 dc sw (r12+220),r0 tty->tty_rcv.sw_arg = NULL; 8004a44: 59 80 00 e0 sw (r12+224),r0 tty->tty_rcvwakeup = 0; 8004a48: 59 80 00 e4 sw (r12+228),r0 /* * link tty */ tty->forw = rtems_termios_ttyHead; 8004a4c: 59 8e 00 00 sw (r12+0),r14 tty->back = NULL; 8004a50: 59 80 00 04 sw (r12+4),r0 if (rtems_termios_ttyHead != NULL) 8004a54: 45 c0 00 02 be r14,r0,8004a5c <== ALWAYS TAKEN rtems_termios_ttyHead->back = tty; 8004a58: 59 cc 00 04 sw (r14+4),r12 <== NOT EXECUTED rtems_termios_ttyHead = tty; 8004a5c: 78 01 08 02 mvhi r1,0x802 if (rtems_termios_ttyTail == NULL) 8004a60: 78 04 08 02 mvhi r4,0x802 */ tty->forw = rtems_termios_ttyHead; tty->back = NULL; if (rtems_termios_ttyHead != NULL) rtems_termios_ttyHead->back = tty; rtems_termios_ttyHead = tty; 8004a64: 38 21 3b 18 ori r1,r1,0x3b18 if (rtems_termios_ttyTail == NULL) 8004a68: 38 84 3b 14 ori r4,r4,0x3b14 */ tty->forw = rtems_termios_ttyHead; tty->back = NULL; if (rtems_termios_ttyHead != NULL) rtems_termios_ttyHead->back = tty; rtems_termios_ttyHead = tty; 8004a6c: 58 2b 00 00 sw (r1+0),r11 if (rtems_termios_ttyTail == NULL) 8004a70: 28 81 00 00 lw r1,(r4+0) 8004a74: 5c 20 00 02 bne r1,r0,8004a7c <== NEVER TAKEN rtems_termios_ttyTail = tty; 8004a78: 58 8b 00 00 sw (r4+0),r11 /* * Set up mutex semaphores */ sc = rtems_semaphore_create ( rtems_build_name ('T', 'R', 'i', c), 8004a7c: 78 0e 08 02 mvhi r14,0x802 tty->major = major; /* * Set up mutex semaphores */ sc = rtems_semaphore_create ( 8004a80: 78 03 08 02 mvhi r3,0x802 8004a84: 38 63 14 98 ori r3,r3,0x1498 rtems_build_name ('T', 'R', 'i', c), 8004a88: 39 ce 33 4c ori r14,r14,0x334c 8004a8c: 41 c2 00 00 lbu r2,(r14+0) tty->major = major; /* * Set up mutex semaphores */ sc = rtems_semaphore_create ( 8004a90: 28 61 00 00 lw r1,(r3+0) rtems_termios_ttyHead->back = tty; rtems_termios_ttyHead = tty; if (rtems_termios_ttyTail == NULL) rtems_termios_ttyTail = tty; tty->minor = minor; 8004a94: 59 72 00 10 sw (r11+16),r18 tty->major = major; 8004a98: 59 71 00 0c sw (r11+12),r17 /* * Set up mutex semaphores */ sc = rtems_semaphore_create ( 8004a9c: b8 41 08 00 or r1,r2,r1 8004aa0: 34 03 00 54 mvi r3,84 8004aa4: 34 02 00 01 mvi r2,1 8004aa8: 34 04 00 00 mvi r4,0 8004aac: 35 65 00 14 addi r5,r11,20 8004ab0: f8 00 08 eb calli 8006e5c 8004ab4: b8 20 80 00 mv r16,r1 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) 8004ab8: 5c 20 00 ab bne r1,r0,8004d64 <== NEVER TAKEN rtems_fatal_error_occurred (sc); sc = rtems_semaphore_create ( 8004abc: 78 03 08 02 mvhi r3,0x802 8004ac0: 38 63 14 9c ori r3,r3,0x149c rtems_build_name ('T', 'R', 'o', c), 8004ac4: 41 c2 00 00 lbu r2,(r14+0) 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 ( 8004ac8: 28 61 00 00 lw r1,(r3+0) 8004acc: 34 04 00 00 mvi r4,0 8004ad0: 34 03 00 54 mvi r3,84 8004ad4: b8 41 08 00 or r1,r2,r1 8004ad8: 35 65 00 18 addi r5,r11,24 8004adc: 34 02 00 01 mvi r2,1 8004ae0: f8 00 08 df calli 8006e5c 8004ae4: b8 20 98 00 mv r19,r1 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) 8004ae8: 5c 30 00 9f bne r1,r16,8004d64 <== NEVER TAKEN rtems_fatal_error_occurred (sc); sc = rtems_semaphore_create ( 8004aec: 78 03 08 02 mvhi r3,0x802 8004af0: 38 63 14 a0 ori r3,r3,0x14a0 rtems_build_name ('T', 'R', 'x', c), 8004af4: 41 c2 00 00 lbu r2,(r14+0) 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 ( 8004af8: 28 61 00 00 lw r1,(r3+0) 8004afc: 34 04 00 00 mvi r4,0 8004b00: 34 03 00 20 mvi r3,32 8004b04: b8 41 08 00 or r1,r2,r1 8004b08: 35 65 00 8c addi r5,r11,140 8004b0c: 34 02 00 00 mvi r2,0 8004b10: f8 00 08 d3 calli 8006e5c 8004b14: b8 20 80 00 mv r16,r1 rtems_build_name ('T', 'R', 'x', c), 0, RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_FIFO, RTEMS_NO_PRIORITY, &tty->rawOutBuf.Semaphore); if (sc != RTEMS_SUCCESSFUL) 8004b18: 5c 33 00 93 bne r1,r19,8004d64 <== NEVER TAKEN tty->rawOutBufState = rob_idle; /* * Set callbacks */ tty->device = *callbacks; 8004b1c: 29 a2 00 18 lw r2,(r13+24) 8004b20: 29 a8 00 00 lw r8,(r13+0) 8004b24: 29 a7 00 04 lw r7,(r13+4) 8004b28: 29 a6 00 08 lw r6,(r13+8) 8004b2c: 29 a5 00 0c lw r5,(r13+12) 8004b30: 29 a4 00 10 lw r4,(r13+16) 8004b34: 29 a3 00 14 lw r3,(r13+20) 8004b38: 29 a1 00 1c lw r1,(r13+28) 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; 8004b3c: 59 60 00 94 sw (r11+148),r0 /* * Set callbacks */ tty->device = *callbacks; 8004b40: 59 62 00 b0 sw (r11+176),r2 8004b44: 59 68 00 98 sw (r11+152),r8 8004b48: 59 67 00 9c sw (r11+156),r7 8004b4c: 59 66 00 a0 sw (r11+160),r6 8004b50: 59 65 00 a4 sw (r11+164),r5 8004b54: 59 64 00 a8 sw (r11+168),r4 8004b58: 59 63 00 ac sw (r11+172),r3 8004b5c: 59 61 00 b4 sw (r11+180),r1 /* * Create I/O tasks */ if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { 8004b60: 34 02 00 02 mvi r2,2 8004b64: 5c 22 00 1a bne r1,r2,8004bcc sc = rtems_task_create ( 8004b68: 78 03 08 02 mvhi r3,0x802 8004b6c: 38 63 14 a4 ori r3,r3,0x14a4 rtems_build_name ('T', 'x', 'T', c), 8004b70: 41 c2 00 00 lbu r2,(r14+0) /* * Create I/O tasks */ if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { sc = rtems_task_create ( 8004b74: 28 61 00 00 lw r1,(r3+0) 8004b78: 34 04 05 00 mvi r4,1280 8004b7c: 34 03 04 00 mvi r3,1024 8004b80: b8 41 08 00 or r1,r2,r1 8004b84: 34 05 00 00 mvi r5,0 8004b88: 34 02 00 0a mvi r2,10 8004b8c: 35 66 00 c8 addi r6,r11,200 8004b90: f8 00 09 ed calli 8007344 8004b94: b8 20 68 00 mv r13,r1 TERMIOS_TXTASK_STACKSIZE, RTEMS_NO_PREEMPT | RTEMS_NO_TIMESLICE | RTEMS_NO_ASR, RTEMS_NO_FLOATING_POINT | RTEMS_LOCAL, &tty->txTaskId); if (sc != RTEMS_SUCCESSFUL) 8004b98: 5c 30 00 73 bne r1,r16,8004d64 <== NEVER TAKEN rtems_fatal_error_occurred (sc); sc = rtems_task_create ( 8004b9c: 78 03 08 02 mvhi r3,0x802 8004ba0: 38 63 14 a8 ori r3,r3,0x14a8 rtems_build_name ('R', 'x', 'T', c), 8004ba4: 41 c2 00 00 lbu r2,(r14+0) RTEMS_NO_ASR, RTEMS_NO_FLOATING_POINT | RTEMS_LOCAL, &tty->txTaskId); if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); sc = rtems_task_create ( 8004ba8: 28 61 00 00 lw r1,(r3+0) 8004bac: 34 04 05 00 mvi r4,1280 8004bb0: 34 03 04 00 mvi r3,1024 8004bb4: b8 41 08 00 or r1,r2,r1 8004bb8: 34 05 00 00 mvi r5,0 8004bbc: 34 02 00 09 mvi r2,9 8004bc0: 35 66 00 c4 addi r6,r11,196 8004bc4: f8 00 09 e0 calli 8007344 TERMIOS_RXTASK_STACKSIZE, RTEMS_NO_PREEMPT | RTEMS_NO_TIMESLICE | RTEMS_NO_ASR, RTEMS_NO_FLOATING_POINT | RTEMS_LOCAL, &tty->rxTaskId); if (sc != RTEMS_SUCCESSFUL) 8004bc8: 5c 2d 00 67 bne r1,r13,8004d64 <== NEVER TAKEN rtems_fatal_error_occurred (sc); } if ((tty->device.pollRead == NULL) || 8004bcc: 29 61 00 a0 lw r1,(r11+160) 8004bd0: 44 20 00 04 be r1,r0,8004be0 8004bd4: 29 62 00 b4 lw r2,(r11+180) 8004bd8: 34 01 00 02 mvi r1,2 8004bdc: 5c 41 00 0e bne r2,r1,8004c14 (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)){ sc = rtems_semaphore_create ( rtems_build_name ('T', 'R', 'r', c), 8004be0: 78 01 08 02 mvhi r1,0x802 rtems_fatal_error_occurred (sc); } if ((tty->device.pollRead == NULL) || (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)){ sc = rtems_semaphore_create ( 8004be4: 78 03 08 02 mvhi r3,0x802 rtems_build_name ('T', 'R', 'r', c), 8004be8: 38 21 33 4c ori r1,r1,0x334c rtems_fatal_error_occurred (sc); } if ((tty->device.pollRead == NULL) || (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)){ sc = rtems_semaphore_create ( 8004bec: 38 63 14 ac ori r3,r3,0x14ac rtems_build_name ('T', 'R', 'r', c), 8004bf0: 40 22 00 00 lbu r2,(r1+0) rtems_fatal_error_occurred (sc); } if ((tty->device.pollRead == NULL) || (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)){ sc = rtems_semaphore_create ( 8004bf4: 28 61 00 00 lw r1,(r3+0) 8004bf8: 34 04 00 00 mvi r4,0 8004bfc: 34 03 00 24 mvi r3,36 8004c00: b8 41 08 00 or r1,r2,r1 8004c04: 35 65 00 68 addi r5,r11,104 8004c08: 34 02 00 00 mvi r2,0 8004c0c: f8 00 08 94 calli 8006e5c rtems_build_name ('T', 'R', 'r', c), 0, RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_PRIORITY, RTEMS_NO_PRIORITY, &tty->rawInBuf.Semaphore); if (sc != RTEMS_SUCCESSFUL) 8004c10: 5c 20 00 55 bne r1,r0,8004d64 <== NEVER TAKEN } /* * Set default parameters */ tty->termios.c_iflag = BRKINT | ICRNL | IXON | IMAXBEL; 8004c14: 34 01 25 02 mvi r1,9474 8004c18: 59 61 00 30 sw (r11+48),r1 tty->termios.c_oflag = OPOST | ONLCR | XTABS; 8004c1c: 34 01 18 05 mvi r1,6149 8004c20: 59 61 00 34 sw (r11+52),r1 tty->termios.c_cflag = B9600 | CS8 | CREAD | CLOCAL; 8004c24: 34 01 08 bd mvi r1,2237 8004c28: 59 61 00 38 sw (r11+56),r1 tty->termios.c_lflag = 8004c2c: 34 21 79 7e addi r1,r1,31102 8004c30: 59 61 00 3c sw (r11+60),r1 ISIG | ICANON | IEXTEN | ECHO | ECHOK | ECHOE | ECHOCTL; tty->termios.c_cc[VINTR] = '\003'; 8004c34: 34 01 00 03 mvi r1,3 8004c38: 31 61 00 41 sb (r11+65),r1 tty->termios.c_cc[VQUIT] = '\034'; 8004c3c: 34 01 00 1c mvi r1,28 8004c40: 31 61 00 42 sb (r11+66),r1 tty->termios.c_cc[VERASE] = '\177'; 8004c44: 34 01 00 7f mvi r1,127 8004c48: 31 61 00 43 sb (r11+67),r1 tty->termios.c_cc[VKILL] = '\025'; 8004c4c: 34 01 00 15 mvi r1,21 8004c50: 31 61 00 44 sb (r11+68),r1 tty->termios.c_cc[VEOF] = '\004'; 8004c54: 34 01 00 04 mvi r1,4 8004c58: 31 61 00 45 sb (r11+69),r1 tty->termios.c_cc[VEOL] = '\000'; tty->termios.c_cc[VEOL2] = '\000'; tty->termios.c_cc[VSTART] = '\021'; 8004c5c: 34 01 00 11 mvi r1,17 8004c60: 31 61 00 49 sb (r11+73),r1 tty->termios.c_cc[VSTOP] = '\023'; 8004c64: 34 01 00 13 mvi r1,19 8004c68: 31 61 00 4a sb (r11+74),r1 tty->termios.c_cc[VSUSP] = '\032'; 8004c6c: 34 01 00 1a mvi r1,26 8004c70: 31 61 00 4b sb (r11+75),r1 tty->termios.c_cc[VREPRINT] = '\022'; 8004c74: 34 01 00 12 mvi r1,18 8004c78: 31 61 00 4d sb (r11+77),r1 tty->termios.c_cc[VDISCARD] = '\017'; 8004c7c: 34 01 00 0f mvi r1,15 8004c80: 31 61 00 4e sb (r11+78),r1 tty->termios.c_cc[VWERASE] = '\027'; 8004c84: 34 01 00 17 mvi r1,23 8004c88: 31 61 00 4f sb (r11+79),r1 tty->termios.c_cc[VLNEXT] = '\026'; /* start with no flow control, clear flow control flags */ tty->flow_ctrl = 0; 8004c8c: 59 60 00 b8 sw (r11+184),r0 tty->termios.c_cc[VSTOP] = '\023'; tty->termios.c_cc[VSUSP] = '\032'; tty->termios.c_cc[VREPRINT] = '\022'; tty->termios.c_cc[VDISCARD] = '\017'; tty->termios.c_cc[VWERASE] = '\027'; tty->termios.c_cc[VLNEXT] = '\026'; 8004c90: 34 01 00 16 mvi r1,22 8004c94: 31 61 00 50 sb (r11+80),r1 /* 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; 8004c98: 29 61 00 64 lw r1,(r11+100) 8004c9c: 34 02 00 01 mvi r2,1 tty->termios.c_cc[VINTR] = '\003'; tty->termios.c_cc[VQUIT] = '\034'; tty->termios.c_cc[VERASE] = '\177'; tty->termios.c_cc[VKILL] = '\025'; tty->termios.c_cc[VEOF] = '\004'; tty->termios.c_cc[VEOL] = '\000'; 8004ca0: 31 60 00 4c sb (r11+76),r0 tty->termios.c_cc[VEOL2] = '\000'; 8004ca4: 31 60 00 51 sb (r11+81),r0 /* 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; 8004ca8: f8 00 68 97 calli 801ef04 <__lshrsi3> tty->highwater = tty->rawInBuf.Size * 3/4; 8004cac: 29 6d 00 64 lw r13,(r11+100) /* 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; 8004cb0: 59 61 00 bc sw (r11+188),r1 tty->highwater = tty->rawInBuf.Size * 3/4; 8004cb4: 34 02 00 01 mvi r2,1 8004cb8: b9 a0 08 00 mv r1,r13 8004cbc: fb ff f3 b8 calli 8001b9c <__ashlsi3> 8004cc0: 34 02 00 02 mvi r2,2 8004cc4: b4 2d 08 00 add r1,r1,r13 8004cc8: f8 00 68 8f calli 801ef04 <__lshrsi3> /* * Bump name characer */ if (c++ == 'z') 8004ccc: 78 04 08 02 mvhi r4,0x802 8004cd0: 38 84 33 4c ori r4,r4,0x334c 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; 8004cd4: 59 61 00 c0 sw (r11+192),r1 /* * Bump name characer */ if (c++ == 'z') 8004cd8: 40 81 00 00 lbu r1,(r4+0) 8004cdc: 34 22 00 01 addi r2,r1,1 8004ce0: 30 82 00 00 sb (r4+0),r2 8004ce4: 34 02 00 7a mvi r2,122 8004ce8: 5c 22 00 03 bne r1,r2,8004cf4 c = 'a'; 8004cec: 34 01 00 61 mvi r1,97 8004cf0: 30 81 00 00 sb (r4+0),r1 } args->iop->data1 = tty; 8004cf4: 2a 81 00 00 lw r1,(r20+0) if (!tty->refcount++) { 8004cf8: 29 82 00 08 lw r2,(r12+8) */ if (c++ == 'z') c = 'a'; } args->iop->data1 = tty; 8004cfc: 58 2c 00 38 sw (r1+56),r12 if (!tty->refcount++) { 8004d00: 34 41 00 01 addi r1,r2,1 8004d04: 59 81 00 08 sw (r12+8),r1 8004d08: 5c 40 00 18 bne r2,r0,8004d68 <== NEVER TAKEN if (tty->device.firstOpen) 8004d0c: 29 84 00 98 lw r4,(r12+152) 8004d10: 44 82 00 05 be r4,r2,8004d24 <== ALWAYS TAKEN (*tty->device.firstOpen)(major, minor, arg); 8004d14: ba 20 08 00 mv r1,r17 <== NOT EXECUTED 8004d18: ba 40 10 00 mv r2,r18 <== NOT EXECUTED 8004d1c: ba 80 18 00 mv r3,r20 <== NOT EXECUTED 8004d20: d8 80 00 00 call r4 <== NOT EXECUTED /* * start I/O tasks, if needed */ if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { 8004d24: 29 82 00 b4 lw r2,(r12+180) 8004d28: 34 01 00 02 mvi r1,2 8004d2c: 5c 41 00 0f bne r2,r1,8004d68 sc = rtems_task_start( 8004d30: 29 81 00 c4 lw r1,(r12+196) 8004d34: 78 02 08 00 mvhi r2,0x800 8004d38: 38 42 62 9c ori r2,r2,0x629c 8004d3c: b9 80 18 00 mv r3,r12 8004d40: f8 00 0a 29 calli 80075e4 8004d44: b8 20 58 00 mv r11,r1 tty->rxTaskId, rtems_termios_rxdaemon, (rtems_task_argument)tty); if (sc != RTEMS_SUCCESSFUL) 8004d48: 5c 20 00 07 bne r1,r0,8004d64 <== NEVER TAKEN rtems_fatal_error_occurred (sc); sc = rtems_task_start( 8004d4c: 29 81 00 c8 lw r1,(r12+200) 8004d50: 78 02 08 00 mvhi r2,0x800 8004d54: 38 42 65 1c ori r2,r2,0x651c 8004d58: b9 80 18 00 mv r3,r12 8004d5c: f8 00 0a 22 calli 80075e4 tty->txTaskId, rtems_termios_txdaemon, (rtems_task_argument)tty); if (sc != RTEMS_SUCCESSFUL) 8004d60: 44 2b 00 02 be r1,r11,8004d68 <== ALWAYS TAKEN rtems_fatal_error_occurred (sc); 8004d64: f8 00 0a cd calli 8007898 <== NOT EXECUTED } } rtems_semaphore_release (rtems_termios_ttyMutex); 8004d68: 78 01 08 02 mvhi r1,0x802 8004d6c: 38 21 3b 10 ori r1,r1,0x3b10 8004d70: 28 21 00 00 lw r1,(r1+0) 8004d74: f8 00 09 36 calli 800724c return RTEMS_SUCCESSFUL; } 8004d78: b9 e0 08 00 mv r1,r15 8004d7c: 2b 9d 00 04 lw ra,(sp+4) 8004d80: 2b 8b 00 2c lw r11,(sp+44) 8004d84: 2b 8c 00 28 lw r12,(sp+40) 8004d88: 2b 8d 00 24 lw r13,(sp+36) 8004d8c: 2b 8e 00 20 lw r14,(sp+32) 8004d90: 2b 8f 00 1c lw r15,(sp+28) 8004d94: 2b 90 00 18 lw r16,(sp+24) 8004d98: 2b 91 00 14 lw r17,(sp+20) 8004d9c: 2b 92 00 10 lw r18,(sp+16) 8004da0: 2b 93 00 0c lw r19,(sp+12) 8004da4: 2b 94 00 08 lw r20,(sp+8) 8004da8: 37 9c 00 2c addi sp,sp,44 8004dac: c3 a0 00 00 ret static char c = 'a'; /* * Create a new device */ tty = calloc (1, sizeof (struct rtems_termios_tty)); 8004db0: 34 01 00 01 mvi r1,1 8004db4: 34 02 00 e8 mvi r2,232 8004db8: fb ff f7 5d calli 8002b2c 8004dbc: b8 20 60 00 mv r12,r1 8004dc0: b8 20 58 00 mv r11,r1 if (tty == NULL) { 8004dc4: 5c 20 fe f8 bne r1,r0,80049a4 8004dc8: e3 ff ff 02 bi 80049d0 =============================================================================== 0800538c : * Send characters to device-specific code */ void rtems_termios_puts ( const void *_buf, int len, struct rtems_termios_tty *tty) { 800538c: 37 9c ff dc addi sp,sp,-36 8005390: 5b 8b 00 24 sw (sp+36),r11 8005394: 5b 8c 00 20 sw (sp+32),r12 8005398: 5b 8d 00 1c sw (sp+28),r13 800539c: 5b 8e 00 18 sw (sp+24),r14 80053a0: 5b 8f 00 14 sw (sp+20),r15 80053a4: 5b 90 00 10 sw (sp+16),r16 80053a8: 5b 91 00 0c sw (sp+12),r17 80053ac: 5b 92 00 08 sw (sp+8),r18 80053b0: 5b 9d 00 04 sw (sp+4),ra 80053b4: b8 20 20 00 mv r4,r1 const unsigned char *buf = _buf; 80053b8: b8 20 68 00 mv r13,r1 unsigned int newHead; rtems_interrupt_level level; rtems_status_code sc; if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) { 80053bc: 28 61 00 b4 lw r1,(r3+180) * Send characters to device-specific code */ void rtems_termios_puts ( const void *_buf, int len, struct rtems_termios_tty *tty) { 80053c0: b8 40 70 00 mv r14,r2 80053c4: b8 60 58 00 mv r11,r3 const unsigned char *buf = _buf; unsigned int newHead; rtems_interrupt_level level; rtems_status_code sc; if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) { 80053c8: 5c 20 00 07 bne r1,r0,80053e4 (*tty->device.write)(tty->minor, (void *)buf, len); 80053cc: 28 65 00 a4 lw r5,(r3+164) 80053d0: 28 61 00 10 lw r1,(r3+16) 80053d4: b8 80 10 00 mv r2,r4 80053d8: b9 c0 18 00 mv r3,r14 80053dc: d8 a0 00 00 call r5 return; 80053e0: e0 00 00 36 bi 80054b8 } newHead = tty->rawOutBuf.Head; 80053e4: 28 6c 00 80 lw r12,(r3+128) * * To minimize latency, the memcpy should be done * with interrupts enabled. */ newHead = (newHead + 1) % tty->rawOutBuf.Size; rtems_interrupt_disable (level); 80053e8: 34 10 ff fe mvi r16,-2 while (newHead == tty->rawOutBuf.Tail) { tty->rawOutBufState = rob_wait; 80053ec: 34 12 00 02 mvi r18,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; 80053f0: 34 11 00 01 mvi r17,1 if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) { (*tty->device.write)(tty->minor, (void *)buf, len); return; } newHead = tty->rawOutBuf.Head; while (len) { 80053f4: e0 00 00 30 bi 80054b4 * len -= ncopy * * To minimize latency, the memcpy should be done * with interrupts enabled. */ newHead = (newHead + 1) % tty->rawOutBuf.Size; 80053f8: 29 62 00 88 lw r2,(r11+136) 80053fc: 35 81 00 01 addi r1,r12,1 8005400: f8 00 67 5d calli 801f174 <__umodsi3> 8005404: b8 20 60 00 mv r12,r1 rtems_interrupt_disable (level); 8005408: 90 00 78 00 rcsr r15,IE 800540c: a1 f0 08 00 and r1,r15,r16 8005410: d0 01 00 00 wcsr IE,r1 while (newHead == tty->rawOutBuf.Tail) { 8005414: e0 00 00 0c bi 8005444 tty->rawOutBufState = rob_wait; 8005418: 59 72 00 94 sw (r11+148),r18 rtems_interrupt_enable (level); 800541c: d0 0f 00 00 wcsr IE,r15 sc = rtems_semaphore_obtain( 8005420: 29 61 00 8c lw r1,(r11+140) 8005424: 34 02 00 00 mvi r2,0 8005428: 34 03 00 00 mvi r3,0 800542c: f8 00 07 38 calli 800710c tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) 8005430: 44 20 00 02 be r1,r0,8005438 <== ALWAYS TAKEN rtems_fatal_error_occurred (sc); 8005434: f8 00 09 19 calli 8007898 <== NOT EXECUTED rtems_interrupt_disable (level); 8005438: 90 00 78 00 rcsr r15,IE 800543c: a1 f0 08 00 and r1,r15,r16 8005440: d0 01 00 00 wcsr IE,r1 * 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) { 8005444: 29 61 00 84 lw r1,(r11+132) 8005448: 45 81 ff f4 be r12,r1,8005418 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++; 800544c: 29 61 00 80 lw r1,(r11+128) 8005450: 29 62 00 7c lw r2,(r11+124) 8005454: b4 41 08 00 add r1,r2,r1 8005458: 41 a2 00 00 lbu r2,(r13+0) 800545c: 35 ad 00 01 addi r13,r13,1 8005460: 30 22 00 00 sb (r1+0),r2 tty->rawOutBuf.Head = newHead; if (tty->rawOutBufState == rob_idle) { 8005464: 29 61 00 94 lw r1,(r11+148) if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); rtems_interrupt_disable (level); } tty->rawOutBuf.theBuf[tty->rawOutBuf.Head] = *buf++; tty->rawOutBuf.Head = newHead; 8005468: 59 6c 00 80 sw (r11+128),r12 if (tty->rawOutBufState == rob_idle) { 800546c: 5c 20 00 10 bne r1,r0,80054ac /* check, whether XOFF has been received */ if (!(tty->flow_ctrl & FL_ORCVXOF)) { 8005470: 29 62 00 b8 lw r2,(r11+184) 8005474: 20 42 00 10 andi r2,r2,0x10 8005478: 5c 41 00 09 bne r2,r1,800549c <== NEVER TAKEN (*tty->device.write)(tty->minor, 800547c: 29 63 00 7c lw r3,(r11+124) (char *)&tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1); 8005480: 29 62 00 84 lw r2,(r11+132) 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, 8005484: 29 64 00 a4 lw r4,(r11+164) 8005488: 29 61 00 10 lw r1,(r11+16) 800548c: b4 62 10 00 add r2,r3,r2 8005490: 34 03 00 01 mvi r3,1 8005494: d8 80 00 00 call r4 8005498: e0 00 00 04 bi 80054a8 (char *)&tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1); } else { /* remember that output has been stopped due to flow ctrl*/ tty->flow_ctrl |= FL_OSTOP; 800549c: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED 80054a0: 38 21 00 20 ori r1,r1,0x20 <== NOT EXECUTED 80054a4: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED } tty->rawOutBufState = rob_busy; 80054a8: 59 71 00 94 sw (r11+148),r17 } rtems_interrupt_enable (level); 80054ac: d0 0f 00 00 wcsr IE,r15 len--; 80054b0: 35 ce ff ff addi r14,r14,-1 if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) { (*tty->device.write)(tty->minor, (void *)buf, len); return; } newHead = tty->rawOutBuf.Head; while (len) { 80054b4: 5d c0 ff d1 bne r14,r0,80053f8 <== NEVER TAKEN tty->rawOutBufState = rob_busy; } rtems_interrupt_enable (level); len--; } } 80054b8: 2b 9d 00 04 lw ra,(sp+4) 80054bc: 2b 8b 00 24 lw r11,(sp+36) 80054c0: 2b 8c 00 20 lw r12,(sp+32) 80054c4: 2b 8d 00 1c lw r13,(sp+28) 80054c8: 2b 8e 00 18 lw r14,(sp+24) 80054cc: 2b 8f 00 14 lw r15,(sp+20) 80054d0: 2b 90 00 10 lw r16,(sp+16) 80054d4: 2b 91 00 0c lw r17,(sp+12) 80054d8: 2b 92 00 08 lw r18,(sp+8) 80054dc: 37 9c 00 24 addi sp,sp,36 80054e0: c3 a0 00 00 ret =============================================================================== 08005c04 : return RTEMS_SUCCESSFUL; } rtems_status_code rtems_termios_read (void *arg) { 8005c04: 37 9c ff cc addi sp,sp,-52 8005c08: 5b 8b 00 34 sw (sp+52),r11 8005c0c: 5b 8c 00 30 sw (sp+48),r12 8005c10: 5b 8d 00 2c sw (sp+44),r13 8005c14: 5b 8e 00 28 sw (sp+40),r14 8005c18: 5b 8f 00 24 sw (sp+36),r15 8005c1c: 5b 90 00 20 sw (sp+32),r16 8005c20: 5b 91 00 1c sw (sp+28),r17 8005c24: 5b 92 00 18 sw (sp+24),r18 8005c28: 5b 93 00 14 sw (sp+20),r19 8005c2c: 5b 94 00 10 sw (sp+16),r20 8005c30: 5b 95 00 0c sw (sp+12),r21 8005c34: 5b 96 00 08 sw (sp+8),r22 8005c38: 5b 9d 00 04 sw (sp+4),ra 8005c3c: b8 20 60 00 mv r12,r1 rtems_libio_rw_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 8005c40: 28 21 00 00 lw r1,(r1+0) uint32_t count = args->count; char *buffer = args->buffer; rtems_status_code sc; sc = rtems_semaphore_obtain (tty->isem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 8005c44: 34 02 00 00 mvi r2,0 8005c48: 34 03 00 00 mvi r3,0 rtems_status_code rtems_termios_read (void *arg) { rtems_libio_rw_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 8005c4c: 28 2b 00 38 lw r11,(r1+56) uint32_t count = args->count; 8005c50: 29 8f 00 14 lw r15,(r12+20) char *buffer = args->buffer; 8005c54: 29 91 00 10 lw r17,(r12+16) rtems_status_code sc; sc = rtems_semaphore_obtain (tty->isem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 8005c58: 29 61 00 14 lw r1,(r11+20) 8005c5c: f8 00 05 2c calli 800710c 8005c60: b8 20 70 00 mv r14,r1 if (sc != RTEMS_SUCCESSFUL) 8005c64: 5c 20 00 ad bne r1,r0,8005f18 <== NEVER TAKEN return sc; if (rtems_termios_linesw[tty->t_line].l_read != NULL) { 8005c68: 29 61 00 cc lw r1,(r11+204) 8005c6c: 78 0d 08 02 mvhi r13,0x802 8005c70: 34 02 00 05 mvi r2,5 8005c74: fb ff ef ca calli 8001b9c <__ashlsi3> 8005c78: 39 ad 39 44 ori r13,r13,0x3944 8005c7c: b5 a1 08 00 add r1,r13,r1 8005c80: 28 23 00 08 lw r3,(r1+8) 8005c84: 44 6e 00 06 be r3,r14,8005c9c sc = rtems_termios_linesw[tty->t_line].l_read(tty,args); 8005c88: b9 60 08 00 mv r1,r11 8005c8c: b9 80 10 00 mv r2,r12 8005c90: d8 60 00 00 call r3 8005c94: b8 20 70 00 mv r14,r1 8005c98: e0 00 00 9d bi 8005f0c tty->tty_rcvwakeup = 0; rtems_semaphore_release (tty->isem); return sc; } if (tty->cindex == tty->ccount) { 8005c9c: 29 62 00 24 lw r2,(r11+36) 8005ca0: 29 61 00 20 lw r1,(r11+32) 8005ca4: 5c 41 00 93 bne r2,r1,8005ef0 <== NEVER TAKEN tty->cindex = tty->ccount = 0; tty->read_start_column = tty->column; 8005ca8: 29 61 00 28 lw r1,(r11+40) rtems_semaphore_release (tty->isem); return sc; } if (tty->cindex == tty->ccount) { tty->cindex = tty->ccount = 0; 8005cac: 59 60 00 20 sw (r11+32),r0 8005cb0: 59 60 00 24 sw (r11+36),r0 tty->read_start_column = tty->column; 8005cb4: 59 61 00 2c sw (r11+44),r1 if (tty->device.pollRead != NULL && 8005cb8: 29 61 00 a0 lw r1,(r11+160) 8005cbc: 44 20 00 31 be r1,r0,8005d80 8005cc0: 29 61 00 b4 lw r1,(r11+180) 8005cc4: 5c 20 00 2f bne r1,r0,8005d80 static rtems_status_code fillBufferPoll (struct rtems_termios_tty *tty) { int n; if (tty->termios.c_lflag & ICANON) { 8005cc8: 29 61 00 3c lw r1,(r11+60) 8005ccc: 20 21 00 02 andi r1,r1,0x2 8005cd0: 44 20 00 0d be r1,r0,8005d04 for (;;) { n = (*tty->device.pollRead)(tty->minor); 8005cd4: 29 62 00 a0 lw r2,(r11+160) 8005cd8: 29 61 00 10 lw r1,(r11+16) 8005cdc: d8 40 00 00 call r2 if (n < 0) { 8005ce0: 4c 20 00 04 bge r1,r0,8005cf0 rtems_task_wake_after (1); 8005ce4: 34 01 00 01 mvi r1,1 8005ce8: f8 00 06 5f calli 8007664 8005cec: e3 ff ff fa bi 8005cd4 } else { if (siproc (n, tty)) 8005cf0: 20 21 00 ff andi r1,r1,0xff 8005cf4: b9 60 10 00 mv r2,r11 8005cf8: fb ff ff 6b calli 8005aa4 8005cfc: 44 20 ff f6 be r1,r0,8005cd4 8005d00: e0 00 00 7c bi 8005ef0 } } } else { rtems_interval then, now; then = rtems_clock_get_ticks_since_boot(); 8005d04: f8 00 03 39 calli 80069e8 8005d08: b8 20 68 00 mv r13,r1 for (;;) { n = (*tty->device.pollRead)(tty->minor); 8005d0c: 29 62 00 a0 lw r2,(r11+160) 8005d10: 29 61 00 10 lw r1,(r11+16) 8005d14: d8 40 00 00 call r2 if (n < 0) { 8005d18: 4c 20 00 10 bge r1,r0,8005d58 if (tty->termios.c_cc[VMIN]) { 8005d1c: 41 61 00 47 lbu r1,(r11+71) 8005d20: 41 62 00 46 lbu r2,(r11+70) 8005d24: 44 20 00 05 be r1,r0,8005d38 <== NEVER TAKEN if (tty->termios.c_cc[VTIME] && tty->ccount) { 8005d28: 44 40 00 09 be r2,r0,8005d4c <== NEVER TAKEN 8005d2c: 29 61 00 20 lw r1,(r11+32) 8005d30: 44 20 00 07 be r1,r0,8005d4c 8005d34: e0 00 00 02 bi 8005d3c if ((now - then) > tty->vtimeTicks) { break; } } } else { if (!tty->termios.c_cc[VTIME]) 8005d38: 44 41 00 6e be r2,r1,8005ef0 <== NOT EXECUTED break; now = rtems_clock_get_ticks_since_boot(); 8005d3c: f8 00 03 2b calli 80069e8 if ((now - then) > tty->vtimeTicks) { 8005d40: 29 62 00 54 lw r2,(r11+84) 8005d44: c8 2d 08 00 sub r1,r1,r13 8005d48: 54 22 00 6a bgu r1,r2,8005ef0 break; } } rtems_task_wake_after (1); 8005d4c: 34 01 00 01 mvi r1,1 8005d50: f8 00 06 45 calli 8007664 8005d54: e3 ff ff ee bi 8005d0c } else { siproc (n, tty); 8005d58: b9 60 10 00 mv r2,r11 8005d5c: 20 21 00 ff andi r1,r1,0xff 8005d60: fb ff ff 51 calli 8005aa4 if (tty->ccount >= tty->termios.c_cc[VMIN]) 8005d64: 41 61 00 47 lbu r1,(r11+71) 8005d68: 29 62 00 20 lw r2,(r11+32) 8005d6c: 4c 41 00 61 bge r2,r1,8005ef0 <== NEVER TAKEN break; if (tty->termios.c_cc[VMIN] && tty->termios.c_cc[VTIME]) 8005d70: 44 20 ff e7 be r1,r0,8005d0c <== NEVER TAKEN 8005d74: 41 61 00 46 lbu r1,(r11+70) 8005d78: 44 20 ff e5 be r1,r0,8005d0c <== NEVER TAKEN 8005d7c: e3 ff ff e2 bi 8005d04 while ( wait ) { /* * Process characters read from raw queue */ while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) && (tty->ccount < (CBUFSIZE-1))) { 8005d80: 78 10 08 02 mvhi r16,0x802 * Fill the input buffer from the raw input queue */ static rtems_status_code fillBufferQueue (struct rtems_termios_tty *tty) { rtems_interval timeout = tty->rawInBufSemaphoreFirstTimeout; 8005d84: 29 72 00 74 lw r18,(r11+116) rtems_status_code sc; int wait = (int)1; 8005d88: 34 0d 00 01 mvi r13,1 while ( wait ) { /* * Process characters read from raw queue */ while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) && (tty->ccount < (CBUFSIZE-1))) { 8005d8c: 3a 10 33 40 ori r16,r16,0x3340 c = tty->rawInBuf.theBuf[newHead]; tty->rawInBuf.Head = newHead; if(((tty->rawInBuf.Tail-newHead+tty->rawInBuf.Size) % tty->rawInBuf.Size) < tty->lowwater) { tty->flow_ctrl &= ~FL_IREQXOF; 8005d90: 34 16 ff fe mvi r22,-2 /* if tx stopped and XON should be sent... */ if (((tty->flow_ctrl & (FL_MDXON | FL_ISNTXOF)) 8005d94: 34 15 02 02 mvi r21,514 || (tty->flow_ctrl & FL_OSTOP))) { /* XON should be sent now... */ (*tty->device.write)( tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1); } else if (tty->flow_ctrl & FL_MDRTS) { tty->flow_ctrl &= ~FL_IRTSOFF; 8005d98: 34 14 ff fb mvi r20,-5 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)( 8005d9c: 35 73 00 49 addi r19,r11,73 8005da0: e0 00 00 3e bi 8005e98 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; 8005da4: 29 61 00 5c lw r1,(r11+92) 8005da8: 29 62 00 64 lw r2,(r11+100) 8005dac: 34 21 00 01 addi r1,r1,1 8005db0: f8 00 64 f1 calli 801f174 <__umodsi3> 8005db4: b8 20 18 00 mv r3,r1 c = tty->rawInBuf.theBuf[newHead]; 8005db8: 29 61 00 58 lw r1,(r11+88) 8005dbc: b4 23 08 00 add r1,r1,r3 8005dc0: 40 32 00 00 lbu r18,(r1+0) tty->rawInBuf.Head = newHead; 8005dc4: 59 63 00 5c sw (r11+92),r3 if(((tty->rawInBuf.Tail-newHead+tty->rawInBuf.Size) 8005dc8: 29 61 00 60 lw r1,(r11+96) 8005dcc: 29 64 00 64 lw r4,(r11+100) % tty->rawInBuf.Size) 8005dd0: 29 62 00 64 lw r2,(r11+100) 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) 8005dd4: b4 81 08 00 add r1,r4,r1 % tty->rawInBuf.Size) 8005dd8: c8 23 08 00 sub r1,r1,r3 8005ddc: f8 00 64 e6 calli 801f174 <__umodsi3> 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) 8005de0: 29 62 00 bc lw r2,(r11+188) 8005de4: 50 22 00 1c bgeu r1,r2,8005e54 <== NEVER TAKEN % tty->rawInBuf.Size) < tty->lowwater) { tty->flow_ctrl &= ~FL_IREQXOF; 8005de8: 29 61 00 b8 lw r1,(r11+184) 8005dec: a0 36 08 00 and r1,r1,r22 8005df0: 59 61 00 b8 sw (r11+184),r1 /* if tx stopped and XON should be sent... */ if (((tty->flow_ctrl & (FL_MDXON | FL_ISNTXOF)) 8005df4: 29 61 00 b8 lw r1,(r11+184) 8005df8: 20 21 02 02 andi r1,r1,0x202 8005dfc: 5c 35 00 0c bne r1,r21,8005e2c <== ALWAYS TAKEN == (FL_MDXON | FL_ISNTXOF)) && ((tty->rawOutBufState == rob_idle) 8005e00: 29 61 00 94 lw r1,(r11+148) <== NOT EXECUTED 8005e04: 44 20 00 04 be r1,r0,8005e14 <== NOT EXECUTED || (tty->flow_ctrl & FL_OSTOP))) { 8005e08: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED 8005e0c: 20 21 00 20 andi r1,r1,0x20 <== NOT EXECUTED 8005e10: 44 20 00 07 be r1,r0,8005e2c <== NOT EXECUTED /* XON should be sent now... */ (*tty->device.write)( 8005e14: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED 8005e18: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED 8005e1c: ba 60 10 00 mv r2,r19 <== NOT EXECUTED 8005e20: 34 03 00 01 mvi r3,1 <== NOT EXECUTED 8005e24: d8 80 00 00 call r4 <== NOT EXECUTED 8005e28: e0 00 00 0b bi 8005e54 <== NOT EXECUTED tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1); } else if (tty->flow_ctrl & FL_MDRTS) { 8005e2c: 29 61 00 b8 lw r1,(r11+184) 8005e30: 20 21 01 00 andi r1,r1,0x100 8005e34: 44 20 00 08 be r1,r0,8005e54 <== ALWAYS TAKEN tty->flow_ctrl &= ~FL_IRTSOFF; 8005e38: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED /* activate RTS line */ if (tty->device.startRemoteTx != NULL) { 8005e3c: 29 63 00 b0 lw r3,(r11+176) <== NOT EXECUTED || (tty->flow_ctrl & FL_OSTOP))) { /* XON should be sent now... */ (*tty->device.write)( tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1); } else if (tty->flow_ctrl & FL_MDRTS) { tty->flow_ctrl &= ~FL_IRTSOFF; 8005e40: a0 34 08 00 and r1,r1,r20 <== NOT EXECUTED 8005e44: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED /* activate RTS line */ if (tty->device.startRemoteTx != NULL) { 8005e48: 44 60 00 03 be r3,r0,8005e54 <== NOT EXECUTED tty->device.startRemoteTx(tty->minor); 8005e4c: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED 8005e50: d8 60 00 00 call r3 <== NOT EXECUTED } } } /* continue processing new character */ if (tty->termios.c_lflag & ICANON) { 8005e54: 29 61 00 3c lw r1,(r11+60) 8005e58: 20 21 00 02 andi r1,r1,0x2 8005e5c: 44 20 00 06 be r1,r0,8005e74 <== NEVER TAKEN if (siproc (c, tty)) 8005e60: ba 40 08 00 mv r1,r18 8005e64: b9 60 10 00 mv r2,r11 8005e68: fb ff ff 0f calli 8005aa4 wait = 0; 8005e6c: 64 21 00 00 cmpei r1,r1,0 8005e70: e0 00 00 07 bi 8005e8c } else { siproc (c, tty); 8005e74: b9 60 10 00 mv r2,r11 <== NOT EXECUTED 8005e78: ba 40 08 00 mv r1,r18 <== NOT EXECUTED 8005e7c: fb ff ff 0a calli 8005aa4 <== NOT EXECUTED if (tty->ccount >= tty->termios.c_cc[VMIN]) 8005e80: 41 61 00 47 lbu r1,(r11+71) <== NOT EXECUTED 8005e84: 29 62 00 20 lw r2,(r11+32) <== NOT EXECUTED wait = 0; 8005e88: e8 22 08 00 cmpg r1,r1,r2 <== NOT EXECUTED } timeout = tty->rawInBufSemaphoreTimeout; 8005e8c: 29 72 00 70 lw r18,(r11+112) if (siproc (c, tty)) wait = 0; } else { siproc (c, tty); if (tty->ccount >= tty->termios.c_cc[VMIN]) wait = 0; 8005e90: c8 01 08 00 sub r1,r0,r1 8005e94: a1 a1 68 00 and r13,r13,r1 while ( wait ) { /* * Process characters read from raw queue */ while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) && 8005e98: 29 62 00 5c lw r2,(r11+92) 8005e9c: 29 61 00 60 lw r1,(r11+96) 8005ea0: 44 41 00 05 be r2,r1,8005eb4 (tty->ccount < (CBUFSIZE-1))) { 8005ea4: 2a 01 00 00 lw r1,(r16+0) while ( wait ) { /* * Process characters read from raw queue */ while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) && 8005ea8: 29 62 00 20 lw r2,(r11+32) (tty->ccount < (CBUFSIZE-1))) { 8005eac: 34 21 ff ff addi r1,r1,-1 while ( wait ) { /* * Process characters read from raw queue */ while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) && 8005eb0: 48 22 ff bd bg r1,r2,8005da4 <== ALWAYS TAKEN } /* * Wait for characters */ if ( wait ) { 8005eb4: 45 a0 00 0f be r13,r0,8005ef0 sc = rtems_semaphore_obtain( 8005eb8: 29 61 00 68 lw r1,(r11+104) 8005ebc: 29 62 00 6c lw r2,(r11+108) 8005ec0: ba 40 18 00 mv r3,r18 8005ec4: f8 00 04 92 calli 800710c tty->rawInBuf.Semaphore, tty->rawInBufSemaphoreOptions, timeout); if (sc != RTEMS_SUCCESSFUL) 8005ec8: 44 20 ff f4 be r1,r0,8005e98 <== ALWAYS TAKEN 8005ecc: e0 00 00 09 bi 8005ef0 <== NOT EXECUTED if (sc != RTEMS_SUCCESSFUL) tty->cindex = tty->ccount = 0; } while (count && (tty->cindex < tty->ccount)) { *buffer++ = tty->cbuf[tty->cindex++]; 8005ed0: 29 62 00 1c lw r2,(r11+28) count--; 8005ed4: 35 ef ff ff addi r15,r15,-1 if (sc != RTEMS_SUCCESSFUL) tty->cindex = tty->ccount = 0; } while (count && (tty->cindex < tty->ccount)) { *buffer++ = tty->cbuf[tty->cindex++]; 8005ed8: b4 41 10 00 add r2,r2,r1 8005edc: 40 42 00 00 lbu r2,(r2+0) 8005ee0: 34 21 00 01 addi r1,r1,1 8005ee4: 32 22 00 00 sb (r17+0),r2 8005ee8: 59 61 00 24 sw (r11+36),r1 8005eec: 36 31 00 01 addi r17,r17,1 sc = fillBufferQueue (tty); if (sc != RTEMS_SUCCESSFUL) tty->cindex = tty->ccount = 0; } while (count && (tty->cindex < tty->ccount)) { 8005ef0: 45 e0 00 04 be r15,r0,8005f00 8005ef4: 29 61 00 24 lw r1,(r11+36) 8005ef8: 29 62 00 20 lw r2,(r11+32) 8005efc: 48 41 ff f5 bg r2,r1,8005ed0 *buffer++ = tty->cbuf[tty->cindex++]; count--; } args->bytes_moved = args->count - count; 8005f00: 29 81 00 14 lw r1,(r12+20) 8005f04: c8 2f 78 00 sub r15,r1,r15 8005f08: 59 8f 00 1c sw (r12+28),r15 tty->tty_rcvwakeup = 0; rtems_semaphore_release (tty->isem); 8005f0c: 29 61 00 14 lw r1,(r11+20) while (count && (tty->cindex < tty->ccount)) { *buffer++ = tty->cbuf[tty->cindex++]; count--; } args->bytes_moved = args->count - count; tty->tty_rcvwakeup = 0; 8005f10: 59 60 00 e4 sw (r11+228),r0 rtems_semaphore_release (tty->isem); 8005f14: f8 00 04 ce calli 800724c return sc; } 8005f18: b9 c0 08 00 mv r1,r14 8005f1c: 2b 9d 00 04 lw ra,(sp+4) 8005f20: 2b 8b 00 34 lw r11,(sp+52) 8005f24: 2b 8c 00 30 lw r12,(sp+48) 8005f28: 2b 8d 00 2c lw r13,(sp+44) 8005f2c: 2b 8e 00 28 lw r14,(sp+40) 8005f30: 2b 8f 00 24 lw r15,(sp+36) 8005f34: 2b 90 00 20 lw r16,(sp+32) 8005f38: 2b 91 00 1c lw r17,(sp+28) 8005f3c: 2b 92 00 18 lw r18,(sp+24) 8005f40: 2b 93 00 14 lw r19,(sp+20) 8005f44: 2b 94 00 10 lw r20,(sp+16) 8005f48: 2b 95 00 0c lw r21,(sp+12) 8005f4c: 2b 96 00 08 lw r22,(sp+8) 8005f50: 37 9c 00 34 addi sp,sp,52 8005f54: c3 a0 00 00 ret =============================================================================== 08006318 : * 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) { 8006318: 37 9c ff f0 addi sp,sp,-16 800631c: 5b 8b 00 10 sw (sp+16),r11 8006320: 5b 8c 00 0c sw (sp+12),r12 8006324: 5b 8d 00 08 sw (sp+8),r13 8006328: 5b 9d 00 04 sw (sp+4),ra int nToSend; rtems_interrupt_level level; int len; /* check for XOF/XON to send */ if ((tty->flow_ctrl & (FL_MDXOF | FL_IREQXOF | FL_ISNTXOF)) 800632c: 28 22 00 b8 lw r2,(r1+184) * 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) { 8006330: b8 20 58 00 mv r11,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)) 8006334: 34 01 04 01 mvi r1,1025 8006338: 20 42 04 03 andi r2,r2,0x403 800633c: 5c 41 00 12 bne r2,r1,8006384 <== ALWAYS TAKEN == (FL_MDXOF | FL_IREQXOF)) { /* XOFF should be sent now... */ (*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTOP]), 1); 8006340: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED 8006344: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED 8006348: 35 62 00 4a addi r2,r11,74 <== NOT EXECUTED 800634c: 34 03 00 01 mvi r3,1 <== NOT EXECUTED 8006350: d8 80 00 00 call r4 <== NOT EXECUTED rtems_interrupt_disable(level); 8006354: 90 00 08 00 rcsr r1,IE <== NOT EXECUTED 8006358: 34 02 ff fe mvi r2,-2 <== NOT EXECUTED 800635c: a0 22 10 00 and r2,r1,r2 <== NOT EXECUTED 8006360: d0 02 00 00 wcsr IE,r2 <== NOT EXECUTED tty->t_dqlen--; 8006364: 29 62 00 90 lw r2,(r11+144) <== NOT EXECUTED 8006368: 34 42 ff ff addi r2,r2,-1 <== NOT EXECUTED 800636c: 59 62 00 90 sw (r11+144),r2 <== NOT EXECUTED tty->flow_ctrl |= FL_ISNTXOF; 8006370: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED 8006374: 38 42 00 02 ori r2,r2,0x2 <== NOT EXECUTED 8006378: 59 62 00 b8 sw (r11+184),r2 <== NOT EXECUTED rtems_interrupt_enable(level); 800637c: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED 8006380: e0 00 00 16 bi 80063d8 <== NOT EXECUTED nToSend = 1; } else if ((tty->flow_ctrl & (FL_IREQXOF | FL_ISNTXOF)) == FL_ISNTXOF) { 8006384: 29 62 00 b8 lw r2,(r11+184) 8006388: 34 01 00 02 mvi r1,2 800638c: 20 42 00 03 andi r2,r2,0x3 8006390: 5c 41 00 14 bne r2,r1,80063e0 <== 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); 8006394: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED 8006398: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED 800639c: 35 62 00 49 addi r2,r11,73 <== NOT EXECUTED 80063a0: 34 03 00 01 mvi r3,1 <== NOT EXECUTED 80063a4: d8 80 00 00 call r4 <== NOT EXECUTED rtems_interrupt_disable(level); 80063a8: 90 00 08 00 rcsr r1,IE <== NOT EXECUTED 80063ac: 34 02 ff fe mvi r2,-2 <== NOT EXECUTED 80063b0: a0 22 10 00 and r2,r1,r2 <== NOT EXECUTED 80063b4: d0 02 00 00 wcsr IE,r2 <== NOT EXECUTED tty->t_dqlen--; 80063b8: 29 62 00 90 lw r2,(r11+144) <== NOT EXECUTED tty->flow_ctrl &= ~FL_ISNTXOF; 80063bc: 29 63 00 b8 lw r3,(r11+184) <== NOT EXECUTED * Therefore the dequeue "length" should be reduced by 1 */ (*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1); rtems_interrupt_disable(level); tty->t_dqlen--; 80063c0: 34 42 ff ff addi r2,r2,-1 <== NOT EXECUTED 80063c4: 59 62 00 90 sw (r11+144),r2 <== NOT EXECUTED tty->flow_ctrl &= ~FL_ISNTXOF; 80063c8: 34 02 ff fd mvi r2,-3 <== NOT EXECUTED 80063cc: a0 62 10 00 and r2,r3,r2 <== NOT EXECUTED 80063d0: 59 62 00 b8 sw (r11+184),r2 <== NOT EXECUTED rtems_interrupt_enable(level); 80063d4: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED nToSend = 1; 80063d8: 34 0c 00 01 mvi r12,1 <== NOT EXECUTED 80063dc: e0 00 00 49 bi 8006500 <== NOT EXECUTED } else { if ( tty->rawOutBuf.Head == tty->rawOutBuf.Tail ) { 80063e0: 29 63 00 80 lw r3,(r11+128) 80063e4: 29 62 00 84 lw r2,(r11+132) 80063e8: 5c 62 00 07 bne r3,r2,8006404 /* * buffer was empty */ if (tty->rawOutBufState == rob_wait) { 80063ec: 29 62 00 94 lw r2,(r11+148) /* * this should never happen... */ rtems_semaphore_release (tty->rawOutBuf.Semaphore); } return 0; 80063f0: 34 0c 00 00 mvi r12,0 } else { if ( tty->rawOutBuf.Head == tty->rawOutBuf.Tail ) { /* * buffer was empty */ if (tty->rawOutBufState == rob_wait) { 80063f4: 5c 41 00 43 bne r2,r1,8006500 /* * this should never happen... */ rtems_semaphore_release (tty->rawOutBuf.Semaphore); 80063f8: 29 61 00 8c lw r1,(r11+140) <== NOT EXECUTED 80063fc: f8 00 03 94 calli 800724c <== NOT EXECUTED 8006400: e0 00 00 40 bi 8006500 <== NOT EXECUTED } return 0; } rtems_interrupt_disable(level); 8006404: 90 00 10 00 rcsr r2,IE 8006408: 34 01 ff fe mvi r1,-2 800640c: a0 41 08 00 and r1,r2,r1 8006410: d0 01 00 00 wcsr IE,r1 len = tty->t_dqlen; 8006414: 29 63 00 90 lw r3,(r11+144) tty->t_dqlen = 0; 8006418: 59 60 00 90 sw (r11+144),r0 rtems_interrupt_enable(level); 800641c: d0 02 00 00 wcsr IE,r2 newTail = (tty->rawOutBuf.Tail + len) % tty->rawOutBuf.Size; 8006420: 29 61 00 84 lw r1,(r11+132) 8006424: 29 62 00 88 lw r2,(r11+136) 8006428: b4 61 08 00 add r1,r3,r1 800642c: f8 00 63 52 calli 801f174 <__umodsi3> tty->rawOutBuf.Tail = newTail; if (tty->rawOutBufState == rob_wait) { 8006430: 29 62 00 94 lw r2,(r11+148) rtems_interrupt_disable(level); len = tty->t_dqlen; tty->t_dqlen = 0; rtems_interrupt_enable(level); newTail = (tty->rawOutBuf.Tail + len) % tty->rawOutBuf.Size; 8006434: b8 20 68 00 mv r13,r1 tty->rawOutBuf.Tail = newTail; 8006438: 59 61 00 84 sw (r11+132),r1 if (tty->rawOutBufState == rob_wait) { 800643c: 34 01 00 02 mvi r1,2 8006440: 5c 41 00 03 bne r2,r1,800644c /* * wake up any pending writer task */ rtems_semaphore_release (tty->rawOutBuf.Semaphore); 8006444: 29 61 00 8c lw r1,(r11+140) 8006448: f8 00 03 81 calli 800724c } if (newTail == tty->rawOutBuf.Head) { 800644c: 29 61 00 80 lw r1,(r11+128) 8006450: 5d a1 00 09 bne r13,r1,8006474 nToSend = 0; /* * check to see if snd wakeup callback was set */ if ( tty->tty_snd.sw_pfn != NULL) { 8006454: 29 63 00 d4 lw r3,(r11+212) if (newTail == tty->rawOutBuf.Head) { /* * Buffer has become empty */ tty->rawOutBufState = rob_idle; 8006458: 59 60 00 94 sw (r11+148),r0 nToSend = 0; 800645c: 34 0c 00 00 mvi r12,0 /* * check to see if snd wakeup callback was set */ if ( tty->tty_snd.sw_pfn != NULL) { 8006460: 44 60 00 27 be r3,r0,80064fc <== ALWAYS TAKEN (*tty->tty_snd.sw_pfn)(&tty->termios, tty->tty_snd.sw_arg); 8006464: 29 62 00 d8 lw r2,(r11+216) <== NOT EXECUTED 8006468: 35 61 00 30 addi r1,r11,48 <== NOT EXECUTED 800646c: d8 60 00 00 call r3 <== NOT EXECUTED 8006470: e0 00 00 23 bi 80064fc <== NOT EXECUTED } } /* check, whether output should stop due to received XOFF */ else if ((tty->flow_ctrl & (FL_MDXON | FL_ORCVXOF)) 8006474: 29 62 00 b8 lw r2,(r11+184) 8006478: 34 01 02 10 mvi r1,528 800647c: 20 42 02 10 andi r2,r2,0x210 8006480: 5c 41 00 0d bne r2,r1,80064b4 <== 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); 8006484: 90 00 08 00 rcsr r1,IE <== NOT EXECUTED 8006488: 34 02 ff fe mvi r2,-2 <== NOT EXECUTED 800648c: a0 22 10 00 and r2,r1,r2 <== NOT EXECUTED 8006490: d0 02 00 00 wcsr IE,r2 <== NOT EXECUTED tty->flow_ctrl |= FL_OSTOP; 8006494: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED 8006498: 38 42 00 20 ori r2,r2,0x20 <== NOT EXECUTED 800649c: 59 62 00 b8 sw (r11+184),r2 <== NOT EXECUTED tty->rawOutBufState = rob_busy; /*apm*/ 80064a0: 34 02 00 01 mvi r2,1 <== NOT EXECUTED 80064a4: 59 62 00 94 sw (r11+148),r2 <== NOT EXECUTED rtems_interrupt_enable(level); 80064a8: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED nToSend = 0; 80064ac: 34 0c 00 00 mvi r12,0 <== NOT EXECUTED 80064b0: e0 00 00 13 bi 80064fc <== NOT EXECUTED } else { /* * Buffer not empty, start tranmitter */ if (newTail > tty->rawOutBuf.Head) 80064b4: 29 61 00 80 lw r1,(r11+128) 80064b8: 50 2d 00 03 bgeu r1,r13,80064c4 nToSend = tty->rawOutBuf.Size - newTail; 80064bc: 29 6c 00 88 lw r12,(r11+136) 80064c0: e0 00 00 02 bi 80064c8 else nToSend = tty->rawOutBuf.Head - newTail; 80064c4: 29 6c 00 80 lw r12,(r11+128) /* 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)) { 80064c8: 29 61 00 b8 lw r1,(r11+184) * Buffer not empty, start tranmitter */ if (newTail > tty->rawOutBuf.Head) nToSend = tty->rawOutBuf.Size - newTail; else nToSend = tty->rawOutBuf.Head - newTail; 80064cc: c9 8d 60 00 sub r12,r12,r13 /* 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)) { 80064d0: 20 21 06 00 andi r1,r1,0x600 80064d4: 44 20 00 02 be r1,r0,80064dc nToSend = 1; 80064d8: 34 0c 00 01 mvi r12,1 } tty->rawOutBufState = rob_busy; /*apm*/ 80064dc: 34 01 00 01 mvi r1,1 (*tty->device.write)( 80064e0: 29 62 00 7c lw r2,(r11+124) /* 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*/ 80064e4: 59 61 00 94 sw (r11+148),r1 (*tty->device.write)( 80064e8: 29 64 00 a4 lw r4,(r11+164) 80064ec: 29 61 00 10 lw r1,(r11+16) 80064f0: b4 4d 10 00 add r2,r2,r13 80064f4: b9 80 18 00 mv r3,r12 80064f8: d8 80 00 00 call r4 tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend); } tty->rawOutBuf.Tail = newTail; /*apm*/ 80064fc: 59 6d 00 84 sw (r11+132),r13 } return nToSend; } 8006500: b9 80 08 00 mv r1,r12 8006504: 2b 9d 00 04 lw ra,(sp+4) 8006508: 2b 8b 00 10 lw r11,(sp+16) 800650c: 2b 8c 00 0c lw r12,(sp+12) 8006510: 2b 8d 00 08 lw r13,(sp+8) 8006514: 37 9c 00 10 addi sp,sp,16 8006518: c3 a0 00 00 ret =============================================================================== 0800629c : /* * this task actually processes any receive events */ static rtems_task rtems_termios_rxdaemon(rtems_task_argument argument) { 800629c: 37 9c ff e4 addi sp,sp,-28 80062a0: 5b 8b 00 14 sw (sp+20),r11 80062a4: 5b 8c 00 10 sw (sp+16),r12 80062a8: 5b 8d 00 0c sw (sp+12),r13 80062ac: 5b 8e 00 08 sw (sp+8),r14 80062b0: 5b 9d 00 04 sw (sp+4),ra /* * do something */ c = tty->device.pollRead(tty->minor); if (c != EOF) { 80062b4: 34 0d ff ff mvi r13,-1 /* * this task actually processes any receive events */ static rtems_task rtems_termios_rxdaemon(rtems_task_argument argument) { 80062b8: b8 20 58 00 mv r11,r1 while (1) { /* * wait for rtems event */ rtems_event_receive( 80062bc: 37 8e 00 18 addi r14,sp,24 if (c != EOF) { /* * pollRead did call enqueue on its own */ c_buf = c; rtems_termios_enqueue_raw_characters ( tty,&c_buf,1); 80062c0: 37 8c 00 1f addi r12,sp,31 while (1) { /* * wait for rtems event */ rtems_event_receive( 80062c4: 34 01 00 03 mvi r1,3 80062c8: 34 02 00 02 mvi r2,2 80062cc: 34 03 00 00 mvi r3,0 80062d0: b9 c0 20 00 mv r4,r14 80062d4: f8 00 01 de calli 8006a4c (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) { 80062d8: 2b 81 00 18 lw r1,(sp+24) 80062dc: 20 21 00 01 andi r1,r1,0x1 80062e0: 44 20 00 04 be r1,r0,80062f0 <== ALWAYS TAKEN tty->rxTaskId = 0; 80062e4: 59 60 00 c4 sw (r11+196),r0 rtems_task_delete(RTEMS_SELF); 80062e8: 34 01 00 00 mvi r1,0 <== NOT EXECUTED 80062ec: f8 00 04 6d calli 80074a0 <== NOT EXECUTED } /* * do something */ c = tty->device.pollRead(tty->minor); 80062f0: 29 62 00 a0 lw r2,(r11+160) 80062f4: 29 61 00 10 lw r1,(r11+16) 80062f8: d8 40 00 00 call r2 if (c != EOF) { 80062fc: 44 2d ff f2 be r1,r13,80062c4 /* * pollRead did call enqueue on its own */ c_buf = c; 8006300: 33 81 00 1f sb (sp+31),r1 rtems_termios_enqueue_raw_characters ( tty,&c_buf,1); 8006304: b9 80 10 00 mv r2,r12 8006308: b9 60 08 00 mv r1,r11 800630c: 34 03 00 01 mvi r3,1 8006310: fb ff ff 1a calli 8005f78 8006314: e3 ff ff ec bi 80062c4 =============================================================================== 0800651c : /* * this task actually processes any transmit events */ static rtems_task rtems_termios_txdaemon(rtems_task_argument argument) { 800651c: 37 9c ff f0 addi sp,sp,-16 8006520: 5b 8b 00 0c sw (sp+12),r11 8006524: 5b 8c 00 08 sw (sp+8),r12 8006528: 5b 9d 00 04 sw (sp+4),ra } /* * call any line discipline start function */ if (rtems_termios_linesw[tty->t_line].l_start != NULL) { 800652c: 78 0c 08 02 mvhi r12,0x802 /* * this task actually processes any transmit events */ static rtems_task rtems_termios_txdaemon(rtems_task_argument argument) { 8006530: b8 20 58 00 mv r11,r1 } /* * call any line discipline start function */ if (rtems_termios_linesw[tty->t_line].l_start != NULL) { 8006534: 39 8c 39 44 ori r12,r12,0x3944 while (1) { /* * wait for rtems event */ rtems_event_receive( 8006538: 34 01 00 03 mvi r1,3 800653c: 34 02 00 02 mvi r2,2 8006540: 34 03 00 00 mvi r3,0 8006544: 37 84 00 10 addi r4,sp,16 8006548: f8 00 01 41 calli 8006a4c (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) { 800654c: 2b 81 00 10 lw r1,(sp+16) 8006550: 20 21 00 01 andi r1,r1,0x1 8006554: 44 20 00 04 be r1,r0,8006564 <== ALWAYS TAKEN tty->txTaskId = 0; 8006558: 59 60 00 c8 sw (r11+200),r0 <== NOT EXECUTED rtems_task_delete(RTEMS_SELF); 800655c: 34 01 00 00 mvi r1,0 <== NOT EXECUTED 8006560: f8 00 03 d0 calli 80074a0 <== NOT EXECUTED } /* * call any line discipline start function */ if (rtems_termios_linesw[tty->t_line].l_start != NULL) { 8006564: 29 61 00 cc lw r1,(r11+204) 8006568: 34 02 00 05 mvi r2,5 800656c: fb ff ed 8c calli 8001b9c <__ashlsi3> 8006570: b5 81 08 00 add r1,r12,r1 8006574: 28 22 00 14 lw r2,(r1+20) 8006578: 44 40 00 03 be r2,r0,8006584 <== ALWAYS TAKEN rtems_termios_linesw[tty->t_line].l_start(tty); 800657c: b9 60 08 00 mv r1,r11 8006580: d8 40 00 00 call r2 <== NOT EXECUTED } /* * try to push further characters to device */ rtems_termios_refill_transmitter(tty); 8006584: b9 60 08 00 mv r1,r11 8006588: fb ff ff 64 calli 8006318 } 800658c: e3 ff ff eb bi 8006538 =============================================================================== 08005b18 : rtems_termios_puts (&c, 1, tty); } rtems_status_code rtems_termios_write (void *arg) { 8005b18: 37 9c ff e8 addi sp,sp,-24 8005b1c: 5b 8b 00 18 sw (sp+24),r11 8005b20: 5b 8c 00 14 sw (sp+20),r12 8005b24: 5b 8d 00 10 sw (sp+16),r13 8005b28: 5b 8e 00 0c sw (sp+12),r14 8005b2c: 5b 8f 00 08 sw (sp+8),r15 8005b30: 5b 9d 00 04 sw (sp+4),ra 8005b34: b8 20 58 00 mv r11,r1 rtems_libio_rw_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 8005b38: 28 21 00 00 lw r1,(r1+0) rtems_status_code sc; sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 8005b3c: 34 02 00 00 mvi r2,0 8005b40: 34 03 00 00 mvi r3,0 rtems_status_code rtems_termios_write (void *arg) { rtems_libio_rw_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 8005b44: 28 2c 00 38 lw r12,(r1+56) rtems_status_code sc; sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 8005b48: 29 81 00 18 lw r1,(r12+24) 8005b4c: f8 00 05 70 calli 800710c 8005b50: b8 20 68 00 mv r13,r1 if (sc != RTEMS_SUCCESSFUL) 8005b54: 5c 20 00 23 bne r1,r0,8005be0 <== NEVER TAKEN return sc; if (rtems_termios_linesw[tty->t_line].l_write != NULL) { 8005b58: 29 81 00 cc lw r1,(r12+204) 8005b5c: 78 0e 08 02 mvhi r14,0x802 8005b60: 34 02 00 05 mvi r2,5 8005b64: fb ff f0 0e calli 8001b9c <__ashlsi3> 8005b68: 39 ce 39 44 ori r14,r14,0x3944 8005b6c: b5 c1 08 00 add r1,r14,r1 8005b70: 28 23 00 0c lw r3,(r1+12) 8005b74: 44 6d 00 06 be r3,r13,8005b8c sc = rtems_termios_linesw[tty->t_line].l_write(tty,args); 8005b78: b9 80 08 00 mv r1,r12 8005b7c: b9 60 10 00 mv r2,r11 8005b80: d8 60 00 00 call r3 8005b84: b8 20 68 00 mv r13,r1 8005b88: e0 00 00 14 bi 8005bd8 rtems_semaphore_release (tty->osem); return sc; } if (tty->termios.c_oflag & OPOST) { 8005b8c: 29 83 00 34 lw r3,(r12+52) 8005b90: 29 62 00 14 lw r2,(r11+20) 8005b94: 29 61 00 10 lw r1,(r11+16) 8005b98: 20 63 00 01 andi r3,r3,0x1 uint32_t count = args->count; 8005b9c: b8 40 78 00 mv r15,r2 char *buffer = args->buffer; 8005ba0: b8 20 70 00 mv r14,r1 if (rtems_termios_linesw[tty->t_line].l_write != NULL) { sc = rtems_termios_linesw[tty->t_line].l_write(tty,args); rtems_semaphore_release (tty->osem); return sc; } if (tty->termios.c_oflag & OPOST) { 8005ba4: 5c 60 00 07 bne r3,r0,8005bc0 <== ALWAYS TAKEN 8005ba8: e0 00 00 08 bi 8005bc8 <== NOT EXECUTED uint32_t count = args->count; char *buffer = args->buffer; while (count--) oproc (*buffer++, tty); 8005bac: 41 c1 00 00 lbu r1,(r14+0) 8005bb0: b9 80 10 00 mv r2,r12 8005bb4: 35 ce 00 01 addi r14,r14,1 8005bb8: fb ff fe 4b calli 80054e4 8005bbc: 35 ef ff ff addi r15,r15,-1 return sc; } if (tty->termios.c_oflag & OPOST) { uint32_t count = args->count; char *buffer = args->buffer; while (count--) 8005bc0: 5d e0 ff fb bne r15,r0,8005bac 8005bc4: e0 00 00 03 bi 8005bd0 oproc (*buffer++, tty); args->bytes_moved = args->count; } else { rtems_termios_puts (args->buffer, args->count, tty); 8005bc8: b9 80 18 00 mv r3,r12 <== NOT EXECUTED 8005bcc: fb ff fd f0 calli 800538c <== NOT EXECUTED args->bytes_moved = args->count; 8005bd0: 29 61 00 14 lw r1,(r11+20) 8005bd4: 59 61 00 1c sw (r11+28),r1 } rtems_semaphore_release (tty->osem); 8005bd8: 29 81 00 18 lw r1,(r12+24) 8005bdc: f8 00 05 9c calli 800724c return sc; } 8005be0: b9 a0 08 00 mv r1,r13 8005be4: 2b 9d 00 04 lw ra,(sp+4) 8005be8: 2b 8b 00 18 lw r11,(sp+24) 8005bec: 2b 8c 00 14 lw r12,(sp+20) 8005bf0: 2b 8d 00 10 lw r13,(sp+16) 8005bf4: 2b 8e 00 0c lw r14,(sp+12) 8005bf8: 2b 8f 00 08 lw r15,(sp+8) 8005bfc: 37 9c 00 18 addi sp,sp,24 8005c00: c3 a0 00 00 ret =============================================================================== 08013e78 : */ rtems_status_code rtems_timer_cancel( rtems_id id ) { 8013e78: 37 9c ff f8 addi sp,sp,-8 8013e7c: 5b 9d 00 04 sw (sp+4),ra 8013e80: b8 20 10 00 mv r2,r1 Objects_Id id, Objects_Locations *location ) { return (Timer_Control *) _Objects_Get( &_Timer_Information, id, location ); 8013e84: 78 01 08 04 mvhi r1,0x804 8013e88: 38 21 15 e4 ori r1,r1,0x15e4 8013e8c: 37 83 00 08 addi r3,sp,8 8013e90: f8 00 0e 9d calli 8017904 <_Objects_Get> Timer_Control *the_timer; Objects_Locations location; the_timer = _Timer_Get( id, &location ); switch ( location ) { 8013e94: 2b 82 00 08 lw r2,(sp+8) 8013e98: 5c 40 00 09 bne r2,r0,8013ebc case OBJECTS_LOCAL: if ( !_Timer_Is_dormant_class( the_timer->the_class ) ) 8013e9c: 28 23 00 38 lw r3,(r1+56) 8013ea0: 34 02 00 04 mvi r2,4 8013ea4: 44 62 00 03 be r3,r2,8013eb0 <== NEVER TAKEN (void) _Watchdog_Remove( &the_timer->Ticker ); 8013ea8: 34 21 00 10 addi r1,r1,16 8013eac: f8 00 18 3e calli 8019fa4 <_Watchdog_Remove> _Thread_Enable_dispatch(); 8013eb0: f8 00 12 4e calli 80187e8 <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 8013eb4: 34 01 00 00 mvi r1,0 8013eb8: e0 00 00 02 bi 8013ec0 #endif case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 8013ebc: 34 01 00 04 mvi r1,4 } 8013ec0: 2b 9d 00 04 lw ra,(sp+4) 8013ec4: 37 9c 00 08 addi sp,sp,8 8013ec8: c3 a0 00 00 ret =============================================================================== 08014494 : rtems_id id, rtems_time_of_day *wall_time, rtems_timer_service_routine_entry routine, void *user_data ) { 8014494: 37 9c ff dc addi sp,sp,-36 8014498: 5b 8b 00 20 sw (sp+32),r11 801449c: 5b 8c 00 1c sw (sp+28),r12 80144a0: 5b 8d 00 18 sw (sp+24),r13 80144a4: 5b 8e 00 14 sw (sp+20),r14 80144a8: 5b 8f 00 10 sw (sp+16),r15 80144ac: 5b 90 00 0c sw (sp+12),r16 80144b0: 5b 91 00 08 sw (sp+8),r17 80144b4: 5b 9d 00 04 sw (sp+4),ra Timer_Control *the_timer; Objects_Locations location; rtems_interval seconds; Timer_server_Control *timer_server = _Timer_server; 80144b8: 78 05 08 04 mvhi r5,0x804 80144bc: 38 a5 16 24 ori r5,r5,0x1624 80144c0: 28 ad 00 00 lw r13,(r5+0) rtems_id id, rtems_time_of_day *wall_time, rtems_timer_service_routine_entry routine, void *user_data ) { 80144c4: b8 20 78 00 mv r15,r1 80144c8: b8 40 60 00 mv r12,r2 80144cc: b8 60 80 00 mv r16,r3 80144d0: b8 80 88 00 mv r17,r4 Objects_Locations location; rtems_interval seconds; Timer_server_Control *timer_server = _Timer_server; if ( !timer_server ) return RTEMS_INCORRECT_STATE; 80144d4: 34 0b 00 0e mvi r11,14 Timer_Control *the_timer; Objects_Locations location; rtems_interval seconds; Timer_server_Control *timer_server = _Timer_server; if ( !timer_server ) 80144d8: 45 a0 00 2e be r13,r0,8014590 return RTEMS_INCORRECT_STATE; if ( !_TOD_Is_set ) 80144dc: 78 05 08 04 mvhi r5,0x804 80144e0: 38 a5 0c f0 ori r5,r5,0xcf0 80144e4: 40 a1 00 00 lbu r1,(r5+0) return RTEMS_NOT_DEFINED; 80144e8: 34 0b 00 0b mvi r11,11 Timer_server_Control *timer_server = _Timer_server; if ( !timer_server ) return RTEMS_INCORRECT_STATE; if ( !_TOD_Is_set ) 80144ec: 44 20 00 29 be r1,r0,8014590 <== NEVER TAKEN return RTEMS_NOT_DEFINED; if ( !routine ) return RTEMS_INVALID_ADDRESS; 80144f0: 34 0b 00 09 mvi r11,9 return RTEMS_INCORRECT_STATE; if ( !_TOD_Is_set ) return RTEMS_NOT_DEFINED; if ( !routine ) 80144f4: 44 60 00 27 be r3,r0,8014590 return RTEMS_INVALID_ADDRESS; if ( !_TOD_Validate( wall_time ) ) 80144f8: b8 40 08 00 mv r1,r2 80144fc: fb ff f1 c1 calli 8010c00 <_TOD_Validate> return RTEMS_INVALID_CLOCK; 8014500: 34 0b 00 14 mvi r11,20 return RTEMS_NOT_DEFINED; if ( !routine ) return RTEMS_INVALID_ADDRESS; if ( !_TOD_Validate( wall_time ) ) 8014504: 44 20 00 23 be r1,r0,8014590 return RTEMS_INVALID_CLOCK; seconds = _TOD_To_seconds( wall_time ); 8014508: b9 80 08 00 mv r1,r12 if ( seconds <= _TOD_Seconds_since_epoch() ) 801450c: 78 0c 08 04 mvhi r12,0x804 return RTEMS_INVALID_ADDRESS; if ( !_TOD_Validate( wall_time ) ) return RTEMS_INVALID_CLOCK; seconds = _TOD_To_seconds( wall_time ); 8014510: fb ff f1 7c calli 8010b00 <_TOD_To_seconds> if ( seconds <= _TOD_Seconds_since_epoch() ) 8014514: 39 8c 0d 88 ori r12,r12,0xd88 return RTEMS_INVALID_ADDRESS; if ( !_TOD_Validate( wall_time ) ) return RTEMS_INVALID_CLOCK; seconds = _TOD_To_seconds( wall_time ); 8014518: b8 20 70 00 mv r14,r1 if ( seconds <= _TOD_Seconds_since_epoch() ) 801451c: 29 81 00 00 lw r1,(r12+0) 8014520: 50 2e 00 1c bgeu r1,r14,8014590 8014524: 78 01 08 04 mvhi r1,0x804 8014528: 38 21 15 e4 ori r1,r1,0x15e4 801452c: b9 e0 10 00 mv r2,r15 8014530: 37 83 00 24 addi r3,sp,36 8014534: f8 00 0c f4 calli 8017904 <_Objects_Get> 8014538: b8 20 58 00 mv r11,r1 return RTEMS_INVALID_CLOCK; the_timer = _Timer_Get( id, &location ); switch ( location ) { 801453c: 2b 81 00 24 lw r1,(sp+36) 8014540: 5c 20 00 13 bne r1,r0,801458c case OBJECTS_LOCAL: (void) _Watchdog_Remove( &the_timer->Ticker ); 8014544: 35 61 00 10 addi r1,r11,16 8014548: f8 00 16 97 calli 8019fa4 <_Watchdog_Remove> the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK; 801454c: 34 01 00 03 mvi r1,3 8014550: 59 61 00 38 sw (r11+56),r1 _Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data ); the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch(); 8014554: 29 81 00 00 lw r1,(r12+0) (*timer_server->schedule_operation)( timer_server, the_timer ); 8014558: 29 a3 00 04 lw r3,(r13+4) 801455c: b9 60 10 00 mv r2,r11 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(); 8014560: c9 c1 70 00 sub r14,r14,r1 Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 8014564: 59 60 00 18 sw (r11+24),r0 the_watchdog->routine = routine; 8014568: 59 70 00 2c sw (r11+44),r16 the_watchdog->id = id; 801456c: 59 6f 00 30 sw (r11+48),r15 the_watchdog->user_data = user_data; 8014570: 59 71 00 34 sw (r11+52),r17 8014574: 59 6e 00 1c sw (r11+28),r14 (*timer_server->schedule_operation)( timer_server, the_timer ); 8014578: b9 a0 08 00 mv r1,r13 801457c: d8 60 00 00 call r3 _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; 8014580: 34 0b 00 00 mvi r11,0 _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 ); _Thread_Enable_dispatch(); 8014584: f8 00 10 99 calli 80187e8 <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 8014588: e0 00 00 02 bi 8014590 #endif case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 801458c: 34 0b 00 04 mvi r11,4 } 8014590: b9 60 08 00 mv r1,r11 8014594: 2b 9d 00 04 lw ra,(sp+4) 8014598: 2b 8b 00 20 lw r11,(sp+32) 801459c: 2b 8c 00 1c lw r12,(sp+28) 80145a0: 2b 8d 00 18 lw r13,(sp+24) 80145a4: 2b 8e 00 14 lw r14,(sp+20) 80145a8: 2b 8f 00 10 lw r15,(sp+16) 80145ac: 2b 90 00 0c lw r16,(sp+12) 80145b0: 2b 91 00 08 lw r17,(sp+8) 80145b4: 37 9c 00 24 addi sp,sp,36 80145b8: c3 a0 00 00 ret =============================================================================== 080069f4 : static int rtems_verror( rtems_error_code_t error_flag, const char *printf_format, va_list arglist ) { 80069f4: 37 9c ff e4 addi sp,sp,-28 80069f8: 5b 8b 00 1c sw (sp+28),r11 80069fc: 5b 8c 00 18 sw (sp+24),r12 8006a00: 5b 8d 00 14 sw (sp+20),r13 8006a04: 5b 8e 00 10 sw (sp+16),r14 8006a08: 5b 8f 00 0c sw (sp+12),r15 8006a0c: 5b 90 00 08 sw (sp+8),r16 8006a10: 5b 9d 00 04 sw (sp+4),ra 8006a14: b8 20 60 00 mv r12,r1 int local_errno = 0; int chars_written = 0; rtems_status_code status; if (error_flag & RTEMS_ERROR_PANIC) { 8006a18: 78 01 20 00 mvhi r1,0x2000 8006a1c: a1 81 08 00 and r1,r12,r1 static int rtems_verror( rtems_error_code_t error_flag, const char *printf_format, va_list arglist ) { 8006a20: b8 40 80 00 mv r16,r2 8006a24: b8 60 78 00 mv r15,r3 int local_errno = 0; int chars_written = 0; rtems_status_code status; if (error_flag & RTEMS_ERROR_PANIC) { 8006a28: 44 20 00 12 be r1,r0,8006a70 if (rtems_panic_in_progress++) 8006a2c: 78 04 08 02 mvhi r4,0x802 8006a30: 38 84 98 d4 ori r4,r4,0x98d4 8006a34: 28 81 00 00 lw r1,(r4+0) 8006a38: 34 22 00 01 addi r2,r1,1 8006a3c: 58 82 00 00 sw (r4+0),r2 8006a40: 44 20 00 06 be r1,r0,8006a58 <== ALWAYS TAKEN rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 8006a44: 78 04 08 02 mvhi r4,0x802 <== NOT EXECUTED 8006a48: 38 84 9a 50 ori r4,r4,0x9a50 <== NOT EXECUTED 8006a4c: 28 81 00 00 lw r1,(r4+0) <== NOT EXECUTED 8006a50: 34 21 00 01 addi r1,r1,1 <== NOT EXECUTED 8006a54: 58 81 00 00 sw (r4+0),r1 <== NOT EXECUTED _Thread_Disable_dispatch(); /* disable task switches */ /* don't aggravate things */ if (rtems_panic_in_progress > 2) 8006a58: 78 01 08 02 mvhi r1,0x802 8006a5c: 38 21 98 d4 ori r1,r1,0x98d4 8006a60: 28 22 00 00 lw r2,(r1+0) 8006a64: 34 01 00 02 mvi r1,2 return 0; 8006a68: 34 0b 00 00 mvi r11,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) 8006a6c: 48 41 00 48 bg r2,r1,8006b8c <== NEVER TAKEN return 0; } (void) fflush(stdout); /* in case stdout/stderr same */ 8006a70: 78 01 08 02 mvhi r1,0x802 8006a74: 38 21 92 38 ori r1,r1,0x9238 8006a78: 28 21 00 00 lw r1,(r1+0) 8006a7c: 28 21 00 08 lw r1,(r1+8) 8006a80: f8 00 32 6f calli 801343c status = error_flag & ~RTEMS_ERROR_MASK; 8006a84: 78 01 08 02 mvhi r1,0x802 8006a88: 38 21 71 e0 ori r1,r1,0x71e0 8006a8c: 28 2e 00 00 lw r14,(r1+0) if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */ 8006a90: 78 01 40 00 mvhi r1,0x4000 8006a94: a1 81 08 00 and r1,r12,r1 return 0; } (void) fflush(stdout); /* in case stdout/stderr same */ status = error_flag & ~RTEMS_ERROR_MASK; 8006a98: a1 8e 70 00 and r14,r12,r14 rtems_error_code_t error_flag, const char *printf_format, va_list arglist ) { int local_errno = 0; 8006a9c: 34 0c 00 00 mvi r12,0 } (void) fflush(stdout); /* in case stdout/stderr same */ status = error_flag & ~RTEMS_ERROR_MASK; if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */ 8006aa0: 44 20 00 03 be r1,r0,8006aac local_errno = errno; 8006aa4: f8 00 31 65 calli 8013038 <__errno> 8006aa8: 28 2c 00 00 lw r12,(r1+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); 8006aac: 78 0d 08 02 mvhi r13,0x802 8006ab0: 39 ad 92 38 ori r13,r13,0x9238 8006ab4: 29 a1 00 00 lw r1,(r13+0) 8006ab8: ba 00 10 00 mv r2,r16 8006abc: b9 e0 18 00 mv r3,r15 8006ac0: 28 21 00 0c lw r1,(r1+12) 8006ac4: f8 00 4b 4d calli 80197f8 8006ac8: b8 20 58 00 mv r11,r1 if (status) 8006acc: 45 c0 00 0b be r14,r0,8006af8 chars_written += fprintf(stderr, " (status: %s)", rtems_status_text(status)); 8006ad0: 29 a1 00 00 lw r1,(r13+0) 8006ad4: 28 2d 00 0c lw r13,(r1+12) 8006ad8: b9 c0 08 00 mv r1,r14 8006adc: fb ff ff bd calli 80069d0 8006ae0: 78 02 08 02 mvhi r2,0x802 8006ae4: b8 20 18 00 mv r3,r1 8006ae8: 38 42 6e 9c ori r2,r2,0x6e9c 8006aec: b9 a0 08 00 mv r1,r13 8006af0: f8 00 33 8b calli 801391c #endif chars_written += vfprintf(stderr, printf_format, arglist); if (status) chars_written += 8006af4: b5 61 58 00 add r11,r11,r1 fprintf(stderr, " (status: %s)", rtems_status_text(status)); if (local_errno) { 8006af8: 45 80 00 1a be r12,r0,8006b60 if ((local_errno > 0) && *strerror(local_errno)) 8006afc: 4c 0c 00 10 bge r0,r12,8006b3c 8006b00: b9 80 08 00 mv r1,r12 8006b04: f8 00 37 26 calli 801479c 8006b08: 40 21 00 00 lbu r1,(r1+0) 8006b0c: 44 20 00 0c be r1,r0,8006b3c <== NEVER TAKEN chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno)); 8006b10: 78 01 08 02 mvhi r1,0x802 8006b14: 38 21 92 38 ori r1,r1,0x9238 8006b18: 28 21 00 00 lw r1,(r1+0) 8006b1c: 28 2d 00 0c lw r13,(r1+12) 8006b20: b9 80 08 00 mv r1,r12 8006b24: f8 00 37 1e calli 801479c 8006b28: 78 02 08 02 mvhi r2,0x802 8006b2c: b8 20 18 00 mv r3,r1 8006b30: 38 42 6e ac ori r2,r2,0x6eac 8006b34: b9 a0 08 00 mv r1,r13 8006b38: e0 00 00 08 bi 8006b58 else chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno); 8006b3c: 78 01 08 02 mvhi r1,0x802 8006b40: 38 21 92 38 ori r1,r1,0x9238 8006b44: 28 21 00 00 lw r1,(r1+0) 8006b48: 78 02 08 02 mvhi r2,0x802 8006b4c: 38 42 6e bc ori r2,r2,0x6ebc 8006b50: 28 21 00 0c lw r1,(r1+12) 8006b54: b9 80 18 00 mv r3,r12 8006b58: f8 00 33 71 calli 801391c 8006b5c: b5 61 58 00 add r11,r11,r1 } chars_written += fprintf(stderr, "\n"); 8006b60: 78 0c 08 02 mvhi r12,0x802 8006b64: 39 8c 92 38 ori r12,r12,0x9238 8006b68: 29 81 00 00 lw r1,(r12+0) 8006b6c: 78 02 08 02 mvhi r2,0x802 8006b70: 38 42 66 08 ori r2,r2,0x6608 8006b74: 28 21 00 0c lw r1,(r1+12) 8006b78: f8 00 33 69 calli 801391c 8006b7c: b4 2b 58 00 add r11,r1,r11 (void) fflush(stderr); 8006b80: 29 81 00 00 lw r1,(r12+0) 8006b84: 28 21 00 0c lw r1,(r1+12) 8006b88: f8 00 32 2d calli 801343c return chars_written; } 8006b8c: b9 60 08 00 mv r1,r11 8006b90: 2b 9d 00 04 lw ra,(sp+4) 8006b94: 2b 8b 00 1c lw r11,(sp+28) 8006b98: 2b 8c 00 18 lw r12,(sp+24) 8006b9c: 2b 8d 00 14 lw r13,(sp+20) 8006ba0: 2b 8e 00 10 lw r14,(sp+16) 8006ba4: 2b 8f 00 0c lw r15,(sp+12) 8006ba8: 2b 90 00 08 lw r16,(sp+8) 8006bac: 37 9c 00 1c addi sp,sp,28 8006bb0: c3 a0 00 00 ret =============================================================================== 08001b04 : /* * Extract an integer value from the database */ static int scanInt(FILE *fp, int *val) { 8001b04: 37 9c ff d4 addi sp,sp,-44 8001b08: 5b 8b 00 2c sw (sp+44),r11 8001b0c: 5b 8c 00 28 sw (sp+40),r12 8001b10: 5b 8d 00 24 sw (sp+36),r13 8001b14: 5b 8e 00 20 sw (sp+32),r14 8001b18: 5b 8f 00 1c sw (sp+28),r15 8001b1c: 5b 90 00 18 sw (sp+24),r16 8001b20: 5b 91 00 14 sw (sp+20),r17 8001b24: 5b 92 00 10 sw (sp+16),r18 8001b28: 5b 93 00 0c sw (sp+12),r19 8001b2c: 5b 94 00 08 sw (sp+8),r20 8001b30: 5b 9d 00 04 sw (sp+4),ra 8001b34: b8 20 58 00 mv r11,r1 int c; unsigned int i = 0; unsigned int limit = INT_MAX; 8001b38: 78 01 08 01 mvhi r1,0x801 8001b3c: 38 21 4b 3c ori r1,r1,0x4b3c 8001b40: 28 2e 00 00 lw r14,(r1+0) int sign = 0; int d; for (;;) { c = getc(fp); 8001b44: 78 11 08 01 mvhi r17,0x801 limit++; continue; } sign = 1; } if (!isdigit(c)) 8001b48: 78 10 08 01 mvhi r16,0x801 /* * Extract an integer value from the database */ static int scanInt(FILE *fp, int *val) { 8001b4c: b8 40 90 00 mv r18,r2 int c; unsigned int i = 0; unsigned int limit = INT_MAX; int sign = 0; 8001b50: 34 0d 00 00 mvi r13,0 */ static int scanInt(FILE *fp, int *val) { int c; unsigned int i = 0; 8001b54: 34 0c 00 00 mvi r12,0 unsigned int limit = INT_MAX; int sign = 0; int d; for (;;) { c = getc(fp); 8001b58: 3a 31 61 c0 ori r17,r17,0x61c0 if (c == ':') 8001b5c: 34 14 00 3a mvi r20,58 limit++; continue; } sign = 1; } if (!isdigit(c)) 8001b60: 3a 10 61 bc ori r16,r16,0x61bc for (;;) { c = getc(fp); if (c == ':') break; if (sign == 0) { if (c == '-') { 8001b64: 34 13 00 2d mvi r19,45 unsigned int limit = INT_MAX; int sign = 0; int d; for (;;) { c = getc(fp); 8001b68: 29 61 00 04 lw r1,(r11+4) 8001b6c: 34 21 ff ff addi r1,r1,-1 8001b70: 59 61 00 04 sw (r11+4),r1 8001b74: 4c 20 00 06 bge r1,r0,8001b8c <== ALWAYS TAKEN 8001b78: 2a 21 00 00 lw r1,(r17+0) <== NOT EXECUTED 8001b7c: b9 60 10 00 mv r2,r11 <== NOT EXECUTED 8001b80: f8 00 37 25 calli 800f814 <__srget_r> <== NOT EXECUTED 8001b84: b8 20 78 00 mv r15,r1 <== NOT EXECUTED 8001b88: e0 00 00 05 bi 8001b9c <== NOT EXECUTED 8001b8c: 29 61 00 00 lw r1,(r11+0) 8001b90: 40 2f 00 00 lbu r15,(r1+0) 8001b94: 34 21 00 01 addi r1,r1,1 8001b98: 59 61 00 00 sw (r11+0),r1 if (c == ':') 8001b9c: 45 f4 00 1f be r15,r20,8001c18 break; if (sign == 0) { 8001ba0: 5d a0 00 06 bne r13,r0,8001bb8 if (c == '-') { sign = -1; limit++; continue; } sign = 1; 8001ba4: 34 0d 00 01 mvi r13,1 for (;;) { c = getc(fp); if (c == ':') break; if (sign == 0) { if (c == '-') { 8001ba8: 5d f3 00 04 bne r15,r19,8001bb8 sign = -1; limit++; 8001bac: 35 ce 00 01 addi r14,r14,1 c = getc(fp); if (c == ':') break; if (sign == 0) { if (c == '-') { sign = -1; 8001bb0: 34 0d ff ff mvi r13,-1 limit++; continue; 8001bb4: e3 ff ff ed bi 8001b68 } sign = 1; } if (!isdigit(c)) 8001bb8: 2a 01 00 00 lw r1,(r16+0) 8001bbc: b4 2f 08 00 add r1,r1,r15 8001bc0: 40 21 00 01 lbu r1,(r1+1) 8001bc4: 20 21 00 04 andi r1,r1,0x4 8001bc8: 44 20 00 1c be r1,r0,8001c38 return 0; d = c - '0'; if ((i > (limit / 10)) 8001bcc: b9 c0 08 00 mv r1,r14 8001bd0: 34 02 00 0a mvi r2,10 8001bd4: f8 00 47 70 calli 8013994 <__udivsi3> 8001bd8: 55 81 00 18 bgu r12,r1,8001c38 } sign = 1; } if (!isdigit(c)) return 0; d = c - '0'; 8001bdc: 35 ef ff d0 addi r15,r15,-48 if ((i > (limit / 10)) || ((i == (limit / 10)) && (d > (limit % 10)))) 8001be0: 5d 81 00 05 bne r12,r1,8001bf4 8001be4: b9 c0 08 00 mv r1,r14 8001be8: 34 02 00 0a mvi r2,10 8001bec: f8 00 47 7a calli 80139d4 <__umodsi3> 8001bf0: 55 e1 00 12 bgu r15,r1,8001c38 <== ALWAYS TAKEN return 0; i = i * 10 + d; 8001bf4: b9 80 08 00 mv r1,r12 8001bf8: 34 02 00 01 mvi r2,1 8001bfc: f8 00 46 8c calli 801362c <__ashlsi3> 8001c00: 34 02 00 02 mvi r2,2 8001c04: b8 20 60 00 mv r12,r1 8001c08: f8 00 46 89 calli 801362c <__ashlsi3> 8001c0c: b5 81 08 00 add r1,r12,r1 8001c10: b5 e1 60 00 add r12,r15,r1 8001c14: e3 ff ff d5 bi 8001b68 } if (sign == 0) return 0; 8001c18: 34 03 00 00 mvi r3,0 if ((i > (limit / 10)) || ((i == (limit / 10)) && (d > (limit % 10)))) return 0; i = i * 10 + d; } if (sign == 0) 8001c1c: 45 a0 00 08 be r13,r0,8001c3c <== NEVER TAKEN return 0; *val = i * sign; 8001c20: b9 a0 08 00 mv r1,r13 8001c24: b9 80 10 00 mv r2,r12 8001c28: f8 00 46 f6 calli 8013800 <__mulsi3> 8001c2c: 5a 41 00 00 sw (r18+0),r1 return 1; 8001c30: 34 03 00 01 mvi r3,1 8001c34: e0 00 00 02 bi 8001c3c if (!isdigit(c)) return 0; d = c - '0'; if ((i > (limit / 10)) || ((i == (limit / 10)) && (d > (limit % 10)))) return 0; 8001c38: 34 03 00 00 mvi r3,0 } if (sign == 0) return 0; *val = i * sign; return 1; } 8001c3c: b8 60 08 00 mv r1,r3 8001c40: 2b 9d 00 04 lw ra,(sp+4) 8001c44: 2b 8b 00 2c lw r11,(sp+44) 8001c48: 2b 8c 00 28 lw r12,(sp+40) 8001c4c: 2b 8d 00 24 lw r13,(sp+36) 8001c50: 2b 8e 00 20 lw r14,(sp+32) 8001c54: 2b 8f 00 1c lw r15,(sp+28) 8001c58: 2b 90 00 18 lw r16,(sp+24) 8001c5c: 2b 91 00 14 lw r17,(sp+20) 8001c60: 2b 92 00 10 lw r18,(sp+16) 8001c64: 2b 93 00 0c lw r19,(sp+12) 8001c68: 2b 94 00 08 lw r20,(sp+8) 8001c6c: 37 9c 00 2c addi sp,sp,44 8001c70: c3 a0 00 00 ret =============================================================================== 08001dac : FILE *fp, struct group *grp, char *buffer, size_t bufsize ) { 8001dac: 37 9c ff d8 addi sp,sp,-40 8001db0: 5b 8b 00 18 sw (sp+24),r11 8001db4: 5b 8c 00 14 sw (sp+20),r12 8001db8: 5b 8d 00 10 sw (sp+16),r13 8001dbc: 5b 8e 00 0c sw (sp+12),r14 8001dc0: 5b 8f 00 08 sw (sp+8),r15 8001dc4: 5b 9d 00 04 sw (sp+4),ra int grgid; char *grmem, *cp; int memcount; if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0) 8001dc8: 37 8e 00 20 addi r14,sp,32 8001dcc: 37 8d 00 1c addi r13,sp,28 FILE *fp, struct group *grp, char *buffer, size_t bufsize ) { 8001dd0: 5b 83 00 20 sw (sp+32),r3 8001dd4: 5b 84 00 1c sw (sp+28),r4 int grgid; char *grmem, *cp; int memcount; if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0) 8001dd8: b9 c0 18 00 mv r3,r14 8001ddc: b9 a0 20 00 mv r4,r13 8001de0: 34 05 00 00 mvi r5,0 FILE *fp, struct group *grp, char *buffer, size_t bufsize ) { 8001de4: b8 20 78 00 mv r15,r1 8001de8: b8 40 58 00 mv r11,r2 int grgid; char *grmem, *cp; int memcount; if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0) 8001dec: fb ff ff a2 calli 8001c74 || !scanString(fp, &grp->gr_passwd, &buffer, &bufsize, 0) || !scanInt(fp, &grgid) || !scanString(fp, &grmem, &buffer, &bufsize, 1)) return 0; 8001df0: 34 0c 00 00 mvi r12,0 { int grgid; char *grmem, *cp; int memcount; if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0) 8001df4: 44 20 00 43 be r1,r0,8001f00 || !scanString(fp, &grp->gr_passwd, &buffer, &bufsize, 0) 8001df8: b9 e0 08 00 mv r1,r15 8001dfc: 35 62 00 04 addi r2,r11,4 8001e00: b9 c0 18 00 mv r3,r14 8001e04: b9 a0 20 00 mv r4,r13 8001e08: 34 05 00 00 mvi r5,0 8001e0c: fb ff ff 9a calli 8001c74 8001e10: 44 20 00 3c be r1,r0,8001f00 <== NEVER TAKEN || !scanInt(fp, &grgid) 8001e14: b9 e0 08 00 mv r1,r15 8001e18: 37 82 00 28 addi r2,sp,40 8001e1c: fb ff ff 3a calli 8001b04 8001e20: 44 20 00 38 be r1,r0,8001f00 <== NEVER TAKEN || !scanString(fp, &grmem, &buffer, &bufsize, 1)) 8001e24: b9 e0 08 00 mv r1,r15 8001e28: 37 82 00 24 addi r2,sp,36 8001e2c: b9 c0 18 00 mv r3,r14 8001e30: b9 a0 20 00 mv r4,r13 8001e34: 34 05 00 01 mvi r5,1 8001e38: fb ff ff 8f calli 8001c74 8001e3c: 44 20 00 31 be r1,r0,8001f00 <== NEVER TAKEN return 0; grp->gr_gid = grgid; 8001e40: 2b 81 00 28 lw r1,(sp+40) /* * Determine number of members */ for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 8001e44: 2b 8d 00 24 lw r13,(sp+36) 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; 8001e48: 0d 61 00 08 sh (r11+8),r1 /* * Determine number of members */ for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 8001e4c: b9 a0 10 00 mv r2,r13 8001e50: 34 01 00 01 mvi r1,1 8001e54: e0 00 00 04 bi 8001e64 if(*cp == ',') memcount++; 8001e58: 64 63 00 2c cmpei r3,r3,44 grp->gr_gid = grgid; /* * Determine number of members */ for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 8001e5c: 34 42 00 01 addi r2,r2,1 if(*cp == ',') memcount++; 8001e60: b4 23 08 00 add r1,r1,r3 grp->gr_gid = grgid; /* * Determine number of members */ for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 8001e64: 40 43 00 00 lbu r3,(r2+0) 8001e68: 5c 60 ff fc bne r3,r0,8001e58 } /* * Hack to produce (hopefully) a suitably-aligned array of pointers */ if (bufsize < (((memcount+1)*sizeof(char *)) + 15)) 8001e6c: 34 02 00 02 mvi r2,2 8001e70: 34 21 00 01 addi r1,r1,1 8001e74: f8 00 45 ee calli 801362c <__ashlsi3> 8001e78: 2b 82 00 1c lw r2,(sp+28) 8001e7c: 34 21 00 0f addi r1,r1,15 return 0; 8001e80: 34 0c 00 00 mvi r12,0 } /* * Hack to produce (hopefully) a suitably-aligned array of pointers */ if (bufsize < (((memcount+1)*sizeof(char *)) + 15)) 8001e84: 54 22 00 1f bgu r1,r2,8001f00 <== NEVER TAKEN return 0; grp->gr_mem = (char **)(((uintptr_t)buffer + 15) & ~15); 8001e88: 2b 81 00 20 lw r1,(sp+32) 8001e8c: 34 02 ff f0 mvi r2,-16 /* * Fill in pointer array */ grp->gr_mem[0] = grmem; for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { if(*cp == ',') { 8001e90: 34 0e 00 2c mvi r14,44 /* * Hack to produce (hopefully) a suitably-aligned array of pointers */ if (bufsize < (((memcount+1)*sizeof(char *)) + 15)) return 0; grp->gr_mem = (char **)(((uintptr_t)buffer + 15) & ~15); 8001e94: 34 21 00 0f addi r1,r1,15 8001e98: a0 22 08 00 and r1,r1,r2 8001e9c: 59 61 00 0c sw (r11+12),r1 /* * Fill in pointer array */ grp->gr_mem[0] = grmem; 8001ea0: 58 2d 00 00 sw (r1+0),r13 } /* * Extract a single group record from the database */ static int scangr( 8001ea4: 2b 8c 00 24 lw r12,(sp+36) /* * Fill in pointer array */ grp->gr_mem[0] = grmem; for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 8001ea8: 34 0d 00 01 mvi r13,1 } /* * Extract a single group record from the database */ static int scangr( 8001eac: 35 8c 00 01 addi r12,r12,1 /* * Fill in pointer array */ grp->gr_mem[0] = grmem; for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 8001eb0: e0 00 00 0b bi 8001edc if(*cp == ',') { 8001eb4: 5c 2e 00 09 bne r1,r14,8001ed8 *cp = '\0'; 8001eb8: 31 80 ff ff sb (r12+-1),r0 grp->gr_mem[memcount++] = cp + 1; 8001ebc: 29 6f 00 0c lw r15,(r11+12) 8001ec0: b9 a0 08 00 mv r1,r13 8001ec4: 34 02 00 02 mvi r2,2 8001ec8: f8 00 45 d9 calli 801362c <__ashlsi3> 8001ecc: b5 e1 08 00 add r1,r15,r1 8001ed0: 58 2c 00 00 sw (r1+0),r12 8001ed4: 35 ad 00 01 addi r13,r13,1 8001ed8: 35 8c 00 01 addi r12,r12,1 /* * Fill in pointer array */ grp->gr_mem[0] = grmem; for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 8001edc: 41 81 ff ff lbu r1,(r12+-1) 8001ee0: 5c 20 ff f5 bne r1,r0,8001eb4 if(*cp == ',') { *cp = '\0'; grp->gr_mem[memcount++] = cp + 1; } } grp->gr_mem[memcount] = NULL; 8001ee4: 29 6b 00 0c lw r11,(r11+12) 8001ee8: b9 a0 08 00 mv r1,r13 8001eec: 34 02 00 02 mvi r2,2 8001ef0: f8 00 45 cf calli 801362c <__ashlsi3> 8001ef4: b5 61 08 00 add r1,r11,r1 8001ef8: 58 20 00 00 sw (r1+0),r0 return 1; 8001efc: 34 0c 00 01 mvi r12,1 } 8001f00: b9 80 08 00 mv r1,r12 8001f04: 2b 9d 00 04 lw ra,(sp+4) 8001f08: 2b 8b 00 18 lw r11,(sp+24) 8001f0c: 2b 8c 00 14 lw r12,(sp+20) 8001f10: 2b 8d 00 10 lw r13,(sp+16) 8001f14: 2b 8e 00 0c lw r14,(sp+12) 8001f18: 2b 8f 00 08 lw r15,(sp+8) 8001f1c: 37 9c 00 28 addi sp,sp,40 8001f20: c3 a0 00 00 ret =============================================================================== 08001f24 : FILE *fp, struct passwd *pwd, char *buffer, size_t bufsize ) { 8001f24: 37 9c ff d8 addi sp,sp,-40 8001f28: 5b 8b 00 18 sw (sp+24),r11 8001f2c: 5b 8c 00 14 sw (sp+20),r12 8001f30: 5b 8d 00 10 sw (sp+16),r13 8001f34: 5b 8e 00 0c sw (sp+12),r14 8001f38: 5b 8f 00 08 sw (sp+8),r15 8001f3c: 5b 9d 00 04 sw (sp+4),ra int pwuid, pwgid; if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0) 8001f40: 37 8e 00 20 addi r14,sp,32 8001f44: 37 8d 00 1c addi r13,sp,28 FILE *fp, struct passwd *pwd, char *buffer, size_t bufsize ) { 8001f48: 5b 83 00 20 sw (sp+32),r3 8001f4c: 5b 84 00 1c sw (sp+28),r4 int pwuid, pwgid; if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0) 8001f50: b9 c0 18 00 mv r3,r14 8001f54: b9 a0 20 00 mv r4,r13 8001f58: 34 05 00 00 mvi r5,0 FILE *fp, struct passwd *pwd, char *buffer, size_t bufsize ) { 8001f5c: b8 20 60 00 mv r12,r1 8001f60: b8 40 58 00 mv r11,r2 int pwuid, pwgid; if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0) 8001f64: fb ff ff 44 calli 8001c74 || !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; 8001f68: 34 0f 00 00 mvi r15,0 size_t bufsize ) { int pwuid, pwgid; if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0) 8001f6c: 44 20 00 31 be r1,r0,8002030 || !scanString(fp, &pwd->pw_passwd, &buffer, &bufsize, 0) 8001f70: b9 80 08 00 mv r1,r12 8001f74: 35 62 00 04 addi r2,r11,4 8001f78: b9 c0 18 00 mv r3,r14 8001f7c: b9 a0 20 00 mv r4,r13 8001f80: 34 05 00 00 mvi r5,0 8001f84: fb ff ff 3c calli 8001c74 8001f88: 44 20 00 2a be r1,r0,8002030 <== NEVER TAKEN || !scanInt(fp, &pwuid) 8001f8c: b9 80 08 00 mv r1,r12 8001f90: 37 82 00 28 addi r2,sp,40 8001f94: fb ff fe dc calli 8001b04 8001f98: 44 20 00 26 be r1,r0,8002030 || !scanInt(fp, &pwgid) 8001f9c: b9 80 08 00 mv r1,r12 8001fa0: 37 82 00 24 addi r2,sp,36 8001fa4: fb ff fe d8 calli 8001b04 8001fa8: 44 20 00 22 be r1,r0,8002030 || !scanString(fp, &pwd->pw_comment, &buffer, &bufsize, 0) 8001fac: b9 80 08 00 mv r1,r12 8001fb0: 35 62 00 0c addi r2,r11,12 8001fb4: b9 c0 18 00 mv r3,r14 8001fb8: b9 a0 20 00 mv r4,r13 8001fbc: 34 05 00 00 mvi r5,0 8001fc0: fb ff ff 2d calli 8001c74 8001fc4: 44 20 00 1b be r1,r0,8002030 <== NEVER TAKEN || !scanString(fp, &pwd->pw_gecos, &buffer, &bufsize, 0) 8001fc8: b9 80 08 00 mv r1,r12 8001fcc: 35 62 00 10 addi r2,r11,16 8001fd0: b9 c0 18 00 mv r3,r14 8001fd4: b9 a0 20 00 mv r4,r13 8001fd8: 34 05 00 00 mvi r5,0 8001fdc: fb ff ff 26 calli 8001c74 8001fe0: 44 20 00 14 be r1,r0,8002030 <== NEVER TAKEN || !scanString(fp, &pwd->pw_dir, &buffer, &bufsize, 0) 8001fe4: b9 80 08 00 mv r1,r12 8001fe8: 35 62 00 14 addi r2,r11,20 8001fec: b9 c0 18 00 mv r3,r14 8001ff0: b9 a0 20 00 mv r4,r13 8001ff4: 34 05 00 00 mvi r5,0 8001ff8: fb ff ff 1f calli 8001c74 8001ffc: 44 20 00 0d be r1,r0,8002030 <== NEVER TAKEN || !scanString(fp, &pwd->pw_shell, &buffer, &bufsize, 1)) 8002000: b9 80 08 00 mv r1,r12 8002004: 35 62 00 18 addi r2,r11,24 8002008: b9 c0 18 00 mv r3,r14 800200c: b9 a0 20 00 mv r4,r13 8002010: 34 05 00 01 mvi r5,1 8002014: fb ff ff 18 calli 8001c74 8002018: 44 20 00 06 be r1,r0,8002030 return 0; pwd->pw_uid = pwuid; 800201c: 2b 81 00 28 lw r1,(sp+40) pwd->pw_gid = pwgid; return 1; 8002020: 34 0f 00 01 mvi r15,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; 8002024: 0d 61 00 08 sh (r11+8),r1 pwd->pw_gid = pwgid; 8002028: 2b 81 00 24 lw r1,(sp+36) 800202c: 0d 61 00 0a sh (r11+10),r1 return 1; } 8002030: b9 e0 08 00 mv r1,r15 8002034: 2b 9d 00 04 lw ra,(sp+4) 8002038: 2b 8b 00 18 lw r11,(sp+24) 800203c: 2b 8c 00 14 lw r12,(sp+20) 8002040: 2b 8d 00 10 lw r13,(sp+16) 8002044: 2b 8e 00 0c lw r14,(sp+12) 8002048: 2b 8f 00 08 lw r15,(sp+8) 800204c: 37 9c 00 28 addi sp,sp,40 8002050: c3 a0 00 00 ret =============================================================================== 0800394c : #include int sched_get_priority_max( int policy ) { 800394c: 37 9c ff fc addi sp,sp,-4 8003950: 5b 9d 00 04 sw (sp+4),ra switch ( policy ) { 8003954: 48 01 00 05 bg r0,r1,8003968 8003958: 34 02 00 02 mvi r2,2 800395c: 4c 41 00 08 bge r2,r1,800397c 8003960: 34 02 00 04 mvi r2,4 8003964: 44 22 00 06 be r1,r2,800397c <== ALWAYS TAKEN case SCHED_RR: case SCHED_SPORADIC: break; default: rtems_set_errno_and_return_minus_one( EINVAL ); 8003968: f8 00 26 84 calli 800d378 <__errno> 800396c: 34 02 00 16 mvi r2,22 8003970: 58 22 00 00 sw (r1+0),r2 8003974: 34 01 ff ff mvi r1,-1 8003978: e0 00 00 05 bi 800398c } return POSIX_SCHEDULER_MAXIMUM_PRIORITY; 800397c: 78 01 08 01 mvhi r1,0x801 8003980: 38 21 f0 e4 ori r1,r1,0xf0e4 8003984: 40 21 00 00 lbu r1,(r1+0) 8003988: 34 21 ff ff addi r1,r1,-1 } 800398c: 2b 9d 00 04 lw ra,(sp+4) 8003990: 37 9c 00 04 addi sp,sp,4 8003994: c3 a0 00 00 ret =============================================================================== 08003998 : #include int sched_get_priority_min( int policy ) { 8003998: 37 9c ff fc addi sp,sp,-4 800399c: 5b 9d 00 04 sw (sp+4),ra switch ( policy ) { 80039a0: 48 01 00 05 bg r0,r1,80039b4 80039a4: 34 02 00 02 mvi r2,2 80039a8: 4c 41 00 08 bge r2,r1,80039c8 <== ALWAYS TAKEN 80039ac: 34 02 00 04 mvi r2,4 <== NOT EXECUTED 80039b0: 44 22 00 06 be r1,r2,80039c8 <== NOT EXECUTED case SCHED_RR: case SCHED_SPORADIC: break; default: rtems_set_errno_and_return_minus_one( EINVAL ); 80039b4: f8 00 26 71 calli 800d378 <__errno> 80039b8: 34 02 00 16 mvi r2,22 80039bc: 58 22 00 00 sw (r1+0),r2 80039c0: 34 01 ff ff mvi r1,-1 80039c4: e0 00 00 02 bi 80039cc } return POSIX_SCHEDULER_MINIMUM_PRIORITY; 80039c8: 34 01 00 01 mvi r1,1 } 80039cc: 2b 9d 00 04 lw ra,(sp+4) 80039d0: 37 9c 00 04 addi sp,sp,4 80039d4: c3 a0 00 00 ret =============================================================================== 080039d8 : int sched_rr_get_interval( pid_t pid, struct timespec *interval ) { 80039d8: 37 9c ff f4 addi sp,sp,-12 80039dc: 5b 8b 00 08 sw (sp+8),r11 80039e0: 5b 9d 00 04 sw (sp+4),ra 80039e4: b8 20 58 00 mv r11,r1 /* * Only supported for the "calling process" (i.e. this node). */ if ( pid && pid != getpid() ) 80039e8: 44 20 00 08 be r1,r0,8003a08 <== NEVER TAKEN 80039ec: 5b 82 00 0c sw (sp+12),r2 80039f0: fb ff f8 af calli 8001cac 80039f4: 2b 82 00 0c lw r2,(sp+12) 80039f8: 45 61 00 04 be r11,r1,8003a08 rtems_set_errno_and_return_minus_one( ESRCH ); 80039fc: f8 00 26 5f calli 800d378 <__errno> 8003a00: 34 02 00 03 mvi r2,3 8003a04: e0 00 00 04 bi 8003a14 if ( !interval ) 8003a08: 5c 40 00 06 bne r2,r0,8003a20 rtems_set_errno_and_return_minus_one( EINVAL ); 8003a0c: f8 00 26 5b calli 800d378 <__errno> 8003a10: 34 02 00 16 mvi r2,22 8003a14: 58 22 00 00 sw (r1+0),r2 8003a18: 34 01 ff ff mvi r1,-1 8003a1c: e0 00 00 06 bi 8003a34 _Timespec_From_ticks( _Thread_Ticks_per_timeslice, interval ); 8003a20: 78 01 08 01 mvhi r1,0x801 8003a24: 38 21 f8 30 ori r1,r1,0xf830 8003a28: 28 21 00 00 lw r1,(r1+0) 8003a2c: f8 00 0e 20 calli 80072ac <_Timespec_From_ticks> return 0; 8003a30: 34 01 00 00 mvi r1,0 } 8003a34: 2b 9d 00 04 lw ra,(sp+4) 8003a38: 2b 8b 00 08 lw r11,(sp+8) 8003a3c: 37 9c 00 0c addi sp,sp,12 8003a40: c3 a0 00 00 ret =============================================================================== 08006134 : int oflag, ... /* mode_t mode, */ /* unsigned int value */ ) { 8006134: 37 9c ff c0 addi sp,sp,-64 8006138: 5b 8b 00 18 sw (sp+24),r11 800613c: 5b 8c 00 14 sw (sp+20),r12 8006140: 5b 8d 00 10 sw (sp+16),r13 8006144: 5b 8e 00 0c sw (sp+12),r14 8006148: 5b 8f 00 08 sw (sp+8),r15 800614c: 5b 9d 00 04 sw (sp+4),ra 8006150: 5b 83 00 2c sw (sp+44),r3 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 8006154: 78 03 08 02 mvhi r3,0x802 8006158: 5b 82 00 28 sw (sp+40),r2 800615c: 5b 84 00 30 sw (sp+48),r4 8006160: 5b 85 00 34 sw (sp+52),r5 8006164: 5b 86 00 38 sw (sp+56),r6 8006168: 5b 87 00 3c sw (sp+60),r7 800616c: 5b 88 00 40 sw (sp+64),r8 8006170: 38 63 4a 90 ori r3,r3,0x4a90 8006174: b8 20 60 00 mv r12,r1 8006178: 28 61 00 00 lw r1,(r3+0) 800617c: b8 40 70 00 mv r14,r2 8006180: 34 21 00 01 addi r1,r1,1 8006184: 58 61 00 00 sw (r3+0),r1 POSIX_Semaphore_Control *the_semaphore; Objects_Locations location; _Thread_Disable_dispatch(); if ( oflag & O_CREAT ) { 8006188: 20 4f 02 00 andi r15,r2,0x200 /* unsigned int value */ ) { va_list arg; mode_t mode; unsigned int value = 0; 800618c: 34 0d 00 00 mvi r13,0 POSIX_Semaphore_Control *the_semaphore; Objects_Locations location; _Thread_Disable_dispatch(); if ( oflag & O_CREAT ) { 8006190: 45 e0 00 02 be r15,r0,8006198 va_start(arg, oflag); mode = (mode_t) va_arg( arg, unsigned int ); value = va_arg( arg, unsigned int ); 8006194: 2b 8d 00 30 lw r13,(sp+48) va_end(arg); } status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id ); 8006198: b9 80 08 00 mv r1,r12 800619c: 37 82 00 24 addi r2,sp,36 80061a0: f8 00 1b 07 calli 800cdbc <_POSIX_Semaphore_Name_to_id> 80061a4: b8 20 58 00 mv r11,r1 * 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 ) { 80061a8: 44 20 00 08 be r1,r0,80061c8 /* * 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) ) ) { 80061ac: 34 01 00 02 mvi r1,2 80061b0: 5d 61 00 02 bne r11,r1,80061b8 <== NEVER TAKEN 80061b4: 5d e0 00 1a bne r15,r0,800621c _Thread_Enable_dispatch(); 80061b8: f8 00 0a b9 calli 8008c9c <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one_cast( status, sem_t * ); 80061bc: f8 00 2a 59 calli 8010b20 <__errno> 80061c0: 58 2b 00 00 sw (r1+0),r11 80061c4: e0 00 00 08 bi 80061e4 /* * Check for existence with creation. */ if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) { 80061c8: 21 ce 0a 00 andi r14,r14,0xa00 80061cc: 34 01 0a 00 mvi r1,2560 80061d0: 5d c1 00 07 bne r14,r1,80061ec _Thread_Enable_dispatch(); 80061d4: f8 00 0a b2 calli 8008c9c <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * ); 80061d8: f8 00 2a 52 calli 8010b20 <__errno> 80061dc: 34 02 00 11 mvi r2,17 80061e0: 58 22 00 00 sw (r1+0),r2 80061e4: 34 01 ff ff mvi r1,-1 80061e8: e0 00 00 18 bi 8006248 80061ec: 2b 82 00 24 lw r2,(sp+36) 80061f0: 78 01 08 02 mvhi r1,0x802 80061f4: 37 83 00 1c addi r3,sp,28 80061f8: 38 21 4c e4 ori r1,r1,0x4ce4 80061fc: f8 00 07 5c calli 8007f6c <_Objects_Get> } the_semaphore = _POSIX_Semaphore_Get( &the_semaphore_id, &location ); the_semaphore->open_count += 1; 8006200: 28 22 00 18 lw r2,(r1+24) 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 ); 8006204: 5b 81 00 20 sw (sp+32),r1 the_semaphore->open_count += 1; 8006208: 34 42 00 01 addi r2,r2,1 800620c: 58 22 00 18 sw (r1+24),r2 _Thread_Enable_dispatch(); 8006210: f8 00 0a a3 calli 8008c9c <_Thread_Enable_dispatch> _Thread_Enable_dispatch(); 8006214: f8 00 0a a2 calli 8008c9c <_Thread_Enable_dispatch> goto return_id; 8006218: e0 00 00 0a bi 8006240 /* * 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( 800621c: 34 02 00 00 mvi r2,0 8006220: b9 a0 18 00 mv r3,r13 8006224: 37 84 00 20 addi r4,sp,32 8006228: b9 80 08 00 mv r1,r12 800622c: f8 00 1a 80 calli 800cc2c <_POSIX_Semaphore_Create_support> 8006230: b8 20 58 00 mv r11,r1 /* * errno was set by Create_support, so don't set it again. */ _Thread_Enable_dispatch(); 8006234: f8 00 0a 9a calli 8008c9c <_Thread_Enable_dispatch> if ( status == -1 ) return SEM_FAILED; 8006238: 34 01 ff ff mvi r1,-1 * errno was set by Create_support, so don't set it again. */ _Thread_Enable_dispatch(); if ( status == -1 ) 800623c: 45 61 00 03 be r11,r1,8006248 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; 8006240: 2b 81 00 20 lw r1,(sp+32) 8006244: 34 21 00 08 addi r1,r1,8 #endif return id; } 8006248: 2b 9d 00 04 lw ra,(sp+4) 800624c: 2b 8b 00 18 lw r11,(sp+24) 8006250: 2b 8c 00 14 lw r12,(sp+20) 8006254: 2b 8d 00 10 lw r13,(sp+16) 8006258: 2b 8e 00 0c lw r14,(sp+12) 800625c: 2b 8f 00 08 lw r15,(sp+8) 8006260: 37 9c 00 40 addi sp,sp,64 8006264: c3 a0 00 00 ret =============================================================================== 0800384c : int sigaction( int sig, const struct sigaction *act, struct sigaction *oact ) { 800384c: 37 9c ff ec addi sp,sp,-20 8003850: 5b 8b 00 14 sw (sp+20),r11 8003854: 5b 8c 00 10 sw (sp+16),r12 8003858: 5b 8d 00 0c sw (sp+12),r13 800385c: 5b 8e 00 08 sw (sp+8),r14 8003860: 5b 9d 00 04 sw (sp+4),ra 8003864: b8 20 58 00 mv r11,r1 8003868: b8 40 60 00 mv r12,r2 800386c: b8 60 68 00 mv r13,r3 ISR_Level level; if ( oact ) 8003870: 44 60 00 0f be r3,r0,80038ac *oact = _POSIX_signals_Vectors[ sig ]; 8003874: 34 02 00 01 mvi r2,1 8003878: f8 00 67 29 calli 801d51c <__ashlsi3> 800387c: 34 02 00 02 mvi r2,2 8003880: 78 0e 08 02 mvhi r14,0x802 8003884: b4 2b 08 00 add r1,r1,r11 8003888: f8 00 67 25 calli 801d51c <__ashlsi3> 800388c: 39 ce 0e 00 ori r14,r14,0xe00 8003890: b5 c1 08 00 add r1,r14,r1 8003894: 28 23 00 00 lw r3,(r1+0) 8003898: 28 22 00 04 lw r2,(r1+4) 800389c: 28 21 00 08 lw r1,(r1+8) 80038a0: 59 a3 00 00 sw (r13+0),r3 80038a4: 59 a2 00 04 sw (r13+4),r2 80038a8: 59 a1 00 08 sw (r13+8),r1 if ( !sig ) 80038ac: 45 60 00 07 be r11,r0,80038c8 static inline bool is_valid_signo( int signo ) { return ((signo) >= 1 && (signo) <= 32 ); 80038b0: 35 61 ff ff addi r1,r11,-1 rtems_set_errno_and_return_minus_one( EINVAL ); if ( !is_valid_signo(sig) ) 80038b4: 34 02 00 1f mvi r2,31 80038b8: 50 41 00 02 bgeu r2,r1,80038c0 80038bc: e0 00 00 03 bi 80038c8 * * NOTE: Solaris documentation claims to "silently enforce" this which * contradicts the POSIX specification. */ if ( sig == SIGKILL ) 80038c0: 34 01 00 09 mvi r1,9 80038c4: 5d 61 00 06 bne r11,r1,80038dc rtems_set_errno_and_return_minus_one( EINVAL ); 80038c8: f8 00 28 03 calli 800d8d4 <__errno> 80038cc: 34 02 00 16 mvi r2,22 80038d0: 58 22 00 00 sw (r1+0),r2 80038d4: 34 01 ff ff mvi r1,-1 80038d8: e0 00 00 31 bi 800399c * 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; 80038dc: 34 01 00 00 mvi r1,0 /* * Evaluate the new action structure and set the global signal vector * appropriately. */ if ( act ) { 80038e0: 45 80 00 2f be r12,r0,800399c <== NEVER TAKEN /* * Unless the user is installing the default signal actions, then * we can just copy the provided sigaction structure into the vectors. */ _ISR_Disable( level ); 80038e4: 90 00 70 00 rcsr r14,IE 80038e8: 34 01 ff fe mvi r1,-2 80038ec: a1 c1 08 00 and r1,r14,r1 80038f0: d0 01 00 00 wcsr IE,r1 if ( act->sa_handler == SIG_DFL ) { 80038f4: 29 81 00 08 lw r1,(r12+8) 80038f8: 78 0d 08 02 mvhi r13,0x802 80038fc: 39 ad 0e 00 ori r13,r13,0xe00 8003900: 5c 20 00 16 bne r1,r0,8003958 _POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ]; 8003904: b9 60 08 00 mv r1,r11 8003908: 34 02 00 01 mvi r2,1 800390c: f8 00 67 04 calli 801d51c <__ashlsi3> 8003910: b4 2b 58 00 add r11,r1,r11 8003914: 34 02 00 02 mvi r2,2 8003918: b9 60 08 00 mv r1,r11 800391c: f8 00 67 00 calli 801d51c <__ashlsi3> 8003920: b5 a1 68 00 add r13,r13,r1 8003924: 34 02 00 02 mvi r2,2 8003928: 78 0c 08 01 mvhi r12,0x801 800392c: b9 60 08 00 mv r1,r11 8003930: f8 00 66 fb calli 801d51c <__ashlsi3> 8003934: 39 8c ef 24 ori r12,r12,0xef24 8003938: b5 81 08 00 add r1,r12,r1 800393c: 28 23 00 00 lw r3,(r1+0) 8003940: 28 22 00 04 lw r2,(r1+4) 8003944: 28 21 00 08 lw r1,(r1+8) 8003948: 59 a3 00 00 sw (r13+0),r3 800394c: 59 a2 00 04 sw (r13+4),r2 8003950: 59 a1 00 08 sw (r13+8),r1 8003954: e0 00 00 10 bi 8003994 } else { _POSIX_signals_Clear_process_signals( sig ); 8003958: b9 60 08 00 mv r1,r11 800395c: f8 00 18 99 calli 8009bc0 <_POSIX_signals_Clear_process_signals> _POSIX_signals_Vectors[ sig ] = *act; 8003960: 34 02 00 01 mvi r2,1 8003964: b9 60 08 00 mv r1,r11 8003968: f8 00 66 ed calli 801d51c <__ashlsi3> 800396c: 34 02 00 02 mvi r2,2 8003970: b4 2b 08 00 add r1,r1,r11 8003974: f8 00 66 ea calli 801d51c <__ashlsi3> 8003978: 29 83 00 00 lw r3,(r12+0) 800397c: 29 82 00 04 lw r2,(r12+4) 8003980: 29 84 00 08 lw r4,(r12+8) 8003984: b5 a1 08 00 add r1,r13,r1 8003988: 58 23 00 00 sw (r1+0),r3 800398c: 58 22 00 04 sw (r1+4),r2 8003990: 58 24 00 08 sw (r1+8),r4 } _ISR_Enable( level ); 8003994: d0 0e 00 00 wcsr IE,r14 * 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; 8003998: 34 01 00 00 mvi r1,0 } 800399c: 2b 9d 00 04 lw ra,(sp+4) 80039a0: 2b 8b 00 14 lw r11,(sp+20) 80039a4: 2b 8c 00 10 lw r12,(sp+16) 80039a8: 2b 8d 00 0c lw r13,(sp+12) 80039ac: 2b 8e 00 08 lw r14,(sp+8) 80039b0: 37 9c 00 14 addi sp,sp,20 80039b4: c3 a0 00 00 ret =============================================================================== 08003e48 : int sigtimedwait( const sigset_t *set, siginfo_t *info, const struct timespec *timeout ) { 8003e48: 37 9c ff dc addi sp,sp,-36 8003e4c: 5b 8b 00 18 sw (sp+24),r11 8003e50: 5b 8c 00 14 sw (sp+20),r12 8003e54: 5b 8d 00 10 sw (sp+16),r13 8003e58: 5b 8e 00 0c sw (sp+12),r14 8003e5c: 5b 8f 00 08 sw (sp+8),r15 8003e60: 5b 9d 00 04 sw (sp+4),ra 8003e64: b8 20 68 00 mv r13,r1 8003e68: b8 40 58 00 mv r11,r2 8003e6c: b8 60 60 00 mv r12,r3 ISR_Level level; /* * Error check parameters before disabling interrupts. */ if ( !set ) 8003e70: 44 20 00 09 be r1,r0,8003e94 /* NOTE: This is very specifically a RELATIVE not ABSOLUTE time * in the Open Group specification. */ interval = 0; if ( timeout ) { 8003e74: 44 60 00 0b be r3,r0,8003ea0 if ( !_Timespec_Is_valid( timeout ) ) 8003e78: b8 60 08 00 mv r1,r3 8003e7c: f8 00 0e 48 calli 800779c <_Timespec_Is_valid> 8003e80: 44 20 00 05 be r1,r0,8003e94 rtems_set_errno_and_return_minus_one( EINVAL ); interval = _Timespec_To_ticks( timeout ); 8003e84: b9 80 08 00 mv r1,r12 8003e88: f8 00 0e 63 calli 8007814 <_Timespec_To_ticks> 8003e8c: b8 20 10 00 mv r2,r1 if ( !interval ) 8003e90: 5c 20 00 05 bne r1,r0,8003ea4 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); 8003e94: f8 00 28 5c calli 800e004 <__errno> 8003e98: 34 02 00 16 mvi r2,22 8003e9c: e0 00 00 61 bi 8004020 /* NOTE: This is very specifically a RELATIVE not ABSOLUTE time * in the Open Group specification. */ interval = 0; 8003ea0: 34 02 00 00 mvi r2,0 /* * Initialize local variables. */ the_info = ( info ) ? info : &signal_information; 8003ea4: 5d 60 00 02 bne r11,r0,8003eac 8003ea8: 37 8b 00 1c addi r11,sp,28 the_thread = _Thread_Executing; 8003eac: 78 01 08 02 mvhi r1,0x802 8003eb0: 38 21 1d b4 ori r1,r1,0x1db4 8003eb4: 28 23 00 0c lw r3,(r1+12) api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 8003eb8: 28 6e 01 20 lw r14,(r3+288) * What if they are already pending? */ /* API signals pending? */ _ISR_Disable( level ); 8003ebc: 90 00 78 00 rcsr r15,IE 8003ec0: 34 01 ff fe mvi r1,-2 8003ec4: a1 e1 08 00 and r1,r15,r1 8003ec8: d0 01 00 00 wcsr IE,r1 if ( *set & api->signals_pending ) { 8003ecc: 29 a5 00 00 lw r5,(r13+0) 8003ed0: 29 c1 00 d4 lw r1,(r14+212) 8003ed4: a0 a1 20 00 and r4,r5,r1 8003ed8: 44 80 00 0f be r4,r0,8003f14 /* XXX real info later */ the_info->si_signo = _POSIX_signals_Get_lowest( api->signals_pending ); 8003edc: fb ff ff bc calli 8003dcc <_POSIX_signals_Get_lowest> 8003ee0: b8 20 10 00 mv r2,r1 8003ee4: 59 61 00 00 sw (r11+0),r1 _POSIX_signals_Clear_signals( 8003ee8: b9 60 18 00 mv r3,r11 8003eec: b9 c0 08 00 mv r1,r14 8003ef0: 34 04 00 00 mvi r4,0 8003ef4: 34 05 00 00 mvi r5,0 8003ef8: f8 00 19 b5 calli 800a5cc <_POSIX_signals_Clear_signals> the_info->si_signo, the_info, false, false ); _ISR_Enable( level ); 8003efc: d0 0f 00 00 wcsr IE,r15 the_info->si_code = SI_USER; 8003f00: 34 01 00 01 mvi r1,1 8003f04: 59 61 00 04 sw (r11+4),r1 the_info->si_value.sival_int = 0; 8003f08: 59 60 00 08 sw (r11+8),r0 return the_info->si_signo; 8003f0c: 29 6c 00 00 lw r12,(r11+0) 8003f10: e0 00 00 46 bi 8004028 } /* Process pending signals? */ if ( *set & _POSIX_signals_Pending ) { 8003f14: 78 01 08 02 mvhi r1,0x802 8003f18: 38 21 1f f4 ori r1,r1,0x1ff4 8003f1c: 28 21 00 00 lw r1,(r1+0) 8003f20: a0 a1 28 00 and r5,r5,r1 8003f24: 44 a4 00 0f be r5,r4,8003f60 signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending ); 8003f28: fb ff ff a9 calli 8003dcc <_POSIX_signals_Get_lowest> 8003f2c: b8 20 60 00 mv r12,r1 _POSIX_signals_Clear_signals( api, signo, the_info, true, false ); 8003f30: b9 80 10 00 mv r2,r12 8003f34: b9 c0 08 00 mv r1,r14 8003f38: b9 60 18 00 mv r3,r11 8003f3c: 34 04 00 01 mvi r4,1 8003f40: 34 05 00 00 mvi r5,0 8003f44: f8 00 19 a2 calli 800a5cc <_POSIX_signals_Clear_signals> _ISR_Enable( level ); 8003f48: d0 0f 00 00 wcsr IE,r15 the_info->si_signo = signo; the_info->si_code = SI_USER; 8003f4c: 34 01 00 01 mvi r1,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; 8003f50: 59 6c 00 00 sw (r11+0),r12 the_info->si_code = SI_USER; 8003f54: 59 61 00 04 sw (r11+4),r1 the_info->si_value.sival_int = 0; 8003f58: 59 60 00 08 sw (r11+8),r0 return signo; 8003f5c: e0 00 00 33 bi 8004028 } the_info->si_signo = -1; 8003f60: 34 01 ff ff mvi r1,-1 8003f64: 59 61 00 00 sw (r11+0),r1 8003f68: 78 01 08 02 mvhi r1,0x802 8003f6c: 38 21 18 e8 ori r1,r1,0x18e8 8003f70: 28 24 00 00 lw r4,(r1+0) 8003f74: 34 84 00 01 addi r4,r4,1 8003f78: 58 24 00 00 sw (r1+0),r4 _Thread_Disable_dispatch(); the_thread->Wait.queue = &_POSIX_signals_Wait_queue; the_thread->Wait.return_code = EINTR; 8003f7c: 34 04 00 04 mvi r4,4 8003f80: 58 64 00 34 sw (r3+52),r4 the_thread->Wait.option = *set; 8003f84: 29 a4 00 00 lw r4,(r13+0) } the_info->si_signo = -1; _Thread_Disable_dispatch(); the_thread->Wait.queue = &_POSIX_signals_Wait_queue; 8003f88: 78 01 08 02 mvhi r1,0x802 8003f8c: 38 21 1f 8c ori r1,r1,0x1f8c the_thread->Wait.return_code = EINTR; the_thread->Wait.option = *set; 8003f90: 58 64 00 30 sw (r3+48),r4 the_thread->Wait.return_argument = the_info; 8003f94: 58 6b 00 28 sw (r3+40),r11 } the_info->si_signo = -1; _Thread_Disable_dispatch(); the_thread->Wait.queue = &_POSIX_signals_Wait_queue; 8003f98: 58 61 00 44 sw (r3+68),r1 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; 8003f9c: 34 03 00 01 mvi r3,1 8003fa0: 58 23 00 30 sw (r1+48),r3 the_thread->Wait.return_code = EINTR; the_thread->Wait.option = *set; the_thread->Wait.return_argument = the_info; _Thread_queue_Enter_critical_section( &_POSIX_signals_Wait_queue ); _ISR_Enable( level ); 8003fa4: d0 0f 00 00 wcsr IE,r15 _Thread_queue_Enqueue( &_POSIX_signals_Wait_queue, interval ); 8003fa8: 78 01 08 02 mvhi r1,0x802 8003fac: 78 03 08 00 mvhi r3,0x800 8003fb0: 38 21 1f 8c ori r1,r1,0x1f8c 8003fb4: 38 63 73 d8 ori r3,r3,0x73d8 8003fb8: f8 00 0b de calli 8006f30 <_Thread_queue_Enqueue_with_handler> _Thread_Enable_dispatch(); 8003fbc: f8 00 0a ad calli 8006a70 <_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 ); 8003fc0: 29 62 00 00 lw r2,(r11+0) 8003fc4: b9 c0 08 00 mv r1,r14 8003fc8: b9 60 18 00 mv r3,r11 8003fcc: 34 04 00 00 mvi r4,0 8003fd0: 34 05 00 00 mvi r5,0 8003fd4: f8 00 19 7e calli 800a5cc <_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) 8003fd8: 78 01 08 02 mvhi r1,0x802 8003fdc: 38 21 1d b4 ori r1,r1,0x1db4 8003fe0: 28 21 00 0c lw r1,(r1+12) 8003fe4: 28 22 00 34 lw r2,(r1+52) 8003fe8: 34 01 00 04 mvi r1,4 8003fec: 5c 41 00 08 bne r2,r1,800400c || !(*set & signo_to_mask( the_info->si_signo )) ) { 8003ff0: 29 6c 00 00 lw r12,(r11+0) 8003ff4: 34 01 00 01 mvi r1,1 8003ff8: 35 82 ff ff addi r2,r12,-1 8003ffc: f8 00 66 fd calli 801dbf0 <__ashlsi3> 8004000: 29 a2 00 00 lw r2,(r13+0) 8004004: a0 22 08 00 and r1,r1,r2 8004008: 5c 20 00 08 bne r1,r0,8004028 errno = _Thread_Executing->Wait.return_code; 800400c: f8 00 27 fe calli 800e004 <__errno> 8004010: 78 02 08 02 mvhi r2,0x802 8004014: 38 42 1d b4 ori r2,r2,0x1db4 8004018: 28 42 00 0c lw r2,(r2+12) 800401c: 28 42 00 34 lw r2,(r2+52) 8004020: 58 22 00 00 sw (r1+0),r2 return -1; 8004024: 34 0c ff ff mvi r12,-1 } return the_info->si_signo; } 8004028: b9 80 08 00 mv r1,r12 800402c: 2b 9d 00 04 lw ra,(sp+4) 8004030: 2b 8b 00 18 lw r11,(sp+24) 8004034: 2b 8c 00 14 lw r12,(sp+20) 8004038: 2b 8d 00 10 lw r13,(sp+16) 800403c: 2b 8e 00 0c lw r14,(sp+12) 8004040: 2b 8f 00 08 lw r15,(sp+8) 8004044: 37 9c 00 24 addi sp,sp,36 8004048: c3 a0 00 00 ret =============================================================================== 080062dc : int sigwait( const sigset_t *set, int *sig ) { 80062dc: 37 9c ff f8 addi sp,sp,-8 80062e0: 5b 8b 00 08 sw (sp+8),r11 80062e4: 5b 9d 00 04 sw (sp+4),ra int status; status = sigtimedwait( set, NULL, NULL ); 80062e8: 34 03 00 00 mvi r3,0 int sigwait( const sigset_t *set, int *sig ) { 80062ec: b8 40 58 00 mv r11,r2 int status; status = sigtimedwait( set, NULL, NULL ); 80062f0: 34 02 00 00 mvi r2,0 80062f4: fb ff ff 72 calli 80060bc 80062f8: b8 20 18 00 mv r3,r1 if ( status != -1 ) { 80062fc: 34 01 ff ff mvi r1,-1 8006300: 44 61 00 05 be r3,r1,8006314 if ( sig ) *sig = status; return 0; 8006304: 34 01 00 00 mvi r1,0 int status; status = sigtimedwait( set, NULL, NULL ); if ( status != -1 ) { if ( sig ) 8006308: 45 60 00 05 be r11,r0,800631c <== NEVER TAKEN *sig = status; 800630c: 59 63 00 00 sw (r11+0),r3 8006310: e0 00 00 03 bi 800631c return 0; } return errno; 8006314: f8 00 26 c6 calli 800fe2c <__errno> 8006318: 28 21 00 00 lw r1,(r1+0) } 800631c: 2b 9d 00 04 lw ra,(sp+4) 8006320: 2b 8b 00 08 lw r11,(sp+8) 8006324: 37 9c 00 08 addi sp,sp,8 8006328: c3 a0 00 00 ret =============================================================================== 08005aa4 : /* * Process input character, with semaphore. */ static int siproc (unsigned char c, struct rtems_termios_tty *tty) { 8005aa4: 37 9c ff f4 addi sp,sp,-12 8005aa8: 5b 8b 00 0c sw (sp+12),r11 8005aac: 5b 8c 00 08 sw (sp+8),r12 8005ab0: 5b 9d 00 04 sw (sp+4),ra 8005ab4: b8 20 60 00 mv r12,r1 int i; /* * Obtain output semaphore if character will be echoed */ if (tty->termios.c_lflag & (ECHO|ECHOE|ECHOK|ECHONL|ECHOPRT|ECHOCTL|ECHOKE)) { 8005ab8: 28 41 00 3c lw r1,(r2+60) /* * Process input character, with semaphore. */ static int siproc (unsigned char c, struct rtems_termios_tty *tty) { 8005abc: b8 40 58 00 mv r11,r2 int i; /* * Obtain output semaphore if character will be echoed */ if (tty->termios.c_lflag & (ECHO|ECHOE|ECHOK|ECHONL|ECHOPRT|ECHOCTL|ECHOKE)) { 8005ac0: 20 21 0e 78 andi r1,r1,0xe78 8005ac4: 44 20 00 0c be r1,r0,8005af4 <== NEVER TAKEN rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 8005ac8: 28 41 00 18 lw r1,(r2+24) 8005acc: 34 03 00 00 mvi r3,0 8005ad0: 34 02 00 00 mvi r2,0 8005ad4: f8 00 05 8e calli 800710c i = iproc (c, tty); 8005ad8: b9 80 08 00 mv r1,r12 8005adc: b9 60 10 00 mv r2,r11 8005ae0: fb ff ff 84 calli 80058f0 8005ae4: b8 20 60 00 mv r12,r1 rtems_semaphore_release (tty->osem); 8005ae8: 29 61 00 18 lw r1,(r11+24) 8005aec: f8 00 05 d8 calli 800724c 8005af0: e0 00 00 04 bi 8005b00 } else { i = iproc (c, tty); 8005af4: b9 80 08 00 mv r1,r12 8005af8: fb ff ff 7e calli 80058f0 <== NOT EXECUTED 8005afc: b8 20 60 00 mv r12,r1 <== NOT EXECUTED } return i; } 8005b00: b9 80 08 00 mv r1,r12 8005b04: 2b 9d 00 04 lw ra,(sp+4) 8005b08: 2b 8b 00 0c lw r11,(sp+12) 8005b0c: 2b 8c 00 08 lw r12,(sp+8) 8005b10: 37 9c 00 0c addi sp,sp,12 8005b14: c3 a0 00 00 ret =============================================================================== 080020c8 : int _STAT_NAME( const char *path, struct stat *buf ) { 80020c8: 37 9c ff dc addi sp,sp,-36 80020cc: 5b 8b 00 10 sw (sp+16),r11 80020d0: 5b 8c 00 0c sw (sp+12),r12 80020d4: 5b 8d 00 08 sw (sp+8),r13 80020d8: 5b 9d 00 04 sw (sp+4),ra 80020dc: b8 20 58 00 mv r11,r1 80020e0: b8 40 68 00 mv r13,r2 /* * Check to see if we were passed a valid pointer. */ if ( !buf ) 80020e4: 5c 40 00 06 bne r2,r0,80020fc <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EFAULT ); 80020e8: f8 00 20 ca calli 800a410 <__errno> 80020ec: 34 02 00 0e mvi r2,14 80020f0: 58 22 00 00 sw (r1+0),r2 80020f4: 34 0b ff ff mvi r11,-1 80020f8: e0 00 00 17 bi 8002154 status = rtems_filesystem_evaluate_path( path, strlen( path ), 80020fc: f8 00 24 df calli 800b478 8002100: 37 8c 00 14 addi r12,sp,20 8002104: b8 20 10 00 mv r2,r1 8002108: 34 03 00 00 mvi r3,0 800210c: b9 60 08 00 mv r1,r11 8002110: b9 80 20 00 mv r4,r12 8002114: 34 05 00 01 mvi r5,1 8002118: fb ff fc 63 calli 80012a4 0, &loc, _STAT_FOLLOW_LINKS ); if ( status != 0 ) return -1; 800211c: 34 0b ff ff mvi r11,-1 if ( !buf ) rtems_set_errno_and_return_minus_one( EFAULT ); status = rtems_filesystem_evaluate_path( path, strlen( path ), 0, &loc, _STAT_FOLLOW_LINKS ); if ( status != 0 ) 8002120: 5c 20 00 0d bne r1,r0,8002154 /* * Zero out the stat structure so the various support * versions of stat don't have to. */ memset( buf, 0, sizeof(struct stat) ); 8002124: 34 02 00 00 mvi r2,0 8002128: 34 03 00 48 mvi r3,72 800212c: b9 a0 08 00 mv r1,r13 8002130: f8 00 23 af calli 800afec status = (*loc.handlers->fstat_h)( &loc, buf ); 8002134: 2b 81 00 1c lw r1,(sp+28) 8002138: b9 a0 10 00 mv r2,r13 800213c: 28 23 00 18 lw r3,(r1+24) 8002140: b9 80 08 00 mv r1,r12 8002144: d8 60 00 00 call r3 8002148: b8 20 58 00 mv r11,r1 rtems_filesystem_freenode( &loc ); 800214c: b9 80 08 00 mv r1,r12 8002150: fb ff fc 9d calli 80013c4 return status; } 8002154: b9 60 08 00 mv r1,r11 8002158: 2b 9d 00 04 lw ra,(sp+4) 800215c: 2b 8b 00 10 lw r11,(sp+16) 8002160: 2b 8c 00 0c lw r12,(sp+12) 8002164: 2b 8d 00 08 lw r13,(sp+8) 8002168: 37 9c 00 24 addi sp,sp,36 800216c: c3 a0 00 00 ret =============================================================================== 080050a8 : #include int statvfs (const char *path, struct statvfs *sb) { 80050a8: 37 9c ff dc addi sp,sp,-36 80050ac: 5b 8b 00 10 sw (sp+16),r11 80050b0: 5b 8c 00 0c sw (sp+12),r12 80050b4: 5b 8d 00 08 sw (sp+8),r13 80050b8: 5b 9d 00 04 sw (sp+4),ra 80050bc: b8 20 58 00 mv r11,r1 80050c0: b8 40 68 00 mv r13,r2 * 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 ) ) 80050c4: 37 8c 00 14 addi r12,sp,20 80050c8: f8 00 32 7d calli 8011abc 80050cc: b8 20 10 00 mv r2,r1 80050d0: 34 03 00 00 mvi r3,0 80050d4: b9 60 08 00 mv r1,r11 80050d8: b9 80 20 00 mv r4,r12 80050dc: 34 05 00 01 mvi r5,1 80050e0: fb ff fa 2c calli 8003990 return -1; 80050e4: 34 0b ff ff mvi r11,-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 ) ) 80050e8: 5c 20 00 0e bne r1,r0,8005120 <== NEVER TAKEN return -1; mt_entry = loc.mt_entry; 80050ec: 2b 8b 00 24 lw r11,(sp+36) fs_mount_root = &mt_entry->mt_fs_root; memset (sb, 0, sizeof (struct statvfs)); 80050f0: 34 02 00 00 mvi r2,0 80050f4: 34 03 00 38 mvi r3,56 80050f8: b9 a0 08 00 mv r1,r13 80050fc: f8 00 2d ce calli 8010834 result = ( fs_mount_root->ops->statvfs_h )( fs_mount_root, sb ); 8005100: 29 61 00 28 lw r1,(r11+40) 8005104: b9 a0 10 00 mv r2,r13 8005108: 28 23 00 44 lw r3,(r1+68) 800510c: 35 61 00 1c addi r1,r11,28 8005110: d8 60 00 00 call r3 8005114: b8 20 58 00 mv r11,r1 rtems_filesystem_freenode( &loc ); 8005118: b9 80 08 00 mv r1,r12 800511c: fb ff fa 65 calli 8003ab0 return result; } 8005120: b9 60 08 00 mv r1,r11 8005124: 2b 9d 00 04 lw ra,(sp+4) 8005128: 2b 8b 00 10 lw r11,(sp+16) 800512c: 2b 8c 00 0c lw r12,(sp+12) 8005130: 2b 8d 00 08 lw r13,(sp+8) 8005134: 37 9c 00 24 addi sp,sp,36 8005138: c3 a0 00 00 ret =============================================================================== 080039b0 : fdatasync(fn); } /* iterate over all FILE *'s for this thread */ static void sync_per_thread(Thread_Control *t) { 80039b0: 37 9c ff f4 addi sp,sp,-12 80039b4: 5b 8b 00 0c sw (sp+12),r11 80039b8: 5b 8c 00 08 sw (sp+8),r12 80039bc: 5b 9d 00 04 sw (sp+4),ra /* * The sync_wrapper() function will operate on the current thread's * reent structure so we will temporarily use that. */ this_reent = t->libc_reent; 80039c0: 28 22 01 18 lw r2,(r1+280) if ( this_reent ) { 80039c4: 44 40 00 0c be r2,r0,80039f4 <== NEVER TAKEN current_reent = _Thread_Executing->libc_reent; 80039c8: 78 0b 08 01 mvhi r11,0x801 80039cc: 39 6b 6d 74 ori r11,r11,0x6d74 80039d0: 29 63 00 0c lw r3,(r11+12) 80039d4: 28 6c 01 18 lw r12,(r3+280) _Thread_Executing->libc_reent = this_reent; 80039d8: 58 62 01 18 sw (r3+280),r2 _fwalk (t->libc_reent, sync_wrapper); 80039dc: 28 21 01 18 lw r1,(r1+280) 80039e0: 78 02 08 00 mvhi r2,0x800 80039e4: 38 42 3a 08 ori r2,r2,0x3a08 80039e8: f8 00 2b c9 calli 800e90c <_fwalk> _Thread_Executing->libc_reent = current_reent; 80039ec: 29 61 00 0c lw r1,(r11+12) 80039f0: 58 2c 01 18 sw (r1+280),r12 } } 80039f4: 2b 9d 00 04 lw ra,(sp+4) 80039f8: 2b 8b 00 0c lw r11,(sp+12) 80039fc: 2b 8c 00 08 lw r12,(sp+8) 8003a00: 37 9c 00 0c addi sp,sp,12 8003a04: c3 a0 00 00 ret =============================================================================== 0800226c : int tcflow ( int fd __attribute__((unused)), int action ) { 800226c: 37 9c ff fc addi sp,sp,-4 <== NOT EXECUTED 8002270: 5b 9d 00 04 sw (sp+4),ra <== NOT EXECUTED case TCOOFF: case TCOON: case TCIOFF: case TCION: default: rtems_set_errno_and_return_minus_one( EINVAL ); 8002274: f8 00 1f fe calli 800a26c <__errno> <== NOT EXECUTED 8002278: 34 02 00 16 mvi r2,22 <== NOT EXECUTED 800227c: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED /* fd is not validated */ /* When this is supported, implement it here */ rtems_set_errno_and_return_minus_one( ENOTSUP ); } 8002280: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED 8002284: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 8002288: 37 9c 00 04 addi sp,sp,4 <== NOT EXECUTED 800228c: c3 a0 00 00 ret <== NOT EXECUTED =============================================================================== 08002290 : int tcflush ( int fd __attribute__((unused)), int queue ) { 8002290: 37 9c ff fc addi sp,sp,-4 <== NOT EXECUTED 8002294: 5b 9d 00 04 sw (sp+4),ra <== NOT EXECUTED switch (queue) { case TCIFLUSH: case TCOFLUSH: case TCIOFLUSH: default: rtems_set_errno_and_return_minus_one( EINVAL ); 8002298: f8 00 1f f5 calli 800a26c <__errno> <== NOT EXECUTED 800229c: 34 02 00 16 mvi r2,22 <== NOT EXECUTED 80022a0: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED /* fd is not validated */ /* When this is supported, implement it here */ rtems_set_errno_and_return_minus_one( ENOTSUP ); return 0; } 80022a4: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED 80022a8: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 80022ac: 37 9c 00 04 addi sp,sp,4 <== NOT EXECUTED 80022b0: c3 a0 00 00 ret <== NOT EXECUTED =============================================================================== 080022b4 : #include #include pid_t tcgetpgrp(int fd __attribute__((unused))) { 80022b4: 37 9c ff fc addi sp,sp,-4 <== NOT EXECUTED 80022b8: 5b 9d 00 04 sw (sp+4),ra <== NOT EXECUTED return getpid(); 80022bc: fb ff fc 7e calli 80014b4 <== NOT EXECUTED } 80022c0: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 80022c4: 37 9c 00 04 addi sp,sp,4 <== NOT EXECUTED 80022c8: c3 a0 00 00 ret <== NOT EXECUTED =============================================================================== 080022cc : int tcsendbreak ( int fd __attribute__((unused)), int duration __attribute__((unused)) ) { return 0; } 80022cc: 34 01 00 00 mvi r1,0 <== NOT EXECUTED 80022d0: c3 a0 00 00 ret <== NOT EXECUTED =============================================================================== 08004648 : int tcsetattr( int fd, int opt, struct termios *tp ) { 8004648: 37 9c ff f4 addi sp,sp,-12 800464c: 5b 8b 00 0c sw (sp+12),r11 8004650: 5b 8c 00 08 sw (sp+8),r12 8004654: 5b 9d 00 04 sw (sp+4),ra 8004658: b8 20 60 00 mv r12,r1 800465c: b8 60 58 00 mv r11,r3 switch (opt) { 8004660: 44 40 00 0d be r2,r0,8004694 8004664: 34 03 00 01 mvi r3,1 8004668: 44 43 00 06 be r2,r3,8004680 default: rtems_set_errno_and_return_minus_one( ENOTSUP ); 800466c: f8 00 31 b0 calli 8010d2c <__errno> 8004670: 34 02 00 86 mvi r2,134 8004674: 58 22 00 00 sw (r1+0),r2 8004678: 34 02 ff ff mvi r2,-1 800467c: e0 00 00 0b bi 80046a8 case TCSADRAIN: if (ioctl( fd, RTEMS_IO_TCDRAIN, NULL ) < 0) 8004680: 34 02 00 03 mvi r2,3 8004684: 34 03 00 00 mvi r3,0 8004688: f8 00 21 e8 calli 800ce28 return -1; 800468c: 34 02 ff ff mvi r2,-1 switch (opt) { default: rtems_set_errno_and_return_minus_one( ENOTSUP ); case TCSADRAIN: if (ioctl( fd, RTEMS_IO_TCDRAIN, NULL ) < 0) 8004690: 48 01 00 06 bg r0,r1,80046a8 <== NEVER TAKEN return -1; /* * Fall through to.... */ case TCSANOW: return ioctl( fd, RTEMS_IO_SET_ATTRIBUTES, tp ); 8004694: 34 02 00 02 mvi r2,2 8004698: b9 80 08 00 mv r1,r12 800469c: b9 60 18 00 mv r3,r11 80046a0: f8 00 21 e2 calli 800ce28 80046a4: b8 20 10 00 mv r2,r1 } } 80046a8: b8 40 08 00 mv r1,r2 80046ac: 2b 9d 00 04 lw ra,(sp+4) 80046b0: 2b 8b 00 0c lw r11,(sp+12) 80046b4: 2b 8c 00 08 lw r12,(sp+8) 80046b8: 37 9c 00 0c addi sp,sp,12 80046bc: c3 a0 00 00 ret =============================================================================== 080022d4 : int tcsetpgrp( int fd __attribute__((unused)), pid_t pid __attribute__((unused)) ) { return 0; } 80022d4: 34 01 00 00 mvi r1,0 <== NOT EXECUTED 80022d8: c3 a0 00 00 ret <== NOT EXECUTED =============================================================================== 08002e34 : int timer_create( clockid_t clock_id, struct sigevent *evp, timer_t *timerid ) { 8002e34: 37 9c ff ec addi sp,sp,-20 8002e38: 5b 8b 00 14 sw (sp+20),r11 8002e3c: 5b 8c 00 10 sw (sp+16),r12 8002e40: 5b 8d 00 0c sw (sp+12),r13 8002e44: 5b 8e 00 08 sw (sp+8),r14 8002e48: 5b 9d 00 04 sw (sp+4),ra 8002e4c: b8 40 60 00 mv r12,r2 POSIX_Timer_Control *ptimer; if ( clock_id != CLOCK_REALTIME ) 8002e50: 34 02 00 01 mvi r2,1 int timer_create( clockid_t clock_id, struct sigevent *evp, timer_t *timerid ) { 8002e54: b8 60 68 00 mv r13,r3 POSIX_Timer_Control *ptimer; if ( clock_id != CLOCK_REALTIME ) 8002e58: 5c 22 00 0c bne r1,r2,8002e88 rtems_set_errno_and_return_minus_one( EINVAL ); if ( !timerid ) 8002e5c: 44 60 00 0b be r3,r0,8002e88 /* * The data of the structure evp are checked in order to verify if they * are coherent. */ if (evp != NULL) { 8002e60: 45 80 00 0d be r12,r0,8002e94 /* The structure has data */ if ( ( evp->sigev_notify != SIGEV_NONE ) && 8002e64: 29 82 00 00 lw r2,(r12+0) 8002e68: 34 42 ff ff addi r2,r2,-1 8002e6c: 50 22 00 02 bgeu r1,r2,8002e74 <== ALWAYS TAKEN 8002e70: e0 00 00 06 bi 8002e88 <== NOT EXECUTED ( 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 ) 8002e74: 29 81 00 04 lw r1,(r12+4) 8002e78: 44 20 00 04 be r1,r0,8002e88 <== NEVER TAKEN static inline bool is_valid_signo( int signo ) { return ((signo) >= 1 && (signo) <= 32 ); 8002e7c: 34 21 ff ff addi r1,r1,-1 rtems_set_errno_and_return_minus_one( EINVAL ); if ( !is_valid_signo(evp->sigev_signo) ) 8002e80: 34 02 00 1f mvi r2,31 8002e84: 50 41 00 04 bgeu r2,r1,8002e94 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); 8002e88: f8 00 29 d6 calli 800d5e0 <__errno> 8002e8c: 34 02 00 16 mvi r2,22 8002e90: e0 00 00 0e bi 8002ec8 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 8002e94: 78 01 08 01 mvhi r1,0x801 8002e98: 38 21 f8 f8 ori r1,r1,0xf8f8 8002e9c: 28 22 00 00 lw r2,(r1+0) 8002ea0: 34 42 00 01 addi r2,r2,1 8002ea4: 58 22 00 00 sw (r1+0),r2 * 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 ); 8002ea8: 78 01 08 01 mvhi r1,0x801 8002eac: 38 21 fb 8c ori r1,r1,0xfb8c 8002eb0: f8 00 07 11 calli 8004af4 <_Objects_Allocate> 8002eb4: b8 20 58 00 mv r11,r1 /* * Allocate a timer */ ptimer = _POSIX_Timer_Allocate(); if ( !ptimer ) { 8002eb8: 5c 20 00 07 bne r1,r0,8002ed4 _Thread_Enable_dispatch(); 8002ebc: f8 00 0b 6d calli 8005c70 <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one( EAGAIN ); 8002ec0: f8 00 29 c8 calli 800d5e0 <__errno> 8002ec4: 34 02 00 0b mvi r2,11 8002ec8: 58 22 00 00 sw (r1+0),r2 8002ecc: 34 01 ff ff mvi r1,-1 8002ed0: e0 00 00 25 bi 8002f64 } /* The data of the created timer are stored to use them later */ ptimer->state = POSIX_TIMER_STATE_CREATE_NEW; 8002ed4: 34 01 00 02 mvi r1,2 8002ed8: 31 61 00 3c sb (r11+60),r1 ptimer->thread_id = _Thread_Executing->Object.id; 8002edc: 78 01 08 01 mvhi r1,0x801 8002ee0: 38 21 fd c4 ori r1,r1,0xfdc4 8002ee4: 28 21 00 0c lw r1,(r1+12) 8002ee8: 28 21 00 08 lw r1,(r1+8) 8002eec: 59 61 00 38 sw (r11+56),r1 if ( evp != NULL ) { 8002ef0: 45 80 00 07 be r12,r0,8002f0c ptimer->inf.sigev_notify = evp->sigev_notify; 8002ef4: 29 81 00 00 lw r1,(r12+0) 8002ef8: 59 61 00 40 sw (r11+64),r1 ptimer->inf.sigev_signo = evp->sigev_signo; 8002efc: 29 81 00 04 lw r1,(r12+4) 8002f00: 59 61 00 44 sw (r11+68),r1 ptimer->inf.sigev_value = evp->sigev_value; 8002f04: 29 81 00 08 lw r1,(r12+8) 8002f08: 59 61 00 48 sw (r11+72),r1 uint32_t name ) { _Objects_Set_local_object( information, _Objects_Get_index( the_object->id ), 8002f0c: 29 6c 00 08 lw r12,(r11+8) _Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0); *timerid = ptimer->Object.id; _Thread_Enable_dispatch(); return 0; } 8002f10: 78 01 08 01 mvhi r1,0x801 8002f14: 38 21 fb 8c ori r1,r1,0xfb8c #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 8002f18: 28 2e 00 1c lw r14,(r1+28) 8002f1c: 34 02 00 02 mvi r2,2 ptimer->inf.sigev_notify = evp->sigev_notify; ptimer->inf.sigev_signo = evp->sigev_signo; ptimer->inf.sigev_value = evp->sigev_value; } ptimer->overrun = 0; 8002f20: 59 60 00 68 sw (r11+104),r0 ptimer->timer_data.it_value.tv_sec = 0; 8002f24: 59 60 00 5c sw (r11+92),r0 ptimer->timer_data.it_value.tv_nsec = 0; 8002f28: 59 60 00 60 sw (r11+96),r0 ptimer->timer_data.it_interval.tv_sec = 0; 8002f2c: 59 60 00 54 sw (r11+84),r0 ptimer->timer_data.it_interval.tv_nsec = 0; 8002f30: 59 60 00 58 sw (r11+88),r0 Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 8002f34: 59 60 00 18 sw (r11+24),r0 the_watchdog->routine = routine; 8002f38: 59 60 00 2c sw (r11+44),r0 the_watchdog->id = id; 8002f3c: 59 60 00 30 sw (r11+48),r0 the_watchdog->user_data = user_data; 8002f40: 59 60 00 34 sw (r11+52),r0 8002f44: 21 81 ff ff andi r1,r12,0xffff 8002f48: f8 00 62 e7 calli 801bae4 <__ashlsi3> 8002f4c: b5 c1 08 00 add r1,r14,r1 8002f50: 58 2b 00 00 sw (r1+0),r11 _Objects_Get_index( the_object->id ), the_object ); /* ASSERT: information->is_string == false */ the_object->name.name_u32 = name; 8002f54: 59 60 00 0c sw (r11+12),r0 _Watchdog_Initialize( &ptimer->Timer, NULL, 0, NULL ); _Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0); *timerid = ptimer->Object.id; 8002f58: 59 ac 00 00 sw (r13+0),r12 _Thread_Enable_dispatch(); 8002f5c: f8 00 0b 45 calli 8005c70 <_Thread_Enable_dispatch> return 0; 8002f60: 34 01 00 00 mvi r1,0 } 8002f64: 2b 9d 00 04 lw ra,(sp+4) 8002f68: 2b 8b 00 14 lw r11,(sp+20) 8002f6c: 2b 8c 00 10 lw r12,(sp+16) 8002f70: 2b 8d 00 0c lw r13,(sp+12) 8002f74: 2b 8e 00 08 lw r14,(sp+8) 8002f78: 37 9c 00 14 addi sp,sp,20 8002f7c: c3 a0 00 00 ret =============================================================================== 08002f80 : timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue ) { 8002f80: 37 9c ff cc addi sp,sp,-52 8002f84: 5b 8b 00 18 sw (sp+24),r11 8002f88: 5b 8c 00 14 sw (sp+20),r12 8002f8c: 5b 8d 00 10 sw (sp+16),r13 8002f90: 5b 8e 00 0c sw (sp+12),r14 8002f94: 5b 8f 00 08 sw (sp+8),r15 8002f98: 5b 9d 00 04 sw (sp+4),ra 8002f9c: b8 20 78 00 mv r15,r1 8002fa0: b8 40 58 00 mv r11,r2 8002fa4: b8 60 60 00 mv r12,r3 8002fa8: b8 80 68 00 mv r13,r4 Objects_Locations location; bool activated; uint32_t initial_period; struct itimerspec normalize; if ( !value ) 8002fac: 44 60 00 69 be r3,r0,8003150 <== 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) ) ) { 8002fb0: 34 61 00 08 addi r1,r3,8 8002fb4: f8 00 0e b2 calli 8006a7c <_Timespec_Is_valid> 8002fb8: 44 20 00 66 be r1,r0,8003150 rtems_set_errno_and_return_minus_one( EINVAL ); } if ( !_Timespec_Is_valid( &(value->it_interval) ) ) { 8002fbc: b9 80 08 00 mv r1,r12 8002fc0: f8 00 0e af calli 8006a7c <_Timespec_Is_valid> 8002fc4: 44 20 00 63 be r1,r0,8003150 <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); } if ( flags != TIMER_ABSTIME && flags != POSIX_TIMER_RELATIVE ) { 8002fc8: 7d 62 00 00 cmpnei r2,r11,0 8002fcc: 7d 61 00 04 cmpnei r1,r11,4 8002fd0: a0 41 08 00 and r1,r2,r1 8002fd4: 5c 20 00 5f bne r1,r0,8003150 rtems_set_errno_and_return_minus_one( EINVAL ); } normalize = *value; 8002fd8: 29 81 00 0c lw r1,(r12+12) 8002fdc: 29 84 00 00 lw r4,(r12+0) 8002fe0: 29 83 00 04 lw r3,(r12+4) 8002fe4: 29 82 00 08 lw r2,(r12+8) 8002fe8: 5b 81 00 28 sw (sp+40),r1 8002fec: 5b 84 00 1c sw (sp+28),r4 8002ff0: 5b 83 00 20 sw (sp+32),r3 8002ff4: 5b 82 00 24 sw (sp+36),r2 /* Convert absolute to relative time */ if (flags == TIMER_ABSTIME) { 8002ff8: 34 01 00 04 mvi r1,4 8002ffc: 5d 61 00 0d bne r11,r1,8003030 struct timespec now; _TOD_Get( &now ); 8003000: 37 8b 00 2c addi r11,sp,44 8003004: b9 60 08 00 mv r1,r11 8003008: f8 00 04 f4 calli 80043d8 <_TOD_Get> /* Check for seconds in the past */ if ( _Timespec_Greater_than( &now, &normalize.it_value ) ) 800300c: 37 8e 00 24 addi r14,sp,36 8003010: b9 60 08 00 mv r1,r11 8003014: b9 c0 10 00 mv r2,r14 8003018: f8 00 0e 8e calli 8006a50 <_Timespec_Greater_than> 800301c: 5c 20 00 4d bne r1,r0,8003150 rtems_set_errno_and_return_minus_one( EINVAL ); _Timespec_Subtract( &now, &normalize.it_value, &normalize.it_value ); 8003020: b9 60 08 00 mv r1,r11 8003024: b9 c0 10 00 mv r2,r14 8003028: b9 c0 18 00 mv r3,r14 800302c: f8 00 0e a0 calli 8006aac <_Timespec_Subtract> timer_t id, Objects_Locations *location ) { return (POSIX_Timer_Control *) _Objects_Get( &_POSIX_Timer_Information, (Objects_Id) id, location ); 8003030: 78 03 08 01 mvhi r3,0x801 8003034: b8 60 08 00 mv r1,r3 8003038: b9 e0 10 00 mv r2,r15 800303c: 38 21 fb 8c ori r1,r1,0xfb8c 8003040: 37 83 00 34 addi r3,sp,52 8003044: f8 00 07 fb calli 8005030 <_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 ) { 8003048: 2b 82 00 34 lw r2,(sp+52) 800304c: b8 20 58 00 mv r11,r1 8003050: 5c 40 00 40 bne r2,r0,8003150 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 ) { 8003054: 2b 81 00 24 lw r1,(sp+36) 8003058: 5c 22 00 19 bne r1,r2,80030bc 800305c: 2b 8e 00 28 lw r14,(sp+40) 8003060: 5d c1 00 17 bne r14,r1,80030bc /* Stop the timer */ (void) _Watchdog_Remove( &ptimer->Timer ); 8003064: 35 61 00 10 addi r1,r11,16 8003068: f8 00 10 08 calli 8007088 <_Watchdog_Remove> /* The old data of the timer are returned */ if ( ovalue ) 800306c: 45 ae 00 09 be r13,r14,8003090 *ovalue = ptimer->timer_data; 8003070: 29 64 00 54 lw r4,(r11+84) 8003074: 29 63 00 58 lw r3,(r11+88) 8003078: 29 62 00 5c lw r2,(r11+92) 800307c: 29 61 00 60 lw r1,(r11+96) 8003080: 59 a4 00 00 sw (r13+0),r4 8003084: 59 a3 00 04 sw (r13+4),r3 8003088: 59 a2 00 08 sw (r13+8),r2 800308c: 59 a1 00 0c sw (r13+12),r1 /* The new data are set */ ptimer->timer_data = normalize; 8003090: 2b 81 00 1c lw r1,(sp+28) 8003094: 59 61 00 54 sw (r11+84),r1 8003098: 2b 81 00 20 lw r1,(sp+32) 800309c: 59 61 00 58 sw (r11+88),r1 80030a0: 2b 81 00 24 lw r1,(sp+36) 80030a4: 59 61 00 5c sw (r11+92),r1 80030a8: 2b 81 00 28 lw r1,(sp+40) 80030ac: 59 61 00 60 sw (r11+96),r1 /* Indicates that the timer is created and stopped */ ptimer->state = POSIX_TIMER_STATE_CREATE_STOP; 80030b0: 34 01 00 04 mvi r1,4 80030b4: 31 61 00 3c sb (r11+60),r1 80030b8: e0 00 00 23 bi 8003144 _Thread_Enable_dispatch(); return 0; } /* Convert from seconds and nanoseconds to ticks */ ptimer->ticks = _Timespec_To_ticks( &value->it_interval ); 80030bc: b9 80 08 00 mv r1,r12 80030c0: f8 00 0e 8d calli 8006af4 <_Timespec_To_ticks> 80030c4: 59 61 00 64 sw (r11+100),r1 initial_period = _Timespec_To_ticks( &normalize.it_value ); 80030c8: 37 81 00 24 addi r1,sp,36 80030cc: f8 00 0e 8a calli 8006af4 <_Timespec_To_ticks> activated = _POSIX_Timer_Insert_helper( 80030d0: 29 63 00 08 lw r3,(r11+8) 80030d4: 78 04 08 00 mvhi r4,0x800 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 ); 80030d8: b8 20 10 00 mv r2,r1 activated = _POSIX_Timer_Insert_helper( 80030dc: 38 84 31 80 ori r4,r4,0x3180 80030e0: 35 61 00 10 addi r1,r11,16 80030e4: b9 60 28 00 mv r5,r11 80030e8: f8 00 1a a6 calli 8009b80 <_POSIX_Timer_Insert_helper> initial_period, ptimer->Object.id, _POSIX_Timer_TSR, ptimer ); if ( !activated ) { 80030ec: 44 20 00 16 be r1,r0,8003144 /* * The timer has been started and is running. So we return the * old ones in "ovalue" */ if ( ovalue ) 80030f0: 45 a0 00 09 be r13,r0,8003114 *ovalue = ptimer->timer_data; 80030f4: 29 64 00 54 lw r4,(r11+84) 80030f8: 29 63 00 58 lw r3,(r11+88) 80030fc: 29 62 00 5c lw r2,(r11+92) 8003100: 29 61 00 60 lw r1,(r11+96) 8003104: 59 a4 00 00 sw (r13+0),r4 8003108: 59 a3 00 04 sw (r13+4),r3 800310c: 59 a2 00 08 sw (r13+8),r2 8003110: 59 a1 00 0c sw (r13+12),r1 ptimer->timer_data = normalize; 8003114: 2b 81 00 1c lw r1,(sp+28) 8003118: 59 61 00 54 sw (r11+84),r1 800311c: 2b 81 00 20 lw r1,(sp+32) 8003120: 59 61 00 58 sw (r11+88),r1 8003124: 2b 81 00 24 lw r1,(sp+36) 8003128: 59 61 00 5c sw (r11+92),r1 800312c: 2b 81 00 28 lw r1,(sp+40) 8003130: 59 61 00 60 sw (r11+96),r1 /* Indicate that the time is running */ ptimer->state = POSIX_TIMER_STATE_CREATE_RUN; 8003134: 34 01 00 03 mvi r1,3 8003138: 31 61 00 3c sb (r11+60),r1 _TOD_Get( &ptimer->time ); 800313c: 35 61 00 6c addi r1,r11,108 8003140: f8 00 04 a6 calli 80043d8 <_TOD_Get> _Thread_Enable_dispatch(); 8003144: f8 00 0a cb calli 8005c70 <_Thread_Enable_dispatch> return 0; 8003148: 34 01 00 00 mvi r1,0 800314c: e0 00 00 05 bi 8003160 #endif case OBJECTS_ERROR: break; } rtems_set_errno_and_return_minus_one( EINVAL ); 8003150: f8 00 29 24 calli 800d5e0 <__errno> 8003154: 34 02 00 16 mvi r2,22 8003158: 58 22 00 00 sw (r1+0),r2 800315c: 34 01 ff ff mvi r1,-1 } 8003160: 2b 9d 00 04 lw ra,(sp+4) 8003164: 2b 8b 00 18 lw r11,(sp+24) 8003168: 2b 8c 00 14 lw r12,(sp+20) 800316c: 2b 8d 00 10 lw r13,(sp+16) 8003170: 2b 8e 00 0c lw r14,(sp+12) 8003174: 2b 8f 00 08 lw r15,(sp+8) 8003178: 37 9c 00 34 addi sp,sp,52 800317c: c3 a0 00 00 ret =============================================================================== 08002d48 : useconds_t ualarm( useconds_t useconds, useconds_t interval ) { 8002d48: 37 9c ff e8 addi sp,sp,-24 8002d4c: 5b 8b 00 10 sw (sp+16),r11 8002d50: 5b 8c 00 0c sw (sp+12),r12 8002d54: 5b 8d 00 08 sw (sp+8),r13 8002d58: 5b 9d 00 04 sw (sp+4),ra /* * Initialize the timer used to implement alarm(). */ if ( !the_timer->routine ) { 8002d5c: 78 0b 08 01 mvhi r11,0x801 8002d60: 39 6b 71 88 ori r11,r11,0x7188 useconds_t ualarm( useconds_t useconds, useconds_t interval ) { 8002d64: b8 20 68 00 mv r13,r1 /* * Initialize the timer used to implement alarm(). */ if ( !the_timer->routine ) { 8002d68: 29 61 00 1c lw r1,(r11+28) 8002d6c: 5c 20 00 09 bne r1,r0,8002d90 Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; 8002d70: 78 01 08 00 mvhi r1,0x800 8002d74: 38 21 2d 00 ori r1,r1,0x2d00 Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 8002d78: 59 60 00 08 sw (r11+8),r0 the_watchdog->routine = routine; 8002d7c: 59 61 00 1c sw (r11+28),r1 the_watchdog->id = id; 8002d80: 59 60 00 20 sw (r11+32),r0 the_watchdog->user_data = user_data; 8002d84: 59 60 00 24 sw (r11+36),r0 useconds_t ualarm( useconds_t useconds, useconds_t interval ) { useconds_t remaining = 0; 8002d88: 34 0c 00 00 mvi r12,0 8002d8c: e0 00 00 18 bi 8002dec if ( !the_timer->routine ) { _Watchdog_Initialize( the_timer, _POSIX_signals_Ualarm_TSR, 0, NULL ); } else { Watchdog_States state; state = _Watchdog_Remove( the_timer ); 8002d90: b9 60 08 00 mv r1,r11 8002d94: f8 00 0f 27 calli 8006a30 <_Watchdog_Remove> if ( (state == WATCHDOG_ACTIVE) || (state == WATCHDOG_REMOVE_IT) ) { 8002d98: 34 21 ff fe addi r1,r1,-2 8002d9c: 34 02 00 01 mvi r2,1 useconds_t ualarm( useconds_t useconds, useconds_t interval ) { useconds_t remaining = 0; 8002da0: 34 0c 00 00 mvi r12,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) ) { 8002da4: 54 22 00 12 bgu r1,r2,8002dec <== 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); 8002da8: 29 61 00 0c lw r1,(r11+12) 8002dac: 29 62 00 14 lw r2,(r11+20) 8002db0: b4 41 10 00 add r2,r2,r1 8002db4: 29 61 00 18 lw r1,(r11+24) /* remaining is now in ticks */ _Timespec_From_ticks( ticks, &tp ); 8002db8: c8 41 08 00 sub r1,r2,r1 8002dbc: 37 82 00 14 addi r2,sp,20 8002dc0: f8 00 0d 52 calli 8006308 <_Timespec_From_ticks> remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND; 8002dc4: 78 03 08 01 mvhi r3,0x801 8002dc8: 38 63 4e 78 ori r3,r3,0x4e78 8002dcc: 28 62 00 00 lw r2,(r3+0) 8002dd0: 2b 81 00 14 lw r1,(sp+20) 8002dd4: f8 00 43 71 calli 8013b98 <__mulsi3> 8002dd8: b8 20 60 00 mv r12,r1 remaining += tp.tv_nsec / 1000; 8002ddc: 2b 81 00 18 lw r1,(sp+24) 8002de0: 34 02 03 e8 mvi r2,1000 8002de4: f8 00 43 79 calli 8013bc8 <__divsi3> 8002de8: b4 2c 60 00 add r12,r1,r12 /* * 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 ) { 8002dec: 45 a0 00 1a be r13,r0,8002e54 Watchdog_Interval ticks; tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND; 8002df0: 78 03 08 01 mvhi r3,0x801 8002df4: 38 63 4e 78 ori r3,r3,0x4e78 8002df8: 28 62 00 00 lw r2,(r3+0) 8002dfc: b9 a0 08 00 mv r1,r13 tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000; ticks = _Timespec_To_ticks( &tp ); 8002e00: 37 8b 00 14 addi r11,sp,20 * 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; 8002e04: f8 00 43 ca calli 8013d2c <__udivsi3> tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000; 8002e08: 78 03 08 01 mvhi r3,0x801 8002e0c: 38 63 4e 78 ori r3,r3,0x4e78 8002e10: 28 62 00 00 lw r2,(r3+0) * 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; 8002e14: 5b 81 00 14 sw (sp+20),r1 tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000; 8002e18: b9 a0 08 00 mv r1,r13 8002e1c: f8 00 43 d4 calli 8013d6c <__umodsi3> 8002e20: 34 02 03 e8 mvi r2,1000 8002e24: f8 00 43 5d calli 8013b98 <__mulsi3> 8002e28: 5b 81 00 18 sw (sp+24),r1 ticks = _Timespec_To_ticks( &tp ); 8002e2c: b9 60 08 00 mv r1,r11 8002e30: f8 00 0d 64 calli 80063c0 <_Timespec_To_ticks> if ( ticks == 0 ) ticks = 1; _Watchdog_Insert_ticks( the_timer, _Timespec_To_ticks( &tp ) ); 8002e34: b9 60 08 00 mv r1,r11 8002e38: f8 00 0d 62 calli 80063c0 <_Timespec_To_ticks> Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 8002e3c: 78 02 08 01 mvhi r2,0x801 8002e40: 38 42 71 88 ori r2,r2,0x7188 8002e44: 58 41 00 0c sw (r2+12),r1 _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 8002e48: 78 01 08 01 mvhi r1,0x801 8002e4c: 38 21 69 d8 ori r1,r1,0x69d8 8002e50: f8 00 0e 99 calli 80068b4 <_Watchdog_Insert> } return remaining; } 8002e54: b9 80 08 00 mv r1,r12 8002e58: 2b 9d 00 04 lw ra,(sp+4) 8002e5c: 2b 8b 00 10 lw r11,(sp+16) 8002e60: 2b 8c 00 0c lw r12,(sp+12) 8002e64: 2b 8d 00 08 lw r13,(sp+8) 8002e68: 37 9c 00 18 addi sp,sp,24 8002e6c: c3 a0 00 00 ret =============================================================================== 08003898 : #include int unlink( const char *path ) { 8003898: 37 9c ff c0 addi sp,sp,-64 800389c: 5b 8b 00 14 sw (sp+20),r11 80038a0: 5b 8c 00 10 sw (sp+16),r12 80038a4: 5b 8d 00 0c sw (sp+12),r13 80038a8: 5b 8e 00 08 sw (sp+8),r14 80038ac: 5b 9d 00 04 sw (sp+4),ra 80038b0: b8 20 70 00 mv r14,r1 /* * Get the node to be unlinked. Find the parent path first. */ parentpathlen = rtems_filesystem_dirname ( path ); 80038b4: fb ff fb 4f calli 80025f0 80038b8: b8 20 58 00 mv r11,r1 80038bc: 37 84 00 2c addi r4,sp,44 if ( parentpathlen == 0 ) 80038c0: 5c 20 00 07 bne r1,r0,80038dc rtems_filesystem_get_start_loc( path, &i, &parentloc ); 80038c4: b9 c0 08 00 mv r1,r14 80038c8: 37 82 00 40 addi r2,sp,64 80038cc: b8 80 18 00 mv r3,r4 80038d0: fb ff ff c0 calli 80037d0 const char *name; rtems_filesystem_location_info_t parentloc; rtems_filesystem_location_info_t loc; int i; int result; bool free_parentloc = false; 80038d4: 34 0d 00 00 mvi r13,0 80038d8: e0 00 00 09 bi 80038fc parentpathlen = rtems_filesystem_dirname ( path ); if ( parentpathlen == 0 ) rtems_filesystem_get_start_loc( path, &i, &parentloc ); else { result = rtems_filesystem_evaluate_path( path, parentpathlen, 80038dc: b9 c0 08 00 mv r1,r14 80038e0: b9 60 10 00 mv r2,r11 80038e4: 34 03 00 02 mvi r3,2 80038e8: 34 05 00 00 mvi r5,0 80038ec: fb ff fb 26 calli 8002584 RTEMS_LIBIO_PERMS_WRITE, &parentloc, false ); if ( result != 0 ) return -1; 80038f0: 34 0c ff ff mvi r12,-1 else { result = rtems_filesystem_evaluate_path( path, parentpathlen, RTEMS_LIBIO_PERMS_WRITE, &parentloc, false ); if ( result != 0 ) 80038f4: 5c 20 00 3d bne r1,r0,80039e8 <== NEVER TAKEN return -1; free_parentloc = true; 80038f8: 34 0d 00 01 mvi r13,1 /* * Start from the parent to find the node that should be under it. */ loc = parentloc; 80038fc: 2b 81 00 2c lw r1,(sp+44) name = path + parentpathlen; 8003900: b5 cb 58 00 add r11,r14,r11 /* * Start from the parent to find the node that should be under it. */ loc = parentloc; 8003904: 5b 81 00 18 sw (sp+24),r1 8003908: 2b 81 00 30 lw r1,(sp+48) 800390c: 5b 81 00 1c sw (sp+28),r1 8003910: 2b 81 00 34 lw r1,(sp+52) 8003914: 5b 81 00 20 sw (sp+32),r1 8003918: 2b 81 00 38 lw r1,(sp+56) 800391c: 5b 81 00 24 sw (sp+36),r1 8003920: 2b 81 00 3c lw r1,(sp+60) 8003924: 5b 81 00 28 sw (sp+40),r1 name = path + parentpathlen; name += rtems_filesystem_prefix_separators( name, strlen( name ) ); 8003928: b9 60 08 00 mv r1,r11 800392c: f8 00 3b 3d calli 8012620 8003930: b8 20 10 00 mv r2,r1 8003934: b9 60 08 00 mv r1,r11 8003938: fb ff fb 42 calli 8002640 800393c: b5 61 60 00 add r12,r11,r1 result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), 8003940: b9 80 08 00 mv r1,r12 8003944: f8 00 3b 37 calli 8012620 8003948: 37 8b 00 18 addi r11,sp,24 800394c: b8 20 10 00 mv r2,r1 8003950: 34 03 00 00 mvi r3,0 8003954: b9 80 08 00 mv r1,r12 8003958: b9 60 20 00 mv r4,r11 800395c: 34 05 00 00 mvi r5,0 8003960: fb ff fa e7 calli 80024fc 0, &loc, false ); if ( result != 0 ) { 8003964: 44 20 00 05 be r1,r0,8003978 if ( free_parentloc ) rtems_filesystem_freenode( &parentloc ); return -1; 8003968: 34 0c ff ff mvi r12,-1 result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), 0, &loc, false ); if ( result != 0 ) { if ( free_parentloc ) rtems_filesystem_freenode( &parentloc ); 800396c: 37 81 00 2c addi r1,sp,44 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 ) 8003970: 45 a0 00 1e be r13,r0,80039e8 <== NEVER TAKEN 8003974: e0 00 00 1c bi 80039e4 rtems_filesystem_freenode( &parentloc ); return -1; } if ( (*loc.ops->node_type_h)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) { 8003978: 2b 81 00 24 lw r1,(sp+36) 800397c: 28 22 00 10 lw r2,(r1+16) 8003980: b9 60 08 00 mv r1,r11 8003984: d8 40 00 00 call r2 8003988: 34 02 00 01 mvi r2,1 800398c: 5c 22 00 0b bne r1,r2,80039b8 rtems_filesystem_freenode( &loc ); 8003990: b9 60 08 00 mv r1,r11 8003994: fb ff fb 44 calli 80026a4 if ( free_parentloc ) 8003998: 45 a0 00 03 be r13,r0,80039a4 rtems_filesystem_freenode( &parentloc ); 800399c: 37 81 00 2c addi r1,sp,44 80039a0: fb ff fb 41 calli 80026a4 rtems_set_errno_and_return_minus_one( EISDIR ); 80039a4: f8 00 36 be calli 801149c <__errno> 80039a8: 34 02 00 15 mvi r2,21 80039ac: 58 22 00 00 sw (r1+0),r2 80039b0: 34 0c ff ff mvi r12,-1 80039b4: e0 00 00 0d bi 80039e8 } result = (*loc.ops->unlink_h)( &parentloc, &loc ); 80039b8: 2b 81 00 24 lw r1,(sp+36) 80039bc: 37 8e 00 2c addi r14,sp,44 80039c0: b9 60 10 00 mv r2,r11 80039c4: 28 23 00 0c lw r3,(r1+12) 80039c8: b9 c0 08 00 mv r1,r14 80039cc: d8 60 00 00 call r3 80039d0: b8 20 60 00 mv r12,r1 rtems_filesystem_freenode( &loc ); 80039d4: b9 60 08 00 mv r1,r11 80039d8: fb ff fb 33 calli 80026a4 if ( free_parentloc ) 80039dc: 45 a0 00 03 be r13,r0,80039e8 rtems_filesystem_freenode( &parentloc ); 80039e0: b9 c0 08 00 mv r1,r14 80039e4: fb ff fb 30 calli 80026a4 return result; } 80039e8: b9 80 08 00 mv r1,r12 80039ec: 2b 9d 00 04 lw ra,(sp+4) 80039f0: 2b 8b 00 14 lw r11,(sp+20) 80039f4: 2b 8c 00 10 lw r12,(sp+16) 80039f8: 2b 8d 00 0c lw r13,(sp+12) 80039fc: 2b 8e 00 08 lw r14,(sp+8) 8003a00: 37 9c 00 40 addi sp,sp,64 8003a04: c3 a0 00 00 ret =============================================================================== 08003910 : */ int unmount( const char *path ) { 8003910: 37 9c ff dc addi sp,sp,-36 8003914: 5b 8b 00 10 sw (sp+16),r11 8003918: 5b 8c 00 0c sw (sp+12),r12 800391c: 5b 8d 00 08 sw (sp+8),r13 8003920: 5b 9d 00 04 sw (sp+4),ra 8003924: b8 20 58 00 mv r11,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 ) ) 8003928: 37 8c 00 14 addi r12,sp,20 800392c: f8 00 2c 9b calli 800eb98 8003930: b8 20 10 00 mv r2,r1 8003934: 34 03 00 00 mvi r3,0 8003938: b9 60 08 00 mv r1,r11 800393c: b9 80 20 00 mv r4,r12 8003940: 34 05 00 01 mvi r5,1 8003944: fb ff fa 1d calli 80021b8 8003948: 5c 20 00 41 bne r1,r0,8003a4c return -1; mt_entry = loc.mt_entry; 800394c: 2b 8b 00 24 lw r11,(sp+36) /* * Verify this is the root node for the file system to be unmounted. */ if ( fs_root_loc->node_access != loc.node_access ){ 8003950: 2b 81 00 14 lw r1,(sp+20) 8003954: 29 62 00 1c lw r2,(r11+28) 8003958: 44 41 00 06 be r2,r1,8003970 rtems_filesystem_freenode( &loc ); 800395c: b9 80 08 00 mv r1,r12 8003960: fb ff fa 5e calli 80022d8 rtems_set_errno_and_return_minus_one( EACCES ); 8003964: f8 00 26 f0 calli 800d524 <__errno> 8003968: 34 02 00 0d mvi r2,13 800396c: e0 00 00 13 bi 80039b8 /* * Free the loc node and just use the nodes from the mt_entry . */ rtems_filesystem_freenode( &loc ); 8003970: b9 80 08 00 mv r1,r12 8003974: fb ff fa 59 calli 80022d8 * 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 ) 8003978: 78 01 08 01 mvhi r1,0x801 800397c: 38 21 71 a4 ori r1,r1,0x71a4 8003980: 28 21 00 00 lw r1,(r1+0) 8003984: 28 21 00 14 lw r1,(r1+20) 8003988: 44 2b 00 0a be r1,r11,80039b0 /* * Verify there are no file systems below the path specified */ if ( rtems_filesystem_mount_iterate( is_fs_below_mount_point, 800398c: 29 62 00 2c lw r2,(r11+44) 8003990: 78 01 08 00 mvhi r1,0x800 8003994: 38 21 39 04 ori r1,r1,0x3904 8003998: fb ff fc ea calli 8002d40 800399c: 5c 20 00 05 bne r1,r0,80039b0 * 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 ) 80039a0: b9 60 08 00 mv r1,r11 80039a4: fb ff fb 67 calli 8002740 80039a8: 34 02 00 01 mvi r2,1 80039ac: 5c 22 00 05 bne r1,r2,80039c0 rtems_set_errno_and_return_minus_one( EBUSY ); 80039b0: f8 00 26 dd calli 800d524 <__errno> 80039b4: 34 02 00 10 mvi r2,16 80039b8: 58 22 00 00 sw (r1+0),r2 80039bc: e0 00 00 24 bi 8003a4c * 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 ) 80039c0: 29 61 00 14 lw r1,(r11+20) return -1; 80039c4: 34 0c ff ff mvi r12,-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 ) 80039c8: 28 22 00 28 lw r2,(r1+40) 80039cc: b9 60 08 00 mv r1,r11 80039d0: d8 40 00 00 call r2 80039d4: b8 20 68 00 mv r13,r1 80039d8: 5c 20 00 1e bne r1,r0,8003a50 <== 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){ 80039dc: 29 61 00 28 lw r1,(r11+40) 80039e0: 28 22 00 2c lw r2,(r1+44) 80039e4: b9 60 08 00 mv r1,r11 80039e8: d8 40 00 00 call r2 80039ec: 44 2d 00 08 be r1,r13,8003a0c <== ALWAYS TAKEN if (( fs_mount_loc->ops->mount_h )( mt_entry ) != 0 ) 80039f0: 29 61 00 14 lw r1,(r11+20) <== NOT EXECUTED 80039f4: 28 22 00 20 lw r2,(r1+32) <== NOT EXECUTED 80039f8: b9 60 08 00 mv r1,r11 <== NOT EXECUTED 80039fc: d8 40 00 00 call r2 <== NOT EXECUTED 8003a00: 44 20 00 14 be r1,r0,8003a50 <== NOT EXECUTED rtems_fatal_error_occurred( 0 ); 8003a04: 34 01 00 00 mvi r1,0 <== NOT EXECUTED 8003a08: f8 00 02 cc calli 8004538 <== 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 ); 8003a0c: 78 0c 08 01 mvhi r12,0x801 8003a10: 39 8c 78 80 ori r12,r12,0x7880 8003a14: 29 81 00 00 lw r1,(r12+0) 8003a18: 34 02 00 00 mvi r2,0 8003a1c: 34 03 00 00 mvi r3,0 8003a20: f8 00 01 97 calli 800407c */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); 8003a24: b9 60 08 00 mv r1,r11 8003a28: f8 00 03 cb calli 8004954 <_Chain_Extract> } static inline void rtems_libio_unlock( void ) { rtems_semaphore_release( rtems_libio_semaphore ); 8003a2c: 29 81 00 00 lw r1,(r12+0) */ rtems_filesystem_freenode( fs_mount_loc ); free( mt_entry ); return 0; 8003a30: 34 0c 00 00 mvi r12,0 8003a34: f8 00 01 e2 calli 80041bc /* * 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 ); 8003a38: 35 61 00 08 addi r1,r11,8 8003a3c: fb ff fa 27 calli 80022d8 free( mt_entry ); 8003a40: b9 60 08 00 mv r1,r11 8003a44: fb ff fa 2d calli 80022f8 return 0; 8003a48: e0 00 00 02 bi 8003a50 * 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; 8003a4c: 34 0c ff ff mvi r12,-1 rtems_filesystem_freenode( fs_mount_loc ); free( mt_entry ); return 0; } 8003a50: b9 80 08 00 mv r1,r12 8003a54: 2b 9d 00 04 lw ra,(sp+4) 8003a58: 2b 8b 00 10 lw r11,(sp+16) 8003a5c: 2b 8c 00 0c lw r12,(sp+12) 8003a60: 2b 8d 00 08 lw r13,(sp+8) 8003a64: 37 9c 00 24 addi sp,sp,36 8003a68: c3 a0 00 00 ret =============================================================================== 08017874 : ssize_t write( int fd, const void *buffer, size_t count ) { 8017874: 37 9c ff ec addi sp,sp,-20 8017878: 5b 8b 00 10 sw (sp+16),r11 801787c: 5b 8c 00 0c sw (sp+12),r12 8017880: 5b 8d 00 08 sw (sp+8),r13 8017884: 5b 9d 00 04 sw (sp+4),ra ssize_t rc; rtems_libio_t *iop; rtems_libio_check_fd( fd ); 8017888: 78 04 08 01 mvhi r4,0x801 801788c: 38 84 90 10 ori r4,r4,0x9010 ssize_t write( int fd, const void *buffer, size_t count ) { 8017890: b8 40 68 00 mv r13,r2 ssize_t rc; rtems_libio_t *iop; rtems_libio_check_fd( fd ); 8017894: 28 82 00 00 lw r2,(r4+0) 8017898: 54 41 00 02 bgu r2,r1,80178a0 801789c: e0 00 00 0c bi 80178cc iop = rtems_libio_iop( fd ); 80178a0: 78 0b 08 01 mvhi r11,0x801 80178a4: 34 02 00 06 mvi r2,6 80178a8: 39 6b 98 28 ori r11,r11,0x9828 80178ac: 5b 83 00 14 sw (sp+20),r3 80178b0: fb ff fd a3 calli 8016f3c <__ashlsi3> 80178b4: 29 6b 00 00 lw r11,(r11+0) rtems_libio_check_is_open( iop ); 80178b8: 2b 83 00 14 lw r3,(sp+20) { ssize_t rc; rtems_libio_t *iop; rtems_libio_check_fd( fd ); iop = rtems_libio_iop( fd ); 80178bc: b5 61 58 00 add r11,r11,r1 rtems_libio_check_is_open( iop ); 80178c0: 29 61 00 18 lw r1,(r11+24) 80178c4: 20 22 01 00 andi r2,r1,0x100 80178c8: 5c 40 00 04 bne r2,r0,80178d8 80178cc: fb ff e6 f4 calli 801149c <__errno> 80178d0: 34 02 00 09 mvi r2,9 80178d4: e0 00 00 08 bi 80178f4 rtems_libio_check_buffer( buffer ); 80178d8: 45 a0 00 05 be r13,r0,80178ec <== NEVER TAKEN rtems_libio_check_count( count ); 80178dc: 34 0c 00 00 mvi r12,0 80178e0: 44 60 00 19 be r3,r0,8017944 rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE ); 80178e4: 20 21 00 04 andi r1,r1,0x4 80178e8: 5c 20 00 06 bne r1,r0,8017900 80178ec: fb ff e6 ec calli 801149c <__errno> 80178f0: 34 02 00 16 mvi r2,22 80178f4: 58 22 00 00 sw (r1+0),r2 80178f8: 34 0c ff ff mvi r12,-1 80178fc: e0 00 00 12 bi 8017944 /* * Now process the write() request. */ rc = (*iop->pathinfo.handlers->write_h)( iop, buffer, count ); 8017900: 29 61 00 24 lw r1,(r11+36) 8017904: b9 a0 10 00 mv r2,r13 8017908: 28 24 00 0c lw r4,(r1+12) 801790c: b9 60 08 00 mv r1,r11 8017910: d8 80 00 00 call r4 8017914: b8 20 60 00 mv r12,r1 if ( rc > 0 ) 8017918: 4c 01 00 0b bge r0,r1,8017944 iop->offset += rc; 801791c: 34 02 00 1f mvi r2,31 8017920: fb ff fd ae calli 8016fd8 <__ashrsi3> 8017924: 29 62 00 14 lw r2,(r11+20) 8017928: 29 64 00 10 lw r4,(r11+16) 801792c: b5 82 10 00 add r2,r12,r2 8017930: f5 82 18 00 cmpgu r3,r12,r2 8017934: b4 24 08 00 add r1,r1,r4 8017938: b4 61 08 00 add r1,r3,r1 801793c: 59 61 00 10 sw (r11+16),r1 8017940: 59 62 00 14 sw (r11+20),r2 return rc; } 8017944: b9 80 08 00 mv r1,r12 8017948: 2b 9d 00 04 lw ra,(sp+4) 801794c: 2b 8b 00 10 lw r11,(sp+16) 8017950: 2b 8c 00 0c lw r12,(sp+12) 8017954: 2b 8d 00 08 lw r13,(sp+8) 8017958: 37 9c 00 14 addi sp,sp,20 801795c: c3 a0 00 00 ret =============================================================================== 08003cf0 : ssize_t writev( int fd, const struct iovec *iov, int iovcnt ) { 8003cf0: 37 9c ff e4 addi sp,sp,-28 8003cf4: 5b 8b 00 1c sw (sp+28),r11 8003cf8: 5b 8c 00 18 sw (sp+24),r12 8003cfc: 5b 8d 00 14 sw (sp+20),r13 8003d00: 5b 8e 00 10 sw (sp+16),r14 8003d04: 5b 8f 00 0c sw (sp+12),r15 8003d08: 5b 90 00 08 sw (sp+8),r16 8003d0c: 5b 9d 00 04 sw (sp+4),ra 8003d10: b8 60 78 00 mv r15,r3 int bytes; rtems_libio_t *iop; ssize_t old; bool all_zeros; rtems_libio_check_fd( fd ); 8003d14: 78 03 08 01 mvhi r3,0x801 8003d18: 38 63 60 10 ori r3,r3,0x6010 ssize_t writev( int fd, const struct iovec *iov, int iovcnt ) { 8003d1c: b8 40 68 00 mv r13,r2 int bytes; rtems_libio_t *iop; ssize_t old; bool all_zeros; rtems_libio_check_fd( fd ); 8003d20: 28 62 00 00 lw r2,(r3+0) 8003d24: 54 41 00 02 bgu r2,r1,8003d2c 8003d28: e0 00 00 0a bi 8003d50 iop = rtems_libio_iop( fd ); 8003d2c: 78 0b 08 01 mvhi r11,0x801 8003d30: 34 02 00 06 mvi r2,6 8003d34: 39 6b 67 6c ori r11,r11,0x676c 8003d38: f8 00 3c 70 calli 8012ef8 <__ashlsi3> 8003d3c: 29 6c 00 00 lw r12,(r11+0) 8003d40: b5 81 60 00 add r12,r12,r1 rtems_libio_check_is_open( iop ); 8003d44: 29 81 00 18 lw r1,(r12+24) 8003d48: 20 22 01 00 andi r2,r1,0x100 8003d4c: 5c 40 00 04 bne r2,r0,8003d5c 8003d50: f8 00 26 7d calli 800d744 <__errno> 8003d54: 34 02 00 09 mvi r2,9 8003d58: e0 00 00 1c bi 8003dc8 rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE ); 8003d5c: 20 21 00 04 andi r1,r1,0x4 8003d60: 44 20 00 18 be r1,r0,8003dc0 <== NEVER TAKEN /* * Argument validation on IO vector */ if ( !iov ) 8003d64: 45 a0 00 17 be r13,r0,8003dc0 rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt <= 0 ) 8003d68: 49 e0 00 02 bg r15,r0,8003d70 8003d6c: e0 00 00 15 bi 8003dc0 rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt > IOV_MAX ) 8003d70: 34 01 04 00 mvi r1,1024 8003d74: 4c 2f 00 02 bge r1,r15,8003d7c <== ALWAYS TAKEN 8003d78: e0 00 00 12 bi 8003dc0 <== NOT EXECUTED 8003d7c: b9 a0 08 00 mv r1,r13 8003d80: 34 02 00 01 mvi r2,1 8003d84: 34 04 00 00 mvi r4,0 8003d88: 34 03 00 00 mvi r3,0 8003d8c: e0 00 00 02 bi 8003d94 if ( iov[v].iov_len ) all_zeros = false; /* check for wrap */ old = total; total += iov[v].iov_len; 8003d90: b8 a0 18 00 mv r3,r5 /* * 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 ) 8003d94: 28 25 00 00 lw r5,(r1+0) 8003d98: 44 a0 00 0a be r5,r0,8003dc0 rtems_set_errno_and_return_minus_one( EINVAL ); if ( iov[v].iov_len ) 8003d9c: 28 25 00 04 lw r5,(r1+4) all_zeros = false; 8003da0: 64 a6 00 00 cmpei r6,r5,0 /* check for wrap */ old = total; total += iov[v].iov_len; 8003da4: b4 65 28 00 add r5,r3,r5 */ if ( iov[v].iov_base == 0 ) rtems_set_errno_and_return_minus_one( EINVAL ); if ( iov[v].iov_len ) all_zeros = false; 8003da8: c8 06 30 00 sub r6,r0,r6 8003dac: a0 46 10 00 and r2,r2,r6 /* check for wrap */ old = total; total += iov[v].iov_len; if ( total < old || total > SSIZE_MAX ) 8003db0: e8 65 18 00 cmpg r3,r3,r5 8003db4: 68 a6 7f ff cmpgi r6,r5,32767 8003db8: b8 c3 18 00 or r3,r6,r3 8003dbc: 44 60 00 05 be r3,r0,8003dd0 rtems_set_errno_and_return_minus_one( EINVAL ); 8003dc0: f8 00 26 61 calli 800d744 <__errno> 8003dc4: 34 02 00 16 mvi r2,22 8003dc8: 58 22 00 00 sw (r1+0),r2 8003dcc: e0 00 00 22 bi 8003e54 * 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++ ) { 8003dd0: 34 84 00 01 addi r4,r4,1 8003dd4: 34 21 00 08 addi r1,r1,8 8003dd8: 49 e4 ff ee bg r15,r4,8003d90 /* * A writev with all zeros is supposed to have no effect per OpenGroup. */ if ( all_zeros == true ) { return 0; 8003ddc: 34 0b 00 00 mvi r11,0 } /* * A writev with all zeros is supposed to have no effect per OpenGroup. */ if ( all_zeros == true ) { 8003de0: 5c 40 00 1e bne r2,r0,8003e58 8003de4: 34 10 00 00 mvi r16,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 ) 8003de8: 29 a3 00 04 lw r3,(r13+4) 8003dec: 44 60 00 16 be r3,r0,8003e44 <== NEVER TAKEN continue; bytes = (*iop->pathinfo.handlers->write_h)( 8003df0: 29 81 00 24 lw r1,(r12+36) 8003df4: 29 a2 00 00 lw r2,(r13+0) 8003df8: 28 24 00 0c lw r4,(r1+12) 8003dfc: b9 80 08 00 mv r1,r12 8003e00: d8 80 00 00 call r4 8003e04: b8 20 70 00 mv r14,r1 iop, iov[v].iov_base, iov[v].iov_len ); if ( bytes < 0 ) 8003e08: 48 01 00 13 bg r0,r1,8003e54 <== NEVER TAKEN return -1; if ( bytes > 0 ) { 8003e0c: 44 20 00 0c be r1,r0,8003e3c <== NEVER TAKEN iop->offset += bytes; 8003e10: 34 02 00 1f mvi r2,31 8003e14: f8 00 3c 60 calli 8012f94 <__ashrsi3> 8003e18: 29 82 00 14 lw r2,(r12+20) 8003e1c: 29 84 00 10 lw r4,(r12+16) total += bytes; 8003e20: b5 6e 58 00 add r11,r11,r14 if ( bytes < 0 ) return -1; if ( bytes > 0 ) { iop->offset += bytes; 8003e24: b5 c2 10 00 add r2,r14,r2 8003e28: f5 c2 18 00 cmpgu r3,r14,r2 8003e2c: b4 24 08 00 add r1,r1,r4 8003e30: b4 61 08 00 add r1,r3,r1 8003e34: 59 81 00 10 sw (r12+16),r1 8003e38: 59 82 00 14 sw (r12+20),r2 total += bytes; } if (bytes != iov[ v ].iov_len) 8003e3c: 29 a1 00 04 lw r1,(r13+4) 8003e40: 5d c1 00 06 bne r14,r1,8003e58 <== NEVER TAKEN } /* * Now process the writev(). */ for ( total=0, v=0 ; v < iovcnt ; v++ ) { 8003e44: 36 10 00 01 addi r16,r16,1 8003e48: 35 ad 00 08 addi r13,r13,8 8003e4c: 49 f0 ff e7 bg r15,r16,8003de8 8003e50: e0 00 00 02 bi 8003e58 iov[v].iov_base, iov[v].iov_len ); if ( bytes < 0 ) return -1; 8003e54: 34 0b ff ff mvi r11,-1 if (bytes != iov[ v ].iov_len) break; } return total; } 8003e58: b9 60 08 00 mv r1,r11 8003e5c: 2b 9d 00 04 lw ra,(sp+4) 8003e60: 2b 8b 00 1c lw r11,(sp+28) 8003e64: 2b 8c 00 18 lw r12,(sp+24) 8003e68: 2b 8d 00 14 lw r13,(sp+20) 8003e6c: 2b 8e 00 10 lw r14,(sp+16) 8003e70: 2b 8f 00 0c lw r15,(sp+12) 8003e74: 2b 90 00 08 lw r16,(sp+8) 8003e78: 37 9c 00 1c addi sp,sp,28 8003e7c: c3 a0 00 00 ret