=============================================================================== 080076a0 : { IMFS_jnode_t *node = loc->node_access; IMFS_fs_info_t *fs_info; fs_info = loc->mt_entry->fs_info; switch( node->type ) { 80076a0: 28 22 00 00 lw r2,(r1+0) ) { IMFS_jnode_t *node = loc->node_access; IMFS_fs_info_t *fs_info; fs_info = loc->mt_entry->fs_info; 80076a4: 28 23 00 10 lw r3,(r1+16) switch( node->type ) { 80076a8: 34 04 00 07 mvi r4,7 80076ac: 28 42 00 4c lw r2,(r2+76) ) { IMFS_jnode_t *node = loc->node_access; IMFS_fs_info_t *fs_info; fs_info = loc->mt_entry->fs_info; 80076b0: 28 63 00 34 lw r3,(r3+52) switch( node->type ) { 80076b4: 54 44 00 0a bgu r2,r4,80076dc <== NEVER TAKEN 80076b8: 78 04 08 01 mvhi r4,0x801 80076bc: b4 42 10 00 add r2,r2,r2 80076c0: 38 84 37 98 ori r4,r4,0x3798 80076c4: b4 42 10 00 add r2,r2,r2 80076c8: b4 82 10 00 add r2,r4,r2 80076cc: 28 42 00 00 lw r2,(r2+0) 80076d0: c0 40 00 00 b r2 case IMFS_DIRECTORY: loc->handlers = fs_info->directory_handlers; 80076d4: 28 62 00 0c lw r2,(r3+12) 80076d8: 58 22 00 08 sw (r1+8),r2 loc->handlers = fs_info->fifo_handlers; break; } return 0; } 80076dc: 34 01 00 00 mvi r1,0 80076e0: c3 a0 00 00 ret break; case IMFS_LINEAR_FILE: loc->handlers = fs_info->memfile_handlers; break; case IMFS_MEMORY_FILE: loc->handlers = fs_info->memfile_handlers; 80076e4: 28 62 00 08 lw r2,(r3+8) 80076e8: 58 22 00 08 sw (r1+8),r2 loc->handlers = fs_info->fifo_handlers; break; } return 0; } 80076ec: 34 01 00 00 mvi r1,0 80076f0: c3 a0 00 00 ret case IMFS_DEVICE: loc->handlers = &IMFS_device_handlers; break; case IMFS_SYM_LINK: case IMFS_HARD_LINK: loc->handlers = &IMFS_link_handlers; 80076f4: 78 02 08 01 mvhi r2,0x801 80076f8: 38 42 38 38 ori r2,r2,0x3838 80076fc: 58 22 00 08 sw (r1+8),r2 loc->handlers = fs_info->fifo_handlers; break; } return 0; } 8007700: 34 01 00 00 mvi r1,0 8007704: c3 a0 00 00 ret break; case IMFS_MEMORY_FILE: loc->handlers = fs_info->memfile_handlers; break; case IMFS_FIFO: loc->handlers = fs_info->fifo_handlers; 8007708: 28 62 00 10 lw r2,(r3+16) 800770c: 58 22 00 08 sw (r1+8),r2 break; } return 0; } 8007710: 34 01 00 00 mvi r1,0 8007714: c3 a0 00 00 ret switch( node->type ) { case IMFS_DIRECTORY: loc->handlers = fs_info->directory_handlers; break; case IMFS_DEVICE: loc->handlers = &IMFS_device_handlers; 8007718: 78 02 08 01 mvhi r2,0x801 800771c: 38 42 37 c8 ori r2,r2,0x37c8 8007720: 58 22 00 08 sw (r1+8),r2 loc->handlers = fs_info->fifo_handlers; break; } return 0; } 8007724: 34 01 00 00 mvi r1,0 8007728: c3 a0 00 00 ret =============================================================================== 08007500 : IMFS_jnode_types_t type, const char *name, mode_t mode, const IMFS_types_union *info ) { 8007500: 37 9c ff e8 addi sp,sp,-24 8007504: 5b 8b 00 18 sw (sp+24),r11 8007508: 5b 8c 00 14 sw (sp+20),r12 800750c: 5b 8d 00 10 sw (sp+16),r13 8007510: 5b 8e 00 0c sw (sp+12),r14 8007514: 5b 8f 00 08 sw (sp+8),r15 8007518: 5b 9d 00 04 sw (sp+4),ra /* * MUST have a parent node to call this routine. */ if ( parent_loc == NULL ) return NULL; 800751c: 34 0b 00 00 mvi r11,0 IMFS_jnode_types_t type, const char *name, mode_t mode, const IMFS_types_union *info ) { 8007520: b8 40 60 00 mv r12,r2 8007524: b8 a0 70 00 mv r14,r5 IMFS_fs_info_t *fs_info; /* * MUST have a parent node to call this routine. */ if ( parent_loc == NULL ) 8007528: 44 20 00 2e be r1,r0,80075e0 <== NEVER TAKEN return NULL; parent = parent_loc->node_access; fs_info = parent_loc->mt_entry->fs_info; 800752c: 28 22 00 10 lw r2,(r1+16) * MUST have a parent node to call this routine. */ if ( parent_loc == NULL ) return NULL; parent = parent_loc->node_access; 8007530: 28 2f 00 00 lw r15,(r1+0) fs_info = parent_loc->mt_entry->fs_info; /* * Reject creation of FIFOs if support is disabled. */ if ( type == IMFS_FIFO && 8007534: 34 01 00 07 mvi r1,7 */ if ( parent_loc == NULL ) return NULL; parent = parent_loc->node_access; fs_info = parent_loc->mt_entry->fs_info; 8007538: 28 4d 00 34 lw r13,(r2+52) /* * Reject creation of FIFOs if support is disabled. */ if ( type == IMFS_FIFO && 800753c: 45 81 00 32 be r12,r1,8007604 return NULL; /* * Allocate filesystem node and fill in basic information */ node = IMFS_allocate_node( type, name, mode & ~rtems_filesystem_umask ); 8007540: 78 06 08 01 mvhi r6,0x801 8007544: 38 c6 41 20 ori r6,r6,0x4120 8007548: 28 c5 00 00 lw r5,(r6+0) 800754c: b8 60 10 00 mv r2,r3 8007550: b9 80 08 00 mv r1,r12 8007554: 28 a3 00 2c lw r3,(r5+44) 8007558: a4 60 18 00 not r3,r3 800755c: a0 83 18 00 and r3,r4,r3 8007560: fb ff ff bf calli 800745c 8007564: b8 20 58 00 mv r11,r1 if ( !node ) 8007568: 44 20 00 1e be r1,r0,80075e0 return NULL; /* * Set the type specific information */ if ( type == IMFS_DIRECTORY ) { 800756c: 34 01 00 01 mvi r1,1 8007570: 45 81 00 0f be r12,r1,80075ac rtems_chain_initialize_empty(&node->info.directory.Entries); } else if ( type == IMFS_HARD_LINK ) { 8007574: 34 01 00 03 mvi r1,3 8007578: 45 81 00 2d be r12,r1,800762c node->info.hard_link.link_node = info->hard_link.link_node; } else if ( type == IMFS_SYM_LINK ) { 800757c: 34 01 00 04 mvi r1,4 8007580: 45 81 00 2b be r12,r1,800762c node->info.sym_link.name = info->sym_link.name; } else if ( type == IMFS_DEVICE ) { 8007584: 34 01 00 02 mvi r1,2 8007588: 45 81 00 24 be r12,r1,8007618 node->info.device.major = info->device.major; node->info.device.minor = info->device.minor; } else if ( type == IMFS_LINEAR_FILE ) { 800758c: 34 01 00 06 mvi r1,6 8007590: 45 81 00 2a be r12,r1,8007638 node->info.linearfile.size = 0; node->info.linearfile.direct = 0; } else if ( type == IMFS_MEMORY_FILE ) { 8007594: 34 01 00 05 mvi r1,5 8007598: 45 81 00 2c be r12,r1,8007648 node->info.file.size = 0; node->info.file.indirect = 0; node->info.file.doubly_indirect = 0; node->info.file.triply_indirect = 0; } else if ( type == IMFS_FIFO ) { 800759c: 34 01 00 07 mvi r1,7 80075a0: 5d 81 00 08 bne r12,r1,80075c0 <== NEVER TAKEN node->info.fifo.pipe = NULL; 80075a4: 59 60 00 50 sw (r11+80),r0 80075a8: e0 00 00 06 bi 80075c0 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 ); 80075ac: 35 62 00 54 addi r2,r11,84 */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { Chain_Node *head = _Chain_Head( the_chain ); 80075b0: 35 61 00 50 addi r1,r11,80 Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; 80075b4: 59 62 00 50 sw (r11+80),r2 head->previous = NULL; 80075b8: 59 60 00 54 sw (r11+84),r0 tail->previous = head; 80075bc: 59 61 00 58 sw (r11+88),r1 /* * This node MUST have a parent, so put it in that directory list. */ node->Parent = parent; node->st_ino = ++fs_info->ino_count; 80075c0: 29 a2 00 04 lw r2,(r13+4) } /* * This node MUST have a parent, so put it in that directory list. */ node->Parent = parent; 80075c4: 59 6f 00 08 sw (r11+8),r15 80075c8: 35 e1 00 50 addi r1,r15,80 node->st_ino = ++fs_info->ino_count; 80075cc: 34 42 00 01 addi r2,r2,1 80075d0: 59 a2 00 04 sw (r13+4),r2 80075d4: 59 62 00 38 sw (r11+56),r2 80075d8: b9 60 10 00 mv r2,r11 80075dc: fb ff f0 b5 calli 80038b0 <_Chain_Append> rtems_chain_append( &parent->info.directory.Entries, &node->Node ); return node; } 80075e0: b9 60 08 00 mv r1,r11 80075e4: 2b 9d 00 04 lw ra,(sp+4) 80075e8: 2b 8b 00 18 lw r11,(sp+24) 80075ec: 2b 8c 00 14 lw r12,(sp+20) 80075f0: 2b 8d 00 10 lw r13,(sp+16) 80075f4: 2b 8e 00 0c lw r14,(sp+12) 80075f8: 2b 8f 00 08 lw r15,(sp+8) 80075fc: 37 9c 00 18 addi sp,sp,24 8007600: c3 a0 00 00 ret fs_info = parent_loc->mt_entry->fs_info; /* * Reject creation of FIFOs if support is disabled. */ if ( type == IMFS_FIFO && 8007604: 29 a1 00 10 lw r1,(r13+16) 8007608: 78 02 08 01 mvhi r2,0x801 800760c: 38 42 37 30 ori r2,r2,0x3730 8007610: 44 22 ff f4 be r1,r2,80075e0 8007614: e3 ff ff cb bi 8007540 } else if ( type == IMFS_HARD_LINK ) { node->info.hard_link.link_node = info->hard_link.link_node; } else if ( type == IMFS_SYM_LINK ) { node->info.sym_link.name = info->sym_link.name; } else if ( type == IMFS_DEVICE ) { node->info.device.major = info->device.major; 8007618: 29 c2 00 00 lw r2,(r14+0) node->info.device.minor = info->device.minor; 800761c: 29 c1 00 04 lw r1,(r14+4) } else if ( type == IMFS_HARD_LINK ) { node->info.hard_link.link_node = info->hard_link.link_node; } else if ( type == IMFS_SYM_LINK ) { node->info.sym_link.name = info->sym_link.name; } else if ( type == IMFS_DEVICE ) { node->info.device.major = info->device.major; 8007620: 59 62 00 50 sw (r11+80),r2 node->info.device.minor = info->device.minor; 8007624: 59 61 00 54 sw (r11+84),r1 8007628: e3 ff ff e6 bi 80075c0 if ( type == IMFS_DIRECTORY ) { rtems_chain_initialize_empty(&node->info.directory.Entries); } else if ( type == IMFS_HARD_LINK ) { node->info.hard_link.link_node = info->hard_link.link_node; } else if ( type == IMFS_SYM_LINK ) { node->info.sym_link.name = info->sym_link.name; 800762c: 29 c1 00 00 lw r1,(r14+0) 8007630: 59 61 00 50 sw (r11+80),r1 8007634: e3 ff ff e3 bi 80075c0 } else if ( type == IMFS_DEVICE ) { node->info.device.major = info->device.major; node->info.device.minor = info->device.minor; } else if ( type == IMFS_LINEAR_FILE ) { node->info.linearfile.size = 0; 8007638: 59 60 00 50 sw (r11+80),r0 800763c: 59 60 00 54 sw (r11+84),r0 node->info.linearfile.direct = 0; 8007640: 59 60 00 58 sw (r11+88),r0 8007644: e3 ff ff df bi 80075c0 } else if ( type == IMFS_MEMORY_FILE ) { node->info.file.size = 0; 8007648: 59 60 00 50 sw (r11+80),r0 800764c: 59 60 00 54 sw (r11+84),r0 node->info.file.indirect = 0; 8007650: 59 60 00 58 sw (r11+88),r0 node->info.file.doubly_indirect = 0; 8007654: 59 60 00 5c sw (r11+92),r0 node->info.file.triply_indirect = 0; 8007658: 59 60 00 60 sw (r11+96),r0 800765c: e3 ff ff d9 bi 80075c0 =============================================================================== 08003914 : */ void IMFS_dump_directory( IMFS_jnode_t *the_directory, int level ) { 8003914: 37 9c ff e0 addi sp,sp,-32 8003918: 5b 8b 00 20 sw (sp+32),r11 800391c: 5b 8c 00 1c sw (sp+28),r12 8003920: 5b 8d 00 18 sw (sp+24),r13 8003924: 5b 8e 00 14 sw (sp+20),r14 8003928: 5b 8f 00 10 sw (sp+16),r15 800392c: 5b 90 00 0c sw (sp+12),r16 8003930: 5b 91 00 08 sw (sp+8),r17 8003934: 5b 9d 00 04 sw (sp+4),ra * */ int IMFS_memfile_maximum_size( void ) { return IMFS_MEMFILE_MAXIMUM_SIZE; } 8003938: 28 2f 00 50 lw r15,(r1+80) RTEMS_INLINE_ROUTINE bool _Chain_Is_tail( Chain_Control *the_chain, const Chain_Node *the_node ) { return (the_node == _Chain_Tail(the_chain)); 800393c: 34 30 00 54 addi r16,r1,84 */ void IMFS_dump_directory( IMFS_jnode_t *the_directory, int level ) { 8003940: b8 40 68 00 mv r13,r2 IMFS_assert( level >= 0 ); IMFS_assert( the_directory->type == IMFS_DIRECTORY ); the_chain = &the_directory->info.directory.Entries; for ( the_node = rtems_chain_first( the_chain ); 8003944: 45 f0 00 17 be r15,r16,80039a0 8003948: 78 0e 08 02 mvhi r14,0x802 800394c: 78 0c 08 02 mvhi r12,0x802 8003950: 39 ce 61 80 ori r14,r14,0x6180 8003954: 39 8c 81 c0 ori r12,r12,0x81c0 for ( i=0 ; i<=level ; i++ ) fprintf(stdout, "...." ); IMFS_print_jnode( the_jnode ); if ( the_jnode->type == IMFS_DIRECTORY ) IMFS_dump_directory( the_jnode, level + 1 ); 8003958: 34 51 00 01 addi r17,r2,1 !rtems_chain_is_tail( the_chain, the_node ); the_node = the_node->next ) { the_jnode = (IMFS_jnode_t *) the_node; for ( i=0 ; i<=level ; i++ ) 800395c: 48 0d 00 0a bg r0,r13,8003984 <== NEVER TAKEN 8003960: 34 0b 00 00 mvi r11,0 fprintf(stdout, "...." ); 8003964: 29 83 00 00 lw r3,(r12+0) !rtems_chain_is_tail( the_chain, the_node ); the_node = the_node->next ) { the_jnode = (IMFS_jnode_t *) the_node; for ( i=0 ; i<=level ; i++ ) 8003968: 35 6b 00 01 addi r11,r11,1 fprintf(stdout, "...." ); 800396c: b9 c0 08 00 mv r1,r14 8003970: 28 64 00 08 lw r4,(r3+8) 8003974: 34 02 00 01 mvi r2,1 8003978: 34 03 00 04 mvi r3,4 800397c: f8 00 3d 13 calli 8012dc8 !rtems_chain_is_tail( the_chain, the_node ); the_node = the_node->next ) { the_jnode = (IMFS_jnode_t *) the_node; for ( i=0 ; i<=level ; i++ ) 8003980: 4d ab ff f9 bge r13,r11,8003964 fprintf(stdout, "...." ); IMFS_print_jnode( the_jnode ); 8003984: b9 e0 08 00 mv r1,r15 8003988: fb ff ff 89 calli 80037ac if ( the_jnode->type == IMFS_DIRECTORY ) 800398c: 29 e3 00 4c lw r3,(r15+76) 8003990: 34 01 00 01 mvi r1,1 8003994: 44 61 00 0d be r3,r1,80039c8 the_chain = &the_directory->info.directory.Entries; for ( the_node = rtems_chain_first( the_chain ); !rtems_chain_is_tail( the_chain, the_node ); the_node = the_node->next ) { 8003998: 29 ef 00 00 lw r15,(r15+0) IMFS_assert( level >= 0 ); IMFS_assert( the_directory->type == IMFS_DIRECTORY ); the_chain = &the_directory->info.directory.Entries; for ( the_node = rtems_chain_first( the_chain ); 800399c: 5d f0 ff f0 bne r15,r16,800395c fprintf(stdout, "...." ); IMFS_print_jnode( the_jnode ); if ( the_jnode->type == IMFS_DIRECTORY ) IMFS_dump_directory( the_jnode, level + 1 ); } } 80039a0: 2b 9d 00 04 lw ra,(sp+4) 80039a4: 2b 8b 00 20 lw r11,(sp+32) 80039a8: 2b 8c 00 1c lw r12,(sp+28) 80039ac: 2b 8d 00 18 lw r13,(sp+24) 80039b0: 2b 8e 00 14 lw r14,(sp+20) 80039b4: 2b 8f 00 10 lw r15,(sp+16) 80039b8: 2b 90 00 0c lw r16,(sp+12) 80039bc: 2b 91 00 08 lw r17,(sp+8) 80039c0: 37 9c 00 20 addi sp,sp,32 80039c4: c3 a0 00 00 ret for ( i=0 ; i<=level ; i++ ) fprintf(stdout, "...." ); IMFS_print_jnode( the_jnode ); if ( the_jnode->type == IMFS_DIRECTORY ) IMFS_dump_directory( the_jnode, level + 1 ); 80039c8: b9 e0 08 00 mv r1,r15 80039cc: ba 20 10 00 mv r2,r17 80039d0: fb ff ff d1 calli 8003914 80039d4: e3 ff ff f1 bi 8003998 =============================================================================== 08007838 : const char *pathname, /* IN */ size_t pathnamelen, /* IN */ int flags, /* IN */ rtems_filesystem_location_info_t *pathloc /* IN/OUT */ ) { 8007838: 37 9c ff 9c addi sp,sp,-100 800783c: 5b 8b 00 3c sw (sp+60),r11 8007840: 5b 8c 00 38 sw (sp+56),r12 8007844: 5b 8d 00 34 sw (sp+52),r13 8007848: 5b 8e 00 30 sw (sp+48),r14 800784c: 5b 8f 00 2c sw (sp+44),r15 8007850: 5b 90 00 28 sw (sp+40),r16 8007854: 5b 91 00 24 sw (sp+36),r17 8007858: 5b 92 00 20 sw (sp+32),r18 800785c: 5b 93 00 1c sw (sp+28),r19 8007860: 5b 94 00 18 sw (sp+24),r20 8007864: 5b 95 00 14 sw (sp+20),r21 8007868: 5b 96 00 10 sw (sp+16),r22 800786c: 5b 97 00 0c sw (sp+12),r23 8007870: 5b 98 00 08 sw (sp+8),r24 8007874: 5b 9d 00 04 sw (sp+4),ra 8007878: b8 60 a8 00 mv r21,r3 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 ) ) { 800787c: 34 03 ff f8 mvi r3,-8 8007880: a2 a3 18 00 and r3,r21,r3 const char *pathname, /* IN */ size_t pathnamelen, /* IN */ int flags, /* IN */ rtems_filesystem_location_info_t *pathloc /* IN/OUT */ ) { 8007884: b8 20 88 00 mv r17,r1 8007888: b8 40 70 00 mv r14,r2 800788c: 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 ) ) { 8007890: 5c 60 00 94 bne r3,r0,8007ae0 <== NEVER TAKEN /* * This was filled in by the caller and is valid in the * mount table. */ node = pathloc->node_access; 8007894: 28 8c 00 00 lw r12,(r4+0) case IMFS_UP_DIR: /* * Am I at the root of all filesystems? (chroot'ed?) */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) 8007898: 78 10 08 01 mvhi r16,0x801 size_t pathnamelen, /* IN */ int flags, /* IN */ rtems_filesystem_location_info_t *pathloc /* IN/OUT */ ) { int i = 0; 800789c: 34 0f 00 00 mvi r15,0 80078a0: 37 92 00 40 addi r18,sp,64 /* * I cannot move out of this directory without execute permission. */ if ( type != IMFS_NO_MORE_PATH ) if ( node->type == IMFS_DIRECTORY ) 80078a4: 34 13 00 01 mvi r19,1 if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) ) rtems_set_errno_and_return_minus_one( EACCES ); node = pathloc->node_access; switch( type ) { 80078a8: 34 14 00 03 mvi r20,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 ) { 80078ac: 34 16 00 04 mvi r22,4 /* * In contrast to a hard link, it is possible to have a broken * symbolic link. */ node = pathloc->node_access; if ( result == -1 ) 80078b0: 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 ) { 80078b4: 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 ) 80078b8: 3a 10 41 20 ori r16,r16,0x4120 * 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 ); 80078bc: 37 84 00 64 addi r4,sp,100 80078c0: b6 2f 08 00 add r1,r17,r15 80078c4: b9 c0 10 00 mv r2,r14 80078c8: ba 40 18 00 mv r3,r18 80078cc: f8 00 02 17 calli 8008128 pathnamelen -= len; i += len; if ( !pathloc->node_access ) 80078d0: 29 64 00 00 lw r4,(r11+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 ); 80078d4: b8 20 68 00 mv r13,r1 pathnamelen -= len; 80078d8: 2b 85 00 64 lw r5,(sp+100) i += len; if ( !pathloc->node_access ) 80078dc: 44 80 00 51 be r4,r0,8007a20 <== NEVER TAKEN */ while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) { type = IMFS_get_token( &pathname[i], pathnamelen, token, &len ); pathnamelen -= len; 80078e0: c9 c5 70 00 sub r14,r14,r5 i += len; 80078e4: b5 e5 78 00 add r15,r15,r5 rtems_set_errno_and_return_minus_one( ENOENT ); /* * I cannot move out of this directory without execute permission. */ if ( type != IMFS_NO_MORE_PATH ) 80078e8: 5c 20 00 10 bne r1,r0,8007928 * 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 ) { 80078ec: 28 82 00 4c lw r2,(r4+76) 80078f0: 34 01 00 01 mvi r1,1 80078f4: 44 41 00 6a be r2,r1,8007a9c flags, pathloc ); } else { result = IMFS_Set_handlers( pathloc ); } } else { result = IMFS_Set_handlers( pathloc ); 80078f8: b9 60 08 00 mv r1,r11 80078fc: fb ff ff 69 calli 80076a0 8007900: b8 20 68 00 mv r13,r1 /* * Verify we have the correct permissions for this node. */ if ( !IMFS_evaluate_permission( pathloc, flags ) ) 8007904: ba a0 10 00 mv r2,r21 8007908: b9 60 08 00 mv r1,r11 800790c: fb ff ff 88 calli 800772c 8007910: 5c 20 00 2c bne r1,r0,80079c0 rtems_set_errno_and_return_minus_one( EACCES ); 8007914: f8 00 15 30 calli 800cdd4 <__errno> 8007918: 34 02 00 0d mvi r2,13 800791c: 58 22 00 00 sw (r1+0),r2 8007920: 34 0d ff ff mvi r13,-1 8007924: e0 00 00 27 bi 80079c0 /* * I cannot move out of this directory without execute permission. */ if ( type != IMFS_NO_MORE_PATH ) if ( node->type == IMFS_DIRECTORY ) 8007928: 29 81 00 4c lw r1,(r12+76) 800792c: 44 33 00 37 be r1,r19,8007a08 if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) ) rtems_set_errno_and_return_minus_one( EACCES ); node = pathloc->node_access; 8007930: b8 80 60 00 mv r12,r4 switch( type ) { 8007934: 45 b4 00 06 be r13,r20,800794c 8007938: 45 b6 00 1e be r13,r22,80079b0 800793c: 45 b7 00 11 be r13,r23,8007980 /* * Evaluate all tokens until we are done or an error occurs. */ while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) { 8007940: 7d ad 00 04 cmpnei r13,r13,4 8007944: 5d a0 ff de bne r13,r0,80078bc <== ALWAYS TAKEN 8007948: e3 ff ff e9 bi 80078ec <== NOT EXECUTED case IMFS_NAME: /* * If we are at a link follow it. */ if ( node->type == IMFS_HARD_LINK ) { 800794c: 28 81 00 4c lw r1,(r4+76) 8007950: 44 34 00 39 be r1,r20,8007a34 * It would be a design error if we evaluated the link and * was broken. */ IMFS_assert( node ); } else if ( node->type == IMFS_SYM_LINK ) { 8007954: 44 36 00 5b be r1,r22,8007ac0 } /* * Only a directory can be decended into. */ if ( node->type != IMFS_DIRECTORY ) 8007958: 5c 33 00 67 bne r1,r19,8007af4 <== NEVER TAKEN /* * 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 ) { 800795c: 29 8d 00 5c lw r13,(r12+92) 8007960: 5d a0 00 6a bne r13,r0,8007b08 } /* * Otherwise find the token name in the present location. */ node = IMFS_find_match_in_dir( node, token ); 8007964: b9 80 08 00 mv r1,r12 8007968: ba 40 10 00 mv r2,r18 800796c: f8 00 01 c9 calli 8008090 8007970: b8 20 60 00 mv r12,r1 if ( !node ) 8007974: 44 2d 00 2b be r1,r13,8007a20 /* * Set the node access to the point we have found. */ pathloc->node_access = node; 8007978: 59 6c 00 00 sw (r11+0),r12 800797c: e3 ff ff d0 bi 80078bc case IMFS_UP_DIR: /* * Am I at the root of all filesystems? (chroot'ed?) */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) 8007980: 2a 01 00 00 lw r1,(r16+0) 8007984: 28 21 00 18 lw r1,(r1+24) 8007988: 44 24 ff cd be r1,r4,80078bc /* * Am I at the root of this mounted filesystem? */ if (pathloc->node_access == pathloc->mt_entry->mt_fs_root.node_access) { 800798c: 29 61 00 10 lw r1,(r11+16) /* * Am I at the root of this mounted filesystem? */ if (pathloc->node_access == 8007990: 28 22 00 1c lw r2,(r1+28) 8007994: 44 44 00 2e be r2,r4,8007a4c pathnamelen+len, flags,pathloc); } } else { if ( !node->Parent ) 8007998: 28 8c 00 08 lw r12,(r4+8) 800799c: 5d 80 ff f7 bne r12,r0,8007978 rtems_set_errno_and_return_minus_one( ENOENT ); 80079a0: f8 00 15 0d calli 800cdd4 <__errno> 80079a4: 58 2d 00 00 sw (r1+0),r13 80079a8: 34 0d ff ff mvi r13,-1 80079ac: e0 00 00 05 bi 80079c0 case IMFS_NO_MORE_PATH: case IMFS_CURRENT_DIR: break; case IMFS_INVALID_TOKEN: rtems_set_errno_and_return_minus_one( ENAMETOOLONG ); 80079b0: f8 00 15 09 calli 800cdd4 <__errno> 80079b4: 34 02 00 5b mvi r2,91 80079b8: 58 22 00 00 sw (r1+0),r2 80079bc: 34 0d ff ff mvi r13,-1 if ( !IMFS_evaluate_permission( pathloc, flags ) ) rtems_set_errno_and_return_minus_one( EACCES ); return result; } 80079c0: b9 a0 08 00 mv r1,r13 80079c4: 2b 9d 00 04 lw ra,(sp+4) 80079c8: 2b 8b 00 3c lw r11,(sp+60) 80079cc: 2b 8c 00 38 lw r12,(sp+56) 80079d0: 2b 8d 00 34 lw r13,(sp+52) 80079d4: 2b 8e 00 30 lw r14,(sp+48) 80079d8: 2b 8f 00 2c lw r15,(sp+44) 80079dc: 2b 90 00 28 lw r16,(sp+40) 80079e0: 2b 91 00 24 lw r17,(sp+36) 80079e4: 2b 92 00 20 lw r18,(sp+32) 80079e8: 2b 93 00 1c lw r19,(sp+28) 80079ec: 2b 94 00 18 lw r20,(sp+24) 80079f0: 2b 95 00 14 lw r21,(sp+20) 80079f4: 2b 96 00 10 lw r22,(sp+16) 80079f8: 2b 97 00 0c lw r23,(sp+12) 80079fc: 2b 98 00 08 lw r24,(sp+8) 8007a00: 37 9c 00 64 addi sp,sp,100 8007a04: c3 a0 00 00 ret /* * I cannot move out of this directory without execute permission. */ if ( type != IMFS_NO_MORE_PATH ) if ( node->type == IMFS_DIRECTORY ) if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) ) 8007a08: b9 60 08 00 mv r1,r11 8007a0c: 34 02 00 01 mvi r2,1 8007a10: fb ff ff 47 calli 800772c 8007a14: 44 20 ff c0 be r1,r0,8007914 8007a18: 29 64 00 00 lw r4,(r11+0) 8007a1c: e3 ff ff c5 bi 8007930 /* * Otherwise find the token name in the present location. */ node = IMFS_find_match_in_dir( node, token ); if ( !node ) rtems_set_errno_and_return_minus_one( ENOENT ); 8007a20: f8 00 14 ed calli 800cdd4 <__errno> 8007a24: 34 02 00 02 mvi r2,2 8007a28: 58 22 00 00 sw (r1+0),r2 8007a2c: 34 0d ff ff mvi r13,-1 8007a30: e3 ff ff e4 bi 80079c0 case IMFS_NAME: /* * If we are at a link follow it. */ if ( node->type == IMFS_HARD_LINK ) { IMFS_evaluate_hard_link( pathloc, 0 ); 8007a34: b9 60 08 00 mv r1,r11 8007a38: 34 02 00 00 mvi r2,0 8007a3c: fb ff ff 67 calli 80077d8 node = pathloc->node_access; 8007a40: 29 6c 00 00 lw r12,(r11+0) 8007a44: 29 81 00 4c lw r1,(r12+76) 8007a48: e3 ff ff c4 bi 8007958 /* * Am I at the root of this mounted filesystem? */ if (pathloc->node_access == 8007a4c: 28 23 00 14 lw r3,(r1+20) if ( pathloc->node_access == rtems_filesystem_root.node_access ) { break; /* Throw out the .. in this case */ } else { newloc = pathloc->mt_entry->mt_point_node; *pathloc = newloc; return (*pathloc->ops->evalpath_h)(&(pathname[i-len]), 8007a50: 2b 82 00 64 lw r2,(sp+100) /* * Am I at the root of this mounted filesystem? */ if (pathloc->node_access == 8007a54: 28 27 00 0c lw r7,(r1+12) 8007a58: 28 26 00 10 lw r6,(r1+16) 8007a5c: 28 24 00 18 lw r4,(r1+24) 8007a60: 28 28 00 08 lw r8,(r1+8) if ( node->type == IMFS_DIRECTORY ) { if ( node->info.directory.mt_fs != NULL ) { newloc = node->info.directory.mt_fs->mt_fs_root; *pathloc = newloc; return (*pathloc->ops->evalpath_h)( &pathname[i-len], 8007a64: 28 65 00 00 lw r5,(r3+0) 8007a68: c9 e2 08 00 sub r1,r15,r2 * * NOTE: The behavior of stat() on a mount point appears to be questionable. */ if ( node->type == IMFS_DIRECTORY ) { if ( node->info.directory.mt_fs != NULL ) { 8007a6c: 59 63 00 0c sw (r11+12),r3 8007a70: 59 64 00 10 sw (r11+16),r4 8007a74: 59 68 00 00 sw (r11+0),r8 8007a78: 59 67 00 04 sw (r11+4),r7 8007a7c: 59 66 00 08 sw (r11+8),r6 newloc = node->info.directory.mt_fs->mt_fs_root; *pathloc = newloc; return (*pathloc->ops->evalpath_h)( &pathname[i-len], 8007a80: b6 21 08 00 add r1,r17,r1 8007a84: b5 c2 10 00 add r2,r14,r2 8007a88: ba a0 18 00 mv r3,r21 8007a8c: b9 60 20 00 mv r4,r11 8007a90: d8 a0 00 00 call r5 8007a94: b8 20 68 00 mv r13,r1 8007a98: e3 ff ff ca bi 80079c0 * * NOTE: The behavior of stat() on a mount point appears to be questionable. */ if ( node->type == IMFS_DIRECTORY ) { if ( node->info.directory.mt_fs != NULL ) { 8007a9c: 28 81 00 5c lw r1,(r4+92) 8007aa0: 44 20 ff 96 be r1,r0,80078f8 8007aa4: 28 23 00 28 lw r3,(r1+40) newloc = node->info.directory.mt_fs->mt_fs_root; *pathloc = newloc; return (*pathloc->ops->evalpath_h)( &pathname[i-len], 8007aa8: 2b 82 00 64 lw r2,(sp+100) * * NOTE: The behavior of stat() on a mount point appears to be questionable. */ if ( node->type == IMFS_DIRECTORY ) { if ( node->info.directory.mt_fs != NULL ) { 8007aac: 28 27 00 20 lw r7,(r1+32) 8007ab0: 28 26 00 24 lw r6,(r1+36) 8007ab4: 28 24 00 2c lw r4,(r1+44) 8007ab8: 28 28 00 1c lw r8,(r1+28) 8007abc: e3 ff ff ea bi 8007a64 * was broken. */ IMFS_assert( node ); } else if ( node->type == IMFS_SYM_LINK ) { result = IMFS_evaluate_sym_link( pathloc, 0 ); 8007ac0: b9 60 08 00 mv r1,r11 8007ac4: 34 02 00 00 mvi r2,0 8007ac8: f8 00 00 17 calli 8007b24 8007acc: 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; 8007ad0: 29 6c 00 00 lw r12,(r11+0) if ( result == -1 ) 8007ad4: 44 38 ff bb be r1,r24,80079c0 /* * In contrast to a hard link, it is possible to have a broken * symbolic link. */ node = pathloc->node_access; 8007ad8: 29 81 00 4c lw r1,(r12+76) 8007adc: e3 ff ff 9f bi 8007958 rtems_filesystem_location_info_t newloc; IMFS_jnode_t *node; int result; if ( !rtems_libio_is_valid_perms( flags ) ) { rtems_set_errno_and_return_minus_one( EIO ); 8007ae0: f8 00 14 bd calli 800cdd4 <__errno> <== NOT EXECUTED 8007ae4: 34 02 00 05 mvi r2,5 <== NOT EXECUTED 8007ae8: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED 8007aec: 34 0d ff ff mvi r13,-1 <== NOT EXECUTED 8007af0: e3 ff ff b4 bi 80079c0 <== NOT EXECUTED /* * Only a directory can be decended into. */ if ( node->type != IMFS_DIRECTORY ) rtems_set_errno_and_return_minus_one( ENOTDIR ); 8007af4: f8 00 14 b8 calli 800cdd4 <__errno> 8007af8: 34 02 00 14 mvi r2,20 8007afc: 58 22 00 00 sw (r1+0),r2 8007b00: 34 0d ff ff mvi r13,-1 8007b04: e3 ff ff af bi 80079c0 /* * 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 ) { 8007b08: 29 a3 00 28 lw r3,(r13+40) newloc = node->info.directory.mt_fs->mt_fs_root; *pathloc = newloc; return (*pathloc->ops->evalpath_h)( &pathname[i-len], 8007b0c: 2b 82 00 64 lw r2,(sp+100) /* * 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 ) { 8007b10: 29 a7 00 20 lw r7,(r13+32) 8007b14: 29 a6 00 24 lw r6,(r13+36) 8007b18: 29 a4 00 2c lw r4,(r13+44) 8007b1c: 29 a8 00 1c lw r8,(r13+28) 8007b20: e3 ff ff d1 bi 8007a64 =============================================================================== 08007cc8 : int IMFS_evaluate_for_make( const char *path, /* IN */ rtems_filesystem_location_info_t *pathloc, /* IN/OUT */ const char **name /* OUT */ ) { 8007cc8: 37 9c ff 98 addi sp,sp,-104 8007ccc: 5b 8b 00 40 sw (sp+64),r11 8007cd0: 5b 8c 00 3c sw (sp+60),r12 8007cd4: 5b 8d 00 38 sw (sp+56),r13 8007cd8: 5b 8e 00 34 sw (sp+52),r14 8007cdc: 5b 8f 00 30 sw (sp+48),r15 8007ce0: 5b 90 00 2c sw (sp+44),r16 8007ce4: 5b 91 00 28 sw (sp+40),r17 8007ce8: 5b 92 00 24 sw (sp+36),r18 8007cec: 5b 93 00 20 sw (sp+32),r19 8007cf0: 5b 94 00 1c sw (sp+28),r20 8007cf4: 5b 95 00 18 sw (sp+24),r21 8007cf8: 5b 96 00 14 sw (sp+20),r22 8007cfc: 5b 97 00 10 sw (sp+16),r23 8007d00: 5b 98 00 0c sw (sp+12),r24 8007d04: 5b 99 00 08 sw (sp+8),r25 8007d08: 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 ) 8007d0c: 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 */ ) { 8007d10: b8 40 68 00 mv r13,r2 /* * This was filled in by the caller and is valid in the * mount table. */ node = pathloc->node_access; 8007d14: 28 4b 00 00 lw r11,(r2+0) int IMFS_evaluate_for_make( const char *path, /* IN */ rtems_filesystem_location_info_t *pathloc, /* IN/OUT */ const char **name /* OUT */ ) { 8007d18: b8 20 90 00 mv r18,r1 8007d1c: b8 60 c0 00 mv r24,r3 node = pathloc->node_access; /* * Get the path length. */ pathlen = strlen( path ); 8007d20: f8 00 18 ce calli 800e058 const char *path, /* IN */ rtems_filesystem_location_info_t *pathloc, /* IN/OUT */ const char **name /* OUT */ ) { int i = 0; 8007d24: 34 0f 00 00 mvi r15,0 node = pathloc->node_access; /* * Get the path length. */ pathlen = strlen( path ); 8007d28: b8 20 70 00 mv r14,r1 8007d2c: 37 93 00 44 addi r19,sp,68 /* * I cannot move out of this directory without execute permission. */ if ( type != IMFS_NO_MORE_PATH ) if ( node->type == IMFS_DIRECTORY ) 8007d30: 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 ) { 8007d34: 34 14 00 02 mvi r20,2 case IMFS_UP_DIR: /* * Am I at the root of all filesystems? (chroot'ed?) */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) 8007d38: 3a 10 41 20 ori r16,r16,0x4120 if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) ) rtems_set_errno_and_return_minus_one( EACCES ); node = pathloc->node_access; switch( type ) { 8007d3c: 34 16 00 03 mvi r22,3 result = IMFS_evaluate_link( pathloc, 0 ); if ( result == -1 ) return -1; } else if ( node->type == IMFS_SYM_LINK ) { 8007d40: 34 17 00 04 mvi r23,4 result = IMFS_evaluate_link( pathloc, 0 ); if ( result == -1 ) 8007d44: 34 19 ff ff mvi r25,-1 * Evaluate all tokens until we are done or an error occurs. */ while( !done ) { type = IMFS_get_token( &path[i], pathlen, token, &len ); 8007d48: b9 c0 10 00 mv r2,r14 8007d4c: 37 84 00 68 addi r4,sp,104 8007d50: b6 4f 08 00 add r1,r18,r15 8007d54: ba 60 18 00 mv r3,r19 8007d58: f8 00 00 f4 calli 8008128 pathlen -= len; i += len; if ( !pathloc->node_access ) 8007d5c: 29 a4 00 00 lw r4,(r13+0) */ while( !done ) { type = IMFS_get_token( &path[i], pathlen, token, &len ); pathlen -= len; 8007d60: 2b 91 00 68 lw r17,(sp+104) * Evaluate all tokens until we are done or an error occurs. */ while( !done ) { type = IMFS_get_token( &path[i], pathlen, token, &len ); 8007d64: b8 20 60 00 mv r12,r1 pathlen -= len; 8007d68: c9 d1 70 00 sub r14,r14,r17 i += len; if ( !pathloc->node_access ) 8007d6c: 44 80 00 51 be r4,r0,8007eb0 <== NEVER TAKEN /* * I cannot move out of this directory without execute permission. */ if ( type != IMFS_NO_MORE_PATH ) 8007d70: 5c 20 00 18 bne r1,r0,8007dd0 pathloc->node_access = node; break; case IMFS_NO_MORE_PATH: rtems_set_errno_and_return_minus_one( EEXIST ); 8007d74: f8 00 14 18 calli 800cdd4 <__errno> 8007d78: 34 02 00 11 mvi r2,17 8007d7c: 58 22 00 00 sw (r1+0),r2 8007d80: 34 0b ff ff mvi r11,-1 if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_WX ) ) rtems_set_errno_and_return_minus_one( EACCES ); return result; } 8007d84: b9 60 08 00 mv r1,r11 8007d88: 2b 9d 00 04 lw ra,(sp+4) 8007d8c: 2b 8b 00 40 lw r11,(sp+64) 8007d90: 2b 8c 00 3c lw r12,(sp+60) 8007d94: 2b 8d 00 38 lw r13,(sp+56) 8007d98: 2b 8e 00 34 lw r14,(sp+52) 8007d9c: 2b 8f 00 30 lw r15,(sp+48) 8007da0: 2b 90 00 2c lw r16,(sp+44) 8007da4: 2b 91 00 28 lw r17,(sp+40) 8007da8: 2b 92 00 24 lw r18,(sp+36) 8007dac: 2b 93 00 20 lw r19,(sp+32) 8007db0: 2b 94 00 1c lw r20,(sp+28) 8007db4: 2b 95 00 18 lw r21,(sp+24) 8007db8: 2b 96 00 14 lw r22,(sp+20) 8007dbc: 2b 97 00 10 lw r23,(sp+16) 8007dc0: 2b 98 00 0c lw r24,(sp+12) 8007dc4: 2b 99 00 08 lw r25,(sp+8) 8007dc8: 37 9c 00 68 addi sp,sp,104 8007dcc: c3 a0 00 00 ret /* * I cannot move out of this directory without execute permission. */ if ( type != IMFS_NO_MORE_PATH ) if ( node->type == IMFS_DIRECTORY ) 8007dd0: 29 61 00 4c lw r1,(r11+76) 8007dd4: 44 35 00 3c be r1,r21,8007ec4 while( !done ) { type = IMFS_get_token( &path[i], pathlen, token, &len ); pathlen -= len; i += len; 8007dd8: b5 f1 78 00 add r15,r15,r17 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; 8007ddc: b8 80 58 00 mv r11,r4 switch( type ) { 8007de0: 45 94 00 1a be r12,r20,8007e48 8007de4: 55 94 00 03 bgu r12,r20,8007df0 8007de8: 5d 80 ff d8 bne r12,r0,8007d48 <== ALWAYS TAKEN 8007dec: e3 ff ff e2 bi 8007d74 <== NOT EXECUTED 8007df0: 45 96 00 07 be r12,r22,8007e0c 8007df4: 5d 97 ff d5 bne r12,r23,8007d48 <== NEVER TAKEN case IMFS_NO_MORE_PATH: rtems_set_errno_and_return_minus_one( EEXIST ); break; case IMFS_INVALID_TOKEN: rtems_set_errno_and_return_minus_one( ENAMETOOLONG ); 8007df8: f8 00 13 f7 calli 800cdd4 <__errno> 8007dfc: 34 02 00 5b mvi r2,91 8007e00: 58 22 00 00 sw (r1+0),r2 8007e04: 34 0b ff ff mvi r11,-1 8007e08: e3 ff ff df bi 8007d84 pathloc->node_access = node; break; case IMFS_NAME: if ( node->type == IMFS_HARD_LINK ) { 8007e0c: 28 81 00 4c lw r1,(r4+76) 8007e10: 44 36 00 46 be r1,r22,8007f28 result = IMFS_evaluate_link( pathloc, 0 ); if ( result == -1 ) return -1; } else if ( node->type == IMFS_SYM_LINK ) { 8007e14: 44 37 00 45 be r1,r23,8007f28 if ( result == -1 ) return -1; } node = pathloc->node_access; if ( !node ) 8007e18: 45 60 00 5b be r11,r0,8007f84 <== NEVER TAKEN /* * Only a directory can be decended into. */ if ( node->type != IMFS_DIRECTORY ) 8007e1c: 29 61 00 4c lw r1,(r11+76) 8007e20: 5c 35 00 59 bne r1,r21,8007f84 /* * 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 ) { 8007e24: 29 6c 00 5c lw r12,(r11+92) 8007e28: 5d 80 00 5c bne r12,r0,8007f98 /* * Otherwise find the token name in the present location. */ node = IMFS_find_match_in_dir( node, token ); 8007e2c: b9 60 08 00 mv r1,r11 8007e30: ba 60 10 00 mv r2,r19 8007e34: f8 00 00 97 calli 8008090 8007e38: b8 20 58 00 mv r11,r1 /* * If there is no node we have found the name of the node we * wish to create. */ if ( ! node ) 8007e3c: 44 2c 00 0f be r1,r12,8007e78 done = true; else pathloc->node_access = node; 8007e40: 59 ab 00 00 sw (r13+0),r11 8007e44: e3 ff ff c1 bi 8007d48 case IMFS_UP_DIR: /* * Am I at the root of all filesystems? (chroot'ed?) */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) 8007e48: 2a 01 00 00 lw r1,(r16+0) 8007e4c: 28 21 00 18 lw r1,(r1+24) 8007e50: 44 81 ff be be r4,r1,8007d48 /* * Am I at the root of this mounted filesystem? */ if (pathloc->node_access == pathloc->mt_entry->mt_fs_root.node_access){ 8007e54: 29 a1 00 10 lw r1,(r13+16) 8007e58: 28 22 00 1c lw r2,(r1+28) 8007e5c: 44 82 00 20 be r4,r2,8007edc *pathloc = newloc; return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name ); } } else { if ( !node->Parent ) 8007e60: 28 8b 00 08 lw r11,(r4+8) 8007e64: 5d 60 ff f7 bne r11,r0,8007e40 rtems_set_errno_and_return_minus_one( ENOENT ); 8007e68: f8 00 13 db calli 800cdd4 <__errno> 8007e6c: 58 2c 00 00 sw (r1+0),r12 8007e70: 34 0b ff ff mvi r11,-1 8007e74: e3 ff ff c4 bi 8007d84 case IMFS_CURRENT_DIR: break; } } *name = &path[ i - len ]; 8007e78: 2b 81 00 68 lw r1,(sp+104) /* * 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++) { 8007e7c: b6 4f 10 00 add r2,r18,r15 case IMFS_CURRENT_DIR: break; } } *name = &path[ i - len ]; 8007e80: c9 e1 78 00 sub r15,r15,r1 8007e84: b6 4f 90 00 add r18,r18,r15 8007e88: 5b 12 00 00 sw (r24+0),r18 /* * 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++) { 8007e8c: 40 41 00 00 lbu r1,(r2+0) 8007e90: 44 2b 00 2d be r1,r11,8007f44 8007e94: b8 40 58 00 mv r11,r2 8007e98: e0 00 00 04 bi 8007ea8 8007e9c: 41 61 00 01 lbu r1,(r11+1) 8007ea0: 35 6b 00 01 addi r11,r11,1 8007ea4: 44 20 00 28 be r1,r0,8007f44 if ( !IMFS_is_separator( path[ i ] ) ) 8007ea8: fb ff e9 e7 calli 8002644 8007eac: 5c 20 ff fc bne r1,r0,8007e9c rtems_set_errno_and_return_minus_one( ENOENT ); 8007eb0: f8 00 13 c9 calli 800cdd4 <__errno> 8007eb4: 34 02 00 02 mvi r2,2 8007eb8: 58 22 00 00 sw (r1+0),r2 8007ebc: 34 0b ff ff mvi r11,-1 8007ec0: e3 ff ff b1 bi 8007d84 * I cannot move out of this directory without execute permission. */ if ( type != IMFS_NO_MORE_PATH ) if ( node->type == IMFS_DIRECTORY ) if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) ) 8007ec4: b9 a0 08 00 mv r1,r13 8007ec8: 34 02 00 01 mvi r2,1 8007ecc: fb ff fe 18 calli 800772c 8007ed0: 44 20 00 28 be r1,r0,8007f70 8007ed4: 29 a4 00 00 lw r4,(r13+0) 8007ed8: e3 ff ff c0 bi 8007dd8 /* * Am I at the root of this mounted filesystem? */ if (pathloc->node_access == pathloc->mt_entry->mt_fs_root.node_access){ 8007edc: 28 22 00 14 lw r2,(r1+20) 8007ee0: 28 26 00 0c lw r6,(r1+12) 8007ee4: 28 25 00 10 lw r5,(r1+16) 8007ee8: 28 23 00 18 lw r3,(r1+24) 8007eec: 28 27 00 08 lw r7,(r1+8) */ if ( node->info.directory.mt_fs != NULL ) { newloc = node->info.directory.mt_fs->mt_fs_root; *pathloc = newloc; return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name ); 8007ef0: 2b 81 00 68 lw r1,(sp+104) 8007ef4: 28 44 00 04 lw r4,(r2+4) /* * 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 ) { 8007ef8: 59 a2 00 0c sw (r13+12),r2 newloc = node->info.directory.mt_fs->mt_fs_root; *pathloc = newloc; return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name ); 8007efc: c9 e1 08 00 sub r1,r15,r1 /* * If we are at a node that is a mount point. Set loc to the * new fs root node and let them finish evaluating the path. */ if ( node->info.directory.mt_fs != NULL ) { 8007f00: 59 a3 00 10 sw (r13+16),r3 8007f04: 59 a7 00 00 sw (r13+0),r7 8007f08: 59 a6 00 04 sw (r13+4),r6 8007f0c: 59 a5 00 08 sw (r13+8),r5 newloc = node->info.directory.mt_fs->mt_fs_root; *pathloc = newloc; return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name ); 8007f10: b6 41 08 00 add r1,r18,r1 8007f14: b9 a0 10 00 mv r2,r13 8007f18: bb 00 18 00 mv r3,r24 8007f1c: d8 80 00 00 call r4 8007f20: b8 20 58 00 mv r11,r1 8007f24: e3 ff ff 98 bi 8007d84 if ( result == -1 ) return -1; } else if ( node->type == IMFS_SYM_LINK ) { result = IMFS_evaluate_link( pathloc, 0 ); 8007f28: b9 a0 08 00 mv r1,r13 8007f2c: 34 02 00 00 mvi r2,0 8007f30: fb ff ff 28 calli 8007bd0 8007f34: b8 20 58 00 mv r11,r1 if ( result == -1 ) 8007f38: 44 39 ff 93 be r1,r25,8007d84 <== NEVER TAKEN 8007f3c: 29 ab 00 00 lw r11,(r13+0) 8007f40: e3 ff ff b6 bi 8007e18 /* * Verify we can execute and write to this directory. */ result = IMFS_Set_handlers( pathloc ); 8007f44: b9 a0 08 00 mv r1,r13 8007f48: fb ff fd d6 calli 80076a0 8007f4c: b8 20 58 00 mv r11,r1 /* * The returned node must be a directory */ node = pathloc->node_access; if ( node->type != IMFS_DIRECTORY ) 8007f50: 29 a1 00 00 lw r1,(r13+0) 8007f54: 28 22 00 4c lw r2,(r1+76) 8007f58: 34 01 00 01 mvi r1,1 8007f5c: 5c 41 00 0a bne r2,r1,8007f84 <== NEVER TAKEN /* * We must have Write and execute permission on the returned node. */ if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_WX ) ) 8007f60: b9 a0 08 00 mv r1,r13 8007f64: 34 02 00 03 mvi r2,3 8007f68: fb ff fd f1 calli 800772c 8007f6c: 5c 20 ff 86 bne r1,r0,8007d84 rtems_set_errno_and_return_minus_one( EACCES ); 8007f70: f8 00 13 99 calli 800cdd4 <__errno> 8007f74: 34 02 00 0d mvi r2,13 8007f78: 58 22 00 00 sw (r1+0),r2 8007f7c: 34 0b ff ff mvi r11,-1 8007f80: e3 ff ff 81 bi 8007d84 /* * The returned node must be a directory */ node = pathloc->node_access; if ( node->type != IMFS_DIRECTORY ) rtems_set_errno_and_return_minus_one( ENOTDIR ); 8007f84: f8 00 13 94 calli 800cdd4 <__errno> 8007f88: 34 02 00 14 mvi r2,20 8007f8c: 58 22 00 00 sw (r1+0),r2 8007f90: 34 0b ff ff mvi r11,-1 8007f94: e3 ff ff 7c bi 8007d84 /* * 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 ) { 8007f98: 29 82 00 28 lw r2,(r12+40) 8007f9c: 29 86 00 20 lw r6,(r12+32) 8007fa0: 29 85 00 24 lw r5,(r12+36) 8007fa4: 29 83 00 2c lw r3,(r12+44) 8007fa8: 29 87 00 1c lw r7,(r12+28) 8007fac: e3 ff ff d1 bi 8007ef0 =============================================================================== 0800772c : */ int IMFS_evaluate_permission( rtems_filesystem_location_info_t *node, int flags ) { 800772c: 37 9c ff f0 addi sp,sp,-16 8007730: 5b 8b 00 10 sw (sp+16),r11 8007734: 5b 8c 00 0c sw (sp+12),r12 8007738: 5b 8d 00 08 sw (sp+8),r13 800773c: 5b 9d 00 04 sw (sp+4),ra 8007740: 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 ) ) 8007744: 34 02 ff f8 mvi r2,-8 8007748: a1 82 10 00 and r2,r12,r2 800774c: 5c 40 00 1e bne r2,r0,80077c4 <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EPERM ); jnode = node->node_access; 8007750: 28 2b 00 00 lw r11,(r1+0) #if defined(RTEMS_POSIX_API) st_uid = geteuid(); 8007754: f8 00 03 ba calli 800863c 8007758: b8 20 68 00 mv r13,r1 st_gid = getegid(); 800775c: f8 00 03 b3 calli 8008628 * Check if I am owner or a group member or someone else. */ flags_to_test = flags; if ( st_uid == jnode->st_uid ) 8007760: 2d 62 00 3c lhu r2,(r11+60) 8007764: 44 4d 00 0d be r2,r13,8007798 flags_to_test <<= 6; else if ( st_gid == jnode->st_gid ) 8007768: 2d 63 00 3e lhu r3,(r11+62) 800776c: b9 80 10 00 mv r2,r12 8007770: 44 61 00 11 be r3,r1,80077b4 <== ALWAYS TAKEN /* * If all of the flags are set we have permission * to do this. */ if ( ( flags_to_test & jnode->st_mode) == flags_to_test ) 8007774: 29 61 00 30 lw r1,(r11+48) 8007778: a0 41 08 00 and r1,r2,r1 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 ); 800777c: e4 41 08 00 cmpe r1,r2,r1 */ if ( ( flags_to_test & jnode->st_mode) == flags_to_test ) return 1; return 0; } 8007780: 2b 9d 00 04 lw ra,(sp+4) 8007784: 2b 8b 00 10 lw r11,(sp+16) 8007788: 2b 8c 00 0c lw r12,(sp+12) 800778c: 2b 8d 00 08 lw r13,(sp+8) 8007790: 37 9c 00 10 addi sp,sp,16 8007794: c3 a0 00 00 ret */ flags_to_test = flags; if ( st_uid == jnode->st_uid ) flags_to_test <<= 6; 8007798: b5 8c 10 00 add r2,r12,r12 800779c: b4 42 10 00 add r2,r2,r2 80077a0: b4 42 10 00 add r2,r2,r2 80077a4: b4 42 10 00 add r2,r2,r2 80077a8: b4 42 10 00 add r2,r2,r2 80077ac: b4 42 10 00 add r2,r2,r2 80077b0: e3 ff ff f1 bi 8007774 else if ( st_gid == jnode->st_gid ) flags_to_test <<= 3; 80077b4: b5 8c 10 00 add r2,r12,r12 80077b8: b4 42 10 00 add r2,r2,r2 80077bc: b4 42 10 00 add r2,r2,r2 80077c0: e3 ff ff ed bi 8007774 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 ); 80077c4: f8 00 15 84 calli 800cdd4 <__errno> <== NOT EXECUTED 80077c8: 34 02 00 01 mvi r2,1 <== NOT EXECUTED 80077cc: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED 80077d0: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED 80077d4: e3 ff ff eb bi 8007780 <== NOT EXECUTED =============================================================================== 08002058 : rtems_off64_t IMFS_fifo_lseek( rtems_libio_t *iop, rtems_off64_t offset, int whence ) { 8002058: 37 9c ff f8 addi sp,sp,-8 800205c: 5b 8b 00 08 sw (sp+8),r11 8002060: 5b 9d 00 04 sw (sp+4),ra 8002064: b8 20 28 00 mv r5,r1 off_t err = pipe_lseek(LIBIO2PIPE(iop), offset, whence, iop); 8002068: 28 21 00 1c lw r1,(r1+28) 800206c: b8 60 10 00 mv r2,r3 8002070: b8 80 18 00 mv r3,r4 8002074: 28 21 00 50 lw r1,(r1+80) 8002078: b8 a0 20 00 mv r4,r5 800207c: f8 00 24 83 calli 800b288 8002080: b8 20 58 00 mv r11,r1 IMFS_FIFO_RETURN(err); 8002084: 4c 20 00 07 bge r1,r0,80020a0 <== NEVER TAKEN 8002088: f8 00 35 9e calli 800f700 <__errno> 800208c: c8 0b 58 00 sub r11,r0,r11 8002090: 58 2b 00 00 sw (r1+0),r11 8002094: 34 02 ff ff mvi r2,-1 8002098: 34 01 ff ff mvi r1,-1 800209c: e0 00 00 04 bi 80020ac 80020a0: 34 02 00 1f mvi r2,31 <== NOT EXECUTED 80020a4: f8 00 7b 7f calli 8020ea0 <__ashrsi3> <== NOT EXECUTED 80020a8: b9 60 10 00 mv r2,r11 <== NOT EXECUTED } 80020ac: 2b 9d 00 04 lw ra,(sp+4) 80020b0: 2b 8b 00 08 lw r11,(sp+8) 80020b4: 37 9c 00 08 addi sp,sp,8 80020b8: c3 a0 00 00 ret =============================================================================== 08002158 : ssize_t IMFS_fifo_write( rtems_libio_t *iop, const void *buffer, size_t count ) { 8002158: 37 9c ff ec addi sp,sp,-20 800215c: 5b 8b 00 0c sw (sp+12),r11 8002160: 5b 8c 00 08 sw (sp+8),r12 8002164: 5b 9d 00 04 sw (sp+4),ra IMFS_jnode_t *jnode = iop->pathinfo.node_access; 8002168: 28 2b 00 1c lw r11,(r1+28) int err = pipe_write(JNODE2PIPE(jnode), buffer, count, iop); 800216c: b8 20 20 00 mv r4,r1 8002170: 29 61 00 50 lw r1,(r11+80) 8002174: f8 00 23 94 calli 800afc4 8002178: b8 20 60 00 mv r12,r1 if (err > 0) { 800217c: 4c 01 00 0d bge r0,r1,80021b0 IMFS_mtime_ctime_update(jnode); 8002180: 34 02 00 00 mvi r2,0 8002184: 37 81 00 10 addi r1,sp,16 8002188: f8 00 05 29 calli 800362c 800218c: 2b 82 00 10 lw r2,(sp+16) 8002190: b9 80 08 00 mv r1,r12 8002194: 59 62 00 44 sw (r11+68),r2 8002198: 59 62 00 48 sw (r11+72),r2 } IMFS_FIFO_RETURN(err); } 800219c: 2b 9d 00 04 lw ra,(sp+4) 80021a0: 2b 8b 00 0c lw r11,(sp+12) 80021a4: 2b 8c 00 08 lw r12,(sp+8) 80021a8: 37 9c 00 14 addi sp,sp,20 80021ac: c3 a0 00 00 ret int err = pipe_write(JNODE2PIPE(jnode), buffer, count, iop); if (err > 0) { IMFS_mtime_ctime_update(jnode); } IMFS_FIFO_RETURN(err); 80021b0: 34 01 00 00 mvi r1,0 80021b4: 45 80 ff fa be r12,r0,800219c <== NEVER TAKEN 80021b8: f8 00 35 52 calli 800f700 <__errno> 80021bc: c8 0c 60 00 sub r12,r0,r12 80021c0: 58 2c 00 00 sw (r1+0),r12 80021c4: 34 01 ff ff mvi r1,-1 80021c8: e3 ff ff f5 bi 800219c =============================================================================== 08008090 : IMFS_jnode_t *IMFS_find_match_in_dir( IMFS_jnode_t *directory, char *name ) { 8008090: 37 9c ff f0 addi sp,sp,-16 8008094: 5b 8b 00 10 sw (sp+16),r11 8008098: 5b 8c 00 0c sw (sp+12),r12 800809c: 5b 8d 00 08 sw (sp+8),r13 80080a0: 5b 9d 00 04 sw (sp+4),ra 80080a4: b8 40 60 00 mv r12,r2 /* * Check for "." and ".." */ if ( !strcmp( name, dotname ) ) 80080a8: 78 02 08 01 mvhi r2,0x801 IMFS_jnode_t *IMFS_find_match_in_dir( IMFS_jnode_t *directory, char *name ) { 80080ac: b8 20 58 00 mv r11,r1 /* * Check for "." and ".." */ if ( !strcmp( name, dotname ) ) 80080b0: 38 42 37 b8 ori r2,r2,0x37b8 80080b4: b9 80 08 00 mv r1,r12 80080b8: f8 00 17 71 calli 800de7c 80080bc: 44 20 00 07 be r1,r0,80080d8 <== NEVER TAKEN return directory; if ( !strcmp( name, dotdotname ) ) 80080c0: 78 02 08 01 mvhi r2,0x801 80080c4: b9 80 08 00 mv r1,r12 80080c8: 38 42 37 bc ori r2,r2,0x37bc 80080cc: f8 00 17 6c calli 800de7c 80080d0: 5c 20 00 09 bne r1,r0,80080f4 <== ALWAYS TAKEN return directory->Parent; 80080d4: 29 6b 00 08 lw r11,(r11+8) if ( !strcmp( name, the_jnode->name ) ) return the_jnode; } return 0; } 80080d8: b9 60 08 00 mv r1,r11 80080dc: 2b 9d 00 04 lw ra,(sp+4) 80080e0: 2b 8b 00 10 lw r11,(sp+16) 80080e4: 2b 8c 00 0c lw r12,(sp+12) 80080e8: 2b 8d 00 08 lw r13,(sp+8) 80080ec: 37 9c 00 10 addi sp,sp,16 80080f0: c3 a0 00 00 ret 80080f4: 29 61 00 50 lw r1,(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)); 80080f8: 35 6d 00 54 addi r13,r11,84 if ( !strcmp( name, the_jnode->name ) ) return the_jnode; } return 0; 80080fc: 34 0b 00 00 mvi r11,0 if ( !strcmp( name, dotdotname ) ) return directory->Parent; the_chain = &directory->info.directory.Entries; for ( the_node = rtems_chain_first( the_chain ); 8008100: 44 2d ff f6 be r1,r13,80080d8 8008104: b8 20 58 00 mv r11,r1 !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 ) ) 8008108: 35 62 00 0c addi r2,r11,12 800810c: b9 80 08 00 mv r1,r12 8008110: f8 00 17 5b calli 800de7c 8008114: 44 20 ff f1 be r1,r0,80080d8 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 ) { 8008118: 29 6b 00 00 lw r11,(r11+0) if ( !strcmp( name, dotdotname ) ) return directory->Parent; the_chain = &directory->info.directory.Entries; for ( the_node = rtems_chain_first( the_chain ); 800811c: 5d 6d ff fb bne r11,r13,8008108 if ( !strcmp( name, the_jnode->name ) ) return the_jnode; } return 0; 8008120: 34 0b 00 00 mvi r11,0 8008124: e3 ff ff ed bi 80080d8 =============================================================================== 08007fb0 : ((IMFS_jnode_t *)( rtems_chain_head( jnode_get_control( jnode ) )->next)) int IMFS_fsunmount( rtems_filesystem_mount_table_entry_t *temp_mt_entry ) { 8007fb0: 37 9c ff d8 addi sp,sp,-40 8007fb4: 5b 8b 00 14 sw (sp+20),r11 8007fb8: 5b 8c 00 10 sw (sp+16),r12 8007fbc: 5b 8d 00 0c sw (sp+12),r13 8007fc0: 5b 8e 00 08 sw (sp+8),r14 8007fc4: 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; 8007fc8: 28 2b 00 1c lw r11,(r1+28) loc = temp_mt_entry->mt_fs_root; 8007fcc: 28 25 00 20 lw r5,(r1+32) 8007fd0: 28 24 00 24 lw r4,(r1+36) 8007fd4: 28 23 00 28 lw r3,(r1+40) 8007fd8: 28 22 00 2c lw r2,(r1+44) 8007fdc: 5b 8b 00 18 sw (sp+24),r11 8007fe0: 5b 85 00 1c sw (sp+28),r5 8007fe4: 5b 84 00 20 sw (sp+32),r4 8007fe8: 5b 83 00 24 sw (sp+36),r3 8007fec: 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; 8007ff0: 58 20 00 1c sw (r1+28),r0 8007ff4: 37 8d 00 18 addi r13,sp,24 do { next = jnode->Parent; loc.node_access = (void *)jnode; IMFS_Set_handlers( &loc ); if ( jnode->type != IMFS_DIRECTORY ) { 8007ff8: 34 0c 00 01 mvi r12,1 temp_mt_entry->mt_fs_root.node_access = NULL; do { next = jnode->Parent; loc.node_access = (void *)jnode; IMFS_Set_handlers( &loc ); 8007ffc: b9 a0 08 00 mv r1,r13 */ temp_mt_entry->mt_fs_root.node_access = NULL; do { next = jnode->Parent; 8008000: 29 6e 00 08 lw r14,(r11+8) loc.node_access = (void *)jnode; 8008004: 5b 8b 00 18 sw (sp+24),r11 IMFS_Set_handlers( &loc ); 8008008: fb ff fd a6 calli 80076a0 if ( jnode->type != IMFS_DIRECTORY ) { 800800c: 29 61 00 4c lw r1,(r11+76) RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); 8008010: 35 63 00 54 addi r3,r11,84 8008014: 5c 2c 00 13 bne r1,r12,8008060 result = IMFS_unlink( NULL, &loc ); if (result != 0) return -1; jnode = next; } else if ( jnode_has_no_children( jnode ) ) { 8008018: 29 61 00 50 lw r1,(r11+80) 800801c: 44 23 00 17 be r1,r3,8008078 result = IMFS_unlink( NULL, &loc ); if (result != 0) return -1; jnode = next; } if ( jnode != NULL ) { 8008020: 45 60 00 08 be r11,r0,8008040 if ( jnode->type == IMFS_DIRECTORY ) { 8008024: 29 61 00 4c lw r1,(r11+76) 8008028: 5c 2c ff f5 bne r1,r12,8007ffc <== NEVER TAKEN } } } while (jnode != NULL); return 0; } 800802c: 29 61 00 50 lw r1,(r11+80) 8008030: 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 ) ) 8008034: 44 22 ff f2 be r1,r2,8007ffc jnode = jnode_get_first_child( jnode ); 8008038: b8 20 58 00 mv r11,r1 } } } while (jnode != NULL); 800803c: 5c 20 ff f0 bne r1,r0,8007ffc <== ALWAYS TAKEN return 0; 8008040: 34 01 00 00 mvi r1,0 } 8008044: 2b 9d 00 04 lw ra,(sp+4) 8008048: 2b 8b 00 14 lw r11,(sp+20) 800804c: 2b 8c 00 10 lw r12,(sp+16) 8008050: 2b 8d 00 0c lw r13,(sp+12) 8008054: 2b 8e 00 08 lw r14,(sp+8) 8008058: 37 9c 00 28 addi sp,sp,40 800805c: c3 a0 00 00 ret next = jnode->Parent; loc.node_access = (void *)jnode; IMFS_Set_handlers( &loc ); if ( jnode->type != IMFS_DIRECTORY ) { result = IMFS_unlink( NULL, &loc ); 8008060: b9 a0 10 00 mv r2,r13 8008064: 34 01 00 00 mvi r1,0 8008068: fb ff e3 74 calli 8000e38 if (result != 0) 800806c: 5c 20 00 07 bne r1,r0,8008088 <== NEVER TAKEN jnode = next; } else if ( jnode_has_no_children( jnode ) ) { result = IMFS_unlink( NULL, &loc ); if (result != 0) return -1; jnode = next; 8008070: b9 c0 58 00 mv r11,r14 8008074: e3 ff ff eb bi 8008020 result = IMFS_unlink( NULL, &loc ); if (result != 0) return -1; jnode = next; } else if ( jnode_has_no_children( jnode ) ) { result = IMFS_unlink( NULL, &loc ); 8008078: 34 01 00 00 mvi r1,0 800807c: b9 a0 10 00 mv r2,r13 8008080: fb ff e3 6e calli 8000e38 if (result != 0) 8008084: 44 20 ff fb be r1,r0,8008070 <== ALWAYS TAKEN return -1; 8008088: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED 800808c: e3 ff ff ee bi 8008044 <== NOT EXECUTED =============================================================================== 08008128 : const char *path, int pathlen, char *token, int *token_len ) { 8008128: 37 9c ff e0 addi sp,sp,-32 800812c: 5b 8b 00 20 sw (sp+32),r11 8008130: 5b 8c 00 1c sw (sp+28),r12 8008134: 5b 8d 00 18 sw (sp+24),r13 8008138: 5b 8e 00 14 sw (sp+20),r14 800813c: 5b 8f 00 10 sw (sp+16),r15 8008140: 5b 90 00 0c sw (sp+12),r16 8008144: 5b 91 00 08 sw (sp+8),r17 8008148: 5b 9d 00 04 sw (sp+4),ra register int i = 0; 800814c: 34 0b 00 00 mvi r11,0 const char *path, int pathlen, char *token, int *token_len ) { 8008150: b8 20 78 00 mv r15,r1 8008154: b8 40 70 00 mv r14,r2 8008158: b8 60 68 00 mv r13,r3 800815c: b8 80 88 00 mv r17,r4 register char c; /* * Copy a name into token. (Remember NULL is a token.) */ c = path[i]; 8008160: 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 ) 8008164: 34 10 00 20 mvi r16,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) ) { 8008168: e0 00 00 07 bi 8008184 800816c: 44 a1 00 0b be r5,r1,8008198 <== NEVER TAKEN token[i] = c; 8008170: 30 cc 00 00 sb (r6+0),r12 if ( i == IMFS_NAME_MAX ) 8008174: 45 70 00 32 be r11,r16,800823c return IMFS_INVALID_TOKEN; if ( !IMFS_is_valid_name_char(c) ) type = IMFS_INVALID_TOKEN; c = path [++i]; 8008178: 35 6b 00 01 addi r11,r11,1 #include #include "imfs.h" #include IMFS_token_types IMFS_get_token( 800817c: b5 eb 28 00 add r5,r15,r11 return IMFS_INVALID_TOKEN; if ( !IMFS_is_valid_name_char(c) ) type = IMFS_INVALID_TOKEN; c = path [++i]; 8008180: 40 ac 00 00 lbu r12,(r5+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) ) { 8008184: b9 80 08 00 mv r1,r12 8008188: fb ff e9 2f calli 8002644 800818c: e9 cb 28 00 cmpg r5,r14,r11 #include #include "imfs.h" #include IMFS_token_types IMFS_get_token( 8008190: b5 ab 30 00 add r6,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) ) { 8008194: 44 20 ff f6 be r1,r0,800816c /* * Copy a seperator into token. */ if ( i == 0 ) { 8008198: 5d 60 00 14 bne r11,r0,80081e8 token[i] = c; if ( (token[i] != '\0') && pathlen ) { 800819c: 7d 81 00 00 cmpnei r1,r12,0 80081a0: 7d ce 00 00 cmpnei r14,r14,0 /* * Copy a seperator into token. */ if ( i == 0 ) { token[i] = c; 80081a4: 31 ac 00 00 sb (r13+0),r12 if ( (token[i] != '\0') && pathlen ) { 80081a8: a0 2e 70 00 and r14,r1,r14 80081ac: 45 cb 00 26 be r14,r11,8008244 i++; 80081b0: 34 0b 00 01 mvi r11,1 type = IMFS_CURRENT_DIR; 80081b4: 34 02 00 01 mvi r2,1 /* * Set token_len to the number of characters copied. */ *token_len = i; 80081b8: 5a 2b 00 00 sw (r17+0),r11 else if ( strcmp( token, "." ) == 0 ) type = IMFS_CURRENT_DIR; } return type; } 80081bc: b8 40 08 00 mv r1,r2 80081c0: 2b 9d 00 04 lw ra,(sp+4) 80081c4: 2b 8b 00 20 lw r11,(sp+32) 80081c8: 2b 8c 00 1c lw r12,(sp+28) 80081cc: 2b 8d 00 18 lw r13,(sp+24) 80081d0: 2b 8e 00 14 lw r14,(sp+20) 80081d4: 2b 8f 00 10 lw r15,(sp+16) 80081d8: 2b 90 00 0c lw r16,(sp+12) 80081dc: 2b 91 00 08 lw r17,(sp+8) 80081e0: 37 9c 00 20 addi sp,sp,32 80081e4: c3 a0 00 00 ret i++; type = IMFS_CURRENT_DIR; } else { type = IMFS_NO_MORE_PATH; } } else if (token[ i-1 ] != '\0') { 80081e8: b5 ab 08 00 add r1,r13,r11 80081ec: 40 22 ff ff lbu r2,(r1+-1) 80081f0: 44 40 00 02 be r2,r0,80081f8 <== NEVER TAKEN token[i] = '\0'; 80081f4: 30 20 00 00 sb (r1+0),r0 * If we copied something that was not a seperator see if * it was a special name. */ if ( type == IMFS_NAME ) { if ( strcmp( token, "..") == 0 ) 80081f8: 78 02 08 01 mvhi r2,0x801 80081fc: 38 42 37 c4 ori r2,r2,0x37c4 /* * Set token_len to the number of characters copied. */ *token_len = i; 8008200: 5a 2b 00 00 sw (r17+0),r11 * If we copied something that was not a seperator see if * it was a special name. */ if ( type == IMFS_NAME ) { if ( strcmp( token, "..") == 0 ) 8008204: b9 a0 08 00 mv r1,r13 8008208: f8 00 17 1d calli 800de7c type = IMFS_UP_DIR; 800820c: 34 02 00 02 mvi r2,2 * If we copied something that was not a seperator see if * it was a special name. */ if ( type == IMFS_NAME ) { if ( strcmp( token, "..") == 0 ) 8008210: 44 20 ff eb be r1,r0,80081bc type = IMFS_UP_DIR; else if ( strcmp( token, "." ) == 0 ) 8008214: 78 02 08 01 mvhi r2,0x801 8008218: 38 42 37 c0 ori r2,r2,0x37c0 800821c: b9 a0 08 00 mv r1,r13 8008220: f8 00 17 17 calli 800de7c 8008224: 64 21 00 00 cmpei r1,r1,0 8008228: 34 02 ff fe mvi r2,-2 800822c: c8 01 08 00 sub r1,r0,r1 8008230: a0 22 10 00 and r2,r1,r2 8008234: 34 42 00 03 addi r2,r2,3 8008238: e3 ff ff e1 bi 80081bc while ( (!IMFS_is_separator(c)) && (i < pathlen) && (i <= IMFS_NAME_MAX) ) { token[i] = c; if ( i == IMFS_NAME_MAX ) return IMFS_INVALID_TOKEN; 800823c: 34 02 00 04 mvi r2,4 8008240: e3 ff ff df bi 80081bc if ( (token[i] != '\0') && pathlen ) { i++; type = IMFS_CURRENT_DIR; } else { type = IMFS_NO_MORE_PATH; 8008244: 34 02 00 00 mvi r2,0 /* * Set token_len to the number of characters copied. */ *token_len = i; 8008248: 5a 2b 00 00 sw (r17+0),r11 800824c: e3 ff ff dc bi 80081bc =============================================================================== 0800091c : 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 ) { 800091c: 37 9c ff d8 addi sp,sp,-40 8000920: 5b 8b 00 28 sw (sp+40),r11 8000924: 5b 8c 00 24 sw (sp+36),r12 8000928: 5b 8d 00 20 sw (sp+32),r13 800092c: 5b 8e 00 1c sw (sp+28),r14 8000930: 5b 8f 00 18 sw (sp+24),r15 8000934: 5b 90 00 14 sw (sp+20),r16 8000938: 5b 91 00 10 sw (sp+16),r17 800093c: 5b 92 00 0c sw (sp+12),r18 8000940: 5b 93 00 08 sw (sp+8),r19 8000944: 5b 9d 00 04 sw (sp+4),ra IMFS_jnode_t *jnode; /* * determine/check value for imfs_memfile_bytes_per_block */ IMFS_determine_bytes_per_block(&imfs_memfile_bytes_per_block, 8000948: 78 06 08 01 mvhi r6,0x801 800094c: 38 c6 40 14 ori r6,r6,0x4014 8000950: 28 c6 00 00 lw r6,(r6+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 ) { 8000954: b8 20 58 00 mv r11,r1 /* * check, whether requested bytes per block is valid */ for (bit_mask = 16; !is_valid && (bit_mask <= 512); bit_mask <<= 1) { if (bit_mask == requested_bytes_per_block) { 8000958: 34 01 00 10 mvi r1,16 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 ) { 800095c: b8 40 80 00 mv r16,r2 8000960: b8 60 78 00 mv r15,r3 8000964: b8 80 68 00 mv r13,r4 8000968: b8 a0 70 00 mv r14,r5 /* * check, whether requested bytes per block is valid */ for (bit_mask = 16; !is_valid && (bit_mask <= 512); bit_mask <<= 1) { if (bit_mask == requested_bytes_per_block) { 800096c: 44 c1 00 0b be r6,r1,8000998 is_valid = true; break; } if(bit_mask > requested_bytes_per_block) 8000970: 34 01 00 0f mvi r1,15 8000974: 4c 26 00 08 bge r1,r6,8000994 8000978: 34 07 00 05 mvi r7,5 800097c: 34 01 00 20 mvi r1,32 int bit_mask; /* * check, whether requested bytes per block is valid */ for (bit_mask = 16; !is_valid && (bit_mask <= 512); bit_mask <<= 1) { 8000980: 34 e7 ff ff addi r7,r7,-1 if (bit_mask == requested_bytes_per_block) { 8000984: 44 c1 00 05 be r6,r1,8000998 is_valid = true; break; } if(bit_mask > requested_bytes_per_block) 8000988: 48 26 00 03 bg r1,r6,8000994 <== NEVER TAKEN int bit_mask; /* * check, whether requested bytes per block is valid */ for (bit_mask = 16; !is_valid && (bit_mask <= 512); bit_mask <<= 1) { 800098c: b4 21 08 00 add r1,r1,r1 8000990: 5c e0 ff fc bne r7,r0,8000980 <== ALWAYS TAKEN if(bit_mask > requested_bytes_per_block) break; } *dest_bytes_per_block = ((is_valid) ? requested_bytes_per_block : default_bytes_per_block); 8000994: 34 06 00 80 mvi r6,128 break; } if(bit_mask > requested_bytes_per_block) break; } *dest_bytes_per_block = ((is_valid) 8000998: 78 01 08 01 mvhi r1,0x801 800099c: 38 21 46 e8 ori r1,r1,0x46e8 80009a0: 58 26 00 00 sw (r1+0),r6 /* * 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(); 80009a4: f8 00 1b 2f calli 8007660 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; 80009a8: 78 06 08 01 mvhi r6,0x801 80009ac: 38 c6 37 68 ori r6,r6,0x3768 80009b0: 28 c2 00 28 lw r2,(r6+40) /* * 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(); 80009b4: b8 20 60 00 mv r12,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; 80009b8: 28 d3 00 00 lw r19,(r6+0) 80009bc: 28 c1 00 2c lw r1,(r6+44) 80009c0: 28 d2 00 04 lw r18,(r6+4) 80009c4: 28 d1 00 08 lw r17,(r6+8) 80009c8: 28 ca 00 0c lw r10,(r6+12) 80009cc: 28 c9 00 10 lw r9,(r6+16) 80009d0: 28 c8 00 14 lw r8,(r6+20) 80009d4: 28 c7 00 18 lw r7,(r6+24) 80009d8: 28 c5 00 1c lw r5,(r6+28) 80009dc: 28 c4 00 20 lw r4,(r6+32) 80009e0: 28 c3 00 24 lw r3,(r6+36) 80009e4: 59 62 00 60 sw (r11+96),r2 80009e8: 59 61 00 64 sw (r11+100),r1 /* * Create custom file system data. */ fs_info = calloc( 1, sizeof( IMFS_fs_info_t ) ); 80009ec: 34 02 00 14 mvi r2,20 /* * 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(); 80009f0: 59 6c 00 1c sw (r11+28),r12 temp_mt_entry->mt_fs_root.handlers = directory_handlers; 80009f4: 59 6d 00 24 sw (r11+36),r13 temp_mt_entry->mt_fs_root.ops = op_table; 80009f8: 59 70 00 28 sw (r11+40),r16 temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS; 80009fc: 59 73 00 38 sw (r11+56),r19 8000a00: 59 72 00 3c sw (r11+60),r18 8000a04: 59 71 00 40 sw (r11+64),r17 8000a08: 59 6a 00 44 sw (r11+68),r10 8000a0c: 59 69 00 48 sw (r11+72),r9 8000a10: 59 68 00 4c sw (r11+76),r8 8000a14: 59 67 00 50 sw (r11+80),r7 8000a18: 59 65 00 54 sw (r11+84),r5 8000a1c: 59 64 00 58 sw (r11+88),r4 8000a20: 59 63 00 5c sw (r11+92),r3 /* * Create custom file system data. */ fs_info = calloc( 1, sizeof( IMFS_fs_info_t ) ); 8000a24: 34 01 00 01 mvi r1,1 8000a28: f8 00 02 08 calli 8001248 8000a2c: b8 20 10 00 mv r2,r1 if ( !fs_info ) { 8000a30: 44 20 00 1b be r1,r0,8000a9c /* * Set st_ino for the root to 1. */ fs_info->instance = imfs_instance++; 8000a34: 78 06 08 01 mvhi r6,0x801 8000a38: 38 c6 46 ec ori r6,r6,0x46ec 8000a3c: 28 c4 00 00 lw r4,(r6+0) 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; 8000a40: 59 62 00 34 sw (r11+52),r2 /* * Set st_ino for the root to 1. */ fs_info->instance = imfs_instance++; fs_info->ino_count = 1; 8000a44: 34 01 00 01 mvi r1,1 /* * Set st_ino for the root to 1. */ fs_info->instance = imfs_instance++; 8000a48: 58 44 00 00 sw (r2+0),r4 fs_info->ino_count = 1; 8000a4c: 58 41 00 04 sw (r2+4),r1 /* * Set st_ino for the root to 1. */ fs_info->instance = imfs_instance++; 8000a50: 34 84 00 01 addi r4,r4,1 fs_info->ino_count = 1; fs_info->memfile_handlers = memfile_handlers; 8000a54: 58 4f 00 08 sw (r2+8),r15 fs_info->directory_handlers = directory_handlers; 8000a58: 58 4d 00 0c sw (r2+12),r13 fs_info->fifo_handlers = fifo_handlers; 8000a5c: 58 4e 00 10 sw (r2+16),r14 jnode = temp_mt_entry->mt_fs_root.node_access; jnode->st_ino = fs_info->ino_count; 8000a60: 59 81 00 38 sw (r12+56),r1 /* * Set st_ino for the root to 1. */ fs_info->instance = imfs_instance++; 8000a64: 58 c4 00 00 sw (r6+0),r4 fs_info->fifo_handlers = fifo_handlers; jnode = temp_mt_entry->mt_fs_root.node_access; jnode->st_ino = fs_info->ino_count; return 0; 8000a68: 34 01 00 00 mvi r1,0 } 8000a6c: 2b 9d 00 04 lw ra,(sp+4) 8000a70: 2b 8b 00 28 lw r11,(sp+40) 8000a74: 2b 8c 00 24 lw r12,(sp+36) 8000a78: 2b 8d 00 20 lw r13,(sp+32) 8000a7c: 2b 8e 00 1c lw r14,(sp+28) 8000a80: 2b 8f 00 18 lw r15,(sp+24) 8000a84: 2b 90 00 14 lw r16,(sp+20) 8000a88: 2b 91 00 10 lw r17,(sp+16) 8000a8c: 2b 92 00 0c lw r18,(sp+12) 8000a90: 2b 93 00 08 lw r19,(sp+8) 8000a94: 37 9c 00 28 addi sp,sp,40 8000a98: c3 a0 00 00 ret /* * Create custom file system data. */ fs_info = calloc( 1, sizeof( IMFS_fs_info_t ) ); if ( !fs_info ) { free(temp_mt_entry->mt_fs_root.node_access); 8000a9c: b9 80 08 00 mv r1,r12 8000aa0: f8 00 02 82 calli 80014a8 rtems_set_errno_and_return_minus_one(ENOMEM); 8000aa4: f8 00 30 cc calli 800cdd4 <__errno> 8000aa8: 34 02 00 0c mvi r2,12 8000aac: 58 22 00 00 sw (r1+0),r2 8000ab0: 34 01 ff ff mvi r1,-1 8000ab4: e3 ff ff ee bi 8000a6c =============================================================================== 0800b430 : */ MEMFILE_STATIC int IMFS_memfile_extend( IMFS_jnode_t *the_jnode, off_t new_length ) { 800b430: 37 9c ff e0 addi sp,sp,-32 800b434: 5b 8b 00 20 sw (sp+32),r11 800b438: 5b 8c 00 1c sw (sp+28),r12 800b43c: 5b 8d 00 18 sw (sp+24),r13 800b440: 5b 8e 00 14 sw (sp+20),r14 800b444: 5b 8f 00 10 sw (sp+16),r15 800b448: 5b 90 00 0c sw (sp+12),r16 800b44c: 5b 91 00 08 sw (sp+8),r17 800b450: 5b 9d 00 04 sw (sp+4),ra IMFS_assert( the_jnode->type == IMFS_MEMORY_FILE ); /* * Verify new file size is supported */ if ( new_length >= IMFS_MEMFILE_MAXIMUM_SIZE ) 800b454: 78 03 08 01 mvhi r3,0x801 800b458: 38 63 46 e8 ori r3,r3,0x46e8 800b45c: 28 6d 00 00 lw r13,(r3+0) */ MEMFILE_STATIC int IMFS_memfile_extend( IMFS_jnode_t *the_jnode, off_t new_length ) { 800b460: b8 40 78 00 mv r15,r2 800b464: 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 ) 800b468: 01 ab 00 01 srui r11,r13,1 800b46c: 01 6b 00 01 srui r11,r11,1 800b470: b9 60 10 00 mv r2,r11 800b474: 35 61 00 01 addi r1,r11,1 800b478: f8 00 1b ba calli 8012360 <__mulsi3> 800b47c: b9 60 10 00 mv r2,r11 800b480: 34 21 00 01 addi r1,r1,1 800b484: f8 00 1b b7 calli 8012360 <__mulsi3> 800b488: 34 21 ff ff addi r1,r1,-1 800b48c: b9 a0 10 00 mv r2,r13 800b490: f8 00 1b b4 calli 8012360 <__mulsi3> 800b494: 54 2f 00 06 bgu r1,r15,800b4ac rtems_set_errno_and_return_minus_one( EINVAL ); 800b498: f8 00 06 4f calli 800cdd4 <__errno> 800b49c: 34 02 00 16 mvi r2,22 800b4a0: 58 22 00 00 sw (r1+0),r2 800b4a4: 34 01 ff ff mvi r1,-1 800b4a8: e0 00 00 2e bi 800b560 /* * Verify new file size is actually larger than current size */ if ( new_length <= the_jnode->info.file.size ) 800b4ac: b9 e0 08 00 mv r1,r15 800b4b0: 34 02 00 1f mvi r2,31 800b4b4: f8 00 1b 5d calli 8012228 <__ashrsi3> 800b4b8: 29 8b 00 50 lw r11,(r12+80) 800b4bc: b8 20 80 00 mv r16,r1 800b4c0: 29 91 00 54 lw r17,(r12+84) 800b4c4: 48 2b 00 05 bg r1,r11,800b4d8 <== NEVER TAKEN 800b4c8: 5c 2b 00 02 bne r1,r11,800b4d0 <== NEVER TAKEN 800b4cc: 55 f1 00 03 bgu r15,r17,800b4d8 return 0; 800b4d0: 34 01 00 00 mvi r1,0 800b4d4: e0 00 00 23 bi 800b560 /* * Calculate the number of range of blocks to allocate */ new_blocks = new_length / IMFS_MEMFILE_BYTES_PER_BLOCK; 800b4d8: b9 a0 10 00 mv r2,r13 800b4dc: b9 e0 08 00 mv r1,r15 800b4e0: f8 00 1b ac calli 8012390 <__divsi3> old_blocks = the_jnode->info.file.size / IMFS_MEMFILE_BYTES_PER_BLOCK; 800b4e4: 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; 800b4e8: b8 20 70 00 mv r14,r1 old_blocks = the_jnode->info.file.size / IMFS_MEMFILE_BYTES_PER_BLOCK; 800b4ec: b9 a0 08 00 mv r1,r13 800b4f0: f8 00 1b 4e calli 8012228 <__ashrsi3> 800b4f4: b8 20 18 00 mv r3,r1 800b4f8: b9 a0 20 00 mv r4,r13 800b4fc: b9 60 08 00 mv r1,r11 800b500: ba 20 10 00 mv r2,r17 800b504: f8 00 15 57 calli 8010a60 <__divdi3> 800b508: b8 40 68 00 mv r13,r2 /* * Now allocate each of those blocks. */ for ( block=old_blocks ; block<=new_blocks ; block++ ) { 800b50c: 54 4e 00 08 bgu r2,r14,800b52c <== NEVER TAKEN 800b510: b8 40 58 00 mv r11,r2 if ( IMFS_memfile_addblock( the_jnode, block ) ) { 800b514: b9 60 10 00 mv r2,r11 800b518: b9 80 08 00 mv r1,r12 800b51c: fb ff ff 0f calli 800b158 800b520: 5c 20 00 0b bne r1,r0,800b54c 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++ ) { 800b524: 35 6b 00 01 addi r11,r11,1 800b528: 51 cb ff fb bgeu r14,r11,800b514 } /* * Set the new length of the file. */ the_jnode->info.file.size = new_length; 800b52c: 59 90 00 50 sw (r12+80),r16 800b530: 59 8f 00 54 sw (r12+84),r15 return 0; 800b534: 34 01 00 00 mvi r1,0 800b538: e0 00 00 0a bi 800b560 * 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-- ) { IMFS_memfile_remove_block( the_jnode, block ); 800b53c: b9 60 10 00 mv r2,r11 800b540: b9 80 08 00 mv r1,r12 /* * 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-- ) { 800b544: 35 6b ff ff addi r11,r11,-1 IMFS_memfile_remove_block( the_jnode, block ); 800b548: fb ff ff ae calli 800b400 /* * 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-- ) { 800b54c: 51 6d ff fc bgeu r11,r13,800b53c IMFS_memfile_remove_block( the_jnode, block ); } rtems_set_errno_and_return_minus_one( ENOSPC ); 800b550: f8 00 06 21 calli 800cdd4 <__errno> 800b554: 34 02 00 1c mvi r2,28 800b558: 58 22 00 00 sw (r1+0),r2 800b55c: 34 01 ff ff mvi r1,-1 /* * Set the new length of the file. */ the_jnode->info.file.size = new_length; return 0; } 800b560: 2b 9d 00 04 lw ra,(sp+4) 800b564: 2b 8b 00 20 lw r11,(sp+32) 800b568: 2b 8c 00 1c lw r12,(sp+28) 800b56c: 2b 8d 00 18 lw r13,(sp+24) 800b570: 2b 8e 00 14 lw r14,(sp+20) 800b574: 2b 8f 00 10 lw r15,(sp+16) 800b578: 2b 90 00 0c lw r16,(sp+12) 800b57c: 2b 91 00 08 lw r17,(sp+8) 800b580: 37 9c 00 20 addi sp,sp,32 800b584: c3 a0 00 00 ret =============================================================================== 0800ac90 : #endif IMFS_jnode_t *the_jnode, unsigned int block, int malloc_it ) { 800ac90: 37 9c ff dc addi sp,sp,-36 800ac94: 5b 8b 00 20 sw (sp+32),r11 800ac98: 5b 8c 00 1c sw (sp+28),r12 800ac9c: 5b 8d 00 18 sw (sp+24),r13 800aca0: 5b 8e 00 14 sw (sp+20),r14 800aca4: 5b 8f 00 10 sw (sp+16),r15 800aca8: 5b 90 00 0c sw (sp+12),r16 800acac: 5b 91 00 08 sw (sp+8),r17 800acb0: 5b 9d 00 04 sw (sp+4),ra my_block = block; /* * Is the block number in the simple indirect portion? */ if ( my_block <= LAST_INDIRECT ) { 800acb4: 78 04 08 01 mvhi r4,0x801 800acb8: 38 84 46 e8 ori r4,r4,0x46e8 800acbc: 28 8b 00 00 lw r11,(r4+0) #endif IMFS_jnode_t *the_jnode, unsigned int block, int malloc_it ) { 800acc0: b8 20 70 00 mv r14,r1 800acc4: b8 40 60 00 mv r12,r2 my_block = block; /* * Is the block number in the simple indirect portion? */ if ( my_block <= LAST_INDIRECT ) { 800acc8: 01 6b 00 01 srui r11,r11,1 #endif IMFS_jnode_t *the_jnode, unsigned int block, int malloc_it ) { 800accc: b8 60 78 00 mv r15,r3 my_block = block; /* * Is the block number in the simple indirect portion? */ if ( my_block <= LAST_INDIRECT ) { 800acd0: 01 6b 00 01 srui r11,r11,1 800acd4: 35 61 ff ff addi r1,r11,-1 800acd8: 54 41 00 08 bgu r2,r1,800acf8 p = info->indirect; 800acdc: 29 cb 00 58 lw r11,(r14+88) if ( malloc_it ) { 800ace0: 44 60 00 2b be r3,r0,800ad8c if ( !p ) { 800ace4: 45 60 00 5f be r11,r0,800ae60 } if ( !p ) return 0; return &info->indirect[ my_block ]; 800ace8: b5 8c 60 00 add r12,r12,r12 800acec: b5 8c 60 00 add r12,r12,r12 800acf0: b5 6c 68 00 add r13,r11,r12 800acf4: e0 00 00 1b bi 800ad60 /* * Is the block number in the doubly indirect portion? */ if ( my_block <= LAST_DOUBLY_INDIRECT ) { 800acf8: 35 61 00 01 addi r1,r11,1 800acfc: b9 60 10 00 mv r2,r11 800ad00: f8 00 1d 98 calli 8012360 <__mulsi3> 800ad04: b8 20 80 00 mv r16,r1 800ad08: 34 21 ff ff addi r1,r1,-1 800ad0c: 55 81 00 23 bgu r12,r1,800ad98 my_block -= FIRST_DOUBLY_INDIRECT; 800ad10: c9 8b 60 00 sub r12,r12,r11 singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; 800ad14: b9 60 10 00 mv r2,r11 800ad18: b9 80 08 00 mv r1,r12 800ad1c: f8 00 1e 06 calli 8012534 <__umodsi3> doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; 800ad20: b9 60 10 00 mv r2,r11 */ if ( my_block <= LAST_DOUBLY_INDIRECT ) { my_block -= FIRST_DOUBLY_INDIRECT; singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; 800ad24: b8 20 80 00 mv r16,r1 doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; 800ad28: b9 80 08 00 mv r1,r12 800ad2c: f8 00 1d f2 calli 80124f4 <__udivsi3> 800ad30: b8 20 10 00 mv r2,r1 p = info->doubly_indirect; 800ad34: 29 c3 00 5c lw r3,(r14+92) if ( malloc_it ) { 800ad38: 45 e0 00 3f be r15,r0,800ae34 if ( !p ) { 800ad3c: 44 60 00 4f be r3,r0,800ae78 if ( !p ) return 0; info->doubly_indirect = p; } p1 = (block_p *)p[ doubly ]; 800ad40: b4 42 10 00 add r2,r2,r2 800ad44: b4 42 10 00 add r2,r2,r2 800ad48: b4 62 10 00 add r2,r3,r2 800ad4c: 28 41 00 00 lw r1,(r2+0) if ( !p1 ) { 800ad50: 44 20 00 52 be r1,r0,800ae98 if ( !p1 ) return 0; p[ doubly ] = (block_p) p1; } return (block_p *)&p1[ singly ]; 800ad54: b6 10 68 00 add r13,r16,r16 800ad58: b5 ad 68 00 add r13,r13,r13 800ad5c: b4 2d 68 00 add r13,r1,r13 /* * This means the requested block number is out of range. */ return 0; } 800ad60: b9 a0 08 00 mv r1,r13 800ad64: 2b 9d 00 04 lw ra,(sp+4) 800ad68: 2b 8b 00 20 lw r11,(sp+32) 800ad6c: 2b 8c 00 1c lw r12,(sp+28) 800ad70: 2b 8d 00 18 lw r13,(sp+24) 800ad74: 2b 8e 00 14 lw r14,(sp+20) 800ad78: 2b 8f 00 10 lw r15,(sp+16) 800ad7c: 2b 90 00 0c lw r16,(sp+12) 800ad80: 2b 91 00 08 lw r17,(sp+8) 800ad84: 37 9c 00 24 addi sp,sp,36 800ad88: c3 a0 00 00 ret } return &info->indirect[ my_block ]; } if ( !p ) return 0; 800ad8c: 34 0d 00 00 mvi r13,0 info->indirect = p; } return &info->indirect[ my_block ]; } if ( !p ) 800ad90: 5d 6d ff d6 bne r11,r13,800ace8 <== ALWAYS TAKEN 800ad94: e3 ff ff f3 bi 800ad60 <== NOT EXECUTED } /* * Is the block number in the triply indirect portion? */ if ( my_block <= LAST_TRIPLY_INDIRECT ) { 800ad98: 36 01 00 01 addi r1,r16,1 800ad9c: b9 60 10 00 mv r2,r11 800ada0: f8 00 1d 70 calli 8012360 <__mulsi3> 800ada4: 34 21 ff ff addi r1,r1,-1 } /* * This means the requested block number is out of range. */ return 0; 800ada8: 34 0d 00 00 mvi r13,0 } /* * Is the block number in the triply indirect portion? */ if ( my_block <= LAST_TRIPLY_INDIRECT ) { 800adac: 55 81 ff ed bgu r12,r1,800ad60 <== NEVER TAKEN my_block -= FIRST_TRIPLY_INDIRECT; 800adb0: c9 90 80 00 sub r16,r12,r16 singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; 800adb4: b9 60 10 00 mv r2,r11 800adb8: ba 00 08 00 mv r1,r16 800adbc: f8 00 1d de calli 8012534 <__umodsi3> doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; 800adc0: b9 60 10 00 mv r2,r11 * 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; 800adc4: b8 20 60 00 mv r12,r1 doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; 800adc8: ba 00 08 00 mv r1,r16 800adcc: f8 00 1d ca calli 80124f4 <__udivsi3> triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS; 800add0: b9 60 10 00 mv r2,r11 */ 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; 800add4: b8 20 88 00 mv r17,r1 triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS; 800add8: f8 00 1d c7 calli 80124f4 <__udivsi3> doubly %= IMFS_MEMFILE_BLOCK_SLOTS; 800addc: b9 60 10 00 mv r2,r11 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; 800ade0: b8 20 80 00 mv r16,r1 doubly %= IMFS_MEMFILE_BLOCK_SLOTS; 800ade4: ba 20 08 00 mv r1,r17 800ade8: f8 00 1d d3 calli 8012534 <__umodsi3> 800adec: b8 20 58 00 mv r11,r1 p = info->triply_indirect; 800adf0: 29 c4 00 60 lw r4,(r14+96) if ( malloc_it ) { 800adf4: 45 e0 00 30 be r15,r0,800aeb4 if ( !p ) { 800adf8: 44 80 00 3e be r4,r0,800aef0 if ( !p ) return 0; info->triply_indirect = p; } p1 = (block_p *) p[ triply ]; 800adfc: b6 10 18 00 add r3,r16,r16 800ae00: b4 63 18 00 add r3,r3,r3 800ae04: b4 83 70 00 add r14,r4,r3 800ae08: 29 c1 00 00 lw r1,(r14+0) if ( !p1 ) { 800ae0c: 44 20 00 43 be r1,r0,800af18 if ( !p1 ) return 0; p[ triply ] = (block_p) p1; } p2 = (block_p *)p1[ doubly ]; 800ae10: b5 6b 10 00 add r2,r11,r11 800ae14: b4 42 10 00 add r2,r2,r2 800ae18: b4 22 58 00 add r11,r1,r2 800ae1c: 29 61 00 00 lw r1,(r11+0) if ( !p2 ) { 800ae20: 44 20 00 39 be r1,r0,800af04 p2 = memfile_alloc_block(); if ( !p2 ) return 0; p1[ doubly ] = (block_p) p2; } return (block_p *)&p2[ singly ]; 800ae24: b5 8c 68 00 add r13,r12,r12 800ae28: b5 ad 68 00 add r13,r13,r13 800ae2c: b4 2d 68 00 add r13,r1,r13 800ae30: e3 ff ff cc bi 800ad60 return (block_p *)&p1[ singly ]; } if ( !p ) return 0; 800ae34: 34 0d 00 00 mvi r13,0 } return (block_p *)&p1[ singly ]; } if ( !p ) 800ae38: 44 6d ff ca be r3,r13,800ad60 <== NEVER TAKEN return 0; p = (block_p *)p[ doubly ]; 800ae3c: b4 21 10 00 add r2,r1,r1 800ae40: b4 42 10 00 add r2,r2,r2 800ae44: b4 62 10 00 add r2,r3,r2 800ae48: 28 41 00 00 lw r1,(r2+0) if ( !p ) 800ae4c: 44 20 ff c5 be r1,r0,800ad60 <== NEVER TAKEN return 0; return (block_p *)&p[ singly ]; 800ae50: b6 10 80 00 add r16,r16,r16 800ae54: b6 10 80 00 add r16,r16,r16 800ae58: b4 30 68 00 add r13,r1,r16 800ae5c: e3 ff ff c1 bi 800ad60 p = info->indirect; if ( malloc_it ) { if ( !p ) { p = memfile_alloc_block(); 800ae60: fb ff ff 7c calli 800ac50 if ( !p ) return 0; 800ae64: 34 0d 00 00 mvi r13,0 if ( malloc_it ) { if ( !p ) { p = memfile_alloc_block(); if ( !p ) 800ae68: 44 2b ff be be r1,r11,800ad60 <== NEVER TAKEN return 0; info->indirect = p; 800ae6c: 59 c1 00 58 sw (r14+88),r1 800ae70: b8 20 58 00 mv r11,r1 800ae74: e3 ff ff 9d bi 800ace8 p = info->doubly_indirect; if ( malloc_it ) { if ( !p ) { p = memfile_alloc_block(); 800ae78: 5b 81 00 24 sw (sp+36),r1 800ae7c: fb ff ff 75 calli 800ac50 800ae80: b8 20 18 00 mv r3,r1 if ( !p ) return 0; 800ae84: 34 0d 00 00 mvi r13,0 p = info->doubly_indirect; if ( malloc_it ) { if ( !p ) { p = memfile_alloc_block(); if ( !p ) 800ae88: 2b 82 00 24 lw r2,(sp+36) 800ae8c: 44 20 ff b5 be r1,r0,800ad60 <== NEVER TAKEN return 0; info->doubly_indirect = p; 800ae90: 59 c1 00 5c sw (r14+92),r1 800ae94: e3 ff ff ab bi 800ad40 } p1 = (block_p *)p[ doubly ]; if ( !p1 ) { p1 = memfile_alloc_block(); 800ae98: 5b 82 00 24 sw (sp+36),r2 800ae9c: fb ff ff 6d calli 800ac50 if ( !p1 ) return 0; 800aea0: 34 0d 00 00 mvi r13,0 } p1 = (block_p *)p[ doubly ]; if ( !p1 ) { p1 = memfile_alloc_block(); if ( !p1 ) 800aea4: 2b 82 00 24 lw r2,(sp+36) 800aea8: 44 20 ff ae be r1,r0,800ad60 <== NEVER TAKEN return 0; p[ doubly ] = (block_p) p1; 800aeac: 58 41 00 00 sw (r2+0),r1 800aeb0: e3 ff ff a9 bi 800ad54 p1[ doubly ] = (block_p) p2; } return (block_p *)&p2[ singly ]; } if ( !p ) 800aeb4: 44 8d ff ab be r4,r13,800ad60 <== NEVER TAKEN return 0; p1 = (block_p *) p[ triply ]; 800aeb8: b6 10 80 00 add r16,r16,r16 800aebc: b6 10 80 00 add r16,r16,r16 800aec0: b4 90 20 00 add r4,r4,r16 800aec4: 28 81 00 00 lw r1,(r4+0) if ( !p1 ) 800aec8: 44 20 ff a6 be r1,r0,800ad60 <== NEVER TAKEN return 0; p2 = (block_p *)p1[ doubly ]; 800aecc: b5 6b 58 00 add r11,r11,r11 800aed0: b5 6b 58 00 add r11,r11,r11 800aed4: b4 2b 08 00 add r1,r1,r11 800aed8: 28 21 00 00 lw r1,(r1+0) if ( !p2 ) 800aedc: 44 20 ff a1 be r1,r0,800ad60 <== NEVER TAKEN return 0; return (block_p *)&p2[ singly ]; 800aee0: b5 8c 60 00 add r12,r12,r12 800aee4: b5 8c 60 00 add r12,r12,r12 800aee8: b4 2c 68 00 add r13,r1,r12 800aeec: e3 ff ff 9d bi 800ad60 p = info->triply_indirect; if ( malloc_it ) { if ( !p ) { p = memfile_alloc_block(); 800aef0: fb ff ff 58 calli 800ac50 800aef4: b8 20 20 00 mv r4,r1 if ( !p ) 800aef8: 44 20 ff 9a be r1,r0,800ad60 <== NEVER TAKEN return 0; info->triply_indirect = p; 800aefc: 59 c1 00 60 sw (r14+96),r1 800af00: e3 ff ff bf bi 800adfc p[ triply ] = (block_p) p1; } p2 = (block_p *)p1[ doubly ]; if ( !p2 ) { p2 = memfile_alloc_block(); 800af04: fb ff ff 53 calli 800ac50 if ( !p2 ) return 0; 800af08: 34 0d 00 00 mvi r13,0 } p2 = (block_p *)p1[ doubly ]; if ( !p2 ) { p2 = memfile_alloc_block(); if ( !p2 ) 800af0c: 44 20 ff 95 be r1,r0,800ad60 <== NEVER TAKEN return 0; p1[ doubly ] = (block_p) p2; 800af10: 59 61 00 00 sw (r11+0),r1 800af14: e3 ff ff c4 bi 800ae24 info->triply_indirect = p; } p1 = (block_p *) p[ triply ]; if ( !p1 ) { p1 = memfile_alloc_block(); 800af18: fb ff ff 4e calli 800ac50 if ( !p1 ) return 0; 800af1c: 34 0d 00 00 mvi r13,0 } p1 = (block_p *) p[ triply ]; if ( !p1 ) { p1 = memfile_alloc_block(); if ( !p1 ) 800af20: 44 20 ff 90 be r1,r0,800ad60 <== NEVER TAKEN return 0; p[ triply ] = (block_p) p1; 800af24: 59 c1 00 00 sw (r14+0),r1 800af28: e3 ff ff ba bi 800ae10 =============================================================================== 0800af2c : IMFS_jnode_t *the_jnode, off_t start, unsigned char *destination, unsigned int length ) { 800af2c: 37 9c ff cc addi sp,sp,-52 800af30: 5b 8b 00 28 sw (sp+40),r11 800af34: 5b 8c 00 24 sw (sp+36),r12 800af38: 5b 8d 00 20 sw (sp+32),r13 800af3c: 5b 8e 00 1c sw (sp+28),r14 800af40: 5b 8f 00 18 sw (sp+24),r15 800af44: 5b 90 00 14 sw (sp+20),r16 800af48: 5b 91 00 10 sw (sp+16),r17 800af4c: 5b 92 00 0c sw (sp+12),r18 800af50: 5b 93 00 08 sw (sp+8),r19 800af54: 5b 9d 00 04 sw (sp+4),ra * 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) { 800af58: 28 25 00 4c lw r5,(r1+76) IMFS_jnode_t *the_jnode, off_t start, unsigned char *destination, unsigned int length ) { 800af5c: b8 20 80 00 mv r16,r1 * Linear files (as created from a tar file are easier to handle * than block files). */ my_length = length; if (the_jnode->type == IMFS_LINEAR_FILE) { 800af60: 34 01 00 06 mvi r1,6 IMFS_jnode_t *the_jnode, off_t start, unsigned char *destination, unsigned int length ) { 800af64: b8 40 68 00 mv r13,r2 800af68: b8 60 90 00 mv r18,r3 * Linear files (as created from a tar file are easier to handle * than block files). */ my_length = length; if (the_jnode->type == IMFS_LINEAR_FILE) { 800af6c: 44 a1 00 57 be r5,r1,800b0c8 /* * If the last byte we are supposed to read is past the end of this * in memory file, then shorten the length to read. */ last_byte = start + length; if ( last_byte > the_jnode->info.file.size ) 800af70: 2a 01 00 50 lw r1,(r16+80) 800af74: 2a 0c 00 54 lw r12,(r16+84) /* * 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; 800af78: b4 82 10 00 add r2,r4,r2 if ( last_byte > the_jnode->info.file.size ) 800af7c: 48 01 00 04 bg r0,r1,800af8c <== NEVER TAKEN 800af80: 44 01 00 67 be r0,r1,800b11c <== ALWAYS TAKEN /* * Linear files (as created from a tar file are easier to handle * than block files). */ my_length = length; 800af84: b8 80 60 00 mv r12,r4 <== NOT EXECUTED 800af88: e0 00 00 02 bi 800af90 <== NOT EXECUTED * If the last byte we are supposed to read is past the end of this * in memory file, then shorten the length to read. */ last_byte = start + length; if ( last_byte > the_jnode->info.file.size ) my_length = the_jnode->info.file.size - start; 800af8c: c9 8d 60 00 sub r12,r12,r13 */ /* * Phase 1: possibly the last part of one block */ start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK; 800af90: 78 11 08 01 mvhi r17,0x801 800af94: 3a 31 46 e8 ori r17,r17,0x46e8 800af98: 2a 2b 00 00 lw r11,(r17+0) 800af9c: b9 a0 08 00 mv r1,r13 unsigned int last_byte; unsigned int copied; unsigned int start_offset; unsigned char *dest; dest = destination; 800afa0: ba 40 70 00 mv r14,r18 */ /* * Phase 1: possibly the last part of one block */ start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK; 800afa4: b9 60 10 00 mv r2,r11 800afa8: f8 00 1d 2a calli 8012450 <__modsi3> 800afac: b8 20 98 00 mv r19,r1 block = start / IMFS_MEMFILE_BYTES_PER_BLOCK; 800afb0: b9 60 10 00 mv r2,r11 800afb4: b9 a0 08 00 mv r1,r13 800afb8: f8 00 1c f6 calli 8012390 <__divsi3> 800afbc: b8 20 68 00 mv r13,r1 */ last_byte = start + length; if ( last_byte > the_jnode->info.file.size ) my_length = the_jnode->info.file.size - start; copied = 0; 800afc0: 34 0f 00 00 mvi r15,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 ) { 800afc4: 46 60 00 13 be r19,r0,800b010 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 ); 800afc8: ba 00 08 00 mv r1,r16 800afcc: b9 a0 10 00 mv r2,r13 800afd0: 34 03 00 00 mvi r3,0 800afd4: fb ff ff 2f calli 800ac90 if ( !block_ptr ) 800afd8: 44 20 00 2f be r1,r0,800b094 <== 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; 800afdc: c9 73 58 00 sub r11,r11,r19 800afe0: b9 80 78 00 mv r15,r12 800afe4: 51 6c 00 02 bgeu r11,r12,800afec 800afe8: b9 60 78 00 mv r15,r11 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 ); 800afec: 28 22 00 00 lw r2,(r1+0) 800aff0: b9 e0 18 00 mv r3,r15 800aff4: ba 40 08 00 mv r1,r18 800aff8: b4 53 10 00 add r2,r2,r19 800affc: f8 00 0a 2c calli 800d8ac dest += to_copy; block++; my_length -= to_copy; 800b000: 2a 2b 00 00 lw r11,(r17+0) 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 ); dest += to_copy; 800b004: b6 4f 70 00 add r14,r18,r15 block++; 800b008: 35 ad 00 01 addi r13,r13,1 my_length -= to_copy; 800b00c: c9 8f 60 00 sub r12,r12,r15 /* * Phase 2: all of zero of more blocks */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { 800b010: 55 6c 00 11 bgu r11,r12,800b054 block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); 800b014: b9 a0 10 00 mv r2,r13 800b018: 34 03 00 00 mvi r3,0 800b01c: ba 00 08 00 mv r1,r16 800b020: fb ff ff 1c calli 800ac90 800b024: b8 20 10 00 mv r2,r1 if ( !block_ptr ) return copied; memcpy( dest, &(*block_ptr)[ 0 ], to_copy ); 800b028: b9 60 18 00 mv r3,r11 800b02c: b9 c0 08 00 mv r1,r14 dest += to_copy; block++; my_length -= to_copy; 800b030: c9 8b 60 00 sub r12,r12,r11 * Phase 2: all of zero of more blocks */ 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 ) 800b034: 44 40 00 18 be r2,r0,800b094 <== NEVER TAKEN return copied; memcpy( dest, &(*block_ptr)[ 0 ], to_copy ); 800b038: 28 42 00 00 lw r2,(r2+0) dest += to_copy; 800b03c: b5 cb 70 00 add r14,r14,r11 block++; 800b040: 35 ad 00 01 addi r13,r13,1 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 ) return copied; memcpy( dest, &(*block_ptr)[ 0 ], to_copy ); 800b044: f8 00 0a 1a calli 800d8ac /* * Phase 2: all of zero of more blocks */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { 800b048: 2a 21 00 00 lw r1,(r17+0) return copied; memcpy( dest, &(*block_ptr)[ 0 ], to_copy ); dest += to_copy; block++; my_length -= to_copy; copied += to_copy; 800b04c: b5 eb 78 00 add r15,r15,r11 /* * Phase 2: all of zero of more blocks */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { 800b050: 51 81 ff f1 bgeu r12,r1,800b014 /* * Phase 3: possibly the first part of one block */ IMFS_assert( my_length < IMFS_MEMFILE_BYTES_PER_BLOCK ); if ( my_length ) { 800b054: 45 80 00 0b be r12,r0,800b080 block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); 800b058: ba 00 08 00 mv r1,r16 800b05c: b9 a0 10 00 mv r2,r13 800b060: 34 03 00 00 mvi r3,0 800b064: fb ff ff 0b calli 800ac90 if ( !block_ptr ) 800b068: 44 20 00 0b be r1,r0,800b094 <== NEVER TAKEN return copied; memcpy( dest, &(*block_ptr)[ 0 ], my_length ); 800b06c: 28 22 00 00 lw r2,(r1+0) 800b070: b9 80 18 00 mv r3,r12 800b074: b9 c0 08 00 mv r1,r14 800b078: f8 00 0a 0d calli 800d8ac copied += my_length; 800b07c: b5 ec 78 00 add r15,r15,r12 } IMFS_update_atime( the_jnode ); 800b080: 37 81 00 30 addi r1,sp,48 800b084: 34 02 00 00 mvi r2,0 800b088: fb ff d9 36 calli 8001560 800b08c: 2b 81 00 30 lw r1,(sp+48) 800b090: 5a 01 00 40 sw (r16+64),r1 return copied; } 800b094: b9 e0 08 00 mv r1,r15 800b098: 2b 9d 00 04 lw ra,(sp+4) 800b09c: 2b 8b 00 28 lw r11,(sp+40) 800b0a0: 2b 8c 00 24 lw r12,(sp+36) 800b0a4: 2b 8d 00 20 lw r13,(sp+32) 800b0a8: 2b 8e 00 1c lw r14,(sp+28) 800b0ac: 2b 8f 00 18 lw r15,(sp+24) 800b0b0: 2b 90 00 14 lw r16,(sp+20) 800b0b4: 2b 91 00 10 lw r17,(sp+16) 800b0b8: 2b 92 00 0c lw r18,(sp+12) 800b0bc: 2b 93 00 08 lw r19,(sp+8) 800b0c0: 37 9c 00 34 addi sp,sp,52 800b0c4: c3 a0 00 00 ret if (the_jnode->type == IMFS_LINEAR_FILE) { unsigned char *file_ptr; file_ptr = (unsigned char *)the_jnode->info.linearfile.direct; if (my_length > (the_jnode->info.linearfile.size - start)) 800b0c8: 2a 0b 00 54 lw r11,(r16+84) 800b0cc: 2a 0c 00 50 lw r12,(r16+80) 800b0d0: b8 40 08 00 mv r1,r2 800b0d4: 34 02 00 1f mvi r2,31 800b0d8: 5b 84 00 2c sw (sp+44),r4 800b0dc: c9 6d 78 00 sub r15,r11,r13 800b0e0: f8 00 1c 52 calli 8012228 <__ashrsi3> 800b0e4: f5 eb 10 00 cmpgu r2,r15,r11 800b0e8: c9 81 08 00 sub r1,r12,r1 800b0ec: c8 22 08 00 sub r1,r1,r2 800b0f0: 2b 84 00 2c lw r4,(sp+44) my_length = length; if (the_jnode->type == IMFS_LINEAR_FILE) { unsigned char *file_ptr; file_ptr = (unsigned char *)the_jnode->info.linearfile.direct; 800b0f4: 2a 02 00 58 lw r2,(r16+88) if (my_length > (the_jnode->info.linearfile.size - start)) 800b0f8: 48 01 00 04 bg r0,r1,800b108 <== NEVER TAKEN 800b0fc: 5c 01 00 02 bne r0,r1,800b104 <== NEVER TAKEN 800b100: 54 8f 00 02 bgu r4,r15,800b108 <== ALWAYS TAKEN /* * Linear files (as created from a tar file are easier to handle * than block files). */ my_length = length; 800b104: b8 80 78 00 mv r15,r4 <== 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); 800b108: b4 4d 10 00 add r2,r2,r13 800b10c: b9 e0 18 00 mv r3,r15 800b110: ba 40 08 00 mv r1,r18 800b114: f8 00 09 e6 calli 800d8ac 800b118: e3 ff ff da bi 800b080 /* * If the last byte we are supposed to read is past the end of this * in memory file, then shorten the length to read. */ last_byte = start + length; if ( last_byte > the_jnode->info.file.size ) 800b11c: 54 4c ff 9c bgu r2,r12,800af8c /* * Linear files (as created from a tar file are easier to handle * than block files). */ my_length = length; 800b120: b8 80 60 00 mv r12,r4 800b124: e3 ff ff 9b bi 800af90 =============================================================================== 0800b254 : * is better to stick to simple, easy to understand algorithms. */ int IMFS_memfile_remove( IMFS_jnode_t *the_jnode ) { 800b254: 37 9c ff dc addi sp,sp,-36 800b258: 5b 8b 00 24 sw (sp+36),r11 800b25c: 5b 8c 00 20 sw (sp+32),r12 800b260: 5b 8d 00 1c sw (sp+28),r13 800b264: 5b 8e 00 18 sw (sp+24),r14 800b268: 5b 8f 00 14 sw (sp+20),r15 800b26c: 5b 90 00 10 sw (sp+16),r16 800b270: 5b 91 00 0c sw (sp+12),r17 800b274: 5b 92 00 08 sw (sp+8),r18 800b278: 5b 9d 00 04 sw (sp+4),ra /* * 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; 800b27c: 78 0c 08 01 mvhi r12,0x801 800b280: 39 8c 46 e8 ori r12,r12,0x46e8 800b284: 29 8d 00 00 lw r13,(r12+0) * is better to stick to simple, easy to understand algorithms. */ int IMFS_memfile_remove( IMFS_jnode_t *the_jnode ) { 800b288: b8 20 78 00 mv r15,r1 * + doubly indirect * + triply indirect */ info = &the_jnode->info.file; if ( info->indirect ) { 800b28c: 28 21 00 58 lw r1,(r1+88) /* * 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; 800b290: 01 ad 00 01 srui r13,r13,1 800b294: 01 ad 00 01 srui r13,r13,1 * + doubly indirect * + triply indirect */ info = &the_jnode->info.file; if ( info->indirect ) { 800b298: 44 20 00 04 be r1,r0,800b2a8 memfile_free_blocks_in_table( &info->indirect, to_free ); 800b29c: 35 e1 00 58 addi r1,r15,88 800b2a0: b9 a0 10 00 mv r2,r13 800b2a4: fb ff ff ce calli 800b1dc } if ( info->doubly_indirect ) { 800b2a8: 29 e1 00 5c lw r1,(r15+92) 800b2ac: 44 20 00 19 be r1,r0,800b310 for ( i=0 ; i <== NEVER TAKEN if ( info->doubly_indirect[i] ) { 800b2c8: b4 42 10 00 add r2,r2,r2 800b2cc: b4 42 10 00 add r2,r2,r2 800b2d0: b4 22 08 00 add r1,r1,r2 800b2d4: 28 23 00 00 lw r3,(r1+0) if ( info->indirect ) { memfile_free_blocks_in_table( &info->indirect, to_free ); } if ( info->doubly_indirect ) { for ( i=0 ; idoubly_indirect[i] ) { memfile_free_blocks_in_table( 800b2dc: b9 a0 10 00 mv r2,r13 memfile_free_blocks_in_table( &info->indirect, to_free ); } if ( info->doubly_indirect ) { for ( i=0 ; idoubly_indirect[i] ) { 800b2e0: 44 60 00 02 be r3,r0,800b2e8 <== NEVER TAKEN memfile_free_blocks_in_table( 800b2e4: fb ff ff be calli 800b1dc if ( info->indirect ) { memfile_free_blocks_in_table( &info->indirect, to_free ); } if ( info->doubly_indirect ) { for ( i=0 ; i 800b2fc: 29 e1 00 5c lw r1,(r15+92) 800b300: e3 ff ff f2 bi 800b2c8 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 ); 800b304: 35 e1 00 5c addi r1,r15,92 800b308: b9 a0 10 00 mv r2,r13 800b30c: fb ff ff b4 calli 800b1dc } if ( info->triply_indirect ) { 800b310: 29 e1 00 60 lw r1,(r15+96) 800b314: 44 20 00 27 be r1,r0,800b3b0 for ( i=0 ; i <== NEVER TAKEN p = (block_p *) info->triply_indirect[i]; 800b328: 28 2e 00 00 lw r14,(r1+0) if ( !p ) /* ensure we have a valid pointer */ 800b32c: 34 10 00 04 mvi r16,4 } if ( info->triply_indirect ) { for ( i=0 ; itriply_indirect[i]; 800b330: 34 12 00 00 mvi r18,0 if ( !p ) /* ensure we have a valid pointer */ 800b334: 34 11 00 00 mvi r17,0 800b338: 45 c0 00 1b be r14,r0,800b3a4 <== NEVER TAKEN break; for ( j=0 ; j <== NEVER TAKEN 800b344: 34 03 00 00 mvi r3,0 800b348: 34 0b 00 00 mvi r11,0 if ( p[j] ) { 800b34c: b4 63 18 00 add r3,r3,r3 800b350: b4 63 18 00 add r3,r3,r3 800b354: b5 c3 08 00 add r1,r14,r3 800b358: 28 23 00 00 lw r3,(r1+0) if ( info->triply_indirect ) { for ( i=0 ; itriply_indirect[i]; if ( !p ) /* ensure we have a valid pointer */ break; for ( j=0 ; jtriply_indirect[i]; if ( !p ) /* ensure we have a valid pointer */ break; for ( j=0 ; j <== NEVER TAKEN memfile_free_blocks_in_table( (block_p **)&p[j], to_free); 800b368: fb ff ff 9d calli 800b1dc if ( info->triply_indirect ) { for ( i=0 ; itriply_indirect[i]; if ( !p ) /* ensure we have a valid pointer */ break; for ( j=0 ; j 800b380: 29 e1 00 60 lw r1,(r15+96) if ( p[j] ) { memfile_free_blocks_in_table( (block_p **)&p[j], to_free); } } memfile_free_blocks_in_table( 800b384: b4 32 08 00 add r1,r1,r18 800b388: b9 a0 10 00 mv r2,r13 800b38c: fb ff ff 94 calli 800b1dc memfile_free_blocks_in_table( &info->doubly_indirect, to_free ); } if ( info->triply_indirect ) { for ( i=0 ; i } } memfile_free_blocks_in_table( (block_p **)&info->triply_indirect[i], to_free ); } memfile_free_blocks_in_table( 800b3a4: 35 e1 00 60 addi r1,r15,96 800b3a8: b9 a0 10 00 mv r2,r13 800b3ac: fb ff ff 8c calli 800b1dc (block_p **)&info->triply_indirect, to_free ); } return 0; } 800b3b0: 34 01 00 00 mvi r1,0 800b3b4: 2b 9d 00 04 lw ra,(sp+4) 800b3b8: 2b 8b 00 24 lw r11,(sp+36) 800b3bc: 2b 8c 00 20 lw r12,(sp+32) 800b3c0: 2b 8d 00 1c lw r13,(sp+28) 800b3c4: 2b 8e 00 18 lw r14,(sp+24) 800b3c8: 2b 8f 00 14 lw r15,(sp+20) 800b3cc: 2b 90 00 10 lw r16,(sp+16) 800b3d0: 2b 91 00 0c lw r17,(sp+12) 800b3d4: 2b 92 00 08 lw r18,(sp+8) 800b3d8: 37 9c 00 24 addi sp,sp,36 800b3dc: c3 a0 00 00 ret } if ( info->triply_indirect ) { for ( i=0 ; itriply_indirect[i]; 800b3e0: 29 e1 00 60 lw r1,(r15+96) 800b3e4: 36 04 00 04 addi r4,r16,4 800b3e8: b4 30 18 00 add r3,r1,r16 800b3ec: 28 6e 00 00 lw r14,(r3+0) if ( !p ) /* ensure we have a valid pointer */ 800b3f0: 45 c0 ff ed be r14,r0,800b3a4 <== NEVER TAKEN } if ( info->triply_indirect ) { for ( i=0 ; itriply_indirect[i]; 800b3f4: ba 00 90 00 mv r18,r16 if ( !p ) /* ensure we have a valid pointer */ 800b3f8: b8 80 80 00 mv r16,r4 800b3fc: e3 ff ff d0 bi 800b33c =============================================================================== 0800b588 : IMFS_jnode_t *the_jnode, off_t start, const unsigned char *source, unsigned int length ) { 800b588: 37 9c ff cc addi sp,sp,-52 800b58c: 5b 8b 00 2c sw (sp+44),r11 800b590: 5b 8c 00 28 sw (sp+40),r12 800b594: 5b 8d 00 24 sw (sp+36),r13 800b598: 5b 8e 00 20 sw (sp+32),r14 800b59c: 5b 8f 00 1c sw (sp+28),r15 800b5a0: 5b 90 00 18 sw (sp+24),r16 800b5a4: 5b 91 00 14 sw (sp+20),r17 800b5a8: 5b 92 00 10 sw (sp+16),r18 800b5ac: 5b 93 00 0c sw (sp+12),r19 800b5b0: 5b 94 00 08 sw (sp+8),r20 800b5b4: 5b 9d 00 04 sw (sp+4),ra 800b5b8: b8 20 88 00 mv r17,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 ) { 800b5bc: 28 21 00 50 lw r1,(r1+80) IMFS_jnode_t *the_jnode, off_t start, const unsigned char *source, unsigned int length ) { 800b5c0: b8 40 60 00 mv r12,r2 800b5c4: b8 80 90 00 mv r18,r4 800b5c8: b8 60 98 00 mv r19,r3 /* * 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; 800b5cc: b4 82 10 00 add r2,r4,r2 if ( last_byte > the_jnode->info.file.size ) { 800b5d0: 48 01 00 57 bg r0,r1,800b72c <== NEVER TAKEN 800b5d4: 44 20 00 5e be r1,r0,800b74c <== ALWAYS TAKEN */ /* * Phase 1: possibly the last part of one block */ start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK; 800b5d8: 78 10 08 01 mvhi r16,0x801 800b5dc: 3a 10 46 e8 ori r16,r16,0x46e8 800b5e0: 2a 0b 00 00 lw r11,(r16+0) 800b5e4: b9 80 08 00 mv r1,r12 unsigned int last_byte; unsigned int start_offset; int copied; const unsigned char *src; src = source; 800b5e8: ba 60 70 00 mv r14,r19 */ /* * Phase 1: possibly the last part of one block */ start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK; 800b5ec: b9 60 10 00 mv r2,r11 800b5f0: f8 00 1b 98 calli 8012450 <__modsi3> 800b5f4: b8 20 a0 00 mv r20,r1 block = start / IMFS_MEMFILE_BYTES_PER_BLOCK; 800b5f8: b9 60 10 00 mv r2,r11 800b5fc: b9 80 08 00 mv r1,r12 800b600: f8 00 1b 64 calli 8012390 <__divsi3> 800b604: b8 20 68 00 mv r13,r1 if ( start_offset ) { 800b608: ba 40 60 00 mv r12,r18 status = IMFS_memfile_extend( the_jnode, last_byte ); if ( status ) rtems_set_errno_and_return_minus_one( ENOSPC ); } copied = 0; 800b60c: 34 0f 00 00 mvi r15,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 ) { 800b610: 5e 80 00 32 bne r20,r0,800b6d8 /* * Phase 2: all of zero of more blocks */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { 800b614: 55 6c 00 10 bgu r11,r12,800b654 block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); 800b618: b9 a0 10 00 mv r2,r13 800b61c: 34 03 00 00 mvi r3,0 800b620: ba 20 08 00 mv r1,r17 800b624: fb ff fd 9b calli 800ac90 if ( !block_ptr ) return copied; #if 0 fprintf(stdout, "write %d in %d: %*s\n", to_copy, block, to_copy, src ); #endif memcpy( &(*block_ptr)[ 0 ], src, to_copy ); 800b628: b9 c0 10 00 mv r2,r14 800b62c: b9 60 18 00 mv r3,r11 src += to_copy; block++; my_length -= to_copy; 800b630: c9 8b 60 00 sub r12,r12,r11 */ 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 ) 800b634: 44 20 00 3c be r1,r0,800b724 <== 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 ); 800b638: 28 21 00 00 lw r1,(r1+0) src += to_copy; 800b63c: b5 cb 70 00 add r14,r14,r11 block++; 800b640: 35 ad 00 01 addi r13,r13,1 if ( !block_ptr ) return copied; #if 0 fprintf(stdout, "write %d in %d: %*s\n", to_copy, block, to_copy, src ); #endif memcpy( &(*block_ptr)[ 0 ], src, to_copy ); 800b644: f8 00 08 9a calli 800d8ac /* * Phase 2: all of zero of more blocks */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { 800b648: 2a 01 00 00 lw r1,(r16+0) * 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( 800b64c: b5 eb 78 00 add r15,r15,r11 /* * Phase 2: all of zero of more blocks */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { 800b650: 51 81 ff f2 bgeu r12,r1,800b618 * 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 ) { 800b654: 45 80 00 0c be r12,r0,800b684 block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); 800b658: ba 20 08 00 mv r1,r17 800b65c: b9 a0 10 00 mv r2,r13 800b660: 34 03 00 00 mvi r3,0 800b664: fb ff fd 8b calli 800ac90 if ( !block_ptr ) 800b668: b9 e0 20 00 mv r4,r15 800b66c: 44 20 00 0d be r1,r0,800b6a0 <== 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 ); 800b670: 28 21 00 00 lw r1,(r1+0) 800b674: b9 c0 10 00 mv r2,r14 800b678: b9 80 18 00 mv r3,r12 800b67c: f8 00 08 8c calli 800d8ac my_length = 0; copied += to_copy; 800b680: b5 ec 78 00 add r15,r15,r12 } IMFS_mtime_ctime_update( the_jnode ); 800b684: 37 81 00 30 addi r1,sp,48 800b688: 34 02 00 00 mvi r2,0 800b68c: fb ff d7 b5 calli 8001560 800b690: 2b 81 00 30 lw r1,(sp+48) return copied; 800b694: b9 e0 20 00 mv r4,r15 memcpy( &(*block_ptr)[ 0 ], src, my_length ); my_length = 0; copied += to_copy; } IMFS_mtime_ctime_update( the_jnode ); 800b698: 5a 21 00 44 sw (r17+68),r1 800b69c: 5a 21 00 48 sw (r17+72),r1 return copied; } 800b6a0: b8 80 08 00 mv r1,r4 800b6a4: 2b 9d 00 04 lw ra,(sp+4) 800b6a8: 2b 8b 00 2c lw r11,(sp+44) 800b6ac: 2b 8c 00 28 lw r12,(sp+40) 800b6b0: 2b 8d 00 24 lw r13,(sp+36) 800b6b4: 2b 8e 00 20 lw r14,(sp+32) 800b6b8: 2b 8f 00 1c lw r15,(sp+28) 800b6bc: 2b 90 00 18 lw r16,(sp+24) 800b6c0: 2b 91 00 14 lw r17,(sp+20) 800b6c4: 2b 92 00 10 lw r18,(sp+16) 800b6c8: 2b 93 00 0c lw r19,(sp+12) 800b6cc: 2b 94 00 08 lw r20,(sp+8) 800b6d0: 37 9c 00 34 addi sp,sp,52 800b6d4: c3 a0 00 00 ret block = start / IMFS_MEMFILE_BYTES_PER_BLOCK; if ( start_offset ) { to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK - start_offset; if ( to_copy > my_length ) to_copy = my_length; block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); 800b6d8: ba 20 08 00 mv r1,r17 800b6dc: b9 a0 10 00 mv r2,r13 800b6e0: 34 03 00 00 mvi r3,0 800b6e4: fb ff fd 6b calli 800ac90 if ( !block_ptr ) return copied; 800b6e8: 34 04 00 00 mvi r4,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 ) 800b6ec: 44 20 ff ed be r1,r0,800b6a0 <== 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; 800b6f0: c9 74 78 00 sub r15,r11,r20 800b6f4: 52 4f 00 02 bgeu r18,r15,800b6fc 800b6f8: ba 40 78 00 mv r15,r18 block, to_copy, src ); #endif memcpy( &(*block_ptr)[ start_offset ], src, to_copy ); 800b6fc: 28 21 00 00 lw r1,(r1+0) 800b700: ba 60 10 00 mv r2,r19 800b704: b9 e0 18 00 mv r3,r15 800b708: b4 34 08 00 add r1,r1,r20 800b70c: f8 00 08 68 calli 800d8ac src += to_copy; 800b710: b6 6f 70 00 add r14,r19,r15 block++; my_length -= to_copy; copied += to_copy; 800b714: 2a 0b 00 00 lw r11,(r16+0) src ); #endif memcpy( &(*block_ptr)[ start_offset ], src, to_copy ); src += to_copy; block++; 800b718: 35 ad 00 01 addi r13,r13,1 my_length -= to_copy; 800b71c: ca 4f 60 00 sub r12,r18,r15 800b720: e3 ff ff bd bi 800b614 */ 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 ) 800b724: b9 e0 20 00 mv r4,r15 <== NOT EXECUTED 800b728: e3 ff ff de bi 800b6a0 <== NOT EXECUTED * in memory file, then extend the length. */ last_byte = start + my_length; if ( last_byte > the_jnode->info.file.size ) { status = IMFS_memfile_extend( the_jnode, last_byte ); 800b72c: ba 20 08 00 mv r1,r17 800b730: fb ff ff 40 calli 800b430 if ( status ) 800b734: 44 20 ff a9 be r1,r0,800b5d8 rtems_set_errno_and_return_minus_one( ENOSPC ); 800b738: f8 00 05 a7 calli 800cdd4 <__errno> 800b73c: 34 02 00 1c mvi r2,28 800b740: 58 22 00 00 sw (r1+0),r2 800b744: 34 04 ff ff mvi r4,-1 800b748: e3 ff ff d6 bi 800b6a0 * 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 ) { 800b74c: 2a 21 00 54 lw r1,(r17+84) 800b750: 54 41 ff f7 bgu r2,r1,800b72c <== ALWAYS TAKEN 800b754: e3 ff ff a1 bi 800b5d8 <== NOT EXECUTED =============================================================================== 08000c80 : #include int IMFS_mount( rtems_filesystem_mount_table_entry_t *mt_entry ) { 8000c80: 37 9c ff fc addi sp,sp,-4 8000c84: 5b 9d 00 04 sw (sp+4),ra IMFS_jnode_t *node; node = mt_entry->mt_point_node.node_access; 8000c88: 28 22 00 08 lw r2,(r1+8) /* * Is the node that we are mounting onto a directory node ? */ if ( node->type != IMFS_DIRECTORY ) 8000c8c: 34 03 00 01 mvi r3,1 8000c90: 28 44 00 4c lw r4,(r2+76) 8000c94: 5c 83 00 06 bne r4,r3,8000cac <== NEVER TAKEN /* * Set mt_fs pointer to point to the mount table entry for * the mounted file system. */ node->info.directory.mt_fs = mt_entry; 8000c98: 58 41 00 5c sw (r2+92),r1 return 0; 8000c9c: 34 01 00 00 mvi r1,0 } 8000ca0: 2b 9d 00 04 lw ra,(sp+4) 8000ca4: 37 9c 00 04 addi sp,sp,4 8000ca8: c3 a0 00 00 ret /* * Is the node that we are mounting onto a directory node ? */ if ( node->type != IMFS_DIRECTORY ) rtems_set_errno_and_return_minus_one( ENOTDIR ); 8000cac: f8 00 30 4a calli 800cdd4 <__errno> <== NOT EXECUTED 8000cb0: 34 02 00 14 mvi r2,20 <== NOT EXECUTED 8000cb4: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED 8000cb8: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED 8000cbc: e3 ff ff f9 bi 8000ca0 <== NOT EXECUTED =============================================================================== 080037ac : * This routine prints the contents of the specified jnode. */ void IMFS_print_jnode( IMFS_jnode_t *the_jnode ) { 80037ac: 37 9c ff f4 addi sp,sp,-12 80037b0: 5b 8b 00 0c sw (sp+12),r11 80037b4: 5b 8c 00 08 sw (sp+8),r12 80037b8: 5b 9d 00 04 sw (sp+4),ra IMFS_assert( the_jnode ); fprintf(stdout, "%s", the_jnode->name ); 80037bc: 78 0b 08 02 mvhi r11,0x802 80037c0: 39 6b 81 c0 ori r11,r11,0x81c0 80037c4: 29 62 00 00 lw r2,(r11+0) * This routine prints the contents of the specified jnode. */ void IMFS_print_jnode( IMFS_jnode_t *the_jnode ) { 80037c8: b8 20 60 00 mv r12,r1 IMFS_assert( the_jnode ); fprintf(stdout, "%s", the_jnode->name ); 80037cc: 34 21 00 0c addi r1,r1,12 80037d0: 28 42 00 08 lw r2,(r2+8) 80037d4: f8 00 3a 55 calli 8012128 switch( the_jnode->type ) { 80037d8: 29 83 00 4c lw r3,(r12+76) 80037dc: 34 01 00 07 mvi r1,7 80037e0: 54 61 00 36 bgu r3,r1,80038b8 <== NEVER TAKEN 80037e4: 78 02 08 02 mvhi r2,0x802 80037e8: b4 63 08 00 add r1,r3,r3 80037ec: 38 42 61 fc ori r2,r2,0x61fc 80037f0: b4 21 08 00 add r1,r1,r1 80037f4: b4 41 08 00 add r1,r2,r1 80037f8: 28 21 00 00 lw r1,(r1+0) 80037fc: c0 20 00 00 b r1 case IMFS_HARD_LINK: fprintf(stdout, " links not printed\n" ); return; case IMFS_SYM_LINK: fprintf(stdout, " links not printed\n" ); 8003800: 29 62 00 00 lw r2,(r11+0) 8003804: 78 01 08 02 mvhi r1,0x802 8003808: 34 03 00 13 mvi r3,19 800380c: 28 44 00 08 lw r4,(r2+8) 8003810: 38 21 61 48 ori r1,r1,0x6148 8003814: 34 02 00 01 mvi r2,1 8003818: f8 00 3d 6c calli 8012dc8 default: fprintf(stdout, " bad type %d\n", the_jnode->type ); return; } puts(""); } 800381c: 2b 9d 00 04 lw ra,(sp+4) 8003820: 2b 8b 00 0c lw r11,(sp+12) 8003824: 2b 8c 00 08 lw r12,(sp+8) 8003828: 37 9c 00 0c addi sp,sp,12 800382c: c3 a0 00 00 ret case IMFS_SYM_LINK: fprintf(stdout, " links not printed\n" ); return; case IMFS_FIFO: fprintf(stdout, " FIFO not printed\n" ); 8003830: 29 62 00 00 lw r2,(r11+0) 8003834: 78 01 08 02 mvhi r1,0x802 8003838: 34 03 00 12 mvi r3,18 800383c: 28 44 00 08 lw r4,(r2+8) 8003840: 38 21 61 5c ori r1,r1,0x615c 8003844: 34 02 00 01 mvi r2,1 8003848: f8 00 3d 60 calli 8012dc8 default: fprintf(stdout, " bad type %d\n", the_jnode->type ); return; } puts(""); } 800384c: 2b 9d 00 04 lw ra,(sp+4) 8003850: 2b 8b 00 0c lw r11,(sp+12) 8003854: 2b 8c 00 08 lw r12,(sp+8) 8003858: 37 9c 00 0c addi sp,sp,12 800385c: c3 a0 00 00 ret the_jnode->info.file.indirect, the_jnode->info.file.doubly_indirect, the_jnode->info.file.triply_indirect ); #else fprintf(stdout, " (file %" PRId32 ")", 8003860: 29 61 00 00 lw r1,(r11+0) 8003864: 29 83 00 54 lw r3,(r12+84) 8003868: 78 02 08 02 mvhi r2,0x802 800386c: 28 21 00 08 lw r1,(r1+8) 8003870: 38 42 61 3c ori r2,r2,0x613c 8003874: f8 00 39 c2 calli 8011f7c default: fprintf(stdout, " bad type %d\n", the_jnode->type ); return; } puts(""); 8003878: 78 01 08 02 mvhi r1,0x802 800387c: 38 21 5c e0 ori r1,r1,0x5ce0 8003880: f8 00 41 ed calli 8014034 } 8003884: 2b 9d 00 04 lw ra,(sp+4) 8003888: 2b 8b 00 0c lw r11,(sp+12) 800388c: 2b 8c 00 08 lw r12,(sp+8) 8003890: 37 9c 00 0c addi sp,sp,12 8003894: c3 a0 00 00 ret fprintf(stdout, " (device %" PRId32 ", %" PRId32 ")", the_jnode->info.device.major, the_jnode->info.device.minor ); break; case IMFS_LINEAR_FILE: fprintf(stdout, " (file %" PRId32 " %p)", 8003898: 29 61 00 00 lw r1,(r11+0) 800389c: 29 83 00 54 lw r3,(r12+84) 80038a0: 29 84 00 58 lw r4,(r12+88) 80038a4: 28 21 00 08 lw r1,(r1+8) 80038a8: 78 02 08 02 mvhi r2,0x802 80038ac: 38 42 61 2c ori r2,r2,0x612c 80038b0: f8 00 39 b3 calli 8011f7c (uint32_t)the_jnode->info.linearfile.size, the_jnode->info.linearfile.direct ); break; 80038b4: e3 ff ff f1 bi 8003878 case IMFS_FIFO: fprintf(stdout, " FIFO not printed\n" ); return; default: fprintf(stdout, " bad type %d\n", the_jnode->type ); 80038b8: 29 61 00 00 lw r1,(r11+0) <== NOT EXECUTED 80038bc: 78 02 08 02 mvhi r2,0x802 <== NOT EXECUTED 80038c0: 38 42 61 70 ori r2,r2,0x6170 <== NOT EXECUTED 80038c4: 28 21 00 08 lw r1,(r1+8) <== NOT EXECUTED 80038c8: f8 00 39 ad calli 8011f7c <== NOT EXECUTED return; } puts(""); } 80038cc: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 80038d0: 2b 8b 00 0c lw r11,(sp+12) <== NOT EXECUTED 80038d4: 2b 8c 00 08 lw r12,(sp+8) <== NOT EXECUTED 80038d8: 37 9c 00 0c addi sp,sp,12 <== NOT EXECUTED 80038dc: c3 a0 00 00 ret <== NOT EXECUTED IMFS_assert( the_jnode ); fprintf(stdout, "%s", the_jnode->name ); switch( the_jnode->type ) { case IMFS_DIRECTORY: fprintf(stdout, "/" ); 80038e0: 29 62 00 00 lw r2,(r11+0) 80038e4: 34 01 00 2f mvi r1,47 80038e8: 28 42 00 08 lw r2,(r2+8) 80038ec: f8 00 39 cb calli 8012018 break; 80038f0: e3 ff ff e2 bi 8003878 case IMFS_DEVICE: fprintf(stdout, " (device %" PRId32 ", %" PRId32 ")", 80038f4: 29 61 00 00 lw r1,(r11+0) 80038f8: 29 83 00 50 lw r3,(r12+80) 80038fc: 29 84 00 54 lw r4,(r12+84) 8003900: 28 21 00 08 lw r1,(r1+8) 8003904: 78 02 08 02 mvhi r2,0x802 8003908: 38 42 61 18 ori r2,r2,0x6118 800390c: f8 00 39 9c calli 8011f7c the_jnode->info.device.major, the_jnode->info.device.minor ); break; 8003910: e3 ff ff da bi 8003878 =============================================================================== 08000ccc : ) { IMFS_jnode_t *node; ssize_t i; node = loc->node_access; 8000ccc: 28 25 00 00 lw r5,(r1+0) IMFS_assert( node->type == IMFS_SYM_LINK ); for( i=0; ((iinfo.sym_link.name[i] != '\0')); i++ ) 8000cd0: 34 01 00 00 mvi r1,0 8000cd4: 44 60 00 0e be r3,r0,8000d0c <== NEVER TAKEN 8000cd8: 28 a4 00 50 lw r4,(r5+80) 8000cdc: 40 84 00 00 lbu r4,(r4+0) 8000ce0: 44 80 00 0b be r4,r0,8000d0c <== NEVER TAKEN 8000ce4: 34 06 00 00 mvi r6,0 buf[i] = node->info.sym_link.name[i]; 8000ce8: b4 46 30 00 add r6,r2,r6 8000cec: 30 c4 00 00 sb (r6+0),r4 node = loc->node_access; IMFS_assert( node->type == IMFS_SYM_LINK ); for( i=0; ((iinfo.sym_link.name[i] != '\0')); i++ ) 8000cf0: 34 21 00 01 addi r1,r1,1 8000cf4: b8 20 30 00 mv r6,r1 8000cf8: 50 23 00 05 bgeu r1,r3,8000d0c 8000cfc: 28 a4 00 50 lw r4,(r5+80) 8000d00: b4 81 20 00 add r4,r4,r1 8000d04: 40 84 00 00 lbu r4,(r4+0) 8000d08: 5c 80 ff f8 bne r4,r0,8000ce8 buf[i] = node->info.sym_link.name[i]; return i; } 8000d0c: c3 a0 00 00 ret =============================================================================== 08000d10 : 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 */ ) { 8000d10: 37 9c ff ec addi sp,sp,-20 8000d14: 5b 8b 00 0c sw (sp+12),r11 8000d18: 5b 8c 00 08 sw (sp+8),r12 8000d1c: 5b 9d 00 04 sw (sp+4),ra IMFS_jnode_t *the_jnode; IMFS_jnode_t *new_parent; the_jnode = old_loc->node_access; 8000d20: 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 */ ) { 8000d24: 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 ); 8000d28: b8 80 10 00 mv r2,r4 8000d2c: 35 61 00 0c addi r1,r11,12 8000d30: 34 03 00 20 mvi r3,32 8000d34: f8 00 34 f8 calli 800e114 if ( the_jnode->Parent != NULL ) 8000d38: 29 61 00 08 lw r1,(r11+8) 8000d3c: 44 20 00 03 be r1,r0,8000d48 <== NEVER TAKEN */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); 8000d40: b9 60 08 00 mv r1,r11 8000d44: f8 00 0a e7 calli 80038e0 <_Chain_Extract> rtems_chain_extract( (rtems_chain_node *) the_jnode ); new_parent = new_parent_loc->node_access; 8000d48: 29 83 00 00 lw r3,(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 ); 8000d4c: b9 60 10 00 mv r2,r11 8000d50: 34 61 00 50 addi r1,r3,80 the_jnode->Parent = new_parent; 8000d54: 59 63 00 08 sw (r11+8),r3 8000d58: f8 00 0a d6 calli 80038b0 <_Chain_Append> rtems_chain_append( &new_parent->info.directory.Entries, &the_jnode->Node ); /* * Update the time. */ IMFS_update_ctime( the_jnode ); 8000d5c: 37 81 00 10 addi r1,sp,16 8000d60: 34 02 00 00 mvi r2,0 8000d64: f8 00 01 ff calli 8001560 8000d68: 2b 82 00 10 lw r2,(sp+16) return 0; } 8000d6c: 34 01 00 00 mvi r1,0 rtems_chain_append( &new_parent->info.directory.Entries, &the_jnode->Node ); /* * Update the time. */ IMFS_update_ctime( the_jnode ); 8000d70: 59 62 00 48 sw (r11+72),r2 return 0; } 8000d74: 2b 9d 00 04 lw ra,(sp+4) 8000d78: 2b 8b 00 0c lw r11,(sp+12) 8000d7c: 2b 8c 00 08 lw r12,(sp+8) 8000d80: 37 9c 00 14 addi sp,sp,20 8000d84: c3 a0 00 00 ret =============================================================================== 08008364 : int IMFS_stat( rtems_filesystem_location_info_t *loc, struct stat *buf ) { 8008364: 37 9c ff f8 addi sp,sp,-8 8008368: 5b 8b 00 08 sw (sp+8),r11 800836c: 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; 8008370: 28 23 00 00 lw r3,(r1+0) switch ( the_jnode->type ) { 8008374: 34 05 00 07 mvi r5,7 8008378: 28 64 00 4c lw r4,(r3+76) 800837c: 54 85 00 29 bgu r4,r5,8008420 <== NEVER TAKEN 8008380: 78 05 08 01 mvhi r5,0x801 8008384: b4 84 20 00 add r4,r4,r4 8008388: 38 a5 38 a8 ori r5,r5,0x38a8 800838c: b4 84 20 00 add r4,r4,r4 8008390: b4 a4 20 00 add r4,r5,r4 8008394: 28 84 00 00 lw r4,(r4+0) 8008398: c0 80 00 00 b r4 case IMFS_SYM_LINK: buf->st_size = 0; break; case IMFS_FIFO: buf->st_size = 0; 800839c: 58 40 00 20 sw (r2+32),r0 /* * The device number of the IMFS is the major number and the minor is the * instance. */ fs_info = loc->mt_entry->fs_info; 80083a0: 28 21 00 10 lw r1,(r1+16) buf->st_dev = rtems_filesystem_make_dev_t( IMFS_DEVICE_MAJOR_NUMBER, fs_info->instance ); buf->st_mode = the_jnode->st_mode; 80083a4: 28 6a 00 30 lw r10,(r3+48) buf->st_nlink = the_jnode->st_nlink; 80083a8: 2c 69 00 34 lhu r9,(r3+52) * The device number of the IMFS is the major number and the minor is the * instance. */ fs_info = loc->mt_entry->fs_info; buf->st_dev = rtems_filesystem_make_dev_t( IMFS_DEVICE_MAJOR_NUMBER, fs_info->instance ); 80083ac: 28 21 00 34 lw r1,(r1+52) buf->st_mode = the_jnode->st_mode; buf->st_nlink = the_jnode->st_nlink; buf->st_ino = the_jnode->st_ino; 80083b0: 28 68 00 38 lw r8,(r3+56) buf->st_uid = the_jnode->st_uid; 80083b4: 2c 67 00 3c lhu r7,(r3+60) * The device number of the IMFS is the major number and the minor is the * instance. */ fs_info = loc->mt_entry->fs_info; buf->st_dev = rtems_filesystem_make_dev_t( IMFS_DEVICE_MAJOR_NUMBER, fs_info->instance ); 80083b8: 28 2b 00 00 lw r11,(r1+0) buf->st_mode = the_jnode->st_mode; buf->st_nlink = the_jnode->st_nlink; buf->st_ino = the_jnode->st_ino; buf->st_uid = the_jnode->st_uid; buf->st_gid = the_jnode->st_gid; 80083bc: 2c 66 00 3e lhu r6,(r3+62) buf->st_atime = the_jnode->stat_atime; 80083c0: 28 65 00 40 lw r5,(r3+64) buf->st_mtime = the_jnode->stat_mtime; 80083c4: 28 64 00 44 lw r4,(r3+68) buf->st_ctime = the_jnode->stat_ctime; 80083c8: 28 63 00 48 lw r3,(r3+72) rtems_device_minor_number _minor ) { union __rtems_dev_t temp; temp.__overlay.major = _major; 80083cc: 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 = 80083d0: 58 41 00 00 sw (r2+0),r1 buf->st_atime = the_jnode->stat_atime; buf->st_mtime = the_jnode->stat_mtime; buf->st_ctime = the_jnode->stat_ctime; return 0; 80083d4: 34 01 00 00 mvi r1,0 /* * The device number of the IMFS is the major number and the minor is the * instance. */ fs_info = loc->mt_entry->fs_info; buf->st_dev = 80083d8: 58 4b 00 04 sw (r2+4),r11 rtems_filesystem_make_dev_t( IMFS_DEVICE_MAJOR_NUMBER, fs_info->instance ); buf->st_mode = the_jnode->st_mode; 80083dc: 58 4a 00 0c sw (r2+12),r10 buf->st_nlink = the_jnode->st_nlink; 80083e0: 0c 49 00 10 sh (r2+16),r9 buf->st_ino = the_jnode->st_ino; 80083e4: 58 48 00 08 sw (r2+8),r8 buf->st_uid = the_jnode->st_uid; 80083e8: 0c 47 00 12 sh (r2+18),r7 buf->st_gid = the_jnode->st_gid; 80083ec: 0c 46 00 14 sh (r2+20),r6 buf->st_atime = the_jnode->stat_atime; 80083f0: 58 45 00 24 sw (r2+36),r5 buf->st_mtime = the_jnode->stat_mtime; 80083f4: 58 44 00 2c sw (r2+44),r4 buf->st_ctime = the_jnode->stat_ctime; 80083f8: 58 43 00 34 sw (r2+52),r3 return 0; } 80083fc: 2b 9d 00 04 lw ra,(sp+4) 8008400: 2b 8b 00 08 lw r11,(sp+8) 8008404: 37 9c 00 08 addi sp,sp,8 8008408: c3 a0 00 00 ret switch ( the_jnode->type ) { case IMFS_DEVICE: io = &the_jnode->info.device; buf->st_rdev = rtems_filesystem_make_dev_t( io->major, io->minor ); 800840c: 28 65 00 54 lw r5,(r3+84) 8008410: 28 64 00 50 lw r4,(r3+80) 8008414: 58 45 00 1c sw (r2+28),r5 8008418: 58 44 00 18 sw (r2+24),r4 break; 800841c: e3 ff ff e1 bi 80083a0 case IMFS_FIFO: buf->st_size = 0; break; default: rtems_set_errno_and_return_minus_one( ENOTSUP ); 8008420: f8 00 12 6d calli 800cdd4 <__errno> 8008424: 34 02 00 86 mvi r2,134 8008428: 58 22 00 00 sw (r1+0),r2 800842c: 34 01 ff ff mvi r1,-1 buf->st_atime = the_jnode->stat_atime; buf->st_mtime = the_jnode->stat_mtime; buf->st_ctime = the_jnode->stat_ctime; return 0; } 8008430: 2b 9d 00 04 lw ra,(sp+4) 8008434: 2b 8b 00 08 lw r11,(sp+8) 8008438: 37 9c 00 08 addi sp,sp,8 800843c: c3 a0 00 00 ret buf->st_rdev = rtems_filesystem_make_dev_t( io->major, io->minor ); break; case IMFS_LINEAR_FILE: case IMFS_MEMORY_FILE: buf->st_size = the_jnode->info.file.size; 8008440: 28 64 00 54 lw r4,(r3+84) 8008444: 58 44 00 20 sw (r2+32),r4 break; 8008448: e3 ff ff d6 bi 80083a0 =============================================================================== 08000e38 : int IMFS_unlink( rtems_filesystem_location_info_t *parentloc, /* IN */ rtems_filesystem_location_info_t *loc /* IN */ ) { 8000e38: 37 9c ff d0 addi sp,sp,-48 8000e3c: 5b 8b 00 14 sw (sp+20),r11 8000e40: 5b 8c 00 10 sw (sp+16),r12 8000e44: 5b 8d 00 0c sw (sp+12),r13 8000e48: 5b 8e 00 08 sw (sp+8),r14 8000e4c: 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; 8000e50: 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 */ ) { 8000e54: b8 40 58 00 mv r11,r2 8000e58: 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 ) { 8000e5c: 29 82 00 4c lw r2,(r12+76) 8000e60: 34 01 00 03 mvi r1,3 8000e64: 44 41 00 0f be r2,r1,8000ea0 /* * Now actually free the node we were asked to free. */ result = (*loc->handlers->rmnod_h)( parentloc, loc ); 8000e68: 29 63 00 08 lw r3,(r11+8) 8000e6c: b9 60 10 00 mv r2,r11 8000e70: b9 a0 08 00 mv r1,r13 8000e74: 28 63 00 34 lw r3,(r3+52) 8000e78: d8 60 00 00 call r3 8000e7c: b8 20 10 00 mv r2,r1 return result; } 8000e80: b8 40 08 00 mv r1,r2 8000e84: 2b 9d 00 04 lw ra,(sp+4) 8000e88: 2b 8b 00 14 lw r11,(sp+20) 8000e8c: 2b 8c 00 10 lw r12,(sp+16) 8000e90: 2b 8d 00 0c lw r13,(sp+12) 8000e94: 2b 8e 00 08 lw r14,(sp+8) 8000e98: 37 9c 00 30 addi sp,sp,48 8000e9c: c3 a0 00 00 ret * free the node. */ if ( node->type == IMFS_HARD_LINK ) { if ( !node->info.hard_link.link_node ) 8000ea0: 29 83 00 50 lw r3,(r12+80) 8000ea4: 44 60 00 22 be r3,r0,8000f2c <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); the_link = *loc; 8000ea8: 29 64 00 0c lw r4,(r11+12) 8000eac: 29 66 00 04 lw r6,(r11+4) 8000eb0: 29 65 00 08 lw r5,(r11+8) 8000eb4: 29 62 00 10 lw r2,(r11+16) the_link.node_access = node->info.hard_link.link_node; IMFS_Set_handlers( &the_link ); 8000eb8: 37 8e 00 18 addi r14,sp,24 8000ebc: 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; 8000ec0: 5b 84 00 24 sw (sp+36),r4 the_link.node_access = node->info.hard_link.link_node; 8000ec4: 5b 83 00 18 sw (sp+24),r3 if ( node->type == IMFS_HARD_LINK ) { if ( !node->info.hard_link.link_node ) rtems_set_errno_and_return_minus_one( EINVAL ); the_link = *loc; 8000ec8: 5b 86 00 1c sw (sp+28),r6 8000ecc: 5b 85 00 20 sw (sp+32),r5 8000ed0: 5b 82 00 28 sw (sp+40),r2 the_link.node_access = node->info.hard_link.link_node; IMFS_Set_handlers( &the_link ); 8000ed4: f8 00 19 f3 calli 80076a0 /* * 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) 8000ed8: 29 83 00 50 lw r3,(r12+80) 8000edc: 34 01 00 01 mvi r1,1 8000ee0: 2c 64 00 34 lhu r4,(r3+52) 8000ee4: 44 81 00 0a be r4,r1,8000f0c if ( result != 0 ) return -1; } else { node->info.hard_link.link_node->st_nlink --; 8000ee8: 34 84 ff ff addi r4,r4,-1 IMFS_update_ctime( node->info.hard_link.link_node ); 8000eec: 34 02 00 00 mvi r2,0 if ( result != 0 ) return -1; } else { node->info.hard_link.link_node->st_nlink --; 8000ef0: 0c 64 00 34 sh (r3+52),r4 IMFS_update_ctime( node->info.hard_link.link_node ); 8000ef4: 37 81 00 2c addi r1,sp,44 8000ef8: f8 00 01 9a calli 8001560 8000efc: 29 81 00 50 lw r1,(r12+80) 8000f00: 2b 82 00 2c lw r2,(sp+44) 8000f04: 58 22 00 48 sw (r1+72),r2 8000f08: e3 ff ff d8 bi 8000e68 * to remove the node that is a link and the node itself. */ if ( node->info.hard_link.link_node->st_nlink == 1) { result = (*the_link.handlers->rmnod_h)( parentloc, &the_link ); 8000f0c: 2b 83 00 20 lw r3,(sp+32) 8000f10: b9 c0 10 00 mv r2,r14 8000f14: b9 a0 08 00 mv r1,r13 8000f18: 28 63 00 34 lw r3,(r3+52) 8000f1c: d8 60 00 00 call r3 if ( result != 0 ) return -1; 8000f20: 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 ) 8000f24: 44 20 ff d1 be r1,r0,8000e68 8000f28: e3 ff ff d6 bi 8000e80 */ if ( node->type == IMFS_HARD_LINK ) { if ( !node->info.hard_link.link_node ) rtems_set_errno_and_return_minus_one( EINVAL ); 8000f2c: f8 00 2f aa calli 800cdd4 <__errno> <== NOT EXECUTED 8000f30: 34 02 00 16 mvi r2,22 <== NOT EXECUTED 8000f34: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED 8000f38: 34 02 ff ff mvi r2,-1 <== NOT EXECUTED 8000f3c: e3 ff ff d1 bi 8000e80 <== NOT EXECUTED =============================================================================== 08000f40 : #include int IMFS_unmount( rtems_filesystem_mount_table_entry_t *mt_entry ) { 8000f40: 37 9c ff fc addi sp,sp,-4 8000f44: 5b 9d 00 04 sw (sp+4),ra IMFS_jnode_t *node; node = mt_entry->mt_point_node.node_access; 8000f48: 28 21 00 08 lw r1,(r1+8) /* * Is the node that we are mounting onto a directory node ? */ if ( node->type != IMFS_DIRECTORY ) 8000f4c: 34 02 00 01 mvi r2,1 8000f50: 28 23 00 4c lw r3,(r1+76) 8000f54: 5c 62 00 08 bne r3,r2,8000f74 <== NEVER TAKEN /* * Did the node indicate that there was a directory mounted here? */ if ( node->info.directory.mt_fs == NULL ) 8000f58: 28 22 00 5c lw r2,(r1+92) 8000f5c: 44 40 00 0b be r2,r0,8000f88 <== NEVER TAKEN /* * Set the mt_fs pointer to indicate that there is no longer * a file system mounted to this point. */ node->info.directory.mt_fs = NULL; 8000f60: 58 20 00 5c sw (r1+92),r0 return 0; 8000f64: 34 01 00 00 mvi r1,0 } 8000f68: 2b 9d 00 04 lw ra,(sp+4) 8000f6c: 37 9c 00 04 addi sp,sp,4 8000f70: c3 a0 00 00 ret /* * Is the node that we are mounting onto a directory node ? */ if ( node->type != IMFS_DIRECTORY ) rtems_set_errno_and_return_minus_one( ENOTDIR ); 8000f74: f8 00 2f 98 calli 800cdd4 <__errno> <== NOT EXECUTED 8000f78: 34 02 00 14 mvi r2,20 <== NOT EXECUTED 8000f7c: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED 8000f80: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED 8000f84: e3 ff ff f9 bi 8000f68 <== NOT EXECUTED /* * Did the node indicate that there was a directory mounted here? */ if ( node->info.directory.mt_fs == NULL ) rtems_set_errno_and_return_minus_one( EINVAL ); /* XXX */ 8000f88: f8 00 2f 93 calli 800cdd4 <__errno> <== NOT EXECUTED 8000f8c: 34 02 00 16 mvi r2,22 <== NOT EXECUTED 8000f90: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED 8000f94: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED 8000f98: e3 ff ff f4 bi 8000f68 <== NOT EXECUTED =============================================================================== 0800179c : void RTEMS_Malloc_Initialize( void *heap_begin, uintptr_t heap_size, size_t sbrk_amount ) { 800179c: 37 9c ff ec addi sp,sp,-20 80017a0: 5b 8b 00 14 sw (sp+20),r11 80017a4: 5b 8c 00 10 sw (sp+16),r12 80017a8: 5b 8d 00 0c sw (sp+12),r13 80017ac: 5b 8e 00 08 sw (sp+8),r14 80017b0: 5b 9d 00 04 sw (sp+4),ra /* * If configured, initialize the statistics support */ if ( rtems_malloc_statistics_helpers != NULL ) { 80017b4: 78 04 08 01 mvhi r4,0x801 80017b8: 38 84 46 a0 ori r4,r4,0x46a0 80017bc: 28 84 00 00 lw r4,(r4+0) void RTEMS_Malloc_Initialize( void *heap_begin, uintptr_t heap_size, size_t sbrk_amount ) { 80017c0: b8 20 68 00 mv r13,r1 80017c4: b8 40 70 00 mv r14,r2 80017c8: b8 60 58 00 mv r11,r3 /* * If configured, initialize the statistics support */ if ( rtems_malloc_statistics_helpers != NULL ) { 80017cc: 44 80 00 03 be r4,r0,80017d8 (*rtems_malloc_statistics_helpers->initialize)(); 80017d0: 28 81 00 00 lw r1,(r4+0) 80017d4: d8 20 00 00 call r1 } /* * Initialize the garbage collection list to start with nothing on it. */ malloc_deferred_frees_initialize(); 80017d8: fb ff ff d2 calli 8001720 /* * Initialize the optional sbrk support for extending the heap */ if ( rtems_malloc_sbrk_helpers != NULL ) { 80017dc: 78 04 08 01 mvhi r4,0x801 80017e0: 38 84 46 a4 ori r4,r4,0x46a4 80017e4: 28 81 00 00 lw r1,(r4+0) 80017e8: 44 20 00 07 be r1,r0,8001804 heap_begin = (*rtems_malloc_sbrk_helpers->initialize)( 80017ec: 28 23 00 00 lw r3,(r1+0) 80017f0: b9 60 10 00 mv r2,r11 80017f4: b9 a0 08 00 mv r1,r13 80017f8: d8 60 00 00 call r3 80017fc: b8 20 68 00 mv r13,r1 heap_begin, sbrk_amount ); heap_size = (uintptr_t) sbrk_amount; 8001800: b9 60 70 00 mv r14,r11 * of the time under UNIX because zero'ing memory when it is first * given to a process eliminates the chance of a process seeing data * left over from another process. This would be a security violation. */ if ( 8001804: 78 0c 08 01 mvhi r12,0x801 8001808: 39 8c 46 9c ori r12,r12,0x469c 800180c: 41 82 00 00 lbu r2,(r12+0) 8001810: 78 0b 08 01 mvhi r11,0x801 8001814: 39 6b 40 1c ori r11,r11,0x401c 8001818: 5c 40 00 0d bne r2,r0,800184c !rtems_unified_work_area && rtems_configuration_get_do_zero_of_workspace() 800181c: 78 01 08 01 mvhi r1,0x801 8001820: 38 21 40 c4 ori r1,r1,0x40c4 8001824: 40 21 00 2c lbu r1,(r1+44) 8001828: 5c 22 00 17 bne r1,r2,8001884 void *area_begin, uintptr_t area_size, uintptr_t page_size ) { return _Heap_Initialize( heap, area_begin, area_size, page_size ); 800182c: 78 0b 08 01 mvhi r11,0x801 8001830: 39 6b 40 1c ori r11,r11,0x401c 8001834: 29 61 00 00 lw r1,(r11+0) 8001838: b9 a0 10 00 mv r2,r13 800183c: b9 c0 18 00 mv r3,r14 8001840: 34 04 00 08 mvi r4,8 8001844: f8 00 0a 3e calli 800413c <_Heap_Initialize> RTEMS_Malloc_Heap, heap_begin, heap_size, CPU_HEAP_ALIGNMENT ); if ( status == 0 ) { 8001848: 44 20 00 17 be r1,r0,80018a4 rtems_fatal_error_occurred( RTEMS_NO_MEMORY ); } } MSBUMP( space_available, _Protected_heap_Get_size(RTEMS_Malloc_Heap) ); 800184c: 78 0c 08 01 mvhi r12,0x801 8001850: 39 8c 47 88 ori r12,r12,0x4788 8001854: 29 61 00 00 lw r1,(r11+0) 8001858: 29 8b 00 00 lw r11,(r12+0) 800185c: f8 00 0d a9 calli 8004f00 <_Protected_heap_Get_size> 8001860: b4 2b 08 00 add r1,r1,r11 8001864: 59 81 00 00 sw (r12+0),r1 } 8001868: 2b 9d 00 04 lw ra,(sp+4) 800186c: 2b 8b 00 14 lw r11,(sp+20) 8001870: 2b 8c 00 10 lw r12,(sp+16) 8001874: 2b 8d 00 0c lw r13,(sp+12) 8001878: 2b 8e 00 08 lw r14,(sp+8) 800187c: 37 9c 00 14 addi sp,sp,20 8001880: c3 a0 00 00 ret if ( !rtems_unified_work_area && rtems_configuration_get_do_zero_of_workspace() ) { memset( heap_begin, 0, heap_size ); 8001884: b9 a0 08 00 mv r1,r13 8001888: b9 c0 18 00 mv r3,r14 800188c: f8 00 30 49 calli 800d9b0 * Unfortunately we cannot use assert if this fails because if this * has failed we do not have a heap and if we do not have a heap * STDIO cannot work because there will be no buffers. */ if ( !rtems_unified_work_area ) { 8001890: 41 81 00 00 lbu r1,(r12+0) 8001894: 78 0b 08 01 mvhi r11,0x801 8001898: 39 6b 40 1c ori r11,r11,0x401c 800189c: 44 20 ff e4 be r1,r0,800182c <== ALWAYS TAKEN 80018a0: e3 ff ff eb bi 800184c <== NOT EXECUTED heap_begin, heap_size, CPU_HEAP_ALIGNMENT ); if ( status == 0 ) { rtems_fatal_error_occurred( RTEMS_NO_MEMORY ); 80018a4: 34 01 00 1a mvi r1,26 80018a8: f8 00 06 e9 calli 800344c =============================================================================== 0800111c : static rtems_printk_plugin_t print_handler; void Stack_check_Dump_threads_usage( Thread_Control *the_thread ) { 800111c: 37 9c ff d0 addi sp,sp,-48 8001120: 5b 8b 00 28 sw (sp+40),r11 8001124: 5b 8c 00 24 sw (sp+36),r12 8001128: 5b 8d 00 20 sw (sp+32),r13 800112c: 5b 8e 00 1c sw (sp+28),r14 8001130: 5b 8f 00 18 sw (sp+24),r15 8001134: 5b 90 00 14 sw (sp+20),r16 8001138: 5b 91 00 10 sw (sp+16),r17 800113c: 5b 92 00 0c sw (sp+12),r18 8001140: 5b 93 00 08 sw (sp+8),r19 8001144: 5b 9d 00 04 sw (sp+4),ra /* * Obtain interrupt stack information */ #if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) if (the_thread == (Thread_Control *) -1) { 8001148: 34 02 ff ff mvi r2,-1 800114c: 44 22 00 62 be r1,r2,80012d4 current = 0; } else #endif { stack = &the_thread->Start.Initial_stack; current = (void *)_CPU_Context_Get_SP( &the_thread->Registers ); 8001150: 28 31 01 08 lw r17,(r1+264) 8001154: 28 27 00 bc lw r7,(r1+188) the_thread = 0; current = 0; } else #endif { stack = &the_thread->Start.Initial_stack; 8001158: 34 2d 00 b8 addi r13,r1,184 current = (void *)_CPU_Context_Get_SP( &the_thread->Registers ); } low = Stack_check_usable_stack_start(stack); size = Stack_check_usable_stack_size(stack); 800115c: 29 ae 00 00 lw r14,(r13+0) /* * start at lower memory and find first word that does not * match pattern */ base += PATTERN_SIZE_WORDS; 8001160: 34 e2 00 20 addi r2,r7,32 { stack = &the_thread->Start.Initial_stack; current = (void *)_CPU_Context_Get_SP( &the_thread->Registers ); } low = Stack_check_usable_stack_start(stack); 8001164: 34 e6 00 10 addi r6,r7,16 size = Stack_check_usable_stack_size(stack); 8001168: 35 ce ff f0 addi r14,r14,-16 { const uint32_t *base, *ebase; uint32_t length; base = s; length = n/4; 800116c: 01 c4 00 01 srui r4,r14,1 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; 8001170: 34 0f 00 00 mvi r15,0 { const uint32_t *base, *ebase; uint32_t length; base = s; length = n/4; 8001174: 00 84 00 01 srui r4,r4,1 * start at lower memory and find first word that does not * match pattern */ base += PATTERN_SIZE_WORDS; for (ebase = base + length; base < ebase; base++) 8001178: b4 84 20 00 add r4,r4,r4 800117c: b4 84 20 00 add r4,r4,r4 8001180: b4 44 20 00 add r4,r2,r4 8001184: 50 44 00 09 bgeu r2,r4,80011a8 <== NEVER TAKEN if (*base != U32_PATTERN) 8001188: 28 e3 00 20 lw r3,(r7+32) 800118c: 78 07 08 01 mvhi r7,0x801 8001190: 38 e7 6a 40 ori r7,r7,0x6a40 8001194: 28 e5 00 00 lw r5,(r7+0) 8001198: 5c 65 00 39 bne r3,r5,800127c <== NEVER TAKEN * start at lower memory and find first word that does not * match pattern */ base += PATTERN_SIZE_WORDS; for (ebase = base + length; base < ebase; base++) 800119c: 34 42 00 04 addi r2,r2,4 80011a0: 54 82 00 35 bgu r4,r2,8001274 <== 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; 80011a4: 34 0f 00 00 mvi r15,0 <== NOT EXECUTED #if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) if ( the_thread ) 80011a8: 44 20 00 3a be r1,r0,8001290 <== NOT EXECUTED #endif { (*print_handler)( 80011ac: 28 30 00 08 lw r16,(r1+8) 80011b0: 78 0c 08 01 mvhi r12,0x801 80011b4: 39 8c 86 fc ori r12,r12,0x86fc 80011b8: 78 0b 08 01 mvhi r11,0x801 80011bc: 29 93 00 00 lw r19,(r12+0) 80011c0: 37 83 00 2c addi r3,sp,44 80011c4: 34 02 00 05 mvi r2,5 80011c8: 39 6b 87 00 ori r11,r11,0x8700 80011cc: ba 00 08 00 mv r1,r16 80011d0: 29 72 00 00 lw r18,(r11+0) 80011d4: f8 00 13 7c calli 8005fc4 80011d8: 78 02 08 01 mvhi r2,0x801 80011dc: b8 20 20 00 mv r4,r1 80011e0: 38 42 68 a8 ori r2,r2,0x68a8 80011e4: ba 60 08 00 mv r1,r19 80011e8: ba 00 18 00 mv r3,r16 80011ec: da 40 00 00 call r18 (*print_handler)( print_context, " %010p - %010p %010p %8" PRId32 " ", stack->area, stack->area + stack->size - 1, 80011f0: 29 a4 00 00 lw r4,(r13+0) 80011f4: 29 a3 00 04 lw r3,(r13+4) else { (*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 ); } #endif (*print_handler)( 80011f8: 29 67 00 00 lw r7,(r11+0) 80011fc: 29 81 00 00 lw r1,(r12+0) print_context, " %010p - %010p %010p %8" PRId32 " ", stack->area, stack->area + stack->size - 1, 8001200: 34 84 ff ff addi r4,r4,-1 else { (*print_handler)( print_context, "0x%08" PRIx32 " INTR", ~0 ); } #endif (*print_handler)( 8001204: 78 02 08 01 mvhi r2,0x801 8001208: 38 42 68 c8 ori r2,r2,0x68c8 800120c: b4 64 20 00 add r4,r3,r4 8001210: ba 20 28 00 mv r5,r17 8001214: b9 c0 30 00 mv r6,r14 8001218: d8 e0 00 00 call r7 stack->area + stack->size - 1, current, size ); if (Stack_check_Initialized == 0) { 800121c: 78 01 08 01 mvhi r1,0x801 8001220: 38 21 87 04 ori r1,r1,0x8704 8001224: 28 21 00 00 lw r1,(r1+0) 8001228: 44 20 00 25 be r1,r0,80012bc <== NEVER TAKEN (*print_handler)( print_context, "Unavailable\n" ); } else { (*print_handler)( print_context, "%8" PRId32 "\n", used ); 800122c: 29 64 00 00 lw r4,(r11+0) 8001230: 29 81 00 00 lw r1,(r12+0) 8001234: 78 02 08 01 mvhi r2,0x801 8001238: 38 42 68 f8 ori r2,r2,0x68f8 800123c: b9 e0 18 00 mv r3,r15 8001240: d8 80 00 00 call r4 } } 8001244: 2b 9d 00 04 lw ra,(sp+4) 8001248: 2b 8b 00 28 lw r11,(sp+40) 800124c: 2b 8c 00 24 lw r12,(sp+36) 8001250: 2b 8d 00 20 lw r13,(sp+32) 8001254: 2b 8e 00 1c lw r14,(sp+28) 8001258: 2b 8f 00 18 lw r15,(sp+24) 800125c: 2b 90 00 14 lw r16,(sp+20) 8001260: 2b 91 00 10 lw r17,(sp+16) 8001264: 2b 92 00 0c lw r18,(sp+12) 8001268: 2b 93 00 08 lw r19,(sp+8) 800126c: 37 9c 00 30 addi sp,sp,48 8001270: c3 a0 00 00 ret * match pattern */ base += PATTERN_SIZE_WORDS; for (ebase = base + length; base < ebase; base++) if (*base != U32_PATTERN) 8001274: 28 47 00 00 lw r7,(r2+0) 8001278: 44 e3 ff c9 be r7,r3,800119c 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; 800127c: 34 0f 00 00 mvi r15,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 ) 8001280: 44 40 ff ca be r2,r0,80011a8 <== NEVER TAKEN used = Stack_check_Calculate_used( low, size, high_water_mark ); 8001284: b4 ce 78 00 add r15,r6,r14 8001288: c9 e2 78 00 sub r15,r15,r2 else used = 0; #if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) if ( the_thread ) 800128c: 5c 20 ff c8 bne r1,r0,80011ac 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 ); 8001290: 78 0b 08 01 mvhi r11,0x801 8001294: 78 0c 08 01 mvhi r12,0x801 8001298: 39 6b 87 00 ori r11,r11,0x8700 800129c: 39 8c 86 fc ori r12,r12,0x86fc 80012a0: 29 64 00 00 lw r4,(r11+0) 80012a4: 29 81 00 00 lw r1,(r12+0) 80012a8: 78 02 08 01 mvhi r2,0x801 80012ac: 38 42 68 b8 ori r2,r2,0x68b8 80012b0: 34 03 ff ff mvi r3,-1 80012b4: d8 80 00 00 call r4 80012b8: e3 ff ff ce bi 80011f0 current, size ); if (Stack_check_Initialized == 0) { (*print_handler)( print_context, "Unavailable\n" ); 80012bc: 29 63 00 00 lw r3,(r11+0) <== NOT EXECUTED 80012c0: 29 81 00 00 lw r1,(r12+0) <== NOT EXECUTED 80012c4: 78 02 08 01 mvhi r2,0x801 <== NOT EXECUTED 80012c8: 38 42 68 e8 ori r2,r2,0x68e8 <== NOT EXECUTED 80012cc: d8 60 00 00 call r3 <== NOT EXECUTED 80012d0: e3 ff ff dd bi 8001244 <== NOT EXECUTED /* * Obtain interrupt stack information */ #if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) if (the_thread == (Thread_Control *) -1) { if (!Stack_check_Interrupt_stack.area) 80012d4: 78 0d 08 01 mvhi r13,0x801 80012d8: 39 ad 87 a0 ori r13,r13,0x87a0 80012dc: 29 a7 00 04 lw r7,(r13+4) return; stack = &Stack_check_Interrupt_stack; the_thread = 0; current = 0; 80012e0: 34 11 00 00 mvi r17,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; 80012e4: 34 01 00 00 mvi r1,0 /* * Obtain interrupt stack information */ #if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) if (the_thread == (Thread_Control *) -1) { if (!Stack_check_Interrupt_stack.area) 80012e8: 5c e0 ff 9d bne r7,r0,800115c <== ALWAYS TAKEN 80012ec: e3 ff ff d6 bi 8001244 <== NOT EXECUTED =============================================================================== 080012f0 : /* * Stack_check_Initialize */ void Stack_check_Initialize( void ) { 80012f0: 37 9c ff f8 addi sp,sp,-8 80012f4: 5b 8b 00 08 sw (sp+8),r11 80012f8: 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 ) 80012fc: 78 0b 08 01 mvhi r11,0x801 8001300: 39 6b 87 04 ori r11,r11,0x8704 8001304: 29 61 00 00 lw r1,(r11+0) 8001308: 5c 20 00 24 bne r1,r0,8001398 /* * Dope the pattern and fill areas */ p = Stack_check_Pattern.pattern; for ( i = 0; i < PATTERN_SIZE_WORDS; i++ ) { p[i] = pattern[ i%4 ]; 800130c: 78 06 08 01 mvhi r6,0x801 8001310: 38 c6 6a 44 ori r6,r6,0x6a44 8001314: 28 c5 00 00 lw r5,(r6+0) 8001318: 78 02 08 01 mvhi r2,0x801 800131c: 78 06 08 01 mvhi r6,0x801 8001320: 38 42 87 90 ori r2,r2,0x8790 8001324: 38 c6 6a 48 ori r6,r6,0x6a48 8001328: 58 45 00 00 sw (r2+0),r5 800132c: 28 c5 00 00 lw r5,(r6+0) 8001330: 78 06 08 01 mvhi r6,0x801 8001334: 38 c6 6a 4c ori r6,r6,0x6a4c 8001338: 58 45 00 04 sw (r2+4),r5 800133c: 28 c5 00 00 lw r5,(r6+0) 8001340: 78 06 08 01 mvhi r6,0x801 /* * 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) { 8001344: 78 03 08 01 mvhi r3,0x801 /* * Dope the pattern and fill areas */ p = Stack_check_Pattern.pattern; for ( i = 0; i < PATTERN_SIZE_WORDS; i++ ) { p[i] = pattern[ i%4 ]; 8001348: 38 c6 6a 50 ori r6,r6,0x6a50 /* * 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) { 800134c: 38 63 8e 18 ori r3,r3,0x8e18 /* * Dope the pattern and fill areas */ p = Stack_check_Pattern.pattern; for ( i = 0; i < PATTERN_SIZE_WORDS; i++ ) { p[i] = pattern[ i%4 ]; 8001350: 58 45 00 08 sw (r2+8),r5 8001354: 28 c5 00 00 lw r5,(r6+0) /* * 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) { 8001358: 28 64 00 00 lw r4,(r3+0) /* * Dope the pattern and fill areas */ p = Stack_check_Pattern.pattern; for ( i = 0; i < PATTERN_SIZE_WORDS; i++ ) { p[i] = pattern[ i%4 ]; 800135c: 58 45 00 0c sw (r2+12),r5 /* * 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) { 8001360: 44 81 00 0c be r4,r1,8001390 <== NEVER TAKEN 8001364: 28 63 00 04 lw r3,(r3+4) 8001368: 44 60 00 0a be r3,r0,8001390 <== NEVER TAKEN Stack_check_Interrupt_stack.area = _CPU_Interrupt_stack_low; 800136c: 78 05 08 01 mvhi r5,0x801 Stack_check_Interrupt_stack.size = (char *) _CPU_Interrupt_stack_high - 8001370: c8 64 30 00 sub r6,r3,r4 * 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; 8001374: 38 a5 87 a0 ori r5,r5,0x87a0 Stack_check_Interrupt_stack.size = (char *) _CPU_Interrupt_stack_high - (char *) _CPU_Interrupt_stack_low; Stack_check_Dope_stack(&Stack_check_Interrupt_stack); 8001378: b8 80 08 00 mv r1,r4 800137c: 34 02 00 a5 mvi r2,165 8001380: b8 c0 18 00 mv r3,r6 * 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; 8001384: 58 a4 00 04 sw (r5+4),r4 Stack_check_Interrupt_stack.size = (char *) _CPU_Interrupt_stack_high - 8001388: 58 a6 00 00 sw (r5+0),r6 (char *) _CPU_Interrupt_stack_low; Stack_check_Dope_stack(&Stack_check_Interrupt_stack); 800138c: f8 00 3e 1e calli 8010c04 } #endif Stack_check_Initialized = 1; 8001390: 34 01 00 01 mvi r1,1 8001394: 59 61 00 00 sw (r11+0),r1 } 8001398: 2b 9d 00 04 lw ra,(sp+4) 800139c: 2b 8b 00 08 lw r11,(sp+8) 80013a0: 37 9c 00 08 addi sp,sp,8 80013a4: c3 a0 00 00 ret =============================================================================== 080036c4 <_API_extensions_Run_postdriver>: * * _API_extensions_Run_postdriver */ void _API_extensions_Run_postdriver( void ) { 80036c4: 37 9c ff f4 addi sp,sp,-12 80036c8: 5b 8b 00 0c sw (sp+12),r11 80036cc: 5b 8c 00 08 sw (sp+8),r12 80036d0: 5b 9d 00 04 sw (sp+4),ra the_extension = (API_extensions_Control *) the_node; (*the_extension->postswitch_hook)( _Thread_Executing ); } } 80036d4: 78 01 08 01 mvhi r1,0x801 80036d8: 38 21 4a 70 ori r1,r1,0x4a70 80036dc: 28 2b 00 00 lw r11,(r1+0) void _API_extensions_Run_postdriver( void ) { Chain_Node *the_node; API_extensions_Control *the_extension; for ( the_node = _Chain_First( &_API_extensions_List ); 80036e0: 78 0c 08 01 mvhi r12,0x801 80036e4: 39 8c 4a 74 ori r12,r12,0x4a74 80036e8: 45 6c 00 05 be r11,r12,80036fc <_API_extensions_Run_postdriver+0x38><== NEVER TAKEN * Currently all APIs configure this hook so it is always non-NULL. */ #if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API) if ( the_extension->postdriver_hook ) #endif (*the_extension->postdriver_hook)(); 80036ec: 29 61 00 08 lw r1,(r11+8) 80036f0: d8 20 00 00 call r1 Chain_Node *the_node; API_extensions_Control *the_extension; for ( the_node = _Chain_First( &_API_extensions_List ); !_Chain_Is_tail( &_API_extensions_List, the_node ) ; the_node = the_node->next ) { 80036f4: 29 6b 00 00 lw r11,(r11+0) void _API_extensions_Run_postdriver( void ) { Chain_Node *the_node; API_extensions_Control *the_extension; for ( the_node = _Chain_First( &_API_extensions_List ); 80036f8: 5d 6c ff fd bne r11,r12,80036ec <_API_extensions_Run_postdriver+0x28> #if defined(FUNCTIONALITY_NOT_CURRENTLY_USED_BY_ANY_API) if ( the_extension->postdriver_hook ) #endif (*the_extension->postdriver_hook)(); } } 80036fc: 2b 9d 00 04 lw ra,(sp+4) 8003700: 2b 8b 00 0c lw r11,(sp+12) 8003704: 2b 8c 00 08 lw r12,(sp+8) 8003708: 37 9c 00 0c addi sp,sp,12 800370c: c3 a0 00 00 ret =============================================================================== 08003710 <_API_extensions_Run_postswitch>: * * _API_extensions_Run_postswitch */ void _API_extensions_Run_postswitch( void ) { 8003710: 37 9c ff f0 addi sp,sp,-16 8003714: 5b 8b 00 10 sw (sp+16),r11 8003718: 5b 8c 00 0c sw (sp+12),r12 800371c: 5b 8d 00 08 sw (sp+8),r13 8003720: 5b 9d 00 04 sw (sp+4),ra the_extension = (API_extensions_Control *) the_node; (*the_extension->postswitch_hook)( _Thread_Executing ); } } 8003724: 78 01 08 01 mvhi r1,0x801 8003728: 38 21 4a 70 ori r1,r1,0x4a70 800372c: 28 2b 00 00 lw r11,(r1+0) void _API_extensions_Run_postswitch( void ) { Chain_Node *the_node; API_extensions_Control *the_extension; for ( the_node = _Chain_First( &_API_extensions_List ); 8003730: 78 0c 08 01 mvhi r12,0x801 8003734: 39 8c 4a 74 ori r12,r12,0x4a74 8003738: 45 6c 00 08 be r11,r12,8003758 <_API_extensions_Run_postswitch+0x48><== NEVER TAKEN 800373c: 78 0d 08 01 mvhi r13,0x801 8003740: 39 ad 4d b4 ori r13,r13,0x4db4 !_Chain_Is_tail( &_API_extensions_List, the_node ) ; the_node = the_node->next ) { the_extension = (API_extensions_Control *) the_node; (*the_extension->postswitch_hook)( _Thread_Executing ); 8003744: 29 62 00 0c lw r2,(r11+12) 8003748: 29 a1 00 0c lw r1,(r13+12) 800374c: d8 40 00 00 call r2 Chain_Node *the_node; API_extensions_Control *the_extension; for ( the_node = _Chain_First( &_API_extensions_List ); !_Chain_Is_tail( &_API_extensions_List, the_node ) ; the_node = the_node->next ) { 8003750: 29 6b 00 00 lw r11,(r11+0) void _API_extensions_Run_postswitch( void ) { Chain_Node *the_node; API_extensions_Control *the_extension; for ( the_node = _Chain_First( &_API_extensions_List ); 8003754: 5d 6c ff fc bne r11,r12,8003744 <_API_extensions_Run_postswitch+0x34> the_extension = (API_extensions_Control *) the_node; (*the_extension->postswitch_hook)( _Thread_Executing ); } } 8003758: 2b 9d 00 04 lw ra,(sp+4) 800375c: 2b 8b 00 10 lw r11,(sp+16) 8003760: 2b 8c 00 0c lw r12,(sp+12) 8003764: 2b 8d 00 08 lw r13,(sp+8) 8003768: 37 9c 00 10 addi sp,sp,16 800376c: c3 a0 00 00 ret =============================================================================== 08006464 <_CORE_RWLock_Release>: */ CORE_RWLock_Status _CORE_RWLock_Release( CORE_RWLock_Control *the_rwlock ) { 8006464: 37 9c ff f4 addi sp,sp,-12 8006468: 5b 8b 00 0c sw (sp+12),r11 800646c: 5b 8c 00 08 sw (sp+8),r12 8006470: 5b 9d 00 04 sw (sp+4),ra ISR_Level level; Thread_Control *executing = _Thread_Executing; 8006474: 78 02 08 01 mvhi r2,0x801 8006478: 38 42 9d 74 ori r2,r2,0x9d74 800647c: 28 43 00 0c lw r3,(r2+12) */ CORE_RWLock_Status _CORE_RWLock_Release( CORE_RWLock_Control *the_rwlock ) { 8006480: b8 20 58 00 mv r11,r1 * 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 ); 8006484: 90 00 08 00 rcsr r1,IE 8006488: 34 02 ff fe mvi r2,-2 800648c: a0 22 10 00 and r2,r1,r2 8006490: d0 02 00 00 wcsr IE,r2 if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){ 8006494: 29 62 00 44 lw r2,(r11+68) 8006498: 44 40 00 2f be r2,r0,8006554 <_CORE_RWLock_Release+0xf0> _ISR_Enable( level ); executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE; return CORE_RWLOCK_SUCCESSFUL; } if ( the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_READING ) { 800649c: 34 04 00 01 mvi r4,1 80064a0: 44 44 00 22 be r2,r4,8006528 <_CORE_RWLock_Release+0xc4> return CORE_RWLOCK_SUCCESSFUL; } } /* CORE_RWLOCK_LOCKED_FOR_WRITING or READING with readers */ executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL; 80064a4: 58 60 00 34 sw (r3+52),r0 /* * Implicitly transition to "unlocked" and find another thread interested * in obtaining this rwlock. */ the_rwlock->current_state = CORE_RWLOCK_UNLOCKED; 80064a8: 59 60 00 44 sw (r11+68),r0 _ISR_Enable( level ); 80064ac: d0 01 00 00 wcsr IE,r1 next = _Thread_queue_Dequeue( &the_rwlock->Wait_queue ); 80064b0: b9 60 08 00 mv r1,r11 80064b4: f8 00 07 e8 calli 8008454 <_Thread_queue_Dequeue> if ( next ) { 80064b8: 44 20 00 16 be r1,r0,8006510 <_CORE_RWLock_Release+0xac> if ( next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) { 80064bc: 28 22 00 30 lw r2,(r1+48) 80064c0: 34 01 00 01 mvi r1,1 80064c4: 44 41 00 2d be r2,r1,8006578 <_CORE_RWLock_Release+0x114> } /* * Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING */ the_rwlock->number_of_readers += 1; 80064c8: 29 62 00 48 lw r2,(r11+72) the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING; 80064cc: 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 || 80064d0: 34 0c 00 01 mvi r12,1 } /* * Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING */ the_rwlock->number_of_readers += 1; 80064d4: 34 41 00 01 addi r1,r2,1 80064d8: 59 61 00 48 sw (r11+72),r1 80064dc: e0 00 00 07 bi 80064f8 <_CORE_RWLock_Release+0x94> /* * Now see if more readers can be let go. */ while ( 1 ) { next = _Thread_queue_First( &the_rwlock->Wait_queue ); if ( !next || 80064e0: 28 63 00 30 lw r3,(r3+48) 80064e4: 44 6c 00 0b be r3,r12,8006510 <_CORE_RWLock_Release+0xac> <== NEVER TAKEN next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) return CORE_RWLOCK_SUCCESSFUL; the_rwlock->number_of_readers += 1; 80064e8: 29 63 00 48 lw r3,(r11+72) 80064ec: 34 63 00 01 addi r3,r3,1 80064f0: 59 63 00 48 sw (r11+72),r3 _Thread_queue_Extract( &the_rwlock->Wait_queue, next ); 80064f4: f8 00 09 00 calli 80088f4 <_Thread_queue_Extract> /* * Now see if more readers can be let go. */ while ( 1 ) { next = _Thread_queue_First( &the_rwlock->Wait_queue ); 80064f8: b9 60 08 00 mv r1,r11 80064fc: f8 00 09 51 calli 8008a40 <_Thread_queue_First> 8006500: b8 20 18 00 mv r3,r1 if ( !next || next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) return CORE_RWLOCK_SUCCESSFUL; the_rwlock->number_of_readers += 1; _Thread_queue_Extract( &the_rwlock->Wait_queue, next ); 8006504: b8 20 10 00 mv r2,r1 8006508: b9 60 08 00 mv r1,r11 /* * Now see if more readers can be let go. */ while ( 1 ) { next = _Thread_queue_First( &the_rwlock->Wait_queue ); if ( !next || 800650c: 5c 60 ff f5 bne r3,r0,80064e0 <_CORE_RWLock_Release+0x7c> } /* indentation is to match _ISR_Disable at top */ return CORE_RWLOCK_SUCCESSFUL; } 8006510: 34 01 00 00 mvi r1,0 8006514: 2b 9d 00 04 lw ra,(sp+4) 8006518: 2b 8b 00 0c lw r11,(sp+12) 800651c: 2b 8c 00 08 lw r12,(sp+8) 8006520: 37 9c 00 0c addi sp,sp,12 8006524: c3 a0 00 00 ret _ISR_Enable( level ); executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE; return CORE_RWLOCK_SUCCESSFUL; } if ( the_rwlock->current_state == CORE_RWLOCK_LOCKED_FOR_READING ) { the_rwlock->number_of_readers -= 1; 8006528: 29 62 00 48 lw r2,(r11+72) 800652c: 34 42 ff ff addi r2,r2,-1 8006530: 59 62 00 48 sw (r11+72),r2 if ( the_rwlock->number_of_readers != 0 ) { 8006534: 44 40 ff dc be r2,r0,80064a4 <_CORE_RWLock_Release+0x40> /* must be unlocked again */ _ISR_Enable( level ); 8006538: d0 01 00 00 wcsr IE,r1 } /* indentation is to match _ISR_Disable at top */ return CORE_RWLOCK_SUCCESSFUL; } 800653c: 34 01 00 00 mvi r1,0 8006540: 2b 9d 00 04 lw ra,(sp+4) 8006544: 2b 8b 00 0c lw r11,(sp+12) 8006548: 2b 8c 00 08 lw r12,(sp+8) 800654c: 37 9c 00 0c addi sp,sp,12 8006550: c3 a0 00 00 ret * If any thread is waiting, then we wait. */ _ISR_Disable( level ); if ( the_rwlock->current_state == CORE_RWLOCK_UNLOCKED){ _ISR_Enable( level ); 8006554: d0 01 00 00 wcsr IE,r1 executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE; 8006558: 34 01 00 02 mvi r1,2 800655c: 58 61 00 34 sw (r3+52),r1 } /* indentation is to match _ISR_Disable at top */ return CORE_RWLOCK_SUCCESSFUL; } 8006560: 34 01 00 00 mvi r1,0 8006564: 2b 9d 00 04 lw ra,(sp+4) 8006568: 2b 8b 00 0c lw r11,(sp+12) 800656c: 2b 8c 00 08 lw r12,(sp+8) 8006570: 37 9c 00 0c addi sp,sp,12 8006574: c3 a0 00 00 ret next = _Thread_queue_Dequeue( &the_rwlock->Wait_queue ); if ( next ) { if ( next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) { the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_WRITING; 8006578: 34 01 00 02 mvi r1,2 800657c: 59 61 00 44 sw (r11+68),r1 return CORE_RWLOCK_SUCCESSFUL; 8006580: e3 ff ff e4 bi 8006510 <_CORE_RWLock_Release+0xac> =============================================================================== 08006584 <_CORE_RWLock_Timeout>: void _CORE_RWLock_Timeout( Objects_Id id, void *ignored ) { 8006584: 37 9c ff f8 addi sp,sp,-8 8006588: 5b 9d 00 04 sw (sp+4),ra Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); 800658c: 37 82 00 08 addi r2,sp,8 8006590: f8 00 06 b1 calli 8008054 <_Thread_Get> switch ( location ) { 8006594: 2b 82 00 08 lw r2,(sp+8) 8006598: 5c 40 00 07 bne r2,r0,80065b4 <_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 ); 800659c: f8 00 09 67 calli 8008b38 <_Thread_queue_Process_timeout> */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; 80065a0: 78 01 08 01 mvhi r1,0x801 80065a4: 38 21 98 a8 ori r1,r1,0x98a8 80065a8: 28 22 00 00 lw r2,(r1+0) 80065ac: 34 42 ff ff addi r2,r2,-1 80065b0: 58 22 00 00 sw (r1+0),r2 _Thread_Unnest_dispatch(); break; } } 80065b4: 2b 9d 00 04 lw ra,(sp+4) 80065b8: 37 9c 00 08 addi sp,sp,8 80065bc: c3 a0 00 00 ret =============================================================================== 080153a0 <_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 ) { 80153a0: 37 9c ff e4 addi sp,sp,-28 80153a4: 5b 8b 00 1c sw (sp+28),r11 80153a8: 5b 8c 00 18 sw (sp+24),r12 80153ac: 5b 8d 00 14 sw (sp+20),r13 80153b0: 5b 8e 00 10 sw (sp+16),r14 80153b4: 5b 8f 00 0c sw (sp+12),r15 80153b8: 5b 90 00 08 sw (sp+8),r16 80153bc: 5b 9d 00 04 sw (sp+4),ra Thread_Control *the_thread; uint32_t number_broadcasted; Thread_Wait_information *waitp; if ( size > the_message_queue->maximum_message_size ) { 80153c0: 28 24 00 4c lw r4,(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 ) { 80153c4: b8 20 68 00 mv r13,r1 80153c8: b8 60 60 00 mv r12,r3 80153cc: b8 40 78 00 mv r15,r2 80153d0: b8 c0 80 00 mv r16,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; 80153d4: 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 ) { 80153d8: 54 64 00 06 bgu r3,r4,80153f0 <_CORE_message_queue_Broadcast+0x50><== 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 ) { 80153dc: 29 a1 00 48 lw r1,(r13+72) 80153e0: 34 0e 00 00 mvi r14,0 80153e4: 44 20 00 11 be r1,r0,8015428 <_CORE_message_queue_Broadcast+0x88> *count = 0; 80153e8: 58 c0 00 00 sw (r6+0),r0 return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL; 80153ec: 34 01 00 00 mvi r1,0 #endif } *count = number_broadcasted; return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL; } 80153f0: 2b 9d 00 04 lw ra,(sp+4) 80153f4: 2b 8b 00 1c lw r11,(sp+28) 80153f8: 2b 8c 00 18 lw r12,(sp+24) 80153fc: 2b 8d 00 14 lw r13,(sp+20) 8015400: 2b 8e 00 10 lw r14,(sp+16) 8015404: 2b 8f 00 0c lw r15,(sp+12) 8015408: 2b 90 00 08 lw r16,(sp+8) 801540c: 37 9c 00 1c addi sp,sp,28 8015410: c3 a0 00 00 ret const void *source, void *destination, size_t size ) { memcpy(destination, source, size); 8015414: 29 61 00 2c lw r1,(r11+44) */ number_broadcasted = 0; while ((the_thread = _Thread_queue_Dequeue(&the_message_queue->Wait_queue))) { waitp = &the_thread->Wait; number_broadcasted += 1; 8015418: 35 ce 00 01 addi r14,r14,1 801541c: f8 00 2b b9 calli 8020300 buffer, waitp->return_argument_second.mutable_object, size ); *(size_t *) the_thread->Wait.return_argument = size; 8015420: 29 61 00 28 lw r1,(r11+40) 8015424: 58 2c 00 00 sw (r1+0),r12 /* * There must be no pending messages if there is a thread waiting to * receive a message. */ number_broadcasted = 0; while ((the_thread = 8015428: b9 a0 08 00 mv r1,r13 801542c: f8 00 0d 79 calli 8018a10 <_Thread_queue_Dequeue> 8015430: b8 20 58 00 mv r11,r1 8015434: b9 e0 10 00 mv r2,r15 8015438: b9 80 18 00 mv r3,r12 801543c: 5c 20 ff f6 bne r1,r0,8015414 <_CORE_message_queue_Broadcast+0x74> if ( !_Objects_Is_local_id( the_thread->Object.id ) ) (*api_message_queue_mp_support) ( the_thread, id ); #endif } *count = number_broadcasted; 8015440: 5a 0e 00 00 sw (r16+0),r14 return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL; 8015444: 34 01 00 00 mvi r1,0 8015448: e3 ff ff ea bi 80153f0 <_CORE_message_queue_Broadcast+0x50> =============================================================================== 0800ed70 <_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 ) { 800ed70: 37 9c ff e4 addi sp,sp,-28 800ed74: 5b 8b 00 1c sw (sp+28),r11 800ed78: 5b 8c 00 18 sw (sp+24),r12 800ed7c: 5b 8d 00 14 sw (sp+20),r13 800ed80: 5b 8e 00 10 sw (sp+16),r14 800ed84: 5b 8f 00 0c sw (sp+12),r15 800ed88: 5b 90 00 08 sw (sp+8),r16 800ed8c: 5b 9d 00 04 sw (sp+4),ra 800ed90: 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; 800ed94: 58 20 00 48 sw (r1+72),r0 the_message_queue->maximum_message_size = maximum_message_size; 800ed98: 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; 800ed9c: 58 20 00 60 sw (r1+96),r0 the_message_queue->notify_argument = the_argument; 800eda0: 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; 800eda4: 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)) { 800eda8: 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 ) { 800edac: b8 60 70 00 mv r14,r3 800edb0: b8 40 80 00 mv r16,r2 /* * 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)) { 800edb4: b8 80 60 00 mv r12,r4 800edb8: 44 20 00 06 be r1,r0,800edd0 <_CORE_message_queue_Initialize+0x60> allocated_message_size += sizeof(uint32_t); 800edbc: 34 8c 00 04 addi r12,r4,4 allocated_message_size &= ~(sizeof(uint32_t) - 1); 800edc0: 34 01 ff fc mvi r1,-4 800edc4: a1 81 60 00 and r12,r12,r1 } if (allocated_message_size < maximum_message_size) return false; 800edc8: 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) 800edcc: 54 8c 00 1c bgu r4,r12,800ee3c <_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)); 800edd0: 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 * 800edd4: b9 e0 08 00 mv r1,r15 800edd8: b9 c0 10 00 mv r2,r14 800eddc: f8 00 5f aa calli 8026c84 <__mulsi3> (allocated_message_size + sizeof(CORE_message_queue_Buffer_control)); if (message_buffering_required < allocated_message_size) return false; 800ede0: 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) 800ede4: 55 81 00 16 bgu r12,r1,800ee3c <_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 ); 800ede8: f8 00 0e f8 calli 80129c8 <_Workspace_Allocate> return false; /* * Attempt to allocate the message memory */ the_message_queue->message_buffers = (CORE_message_queue_Buffer *) 800edec: 59 61 00 5c sw (r11+92),r1 _Workspace_Allocate( message_buffering_required ); 800edf0: b8 20 18 00 mv r3,r1 if (the_message_queue->message_buffers == 0) 800edf4: 44 20 00 12 be r1,r0,800ee3c <_CORE_message_queue_Initialize+0xcc> /* * Initialize the pool of inactive messages, pending messages, * and set of waiting threads. */ _Chain_Initialize ( 800edf8: b8 60 10 00 mv r2,r3 800edfc: 35 61 00 68 addi r1,r11,104 800ee00: b9 c0 18 00 mv r3,r14 800ee04: b9 e0 20 00 mv r4,r15 800ee08: f8 00 1a 67 calli 80157a4 <_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 ); 800ee0c: 35 62 00 54 addi r2,r11,84 */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { Chain_Node *head = _Chain_Head( the_chain ); 800ee10: 35 61 00 50 addi r1,r11,80 Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; head->previous = NULL; tail->previous = head; 800ee14: 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; 800ee18: 59 62 00 50 sw (r11+80),r2 head->previous = NULL; 800ee1c: 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( 800ee20: 2a 02 00 00 lw r2,(r16+0) 800ee24: b9 60 08 00 mv r1,r11 800ee28: 34 03 00 80 mvi r3,128 800ee2c: 64 42 00 01 cmpei r2,r2,1 800ee30: 34 04 00 06 mvi r4,6 800ee34: f8 00 0b 88 calli 8011c54 <_Thread_queue_Initialize> THREAD_QUEUE_DISCIPLINE_PRIORITY : THREAD_QUEUE_DISCIPLINE_FIFO, STATES_WAITING_FOR_MESSAGE, CORE_MESSAGE_QUEUE_STATUS_TIMEOUT ); return true; 800ee38: 34 0d 00 01 mvi r13,1 } 800ee3c: b9 a0 08 00 mv r1,r13 800ee40: 2b 9d 00 04 lw ra,(sp+4) 800ee44: 2b 8b 00 1c lw r11,(sp+28) 800ee48: 2b 8c 00 18 lw r12,(sp+24) 800ee4c: 2b 8d 00 14 lw r13,(sp+20) 800ee50: 2b 8e 00 10 lw r14,(sp+16) 800ee54: 2b 8f 00 0c lw r15,(sp+12) 800ee58: 2b 90 00 08 lw r16,(sp+8) 800ee5c: 37 9c 00 1c addi sp,sp,28 800ee60: c3 a0 00 00 ret =============================================================================== 08003a88 <_CORE_mutex_Seize>: Objects_Id _id, bool _wait, Watchdog_Interval _timeout, ISR_Level _level ) { 8003a88: 37 9c ff e4 addi sp,sp,-28 8003a8c: 5b 8b 00 18 sw (sp+24),r11 8003a90: 5b 8c 00 14 sw (sp+20),r12 8003a94: 5b 8d 00 10 sw (sp+16),r13 8003a98: 5b 8e 00 0c sw (sp+12),r14 8003a9c: 5b 8f 00 08 sw (sp+8),r15 8003aa0: 5b 9d 00 04 sw (sp+4),ra _CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level ); 8003aa4: 78 0b 08 01 mvhi r11,0x801 8003aa8: 39 6b 48 e8 ori r11,r11,0x48e8 8003aac: 29 66 00 00 lw r6,(r11+0) Objects_Id _id, bool _wait, Watchdog_Interval _timeout, ISR_Level _level ) { 8003ab0: 5b 85 00 1c sw (sp+28),r5 8003ab4: b8 20 60 00 mv r12,r1 8003ab8: b8 40 78 00 mv r15,r2 8003abc: b8 80 70 00 mv r14,r4 8003ac0: 20 6d 00 ff andi r13,r3,0xff _CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level ); 8003ac4: 44 c0 00 02 be r6,r0,8003acc <_CORE_mutex_Seize+0x44> 8003ac8: 5d a0 00 15 bne r13,r0,8003b1c <_CORE_mutex_Seize+0x94> <== ALWAYS TAKEN 8003acc: b9 80 08 00 mv r1,r12 8003ad0: 37 82 00 1c addi r2,sp,28 8003ad4: f8 00 18 ec calli 8009e84 <_CORE_mutex_Seize_interrupt_trylock> 8003ad8: 44 20 00 09 be r1,r0,8003afc <_CORE_mutex_Seize+0x74> 8003adc: 5d a0 00 19 bne r13,r0,8003b40 <_CORE_mutex_Seize+0xb8> 8003ae0: 2b 81 00 1c lw r1,(sp+28) 8003ae4: d0 01 00 00 wcsr IE,r1 8003ae8: 78 01 08 01 mvhi r1,0x801 8003aec: 38 21 4d b4 ori r1,r1,0x4db4 8003af0: 28 21 00 0c lw r1,(r1+12) 8003af4: 34 02 00 01 mvi r2,1 8003af8: 58 22 00 34 sw (r1+52),r2 } 8003afc: 2b 9d 00 04 lw ra,(sp+4) 8003b00: 2b 8b 00 18 lw r11,(sp+24) 8003b04: 2b 8c 00 14 lw r12,(sp+20) 8003b08: 2b 8d 00 10 lw r13,(sp+16) 8003b0c: 2b 8e 00 0c lw r14,(sp+12) 8003b10: 2b 8f 00 08 lw r15,(sp+8) 8003b14: 37 9c 00 1c addi sp,sp,28 8003b18: c3 a0 00 00 ret bool _wait, Watchdog_Interval _timeout, ISR_Level _level ) { _CORE_mutex_Seize_body( _the_mutex, _id, _wait, _timeout, _level ); 8003b1c: 78 01 08 01 mvhi r1,0x801 8003b20: 38 21 4a 60 ori r1,r1,0x4a60 8003b24: 28 21 00 00 lw r1,(r1+0) 8003b28: 34 02 00 01 mvi r2,1 8003b2c: 50 41 ff e8 bgeu r2,r1,8003acc <_CORE_mutex_Seize+0x44> 8003b30: 34 01 00 00 mvi r1,0 8003b34: 34 02 00 00 mvi r2,0 8003b38: 34 03 00 12 mvi r3,18 8003b3c: f8 00 02 31 calli 8004400 <_Internal_error_Occurred> 8003b40: 78 01 08 01 mvhi r1,0x801 8003b44: 29 62 00 00 lw r2,(r11+0) 8003b48: 38 21 4d b4 ori r1,r1,0x4db4 8003b4c: 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; 8003b50: 34 03 00 01 mvi r3,1 8003b54: 59 83 00 30 sw (r12+48),r3 8003b58: 34 42 00 01 addi r2,r2,1 8003b5c: 58 2c 00 44 sw (r1+68),r12 8003b60: 58 2f 00 20 sw (r1+32),r15 8003b64: 59 62 00 00 sw (r11+0),r2 8003b68: 2b 81 00 1c lw r1,(sp+28) 8003b6c: d0 01 00 00 wcsr IE,r1 8003b70: b9 80 08 00 mv r1,r12 8003b74: b9 c0 10 00 mv r2,r14 8003b78: fb ff ff a3 calli 8003a04 <_CORE_mutex_Seize_interrupt_blocking> } 8003b7c: 2b 9d 00 04 lw ra,(sp+4) 8003b80: 2b 8b 00 18 lw r11,(sp+24) 8003b84: 2b 8c 00 14 lw r12,(sp+20) 8003b88: 2b 8d 00 10 lw r13,(sp+16) 8003b8c: 2b 8e 00 0c lw r14,(sp+12) 8003b90: 2b 8f 00 08 lw r15,(sp+8) 8003b94: 37 9c 00 1c addi sp,sp,28 8003b98: c3 a0 00 00 ret =============================================================================== 08003d08 <_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 ) { 8003d08: 37 9c ff f8 addi sp,sp,-8 8003d0c: 5b 8b 00 08 sw (sp+8),r11 8003d10: 5b 9d 00 04 sw (sp+4),ra 8003d14: 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)) ) { 8003d18: f8 00 07 f9 calli 8005cfc <_Thread_queue_Dequeue> { Thread_Control *the_thread; ISR_Level level; CORE_semaphore_Status status; status = CORE_SEMAPHORE_STATUS_SUCCESSFUL; 8003d1c: 34 02 00 00 mvi r2,0 if ( (the_thread = _Thread_queue_Dequeue(&the_semaphore->Wait_queue)) ) { 8003d20: 44 20 00 06 be r1,r0,8003d38 <_CORE_semaphore_Surrender+0x30> status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED; _ISR_Enable( level ); } return status; } 8003d24: b8 40 08 00 mv r1,r2 8003d28: 2b 9d 00 04 lw ra,(sp+4) 8003d2c: 2b 8b 00 08 lw r11,(sp+8) 8003d30: 37 9c 00 08 addi sp,sp,8 8003d34: c3 a0 00 00 ret if ( !_Objects_Is_local_id( the_thread->Object.id ) ) (*api_semaphore_mp_support) ( the_thread, id ); #endif } else { _ISR_Disable( level ); 8003d38: 90 00 08 00 rcsr r1,IE 8003d3c: 34 02 ff fe mvi r2,-2 8003d40: a0 22 10 00 and r2,r1,r2 8003d44: d0 02 00 00 wcsr IE,r2 if ( the_semaphore->count < the_semaphore->Attributes.maximum_count ) 8003d48: 29 63 00 48 lw r3,(r11+72) 8003d4c: 29 64 00 40 lw r4,(r11+64) the_semaphore->count += 1; else status = CORE_SEMAPHORE_MAXIMUM_COUNT_EXCEEDED; 8003d50: 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 ) 8003d54: 50 64 00 04 bgeu r3,r4,8003d64 <_CORE_semaphore_Surrender+0x5c><== NEVER TAKEN the_semaphore->count += 1; 8003d58: 34 63 00 01 addi r3,r3,1 8003d5c: 59 63 00 48 sw (r11+72),r3 { Thread_Control *the_thread; ISR_Level level; CORE_semaphore_Status status; status = CORE_SEMAPHORE_STATUS_SUCCESSFUL; 8003d60: 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 ); 8003d64: d0 01 00 00 wcsr IE,r1 } return status; } 8003d68: b8 40 08 00 mv r1,r2 8003d6c: 2b 9d 00 04 lw ra,(sp+4) 8003d70: 2b 8b 00 08 lw r11,(sp+8) 8003d74: 37 9c 00 08 addi sp,sp,8 8003d78: c3 a0 00 00 ret =============================================================================== 08009de8 <_Chain_Initialize>: Chain_Control *the_chain, void *starting_address, size_t number_nodes, size_t node_size ) { 8009de8: 37 9c ff f0 addi sp,sp,-16 8009dec: 5b 8b 00 10 sw (sp+16),r11 8009df0: 5b 8c 00 0c sw (sp+12),r12 8009df4: 5b 8d 00 08 sw (sp+8),r13 8009df8: 5b 9d 00 04 sw (sp+4),ra Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); Chain_Node *current = head; Chain_Node *next = starting_address; head->previous = NULL; 8009dfc: 58 20 00 04 sw (r1+4),r0 Chain_Control *the_chain, void *starting_address, size_t number_nodes, size_t node_size ) { 8009e00: b8 20 58 00 mv r11,r1 8009e04: b8 40 60 00 mv r12,r2 size_t count = number_nodes; Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); 8009e08: 34 2d 00 04 addi r13,r1,4 Chain_Node *current = head; Chain_Node *next = starting_address; head->previous = NULL; while ( count-- ) { 8009e0c: 44 60 00 10 be r3,r0,8009e4c <_Chain_Initialize+0x64> <== NEVER TAKEN 8009e10: 34 63 ff ff addi r3,r3,-1 8009e14: b8 60 10 00 mv r2,r3 { size_t count = number_nodes; Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); Chain_Node *current = head; Chain_Node *next = starting_address; 8009e18: b9 80 28 00 mv r5,r12 ) { size_t count = number_nodes; Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); Chain_Node *current = head; 8009e1c: b9 60 30 00 mv r6,r11 8009e20: e0 00 00 04 bi 8009e30 <_Chain_Initialize+0x48> Chain_Node *next = starting_address; head->previous = NULL; while ( count-- ) { 8009e24: b8 a0 30 00 mv r6,r5 8009e28: 34 63 ff ff addi r3,r3,-1 current->next = next; next->previous = current; current = next; next = (Chain_Node *) 8009e2c: b8 e0 28 00 mv r5,r7 Chain_Node *next = starting_address; head->previous = NULL; while ( count-- ) { current->next = next; 8009e30: 58 c5 00 00 sw (r6+0),r5 next->previous = current; 8009e34: 58 a6 00 04 sw (r5+4),r6 * node_size - size of node in bytes * * Output parameters: NONE */ void _Chain_Initialize( 8009e38: b4 a4 38 00 add r7,r5,r4 Chain_Node *current = head; Chain_Node *next = starting_address; head->previous = NULL; while ( count-- ) { 8009e3c: 5c 60 ff fa bne r3,r0,8009e24 <_Chain_Initialize+0x3c> * node_size - size of node in bytes * * Output parameters: NONE */ void _Chain_Initialize( 8009e40: b8 80 08 00 mv r1,r4 8009e44: f8 00 21 47 calli 8012360 <__mulsi3> Chain_Node *current = head; Chain_Node *next = starting_address; head->previous = NULL; while ( count-- ) { 8009e48: b5 81 08 00 add r1,r12,r1 current = next; next = (Chain_Node *) _Addresses_Add_offset( (void *) next, node_size ); } current->next = tail; 8009e4c: 58 2d 00 00 sw (r1+0),r13 tail->previous = current; 8009e50: 59 61 00 08 sw (r11+8),r1 } 8009e54: 2b 9d 00 04 lw ra,(sp+4) 8009e58: 2b 8b 00 10 lw r11,(sp+16) 8009e5c: 2b 8c 00 0c lw r12,(sp+12) 8009e60: 2b 8d 00 08 lw r13,(sp+8) 8009e64: 37 9c 00 10 addi sp,sp,16 8009e68: c3 a0 00 00 ret =============================================================================== 0800e0f0 <_Event_Surrender>: */ void _Event_Surrender( Thread_Control *the_thread ) { 800e0f0: 37 9c ff f8 addi sp,sp,-8 800e0f4: 5b 8b 00 08 sw (sp+8),r11 800e0f8: 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 ]; 800e0fc: 28 25 01 1c lw r5,(r1+284) option_set = (rtems_option) the_thread->Wait.option; 800e100: 28 28 00 30 lw r8,(r1+48) */ void _Event_Surrender( Thread_Control *the_thread ) { 800e104: 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 ); 800e108: 90 00 08 00 rcsr r1,IE 800e10c: 34 07 ff fe mvi r7,-2 800e110: a0 27 38 00 and r7,r1,r7 800e114: d0 07 00 00 wcsr IE,r7 pending_events = api->pending_events; 800e118: 28 a6 00 00 lw r6,(r5+0) event_condition = (rtems_event_set) the_thread->Wait.count; 800e11c: 29 64 00 24 lw r4,(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 ); 800e120: a0 86 10 00 and r2,r4,r6 seized_events = _Event_sets_Get( pending_events, event_condition ); /* * No events were seized in this operation */ if ( _Event_sets_Is_empty( seized_events ) ) { 800e124: 44 40 00 27 be r2,r0,800e1c0 <_Event_Surrender+0xd0> /* * 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() && 800e128: 78 03 08 01 mvhi r3,0x801 800e12c: 38 63 ae 2c ori r3,r3,0xae2c 800e130: 28 69 00 08 lw r9,(r3+8) 800e134: 45 20 00 03 be r9,r0,800e140 <_Event_Surrender+0x50> 800e138: 28 63 00 0c lw r3,(r3+12) 800e13c: 45 63 00 31 be r11,r3,800e200 <_Event_Surrender+0x110> */ RTEMS_INLINE_ROUTINE bool _States_Is_waiting_for_event ( States_Control the_states ) { return (the_states & STATES_WAITING_FOR_EVENT); 800e140: 29 63 00 10 lw r3,(r11+16) 800e144: 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 ) ) { 800e148: 44 60 00 19 be r3,r0,800e1ac <_Event_Surrender+0xbc> if ( seized_events == event_condition || _Options_Is_any( option_set ) ) { 800e14c: 44 82 00 03 be r4,r2,800e158 <_Event_Surrender+0x68> */ RTEMS_INLINE_ROUTINE bool _Options_Is_any ( rtems_option option_set ) { return (option_set & RTEMS_EVENT_ANY) ? true : false; 800e150: 21 08 00 02 andi r8,r8,0x2 800e154: 45 00 00 16 be r8,r0,800e1ac <_Event_Surrender+0xbc> <== NEVER TAKEN RTEMS_INLINE_ROUTINE rtems_event_set _Event_sets_Clear( rtems_event_set the_event_set, rtems_event_set the_mask ) { return ( the_event_set & ~(the_mask) ); 800e158: a4 40 18 00 not r3,r2 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; 800e15c: 29 64 00 28 lw r4,(r11+40) 800e160: a0 66 30 00 and r6,r3,r6 /* * 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 ); 800e164: 58 a6 00 00 sw (r5+0),r6 the_thread->Wait.count = 0; 800e168: 59 60 00 24 sw (r11+36),r0 *(rtems_event_set *)the_thread->Wait.return_argument = seized_events; 800e16c: 58 82 00 00 sw (r4+0),r2 _ISR_Flash( level ); 800e170: d0 01 00 00 wcsr IE,r1 800e174: d0 07 00 00 wcsr IE,r7 if ( !_Watchdog_Is_active( &the_thread->Timer ) ) { 800e178: 29 63 00 50 lw r3,(r11+80) 800e17c: 34 02 00 02 mvi r2,2 800e180: 44 62 00 15 be r3,r2,800e1d4 <_Event_Surrender+0xe4> _ISR_Enable( level ); 800e184: d0 01 00 00 wcsr IE,r1 RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); 800e188: 78 01 08 01 mvhi r1,0x801 800e18c: 38 21 8b ac ori r1,r1,0x8bac 800e190: 28 22 00 00 lw r2,(r1+0) 800e194: b9 60 08 00 mv r1,r11 800e198: f8 00 05 99 calli 800f7fc <_Thread_Clear_state> } return; } } _ISR_Enable( level ); } 800e19c: 2b 9d 00 04 lw ra,(sp+4) 800e1a0: 2b 8b 00 08 lw r11,(sp+8) 800e1a4: 37 9c 00 08 addi sp,sp,8 800e1a8: c3 a0 00 00 ret _Thread_Unblock( the_thread ); } return; } } _ISR_Enable( level ); 800e1ac: d0 01 00 00 wcsr IE,r1 } 800e1b0: 2b 9d 00 04 lw ra,(sp+4) 800e1b4: 2b 8b 00 08 lw r11,(sp+8) 800e1b8: 37 9c 00 08 addi sp,sp,8 800e1bc: c3 a0 00 00 ret /* * No events were seized in this operation */ if ( _Event_sets_Is_empty( seized_events ) ) { _ISR_Enable( level ); 800e1c0: d0 01 00 00 wcsr IE,r1 } return; } } _ISR_Enable( level ); } 800e1c4: 2b 9d 00 04 lw ra,(sp+4) 800e1c8: 2b 8b 00 08 lw r11,(sp+8) 800e1cc: 37 9c 00 08 addi sp,sp,8 800e1d0: c3 a0 00 00 ret RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate( Watchdog_Control *the_watchdog ) { the_watchdog->state = WATCHDOG_REMOVE_IT; 800e1d4: 34 02 00 03 mvi r2,3 800e1d8: 59 62 00 50 sw (r11+80),r2 if ( !_Watchdog_Is_active( &the_thread->Timer ) ) { _ISR_Enable( level ); _Thread_Unblock( the_thread ); } else { _Watchdog_Deactivate( &the_thread->Timer ); _ISR_Enable( level ); 800e1dc: d0 01 00 00 wcsr IE,r1 (void) _Watchdog_Remove( &the_thread->Timer ); 800e1e0: 35 61 00 48 addi r1,r11,72 800e1e4: fb ff e7 69 calli 8007f88 <_Watchdog_Remove> 800e1e8: 78 03 08 01 mvhi r3,0x801 800e1ec: 38 63 8b ac ori r3,r3,0x8bac 800e1f0: 28 62 00 00 lw r2,(r3+0) 800e1f4: b9 60 08 00 mv r1,r11 800e1f8: f8 00 05 81 calli 800f7fc <_Thread_Clear_state> 800e1fc: e3 ff ff ed bi 800e1b0 <_Event_Surrender+0xc0> * 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) || 800e200: 78 03 08 01 mvhi r3,0x801 800e204: 38 63 b3 20 ori r3,r3,0xb320 800e208: 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 ) && 800e20c: 34 09 00 02 mvi r9,2 800e210: 45 49 00 04 be r10,r9,800e220 <_Event_Surrender+0x130> <== NEVER TAKEN ((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) || (_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) { 800e214: 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 ) && ((_Event_Sync_state == THREAD_BLOCKING_OPERATION_TIMEOUT) || 800e218: 34 09 00 01 mvi r9,1 800e21c: 5d 49 ff c9 bne r10,r9,800e140 <_Event_Surrender+0x50> <== NEVER TAKEN (_Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED)) ) { if ( seized_events == event_condition || _Options_Is_any(option_set) ) { 800e220: 44 82 00 03 be r4,r2,800e22c <_Event_Surrender+0x13c> <== NEVER TAKEN 800e224: 21 08 00 02 andi r8,r8,0x2 800e228: 45 00 00 09 be r8,r0,800e24c <_Event_Surrender+0x15c> <== NEVER TAKEN 800e22c: a4 40 20 00 not r4,r2 800e230: a0 86 30 00 and r6,r4,r6 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; 800e234: 29 64 00 28 lw r4,(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 ); 800e238: 58 a6 00 00 sw (r5+0),r6 the_thread->Wait.count = 0; 800e23c: 59 60 00 24 sw (r11+36),r0 *(rtems_event_set *)the_thread->Wait.return_argument = seized_events; 800e240: 58 82 00 00 sw (r4+0),r2 _Event_Sync_state = THREAD_BLOCKING_OPERATION_SATISFIED; 800e244: 34 02 00 03 mvi r2,3 800e248: 58 62 00 00 sw (r3+0),r2 } _ISR_Enable( level ); 800e24c: d0 01 00 00 wcsr IE,r1 return; 800e250: e3 ff ff d8 bi 800e1b0 <_Event_Surrender+0xc0> =============================================================================== 0800e254 <_Event_Timeout>: void _Event_Timeout( Objects_Id id, void *ignored ) { 800e254: 37 9c ff f8 addi sp,sp,-8 800e258: 5b 9d 00 04 sw (sp+4),ra Thread_Control *the_thread; Objects_Locations location; ISR_Level level; the_thread = _Thread_Get( id, &location ); 800e25c: 37 82 00 08 addi r2,sp,8 800e260: fb ff e2 88 calli 8006c80 <_Thread_Get> switch ( location ) { 800e264: 2b 82 00 08 lw r2,(sp+8) 800e268: 44 40 00 04 be r2,r0,800e278 <_Event_Timeout+0x24> <== ALWAYS TAKEN case OBJECTS_REMOTE: /* impossible */ #endif case OBJECTS_ERROR: break; } } 800e26c: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 800e270: 37 9c 00 08 addi sp,sp,8 <== NOT EXECUTED 800e274: c3 a0 00 00 ret <== NOT EXECUTED * * 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 ); 800e278: 90 00 18 00 rcsr r3,IE 800e27c: 34 02 ff fe mvi r2,-2 800e280: a0 62 10 00 and r2,r3,r2 800e284: d0 02 00 00 wcsr IE,r2 RTEMS_INLINE_ROUTINE bool _Thread_Is_executing ( const Thread_Control *the_thread ) { return ( the_thread == _Thread_Executing ); 800e288: 78 02 08 01 mvhi r2,0x801 800e28c: 38 42 ae 2c ori r2,r2,0xae2c return; } #endif the_thread->Wait.count = 0; if ( _Thread_Is_executing( the_thread ) ) { 800e290: 28 42 00 0c lw r2,(r2+12) _ISR_Enable( level ); return; } #endif the_thread->Wait.count = 0; 800e294: 58 20 00 24 sw (r1+36),r0 if ( _Thread_Is_executing( the_thread ) ) { 800e298: 44 22 00 10 be r1,r2,800e2d8 <_Event_Timeout+0x84> if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) _Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT; } the_thread->Wait.return_code = RTEMS_TIMEOUT; 800e29c: 34 02 00 06 mvi r2,6 800e2a0: 58 22 00 34 sw (r1+52),r2 _ISR_Enable( level ); 800e2a4: d0 03 00 00 wcsr IE,r3 RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); 800e2a8: 78 03 08 01 mvhi r3,0x801 800e2ac: 38 63 8b ac ori r3,r3,0x8bac 800e2b0: 28 62 00 00 lw r2,(r3+0) 800e2b4: f8 00 05 52 calli 800f7fc <_Thread_Clear_state> */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; 800e2b8: 78 01 08 01 mvhi r1,0x801 800e2bc: 38 21 a9 60 ori r1,r1,0xa960 800e2c0: 28 22 00 00 lw r2,(r1+0) 800e2c4: 34 42 ff ff addi r2,r2,-1 800e2c8: 58 22 00 00 sw (r1+0),r2 case OBJECTS_REMOTE: /* impossible */ #endif case OBJECTS_ERROR: break; } } 800e2cc: 2b 9d 00 04 lw ra,(sp+4) 800e2d0: 37 9c 00 08 addi sp,sp,8 800e2d4: c3 a0 00 00 ret } #endif the_thread->Wait.count = 0; if ( _Thread_Is_executing( the_thread ) ) { if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) 800e2d8: 78 02 08 01 mvhi r2,0x801 800e2dc: 38 42 b3 20 ori r2,r2,0xb320 800e2e0: 28 45 00 00 lw r5,(r2+0) 800e2e4: 34 04 00 01 mvi r4,1 800e2e8: 5c a4 ff ed bne r5,r4,800e29c <_Event_Timeout+0x48> <== ALWAYS TAKEN _Event_Sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT; 800e2ec: 34 04 00 02 mvi r4,2 <== NOT EXECUTED 800e2f0: 58 44 00 00 sw (r2+0),r4 <== NOT EXECUTED 800e2f4: e3 ff ff ea bi 800e29c <_Event_Timeout+0x48> <== NOT EXECUTED =============================================================================== 0800a07c <_Heap_Allocate_aligned_with_boundary>: Heap_Control *heap, uintptr_t alloc_size, uintptr_t alignment, uintptr_t boundary ) { 800a07c: 37 9c ff bc addi sp,sp,-68 800a080: 5b 8b 00 44 sw (sp+68),r11 800a084: 5b 8c 00 40 sw (sp+64),r12 800a088: 5b 8d 00 3c sw (sp+60),r13 800a08c: 5b 8e 00 38 sw (sp+56),r14 800a090: 5b 8f 00 34 sw (sp+52),r15 800a094: 5b 90 00 30 sw (sp+48),r16 800a098: 5b 91 00 2c sw (sp+44),r17 800a09c: 5b 92 00 28 sw (sp+40),r18 800a0a0: 5b 93 00 24 sw (sp+36),r19 800a0a4: 5b 94 00 20 sw (sp+32),r20 800a0a8: 5b 95 00 1c sw (sp+28),r21 800a0ac: 5b 96 00 18 sw (sp+24),r22 800a0b0: 5b 97 00 14 sw (sp+20),r23 800a0b4: 5b 98 00 10 sw (sp+16),r24 800a0b8: 5b 99 00 0c sw (sp+12),r25 800a0bc: 5b 9b 00 08 sw (sp+8),fp 800a0c0: 5b 9d 00 04 sw (sp+4),ra Heap_Statistics *const stats = &heap->stats; uintptr_t const block_size_floor = alloc_size + HEAP_BLOCK_HEADER_SIZE 800a0c4: 34 54 00 04 addi r20,r2,4 Heap_Control *heap, uintptr_t alloc_size, uintptr_t alignment, uintptr_t boundary ) { 800a0c8: b8 20 78 00 mv r15,r1 Heap_Statistics *const stats = &heap->stats; uintptr_t const block_size_floor = alloc_size + HEAP_BLOCK_HEADER_SIZE - HEAP_ALLOC_BONUS; uintptr_t const page_size = heap->page_size; 800a0cc: 28 37 00 10 lw r23,(r1+16) Heap_Control *heap, uintptr_t alloc_size, uintptr_t alignment, uintptr_t boundary ) { 800a0d0: b8 40 70 00 mv r14,r2 800a0d4: b8 60 80 00 mv r16,r3 800a0d8: b8 80 90 00 mv r18,r4 uint32_t search_count = 0; bool search_again = false; if ( block_size_floor < alloc_size ) { /* Integer overflow occured */ return NULL; 800a0dc: 34 01 00 00 mvi r1,0 Heap_Block *block = NULL; uintptr_t alloc_begin = 0; uint32_t search_count = 0; bool search_again = false; if ( block_size_floor < alloc_size ) { 800a0e0: 54 54 00 5b bgu r2,r20,800a24c <_Heap_Allocate_aligned_with_boundary+0x1d0> /* Integer overflow occured */ return NULL; } if ( boundary != 0 ) { 800a0e4: 5c 80 00 6f bne r4,r0,800a2a0 <_Heap_Allocate_aligned_with_boundary+0x224> if ( stats->max_search < search_count ) { stats->max_search = search_count; } return (void *) alloc_begin; } 800a0e8: 29 ec 00 08 lw r12,(r15+8) do { Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap ); block = _Heap_Free_list_first( heap ); while ( block != free_list_tail ) { 800a0ec: 34 01 00 00 mvi r1,0 800a0f0: 45 ec 00 57 be r15,r12,800a24c <_Heap_Allocate_aligned_with_boundary+0x1d0> uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block ); uintptr_t const alloc_begin_ceiling = block_end - min_block_size + HEAP_BLOCK_HEADER_SIZE + page_size - 1; uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS; 800a0f4: 34 18 00 04 mvi r24,4 do { Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap ); block = _Heap_Free_list_first( heap ); while ( block != free_list_tail ) { 800a0f8: 34 11 00 01 mvi r17,1 - 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; 800a0fc: 34 1b ff fe mvi fp,-2 uintptr_t const block_begin = (uintptr_t) block; uintptr_t const block_size = _Heap_Block_size( block ); uintptr_t const block_end = block_begin + block_size; uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block ); uintptr_t const alloc_begin_ceiling = block_end - min_block_size 800a100: 36 f9 00 07 addi r25,r23,7 + HEAP_BLOCK_HEADER_SIZE + page_size - 1; uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS; 800a104: cb 0e c0 00 sub r24,r24,r14 /* * The HEAP_PREV_BLOCK_USED flag is always set in the block size_and_flag * field. Thus the value is about one unit larger than the real block * size. The greater than operator takes this into account. */ if ( block->size_and_flag > block_size_floor ) { 800a108: 29 81 00 04 lw r1,(r12+4) 800a10c: 52 81 00 3b bgeu r20,r1,800a1f8 <_Heap_Allocate_aligned_with_boundary+0x17c> RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block( const Heap_Block *block ) { return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE; 800a110: 35 8b 00 08 addi r11,r12,8 if ( alignment == 0 ) { 800a114: 46 00 00 3e be r16,r0,800a20c <_Heap_Allocate_aligned_with_boundary+0x190> - 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; 800a118: a0 3b 68 00 and r13,r1,fp if ( stats->max_search < search_count ) { stats->max_search = search_count; } return (void *) alloc_begin; } 800a11c: 29 f5 00 14 lw r21,(r15+20) uintptr_t const page_size = heap->page_size; uintptr_t const min_block_size = heap->min_block_size; uintptr_t const block_begin = (uintptr_t) block; uintptr_t const block_size = _Heap_Block_size( block ); uintptr_t const block_end = block_begin + block_size; 800a120: b5 8d 68 00 add r13,r12,r13 uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block ); uintptr_t const alloc_begin_ceiling = block_end - min_block_size + HEAP_BLOCK_HEADER_SIZE + page_size - 1; uintptr_t alloc_end = block_end + HEAP_ALLOC_BONUS; uintptr_t alloc_begin = alloc_end - alloc_size; 800a124: b7 0d 58 00 add r11,r24,r13 uintptr_t const block_size = _Heap_Block_size( block ); uintptr_t const block_end = block_begin + block_size; uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block ); uintptr_t const alloc_begin_ceiling = block_end - min_block_size + HEAP_BLOCK_HEADER_SIZE + page_size - 1; 800a128: cb 35 18 00 sub r3,r25,r21 RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down( uintptr_t value, uintptr_t alignment ) { return value - (value % alignment); 800a12c: b9 60 08 00 mv r1,r11 800a130: ba 00 10 00 mv r2,r16 uintptr_t const block_begin = (uintptr_t) block; uintptr_t const block_size = _Heap_Block_size( block ); uintptr_t const block_end = block_begin + block_size; uintptr_t const alloc_begin_floor = _Heap_Alloc_area_of_block( block ); uintptr_t const alloc_begin_ceiling = block_end - min_block_size 800a134: b4 6d 68 00 add r13,r3,r13 800a138: f8 00 20 ff calli 8012534 <__umodsi3> 800a13c: c9 61 58 00 sub r11,r11,r1 RTEMS_INLINE_ROUTINE uintptr_t _Heap_Alloc_area_of_block( const Heap_Block *block ) { return (uintptr_t) block + HEAP_BLOCK_HEADER_SIZE; 800a140: 35 96 00 08 addi r22,r12,8 uintptr_t alloc_begin = alloc_end - alloc_size; alloc_begin = _Heap_Align_down( alloc_begin, alignment ); /* Ensure that the we have a valid new block at the end */ if ( alloc_begin > alloc_begin_ceiling ) { 800a144: 51 ab 00 05 bgeu r13,r11,800a158 <_Heap_Allocate_aligned_with_boundary+0xdc> RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down( uintptr_t value, uintptr_t alignment ) { return value - (value % alignment); 800a148: b9 a0 08 00 mv r1,r13 800a14c: ba 00 10 00 mv r2,r16 800a150: f8 00 20 f9 calli 8012534 <__umodsi3> 800a154: c9 a1 58 00 sub r11,r13,r1 } alloc_end = alloc_begin + alloc_size; /* Ensure boundary constaint */ if ( boundary != 0 ) { 800a158: 46 40 00 1c be r18,r0,800a1c8 <_Heap_Allocate_aligned_with_boundary+0x14c> /* Ensure that the we have a valid new block at the end */ if ( alloc_begin > alloc_begin_ceiling ) { alloc_begin = _Heap_Align_down( alloc_begin_ceiling, alignment ); } alloc_end = alloc_begin + alloc_size; 800a15c: b5 6e 68 00 add r13,r11,r14 800a160: b9 a0 08 00 mv r1,r13 800a164: ba 40 10 00 mv r2,r18 800a168: f8 00 20 f3 calli 8012534 <__umodsi3> 800a16c: c9 a1 28 00 sub r5,r13,r1 /* Ensure boundary constaint */ if ( boundary != 0 ) { uintptr_t const boundary_floor = alloc_begin_floor + alloc_size; uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary ); while ( alloc_begin < boundary_line && boundary_line < alloc_end ) { 800a170: f5 a5 68 00 cmpgu r13,r13,r5 800a174: f4 ab 08 00 cmpgu r1,r5,r11 800a178: a1 a1 68 00 and r13,r13,r1 800a17c: 45 a0 00 13 be r13,r0,800a1c8 <_Heap_Allocate_aligned_with_boundary+0x14c> alloc_end = alloc_begin + alloc_size; /* Ensure boundary constaint */ if ( boundary != 0 ) { uintptr_t const boundary_floor = alloc_begin_floor + alloc_size; 800a180: b6 ce 98 00 add r19,r22,r14 uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary ); while ( alloc_begin < boundary_line && boundary_line < alloc_end ) { if ( boundary_line < boundary_floor ) { 800a184: 56 65 00 1d bgu r19,r5,800a1f8 <_Heap_Allocate_aligned_with_boundary+0x17c> 800a188: e0 00 00 02 bi 800a190 <_Heap_Allocate_aligned_with_boundary+0x114> 800a18c: 56 65 00 1b bgu r19,r5,800a1f8 <_Heap_Allocate_aligned_with_boundary+0x17c><== NEVER TAKEN return 0; } alloc_begin = boundary_line - alloc_size; 800a190: c8 ae 58 00 sub r11,r5,r14 800a194: ba 00 10 00 mv r2,r16 800a198: b9 60 08 00 mv r1,r11 800a19c: f8 00 20 e6 calli 8012534 <__umodsi3> 800a1a0: c9 61 58 00 sub r11,r11,r1 alloc_begin = _Heap_Align_down( alloc_begin, alignment ); alloc_end = alloc_begin + alloc_size; 800a1a4: b5 6e 68 00 add r13,r11,r14 800a1a8: b9 a0 08 00 mv r1,r13 800a1ac: ba 40 10 00 mv r2,r18 800a1b0: f8 00 20 e1 calli 8012534 <__umodsi3> 800a1b4: c9 a1 28 00 sub r5,r13,r1 /* Ensure boundary constaint */ if ( boundary != 0 ) { uintptr_t const boundary_floor = alloc_begin_floor + alloc_size; uintptr_t boundary_line = _Heap_Align_down( alloc_end, boundary ); while ( alloc_begin < boundary_line && boundary_line < alloc_end ) { 800a1b8: f5 a5 68 00 cmpgu r13,r13,r5 800a1bc: f4 ab 08 00 cmpgu r1,r5,r11 800a1c0: a1 a1 68 00 and r13,r13,r1 800a1c4: 5d a0 ff f2 bne r13,r0,800a18c <_Heap_Allocate_aligned_with_boundary+0x110> boundary_line = _Heap_Align_down( alloc_end, boundary ); } } /* Ensure that the we have a valid new block at the beginning */ if ( alloc_begin >= alloc_begin_floor ) { 800a1c8: 56 cb 00 0c bgu r22,r11,800a1f8 <_Heap_Allocate_aligned_with_boundary+0x17c> 800a1cc: 34 01 ff f8 mvi r1,-8 800a1d0: c8 2c 68 00 sub r13,r1,r12 800a1d4: ba e0 10 00 mv r2,r23 800a1d8: b9 60 08 00 mv r1,r11 800a1dc: f8 00 20 d6 calli 8012534 <__umodsi3> uintptr_t alloc_begin, uintptr_t page_size ) { return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size ) - HEAP_BLOCK_HEADER_SIZE); 800a1e0: b5 ab 68 00 add r13,r13,r11 uintptr_t const alloc_block_begin = (uintptr_t) _Heap_Block_of_alloc_area( alloc_begin, page_size ); uintptr_t const free_size = alloc_block_begin - block_begin; 800a1e4: c9 a1 08 00 sub r1,r13,r1 if ( free_size >= min_block_size || free_size == 0 ) { 800a1e8: 64 22 00 00 cmpei r2,r1,0 800a1ec: f0 35 a8 00 cmpgeu r21,r1,r21 800a1f0: b8 55 08 00 or r1,r2,r21 800a1f4: 5c 20 00 06 bne r1,r0,800a20c <_Heap_Allocate_aligned_with_boundary+0x190> if ( alloc_begin != 0 ) { break; } block = block->next; 800a1f8: 29 8c 00 08 lw r12,(r12+8) 800a1fc: 36 21 00 01 addi r1,r17,1 do { Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap ); block = _Heap_Free_list_first( heap ); while ( block != free_list_tail ) { 800a200: 45 ec 00 26 be r15,r12,800a298 <_Heap_Allocate_aligned_with_boundary+0x21c> 800a204: b8 20 88 00 mv r17,r1 800a208: e3 ff ff c0 bi 800a108 <_Heap_Allocate_aligned_with_boundary+0x8c> } /* Statistics */ ++search_count; if ( alloc_begin != 0 ) { 800a20c: 45 60 ff fb be r11,r0,800a1f8 <_Heap_Allocate_aligned_with_boundary+0x17c><== NEVER TAKEN search_again = _Heap_Protection_free_delayed_blocks( heap, alloc_begin ); } while ( search_again ); if ( alloc_begin != 0 ) { /* Statistics */ ++stats->allocs; 800a210: 29 e3 00 48 lw r3,(r15+72) stats->searches += search_count; 800a214: 29 e2 00 4c lw r2,(r15+76) block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size ); 800a218: b9 e0 08 00 mv r1,r15 search_again = _Heap_Protection_free_delayed_blocks( heap, alloc_begin ); } while ( search_again ); if ( alloc_begin != 0 ) { /* Statistics */ ++stats->allocs; 800a21c: 34 63 00 01 addi r3,r3,1 stats->searches += search_count; 800a220: b4 51 10 00 add r2,r2,r17 search_again = _Heap_Protection_free_delayed_blocks( heap, alloc_begin ); } while ( search_again ); if ( alloc_begin != 0 ) { /* Statistics */ ++stats->allocs; 800a224: 59 e3 00 48 sw (r15+72),r3 stats->searches += search_count; 800a228: 59 e2 00 4c sw (r15+76),r2 block = _Heap_Block_allocate( heap, block, alloc_begin, alloc_size ); 800a22c: b9 60 18 00 mv r3,r11 800a230: b9 80 10 00 mv r2,r12 800a234: b9 c0 20 00 mv r4,r14 800a238: fb ff e8 16 calli 8004290 <_Heap_Block_allocate> 800a23c: b9 60 08 00 mv r1,r11 boundary ); } /* Statistics */ if ( stats->max_search < search_count ) { 800a240: 29 e2 00 44 lw r2,(r15+68) 800a244: 50 51 00 02 bgeu r2,r17,800a24c <_Heap_Allocate_aligned_with_boundary+0x1d0> stats->max_search = search_count; 800a248: 59 f1 00 44 sw (r15+68),r17 } return (void *) alloc_begin; } 800a24c: 2b 9d 00 04 lw ra,(sp+4) 800a250: 2b 8b 00 44 lw r11,(sp+68) 800a254: 2b 8c 00 40 lw r12,(sp+64) 800a258: 2b 8d 00 3c lw r13,(sp+60) 800a25c: 2b 8e 00 38 lw r14,(sp+56) 800a260: 2b 8f 00 34 lw r15,(sp+52) 800a264: 2b 90 00 30 lw r16,(sp+48) 800a268: 2b 91 00 2c lw r17,(sp+44) 800a26c: 2b 92 00 28 lw r18,(sp+40) 800a270: 2b 93 00 24 lw r19,(sp+36) 800a274: 2b 94 00 20 lw r20,(sp+32) 800a278: 2b 95 00 1c lw r21,(sp+28) 800a27c: 2b 96 00 18 lw r22,(sp+24) 800a280: 2b 97 00 14 lw r23,(sp+20) 800a284: 2b 98 00 10 lw r24,(sp+16) 800a288: 2b 99 00 0c lw r25,(sp+12) 800a28c: 2b 9b 00 08 lw fp,(sp+8) 800a290: 37 9c 00 44 addi sp,sp,68 800a294: c3 a0 00 00 ret do { Heap_Block *const free_list_tail = _Heap_Free_list_tail( heap ); block = _Heap_Free_list_first( heap ); while ( block != free_list_tail ) { 800a298: 34 01 00 00 mvi r1,0 800a29c: e3 ff ff e9 bi 800a240 <_Heap_Allocate_aligned_with_boundary+0x1c4> /* Integer overflow occured */ return NULL; } if ( boundary != 0 ) { if ( boundary < alloc_size ) { 800a2a0: 54 44 ff eb bgu r2,r4,800a24c <_Heap_Allocate_aligned_with_boundary+0x1d0> return NULL; } if ( alignment == 0 ) { 800a2a4: 5c 60 ff 91 bne r3,r0,800a0e8 <_Heap_Allocate_aligned_with_boundary+0x6c> alignment = page_size; 800a2a8: ba e0 80 00 mv r16,r23 800a2ac: e3 ff ff 8f bi 800a0e8 <_Heap_Allocate_aligned_with_boundary+0x6c> =============================================================================== 0800a50c <_Heap_Extend>: Heap_Control *heap, void *extend_area_begin_ptr, uintptr_t extend_area_size, uintptr_t *extended_size_ptr ) { 800a50c: 37 9c ff b8 addi sp,sp,-72 800a510: 5b 8b 00 40 sw (sp+64),r11 800a514: 5b 8c 00 3c sw (sp+60),r12 800a518: 5b 8d 00 38 sw (sp+56),r13 800a51c: 5b 8e 00 34 sw (sp+52),r14 800a520: 5b 8f 00 30 sw (sp+48),r15 800a524: 5b 90 00 2c sw (sp+44),r16 800a528: 5b 91 00 28 sw (sp+40),r17 800a52c: 5b 92 00 24 sw (sp+36),r18 800a530: 5b 93 00 20 sw (sp+32),r19 800a534: 5b 94 00 1c sw (sp+28),r20 800a538: 5b 95 00 18 sw (sp+24),r21 800a53c: 5b 96 00 14 sw (sp+20),r22 800a540: 5b 97 00 10 sw (sp+16),r23 800a544: 5b 98 00 0c sw (sp+12),r24 800a548: 5b 99 00 08 sw (sp+8),r25 800a54c: 5b 9d 00 04 sw (sp+4),ra 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; 800a550: 5b 80 00 48 sw (sp+72),r0 Heap_Block *extend_last_block = NULL; 800a554: 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; 800a558: b4 43 70 00 add r14,r2,r3 Heap_Control *heap, void *extend_area_begin_ptr, uintptr_t extend_area_size, uintptr_t *extended_size_ptr ) { 800a55c: b8 40 68 00 mv r13,r2 800a560: b8 20 58 00 mv r11,r1 800a564: b8 80 b8 00 mv r23,r4 Heap_Statistics *const stats = &heap->stats; Heap_Block *const first_block = heap->first_block; 800a568: 28 30 00 20 lw r16,(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; 800a56c: 28 32 00 10 lw r18,(r1+16) uintptr_t const min_block_size = heap->min_block_size; 800a570: 28 25 00 14 lw r5,(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; 800a574: 28 38 00 30 lw r24,(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; 800a578: 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 ) { 800a57c: 54 4e 00 76 bgu r2,r14,800a754 <_Heap_Extend+0x248> return false; } extend_area_ok = _Heap_Get_first_and_last_block( 800a580: b8 40 08 00 mv r1,r2 800a584: b8 a0 20 00 mv r4,r5 800a588: b8 60 10 00 mv r2,r3 800a58c: 37 85 00 48 addi r5,sp,72 800a590: ba 40 18 00 mv r3,r18 800a594: 37 86 00 44 addi r6,sp,68 800a598: fb ff e7 a6 calli 8004430 <_Heap_Get_first_and_last_block> page_size, min_block_size, &extend_first_block, &extend_last_block ); if (!extend_area_ok ) { 800a59c: 44 20 00 6e be r1,r0,800a754 <_Heap_Extend+0x248> 800a5a0: ba 00 60 00 mv r12,r16 800a5a4: 34 16 00 00 mvi r22,0 800a5a8: 34 19 00 00 mvi r25,0 800a5ac: 34 11 00 00 mvi r17,0 800a5b0: 34 14 00 00 mvi r20,0 } RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block ) { return block->size_and_flag & ~HEAP_PREV_BLOCK_USED; 800a5b4: 34 15 ff fe mvi r21,-2 800a5b8: e0 00 00 0d bi 800a5ec <_Heap_Extend+0xe0> return false; } if ( extend_area_end == sub_area_begin ) { merge_below_block = start_block; } else if ( extend_area_end < sub_area_end ) { 800a5bc: 55 ee 00 7b bgu r15,r14,800a7a8 <_Heap_Extend+0x29c> RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down( uintptr_t value, uintptr_t alignment ) { return value - (value % alignment); 800a5c0: b9 e0 08 00 mv r1,r15 800a5c4: ba 40 10 00 mv r2,r18 800a5c8: 35 f3 ff f8 addi r19,r15,-8 800a5cc: f8 00 21 5e calli 8012b44 <__umodsi3> uintptr_t alloc_begin, uintptr_t page_size ) { return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size ) - HEAP_BLOCK_HEADER_SIZE); 800a5d0: ca 61 08 00 sub r1,r19,r1 link_below_block = start_block; } if ( sub_area_end == extend_area_begin ) { 800a5d4: 45 af 00 15 be r13,r15,800a628 <_Heap_Extend+0x11c> start_block->prev_size = extend_area_end; merge_above_block = end_block; } else if ( sub_area_end < extend_area_begin ) { 800a5d8: 55 af 00 72 bgu r13,r15,800a7a0 <_Heap_Extend+0x294> } RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block ) { return block->size_and_flag & ~HEAP_PREV_BLOCK_USED; 800a5dc: 28 2c 00 04 lw r12,(r1+4) 800a5e0: a2 ac 60 00 and r12,r21,r12 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); 800a5e4: b4 2c 60 00 add r12,r1,r12 link_above_block = end_block; } start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) ); } while ( start_block != first_block ); 800a5e8: 46 0c 00 16 be r16,r12,800a640 <_Heap_Extend+0x134> return false; } do { uintptr_t const sub_area_begin = (start_block != first_block) ? (uintptr_t) start_block : heap->area_begin; 800a5ec: b9 80 08 00 mv r1,r12 800a5f0: 45 90 00 70 be r12,r16,800a7b0 <_Heap_Extend+0x2a4> uintptr_t const sub_area_end = start_block->prev_size; 800a5f4: 29 8f 00 00 lw r15,(r12+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 800a5f8: f5 c1 30 00 cmpgu r6,r14,r1 800a5fc: f5 ed 28 00 cmpgu r5,r15,r13 (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 ( 800a600: a0 c5 28 00 and r5,r6,r5 800a604: 5c a0 00 75 bne r5,r0,800a7d8 <_Heap_Extend+0x2cc> sub_area_end > extend_area_begin && extend_area_end > sub_area_begin ) { return false; } if ( extend_area_end == sub_area_begin ) { 800a608: 5c 2e ff ed bne r1,r14,800a5bc <_Heap_Extend+0xb0> RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down( uintptr_t value, uintptr_t alignment ) { return value - (value % alignment); 800a60c: b9 e0 08 00 mv r1,r15 800a610: ba 40 10 00 mv r2,r18 800a614: 35 f3 ff f8 addi r19,r15,-8 800a618: f8 00 21 4b calli 8012b44 <__umodsi3> 800a61c: b9 80 a0 00 mv r20,r12 uintptr_t alloc_begin, uintptr_t page_size ) { return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size ) - HEAP_BLOCK_HEADER_SIZE); 800a620: ca 61 08 00 sub r1,r19,r1 merge_below_block = start_block; } else if ( extend_area_end < sub_area_end ) { link_below_block = start_block; } if ( sub_area_end == extend_area_begin ) { 800a624: 5d af ff ed bne r13,r15,800a5d8 <_Heap_Extend+0xcc> <== ALWAYS TAKEN start_block->prev_size = extend_area_end; 800a628: 59 8e 00 00 sw (r12+0),r14 } RTEMS_INLINE_ROUTINE uintptr_t _Heap_Block_size( const Heap_Block *block ) { return block->size_and_flag & ~HEAP_PREV_BLOCK_USED; 800a62c: 28 2c 00 04 lw r12,(r1+4) 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 ) 800a630: 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; 800a634: a2 ac 60 00 and r12,r21,r12 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); 800a638: b4 2c 60 00 add r12,r1,r12 } else if ( sub_area_end < extend_area_begin ) { link_above_block = end_block; } start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) ); } while ( start_block != first_block ); 800a63c: 5e 0c ff ec bne r16,r12,800a5ec <_Heap_Extend+0xe0> <== NEVER TAKEN if ( extend_area_begin < heap->area_begin ) { 800a640: 29 61 00 18 lw r1,(r11+24) 800a644: 51 a1 00 61 bgeu r13,r1,800a7c8 <_Heap_Extend+0x2bc> heap->area_begin = extend_area_begin; 800a648: 59 6d 00 18 sw (r11+24),r13 } else if ( heap->area_end < extend_area_end ) { heap->area_end = extend_area_end; } extend_first_block_size = (uintptr_t) extend_last_block - (uintptr_t) extend_first_block; 800a64c: 2b 81 00 44 lw r1,(sp+68) 800a650: 2b 82 00 48 lw r2,(sp+72) extend_last_block->prev_size = extend_first_block_size; 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 ) { 800a654: 29 65 00 20 lw r5,(r11+32) heap->area_begin = extend_area_begin; } else if ( heap->area_end < extend_area_end ) { heap->area_end = extend_area_end; } extend_first_block_size = 800a658: 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; extend_first_block->size_and_flag = extend_first_block_size | HEAP_PREV_BLOCK_USED; 800a65c: 38 64 00 01 ori r4,r3,0x1 } extend_first_block_size = (uintptr_t) extend_last_block - (uintptr_t) extend_first_block; extend_first_block->prev_size = extend_area_end; 800a660: 58 4e 00 00 sw (r2+0),r14 extend_first_block->size_and_flag = 800a664: 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; 800a668: 58 23 00 00 sw (r1+0),r3 extend_last_block->size_and_flag = 0; 800a66c: 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 ) { 800a670: 50 45 00 52 bgeu r2,r5,800a7b8 <_Heap_Extend+0x2ac> heap->first_block = extend_first_block; 800a674: 59 62 00 20 sw (r11+32),r2 } else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) { heap->last_block = extend_last_block; } if ( merge_below_block != NULL ) { 800a678: 46 80 00 6a be r20,r0,800a820 <_Heap_Extend+0x314> Heap_Control *heap, uintptr_t extend_area_begin, Heap_Block *first_block ) { uintptr_t const page_size = heap->page_size; 800a67c: 29 6c 00 10 lw r12,(r11+16) uintptr_t const new_first_block_alloc_begin = _Heap_Align_up( extend_area_begin + HEAP_BLOCK_HEADER_SIZE, page_size ); 800a680: 35 ad 00 08 addi r13,r13,8 RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_up( uintptr_t value, uintptr_t alignment ) { uintptr_t remainder = value % alignment; 800a684: b9 a0 08 00 mv r1,r13 800a688: b9 80 10 00 mv r2,r12 800a68c: f8 00 21 2e calli 8012b44 <__umodsi3> if ( remainder != 0 ) { 800a690: 44 20 00 03 be r1,r0,800a69c <_Heap_Extend+0x190> <== ALWAYS TAKEN return value - remainder + alignment; 800a694: b5 ac 68 00 add r13,r13,r12 <== NOT EXECUTED 800a698: c9 a1 68 00 sub r13,r13,r1 <== NOT EXECUTED uintptr_t const new_first_block_begin = 800a69c: 35 a2 ff f8 addi r2,r13,-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; 800a6a0: 2a 83 00 00 lw r3,(r20+0) 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 = 800a6a4: ca 82 08 00 sub r1,r20,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; 800a6a8: 38 21 00 01 ori r1,r1,0x1 800a6ac: 58 41 00 04 sw (r2+4),r1 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; 800a6b0: 59 a3 ff f8 sw (r13+-8),r3 new_first_block->size_and_flag = new_first_block_size | HEAP_PREV_BLOCK_USED; _Heap_Free_block( heap, new_first_block ); 800a6b4: b9 60 08 00 mv r1,r11 800a6b8: fb ff ff 88 calli 800a4d8 <_Heap_Free_block> link_below_block, extend_last_block ); } if ( merge_above_block != NULL ) { 800a6bc: 46 20 00 49 be r17,r0,800a7e0 <_Heap_Extend+0x2d4> RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down( uintptr_t value, uintptr_t alignment ) { return value - (value % alignment); 800a6c0: 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, 800a6c4: 35 ce ff f8 addi r14,r14,-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( 800a6c8: c9 d1 70 00 sub r14,r14,r17 800a6cc: b9 c0 08 00 mv r1,r14 800a6d0: f8 00 21 1d calli 8012b44 <__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) 800a6d4: 2a 22 00 04 lw r2,(r17+4) 800a6d8: c9 c1 70 00 sub r14,r14,r1 page_size ); Heap_Block *const new_last_block = _Heap_Block_at( last_block, last_block_new_size ); new_last_block->size_and_flag = 800a6dc: b5 d1 08 00 add r1,r14,r17 (last_block->size_and_flag - last_block_new_size) 800a6e0: c8 4e 10 00 sub r2,r2,r14 | HEAP_PREV_BLOCK_USED; 800a6e4: 38 42 00 01 ori r2,r2,0x1 page_size ); Heap_Block *const new_last_block = _Heap_Block_at( last_block, last_block_new_size ); new_last_block->size_and_flag = 800a6e8: 58 22 00 04 sw (r1+4),r2 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; 800a6ec: 2a 23 00 04 lw r3,(r17+4) (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 ); 800a6f0: b9 60 08 00 mv r1,r11 800a6f4: ba 20 10 00 mv r2,r17 800a6f8: 20 63 00 01 andi r3,r3,0x1 block->size_and_flag = size | flag; 800a6fc: b9 c3 70 00 or r14,r14,r3 800a700: 5a 2e 00 04 sw (r17+4),r14 800a704: fb ff ff 75 calli 800a4d8 <_Heap_Free_block> extend_first_block, extend_last_block ); } if ( merge_below_block == NULL && merge_above_block == NULL ) { 800a708: 66 31 00 00 cmpei r17,r17,0 800a70c: 66 94 00 00 cmpei r20,r20,0 800a710: a2 34 88 00 and r17,r17,r20 800a714: 5e 20 00 3f bne r17,r0,800a810 <_Heap_Extend+0x304> if ( extended_size_ptr != NULL ) *extended_size_ptr = extended_size; return true; } 800a718: 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( 800a71c: 29 63 00 20 lw r3,(r11+32) _Heap_Free_block( heap, extend_first_block ); } _Heap_Set_last_block_size( heap ); extended_size = stats->free_size - free_size; 800a720: 29 65 00 30 lw r5,(r11+48) 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; 800a724: 28 22 00 04 lw r2,(r1+4) /* Statistics */ stats->size += extended_size; 800a728: 29 64 00 2c lw r4,(r11+44) * 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( 800a72c: 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; 800a730: 20 42 00 01 andi r2,r2,0x1 block->size_and_flag = size | flag; 800a734: b8 62 10 00 or r2,r3,r2 _Heap_Free_block( heap, extend_first_block ); } _Heap_Set_last_block_size( heap ); extended_size = stats->free_size - free_size; 800a738: c8 b8 c0 00 sub r24,r5,r24 800a73c: 58 22 00 04 sw (r1+4),r2 /* Statistics */ stats->size += extended_size; 800a740: b4 98 08 00 add r1,r4,r24 800a744: 59 61 00 2c sw (r11+44),r1 if ( extended_size_ptr != NULL ) *extended_size_ptr = extended_size; return true; 800a748: 34 0c 00 01 mvi r12,1 extended_size = stats->free_size - free_size; /* Statistics */ stats->size += extended_size; if ( extended_size_ptr != NULL ) 800a74c: 46 e0 00 02 be r23,r0,800a754 <_Heap_Extend+0x248> <== NEVER TAKEN *extended_size_ptr = extended_size; 800a750: 5a f8 00 00 sw (r23+0),r24 return true; } 800a754: b9 80 08 00 mv r1,r12 800a758: 2b 9d 00 04 lw ra,(sp+4) 800a75c: 2b 8b 00 40 lw r11,(sp+64) 800a760: 2b 8c 00 3c lw r12,(sp+60) 800a764: 2b 8d 00 38 lw r13,(sp+56) 800a768: 2b 8e 00 34 lw r14,(sp+52) 800a76c: 2b 8f 00 30 lw r15,(sp+48) 800a770: 2b 90 00 2c lw r16,(sp+44) 800a774: 2b 91 00 28 lw r17,(sp+40) 800a778: 2b 92 00 24 lw r18,(sp+36) 800a77c: 2b 93 00 20 lw r19,(sp+32) 800a780: 2b 94 00 1c lw r20,(sp+28) 800a784: 2b 95 00 18 lw r21,(sp+24) 800a788: 2b 96 00 14 lw r22,(sp+20) 800a78c: 2b 97 00 10 lw r23,(sp+16) 800a790: 2b 98 00 0c lw r24,(sp+12) 800a794: 2b 99 00 08 lw r25,(sp+8) 800a798: 37 9c 00 48 addi sp,sp,72 800a79c: c3 a0 00 00 ret 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 ) 800a7a0: b8 20 b0 00 mv r22,r1 800a7a4: e3 ff ff 8e bi 800a5dc <_Heap_Extend+0xd0> return false; } if ( extend_area_end == sub_area_begin ) { merge_below_block = start_block; } else if ( extend_area_end < sub_area_end ) { 800a7a8: b9 80 c8 00 mv r25,r12 800a7ac: e3 ff ff 85 bi 800a5c0 <_Heap_Extend+0xb4> return false; } do { uintptr_t const sub_area_begin = (start_block != first_block) ? (uintptr_t) start_block : heap->area_begin; 800a7b0: 29 61 00 18 lw r1,(r11+24) 800a7b4: e3 ff ff 90 bi 800a5f4 <_Heap_Extend+0xe8> extend_last_block->size_and_flag = 0; _Heap_Protection_block_initialize( heap, extend_last_block ); if ( (uintptr_t) extend_first_block < (uintptr_t) heap->first_block ) { heap->first_block = extend_first_block; } else if ( (uintptr_t) extend_last_block > (uintptr_t) heap->last_block ) { 800a7b8: 29 62 00 24 lw r2,(r11+36) 800a7bc: 50 41 ff af bgeu r2,r1,800a678 <_Heap_Extend+0x16c> heap->last_block = extend_last_block; 800a7c0: 59 61 00 24 sw (r11+36),r1 800a7c4: e3 ff ff ad bi 800a678 <_Heap_Extend+0x16c> start_block = _Heap_Block_at( end_block, _Heap_Block_size( end_block ) ); } while ( start_block != first_block ); if ( extend_area_begin < heap->area_begin ) { heap->area_begin = extend_area_begin; } else if ( heap->area_end < extend_area_end ) { 800a7c8: 29 61 00 1c lw r1,(r11+28) 800a7cc: 50 2e ff a0 bgeu r1,r14,800a64c <_Heap_Extend+0x140> heap->area_end = extend_area_end; 800a7d0: 59 6e 00 1c sw (r11+28),r14 800a7d4: e3 ff ff 9e bi 800a64c <_Heap_Extend+0x140> _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; 800a7d8: 34 0c 00 00 mvi r12,0 800a7dc: e3 ff ff de bi 800a754 <_Heap_Extend+0x248> ); } if ( merge_above_block != NULL ) { _Heap_Merge_above( heap, merge_above_block, extend_area_end ); } else if ( link_above_block != NULL ) { 800a7e0: 46 d1 ff ca be r22,r17,800a708 <_Heap_Extend+0x1fc> 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; 800a7e4: 2a c3 00 04 lw r3,(r22+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 ); 800a7e8: 2b 82 00 48 lw r2,(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( 800a7ec: 2b 81 00 44 lw r1,(sp+68) 800a7f0: 20 63 00 01 andi r3,r3,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 ); 800a7f4: c8 56 10 00 sub r2,r2,r22 block->size_and_flag = size | flag; 800a7f8: b8 43 10 00 or r2,r2,r3 800a7fc: 5a c2 00 04 sw (r22+4),r2 last_block->size_and_flag |= HEAP_PREV_BLOCK_USED; 800a800: 28 22 00 04 lw r2,(r1+4) 800a804: 38 42 00 01 ori r2,r2,0x1 800a808: 58 22 00 04 sw (r1+4),r2 800a80c: e3 ff ff bf bi 800a708 <_Heap_Extend+0x1fc> extend_last_block ); } if ( merge_below_block == NULL && merge_above_block == NULL ) { _Heap_Free_block( heap, extend_first_block ); 800a810: 2b 82 00 48 lw r2,(sp+72) 800a814: b9 60 08 00 mv r1,r11 800a818: fb ff ff 30 calli 800a4d8 <_Heap_Free_block> 800a81c: e3 ff ff bf bi 800a718 <_Heap_Extend+0x20c> 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 ) { 800a820: 47 34 ff a7 be r25,r20,800a6bc <_Heap_Extend+0x1b0> { 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; 800a824: cb 21 c8 00 sub r25,r25,r1 800a828: 3b 39 00 01 ori r25,r25,0x1 ) { uintptr_t const last_block_begin = (uintptr_t) last_block; uintptr_t const link_begin = (uintptr_t) link; last_block->size_and_flag = 800a82c: 58 39 00 04 sw (r1+4),r25 800a830: e3 ff ff a3 bi 800a6bc <_Heap_Extend+0x1b0> =============================================================================== 0800a2b0 <_Heap_Free>: return do_free; } #endif bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr ) { 800a2b0: 37 9c ff f4 addi sp,sp,-12 800a2b4: 5b 8b 00 0c sw (sp+12),r11 800a2b8: 5b 8c 00 08 sw (sp+8),r12 800a2bc: 5b 9d 00 04 sw (sp+4),ra 800a2c0: b8 40 18 00 mv r3,r2 RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down( uintptr_t value, uintptr_t alignment ) { return value - (value % alignment); 800a2c4: 28 22 00 10 lw r2,(r1+16) 800a2c8: b8 20 58 00 mv r11,r1 800a2cc: b8 60 08 00 mv r1,r3 800a2d0: 34 6c ff f8 addi r12,r3,-8 800a2d4: f8 00 20 98 calli 8012534 <__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 800a2d8: 29 64 00 20 lw r4,(r11+32) uintptr_t alloc_begin, uintptr_t page_size ) { return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size ) - HEAP_BLOCK_HEADER_SIZE); 800a2dc: c9 81 10 00 sub r2,r12,r1 bool next_is_free = false; _Heap_Protection_block_check( heap, block ); if ( !_Heap_Is_block_in_heap( heap, block ) ) { return false; 800a2e0: 34 01 00 00 mvi r1,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; 800a2e4: 54 82 00 43 bgu r4,r2,800a3f0 <_Heap_Free+0x140> 800a2e8: 29 65 00 24 lw r5,(r11+36) 800a2ec: 54 45 00 41 bgu r2,r5,800a3f0 <_Heap_Free+0x140> --stats->used_blocks; ++stats->frees; stats->free_size += block_size; return( true ); } 800a2f0: 28 48 00 04 lw r8,(r2+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; 800a2f4: 34 07 ff fe mvi r7,-2 800a2f8: a1 07 30 00 and r6,r8,r7 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); 800a2fc: b4 46 18 00 add r3,r2,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; 800a300: 54 83 00 3c bgu r4,r3,800a3f0 <_Heap_Free+0x140> <== NEVER TAKEN 800a304: 54 65 00 3b bgu r3,r5,800a3f0 <_Heap_Free+0x140> <== NEVER TAKEN 800a308: 28 69 00 04 lw r9,(r3+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; 800a30c: 21 2a 00 01 andi r10,r9,0x1 if ( !_Heap_Is_block_in_heap( heap, next_block ) ) { _HAssert( false ); return false; } if ( !_Heap_Is_prev_used( next_block ) ) { 800a310: 45 40 00 38 be r10,r0,800a3f0 <_Heap_Free+0x140> <== 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; 800a314: a1 27 48 00 and r9,r9,r7 return true; } next_block_size = _Heap_Block_size( next_block ); next_is_free = next_block != heap->last_block && !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size )); 800a318: 34 07 00 00 mvi r7,0 800a31c: 44 a3 00 05 be r5,r3,800a330 <_Heap_Free+0x80> --stats->used_blocks; ++stats->frees; stats->free_size += block_size; return( true ); } 800a320: b4 69 08 00 add r1,r3,r9 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; 800a324: 28 27 00 04 lw r7,(r1+4) 800a328: 20 e7 00 01 andi r7,r7,0x1 return do_free; } #endif bool _Heap_Free( Heap_Control *heap, void *alloc_begin_ptr ) 800a32c: 18 e7 00 01 xori r7,r7,0x1 800a330: 21 08 00 01 andi r8,r8,0x1 next_block_size = _Heap_Block_size( next_block ); next_is_free = next_block != heap->last_block && !_Heap_Is_prev_used( _Heap_Block_at( next_block, next_block_size )); if ( !_Heap_Is_prev_used( block ) ) { 800a334: 5d 00 00 19 bne r8,r0,800a398 <_Heap_Free+0xe8> uintptr_t const prev_size = block->prev_size; 800a338: 28 4a 00 00 lw r10,(r2+0) Heap_Block * const prev_block = _Heap_Block_at( block, -prev_size ); if ( !_Heap_Is_block_in_heap( heap, prev_block ) ) { _HAssert( false ); return( false ); 800a33c: 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); 800a340: c8 4a 10 00 sub r2,r2,r10 const Heap_Control *heap, const Heap_Block *block ) { return (uintptr_t) block >= (uintptr_t) heap->first_block && (uintptr_t) block <= (uintptr_t) heap->last_block; 800a344: 54 82 00 2b bgu r4,r2,800a3f0 <_Heap_Free+0x140> <== NEVER TAKEN 800a348: b9 00 08 00 mv r1,r8 800a34c: 54 45 00 29 bgu r2,r5,800a3f0 <_Heap_Free+0x140> <== 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; 800a350: 28 44 00 04 lw r4,(r2+4) 800a354: 20 84 00 01 andi r4,r4,0x1 } /* As we always coalesce free blocks, the block that preceedes prev_block must have been used. */ if ( !_Heap_Is_prev_used ( prev_block) ) { 800a358: 44 80 00 26 be r4,r0,800a3f0 <_Heap_Free+0x140> <== NEVER TAKEN _HAssert( false ); return( false ); } if ( next_is_free ) { /* coalesce both */ 800a35c: 44 e0 00 3d be r7,r0,800a450 <_Heap_Free+0x1a0> uintptr_t const size = block_size + prev_size + next_block_size; _Heap_Free_list_remove( next_block ); stats->free_blocks -= 1; 800a360: 29 64 00 38 lw r4,(r11+56) --stats->used_blocks; ++stats->frees; stats->free_size += block_size; return( true ); } 800a364: 28 61 00 08 lw r1,(r3+8) 800a368: 28 63 00 0c lw r3,(r3+12) _HAssert( false ); return( false ); } if ( next_is_free ) { /* coalesce both */ uintptr_t const size = block_size + prev_size + next_block_size; 800a36c: b4 c9 48 00 add r9,r6,r9 800a370: b5 2a 50 00 add r10,r9,r10 RTEMS_INLINE_ROUTINE void _Heap_Free_list_remove( Heap_Block *block ) { Heap_Block *next = block->next; Heap_Block *prev = block->prev; prev->next = next; 800a374: 58 61 00 08 sw (r3+8),r1 next->prev = prev; 800a378: 58 23 00 0c sw (r1+12),r3 _Heap_Free_list_remove( next_block ); stats->free_blocks -= 1; 800a37c: 34 81 ff ff addi r1,r4,-1 800a380: 59 61 00 38 sw (r11+56),r1 prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED; 800a384: 39 43 00 01 ori r3,r10,0x1 next_block = _Heap_Block_at( prev_block, size ); _HAssert(!_Heap_Is_prev_used( next_block)); next_block->prev_size = size; 800a388: b4 4a 08 00 add r1,r2,r10 if ( next_is_free ) { /* coalesce both */ uintptr_t const size = block_size + prev_size + next_block_size; _Heap_Free_list_remove( next_block ); stats->free_blocks -= 1; prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED; 800a38c: 58 43 00 04 sw (r2+4),r3 next_block = _Heap_Block_at( prev_block, size ); _HAssert(!_Heap_Is_prev_used( next_block)); next_block->prev_size = size; 800a390: 58 2a 00 00 sw (r1+0),r10 800a394: e0 00 00 0d bi 800a3c8 <_Heap_Free+0x118> uintptr_t const size = block_size + prev_size; prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED; next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED; next_block->prev_size = size; } } else if ( next_is_free ) { /* coalesce next */ 800a398: 44 e0 00 1b be r7,r0,800a404 <_Heap_Free+0x154> --stats->used_blocks; ++stats->frees; stats->free_size += block_size; return( true ); } 800a39c: 28 64 00 08 lw r4,(r3+8) 800a3a0: 28 61 00 0c lw r1,(r3+12) prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED; next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED; next_block->prev_size = size; } } else if ( next_is_free ) { /* coalesce next */ uintptr_t const size = block_size + next_block_size; 800a3a4: b5 26 48 00 add r9,r9,r6 ) { Heap_Block *next = old_block->next; Heap_Block *prev = old_block->prev; new_block->next = next; 800a3a8: 58 44 00 08 sw (r2+8),r4 new_block->prev = prev; 800a3ac: 58 41 00 0c sw (r2+12),r1 _Heap_Free_list_replace( next_block, block ); block->size_and_flag = size | HEAP_PREV_BLOCK_USED; 800a3b0: 39 25 00 01 ori r5,r9,0x1 next_block = _Heap_Block_at( block, size ); next_block->prev_size = size; 800a3b4: b4 49 18 00 add r3,r2,r9 next->prev = new_block; 800a3b8: 58 82 00 0c sw (r4+12),r2 prev->next = new_block; 800a3bc: 58 22 00 08 sw (r1+8),r2 next_block->prev_size = size; } } else if ( next_is_free ) { /* coalesce next */ uintptr_t const size = block_size + next_block_size; _Heap_Free_list_replace( next_block, block ); block->size_and_flag = size | HEAP_PREV_BLOCK_USED; 800a3c0: 58 45 00 04 sw (r2+4),r5 next_block = _Heap_Block_at( block, size ); next_block->prev_size = size; 800a3c4: 58 69 00 00 sw (r3+0),r9 stats->max_free_blocks = stats->free_blocks; } } /* Statistics */ --stats->used_blocks; 800a3c8: 29 62 00 40 lw r2,(r11+64) ++stats->frees; 800a3cc: 29 61 00 50 lw r1,(r11+80) stats->free_size += block_size; 800a3d0: 29 63 00 30 lw r3,(r11+48) stats->max_free_blocks = stats->free_blocks; } } /* Statistics */ --stats->used_blocks; 800a3d4: 34 42 ff ff addi r2,r2,-1 ++stats->frees; 800a3d8: 34 21 00 01 addi r1,r1,1 stats->free_size += block_size; 800a3dc: b4 66 30 00 add r6,r3,r6 } } /* Statistics */ --stats->used_blocks; ++stats->frees; 800a3e0: 59 61 00 50 sw (r11+80),r1 stats->max_free_blocks = stats->free_blocks; } } /* Statistics */ --stats->used_blocks; 800a3e4: 59 62 00 40 sw (r11+64),r2 ++stats->frees; stats->free_size += block_size; 800a3e8: 59 66 00 30 sw (r11+48),r6 return( true ); 800a3ec: 34 01 00 01 mvi r1,1 } 800a3f0: 2b 9d 00 04 lw ra,(sp+4) 800a3f4: 2b 8b 00 0c lw r11,(sp+12) 800a3f8: 2b 8c 00 08 lw r12,(sp+8) 800a3fc: 37 9c 00 0c addi sp,sp,12 800a400: c3 a0 00 00 ret 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; 800a404: 38 c1 00 01 ori r1,r6,0x1 800a408: 58 41 00 04 sw (r2+4),r1 next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED; 800a40c: 28 67 00 04 lw r7,(r3+4) next_block->prev_size = block_size; /* Statistics */ ++stats->free_blocks; 800a410: 29 61 00 38 lw r1,(r11+56) RTEMS_INLINE_ROUTINE void _Heap_Free_list_insert_after( Heap_Block *block_before, Heap_Block *new_block ) { Heap_Block *next = block_before->next; 800a414: 29 64 00 08 lw r4,(r11+8) } else { /* no coalesce */ /* Add 'block' to the head of the free blocks list as it tends to produce less fragmentation than adding to the tail. */ _Heap_Free_list_insert_after( _Heap_Free_list_head( heap), block ); block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED; next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED; 800a418: 34 05 ff fe mvi r5,-2 new_block->next = next; new_block->prev = block_before; 800a41c: 58 4b 00 0c sw (r2+12),r11 800a420: a0 e5 28 00 and r5,r7,r5 next_block->prev_size = block_size; /* Statistics */ ++stats->free_blocks; if ( stats->max_free_blocks < stats->free_blocks ) { 800a424: 29 67 00 3c lw r7,(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; 800a428: 34 21 00 01 addi r1,r1,1 Heap_Block *new_block ) { Heap_Block *next = block_before->next; new_block->next = next; 800a42c: 58 44 00 08 sw (r2+8),r4 new_block->prev = block_before; block_before->next = new_block; next->prev = new_block; 800a430: 58 82 00 0c sw (r4+12),r2 } else { /* no coalesce */ /* Add 'block' to the head of the free blocks list as it tends to produce less fragmentation than adding to the tail. */ _Heap_Free_list_insert_after( _Heap_Free_list_head( heap), block ); block->size_and_flag = block_size | HEAP_PREV_BLOCK_USED; next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED; 800a434: 58 65 00 04 sw (r3+4),r5 next_block->prev_size = block_size; 800a438: 58 66 00 00 sw (r3+0),r6 { Heap_Block *next = block_before->next; new_block->next = next; new_block->prev = block_before; block_before->next = new_block; 800a43c: 59 62 00 08 sw (r11+8),r2 /* Statistics */ ++stats->free_blocks; 800a440: 59 61 00 38 sw (r11+56),r1 if ( stats->max_free_blocks < stats->free_blocks ) { 800a444: 50 e1 ff e1 bgeu r7,r1,800a3c8 <_Heap_Free+0x118> stats->max_free_blocks = stats->free_blocks; 800a448: 59 61 00 3c sw (r11+60),r1 800a44c: e3 ff ff df bi 800a3c8 <_Heap_Free+0x118> prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED; next_block = _Heap_Block_at( prev_block, size ); _HAssert(!_Heap_Is_prev_used( next_block)); next_block->prev_size = size; } else { /* coalesce prev */ uintptr_t const size = block_size + prev_size; 800a450: b4 ca 50 00 add r10,r6,r10 prev_block->size_and_flag = size | HEAP_PREV_BLOCK_USED; 800a454: 39 41 00 01 ori r1,r10,0x1 800a458: 58 41 00 04 sw (r2+4),r1 next_block->size_and_flag &= ~HEAP_PREV_BLOCK_USED; 800a45c: 28 62 00 04 lw r2,(r3+4) 800a460: 34 01 ff fe mvi r1,-2 next_block->prev_size = size; 800a464: 58 6a 00 00 sw (r3+0),r10 _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; 800a468: a0 41 08 00 and r1,r2,r1 800a46c: 58 61 00 04 sw (r3+4),r1 800a470: e3 ff ff d6 bi 800a3c8 <_Heap_Free+0x118> =============================================================================== 0800ae88 <_Heap_Get_information>: void _Heap_Get_information( Heap_Control *the_heap, Heap_Information_block *the_info ) { Heap_Block *the_block = the_heap->first_block; 800ae88: 28 24 00 20 lw r4,(r1+32) Heap_Block *const end = the_heap->last_block; 800ae8c: 28 28 00 24 lw r8,(r1+36) memset(the_info, 0, sizeof(*the_info)); 800ae90: 58 40 00 00 sw (r2+0),r0 800ae94: 58 40 00 04 sw (r2+4),r0 800ae98: 58 40 00 08 sw (r2+8),r0 800ae9c: 58 40 00 0c sw (r2+12),r0 800aea0: 58 40 00 10 sw (r2+16),r0 800aea4: 58 40 00 14 sw (r2+20),r0 while ( the_block != end ) { 800aea8: 44 88 00 14 be r4,r8,800aef8 <_Heap_Get_information+0x70> <== NEVER TAKEN 800aeac: 28 85 00 04 lw r5,(r4+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; 800aeb0: 34 09 ff fe mvi r9,-2 800aeb4: a0 a9 18 00 and r3,r5,r9 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); 800aeb8: b4 83 20 00 add r4,r4,r3 if ( info->largest < the_size ) info->largest = the_size; the_block = next_block; } } 800aebc: 28 85 00 04 lw r5,(r4+4) Heap_Information *info; if ( _Heap_Is_prev_used(next_block) ) info = &the_info->Used; else info = &the_info->Free; 800aec0: b8 40 08 00 mv r1,r2 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; 800aec4: 20 a6 00 01 andi r6,r5,0x1 while ( the_block != end ) { uintptr_t const the_size = _Heap_Block_size(the_block); Heap_Block *const next_block = _Heap_Block_at(the_block, the_size); Heap_Information *info; if ( _Heap_Is_prev_used(next_block) ) 800aec8: 44 c0 00 02 be r6,r0,800aed0 <_Heap_Get_information+0x48> info = &the_info->Used; 800aecc: 34 41 00 0c addi r1,r2,12 else info = &the_info->Free; info->number++; 800aed0: 28 27 00 00 lw r7,(r1+0) info->total += the_size; 800aed4: 28 26 00 08 lw r6,(r1+8) if ( info->largest < the_size ) 800aed8: 28 2a 00 04 lw r10,(r1+4) if ( _Heap_Is_prev_used(next_block) ) info = &the_info->Used; else info = &the_info->Free; info->number++; 800aedc: 34 e7 00 01 addi r7,r7,1 info->total += the_size; 800aee0: b4 c3 30 00 add r6,r6,r3 if ( _Heap_Is_prev_used(next_block) ) info = &the_info->Used; else info = &the_info->Free; info->number++; 800aee4: 58 27 00 00 sw (r1+0),r7 info->total += the_size; 800aee8: 58 26 00 08 sw (r1+8),r6 if ( info->largest < the_size ) 800aeec: 51 43 00 02 bgeu r10,r3,800aef4 <_Heap_Get_information+0x6c> info->largest = the_size; 800aef0: 58 23 00 04 sw (r1+4),r3 Heap_Block *the_block = the_heap->first_block; Heap_Block *const end = the_heap->last_block; memset(the_info, 0, sizeof(*the_info)); while ( the_block != end ) { 800aef4: 5d 04 ff f0 bne r8,r4,800aeb4 <_Heap_Get_information+0x2c> 800aef8: c3 a0 00 00 ret =============================================================================== 08012f60 <_Heap_Size_of_alloc_area>: bool _Heap_Size_of_alloc_area( Heap_Control *heap, void *alloc_begin_ptr, uintptr_t *alloc_size ) { 8012f60: 37 9c ff f0 addi sp,sp,-16 8012f64: 5b 8b 00 10 sw (sp+16),r11 8012f68: 5b 8c 00 0c sw (sp+12),r12 8012f6c: 5b 8d 00 08 sw (sp+8),r13 8012f70: 5b 9d 00 04 sw (sp+4),ra 8012f74: b8 40 60 00 mv r12,r2 RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down( uintptr_t value, uintptr_t alignment ) { return value - (value % alignment); 8012f78: 28 22 00 10 lw r2,(r1+16) 8012f7c: b8 20 58 00 mv r11,r1 8012f80: b9 80 08 00 mv r1,r12 8012f84: b8 60 68 00 mv r13,r3 8012f88: fb ff fd 6b calli 8012534 <__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 8012f8c: 29 62 00 20 lw r2,(r11+32) RTEMS_INLINE_ROUTINE uintptr_t _Heap_Align_down( uintptr_t value, uintptr_t alignment ) { return value - (value % alignment); 8012f90: 35 84 ff f8 addi r4,r12,-8 uintptr_t alloc_begin, uintptr_t page_size ) { return (Heap_Block *) (_Heap_Align_down( alloc_begin, page_size ) - HEAP_BLOCK_HEADER_SIZE); 8012f94: c8 81 20 00 sub r4,r4,r1 Heap_Block *block = _Heap_Block_of_alloc_area( alloc_begin, page_size ); Heap_Block *next_block = NULL; uintptr_t block_size = 0; if ( !_Heap_Is_block_in_heap( heap, block ) ) { return false; 8012f98: 34 01 00 00 mvi r1,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; 8012f9c: 54 44 00 10 bgu r2,r4,8012fdc <_Heap_Size_of_alloc_area+0x7c> 8012fa0: 29 65 00 24 lw r5,(r11+36) 8012fa4: 54 85 00 0e bgu r4,r5,8012fdc <_Heap_Size_of_alloc_area+0x7c><== 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; 8012fa8: 28 86 00 04 lw r6,(r4+4) 8012fac: 34 03 ff fe mvi r3,-2 8012fb0: a0 66 18 00 and r3,r3,r6 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); 8012fb4: b4 83 20 00 add r4,r4,r3 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; 8012fb8: 54 44 00 09 bgu r2,r4,8012fdc <_Heap_Size_of_alloc_area+0x7c><== NEVER TAKEN 8012fbc: 54 85 00 08 bgu r4,r5,8012fdc <_Heap_Size_of_alloc_area+0x7c><== 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; 8012fc0: 28 82 00 04 lw r2,(r4+4) 8012fc4: 20 42 00 01 andi r2,r2,0x1 block_size = _Heap_Block_size( block ); next_block = _Heap_Block_at( block, block_size ); if ( !_Heap_Is_block_in_heap( heap, next_block ) || !_Heap_Is_prev_used( next_block ) 8012fc8: 44 40 00 05 be r2,r0,8012fdc <_Heap_Size_of_alloc_area+0x7c><== NEVER TAKEN ) { return false; } *alloc_size = (uintptr_t) next_block + HEAP_ALLOC_BONUS - alloc_begin; 8012fcc: c8 8c 20 00 sub r4,r4,r12 8012fd0: 34 84 00 04 addi r4,r4,4 8012fd4: 59 a4 00 00 sw (r13+0),r4 return true; 8012fd8: 34 01 00 01 mvi r1,1 } 8012fdc: 2b 9d 00 04 lw ra,(sp+4) 8012fe0: 2b 8b 00 10 lw r11,(sp+16) 8012fe4: 2b 8c 00 0c lw r12,(sp+12) 8012fe8: 2b 8d 00 08 lw r13,(sp+8) 8012fec: 37 9c 00 10 addi sp,sp,16 8012ff0: c3 a0 00 00 ret =============================================================================== 08004e78 <_Heap_Walk>: bool _Heap_Walk( Heap_Control *heap, int source, bool dump ) { 8004e78: 37 9c ff 9c addi sp,sp,-100 8004e7c: 5b 8b 00 50 sw (sp+80),r11 8004e80: 5b 8c 00 4c sw (sp+76),r12 8004e84: 5b 8d 00 48 sw (sp+72),r13 8004e88: 5b 8e 00 44 sw (sp+68),r14 8004e8c: 5b 8f 00 40 sw (sp+64),r15 8004e90: 5b 90 00 3c sw (sp+60),r16 8004e94: 5b 91 00 38 sw (sp+56),r17 8004e98: 5b 92 00 34 sw (sp+52),r18 8004e9c: 5b 93 00 30 sw (sp+48),r19 8004ea0: 5b 94 00 2c sw (sp+44),r20 8004ea4: 5b 95 00 28 sw (sp+40),r21 8004ea8: 5b 96 00 24 sw (sp+36),r22 8004eac: 5b 97 00 20 sw (sp+32),r23 8004eb0: 5b 98 00 1c sw (sp+28),r24 8004eb4: 5b 99 00 18 sw (sp+24),r25 8004eb8: 5b 9b 00 14 sw (sp+20),fp 8004ebc: 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; 8004ec0: 78 0f 08 00 mvhi r15,0x800 bool _Heap_Walk( Heap_Control *heap, int source, bool dump ) { 8004ec4: 20 63 00 ff andi r3,r3,0xff 8004ec8: b8 20 68 00 mv r13,r1 8004ecc: b8 40 98 00 mv r19,r2 uintptr_t const page_size = heap->page_size; 8004ed0: 28 35 00 10 lw r21,(r1+16) uintptr_t const min_block_size = heap->min_block_size; 8004ed4: 28 36 00 14 lw r22,(r1+20) Heap_Block *const first_block = heap->first_block; 8004ed8: 28 34 00 20 lw r20,(r1+32) Heap_Block *const last_block = heap->last_block; 8004edc: 28 37 00 24 lw r23,(r1+36) Heap_Block *block = first_block; Heap_Walk_printer printer = dump ? _Heap_Walk_print : _Heap_Walk_print_nothing; 8004ee0: 39 ef 4d d0 ori r15,r15,0x4dd0 8004ee4: 44 60 00 03 be r3,r0,8004ef0 <_Heap_Walk+0x78> 8004ee8: 78 0f 08 00 mvhi r15,0x800 8004eec: 39 ef 4d f4 ori r15,r15,0x4df4 if ( !_System_state_Is_up( _System_state_Get() ) ) { 8004ef0: 78 03 08 01 mvhi r3,0x801 8004ef4: 38 63 7a a8 ori r3,r3,0x7aa8 8004ef8: 28 69 00 00 lw r9,(r3+0) 8004efc: 34 07 00 03 mvi r7,3 return true; 8004f00: 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() ) ) { 8004f04: 45 27 00 15 be r9,r7,8004f58 <_Heap_Walk+0xe0> block = next_block; } while ( block != first_block ); return true; } 8004f08: b8 60 08 00 mv r1,r3 8004f0c: 2b 9d 00 10 lw ra,(sp+16) 8004f10: 2b 8b 00 50 lw r11,(sp+80) 8004f14: 2b 8c 00 4c lw r12,(sp+76) 8004f18: 2b 8d 00 48 lw r13,(sp+72) 8004f1c: 2b 8e 00 44 lw r14,(sp+68) 8004f20: 2b 8f 00 40 lw r15,(sp+64) 8004f24: 2b 90 00 3c lw r16,(sp+60) 8004f28: 2b 91 00 38 lw r17,(sp+56) 8004f2c: 2b 92 00 34 lw r18,(sp+52) 8004f30: 2b 93 00 30 lw r19,(sp+48) 8004f34: 2b 94 00 2c lw r20,(sp+44) 8004f38: 2b 95 00 28 lw r21,(sp+40) 8004f3c: 2b 96 00 24 lw r22,(sp+36) 8004f40: 2b 97 00 20 lw r23,(sp+32) 8004f44: 2b 98 00 1c lw r24,(sp+28) 8004f48: 2b 99 00 18 lw r25,(sp+24) 8004f4c: 2b 9b 00 14 lw fp,(sp+20) 8004f50: 37 9c 00 64 addi sp,sp,100 8004f54: c3 a0 00 00 ret 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)( 8004f58: 29 a2 00 08 lw r2,(r13+8) 8004f5c: 29 a1 00 0c lw r1,(r13+12) 8004f60: 29 a6 00 18 lw r6,(r13+24) 8004f64: 29 a7 00 1c lw r7,(r13+28) 8004f68: 78 03 08 01 mvhi r3,0x801 8004f6c: 5b 82 00 08 sw (sp+8),r2 8004f70: 5b 81 00 0c sw (sp+12),r1 8004f74: 5b 97 00 04 sw (sp+4),r23 8004f78: ba 60 08 00 mv r1,r19 8004f7c: 34 02 00 00 mvi r2,0 8004f80: 38 63 49 30 ori r3,r3,0x4930 8004f84: ba a0 20 00 mv r4,r21 8004f88: ba c0 28 00 mv r5,r22 8004f8c: ba 80 40 00 mv r8,r20 8004f90: d9 e0 00 00 call r15 heap->area_begin, heap->area_end, first_block, last_block, first_free_block, last_free_block ); if ( page_size == 0 ) { 8004f94: 46 a0 00 26 be r21,r0,800502c <_Heap_Walk+0x1b4> <== NEVER TAKEN ) { #if (CPU_ALIGNMENT == 0) return true; #else return (((uintptr_t)address % CPU_ALIGNMENT) == 0); 8004f98: 22 ab 00 07 andi r11,r21,0x7 (*printer)( source, true, "page size is zero\n" ); return false; } if ( !_Addresses_Is_aligned( (void *) page_size ) ) { 8004f9c: 5d 60 00 2b bne r11,r0,8005048 <_Heap_Walk+0x1d0> <== NEVER TAKEN RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment ) { return (value % alignment) == 0; 8004fa0: ba c0 08 00 mv r1,r22 8004fa4: ba a0 10 00 mv r2,r21 8004fa8: fb ff ee 92 calli 80009f0 <__umodsi3> 8004fac: b8 20 60 00 mv r12,r1 ); return false; } if ( !_Heap_Is_aligned( min_block_size, page_size ) ) { 8004fb0: 5c 2b 00 2e bne r1,r11,8005068 <_Heap_Walk+0x1f0> <== NEVER TAKEN 8004fb4: 36 81 00 08 addi r1,r20,8 8004fb8: ba a0 10 00 mv r2,r21 8004fbc: fb ff ee 8d calli 80009f0 <__umodsi3> 8004fc0: b8 20 18 00 mv r3,r1 ); return false; } if ( 8004fc4: 5c 2c 00 31 bne r1,r12,8005088 <_Heap_Walk+0x210> <== NEVER TAKEN block = next_block; } while ( block != first_block ); return true; } 8004fc8: 2a 8c 00 04 lw r12,(r20+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; 8004fcc: 21 81 00 01 andi r1,r12,0x1 ); return false; } if ( !_Heap_Is_prev_used( first_block ) ) { 8004fd0: 44 23 00 fe be r1,r3,80053c8 <_Heap_Walk+0x550> <== 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; 8004fd4: 2a e2 00 04 lw r2,(r23+4) 8004fd8: 34 01 ff fe mvi r1,-2 8004fdc: a0 22 08 00 and r1,r1,r2 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); 8004fe0: b6 e1 08 00 add r1,r23,r1 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; 8004fe4: 28 22 00 04 lw r2,(r1+4) 8004fe8: 20 42 00 01 andi r2,r2,0x1 ); return false; } if ( _Heap_Is_free( last_block ) ) { 8004fec: 44 43 00 09 be r2,r3,8005010 <_Heap_Walk+0x198> <== NEVER TAKEN ); return false; } if ( 8004ff0: 46 81 00 2e be r20,r1,80050a8 <_Heap_Walk+0x230> <== ALWAYS TAKEN _Heap_Block_at( last_block, _Heap_Block_size( last_block ) ) != first_block ) { (*printer)( 8004ff4: 78 03 08 01 mvhi r3,0x801 <== NOT EXECUTED 8004ff8: 38 63 4a 98 ori r3,r3,0x4a98 <== NOT EXECUTED 8004ffc: ba 60 08 00 mv r1,r19 <== NOT EXECUTED 8005000: 34 02 00 01 mvi r2,1 <== NOT EXECUTED 8005004: d9 e0 00 00 call r15 <== NOT EXECUTED if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; } if ( !_Heap_Walk_check_control( source, printer, heap ) ) { return false; 8005008: 34 03 00 00 mvi r3,0 <== NOT EXECUTED 800500c: e3 ff ff bf bi 8004f08 <_Heap_Walk+0x90> <== NOT EXECUTED return false; } if ( _Heap_Is_free( last_block ) ) { (*printer)( 8005010: 78 03 08 01 mvhi r3,0x801 8005014: 38 63 4a 80 ori r3,r3,0x4a80 8005018: ba 60 08 00 mv r1,r19 800501c: 34 02 00 01 mvi r2,1 8005020: d9 e0 00 00 call r15 if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; } if ( !_Heap_Walk_check_control( source, printer, heap ) ) { return false; 8005024: 34 03 00 00 mvi r3,0 8005028: e3 ff ff b8 bi 8004f08 <_Heap_Walk+0x90> first_block, last_block, first_free_block, last_free_block ); if ( page_size == 0 ) { (*printer)( source, true, "page size is zero\n" ); 800502c: 78 03 08 01 mvhi r3,0x801 8005030: 38 63 49 c4 ori r3,r3,0x49c4 8005034: ba 60 08 00 mv r1,r19 8005038: 34 02 00 01 mvi r2,1 800503c: d9 e0 00 00 call r15 if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; } if ( !_Heap_Walk_check_control( source, printer, heap ) ) { return false; 8005040: 34 03 00 00 mvi r3,0 8005044: e3 ff ff b1 bi 8004f08 <_Heap_Walk+0x90> return false; } if ( !_Addresses_Is_aligned( (void *) page_size ) ) { (*printer)( 8005048: 78 03 08 01 mvhi r3,0x801 800504c: 38 63 49 d8 ori r3,r3,0x49d8 8005050: ba 60 08 00 mv r1,r19 8005054: 34 02 00 01 mvi r2,1 8005058: ba a0 20 00 mv r4,r21 800505c: d9 e0 00 00 call r15 if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; } if ( !_Heap_Walk_check_control( source, printer, heap ) ) { return false; 8005060: 34 03 00 00 mvi r3,0 8005064: e3 ff ff a9 bi 8004f08 <_Heap_Walk+0x90> return false; } if ( !_Heap_Is_aligned( min_block_size, page_size ) ) { (*printer)( 8005068: 78 03 08 01 mvhi r3,0x801 800506c: 38 63 49 f8 ori r3,r3,0x49f8 8005070: ba 60 08 00 mv r1,r19 8005074: 34 02 00 01 mvi r2,1 8005078: ba c0 20 00 mv r4,r22 800507c: d9 e0 00 00 call r15 if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; } if ( !_Heap_Walk_check_control( source, printer, heap ) ) { return false; 8005080: 34 03 00 00 mvi r3,0 8005084: e3 ff ff a1 bi 8004f08 <_Heap_Walk+0x90> } if ( !_Heap_Is_aligned( _Heap_Alloc_area_of_block( first_block ), page_size ) ) { (*printer)( 8005088: 78 03 08 01 mvhi r3,0x801 800508c: 38 63 4a 1c ori r3,r3,0x4a1c 8005090: ba 60 08 00 mv r1,r19 8005094: 34 02 00 01 mvi r2,1 8005098: ba 80 20 00 mv r4,r20 800509c: d9 e0 00 00 call r15 if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; } if ( !_Heap_Walk_check_control( source, printer, heap ) ) { return false; 80050a0: 34 03 00 00 mvi r3,0 80050a4: e3 ff ff 99 bi 8004f08 <_Heap_Walk+0x90> block = next_block; } while ( block != first_block ); return true; } 80050a8: 29 b0 00 08 lw r16,(r13+8) int source, Heap_Walk_printer printer, Heap_Control *heap ) { uintptr_t const page_size = heap->page_size; 80050ac: 29 b2 00 10 lw r18,(r13+16) 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 ) { 80050b0: 45 b0 00 2f be r13,r16,800516c <_Heap_Walk+0x2f4> block = next_block; } while ( block != first_block ); return true; } 80050b4: 29 ae 00 20 lw r14,(r13+32) 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; 80050b8: ba 00 58 00 mv r11,r16 80050bc: 55 d0 00 dc bgu r14,r16,800542c <_Heap_Walk+0x5b4> <== NEVER TAKEN 80050c0: 29 b8 00 24 lw r24,(r13+36) 80050c4: 56 18 00 da bgu r16,r24,800542c <_Heap_Walk+0x5b4> <== NEVER TAKEN RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment ) { return (value % alignment) == 0; 80050c8: 36 01 00 08 addi r1,r16,8 80050cc: ba 40 10 00 mv r2,r18 80050d0: fb ff ee 48 calli 80009f0 <__umodsi3> ); return false; } if ( 80050d4: 5c 20 00 de bne r1,r0,800544c <_Heap_Walk+0x5d4> <== 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; 80050d8: 2a 03 00 04 lw r3,(r16+4) 80050dc: 34 02 ff fe mvi r2,-2 80050e0: 34 11 ff fe mvi r17,-2 80050e4: a0 43 10 00 and r2,r2,r3 block = next_block; } while ( block != first_block ); return true; } 80050e8: b6 02 10 00 add r2,r16,r2 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; 80050ec: 28 42 00 04 lw r2,(r2+4) ); return false; } if ( _Heap_Is_used( free_block ) ) { 80050f0: b9 a0 18 00 mv r3,r13 80050f4: 20 42 00 01 andi r2,r2,0x1 80050f8: 44 41 00 12 be r2,r1,8005140 <_Heap_Walk+0x2c8> <== ALWAYS TAKEN 80050fc: e0 00 00 dc bi 800546c <_Heap_Walk+0x5f4> <== NOT EXECUTED return false; } prev_block = free_block; free_block = free_block->next; 8005100: 2a 0b 00 08 lw r11,(r16+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 ) { 8005104: 45 ab 00 1b be r13,r11,8005170 <_Heap_Walk+0x2f8> 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; 8005108: 55 cb 00 c9 bgu r14,r11,800542c <_Heap_Walk+0x5b4> RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment ) { return (value % alignment) == 0; 800510c: 35 61 00 08 addi r1,r11,8 8005110: ba 40 10 00 mv r2,r18 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; 8005114: 55 78 00 c6 bgu r11,r24,800542c <_Heap_Walk+0x5b4> <== NEVER TAKEN RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment ) { return (value % alignment) == 0; 8005118: fb ff ee 36 calli 80009f0 <__umodsi3> ); return false; } if ( 800511c: 5c 20 00 cc bne r1,r0,800544c <_Heap_Walk+0x5d4> - 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; 8005120: 29 64 00 04 lw r4,(r11+4) ); return false; } if ( _Heap_Is_used( free_block ) ) { 8005124: ba 00 18 00 mv r3,r16 8005128: b9 60 80 00 mv r16,r11 800512c: a2 24 20 00 and r4,r17,r4 block = next_block; } while ( block != first_block ); return true; } 8005130: b4 8b 20 00 add r4,r4,r11 block->size_and_flag = size | flag; } RTEMS_INLINE_ROUTINE bool _Heap_Is_prev_used( const Heap_Block *block ) { return block->size_and_flag & HEAP_PREV_BLOCK_USED; 8005134: 28 84 00 04 lw r4,(r4+4) 8005138: 20 84 00 01 andi r4,r4,0x1 ); return false; } if ( _Heap_Is_used( free_block ) ) { 800513c: 5c 81 00 cc bne r4,r1,800546c <_Heap_Walk+0x5f4> ); return false; } if ( free_block->prev != prev_block ) { 8005140: 2a 07 00 0c lw r7,(r16+12) 8005144: 44 e3 ff ef be r7,r3,8005100 <_Heap_Walk+0x288> (*printer)( 8005148: 78 03 08 01 mvhi r3,0x801 800514c: 38 63 4b 34 ori r3,r3,0x4b34 8005150: ba 60 08 00 mv r1,r19 8005154: 34 02 00 01 mvi r2,1 8005158: ba 00 20 00 mv r4,r16 800515c: b8 e0 28 00 mv r5,r7 8005160: d9 e0 00 00 call r15 if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; } if ( !_Heap_Walk_check_control( source, printer, heap ) ) { return false; 8005164: 34 03 00 00 mvi r3,0 8005168: e3 ff ff 68 bi 8004f08 <_Heap_Walk+0x90> 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 ) { 800516c: 29 ae 00 20 lw r14,(r13+32) 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)( 8005170: 78 01 08 01 mvhi r1,0x801 8005174: 5b 81 00 54 sw (sp+84),r1 8005178: 78 01 08 01 mvhi r1,0x801 800517c: 5b 81 00 58 sw (sp+88),r1 8005180: 78 01 08 01 mvhi r1,0x801 8005184: 5b 81 00 5c sw (sp+92),r1 " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), block->next, block->next == last_free_block ? " (= last free)" : (block->next == free_list_tail ? " (= tail)" : "") 8005188: 78 01 08 01 mvhi r1,0x801 800518c: 5b 81 00 60 sw (sp+96),r1 block, block_size, block->prev, block->prev == first_free_block ? " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), 8005190: 78 01 08 01 mvhi r1,0x801 8005194: 5b 81 00 64 sw (sp+100),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)( 8005198: 2b 81 00 54 lw r1,(sp+84) "block 0x%08x: size %u\n", block, block_size ); } else { (*printer)( 800519c: 78 1b 08 01 mvhi fp,0x801 if ( !_Heap_Is_prev_used( next_block ) ) { if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) { return false; } } else if (prev_used) { (*printer)( 80051a0: 78 19 08 01 mvhi r25,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)( 80051a4: 38 21 48 f8 ori r1,r1,0x48f8 80051a8: 5b 81 00 54 sw (sp+84),r1 80051ac: 2b 81 00 58 lw r1,(sp+88) " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), block->next, block->next == last_free_block ? " (= last free)" : (block->next == free_list_tail ? " (= tail)" : "") 80051b0: 78 18 08 01 mvhi r24,0x801 ); return false; } if ( _Heap_Is_used( free_block ) ) { 80051b4: ba 80 88 00 mv r17,r20 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)( 80051b8: 38 21 49 14 ori r1,r1,0x4914 80051bc: 5b 81 00 58 sw (sp+88),r1 80051c0: 2b 81 00 5c lw r1,(sp+92) "block 0x%08x: size %u\n", block, block_size ); } else { (*printer)( 80051c4: 3b 7b 4c e4 ori fp,fp,0x4ce4 if ( !_Heap_Is_prev_used( next_block ) ) { if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) { return false; } } else if (prev_used) { (*printer)( 80051c8: 3b 39 4c cc ori r25,r25,0x4ccc 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)( 80051cc: 38 21 4c 28 ori r1,r1,0x4c28 80051d0: 5b 81 00 5c sw (sp+92),r1 " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), block->next, block->next == last_free_block ? " (= last free)" : (block->next == free_list_tail ? " (= tail)" : "") 80051d4: 2b 81 00 60 lw r1,(sp+96) 80051d8: 3b 18 4c 98 ori r24,r24,0x4c98 80051dc: 38 21 49 24 ori r1,r1,0x4924 80051e0: 5b 81 00 60 sw (sp+96),r1 block, block_size, block->prev, block->prev == first_free_block ? " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), 80051e4: 2b 81 00 64 lw r1,(sp+100) 80051e8: 38 21 49 08 ori r1,r1,0x4908 80051ec: 5b 81 00 64 sw (sp+100),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; 80051f0: 34 01 ff fe mvi r1,-2 80051f4: a1 81 90 00 and r18,r12,r1 RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( const Heap_Block *block, uintptr_t offset ) { return (Heap_Block *) ((uintptr_t) block + offset); 80051f8: b6 51 80 00 add r16,r18,r17 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; 80051fc: 55 d0 00 7a bgu r14,r16,80053e4 <_Heap_Walk+0x56c> <== NEVER TAKEN 8005200: 29 a4 00 24 lw r4,(r13+36) 8005204: 56 04 00 78 bgu r16,r4,80053e4 <_Heap_Walk+0x56c> RTEMS_INLINE_ROUTINE bool _Heap_Is_aligned( uintptr_t value, uintptr_t alignment ) { return (value % alignment) == 0; 8005208: ba 40 08 00 mv r1,r18 800520c: ba a0 10 00 mv r2,r21 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; 8005210: fe 37 58 00 cmpne r11,r17,r23 8005214: fb ff ed f7 calli 80009f0 <__umodsi3> ); return false; } if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) { 8005218: 44 20 00 02 be r1,r0,8005220 <_Heap_Walk+0x3a8> 800521c: 5d 60 00 15 bne r11,r0,8005270 <_Heap_Walk+0x3f8> ); return false; } if ( block_size < min_block_size && is_not_last_block ) { 8005220: 52 56 00 02 bgeu r18,r22,8005228 <_Heap_Walk+0x3b0> 8005224: 5d 60 00 1c bne r11,r0,8005294 <_Heap_Walk+0x41c> <== ALWAYS TAKEN ); return false; } if ( next_block_begin <= block_begin && is_not_last_block ) { 8005228: 56 11 00 02 bgu r16,r17,8005230 <_Heap_Walk+0x3b8> 800522c: 5d 60 00 77 bne r11,r0,8005408 <_Heap_Walk+0x590> 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; 8005230: 2a 06 00 04 lw r6,(r16+4) 8005234: 21 8c 00 01 andi r12,r12,0x1 8005238: 20 c6 00 01 andi r6,r6,0x1 ); return false; } if ( !_Heap_Is_prev_used( next_block ) ) { 800523c: 44 c0 00 28 be r6,r0,80052dc <_Heap_Walk+0x464> if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) { return false; } } else if (prev_used) { 8005240: 45 80 00 1f be r12,r0,80052bc <_Heap_Walk+0x444> (*printer)( 8005244: ba 60 08 00 mv r1,r19 8005248: 34 02 00 00 mvi r2,0 800524c: bb 20 18 00 mv r3,r25 8005250: ba 20 20 00 mv r4,r17 8005254: ba 40 28 00 mv r5,r18 8005258: d9 e0 00 00 call r15 block->prev_size ); } block = next_block; } while ( block != first_block ); 800525c: 46 90 00 43 be r20,r16,8005368 <_Heap_Walk+0x4f0> 8005260: 2a 0c 00 04 lw r12,(r16+4) 8005264: 29 ae 00 20 lw r14,(r13+32) 8005268: ba 00 88 00 mv r17,r16 800526c: e3 ff ff e1 bi 80051f0 <_Heap_Walk+0x378> return false; } if ( !_Heap_Is_aligned( block_size, page_size ) && is_not_last_block ) { (*printer)( 8005270: 78 03 08 01 mvhi r3,0x801 8005274: 38 63 4b 98 ori r3,r3,0x4b98 8005278: ba 60 08 00 mv r1,r19 800527c: 34 02 00 01 mvi r2,1 8005280: ba 20 20 00 mv r4,r17 8005284: ba 40 28 00 mv r5,r18 8005288: d9 e0 00 00 call r15 "block 0x%08x: block size %u not page aligned\n", block, block_size ); return false; 800528c: 34 03 00 00 mvi r3,0 8005290: e3 ff ff 1e bi 8004f08 <_Heap_Walk+0x90> } if ( block_size < min_block_size && is_not_last_block ) { (*printer)( 8005294: 78 03 08 01 mvhi r3,0x801 8005298: 38 63 4b c8 ori r3,r3,0x4bc8 800529c: ba 60 08 00 mv r1,r19 80052a0: 34 02 00 01 mvi r2,1 80052a4: ba 20 20 00 mv r4,r17 80052a8: ba 40 28 00 mv r5,r18 80052ac: ba c0 30 00 mv r6,r22 80052b0: d9 e0 00 00 call r15 block, block_size, min_block_size ); return false; 80052b4: 34 03 00 00 mvi r3,0 80052b8: e3 ff ff 14 bi 8004f08 <_Heap_Walk+0x90> "block 0x%08x: size %u\n", block, block_size ); } else { (*printer)( 80052bc: 2a 26 00 00 lw r6,(r17+0) 80052c0: ba 20 20 00 mv r4,r17 80052c4: ba 60 08 00 mv r1,r19 80052c8: 34 02 00 00 mvi r2,0 80052cc: bb 60 18 00 mv r3,fp 80052d0: ba 40 28 00 mv r5,r18 80052d4: d9 e0 00 00 call r15 80052d8: e3 ff ff e1 bi 800525c <_Heap_Walk+0x3e4> 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 ? 80052dc: 2a 26 00 0c lw r6,(r17+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)( 80052e0: 29 a4 00 08 lw r4,(r13+8) block = next_block; } while ( block != first_block ); return true; } 80052e4: 29 a5 00 0c lw r5,(r13+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)( 80052e8: 2b 87 00 54 lw r7,(sp+84) 80052ec: 44 86 00 03 be r4,r6,80052f8 <_Heap_Walk+0x480> block, block_size, block->prev, block->prev == first_free_block ? " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), 80052f0: bb 00 38 00 mv r7,r24 80052f4: 45 a6 00 29 be r13,r6,8005398 <_Heap_Walk+0x520> block->next, block->next == last_free_block ? 80052f8: 2a 28 00 08 lw r8,(r17+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)( 80052fc: 2b 84 00 58 lw r4,(sp+88) 8005300: 44 a8 00 03 be r5,r8,800530c <_Heap_Walk+0x494> " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), block->next, block->next == last_free_block ? " (= last free)" : (block->next == free_list_tail ? " (= tail)" : "") 8005304: bb 00 20 00 mv r4,r24 8005308: 45 a8 00 26 be r13,r8,80053a0 <_Heap_Walk+0x528> 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)( 800530c: 2b 83 00 5c lw r3,(sp+92) 8005310: 5b 84 00 04 sw (sp+4),r4 8005314: ba 60 08 00 mv r1,r19 8005318: 34 02 00 00 mvi r2,0 800531c: ba 20 20 00 mv r4,r17 8005320: ba 40 28 00 mv r5,r18 8005324: d9 e0 00 00 call r15 block->next == last_free_block ? " (= last free)" : (block->next == free_list_tail ? " (= tail)" : "") ); if ( block_size != next_block->prev_size ) { 8005328: 2a 06 00 00 lw r6,(r16+0) 800532c: 5e 46 00 11 bne r18,r6,8005370 <_Heap_Walk+0x4f8> ); return false; } if ( !prev_used ) { 8005330: 45 80 00 1e be r12,r0,80053a8 <_Heap_Walk+0x530> block = next_block; } while ( block != first_block ); return true; } 8005334: 29 a5 00 08 lw r5,(r13+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 ) { 8005338: 45 a5 00 04 be r13,r5,8005348 <_Heap_Walk+0x4d0> <== NEVER TAKEN if ( free_block == block ) { 800533c: 46 25 ff c8 be r17,r5,800525c <_Heap_Walk+0x3e4> return true; } free_block = free_block->next; 8005340: 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 ) { 8005344: 5d a5 ff fe bne r13,r5,800533c <_Heap_Walk+0x4c4> return false; } if ( !_Heap_Walk_is_in_free_list( heap, block ) ) { (*printer)( 8005348: 78 03 08 01 mvhi r3,0x801 800534c: 38 63 4d 0c ori r3,r3,0x4d0c 8005350: ba 60 08 00 mv r1,r19 8005354: 34 02 00 01 mvi r2,1 8005358: ba 20 20 00 mv r4,r17 800535c: d9 e0 00 00 call r15 return false; } if ( !_Heap_Is_prev_used( next_block ) ) { if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) { return false; 8005360: 34 03 00 00 mvi r3,0 8005364: e3 ff fe e9 bi 8004f08 <_Heap_Walk+0x90> } block = next_block; } while ( block != first_block ); return true; 8005368: 34 03 00 01 mvi r3,1 800536c: e3 ff fe e7 bi 8004f08 <_Heap_Walk+0x90> " (= last free)" : (block->next == free_list_tail ? " (= tail)" : "") ); if ( block_size != next_block->prev_size ) { (*printer)( 8005370: 78 03 08 01 mvhi r3,0x801 8005374: 38 63 4c 60 ori r3,r3,0x4c60 8005378: ba 60 08 00 mv r1,r19 800537c: 34 02 00 01 mvi r2,1 8005380: ba 20 20 00 mv r4,r17 8005384: ba 40 28 00 mv r5,r18 8005388: ba 00 38 00 mv r7,r16 800538c: d9 e0 00 00 call r15 return false; } if ( !_Heap_Is_prev_used( next_block ) ) { if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) { return false; 8005390: 34 03 00 00 mvi r3,0 8005394: e3 ff fe dd bi 8004f08 <_Heap_Walk+0x90> block, block_size, block->prev, block->prev == first_free_block ? " (= first free)" : (block->prev == free_list_head ? " (= head)" : ""), 8005398: 2b 87 00 64 lw r7,(sp+100) 800539c: e3 ff ff d7 bi 80052f8 <_Heap_Walk+0x480> block->next, block->next == last_free_block ? " (= last free)" : (block->next == free_list_tail ? " (= tail)" : "") 80053a0: 2b 84 00 60 lw r4,(sp+96) 80053a4: e3 ff ff da bi 800530c <_Heap_Walk+0x494> return false; } if ( !prev_used ) { (*printer)( 80053a8: 78 03 08 01 mvhi r3,0x801 80053ac: 38 63 4c 9c ori r3,r3,0x4c9c 80053b0: ba 60 08 00 mv r1,r19 80053b4: 34 02 00 01 mvi r2,1 80053b8: ba 20 20 00 mv r4,r17 80053bc: d9 e0 00 00 call r15 return false; } if ( !_Heap_Is_prev_used( next_block ) ) { if ( !_Heap_Walk_check_free_block( source, printer, heap, block ) ) { return false; 80053c0: 34 03 00 00 mvi r3,0 80053c4: e3 ff fe d1 bi 8004f08 <_Heap_Walk+0x90> return false; } if ( !_Heap_Is_prev_used( first_block ) ) { (*printer)( 80053c8: 78 03 08 01 mvhi r3,0x801 80053cc: 38 63 4a 50 ori r3,r3,0x4a50 80053d0: ba 60 08 00 mv r1,r19 80053d4: 34 02 00 01 mvi r2,1 80053d8: d9 e0 00 00 call r15 if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; } if ( !_Heap_Walk_check_control( source, printer, heap ) ) { return false; 80053dc: 34 03 00 00 mvi r3,0 80053e0: e3 ff fe ca bi 8004f08 <_Heap_Walk+0x90> Heap_Block *const next_block = _Heap_Block_at( block, block_size ); uintptr_t const next_block_begin = (uintptr_t) next_block; bool const is_not_last_block = block != last_block; if ( !_Heap_Is_block_in_heap( heap, next_block ) ) { (*printer)( 80053e4: 78 03 08 01 mvhi r3,0x801 80053e8: 38 63 4b 68 ori r3,r3,0x4b68 80053ec: ba 60 08 00 mv r1,r19 80053f0: 34 02 00 01 mvi r2,1 80053f4: ba 20 20 00 mv r4,r17 80053f8: ba 00 28 00 mv r5,r16 80053fc: d9 e0 00 00 call r15 "block 0x%08x: next block 0x%08x not in heap\n", block, next_block ); return false; 8005400: 34 03 00 00 mvi r3,0 8005404: e3 ff fe c1 bi 8004f08 <_Heap_Walk+0x90> return false; } if ( next_block_begin <= block_begin && is_not_last_block ) { (*printer)( 8005408: 78 03 08 01 mvhi r3,0x801 800540c: 38 63 4b f4 ori r3,r3,0x4bf4 8005410: ba 60 08 00 mv r1,r19 8005414: 34 02 00 01 mvi r2,1 8005418: ba 20 20 00 mv r4,r17 800541c: ba 00 28 00 mv r5,r16 8005420: d9 e0 00 00 call r15 "block 0x%08x: next block 0x%08x is not a successor\n", block, next_block ); return false; 8005424: 34 03 00 00 mvi r3,0 8005428: e3 ff fe b8 bi 8004f08 <_Heap_Walk+0x90> 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 ) ) { (*printer)( 800542c: 78 03 08 01 mvhi r3,0x801 8005430: 38 63 4a c8 ori r3,r3,0x4ac8 8005434: ba 60 08 00 mv r1,r19 8005438: 34 02 00 01 mvi r2,1 800543c: b9 60 20 00 mv r4,r11 8005440: d9 e0 00 00 call r15 if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; } if ( !_Heap_Walk_check_control( source, printer, heap ) ) { return false; 8005444: 34 03 00 00 mvi r3,0 8005448: e3 ff fe b0 bi 8004f08 <_Heap_Walk+0x90> } if ( !_Heap_Is_aligned( _Heap_Alloc_area_of_block( free_block ), page_size ) ) { (*printer)( 800544c: 78 03 08 01 mvhi r3,0x801 8005450: 38 63 4a e8 ori r3,r3,0x4ae8 8005454: ba 60 08 00 mv r1,r19 8005458: 34 02 00 01 mvi r2,1 800545c: b9 60 20 00 mv r4,r11 8005460: d9 e0 00 00 call r15 if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; } if ( !_Heap_Walk_check_control( source, printer, heap ) ) { return false; 8005464: 34 03 00 00 mvi r3,0 8005468: e3 ff fe a8 bi 8004f08 <_Heap_Walk+0x90> return false; } if ( _Heap_Is_used( free_block ) ) { (*printer)( 800546c: 78 03 08 01 mvhi r3,0x801 8005470: 38 63 4b 18 ori r3,r3,0x4b18 8005474: ba 60 08 00 mv r1,r19 8005478: 34 02 00 01 mvi r2,1 800547c: b9 60 20 00 mv r4,r11 8005480: d9 e0 00 00 call r15 if ( !_System_state_Is_up( _System_state_Get() ) ) { return true; } if ( !_Heap_Walk_check_control( source, printer, heap ) ) { return false; 8005484: 34 03 00 00 mvi r3,0 8005488: e3 ff fe a0 bi 8004f08 <_Heap_Walk+0x90> =============================================================================== 08003584 <_IO_Initialize_all_drivers>: * * Output Parameters: NONE */ void _IO_Initialize_all_drivers( void ) { 8003584: 37 9c ff f4 addi sp,sp,-12 8003588: 5b 8b 00 0c sw (sp+12),r11 800358c: 5b 8c 00 08 sw (sp+8),r12 8003590: 5b 9d 00 04 sw (sp+4),ra rtems_device_major_number major; for ( major=0 ; major < _IO_Number_of_drivers ; major ++ ) 8003594: 78 0c 08 01 mvhi r12,0x801 8003598: 39 8c 51 e0 ori r12,r12,0x51e0 800359c: 29 81 00 00 lw r1,(r12+0) 80035a0: 44 20 00 09 be r1,r0,80035c4 <_IO_Initialize_all_drivers+0x40><== NEVER TAKEN 80035a4: 34 0b 00 00 mvi r11,0 (void) rtems_io_initialize( major, 0, NULL ); 80035a8: b9 60 08 00 mv r1,r11 80035ac: 34 02 00 00 mvi r2,0 80035b0: 34 03 00 00 mvi r3,0 80035b4: f8 00 19 f4 calli 8009d84 void _IO_Initialize_all_drivers( void ) { rtems_device_major_number major; for ( major=0 ; major < _IO_Number_of_drivers ; major ++ ) 80035b8: 29 81 00 00 lw r1,(r12+0) 80035bc: 35 6b 00 01 addi r11,r11,1 80035c0: 54 2b ff fa bgu r1,r11,80035a8 <_IO_Initialize_all_drivers+0x24> (void) rtems_io_initialize( major, 0, NULL ); } 80035c4: 2b 9d 00 04 lw ra,(sp+4) 80035c8: 2b 8b 00 0c lw r11,(sp+12) 80035cc: 2b 8c 00 08 lw r12,(sp+8) 80035d0: 37 9c 00 0c addi sp,sp,12 80035d4: c3 a0 00 00 ret =============================================================================== 08003464 <_IO_Manager_initialization>: * workspace. * */ void _IO_Manager_initialization(void) { 8003464: 37 9c ff e8 addi sp,sp,-24 8003468: 5b 8b 00 18 sw (sp+24),r11 800346c: 5b 8c 00 14 sw (sp+20),r12 8003470: 5b 8d 00 10 sw (sp+16),r13 8003474: 5b 8e 00 0c sw (sp+12),r14 8003478: 5b 8f 00 08 sw (sp+8),r15 800347c: 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; 8003480: 78 01 08 01 mvhi r1,0x801 8003484: 38 21 40 c4 ori r1,r1,0x40c4 drivers_in_table = Configuration.number_of_device_drivers; 8003488: 28 2b 00 34 lw r11,(r1+52) number_of_drivers = Configuration.maximum_drivers; 800348c: 28 2e 00 30 lw r14,(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; 8003490: 28 2d 00 38 lw r13,(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 ) 8003494: 51 6e 00 2e bgeu r11,r14,800354c <_IO_Manager_initialization+0xe8> * 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 ) 8003498: b5 ce 60 00 add r12,r14,r14 800349c: b5 8e 60 00 add r12,r12,r14 80034a0: b5 8c 60 00 add r12,r12,r12 80034a4: b5 8c 60 00 add r12,r12,r12 80034a8: b5 8c 60 00 add r12,r12,r12 * 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( 80034ac: b9 80 08 00 mv r1,r12 80034b0: f8 00 0e bc calli 8006fa0 <_Workspace_Allocate_or_fatal_error> sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); _IO_Number_of_drivers = number_of_drivers; 80034b4: 78 04 08 01 mvhi r4,0x801 /* * 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 *) 80034b8: 78 0f 08 01 mvhi r15,0x801 _Workspace_Allocate_or_fatal_error( sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); _IO_Number_of_drivers = number_of_drivers; 80034bc: 38 84 51 e0 ori r4,r4,0x51e0 /* * 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 *) 80034c0: 39 ef 51 e4 ori r15,r15,0x51e4 _Workspace_Allocate_or_fatal_error( sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); _IO_Number_of_drivers = number_of_drivers; memset( 80034c4: 34 02 00 00 mvi r2,0 80034c8: b9 80 18 00 mv r3,r12 _IO_Driver_address_table = (rtems_driver_address_table *) _Workspace_Allocate_or_fatal_error( sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); _IO_Number_of_drivers = number_of_drivers; 80034cc: 58 8e 00 00 sw (r4+0),r14 /* * 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 *) 80034d0: 59 e1 00 00 sw (r15+0),r1 _Workspace_Allocate_or_fatal_error( sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); _IO_Number_of_drivers = number_of_drivers; memset( 80034d4: f8 00 29 37 calli 800d9b0 _IO_Driver_address_table, 0, sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); for ( index = 0 ; index < drivers_in_table ; index++ ) 80034d8: 45 60 00 15 be r11,r0,800352c <_IO_Manager_initialization+0xc8><== NEVER TAKEN 80034dc: 29 e5 00 00 lw r5,(r15+0) 80034e0: 34 03 00 00 mvi r3,0 80034e4: 34 04 00 00 mvi r4,0 * registration. The driver table is now allocated in the * workspace. * */ void _IO_Manager_initialization(void) 80034e8: b5 a3 08 00 add r1,r13,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]; 80034ec: 28 26 00 00 lw r6,(r1+0) * registration. The driver table is now allocated in the * workspace. * */ void _IO_Manager_initialization(void) 80034f0: b4 a3 10 00 add r2,r5,r3 memset( _IO_Driver_address_table, 0, sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); for ( index = 0 ; index < drivers_in_table ; index++ ) 80034f4: 34 84 00 01 addi r4,r4,1 _IO_Driver_address_table[index] = driver_table[index]; 80034f8: 58 46 00 00 sw (r2+0),r6 80034fc: 28 26 00 04 lw r6,(r1+4) memset( _IO_Driver_address_table, 0, sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); for ( index = 0 ; index < drivers_in_table ; index++ ) 8003500: 34 63 00 18 addi r3,r3,24 _IO_Driver_address_table[index] = driver_table[index]; 8003504: 58 46 00 04 sw (r2+4),r6 8003508: 28 26 00 08 lw r6,(r1+8) 800350c: 58 46 00 08 sw (r2+8),r6 8003510: 28 26 00 0c lw r6,(r1+12) 8003514: 58 46 00 0c sw (r2+12),r6 8003518: 28 26 00 10 lw r6,(r1+16) 800351c: 58 46 00 10 sw (r2+16),r6 8003520: 28 21 00 14 lw r1,(r1+20) 8003524: 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++ ) 8003528: 55 64 ff f0 bgu r11,r4,80034e8 <_IO_Manager_initialization+0x84> _IO_Driver_address_table[index] = driver_table[index]; } 800352c: 2b 9d 00 04 lw ra,(sp+4) 8003530: 2b 8b 00 18 lw r11,(sp+24) 8003534: 2b 8c 00 14 lw r12,(sp+20) 8003538: 2b 8d 00 10 lw r13,(sp+16) 800353c: 2b 8e 00 0c lw r14,(sp+12) 8003540: 2b 8f 00 08 lw r15,(sp+8) 8003544: 37 9c 00 18 addi sp,sp,24 8003548: c3 a0 00 00 ret * If the maximum number of driver is the same as the number in the * table, then we do not have to copy the driver table. They can't * register any dynamically. */ if ( number_of_drivers == drivers_in_table ) { _IO_Driver_address_table = driver_table; 800354c: 78 02 08 01 mvhi r2,0x801 _IO_Number_of_drivers = number_of_drivers; 8003550: 78 01 08 01 mvhi r1,0x801 * 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; 8003554: 38 42 51 e4 ori r2,r2,0x51e4 _IO_Number_of_drivers = number_of_drivers; 8003558: 38 21 51 e0 ori r1,r1,0x51e0 * 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; 800355c: 58 4d 00 00 sw (r2+0),r13 _IO_Number_of_drivers = number_of_drivers; 8003560: 58 2b 00 00 sw (r1+0),r11 sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); for ( index = 0 ; index < drivers_in_table ; index++ ) _IO_Driver_address_table[index] = driver_table[index]; } 8003564: 2b 9d 00 04 lw ra,(sp+4) 8003568: 2b 8b 00 18 lw r11,(sp+24) 800356c: 2b 8c 00 14 lw r12,(sp+20) 8003570: 2b 8d 00 10 lw r13,(sp+16) 8003574: 2b 8e 00 0c lw r14,(sp+12) 8003578: 2b 8f 00 08 lw r15,(sp+8) 800357c: 37 9c 00 18 addi sp,sp,24 8003580: c3 a0 00 00 ret =============================================================================== 080044cc <_Objects_Allocate>: */ Objects_Control *_Objects_Allocate( Objects_Information *information ) { 80044cc: 37 9c ff ec addi sp,sp,-20 80044d0: 5b 8b 00 14 sw (sp+20),r11 80044d4: 5b 8c 00 10 sw (sp+16),r12 80044d8: 5b 8d 00 0c sw (sp+12),r13 80044dc: 5b 8e 00 08 sw (sp+8),r14 80044e0: 5b 9d 00 04 sw (sp+4),ra 80044e4: 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 ) 80044e8: 28 21 00 18 lw r1,(r1+24) return NULL; 80044ec: 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 ) 80044f0: 5c 20 00 09 bne r1,r0,8004514 <_Objects_Allocate+0x48> <== ALWAYS TAKEN ); } #endif return the_object; } 80044f4: b9 80 08 00 mv r1,r12 80044f8: 2b 9d 00 04 lw ra,(sp+4) 80044fc: 2b 8b 00 14 lw r11,(sp+20) 8004500: 2b 8c 00 10 lw r12,(sp+16) 8004504: 2b 8d 00 0c lw r13,(sp+12) 8004508: 2b 8e 00 08 lw r14,(sp+8) 800450c: 37 9c 00 14 addi sp,sp,20 8004510: c3 a0 00 00 ret /* * 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 ); 8004514: 35 6d 00 20 addi r13,r11,32 8004518: b9 a0 08 00 mv r1,r13 800451c: fb ff fc fb calli 8003908 <_Chain_Get> 8004520: b8 20 60 00 mv r12,r1 if ( information->auto_extend ) { 8004524: 41 61 00 12 lbu r1,(r11+18) /* * 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 ); 8004528: b9 80 70 00 mv r14,r12 if ( information->auto_extend ) { 800452c: 44 20 ff f2 be r1,r0,80044f4 <_Objects_Allocate+0x28> /* * If the list is empty then we are out of objects and need to * extend information base. */ if ( !the_object ) { 8004530: 45 80 00 18 be r12,r0,8004590 <_Objects_Allocate+0xc4> } if ( the_object ) { uint32_t block; block = (uint32_t) _Objects_Get_index( the_object->id ) - 8004534: 2d 83 00 0a lhu r3,(r12+10) 8004538: 2d 61 00 0a lhu r1,(r11+10) _Objects_Get_index( information->minimum_id ); block /= information->allocation_size; 800453c: 2d 62 00 14 lhu r2,(r11+20) 8004540: c8 61 08 00 sub r1,r3,r1 8004544: f8 00 37 ec calli 80124f4 <__udivsi3> information->inactive_per_block[ block ]--; 8004548: 29 62 00 30 lw r2,(r11+48) 800454c: b4 21 08 00 add r1,r1,r1 8004550: b4 21 08 00 add r1,r1,r1 8004554: b4 41 08 00 add r1,r2,r1 8004558: 28 22 00 00 lw r2,(r1+0) information->inactive--; 800455c: 2d 63 00 2c lhu r3,(r11+44) block = (uint32_t) _Objects_Get_index( the_object->id ) - _Objects_Get_index( information->minimum_id ); block /= information->allocation_size; information->inactive_per_block[ block ]--; 8004560: 34 42 ff ff addi r2,r2,-1 8004564: 58 22 00 00 sw (r1+0),r2 information->inactive--; 8004568: 34 61 ff ff addi r1,r3,-1 800456c: 0d 61 00 2c sh (r11+44),r1 ); } #endif return the_object; } 8004570: b9 80 08 00 mv r1,r12 8004574: 2b 9d 00 04 lw ra,(sp+4) 8004578: 2b 8b 00 14 lw r11,(sp+20) 800457c: 2b 8c 00 10 lw r12,(sp+16) 8004580: 2b 8d 00 0c lw r13,(sp+12) 8004584: 2b 8e 00 08 lw r14,(sp+8) 8004588: 37 9c 00 14 addi sp,sp,20 800458c: c3 a0 00 00 ret * If the list is empty then we are out of objects and need to * extend information base. */ if ( !the_object ) { _Objects_Extend_information( information ); 8004590: b9 60 08 00 mv r1,r11 8004594: f8 00 00 06 calli 80045ac <_Objects_Extend_information> the_object = (Objects_Control *) _Chain_Get( &information->Inactive ); 8004598: b9 a0 08 00 mv r1,r13 800459c: fb ff fc db calli 8003908 <_Chain_Get> 80045a0: b8 20 60 00 mv r12,r1 } if ( the_object ) { 80045a4: 44 2e ff d4 be r1,r14,80044f4 <_Objects_Allocate+0x28> 80045a8: e3 ff ff e3 bi 8004534 <_Objects_Allocate+0x68> =============================================================================== 080045ac <_Objects_Extend_information>: */ void _Objects_Extend_information( Objects_Information *information ) { 80045ac: 37 9c ff c8 addi sp,sp,-56 80045b0: 5b 8b 00 2c sw (sp+44),r11 80045b4: 5b 8c 00 28 sw (sp+40),r12 80045b8: 5b 8d 00 24 sw (sp+36),r13 80045bc: 5b 8e 00 20 sw (sp+32),r14 80045c0: 5b 8f 00 1c sw (sp+28),r15 80045c4: 5b 90 00 18 sw (sp+24),r16 80045c8: 5b 91 00 14 sw (sp+20),r17 80045cc: 5b 92 00 10 sw (sp+16),r18 80045d0: 5b 93 00 0c sw (sp+12),r19 80045d4: 5b 94 00 08 sw (sp+8),r20 80045d8: 5b 9d 00 04 sw (sp+4),ra minimum_index = _Objects_Get_index( information->minimum_id ); index_base = minimum_index; block = 0; /* if ( information->maximum < minimum_index ) */ if ( information->object_blocks == NULL ) 80045dc: 28 2c 00 34 lw r12,(r1+52) */ void _Objects_Extend_information( Objects_Information *information ) { 80045e0: b8 20 58 00 mv r11,r1 /* * Search for a free block of indexes. If we do NOT need to allocate or * extend the block table, then we will change do_extend. */ do_extend = true; minimum_index = _Objects_Get_index( information->minimum_id ); 80045e4: 2c 30 00 0a lhu r16,(r1+10) index_base = minimum_index; block = 0; /* if ( information->maximum < minimum_index ) */ if ( information->object_blocks == NULL ) 80045e8: 45 80 00 aa be r12,r0,8004890 <_Objects_Extend_information+0x2e4> block_count = 0; else { block_count = information->maximum / information->allocation_size; 80045ec: 2c 2f 00 14 lhu r15,(r1+20) 80045f0: 2c 31 00 10 lhu r17,(r1+16) 80045f4: b9 e0 10 00 mv r2,r15 80045f8: ba 20 08 00 mv r1,r17 80045fc: f8 00 37 be calli 80124f4 <__udivsi3> 8004600: 20 2e ff ff andi r14,r1,0xffff for ( ; block < block_count; block++ ) { 8004604: 45 c0 00 a9 be r14,r0,80048a8 <_Objects_Extend_information+0x2fc><== NEVER TAKEN if ( information->object_blocks[ block ] == NULL ) { 8004608: 29 81 00 00 lw r1,(r12+0) 800460c: 44 20 00 ac be r1,r0,80048bc <_Objects_Extend_information+0x310><== NEVER TAKEN 8004610: b9 80 18 00 mv r3,r12 8004614: b9 e0 08 00 mv r1,r15 /* * Search for a free block of indexes. If we do NOT need to allocate or * extend the block table, then we will change do_extend. */ do_extend = true; minimum_index = _Objects_Get_index( information->minimum_id ); 8004618: ba 00 68 00 mv r13,r16 index_base = minimum_index; block = 0; 800461c: 34 0c 00 00 mvi r12,0 if ( information->object_blocks == NULL ) block_count = 0; else { block_count = information->maximum / information->allocation_size; for ( ; block < block_count; block++ ) { 8004620: 35 8c 00 01 addi r12,r12,1 if ( information->object_blocks[ block ] == NULL ) { do_extend = false; break; } else index_base += information->allocation_size; 8004624: b5 af 68 00 add r13,r13,r15 if ( information->object_blocks == NULL ) block_count = 0; else { block_count = information->maximum / information->allocation_size; for ( ; block < block_count; block++ ) { 8004628: 55 cc 00 81 bgu r14,r12,800482c <_Objects_Extend_information+0x280> /* * Search for a free block of indexes. If we do NOT need to allocate or * extend the block table, then we will change do_extend. */ do_extend = true; 800462c: 34 12 00 01 mvi r18,1 } else index_base += information->allocation_size; } } maximum = (uint32_t) information->maximum + information->allocation_size; 8004630: b6 21 88 00 add r17,r17,r1 /* * We need to limit the number of objects to the maximum number * representable in the index portion of the object Id. In the * case of 16-bit Ids, this is only 256 object instances. */ if ( maximum > OBJECTS_ID_FINAL_INDEX ) { 8004634: 38 02 ff ff mvu r2,0xffff 8004638: 56 22 00 70 bgu r17,r2,80047f8 <_Objects_Extend_information+0x24c> /* * Allocate the name table, and the objects and if it fails either return or * generate a fatal error depending on auto-extending being active. */ block_size = information->allocation_size * information->size; 800463c: 29 62 00 18 lw r2,(r11+24) 8004640: f8 00 37 48 calli 8012360 <__mulsi3> if ( information->auto_extend ) { 8004644: 41 62 00 12 lbu r2,(r11+18) 8004648: 44 40 00 7e be r2,r0,8004840 <_Objects_Extend_information+0x294> new_object_block = _Workspace_Allocate( block_size ); 800464c: f8 00 0a 41 calli 8006f50 <_Workspace_Allocate> 8004650: b8 20 78 00 mv r15,r1 if ( !new_object_block ) 8004654: 44 20 00 69 be r1,r0,80047f8 <_Objects_Extend_information+0x24c> } /* * Do we need to grow the tables? */ if ( do_extend ) { 8004658: 46 40 00 41 be r18,r0,800475c <_Objects_Extend_information+0x1b0> */ /* * Up the block count and maximum */ block_count++; 800465c: 35 c1 00 01 addi r1,r14,1 /* * Allocate the tables and break it up. */ block_size = block_count * (sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) + 8004660: b4 21 98 00 add r19,r1,r1 8004664: b6 61 08 00 add r1,r19,r1 ((maximum + minimum_index) * sizeof(Objects_Control *)); 8004668: b6 21 08 00 add r1,r17,r1 /* * Allocate the tables and break it up. */ block_size = block_count * (sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) + 800466c: b4 30 08 00 add r1,r1,r16 block_count++; /* * Allocate the tables and break it up. */ block_size = block_count * 8004670: b4 21 08 00 add r1,r1,r1 8004674: b4 21 08 00 add r1,r1,r1 (sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) + ((maximum + minimum_index) * sizeof(Objects_Control *)); object_blocks = (void**) _Workspace_Allocate( block_size ); 8004678: f8 00 0a 36 calli 8006f50 <_Workspace_Allocate> 800467c: b8 20 90 00 mv r18,r1 if ( !object_blocks ) { 8004680: 44 20 00 94 be r1,r0,80048d0 <_Objects_Extend_information+0x324> * Take the block count down. Saves all the (block_count - 1) * in the copies. */ block_count--; if ( information->maximum > minimum_index ) { 8004684: 2d 62 00 10 lhu r2,(r11+16) } /* * Break the block into the various sections. */ inactive_per_block = (uint32_t *) _Addresses_Add_offset( 8004688: b6 73 a0 00 add r20,r19,r19 800468c: b4 34 98 00 add r19,r1,r20 8004690: b6 74 a0 00 add r20,r19,r20 * Take the block count down. Saves all the (block_count - 1) * in the copies. */ block_count--; if ( information->maximum > minimum_index ) { 8004694: 54 50 00 6e bgu r2,r16,800484c <_Objects_Extend_information+0x2a0> } else { /* * Deal with the special case of the 0 to minimum_index */ for ( index = 0; index < minimum_index; index++ ) { 8004698: ba 80 20 00 mv r4,r20 800469c: 34 03 00 00 mvi r3,0 80046a0: 46 00 00 05 be r16,r0,80046b4 <_Objects_Extend_information+0x108><== NEVER TAKEN local_table[ index ] = NULL; 80046a4: 58 80 00 00 sw (r4+0),r0 } else { /* * Deal with the special case of the 0 to minimum_index */ for ( index = 0; index < minimum_index; index++ ) { 80046a8: 34 63 00 01 addi r3,r3,1 80046ac: 34 84 00 04 addi r4,r4,4 80046b0: 56 03 ff fd bgu r16,r3,80046a4 <_Objects_Extend_information+0xf8><== NEVER TAKEN 80046b4: b5 ce 70 00 add r14,r14,r14 80046b8: b5 ce 70 00 add r14,r14,r14 */ object_blocks[block_count] = NULL; inactive_per_block[block_count] = 0; for ( index=index_base ; index < ( information->allocation_size + index_base ); 80046bc: 2d 65 00 14 lhu r5,(r11+20) } /* * Initialise the new entries in the table. */ object_blocks[block_count] = NULL; 80046c0: b6 4e 08 00 add r1,r18,r14 80046c4: 58 20 00 00 sw (r1+0),r0 inactive_per_block[block_count] = 0; 80046c8: b6 6e 70 00 add r14,r19,r14 80046cc: 59 c0 00 00 sw (r14+0),r0 for ( index=index_base ; index < ( information->allocation_size + index_base ); 80046d0: b5 a5 28 00 add r5,r13,r5 * Initialise the new entries in the table. */ object_blocks[block_count] = NULL; inactive_per_block[block_count] = 0; for ( index=index_base ; 80046d4: 51 a5 00 09 bgeu r13,r5,80046f8 <_Objects_Extend_information+0x14c><== NEVER TAKEN * information - object information table * * Output parameters: NONE */ void _Objects_Extend_information( 80046d8: b5 ad 20 00 add r4,r13,r13 80046dc: b4 84 20 00 add r4,r4,r4 * Initialise the new entries in the table. */ object_blocks[block_count] = NULL; inactive_per_block[block_count] = 0; for ( index=index_base ; 80046e0: b6 84 20 00 add r4,r20,r4 * information - object information table * * Output parameters: NONE */ void _Objects_Extend_information( 80046e4: b9 a0 18 00 mv r3,r13 inactive_per_block[block_count] = 0; for ( index=index_base ; index < ( information->allocation_size + index_base ); index++ ) { local_table[ index ] = NULL; 80046e8: 58 80 00 00 sw (r4+0),r0 object_blocks[block_count] = NULL; inactive_per_block[block_count] = 0; for ( index=index_base ; index < ( information->allocation_size + index_base ); index++ ) { 80046ec: 34 63 00 01 addi r3,r3,1 80046f0: 34 84 00 04 addi r4,r4,4 * Initialise the new entries in the table. */ object_blocks[block_count] = NULL; inactive_per_block[block_count] = 0; for ( index=index_base ; 80046f4: 54 a3 ff fd bgu r5,r3,80046e8 <_Objects_Extend_information+0x13c> index < ( information->allocation_size + index_base ); index++ ) { local_table[ index ] = NULL; } _ISR_Disable( level ); 80046f8: 90 00 70 00 rcsr r14,IE 80046fc: 34 01 ff fe mvi r1,-2 8004700: a1 c1 08 00 and r1,r14,r1 8004704: d0 01 00 00 wcsr IE,r1 uint32_t the_class, uint32_t node, uint32_t index ) { return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) | 8004708: 29 61 00 00 lw r1,(r11+0) old_tables = information->object_blocks; information->object_blocks = object_blocks; information->inactive_per_block = inactive_per_block; information->local_table = local_table; information->maximum = (Objects_Maximum) maximum; 800470c: 22 31 ff ff andi r17,r17,0xffff 8004710: 0d 71 00 10 sh (r11+16),r17 local_table[ index ] = NULL; } _ISR_Disable( level ); old_tables = information->object_blocks; 8004714: 29 70 00 34 lw r16,(r11+52) information->object_blocks = object_blocks; information->inactive_per_block = inactive_per_block; 8004718: 59 73 00 30 sw (r11+48),r19 _ISR_Disable( level ); old_tables = information->object_blocks; information->object_blocks = object_blocks; 800471c: 59 72 00 34 sw (r11+52),r18 information->inactive_per_block = inactive_per_block; information->local_table = local_table; 8004720: 59 74 00 1c sw (r11+28),r20 8004724: 34 02 00 18 mvi r2,24 8004728: f8 00 36 99 calli 801218c <__ashlsi3> 800472c: 78 12 00 01 mvhi r18,0x1 8004730: b8 32 90 00 or r18,r1,r18 (( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) | 8004734: 2d 61 00 04 lhu r1,(r11+4) 8004738: 34 02 00 1b mvi r2,27 800473c: f8 00 36 94 calli 801218c <__ashlsi3> 8004740: ba 41 08 00 or r1,r18,r1 uint32_t the_class, uint32_t node, uint32_t index ) { return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) | 8004744: b8 31 88 00 or r17,r1,r17 information->maximum = (Objects_Maximum) maximum; information->maximum_id = _Objects_Build_id( 8004748: 59 71 00 0c sw (r11+12),r17 information->the_class, _Objects_Local_node, information->maximum ); _ISR_Enable( level ); 800474c: d0 0e 00 00 wcsr IE,r14 if ( old_tables ) 8004750: 46 00 00 03 be r16,r0,800475c <_Objects_Extend_information+0x1b0> _Workspace_Free( old_tables ); 8004754: ba 00 08 00 mv r1,r16 8004758: f8 00 0a 09 calli 8006f7c <_Workspace_Free> } /* * Assign the new object block to the object block table. */ information->object_blocks[ block ] = new_object_block; 800475c: 29 61 00 34 lw r1,(r11+52) 8004760: b5 8c 60 00 add r12,r12,r12 /* * Initialize objects .. add to a local chain first. */ _Chain_Initialize( 8004764: 2d 63 00 14 lhu r3,(r11+20) 8004768: 29 64 00 18 lw r4,(r11+24) } /* * Assign the new object block to the object block table. */ information->object_blocks[ block ] = new_object_block; 800476c: b5 8c 60 00 add r12,r12,r12 8004770: b4 2c 08 00 add r1,r1,r12 /* * Initialize objects .. add to a local chain first. */ _Chain_Initialize( 8004774: 37 90 00 30 addi r16,sp,48 } /* * Assign the new object block to the object block table. */ information->object_blocks[ block ] = new_object_block; 8004778: 58 2f 00 00 sw (r1+0),r15 /* * Initialize objects .. add to a local chain first. */ _Chain_Initialize( 800477c: b9 e0 10 00 mv r2,r15 8004780: ba 00 08 00 mv r1,r16 8004784: f8 00 15 99 calli 8009de8 <_Chain_Initialize> 8004788: 78 12 00 01 mvhi r18,0x1 information->the_class, _Objects_Local_node, index ); _Chain_Append( &information->Inactive, &the_object->Node ); 800478c: 35 71 00 20 addi r17,r11,32 /* * Move from the local chain, initialise, then append to the inactive chain */ index = index_base; while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) { 8004790: e0 00 00 0e bi 80047c8 <_Objects_Extend_information+0x21c> 8004794: 29 61 00 00 lw r1,(r11+0) 8004798: f8 00 36 7d calli 801218c <__ashlsi3> 800479c: b8 32 78 00 or r15,r1,r18 (( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) | 80047a0: 2d 61 00 04 lhu r1,(r11+4) 80047a4: 34 02 00 1b mvi r2,27 80047a8: f8 00 36 79 calli 801218c <__ashlsi3> 80047ac: b9 e1 10 00 or r2,r15,r1 uint32_t the_class, uint32_t node, uint32_t index ) { return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) | 80047b0: b8 4d 10 00 or r2,r2,r13 the_object->id = _Objects_Build_id( 80047b4: 59 c2 00 08 sw (r14+8),r2 information->the_class, _Objects_Local_node, index ); _Chain_Append( &information->Inactive, &the_object->Node ); 80047b8: ba 20 08 00 mv r1,r17 80047bc: b9 c0 10 00 mv r2,r14 80047c0: fb ff fc 3c calli 80038b0 <_Chain_Append> index++; 80047c4: 35 ad 00 01 addi r13,r13,1 /* * Move from the local chain, initialise, then append to the inactive chain */ index = index_base; while ((the_object = (Objects_Control *) _Chain_Get( &Inactive )) != NULL ) { 80047c8: ba 00 08 00 mv r1,r16 80047cc: fb ff fc 4f calli 8003908 <_Chain_Get> 80047d0: b8 20 70 00 mv r14,r1 80047d4: 34 02 00 18 mvi r2,24 80047d8: 5c 20 ff ef bne r1,r0,8004794 <_Objects_Extend_information+0x1e8> _Chain_Append( &information->Inactive, &the_object->Node ); index++; } information->inactive_per_block[ block ] = information->allocation_size; 80047dc: 29 63 00 30 lw r3,(r11+48) information->inactive = (Objects_Maximum)(information->inactive + information->allocation_size); 80047e0: 2d 62 00 2c lhu r2,(r11+44) _Chain_Append( &information->Inactive, &the_object->Node ); index++; } information->inactive_per_block[ block ] = information->allocation_size; 80047e4: 2d 61 00 14 lhu r1,(r11+20) 80047e8: b4 6c 60 00 add r12,r3,r12 80047ec: 59 81 00 00 sw (r12+0),r1 information->inactive = (Objects_Maximum)(information->inactive + information->allocation_size); 80047f0: b4 22 08 00 add r1,r1,r2 index++; } information->inactive_per_block[ block ] = information->allocation_size; information->inactive = 80047f4: 0d 61 00 2c sh (r11+44),r1 (Objects_Maximum)(information->inactive + information->allocation_size); } 80047f8: 2b 9d 00 04 lw ra,(sp+4) 80047fc: 2b 8b 00 2c lw r11,(sp+44) 8004800: 2b 8c 00 28 lw r12,(sp+40) 8004804: 2b 8d 00 24 lw r13,(sp+36) 8004808: 2b 8e 00 20 lw r14,(sp+32) 800480c: 2b 8f 00 1c lw r15,(sp+28) 8004810: 2b 90 00 18 lw r16,(sp+24) 8004814: 2b 91 00 14 lw r17,(sp+20) 8004818: 2b 92 00 10 lw r18,(sp+16) 800481c: 2b 93 00 0c lw r19,(sp+12) 8004820: 2b 94 00 08 lw r20,(sp+8) 8004824: 37 9c 00 38 addi sp,sp,56 8004828: c3 a0 00 00 ret block_count = 0; else { block_count = information->maximum / information->allocation_size; for ( ; block < block_count; block++ ) { if ( information->object_blocks[ block ] == NULL ) { 800482c: 28 62 00 04 lw r2,(r3+4) 8004830: 34 63 00 04 addi r3,r3,4 8004834: 5c 40 ff 7b bne r2,r0,8004620 <_Objects_Extend_information+0x74> do_extend = false; 8004838: 34 12 00 00 mvi r18,0 800483c: e3 ff ff 7d bi 8004630 <_Objects_Extend_information+0x84> if ( information->auto_extend ) { new_object_block = _Workspace_Allocate( block_size ); if ( !new_object_block ) return; } else { new_object_block = _Workspace_Allocate_or_fatal_error( block_size ); 8004840: f8 00 09 d8 calli 8006fa0 <_Workspace_Allocate_or_fatal_error> 8004844: b8 20 78 00 mv r15,r1 8004848: e3 ff ff 84 bi 8004658 <_Objects_Extend_information+0xac> /* * Copy each section of the table over. This has to be performed as * separate parts as size of each block has changed. */ memcpy( object_blocks, 800484c: 29 62 00 34 lw r2,(r11+52) information->object_blocks, block_count * sizeof(void*) ); 8004850: b5 ce 70 00 add r14,r14,r14 8004854: b5 ce 70 00 add r14,r14,r14 /* * Copy each section of the table over. This has to be performed as * separate parts as size of each block has changed. */ memcpy( object_blocks, 8004858: b9 c0 18 00 mv r3,r14 800485c: f8 00 24 14 calli 800d8ac information->object_blocks, block_count * sizeof(void*) ); memcpy( inactive_per_block, 8004860: 29 62 00 30 lw r2,(r11+48) 8004864: b9 c0 18 00 mv r3,r14 8004868: ba 60 08 00 mv r1,r19 800486c: f8 00 24 10 calli 800d8ac information->inactive_per_block, block_count * sizeof(uint32_t) ); memcpy( local_table, information->local_table, (information->maximum + minimum_index) * sizeof(Objects_Control *) ); 8004870: 2d 63 00 10 lhu r3,(r11+16) information->object_blocks, block_count * sizeof(void*) ); memcpy( inactive_per_block, information->inactive_per_block, block_count * sizeof(uint32_t) ); memcpy( local_table, 8004874: 29 62 00 1c lw r2,(r11+28) 8004878: ba 80 08 00 mv r1,r20 information->local_table, (information->maximum + minimum_index) * sizeof(Objects_Control *) ); 800487c: b6 03 18 00 add r3,r16,r3 8004880: b4 63 18 00 add r3,r3,r3 8004884: b4 63 18 00 add r3,r3,r3 information->object_blocks, block_count * sizeof(void*) ); memcpy( inactive_per_block, information->inactive_per_block, block_count * sizeof(uint32_t) ); memcpy( local_table, 8004888: f8 00 24 09 calli 800d8ac 800488c: e3 ff ff 8c bi 80046bc <_Objects_Extend_information+0x110> minimum_index = _Objects_Get_index( information->minimum_id ); index_base = minimum_index; block = 0; /* if ( information->maximum < minimum_index ) */ if ( information->object_blocks == NULL ) 8004890: 2c 31 00 10 lhu r17,(r1+16) /* * Search for a free block of indexes. If we do NOT need to allocate or * extend the block table, then we will change do_extend. */ do_extend = true; minimum_index = _Objects_Get_index( information->minimum_id ); 8004894: ba 00 68 00 mv r13,r16 index_base = minimum_index; block = 0; /* if ( information->maximum < minimum_index ) */ if ( information->object_blocks == NULL ) 8004898: 2c 21 00 14 lhu r1,(r1+20) /* * Search for a free block of indexes. If we do NOT need to allocate or * extend the block table, then we will change do_extend. */ do_extend = true; 800489c: 34 12 00 01 mvi r18,1 index_base = minimum_index; block = 0; /* if ( information->maximum < minimum_index ) */ if ( information->object_blocks == NULL ) block_count = 0; 80048a0: 34 0e 00 00 mvi r14,0 80048a4: e3 ff ff 63 bi 8004630 <_Objects_Extend_information+0x84> else { block_count = information->maximum / information->allocation_size; for ( ; block < block_count; block++ ) { 80048a8: b9 e0 08 00 mv r1,r15 <== NOT EXECUTED /* * Search for a free block of indexes. If we do NOT need to allocate or * extend the block table, then we will change do_extend. */ do_extend = true; minimum_index = _Objects_Get_index( information->minimum_id ); 80048ac: ba 00 68 00 mv r13,r16 <== NOT EXECUTED /* * Search for a free block of indexes. If we do NOT need to allocate or * extend the block table, then we will change do_extend. */ do_extend = true; 80048b0: 34 12 00 01 mvi r18,1 <== NOT EXECUTED minimum_index = _Objects_Get_index( information->minimum_id ); index_base = minimum_index; block = 0; 80048b4: 34 0c 00 00 mvi r12,0 <== NOT EXECUTED 80048b8: e3 ff ff 5e bi 8004630 <_Objects_Extend_information+0x84> <== NOT EXECUTED block_count = 0; else { block_count = information->maximum / information->allocation_size; for ( ; block < block_count; block++ ) { if ( information->object_blocks[ block ] == NULL ) { 80048bc: b9 e0 08 00 mv r1,r15 <== NOT EXECUTED /* * Search for a free block of indexes. If we do NOT need to allocate or * extend the block table, then we will change do_extend. */ do_extend = true; minimum_index = _Objects_Get_index( information->minimum_id ); 80048c0: ba 00 68 00 mv r13,r16 <== NOT EXECUTED else { block_count = information->maximum / information->allocation_size; for ( ; block < block_count; block++ ) { if ( information->object_blocks[ block ] == NULL ) { do_extend = false; 80048c4: 34 12 00 00 mvi r18,0 <== NOT EXECUTED * extend the block table, then we will change do_extend. */ do_extend = true; minimum_index = _Objects_Get_index( information->minimum_id ); index_base = minimum_index; block = 0; 80048c8: 34 0c 00 00 mvi r12,0 <== NOT EXECUTED 80048cc: e3 ff ff 59 bi 8004630 <_Objects_Extend_information+0x84> <== NOT EXECUTED (sizeof(void *) + sizeof(uint32_t) + sizeof(Objects_Name *)) + ((maximum + minimum_index) * sizeof(Objects_Control *)); object_blocks = (void**) _Workspace_Allocate( block_size ); if ( !object_blocks ) { _Workspace_Free( new_object_block ); 80048d0: b9 e0 08 00 mv r1,r15 80048d4: f8 00 09 aa calli 8006f7c <_Workspace_Free> return; 80048d8: e3 ff ff c8 bi 80047f8 <_Objects_Extend_information+0x24c> =============================================================================== 080049c4 <_Objects_Get_information>: Objects_Information *_Objects_Get_information( Objects_APIs the_api, uint16_t the_class ) { 80049c4: 37 9c ff f0 addi sp,sp,-16 80049c8: 5b 8b 00 10 sw (sp+16),r11 80049cc: 5b 8c 00 0c sw (sp+12),r12 80049d0: 5b 8d 00 08 sw (sp+8),r13 80049d4: 5b 9d 00 04 sw (sp+4),ra 80049d8: 20 4c ff ff andi r12,r2,0xffff 80049dc: b8 20 68 00 mv r13,r1 Objects_Information *info; int the_class_api_maximum; if ( !the_class ) return NULL; 80049e0: 34 0b 00 00 mvi r11,0 ) { Objects_Information *info; int the_class_api_maximum; if ( !the_class ) 80049e4: 5d 80 00 08 bne r12,r0,8004a04 <_Objects_Get_information+0x40> if ( info->maximum == 0 ) return NULL; #endif return info; } 80049e8: b9 60 08 00 mv r1,r11 80049ec: 2b 9d 00 04 lw ra,(sp+4) 80049f0: 2b 8b 00 10 lw r11,(sp+16) 80049f4: 2b 8c 00 0c lw r12,(sp+12) 80049f8: 2b 8d 00 08 lw r13,(sp+8) 80049fc: 37 9c 00 10 addi sp,sp,16 8004a00: c3 a0 00 00 ret /* * 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 ); 8004a04: f8 00 16 9c calli 800a474 <_Objects_API_maximum_class> if ( the_class_api_maximum == 0 ) 8004a08: 44 20 ff f8 be r1,r0,80049e8 <_Objects_Get_information+0x24> return NULL; if ( the_class > (uint32_t) the_class_api_maximum ) 8004a0c: 55 81 ff f7 bgu r12,r1,80049e8 <_Objects_Get_information+0x24> return NULL; if ( !_Objects_Information_table[ the_api ] ) 8004a10: 78 01 08 01 mvhi r1,0x801 8004a14: b5 ad 68 00 add r13,r13,r13 8004a18: 38 21 48 84 ori r1,r1,0x4884 8004a1c: b5 ad 68 00 add r13,r13,r13 8004a20: b4 2d 08 00 add r1,r1,r13 8004a24: 28 21 00 00 lw r1,(r1+0) 8004a28: 44 20 ff f0 be r1,r0,80049e8 <_Objects_Get_information+0x24><== NEVER TAKEN return NULL; info = _Objects_Information_table[ the_api ][ the_class ]; 8004a2c: b5 8c 60 00 add r12,r12,r12 8004a30: b5 8c 60 00 add r12,r12,r12 8004a34: b4 2c 08 00 add r1,r1,r12 8004a38: 28 2b 00 00 lw r11,(r1+0) if ( !info ) 8004a3c: 45 60 ff eb be r11,r0,80049e8 <_Objects_Get_information+0x24><== 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 ) 8004a40: 2d 61 00 10 lhu r1,(r11+16) return NULL; 8004a44: 7c 21 00 00 cmpnei r1,r1,0 8004a48: c8 01 08 00 sub r1,r0,r1 8004a4c: a1 61 58 00 and r11,r11,r1 8004a50: e3 ff ff e6 bi 80049e8 <_Objects_Get_information+0x24> =============================================================================== 08006a18 <_Objects_Get_name_as_string>: char *_Objects_Get_name_as_string( Objects_Id id, size_t length, char *name ) { 8006a18: 37 9c ff e0 addi sp,sp,-32 8006a1c: 5b 8b 00 14 sw (sp+20),r11 8006a20: 5b 8c 00 10 sw (sp+16),r12 8006a24: 5b 8d 00 0c sw (sp+12),r13 8006a28: 5b 8e 00 08 sw (sp+8),r14 8006a2c: 5b 9d 00 04 sw (sp+4),ra 8006a30: b8 40 60 00 mv r12,r2 8006a34: b8 60 58 00 mv r11,r3 char lname[5]; Objects_Control *the_object; Objects_Locations location; Objects_Id tmpId; if ( length == 0 ) 8006a38: 5c 40 00 0a bne r2,r0,8006a60 <_Objects_Get_name_as_string+0x48> #if defined(RTEMS_MULTIPROCESSING) case OBJECTS_REMOTE: /* not supported */ #endif case OBJECTS_ERROR: return NULL; 8006a3c: 34 0b 00 00 mvi r11,0 _Thread_Enable_dispatch(); return name; } return NULL; /* unreachable path */ } 8006a40: b9 60 08 00 mv r1,r11 8006a44: 2b 9d 00 04 lw ra,(sp+4) 8006a48: 2b 8b 00 14 lw r11,(sp+20) 8006a4c: 2b 8c 00 10 lw r12,(sp+16) 8006a50: 2b 8d 00 0c lw r13,(sp+12) 8006a54: 2b 8e 00 08 lw r14,(sp+8) 8006a58: 37 9c 00 20 addi sp,sp,32 8006a5c: c3 a0 00 00 ret Objects_Id tmpId; if ( length == 0 ) return NULL; if ( name == NULL ) 8006a60: 44 60 ff f8 be r3,r0,8006a40 <_Objects_Get_name_as_string+0x28> return NULL; tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id; 8006a64: b8 20 68 00 mv r13,r1 8006a68: 5c 20 00 05 bne r1,r0,8006a7c <_Objects_Get_name_as_string+0x64> 8006a6c: 78 01 08 02 mvhi r1,0x802 8006a70: 38 21 ab e4 ori r1,r1,0xabe4 8006a74: 28 21 00 0c lw r1,(r1+12) 8006a78: 28 2d 00 08 lw r13,(r1+8) information = _Objects_Get_information_id( tmpId ); 8006a7c: b9 a0 08 00 mv r1,r13 8006a80: fb ff ff 94 calli 80068d0 <_Objects_Get_information_id> 8006a84: b8 20 70 00 mv r14,r1 if ( !information ) 8006a88: 44 20 ff ed be r1,r0,8006a3c <_Objects_Get_name_as_string+0x24> return NULL; the_object = _Objects_Get( information, tmpId, &location ); 8006a8c: b9 a0 10 00 mv r2,r13 8006a90: 37 83 00 20 addi r3,sp,32 8006a94: f8 00 00 36 calli 8006b6c <_Objects_Get> switch ( location ) { 8006a98: 2b 82 00 20 lw r2,(sp+32) 8006a9c: 5c 40 ff e8 bne r2,r0,8006a3c <_Objects_Get_name_as_string+0x24> return NULL; case OBJECTS_LOCAL: #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) if ( information->is_string ) { 8006aa0: 41 c3 00 38 lbu r3,(r14+56) 8006aa4: 44 62 00 1c be r3,r2,8006b14 <_Objects_Get_name_as_string+0xfc> s = the_object->name.name_p; 8006aa8: 28 27 00 0c lw r7,(r1+12) lname[ 4 ] = '\0'; s = lname; } d = name; if ( s ) { 8006aac: b9 60 08 00 mv r1,r11 8006ab0: 44 e0 00 16 be r7,r0,8006b08 <_Objects_Get_name_as_string+0xf0> for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) { 8006ab4: 35 8c ff ff addi r12,r12,-1 8006ab8: b9 60 08 00 mv r1,r11 8006abc: 45 80 00 13 be r12,r0,8006b08 <_Objects_Get_name_as_string+0xf0><== NEVER TAKEN 8006ac0: 40 e3 00 00 lbu r3,(r7+0) 8006ac4: 44 60 00 11 be r3,r0,8006b08 <_Objects_Get_name_as_string+0xf0> 8006ac8: 78 04 08 02 mvhi r4,0x802 8006acc: 34 02 00 00 mvi r2,0 8006ad0: 38 84 22 04 ori r4,r4,0x2204 *d = (isprint((unsigned char)*s)) ? *s : '*'; 8006ad4: 28 85 00 00 lw r5,(r4+0) s = lname; } d = name; if ( s ) { for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) { 8006ad8: 34 42 00 01 addi r2,r2,1 * This method objects the name of an object and returns its name * in the form of a C string. It attempts to be careful about * overflowing the user's string and about returning unprintable characters. */ char *_Objects_Get_name_as_string( 8006adc: b4 e2 30 00 add r6,r7,r2 } d = name; if ( s ) { for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) { *d = (isprint((unsigned char)*s)) ? *s : '*'; 8006ae0: b4 a3 28 00 add r5,r5,r3 8006ae4: 40 a5 00 01 lbu r5,(r5+1) 8006ae8: 20 a5 00 97 andi r5,r5,0x97 8006aec: 5c a0 00 02 bne r5,r0,8006af4 <_Objects_Get_name_as_string+0xdc> 8006af0: 34 03 00 2a mvi r3,42 8006af4: 30 23 00 00 sb (r1+0),r3 s = lname; } d = name; if ( s ) { for ( i=0 ; i<(length-1) && *s ; i++, s++, d++ ) { 8006af8: 34 21 00 01 addi r1,r1,1 8006afc: 50 4c 00 03 bgeu r2,r12,8006b08 <_Objects_Get_name_as_string+0xf0> 8006b00: 40 c3 00 00 lbu r3,(r6+0) 8006b04: 5c 60 ff f4 bne r3,r0,8006ad4 <_Objects_Get_name_as_string+0xbc> *d = (isprint((unsigned char)*s)) ? *s : '*'; } } *d = '\0'; 8006b08: 30 20 00 00 sb (r1+0),r0 _Thread_Enable_dispatch(); 8006b0c: f8 00 03 43 calli 8007818 <_Thread_Enable_dispatch> return name; 8006b10: e3 ff ff cc bi 8006a40 <_Objects_Get_name_as_string+0x28> if ( information->is_string ) { s = the_object->name.name_p; } else #endif { uint32_t u32_name = (uint32_t) the_object->name.name_u32; 8006b14: 28 2d 00 0c lw r13,(r1+12) lname[ 0 ] = (u32_name >> 24) & 0xff; 8006b18: 34 02 00 18 mvi r2,24 8006b1c: b9 a0 08 00 mv r1,r13 8006b20: fb ff e9 a3 calli 80011ac <__lshrsi3> 8006b24: 33 81 00 18 sb (sp+24),r1 lname[ 1 ] = (u32_name >> 16) & 0xff; 8006b28: 34 02 00 10 mvi r2,16 8006b2c: b9 a0 08 00 mv r1,r13 8006b30: fb ff e9 9f calli 80011ac <__lshrsi3> lname[ 2 ] = (u32_name >> 8) & 0xff; 8006b34: 01 a2 00 01 srui r2,r13,1 #endif { uint32_t u32_name = (uint32_t) the_object->name.name_u32; lname[ 0 ] = (u32_name >> 24) & 0xff; lname[ 1 ] = (u32_name >> 16) & 0xff; 8006b38: 33 81 00 19 sb (sp+25),r1 lname[ 2 ] = (u32_name >> 8) & 0xff; 8006b3c: 00 42 00 01 srui r2,r2,1 lname[ 3 ] = (u32_name >> 0) & 0xff; 8006b40: 33 8d 00 1b sb (sp+27),r13 { uint32_t u32_name = (uint32_t) the_object->name.name_u32; lname[ 0 ] = (u32_name >> 24) & 0xff; lname[ 1 ] = (u32_name >> 16) & 0xff; lname[ 2 ] = (u32_name >> 8) & 0xff; 8006b44: 00 42 00 01 srui r2,r2,1 lname[ 3 ] = (u32_name >> 0) & 0xff; lname[ 4 ] = '\0'; 8006b48: 33 80 00 1c sb (sp+28),r0 { uint32_t u32_name = (uint32_t) the_object->name.name_u32; lname[ 0 ] = (u32_name >> 24) & 0xff; lname[ 1 ] = (u32_name >> 16) & 0xff; lname[ 2 ] = (u32_name >> 8) & 0xff; 8006b4c: 00 42 00 01 srui r2,r2,1 lname[ 3 ] = (u32_name >> 0) & 0xff; lname[ 4 ] = '\0'; s = lname; 8006b50: 37 87 00 18 addi r7,sp,24 { uint32_t u32_name = (uint32_t) the_object->name.name_u32; lname[ 0 ] = (u32_name >> 24) & 0xff; lname[ 1 ] = (u32_name >> 16) & 0xff; lname[ 2 ] = (u32_name >> 8) & 0xff; 8006b54: 00 42 00 01 srui r2,r2,1 8006b58: 00 42 00 01 srui r2,r2,1 8006b5c: 00 42 00 01 srui r2,r2,1 8006b60: 00 42 00 01 srui r2,r2,1 8006b64: 33 82 00 1a sb (sp+26),r2 8006b68: e3 ff ff d3 bi 8006ab4 <_Objects_Get_name_as_string+0x9c> =============================================================================== 0801763c <_Objects_Get_no_protection>: /* * You can't just extract the index portion or you can get tricked * by a value between 1 and maximum. */ index = id - information->minimum_id + 1; 801763c: 28 25 00 08 lw r5,(r1+8) if ( information->maximum >= index ) { 8017640: 2c 24 00 10 lhu r4,(r1+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; 8017644: c8 45 10 00 sub r2,r2,r5 8017648: 34 42 00 01 addi r2,r2,1 if ( information->maximum >= index ) { 801764c: 54 44 00 09 bgu r2,r4,8017670 <_Objects_Get_no_protection+0x34> if ( (the_object = information->local_table[ index ]) != NULL ) { 8017650: 28 24 00 1c lw r4,(r1+28) 8017654: b4 42 08 00 add r1,r2,r2 8017658: b4 21 08 00 add r1,r1,r1 801765c: b4 81 08 00 add r1,r4,r1 8017660: 28 21 00 00 lw r1,(r1+0) 8017664: 44 20 00 03 be r1,r0,8017670 <_Objects_Get_no_protection+0x34><== NEVER TAKEN *location = OBJECTS_LOCAL; 8017668: 58 60 00 00 sw (r3+0),r0 return the_object; 801766c: c3 a0 00 00 ret /* * This isn't supported or required yet for Global objects so * if it isn't local, we don't find it. */ *location = OBJECTS_ERROR; 8017670: 34 01 00 01 mvi r1,1 8017674: 58 61 00 00 sw (r3+0),r1 return NULL; 8017678: 34 01 00 00 mvi r1,0 } 801767c: c3 a0 00 00 ret =============================================================================== 08006558 <_Objects_Id_to_name>: */ Objects_Name_or_id_lookup_errors _Objects_Id_to_name ( Objects_Id id, Objects_Name *name ) { 8006558: 37 9c ff e8 addi sp,sp,-24 800655c: 5b 8b 00 14 sw (sp+20),r11 8006560: 5b 8c 00 10 sw (sp+16),r12 8006564: 5b 8d 00 0c sw (sp+12),r13 8006568: 5b 8e 00 08 sw (sp+8),r14 800656c: 5b 9d 00 04 sw (sp+4),ra /* * Caller is trusted for name != NULL. */ tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id; 8006570: b8 20 58 00 mv r11,r1 */ Objects_Name_or_id_lookup_errors _Objects_Id_to_name ( Objects_Id id, Objects_Name *name ) { 8006574: b8 40 70 00 mv r14,r2 /* * Caller is trusted for name != NULL. */ tmpId = (id == OBJECTS_ID_OF_SELF) ? _Thread_Executing->Object.id : id; 8006578: 5c 20 00 05 bne r1,r0,800658c <_Objects_Id_to_name+0x34> 800657c: 78 01 08 02 mvhi r1,0x802 8006580: 38 21 1d fc ori r1,r1,0x1dfc 8006584: 28 21 00 0c lw r1,(r1+12) 8006588: 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); 800658c: b9 60 08 00 mv r1,r11 8006590: 34 02 00 18 mvi r2,24 8006594: f8 00 59 91 calli 801cbd8 <__lshrsi3> 8006598: 20 23 00 07 andi r3,r1,0x7 */ RTEMS_INLINE_ROUTINE bool _Objects_Is_api_valid( uint32_t the_api ) { if ( !the_api || the_api > OBJECTS_APIS_LAST ) 800659c: 34 64 ff ff addi r4,r3,-1 80065a0: 34 01 00 02 mvi r1,2 the_api = _Objects_Get_API( tmpId ); if ( !_Objects_Is_api_valid( the_api ) ) return OBJECTS_INVALID_ID; 80065a4: 34 0c 00 03 mvi r12,3 80065a8: 54 81 00 12 bgu r4,r1,80065f0 <_Objects_Id_to_name+0x98> if ( !_Objects_Information_table[ the_api ] ) 80065ac: 78 04 08 02 mvhi r4,0x802 80065b0: b4 63 18 00 add r3,r3,r3 80065b4: 38 84 18 cc ori r4,r4,0x18cc 80065b8: b4 63 18 00 add r3,r3,r3 80065bc: b4 83 18 00 add r3,r4,r3 80065c0: 28 6d 00 00 lw r13,(r3+0) 80065c4: 45 a0 00 0b be r13,r0,80065f0 <_Objects_Id_to_name+0x98> */ RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_class( Objects_Id id ) { return (uint32_t) 80065c8: b9 60 08 00 mv r1,r11 80065cc: 34 02 00 1b mvi r2,27 80065d0: f8 00 59 82 calli 801cbd8 <__lshrsi3> return OBJECTS_INVALID_ID; the_class = _Objects_Get_class( tmpId ); information = _Objects_Information_table[ the_api ][ the_class ]; 80065d4: b4 21 18 00 add r3,r1,r1 80065d8: b4 63 18 00 add r3,r3,r3 80065dc: b5 a3 18 00 add r3,r13,r3 80065e0: 28 63 00 00 lw r3,(r3+0) if ( !information ) 80065e4: 44 60 00 03 be r3,r0,80065f0 <_Objects_Id_to_name+0x98> <== NEVER TAKEN return OBJECTS_INVALID_ID; #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) if ( information->is_string ) 80065e8: 40 6d 00 38 lbu r13,(r3+56) 80065ec: 45 a0 00 09 be r13,r0,8006610 <_Objects_Id_to_name+0xb8> <== ALWAYS TAKEN return OBJECTS_INVALID_ID; *name = the_object->name; _Thread_Enable_dispatch(); return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL; } 80065f0: b9 80 08 00 mv r1,r12 80065f4: 2b 9d 00 04 lw ra,(sp+4) 80065f8: 2b 8b 00 14 lw r11,(sp+20) 80065fc: 2b 8c 00 10 lw r12,(sp+16) 8006600: 2b 8d 00 0c lw r13,(sp+12) 8006604: 2b 8e 00 08 lw r14,(sp+8) 8006608: 37 9c 00 18 addi sp,sp,24 800660c: c3 a0 00 00 ret #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) if ( information->is_string ) return OBJECTS_INVALID_ID; #endif the_object = _Objects_Get( information, tmpId, &ignored_location ); 8006610: b8 60 08 00 mv r1,r3 8006614: b9 60 10 00 mv r2,r11 8006618: 37 83 00 18 addi r3,sp,24 800661c: fb ff ff a9 calli 80064c0 <_Objects_Get> if ( !the_object ) 8006620: 44 2d ff f4 be r1,r13,80065f0 <_Objects_Id_to_name+0x98> return OBJECTS_INVALID_ID; *name = the_object->name; 8006624: 28 21 00 0c lw r1,(r1+12) _Thread_Enable_dispatch(); return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL; 8006628: 34 0c 00 00 mvi r12,0 the_object = _Objects_Get( information, tmpId, &ignored_location ); if ( !the_object ) return OBJECTS_INVALID_ID; *name = the_object->name; 800662c: 59 c1 00 00 sw (r14+0),r1 _Thread_Enable_dispatch(); 8006630: f8 00 03 77 calli 800740c <_Thread_Enable_dispatch> return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL; } 8006634: b9 80 08 00 mv r1,r12 8006638: 2b 9d 00 04 lw ra,(sp+4) 800663c: 2b 8b 00 14 lw r11,(sp+20) 8006640: 2b 8c 00 10 lw r12,(sp+16) 8006644: 2b 8d 00 0c lw r13,(sp+12) 8006648: 2b 8e 00 08 lw r14,(sp+8) 800664c: 37 9c 00 18 addi sp,sp,24 8006650: c3 a0 00 00 ret =============================================================================== 08004b58 <_Objects_Initialize_information>: , bool supports_global, Objects_Thread_queue_Extract_callout extract #endif ) { 8004b58: 37 9c ff e8 addi sp,sp,-24 8004b5c: 5b 8b 00 18 sw (sp+24),r11 8004b60: 5b 8c 00 14 sw (sp+20),r12 8004b64: 5b 8d 00 10 sw (sp+16),r13 8004b68: 5b 8e 00 0c sw (sp+12),r14 8004b6c: 5b 8f 00 08 sw (sp+8),r15 8004b70: 5b 9d 00 04 sw (sp+4),ra 8004b74: b8 40 68 00 mv r13,r2 information->maximum = 0; /* * Register this Object Class in the Object Information Table. */ _Objects_Information_table[ the_api ][ the_class ] = information; 8004b78: b5 ad 40 00 add r8,r13,r13 8004b7c: 78 02 08 01 mvhi r2,0x801 8004b80: 38 42 48 84 ori r2,r2,0x4884 8004b84: b5 08 40 00 add r8,r8,r8 8004b88: b4 48 40 00 add r8,r2,r8 8004b8c: 29 02 00 00 lw r2,(r8+0) , bool supports_global, Objects_Thread_queue_Extract_callout extract #endif ) { 8004b90: 20 6c ff ff andi r12,r3,0xffff information->maximum = 0; /* * Register this Object Class in the Object Information Table. */ _Objects_Information_table[ the_api ][ the_class ] = information; 8004b94: b5 8c 40 00 add r8,r12,r12 , bool supports_global, Objects_Thread_queue_Extract_callout extract #endif ) { 8004b98: 20 a5 ff ff andi r5,r5,0xffff information->maximum = 0; /* * Register this Object Class in the Object Information Table. */ _Objects_Information_table[ the_api ][ the_class ] = information; 8004b9c: b5 08 40 00 add r8,r8,r8 uint32_t maximum_per_allocation; #if defined(RTEMS_MULTIPROCESSING) uint32_t index; #endif information->the_api = the_api; 8004ba0: 58 2d 00 00 sw (r1+0),r13 information->the_class = the_class; 8004ba4: 0c 2c 00 04 sh (r1+4),r12 information->size = size; 8004ba8: 58 25 00 18 sw (r1+24),r5 information->local_table = 0; 8004bac: 58 20 00 1c sw (r1+28),r0 information->inactive_per_block = 0; 8004bb0: 58 20 00 30 sw (r1+48),r0 information->object_blocks = 0; 8004bb4: 58 20 00 34 sw (r1+52),r0 information->inactive = 0; 8004bb8: 0c 20 00 2c sh (r1+44),r0 #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) information->is_string = is_string; 8004bbc: 30 26 00 38 sb (r1+56),r6 /* * 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; 8004bc0: 0c 20 00 10 sh (r1+16),r0 /* * Register this Object Class in the Object Information Table. */ _Objects_Information_table[ the_api ][ the_class ] = information; 8004bc4: b4 48 40 00 add r8,r2,r8 , bool supports_global, Objects_Thread_queue_Extract_callout extract #endif ) { 8004bc8: b8 20 58 00 mv r11,r1 information->maximum = 0; /* * Register this Object Class in the Object Information Table. */ _Objects_Information_table[ the_api ][ the_class ] = information; 8004bcc: 59 01 00 00 sw (r8+0),r1 /* * Are we operating in limited or unlimited (e.g. auto-extend) mode. */ information->auto_extend = (maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false; 8004bd0: 34 02 00 1f mvi r2,31 8004bd4: b8 80 08 00 mv r1,r4 , bool supports_global, Objects_Thread_queue_Extract_callout extract #endif ) { 8004bd8: b8 80 70 00 mv r14,r4 8004bdc: b8 e0 78 00 mv r15,r7 /* * Are we operating in limited or unlimited (e.g. auto-extend) mode. */ information->auto_extend = (maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false; 8004be0: f8 00 35 b9 calli 80122c4 <__lshrsi3> maximum_per_allocation = maximum & ~OBJECTS_UNLIMITED_OBJECTS; 8004be4: 78 03 08 01 mvhi r3,0x801 8004be8: 38 63 37 14 ori r3,r3,0x3714 /* * Are we operating in limited or unlimited (e.g. auto-extend) mode. */ information->auto_extend = (maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false; 8004bec: 20 22 00 ff andi r2,r1,0xff maximum_per_allocation = maximum & ~OBJECTS_UNLIMITED_OBJECTS; 8004bf0: 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 = 8004bf4: 31 62 00 12 sb (r11+18),r2 (maximum & OBJECTS_UNLIMITED_OBJECTS) ? true : false; maximum_per_allocation = maximum & ~OBJECTS_UNLIMITED_OBJECTS; 8004bf8: a1 c1 70 00 and r14,r14,r1 /* * Unlimited and maximum of zero is illogical. */ if ( information->auto_extend && maximum_per_allocation == 0) { 8004bfc: 44 40 00 02 be r2,r0,8004c04 <_Objects_Initialize_information+0xac> 8004c00: 45 c0 00 29 be r14,r0,8004ca4 <_Objects_Initialize_information+0x14c><== NEVER TAKEN 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; 8004c04: 78 01 08 01 mvhi r1,0x801 8004c08: 38 21 46 f4 ori r1,r1,0x46f4 uint32_t the_class, uint32_t node, uint32_t index ) { return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) | 8004c0c: 34 02 00 18 mvi r2,24 8004c10: 59 61 00 1c sw (r11+28),r1 } /* * The allocation unit is the maximum value */ information->allocation_size = maximum_per_allocation; 8004c14: 0d 6e 00 14 sh (r11+20),r14 8004c18: b9 a0 08 00 mv r1,r13 8004c1c: f8 00 35 5c calli 801218c <__ashlsi3> 8004c20: 78 0d 00 01 mvhi r13,0x1 8004c24: b8 2d 68 00 or r13,r1,r13 (( (Objects_Id) the_class ) << OBJECTS_CLASS_START_BIT) | 8004c28: 34 02 00 1b mvi r2,27 8004c2c: b9 80 08 00 mv r1,r12 8004c30: f8 00 35 57 calli 801218c <__ashlsi3> information->local_table = &null_local_table; /* * Calculate minimum and maximum Id's */ minimum_index = (maximum_per_allocation == 0) ? 0 : 1; 8004c34: 7d c2 00 00 cmpnei r2,r14,0 8004c38: b9 a1 08 00 or r1,r13,r1 uint32_t the_class, uint32_t node, uint32_t index ) { return (( (Objects_Id) the_api ) << OBJECTS_API_START_BIT) | 8004c3c: b8 22 08 00 or r1,r1,r2 information->minimum_id = 8004c40: 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) ) 8004c44: 21 e1 00 03 andi r1,r15,0x3 8004c48: b9 e0 38 00 mv r7,r15 8004c4c: 5c 20 00 12 bne r1,r0,8004c94 <_Objects_Initialize_information+0x13c> 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 ); 8004c50: 35 62 00 24 addi r2,r11,36 */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { Chain_Node *head = _Chain_Head( the_chain ); 8004c54: 35 61 00 20 addi r1,r11,32 name_length = (name_length + OBJECTS_NAME_ALIGNMENT) & ~(OBJECTS_NAME_ALIGNMENT-1); information->name_length = name_length; 8004c58: 0d 67 00 3a sh (r11+58),r7 Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; 8004c5c: 59 62 00 20 sw (r11+32),r2 head->previous = NULL; 8004c60: 59 60 00 24 sw (r11+36),r0 tail->previous = head; 8004c64: 59 61 00 28 sw (r11+40),r1 _Chain_Initialize_empty( &information->Inactive ); /* * Initialize objects .. if there are any */ if ( maximum_per_allocation ) { 8004c68: 45 c0 00 03 be r14,r0,8004c74 <_Objects_Initialize_information+0x11c> /* * 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 ); 8004c6c: b9 60 08 00 mv r1,r11 8004c70: fb ff fe 4f calli 80045ac <_Objects_Extend_information> _Chain_Initialize_empty( &information->global_table[ index ] ); } else information->global_table = NULL; #endif } 8004c74: 2b 9d 00 04 lw ra,(sp+4) 8004c78: 2b 8b 00 18 lw r11,(sp+24) 8004c7c: 2b 8c 00 14 lw r12,(sp+20) 8004c80: 2b 8d 00 10 lw r13,(sp+16) 8004c84: 2b 8e 00 0c lw r14,(sp+12) 8004c88: 2b 8f 00 08 lw r15,(sp+8) 8004c8c: 37 9c 00 18 addi sp,sp,24 8004c90: c3 a0 00 00 ret * Calculate the maximum name length */ name_length = maximum_name_length; if ( name_length & (OBJECTS_NAME_ALIGNMENT-1) ) name_length = (name_length + OBJECTS_NAME_ALIGNMENT) & 8004c94: 35 e7 00 04 addi r7,r15,4 8004c98: 34 01 ff fc mvi r1,-4 8004c9c: a0 e1 38 00 and r7,r7,r1 8004ca0: e3 ff ff ec bi 8004c50 <_Objects_Initialize_information+0xf8> /* * Unlimited and maximum of zero is illogical. */ if ( information->auto_extend && maximum_per_allocation == 0) { _Internal_error_Occurred( 8004ca4: 34 01 00 00 mvi r1,0 <== NOT EXECUTED 8004ca8: 34 02 00 01 mvi r2,1 <== NOT EXECUTED 8004cac: 34 03 00 13 mvi r3,19 <== NOT EXECUTED 8004cb0: fb ff fd d4 calli 8004400 <_Internal_error_Occurred> <== NOT EXECUTED =============================================================================== 08004d30 <_Objects_Shrink_information>: */ void _Objects_Shrink_information( Objects_Information *information ) { 8004d30: 37 9c ff ec addi sp,sp,-20 8004d34: 5b 8b 00 14 sw (sp+20),r11 8004d38: 5b 8c 00 10 sw (sp+16),r12 8004d3c: 5b 8d 00 0c sw (sp+12),r13 8004d40: 5b 8e 00 08 sw (sp+8),r14 8004d44: 5b 9d 00 04 sw (sp+4),ra /* * Search the list to find block or chunk with all objects inactive. */ index_base = _Objects_Get_index( information->minimum_id ); 8004d48: 2c 2c 00 0a lhu r12,(r1+10) block_count = (information->maximum - index_base) / 8004d4c: 2c 2d 00 14 lhu r13,(r1+20) */ void _Objects_Shrink_information( Objects_Information *information ) { 8004d50: b8 20 70 00 mv r14,r1 /* * Search the list to find block or chunk with all objects inactive. */ index_base = _Objects_Get_index( information->minimum_id ); block_count = (information->maximum - index_base) / 8004d54: 2c 21 00 10 lhu r1,(r1+16) 8004d58: b9 a0 10 00 mv r2,r13 8004d5c: c8 2c 08 00 sub r1,r1,r12 8004d60: f8 00 35 e5 calli 80124f4 <__udivsi3> information->allocation_size; for ( block = 0; block < block_count; block++ ) { 8004d64: 44 20 00 09 be r1,r0,8004d88 <_Objects_Shrink_information+0x58><== NEVER TAKEN if ( information->inactive_per_block[ block ] == 8004d68: 29 c5 00 30 lw r5,(r14+48) 8004d6c: 34 0b 00 04 mvi r11,4 8004d70: 34 03 00 00 mvi r3,0 8004d74: 28 a2 00 00 lw r2,(r5+0) 8004d78: 45 a2 00 11 be r13,r2,8004dbc <_Objects_Shrink_information+0x8c><== NEVER TAKEN index_base = _Objects_Get_index( information->minimum_id ); block_count = (information->maximum - index_base) / information->allocation_size; for ( block = 0; block < block_count; block++ ) { 8004d7c: 34 63 00 01 addi r3,r3,1 * the_block - the block to remove * * Output parameters: NONE */ void _Objects_Shrink_information( 8004d80: b4 ab 10 00 add r2,r5,r11 index_base = _Objects_Get_index( information->minimum_id ); block_count = (information->maximum - index_base) / information->allocation_size; for ( block = 0; block < block_count; block++ ) { 8004d84: 54 23 00 08 bgu r1,r3,8004da4 <_Objects_Shrink_information+0x74> return; } index_base += information->allocation_size; } } 8004d88: 2b 9d 00 04 lw ra,(sp+4) 8004d8c: 2b 8b 00 14 lw r11,(sp+20) 8004d90: 2b 8c 00 10 lw r12,(sp+16) 8004d94: 2b 8d 00 0c lw r13,(sp+12) 8004d98: 2b 8e 00 08 lw r14,(sp+8) 8004d9c: 37 9c 00 14 addi sp,sp,20 8004da0: c3 a0 00 00 ret index_base = _Objects_Get_index( information->minimum_id ); block_count = (information->maximum - index_base) / information->allocation_size; for ( block = 0; block < block_count; block++ ) { if ( information->inactive_per_block[ block ] == 8004da4: 28 42 00 00 lw r2,(r2+0) information->inactive -= information->allocation_size; return; } index_base += information->allocation_size; 8004da8: 35 64 00 04 addi r4,r11,4 8004dac: b5 8d 60 00 add r12,r12,r13 index_base = _Objects_Get_index( information->minimum_id ); block_count = (information->maximum - index_base) / information->allocation_size; for ( block = 0; block < block_count; block++ ) { if ( information->inactive_per_block[ block ] == 8004db0: 45 a2 00 04 be r13,r2,8004dc0 <_Objects_Shrink_information+0x90> 8004db4: b8 80 58 00 mv r11,r4 8004db8: e3 ff ff f1 bi 8004d7c <_Objects_Shrink_information+0x4c> 8004dbc: 34 0b 00 00 mvi r11,0 <== NOT EXECUTED information->allocation_size ) { /* * Assume the Inactive chain is never empty at this point */ the_object = (Objects_Control *) _Chain_First( &information->Inactive ); 8004dc0: 29 c1 00 20 lw r1,(r14+32) do { index = _Objects_Get_index( the_object->id ); 8004dc4: 2c 22 00 0a lhu r2,(r1+10) /* * Get the next node before the node is extracted */ extract_me = the_object; the_object = (Objects_Control *) the_object->Node.next; 8004dc8: 28 2d 00 00 lw r13,(r1+0) if ((index >= index_base) && 8004dcc: 55 82 00 05 bgu r12,r2,8004de0 <_Objects_Shrink_information+0xb0> (index < (index_base + information->allocation_size))) { 8004dd0: 2d c3 00 14 lhu r3,(r14+20) 8004dd4: b5 83 18 00 add r3,r12,r3 /* * Get the next node before the node is extracted */ extract_me = the_object; the_object = (Objects_Control *) the_object->Node.next; if ((index >= index_base) && 8004dd8: 50 43 00 02 bgeu r2,r3,8004de0 <_Objects_Shrink_information+0xb0> (index < (index_base + information->allocation_size))) { _Chain_Extract( &extract_me->Node ); 8004ddc: fb ff fa c1 calli 80038e0 <_Chain_Extract> } } while ( the_object ); 8004de0: 45 a0 00 03 be r13,r0,8004dec <_Objects_Shrink_information+0xbc> index = _Objects_Get_index( the_object->id ); /* * Get the next node before the node is extracted */ extract_me = the_object; the_object = (Objects_Control *) the_object->Node.next; 8004de4: b9 a0 08 00 mv r1,r13 8004de8: e3 ff ff f7 bi 8004dc4 <_Objects_Shrink_information+0x94> while ( the_object ); /* * Free the memory and reset the structures in the object' information */ _Workspace_Free( information->object_blocks[ block ] ); 8004dec: 29 c1 00 34 lw r1,(r14+52) 8004df0: b4 2b 08 00 add r1,r1,r11 8004df4: 28 21 00 00 lw r1,(r1+0) 8004df8: f8 00 08 61 calli 8006f7c <_Workspace_Free> information->object_blocks[ block ] = NULL; 8004dfc: 29 c2 00 34 lw r2,(r14+52) information->inactive_per_block[ block ] = 0; 8004e00: 29 c4 00 30 lw r4,(r14+48) information->inactive -= information->allocation_size; 8004e04: 2d c3 00 2c lhu r3,(r14+44) 8004e08: 2d c1 00 14 lhu r1,(r14+20) /* * Free the memory and reset the structures in the object' information */ _Workspace_Free( information->object_blocks[ block ] ); information->object_blocks[ block ] = NULL; 8004e0c: b4 4b 10 00 add r2,r2,r11 8004e10: 58 40 00 00 sw (r2+0),r0 information->inactive_per_block[ block ] = 0; 8004e14: b4 8b 58 00 add r11,r4,r11 8004e18: 59 60 00 00 sw (r11+0),r0 information->inactive -= information->allocation_size; 8004e1c: c8 61 08 00 sub r1,r3,r1 8004e20: 0d c1 00 2c sh (r14+44),r1 return; } index_base += information->allocation_size; } } 8004e24: 2b 9d 00 04 lw ra,(sp+4) 8004e28: 2b 8b 00 14 lw r11,(sp+20) 8004e2c: 2b 8c 00 10 lw r12,(sp+16) 8004e30: 2b 8d 00 0c lw r13,(sp+12) 8004e34: 2b 8e 00 08 lw r14,(sp+8) 8004e38: 37 9c 00 14 addi sp,sp,20 8004e3c: c3 a0 00 00 ret =============================================================================== 08009018 <_POSIX_Message_queue_Receive_support>: size_t msg_len, unsigned int *msg_prio, bool wait, Watchdog_Interval timeout ) { 8009018: 37 9c ff dc addi sp,sp,-36 800901c: 5b 8b 00 1c sw (sp+28),r11 8009020: 5b 8c 00 18 sw (sp+24),r12 8009024: 5b 8d 00 14 sw (sp+20),r13 8009028: 5b 8e 00 10 sw (sp+16),r14 800902c: 5b 8f 00 0c sw (sp+12),r15 8009030: 5b 90 00 08 sw (sp+8),r16 8009034: 5b 9d 00 04 sw (sp+4),ra 8009038: b8 20 60 00 mv r12,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( 800903c: 78 01 08 02 mvhi r1,0x802 8009040: b8 40 78 00 mv r15,r2 8009044: b8 60 58 00 mv r11,r3 8009048: b9 80 10 00 mv r2,r12 800904c: 38 21 a2 58 ori r1,r1,0xa258 8009050: 37 83 00 24 addi r3,sp,36 8009054: b8 80 68 00 mv r13,r4 8009058: b8 c0 70 00 mv r14,r6 800905c: 20 b0 00 ff andi r16,r5,0xff 8009060: f8 00 0d 2b calli 800c50c <_Objects_Get> Objects_Locations location; size_t length_out; bool do_wait; the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location ); switch ( location ) { 8009064: 2b 82 00 24 lw r2,(sp+36) 8009068: 44 40 00 0e be r2,r0,80090a0 <_POSIX_Message_queue_Receive_support+0x88> #endif case OBJECTS_ERROR: break; } rtems_set_errno_and_return_minus_one( EBADF ); 800906c: f8 00 30 8f calli 80152a8 <__errno> 8009070: 34 02 00 09 mvi r2,9 8009074: 58 22 00 00 sw (r1+0),r2 8009078: 34 01 ff ff mvi r1,-1 } 800907c: 2b 9d 00 04 lw ra,(sp+4) 8009080: 2b 8b 00 1c lw r11,(sp+28) 8009084: 2b 8c 00 18 lw r12,(sp+24) 8009088: 2b 8d 00 14 lw r13,(sp+20) 800908c: 2b 8e 00 10 lw r14,(sp+16) 8009090: 2b 8f 00 0c lw r15,(sp+12) 8009094: 2b 90 00 08 lw r16,(sp+8) 8009098: 37 9c 00 24 addi sp,sp,36 800909c: c3 a0 00 00 ret the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location ); switch ( location ) { case OBJECTS_LOCAL: if ( (the_mq_fd->oflag & O_ACCMODE) == O_WRONLY ) { 80090a0: 28 28 00 14 lw r8,(r1+20) 80090a4: 34 07 00 01 mvi r7,1 80090a8: 21 09 00 03 andi r9,r8,0x3 80090ac: 45 27 00 2e be r9,r7,8009164 <_POSIX_Message_queue_Receive_support+0x14c> _Thread_Enable_dispatch(); rtems_set_errno_and_return_minus_one( EBADF ); } the_mq = the_mq_fd->Queue; 80090b0: 28 27 00 10 lw r7,(r1+16) if ( msg_len < the_mq->Message_queue.maximum_message_size ) { 80090b4: 28 e1 00 68 lw r1,(r7+104) 80090b8: 51 61 00 07 bgeu r11,r1,80090d4 <_POSIX_Message_queue_Receive_support+0xbc> _Thread_Enable_dispatch(); 80090bc: f8 00 10 b2 calli 800d384 <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one( EMSGSIZE ); 80090c0: f8 00 30 7a calli 80152a8 <__errno> 80090c4: 34 02 00 7a mvi r2,122 80090c8: 58 22 00 00 sw (r1+0),r2 80090cc: 34 01 ff ff mvi r1,-1 80090d0: e3 ff ff eb bi 800907c <_POSIX_Message_queue_Receive_support+0x64> /* * Now if something goes wrong, we return a "length" of -1 * to indicate an error. */ length_out = -1; 80090d4: 34 01 ff ff mvi r1,-1 80090d8: 5b 81 00 20 sw (sp+32),r1 /* * A timed receive with a bad time will do a poll regardless. */ if ( wait ) 80090dc: 34 05 00 00 mvi r5,0 80090e0: 5e 00 00 16 bne r16,r0,8009138 <_POSIX_Message_queue_Receive_support+0x120><== ALWAYS TAKEN timeout ); _Thread_Enable_dispatch(); *msg_prio = _POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count); 80090e4: 78 0b 08 02 mvhi r11,0x802 do_wait = wait; /* * Now perform the actual message receive */ _CORE_message_queue_Seize( 80090e8: 34 e1 00 1c addi r1,r7,28 80090ec: b9 80 10 00 mv r2,r12 80090f0: b9 e0 18 00 mv r3,r15 80090f4: 37 84 00 20 addi r4,sp,32 80090f8: b9 c0 30 00 mv r6,r14 timeout ); _Thread_Enable_dispatch(); *msg_prio = _POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count); 80090fc: 39 6b a2 c4 ori r11,r11,0xa2c4 do_wait = wait; /* * Now perform the actual message receive */ _CORE_message_queue_Seize( 8009100: f8 00 07 d1 calli 800b044 <_CORE_message_queue_Seize> &length_out, do_wait, timeout ); _Thread_Enable_dispatch(); 8009104: f8 00 10 a0 calli 800d384 <_Thread_Enable_dispatch> *msg_prio = _POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count); 8009108: 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); 800910c: 34 02 00 1f mvi r2,31 8009110: 29 81 00 24 lw r1,(r12+36) 8009114: f8 00 6f 99 calli 8024f78 <__ashrsi3> 8009118: 29 83 00 24 lw r3,(r12+36) if ( !_Thread_Executing->Wait.return_code ) 800911c: 29 82 00 34 lw r2,(r12+52) 8009120: 98 23 18 00 xor r3,r1,r3 8009124: c8 61 08 00 sub r1,r3,r1 do_wait, timeout ); _Thread_Enable_dispatch(); *msg_prio = 8009128: 59 a1 00 00 sw (r13+0),r1 _POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count); if ( !_Thread_Executing->Wait.return_code ) 800912c: 5c 40 00 06 bne r2,r0,8009144 <_POSIX_Message_queue_Receive_support+0x12c> return length_out; 8009130: 2b 81 00 20 lw r1,(sp+32) 8009134: e3 ff ff d2 bi 800907c <_POSIX_Message_queue_Receive_support+0x64> /* * A timed receive with a bad time will do a poll regardless. */ if ( wait ) do_wait = (the_mq_fd->oflag & O_NONBLOCK) ? false : true; 8009138: 21 05 40 00 andi r5,r8,0x4000 length_out = -1; /* * A timed receive with a bad time will do a poll regardless. */ if ( wait ) 800913c: 64 a5 00 00 cmpei r5,r5,0 8009140: e3 ff ff e9 bi 80090e4 <_POSIX_Message_queue_Receive_support+0xcc> _POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count); if ( !_Thread_Executing->Wait.return_code ) return length_out; rtems_set_errno_and_return_minus_one( 8009144: f8 00 30 59 calli 80152a8 <__errno> 8009148: b8 20 60 00 mv r12,r1 800914c: 29 61 00 0c lw r1,(r11+12) 8009150: 28 21 00 34 lw r1,(r1+52) 8009154: f8 00 00 c2 calli 800945c <_POSIX_Message_queue_Translate_core_message_queue_return_code> 8009158: 59 81 00 00 sw (r12+0),r1 800915c: 34 01 ff ff mvi r1,-1 8009160: e3 ff ff c7 bi 800907c <_POSIX_Message_queue_Receive_support+0x64> the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location ); switch ( location ) { case OBJECTS_LOCAL: if ( (the_mq_fd->oflag & O_ACCMODE) == O_WRONLY ) { _Thread_Enable_dispatch(); 8009164: f8 00 10 88 calli 800d384 <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one( EBADF ); 8009168: f8 00 30 50 calli 80152a8 <__errno> 800916c: 34 02 00 09 mvi r2,9 8009170: 58 22 00 00 sw (r1+0),r2 8009174: 34 01 ff ff mvi r1,-1 8009178: e3 ff ff c1 bi 800907c <_POSIX_Message_queue_Receive_support+0x64> =============================================================================== 08008b90 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch>: #include void _POSIX_Thread_Evaluate_cancellation_and_enable_dispatch( Thread_Control *the_thread ) { 8008b90: 37 9c ff fc addi sp,sp,-4 8008b94: 5b 9d 00 04 sw (sp+4),ra POSIX_API_Control *thread_support; thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ]; 8008b98: 28 22 01 20 lw r2,(r1+288) if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE && 8008b9c: 28 43 00 d8 lw r3,(r2+216) 8008ba0: 5c 60 00 04 bne r3,r0,8008bb0 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x20><== NEVER TAKEN 8008ba4: 28 44 00 dc lw r4,(r2+220) 8008ba8: 34 03 00 01 mvi r3,1 8008bac: 44 83 00 05 be r4,r3,8008bc0 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x30> thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS && thread_support->cancelation_requested ) { _Thread_Unnest_dispatch(); _POSIX_Thread_Exit( the_thread, PTHREAD_CANCELED ); } else _Thread_Enable_dispatch(); 8008bb0: fb ff f3 32 calli 8005878 <_Thread_Enable_dispatch> } 8008bb4: 2b 9d 00 04 lw ra,(sp+4) 8008bb8: 37 9c 00 04 addi sp,sp,4 8008bbc: c3 a0 00 00 ret POSIX_API_Control *thread_support; thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ]; if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE && thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS && 8008bc0: 28 42 00 e0 lw r2,(r2+224) 8008bc4: 44 40 ff fb be r2,r0,8008bb0 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x20> */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; 8008bc8: 78 03 08 01 mvhi r3,0x801 8008bcc: 38 63 68 98 ori r3,r3,0x6898 8008bd0: 28 64 00 00 lw r4,(r3+0) thread_support->cancelation_requested ) { _Thread_Unnest_dispatch(); _POSIX_Thread_Exit( the_thread, PTHREAD_CANCELED ); 8008bd4: 34 02 ff ff mvi r2,-1 8008bd8: 34 84 ff ff addi r4,r4,-1 8008bdc: 58 64 00 00 sw (r3+0),r4 8008be0: f8 00 02 89 calli 8009604 <_POSIX_Thread_Exit> 8008be4: e3 ff ff f4 bi 8008bb4 <_POSIX_Thread_Evaluate_cancellation_and_enable_dispatch+0x24> =============================================================================== 0800a6cc <_POSIX_Thread_Translate_sched_param>: int policy, struct sched_param *param, Thread_CPU_budget_algorithms *budget_algorithm, Thread_CPU_budget_algorithm_callout *budget_callout ) { 800a6cc: 37 9c ff e8 addi sp,sp,-24 800a6d0: 5b 8b 00 18 sw (sp+24),r11 800a6d4: 5b 8c 00 14 sw (sp+20),r12 800a6d8: 5b 8d 00 10 sw (sp+16),r13 800a6dc: 5b 8e 00 0c sw (sp+12),r14 800a6e0: 5b 8f 00 08 sw (sp+8),r15 800a6e4: 5b 9d 00 04 sw (sp+4),ra 800a6e8: b8 20 68 00 mv r13,r1 if ( !_POSIX_Priority_Is_valid( param->sched_priority ) ) 800a6ec: 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 ) { 800a6f0: b8 40 60 00 mv r12,r2 800a6f4: b8 60 70 00 mv r14,r3 800a6f8: b8 80 78 00 mv r15,r4 if ( !_POSIX_Priority_Is_valid( param->sched_priority ) ) 800a6fc: fb ff ff ec calli 800a6ac <_POSIX_Priority_Is_valid> return EINVAL; 800a700: 34 0b 00 16 mvi r11,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 ) ) 800a704: 44 20 00 0c be r1,r0,800a734 <_POSIX_Thread_Translate_sched_param+0x68><== NEVER TAKEN return EINVAL; *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; 800a708: 59 c0 00 00 sw (r14+0),r0 *budget_callout = NULL; 800a70c: 59 e0 00 00 sw (r15+0),r0 if ( policy == SCHED_OTHER ) { 800a710: 45 a0 00 12 be r13,r0,800a758 <_POSIX_Thread_Translate_sched_param+0x8c> *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; return 0; } if ( policy == SCHED_FIFO ) { 800a714: 34 01 00 01 mvi r1,1 *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; return 0; 800a718: 34 0b 00 00 mvi r11,0 if ( policy == SCHED_OTHER ) { *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; return 0; } if ( policy == SCHED_FIFO ) { 800a71c: 45 a1 00 06 be r13,r1,800a734 <_POSIX_Thread_Translate_sched_param+0x68> *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; return 0; } if ( policy == SCHED_RR ) { 800a720: 34 01 00 02 mvi r1,2 800a724: 45 a1 00 2b be r13,r1,800a7d0 <_POSIX_Thread_Translate_sched_param+0x104> *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE; return 0; } if ( policy == SCHED_SPORADIC ) { 800a728: 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; 800a72c: 34 0b 00 16 mvi r11,22 if ( policy == SCHED_RR ) { *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE; return 0; } if ( policy == SCHED_SPORADIC ) { 800a730: 45 a1 00 0e be r13,r1,800a768 <_POSIX_Thread_Translate_sched_param+0x9c> *budget_callout = _POSIX_Threads_Sporadic_budget_callout; return 0; } return EINVAL; } 800a734: b9 60 08 00 mv r1,r11 800a738: 2b 9d 00 04 lw ra,(sp+4) 800a73c: 2b 8b 00 18 lw r11,(sp+24) 800a740: 2b 8c 00 14 lw r12,(sp+20) 800a744: 2b 8d 00 10 lw r13,(sp+16) 800a748: 2b 8e 00 0c lw r14,(sp+12) 800a74c: 2b 8f 00 08 lw r15,(sp+8) 800a750: 37 9c 00 18 addi sp,sp,24 800a754: c3 a0 00 00 ret *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; *budget_callout = NULL; if ( policy == SCHED_OTHER ) { *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; 800a758: 34 01 00 01 mvi r1,1 800a75c: 59 c1 00 00 sw (r14+0),r1 return 0; 800a760: 34 0b 00 00 mvi r11,0 800a764: e3 ff ff f4 bi 800a734 <_POSIX_Thread_Translate_sched_param+0x68> *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE; return 0; } if ( policy == SCHED_SPORADIC ) { if ( (param->sched_ss_repl_period.tv_sec == 0) && 800a768: 29 81 00 08 lw r1,(r12+8) 800a76c: 5c 20 00 03 bne r1,r0,800a778 <_POSIX_Thread_Translate_sched_param+0xac> 800a770: 29 82 00 0c lw r2,(r12+12) 800a774: 44 41 ff f0 be r2,r1,800a734 <_POSIX_Thread_Translate_sched_param+0x68> (param->sched_ss_repl_period.tv_nsec == 0) ) return EINVAL; if ( (param->sched_ss_init_budget.tv_sec == 0) && 800a778: 29 81 00 10 lw r1,(r12+16) 800a77c: 5c 20 00 04 bne r1,r0,800a78c <_POSIX_Thread_Translate_sched_param+0xc0> 800a780: 29 82 00 14 lw r2,(r12+20) (param->sched_ss_init_budget.tv_nsec == 0) ) return EINVAL; 800a784: 34 0b 00 16 mvi r11,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) && 800a788: 44 41 ff eb be r2,r1,800a734 <_POSIX_Thread_Translate_sched_param+0x68> (param->sched_ss_init_budget.tv_nsec == 0) ) return EINVAL; if ( _Timespec_To_ticks( ¶m->sched_ss_repl_period ) < 800a78c: 35 81 00 08 addi r1,r12,8 800a790: fb ff f4 36 calli 8007868 <_Timespec_To_ticks> 800a794: b8 20 68 00 mv r13,r1 _Timespec_To_ticks( ¶m->sched_ss_init_budget ) ) 800a798: 35 81 00 10 addi r1,r12,16 800a79c: fb ff f4 33 calli 8007868 <_Timespec_To_ticks> return EINVAL; 800a7a0: 34 0b 00 16 mvi r11,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 ) < 800a7a4: 54 2d ff e4 bgu r1,r13,800a734 <_POSIX_Thread_Translate_sched_param+0x68> _Timespec_To_ticks( ¶m->sched_ss_init_budget ) ) return EINVAL; if ( !_POSIX_Priority_Is_valid( param->sched_ss_low_priority ) ) 800a7a8: 29 81 00 04 lw r1,(r12+4) 800a7ac: fb ff ff c0 calli 800a6ac <_POSIX_Priority_Is_valid> 800a7b0: 44 20 ff e1 be r1,r0,800a734 <_POSIX_Thread_Translate_sched_param+0x68> return EINVAL; *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT; *budget_callout = _POSIX_Threads_Sporadic_budget_callout; 800a7b4: 78 01 08 00 mvhi r1,0x800 return EINVAL; if ( !_POSIX_Priority_Is_valid( param->sched_ss_low_priority ) ) return EINVAL; *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT; 800a7b8: 34 02 00 03 mvi r2,3 800a7bc: 59 c2 00 00 sw (r14+0),r2 *budget_callout = _POSIX_Threads_Sporadic_budget_callout; 800a7c0: 38 21 3b b4 ori r1,r1,0x3bb4 800a7c4: 59 e1 00 00 sw (r15+0),r1 return 0; 800a7c8: 34 0b 00 00 mvi r11,0 800a7cc: e3 ff ff da bi 800a734 <_POSIX_Thread_Translate_sched_param+0x68> *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; return 0; } if ( policy == SCHED_RR ) { *budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE; 800a7d0: 59 cd 00 00 sw (r14+0),r13 return 0; 800a7d4: e3 ff ff d8 bi 800a734 <_POSIX_Thread_Translate_sched_param+0x68> =============================================================================== 08009340 <_POSIX_Threads_Exitted_extension>: * This method is invoked each time a thread exits. */ void _POSIX_Threads_Exitted_extension( Thread_Control *executing ) { 8009340: 37 9c ff f8 addi sp,sp,-8 8009344: 5b 8b 00 08 sw (sp+8),r11 8009348: 5b 9d 00 04 sw (sp+4),ra 800934c: b8 20 58 00 mv r11,r1 */ RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API( Objects_Id id ) { return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS); 8009350: 28 21 00 08 lw r1,(r1+8) 8009354: 34 02 00 18 mvi r2,24 8009358: f8 00 23 db calli 80122c4 <__lshrsi3> 800935c: 20 21 00 07 andi r1,r1,0x7 /* * If the executing thread was not created with the POSIX API, then this * API do not get to define its exit behavior. */ if ( _Objects_Get_API( executing->Object.id ) == OBJECTS_POSIX_API ) 8009360: 34 02 00 03 mvi r2,3 8009364: 44 22 00 05 be r1,r2,8009378 <_POSIX_Threads_Exitted_extension+0x38> pthread_exit( executing->Wait.return_argument ); } 8009368: 2b 9d 00 04 lw ra,(sp+4) 800936c: 2b 8b 00 08 lw r11,(sp+8) 8009370: 37 9c 00 08 addi sp,sp,8 8009374: c3 a0 00 00 ret /* * If the executing thread was not created with the POSIX API, then this * API do not get to define its exit behavior. */ if ( _Objects_Get_API( executing->Object.id ) == OBJECTS_POSIX_API ) pthread_exit( executing->Wait.return_argument ); 8009378: 29 61 00 28 lw r1,(r11+40) 800937c: f8 00 0c ec calli 800c72c } 8009380: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 8009384: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED 8009388: 37 9c 00 08 addi sp,sp,8 <== NOT EXECUTED 800938c: c3 a0 00 00 ret <== NOT EXECUTED =============================================================================== 0800380c <_POSIX_Threads_Initialize_user_threads_body>: * * Output parameters: NONE */ void _POSIX_Threads_Initialize_user_threads_body(void) { 800380c: 37 9c ff a8 addi sp,sp,-88 8003810: 5b 8b 00 14 sw (sp+20),r11 8003814: 5b 8c 00 10 sw (sp+16),r12 8003818: 5b 8d 00 0c sw (sp+12),r13 800381c: 5b 8e 00 08 sw (sp+8),r14 8003820: 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; 8003824: 78 01 08 02 mvhi r1,0x802 8003828: 38 21 00 a8 ori r1,r1,0xa8 maximum = Configuration_POSIX_API.number_of_initialization_threads; 800382c: 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; 8003830: 28 2c 00 34 lw r12,(r1+52) maximum = Configuration_POSIX_API.number_of_initialization_threads; if ( !user_threads || maximum == 0 ) 8003834: 65 c2 00 00 cmpei r2,r14,0 8003838: 65 81 00 00 cmpei r1,r12,0 800383c: b8 41 08 00 or r1,r2,r1 8003840: 5c 20 00 15 bne r1,r0,8003894 <_POSIX_Threads_Initialize_user_threads_body+0x88><== NEVER TAKEN 8003844: 34 0d 00 00 mvi r13,0 8003848: 37 8b 00 18 addi r11,sp,24 for ( index=0 ; index < maximum ; index++ ) { /* * There is no way for these calls to fail in this situation. */ (void) pthread_attr_init( &attr ); 800384c: b9 60 08 00 mv r1,r11 8003850: f8 00 1b e2 calli 800a7d8 (void) pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED ); 8003854: 34 02 00 02 mvi r2,2 8003858: b9 60 08 00 mv r1,r11 800385c: f8 00 1c 16 calli 800a8b4 (void) pthread_attr_setstacksize(&attr, user_threads[ index ].stack_size); 8003860: 29 82 00 04 lw r2,(r12+4) 8003864: b9 60 08 00 mv r1,r11 8003868: f8 00 1c 1f calli 800a8e4 status = pthread_create( 800386c: 29 83 00 00 lw r3,(r12+0) 8003870: 37 81 00 58 addi r1,sp,88 8003874: b9 60 10 00 mv r2,r11 8003878: 34 04 00 00 mvi r4,0 800387c: fb ff fe db calli 80033e8 8003880: b8 20 18 00 mv r3,r1 &thread_id, &attr, user_threads[ index ].thread_entry, NULL ); if ( status ) 8003884: 5c 20 00 0b bne r1,r0,80038b0 <_POSIX_Threads_Initialize_user_threads_body+0xa4><== NEVER TAKEN * * Setting the attributes explicitly is critical, since we don't want * to inherit the idle tasks attributes. */ for ( index=0 ; index < maximum ; index++ ) { 8003888: 35 ad 00 01 addi r13,r13,1 800388c: 35 8c 00 08 addi r12,r12,8 8003890: 55 cd ff ef bgu r14,r13,800384c <_POSIX_Threads_Initialize_user_threads_body+0x40><== NEVER TAKEN NULL ); if ( status ) _Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status ); } } 8003894: 2b 9d 00 04 lw ra,(sp+4) 8003898: 2b 8b 00 14 lw r11,(sp+20) 800389c: 2b 8c 00 10 lw r12,(sp+16) 80038a0: 2b 8d 00 0c lw r13,(sp+12) 80038a4: 2b 8e 00 08 lw r14,(sp+8) 80038a8: 37 9c 00 58 addi sp,sp,88 80038ac: c3 a0 00 00 ret &attr, user_threads[ index ].thread_entry, NULL ); if ( status ) _Internal_error_Occurred( INTERNAL_ERROR_POSIX_API, true, status ); 80038b0: 34 01 00 02 mvi r1,2 <== NOT EXECUTED 80038b4: 34 02 00 01 mvi r2,1 <== NOT EXECUTED 80038b8: f8 00 07 5e calli 8005630 <_Internal_error_Occurred> <== NOT EXECUTED =============================================================================== 08009588 <_POSIX_Threads_Sporadic_budget_TSR>: */ void _POSIX_Threads_Sporadic_budget_TSR( Objects_Id id __attribute__((unused)), void *argument ) { 8009588: 37 9c ff f4 addi sp,sp,-12 800958c: 5b 8b 00 0c sw (sp+12),r11 8009590: 5b 8c 00 08 sw (sp+8),r12 8009594: 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 ]; 8009598: 28 4c 01 20 lw r12,(r2+288) */ void _POSIX_Threads_Sporadic_budget_TSR( Objects_Id id __attribute__((unused)), void *argument ) { 800959c: 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 ); 80095a0: 35 81 00 98 addi r1,r12,152 80095a4: f8 00 05 5a calli 800ab0c <_Timespec_To_ticks> RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core( int priority ) { return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1); 80095a8: 78 03 08 01 mvhi r3,0x801 80095ac: 38 63 40 c0 ori r3,r3,0x40c0 80095b0: 29 84 00 88 lw r4,(r12+136) 80095b4: 40 62 00 00 lbu r2,(r3+0) */ #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 ) { 80095b8: 29 63 00 1c lw r3,(r11+28) 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 ); the_thread->cpu_time_budget = ticks; 80095bc: 59 61 00 78 sw (r11+120),r1 80095c0: c8 44 10 00 sub r2,r2,r4 new_priority = _POSIX_Priority_To_core( api->schedparam.sched_priority ); the_thread->real_priority = new_priority; 80095c4: 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 ) { 80095c8: 5c 60 00 06 bne r3,r0,80095e0 <_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 ) { 80095cc: 29 61 00 14 lw r1,(r11+20) 80095d0: 50 41 00 04 bgeu r2,r1,80095e0 <_POSIX_Threads_Sporadic_budget_TSR+0x58> _Thread_Change_priority( the_thread, new_priority, true ); 80095d4: b9 60 08 00 mv r1,r11 80095d8: 34 03 00 01 mvi r3,1 80095dc: fb ff ef 5c calli 800534c <_Thread_Change_priority> #endif } } /* ticks is guaranteed to be at least one */ ticks = _Timespec_To_ticks( &api->schedparam.sched_ss_repl_period ); 80095e0: 35 81 00 90 addi r1,r12,144 80095e4: f8 00 05 4a calli 800ab0c <_Timespec_To_ticks> Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 80095e8: 59 81 00 b4 sw (r12+180),r1 _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 80095ec: 78 01 08 01 mvhi r1,0x801 80095f0: 35 82 00 a8 addi r2,r12,168 80095f4: 38 21 49 c8 ori r1,r1,0x49c8 80095f8: fb ff f5 5c calli 8006b68 <_Watchdog_Insert> _Watchdog_Insert_ticks( &api->Sporadic_timer, ticks ); } 80095fc: 2b 9d 00 04 lw ra,(sp+4) 8009600: 2b 8b 00 0c lw r11,(sp+12) 8009604: 2b 8c 00 08 lw r12,(sp+8) 8009608: 37 9c 00 0c addi sp,sp,12 800960c: c3 a0 00 00 ret =============================================================================== 08009610 <_POSIX_Threads_Sporadic_budget_callout>: * _POSIX_Threads_Sporadic_budget_callout */ void _POSIX_Threads_Sporadic_budget_callout( Thread_Control *the_thread ) { 8009610: 37 9c ff fc addi sp,sp,-4 8009614: 5b 9d 00 04 sw (sp+4),ra POSIX_API_Control *api; uint32_t new_priority; api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 8009618: 28 22 01 20 lw r2,(r1+288) 800961c: 78 04 08 01 mvhi r4,0x801 8009620: 38 84 40 c0 ori r4,r4,0x40c0 8009624: 28 42 00 8c lw r2,(r2+140) 8009628: 40 84 00 00 lbu r4,(r4+0) */ #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 ) { 800962c: 28 25 00 1c lw r5,(r1+28) 8009630: c8 82 10 00 sub r2,r4,r2 /* * 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 */ 8009634: 34 04 ff ff mvi r4,-1 8009638: 58 24 00 78 sw (r1+120),r4 new_priority = _POSIX_Priority_To_core(api->schedparam.sched_ss_low_priority); the_thread->real_priority = new_priority; 800963c: 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 ) { 8009640: 5c a0 00 05 bne r5,r0,8009654 <_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 ) { 8009644: 28 23 00 14 lw r3,(r1+20) 8009648: 50 62 00 03 bgeu r3,r2,8009654 <_POSIX_Threads_Sporadic_budget_callout+0x44><== NEVER TAKEN _Thread_Change_priority( the_thread, new_priority, true ); 800964c: 34 03 00 01 mvi r3,1 8009650: fb ff ef 3f calli 800534c <_Thread_Change_priority> #if 0 printk( "lower priority\n" ); #endif } } } 8009654: 2b 9d 00 04 lw ra,(sp+4) 8009658: 37 9c 00 04 addi sp,sp,4 800965c: c3 a0 00 00 ret =============================================================================== 0800c208 <_POSIX_Threads_cancel_run>: #include void _POSIX_Threads_cancel_run( Thread_Control *the_thread ) { 800c208: 37 9c ff ec addi sp,sp,-20 800c20c: 5b 8b 00 14 sw (sp+20),r11 800c210: 5b 8c 00 10 sw (sp+16),r12 800c214: 5b 8d 00 0c sw (sp+12),r13 800c218: 5b 8e 00 08 sw (sp+8),r14 800c21c: 5b 9d 00 04 sw (sp+4),ra POSIX_Cancel_Handler_control *handler; Chain_Control *handler_stack; POSIX_API_Control *thread_support; ISR_Level level; thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ]; 800c220: 28 2c 01 20 lw r12,(r1+288) handler_stack = &thread_support->Cancellation_Handlers; thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE; 800c224: 34 01 00 01 mvi r1,1 while ( !_Chain_Is_empty( handler_stack ) ) { 800c228: 29 82 00 e4 lw r2,(r12+228) thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ]; handler_stack = &thread_support->Cancellation_Handlers; thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE; 800c22c: 59 81 00 d8 sw (r12+216),r1 RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); 800c230: 35 8d 00 e8 addi r13,r12,232 while ( !_Chain_Is_empty( handler_stack ) ) { 800c234: 44 4d 00 12 be r2,r13,800c27c <_POSIX_Threads_cancel_run+0x74> _ISR_Disable( level ); 800c238: 34 0e ff fe mvi r14,-2 800c23c: 90 00 08 00 rcsr r1,IE 800c240: a0 2e 10 00 and r2,r1,r14 800c244: d0 02 00 00 wcsr IE,r2 handler = (POSIX_Cancel_Handler_control *) 800c248: 29 8b 00 ec lw r11,(r12+236) ) { Chain_Node *next; Chain_Node *previous; next = the_node->next; 800c24c: 29 63 00 00 lw r3,(r11+0) previous = the_node->previous; 800c250: 29 62 00 04 lw r2,(r11+4) next->previous = previous; 800c254: 58 62 00 04 sw (r3+4),r2 previous->next = next; 800c258: 58 43 00 00 sw (r2+0),r3 _Chain_Tail( handler_stack )->previous; _Chain_Extract_unprotected( &handler->Node ); _ISR_Enable( level ); 800c25c: d0 01 00 00 wcsr IE,r1 (*handler->routine)( handler->arg ); 800c260: 29 62 00 08 lw r2,(r11+8) 800c264: 29 61 00 0c lw r1,(r11+12) 800c268: d8 40 00 00 call r2 _Workspace_Free( handler ); 800c26c: b9 60 08 00 mv r1,r11 800c270: fb ff eb 43 calli 8006f7c <_Workspace_Free> handler_stack = &thread_support->Cancellation_Handlers; thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE; while ( !_Chain_Is_empty( handler_stack ) ) { 800c274: 29 81 00 e4 lw r1,(r12+228) 800c278: 5c 2d ff f1 bne r1,r13,800c23c <_POSIX_Threads_cancel_run+0x34><== NEVER TAKEN (*handler->routine)( handler->arg ); _Workspace_Free( handler ); } } 800c27c: 2b 9d 00 04 lw ra,(sp+4) 800c280: 2b 8b 00 14 lw r11,(sp+20) 800c284: 2b 8c 00 10 lw r12,(sp+16) 800c288: 2b 8d 00 0c lw r13,(sp+12) 800c28c: 2b 8e 00 08 lw r14,(sp+8) 800c290: 37 9c 00 14 addi sp,sp,20 800c294: c3 a0 00 00 ret =============================================================================== 080034cc <_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) { 80034cc: 37 9c ff f8 addi sp,sp,-8 80034d0: 5b 8b 00 08 sw (sp+8),r11 80034d4: 5b 9d 00 04 sw (sp+4),ra 80034d8: b8 40 58 00 mv r11,r2 bool activated; ptimer = (POSIX_Timer_Control *)data; /* Increment the number of expirations. */ ptimer->overrun = ptimer->overrun + 1; 80034dc: 28 42 00 68 lw r2,(r2+104) /* The timer must be reprogrammed */ if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) || 80034e0: 29 61 00 54 lw r1,(r11+84) bool activated; ptimer = (POSIX_Timer_Control *)data; /* Increment the number of expirations. */ ptimer->overrun = ptimer->overrun + 1; 80034e4: 34 42 00 01 addi r2,r2,1 80034e8: 59 62 00 68 sw (r11+104),r2 /* The timer must be reprogrammed */ if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) || 80034ec: 5c 20 00 0d bne r1,r0,8003520 <_POSIX_Timer_TSR+0x54> 80034f0: 29 62 00 58 lw r2,(r11+88) 80034f4: 5c 41 00 0b bne r2,r1,8003520 <_POSIX_Timer_TSR+0x54> <== ALWAYS TAKEN /* The state really did not change but just to be safe */ ptimer->state = POSIX_TIMER_STATE_CREATE_RUN; } else { /* Indicates that the timer is stopped */ ptimer->state = POSIX_TIMER_STATE_CREATE_STOP; 80034f8: 34 01 00 04 mvi r1,4 <== NOT EXECUTED 80034fc: 31 61 00 3c sb (r11+60),r1 <== NOT EXECUTED /* * The sending of the signal to the process running the handling function * specified for that signal is simulated */ if ( pthread_kill ( ptimer->thread_id, ptimer->inf.sigev_signo ) ) { 8003500: 29 61 00 38 lw r1,(r11+56) 8003504: 29 62 00 44 lw r2,(r11+68) 8003508: f8 00 19 ed calli 8009cbc } /* After the signal handler returns, the count of expirations of the * timer must be set to 0. */ ptimer->overrun = 0; 800350c: 59 60 00 68 sw (r11+104),r0 } 8003510: 2b 9d 00 04 lw ra,(sp+4) 8003514: 2b 8b 00 08 lw r11,(sp+8) 8003518: 37 9c 00 08 addi sp,sp,8 800351c: c3 a0 00 00 ret ptimer->overrun = ptimer->overrun + 1; /* The timer must be reprogrammed */ if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) || ( ptimer->timer_data.it_interval.tv_nsec != 0 ) ) { activated = _POSIX_Timer_Insert_helper( 8003520: 29 62 00 64 lw r2,(r11+100) 8003524: 29 63 00 08 lw r3,(r11+8) 8003528: 78 04 08 00 mvhi r4,0x800 800352c: 35 61 00 10 addi r1,r11,16 8003530: 38 84 34 cc ori r4,r4,0x34cc 8003534: b9 60 28 00 mv r5,r11 8003538: f8 00 1b 42 calli 800a240 <_POSIX_Timer_Insert_helper> ptimer->ticks, ptimer->Object.id, _POSIX_Timer_TSR, ptimer ); if ( !activated ) 800353c: 44 20 ff f5 be r1,r0,8003510 <_POSIX_Timer_TSR+0x44> <== NEVER TAKEN return; /* Store the time when the timer was started again */ _TOD_Get( &ptimer->time ); 8003540: 35 61 00 6c addi r1,r11,108 8003544: f8 00 04 af calli 8004800 <_TOD_Get> /* The state really did not change but just to be safe */ ptimer->state = POSIX_TIMER_STATE_CREATE_RUN; 8003548: 34 01 00 03 mvi r1,3 800354c: 31 61 00 3c sb (r11+60),r1 8003550: e3 ff ff ec bi 8003500 <_POSIX_Timer_TSR+0x34> =============================================================================== 0800c370 <_POSIX_signals_Check_signal>: bool _POSIX_signals_Check_signal( POSIX_API_Control *api, int signo, bool is_global ) { 800c370: 37 9c ff a0 addi sp,sp,-96 800c374: 5b 8b 00 2c sw (sp+44),r11 800c378: 5b 8c 00 28 sw (sp+40),r12 800c37c: 5b 8d 00 24 sw (sp+36),r13 800c380: 5b 8e 00 20 sw (sp+32),r14 800c384: 5b 8f 00 1c sw (sp+28),r15 800c388: 5b 90 00 18 sw (sp+24),r16 800c38c: 5b 91 00 14 sw (sp+20),r17 800c390: 5b 92 00 10 sw (sp+16),r18 800c394: 5b 93 00 0c sw (sp+12),r19 800c398: 5b 94 00 08 sw (sp+8),r20 800c39c: 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, 800c3a0: 37 8e 00 58 addi r14,sp,88 bool _POSIX_signals_Check_signal( POSIX_API_Control *api, int signo, bool is_global ) { 800c3a4: 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, 800c3a8: 34 05 00 01 mvi r5,1 800c3ac: b9 c0 18 00 mv r3,r14 bool _POSIX_signals_Check_signal( POSIX_API_Control *api, int signo, bool is_global ) { 800c3b0: b8 20 68 00 mv r13,r1 800c3b4: 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, 800c3b8: f8 00 00 57 calli 800c514 <_POSIX_signals_Clear_signals> is_global, true ) ) return false; 800c3bc: 34 06 00 00 mvi r6,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, 800c3c0: 44 20 00 42 be r1,r0,800c4c8 <_POSIX_signals_Check_signal+0x158> #endif /* * Just to prevent sending a signal which is currently being ignored. */ if ( _POSIX_signals_Vectors[ signo ].sa_handler == SIG_IGN ) 800c3c4: b5 6b 20 00 add r4,r11,r11 800c3c8: b4 8b 20 00 add r4,r4,r11 800c3cc: 78 05 08 01 mvhi r5,0x801 800c3d0: b4 84 20 00 add r4,r4,r4 800c3d4: 38 a5 4e 00 ori r5,r5,0x4e00 800c3d8: b4 84 20 00 add r4,r4,r4 800c3dc: b4 a4 28 00 add r5,r5,r4 800c3e0: 28 a7 00 08 lw r7,(r5+8) 800c3e4: 34 01 00 01 mvi r1,1 800c3e8: 44 e1 00 38 be r7,r1,800c4c8 <_POSIX_signals_Check_signal+0x158><== NEVER TAKEN /* * 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, 800c3ec: 78 0c 08 01 mvhi r12,0x801 800c3f0: 39 8c 4d b4 ori r12,r12,0x4db4 800c3f4: 29 84 00 0c lw r4,(r12+12) return false; /* * Block the signals requested in sa_mask */ saved_signals_blocked = api->signals_blocked; 800c3f8: 29 af 00 d0 lw r15,(r13+208) api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask; 800c3fc: 28 a1 00 04 lw r1,(r5+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, 800c400: 28 94 00 20 lw r20,(r4+32) 800c404: 28 93 00 24 lw r19,(r4+36) 800c408: 28 92 00 28 lw r18,(r4+40) 800c40c: 28 91 00 2c lw r17,(r4+44) 800c410: 28 90 00 30 lw r16,(r4+48) 800c414: 28 8a 00 34 lw r10,(r4+52) 800c418: 28 89 00 38 lw r9,(r4+56) 800c41c: 28 88 00 3c lw r8,(r4+60) 800c420: 28 86 00 40 lw r6,(r4+64) 800c424: 28 83 00 44 lw r3,(r4+68) sizeof( Thread_Wait_information )); /* * Here, the signal handler function executes */ switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) { 800c428: 28 a2 00 00 lw r2,(r5+0) /* * Block the signals requested in sa_mask */ saved_signals_blocked = api->signals_blocked; api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask; 800c42c: b8 2f 08 00 or r1,r1,r15 800c430: 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, 800c434: 5b 94 00 30 sw (sp+48),r20 800c438: 5b 93 00 34 sw (sp+52),r19 800c43c: 5b 92 00 38 sw (sp+56),r18 800c440: 5b 91 00 3c sw (sp+60),r17 800c444: 5b 90 00 40 sw (sp+64),r16 800c448: 5b 8a 00 44 sw (sp+68),r10 800c44c: 5b 89 00 48 sw (sp+72),r9 800c450: 5b 88 00 4c sw (sp+76),r8 800c454: 5b 86 00 50 sw (sp+80),r6 800c458: 5b 83 00 54 sw (sp+84),r3 sizeof( Thread_Wait_information )); /* * Here, the signal handler function executes */ switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) { 800c45c: 34 01 00 02 mvi r1,2 800c460: 44 41 00 28 be r2,r1,800c500 <_POSIX_signals_Check_signal+0x190> &siginfo_struct, NULL /* context is undefined per 1003.1b-1993, p. 66 */ ); break; default: (*_POSIX_signals_Vectors[ signo ].sa_handler)( signo ); 800c464: b9 60 08 00 mv r1,r11 800c468: d8 e0 00 00 call r7 } /* * Restore the blocking information */ memcpy( &_Thread_Executing->Wait, &stored_thread_wait_information, 800c46c: 2b 81 00 30 lw r1,(sp+48) 800c470: 29 82 00 0c lw r2,(r12+12) /* * Restore the previous set of blocked signals */ api->signals_blocked = saved_signals_blocked; return true; 800c474: 34 06 00 01 mvi r6,1 } /* * Restore the blocking information */ memcpy( &_Thread_Executing->Wait, &stored_thread_wait_information, 800c478: 58 41 00 20 sw (r2+32),r1 800c47c: 2b 81 00 34 lw r1,(sp+52) 800c480: 58 41 00 24 sw (r2+36),r1 800c484: 2b 81 00 38 lw r1,(sp+56) 800c488: 58 41 00 28 sw (r2+40),r1 800c48c: 2b 81 00 3c lw r1,(sp+60) 800c490: 58 41 00 2c sw (r2+44),r1 800c494: 2b 81 00 40 lw r1,(sp+64) 800c498: 58 41 00 30 sw (r2+48),r1 800c49c: 2b 81 00 44 lw r1,(sp+68) 800c4a0: 58 41 00 34 sw (r2+52),r1 800c4a4: 2b 81 00 48 lw r1,(sp+72) 800c4a8: 58 41 00 38 sw (r2+56),r1 800c4ac: 2b 81 00 4c lw r1,(sp+76) 800c4b0: 58 41 00 3c sw (r2+60),r1 800c4b4: 2b 81 00 50 lw r1,(sp+80) 800c4b8: 58 41 00 40 sw (r2+64),r1 800c4bc: 2b 81 00 54 lw r1,(sp+84) 800c4c0: 58 41 00 44 sw (r2+68),r1 sizeof( Thread_Wait_information )); /* * Restore the previous set of blocked signals */ api->signals_blocked = saved_signals_blocked; 800c4c4: 59 af 00 d0 sw (r13+208),r15 return true; } 800c4c8: b8 c0 08 00 mv r1,r6 800c4cc: 2b 9d 00 04 lw ra,(sp+4) 800c4d0: 2b 8b 00 2c lw r11,(sp+44) 800c4d4: 2b 8c 00 28 lw r12,(sp+40) 800c4d8: 2b 8d 00 24 lw r13,(sp+36) 800c4dc: 2b 8e 00 20 lw r14,(sp+32) 800c4e0: 2b 8f 00 1c lw r15,(sp+28) 800c4e4: 2b 90 00 18 lw r16,(sp+24) 800c4e8: 2b 91 00 14 lw r17,(sp+20) 800c4ec: 2b 92 00 10 lw r18,(sp+16) 800c4f0: 2b 93 00 0c lw r19,(sp+12) 800c4f4: 2b 94 00 08 lw r20,(sp+8) 800c4f8: 37 9c 00 60 addi sp,sp,96 800c4fc: c3 a0 00 00 ret /* * Here, the signal handler function executes */ switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) { case SA_SIGINFO: (*_POSIX_signals_Vectors[ signo ].sa_sigaction)( 800c500: b9 60 08 00 mv r1,r11 800c504: b9 c0 10 00 mv r2,r14 800c508: 34 03 00 00 mvi r3,0 800c50c: d8 e0 00 00 call r7 signo, &siginfo_struct, NULL /* context is undefined per 1003.1b-1993, p. 66 */ ); break; 800c510: e3 ff ff d7 bi 800c46c <_POSIX_signals_Check_signal+0xfc> =============================================================================== 0800ccec <_POSIX_signals_Clear_process_signals>: */ void _POSIX_signals_Clear_process_signals( int signo ) { 800ccec: 37 9c ff f4 addi sp,sp,-12 800ccf0: 5b 8b 00 0c sw (sp+12),r11 800ccf4: 5b 8c 00 08 sw (sp+8),r12 800ccf8: 5b 9d 00 04 sw (sp+4),ra 800ccfc: b8 20 10 00 mv r2,r1 clear_signal = true; mask = signo_to_mask( signo ); ISR_Level level; _ISR_Disable( level ); 800cd00: 90 00 60 00 rcsr r12,IE 800cd04: 34 01 ff fe mvi r1,-2 800cd08: a1 81 08 00 and r1,r12,r1 800cd0c: d0 01 00 00 wcsr IE,r1 if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) { 800cd10: b4 42 20 00 add r4,r2,r2 800cd14: b4 82 20 00 add r4,r4,r2 800cd18: 78 01 08 01 mvhi r1,0x801 800cd1c: b4 84 18 00 add r3,r4,r4 800cd20: 38 21 4e 00 ori r1,r1,0x4e00 800cd24: b4 63 18 00 add r3,r3,r3 800cd28: b4 23 18 00 add r3,r1,r3 800cd2c: 28 63 00 00 lw r3,(r3+0) 800cd30: 34 01 00 02 mvi r1,2 800cd34: 44 61 00 10 be r3,r1,800cd74 <_POSIX_signals_Clear_process_signals+0x88> 800cd38: 34 42 ff ff addi r2,r2,-1 if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) ) clear_signal = false; } if ( clear_signal ) { _POSIX_signals_Pending &= ~mask; 800cd3c: 78 0b 08 01 mvhi r11,0x801 800cd40: 34 01 00 01 mvi r1,1 800cd44: f8 00 15 12 calli 801218c <__ashlsi3> 800cd48: 39 6b 4f f4 ori r11,r11,0x4ff4 800cd4c: 29 62 00 00 lw r2,(r11+0) 800cd50: a4 20 08 00 not r1,r1 800cd54: a0 22 08 00 and r1,r1,r2 800cd58: 59 61 00 00 sw (r11+0),r1 } _ISR_Enable( level ); 800cd5c: d0 0c 00 00 wcsr IE,r12 } 800cd60: 2b 9d 00 04 lw ra,(sp+4) 800cd64: 2b 8b 00 0c lw r11,(sp+12) 800cd68: 2b 8c 00 08 lw r12,(sp+8) 800cd6c: 37 9c 00 0c addi sp,sp,12 800cd70: c3 a0 00 00 ret 800cd74: 78 01 08 01 mvhi r1,0x801 800cd78: b4 84 20 00 add r4,r4,r4 800cd7c: 38 21 4f f8 ori r1,r1,0x4ff8 800cd80: b4 84 20 00 add r4,r4,r4 800cd84: b4 24 20 00 add r4,r1,r4 ISR_Level level; _ISR_Disable( level ); if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) { if ( !_Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) ) 800cd88: 28 81 00 00 lw r1,(r4+0) RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); 800cd8c: 34 84 00 04 addi r4,r4,4 800cd90: 44 24 ff ea be r1,r4,800cd38 <_POSIX_signals_Clear_process_signals+0x4c><== ALWAYS TAKEN clear_signal = false; } if ( clear_signal ) { _POSIX_signals_Pending &= ~mask; } _ISR_Enable( level ); 800cd94: d0 0c 00 00 wcsr IE,r12 <== NOT EXECUTED } 800cd98: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 800cd9c: 2b 8b 00 0c lw r11,(sp+12) <== NOT EXECUTED 800cda0: 2b 8c 00 08 lw r12,(sp+8) <== NOT EXECUTED 800cda4: 37 9c 00 0c addi sp,sp,12 <== NOT EXECUTED 800cda8: c3 a0 00 00 ret <== NOT EXECUTED =============================================================================== 0800419c <_POSIX_signals_Get_lowest>: #include int _POSIX_signals_Get_lowest( sigset_t set ) { 800419c: 37 9c ff f0 addi sp,sp,-16 80041a0: 5b 8b 00 10 sw (sp+16),r11 80041a4: 5b 8c 00 0c sw (sp+12),r12 80041a8: 5b 8d 00 08 sw (sp+8),r13 80041ac: 5b 9d 00 04 sw (sp+4),ra int signo; for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { 80041b0: 34 0b 00 1b mvi r11,27 #include int _POSIX_signals_Get_lowest( sigset_t set ) { 80041b4: b8 20 60 00 mv r12,r1 int signo; for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { 80041b8: 34 0d 00 20 mvi r13,32 80041bc: 35 62 ff ff addi r2,r11,-1 80041c0: 34 01 00 01 mvi r1,1 80041c4: f8 00 68 8b calli 801e3f0 <__ashlsi3> if ( set & signo_to_mask( signo ) ) { 80041c8: a0 2c 08 00 and r1,r1,r12 80041cc: 5c 20 00 0d bne r1,r0,8004200 <_POSIX_signals_Get_lowest+0x64><== NEVER TAKEN sigset_t set ) { int signo; for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { 80041d0: 35 6b 00 01 addi r11,r11,1 80041d4: 5d 6d ff fa bne r11,r13,80041bc <_POSIX_signals_Get_lowest+0x20> 80041d8: 34 0b 00 01 mvi r11,1 */ #if (SIGHUP != 1) #error "Assumption that SIGHUP==1 violated!!" #endif for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) { 80041dc: 34 0d 00 1b mvi r13,27 80041e0: e0 00 00 03 bi 80041ec <_POSIX_signals_Get_lowest+0x50> 80041e4: 35 6b 00 01 addi r11,r11,1 80041e8: 45 6d 00 06 be r11,r13,8004200 <_POSIX_signals_Get_lowest+0x64><== NEVER TAKEN 80041ec: 35 62 ff ff addi r2,r11,-1 80041f0: 34 01 00 01 mvi r1,1 80041f4: f8 00 68 7f calli 801e3f0 <__ashlsi3> if ( set & signo_to_mask( signo ) ) { 80041f8: a0 2c 10 00 and r2,r1,r12 80041fc: 44 40 ff fa be r2,r0,80041e4 <_POSIX_signals_Get_lowest+0x48> * a return 0. This routine will NOT be called unless a signal * is pending in the set passed in. */ found_it: return signo; } 8004200: b9 60 08 00 mv r1,r11 8004204: 2b 9d 00 04 lw ra,(sp+4) 8004208: 2b 8b 00 10 lw r11,(sp+16) 800420c: 2b 8c 00 0c lw r12,(sp+12) 8004210: 2b 8d 00 08 lw r13,(sp+8) 8004214: 37 9c 00 10 addi sp,sp,16 8004218: c3 a0 00 00 ret =============================================================================== 08026dd4 <_POSIX_signals_Unblock_thread>: bool _POSIX_signals_Unblock_thread( Thread_Control *the_thread, int signo, siginfo_t *info ) { 8026dd4: 37 9c ff ec addi sp,sp,-20 8026dd8: 5b 8b 00 14 sw (sp+20),r11 8026ddc: 5b 8c 00 10 sw (sp+16),r12 8026de0: 5b 8d 00 0c sw (sp+12),r13 8026de4: 5b 8e 00 08 sw (sp+8),r14 8026de8: 5b 9d 00 04 sw (sp+4),ra 8026dec: b8 20 58 00 mv r11,r1 8026df0: b8 40 70 00 mv r14,r2 8026df4: 34 01 00 01 mvi r1,1 8026df8: 34 42 ff ff addi r2,r2,-1 8026dfc: b8 60 68 00 mv r13,r3 8026e00: fb ff 6c da calli 8002168 <__ashlsi3> /* * Is the thread is specifically waiting for a signal? */ if ( _States_Is_interruptible_signal( the_thread->current_state ) ) { 8026e04: 78 02 08 02 mvhi r2,0x802 8026e08: 38 42 86 60 ori r2,r2,0x8660 8026e0c: 29 64 00 10 lw r4,(r11+16) 8026e10: 28 43 00 00 lw r3,(r2+0) { POSIX_API_Control *api; sigset_t mask; siginfo_t *the_info = NULL; api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 8026e14: 29 65 01 20 lw r5,(r11+288) /* * Is the thread is specifically waiting for a signal? */ if ( _States_Is_interruptible_signal( the_thread->current_state ) ) { 8026e18: a0 83 10 00 and r2,r4,r3 8026e1c: 44 43 00 21 be r2,r3,8026ea0 <_POSIX_signals_Unblock_thread+0xcc> } /* * Thread is not waiting due to a sigwait. */ if ( ~api->signals_blocked & mask ) { 8026e20: 28 a2 00 d0 lw r2,(r5+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; 8026e24: 34 0c 00 00 mvi r12,0 } /* * Thread is not waiting due to a sigwait. */ if ( ~api->signals_blocked & mask ) { 8026e28: a4 40 10 00 not r2,r2 8026e2c: a0 22 08 00 and r1,r1,r2 8026e30: 44 20 00 14 be r1,r0,8026e80 <_POSIX_signals_Unblock_thread+0xac> 8026e34: 78 01 10 00 mvhi r1,0x1000 8026e38: 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 ) ) { 8026e3c: 44 20 00 31 be r1,r0,8026f00 <_POSIX_signals_Unblock_thread+0x12c> */ RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue ( States_Control the_states ) { return (the_states & STATES_WAITING_ON_THREAD_QUEUE); 8026e40: 78 03 08 02 mvhi r3,0x802 the_thread->Wait.return_code = EINTR; 8026e44: 34 01 00 04 mvi r1,4 8026e48: 38 63 84 08 ori r3,r3,0x8408 8026e4c: 59 61 00 34 sw (r11+52),r1 8026e50: 28 61 00 00 lw r1,(r3+0) 8026e54: 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) ) 8026e58: 5c 20 00 3a bne r1,r0,8026f40 <_POSIX_signals_Unblock_thread+0x16c> */ RTEMS_INLINE_ROUTINE bool _States_Is_delaying ( States_Control the_states ) { return (the_states & STATES_DELAYING); 8026e5c: 20 84 00 08 andi r4,r4,0x8 _Thread_queue_Extract_with_proxy( the_thread ); else if ( _States_Is_delaying(the_thread->current_state) ) { 8026e60: 44 8c 00 08 be r4,r12,8026e80 <_POSIX_signals_Unblock_thread+0xac><== NEVER TAKEN (void) _Watchdog_Remove( &the_thread->Timer ); 8026e64: 35 61 00 48 addi r1,r11,72 8026e68: fb ff 9c 14 calli 800deb8 <_Watchdog_Remove> RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); 8026e6c: 78 03 08 02 mvhi r3,0x802 8026e70: 38 63 82 6c ori r3,r3,0x826c 8026e74: 28 62 00 00 lw r2,(r3+0) 8026e78: b9 60 08 00 mv r1,r11 8026e7c: fb ff 95 d9 calli 800c5e0 <_Thread_Clear_state> if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) ) _Thread_Dispatch_necessary = true; } } return false; } 8026e80: b9 80 08 00 mv r1,r12 8026e84: 2b 9d 00 04 lw ra,(sp+4) 8026e88: 2b 8b 00 14 lw r11,(sp+20) 8026e8c: 2b 8c 00 10 lw r12,(sp+16) 8026e90: 2b 8d 00 0c lw r13,(sp+12) 8026e94: 2b 8e 00 08 lw r14,(sp+8) 8026e98: 37 9c 00 14 addi sp,sp,20 8026e9c: c3 a0 00 00 ret * Is the thread is specifically waiting for a signal? */ if ( _States_Is_interruptible_signal( the_thread->current_state ) ) { if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) { 8026ea0: 29 62 00 30 lw r2,(r11+48) 8026ea4: a0 22 10 00 and r2,r1,r2 8026ea8: 44 40 00 20 be r2,r0,8026f28 <_POSIX_signals_Unblock_thread+0x154> the_thread->Wait.return_code = EINTR; 8026eac: 34 01 00 04 mvi r1,4 8026eb0: 59 61 00 34 sw (r11+52),r1 the_info = (siginfo_t *) the_thread->Wait.return_argument; 8026eb4: 29 61 00 28 lw r1,(r11+40) if ( !info ) { 8026eb8: 45 a0 00 25 be r13,r0,8026f4c <_POSIX_signals_Unblock_thread+0x178> the_info->si_signo = signo; the_info->si_code = SI_USER; the_info->si_value.sival_int = 0; } else { *the_info = *info; 8026ebc: 29 a2 00 00 lw r2,(r13+0) 8026ec0: 58 22 00 00 sw (r1+0),r2 8026ec4: 29 a2 00 04 lw r2,(r13+4) 8026ec8: 58 22 00 04 sw (r1+4),r2 8026ecc: 29 a2 00 08 lw r2,(r13+8) 8026ed0: 58 22 00 08 sw (r1+8),r2 } _Thread_queue_Extract_with_proxy( the_thread ); 8026ed4: b9 60 08 00 mv r1,r11 8026ed8: fb ff 99 0a calli 800d300 <_Thread_queue_Extract_with_proxy> return true; 8026edc: 34 0c 00 01 mvi r12,1 if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) ) _Thread_Dispatch_necessary = true; } } return false; } 8026ee0: b9 80 08 00 mv r1,r12 8026ee4: 2b 9d 00 04 lw ra,(sp+4) 8026ee8: 2b 8b 00 14 lw r11,(sp+20) 8026eec: 2b 8c 00 10 lw r12,(sp+16) 8026ef0: 2b 8d 00 0c lw r13,(sp+12) 8026ef4: 2b 8e 00 08 lw r14,(sp+8) 8026ef8: 37 9c 00 14 addi sp,sp,20 8026efc: c3 a0 00 00 ret else if ( _States_Is_delaying(the_thread->current_state) ) { (void) _Watchdog_Remove( &the_thread->Timer ); _Thread_Unblock( the_thread ); } } else if ( the_thread->current_state == STATES_READY ) { 8026f00: 5c 8c ff e0 bne r4,r12,8026e80 <_POSIX_signals_Unblock_thread+0xac><== NEVER TAKEN if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) ) 8026f04: 78 01 08 02 mvhi r1,0x802 8026f08: 38 21 af 1c ori r1,r1,0xaf1c 8026f0c: 28 22 00 08 lw r2,(r1+8) 8026f10: 44 4c ff dc be r2,r12,8026e80 <_POSIX_signals_Unblock_thread+0xac> 8026f14: 28 22 00 0c lw r2,(r1+12) 8026f18: 5d 62 ff da bne r11,r2,8026e80 <_POSIX_signals_Unblock_thread+0xac><== NEVER TAKEN _Thread_Dispatch_necessary = true; 8026f1c: 34 02 00 01 mvi r2,1 8026f20: 30 22 00 18 sb (r1+24),r2 8026f24: e3 ff ff d7 bi 8026e80 <_POSIX_signals_Unblock_thread+0xac> * 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) ) { 8026f28: 28 a2 00 d0 lw r2,(r5+208) /* * This should only be reached via pthread_kill(). */ return false; 8026f2c: 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) ) { 8026f30: a4 40 10 00 not r2,r2 8026f34: a0 22 08 00 and r1,r1,r2 8026f38: 5c 2c ff dd bne r1,r12,8026eac <_POSIX_signals_Unblock_thread+0xd8> 8026f3c: e3 ff ff d1 bi 8026e80 <_POSIX_signals_Unblock_thread+0xac> /* * In pthread_cond_wait, a thread will be blocking on a thread * queue, but is also interruptible by a POSIX signal. */ if ( _States_Is_waiting_on_thread_queue(the_thread->current_state) ) _Thread_queue_Extract_with_proxy( the_thread ); 8026f40: b9 60 08 00 mv r1,r11 8026f44: fb ff 98 ef calli 800d300 <_Thread_queue_Extract_with_proxy> 8026f48: e3 ff ff ce bi 8026e80 <_POSIX_signals_Unblock_thread+0xac> the_info = (siginfo_t *) the_thread->Wait.return_argument; if ( !info ) { the_info->si_signo = signo; the_info->si_code = SI_USER; 8026f4c: 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; 8026f50: 58 2e 00 00 sw (r1+0),r14 the_info->si_code = SI_USER; 8026f54: 58 22 00 04 sw (r1+4),r2 the_info->si_value.sival_int = 0; 8026f58: 58 20 00 08 sw (r1+8),r0 8026f5c: e3 ff ff de bi 8026ed4 <_POSIX_signals_Unblock_thread+0x100> =============================================================================== 08003194 <_RTEMS_tasks_Initialize_user_tasks_body>: * * Output parameters: NONE */ void _RTEMS_tasks_Initialize_user_tasks_body( void ) { 8003194: 37 9c ff e8 addi sp,sp,-24 8003198: 5b 8b 00 14 sw (sp+20),r11 800319c: 5b 8c 00 10 sw (sp+16),r12 80031a0: 5b 8d 00 0c sw (sp+12),r13 80031a4: 5b 8e 00 08 sw (sp+8),r14 80031a8: 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; 80031ac: 78 01 08 01 mvhi r1,0x801 80031b0: 38 21 40 8c ori r1,r1,0x408c 80031b4: 28 2b 00 2c lw r11,(r1+44) maximum = Configuration_RTEMS_API.number_of_initialization_tasks; 80031b8: 28 2e 00 28 lw r14,(r1+40) /* * Verify that we have a set of user tasks to iterate */ if ( !user_tasks ) 80031bc: 45 60 00 15 be r11,r0,8003210 <_RTEMS_tasks_Initialize_user_tasks_body+0x7c> return; /* * Now iterate over the initialization tasks and create/start them. */ for ( index=0 ; index < maximum ; index++ ) { 80031c0: 45 c0 00 14 be r14,r0,8003210 <_RTEMS_tasks_Initialize_user_tasks_body+0x7c><== NEVER TAKEN 80031c4: 34 0c 00 00 mvi r12,0 return_value = rtems_task_create( 80031c8: 29 61 00 00 lw r1,(r11+0) 80031cc: 29 62 00 08 lw r2,(r11+8) 80031d0: 29 63 00 04 lw r3,(r11+4) 80031d4: 29 64 00 14 lw r4,(r11+20) 80031d8: 29 65 00 0c lw r5,(r11+12) 80031dc: 37 86 00 18 addi r6,sp,24 80031e0: fb ff ff 52 calli 8002f28 80031e4: b8 20 68 00 mv r13,r1 user_tasks[ index ].stack_size, user_tasks[ index ].mode_set, user_tasks[ index ].attribute_set, &id ); if ( !rtems_is_status_successful( return_value ) ) 80031e8: 5c 20 00 11 bne r1,r0,800322c <_RTEMS_tasks_Initialize_user_tasks_body+0x98><== NEVER TAKEN _Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value ); return_value = rtems_task_start( 80031ec: 29 63 00 18 lw r3,(r11+24) 80031f0: 2b 81 00 18 lw r1,(sp+24) 80031f4: 29 62 00 10 lw r2,(r11+16) 80031f8: f8 00 00 14 calli 8003248 80031fc: b8 20 18 00 mv r3,r1 id, user_tasks[ index ].entry_point, user_tasks[ index ].argument ); if ( !rtems_is_status_successful( return_value ) ) 8003200: 5c 2d 00 0f bne r1,r13,800323c <_RTEMS_tasks_Initialize_user_tasks_body+0xa8><== NEVER TAKEN return; /* * Now iterate over the initialization tasks and create/start them. */ for ( index=0 ; index < maximum ; index++ ) { 8003204: 35 8c 00 01 addi r12,r12,1 8003208: 35 6b 00 1c addi r11,r11,28 800320c: 55 cc ff ef bgu r14,r12,80031c8 <_RTEMS_tasks_Initialize_user_tasks_body+0x34><== NEVER TAKEN user_tasks[ index ].argument ); if ( !rtems_is_status_successful( return_value ) ) _Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value ); } } 8003210: 2b 9d 00 04 lw ra,(sp+4) 8003214: 2b 8b 00 14 lw r11,(sp+20) 8003218: 2b 8c 00 10 lw r12,(sp+16) 800321c: 2b 8d 00 0c lw r13,(sp+12) 8003220: 2b 8e 00 08 lw r14,(sp+8) 8003224: 37 9c 00 18 addi sp,sp,24 8003228: c3 a0 00 00 ret user_tasks[ index ].mode_set, user_tasks[ index ].attribute_set, &id ); if ( !rtems_is_status_successful( return_value ) ) _Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value ); 800322c: 34 01 00 01 mvi r1,1 <== NOT EXECUTED 8003230: 34 02 00 01 mvi r2,1 <== NOT EXECUTED 8003234: b9 a0 18 00 mv r3,r13 <== NOT EXECUTED 8003238: f8 00 04 72 calli 8004400 <_Internal_error_Occurred> <== NOT EXECUTED id, user_tasks[ index ].entry_point, user_tasks[ index ].argument ); if ( !rtems_is_status_successful( return_value ) ) _Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, true, return_value ); 800323c: 34 01 00 01 mvi r1,1 <== NOT EXECUTED 8003240: 34 02 00 01 mvi r2,1 <== NOT EXECUTED 8003244: f8 00 04 6f calli 8004400 <_Internal_error_Occurred> <== NOT EXECUTED =============================================================================== 08009a74 <_RTEMS_tasks_Switch_extension>: /* * Per Task Variables */ tvp = executing->task_variables; 8009a74: 28 21 01 28 lw r1,(r1+296) while (tvp) { 8009a78: 44 20 00 08 be r1,r0,8009a98 <_RTEMS_tasks_Switch_extension+0x24> tvp->tval = *tvp->ptr; 8009a7c: 28 23 00 04 lw r3,(r1+4) *tvp->ptr = tvp->gval; 8009a80: 28 24 00 08 lw r4,(r1+8) * Per Task Variables */ tvp = executing->task_variables; while (tvp) { tvp->tval = *tvp->ptr; 8009a84: 28 65 00 00 lw r5,(r3+0) 8009a88: 58 25 00 0c sw (r1+12),r5 *tvp->ptr = tvp->gval; tvp = (rtems_task_variable_t *)tvp->next; 8009a8c: 28 21 00 00 lw r1,(r1+0) */ tvp = executing->task_variables; while (tvp) { tvp->tval = *tvp->ptr; *tvp->ptr = tvp->gval; 8009a90: 58 64 00 00 sw (r3+0),r4 /* * Per Task Variables */ tvp = executing->task_variables; while (tvp) { 8009a94: 5c 20 ff fa bne r1,r0,8009a7c <_RTEMS_tasks_Switch_extension+0x8><== NEVER TAKEN tvp->tval = *tvp->ptr; *tvp->ptr = tvp->gval; tvp = (rtems_task_variable_t *)tvp->next; } tvp = heir->task_variables; 8009a98: 28 41 01 28 lw r1,(r2+296) while (tvp) { 8009a9c: 44 20 00 08 be r1,r0,8009abc <_RTEMS_tasks_Switch_extension+0x48> tvp->gval = *tvp->ptr; 8009aa0: 28 22 00 04 lw r2,(r1+4) *tvp->ptr = tvp->tval; 8009aa4: 28 23 00 0c lw r3,(r1+12) tvp = (rtems_task_variable_t *)tvp->next; } tvp = heir->task_variables; while (tvp) { tvp->gval = *tvp->ptr; 8009aa8: 28 44 00 00 lw r4,(r2+0) 8009aac: 58 24 00 08 sw (r1+8),r4 *tvp->ptr = tvp->tval; tvp = (rtems_task_variable_t *)tvp->next; 8009ab0: 28 21 00 00 lw r1,(r1+0) } tvp = heir->task_variables; while (tvp) { tvp->gval = *tvp->ptr; *tvp->ptr = tvp->tval; 8009ab4: 58 43 00 00 sw (r2+0),r3 *tvp->ptr = tvp->gval; tvp = (rtems_task_variable_t *)tvp->next; } tvp = heir->task_variables; while (tvp) { 8009ab8: 5c 20 ff fa bne r1,r0,8009aa0 <_RTEMS_tasks_Switch_extension+0x2c><== NEVER TAKEN 8009abc: c3 a0 00 00 ret =============================================================================== 0800487c <_Rate_monotonic_Timeout>: void _Rate_monotonic_Timeout( Objects_Id id, void *ignored ) { 800487c: 37 9c ff f4 addi sp,sp,-12 8004880: 5b 8b 00 08 sw (sp+8),r11 8004884: 5b 9d 00 04 sw (sp+4),ra 8004888: b8 20 10 00 mv r2,r1 800488c: 78 01 08 02 mvhi r1,0x802 8004890: 38 21 18 d0 ori r1,r1,0x18d0 8004894: 37 83 00 0c addi r3,sp,12 8004898: f8 00 09 2d calli 8006d4c <_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 ) { 800489c: 2b 82 00 0c lw r2,(sp+12) 80048a0: b8 20 58 00 mv r11,r1 80048a4: 44 40 00 05 be r2,r0,80048b8 <_Rate_monotonic_Timeout+0x3c><== ALWAYS TAKEN case OBJECTS_REMOTE: /* impossible */ #endif case OBJECTS_ERROR: break; } } 80048a8: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 80048ac: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED 80048b0: 37 9c 00 0c addi sp,sp,12 <== NOT EXECUTED 80048b4: c3 a0 00 00 ret <== NOT EXECUTED */ the_period = _Rate_monotonic_Get( id, &location ); switch ( location ) { case OBJECTS_LOCAL: the_thread = the_period->owner; 80048b8: 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); 80048bc: 28 23 00 10 lw r3,(r1+16) 80048c0: 20 63 40 00 andi r3,r3,0x4000 if ( _States_Is_waiting_for_period( the_thread->current_state ) && 80048c4: 44 62 00 04 be r3,r2,80048d4 <_Rate_monotonic_Timeout+0x58> 80048c8: 28 23 00 20 lw r3,(r1+32) 80048cc: 29 62 00 08 lw r2,(r11+8) 80048d0: 44 62 00 1a be r3,r2,8004938 <_Rate_monotonic_Timeout+0xbc> _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 ) { 80048d4: 29 62 00 38 lw r2,(r11+56) 80048d8: 34 01 00 01 mvi r1,1 80048dc: 44 41 00 0c be r2,r1,800490c <_Rate_monotonic_Timeout+0x90> _Rate_monotonic_Initiate_statistics( the_period ); _Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length ); } else the_period->state = RATE_MONOTONIC_EXPIRED; 80048e0: 34 01 00 04 mvi r1,4 80048e4: 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; 80048e8: 78 01 08 02 mvhi r1,0x802 80048ec: 38 21 19 f8 ori r1,r1,0x19f8 80048f0: 28 22 00 00 lw r2,(r1+0) 80048f4: 34 42 ff ff addi r2,r2,-1 80048f8: 58 22 00 00 sw (r1+0),r2 case OBJECTS_REMOTE: /* impossible */ #endif case OBJECTS_ERROR: break; } } 80048fc: 2b 9d 00 04 lw ra,(sp+4) 8004900: 2b 8b 00 08 lw r11,(sp+8) 8004904: 37 9c 00 0c addi sp,sp,12 8004908: c3 a0 00 00 ret _Rate_monotonic_Initiate_statistics( the_period ); _Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length ); } else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) { the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING; 800490c: 34 02 00 03 mvi r2,3 _Rate_monotonic_Initiate_statistics( the_period ); 8004910: b9 60 08 00 mv r1,r11 _Rate_monotonic_Initiate_statistics( the_period ); _Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length ); } else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) { the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING; 8004914: 59 62 00 38 sw (r11+56),r2 _Rate_monotonic_Initiate_statistics( the_period ); 8004918: fb ff fe 00 calli 8004118 <_Rate_monotonic_Initiate_statistics> Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 800491c: 29 62 00 3c lw r2,(r11+60) _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 8004920: 78 01 08 02 mvhi r1,0x802 8004924: 38 21 1a d8 ori r1,r1,0x1ad8 Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 8004928: 59 62 00 1c sw (r11+28),r2 _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 800492c: 35 62 00 10 addi r2,r11,16 8004930: f8 00 11 fa calli 8009118 <_Watchdog_Insert> 8004934: e3 ff ff ed bi 80048e8 <_Rate_monotonic_Timeout+0x6c> RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); 8004938: 78 03 08 01 mvhi r3,0x801 800493c: 38 63 f6 5c ori r3,r3,0xf65c 8004940: 28 62 00 00 lw r2,(r3+0) 8004944: f8 00 0b a1 calli 80077c8 <_Thread_Clear_state> the_thread = the_period->owner; if ( _States_Is_waiting_for_period( the_thread->current_state ) && the_thread->Wait.id == the_period->Object.id ) { _Thread_Unblock( the_thread ); _Rate_monotonic_Initiate_statistics( the_period ); 8004948: b9 60 08 00 mv r1,r11 800494c: e3 ff ff f3 bi 8004918 <_Rate_monotonic_Timeout+0x9c> =============================================================================== 080041c4 <_Rate_monotonic_Update_statistics>: void _Rate_monotonic_Update_statistics( Rate_monotonic_Control *the_period ) { 80041c4: 37 9c ff e0 addi sp,sp,-32 80041c8: 5b 8b 00 10 sw (sp+16),r11 80041cc: 5b 8c 00 0c sw (sp+12),r12 80041d0: 5b 8d 00 08 sw (sp+8),r13 80041d4: 5b 9d 00 04 sw (sp+4),ra 80041d8: b8 20 58 00 mv r11,r1 /* * Update the counts. */ stats = &the_period->Statistics; stats->count++; 80041dc: 28 21 00 54 lw r1,(r1+84) if ( the_period->state == RATE_MONOTONIC_EXPIRED ) 80041e0: 29 62 00 38 lw r2,(r11+56) /* * Update the counts. */ stats = &the_period->Statistics; stats->count++; 80041e4: 34 21 00 01 addi r1,r1,1 80041e8: 59 61 00 54 sw (r11+84),r1 if ( the_period->state == RATE_MONOTONIC_EXPIRED ) 80041ec: 34 01 00 04 mvi r1,4 80041f0: 44 41 00 36 be r2,r1,80042c8 <_Rate_monotonic_Update_statistics+0x104> /* * Grab status for time statistics. */ valid_status = _Rate_monotonic_Get_status( the_period, &since_last_period, &executed ); 80041f4: 37 8c 00 14 addi r12,sp,20 80041f8: 37 8d 00 1c addi r13,sp,28 stats->missed_count++; /* * Grab status for time statistics. */ valid_status = 80041fc: b9 60 08 00 mv r1,r11 8004200: b9 80 10 00 mv r2,r12 8004204: b9 a0 18 00 mv r3,r13 8004208: fb ff ff 8a calli 8004030 <_Rate_monotonic_Get_status> _Rate_monotonic_Get_status( the_period, &since_last_period, &executed ); if (!valid_status) 800420c: 5c 20 00 07 bne r1,r0,8004228 <_Rate_monotonic_Update_statistics+0x64><== ALWAYS TAKEN stats->min_wall_time = since_last_period; if ( since_last_period > stats->max_wall_time ) stats->max_wall_time = since_last_period; #endif } 8004210: 2b 9d 00 04 lw ra,(sp+4) 8004214: 2b 8b 00 10 lw r11,(sp+16) 8004218: 2b 8c 00 0c lw r12,(sp+12) 800421c: 2b 8d 00 08 lw r13,(sp+8) 8004220: 37 9c 00 20 addi sp,sp,32 8004224: c3 a0 00 00 ret /* * Update CPU time */ #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ _Timestamp_Add_to( &stats->total_cpu_time, &executed ); 8004228: b9 a0 10 00 mv r2,r13 800422c: 35 61 00 6c addi r1,r11,108 8004230: f8 00 11 bc calli 8008920 <_Timespec_Add_to> if ( _Timestamp_Less_than( &executed, &stats->min_cpu_time ) ) 8004234: b9 a0 08 00 mv r1,r13 8004238: 35 62 00 5c addi r2,r11,92 800423c: f8 00 12 a5 calli 8008cd0 <_Timespec_Less_than> 8004240: 44 20 00 05 be r1,r0,8004254 <_Rate_monotonic_Update_statistics+0x90> stats->min_cpu_time = executed; 8004244: 2b 81 00 1c lw r1,(sp+28) 8004248: 59 61 00 5c sw (r11+92),r1 800424c: 2b 81 00 20 lw r1,(sp+32) 8004250: 59 61 00 60 sw (r11+96),r1 if ( _Timestamp_Greater_than( &executed, &stats->max_cpu_time ) ) 8004254: b9 a0 08 00 mv r1,r13 8004258: 35 62 00 64 addi r2,r11,100 800425c: f8 00 12 92 calli 8008ca4 <_Timespec_Greater_than> 8004260: 44 20 00 05 be r1,r0,8004274 <_Rate_monotonic_Update_statistics+0xb0> stats->max_cpu_time = executed; 8004264: 2b 81 00 1c lw r1,(sp+28) 8004268: 59 61 00 64 sw (r11+100),r1 800426c: 2b 81 00 20 lw r1,(sp+32) 8004270: 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 ); 8004274: b9 80 10 00 mv r2,r12 8004278: 35 61 00 84 addi r1,r11,132 800427c: f8 00 11 a9 calli 8008920 <_Timespec_Add_to> if ( _Timestamp_Less_than( &since_last_period, &stats->min_wall_time ) ) 8004280: b9 80 08 00 mv r1,r12 8004284: 35 62 00 74 addi r2,r11,116 8004288: f8 00 12 92 calli 8008cd0 <_Timespec_Less_than> 800428c: 5c 20 00 13 bne r1,r0,80042d8 <_Rate_monotonic_Update_statistics+0x114> stats->min_wall_time = since_last_period; if ( _Timestamp_Greater_than( &since_last_period, &stats->max_wall_time ) ) 8004290: b9 80 08 00 mv r1,r12 8004294: 35 62 00 7c addi r2,r11,124 8004298: f8 00 12 83 calli 8008ca4 <_Timespec_Greater_than> 800429c: 44 20 ff dd be r1,r0,8004210 <_Rate_monotonic_Update_statistics+0x4c> stats->max_wall_time = since_last_period; 80042a0: 2b 81 00 14 lw r1,(sp+20) 80042a4: 59 61 00 7c sw (r11+124),r1 80042a8: 2b 81 00 18 lw r1,(sp+24) 80042ac: 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 } 80042b0: 2b 9d 00 04 lw ra,(sp+4) 80042b4: 2b 8b 00 10 lw r11,(sp+16) 80042b8: 2b 8c 00 0c lw r12,(sp+12) 80042bc: 2b 8d 00 08 lw r13,(sp+8) 80042c0: 37 9c 00 20 addi sp,sp,32 80042c4: c3 a0 00 00 ret */ stats = &the_period->Statistics; stats->count++; if ( the_period->state == RATE_MONOTONIC_EXPIRED ) stats->missed_count++; 80042c8: 29 61 00 58 lw r1,(r11+88) 80042cc: 34 21 00 01 addi r1,r1,1 80042d0: 59 61 00 58 sw (r11+88),r1 80042d4: e3 ff ff c8 bi 80041f4 <_Rate_monotonic_Update_statistics+0x30> */ #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ _Timestamp_Add_to( &stats->total_wall_time, &since_last_period ); if ( _Timestamp_Less_than( &since_last_period, &stats->min_wall_time ) ) stats->min_wall_time = since_last_period; 80042d8: 2b 81 00 14 lw r1,(sp+20) 80042dc: 59 61 00 74 sw (r11+116),r1 80042e0: 2b 81 00 18 lw r1,(sp+24) 80042e4: 59 61 00 78 sw (r11+120),r1 80042e8: e3 ff ff ea bi 8004290 <_Rate_monotonic_Update_statistics+0xcc> =============================================================================== 0800a504 <_Scheduler_priority_Block>: RTEMS_INLINE_ROUTINE void _Scheduler_priority_Ready_queue_extract( Thread_Control *the_thread ) { Chain_Control *ready = the_thread->scheduler.priority->ready_chain; 800a504: 28 43 00 8c lw r3,(r2+140) 800a508: 28 63 00 00 lw r3,(r3+0) if ( _Chain_Has_only_one_node( ready ) ) { 800a50c: 28 65 00 00 lw r5,(r3+0) 800a510: 28 64 00 08 lw r4,(r3+8) 800a514: 44 a4 00 35 be r5,r4,800a5e8 <_Scheduler_priority_Block+0xe4> ) { Chain_Node *next; Chain_Node *previous; next = the_node->next; 800a518: 28 44 00 00 lw r4,(r2+0) previous = the_node->previous; 800a51c: 28 43 00 04 lw r3,(r2+4) next->previous = previous; 800a520: 58 83 00 04 sw (r4+4),r3 previous->next = next; 800a524: 58 64 00 00 sw (r3+0),r4 RTEMS_INLINE_ROUTINE bool _Thread_Is_heir ( const Thread_Control *the_thread ) { return ( the_thread == _Thread_Heir ); 800a528: 78 03 08 01 mvhi r3,0x801 800a52c: 38 63 4d b4 ori r3,r3,0x4db4 { _Scheduler_priority_Ready_queue_extract(the_thread); /* TODO: flash critical section */ if ( _Thread_Is_heir( the_thread ) ) 800a530: 28 64 00 10 lw r4,(r3+16) 800a534: 44 44 00 07 be r2,r4,800a550 <_Scheduler_priority_Block+0x4c> _Scheduler_priority_Schedule_body(the_scheduler); if ( _Thread_Is_executing( the_thread ) ) 800a538: 28 61 00 0c lw r1,(r3+12) 800a53c: 44 41 00 02 be r2,r1,800a544 <_Scheduler_priority_Block+0x40> 800a540: c3 a0 00 00 ret _Thread_Dispatch_necessary = true; 800a544: 34 01 00 01 mvi r1,1 800a548: 30 61 00 18 sb (r3+24),r1 800a54c: c3 a0 00 00 ret 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 ); 800a550: 78 04 08 01 mvhi r4,0x801 800a554: 38 84 4d d0 ori r4,r4,0x4dd0 800a558: 2c 84 00 00 lhu r4,(r4+0) Scheduler_Control *the_scheduler, Thread_Control *the_thread ) { _Scheduler_priority_Block_body(the_scheduler, the_thread); } 800a55c: 28 27 00 00 lw r7,(r1+0) 800a560: 34 01 00 ff mvi r1,255 800a564: 20 84 ff ff andi r4,r4,0xffff 800a568: 54 81 00 3d bgu r4,r1,800a65c <_Scheduler_priority_Block+0x158> 800a56c: 78 05 08 01 mvhi r5,0x801 800a570: 38 a5 35 b0 ori r5,r5,0x35b0 800a574: b4 a4 20 00 add r4,r5,r4 800a578: 40 84 00 00 lbu r4,(r4+0) 800a57c: 34 84 00 08 addi r4,r4,8 _Bitfield_Find_first_bit( _Priority_Bit_map[major], minor ); 800a580: 78 06 08 01 mvhi r6,0x801 800a584: 38 c6 4d d8 ori r6,r6,0x4dd8 800a588: b4 84 20 00 add r4,r4,r4 800a58c: b4 c4 30 00 add r6,r6,r4 800a590: 2c c1 00 00 lhu r1,(r6+0) 800a594: 34 06 00 ff mvi r6,255 800a598: 54 26 00 26 bgu r1,r6,800a630 <_Scheduler_priority_Block+0x12c> 800a59c: b4 a1 08 00 add r1,r5,r1 800a5a0: 40 25 00 00 lbu r5,(r1+0) 800a5a4: 34 a5 00 08 addi r5,r5,8 return (_Priority_Bits_index( major ) << 4) + 800a5a8: b4 84 08 00 add r1,r4,r4 800a5ac: b4 21 08 00 add r1,r1,r1 800a5b0: b4 21 08 00 add r1,r1,r1 800a5b4: b4 a1 08 00 add r1,r5,r1 Chain_Control *the_ready_queue ) { Priority_Control index = _Priority_bit_map_Get_highest(); if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) ) 800a5b8: b4 21 20 00 add r4,r1,r1 800a5bc: b4 81 08 00 add r1,r4,r1 800a5c0: b4 21 08 00 add r1,r1,r1 800a5c4: b4 21 08 00 add r1,r1,r1 800a5c8: b4 e1 08 00 add r1,r7,r1 800a5cc: 28 25 00 00 lw r5,(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 ); 800a5d0: 34 21 00 04 addi r1,r1,4 return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] ); return NULL; 800a5d4: 34 04 00 00 mvi r4,0 Chain_Control *the_ready_queue ) { Priority_Control index = _Priority_bit_map_Get_highest(); if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) ) 800a5d8: 44 a1 00 02 be r5,r1,800a5e0 <_Scheduler_priority_Block+0xdc><== NEVER TAKEN return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] ); 800a5dc: b8 a0 20 00 mv r4,r5 RTEMS_INLINE_ROUTINE void _Scheduler_priority_Schedule_body( Scheduler_Control *the_scheduler ) { _Thread_Heir = _Scheduler_priority_Ready_queue_first( 800a5e0: 58 64 00 10 sw (r3+16),r4 800a5e4: e3 ff ff d5 bi 800a538 <_Scheduler_priority_Block+0x34> 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 ); 800a5e8: 34 64 00 04 addi r4,r3,4 head->next = tail; head->previous = NULL; 800a5ec: 58 60 00 04 sw (r3+4),r0 ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; 800a5f0: 58 64 00 00 sw (r3+0),r4 head->previous = NULL; tail->previous = head; 800a5f4: 58 63 00 08 sw (r3+8),r3 { Chain_Control *ready = the_thread->scheduler.priority->ready_chain; if ( _Chain_Has_only_one_node( ready ) ) { _Chain_Initialize_empty( ready ); _Priority_bit_map_Remove( &the_thread->scheduler.priority->Priority_map ); 800a5f8: 28 43 00 8c lw r3,(r2+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; 800a5fc: 28 65 00 04 lw r5,(r3+4) 800a600: 2c 66 00 0e lhu r6,(r3+14) 800a604: 2c a4 00 00 lhu r4,(r5+0) 800a608: a0 86 20 00 and r4,r4,r6 800a60c: 0c a4 00 00 sh (r5+0),r4 if ( *the_priority_map->minor == 0 ) 800a610: 5c 80 ff c6 bne r4,r0,800a528 <_Scheduler_priority_Block+0x24> _Priority_Major_bit_map &= the_priority_map->block_major; 800a614: 78 04 08 01 mvhi r4,0x801 800a618: 38 84 4d d0 ori r4,r4,0x4dd0 800a61c: 2c 85 00 00 lhu r5,(r4+0) 800a620: 2c 63 00 0c lhu r3,(r3+12) 800a624: a0 65 18 00 and r3,r3,r5 800a628: 0c 83 00 00 sh (r4+0),r3 800a62c: e3 ff ff bf bi 800a528 <_Scheduler_priority_Block+0x24> { Priority_bit_map_Control minor; Priority_bit_map_Control major; _Bitfield_Find_first_bit( _Priority_Major_bit_map, major ); _Bitfield_Find_first_bit( _Priority_Bit_map[major], minor ); 800a630: 00 21 00 01 srui r1,r1,1 800a634: 00 21 00 01 srui r1,r1,1 800a638: 00 21 00 01 srui r1,r1,1 800a63c: 00 21 00 01 srui r1,r1,1 800a640: 00 21 00 01 srui r1,r1,1 800a644: 00 21 00 01 srui r1,r1,1 800a648: 00 21 00 01 srui r1,r1,1 800a64c: 00 21 00 01 srui r1,r1,1 800a650: b4 a1 08 00 add r1,r5,r1 800a654: 40 25 00 00 lbu r5,(r1+0) 800a658: e3 ff ff d4 bi 800a5a8 <_Scheduler_priority_Block+0xa4> 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 ); 800a65c: 00 84 00 01 srui r4,r4,1 800a660: 78 05 08 01 mvhi r5,0x801 800a664: 00 84 00 01 srui r4,r4,1 800a668: 38 a5 35 b0 ori r5,r5,0x35b0 800a66c: 00 84 00 01 srui r4,r4,1 800a670: 00 84 00 01 srui r4,r4,1 800a674: 00 84 00 01 srui r4,r4,1 800a678: 00 84 00 01 srui r4,r4,1 800a67c: 00 84 00 01 srui r4,r4,1 800a680: 00 84 00 01 srui r4,r4,1 800a684: b4 a4 20 00 add r4,r5,r4 800a688: 40 84 00 00 lbu r4,(r4+0) 800a68c: e3 ff ff bd bi 800a580 <_Scheduler_priority_Block+0x7c> =============================================================================== 0800503c <_Scheduler_priority_Schedule>: RTEMS_INLINE_ROUTINE Priority_Control _Priority_bit_map_Get_highest( void ) { Priority_bit_map_Control minor; Priority_bit_map_Control major; _Bitfield_Find_first_bit( _Priority_Major_bit_map, major ); 800503c: 78 02 08 01 mvhi r2,0x801 8005040: 38 42 4d d0 ori r2,r2,0x4dd0 8005044: 2c 42 00 00 lhu r2,(r2+0) void _Scheduler_priority_Schedule( Scheduler_Control *the_scheduler ) { _Scheduler_priority_Schedule_body( the_scheduler ); } 8005048: 28 25 00 00 lw r5,(r1+0) 800504c: 34 01 00 ff mvi r1,255 8005050: 20 42 ff ff andi r2,r2,0xffff 8005054: 54 41 00 2d bgu r2,r1,8005108 <_Scheduler_priority_Schedule+0xcc> 8005058: 78 03 08 01 mvhi r3,0x801 800505c: 38 63 35 b0 ori r3,r3,0x35b0 8005060: b4 62 10 00 add r2,r3,r2 8005064: 40 42 00 00 lbu r2,(r2+0) 8005068: 34 42 00 08 addi r2,r2,8 _Bitfield_Find_first_bit( _Priority_Bit_map[major], minor ); 800506c: 78 04 08 01 mvhi r4,0x801 8005070: 38 84 4d d8 ori r4,r4,0x4dd8 8005074: b4 42 10 00 add r2,r2,r2 8005078: b4 82 20 00 add r4,r4,r2 800507c: 2c 81 00 00 lhu r1,(r4+0) 8005080: 34 04 00 ff mvi r4,255 8005084: 54 24 00 16 bgu r1,r4,80050dc <_Scheduler_priority_Schedule+0xa0> 8005088: b4 61 08 00 add r1,r3,r1 800508c: 40 23 00 00 lbu r3,(r1+0) 8005090: 34 63 00 08 addi r3,r3,8 return (_Priority_Bits_index( major ) << 4) + 8005094: b4 42 08 00 add r1,r2,r2 8005098: b4 21 08 00 add r1,r1,r1 800509c: b4 21 08 00 add r1,r1,r1 80050a0: b4 61 08 00 add r1,r3,r1 Chain_Control *the_ready_queue ) { Priority_Control index = _Priority_bit_map_Get_highest(); if ( !_Chain_Is_empty( &the_ready_queue[ index ] ) ) 80050a4: b4 21 10 00 add r2,r1,r1 80050a8: b4 41 08 00 add r1,r2,r1 80050ac: b4 21 08 00 add r1,r1,r1 80050b0: b4 21 08 00 add r1,r1,r1 80050b4: b4 a1 08 00 add r1,r5,r1 80050b8: 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 ); 80050bc: 34 21 00 04 addi r1,r1,4 return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] ); return NULL; 80050c0: 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 ] ) ) 80050c4: 44 61 00 02 be r3,r1,80050cc <_Scheduler_priority_Schedule+0x90><== NEVER TAKEN return (Thread_Control *) _Chain_First( &the_ready_queue[ index ] ); 80050c8: 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( 80050cc: 78 01 08 01 mvhi r1,0x801 80050d0: 38 21 4d b4 ori r1,r1,0x4db4 80050d4: 58 22 00 10 sw (r1+16),r2 80050d8: c3 a0 00 00 ret { Priority_bit_map_Control minor; Priority_bit_map_Control major; _Bitfield_Find_first_bit( _Priority_Major_bit_map, major ); _Bitfield_Find_first_bit( _Priority_Bit_map[major], minor ); 80050dc: 00 21 00 01 srui r1,r1,1 80050e0: 00 21 00 01 srui r1,r1,1 80050e4: 00 21 00 01 srui r1,r1,1 80050e8: 00 21 00 01 srui r1,r1,1 80050ec: 00 21 00 01 srui r1,r1,1 80050f0: 00 21 00 01 srui r1,r1,1 80050f4: 00 21 00 01 srui r1,r1,1 80050f8: 00 21 00 01 srui r1,r1,1 80050fc: b4 61 08 00 add r1,r3,r1 8005100: 40 23 00 00 lbu r3,(r1+0) 8005104: e3 ff ff e4 bi 8005094 <_Scheduler_priority_Schedule+0x58> 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 ); 8005108: 00 42 00 01 srui r2,r2,1 800510c: 78 03 08 01 mvhi r3,0x801 8005110: 00 42 00 01 srui r2,r2,1 8005114: 38 63 35 b0 ori r3,r3,0x35b0 8005118: 00 42 00 01 srui r2,r2,1 800511c: 00 42 00 01 srui r2,r2,1 8005120: 00 42 00 01 srui r2,r2,1 8005124: 00 42 00 01 srui r2,r2,1 8005128: 00 42 00 01 srui r2,r2,1 800512c: 00 42 00 01 srui r2,r2,1 8005130: b4 62 10 00 add r2,r3,r2 8005134: 40 42 00 00 lbu r2,(r2+0) 8005138: e3 ff ff cd bi 800506c <_Scheduler_priority_Schedule+0x30> =============================================================================== 08003e44 <_TOD_Tickle_ticks>: * * Output parameters: NONE */ void _TOD_Tickle_ticks( void ) { 8003e44: 37 9c ff ec addi sp,sp,-20 8003e48: 5b 8b 00 0c sw (sp+12),r11 8003e4c: 5b 8c 00 08 sw (sp+8),r12 8003e50: 5b 9d 00 04 sw (sp+4),ra Timestamp_Control tick; uint32_t seconds; /* Convert the tick quantum to a timestamp */ _Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() ); 8003e54: 78 01 08 01 mvhi r1,0x801 8003e58: 38 21 40 c4 ori r1,r1,0x40c4 8003e5c: 28 21 00 0c lw r1,(r1+12) /* Update the counter of ticks since boot */ _Watchdog_Ticks_since_boot += 1; 8003e60: 78 03 08 01 mvhi r3,0x801 8003e64: 38 63 4a 18 ori r3,r3,0x4a18 { Timestamp_Control tick; uint32_t seconds; /* Convert the tick quantum to a timestamp */ _Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() ); 8003e68: b4 21 08 00 add r1,r1,r1 8003e6c: b4 21 08 00 add r1,r1,r1 8003e70: b4 21 08 00 add r1,r1,r1 8003e74: b4 21 10 00 add r2,r1,r1 8003e78: b4 42 10 00 add r2,r2,r2 8003e7c: b4 22 08 00 add r1,r1,r2 8003e80: b4 21 10 00 add r2,r1,r1 8003e84: b4 42 10 00 add r2,r2,r2 8003e88: b4 22 08 00 add r1,r1,r2 /* Update the counter of ticks since boot */ _Watchdog_Ticks_since_boot += 1; 8003e8c: 28 65 00 00 lw r5,(r3+0) { Timestamp_Control tick; uint32_t seconds; /* Convert the tick quantum to a timestamp */ _Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() ); 8003e90: b4 21 20 00 add r4,r1,r1 8003e94: b4 84 20 00 add r4,r4,r4 8003e98: b4 24 20 00 add r4,r1,r4 /* Update the counter of ticks since boot */ _Watchdog_Ticks_since_boot += 1; /* Update the timespec format uptime */ _Timestamp_Add_to( &_TOD_Uptime, &tick ); 8003e9c: 37 8b 00 10 addi r11,sp,16 /* Convert the tick quantum to a timestamp */ _Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() ); /* Update the counter of ticks since boot */ _Watchdog_Ticks_since_boot += 1; 8003ea0: 34 a5 00 01 addi r5,r5,1 /* Update the timespec format uptime */ _Timestamp_Add_to( &_TOD_Uptime, &tick ); 8003ea4: 78 01 08 01 mvhi r1,0x801 8003ea8: b9 60 10 00 mv r2,r11 /* Convert the tick quantum to a timestamp */ _Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() ); /* Update the counter of ticks since boot */ _Watchdog_Ticks_since_boot += 1; 8003eac: 58 65 00 00 sw (r3+0),r5 /* Update the timespec format uptime */ _Timestamp_Add_to( &_TOD_Uptime, &tick ); 8003eb0: 38 21 49 64 ori r1,r1,0x4964 { Timestamp_Control tick; uint32_t seconds; /* Convert the tick quantum to a timestamp */ _Timestamp_Set( &tick, 0, rtems_configuration_get_nanoseconds_per_tick() ); 8003eb4: 5b 84 00 14 sw (sp+20),r4 8003eb8: 5b 80 00 10 sw (sp+16),r0 /* Update the counter of ticks since boot */ _Watchdog_Ticks_since_boot += 1; /* Update the timespec format uptime */ _Timestamp_Add_to( &_TOD_Uptime, &tick ); 8003ebc: f8 00 09 f2 calli 8006684 <_Timespec_Add_to> /* we do not care how much the uptime changed */ /* Update the timespec format TOD */ seconds = _Timestamp_Add_to_at_tick( &_TOD_Now, &tick ); 8003ec0: 78 01 08 01 mvhi r1,0x801 8003ec4: b9 60 10 00 mv r2,r11 8003ec8: 38 21 49 90 ori r1,r1,0x4990 8003ecc: f8 00 09 ee calli 8006684 <_Timespec_Add_to> 8003ed0: b8 20 58 00 mv r11,r1 while ( seconds ) { 8003ed4: 44 20 00 07 be r1,r0,8003ef0 <_TOD_Tickle_ticks+0xac> 8003ed8: 78 0c 08 01 mvhi r12,0x801 8003edc: 39 8c 49 bc ori r12,r12,0x49bc _Watchdog_Tickle_seconds(); seconds--; 8003ee0: 35 6b ff ff addi r11,r11,-1 */ RTEMS_INLINE_ROUTINE void _Watchdog_Tickle_seconds( void ) { _Watchdog_Tickle( &_Watchdog_Seconds_chain ); 8003ee4: b9 80 08 00 mv r1,r12 8003ee8: f8 00 0b c0 calli 8006de8 <_Watchdog_Tickle> _Timestamp_Add_to( &_TOD_Uptime, &tick ); /* we do not care how much the uptime changed */ /* Update the timespec format TOD */ seconds = _Timestamp_Add_to_at_tick( &_TOD_Now, &tick ); while ( seconds ) { 8003eec: 5d 60 ff fd bne r11,r0,8003ee0 <_TOD_Tickle_ticks+0x9c> <== NEVER TAKEN _Watchdog_Tickle_seconds(); seconds--; } } 8003ef0: 2b 9d 00 04 lw ra,(sp+4) 8003ef4: 2b 8b 00 0c lw r11,(sp+12) 8003ef8: 2b 8c 00 08 lw r12,(sp+8) 8003efc: 37 9c 00 14 addi sp,sp,20 8003f00: c3 a0 00 00 ret =============================================================================== 08004458 <_TOD_Validate>: */ bool _TOD_Validate( const rtems_time_of_day *the_tod ) { 8004458: 37 9c ff f4 addi sp,sp,-12 800445c: 5b 8b 00 0c sw (sp+12),r11 8004460: 5b 8c 00 08 sw (sp+8),r12 8004464: 5b 9d 00 04 sw (sp+4),ra uint32_t days_in_month; uint32_t ticks_per_second; ticks_per_second = TOD_MICROSECONDS_PER_SECOND / rtems_configuration_get_microseconds_per_tick(); 8004468: 78 02 08 02 mvhi r2,0x802 800446c: 38 42 20 c4 ori r2,r2,0x20c4 */ bool _TOD_Validate( const rtems_time_of_day *the_tod ) { 8004470: 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(); 8004474: 28 42 00 0c lw r2,(r2+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; 8004478: 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) || 800447c: 44 20 00 22 be r1,r0,8004504 <_TOD_Validate+0xac> <== NEVER TAKEN ) { uint32_t days_in_month; uint32_t ticks_per_second; ticks_per_second = TOD_MICROSECONDS_PER_SECOND / 8004480: 78 03 08 01 mvhi r3,0x801 8004484: 38 63 f7 50 ori r3,r3,0xf750 8004488: 28 61 00 00 lw r1,(r3+0) 800448c: f8 00 66 f1 calli 801e050 <__udivsi3> rtems_configuration_get_microseconds_per_tick(); if ((!the_tod) || 8004490: 29 62 00 18 lw r2,(r11+24) 8004494: 50 41 00 1c bgeu r2,r1,8004504 <_TOD_Validate+0xac> (the_tod->ticks >= ticks_per_second) || 8004498: 29 62 00 14 lw r2,(r11+20) 800449c: 34 01 00 3b mvi r1,59 80044a0: 54 41 00 19 bgu r2,r1,8004504 <_TOD_Validate+0xac> (the_tod->second >= TOD_SECONDS_PER_MINUTE) || 80044a4: 29 62 00 10 lw r2,(r11+16) 80044a8: 54 41 00 17 bgu r2,r1,8004504 <_TOD_Validate+0xac> (the_tod->minute >= TOD_MINUTES_PER_HOUR) || 80044ac: 29 62 00 0c lw r2,(r11+12) 80044b0: 34 01 00 17 mvi r1,23 80044b4: 54 41 00 14 bgu r2,r1,8004504 <_TOD_Validate+0xac> (the_tod->hour >= TOD_HOURS_PER_DAY) || (the_tod->month == 0) || 80044b8: 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) || 80044bc: 44 20 00 12 be r1,r0,8004504 <_TOD_Validate+0xac> <== NEVER TAKEN (the_tod->month == 0) || 80044c0: 34 02 00 0c mvi r2,12 80044c4: 54 22 00 10 bgu r1,r2,8004504 <_TOD_Validate+0xac> (the_tod->month > TOD_MONTHS_PER_YEAR) || (the_tod->year < TOD_BASE_YEAR) || 80044c8: 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) || 80044cc: 34 03 07 c3 mvi r3,1987 80044d0: 50 62 00 0d bgeu r3,r2,8004504 <_TOD_Validate+0xac> (the_tod->year < TOD_BASE_YEAR) || (the_tod->day == 0) ) 80044d4: 29 63 00 08 lw r3,(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) || 80044d8: 44 60 00 0b be r3,r0,8004504 <_TOD_Validate+0xac> <== NEVER TAKEN (the_tod->day == 0) ) return false; if ( (the_tod->year % 4) == 0 ) 80044dc: 20 42 00 03 andi r2,r2,0x3 80044e0: 5c 40 00 02 bne r2,r0,80044e8 <_TOD_Validate+0x90> days_in_month = _TOD_Days_per_month[ 1 ][ the_tod->month ]; 80044e4: 34 21 00 0d addi r1,r1,13 else days_in_month = _TOD_Days_per_month[ 0 ][ the_tod->month ]; 80044e8: 78 02 08 02 mvhi r2,0x802 80044ec: b4 21 08 00 add r1,r1,r1 80044f0: 38 42 00 00 ori r2,r2,0x0 80044f4: b4 21 08 00 add r1,r1,r1 80044f8: b4 41 08 00 add r1,r2,r1 80044fc: 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( 8004500: f1 83 60 00 cmpgeu r12,r12,r3 if ( the_tod->day > days_in_month ) return false; return true; } 8004504: b9 80 08 00 mv r1,r12 8004508: 2b 9d 00 04 lw ra,(sp+4) 800450c: 2b 8b 00 0c lw r11,(sp+12) 8004510: 2b 8c 00 08 lw r12,(sp+8) 8004514: 37 9c 00 0c addi sp,sp,12 8004518: c3 a0 00 00 ret =============================================================================== 0800534c <_Thread_Change_priority>: void _Thread_Change_priority( Thread_Control *the_thread, Priority_Control new_priority, bool prepend_it ) { 800534c: 37 9c ff ec addi sp,sp,-20 8005350: 5b 8b 00 14 sw (sp+20),r11 8005354: 5b 8c 00 10 sw (sp+16),r12 8005358: 5b 8d 00 0c sw (sp+12),r13 800535c: 5b 8e 00 08 sw (sp+8),r14 8005360: 5b 9d 00 04 sw (sp+4),ra 8005364: b8 20 58 00 mv r11,r1 */ /* * Save original state */ original_state = the_thread->current_state; 8005368: 28 2d 00 10 lw r13,(r1+16) void _Thread_Change_priority( Thread_Control *the_thread, Priority_Control new_priority, bool prepend_it ) { 800536c: b8 40 60 00 mv r12,r2 8005370: 20 6e 00 ff andi r14,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 ); 8005374: f8 00 04 1b calli 80063e0 <_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 ) 8005378: 29 61 00 14 lw r1,(r11+20) 800537c: 44 2c 00 04 be r1,r12,800538c <_Thread_Change_priority+0x40> _Thread_Set_priority( the_thread, new_priority ); 8005380: b9 60 08 00 mv r1,r11 8005384: b9 80 10 00 mv r2,r12 8005388: f8 00 03 ed calli 800633c <_Thread_Set_priority> _ISR_Disable( level ); 800538c: 90 00 60 00 rcsr r12,IE 8005390: 34 02 ff fe mvi r2,-2 8005394: a1 82 10 00 and r2,r12,r2 8005398: d0 02 00 00 wcsr IE,r2 /* * 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; 800539c: 29 61 00 10 lw r1,(r11+16) if ( state != STATES_TRANSIENT ) { 80053a0: 34 04 00 04 mvi r4,4 80053a4: 44 24 00 23 be r1,r4,8005430 <_Thread_Change_priority+0xe4> */ RTEMS_INLINE_ROUTINE bool _States_Is_transient ( States_Control the_states ) { return (the_states & STATES_TRANSIENT); 80053a8: 21 ad 00 04 andi r13,r13,0x4 /* Only clear the transient state if it wasn't set already */ if ( ! _States_Is_transient( original_state ) ) 80053ac: 45 a0 00 0e be r13,r0,80053e4 <_Thread_Change_priority+0x98><== ALWAYS TAKEN the_thread->current_state = _States_Clear( STATES_TRANSIENT, state ); _ISR_Enable( level ); 80053b0: d0 0c 00 00 wcsr IE,r12 <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE bool _States_Is_waiting_on_thread_queue ( States_Control the_states ) { return (the_states & STATES_WAITING_ON_THREAD_QUEUE); 80053b4: 78 03 08 01 mvhi r3,0x801 <== NOT EXECUTED 80053b8: 38 63 37 18 ori r3,r3,0x3718 <== NOT EXECUTED 80053bc: 28 62 00 00 lw r2,(r3+0) <== NOT EXECUTED 80053c0: a0 22 08 00 and r1,r1,r2 <== NOT EXECUTED if ( _States_Is_waiting_on_thread_queue( state ) ) { 80053c4: 5c 20 00 11 bne r1,r0,8005408 <_Thread_Change_priority+0xbc><== NOT EXECUTED if ( !_Thread_Is_executing_also_the_heir() && _Thread_Executing->is_preemptible ) _Thread_Dispatch_necessary = true; _ISR_Enable( level ); } 80053c8: 2b 9d 00 04 lw ra,(sp+4) 80053cc: 2b 8b 00 14 lw r11,(sp+20) 80053d0: 2b 8c 00 10 lw r12,(sp+16) 80053d4: 2b 8d 00 0c lw r13,(sp+12) 80053d8: 2b 8e 00 08 lw r14,(sp+8) 80053dc: 37 9c 00 14 addi sp,sp,20 80053e0: c3 a0 00 00 ret RTEMS_INLINE_ROUTINE States_Control _States_Clear ( States_Control states_to_clear, States_Control current_state ) { return (current_state & ~states_to_clear); 80053e4: 34 02 ff fb mvi r2,-5 80053e8: a0 22 10 00 and r2,r1,r2 */ state = the_thread->current_state; if ( state != STATES_TRANSIENT ) { /* Only clear the transient state if it wasn't set already */ if ( ! _States_Is_transient( original_state ) ) the_thread->current_state = _States_Clear( STATES_TRANSIENT, state ); 80053ec: 59 62 00 10 sw (r11+16),r2 _ISR_Enable( level ); 80053f0: 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); 80053f4: 78 03 08 01 mvhi r3,0x801 80053f8: 38 63 37 18 ori r3,r3,0x3718 80053fc: 28 62 00 00 lw r2,(r3+0) 8005400: a0 22 08 00 and r1,r1,r2 if ( _States_Is_waiting_on_thread_queue( state ) ) { 8005404: 44 20 ff f1 be r1,r0,80053c8 <_Thread_Change_priority+0x7c> _Thread_queue_Requeue( the_thread->Wait.queue, the_thread ); 8005408: 29 61 00 44 lw r1,(r11+68) 800540c: b9 60 10 00 mv r2,r11 8005410: f8 00 03 8e calli 8006248 <_Thread_queue_Requeue> if ( !_Thread_Is_executing_also_the_heir() && _Thread_Executing->is_preemptible ) _Thread_Dispatch_necessary = true; _ISR_Enable( level ); } 8005414: 2b 9d 00 04 lw ra,(sp+4) 8005418: 2b 8b 00 14 lw r11,(sp+20) 800541c: 2b 8c 00 10 lw r12,(sp+16) 8005420: 2b 8d 00 0c lw r13,(sp+12) 8005424: 2b 8e 00 08 lw r14,(sp+8) 8005428: 37 9c 00 14 addi sp,sp,20 800542c: c3 a0 00 00 ret */ RTEMS_INLINE_ROUTINE bool _States_Is_transient ( States_Control the_states ) { return (the_states & STATES_TRANSIENT); 8005430: 21 ad 00 04 andi r13,r13,0x4 } return; } /* Only clear the transient state if it wasn't set already */ if ( ! _States_Is_transient( original_state ) ) { 8005434: 5d a0 00 16 bne r13,r0,800548c <_Thread_Change_priority+0x140><== NEVER TAKEN * Ready Queue with interrupts off. * * FIXME: hard-coded for priority scheduling. Might be ok since this * function is specific to priority scheduling? */ the_thread->current_state = _States_Clear( STATES_TRANSIENT, state ); 8005438: 59 60 00 10 sw (r11+16),r0 if ( prepend_it ) 800543c: 45 cd 00 2b be r14,r13,80054e8 <_Thread_Change_priority+0x19c> RTEMS_INLINE_ROUTINE void _Scheduler_priority_Ready_queue_enqueue_first( Thread_Control *the_thread ) { _Priority_bit_map_Add( &the_thread->scheduler.priority->Priority_map ); 8005440: 29 61 00 8c lw r1,(r11+140) 8005444: 78 03 08 01 mvhi r3,0x801 8005448: 38 63 4d d0 ori r3,r3,0x4dd0 RTEMS_INLINE_ROUTINE void _Priority_bit_map_Add ( Priority_bit_map_Information *the_priority_map ) { *the_priority_map->minor |= the_priority_map->ready_minor; 800544c: 28 25 00 04 lw r5,(r1+4) 8005450: 2c 26 00 0a lhu r6,(r1+10) _Chain_Prepend_unprotected( the_thread->scheduler.priority->ready_chain, 8005454: 28 24 00 00 lw r4,(r1+0) 8005458: 2c a7 00 00 lhu r7,(r5+0) 800545c: b8 e6 30 00 or r6,r7,r6 8005460: 0c a6 00 00 sh (r5+0),r6 _Priority_Major_bit_map |= the_priority_map->ready_major; 8005464: 2c 26 00 08 lhu r6,(r1+8) 8005468: 2c 65 00 00 lhu r5,(r3+0) ) { Chain_Node *before_node; the_node->previous = after_node; before_node = after_node->next; 800546c: 28 81 00 00 lw r1,(r4+0) Chain_Node *the_node ) { Chain_Node *before_node; the_node->previous = after_node; 8005470: 59 64 00 04 sw (r11+4),r4 8005474: b8 c5 28 00 or r5,r6,r5 8005478: 20 a5 ff ff andi r5,r5,0xffff 800547c: 0c 65 00 00 sh (r3+0),r5 before_node = after_node->next; after_node->next = the_node; 8005480: 58 8b 00 00 sw (r4+0),r11 the_node->next = before_node; 8005484: 59 61 00 00 sw (r11+0),r1 before_node->previous = the_node; 8005488: 58 2b 00 04 sw (r1+4),r11 _Scheduler_priority_Ready_queue_enqueue_first( the_thread ); else _Scheduler_priority_Ready_queue_enqueue( the_thread ); } _ISR_Flash( level ); 800548c: d0 0c 00 00 wcsr IE,r12 8005490: d0 02 00 00 wcsr IE,r2 */ RTEMS_INLINE_ROUTINE void _Scheduler_Schedule( Scheduler_Control *the_scheduler ) { the_scheduler->Operations.schedule( the_scheduler ); 8005494: 78 01 08 01 mvhi r1,0x801 8005498: 38 21 49 6c ori r1,r1,0x496c 800549c: 28 22 00 04 lw r2,(r1+4) 80054a0: 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 ); 80054a4: 78 01 08 01 mvhi r1,0x801 80054a8: 38 21 4d b4 ori r1,r1,0x4db4 80054ac: 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() && 80054b0: 28 23 00 10 lw r3,(r1+16) 80054b4: 44 43 00 05 be r2,r3,80054c8 <_Thread_Change_priority+0x17c> 80054b8: 40 42 00 74 lbu r2,(r2+116) 80054bc: 44 40 00 03 be r2,r0,80054c8 <_Thread_Change_priority+0x17c> _Thread_Executing->is_preemptible ) _Thread_Dispatch_necessary = true; 80054c0: 34 02 00 01 mvi r2,1 80054c4: 30 22 00 18 sb (r1+24),r2 _ISR_Enable( level ); 80054c8: d0 0c 00 00 wcsr IE,r12 } 80054cc: 2b 9d 00 04 lw ra,(sp+4) 80054d0: 2b 8b 00 14 lw r11,(sp+20) 80054d4: 2b 8c 00 10 lw r12,(sp+16) 80054d8: 2b 8d 00 0c lw r13,(sp+12) 80054dc: 2b 8e 00 08 lw r14,(sp+8) 80054e0: 37 9c 00 14 addi sp,sp,20 80054e4: c3 a0 00 00 ret RTEMS_INLINE_ROUTINE void _Scheduler_priority_Ready_queue_enqueue( Thread_Control *the_thread ) { _Priority_bit_map_Add( &the_thread->scheduler.priority->Priority_map ); 80054e8: 29 61 00 8c lw r1,(r11+140) 80054ec: 78 03 08 01 mvhi r3,0x801 80054f0: 38 63 4d d0 ori r3,r3,0x4dd0 RTEMS_INLINE_ROUTINE void _Priority_bit_map_Add ( Priority_bit_map_Information *the_priority_map ) { *the_priority_map->minor |= the_priority_map->ready_minor; 80054f4: 28 25 00 04 lw r5,(r1+4) 80054f8: 2c 27 00 0a lhu r7,(r1+10) _Chain_Append_unprotected( the_thread->scheduler.priority->ready_chain, 80054fc: 28 24 00 00 lw r4,(r1+0) 8005500: 2c a8 00 00 lhu r8,(r5+0) RTEMS_INLINE_ROUTINE void _Chain_Append_unprotected( Chain_Control *the_chain, Chain_Node *the_node ) { Chain_Node *tail = _Chain_Tail( the_chain ); 8005504: 34 86 00 04 addi r6,r4,4 8005508: b9 07 38 00 or r7,r8,r7 800550c: 0c a7 00 00 sh (r5+0),r7 _Priority_Major_bit_map |= the_priority_map->ready_major; 8005510: 2c 27 00 08 lhu r7,(r1+8) 8005514: 2c 65 00 00 lhu r5,(r3+0) Chain_Node *old_last = tail->previous; 8005518: 28 81 00 08 lw r1,(r4+8) the_node->next = tail; tail->previous = the_node; 800551c: 58 8b 00 08 sw (r4+8),r11 8005520: b8 e5 20 00 or r4,r7,r5 8005524: 20 84 ff ff andi r4,r4,0xffff 8005528: 0c 64 00 00 sh (r3+0),r4 ) { Chain_Node *tail = _Chain_Tail( the_chain ); Chain_Node *old_last = tail->previous; the_node->next = tail; 800552c: 59 66 00 00 sw (r11+0),r6 tail->previous = the_node; old_last->next = the_node; 8005530: 58 2b 00 00 sw (r1+0),r11 the_node->previous = old_last; 8005534: 59 61 00 04 sw (r11+4),r1 8005538: e3 ff ff d5 bi 800548c <_Thread_Change_priority+0x140> =============================================================================== 0800c82c <_Thread_Delay_ended>: void _Thread_Delay_ended( Objects_Id id, void *ignored __attribute__((unused)) ) { 800c82c: 37 9c ff f8 addi sp,sp,-8 800c830: 5b 9d 00 04 sw (sp+4),ra Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); 800c834: 37 82 00 08 addi r2,sp,8 800c838: f8 00 00 8a calli 800ca60 <_Thread_Get> switch ( location ) { 800c83c: 2b 82 00 08 lw r2,(sp+8) 800c840: 5c 40 00 0a bne r2,r0,800c868 <_Thread_Delay_ended+0x3c> <== NEVER TAKEN #if defined(RTEMS_MULTIPROCESSING) case OBJECTS_REMOTE: /* impossible */ #endif break; case OBJECTS_LOCAL: _Thread_Clear_state( 800c844: 78 03 08 02 mvhi r3,0x802 800c848: 38 63 84 10 ori r3,r3,0x8410 800c84c: 28 62 00 00 lw r2,(r3+0) 800c850: fb ff ff 64 calli 800c5e0 <_Thread_Clear_state> 800c854: 78 01 08 02 mvhi r1,0x802 800c858: 38 21 aa 50 ori r1,r1,0xaa50 800c85c: 28 22 00 00 lw r2,(r1+0) 800c860: 34 42 ff ff addi r2,r2,-1 800c864: 58 22 00 00 sw (r1+0),r2 | STATES_INTERRUPTIBLE_BY_SIGNAL ); _Thread_Unnest_dispatch(); break; } } 800c868: 2b 9d 00 04 lw ra,(sp+4) 800c86c: 37 9c 00 08 addi sp,sp,8 800c870: c3 a0 00 00 ret =============================================================================== 08005710 <_Thread_Dispatch>: * dispatch thread * no dispatch thread */ void _Thread_Dispatch( void ) { 8005710: 37 9c ff bc addi sp,sp,-68 8005714: 5b 8b 00 34 sw (sp+52),r11 8005718: 5b 8c 00 30 sw (sp+48),r12 800571c: 5b 8d 00 2c sw (sp+44),r13 8005720: 5b 8e 00 28 sw (sp+40),r14 8005724: 5b 8f 00 24 sw (sp+36),r15 8005728: 5b 90 00 20 sw (sp+32),r16 800572c: 5b 91 00 1c sw (sp+28),r17 8005730: 5b 92 00 18 sw (sp+24),r18 8005734: 5b 93 00 14 sw (sp+20),r19 8005738: 5b 94 00 10 sw (sp+16),r20 800573c: 5b 95 00 0c sw (sp+12),r21 8005740: 5b 96 00 08 sw (sp+8),r22 8005744: 5b 9d 00 04 sw (sp+4),ra Thread_Control *executing; Thread_Control *heir; ISR_Level level; executing = _Thread_Executing; 8005748: 78 01 08 01 mvhi r1,0x801 800574c: 38 21 4d b4 ori r1,r1,0x4db4 8005750: 28 2c 00 0c lw r12,(r1+12) _ISR_Disable( level ); 8005754: 90 00 08 00 rcsr r1,IE 8005758: 34 02 ff fe mvi r2,-2 800575c: a0 22 10 00 and r2,r1,r2 8005760: d0 02 00 00 wcsr IE,r2 while ( _Thread_Dispatch_necessary == true ) { 8005764: 78 0e 08 01 mvhi r14,0x801 8005768: 39 ce 4d b4 ori r14,r14,0x4db4 800576c: 41 c2 00 18 lbu r2,(r14+24) 8005770: 78 10 08 01 mvhi r16,0x801 Thread_Control *executing; Thread_Control *heir; ISR_Level level; executing = _Thread_Executing; _ISR_Disable( level ); 8005774: b8 20 20 00 mv r4,r1 while ( _Thread_Dispatch_necessary == true ) { 8005778: 20 42 00 ff andi r2,r2,0xff 800577c: 3a 10 48 e8 ori r16,r16,0x48e8 8005780: 44 40 00 40 be r2,r0,8005880 <_Thread_Dispatch+0x170> heir = _Thread_Heir; 8005784: 29 cb 00 10 lw r11,(r14+16) _Thread_Dispatch_disable_level = 1; 8005788: 34 02 00 01 mvi r2,1 800578c: 5a 02 00 00 sw (r16+0),r2 _Thread_Dispatch_necessary = false; 8005790: 31 c0 00 18 sb (r14+24),r0 _Thread_Executing = heir; 8005794: 59 cb 00 0c sw (r14+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 ) 8005798: 45 8b 00 3a be r12,r11,8005880 <_Thread_Dispatch+0x170> 800579c: 78 0f 08 01 mvhi r15,0x801 80057a0: 78 14 08 01 mvhi r20,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; 80057a4: 78 15 08 01 mvhi r21,0x801 80057a8: 37 92 00 40 addi r18,sp,64 80057ac: 39 ef 49 b4 ori r15,r15,0x49b4 80057b0: 37 91 00 38 addi r17,sp,56 80057b4: 3a 94 49 8c ori r20,r20,0x498c */ #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 ) 80057b8: 34 13 00 01 mvi r19,1 heir->cpu_time_budget = _Thread_Ticks_per_timeslice; 80057bc: 3a b5 48 80 ori r21,r21,0x4880 #endif #endif executing = _Thread_Executing; _ISR_Disable( level ); 80057c0: 34 16 ff fe mvi r22,-2 Thread_Control *heir; ISR_Level level; executing = _Thread_Executing; _ISR_Disable( level ); while ( _Thread_Dispatch_necessary == true ) { 80057c4: b9 c0 68 00 mv r13,r14 80057c8: e0 00 00 29 bi 800586c <_Thread_Dispatch+0x15c> rtems_ada_self = heir->rtems_ada_self; #endif if ( heir->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE ) heir->cpu_time_budget = _Thread_Ticks_per_timeslice; _ISR_Enable( level ); 80057cc: d0 01 00 00 wcsr IE,r1 #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ { Timestamp_Control uptime, ran; _TOD_Get_uptime( &uptime ); 80057d0: ba 40 08 00 mv r1,r18 80057d4: f8 00 12 07 calli 8009ff0 <_TOD_Get_uptime> _Timestamp_Subtract( 80057d8: ba 20 18 00 mv r3,r17 80057dc: b9 e0 08 00 mv r1,r15 80057e0: ba 40 10 00 mv r2,r18 80057e4: f8 00 03 bf calli 80066e0 <_Timespec_Subtract> &_Thread_Time_of_last_context_switch, &uptime, &ran ); _Timestamp_Add_to( &executing->cpu_time_used, &ran ); 80057e8: ba 20 10 00 mv r2,r17 80057ec: 35 81 00 84 addi r1,r12,132 80057f0: f8 00 03 a5 calli 8006684 <_Timespec_Add_to> _Thread_Time_of_last_context_switch = uptime; 80057f4: 2b 83 00 40 lw r3,(sp+64) #endif /* * Switch libc's task specific data. */ if ( _Thread_libc_reent ) { 80057f8: 2a 84 00 00 lw r4,(r20+0) executing->libc_reent = *_Thread_libc_reent; *_Thread_libc_reent = heir->libc_reent; } _User_extensions_Thread_switch( executing, heir ); 80057fc: b9 80 08 00 mv r1,r12 &_Thread_Time_of_last_context_switch, &uptime, &ran ); _Timestamp_Add_to( &executing->cpu_time_used, &ran ); _Thread_Time_of_last_context_switch = uptime; 8005800: 59 e3 00 00 sw (r15+0),r3 8005804: 2b 83 00 44 lw r3,(sp+68) if ( _Thread_libc_reent ) { executing->libc_reent = *_Thread_libc_reent; *_Thread_libc_reent = heir->libc_reent; } _User_extensions_Thread_switch( executing, heir ); 8005808: b9 60 10 00 mv r2,r11 &_Thread_Time_of_last_context_switch, &uptime, &ran ); _Timestamp_Add_to( &executing->cpu_time_used, &ran ); _Thread_Time_of_last_context_switch = uptime; 800580c: 59 e3 00 04 sw (r15+4),r3 #endif /* * Switch libc's task specific data. */ if ( _Thread_libc_reent ) { 8005810: 44 80 00 05 be r4,r0,8005824 <_Thread_Dispatch+0x114> <== NEVER TAKEN executing->libc_reent = *_Thread_libc_reent; 8005814: 28 83 00 00 lw r3,(r4+0) 8005818: 59 83 01 18 sw (r12+280),r3 *_Thread_libc_reent = heir->libc_reent; 800581c: 29 63 01 18 lw r3,(r11+280) 8005820: 58 83 00 00 sw (r4+0),r3 } _User_extensions_Thread_switch( executing, heir ); 8005824: f8 00 04 b6 calli 8006afc <_User_extensions_Thread_switch> if ( executing->fp_context != NULL ) _Context_Save_fp( &executing->fp_context ); #endif #endif _Context_Switch( &executing->Registers, &heir->Registers ); 8005828: 35 81 00 c4 addi r1,r12,196 800582c: 35 62 00 c4 addi r2,r11,196 8005830: f8 00 05 eb calli 8006fdc <_CPU_Context_switch> if ( executing->fp_context != NULL ) _Context_Restore_fp( &executing->fp_context ); #endif #endif executing = _Thread_Executing; 8005834: 29 cc 00 0c lw r12,(r14+12) _ISR_Disable( level ); 8005838: 90 00 20 00 rcsr r4,IE 800583c: a0 96 08 00 and r1,r4,r22 8005840: d0 01 00 00 wcsr IE,r1 Thread_Control *heir; ISR_Level level; executing = _Thread_Executing; _ISR_Disable( level ); while ( _Thread_Dispatch_necessary == true ) { 8005844: 41 a2 00 18 lbu r2,(r13+24) 8005848: b9 a0 70 00 mv r14,r13 #endif #endif executing = _Thread_Executing; _ISR_Disable( level ); 800584c: b8 80 08 00 mv r1,r4 Thread_Control *heir; ISR_Level level; executing = _Thread_Executing; _ISR_Disable( level ); while ( _Thread_Dispatch_necessary == true ) { 8005850: 20 42 00 ff andi r2,r2,0xff 8005854: 44 40 00 0b be r2,r0,8005880 <_Thread_Dispatch+0x170> <== ALWAYS TAKEN heir = _Thread_Heir; 8005858: 29 ab 00 10 lw r11,(r13+16) <== NOT EXECUTED _Thread_Dispatch_disable_level = 1; 800585c: 5a 13 00 00 sw (r16+0),r19 <== NOT EXECUTED _Thread_Dispatch_necessary = false; 8005860: 31 a0 00 18 sb (r13+24),r0 <== NOT EXECUTED _Thread_Executing = heir; 8005864: 59 ab 00 0c sw (r13+12),r11 <== NOT EXECUTED /* * 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 ) 8005868: 45 6c 00 06 be r11,r12,8005880 <_Thread_Dispatch+0x170> <== NOT EXECUTED */ #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 ) 800586c: 29 62 00 7c lw r2,(r11+124) 8005870: 5c 53 ff d7 bne r2,r19,80057cc <_Thread_Dispatch+0xbc> heir->cpu_time_budget = _Thread_Ticks_per_timeslice; 8005874: 2a a2 00 00 lw r2,(r21+0) 8005878: 59 62 00 78 sw (r11+120),r2 800587c: e3 ff ff d4 bi 80057cc <_Thread_Dispatch+0xbc> _ISR_Disable( level ); } post_switch: _Thread_Dispatch_disable_level = 0; 8005880: 5a 00 00 00 sw (r16+0),r0 _ISR_Enable( level ); 8005884: d0 04 00 00 wcsr IE,r4 _API_extensions_Run_postswitch(); 8005888: fb ff f7 a2 calli 8003710 <_API_extensions_Run_postswitch> } 800588c: 2b 9d 00 04 lw ra,(sp+4) 8005890: 2b 8b 00 34 lw r11,(sp+52) 8005894: 2b 8c 00 30 lw r12,(sp+48) 8005898: 2b 8d 00 2c lw r13,(sp+44) 800589c: 2b 8e 00 28 lw r14,(sp+40) 80058a0: 2b 8f 00 24 lw r15,(sp+36) 80058a4: 2b 90 00 20 lw r16,(sp+32) 80058a8: 2b 91 00 1c lw r17,(sp+28) 80058ac: 2b 92 00 18 lw r18,(sp+24) 80058b0: 2b 93 00 14 lw r19,(sp+20) 80058b4: 2b 94 00 10 lw r20,(sp+16) 80058b8: 2b 95 00 0c lw r21,(sp+12) 80058bc: 2b 96 00 08 lw r22,(sp+8) 80058c0: 37 9c 00 44 addi sp,sp,68 80058c4: c3 a0 00 00 ret =============================================================================== 0800cb3c <_Thread_Handler>: * * Output parameters: NONE */ void _Thread_Handler( void ) { 800cb3c: 37 9c ff f4 addi sp,sp,-12 800cb40: 5b 8b 00 0c sw (sp+12),r11 800cb44: 5b 8c 00 08 sw (sp+8),r12 800cb48: 5b 9d 00 04 sw (sp+4),ra #if defined(EXECUTE_GLOBAL_CONSTRUCTORS) static char doneConstructors; char doneCons; #endif executing = _Thread_Executing; 800cb4c: 78 01 08 01 mvhi r1,0x801 800cb50: 38 21 4d b4 ori r1,r1,0x4db4 800cb54: 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; 800cb58: 29 61 00 ac lw r1,(r11+172) _ISR_Set_level(level); 800cb5c: 64 21 00 00 cmpei r1,r1,0 800cb60: d0 01 00 00 wcsr IE,r1 #if defined(EXECUTE_GLOBAL_CONSTRUCTORS) doneCons = doneConstructors; 800cb64: 78 02 08 01 mvhi r2,0x801 800cb68: 38 42 46 fc ori r2,r2,0x46fc 800cb6c: 40 4c 00 00 lbu r12,(r2+0) doneConstructors = 1; 800cb70: 34 03 00 01 mvi r3,1 /* * Take care that 'begin' extensions get to complete before * 'switch' extensions can run. This means must keep dispatch * disabled until all 'begin' extensions complete. */ _User_extensions_Thread_begin( executing ); 800cb74: b9 60 08 00 mv r1,r11 level = executing->Start.isr_level; _ISR_Set_level(level); #if defined(EXECUTE_GLOBAL_CONSTRUCTORS) doneCons = doneConstructors; doneConstructors = 1; 800cb78: 30 43 00 00 sb (r2+0),r3 /* * 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 ); 800cb7c: fb ff e7 34 calli 800684c <_User_extensions_Thread_begin> /* * At this point, the dispatch disable level BETTER be 1. */ _Thread_Enable_dispatch(); 800cb80: fb ff e3 52 calli 80058c8 <_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) */ { 800cb84: 45 80 00 0b be r12,r0,800cbb0 <_Thread_Handler+0x74> INIT_NAME (); } #endif if ( executing->Start.prototype == THREAD_START_NUMERIC ) { 800cb88: 29 61 00 94 lw r1,(r11+148) 800cb8c: 44 20 00 0c be r1,r0,800cbbc <_Thread_Handler+0x80> (*(Thread_Entry_numeric) executing->Start.entry_point)( executing->Start.numeric_argument ); } #if defined(RTEMS_POSIX_API) else if ( executing->Start.prototype == THREAD_START_POINTER ) { 800cb90: 34 02 00 01 mvi r2,1 800cb94: 44 22 00 0f be r1,r2,800cbd0 <_Thread_Handler+0x94> <== ALWAYS TAKEN * was placed in return_argument. This assumed that if it returned * anything (which is not supporting in all APIs), then it would be * able to fit in a (void *). */ _User_extensions_Thread_exitted( executing ); 800cb98: b9 60 08 00 mv r1,r11 800cb9c: fb ff e7 44 calli 80068ac <_User_extensions_Thread_exitted> _Internal_error_Occurred( 800cba0: 34 01 00 00 mvi r1,0 800cba4: 34 02 00 01 mvi r2,1 800cba8: 34 03 00 05 mvi r3,5 800cbac: fb ff de 15 calli 8004400 <_Internal_error_Occurred> * _init could be a weak symbol and we SHOULD test it but it isn't * in any configuration I know of and it generates a warning on every * RTEMS target configuration. --joel (12 May 2007) */ if (!doneCons) /* && (volatile void *)_init) */ { INIT_NAME (); 800cbb0: fb ff cd 14 calli 8000000 } #endif if ( executing->Start.prototype == THREAD_START_NUMERIC ) { 800cbb4: 29 61 00 94 lw r1,(r11+148) 800cbb8: 5c 20 ff f6 bne r1,r0,800cb90 <_Thread_Handler+0x54> executing->Wait.return_argument = (*(Thread_Entry_numeric) executing->Start.entry_point)( 800cbbc: 29 62 00 90 lw r2,(r11+144) 800cbc0: 29 61 00 9c lw r1,(r11+156) 800cbc4: d8 40 00 00 call r2 INIT_NAME (); } #endif if ( executing->Start.prototype == THREAD_START_NUMERIC ) { executing->Wait.return_argument = 800cbc8: 59 61 00 28 sw (r11+40),r1 800cbcc: e3 ff ff f3 bi 800cb98 <_Thread_Handler+0x5c> ); } #if defined(RTEMS_POSIX_API) else if ( executing->Start.prototype == THREAD_START_POINTER ) { executing->Wait.return_argument = (*(Thread_Entry_pointer) executing->Start.entry_point)( 800cbd0: 29 62 00 90 lw r2,(r11+144) 800cbd4: 29 61 00 98 lw r1,(r11+152) 800cbd8: 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 = 800cbdc: 59 61 00 28 sw (r11+40),r1 800cbe0: e3 ff ff ee bi 800cb98 <_Thread_Handler+0x5c> =============================================================================== 0800a9c8 <_Thread_Resume>: void _Thread_Resume( Thread_Control *the_thread, bool force ) { 800a9c8: 37 9c ff f8 addi sp,sp,-8 800a9cc: 5b 8b 00 08 sw (sp+8),r11 800a9d0: 5b 9d 00 04 sw (sp+4),ra 800a9d4: b8 20 10 00 mv r2,r1 ISR_Level level; States_Control current_state; _ISR_Disable( level ); 800a9d8: 90 00 58 00 rcsr r11,IE 800a9dc: 34 01 ff fe mvi r1,-2 800a9e0: a1 61 08 00 and r1,r11,r1 800a9e4: d0 01 00 00 wcsr IE,r1 current_state = the_thread->current_state; 800a9e8: 28 41 00 10 lw r1,(r2+16) if ( current_state & STATES_SUSPENDED ) { 800a9ec: 20 23 00 02 andi r3,r1,0x2 800a9f0: 44 60 00 05 be r3,r0,800aa04 <_Thread_Resume+0x3c> <== NEVER TAKEN RTEMS_INLINE_ROUTINE States_Control _States_Clear ( States_Control states_to_clear, States_Control current_state ) { return (current_state & ~states_to_clear); 800a9f4: 34 03 ff fd mvi r3,-3 800a9f8: a0 23 08 00 and r1,r1,r3 current_state = the_thread->current_state = _States_Clear(STATES_SUSPENDED, current_state); 800a9fc: 58 41 00 10 sw (r2+16),r1 if ( _States_Is_ready( current_state ) ) { 800aa00: 44 20 00 06 be r1,r0,800aa18 <_Thread_Resume+0x50> _Scheduler_Unblock( &_Scheduler, the_thread ); } } _ISR_Enable( level ); 800aa04: d0 0b 00 00 wcsr IE,r11 } 800aa08: 2b 9d 00 04 lw ra,(sp+4) 800aa0c: 2b 8b 00 08 lw r11,(sp+8) 800aa10: 37 9c 00 08 addi sp,sp,8 800aa14: c3 a0 00 00 ret RTEMS_INLINE_ROUTINE void _Scheduler_Unblock( Scheduler_Control *the_scheduler, Thread_Control *the_thread ) { the_scheduler->Operations.unblock( the_scheduler, the_thread ); 800aa18: 78 01 08 01 mvhi r1,0x801 800aa1c: 38 21 aa 34 ori r1,r1,0xaa34 800aa20: 28 23 00 10 lw r3,(r1+16) 800aa24: d8 60 00 00 call r3 if ( _States_Is_ready( current_state ) ) { _Scheduler_Unblock( &_Scheduler, the_thread ); } } _ISR_Enable( level ); 800aa28: d0 0b 00 00 wcsr IE,r11 } 800aa2c: 2b 9d 00 04 lw ra,(sp+4) 800aa30: 2b 8b 00 08 lw r11,(sp+8) 800aa34: 37 9c 00 08 addi sp,sp,8 800aa38: c3 a0 00 00 ret =============================================================================== 080065e0 <_Thread_Tickle_timeslice>: * * Output parameters: NONE */ void _Thread_Tickle_timeslice( void ) { 80065e0: 37 9c ff f8 addi sp,sp,-8 80065e4: 5b 8b 00 08 sw (sp+8),r11 80065e8: 5b 9d 00 04 sw (sp+4),ra Thread_Control *executing; executing = _Thread_Executing; 80065ec: 78 01 08 01 mvhi r1,0x801 80065f0: 38 21 4d b4 ori r1,r1,0x4db4 80065f4: 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 ) 80065f8: 41 61 00 74 lbu r1,(r11+116) 80065fc: 44 20 00 09 be r1,r0,8006620 <_Thread_Tickle_timeslice+0x40> return; if ( !_States_Is_ready( executing->current_state ) ) 8006600: 29 61 00 10 lw r1,(r11+16) 8006604: 5c 20 00 07 bne r1,r0,8006620 <_Thread_Tickle_timeslice+0x40> /* * The cpu budget algorithm determines what happens next. */ switch ( executing->budget_algorithm ) { 8006608: 29 61 00 7c lw r1,(r11+124) 800660c: 44 20 00 05 be r1,r0,8006620 <_Thread_Tickle_timeslice+0x40> 8006610: 34 02 00 02 mvi r2,2 8006614: 50 41 00 0f bgeu r2,r1,8006650 <_Thread_Tickle_timeslice+0x70> 8006618: 34 02 00 03 mvi r2,3 800661c: 44 22 00 05 be r1,r2,8006630 <_Thread_Tickle_timeslice+0x50><== ALWAYS TAKEN if ( --executing->cpu_time_budget == 0 ) (*executing->budget_callout)( executing ); break; #endif } } 8006620: 2b 9d 00 04 lw ra,(sp+4) 8006624: 2b 8b 00 08 lw r11,(sp+8) 8006628: 37 9c 00 08 addi sp,sp,8 800662c: c3 a0 00 00 ret } break; #if defined(RTEMS_SCORE_THREAD_ENABLE_SCHEDULER_CALLOUT) case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT: if ( --executing->cpu_time_budget == 0 ) 8006630: 29 61 00 78 lw r1,(r11+120) 8006634: 34 21 ff ff addi r1,r1,-1 8006638: 59 61 00 78 sw (r11+120),r1 800663c: 5c 20 ff f9 bne r1,r0,8006620 <_Thread_Tickle_timeslice+0x40> (*executing->budget_callout)( executing ); 8006640: 29 62 00 80 lw r2,(r11+128) 8006644: b9 60 08 00 mv r1,r11 8006648: d8 40 00 00 call r2 800664c: e3 ff ff f5 bi 8006620 <_Thread_Tickle_timeslice+0x40> 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 ) { 8006650: 29 61 00 78 lw r1,(r11+120) 8006654: 34 21 ff ff addi r1,r1,-1 8006658: 59 61 00 78 sw (r11+120),r1 800665c: 48 20 ff f1 bg r1,r0,8006620 <_Thread_Tickle_timeslice+0x40> * always operates on the scheduler that 'owns' the currently executing * thread. */ RTEMS_INLINE_ROUTINE void _Scheduler_Yield( void ) { _Scheduler.Operations.yield( &_Scheduler ); 8006660: 78 01 08 01 mvhi r1,0x801 8006664: 38 21 49 6c ori r1,r1,0x496c 8006668: 28 22 00 08 lw r2,(r1+8) 800666c: 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; 8006670: 78 01 08 01 mvhi r1,0x801 8006674: 38 21 48 80 ori r1,r1,0x4880 8006678: 28 21 00 00 lw r1,(r1+0) 800667c: 59 61 00 78 sw (r11+120),r1 8006680: e3 ff ff e8 bi 8006620 <_Thread_Tickle_timeslice+0x40> =============================================================================== 08005fa8 <_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 ) { 8005fa8: 37 9c ff f4 addi sp,sp,-12 8005fac: 5b 8b 00 0c sw (sp+12),r11 8005fb0: 5b 8c 00 08 sw (sp+8),r12 8005fb4: 5b 8d 00 04 sw (sp+4),r13 Priority_Control priority; States_Control block_state; _Chain_Initialize_empty( &the_thread->Wait.Block2n ); priority = the_thread->current_priority; 8005fb8: 28 45 00 14 lw r5,(r2+20) 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 ); 8005fbc: 34 47 00 3c addi r7,r2,60 */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { Chain_Node *head = _Chain_Head( the_chain ); 8005fc0: 34 46 00 38 addi r6,r2,56 RTEMS_INLINE_ROUTINE uint32_t _Thread_queue_Header_number ( Priority_Control the_priority ) { return (the_priority / TASK_QUEUE_DATA_PRIORITIES_PER_HEADER); 8005fc4: 00 a4 00 01 srui r4,r5,1 8005fc8: 78 0c 08 01 mvhi r12,0x801 8005fcc: 00 84 00 01 srui r4,r4,1 Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; 8005fd0: 58 47 00 38 sw (r2+56),r7 8005fd4: 00 84 00 01 srui r4,r4,1 head->previous = NULL; tail->previous = head; 8005fd8: 58 46 00 40 sw (r2+64),r6 8005fdc: 00 84 00 01 srui r4,r4,1 { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; head->previous = NULL; 8005fe0: 58 40 00 3c sw (r2+60),r0 8005fe4: 00 84 00 01 srui r4,r4,1 RTEMS_INLINE_ROUTINE bool _Thread_queue_Is_reverse_search ( Priority_Control the_priority ) { return ( the_priority & TASK_QUEUE_DATA_REVERSE_SEARCH_MASK ); 8005fe8: 20 a8 00 20 andi r8,r5,0x20 RTEMS_INLINE_ROUTINE uint32_t _Thread_queue_Header_number ( Priority_Control the_priority ) { return (the_priority / TASK_QUEUE_DATA_PRIORITIES_PER_HEADER); 8005fec: 00 84 00 01 srui r4,r4,1 header_index = _Thread_queue_Header_number( priority ); header = &the_thread_queue->Queues.Priority[ header_index ]; block_state = the_thread_queue->state; 8005ff0: 28 27 00 38 lw r7,(r1+56) 8005ff4: b4 84 30 00 add r6,r4,r4 8005ff8: 39 8c 40 c0 ori r12,r12,0x40c0 if ( _Thread_queue_Is_reverse_search( priority ) ) 8005ffc: 5d 00 00 18 bne r8,r0,800605c <_Thread_queue_Enqueue_priority+0xb4> * * WARNING! Returning with interrupts disabled! */ *level_p = level; return the_thread_queue->sync_state; } 8006000: b4 c4 20 00 add r4,r6,r4 8006004: b4 84 20 00 add r4,r4,r4 8006008: b4 84 20 00 add r4,r4,r4 800600c: b4 24 60 00 add r12,r1,r4 if ( _Thread_queue_Is_reverse_search( priority ) ) goto restart_reverse_search; restart_forward_search: search_priority = PRIORITY_MINIMUM - 1; _ISR_Disable( level ); 8006010: 34 0d ff fe mvi r13,-2 RTEMS_INLINE_ROUTINE bool _Chain_Is_tail( Chain_Control *the_chain, const Chain_Node *the_node ) { return (the_node == _Chain_Tail(the_chain)); 8006014: 35 8b 00 04 addi r11,r12,4 8006018: 90 00 40 00 rcsr r8,IE 800601c: a1 0d 50 00 and r10,r8,r13 8006020: d0 0a 00 00 wcsr IE,r10 * * WARNING! Returning with interrupts disabled! */ *level_p = level; return the_thread_queue->sync_state; } 8006024: 29 84 00 00 lw r4,(r12+0) 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 ) ) { 8006028: 5c 8b 00 04 bne r4,r11,8006038 <_Thread_queue_Enqueue_priority+0x90> 800602c: e0 00 00 24 bi 80060bc <_Thread_queue_Enqueue_priority+0x114> if ( !_States_Are_set( search_thread->current_state, block_state) ) { _ISR_Enable( level ); goto restart_forward_search; } search_thread = (Thread_Control *)search_thread->Object.Node.next; 8006030: 28 84 00 00 lw r4,(r4+0) 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 ) ) { 8006034: 44 8b 00 23 be r4,r11,80060c0 <_Thread_queue_Enqueue_priority+0x118> search_priority = search_thread->current_priority; 8006038: 28 86 00 14 lw r6,(r4+20) if ( priority <= search_priority ) 800603c: 50 c5 00 21 bgeu r6,r5,80060c0 <_Thread_queue_Enqueue_priority+0x118> break; search_priority = search_thread->current_priority; if ( priority <= search_priority ) break; #endif _ISR_Flash( level ); 8006040: d0 08 00 00 wcsr IE,r8 8006044: d0 0a 00 00 wcsr IE,r10 RTEMS_INLINE_ROUTINE bool _States_Are_set ( States_Control the_states, States_Control mask ) { return ( (the_states & mask) != STATES_READY); 8006048: 28 89 00 10 lw r9,(r4+16) 800604c: a0 e9 48 00 and r9,r7,r9 if ( !_States_Are_set( search_thread->current_state, block_state) ) { 8006050: 5d 20 ff f8 bne r9,r0,8006030 <_Thread_queue_Enqueue_priority+0x88><== ALWAYS TAKEN _ISR_Enable( level ); 8006054: d0 08 00 00 wcsr IE,r8 <== NOT EXECUTED goto restart_forward_search; 8006058: e3 ff ff f0 bi 8006018 <_Thread_queue_Enqueue_priority+0x70><== NOT EXECUTED * * WARNING! Returning with interrupts disabled! */ *level_p = level; return the_thread_queue->sync_state; } 800605c: b4 c4 20 00 add r4,r6,r4 8006060: b4 84 20 00 add r4,r4,r4 8006064: b4 84 20 00 add r4,r4,r4 return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; _ISR_Disable( level ); 8006068: 34 0d ff fe mvi r13,-2 * * WARNING! Returning with interrupts disabled! */ *level_p = level; return the_thread_queue->sync_state; } 800606c: b4 24 50 00 add r10,r1,r4 the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; 8006070: 41 86 00 00 lbu r6,(r12+0) 8006074: 34 c6 00 01 addi r6,r6,1 _ISR_Disable( level ); 8006078: 90 00 40 00 rcsr r8,IE 800607c: a1 0d 58 00 and r11,r8,r13 8006080: d0 0b 00 00 wcsr IE,r11 * * WARNING! Returning with interrupts disabled! */ *level_p = level; return the_thread_queue->sync_state; } 8006084: 29 44 00 08 lw r4,(r10+8) 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 ) ) { 8006088: 5c 8a 00 04 bne r4,r10,8006098 <_Thread_queue_Enqueue_priority+0xf0> 800608c: e0 00 00 18 bi 80060ec <_Thread_queue_Enqueue_priority+0x144> if ( !_States_Are_set( search_thread->current_state, block_state) ) { _ISR_Enable( level ); goto restart_reverse_search; } search_thread = (Thread_Control *) search_thread->Object.Node.previous; 8006090: 28 84 00 04 lw r4,(r4+4) 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 ) ) { 8006094: 44 8a 00 16 be r4,r10,80060ec <_Thread_queue_Enqueue_priority+0x144> search_priority = search_thread->current_priority; 8006098: 28 86 00 14 lw r6,(r4+20) if ( priority >= search_priority ) 800609c: 50 a6 00 14 bgeu r5,r6,80060ec <_Thread_queue_Enqueue_priority+0x144> break; search_priority = search_thread->current_priority; if ( priority >= search_priority ) break; #endif _ISR_Flash( level ); 80060a0: d0 08 00 00 wcsr IE,r8 80060a4: d0 0b 00 00 wcsr IE,r11 80060a8: 28 89 00 10 lw r9,(r4+16) 80060ac: a0 e9 48 00 and r9,r7,r9 if ( !_States_Are_set( search_thread->current_state, block_state) ) { 80060b0: 5d 20 ff f8 bne r9,r0,8006090 <_Thread_queue_Enqueue_priority+0xe8><== ALWAYS TAKEN _ISR_Enable( level ); 80060b4: d0 08 00 00 wcsr IE,r8 <== NOT EXECUTED goto restart_reverse_search; 80060b8: e3 ff ff ee bi 8006070 <_Thread_queue_Enqueue_priority+0xc8><== NOT EXECUTED if ( _Thread_queue_Is_reverse_search( priority ) ) goto restart_reverse_search; restart_forward_search: search_priority = PRIORITY_MINIMUM - 1; 80060bc: 34 06 ff ff mvi r6,-1 } search_thread = (Thread_Control *)search_thread->Object.Node.next; } if ( the_thread_queue->sync_state != 80060c0: 28 27 00 30 lw r7,(r1+48) 80060c4: 34 0a 00 01 mvi r10,1 80060c8: b9 00 48 00 mv r9,r8 80060cc: 44 ea 00 1b be r7,r10,8006138 <_Thread_queue_Enqueue_priority+0x190> * 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; 80060d0: 58 69 00 00 sw (r3+0),r9 return the_thread_queue->sync_state; } 80060d4: b8 e0 08 00 mv r1,r7 80060d8: 2b 8b 00 0c lw r11,(sp+12) 80060dc: 2b 8c 00 08 lw r12,(sp+8) 80060e0: 2b 8d 00 04 lw r13,(sp+4) 80060e4: 37 9c 00 0c addi sp,sp,12 80060e8: c3 a0 00 00 ret } search_thread = (Thread_Control *) search_thread->Object.Node.previous; } if ( the_thread_queue->sync_state != 80060ec: 28 27 00 30 lw r7,(r1+48) 80060f0: 34 0a 00 01 mvi r10,1 80060f4: b9 00 48 00 mv r9,r8 80060f8: 5c ea ff f6 bne r7,r10,80060d0 <_Thread_queue_Enqueue_priority+0x128><== NEVER TAKEN THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) goto synchronize; the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED; 80060fc: 58 20 00 30 sw (r1+48),r0 if ( priority == search_priority ) 8006100: 44 a6 00 1d be r5,r6,8006174 <_Thread_queue_Enqueue_priority+0x1cc> goto equal_priority; search_node = (Chain_Node *) search_thread; next_node = search_node->next; 8006104: 28 83 00 00 lw r3,(r4+0) the_node = (Chain_Node *) the_thread; the_node->next = next_node; the_node->previous = search_node; 8006108: 58 44 00 04 sw (r2+4),r4 search_node = (Chain_Node *) search_thread; next_node = search_node->next; the_node = (Chain_Node *) the_thread; the_node->next = next_node; 800610c: 58 43 00 00 sw (r2+0),r3 the_node->previous = search_node; search_node->next = the_node; 8006110: 58 82 00 00 sw (r4+0),r2 next_node->previous = the_node; 8006114: 58 62 00 04 sw (r3+4),r2 the_thread->Wait.queue = the_thread_queue; 8006118: 58 41 00 44 sw (r2+68),r1 _ISR_Enable( level ); 800611c: d0 08 00 00 wcsr IE,r8 * * WARNING! Returning with interrupts disabled! */ *level_p = level; return the_thread_queue->sync_state; } 8006120: b8 e0 08 00 mv r1,r7 8006124: 2b 8b 00 0c lw r11,(sp+12) 8006128: 2b 8c 00 08 lw r12,(sp+8) 800612c: 2b 8d 00 04 lw r13,(sp+4) 8006130: 37 9c 00 0c addi sp,sp,12 8006134: c3 a0 00 00 ret if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) goto synchronize; the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_SYNCHRONIZED; 8006138: 58 20 00 30 sw (r1+48),r0 if ( priority == search_priority ) 800613c: 44 a6 00 0e be r5,r6,8006174 <_Thread_queue_Enqueue_priority+0x1cc> goto equal_priority; search_node = (Chain_Node *) search_thread; previous_node = search_node->previous; 8006140: 28 83 00 04 lw r3,(r4+4) the_node = (Chain_Node *) the_thread; the_node->next = search_node; 8006144: 58 44 00 00 sw (r2+0),r4 the_node->previous = previous_node; 8006148: 58 43 00 04 sw (r2+4),r3 previous_node->next = the_node; 800614c: 58 62 00 00 sw (r3+0),r2 search_node->previous = the_node; 8006150: 58 82 00 04 sw (r4+4),r2 the_thread->Wait.queue = the_thread_queue; 8006154: 58 41 00 44 sw (r2+68),r1 _ISR_Enable( level ); 8006158: d0 08 00 00 wcsr IE,r8 * * WARNING! Returning with interrupts disabled! */ *level_p = level; return the_thread_queue->sync_state; } 800615c: b8 e0 08 00 mv r1,r7 8006160: 2b 8b 00 0c lw r11,(sp+12) 8006164: 2b 8c 00 08 lw r12,(sp+8) 8006168: 2b 8d 00 04 lw r13,(sp+4) 800616c: 37 9c 00 0c addi sp,sp,12 8006170: c3 a0 00 00 ret _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 ); previous_node = search_node->previous; 8006174: 28 83 00 40 lw r3,(r4+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 ); 8006178: 34 85 00 3c addi r5,r4,60 previous_node = search_node->previous; the_node = (Chain_Node *) the_thread; the_node->next = search_node; 800617c: 58 45 00 00 sw (r2+0),r5 the_node->previous = previous_node; 8006180: 58 43 00 04 sw (r2+4),r3 previous_node->next = the_node; 8006184: 58 62 00 00 sw (r3+0),r2 search_node->previous = the_node; 8006188: 58 82 00 40 sw (r4+64),r2 the_thread->Wait.queue = the_thread_queue; 800618c: 58 41 00 44 sw (r2+68),r1 _ISR_Enable( level ); 8006190: d0 08 00 00 wcsr IE,r8 return THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; 8006194: 34 07 00 01 mvi r7,1 8006198: e3 ff ff cf bi 80060d4 <_Thread_queue_Enqueue_priority+0x12c> =============================================================================== 0800aa60 <_Thread_queue_Process_timeout>: #include void _Thread_queue_Process_timeout( Thread_Control *the_thread ) { 800aa60: 37 9c ff fc addi sp,sp,-4 800aa64: 5b 9d 00 04 sw (sp+4),ra Thread_queue_Control *the_thread_queue = the_thread->Wait.queue; 800aa68: 28 23 00 44 lw r3,(r1+68) #include void _Thread_queue_Process_timeout( Thread_Control *the_thread ) { 800aa6c: b8 20 20 00 mv r4,r1 * 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 && 800aa70: 28 62 00 30 lw r2,(r3+48) 800aa74: 44 40 00 05 be r2,r0,800aa88 <_Thread_queue_Process_timeout+0x28> RTEMS_INLINE_ROUTINE bool _Thread_Is_executing ( const Thread_Control *the_thread ) { return ( the_thread == _Thread_Executing ); 800aa78: 78 01 08 01 mvhi r1,0x801 800aa7c: 38 21 4d b4 ori r1,r1,0x4db4 800aa80: 28 21 00 0c lw r1,(r1+12) 800aa84: 44 81 00 09 be r4,r1,800aaa8 <_Thread_queue_Process_timeout+0x48><== NEVER TAKEN if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SATISFIED ) { the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status; the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT; } } else { the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status; 800aa88: 28 65 00 3c lw r5,(r3+60) _Thread_queue_Extract( the_thread->Wait.queue, the_thread ); 800aa8c: b8 60 08 00 mv r1,r3 800aa90: b8 80 10 00 mv r2,r4 if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SATISFIED ) { the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status; the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT; } } else { the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status; 800aa94: 58 85 00 34 sw (r4+52),r5 _Thread_queue_Extract( the_thread->Wait.queue, the_thread ); 800aa98: fb ff ff 8f calli 800a8d4 <_Thread_queue_Extract> } } 800aa9c: 2b 9d 00 04 lw ra,(sp+4) 800aaa0: 37 9c 00 04 addi sp,sp,4 800aaa4: c3 a0 00 00 ret * a timeout is not allowed to occur. */ if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SYNCHRONIZED && _Thread_Is_executing( the_thread ) ) { if ( the_thread_queue->sync_state != THREAD_BLOCKING_OPERATION_SATISFIED ) { 800aaa8: 34 01 00 03 mvi r1,3 <== NOT EXECUTED 800aaac: 44 41 ff fc be r2,r1,800aa9c <_Thread_queue_Process_timeout+0x3c><== NOT EXECUTED the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status; 800aab0: 28 61 00 3c lw r1,(r3+60) <== NOT EXECUTED 800aab4: 58 81 00 34 sw (r4+52),r1 <== NOT EXECUTED the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_TIMEOUT; 800aab8: 34 01 00 02 mvi r1,2 <== NOT EXECUTED 800aabc: 58 61 00 30 sw (r3+48),r1 <== NOT EXECUTED 800aac0: e3 ff ff f7 bi 800aa9c <_Thread_queue_Process_timeout+0x3c><== NOT EXECUTED =============================================================================== 08006248 <_Thread_queue_Requeue>: void _Thread_queue_Requeue( Thread_queue_Control *the_thread_queue, Thread_Control *the_thread ) { 8006248: 37 9c ff ec addi sp,sp,-20 800624c: 5b 8b 00 10 sw (sp+16),r11 8006250: 5b 8c 00 0c sw (sp+12),r12 8006254: 5b 8d 00 08 sw (sp+8),r13 8006258: 5b 9d 00 04 sw (sp+4),ra 800625c: b8 20 58 00 mv r11,r1 8006260: 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 ) 8006264: 44 20 00 04 be r1,r0,8006274 <_Thread_queue_Requeue+0x2c> <== 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 ) { 8006268: 28 22 00 34 lw r2,(r1+52) 800626c: 34 01 00 01 mvi r1,1 8006270: 44 41 00 07 be r2,r1,800628c <_Thread_queue_Requeue+0x44> <== ALWAYS TAKEN _Thread_queue_Extract_priority_helper( tq, the_thread, true ); (void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored ); } _ISR_Enable( level ); } } 8006274: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 8006278: 2b 8b 00 10 lw r11,(sp+16) <== NOT EXECUTED 800627c: 2b 8c 00 0c lw r12,(sp+12) <== NOT EXECUTED 8006280: 2b 8d 00 08 lw r13,(sp+8) <== NOT EXECUTED 8006284: 37 9c 00 14 addi sp,sp,20 <== NOT EXECUTED 8006288: c3 a0 00 00 ret <== NOT EXECUTED if ( the_thread_queue->discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) { Thread_queue_Control *tq = the_thread_queue; ISR_Level level; ISR_Level level_ignored; _ISR_Disable( level ); 800628c: 90 00 68 00 rcsr r13,IE 8006290: 34 01 ff fe mvi r1,-2 8006294: a1 a1 08 00 and r1,r13,r1 8006298: d0 01 00 00 wcsr IE,r1 800629c: 78 03 08 01 mvhi r3,0x801 80062a0: 38 63 37 18 ori r3,r3,0x3718 80062a4: 29 82 00 10 lw r2,(r12+16) 80062a8: 28 61 00 00 lw r1,(r3+0) 80062ac: a0 41 08 00 and r1,r2,r1 if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) { 80062b0: 5c 20 00 08 bne r1,r0,80062d0 <_Thread_queue_Requeue+0x88> <== ALWAYS TAKEN _Thread_queue_Enter_critical_section( tq ); _Thread_queue_Extract_priority_helper( tq, the_thread, true ); (void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored ); } _ISR_Enable( level ); 80062b4: d0 0d 00 00 wcsr IE,r13 <== NOT EXECUTED } } 80062b8: 2b 9d 00 04 lw ra,(sp+4) 80062bc: 2b 8b 00 10 lw r11,(sp+16) 80062c0: 2b 8c 00 0c lw r12,(sp+12) 80062c4: 2b 8d 00 08 lw r13,(sp+8) 80062c8: 37 9c 00 14 addi sp,sp,20 80062cc: c3 a0 00 00 ret RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section ( Thread_queue_Control *the_thread_queue ) { the_thread_queue->sync_state = THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED; 80062d0: 34 01 00 01 mvi r1,1 80062d4: 59 61 00 30 sw (r11+48),r1 ISR_Level level_ignored; _ISR_Disable( level ); if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) { _Thread_queue_Enter_critical_section( tq ); _Thread_queue_Extract_priority_helper( tq, the_thread, true ); 80062d8: b9 80 10 00 mv r2,r12 80062dc: b9 60 08 00 mv r1,r11 80062e0: 34 03 00 01 mvi r3,1 80062e4: f8 00 11 8a calli 800a90c <_Thread_queue_Extract_priority_helper> (void) _Thread_queue_Enqueue_priority( tq, the_thread, &level_ignored ); 80062e8: b9 60 08 00 mv r1,r11 80062ec: b9 80 10 00 mv r2,r12 80062f0: 37 83 00 14 addi r3,sp,20 80062f4: fb ff ff 2d calli 8005fa8 <_Thread_queue_Enqueue_priority> } _ISR_Enable( level ); 80062f8: d0 0d 00 00 wcsr IE,r13 80062fc: e3 ff ff ef bi 80062b8 <_Thread_queue_Requeue+0x70> =============================================================================== 08006300 <_Thread_queue_Timeout>: void _Thread_queue_Timeout( Objects_Id id, void *ignored __attribute__((unused)) ) { 8006300: 37 9c ff f8 addi sp,sp,-8 8006304: 5b 9d 00 04 sw (sp+4),ra Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); 8006308: 37 82 00 08 addi r2,sp,8 800630c: fb ff fd 7c calli 80058fc <_Thread_Get> switch ( location ) { 8006310: 2b 82 00 08 lw r2,(sp+8) 8006314: 5c 40 00 07 bne r2,r0,8006330 <_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 ); 8006318: f8 00 11 d2 calli 800aa60 <_Thread_queue_Process_timeout> */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; 800631c: 78 01 08 01 mvhi r1,0x801 8006320: 38 21 48 e8 ori r1,r1,0x48e8 8006324: 28 22 00 00 lw r2,(r1+0) 8006328: 34 42 ff ff addi r2,r2,-1 800632c: 58 22 00 00 sw (r1+0),r2 _Thread_Unnest_dispatch(); break; } } 8006330: 2b 9d 00 04 lw ra,(sp+4) 8006334: 37 9c 00 08 addi sp,sp,8 8006338: c3 a0 00 00 ret =============================================================================== 080144a8 <_Timer_server_Body>: * @a arg points to the corresponding timer server control block. */ static rtems_task _Timer_server_Body( rtems_task_argument arg ) { 80144a8: 37 9c ff a4 addi sp,sp,-92 80144ac: 5b 8b 00 44 sw (sp+68),r11 80144b0: 5b 8c 00 40 sw (sp+64),r12 80144b4: 5b 8d 00 3c sw (sp+60),r13 80144b8: 5b 8e 00 38 sw (sp+56),r14 80144bc: 5b 8f 00 34 sw (sp+52),r15 80144c0: 5b 90 00 30 sw (sp+48),r16 80144c4: 5b 91 00 2c sw (sp+44),r17 80144c8: 5b 92 00 28 sw (sp+40),r18 80144cc: 5b 93 00 24 sw (sp+36),r19 80144d0: 5b 94 00 20 sw (sp+32),r20 80144d4: 5b 95 00 1c sw (sp+28),r21 80144d8: 5b 96 00 18 sw (sp+24),r22 80144dc: 5b 97 00 14 sw (sp+20),r23 80144e0: 5b 98 00 10 sw (sp+16),r24 80144e4: 5b 99 00 0c sw (sp+12),r25 80144e8: 5b 9b 00 08 sw (sp+8),fp 80144ec: 5b 9d 00 04 sw (sp+4),ra 80144f0: 78 14 08 04 mvhi r20,0x804 ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; 80144f4: 37 96 00 54 addi r22,sp,84 80144f8: 37 95 00 58 addi r21,sp,88 80144fc: 37 8e 00 48 addi r14,sp,72 8014500: 37 92 00 4c addi r18,sp,76 8014504: 78 13 08 04 mvhi r19,0x804 8014508: 78 17 08 04 mvhi r23,0x804 801450c: b8 20 58 00 mv r11,r1 8014510: 5b 95 00 54 sw (sp+84),r21 head->previous = NULL; 8014514: 5b 80 00 58 sw (sp+88),r0 tail->previous = head; 8014518: 5b 96 00 5c sw (sp+92),r22 ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; 801451c: 5b 92 00 48 sw (sp+72),r18 head->previous = NULL; 8014520: 5b 80 00 4c sw (sp+76),r0 tail->previous = head; 8014524: 5b 8e 00 50 sw (sp+80),r14 8014528: 3a 94 0e 10 ori r20,r20,0xe10 801452c: 34 30 00 30 addi r16,r1,48 8014530: 3a 73 0d 88 ori r19,r19,0xd88 8014534: 34 2f 00 68 addi r15,r1,104 8014538: 3a f7 0c e0 ori r23,r23,0xce0 801453c: 34 3b 00 08 addi fp,r1,8 8014540: 34 39 00 40 addi r25,r1,64 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 ) { 8014544: 34 0d 00 03 mvi r13,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 ); 8014548: 34 11 ff fe mvi r17,-2 _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; 801454c: 34 18 00 01 mvi r24,1 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; 8014550: 59 76 00 78 sw (r11+120),r22 static void _Timer_server_Process_interval_watchdogs( Timer_server_Watchdogs *watchdogs, Chain_Control *fire_chain ) { Watchdog_Interval snapshot = _Watchdog_Ticks_since_boot; 8014554: 2a 82 00 00 lw r2,(r20+0) /* * We assume adequate unsigned arithmetic here. */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; 8014558: 29 63 00 3c lw r3,(r11+60) watchdogs->last_snapshot = snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 801455c: ba 00 08 00 mv r1,r16 /* * We assume adequate unsigned arithmetic here. */ Watchdog_Interval delta = snapshot - watchdogs->last_snapshot; watchdogs->last_snapshot = snapshot; 8014560: 59 62 00 3c sw (r11+60),r2 _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); 8014564: c8 43 10 00 sub r2,r2,r3 8014568: b9 c0 18 00 mv r3,r14 801456c: f8 00 15 9f calli 8019be8 <_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; 8014570: 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(); 8014574: 2a 6c 00 00 lw r12,(r19+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 ) { 8014578: 50 8c 00 31 bgeu r4,r12,801463c <_Timer_server_Body+0x194> /* * 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 ); 801457c: b9 e0 08 00 mv r1,r15 8014580: c9 84 10 00 sub r2,r12,r4 8014584: b9 c0 18 00 mv r3,r14 8014588: f8 00 15 98 calli 8019be8 <_Watchdog_Adjust_to_chain> */ delta = last_snapshot - snapshot; _Watchdog_Adjust( &watchdogs->Chain, WATCHDOG_BACKWARD, delta ); } watchdogs->last_snapshot = snapshot; 801458c: 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 ) { 8014590: 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 ); 8014594: 29 61 00 78 lw r1,(r11+120) 8014598: f8 00 03 50 calli 80152d8 <_Chain_Get> 801459c: b8 20 10 00 mv r2,r1 if ( timer == NULL ) { 80145a0: 44 20 00 0b be r1,r0,80145cc <_Timer_server_Body+0x124> <== ALWAYS TAKEN static void _Timer_server_Insert_timer( Timer_server_Control *ts, Timer_Control *timer ) { if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) { 80145a4: 28 24 00 38 lw r4,(r1+56) <== NOT EXECUTED 80145a8: 44 8c 00 2b be r4,r12,8014654 <_Timer_server_Body+0x1ac> <== NOT EXECUTED _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); } else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) { 80145ac: 5c 8d ff fa bne r4,r13,8014594 <_Timer_server_Body+0xec> <== NOT EXECUTED _Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker ); 80145b0: 34 42 00 10 addi r2,r2,16 <== NOT EXECUTED 80145b4: b9 e0 08 00 mv r1,r15 <== NOT EXECUTED 80145b8: f8 00 15 b2 calli 8019c80 <_Watchdog_Insert> <== NOT EXECUTED } static void _Timer_server_Process_insertions( Timer_server_Control *ts ) { while ( true ) { Timer_Control *timer = (Timer_Control *) _Chain_Get( ts->insert_chain ); 80145bc: 29 61 00 78 lw r1,(r11+120) <== NOT EXECUTED 80145c0: f8 00 03 46 calli 80152d8 <_Chain_Get> <== NOT EXECUTED 80145c4: b8 20 10 00 mv r2,r1 <== NOT EXECUTED if ( timer == NULL ) { 80145c8: 5c 20 ff f7 bne r1,r0,80145a4 <_Timer_server_Body+0xfc> <== 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 ); 80145cc: 90 00 10 00 rcsr r2,IE 80145d0: a0 51 18 00 and r3,r2,r17 80145d4: d0 03 00 00 wcsr IE,r3 tmp = ts->insert_chain; if ( _Chain_Is_empty( insert_chain ) ) { 80145d8: 2b 84 00 54 lw r4,(sp+84) * body loop. */ _Timer_server_Process_insertions( ts ); _ISR_Disable( level ); tmp = ts->insert_chain; 80145dc: 29 63 00 78 lw r3,(r11+120) if ( _Chain_Is_empty( insert_chain ) ) { 80145e0: 34 03 00 01 mvi r3,1 80145e4: 44 95 00 20 be r4,r21,8014664 <_Timer_server_Body+0x1bc> <== ALWAYS TAKEN ts->insert_chain = NULL; do_loop = false; } _ISR_Enable( level ); 80145e8: d0 02 00 00 wcsr IE,r2 * 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 ) { 80145ec: 5c 60 ff da bne r3,r0,8014554 <_Timer_server_Body+0xac> <== 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 ) ) { 80145f0: 2b 82 00 48 lw r2,(sp+72) 80145f4: 5c 52 00 0b bne r2,r18,8014620 <_Timer_server_Body+0x178> 80145f8: e0 00 00 1e bi 8014670 <_Timer_server_Body+0x1c8> Chain_Control *the_chain ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *old_first = head->next; Chain_Node *new_first = old_first->next; 80145fc: 28 43 00 00 lw r3,(r2+0) head->next = new_first; new_first->previous = head; 8014600: 58 6e 00 04 sw (r3+4),r14 { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *old_first = head->next; Chain_Node *new_first = old_first->next; head->next = new_first; 8014604: 5b 83 00 48 sw (sp+72),r3 * service routine may remove a watchdog from the chain. */ _ISR_Disable( level ); watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain ); if ( watchdog != NULL ) { watchdog->state = WATCHDOG_INACTIVE; 8014608: 58 40 00 08 sw (r2+8),r0 _ISR_Enable( level ); 801460c: d0 04 00 00 wcsr IE,r4 /* * 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 ); 8014610: 28 43 00 1c lw r3,(r2+28) 8014614: 28 41 00 20 lw r1,(r2+32) 8014618: 28 42 00 24 lw r2,(r2+36) 801461c: d8 60 00 00 call r3 /* * It is essential that interrupts are disable here since an interrupt * service routine may remove a watchdog from the chain. */ _ISR_Disable( level ); 8014620: 90 00 20 00 rcsr r4,IE 8014624: a0 91 10 00 and r2,r4,r17 8014628: d0 02 00 00 wcsr IE,r2 initialized = false; } #endif return status; } 801462c: 2b 82 00 48 lw r2,(sp+72) */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected( Chain_Control *the_chain ) { if ( !_Chain_Is_empty(the_chain)) 8014630: 5c 52 ff f3 bne r2,r18,80145fc <_Timer_server_Body+0x154> watchdog = (Watchdog_Control *) _Chain_Get_unprotected( &fire_chain ); if ( watchdog != NULL ) { watchdog->state = WATCHDOG_INACTIVE; _ISR_Enable( level ); } else { _ISR_Enable( level ); 8014634: d0 04 00 00 wcsr IE,r4 8014638: e3 ff ff c6 bi 8014550 <_Timer_server_Body+0xa8> * TOD has been set forward. */ delta = snapshot - last_snapshot; _Watchdog_Adjust_to_chain( &watchdogs->Chain, delta, fire_chain ); } else if ( snapshot < last_snapshot ) { 801463c: 51 84 ff d4 bgeu r12,r4,801458c <_Timer_server_Body+0xe4> /* * 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 ); 8014640: b9 e0 08 00 mv r1,r15 8014644: 34 02 00 01 mvi r2,1 8014648: c8 8c 18 00 sub r3,r4,r12 801464c: f8 00 15 29 calli 8019af0 <_Watchdog_Adjust> 8014650: e3 ff ff cf bi 801458c <_Timer_server_Body+0xe4> Timer_server_Control *ts, Timer_Control *timer ) { if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) { _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); 8014654: ba 00 08 00 mv r1,r16 <== NOT EXECUTED 8014658: 34 42 00 10 addi r2,r2,16 <== NOT EXECUTED 801465c: f8 00 15 89 calli 8019c80 <_Watchdog_Insert> <== NOT EXECUTED 8014660: e3 ff ff cd bi 8014594 <_Timer_server_Body+0xec> <== NOT EXECUTED _Timer_server_Process_insertions( ts ); _ISR_Disable( level ); tmp = ts->insert_chain; if ( _Chain_Is_empty( insert_chain ) ) { ts->insert_chain = NULL; 8014664: 59 60 00 78 sw (r11+120),r0 do_loop = false; 8014668: 34 03 00 00 mvi r3,0 801466c: e3 ff ff df bi 80145e8 <_Timer_server_Body+0x140> * the active flag of the timer server is true. */ (*watchdog->routine)( watchdog->id, watchdog->user_data ); } } else { ts->active = false; 8014670: 31 60 00 7c sb (r11+124),r0 8014674: 2a e1 00 00 lw r1,(r23+0) 8014678: 34 21 00 01 addi r1,r1,1 801467c: 5a e1 00 00 sw (r23+0),r1 /* * Block until there is something to do. */ _Thread_Disable_dispatch(); _Thread_Set_state( ts->thread, STATES_DELAYING ); 8014680: 29 61 00 00 lw r1,(r11+0) 8014684: 34 02 00 08 mvi r2,8 8014688: f8 00 12 cd calli 80191bc <_Thread_Set_state> _Timer_server_Reset_interval_system_watchdog( ts ); 801468c: b9 60 08 00 mv r1,r11 8014690: fb ff ff 44 calli 80143a0 <_Timer_server_Reset_interval_system_watchdog> _Timer_server_Reset_tod_system_watchdog( ts ); 8014694: b9 60 08 00 mv r1,r11 8014698: fb ff ff 63 calli 8014424 <_Timer_server_Reset_tod_system_watchdog> _Thread_Enable_dispatch(); 801469c: f8 00 0f d0 calli 80185dc <_Thread_Enable_dispatch> static void _Timer_server_Stop_interval_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog ); 80146a0: bb 60 08 00 mv r1,fp _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; 80146a4: 31 78 00 7c sb (r11+124),r24 static void _Timer_server_Stop_interval_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->Interval_watchdogs.System_watchdog ); 80146a8: f8 00 15 e1 calli 8019e2c <_Watchdog_Remove> static void _Timer_server_Stop_tod_system_watchdog( Timer_server_Control *ts ) { _Watchdog_Remove( &ts->TOD_watchdogs.System_watchdog ); 80146ac: bb 20 08 00 mv r1,r25 80146b0: f8 00 15 df calli 8019e2c <_Watchdog_Remove> 80146b4: e3 ff ff a7 bi 8014550 <_Timer_server_Body+0xa8> =============================================================================== 080146b8 <_Timer_server_Schedule_operation_method>: static void _Timer_server_Schedule_operation_method( Timer_server_Control *ts, Timer_Control *timer ) { 80146b8: 37 9c ff f8 addi sp,sp,-8 80146bc: 5b 8b 00 08 sw (sp+8),r11 80146c0: 5b 9d 00 04 sw (sp+4),ra 80146c4: b8 20 58 00 mv r11,r1 if ( ts->insert_chain == NULL ) { 80146c8: 28 21 00 78 lw r1,(r1+120) static void _Timer_server_Schedule_operation_method( Timer_server_Control *ts, Timer_Control *timer ) { 80146cc: b8 40 18 00 mv r3,r2 if ( ts->insert_chain == NULL ) { 80146d0: 44 20 00 07 be r1,r0,80146ec <_Timer_server_Schedule_operation_method+0x34><== ALWAYS TAKEN * server is not preemptible, so we must be in interrupt context here. No * thread dispatch will happen until the timer server finishes its * critical section. We have to use the protected chain methods because * we may be interrupted by a higher priority interrupt. */ _Chain_Append( ts->insert_chain, &timer->Object.Node ); 80146d4: 29 61 00 78 lw r1,(r11+120) <== NOT EXECUTED 80146d8: f8 00 02 ea calli 8015280 <_Chain_Append> <== NOT EXECUTED } } 80146dc: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 80146e0: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED 80146e4: 37 9c 00 08 addi sp,sp,8 <== NOT EXECUTED 80146e8: c3 a0 00 00 ret <== NOT EXECUTED 80146ec: 78 01 08 04 mvhi r1,0x804 80146f0: 38 21 0c e0 ori r1,r1,0xce0 80146f4: 28 22 00 00 lw r2,(r1+0) 80146f8: 34 42 00 01 addi r2,r2,1 80146fc: 58 22 00 00 sw (r1+0),r2 * being inserted. This could result in an integer overflow. */ _Thread_Disable_dispatch(); if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) { 8014700: 28 61 00 38 lw r1,(r3+56) 8014704: 34 02 00 01 mvi r2,1 8014708: 44 22 00 28 be r1,r2,80147a8 <_Timer_server_Schedule_operation_method+0xf0> _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); if ( !ts->active ) { _Timer_server_Reset_interval_system_watchdog( ts ); } } else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) { 801470c: 34 02 00 03 mvi r2,3 8014710: 44 22 00 06 be r1,r2,8014728 <_Timer_server_Schedule_operation_method+0x70> if ( !ts->active ) { _Timer_server_Reset_tod_system_watchdog( ts ); } } _Thread_Enable_dispatch(); 8014714: f8 00 0f b2 calli 80185dc <_Thread_Enable_dispatch> * 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 ); } } 8014718: 2b 9d 00 04 lw ra,(sp+4) 801471c: 2b 8b 00 08 lw r11,(sp+8) 8014720: 37 9c 00 08 addi sp,sp,8 8014724: c3 a0 00 00 ret } else if ( timer->the_class == TIMER_TIME_OF_DAY_ON_TASK ) { /* * We have to advance the last known seconds value of the server and update * the watchdog chain accordingly. */ _ISR_Disable( level ); 8014728: 90 00 38 00 rcsr r7,IE 801472c: 34 01 ff fe mvi r1,-2 8014730: a0 e1 08 00 and r1,r7,r1 8014734: d0 01 00 00 wcsr IE,r1 initialized = false; } #endif return status; } 8014738: 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(); 801473c: 78 01 08 04 mvhi r1,0x804 last_snapshot = ts->TOD_watchdogs.last_snapshot; 8014740: 29 64 00 74 lw r4,(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(); 8014744: 38 21 0d 88 ori r1,r1,0xd88 RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); 8014748: 35 65 00 6c addi r5,r11,108 801474c: 28 21 00 00 lw r1,(r1+0) last_snapshot = ts->TOD_watchdogs.last_snapshot; if ( !_Chain_Is_empty( &ts->TOD_watchdogs.Chain ) ) { 8014750: 44 45 00 0a be r2,r5,8014778 <_Timer_server_Schedule_operation_method+0xc0> first_watchdog = _Watchdog_First( &ts->TOD_watchdogs.Chain ); delta_interval = first_watchdog->delta_interval; 8014754: 28 46 00 10 lw r6,(r2+16) } } else { /* * Someone put us in the past. */ delta = last_snapshot - snapshot; 8014758: b4 c4 28 00 add r5,r6,r4 delta_interval += delta; 801475c: c8 a1 28 00 sub r5,r5,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 ) { 8014760: 50 81 00 05 bgeu r4,r1,8014774 <_Timer_server_Schedule_operation_method+0xbc> /* * We advanced in time. */ delta = snapshot - last_snapshot; 8014764: c8 24 20 00 sub r4,r1,r4 if (delta_interval > delta) { delta_interval -= delta; } else { delta_interval = 0; 8014768: 34 05 00 00 mvi r5,0 if ( snapshot > last_snapshot ) { /* * We advanced in time. */ delta = snapshot - last_snapshot; if (delta_interval > delta) { 801476c: 50 86 00 02 bgeu r4,r6,8014774 <_Timer_server_Schedule_operation_method+0xbc><== NEVER TAKEN delta_interval -= delta; 8014770: c8 c4 28 00 sub r5,r6,r4 * Someone put us in the past. */ delta = last_snapshot - snapshot; delta_interval += delta; } first_watchdog->delta_interval = delta_interval; 8014774: 58 45 00 10 sw (r2+16),r5 } ts->TOD_watchdogs.last_snapshot = snapshot; 8014778: 59 61 00 74 sw (r11+116),r1 _ISR_Enable( level ); 801477c: d0 07 00 00 wcsr IE,r7 _Watchdog_Insert( &ts->TOD_watchdogs.Chain, &timer->Ticker ); 8014780: 35 61 00 68 addi r1,r11,104 8014784: 34 62 00 10 addi r2,r3,16 8014788: f8 00 15 3e calli 8019c80 <_Watchdog_Insert> if ( !ts->active ) { 801478c: 41 61 00 7c lbu r1,(r11+124) 8014790: 20 21 00 ff andi r1,r1,0xff 8014794: 5c 20 ff e0 bne r1,r0,8014714 <_Timer_server_Schedule_operation_method+0x5c> _Timer_server_Reset_tod_system_watchdog( ts ); 8014798: b9 60 08 00 mv r1,r11 801479c: fb ff ff 22 calli 8014424 <_Timer_server_Reset_tod_system_watchdog> } } _Thread_Enable_dispatch(); 80147a0: f8 00 0f 8f calli 80185dc <_Thread_Enable_dispatch> 80147a4: e3 ff ff dd bi 8014718 <_Timer_server_Schedule_operation_method+0x60> if ( timer->the_class == TIMER_INTERVAL_ON_TASK ) { /* * We have to advance the last known ticks value of the server and update * the watchdog chain accordingly. */ _ISR_Disable( level ); 80147a8: 90 00 20 00 rcsr r4,IE 80147ac: 34 01 ff fe mvi r1,-2 80147b0: a0 81 08 00 and r1,r4,r1 80147b4: d0 01 00 00 wcsr IE,r1 snapshot = _Watchdog_Ticks_since_boot; 80147b8: 78 01 08 04 mvhi r1,0x804 80147bc: 38 21 0e 10 ori r1,r1,0xe10 initialized = false; } #endif return status; } 80147c0: 29 62 00 30 lw r2,(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; 80147c4: 28 21 00 00 lw r1,(r1+0) last_snapshot = ts->Interval_watchdogs.last_snapshot; 80147c8: 29 66 00 3c lw r6,(r11+60) 80147cc: 35 65 00 34 addi r5,r11,52 if ( !_Chain_Is_empty( &ts->Interval_watchdogs.Chain ) ) { 80147d0: 44 45 00 07 be r2,r5,80147ec <_Timer_server_Schedule_operation_method+0x134> /* * We assume adequate unsigned arithmetic here. */ delta = snapshot - last_snapshot; delta_interval = first_watchdog->delta_interval; 80147d4: 28 47 00 10 lw r7,(r2+16) first_watchdog = _Watchdog_First( &ts->Interval_watchdogs.Chain ); /* * We assume adequate unsigned arithmetic here. */ delta = snapshot - last_snapshot; 80147d8: c8 26 30 00 sub r6,r1,r6 delta_interval = first_watchdog->delta_interval; if (delta_interval > delta) { delta_interval -= delta; } else { delta_interval = 0; 80147dc: 34 05 00 00 mvi r5,0 * We assume adequate unsigned arithmetic here. */ delta = snapshot - last_snapshot; delta_interval = first_watchdog->delta_interval; if (delta_interval > delta) { 80147e0: 50 c7 00 02 bgeu r6,r7,80147e8 <_Timer_server_Schedule_operation_method+0x130> delta_interval -= delta; 80147e4: c8 e6 28 00 sub r5,r7,r6 } else { delta_interval = 0; } first_watchdog->delta_interval = delta_interval; 80147e8: 58 45 00 10 sw (r2+16),r5 } ts->Interval_watchdogs.last_snapshot = snapshot; 80147ec: 59 61 00 3c sw (r11+60),r1 _ISR_Enable( level ); 80147f0: d0 04 00 00 wcsr IE,r4 _Watchdog_Insert( &ts->Interval_watchdogs.Chain, &timer->Ticker ); 80147f4: 35 61 00 30 addi r1,r11,48 80147f8: 34 62 00 10 addi r2,r3,16 80147fc: f8 00 15 21 calli 8019c80 <_Watchdog_Insert> if ( !ts->active ) { 8014800: 41 61 00 7c lbu r1,(r11+124) 8014804: 20 21 00 ff andi r1,r1,0xff 8014808: 5c 20 ff c3 bne r1,r0,8014714 <_Timer_server_Schedule_operation_method+0x5c> _Timer_server_Reset_interval_system_watchdog( ts ); 801480c: b9 60 08 00 mv r1,r11 8014810: fb ff fe e4 calli 80143a0 <_Timer_server_Reset_interval_system_watchdog> if ( !ts->active ) { _Timer_server_Reset_tod_system_watchdog( ts ); } } _Thread_Enable_dispatch(); 8014814: f8 00 0f 72 calli 80185dc <_Thread_Enable_dispatch> 8014818: e3 ff ff c0 bi 8014718 <_Timer_server_Schedule_operation_method+0x60> =============================================================================== 08006904 <_User_extensions_Fatal>: void _User_extensions_Fatal ( Internal_errors_Source the_source, bool is_internal, Internal_errors_t the_error ) { 8006904: 37 9c ff e8 addi sp,sp,-24 8006908: 5b 8b 00 18 sw (sp+24),r11 800690c: 5b 8c 00 14 sw (sp+20),r12 8006910: 5b 8d 00 10 sw (sp+16),r13 8006914: 5b 8e 00 0c sw (sp+12),r14 8006918: 5b 8f 00 08 sw (sp+8),r15 800691c: 5b 9d 00 04 sw (sp+4),ra the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.fatal != NULL ) (*the_extension->Callouts.fatal)( the_source, is_internal, the_error ); } } 8006920: 78 0c 08 01 mvhi r12,0x801 8006924: 39 8c 4a 64 ori r12,r12,0x4a64 8006928: 29 8b 00 08 lw r11,(r12+8) void _User_extensions_Fatal ( Internal_errors_Source the_source, bool is_internal, Internal_errors_t the_error ) { 800692c: b8 20 78 00 mv r15,r1 8006930: b8 60 70 00 mv r14,r3 8006934: 20 4d 00 ff andi r13,r2,0xff Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _Chain_Last( &_User_extensions_List ); 8006938: 45 6c 00 09 be r11,r12,800695c <_User_extensions_Fatal+0x58><== NEVER TAKEN !_Chain_Is_head( &_User_extensions_List, the_node ) ; the_node = the_node->previous ) { the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.fatal != NULL ) 800693c: 29 64 00 30 lw r4,(r11+48) (*the_extension->Callouts.fatal)( the_source, is_internal, the_error ); 8006940: b9 e0 08 00 mv r1,r15 8006944: b9 a0 10 00 mv r2,r13 8006948: b9 c0 18 00 mv r3,r14 !_Chain_Is_head( &_User_extensions_List, the_node ) ; the_node = the_node->previous ) { the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.fatal != NULL ) 800694c: 44 80 00 02 be r4,r0,8006954 <_User_extensions_Fatal+0x50> (*the_extension->Callouts.fatal)( the_source, is_internal, the_error ); 8006950: d8 80 00 00 call r4 Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _Chain_Last( &_User_extensions_List ); !_Chain_Is_head( &_User_extensions_List, the_node ) ; the_node = the_node->previous ) { 8006954: 29 6b 00 04 lw r11,(r11+4) ) { Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _Chain_Last( &_User_extensions_List ); 8006958: 5d 6c ff f9 bne r11,r12,800693c <_User_extensions_Fatal+0x38> the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.fatal != NULL ) (*the_extension->Callouts.fatal)( the_source, is_internal, the_error ); } } 800695c: 2b 9d 00 04 lw ra,(sp+4) 8006960: 2b 8b 00 18 lw r11,(sp+24) 8006964: 2b 8c 00 14 lw r12,(sp+20) 8006968: 2b 8d 00 10 lw r13,(sp+16) 800696c: 2b 8e 00 0c lw r14,(sp+12) 8006970: 2b 8f 00 08 lw r15,(sp+8) 8006974: 37 9c 00 18 addi sp,sp,24 8006978: c3 a0 00 00 ret =============================================================================== 08006738 <_User_extensions_Handler_initialization>: #include #include #include void _User_extensions_Handler_initialization(void) { 8006738: 37 9c ff ec addi sp,sp,-20 800673c: 5b 8b 00 14 sw (sp+20),r11 8006740: 5b 8c 00 10 sw (sp+16),r12 8006744: 5b 8d 00 0c sw (sp+12),r13 8006748: 5b 8e 00 08 sw (sp+8),r14 800674c: 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; 8006750: 78 03 08 01 mvhi r3,0x801 8006754: 38 63 40 c4 ori r3,r3,0x40c4 ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; 8006758: 78 02 08 01 mvhi r2,0x801 800675c: 78 05 08 01 mvhi r5,0x801 8006760: 78 01 08 01 mvhi r1,0x801 8006764: 78 04 08 01 mvhi r4,0x801 initial_extensions = Configuration.User_extension_table; 8006768: 28 6b 00 40 lw r11,(r3+64) 800676c: 38 42 4a 64 ori r2,r2,0x4a64 8006770: 38 21 48 ec ori r1,r1,0x48ec 8006774: 38 a5 4a 68 ori r5,r5,0x4a68 8006778: 38 84 48 f0 ori r4,r4,0x48f0 800677c: 58 45 00 00 sw (r2+0),r5 head->previous = NULL; 8006780: 58 40 00 04 sw (r2+4),r0 tail->previous = head; 8006784: 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; 8006788: 58 24 00 00 sw (r1+0),r4 head->previous = NULL; 800678c: 58 20 00 04 sw (r1+4),r0 tail->previous = head; 8006790: 58 21 00 08 sw (r1+8),r1 User_extensions_Control *extension; uint32_t i; uint32_t number_of_extensions; User_extensions_Table *initial_extensions; number_of_extensions = Configuration.number_of_initial_extensions; 8006794: 28 6e 00 3c lw r14,(r3+60) initial_extensions = Configuration.User_extension_table; _Chain_Initialize_empty( &_User_extensions_List ); _Chain_Initialize_empty( &_User_extensions_Switches_list ); if ( initial_extensions ) { 8006798: 45 60 00 26 be r11,r0,8006830 <_User_extensions_Handler_initialization+0xf8><== NEVER TAKEN extension = (User_extensions_Control *) _Workspace_Allocate_or_fatal_error( number_of_extensions * sizeof( User_extensions_Control ) 800679c: b5 ce 68 00 add r13,r14,r14 80067a0: b5 ae 68 00 add r13,r13,r14 80067a4: b5 ad 68 00 add r13,r13,r13 80067a8: b5 ad 68 00 add r13,r13,r13 80067ac: b5 ae 68 00 add r13,r13,r14 80067b0: b5 ad 68 00 add r13,r13,r13 80067b4: b5 ad 68 00 add r13,r13,r13 _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( 80067b8: b9 a0 08 00 mv r1,r13 80067bc: f8 00 01 f9 calli 8006fa0 <_Workspace_Allocate_or_fatal_error> number_of_extensions * sizeof( User_extensions_Control ) ); memset ( 80067c0: 34 02 00 00 mvi r2,0 80067c4: b9 a0 18 00 mv r3,r13 _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( 80067c8: b8 20 60 00 mv r12,r1 number_of_extensions * sizeof( User_extensions_Control ) ); memset ( 80067cc: f8 00 1c 79 calli 800d9b0 extension, 0, number_of_extensions * sizeof( User_extensions_Control ) ); for ( i = 0 ; i < number_of_extensions ; i++ ) { 80067d0: 45 c0 00 18 be r14,r0,8006830 <_User_extensions_Handler_initialization+0xf8><== NEVER TAKEN 80067d4: 34 0d 00 00 mvi r13,0 RTEMS_INLINE_ROUTINE void _User_extensions_Add_set_with_table( User_extensions_Control *extension, const User_extensions_Table *extension_table ) { extension->Callouts = *extension_table; 80067d8: 29 62 00 00 lw r2,(r11+0) _User_extensions_Add_set( extension ); 80067dc: b9 80 08 00 mv r1,r12 80067e0: 35 ad 00 01 addi r13,r13,1 RTEMS_INLINE_ROUTINE void _User_extensions_Add_set_with_table( User_extensions_Control *extension, const User_extensions_Table *extension_table ) { extension->Callouts = *extension_table; 80067e4: 59 82 00 14 sw (r12+20),r2 80067e8: 29 62 00 04 lw r2,(r11+4) 80067ec: 59 82 00 18 sw (r12+24),r2 80067f0: 29 62 00 08 lw r2,(r11+8) 80067f4: 59 82 00 1c sw (r12+28),r2 80067f8: 29 62 00 0c lw r2,(r11+12) 80067fc: 59 82 00 20 sw (r12+32),r2 8006800: 29 62 00 10 lw r2,(r11+16) 8006804: 59 82 00 24 sw (r12+36),r2 8006808: 29 62 00 14 lw r2,(r11+20) 800680c: 59 82 00 28 sw (r12+40),r2 8006810: 29 62 00 18 lw r2,(r11+24) 8006814: 59 82 00 2c sw (r12+44),r2 8006818: 29 62 00 1c lw r2,(r11+28) 800681c: 35 6b 00 20 addi r11,r11,32 8006820: 59 82 00 30 sw (r12+48),r2 _User_extensions_Add_set( extension ); 8006824: f8 00 10 e6 calli 800abbc <_User_extensions_Add_set> _User_extensions_Add_set_with_table (extension, &initial_extensions[i]); extension++; 8006828: 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++ ) { 800682c: 55 cd ff eb bgu r14,r13,80067d8 <_User_extensions_Handler_initialization+0xa0> _User_extensions_Add_set_with_table (extension, &initial_extensions[i]); extension++; } } } 8006830: 2b 9d 00 04 lw ra,(sp+4) 8006834: 2b 8b 00 14 lw r11,(sp+20) 8006838: 2b 8c 00 10 lw r12,(sp+16) 800683c: 2b 8d 00 0c lw r13,(sp+12) 8006840: 2b 8e 00 08 lw r14,(sp+8) 8006844: 37 9c 00 14 addi sp,sp,20 8006848: c3 a0 00 00 ret =============================================================================== 0800684c <_User_extensions_Thread_begin>: #include void _User_extensions_Thread_begin ( Thread_Control *executing ) { 800684c: 37 9c ff f0 addi sp,sp,-16 8006850: 5b 8b 00 10 sw (sp+16),r11 8006854: 5b 8c 00 0c sw (sp+12),r12 8006858: 5b 8d 00 08 sw (sp+8),r13 800685c: 5b 9d 00 04 sw (sp+4),ra the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.fatal != NULL ) (*the_extension->Callouts.fatal)( the_source, is_internal, the_error ); } } 8006860: 78 02 08 01 mvhi r2,0x801 8006864: 38 42 4a 64 ori r2,r2,0x4a64 8006868: 28 4b 00 00 lw r11,(r2+0) ) { Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _Chain_First( &_User_extensions_List ); 800686c: 78 0c 08 01 mvhi r12,0x801 8006870: 39 8c 4a 68 ori r12,r12,0x4a68 #include void _User_extensions_Thread_begin ( Thread_Control *executing ) { 8006874: b8 20 68 00 mv r13,r1 Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _Chain_First( &_User_extensions_List ); 8006878: 45 6c 00 07 be r11,r12,8006894 <_User_extensions_Thread_begin+0x48><== NEVER TAKEN !_Chain_Is_tail( &_User_extensions_List, the_node ) ; the_node = the_node->next ) { the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.thread_begin != NULL ) 800687c: 29 62 00 28 lw r2,(r11+40) (*the_extension->Callouts.thread_begin)( executing ); 8006880: b9 a0 08 00 mv r1,r13 !_Chain_Is_tail( &_User_extensions_List, the_node ) ; the_node = the_node->next ) { the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.thread_begin != NULL ) 8006884: 44 40 00 02 be r2,r0,800688c <_User_extensions_Thread_begin+0x40> (*the_extension->Callouts.thread_begin)( executing ); 8006888: d8 40 00 00 call r2 Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _Chain_First( &_User_extensions_List ); !_Chain_Is_tail( &_User_extensions_List, the_node ) ; the_node = the_node->next ) { 800688c: 29 6b 00 00 lw r11,(r11+0) ) { Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _Chain_First( &_User_extensions_List ); 8006890: 5d 6c ff fb bne r11,r12,800687c <_User_extensions_Thread_begin+0x30> the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.thread_begin != NULL ) (*the_extension->Callouts.thread_begin)( executing ); } } 8006894: 2b 9d 00 04 lw ra,(sp+4) 8006898: 2b 8b 00 10 lw r11,(sp+16) 800689c: 2b 8c 00 0c lw r12,(sp+12) 80068a0: 2b 8d 00 08 lw r13,(sp+8) 80068a4: 37 9c 00 10 addi sp,sp,16 80068a8: c3 a0 00 00 ret =============================================================================== 0800697c <_User_extensions_Thread_create>: #include bool _User_extensions_Thread_create ( Thread_Control *the_thread ) { 800697c: 37 9c ff ec addi sp,sp,-20 8006980: 5b 8b 00 14 sw (sp+20),r11 8006984: 5b 8c 00 10 sw (sp+16),r12 8006988: 5b 8d 00 0c sw (sp+12),r13 800698c: 5b 8e 00 08 sw (sp+8),r14 8006990: 5b 9d 00 04 sw (sp+4),ra return false; } } return true; } 8006994: 78 02 08 01 mvhi r2,0x801 8006998: 38 42 4a 64 ori r2,r2,0x4a64 800699c: 28 4b 00 00 lw r11,(r2+0) { Chain_Node *the_node; User_extensions_Control *the_extension; bool status; for ( the_node = _Chain_First( &_User_extensions_List ); 80069a0: 78 0c 08 01 mvhi r12,0x801 80069a4: 39 8c 4a 68 ori r12,r12,0x4a68 #include bool _User_extensions_Thread_create ( Thread_Control *the_thread ) { 80069a8: b8 20 70 00 mv r14,r1 if ( !status ) return false; } } return true; 80069ac: 34 01 00 01 mvi r1,1 { Chain_Node *the_node; User_extensions_Control *the_extension; bool status; for ( the_node = _Chain_First( &_User_extensions_List ); 80069b0: 45 6c 00 0c be r11,r12,80069e0 <_User_extensions_Thread_create+0x64><== NEVER TAKEN the_node = the_node->next ) { the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.thread_create != NULL ) { status = (*the_extension->Callouts.thread_create)( 80069b4: 78 0d 08 01 mvhi r13,0x801 80069b8: 39 ad 4d b4 ori r13,r13,0x4db4 !_Chain_Is_tail( &_User_extensions_List, the_node ) ; the_node = the_node->next ) { the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.thread_create != NULL ) { 80069bc: 29 63 00 14 lw r3,(r11+20) status = (*the_extension->Callouts.thread_create)( 80069c0: b9 c0 10 00 mv r2,r14 !_Chain_Is_tail( &_User_extensions_List, the_node ) ; the_node = the_node->next ) { the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.thread_create != NULL ) { 80069c4: 44 60 00 04 be r3,r0,80069d4 <_User_extensions_Thread_create+0x58> status = (*the_extension->Callouts.thread_create)( 80069c8: 29 a1 00 0c lw r1,(r13+12) 80069cc: d8 60 00 00 call r3 _Thread_Executing, the_thread ); if ( !status ) 80069d0: 44 20 00 0b be r1,r0,80069fc <_User_extensions_Thread_create+0x80> User_extensions_Control *the_extension; bool status; for ( the_node = _Chain_First( &_User_extensions_List ); !_Chain_Is_tail( &_User_extensions_List, the_node ) ; the_node = the_node->next ) { 80069d4: 29 6b 00 00 lw r11,(r11+0) { Chain_Node *the_node; User_extensions_Control *the_extension; bool status; for ( the_node = _Chain_First( &_User_extensions_List ); 80069d8: 5d 6c ff f9 bne r11,r12,80069bc <_User_extensions_Thread_create+0x40> if ( !status ) return false; } } return true; 80069dc: 34 01 00 01 mvi r1,1 } 80069e0: 2b 9d 00 04 lw ra,(sp+4) 80069e4: 2b 8b 00 14 lw r11,(sp+20) 80069e8: 2b 8c 00 10 lw r12,(sp+16) 80069ec: 2b 8d 00 0c lw r13,(sp+12) 80069f0: 2b 8e 00 08 lw r14,(sp+8) 80069f4: 37 9c 00 14 addi sp,sp,20 80069f8: c3 a0 00 00 ret status = (*the_extension->Callouts.thread_create)( _Thread_Executing, the_thread ); if ( !status ) return false; 80069fc: 34 01 00 00 mvi r1,0 } } return true; } 8006a00: 2b 9d 00 04 lw ra,(sp+4) 8006a04: 2b 8b 00 14 lw r11,(sp+20) 8006a08: 2b 8c 00 10 lw r12,(sp+16) 8006a0c: 2b 8d 00 0c lw r13,(sp+12) 8006a10: 2b 8e 00 08 lw r14,(sp+8) 8006a14: 37 9c 00 14 addi sp,sp,20 8006a18: c3 a0 00 00 ret =============================================================================== 08006a1c <_User_extensions_Thread_delete>: #include void _User_extensions_Thread_delete ( Thread_Control *the_thread ) { 8006a1c: 37 9c ff ec addi sp,sp,-20 8006a20: 5b 8b 00 14 sw (sp+20),r11 8006a24: 5b 8c 00 10 sw (sp+16),r12 8006a28: 5b 8d 00 0c sw (sp+12),r13 8006a2c: 5b 8e 00 08 sw (sp+8),r14 8006a30: 5b 9d 00 04 sw (sp+4),ra (*the_extension->Callouts.thread_delete)( _Thread_Executing, the_thread ); } } 8006a34: 78 0c 08 01 mvhi r12,0x801 8006a38: 39 8c 4a 64 ori r12,r12,0x4a64 8006a3c: 29 8b 00 08 lw r11,(r12+8) #include void _User_extensions_Thread_delete ( Thread_Control *the_thread ) { 8006a40: b8 20 70 00 mv r14,r1 Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _Chain_Last( &_User_extensions_List ); 8006a44: 45 6c 00 0a be r11,r12,8006a6c <_User_extensions_Thread_delete+0x50><== NEVER TAKEN the_node = the_node->previous ) { the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.thread_delete != NULL ) (*the_extension->Callouts.thread_delete)( 8006a48: 78 0d 08 01 mvhi r13,0x801 8006a4c: 39 ad 4d b4 ori r13,r13,0x4db4 !_Chain_Is_head( &_User_extensions_List, the_node ) ; the_node = the_node->previous ) { the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.thread_delete != NULL ) 8006a50: 29 63 00 20 lw r3,(r11+32) (*the_extension->Callouts.thread_delete)( 8006a54: b9 c0 10 00 mv r2,r14 !_Chain_Is_head( &_User_extensions_List, the_node ) ; the_node = the_node->previous ) { the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.thread_delete != NULL ) 8006a58: 44 60 00 03 be r3,r0,8006a64 <_User_extensions_Thread_delete+0x48> (*the_extension->Callouts.thread_delete)( 8006a5c: 29 a1 00 0c lw r1,(r13+12) 8006a60: d8 60 00 00 call r3 Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _Chain_Last( &_User_extensions_List ); !_Chain_Is_head( &_User_extensions_List, the_node ) ; the_node = the_node->previous ) { 8006a64: 29 6b 00 04 lw r11,(r11+4) ) { Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _Chain_Last( &_User_extensions_List ); 8006a68: 5d 6c ff fa bne r11,r12,8006a50 <_User_extensions_Thread_delete+0x34> (*the_extension->Callouts.thread_delete)( _Thread_Executing, the_thread ); } } 8006a6c: 2b 9d 00 04 lw ra,(sp+4) 8006a70: 2b 8b 00 14 lw r11,(sp+20) 8006a74: 2b 8c 00 10 lw r12,(sp+16) 8006a78: 2b 8d 00 0c lw r13,(sp+12) 8006a7c: 2b 8e 00 08 lw r14,(sp+8) 8006a80: 37 9c 00 14 addi sp,sp,20 8006a84: c3 a0 00 00 ret =============================================================================== 080068ac <_User_extensions_Thread_exitted>: void _User_extensions_Thread_exitted ( Thread_Control *executing ) { 80068ac: 37 9c ff f0 addi sp,sp,-16 80068b0: 5b 8b 00 10 sw (sp+16),r11 80068b4: 5b 8c 00 0c sw (sp+12),r12 80068b8: 5b 8d 00 08 sw (sp+8),r13 80068bc: 5b 9d 00 04 sw (sp+4),ra the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.fatal != NULL ) (*the_extension->Callouts.fatal)( the_source, is_internal, the_error ); } } 80068c0: 78 0c 08 01 mvhi r12,0x801 80068c4: 39 8c 4a 64 ori r12,r12,0x4a64 80068c8: 29 8b 00 08 lw r11,(r12+8) } void _User_extensions_Thread_exitted ( Thread_Control *executing ) { 80068cc: b8 20 68 00 mv r13,r1 Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _Chain_Last( &_User_extensions_List ); 80068d0: 45 6c 00 07 be r11,r12,80068ec <_User_extensions_Thread_exitted+0x40><== NEVER TAKEN !_Chain_Is_head( &_User_extensions_List, the_node ) ; the_node = the_node->previous ) { the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.thread_exitted != NULL ) 80068d4: 29 62 00 2c lw r2,(r11+44) (*the_extension->Callouts.thread_exitted)( executing ); 80068d8: b9 a0 08 00 mv r1,r13 !_Chain_Is_head( &_User_extensions_List, the_node ) ; the_node = the_node->previous ) { the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.thread_exitted != NULL ) 80068dc: 44 40 00 02 be r2,r0,80068e4 <_User_extensions_Thread_exitted+0x38> (*the_extension->Callouts.thread_exitted)( executing ); 80068e0: d8 40 00 00 call r2 Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _Chain_Last( &_User_extensions_List ); !_Chain_Is_head( &_User_extensions_List, the_node ) ; the_node = the_node->previous ) { 80068e4: 29 6b 00 04 lw r11,(r11+4) ) { Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _Chain_Last( &_User_extensions_List ); 80068e8: 5d 6c ff fb bne r11,r12,80068d4 <_User_extensions_Thread_exitted+0x28> the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.thread_exitted != NULL ) (*the_extension->Callouts.thread_exitted)( executing ); } } 80068ec: 2b 9d 00 04 lw ra,(sp+4) 80068f0: 2b 8b 00 10 lw r11,(sp+16) 80068f4: 2b 8c 00 0c lw r12,(sp+12) 80068f8: 2b 8d 00 08 lw r13,(sp+8) 80068fc: 37 9c 00 10 addi sp,sp,16 8006900: c3 a0 00 00 ret =============================================================================== 08007a74 <_User_extensions_Thread_restart>: #include void _User_extensions_Thread_restart ( Thread_Control *the_thread ) { 8007a74: 37 9c ff ec addi sp,sp,-20 8007a78: 5b 8b 00 14 sw (sp+20),r11 8007a7c: 5b 8c 00 10 sw (sp+16),r12 8007a80: 5b 8d 00 0c sw (sp+12),r13 8007a84: 5b 8e 00 08 sw (sp+8),r14 8007a88: 5b 9d 00 04 sw (sp+4),ra (*the_extension->Callouts.thread_restart)( _Thread_Executing, the_thread ); } } 8007a8c: 78 02 08 02 mvhi r2,0x802 8007a90: 38 42 0a ac ori r2,r2,0xaac 8007a94: 28 4b 00 00 lw r11,(r2+0) ) { Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _Chain_First( &_User_extensions_List ); 8007a98: 78 0c 08 02 mvhi r12,0x802 8007a9c: 39 8c 0a b0 ori r12,r12,0xab0 #include void _User_extensions_Thread_restart ( Thread_Control *the_thread ) { 8007aa0: b8 20 70 00 mv r14,r1 Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _Chain_First( &_User_extensions_List ); 8007aa4: 45 6c 00 0a be r11,r12,8007acc <_User_extensions_Thread_restart+0x58><== NEVER TAKEN the_node = the_node->next ) { the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.thread_restart != NULL ) (*the_extension->Callouts.thread_restart)( 8007aa8: 78 0d 08 02 mvhi r13,0x802 8007aac: 39 ad 0d fc ori r13,r13,0xdfc !_Chain_Is_tail( &_User_extensions_List, the_node ) ; the_node = the_node->next ) { the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.thread_restart != NULL ) 8007ab0: 29 63 00 1c lw r3,(r11+28) (*the_extension->Callouts.thread_restart)( 8007ab4: b9 c0 10 00 mv r2,r14 !_Chain_Is_tail( &_User_extensions_List, the_node ) ; the_node = the_node->next ) { the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.thread_restart != NULL ) 8007ab8: 44 60 00 03 be r3,r0,8007ac4 <_User_extensions_Thread_restart+0x50> (*the_extension->Callouts.thread_restart)( 8007abc: 29 a1 00 0c lw r1,(r13+12) 8007ac0: d8 60 00 00 call r3 Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _Chain_First( &_User_extensions_List ); !_Chain_Is_tail( &_User_extensions_List, the_node ) ; the_node = the_node->next ) { 8007ac4: 29 6b 00 00 lw r11,(r11+0) ) { Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _Chain_First( &_User_extensions_List ); 8007ac8: 5d 6c ff fa bne r11,r12,8007ab0 <_User_extensions_Thread_restart+0x3c> (*the_extension->Callouts.thread_restart)( _Thread_Executing, the_thread ); } } 8007acc: 2b 9d 00 04 lw ra,(sp+4) 8007ad0: 2b 8b 00 14 lw r11,(sp+20) 8007ad4: 2b 8c 00 10 lw r12,(sp+16) 8007ad8: 2b 8d 00 0c lw r13,(sp+12) 8007adc: 2b 8e 00 08 lw r14,(sp+8) 8007ae0: 37 9c 00 14 addi sp,sp,20 8007ae4: c3 a0 00 00 ret =============================================================================== 08006a88 <_User_extensions_Thread_start>: #include void _User_extensions_Thread_start ( Thread_Control *the_thread ) { 8006a88: 37 9c ff ec addi sp,sp,-20 8006a8c: 5b 8b 00 14 sw (sp+20),r11 8006a90: 5b 8c 00 10 sw (sp+16),r12 8006a94: 5b 8d 00 0c sw (sp+12),r13 8006a98: 5b 8e 00 08 sw (sp+8),r14 8006a9c: 5b 9d 00 04 sw (sp+4),ra (*the_extension->Callouts.thread_start)( _Thread_Executing, the_thread ); } } 8006aa0: 78 02 08 01 mvhi r2,0x801 8006aa4: 38 42 4a 64 ori r2,r2,0x4a64 8006aa8: 28 4b 00 00 lw r11,(r2+0) ) { Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _Chain_First( &_User_extensions_List ); 8006aac: 78 0c 08 01 mvhi r12,0x801 8006ab0: 39 8c 4a 68 ori r12,r12,0x4a68 #include void _User_extensions_Thread_start ( Thread_Control *the_thread ) { 8006ab4: b8 20 70 00 mv r14,r1 Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _Chain_First( &_User_extensions_List ); 8006ab8: 45 6c 00 0a be r11,r12,8006ae0 <_User_extensions_Thread_start+0x58><== NEVER TAKEN the_node = the_node->next ) { the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.thread_start != NULL ) (*the_extension->Callouts.thread_start)( 8006abc: 78 0d 08 01 mvhi r13,0x801 8006ac0: 39 ad 4d b4 ori r13,r13,0x4db4 !_Chain_Is_tail( &_User_extensions_List, the_node ) ; the_node = the_node->next ) { the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.thread_start != NULL ) 8006ac4: 29 63 00 18 lw r3,(r11+24) (*the_extension->Callouts.thread_start)( 8006ac8: b9 c0 10 00 mv r2,r14 !_Chain_Is_tail( &_User_extensions_List, the_node ) ; the_node = the_node->next ) { the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.thread_start != NULL ) 8006acc: 44 60 00 03 be r3,r0,8006ad8 <_User_extensions_Thread_start+0x50> (*the_extension->Callouts.thread_start)( 8006ad0: 29 a1 00 0c lw r1,(r13+12) 8006ad4: d8 60 00 00 call r3 Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _Chain_First( &_User_extensions_List ); !_Chain_Is_tail( &_User_extensions_List, the_node ) ; the_node = the_node->next ) { 8006ad8: 29 6b 00 00 lw r11,(r11+0) ) { Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _Chain_First( &_User_extensions_List ); 8006adc: 5d 6c ff fa bne r11,r12,8006ac4 <_User_extensions_Thread_start+0x3c> (*the_extension->Callouts.thread_start)( _Thread_Executing, the_thread ); } } 8006ae0: 2b 9d 00 04 lw ra,(sp+4) 8006ae4: 2b 8b 00 14 lw r11,(sp+20) 8006ae8: 2b 8c 00 10 lw r12,(sp+16) 8006aec: 2b 8d 00 0c lw r13,(sp+12) 8006af0: 2b 8e 00 08 lw r14,(sp+8) 8006af4: 37 9c 00 14 addi sp,sp,20 8006af8: c3 a0 00 00 ret =============================================================================== 08006afc <_User_extensions_Thread_switch>: void _User_extensions_Thread_switch ( Thread_Control *executing, Thread_Control *heir ) { 8006afc: 37 9c ff ec addi sp,sp,-20 8006b00: 5b 8b 00 14 sw (sp+20),r11 8006b04: 5b 8c 00 10 sw (sp+16),r12 8006b08: 5b 8d 00 0c sw (sp+12),r13 8006b0c: 5b 8e 00 08 sw (sp+8),r14 8006b10: 5b 9d 00 04 sw (sp+4),ra the_extension_switch = (User_extensions_Switch_control *) the_node; (*the_extension_switch->thread_switch)( executing, heir ); } } 8006b14: 78 03 08 01 mvhi r3,0x801 8006b18: 38 63 48 ec ori r3,r3,0x48ec 8006b1c: 28 6b 00 00 lw r11,(r3+0) ) { Chain_Node *the_node; User_extensions_Switch_control *the_extension_switch; for ( the_node = _Chain_First( &_User_extensions_Switches_list ); 8006b20: 78 0c 08 01 mvhi r12,0x801 8006b24: 39 8c 48 f0 ori r12,r12,0x48f0 void _User_extensions_Thread_switch ( Thread_Control *executing, Thread_Control *heir ) { 8006b28: b8 20 70 00 mv r14,r1 8006b2c: b8 40 68 00 mv r13,r2 Chain_Node *the_node; User_extensions_Switch_control *the_extension_switch; for ( the_node = _Chain_First( &_User_extensions_Switches_list ); 8006b30: 45 6c 00 07 be r11,r12,8006b4c <_User_extensions_Thread_switch+0x50><== NEVER TAKEN !_Chain_Is_tail( &_User_extensions_Switches_list, the_node ) ; the_node = the_node->next ) { the_extension_switch = (User_extensions_Switch_control *) the_node; (*the_extension_switch->thread_switch)( executing, heir ); 8006b34: 29 63 00 08 lw r3,(r11+8) 8006b38: b9 c0 08 00 mv r1,r14 8006b3c: b9 a0 10 00 mv r2,r13 8006b40: d8 60 00 00 call r3 Chain_Node *the_node; User_extensions_Switch_control *the_extension_switch; for ( the_node = _Chain_First( &_User_extensions_Switches_list ); !_Chain_Is_tail( &_User_extensions_Switches_list, the_node ) ; the_node = the_node->next ) { 8006b44: 29 6b 00 00 lw r11,(r11+0) ) { Chain_Node *the_node; User_extensions_Switch_control *the_extension_switch; for ( the_node = _Chain_First( &_User_extensions_Switches_list ); 8006b48: 5d 6c ff fb bne r11,r12,8006b34 <_User_extensions_Thread_switch+0x38> the_extension_switch = (User_extensions_Switch_control *) the_node; (*the_extension_switch->thread_switch)( executing, heir ); } } 8006b4c: 2b 9d 00 04 lw ra,(sp+4) 8006b50: 2b 8b 00 14 lw r11,(sp+20) 8006b54: 2b 8c 00 10 lw r12,(sp+16) 8006b58: 2b 8d 00 0c lw r13,(sp+12) 8006b5c: 2b 8e 00 08 lw r14,(sp+8) 8006b60: 37 9c 00 14 addi sp,sp,20 8006b64: c3 a0 00 00 ret =============================================================================== 08009258 <_Watchdog_Adjust>: void _Watchdog_Adjust( Chain_Control *header, Watchdog_Adjust_directions direction, Watchdog_Interval units ) { 8009258: 37 9c ff e4 addi sp,sp,-28 800925c: 5b 8b 00 1c sw (sp+28),r11 8009260: 5b 8c 00 18 sw (sp+24),r12 8009264: 5b 8d 00 14 sw (sp+20),r13 8009268: 5b 8e 00 10 sw (sp+16),r14 800926c: 5b 8f 00 0c sw (sp+12),r15 8009270: 5b 90 00 08 sw (sp+8),r16 8009274: 5b 9d 00 04 sw (sp+4),ra 8009278: b8 20 60 00 mv r12,r1 800927c: b8 60 58 00 mv r11,r3 ISR_Level level; _ISR_Disable( level ); 8009280: 90 00 18 00 rcsr r3,IE 8009284: 34 01 ff fe mvi r1,-2 8009288: a0 61 08 00 and r1,r3,r1 800928c: d0 01 00 00 wcsr IE,r1 } } _ISR_Enable( level ); } 8009290: 29 81 00 00 lw r1,(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 ); 8009294: 35 8e 00 04 addi r14,r12,4 Watchdog_Interval units ) { ISR_Level level; _ISR_Disable( level ); 8009298: b8 60 20 00 mv r4,r3 * hence the compiler must not assume *header to remain * unmodified across that call. * * Till Straumann, 7/2003 */ if ( !_Chain_Is_empty( header ) ) { 800929c: 44 2e 00 04 be r1,r14,80092ac <_Watchdog_Adjust+0x54> switch ( direction ) { 80092a0: 44 40 00 11 be r2,r0,80092e4 <_Watchdog_Adjust+0x8c> 80092a4: 34 03 00 01 mvi r3,1 80092a8: 44 43 00 0b be r2,r3,80092d4 <_Watchdog_Adjust+0x7c> <== ALWAYS TAKEN } break; } } _ISR_Enable( level ); 80092ac: d0 04 00 00 wcsr IE,r4 } 80092b0: 2b 9d 00 04 lw ra,(sp+4) 80092b4: 2b 8b 00 1c lw r11,(sp+28) 80092b8: 2b 8c 00 18 lw r12,(sp+24) 80092bc: 2b 8d 00 14 lw r13,(sp+20) 80092c0: 2b 8e 00 10 lw r14,(sp+16) 80092c4: 2b 8f 00 0c lw r15,(sp+12) 80092c8: 2b 90 00 08 lw r16,(sp+8) 80092cc: 37 9c 00 1c addi sp,sp,28 80092d0: c3 a0 00 00 ret * Till Straumann, 7/2003 */ if ( !_Chain_Is_empty( header ) ) { switch ( direction ) { case WATCHDOG_BACKWARD: _Watchdog_First( header )->delta_interval += units; 80092d4: 28 22 00 10 lw r2,(r1+16) 80092d8: b4 4b 58 00 add r11,r2,r11 80092dc: 58 2b 00 10 sw (r1+16),r11 break; 80092e0: e3 ff ff f3 bi 80092ac <_Watchdog_Adjust+0x54> case WATCHDOG_FORWARD: while ( units ) { 80092e4: b8 60 20 00 mv r4,r3 80092e8: 45 62 ff f1 be r11,r2,80092ac <_Watchdog_Adjust+0x54> <== NEVER TAKEN if ( units < _Watchdog_First( header )->delta_interval ) { 80092ec: 28 2d 00 10 lw r13,(r1+16) 80092f0: 55 ab 00 13 bgu r13,r11,800933c <_Watchdog_Adjust+0xe4> <== NEVER TAKEN _Watchdog_First( header )->delta_interval -= units; break; } else { units -= _Watchdog_First( header )->delta_interval; _Watchdog_First( header )->delta_interval = 1; 80092f4: 34 10 00 01 mvi r16,1 _ISR_Enable( level ); _Watchdog_Tickle( header ); _ISR_Disable( level ); 80092f8: 34 0f ff fe mvi r15,-2 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; 80092fc: 58 30 00 10 sw (r1+16),r16 _ISR_Enable( level ); 8009300: d0 03 00 00 wcsr IE,r3 _Watchdog_Tickle( header ); 8009304: b9 80 08 00 mv r1,r12 8009308: f8 00 00 b2 calli 80095d0 <_Watchdog_Tickle> _ISR_Disable( level ); 800930c: 90 00 10 00 rcsr r2,IE 8009310: a0 4f 08 00 and r1,r2,r15 8009314: d0 01 00 00 wcsr IE,r1 } } _ISR_Enable( level ); } 8009318: 29 84 00 00 lw r4,(r12+0) while ( units ) { if ( units < _Watchdog_First( header )->delta_interval ) { _Watchdog_First( header )->delta_interval -= units; break; } else { units -= _Watchdog_First( header )->delta_interval; 800931c: c9 6d 58 00 sub r11,r11,r13 _ISR_Enable( level ); _Watchdog_Tickle( header ); _ISR_Disable( level ); 8009320: b8 40 18 00 mv r3,r2 RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First( Chain_Control *header ) { return ( (Watchdog_Control *) _Chain_First( header ) ); 8009324: b8 80 08 00 mv r1,r4 if ( _Chain_Is_empty( header ) ) 8009328: 45 c4 00 08 be r14,r4,8009348 <_Watchdog_Adjust+0xf0> switch ( direction ) { case WATCHDOG_BACKWARD: _Watchdog_First( header )->delta_interval += units; break; case WATCHDOG_FORWARD: while ( units ) { 800932c: 45 60 00 07 be r11,r0,8009348 <_Watchdog_Adjust+0xf0> <== NEVER TAKEN if ( units < _Watchdog_First( header )->delta_interval ) { 8009330: 28 2d 00 10 lw r13,(r1+16) 8009334: 51 6d ff f2 bgeu r11,r13,80092fc <_Watchdog_Adjust+0xa4> _ISR_Enable( level ); _Watchdog_Tickle( header ); _ISR_Disable( level ); 8009338: b8 40 20 00 mv r4,r2 _Watchdog_First( header )->delta_interval += units; break; case WATCHDOG_FORWARD: while ( units ) { if ( units < _Watchdog_First( header )->delta_interval ) { _Watchdog_First( header )->delta_interval -= units; 800933c: c9 ab 58 00 sub r11,r13,r11 8009340: 58 2b 00 10 sw (r1+16),r11 break; 8009344: e3 ff ff da bi 80092ac <_Watchdog_Adjust+0x54> _ISR_Enable( level ); _Watchdog_Tickle( header ); _ISR_Disable( level ); 8009348: b8 40 20 00 mv r4,r2 800934c: e3 ff ff d8 bi 80092ac <_Watchdog_Adjust+0x54> =============================================================================== 08006b68 <_Watchdog_Insert>: void _Watchdog_Insert( Chain_Control *header, Watchdog_Control *the_watchdog ) { 8006b68: 37 9c ff f8 addi sp,sp,-8 8006b6c: 5b 8b 00 08 sw (sp+8),r11 8006b70: 5b 8c 00 04 sw (sp+4),r12 Watchdog_Control *after; uint32_t insert_isr_nest_level; Watchdog_Interval delta_interval; insert_isr_nest_level = _ISR_Nest_level; 8006b74: 78 03 08 01 mvhi r3,0x801 8006b78: 38 63 4d b4 ori r3,r3,0x4db4 8006b7c: 28 69 00 08 lw r9,(r3+8) _ISR_Disable( level ); 8006b80: 90 00 30 00 rcsr r6,IE 8006b84: 34 08 ff fe mvi r8,-2 8006b88: a0 c8 40 00 and r8,r6,r8 8006b8c: d0 08 00 00 wcsr IE,r8 /* * Check to see if the watchdog has just been inserted by a * higher priority interrupt. If so, abandon this insert. */ if ( the_watchdog->state != WATCHDOG_INACTIVE ) { 8006b90: 28 43 00 08 lw r3,(r2+8) 8006b94: 5c 60 00 3f bne r3,r0,8006c90 <_Watchdog_Insert+0x128> _ISR_Enable( level ); return; } the_watchdog->state = WATCHDOG_BEING_INSERTED; _Watchdog_Sync_count++; 8006b98: 78 0c 08 01 mvhi r12,0x801 8006b9c: 39 8c 4a 14 ori r12,r12,0x4a14 8006ba0: 29 83 00 00 lw r3,(r12+0) 8006ba4: 78 07 08 01 mvhi r7,0x801 if ( the_watchdog->state != WATCHDOG_INACTIVE ) { _ISR_Enable( level ); return; } the_watchdog->state = WATCHDOG_BEING_INSERTED; 8006ba8: 34 04 00 01 mvi r4,1 _Watchdog_Sync_count++; 8006bac: 34 63 00 01 addi r3,r3,1 if ( the_watchdog->state != WATCHDOG_INACTIVE ) { _ISR_Enable( level ); return; } the_watchdog->state = WATCHDOG_BEING_INSERTED; 8006bb0: 58 44 00 08 sw (r2+8),r4 _Watchdog_Sync_count++; 8006bb4: 59 83 00 00 sw (r12+0),r3 8006bb8: 38 e7 49 ac ori r7,r7,0x49ac delta_interval -= after->delta_interval; _ISR_Flash( level ); if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) { 8006bbc: 34 0a 00 01 mvi r10,1 the_watchdog->state = WATCHDOG_BEING_INSERTED; _Watchdog_Sync_count++; restart: delta_interval = the_watchdog->initial; 8006bc0: 28 44 00 0c lw r4,(r2+12) RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First( Chain_Control *header ) { return ( (Watchdog_Control *) _Chain_First( header ) ); 8006bc4: 28 23 00 00 lw r3,(r1+0) for ( after = _Watchdog_First( header ) ; ; after = _Watchdog_Next( after ) ) { if ( delta_interval == 0 || !_Watchdog_Next( after ) ) 8006bc8: 44 80 00 14 be r4,r0,8006c18 <_Watchdog_Insert+0xb0> 8006bcc: 28 65 00 00 lw r5,(r3+0) 8006bd0: 44 a0 00 12 be r5,r0,8006c18 <_Watchdog_Insert+0xb0> break; if ( delta_interval < after->delta_interval ) { 8006bd4: 28 65 00 10 lw r5,(r3+16) 8006bd8: 54 a4 00 0e bgu r5,r4,8006c10 <_Watchdog_Insert+0xa8> break; } delta_interval -= after->delta_interval; _ISR_Flash( level ); 8006bdc: d0 06 00 00 wcsr IE,r6 8006be0: d0 08 00 00 wcsr IE,r8 if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) { 8006be4: 28 4b 00 08 lw r11,(r2+8) 8006be8: 5d 6a 00 19 bne r11,r10,8006c4c <_Watchdog_Insert+0xe4> goto exit_insert; } if ( _Watchdog_Sync_level > insert_isr_nest_level ) { 8006bec: 28 eb 00 00 lw r11,(r7+0) 8006bf0: 55 69 00 2d bgu r11,r9,8006ca4 <_Watchdog_Insert+0x13c> if ( delta_interval < after->delta_interval ) { after->delta_interval -= delta_interval; break; } delta_interval -= after->delta_interval; 8006bf4: c8 85 20 00 sub r4,r4,r5 exit_insert: _Watchdog_Sync_level = insert_isr_nest_level; _Watchdog_Sync_count--; _ISR_Enable( level ); } 8006bf8: 28 63 00 00 lw r3,(r3+0) for ( after = _Watchdog_First( header ) ; ; after = _Watchdog_Next( after ) ) { if ( delta_interval == 0 || !_Watchdog_Next( after ) ) 8006bfc: 44 80 00 07 be r4,r0,8006c18 <_Watchdog_Insert+0xb0> 8006c00: 28 65 00 00 lw r5,(r3+0) 8006c04: 44 a0 00 05 be r5,r0,8006c18 <_Watchdog_Insert+0xb0> break; if ( delta_interval < after->delta_interval ) { 8006c08: 28 65 00 10 lw r5,(r3+16) 8006c0c: 50 85 00 19 bgeu r4,r5,8006c70 <_Watchdog_Insert+0x108> after->delta_interval -= delta_interval; 8006c10: c8 a4 28 00 sub r5,r5,r4 8006c14: 58 65 00 10 sw (r3+16),r5 _Watchdog_Activate( the_watchdog ); the_watchdog->delta_interval = delta_interval; _Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node ); 8006c18: 28 63 00 04 lw r3,(r3+4) the_watchdog->start_time = _Watchdog_Ticks_since_boot; 8006c1c: 78 01 08 01 mvhi r1,0x801 8006c20: 38 21 4a 18 ori r1,r1,0x4a18 ) { Chain_Node *before_node; the_node->previous = after_node; before_node = after_node->next; 8006c24: 28 65 00 00 lw r5,(r3+0) 8006c28: 28 28 00 00 lw r8,(r1+0) RTEMS_INLINE_ROUTINE void _Watchdog_Activate( Watchdog_Control *the_watchdog ) { the_watchdog->state = WATCHDOG_ACTIVE; 8006c2c: 34 01 00 02 mvi r1,2 8006c30: 58 41 00 08 sw (r2+8),r1 } } _Watchdog_Activate( the_watchdog ); the_watchdog->delta_interval = delta_interval; 8006c34: 58 44 00 10 sw (r2+16),r4 Chain_Node *the_node ) { Chain_Node *before_node; the_node->previous = after_node; 8006c38: 58 43 00 04 sw (r2+4),r3 before_node = after_node->next; after_node->next = the_node; 8006c3c: 58 62 00 00 sw (r3+0),r2 the_node->next = before_node; before_node->previous = the_node; 8006c40: 58 a2 00 04 sw (r5+4),r2 Chain_Node *before_node; the_node->previous = after_node; before_node = after_node->next; after_node->next = the_node; the_node->next = before_node; 8006c44: 58 45 00 00 sw (r2+0),r5 _Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node ); the_watchdog->start_time = _Watchdog_Ticks_since_boot; 8006c48: 58 48 00 14 sw (r2+20),r8 exit_insert: _Watchdog_Sync_level = insert_isr_nest_level; 8006c4c: 58 e9 00 00 sw (r7+0),r9 _Watchdog_Sync_count--; 8006c50: 29 81 00 00 lw r1,(r12+0) 8006c54: 34 21 ff ff addi r1,r1,-1 8006c58: 59 81 00 00 sw (r12+0),r1 _ISR_Enable( level ); 8006c5c: d0 06 00 00 wcsr IE,r6 } 8006c60: 2b 8b 00 08 lw r11,(sp+8) 8006c64: 2b 8c 00 04 lw r12,(sp+4) 8006c68: 37 9c 00 08 addi sp,sp,8 8006c6c: c3 a0 00 00 ret break; } delta_interval -= after->delta_interval; _ISR_Flash( level ); 8006c70: d0 06 00 00 wcsr IE,r6 8006c74: d0 08 00 00 wcsr IE,r8 if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) { 8006c78: 28 4b 00 08 lw r11,(r2+8) if ( delta_interval < after->delta_interval ) { after->delta_interval -= delta_interval; break; } delta_interval -= after->delta_interval; 8006c7c: c8 85 20 00 sub r4,r4,r5 _ISR_Flash( level ); if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) { 8006c80: 5d 6a ff f3 bne r11,r10,8006c4c <_Watchdog_Insert+0xe4> <== NEVER TAKEN goto exit_insert; } if ( _Watchdog_Sync_level > insert_isr_nest_level ) { 8006c84: 28 e5 00 00 lw r5,(r7+0) 8006c88: 54 a9 00 07 bgu r5,r9,8006ca4 <_Watchdog_Insert+0x13c> <== NEVER TAKEN 8006c8c: e3 ff ff db bi 8006bf8 <_Watchdog_Insert+0x90> * Check to see if the watchdog has just been inserted by a * higher priority interrupt. If so, abandon this insert. */ if ( the_watchdog->state != WATCHDOG_INACTIVE ) { _ISR_Enable( level ); 8006c90: d0 06 00 00 wcsr IE,r6 exit_insert: _Watchdog_Sync_level = insert_isr_nest_level; _Watchdog_Sync_count--; _ISR_Enable( level ); } 8006c94: 2b 8b 00 08 lw r11,(sp+8) 8006c98: 2b 8c 00 04 lw r12,(sp+4) 8006c9c: 37 9c 00 08 addi sp,sp,8 8006ca0: c3 a0 00 00 ret if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) { goto exit_insert; } if ( _Watchdog_Sync_level > insert_isr_nest_level ) { _Watchdog_Sync_level = insert_isr_nest_level; 8006ca4: 58 e9 00 00 sw (r7+0),r9 goto restart; 8006ca8: e3 ff ff c6 bi 8006bc0 <_Watchdog_Insert+0x58> =============================================================================== 08006d14 <_Watchdog_Remove>: { ISR_Level level; Watchdog_States previous_state; Watchdog_Control *next_watchdog; _ISR_Disable( level ); 8006d14: 90 00 20 00 rcsr r4,IE 8006d18: 34 02 ff fe mvi r2,-2 8006d1c: a0 82 10 00 and r2,r4,r2 8006d20: d0 02 00 00 wcsr IE,r2 previous_state = the_watchdog->state; 8006d24: 28 22 00 08 lw r2,(r1+8) switch ( previous_state ) { 8006d28: 34 03 00 01 mvi r3,1 8006d2c: 44 43 00 27 be r2,r3,8006dc8 <_Watchdog_Remove+0xb4> 8006d30: 5c 40 00 08 bne r2,r0,8006d50 <_Watchdog_Remove+0x3c> _Watchdog_Sync_level = _ISR_Nest_level; _Chain_Extract_unprotected( &the_watchdog->Node ); break; } the_watchdog->stop_time = _Watchdog_Ticks_since_boot; 8006d34: 78 03 08 01 mvhi r3,0x801 8006d38: 38 63 4a 18 ori r3,r3,0x4a18 8006d3c: 28 63 00 00 lw r3,(r3+0) 8006d40: 58 23 00 18 sw (r1+24),r3 _ISR_Enable( level ); 8006d44: d0 04 00 00 wcsr IE,r4 return( previous_state ); } 8006d48: b8 40 08 00 mv r1,r2 8006d4c: c3 a0 00 00 ret Watchdog_States previous_state; Watchdog_Control *next_watchdog; _ISR_Disable( level ); previous_state = the_watchdog->state; switch ( previous_state ) { 8006d50: 34 03 00 03 mvi r3,3 8006d54: 54 43 ff f8 bgu r2,r3,8006d34 <_Watchdog_Remove+0x20> <== NEVER TAKEN } the_watchdog->stop_time = _Watchdog_Ticks_since_boot; _ISR_Enable( level ); return( previous_state ); } 8006d58: 28 23 00 00 lw r3,(r1+0) break; case WATCHDOG_ACTIVE: case WATCHDOG_REMOVE_IT: the_watchdog->state = WATCHDOG_INACTIVE; 8006d5c: 58 20 00 08 sw (r1+8),r0 next_watchdog = _Watchdog_Next( the_watchdog ); if ( _Watchdog_Next(next_watchdog) ) 8006d60: 28 65 00 00 lw r5,(r3+0) 8006d64: 44 a0 00 05 be r5,r0,8006d78 <_Watchdog_Remove+0x64> next_watchdog->delta_interval += the_watchdog->delta_interval; 8006d68: 28 66 00 10 lw r6,(r3+16) 8006d6c: 28 25 00 10 lw r5,(r1+16) 8006d70: b4 c5 28 00 add r5,r6,r5 8006d74: 58 65 00 10 sw (r3+16),r5 if ( _Watchdog_Sync_count ) 8006d78: 78 05 08 01 mvhi r5,0x801 8006d7c: 38 a5 4a 14 ori r5,r5,0x4a14 8006d80: 28 a5 00 00 lw r5,(r5+0) 8006d84: 44 a0 00 07 be r5,r0,8006da0 <_Watchdog_Remove+0x8c> _Watchdog_Sync_level = _ISR_Nest_level; 8006d88: 78 05 08 01 mvhi r5,0x801 8006d8c: 38 a5 4d b4 ori r5,r5,0x4db4 8006d90: 28 a6 00 08 lw r6,(r5+8) 8006d94: 78 05 08 01 mvhi r5,0x801 8006d98: 38 a5 49 ac ori r5,r5,0x49ac 8006d9c: 58 a6 00 00 sw (r5+0),r6 { Chain_Node *next; Chain_Node *previous; next = the_node->next; previous = the_node->previous; 8006da0: 28 25 00 04 lw r5,(r1+4) next->previous = previous; 8006da4: 58 65 00 04 sw (r3+4),r5 previous->next = next; 8006da8: 58 a3 00 00 sw (r5+0),r3 _Chain_Extract_unprotected( &the_watchdog->Node ); break; } the_watchdog->stop_time = _Watchdog_Ticks_since_boot; 8006dac: 78 03 08 01 mvhi r3,0x801 8006db0: 38 63 4a 18 ori r3,r3,0x4a18 8006db4: 28 63 00 00 lw r3,(r3+0) 8006db8: 58 23 00 18 sw (r1+24),r3 _ISR_Enable( level ); 8006dbc: d0 04 00 00 wcsr IE,r4 return( previous_state ); } 8006dc0: b8 40 08 00 mv r1,r2 8006dc4: c3 a0 00 00 ret _Watchdog_Sync_level = _ISR_Nest_level; _Chain_Extract_unprotected( &the_watchdog->Node ); break; } the_watchdog->stop_time = _Watchdog_Ticks_since_boot; 8006dc8: 78 03 08 01 mvhi r3,0x801 8006dcc: 38 63 4a 18 ori r3,r3,0x4a18 8006dd0: 28 63 00 00 lw r3,(r3+0) /* * 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; 8006dd4: 58 20 00 08 sw (r1+8),r0 _Watchdog_Sync_level = _ISR_Nest_level; _Chain_Extract_unprotected( &the_watchdog->Node ); break; } the_watchdog->stop_time = _Watchdog_Ticks_since_boot; 8006dd8: 58 23 00 18 sw (r1+24),r3 _ISR_Enable( level ); 8006ddc: d0 04 00 00 wcsr IE,r4 return( previous_state ); } 8006de0: b8 40 08 00 mv r1,r2 8006de4: c3 a0 00 00 ret =============================================================================== 080089c8 <_Watchdog_Report_chain>: void _Watchdog_Report_chain( const char *name, Chain_Control *header ) { 80089c8: 37 9c ff ec addi sp,sp,-20 80089cc: 5b 8b 00 14 sw (sp+20),r11 80089d0: 5b 8c 00 10 sw (sp+16),r12 80089d4: 5b 8d 00 0c sw (sp+12),r13 80089d8: 5b 8e 00 08 sw (sp+8),r14 80089dc: 5b 9d 00 04 sw (sp+4),ra 80089e0: b8 20 70 00 mv r14,r1 80089e4: b8 40 60 00 mv r12,r2 ISR_Level level; Chain_Node *node; _ISR_Disable( level ); 80089e8: 90 00 68 00 rcsr r13,IE 80089ec: 34 01 ff fe mvi r1,-2 80089f0: a1 a1 08 00 and r1,r13,r1 80089f4: d0 01 00 00 wcsr IE,r1 printk( "Watchdog Chain: %s %p\n", name, header ); 80089f8: 78 01 08 01 mvhi r1,0x801 80089fc: b9 80 18 00 mv r3,r12 8008a00: 38 21 f6 20 ori r1,r1,0xf620 8008a04: b9 c0 10 00 mv r2,r14 8008a08: fb ff ea d7 calli 8003564 printk( "== end of %s \n", name ); } else { printk( "Chain is empty\n" ); } _ISR_Enable( level ); } 8008a0c: 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 ); 8008a10: 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 ) ) { 8008a14: 45 6c 00 12 be r11,r12,8008a5c <_Watchdog_Report_chain+0x94> node != _Chain_Tail(header) ; node = node->next ) { Watchdog_Control *watch = (Watchdog_Control *) node; _Watchdog_Report( NULL, watch ); 8008a18: b9 60 10 00 mv r2,r11 8008a1c: 34 01 00 00 mvi r1,0 8008a20: f8 00 00 13 calli 8008a6c <_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 ) 8008a24: 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 ) ; 8008a28: 5d 6c ff fc bne r11,r12,8008a18 <_Watchdog_Report_chain+0x50><== NEVER TAKEN { Watchdog_Control *watch = (Watchdog_Control *) node; _Watchdog_Report( NULL, watch ); } printk( "== end of %s \n", name ); 8008a2c: 78 01 08 01 mvhi r1,0x801 8008a30: 38 21 f6 38 ori r1,r1,0xf638 8008a34: b9 c0 10 00 mv r2,r14 8008a38: fb ff ea cb calli 8003564 } else { printk( "Chain is empty\n" ); } _ISR_Enable( level ); 8008a3c: d0 0d 00 00 wcsr IE,r13 } 8008a40: 2b 9d 00 04 lw ra,(sp+4) 8008a44: 2b 8b 00 14 lw r11,(sp+20) 8008a48: 2b 8c 00 10 lw r12,(sp+16) 8008a4c: 2b 8d 00 0c lw r13,(sp+12) 8008a50: 2b 8e 00 08 lw r14,(sp+8) 8008a54: 37 9c 00 14 addi sp,sp,20 8008a58: c3 a0 00 00 ret _Watchdog_Report( NULL, watch ); } printk( "== end of %s \n", name ); } else { printk( "Chain is empty\n" ); 8008a5c: 78 01 08 01 mvhi r1,0x801 8008a60: 38 21 f6 48 ori r1,r1,0xf648 8008a64: fb ff ea c0 calli 8003564 8008a68: e3 ff ff f5 bi 8008a3c <_Watchdog_Report_chain+0x74> =============================================================================== 08006de8 <_Watchdog_Tickle>: */ void _Watchdog_Tickle( Chain_Control *header ) { 8006de8: 37 9c ff e4 addi sp,sp,-28 8006dec: 5b 8b 00 1c sw (sp+28),r11 8006df0: 5b 8c 00 18 sw (sp+24),r12 8006df4: 5b 8d 00 14 sw (sp+20),r13 8006df8: 5b 8e 00 10 sw (sp+16),r14 8006dfc: 5b 8f 00 0c sw (sp+12),r15 8006e00: 5b 90 00 08 sw (sp+8),r16 8006e04: 5b 9d 00 04 sw (sp+4),ra 8006e08: 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 ); 8006e0c: 90 00 68 00 rcsr r13,IE 8006e10: 34 01 ff fe mvi r1,-2 8006e14: a1 a1 08 00 and r1,r13,r1 8006e18: d0 01 00 00 wcsr IE,r1 } while ( !_Chain_Is_empty( header ) && (the_watchdog->delta_interval == 0) ); leave: _ISR_Enable(level); } 8006e1c: 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 ); 8006e20: 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 ); 8006e24: b9 a0 10 00 mv r2,r13 if ( _Chain_Is_empty( header ) ) 8006e28: 45 6e 00 1e be r11,r14,8006ea0 <_Watchdog_Tickle+0xb8> * 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) { 8006e2c: 29 61 00 10 lw r1,(r11+16) 8006e30: 5c 20 00 26 bne r1,r0,8006ec8 <_Watchdog_Tickle+0xe0> do { watchdog_state = _Watchdog_Remove( the_watchdog ); _ISR_Enable( level ); switch( watchdog_state ) { 8006e34: 34 10 00 02 mvi r16,2 case WATCHDOG_REMOVE_IT: break; } _ISR_Disable( level ); 8006e38: 34 0f ff fe mvi r15,-2 8006e3c: e0 00 00 0a bi 8006e64 <_Watchdog_Tickle+0x7c> 8006e40: 90 00 10 00 rcsr r2,IE <== NOT EXECUTED 8006e44: a0 4f 08 00 and r1,r2,r15 <== NOT EXECUTED 8006e48: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED } while ( !_Chain_Is_empty( header ) && (the_watchdog->delta_interval == 0) ); leave: _ISR_Enable(level); } 8006e4c: 29 81 00 00 lw r1,(r12+0) <== NOT EXECUTED case WATCHDOG_REMOVE_IT: break; } _ISR_Disable( level ); 8006e50: b8 40 68 00 mv r13,r2 <== NOT EXECUTED RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_First( Chain_Control *header ) { return ( (Watchdog_Control *) _Chain_First( header ) ); 8006e54: b8 20 58 00 mv r11,r1 <== NOT EXECUTED the_watchdog = _Watchdog_First( header ); } while ( !_Chain_Is_empty( header ) && (the_watchdog->delta_interval == 0) ); 8006e58: 44 2e 00 12 be r1,r14,8006ea0 <_Watchdog_Tickle+0xb8> <== NOT EXECUTED } _ISR_Disable( level ); the_watchdog = _Watchdog_First( header ); } while ( !_Chain_Is_empty( header ) && 8006e5c: 28 21 00 10 lw r1,(r1+16) 8006e60: 5c 20 00 10 bne r1,r0,8006ea0 <_Watchdog_Tickle+0xb8> if ( the_watchdog->delta_interval != 0 ) goto leave; } do { watchdog_state = _Watchdog_Remove( the_watchdog ); 8006e64: b9 60 08 00 mv r1,r11 8006e68: fb ff ff ab calli 8006d14 <_Watchdog_Remove> _ISR_Enable( level ); 8006e6c: d0 0d 00 00 wcsr IE,r13 switch( watchdog_state ) { 8006e70: 5c 30 ff f4 bne r1,r16,8006e40 <_Watchdog_Tickle+0x58> <== NEVER TAKEN case WATCHDOG_ACTIVE: (*the_watchdog->routine)( 8006e74: 29 63 00 1c lw r3,(r11+28) 8006e78: 29 61 00 20 lw r1,(r11+32) 8006e7c: 29 62 00 24 lw r2,(r11+36) 8006e80: d8 60 00 00 call r3 case WATCHDOG_REMOVE_IT: break; } _ISR_Disable( level ); 8006e84: 90 00 10 00 rcsr r2,IE 8006e88: a0 4f 08 00 and r1,r2,r15 8006e8c: d0 01 00 00 wcsr IE,r1 } while ( !_Chain_Is_empty( header ) && (the_watchdog->delta_interval == 0) ); leave: _ISR_Enable(level); } 8006e90: 29 81 00 00 lw r1,(r12+0) case WATCHDOG_REMOVE_IT: break; } _ISR_Disable( level ); 8006e94: b8 40 68 00 mv r13,r2 8006e98: b8 20 58 00 mv r11,r1 the_watchdog = _Watchdog_First( header ); } while ( !_Chain_Is_empty( header ) && (the_watchdog->delta_interval == 0) ); 8006e9c: 5c 2e ff f0 bne r1,r14,8006e5c <_Watchdog_Tickle+0x74> leave: _ISR_Enable(level); 8006ea0: d0 02 00 00 wcsr IE,r2 } 8006ea4: 2b 9d 00 04 lw ra,(sp+4) 8006ea8: 2b 8b 00 1c lw r11,(sp+28) 8006eac: 2b 8c 00 18 lw r12,(sp+24) 8006eb0: 2b 8d 00 14 lw r13,(sp+20) 8006eb4: 2b 8e 00 10 lw r14,(sp+16) 8006eb8: 2b 8f 00 0c lw r15,(sp+12) 8006ebc: 2b 90 00 08 lw r16,(sp+8) 8006ec0: 37 9c 00 1c addi sp,sp,28 8006ec4: c3 a0 00 00 ret * 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) { the_watchdog->delta_interval--; 8006ec8: 34 21 ff ff addi r1,r1,-1 8006ecc: 59 61 00 10 sw (r11+16),r1 if ( the_watchdog->delta_interval != 0 ) 8006ed0: 44 20 ff d9 be r1,r0,8006e34 <_Watchdog_Tickle+0x4c> 8006ed4: e3 ff ff f3 bi 8006ea0 <_Watchdog_Tickle+0xb8> =============================================================================== 080062f0 <_rename_r>: int _rename_r( struct _reent *ptr __attribute__((unused)), const char *old, const char *new ) { 80062f0: 37 9c ff a0 addi sp,sp,-96 80062f4: 5b 8b 00 1c sw (sp+28),r11 80062f8: 5b 8c 00 18 sw (sp+24),r12 80062fc: 5b 8d 00 14 sw (sp+20),r13 8006300: 5b 8e 00 10 sw (sp+16),r14 8006304: 5b 8f 00 0c sw (sp+12),r15 8006308: 5b 90 00 08 sw (sp+8),r16 800630c: 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 ); 8006310: b8 40 08 00 mv r1,r2 int _rename_r( struct _reent *ptr __attribute__((unused)), const char *old, const char *new ) { 8006314: b8 40 60 00 mv r12,r2 8006318: b8 60 70 00 mv r14,r3 /* * Get the parent node of the old path to be renamed. Find the parent path. */ old_parent_pathlen = rtems_filesystem_dirname ( old ); 800631c: fb ff f9 13 calli 8004768 if ( old_parent_pathlen == 0 ) 8006320: 5c 20 00 62 bne r1,r0,80064a8 <_rename_r+0x1b8> rtems_filesystem_get_start_loc( old, &i, &old_parent_loc ); 8006324: 37 8d 00 34 addi r13,sp,52 8006328: b9 80 08 00 mv r1,r12 800632c: 37 82 00 60 addi r2,sp,96 8006330: b9 a0 18 00 mv r3,r13 8006334: f8 00 01 09 calli 8006758 8006338: 34 0b 00 00 mvi r11,0 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; 800633c: 34 10 00 00 mvi r16,0 /* * Start from the parent to find the node that should be under it. */ old_loc = old_parent_loc; 8006340: 2b 82 00 34 lw r2,(sp+52) name = old + old_parent_pathlen; 8006344: b5 8b 58 00 add r11,r12,r11 name += rtems_filesystem_prefix_separators( name, strlen( name ) ); 8006348: 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; 800634c: 5b 82 00 48 sw (sp+72),r2 8006350: 2b 82 00 38 lw r2,(sp+56) name = old + old_parent_pathlen; 8006354: 5b 8b 00 5c sw (sp+92),r11 name += rtems_filesystem_prefix_separators( name, strlen( name ) ); result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), 8006358: 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; 800635c: 5b 82 00 4c sw (sp+76),r2 8006360: 2b 82 00 3c lw r2,(sp+60) 8006364: 5b 82 00 50 sw (sp+80),r2 8006368: 2b 82 00 40 lw r2,(sp+64) 800636c: 5b 82 00 54 sw (sp+84),r2 8006370: 2b 82 00 44 lw r2,(sp+68) 8006374: 5b 82 00 58 sw (sp+88),r2 name = old + old_parent_pathlen; name += rtems_filesystem_prefix_separators( name, strlen( name ) ); 8006378: f8 00 39 d9 calli 8014adc 800637c: b8 20 10 00 mv r2,r1 8006380: b9 60 08 00 mv r1,r11 8006384: fb ff f9 0e calli 80047bc 8006388: b5 61 58 00 add r11,r11,r1 result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), 800638c: 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 ) ); 8006390: 5b 8b 00 5c sw (sp+92),r11 result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), 8006394: f8 00 39 d2 calli 8014adc 8006398: b8 20 10 00 mv r2,r1 800639c: 34 03 00 00 mvi r3,0 80063a0: b9 60 08 00 mv r1,r11 80063a4: b9 80 20 00 mv r4,r12 80063a8: 34 05 00 00 mvi r5,0 80063ac: fb ff f8 b1 calli 8004670 80063b0: b8 20 78 00 mv r15,r1 0, &old_loc, false ); if ( result != 0 ) { 80063b4: 5c 20 00 38 bne r1,r0,8006494 <_rename_r+0x1a4> /* * Get the parent of the new node we are renaming to. */ rtems_filesystem_get_start_loc( new, &i, &new_parent_loc ); 80063b8: 37 8b 00 20 addi r11,sp,32 80063bc: b9 c0 08 00 mv r1,r14 80063c0: 37 82 00 60 addi r2,sp,96 80063c4: b9 60 18 00 mv r3,r11 80063c8: f8 00 00 e4 calli 8006758 result = (*new_parent_loc.ops->evalformake_h)( &new[i], &new_parent_loc, &name ); 80063cc: 2b 81 00 2c lw r1,(sp+44) 80063d0: b9 60 10 00 mv r2,r11 80063d4: 37 83 00 5c addi r3,sp,92 80063d8: 28 24 00 04 lw r4,(r1+4) 80063dc: 2b 81 00 60 lw r1,(sp+96) 80063e0: b5 c1 08 00 add r1,r14,r1 80063e4: d8 80 00 00 call r4 80063e8: b8 20 70 00 mv r14,r1 if ( result != 0 ) { 80063ec: 5c 2f 00 3b bne r1,r15,80064d8 <_rename_r+0x1e8> /* * 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 ) { 80063f0: 2b 81 00 30 lw r1,(sp+48) 80063f4: 2b 82 00 44 lw r2,(sp+68) 80063f8: 5c 41 00 1b bne r2,r1,8006464 <_rename_r+0x174> rtems_filesystem_freenode( &old_parent_loc ); rtems_filesystem_freenode( &old_loc ); rtems_set_errno_and_return_minus_one( EXDEV ); } result = (*new_parent_loc.ops->rename_h)( &old_parent_loc, &old_loc, &new_parent_loc, name ); 80063fc: 2b 82 00 2c lw r2,(sp+44) 8006400: 2b 84 00 5c lw r4,(sp+92) 8006404: b9 a0 08 00 mv r1,r13 8006408: 28 45 00 40 lw r5,(r2+64) 800640c: b9 60 18 00 mv r3,r11 8006410: b9 80 10 00 mv r2,r12 8006414: d8 a0 00 00 call r5 8006418: b8 20 78 00 mv r15,r1 rtems_filesystem_freenode( &new_parent_loc ); 800641c: b9 60 08 00 mv r1,r11 8006420: fb ff f9 9c calli 8004a90 if ( free_old_parentloc ) 8006424: 5e 0e 00 0d bne r16,r14,8006458 <_rename_r+0x168> rtems_filesystem_freenode( &old_parent_loc ); rtems_filesystem_freenode( &old_loc ); 8006428: b9 80 08 00 mv r1,r12 800642c: fb ff f9 99 calli 8004a90 return result; } 8006430: b9 e0 08 00 mv r1,r15 8006434: 2b 9d 00 04 lw ra,(sp+4) 8006438: 2b 8b 00 1c lw r11,(sp+28) 800643c: 2b 8c 00 18 lw r12,(sp+24) 8006440: 2b 8d 00 14 lw r13,(sp+20) 8006444: 2b 8e 00 10 lw r14,(sp+16) 8006448: 2b 8f 00 0c lw r15,(sp+12) 800644c: 2b 90 00 08 lw r16,(sp+8) 8006450: 37 9c 00 60 addi sp,sp,96 8006454: c3 a0 00 00 ret result = (*new_parent_loc.ops->rename_h)( &old_parent_loc, &old_loc, &new_parent_loc, name ); rtems_filesystem_freenode( &new_parent_loc ); if ( free_old_parentloc ) rtems_filesystem_freenode( &old_parent_loc ); 8006458: b9 a0 08 00 mv r1,r13 800645c: fb ff f9 8d calli 8004a90 8006460: e3 ff ff f2 bi 8006428 <_rename_r+0x138> * Check to see if the caller is trying to rename across file system * boundaries. */ if ( old_parent_loc.mt_entry != new_parent_loc.mt_entry ) { rtems_filesystem_freenode( &new_parent_loc ); 8006464: b9 60 08 00 mv r1,r11 8006468: fb ff f9 8a calli 8004a90 if ( free_old_parentloc ) 800646c: 46 0e 00 03 be r16,r14,8006478 <_rename_r+0x188> rtems_filesystem_freenode( &old_parent_loc ); 8006470: b9 a0 08 00 mv r1,r13 8006474: fb ff f9 87 calli 8004a90 rtems_filesystem_freenode( &old_loc ); 8006478: b9 80 08 00 mv r1,r12 800647c: fb ff f9 85 calli 8004a90 rtems_set_errno_and_return_minus_one( EXDEV ); 8006480: f8 00 2b b1 calli 8011344 <__errno> 8006484: 34 02 00 12 mvi r2,18 8006488: 58 22 00 00 sw (r1+0),r2 800648c: 34 0f ff ff mvi r15,-1 8006490: e3 ff ff e8 bi 8006430 <_rename_r+0x140> 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 ); return -1; 8006494: 34 0f ff ff mvi r15,-1 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 ) 8006498: 46 00 ff e6 be r16,r0,8006430 <_rename_r+0x140> <== NEVER TAKEN rtems_filesystem_freenode( &old_parent_loc ); 800649c: b9 a0 08 00 mv r1,r13 80064a0: fb ff f9 7c calli 8004a90 80064a4: e3 ff ff e3 bi 8006430 <_rename_r+0x140> 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, 80064a8: b8 20 58 00 mv r11,r1 80064ac: 37 8d 00 34 addi r13,sp,52 80064b0: b9 80 08 00 mv r1,r12 80064b4: b9 60 10 00 mv r2,r11 80064b8: 34 03 00 02 mvi r3,2 80064bc: b9 a0 20 00 mv r4,r13 80064c0: 34 05 00 00 mvi r5,0 80064c4: fb ff f8 8e calli 80046fc RTEMS_LIBIO_PERMS_WRITE, &old_parent_loc, false ); if ( result != 0 ) return -1; 80064c8: 34 0f ff ff mvi r15,-1 else { result = rtems_filesystem_evaluate_path( old, old_parent_pathlen, RTEMS_LIBIO_PERMS_WRITE, &old_parent_loc, false ); if ( result != 0 ) 80064cc: 5c 20 ff d9 bne r1,r0,8006430 <_rename_r+0x140> <== NEVER TAKEN return -1; free_old_parentloc = true; 80064d0: 34 10 00 01 mvi r16,1 80064d4: e3 ff ff 9b bi 8006340 <_rename_r+0x50> rtems_filesystem_get_start_loc( new, &i, &new_parent_loc ); result = (*new_parent_loc.ops->evalformake_h)( &new[i], &new_parent_loc, &name ); if ( result != 0 ) { rtems_filesystem_freenode( &new_parent_loc ); 80064d8: b9 60 08 00 mv r1,r11 80064dc: fb ff f9 6d calli 8004a90 if ( free_old_parentloc ) 80064e0: 46 00 00 03 be r16,r0,80064ec <_rename_r+0x1fc> <== NEVER TAKEN rtems_filesystem_freenode( &old_parent_loc ); 80064e4: b9 a0 08 00 mv r1,r13 80064e8: fb ff f9 6a calli 8004a90 rtems_filesystem_freenode( &old_loc ); 80064ec: b9 80 08 00 mv r1,r12 80064f0: fb ff f9 68 calli 8004a90 return -1; 80064f4: 34 0f ff ff mvi r15,-1 80064f8: e3 ff ff ce bi 8006430 <_rename_r+0x140> =============================================================================== 080032dc : int adjtime( struct timeval *delta, struct timeval *olddelta ) { 80032dc: 37 9c ff e8 addi sp,sp,-24 80032e0: 5b 8b 00 10 sw (sp+16),r11 80032e4: 5b 8c 00 0c sw (sp+12),r12 80032e8: 5b 8d 00 08 sw (sp+8),r13 80032ec: 5b 9d 00 04 sw (sp+4),ra 80032f0: b8 20 58 00 mv r11,r1 80032f4: b8 40 60 00 mv r12,r2 long adjustment; /* * Simple validations */ if ( !delta ) 80032f8: 44 20 00 06 be r1,r0,8003310 rtems_set_errno_and_return_minus_one( EINVAL ); if ( delta->tv_usec >= TOD_MICROSECONDS_PER_SECOND ) 80032fc: 78 03 08 01 mvhi r3,0x801 8003300: 38 63 e7 14 ori r3,r3,0xe714 8003304: 28 22 00 04 lw r2,(r1+4) 8003308: 28 61 00 00 lw r1,(r3+0) 800330c: 50 22 00 0b bgeu r1,r2,8003338 rtems_set_errno_and_return_minus_one( EINVAL ); 8003310: f8 00 2a cd calli 800de44 <__errno> 8003314: 34 02 00 16 mvi r2,22 8003318: 58 22 00 00 sw (r1+0),r2 800331c: 34 01 ff ff mvi r1,-1 /* set the user's output */ if ( olddelta ) *olddelta = *delta; return 0; } 8003320: 2b 9d 00 04 lw ra,(sp+4) 8003324: 2b 8b 00 10 lw r11,(sp+16) 8003328: 2b 8c 00 0c lw r12,(sp+12) 800332c: 2b 8d 00 08 lw r13,(sp+8) 8003330: 37 9c 00 18 addi sp,sp,24 8003334: c3 a0 00 00 ret rtems_set_errno_and_return_minus_one( EINVAL ); if ( delta->tv_usec >= TOD_MICROSECONDS_PER_SECOND ) rtems_set_errno_and_return_minus_one( EINVAL ); if ( olddelta ) { 8003338: 45 80 00 04 be r12,r0,8003348 olddelta->tv_sec = 0; olddelta->tv_usec = 0; 800333c: 59 80 00 04 sw (r12+4),r0 8003340: 29 62 00 04 lw r2,(r11+4) if ( delta->tv_usec >= TOD_MICROSECONDS_PER_SECOND ) rtems_set_errno_and_return_minus_one( EINVAL ); if ( olddelta ) { olddelta->tv_sec = 0; 8003344: 59 80 00 00 sw (r12+0),r0 olddelta->tv_usec = 0; } /* convert delta to microseconds */ adjustment = (delta->tv_sec * TOD_MICROSECONDS_PER_SECOND); 8003348: 29 63 00 00 lw r3,(r11+0) adjustment += delta->tv_usec; /* too small to account for */ if ( adjustment < rtems_configuration_get_microseconds_per_tick() ) 800334c: 78 01 08 02 mvhi r1,0x802 8003350: 38 21 00 c4 ori r1,r1,0xc4 olddelta->tv_sec = 0; olddelta->tv_usec = 0; } /* convert delta to microseconds */ adjustment = (delta->tv_sec * TOD_MICROSECONDS_PER_SECOND); 8003354: b4 63 20 00 add r4,r3,r3 8003358: b4 84 20 00 add r4,r4,r4 800335c: b4 84 20 00 add r4,r4,r4 8003360: b4 84 28 00 add r5,r4,r4 8003364: b4 a5 28 00 add r5,r5,r5 8003368: b4 a5 28 00 add r5,r5,r5 800336c: b4 a5 28 00 add r5,r5,r5 8003370: b4 a5 28 00 add r5,r5,r5 8003374: c8 a4 28 00 sub r5,r5,r4 8003378: b4 a5 20 00 add r4,r5,r5 800337c: b4 84 20 00 add r4,r4,r4 8003380: b4 84 20 00 add r4,r4,r4 8003384: b4 84 20 00 add r4,r4,r4 8003388: b4 84 20 00 add r4,r4,r4 800338c: b4 84 20 00 add r4,r4,r4 8003390: c8 85 20 00 sub r4,r4,r5 8003394: b4 83 18 00 add r3,r4,r3 8003398: b4 63 18 00 add r3,r3,r3 800339c: b4 63 18 00 add r3,r3,r3 80033a0: b4 63 18 00 add r3,r3,r3 80033a4: b4 63 18 00 add r3,r3,r3 80033a8: b4 63 18 00 add r3,r3,r3 adjustment += delta->tv_usec; /* too small to account for */ if ( adjustment < rtems_configuration_get_microseconds_per_tick() ) 80033ac: 28 24 00 0c lw r4,(r1+12) olddelta->tv_sec = 0; olddelta->tv_usec = 0; } /* convert delta to microseconds */ adjustment = (delta->tv_sec * TOD_MICROSECONDS_PER_SECOND); 80033b0: b4 63 18 00 add r3,r3,r3 adjustment += delta->tv_usec; 80033b4: b4 43 18 00 add r3,r2,r3 /* too small to account for */ if ( adjustment < rtems_configuration_get_microseconds_per_tick() ) return 0; 80033b8: 34 01 00 00 mvi r1,0 /* convert delta to microseconds */ adjustment = (delta->tv_sec * TOD_MICROSECONDS_PER_SECOND); adjustment += delta->tv_usec; /* too small to account for */ if ( adjustment < rtems_configuration_get_microseconds_per_tick() ) 80033bc: 54 83 ff d9 bgu r4,r3,8003320 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 80033c0: 78 01 08 02 mvhi r1,0x802 80033c4: 38 21 09 d0 ori r1,r1,0x9d0 80033c8: 28 22 00 00 lw r2,(r1+0) 80033cc: 34 42 00 01 addi r2,r2,1 80033d0: 58 22 00 00 sw (r1+0),r2 * This prevents context switches while we are adjusting the TOD */ _Thread_Disable_dispatch(); _TOD_Get( &ts ); 80033d4: 37 8d 00 14 addi r13,sp,20 80033d8: b9 a0 08 00 mv r1,r13 80033dc: f8 00 05 84 calli 80049ec <_TOD_Get> ts.tv_sec += delta->tv_sec; ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND; 80033e0: 29 63 00 04 lw r3,(r11+4) /* if adjustment is too much positive */ while ( ts.tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) { 80033e4: 78 04 08 01 mvhi r4,0x801 80033e8: 38 84 e8 90 ori r4,r4,0xe890 _Thread_Disable_dispatch(); _TOD_Get( &ts ); ts.tv_sec += delta->tv_sec; ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND; 80033ec: b4 63 18 00 add r3,r3,r3 80033f0: b4 63 18 00 add r3,r3,r3 80033f4: b4 63 18 00 add r3,r3,r3 80033f8: b4 63 10 00 add r2,r3,r3 80033fc: b4 42 10 00 add r2,r2,r2 8003400: b4 62 18 00 add r3,r3,r2 8003404: b4 63 10 00 add r2,r3,r3 8003408: b4 42 10 00 add r2,r2,r2 800340c: b4 62 18 00 add r3,r3,r2 8003410: b4 63 10 00 add r2,r3,r3 8003414: b4 42 10 00 add r2,r2,r2 _Thread_Disable_dispatch(); _TOD_Get( &ts ); ts.tv_sec += delta->tv_sec; 8003418: 29 61 00 00 lw r1,(r11+0) ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND; 800341c: b4 62 18 00 add r3,r3,r2 /* if adjustment is too much positive */ while ( ts.tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) { 8003420: 28 82 00 00 lw r2,(r4+0) _Thread_Disable_dispatch(); _TOD_Get( &ts ); ts.tv_sec += delta->tv_sec; 8003424: 2b 84 00 14 lw r4,(sp+20) 8003428: b4 81 20 00 add r4,r4,r1 ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND; 800342c: 2b 81 00 18 lw r1,(sp+24) _Thread_Disable_dispatch(); _TOD_Get( &ts ); ts.tv_sec += delta->tv_sec; 8003430: 5b 84 00 14 sw (sp+20),r4 ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND; 8003434: b4 61 18 00 add r3,r3,r1 8003438: 5b 83 00 18 sw (sp+24),r3 /* if adjustment is too much positive */ while ( ts.tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) { 800343c: 50 43 00 09 bgeu r2,r3,8003460 ts.tv_nsec -= TOD_NANOSECONDS_PER_SECOND; 8003440: 78 01 08 01 mvhi r1,0x801 8003444: 38 21 e8 94 ori r1,r1,0xe894 8003448: 28 25 00 00 lw r5,(r1+0) 800344c: b4 65 18 00 add r3,r3,r5 * At one point there was a static variable named adjustment * used by this implementation. I don't see any reason for it * to be here based upon the GNU/Linux documentation. */ int adjtime( 8003450: 34 84 00 01 addi r4,r4,1 ts.tv_sec += delta->tv_sec; ts.tv_nsec += delta->tv_usec * TOD_NANOSECONDS_PER_MICROSECOND; /* if adjustment is too much positive */ while ( ts.tv_nsec >= TOD_NANOSECONDS_PER_SECOND ) { 8003454: 54 62 ff fe bgu r3,r2,800344c <== NEVER TAKEN 8003458: 5b 83 00 18 sw (sp+24),r3 800345c: 5b 84 00 14 sw (sp+20),r4 ts.tv_nsec -= TOD_NANOSECONDS_PER_SECOND; ts.tv_sec++; } /* if adjustment is too much negative */ while ( ts.tv_nsec <= (-1 * TOD_NANOSECONDS_PER_SECOND) ) { 8003460: 78 04 08 01 mvhi r4,0x801 8003464: 38 84 e8 94 ori r4,r4,0xe894 8003468: 28 82 00 00 lw r2,(r4+0) 800346c: 54 62 00 0a bgu r3,r2,8003494 <== NEVER TAKEN ts.tv_nsec += TOD_NANOSECONDS_PER_SECOND; 8003470: 78 01 08 01 mvhi r1,0x801 8003474: 38 21 e7 10 ori r1,r1,0xe710 ts.tv_nsec -= TOD_NANOSECONDS_PER_SECOND; ts.tv_sec++; } /* if adjustment is too much negative */ while ( ts.tv_nsec <= (-1 * TOD_NANOSECONDS_PER_SECOND) ) { 8003478: 2b 84 00 14 lw r4,(sp+20) ts.tv_nsec += TOD_NANOSECONDS_PER_SECOND; 800347c: 28 25 00 00 lw r5,(r1+0) 8003480: b4 65 18 00 add r3,r3,r5 * At one point there was a static variable named adjustment * used by this implementation. I don't see any reason for it * to be here based upon the GNU/Linux documentation. */ int adjtime( 8003484: 34 84 ff ff addi r4,r4,-1 ts.tv_nsec -= TOD_NANOSECONDS_PER_SECOND; ts.tv_sec++; } /* if adjustment is too much negative */ while ( ts.tv_nsec <= (-1 * TOD_NANOSECONDS_PER_SECOND) ) { 8003488: 50 43 ff fe bgeu r2,r3,8003480 800348c: 5b 83 00 18 sw (sp+24),r3 8003490: 5b 84 00 14 sw (sp+20),r4 ts.tv_nsec += TOD_NANOSECONDS_PER_SECOND; ts.tv_sec--; } _TOD_Set( &ts ); 8003494: b9 a0 08 00 mv r1,r13 8003498: f8 00 05 87 calli 8004ab4 <_TOD_Set> _Thread_Enable_dispatch(); 800349c: f8 00 0b d3 calli 80063e8 <_Thread_Enable_dispatch> /* set the user's output */ if ( olddelta ) *olddelta = *delta; return 0; 80034a0: 34 01 00 00 mvi r1,0 _TOD_Set( &ts ); _Thread_Enable_dispatch(); /* set the user's output */ if ( olddelta ) 80034a4: 45 80 ff 9f be r12,r0,8003320 *olddelta = *delta; 80034a8: 29 62 00 00 lw r2,(r11+0) 80034ac: 59 82 00 00 sw (r12+0),r2 80034b0: 29 62 00 04 lw r2,(r11+4) 80034b4: 59 82 00 04 sw (r12+4),r2 return 0; } 80034b8: 2b 9d 00 04 lw ra,(sp+4) 80034bc: 2b 8b 00 10 lw r11,(sp+16) 80034c0: 2b 8c 00 0c lw r12,(sp+12) 80034c4: 2b 8d 00 08 lw r13,(sp+8) 80034c8: 37 9c 00 18 addi sp,sp,24 80034cc: c3 a0 00 00 ret =============================================================================== 08003d40 : * operation(s) cannot be canceled */ int aio_cancel(int fildes, struct aiocb *aiocbp) { 8003d40: 37 9c ff ec addi sp,sp,-20 8003d44: 5b 8b 00 14 sw (sp+20),r11 8003d48: 5b 8c 00 10 sw (sp+16),r12 8003d4c: 5b 8d 00 0c sw (sp+12),r13 8003d50: 5b 8e 00 08 sw (sp+8),r14 8003d54: 5b 9d 00 04 sw (sp+4),ra rtems_aio_request_chain *r_chain; int result; pthread_mutex_lock (&aio_request_queue.mutex); 8003d58: 78 0b 08 01 mvhi r11,0x801 8003d5c: 39 6b 88 38 ori r11,r11,0x8838 * operation(s) cannot be canceled */ int aio_cancel(int fildes, struct aiocb *aiocbp) { 8003d60: b8 20 68 00 mv r13,r1 rtems_aio_request_chain *r_chain; int result; pthread_mutex_lock (&aio_request_queue.mutex); 8003d64: b9 60 08 00 mv r1,r11 * operation(s) cannot be canceled */ int aio_cancel(int fildes, struct aiocb *aiocbp) { 8003d68: b8 40 60 00 mv r12,r2 rtems_aio_request_chain *r_chain; int result; pthread_mutex_lock (&aio_request_queue.mutex); 8003d6c: f8 00 05 1f calli 80051e8 if (fcntl (fildes, F_GETFD) < 0) { 8003d70: b9 a0 08 00 mv r1,r13 8003d74: 34 02 00 01 mvi r2,1 8003d78: f8 00 1e f4 calli 800b948 8003d7c: 4c 20 00 08 bge r1,r0,8003d9c pthread_mutex_unlock(&aio_request_queue.mutex); 8003d80: b9 60 08 00 mv r1,r11 8003d84: f8 00 05 49 calli 80052a8 rtems_set_errno_and_return_minus_one (EBADF); 8003d88: f8 00 30 87 calli 800ffa4 <__errno> 8003d8c: 34 02 00 09 mvi r2,9 8003d90: 58 22 00 00 sw (r1+0),r2 8003d94: 34 0c ff ff mvi r12,-1 8003d98: e0 00 00 16 bi 8003df0 } /* if aiocbp is NULL remove all request for given file descriptor */ if (aiocbp == NULL) { 8003d9c: 45 80 00 40 be r12,r0,8003e9c pthread_mutex_unlock (&aio_request_queue.mutex); return AIO_CANCELED; } else { AIO_printf ("Cancel request\n"); if (aiocbp->aio_fildes != fildes) { 8003da0: 29 8e 00 00 lw r14,(r12+0) 8003da4: 5d cd 00 37 bne r14,r13,8003e80 pthread_mutex_unlock (&aio_request_queue.mutex); rtems_set_errno_and_return_minus_one (EINVAL); } r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0); 8003da8: 78 01 08 01 mvhi r1,0x801 8003dac: 38 21 88 80 ori r1,r1,0x8880 8003db0: b9 c0 10 00 mv r2,r14 8003db4: 34 03 00 00 mvi r3,0 8003db8: f8 00 00 e0 calli 8004138 8003dbc: b8 20 68 00 mv r13,r1 if (r_chain == NULL) { 8003dc0: 44 20 00 14 be r1,r0,8003e10 return AIO_ALLDONE; } } AIO_printf ("Request on [WQ]\n"); pthread_mutex_lock (&r_chain->mutex); 8003dc4: 34 2e 00 1c addi r14,r1,28 8003dc8: b9 c0 08 00 mv r1,r14 8003dcc: f8 00 05 07 calli 80051e8 result = rtems_aio_remove_req (&r_chain->perfd, aiocbp); 8003dd0: b9 80 10 00 mv r2,r12 8003dd4: 35 a1 00 08 addi r1,r13,8 8003dd8: f8 00 02 10 calli 8004618 8003ddc: b8 20 60 00 mv r12,r1 pthread_mutex_unlock (&r_chain->mutex); 8003de0: b9 c0 08 00 mv r1,r14 8003de4: f8 00 05 31 calli 80052a8 pthread_mutex_unlock (&aio_request_queue.mutex); 8003de8: b9 60 08 00 mv r1,r11 8003dec: f8 00 05 2f calli 80052a8 return result; } return AIO_ALLDONE; } 8003df0: b9 80 08 00 mv r1,r12 8003df4: 2b 9d 00 04 lw ra,(sp+4) 8003df8: 2b 8b 00 14 lw r11,(sp+20) 8003dfc: 2b 8c 00 10 lw r12,(sp+16) 8003e00: 2b 8d 00 0c lw r13,(sp+12) 8003e04: 2b 8e 00 08 lw r14,(sp+8) 8003e08: 37 9c 00 14 addi sp,sp,20 8003e0c: c3 a0 00 00 ret rtems_set_errno_and_return_minus_one (EINVAL); } r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0); if (r_chain == NULL) { if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) { 8003e10: 29 62 00 54 lw r2,(r11+84) 8003e14: 78 01 08 01 mvhi r1,0x801 8003e18: 38 21 88 90 ori r1,r1,0x8890 8003e1c: 44 41 00 15 be r2,r1,8003e70 <== NEVER TAKEN r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0); 8003e20: 78 01 08 01 mvhi r1,0x801 8003e24: 38 21 88 8c ori r1,r1,0x888c 8003e28: b9 c0 10 00 mv r2,r14 8003e2c: 34 03 00 00 mvi r3,0 8003e30: f8 00 00 c2 calli 8004138 if (r_chain == NULL) { 8003e34: 44 20 00 13 be r1,r0,8003e80 rtems_set_errno_and_return_minus_one (EINVAL); } AIO_printf ("Request on [IQ]\n"); result = rtems_aio_remove_req (&r_chain->perfd, aiocbp); 8003e38: b9 80 10 00 mv r2,r12 8003e3c: 34 21 00 08 addi r1,r1,8 8003e40: f8 00 01 f6 calli 8004618 8003e44: b8 20 60 00 mv r12,r1 pthread_mutex_unlock (&aio_request_queue.mutex); 8003e48: b9 60 08 00 mv r1,r11 8003e4c: f8 00 05 17 calli 80052a8 pthread_mutex_unlock (&r_chain->mutex); pthread_mutex_unlock (&aio_request_queue.mutex); return result; } return AIO_ALLDONE; } 8003e50: b9 80 08 00 mv r1,r12 8003e54: 2b 9d 00 04 lw ra,(sp+4) 8003e58: 2b 8b 00 14 lw r11,(sp+20) 8003e5c: 2b 8c 00 10 lw r12,(sp+16) 8003e60: 2b 8d 00 0c lw r13,(sp+12) 8003e64: 2b 8e 00 08 lw r14,(sp+8) 8003e68: 37 9c 00 14 addi sp,sp,20 8003e6c: c3 a0 00 00 ret result = rtems_aio_remove_req (&r_chain->perfd, aiocbp); pthread_mutex_unlock (&aio_request_queue.mutex); return result; } else { pthread_mutex_unlock (&aio_request_queue.mutex); 8003e70: b9 60 08 00 mv r1,r11 8003e74: f8 00 05 0d calli 80052a8 return AIO_ALLDONE; 8003e78: 34 0c 00 02 mvi r12,2 8003e7c: e3 ff ff dd bi 8003df0 r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0); if (r_chain == NULL) { if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) { r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0); if (r_chain == NULL) { pthread_mutex_unlock (&aio_request_queue.mutex); 8003e80: b9 60 08 00 mv r1,r11 8003e84: f8 00 05 09 calli 80052a8 rtems_set_errno_and_return_minus_one (EINVAL); 8003e88: f8 00 30 47 calli 800ffa4 <__errno> 8003e8c: 34 02 00 16 mvi r2,22 8003e90: 58 22 00 00 sw (r1+0),r2 8003e94: 34 0c ff ff mvi r12,-1 8003e98: e3 ff ff d6 bi 8003df0 /* if aiocbp is NULL remove all request for given file descriptor */ if (aiocbp == NULL) { AIO_printf ("Cancel all requests\n"); r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0); 8003e9c: 78 01 08 01 mvhi r1,0x801 8003ea0: 38 21 88 80 ori r1,r1,0x8880 8003ea4: b9 a0 10 00 mv r2,r13 8003ea8: 34 03 00 00 mvi r3,0 8003eac: f8 00 00 a3 calli 8004138 8003eb0: b8 20 70 00 mv r14,r1 if (r_chain == NULL) { 8003eb4: 44 2c 00 0e be r1,r12,8003eec return AIO_ALLDONE; } AIO_printf ("Request chain on [WQ]\n"); pthread_mutex_lock (&r_chain->mutex); 8003eb8: 34 2c 00 1c addi r12,r1,28 8003ebc: b9 80 08 00 mv r1,r12 8003ec0: f8 00 04 ca calli 80051e8 */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); 8003ec4: b9 c0 08 00 mv r1,r14 8003ec8: f8 00 0b 0e calli 8006b00 <_Chain_Extract> rtems_chain_extract (&r_chain->next_fd); rtems_aio_remove_fd (r_chain); 8003ecc: b9 c0 08 00 mv r1,r14 8003ed0: f8 00 01 b3 calli 800459c pthread_mutex_unlock (&r_chain->mutex); 8003ed4: b9 80 08 00 mv r1,r12 8003ed8: f8 00 04 f4 calli 80052a8 pthread_mutex_unlock (&aio_request_queue.mutex); 8003edc: b9 60 08 00 mv r1,r11 8003ee0: f8 00 04 f2 calli 80052a8 return AIO_CANCELED; 8003ee4: 34 0c 00 00 mvi r12,0 8003ee8: e3 ff ff c2 bi 8003df0 r_chain = rtems_aio_search_fd (&aio_request_queue.work_req, fildes, 0); if (r_chain == NULL) { AIO_printf ("Request chain not on [WQ]\n"); if (!rtems_chain_is_empty (&aio_request_queue.idle_req)) { 8003eec: 29 62 00 54 lw r2,(r11+84) 8003ef0: 78 01 08 01 mvhi r1,0x801 8003ef4: 38 21 88 90 ori r1,r1,0x8890 8003ef8: 44 41 ff de be r2,r1,8003e70 <== NEVER TAKEN r_chain = rtems_aio_search_fd (&aio_request_queue.idle_req, fildes, 0); 8003efc: 78 01 08 01 mvhi r1,0x801 8003f00: 38 21 88 8c ori r1,r1,0x888c 8003f04: b9 a0 10 00 mv r2,r13 8003f08: 34 03 00 00 mvi r3,0 8003f0c: f8 00 00 8b calli 8004138 8003f10: b8 20 60 00 mv r12,r1 if (r_chain == NULL) { 8003f14: 44 2e ff d7 be r1,r14,8003e70 8003f18: f8 00 0a fa calli 8006b00 <_Chain_Extract> } AIO_printf ("Request chain on [IQ]\n"); rtems_chain_extract (&r_chain->next_fd); rtems_aio_remove_fd (r_chain); 8003f1c: b9 80 08 00 mv r1,r12 pthread_mutex_destroy (&r_chain->mutex); 8003f20: 35 8d 00 1c addi r13,r12,28 } AIO_printf ("Request chain on [IQ]\n"); rtems_chain_extract (&r_chain->next_fd); rtems_aio_remove_fd (r_chain); 8003f24: f8 00 01 9e calli 800459c pthread_mutex_destroy (&r_chain->mutex); 8003f28: b9 a0 08 00 mv r1,r13 8003f2c: f8 00 03 e7 calli 8004ec8 pthread_cond_destroy (&r_chain->mutex); 8003f30: b9 a0 08 00 mv r1,r13 8003f34: f8 00 02 d4 calli 8004a84 free (r_chain); 8003f38: b9 80 08 00 mv r1,r12 8003f3c: fb ff f8 fb calli 8002328 pthread_mutex_unlock (&aio_request_queue.mutex); 8003f40: b9 60 08 00 mv r1,r11 8003f44: f8 00 04 d9 calli 80052a8 return AIO_CANCELED; 8003f48: 34 0c 00 00 mvi r12,0 8003f4c: e3 ff ff a9 bi 8003df0 =============================================================================== 08003f58 : int aio_fsync( int op, struct aiocb *aiocbp ) { 8003f58: 37 9c ff f4 addi sp,sp,-12 8003f5c: 5b 8b 00 0c sw (sp+12),r11 8003f60: 5b 8c 00 08 sw (sp+8),r12 8003f64: 5b 9d 00 04 sw (sp+4),ra 8003f68: b8 40 58 00 mv r11,r2 rtems_aio_request *req; int mode; if (op != O_SYNC) 8003f6c: 34 02 20 00 mvi r2,8192 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); 8003f70: 34 0c 00 16 mvi r12,22 ) { rtems_aio_request *req; int mode; if (op != O_SYNC) 8003f74: 5c 22 00 09 bne r1,r2,8003f98 rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); mode = fcntl (aiocbp->aio_fildes, F_GETFL); 8003f78: 29 61 00 00 lw r1,(r11+0) 8003f7c: 34 02 00 03 mvi r2,3 8003f80: f8 00 1e 72 calli 800b948 if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR))) 8003f84: 20 21 00 03 andi r1,r1,0x3 8003f88: 34 21 ff ff addi r1,r1,-1 8003f8c: 34 02 00 01 mvi r2,1 8003f90: 50 41 00 0d bgeu r2,r1,8003fc4 rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); 8003f94: 34 0c 00 09 mvi r12,9 8003f98: 34 01 ff ff mvi r1,-1 8003f9c: 59 6c 00 2c sw (r11+44),r12 8003fa0: 59 61 00 30 sw (r11+48),r1 8003fa4: f8 00 30 00 calli 800ffa4 <__errno> 8003fa8: 58 2c 00 00 sw (r1+0),r12 8003fac: 34 01 ff ff mvi r1,-1 req->aiocbp = aiocbp; req->aiocbp->aio_lio_opcode = LIO_SYNC; return rtems_aio_enqueue (req); } 8003fb0: 2b 9d 00 04 lw ra,(sp+4) 8003fb4: 2b 8b 00 0c lw r11,(sp+12) 8003fb8: 2b 8c 00 08 lw r12,(sp+8) 8003fbc: 37 9c 00 0c addi sp,sp,12 8003fc0: c3 a0 00 00 ret 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)); 8003fc4: 34 01 00 18 mvi r1,24 8003fc8: fb ff fa b1 calli 8002a8c if (req == NULL) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); 8003fcc: 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) 8003fd0: 44 20 ff f2 be r1,r0,8003f98 <== NEVER TAKEN rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); req->aiocbp = aiocbp; req->aiocbp->aio_lio_opcode = LIO_SYNC; 8003fd4: 34 03 00 03 mvi r3,3 8003fd8: 59 63 00 28 sw (r11+40),r3 req = malloc (sizeof (rtems_aio_request)); if (req == NULL) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); req->aiocbp = aiocbp; 8003fdc: 58 2b 00 14 sw (r1+20),r11 req->aiocbp->aio_lio_opcode = LIO_SYNC; return rtems_aio_enqueue (req); 8003fe0: f8 00 01 b1 calli 80046a4 } 8003fe4: 2b 9d 00 04 lw ra,(sp+4) 8003fe8: 2b 8b 00 0c lw r11,(sp+12) 8003fec: 2b 8c 00 08 lw r12,(sp+8) 8003ff0: 37 9c 00 0c addi sp,sp,12 8003ff4: c3 a0 00 00 ret =============================================================================== 080048b4 : * 0 - otherwise */ int aio_read (struct aiocb *aiocbp) { 80048b4: 37 9c ff f4 addi sp,sp,-12 80048b8: 5b 8b 00 0c sw (sp+12),r11 80048bc: 5b 8c 00 08 sw (sp+8),r12 80048c0: 5b 9d 00 04 sw (sp+4),ra 80048c4: b8 20 58 00 mv r11,r1 rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); 80048c8: 28 21 00 00 lw r1,(r1+0) 80048cc: 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); 80048d0: 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); 80048d4: f8 00 1c 1d calli 800b948 if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR))) 80048d8: 20 21 00 03 andi r1,r1,0x3 80048dc: 7c 22 00 02 cmpnei r2,r1,2 80048e0: 7c 21 00 00 cmpnei r1,r1,0 80048e4: a0 41 08 00 and r1,r2,r1 80048e8: 5c 20 00 06 bne r1,r0,8004900 rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX) 80048ec: 29 6c 00 10 lw r12,(r11+16) 80048f0: 5d 81 00 03 bne r12,r1,80048fc rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); if (aiocbp->aio_offset < 0) 80048f4: 29 61 00 04 lw r1,(r11+4) 80048f8: 4c 2c 00 09 bge r1,r12,800491c mode = fcntl (aiocbp->aio_fildes, F_GETFL); if (!(((mode & O_ACCMODE) == O_RDONLY) || ((mode & O_ACCMODE) == O_RDWR))) rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX) rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); 80048fc: 34 0c 00 16 mvi r12,22 8004900: 34 01 ff ff mvi r1,-1 8004904: 59 6c 00 2c sw (r11+44),r12 8004908: 59 61 00 30 sw (r11+48),r1 800490c: f8 00 2d a6 calli 800ffa4 <__errno> 8004910: 58 2c 00 00 sw (r1+0),r12 8004914: 34 01 ff ff mvi r1,-1 8004918: e0 00 00 08 bi 8004938 if (aiocbp->aio_offset < 0) rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); req = malloc (sizeof (rtems_aio_request)); 800491c: 34 01 00 18 mvi r1,24 8004920: fb ff f8 5b calli 8002a8c if (req == NULL) 8004924: 44 2c 00 0a be r1,r12,800494c <== NEVER TAKEN rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); req->aiocbp = aiocbp; req->aiocbp->aio_lio_opcode = LIO_READ; 8004928: 34 03 00 01 mvi r3,1 800492c: 59 63 00 28 sw (r11+40),r3 req = malloc (sizeof (rtems_aio_request)); if (req == NULL) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); req->aiocbp = aiocbp; 8004930: 58 2b 00 14 sw (r1+20),r11 req->aiocbp->aio_lio_opcode = LIO_READ; return rtems_aio_enqueue (req); 8004934: fb ff ff 5c calli 80046a4 } 8004938: 2b 9d 00 04 lw ra,(sp+4) 800493c: 2b 8b 00 0c lw r11,(sp+12) 8004940: 2b 8c 00 08 lw r12,(sp+8) 8004944: 37 9c 00 0c addi sp,sp,12 8004948: c3 a0 00 00 ret if (aiocbp->aio_offset < 0) rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); req = malloc (sizeof (rtems_aio_request)); if (req == NULL) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); 800494c: 34 0c 00 0b mvi r12,11 <== NOT EXECUTED 8004950: e3 ff ff ec bi 8004900 <== NOT EXECUTED =============================================================================== 0800495c : * 0 - otherwise */ int aio_write (struct aiocb *aiocbp) { 800495c: 37 9c ff f4 addi sp,sp,-12 8004960: 5b 8b 00 0c sw (sp+12),r11 8004964: 5b 8c 00 08 sw (sp+8),r12 8004968: 5b 9d 00 04 sw (sp+4),ra 800496c: b8 20 58 00 mv r11,r1 rtems_aio_request *req; int mode; mode = fcntl (aiocbp->aio_fildes, F_GETFL); 8004970: 28 21 00 00 lw r1,(r1+0) 8004974: 34 02 00 03 mvi r2,3 8004978: f8 00 1b f4 calli 800b948 if (!(((mode & O_ACCMODE) == O_WRONLY) || ((mode & O_ACCMODE) == O_RDWR))) 800497c: 20 21 00 03 andi r1,r1,0x3 8004980: 34 21 ff ff addi r1,r1,-1 8004984: 34 02 00 01 mvi r2,1 8004988: 50 41 00 09 bgeu r2,r1,80049ac rtems_aio_set_errno_return_minus_one (EBADF, aiocbp); 800498c: 34 0c 00 09 mvi r12,9 if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX) rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); 8004990: 34 01 ff ff mvi r1,-1 8004994: 59 6c 00 2c sw (r11+44),r12 8004998: 59 61 00 30 sw (r11+48),r1 800499c: f8 00 2d 82 calli 800ffa4 <__errno> 80049a0: 58 2c 00 00 sw (r1+0),r12 80049a4: 34 01 ff ff mvi r1,-1 80049a8: e0 00 00 0f bi 80049e4 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); if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX) 80049ac: 29 61 00 10 lw r1,(r11+16) 80049b0: 5c 20 00 03 bne r1,r0,80049bc rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); if (aiocbp->aio_offset < 0) 80049b4: 29 62 00 04 lw r2,(r11+4) 80049b8: 4c 41 00 03 bge r2,r1,80049c4 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); if (aiocbp->aio_reqprio < 0 || aiocbp->aio_reqprio > AIO_PRIO_DELTA_MAX) rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); 80049bc: 34 0c 00 16 mvi r12,22 80049c0: e3 ff ff f4 bi 8004990 if (aiocbp->aio_offset < 0) rtems_aio_set_errno_return_minus_one (EINVAL, aiocbp); req = malloc (sizeof (rtems_aio_request)); 80049c4: 34 01 00 18 mvi r1,24 80049c8: fb ff f8 31 calli 8002a8c if (req == NULL) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); 80049cc: 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) 80049d0: 44 20 ff f0 be r1,r0,8004990 <== NEVER TAKEN rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); req->aiocbp = aiocbp; req->aiocbp->aio_lio_opcode = LIO_WRITE; 80049d4: 34 03 00 02 mvi r3,2 80049d8: 59 63 00 28 sw (r11+40),r3 req = malloc (sizeof (rtems_aio_request)); if (req == NULL) rtems_aio_set_errno_return_minus_one (EAGAIN, aiocbp); req->aiocbp = aiocbp; 80049dc: 58 2b 00 14 sw (r1+20),r11 req->aiocbp->aio_lio_opcode = LIO_WRITE; return rtems_aio_enqueue (req); 80049e0: fb ff ff 31 calli 80046a4 } 80049e4: 2b 9d 00 04 lw ra,(sp+4) 80049e8: 2b 8b 00 0c lw r11,(sp+12) 80049ec: 2b 8c 00 08 lw r12,(sp+8) 80049f0: 37 9c 00 0c addi sp,sp,12 80049f4: c3 a0 00 00 ret =============================================================================== 080014f8 : #include int chroot( const char *pathname ) { 80014f8: 37 9c ff dc addi sp,sp,-36 80014fc: 5b 8b 00 10 sw (sp+16),r11 8001500: 5b 8c 00 0c sw (sp+12),r12 8001504: 5b 8d 00 08 sw (sp+8),r13 8001508: 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) { 800150c: 78 0b 08 01 mvhi r11,0x801 8001510: 39 6b 51 08 ori r11,r11,0x5108 8001514: 29 6d 00 00 lw r13,(r11+0) 8001518: 78 02 08 01 mvhi r2,0x801 800151c: 38 42 57 90 ori r2,r2,0x5790 #include int chroot( const char *pathname ) { 8001520: b8 20 60 00 mv r12,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) { 8001524: 45 a2 00 22 be r13,r2,80015ac rtems_libio_set_private_env(); /* try to set a new private env*/ if (rtems_current_user_env == &rtems_global_user_env) /* not ok */ rtems_set_errno_and_return_minus_one( ENOTSUP ); } result = chdir(pathname); 8001528: b9 80 08 00 mv r1,r12 800152c: f8 00 1d a9 calli 8008bd0 8001530: b8 20 60 00 mv r12,r1 if (result) { 8001534: 5c 20 00 26 bne r1,r0,80015cc rtems_set_errno_and_return_minus_one( errno ); } /* clone the new root location */ if (rtems_filesystem_evaluate_path(".", 1, 0, &loc, 0)) { 8001538: 78 01 08 01 mvhi r1,0x801 800153c: 38 21 39 b4 ori r1,r1,0x39b4 8001540: 34 02 00 01 mvi r2,1 8001544: 34 03 00 00 mvi r3,0 8001548: 37 84 00 14 addi r4,sp,20 800154c: 34 05 00 00 mvi r5,0 8001550: f8 00 00 79 calli 8001734 8001554: 5c 2c 00 1e bne r1,r12,80015cc <== 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); 8001558: 29 61 00 00 lw r1,(r11+0) 800155c: 34 21 00 18 addi r1,r1,24 8001560: f8 00 00 c3 calli 800186c rtems_filesystem_root = loc; 8001564: 29 61 00 00 lw r1,(r11+0) 8001568: 2b 82 00 14 lw r2,(sp+20) 800156c: 58 22 00 18 sw (r1+24),r2 8001570: 2b 82 00 18 lw r2,(sp+24) 8001574: 58 22 00 1c sw (r1+28),r2 8001578: 2b 82 00 1c lw r2,(sp+28) 800157c: 58 22 00 20 sw (r1+32),r2 8001580: 2b 82 00 20 lw r2,(sp+32) 8001584: 58 22 00 24 sw (r1+36),r2 8001588: 2b 82 00 24 lw r2,(sp+36) 800158c: 58 22 00 28 sw (r1+40),r2 return 0; 8001590: 34 01 00 00 mvi r1,0 } 8001594: 2b 9d 00 04 lw ra,(sp+4) 8001598: 2b 8b 00 10 lw r11,(sp+16) 800159c: 2b 8c 00 0c lw r12,(sp+12) 80015a0: 2b 8d 00 08 lw r13,(sp+8) 80015a4: 37 9c 00 24 addi sp,sp,36 80015a8: c3 a0 00 00 ret int result; rtems_filesystem_location_info_t loc; /* an automatic call to new private env the first time */ if (rtems_current_user_env == &rtems_global_user_env) { rtems_libio_set_private_env(); /* try to set a new private env*/ 80015ac: f8 00 05 e3 calli 8002d38 if (rtems_current_user_env == &rtems_global_user_env) /* not ok */ 80015b0: 29 61 00 00 lw r1,(r11+0) 80015b4: 5c 2d ff dd bne r1,r13,8001528 rtems_set_errno_and_return_minus_one( ENOTSUP ); 80015b8: f8 00 2f 79 calli 800d39c <__errno> 80015bc: 34 02 00 86 mvi r2,134 80015c0: 58 22 00 00 sw (r1+0),r2 80015c4: 34 01 ff ff mvi r1,-1 80015c8: e3 ff ff f3 bi 8001594 } /* clone the new root location */ if (rtems_filesystem_evaluate_path(".", 1, 0, &loc, 0)) { /* our cwd has changed, though - but there is no easy way of return :-( */ rtems_set_errno_and_return_minus_one( errno ); 80015cc: f8 00 2f 74 calli 800d39c <__errno> 80015d0: b8 20 58 00 mv r11,r1 80015d4: f8 00 2f 72 calli 800d39c <__errno> 80015d8: 28 22 00 00 lw r2,(r1+0) 80015dc: 34 01 ff ff mvi r1,-1 80015e0: 59 62 00 00 sw (r11+0),r2 80015e4: e3 ff ff ec bi 8001594 =============================================================================== 080030e8 : int clock_gettime( clockid_t clock_id, struct timespec *tp ) { 80030e8: 37 9c ff fc addi sp,sp,-4 80030ec: 5b 9d 00 04 sw (sp+4),ra if ( !tp ) 80030f0: 44 40 00 09 be r2,r0,8003114 rtems_set_errno_and_return_minus_one( EINVAL ); if ( clock_id == CLOCK_REALTIME ) { 80030f4: 34 03 00 01 mvi r3,1 80030f8: 44 23 00 1b be r1,r3,8003164 _TOD_Get(tp); return 0; } #ifdef CLOCK_MONOTONIC if ( clock_id == CLOCK_MONOTONIC ) { 80030fc: 34 03 00 04 mvi r3,4 8003100: 44 23 00 13 be r1,r3,800314c <== NEVER TAKEN return 0; } #endif #ifdef _POSIX_CPUTIME if ( clock_id == CLOCK_PROCESS_CPUTIME ) { 8003104: 34 03 00 02 mvi r3,2 8003108: 44 23 00 11 be r1,r3,800314c return 0; } #endif #ifdef _POSIX_THREAD_CPUTIME if ( clock_id == CLOCK_THREAD_CPUTIME ) 800310c: 34 02 00 03 mvi r2,3 8003110: 44 22 00 08 be r1,r2,8003130 rtems_set_errno_and_return_minus_one( ENOSYS ); #endif rtems_set_errno_and_return_minus_one( EINVAL ); 8003114: f8 00 2c 50 calli 800e254 <__errno> 8003118: 34 02 00 16 mvi r2,22 800311c: 58 22 00 00 sw (r1+0),r2 8003120: 34 01 ff ff mvi r1,-1 return 0; } 8003124: 2b 9d 00 04 lw ra,(sp+4) 8003128: 37 9c 00 04 addi sp,sp,4 800312c: c3 a0 00 00 ret } #endif #ifdef _POSIX_THREAD_CPUTIME if ( clock_id == CLOCK_THREAD_CPUTIME ) rtems_set_errno_and_return_minus_one( ENOSYS ); 8003130: f8 00 2c 49 calli 800e254 <__errno> 8003134: 34 02 00 58 mvi r2,88 8003138: 58 22 00 00 sw (r1+0),r2 800313c: 34 01 ff ff mvi r1,-1 #endif rtems_set_errno_and_return_minus_one( EINVAL ); return 0; } 8003140: 2b 9d 00 04 lw ra,(sp+4) 8003144: 37 9c 00 04 addi sp,sp,4 8003148: c3 a0 00 00 ret } #endif #ifdef _POSIX_CPUTIME if ( clock_id == CLOCK_PROCESS_CPUTIME ) { _TOD_Get_uptime_as_timespec( tp ); 800314c: b8 40 08 00 mv r1,r2 8003150: f8 00 07 62 calli 8004ed8 <_TOD_Get_uptime_as_timespec> return 0; 8003154: 34 01 00 00 mvi r1,0 #endif rtems_set_errno_and_return_minus_one( EINVAL ); return 0; } 8003158: 2b 9d 00 04 lw ra,(sp+4) 800315c: 37 9c 00 04 addi sp,sp,4 8003160: c3 a0 00 00 ret { if ( !tp ) rtems_set_errno_and_return_minus_one( EINVAL ); if ( clock_id == CLOCK_REALTIME ) { _TOD_Get(tp); 8003164: b8 40 08 00 mv r1,r2 8003168: f8 00 07 39 calli 8004e4c <_TOD_Get> return 0; 800316c: 34 01 00 00 mvi r1,0 8003170: e3 ff ff ed bi 8003124 =============================================================================== 08003174 : int clock_settime( clockid_t clock_id, const struct timespec *tp ) { 8003174: 37 9c ff fc addi sp,sp,-4 8003178: 5b 9d 00 04 sw (sp+4),ra if ( !tp ) 800317c: 44 40 00 07 be r2,r0,8003198 <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); if ( clock_id == CLOCK_REALTIME ) { 8003180: 34 03 00 01 mvi r3,1 8003184: 44 23 00 0c be r1,r3,80031b4 _Thread_Disable_dispatch(); _TOD_Set( tp ); _Thread_Enable_dispatch(); } #ifdef _POSIX_CPUTIME else if ( clock_id == CLOCK_PROCESS_CPUTIME ) 8003188: 34 02 00 02 mvi r2,2 800318c: 44 22 00 1c be r1,r2,80031fc rtems_set_errno_and_return_minus_one( ENOSYS ); #endif #ifdef _POSIX_THREAD_CPUTIME else if ( clock_id == CLOCK_THREAD_CPUTIME ) 8003190: 34 02 00 03 mvi r2,3 8003194: 44 22 00 1a be r1,r2,80031fc rtems_set_errno_and_return_minus_one( ENOSYS ); #endif else rtems_set_errno_and_return_minus_one( EINVAL ); 8003198: f8 00 2c 2f calli 800e254 <__errno> 800319c: 34 02 00 16 mvi r2,22 80031a0: 58 22 00 00 sw (r1+0),r2 80031a4: 34 01 ff ff mvi r1,-1 return 0; } 80031a8: 2b 9d 00 04 lw ra,(sp+4) 80031ac: 37 9c 00 04 addi sp,sp,4 80031b0: c3 a0 00 00 ret { if ( !tp ) rtems_set_errno_and_return_minus_one( EINVAL ); if ( clock_id == CLOCK_REALTIME ) { if ( tp->tv_sec < TOD_SECONDS_1970_THROUGH_1988 ) 80031b4: 78 04 08 01 mvhi r4,0x801 80031b8: 38 84 f3 4c ori r4,r4,0xf34c 80031bc: 28 43 00 00 lw r3,(r2+0) 80031c0: 28 81 00 00 lw r1,(r4+0) 80031c4: 54 61 00 02 bgu r3,r1,80031cc 80031c8: e3 ff ff f4 bi 8003198 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 80031cc: 78 01 08 02 mvhi r1,0x802 80031d0: 38 21 18 e8 ori r1,r1,0x18e8 80031d4: 28 23 00 00 lw r3,(r1+0) 80031d8: 34 63 00 01 addi r3,r3,1 80031dc: 58 23 00 00 sw (r1+0),r3 rtems_set_errno_and_return_minus_one( EINVAL ); _Thread_Disable_dispatch(); _TOD_Set( tp ); 80031e0: b8 40 08 00 mv r1,r2 80031e4: f8 00 07 5a calli 8004f4c <_TOD_Set> _Thread_Enable_dispatch(); 80031e8: f8 00 0d a6 calli 8006880 <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one( ENOSYS ); #endif else rtems_set_errno_and_return_minus_one( EINVAL ); return 0; 80031ec: 34 01 00 00 mvi r1,0 } 80031f0: 2b 9d 00 04 lw ra,(sp+4) 80031f4: 37 9c 00 04 addi sp,sp,4 80031f8: c3 a0 00 00 ret else if ( clock_id == CLOCK_PROCESS_CPUTIME ) rtems_set_errno_and_return_minus_one( ENOSYS ); #endif #ifdef _POSIX_THREAD_CPUTIME else if ( clock_id == CLOCK_THREAD_CPUTIME ) rtems_set_errno_and_return_minus_one( ENOSYS ); 80031fc: f8 00 2c 16 calli 800e254 <__errno> 8003200: 34 02 00 58 mvi r2,88 8003204: 58 22 00 00 sw (r1+0),r2 8003208: 34 01 ff ff mvi r1,-1 #endif else rtems_set_errno_and_return_minus_one( EINVAL ); return 0; } 800320c: 2b 9d 00 04 lw ra,(sp+4) 8003210: 37 9c 00 04 addi sp,sp,4 8003214: c3 a0 00 00 ret =============================================================================== 08006aac : const char *pathname, size_t pathnamelen, int flags, rtems_filesystem_location_info_t *pathloc ) { 8006aac: 37 9c ff dc addi sp,sp,-36 8006ab0: 5b 8b 00 24 sw (sp+36),r11 8006ab4: 5b 8c 00 20 sw (sp+32),r12 8006ab8: 5b 8d 00 1c sw (sp+28),r13 8006abc: 5b 8e 00 18 sw (sp+24),r14 8006ac0: 5b 8f 00 14 sw (sp+20),r15 8006ac4: 5b 90 00 10 sw (sp+16),r16 8006ac8: 5b 91 00 0c sw (sp+12),r17 8006acc: 5b 92 00 08 sw (sp+8),r18 8006ad0: 5b 9d 00 04 sw (sp+4),ra int i; rtems_device_name_t *device_name_table; /* see if 'flags' is valid */ if ( !rtems_libio_is_valid_perms( flags ) ) 8006ad4: 34 05 ff f8 mvi r5,-8 8006ad8: a0 65 18 00 and r3,r3,r5 const char *pathname, size_t pathnamelen, int flags, rtems_filesystem_location_info_t *pathloc ) { 8006adc: b8 20 90 00 mv r18,r1 8006ae0: b8 40 70 00 mv r14,r2 8006ae4: b8 80 78 00 mv r15,r4 int i; rtems_device_name_t *device_name_table; /* see if 'flags' is valid */ if ( !rtems_libio_is_valid_perms( flags ) ) 8006ae8: 5c 60 00 39 bne r3,r0,8006bcc <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EPERM ); /* get the device name table */ device_name_table = (rtems_device_name_t *)pathloc->node_access; 8006aec: 28 90 00 00 lw r16,(r4+0) if (!device_name_table) 8006af0: 46 03 00 3c be r16,r3,8006be0 rtems_set_errno_and_return_minus_one( EFAULT ); for (i = 0; i < rtems_device_table_size; i++) { 8006af4: 78 02 08 01 mvhi r2,0x801 8006af8: 38 42 10 14 ori r2,r2,0x1014 8006afc: 28 51 00 00 lw r17,(r2+0) 8006b00: 34 05 00 00 mvi r5,0 8006b04: 34 0b 00 00 mvi r11,0 8006b08: 46 20 00 14 be r17,r0,8006b58 <== NEVER TAKEN if (!device_name_table[i].device_name) 8006b0c: b4 a5 28 00 add r5,r5,r5 8006b10: b4 a5 28 00 add r5,r5,r5 8006b14: b4 a5 30 00 add r6,r5,r5 8006b18: b4 c6 30 00 add r6,r6,r6 8006b1c: b4 a6 28 00 add r5,r5,r6 8006b20: b6 05 68 00 add r13,r16,r5 8006b24: 29 ac 00 00 lw r12,(r13+0) continue; if (strncmp(pathname, device_name_table[i].device_name, pathnamelen) != 0) 8006b28: ba 40 08 00 mv r1,r18 8006b2c: b9 c0 18 00 mv r3,r14 8006b30: b9 80 10 00 mv r2,r12 /* 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++) { 8006b34: 35 6b 00 01 addi r11,r11,1 if (!device_name_table[i].device_name) 8006b38: 45 80 00 06 be r12,r0,8006b50 continue; if (strncmp(pathname, device_name_table[i].device_name, pathnamelen) != 0) 8006b3c: f8 00 13 32 calli 800b804 continue; if (device_name_table[i].device_name[pathnamelen] != '\0') 8006b40: b5 8e 60 00 add r12,r12,r14 for (i = 0; i < rtems_device_table_size; i++) { if (!device_name_table[i].device_name) continue; if (strncmp(pathname, device_name_table[i].device_name, pathnamelen) != 0) 8006b44: 5c 20 00 03 bne r1,r0,8006b50 continue; if (device_name_table[i].device_name[pathnamelen] != '\0') 8006b48: 41 82 00 00 lbu r2,(r12+0) 8006b4c: 44 41 00 08 be r2,r1,8006b6c <== ALWAYS TAKEN /* get the device name table */ device_name_table = (rtems_device_name_t *)pathloc->node_access; if (!device_name_table) rtems_set_errno_and_return_minus_one( EFAULT ); for (i = 0; i < rtems_device_table_size; i++) { 8006b50: b9 60 28 00 mv r5,r11 8006b54: 56 2b ff ee bgu r17,r11,8006b0c pathloc->mt_entry = rtems_filesystem_root.mt_entry; return 0; } /* no such file or directory */ rtems_set_errno_and_return_minus_one( ENOENT ); 8006b58: f8 00 0e e2 calli 800a6e0 <__errno> 8006b5c: 34 02 00 02 mvi r2,2 8006b60: 58 22 00 00 sw (r1+0),r2 8006b64: 34 01 ff ff mvi r1,-1 8006b68: e0 00 00 0e bi 8006ba0 /* find the device, set proper values */ pathloc->node_access = (void *)&device_name_table[i]; pathloc->handlers = &devFS_file_handlers; pathloc->ops = &devFS_ops; pathloc->mt_entry = rtems_filesystem_root.mt_entry; 8006b6c: 78 01 08 01 mvhi r1,0x801 8006b70: 38 21 11 a0 ori r1,r1,0x11a0 8006b74: 28 23 00 00 lw r3,(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]; pathloc->handlers = &devFS_file_handlers; 8006b78: 78 02 08 01 mvhi r2,0x801 pathloc->ops = &devFS_ops; 8006b7c: 78 01 08 01 mvhi r1,0x801 pathloc->mt_entry = rtems_filesystem_root.mt_entry; 8006b80: 28 63 00 28 lw r3,(r3+40) continue; /* find the device, set proper values */ pathloc->node_access = (void *)&device_name_table[i]; pathloc->handlers = &devFS_file_handlers; pathloc->ops = &devFS_ops; 8006b84: 38 21 11 14 ori r1,r1,0x1114 if (device_name_table[i].device_name[pathnamelen] != '\0') continue; /* find the device, set proper values */ pathloc->node_access = (void *)&device_name_table[i]; pathloc->handlers = &devFS_file_handlers; 8006b88: 38 42 11 5c ori r2,r2,0x115c pathloc->ops = &devFS_ops; 8006b8c: 59 e1 00 0c sw (r15+12),r1 if (device_name_table[i].device_name[pathnamelen] != '\0') continue; /* find the device, set proper values */ pathloc->node_access = (void *)&device_name_table[i]; 8006b90: 59 ed 00 00 sw (r15+0),r13 pathloc->handlers = &devFS_file_handlers; 8006b94: 59 e2 00 08 sw (r15+8),r2 pathloc->ops = &devFS_ops; pathloc->mt_entry = rtems_filesystem_root.mt_entry; 8006b98: 59 e3 00 10 sw (r15+16),r3 return 0; 8006b9c: 34 01 00 00 mvi r1,0 } /* no such file or directory */ rtems_set_errno_and_return_minus_one( ENOENT ); } 8006ba0: 2b 9d 00 04 lw ra,(sp+4) 8006ba4: 2b 8b 00 24 lw r11,(sp+36) 8006ba8: 2b 8c 00 20 lw r12,(sp+32) 8006bac: 2b 8d 00 1c lw r13,(sp+28) 8006bb0: 2b 8e 00 18 lw r14,(sp+24) 8006bb4: 2b 8f 00 14 lw r15,(sp+20) 8006bb8: 2b 90 00 10 lw r16,(sp+16) 8006bbc: 2b 91 00 0c lw r17,(sp+12) 8006bc0: 2b 92 00 08 lw r18,(sp+8) 8006bc4: 37 9c 00 24 addi sp,sp,36 8006bc8: c3 a0 00 00 ret int i; rtems_device_name_t *device_name_table; /* see if 'flags' is valid */ if ( !rtems_libio_is_valid_perms( flags ) ) rtems_set_errno_and_return_minus_one( EPERM ); 8006bcc: f8 00 0e c5 calli 800a6e0 <__errno> <== NOT EXECUTED 8006bd0: 34 02 00 01 mvi r2,1 <== NOT EXECUTED 8006bd4: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED 8006bd8: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED 8006bdc: e3 ff ff f1 bi 8006ba0 <== NOT EXECUTED /* 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 ); 8006be0: f8 00 0e c0 calli 800a6e0 <__errno> 8006be4: 34 02 00 0e mvi r2,14 8006be8: 58 22 00 00 sw (r1+0),r2 8006bec: 34 01 ff ff mvi r1,-1 8006bf0: e3 ff ff ec bi 8006ba0 =============================================================================== 08000a78 : const char *path, mode_t mode, dev_t dev, rtems_filesystem_location_info_t *pathloc ) { 8000a78: 37 9c ff dc addi sp,sp,-36 8000a7c: 5b 8b 00 24 sw (sp+36),r11 8000a80: 5b 8c 00 20 sw (sp+32),r12 8000a84: 5b 8d 00 1c sw (sp+28),r13 8000a88: 5b 8e 00 18 sw (sp+24),r14 8000a8c: 5b 8f 00 14 sw (sp+20),r15 8000a90: 5b 90 00 10 sw (sp+16),r16 8000a94: 5b 91 00 0c sw (sp+12),r17 8000a98: 5b 92 00 08 sw (sp+8),r18 8000a9c: 5b 9d 00 04 sw (sp+4),ra * 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') && 8000aa0: 40 26 00 00 lbu r6,(r1+0) const char *path, mode_t mode, dev_t dev, rtems_filesystem_location_info_t *pathloc ) { 8000aa4: b8 20 60 00 mv r12,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') && 8000aa8: 34 01 00 64 mvi r1,100 const char *path, mode_t mode, dev_t dev, rtems_filesystem_location_info_t *pathloc ) { 8000aac: b8 40 80 00 mv r16,r2 8000ab0: b8 60 90 00 mv r18,r3 8000ab4: b8 80 88 00 mv r17,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') && 8000ab8: 44 c1 00 45 be r6,r1,8000bcc (path[2] == 'v') && (path[3] == '\0')) return 0; /* must be a character device or a block device */ if (!S_ISBLK(mode) && !S_ISCHR(mode)) 8000abc: 22 01 f0 00 andi r1,r16,0xf000 8000ac0: 7c 22 20 00 cmpnei r2,r1,8192 8000ac4: 7c 21 60 00 cmpnei r1,r1,24576 8000ac8: a0 41 08 00 and r1,r2,r1 8000acc: 5c 20 00 4a bne r1,r0,8000bf4 rtems_set_errno_and_return_minus_one( EINVAL ); else rtems_filesystem_split_dev_t(dev, major, minor); /* Find an empty slot in device name table */ device_name_table = (rtems_device_name_t *)pathloc->node_access; 8000ad0: 28 ad 00 00 lw r13,(r5+0) if (!device_name_table) 8000ad4: 45 a1 00 52 be r13,r1,8000c1c rtems_set_errno_and_return_minus_one( EFAULT ); for (slot = -1, i = 0; i < rtems_device_table_size; i++){ 8000ad8: 78 01 08 01 mvhi r1,0x801 8000adc: 38 21 10 14 ori r1,r1,0x1014 8000ae0: 28 2e 00 00 lw r14,(r1+0) 8000ae4: 34 05 00 00 mvi r5,0 8000ae8: 34 0f ff ff mvi r15,-1 8000aec: 34 0b 00 00 mvi r11,0 8000af0: 45 c0 00 46 be r14,r0,8000c08 if (device_name_table[i].device_name == NULL) 8000af4: b4 a5 28 00 add r5,r5,r5 8000af8: b4 a5 28 00 add r5,r5,r5 8000afc: b4 a5 30 00 add r6,r5,r5 8000b00: b4 c6 30 00 add r6,r6,r6 8000b04: b4 a6 28 00 add r5,r5,r6 8000b08: b5 a5 28 00 add r5,r13,r5 8000b0c: 28 a5 00 00 lw r5,(r5+0) slot = i; else if (strcmp(path, device_name_table[i].device_name) == 0) 8000b10: b9 80 08 00 mv r1,r12 8000b14: b8 a0 10 00 mv r2,r5 device_name_table = (rtems_device_name_t *)pathloc->node_access; if (!device_name_table) rtems_set_errno_and_return_minus_one( EFAULT ); for (slot = -1, i = 0; i < rtems_device_table_size; i++){ if (device_name_table[i].device_name == NULL) 8000b18: 44 a0 00 26 be r5,r0,8000bb0 slot = i; else if (strcmp(path, device_name_table[i].device_name) == 0) 8000b1c: f8 00 2a db calli 800b688 8000b20: 44 20 00 26 be r1,r0,8000bb8 /* 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++){ 8000b24: 35 6b 00 01 addi r11,r11,1 8000b28: b9 60 28 00 mv r5,r11 8000b2c: 55 cb ff f2 bgu r14,r11,8000af4 else if (strcmp(path, device_name_table[i].device_name) == 0) rtems_set_errno_and_return_minus_one( EEXIST ); } if (slot == -1) 8000b30: 34 01 ff ff mvi r1,-1 8000b34: 45 e1 00 35 be r15,r1,8000c08 <== NEVER TAKEN rtems_set_errno_and_return_minus_one( ENOMEM ); _ISR_Disable(level); 8000b38: 90 00 58 00 rcsr r11,IE 8000b3c: 34 01 ff fe mvi r1,-2 8000b40: a1 61 08 00 and r1,r11,r1 8000b44: d0 01 00 00 wcsr IE,r1 device_name_table[slot].device_name = (char *)path; 8000b48: b5 ef 78 00 add r15,r15,r15 8000b4c: b5 ef 78 00 add r15,r15,r15 8000b50: b5 ef 08 00 add r1,r15,r15 8000b54: b4 21 08 00 add r1,r1,r1 8000b58: b5 e1 78 00 add r15,r15,r1 8000b5c: b5 af 68 00 add r13,r13,r15 8000b60: 59 ac 00 00 sw (r13+0),r12 device_name_table[slot].device_name_length = strlen(path); 8000b64: b9 80 08 00 mv r1,r12 8000b68: f8 00 2a f8 calli 800b748 8000b6c: 59 a1 00 04 sw (r13+4),r1 device_name_table[slot].major = major; 8000b70: 59 b2 00 08 sw (r13+8),r18 device_name_table[slot].minor = minor; 8000b74: 59 b1 00 0c sw (r13+12),r17 device_name_table[slot].mode = mode; 8000b78: 59 b0 00 10 sw (r13+16),r16 _ISR_Enable(level); 8000b7c: d0 0b 00 00 wcsr IE,r11 return 0; 8000b80: 34 01 00 00 mvi r1,0 } 8000b84: 2b 9d 00 04 lw ra,(sp+4) 8000b88: 2b 8b 00 24 lw r11,(sp+36) 8000b8c: 2b 8c 00 20 lw r12,(sp+32) 8000b90: 2b 8d 00 1c lw r13,(sp+28) 8000b94: 2b 8e 00 18 lw r14,(sp+24) 8000b98: 2b 8f 00 14 lw r15,(sp+20) 8000b9c: 2b 90 00 10 lw r16,(sp+16) 8000ba0: 2b 91 00 0c lw r17,(sp+12) 8000ba4: 2b 92 00 08 lw r18,(sp+8) 8000ba8: 37 9c 00 24 addi sp,sp,36 8000bac: c3 a0 00 00 ret device_name_table = (rtems_device_name_t *)pathloc->node_access; if (!device_name_table) rtems_set_errno_and_return_minus_one( EFAULT ); for (slot = -1, i = 0; i < rtems_device_table_size; i++){ if (device_name_table[i].device_name == NULL) 8000bb0: b9 60 78 00 mv r15,r11 8000bb4: e3 ff ff dc bi 8000b24 slot = i; else if (strcmp(path, device_name_table[i].device_name) == 0) rtems_set_errno_and_return_minus_one( EEXIST ); 8000bb8: f8 00 26 ca calli 800a6e0 <__errno> 8000bbc: 34 02 00 11 mvi r2,17 8000bc0: 58 22 00 00 sw (r1+0),r2 8000bc4: 34 01 ff ff mvi r1,-1 8000bc8: e3 ff ff ef bi 8000b84 * 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') && 8000bcc: 41 82 00 01 lbu r2,(r12+1) 8000bd0: 34 01 00 65 mvi r1,101 8000bd4: 5c 41 ff ba bne r2,r1,8000abc <== NEVER TAKEN 8000bd8: 41 82 00 02 lbu r2,(r12+2) 8000bdc: 34 01 00 76 mvi r1,118 8000be0: 5c 41 ff b7 bne r2,r1,8000abc <== NEVER TAKEN (path[2] == 'v') && (path[3] == '\0')) 8000be4: 41 82 00 03 lbu r2,(r12+3) return 0; 8000be8: 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')) 8000bec: 5c 40 ff b4 bne r2,r0,8000abc 8000bf0: e3 ff ff e5 bi 8000b84 return 0; /* must be a character device or a block device */ if (!S_ISBLK(mode) && !S_ISCHR(mode)) rtems_set_errno_and_return_minus_one( EINVAL ); 8000bf4: f8 00 26 bb calli 800a6e0 <__errno> 8000bf8: 34 02 00 16 mvi r2,22 8000bfc: 58 22 00 00 sw (r1+0),r2 8000c00: 34 01 ff ff mvi r1,-1 8000c04: e3 ff ff e0 bi 8000b84 if (strcmp(path, device_name_table[i].device_name) == 0) rtems_set_errno_and_return_minus_one( EEXIST ); } if (slot == -1) rtems_set_errno_and_return_minus_one( ENOMEM ); 8000c08: f8 00 26 b6 calli 800a6e0 <__errno> 8000c0c: 34 02 00 0c mvi r2,12 8000c10: 58 22 00 00 sw (r1+0),r2 8000c14: 34 01 ff ff mvi r1,-1 8000c18: e3 ff ff db bi 8000b84 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 ); 8000c1c: f8 00 26 b1 calli 800a6e0 <__errno> 8000c20: 34 02 00 0e mvi r2,14 8000c24: 58 22 00 00 sw (r1+0),r2 8000c28: 34 01 ff ff mvi r1,-1 8000c2c: e3 ff ff d6 bi 8000b84 =============================================================================== 08004ccc : /* * Drain output queue */ static void drainOutput (struct rtems_termios_tty *tty) { 8004ccc: 37 9c ff f0 addi sp,sp,-16 8004cd0: 5b 8b 00 10 sw (sp+16),r11 8004cd4: 5b 8c 00 0c sw (sp+12),r12 8004cd8: 5b 8d 00 08 sw (sp+8),r13 8004cdc: 5b 9d 00 04 sw (sp+4),ra 8004ce0: b8 20 58 00 mv r11,r1 rtems_interrupt_level level; rtems_status_code sc; if (tty->device.outputUsesInterrupts != TERMIOS_POLLED) { 8004ce4: 28 21 00 b4 lw r1,(r1+180) 8004ce8: 44 20 00 18 be r1,r0,8004d48 rtems_interrupt_disable (level); 8004cec: 90 00 08 00 rcsr r1,IE 8004cf0: 34 02 ff fe mvi r2,-2 8004cf4: a0 22 10 00 and r2,r1,r2 8004cf8: d0 02 00 00 wcsr IE,r2 while (tty->rawOutBuf.Tail != tty->rawOutBuf.Head) { 8004cfc: 29 63 00 84 lw r3,(r11+132) 8004d00: 29 62 00 80 lw r2,(r11+128) 8004d04: 44 62 00 10 be r3,r2,8004d44 <== ALWAYS TAKEN tty->rawOutBufState = rob_wait; 8004d08: 34 0c 00 02 mvi r12,2 <== NOT EXECUTED 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); 8004d0c: 34 0d ff fe mvi r13,-2 <== NOT EXECUTED rtems_status_code sc; if (tty->device.outputUsesInterrupts != TERMIOS_POLLED) { rtems_interrupt_disable (level); while (tty->rawOutBuf.Tail != tty->rawOutBuf.Head) { tty->rawOutBufState = rob_wait; 8004d10: 59 6c 00 94 sw (r11+148),r12 <== NOT EXECUTED rtems_interrupt_enable (level); 8004d14: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED sc = rtems_semaphore_obtain( 8004d18: 29 61 00 8c lw r1,(r11+140) <== NOT EXECUTED 8004d1c: 34 02 00 00 mvi r2,0 <== NOT EXECUTED 8004d20: 34 03 00 00 mvi r3,0 <== NOT EXECUTED 8004d24: f8 00 0a f3 calli 80078f0 <== NOT EXECUTED tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) 8004d28: 5c 20 00 0e bne r1,r0,8004d60 <== NOT EXECUTED rtems_fatal_error_occurred (sc); rtems_interrupt_disable (level); 8004d2c: 90 00 08 00 rcsr r1,IE <== NOT EXECUTED 8004d30: a0 2d 10 00 and r2,r1,r13 <== NOT EXECUTED 8004d34: 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) { 8004d38: 29 63 00 84 lw r3,(r11+132) <== NOT EXECUTED 8004d3c: 29 62 00 80 lw r2,(r11+128) <== NOT EXECUTED 8004d40: 5c 62 ff f4 bne r3,r2,8004d10 <== NOT EXECUTED 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); 8004d44: d0 01 00 00 wcsr IE,r1 } } 8004d48: 2b 9d 00 04 lw ra,(sp+4) 8004d4c: 2b 8b 00 10 lw r11,(sp+16) 8004d50: 2b 8c 00 0c lw r12,(sp+12) 8004d54: 2b 8d 00 08 lw r13,(sp+8) 8004d58: 37 9c 00 10 addi sp,sp,16 8004d5c: c3 a0 00 00 ret tty->rawOutBufState = rob_wait; rtems_interrupt_enable (level); sc = rtems_semaphore_obtain( tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); 8004d60: f8 00 0c e3 calli 80080ec <== NOT EXECUTED =============================================================================== 08005b60 : /* * Echo a typed character */ static void echo (unsigned char c, struct rtems_termios_tty *tty) { 8005b60: 37 9c ff f4 addi sp,sp,-12 8005b64: 5b 8b 00 08 sw (sp+8),r11 8005b68: 5b 9d 00 04 sw (sp+4),ra 8005b6c: b8 40 58 00 mv r11,r2 if ((tty->termios.c_lflag & ECHOCTL) && 8005b70: 28 42 00 3c lw r2,(r2+60) 8005b74: 20 42 02 00 andi r2,r2,0x200 8005b78: 44 40 00 0b be r2,r0,8005ba4 <== NEVER TAKEN iscntrl(c) && (c != '\t') && (c != '\n')) { 8005b7c: 78 02 08 02 mvhi r2,0x802 8005b80: 38 42 44 14 ori r2,r2,0x4414 8005b84: 28 42 00 00 lw r2,(r2+0) 8005b88: 7c 23 00 09 cmpnei r3,r1,9 8005b8c: b4 41 10 00 add r2,r2,r1 8005b90: 40 42 00 01 lbu r2,(r2+1) 8005b94: 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) && 8005b98: 7c 42 00 00 cmpnei r2,r2,0 iscntrl(c) && (c != '\t') && (c != '\n')) { 8005b9c: a0 43 10 00 and r2,r2,r3 8005ba0: 5c 40 00 07 bne r2,r0,8005bbc echobuf[0] = '^'; echobuf[1] = c ^ 0x40; rtems_termios_puts (echobuf, 2, tty); tty->column += 2; } else { oproc (c, tty); 8005ba4: b9 60 10 00 mv r2,r11 8005ba8: fb ff ff 8c calli 80059d8 } } 8005bac: 2b 9d 00 04 lw ra,(sp+4) 8005bb0: 2b 8b 00 08 lw r11,(sp+8) 8005bb4: 37 9c 00 0c addi sp,sp,12 8005bb8: c3 a0 00 00 ret */ static void echo (unsigned char c, struct rtems_termios_tty *tty) { if ((tty->termios.c_lflag & ECHOCTL) && iscntrl(c) && (c != '\t') && (c != '\n')) { 8005bbc: 34 02 00 0a mvi r2,10 8005bc0: 44 22 ff f9 be r1,r2,8005ba4 char echobuf[2]; echobuf[0] = '^'; echobuf[1] = c ^ 0x40; 8005bc4: 18 24 00 40 xori r4,r1,0x40 { if ((tty->termios.c_lflag & ECHOCTL) && iscntrl(c) && (c != '\t') && (c != '\n')) { char echobuf[2]; echobuf[0] = '^'; 8005bc8: 34 05 00 5e mvi r5,94 echobuf[1] = c ^ 0x40; rtems_termios_puts (echobuf, 2, tty); 8005bcc: 37 81 00 0c addi r1,sp,12 8005bd0: 34 02 00 02 mvi r2,2 8005bd4: b9 60 18 00 mv r3,r11 { if ((tty->termios.c_lflag & ECHOCTL) && iscntrl(c) && (c != '\t') && (c != '\n')) { char echobuf[2]; echobuf[0] = '^'; 8005bd8: 33 85 00 0c sb (sp+12),r5 echobuf[1] = c ^ 0x40; 8005bdc: 33 84 00 0d sb (sp+13),r4 rtems_termios_puts (echobuf, 2, tty); 8005be0: fb ff ff 25 calli 8005874 tty->column += 2; 8005be4: 29 61 00 28 lw r1,(r11+40) 8005be8: 34 21 00 02 addi r1,r1,2 8005bec: 59 61 00 28 sw (r11+40),r1 } else { oproc (c, tty); } } 8005bf0: 2b 9d 00 04 lw ra,(sp+4) 8005bf4: 2b 8b 00 08 lw r11,(sp+8) 8005bf8: 37 9c 00 0c addi sp,sp,12 8005bfc: c3 a0 00 00 ret =============================================================================== 080028b4 : void endgrent(void) { 80028b4: 37 9c ff fc addi sp,sp,-4 80028b8: 5b 9d 00 04 sw (sp+4),ra if (group_fp != NULL) 80028bc: 78 01 08 01 mvhi r1,0x801 80028c0: 38 21 66 f4 ori r1,r1,0x66f4 80028c4: 28 21 00 00 lw r1,(r1+0) 80028c8: 44 20 00 02 be r1,r0,80028d0 <== NEVER TAKEN fclose(group_fp); 80028cc: f8 00 2e 37 calli 800e1a8 } 80028d0: 2b 9d 00 04 lw ra,(sp+4) 80028d4: 37 9c 00 04 addi sp,sp,4 80028d8: c3 a0 00 00 ret =============================================================================== 080026dc : void endpwent(void) { 80026dc: 37 9c ff fc addi sp,sp,-4 80026e0: 5b 9d 00 04 sw (sp+4),ra if (passwd_fp != NULL) 80026e4: 78 01 08 01 mvhi r1,0x801 80026e8: 38 21 67 d0 ori r1,r1,0x67d0 80026ec: 28 21 00 00 lw r1,(r1+0) 80026f0: 44 20 00 02 be r1,r0,80026f8 <== NEVER TAKEN fclose(passwd_fp); 80026f4: f8 00 2e ad calli 800e1a8 } 80026f8: 2b 9d 00 04 lw ra,(sp+4) 80026fc: 37 9c 00 04 addi sp,sp,4 8002700: c3 a0 00 00 ret =============================================================================== 08005c00 : * 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) { 8005c00: 37 9c ff e0 addi sp,sp,-32 8005c04: 5b 8b 00 20 sw (sp+32),r11 8005c08: 5b 8c 00 1c sw (sp+28),r12 8005c0c: 5b 8d 00 18 sw (sp+24),r13 8005c10: 5b 8e 00 14 sw (sp+20),r14 8005c14: 5b 8f 00 10 sw (sp+16),r15 8005c18: 5b 90 00 0c sw (sp+12),r16 8005c1c: 5b 91 00 08 sw (sp+8),r17 8005c20: 5b 9d 00 04 sw (sp+4),ra if (tty->ccount == 0) 8005c24: 28 24 00 20 lw r4,(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) { 8005c28: b8 20 58 00 mv r11,r1 8005c2c: b8 40 68 00 mv r13,r2 if (tty->ccount == 0) 8005c30: 44 80 00 27 be r4,r0,8005ccc return; if (lineFlag) { 8005c34: 5c 40 00 30 bne r2,r0,8005cf4 echo ('\n', tty); return; } } while (tty->ccount) { 8005c38: 28 25 00 3c lw r5,(r1+60) 8005c3c: 20 a2 00 08 andi r2,r5,0x8 rtems_termios_puts ("\b", 1, tty); tty->column--; } } else { if (iscntrl (c) && (tty->termios.c_lflag & ECHOCTL)) { 8005c40: 78 0f 08 02 mvhi r15,0x802 8005c44: 78 11 08 02 mvhi r17,0x802 8005c48: 78 0e 08 02 mvhi r14,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') { 8005c4c: 34 10 00 09 mvi r16,9 rtems_termios_puts ("\b", 1, tty); tty->column--; } } else { if (iscntrl (c) && (tty->termios.c_lflag & ECHOCTL)) { 8005c50: 39 ef 44 14 ori r15,r15,0x4414 8005c54: 3a 31 20 a0 ori r17,r17,0x20a0 8005c58: 39 ce 20 9c ori r14,r14,0x209c return; } } while (tty->ccount) { unsigned char c = tty->cbuf[--tty->ccount]; 8005c5c: 29 67 00 1c lw r7,(r11+28) 8005c60: 34 84 ff ff addi r4,r4,-1 8005c64: 59 64 00 20 sw (r11+32),r4 8005c68: b4 e4 18 00 add r3,r7,r4 8005c6c: 40 63 00 00 lbu r3,(r3+0) if (tty->termios.c_lflag & ECHO) { 8005c70: 44 40 00 0e be r2,r0,8005ca8 <== NEVER TAKEN if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) { 8005c74: 5d a0 00 03 bne r13,r0,8005c80 8005c78: 20 a1 00 10 andi r1,r5,0x10 8005c7c: 44 2d 00 11 be r1,r13,8005cc0 <== NEVER TAKEN echo (tty->termios.c_cc[VERASE], tty); } else if (c == '\t') { 8005c80: 44 70 00 45 be r3,r16,8005d94 rtems_termios_puts ("\b", 1, tty); tty->column--; } } else { if (iscntrl (c) && (tty->termios.c_lflag & ECHOCTL)) { 8005c84: 29 e2 00 00 lw r2,(r15+0) 8005c88: 34 6c 00 01 addi r12,r3,1 8005c8c: ba 20 08 00 mv r1,r17 8005c90: b4 4c 10 00 add r2,r2,r12 8005c94: 40 42 00 00 lbu r2,(r2+0) 8005c98: 20 42 00 20 andi r2,r2,0x20 8005c9c: 44 40 00 36 be r2,r0,8005d74 <== ALWAYS TAKEN 8005ca0: 20 a5 02 00 andi r5,r5,0x200 <== NOT EXECUTED 8005ca4: 5c a0 00 24 bne r5,r0,8005d34 <== NOT EXECUTED if (tty->column) tty->column--; } } } if (!lineFlag) 8005ca8: 45 a0 00 09 be r13,r0,8005ccc echo ('\n', tty); return; } } while (tty->ccount) { 8005cac: 29 64 00 20 lw r4,(r11+32) 8005cb0: 44 80 00 07 be r4,r0,8005ccc } if (!(tty->termios.c_lflag & ECHOE)) { tty->ccount = 0; echo (tty->termios.c_cc[VKILL], tty); if (tty->termios.c_lflag & ECHOK) echo ('\n', tty); 8005cb4: 29 65 00 3c lw r5,(r11+60) 8005cb8: 20 a2 00 08 andi r2,r5,0x8 8005cbc: e3 ff ff e8 bi 8005c5c while (tty->ccount) { unsigned char c = tty->cbuf[--tty->ccount]; if (tty->termios.c_lflag & ECHO) { if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) { echo (tty->termios.c_cc[VERASE], tty); 8005cc0: 41 61 00 43 lbu r1,(r11+67) <== NOT EXECUTED 8005cc4: b9 60 10 00 mv r2,r11 <== NOT EXECUTED 8005cc8: fb ff ff a6 calli 8005b60 <== NOT EXECUTED } } if (!lineFlag) break; } } 8005ccc: 2b 9d 00 04 lw ra,(sp+4) 8005cd0: 2b 8b 00 20 lw r11,(sp+32) 8005cd4: 2b 8c 00 1c lw r12,(sp+28) 8005cd8: 2b 8d 00 18 lw r13,(sp+24) 8005cdc: 2b 8e 00 14 lw r14,(sp+20) 8005ce0: 2b 8f 00 10 lw r15,(sp+16) 8005ce4: 2b 90 00 0c lw r16,(sp+12) 8005ce8: 2b 91 00 08 lw r17,(sp+8) 8005cec: 37 9c 00 20 addi sp,sp,32 8005cf0: c3 a0 00 00 ret erase (struct rtems_termios_tty *tty, int lineFlag) { if (tty->ccount == 0) return; if (lineFlag) { if (!(tty->termios.c_lflag & ECHO)) { 8005cf4: 28 25 00 3c lw r5,(r1+60) 8005cf8: 20 a2 00 08 andi r2,r5,0x8 8005cfc: 44 40 00 48 be r2,r0,8005e1c <== NEVER TAKEN tty->ccount = 0; return; } if (!(tty->termios.c_lflag & ECHOE)) { 8005d00: 20 ac 00 10 andi r12,r5,0x10 8005d04: 5d 80 ff cf bne r12,r0,8005c40 <== ALWAYS TAKEN tty->ccount = 0; echo (tty->termios.c_cc[VKILL], tty); 8005d08: 40 21 00 44 lbu r1,(r1+68) <== NOT EXECUTED if (!(tty->termios.c_lflag & ECHO)) { tty->ccount = 0; return; } if (!(tty->termios.c_lflag & ECHOE)) { tty->ccount = 0; 8005d0c: 59 60 00 20 sw (r11+32),r0 <== NOT EXECUTED echo (tty->termios.c_cc[VKILL], tty); 8005d10: b9 60 10 00 mv r2,r11 <== NOT EXECUTED 8005d14: fb ff ff 93 calli 8005b60 <== NOT EXECUTED if (tty->termios.c_lflag & ECHOK) 8005d18: 29 61 00 3c lw r1,(r11+60) <== NOT EXECUTED 8005d1c: 20 21 00 20 andi r1,r1,0x20 <== NOT EXECUTED 8005d20: 44 2c ff eb be r1,r12,8005ccc <== NOT EXECUTED echo ('\n', tty); 8005d24: 34 01 00 0a mvi r1,10 <== NOT EXECUTED 8005d28: b9 60 10 00 mv r2,r11 <== NOT EXECUTED 8005d2c: fb ff ff 8d calli 8005b60 <== NOT EXECUTED 8005d30: e3 ff ff e7 bi 8005ccc <== NOT EXECUTED tty->column--; } } else { if (iscntrl (c) && (tty->termios.c_lflag & ECHOCTL)) { rtems_termios_puts ("\b \b", 3, tty); 8005d34: 34 02 00 03 mvi r2,3 <== NOT EXECUTED 8005d38: b9 60 18 00 mv r3,r11 <== NOT EXECUTED 8005d3c: fb ff fe ce calli 8005874 <== NOT EXECUTED if (tty->column) 8005d40: 29 62 00 28 lw r2,(r11+40) <== NOT EXECUTED tty->column--; } } else { if (iscntrl (c) && (tty->termios.c_lflag & ECHOCTL)) { rtems_termios_puts ("\b \b", 3, tty); 8005d44: ba 20 08 00 mv r1,r17 <== NOT EXECUTED if (tty->column) 8005d48: 44 40 00 03 be r2,r0,8005d54 <== NOT EXECUTED tty->column--; 8005d4c: 34 42 ff ff addi r2,r2,-1 <== NOT EXECUTED 8005d50: 59 62 00 28 sw (r11+40),r2 <== NOT EXECUTED } if (!iscntrl (c) || (tty->termios.c_lflag & ECHOCTL)) { 8005d54: 29 e2 00 00 lw r2,(r15+0) <== NOT EXECUTED 8005d58: b4 4c 60 00 add r12,r2,r12 <== NOT EXECUTED 8005d5c: 41 82 00 00 lbu r2,(r12+0) <== NOT EXECUTED 8005d60: 20 42 00 20 andi r2,r2,0x20 <== NOT EXECUTED 8005d64: 44 40 00 04 be r2,r0,8005d74 <== NOT EXECUTED 8005d68: 29 62 00 3c lw r2,(r11+60) <== NOT EXECUTED 8005d6c: 20 42 02 00 andi r2,r2,0x200 <== NOT EXECUTED 8005d70: 44 40 ff ce be r2,r0,8005ca8 <== NOT EXECUTED rtems_termios_puts ("\b \b", 3, tty); 8005d74: 34 02 00 03 mvi r2,3 8005d78: b9 60 18 00 mv r3,r11 8005d7c: fb ff fe be calli 8005874 if (tty->column) 8005d80: 29 61 00 28 lw r1,(r11+40) 8005d84: 44 20 ff c9 be r1,r0,8005ca8 <== NEVER TAKEN tty->column--; 8005d88: 34 21 ff ff addi r1,r1,-1 8005d8c: 59 61 00 28 sw (r11+40),r1 8005d90: e3 ff ff c6 bi 8005ca8 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; 8005d94: 29 6c 00 2c lw r12,(r11+44) int i = 0; /* * Find the character before the tab */ while (i != tty->ccount) { 8005d98: 44 80 00 0f be r4,r0,8005dd4 c = tty->cbuf[i++]; if (c == '\t') { col = (col | 7) + 1; } else if (iscntrl (c)) { 8005d9c: 29 e1 00 00 lw r1,(r15+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; 8005da0: 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) 8005da4: 20 a5 02 00 andi r5,r5,0x200 * 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) 8005da8: b4 e3 10 00 add r2,r7,r3 /* * Find the character before the tab */ while (i != tty->ccount) { c = tty->cbuf[i++]; 8005dac: 40 46 00 00 lbu r6,(r2+0) 8005db0: 34 63 00 01 addi r3,r3,1 if (c == '\t') { col = (col | 7) + 1; } else if (iscntrl (c)) { 8005db4: b4 26 10 00 add r2,r1,r6 /* * Find the character before the tab */ while (i != tty->ccount) { c = tty->cbuf[i++]; if (c == '\t') { 8005db8: 44 d0 00 15 be r6,r16,8005e0c col = (col | 7) + 1; } else if (iscntrl (c)) { 8005dbc: 40 42 00 01 lbu r2,(r2+1) 8005dc0: 20 42 00 20 andi r2,r2,0x20 8005dc4: 44 40 00 0f be r2,r0,8005e00 <== ALWAYS TAKEN if (tty->termios.c_lflag & ECHOCTL) 8005dc8: 44 a0 00 02 be r5,r0,8005dd0 <== NOT EXECUTED col += 2; 8005dcc: 35 8c 00 02 addi r12,r12,2 <== NOT EXECUTED int i = 0; /* * Find the character before the tab */ while (i != tty->ccount) { 8005dd0: 5c 83 ff f6 bne r4,r3,8005da8 <== NOT EXECUTED } /* * Back up over the tab */ while (tty->column > col) { 8005dd4: 29 61 00 28 lw r1,(r11+40) 8005dd8: 4d 81 ff b4 bge r12,r1,8005ca8 <== NEVER TAKEN rtems_termios_puts ("\b", 1, tty); 8005ddc: b9 60 18 00 mv r3,r11 8005de0: b9 c0 08 00 mv r1,r14 8005de4: 34 02 00 01 mvi r2,1 8005de8: fb ff fe a3 calli 8005874 tty->column--; 8005dec: 29 63 00 28 lw r3,(r11+40) 8005df0: 34 63 ff ff addi r3,r3,-1 8005df4: 59 63 00 28 sw (r11+40),r3 } /* * Back up over the tab */ while (tty->column > col) { 8005df8: 48 6c ff f9 bg r3,r12,8005ddc 8005dfc: e3 ff ff ab bi 8005ca8 col = (col | 7) + 1; } else if (iscntrl (c)) { if (tty->termios.c_lflag & ECHOCTL) col += 2; } else { col++; 8005e00: 35 8c 00 01 addi r12,r12,1 int i = 0; /* * Find the character before the tab */ while (i != tty->ccount) { 8005e04: 5c 83 ff e9 bne r4,r3,8005da8 8005e08: e3 ff ff f3 bi 8005dd4 c = tty->cbuf[i++]; if (c == '\t') { col = (col | 7) + 1; 8005e0c: 39 8c 00 07 ori r12,r12,0x7 8005e10: 35 8c 00 01 addi r12,r12,1 int i = 0; /* * Find the character before the tab */ while (i != tty->ccount) { 8005e14: 5c 83 ff e5 bne r4,r3,8005da8 <== ALWAYS TAKEN 8005e18: e3 ff ff ef bi 8005dd4 <== NOT EXECUTED { if (tty->ccount == 0) return; if (lineFlag) { if (!(tty->termios.c_lflag & ECHO)) { tty->ccount = 0; 8005e1c: 58 20 00 20 sw (r1+32),r0 <== NOT EXECUTED return; 8005e20: e3 ff ff ab bi 8005ccc <== NOT EXECUTED =============================================================================== 08002018 : int fcntl( int fd, int cmd, ... ) { 8002018: 37 9c ff d0 addi sp,sp,-48 800201c: 5b 8b 00 10 sw (sp+16),r11 8002020: 5b 8c 00 0c sw (sp+12),r12 8002024: 5b 8d 00 08 sw (sp+8),r13 8002028: 5b 9d 00 04 sw (sp+4),ra int fd2; int flags; int mask; int ret = 0; rtems_libio_check_fd( fd ); 800202c: 78 09 08 01 mvhi r9,0x801 8002030: 39 29 60 10 ori r9,r9,0x6010 8002034: 29 29 00 00 lw r9,(r9+0) int fcntl( int fd, int cmd, ... ) { 8002038: 5b 85 00 24 sw (sp+36),r5 800203c: 5b 82 00 18 sw (sp+24),r2 8002040: 5b 83 00 1c sw (sp+28),r3 8002044: 5b 84 00 20 sw (sp+32),r4 8002048: 5b 86 00 28 sw (sp+40),r6 800204c: 5b 87 00 2c sw (sp+44),r7 8002050: 5b 88 00 30 sw (sp+48),r8 int ret; va_list ap; va_start( ap, cmd ); 8002054: 37 85 00 1c addi r5,sp,28 int fd2; int flags; int mask; int ret = 0; rtems_libio_check_fd( fd ); 8002058: 55 21 00 06 bgu r9,r1,8002070 iop = rtems_libio_iop( fd ); rtems_libio_check_is_open(iop); 800205c: f8 00 30 53 calli 800e1a8 <__errno> 8002060: 34 02 00 09 mvi r2,9 8002064: 58 22 00 00 sw (r1+0),r2 8002068: 34 0c ff ff mvi r12,-1 800206c: e0 00 00 1b bi 80020d8 int flags; int mask; int ret = 0; rtems_libio_check_fd( fd ); iop = rtems_libio_iop( fd ); 8002070: b4 21 18 00 add r3,r1,r1 8002074: 78 0c 08 01 mvhi r12,0x801 8002078: b4 63 18 00 add r3,r3,r3 800207c: 39 8c 67 6c ori r12,r12,0x676c 8002080: b4 63 18 00 add r3,r3,r3 8002084: 29 86 00 00 lw r6,(r12+0) 8002088: b4 63 18 00 add r3,r3,r3 800208c: b4 63 18 00 add r3,r3,r3 8002090: b4 63 18 00 add r3,r3,r3 8002094: b4 c3 58 00 add r11,r6,r3 rtems_libio_check_is_open(iop); 8002098: 29 61 00 18 lw r1,(r11+24) 800209c: 20 23 01 00 andi r3,r1,0x100 80020a0: 44 60 ff ef be r3,r0,800205c /* * This switch should contain all the cases from POSIX. */ switch ( cmd ) { 80020a4: 34 03 00 09 mvi r3,9 80020a8: 54 43 00 58 bgu r2,r3,8002208 80020ac: 78 04 08 01 mvhi r4,0x801 80020b0: b4 42 18 00 add r3,r2,r2 80020b4: 38 84 53 38 ori r4,r4,0x5338 80020b8: b4 63 18 00 add r3,r3,r3 80020bc: b4 83 18 00 add r3,r4,r3 80020c0: 28 63 00 00 lw r3,(r3+0) 80020c4: c0 60 00 00 b r3 errno = ENOTSUP; ret = -1; break; case F_GETOWN: /* for sockets. */ errno = ENOTSUP; 80020c8: f8 00 30 38 calli 800e1a8 <__errno> 80020cc: 34 02 00 86 mvi r2,134 80020d0: 58 22 00 00 sw (r1+0),r2 if (ret >= 0) { int err = (*iop->pathinfo.handlers->fcntl_h)( cmd, iop ); if (err) { errno = err; ret = -1; 80020d4: 34 0c ff ff mvi r12,-1 va_list ap; va_start( ap, cmd ); ret = vfcntl(fd,cmd,ap); va_end(ap); return ret; } 80020d8: b9 80 08 00 mv r1,r12 80020dc: 2b 9d 00 04 lw ra,(sp+4) 80020e0: 2b 8b 00 10 lw r11,(sp+16) 80020e4: 2b 8c 00 0c lw r12,(sp+12) 80020e8: 2b 8d 00 08 lw r13,(sp+8) 80020ec: 37 9c 00 30 addi sp,sp,48 80020f0: c3 a0 00 00 ret 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 ) ); 80020f4: 28 a1 00 00 lw r1,(r5+0) 80020f8: 5b 82 00 14 sw (sp+20),r2 rtems_libio_t *iop; rtems_libio_t *diop; int fd2; int flags; int mask; int ret = 0; 80020fc: 34 0c 00 00 mvi r12,0 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 ) ); 8002100: f8 00 01 bd calli 80027f4 /* * XXX If we are turning on append, should we seek to the end? */ iop->flags = (iop->flags & ~mask) | (flags & mask); 8002104: 29 64 00 18 lw r4,(r11+24) 8002108: 34 03 fd fe mvi r3,-514 800210c: 20 21 02 01 andi r1,r1,0x201 8002110: a0 64 18 00 and r3,r3,r4 8002114: 2b 82 00 14 lw r2,(sp+20) 8002118: b8 23 08 00 or r1,r1,r3 800211c: 59 61 00 18 sw (r11+24),r1 * 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 ); 8002120: 29 63 00 24 lw r3,(r11+36) 8002124: b8 40 08 00 mv r1,r2 8002128: b9 60 10 00 mv r2,r11 800212c: 28 63 00 30 lw r3,(r3+48) 8002130: d8 60 00 00 call r3 8002134: b8 20 58 00 mv r11,r1 if (err) { 8002138: 44 20 ff e8 be r1,r0,80020d8 <== ALWAYS TAKEN errno = err; 800213c: f8 00 30 1b calli 800e1a8 <__errno> <== NOT EXECUTED 8002140: 58 2b 00 00 sw (r1+0),r11 <== NOT EXECUTED 8002144: e3 ff ff e4 bi 80020d4 <== NOT EXECUTED else iop->flags &= ~LIBIO_FLAGS_CLOSE_ON_EXEC; break; case F_GETFL: /* more flags (cloexec) */ ret = rtems_libio_to_fcntl_flags( iop->flags ); 8002148: 5b 82 00 14 sw (sp+20),r2 800214c: f8 00 01 c0 calli 800284c 8002150: b8 20 60 00 mv r12,r1 8002154: 2b 82 00 14 lw r2,(sp+20) /* * If we got this far successfully, then we give the optional * filesystem specific handler a chance to process this. */ if (ret >= 0) { 8002158: 48 0c ff e0 bg r0,r12,80020d8 <== NEVER TAKEN 800215c: e3 ff ff f1 bi 8002120 * 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 ) ) 8002160: 28 a3 00 00 lw r3,(r5+0) 8002164: 44 60 00 2d be r3,r0,8002218 iop->flags |= LIBIO_FLAGS_CLOSE_ON_EXEC; 8002168: 38 21 08 00 ori r1,r1,0x800 800216c: 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; 8002170: 34 0c 00 00 mvi r12,0 8002174: e3 ff ff eb bi 8002120 diop->pathinfo = iop->pathinfo; ret = (int) (diop - rtems_libio_iops); break; case F_GETFD: /* get f_flags */ ret = ((iop->flags & LIBIO_FLAGS_CLOSE_ON_EXEC) != 0); 8002178: 20 2c 08 00 andi r12,r1,0x800 800217c: 7d 8c 00 00 cmpnei r12,r12,0 8002180: e3 ff ff e8 bi 8002120 * This switch should contain all the cases from POSIX. */ switch ( cmd ) { case F_DUPFD: /* dup */ fd2 = va_arg( ap, int ); 8002184: 28 ad 00 00 lw r13,(r5+0) if ( fd2 ) 8002188: 45 a0 00 29 be r13,r0,800222c diop = rtems_libio_iop( fd2 ); 800218c: 34 0c 00 00 mvi r12,0 8002190: 34 03 00 00 mvi r3,0 8002194: 51 a9 00 09 bgeu r13,r9,80021b8 <== NEVER TAKEN 8002198: b5 ad 18 00 add r3,r13,r13 800219c: b4 63 18 00 add r3,r3,r3 80021a0: b4 63 18 00 add r3,r3,r3 80021a4: b4 63 18 00 add r3,r3,r3 80021a8: b4 63 18 00 add r3,r3,r3 80021ac: b4 63 18 00 add r3,r3,r3 80021b0: b4 c3 18 00 add r3,r6,r3 80021b4: b8 60 60 00 mv r12,r3 break; } } diop->flags = iop->flags; diop->pathinfo = iop->pathinfo; 80021b8: 29 64 00 1c lw r4,(r11+28) ret = (int) (diop - rtems_libio_iops); 80021bc: c9 86 60 00 sub r12,r12,r6 80021c0: 15 8c 00 01 sri r12,r12,1 break; } } diop->flags = iop->flags; diop->pathinfo = iop->pathinfo; 80021c4: 58 64 00 1c sw (r3+28),r4 80021c8: 29 64 00 20 lw r4,(r11+32) ret = -1; break; } } diop->flags = iop->flags; 80021cc: 58 61 00 18 sw (r3+24),r1 diop->pathinfo = iop->pathinfo; ret = (int) (diop - rtems_libio_iops); 80021d0: 15 8c 00 01 sri r12,r12,1 break; } } diop->flags = iop->flags; diop->pathinfo = iop->pathinfo; 80021d4: 58 64 00 20 sw (r3+32),r4 80021d8: 29 61 00 24 lw r1,(r11+36) ret = (int) (diop - rtems_libio_iops); 80021dc: 15 8c 00 01 sri r12,r12,1 break; } } diop->flags = iop->flags; diop->pathinfo = iop->pathinfo; 80021e0: 58 61 00 24 sw (r3+36),r1 80021e4: 29 61 00 28 lw r1,(r11+40) ret = (int) (diop - rtems_libio_iops); 80021e8: 15 8c 00 01 sri r12,r12,1 break; } } diop->flags = iop->flags; diop->pathinfo = iop->pathinfo; 80021ec: 58 61 00 28 sw (r3+40),r1 80021f0: 29 61 00 2c lw r1,(r11+44) ret = (int) (diop - rtems_libio_iops); 80021f4: 15 8c 00 01 sri r12,r12,1 80021f8: 15 8c 00 01 sri r12,r12,1 break; } } diop->flags = iop->flags; diop->pathinfo = iop->pathinfo; 80021fc: 58 61 00 2c sw (r3+44),r1 /* * If we got this far successfully, then we give the optional * filesystem specific handler a chance to process this. */ if (ret >= 0) { 8002200: 48 0c ff b6 bg r0,r12,80020d8 <== NEVER TAKEN 8002204: e3 ff ff c7 bi 8002120 errno = ENOTSUP; ret = -1; break; default: errno = EINVAL; 8002208: f8 00 2f e8 calli 800e1a8 <__errno> 800220c: 34 02 00 16 mvi r2,22 8002210: 58 22 00 00 sw (r1+0),r2 8002214: e3 ff ff b0 bi 80020d4 */ if ( va_arg( ap, int ) ) iop->flags |= LIBIO_FLAGS_CLOSE_ON_EXEC; else iop->flags &= ~LIBIO_FLAGS_CLOSE_ON_EXEC; 8002218: 34 03 f7 ff mvi r3,-2049 800221c: a0 23 08 00 and r1,r1,r3 8002220: 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; 8002224: 34 0c 00 00 mvi r12,0 8002228: e3 ff ff be bi 8002120 fd2 = va_arg( ap, int ); if ( fd2 ) diop = rtems_libio_iop( fd2 ); else { /* allocate a file control block */ diop = rtems_libio_allocate(); 800222c: 5b 82 00 14 sw (sp+20),r2 8002230: f8 00 01 9c calli 80028a0 8002234: b8 20 18 00 mv r3,r1 if ( diop == 0 ) { 8002238: 2b 82 00 14 lw r2,(sp+20) 800223c: 44 2d ff a6 be r1,r13,80020d4 <== NEVER TAKEN 8002240: 29 86 00 00 lw r6,(r12+0) 8002244: 29 61 00 18 lw r1,(r11+24) 8002248: b8 60 60 00 mv r12,r3 800224c: e3 ff ff db bi 80021b8 =============================================================================== 0800a954 : */ int fifo_open( pipe_control_t **pipep, rtems_libio_t *iop ) { 800a954: 37 9c ff d8 addi sp,sp,-40 800a958: 5b 8b 00 20 sw (sp+32),r11 800a95c: 5b 8c 00 1c sw (sp+28),r12 800a960: 5b 8d 00 18 sw (sp+24),r13 800a964: 5b 8e 00 14 sw (sp+20),r14 800a968: 5b 8f 00 10 sw (sp+16),r15 800a96c: 5b 90 00 0c sw (sp+12),r16 800a970: 5b 91 00 08 sw (sp+8),r17 800a974: 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) { 800a978: 78 0b 08 02 mvhi r11,0x802 800a97c: 39 6b 47 0c ori r11,r11,0x470c 800a980: 29 6c 00 00 lw r12,(r11+0) */ int fifo_open( pipe_control_t **pipep, rtems_libio_t *iop ) { 800a984: b8 20 70 00 mv r14,r1 800a988: b8 40 68 00 mv r13,r2 static rtems_status_code pipe_lock(void) { rtems_status_code sc = RTEMS_SUCCESSFUL; if (pipe_semaphore == RTEMS_ID_NONE) { 800a98c: 45 80 00 2c be r12,r0,800aa3c rtems_libio_unlock(); } if (sc == RTEMS_SUCCESSFUL) { sc = rtems_semaphore_obtain(pipe_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 800a990: b9 80 08 00 mv r1,r12 800a994: 34 02 00 00 mvi r2,0 800a998: 34 03 00 00 mvi r3,0 800a99c: fb ff ea f6 calli 8005574 ) { pipe_control_t *pipe; int err = 0; err = pipe_lock(); 800a9a0: 34 0c ff f4 mvi r12,-12 if (sc == RTEMS_SUCCESSFUL) { sc = rtems_semaphore_obtain(pipe_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT); } if (sc == RTEMS_SUCCESSFUL) { 800a9a4: 5c 20 00 1b bne r1,r0,800aa10 <== NEVER TAKEN err = pipe_lock(); if (err) return err; pipe = *pipep; 800a9a8: 29 cb 00 00 lw r11,(r14+0) if (pipe == NULL) { 800a9ac: 45 61 00 80 be r11,r1,800abac err = pipe_alloc(&pipe); if (err) goto out; } if (! PIPE_LOCK(pipe)) 800a9b0: 29 61 00 28 lw r1,(r11+40) 800a9b4: 34 02 00 00 mvi r2,0 800a9b8: 34 03 00 00 mvi r3,0 800a9bc: fb ff ea ee calli 8005574 800a9c0: 7c 21 00 00 cmpnei r1,r1,0 err = -EINTR; if (*pipep == NULL) { 800a9c4: 29 c2 00 00 lw r2,(r14+0) err = pipe_alloc(&pipe); if (err) goto out; } if (! PIPE_LOCK(pipe)) 800a9c8: c8 01 60 00 sub r12,r0,r1 800a9cc: 34 03 ff fc mvi r3,-4 800a9d0: a1 83 60 00 and r12,r12,r3 err = -EINTR; if (*pipep == NULL) { 800a9d4: 44 40 00 cb be r2,r0,800ad00 else *pipep = pipe; } out: pipe_unlock(); 800a9d8: fb ff ff 89 calli 800a7fc pipe_control_t *pipe; unsigned int prevCounter; int err; err = pipe_new(pipep); if (err) 800a9dc: 5d 80 00 0d bne r12,r0,800aa10 <== NEVER TAKEN return err; pipe = *pipep; switch (LIBIO_ACCMODE(iop)) { 800a9e0: 29 a1 00 18 lw r1,(r13+24) 800a9e4: 34 02 00 04 mvi r2,4 int err; err = pipe_new(pipep); if (err) return err; pipe = *pipep; 800a9e8: 29 cb 00 00 lw r11,(r14+0) switch (LIBIO_ACCMODE(iop)) { 800a9ec: 20 21 00 06 andi r1,r1,0x6 800a9f0: 44 22 00 1f be r1,r2,800aa6c 800a9f4: 34 02 00 06 mvi r2,6 800a9f8: 44 22 00 5b be r1,r2,800ab64 800a9fc: 34 02 00 02 mvi r2,2 800aa00: 44 22 00 3c be r1,r2,800aaf0 <== ALWAYS TAKEN if (pipe->Writers ++ == 0) PIPE_WAKEUPREADERS(pipe); break; } PIPE_UNLOCK(pipe); 800aa04: 29 61 00 28 lw r1,(r11+40) return 0; 800aa08: 34 0c 00 00 mvi r12,0 if (pipe->Writers ++ == 0) PIPE_WAKEUPREADERS(pipe); break; } PIPE_UNLOCK(pipe); 800aa0c: fb ff eb 36 calli 80056e4 return 0; out_error: pipe_release(pipep, iop); return err; } 800aa10: b9 80 08 00 mv r1,r12 800aa14: 2b 9d 00 04 lw ra,(sp+4) 800aa18: 2b 8b 00 20 lw r11,(sp+32) 800aa1c: 2b 8c 00 1c lw r12,(sp+28) 800aa20: 2b 8d 00 18 lw r13,(sp+24) 800aa24: 2b 8e 00 14 lw r14,(sp+20) 800aa28: 2b 8f 00 10 lw r15,(sp+16) 800aa2c: 2b 90 00 0c lw r16,(sp+12) 800aa30: 2b 91 00 08 lw r17,(sp+8) 800aa34: 37 9c 00 28 addi sp,sp,40 800aa38: c3 a0 00 00 ret 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 ); 800aa3c: 78 0f 08 02 mvhi r15,0x802 800aa40: 39 ef 47 88 ori r15,r15,0x4788 800aa44: 29 e1 00 00 lw r1,(r15+0) 800aa48: 34 02 00 00 mvi r2,0 800aa4c: 34 03 00 00 mvi r3,0 800aa50: fb ff ea c9 calli 8005574 rtems_status_code sc = RTEMS_SUCCESSFUL; if (pipe_semaphore == RTEMS_ID_NONE) { rtems_libio_lock(); if (pipe_semaphore == RTEMS_ID_NONE) { 800aa54: 29 61 00 00 lw r1,(r11+0) 800aa58: 44 2c 00 ae be r1,r12,800ad10 <== ALWAYS TAKEN } static inline void rtems_libio_unlock( void ) { rtems_semaphore_release( rtems_libio_semaphore ); 800aa5c: 29 e1 00 00 lw r1,(r15+0) <== NOT EXECUTED 800aa60: fb ff eb 21 calli 80056e4 <== NOT EXECUTED 800aa64: 29 6c 00 00 lw r12,(r11+0) <== NOT EXECUTED 800aa68: e3 ff ff ca bi 800a990 <== NOT EXECUTED } while (prevCounter == pipe->writerCounter); } break; case LIBIO_FLAGS_WRITE: pipe->writerCounter ++; 800aa6c: 29 63 00 24 lw r3,(r11+36) if (pipe->Writers ++ == 0) 800aa70: 29 61 00 14 lw r1,(r11+20) } while (prevCounter == pipe->writerCounter); } break; case LIBIO_FLAGS_WRITE: pipe->writerCounter ++; 800aa74: 34 63 00 01 addi r3,r3,1 if (pipe->Writers ++ == 0) 800aa78: 34 22 00 01 addi r2,r1,1 } while (prevCounter == pipe->writerCounter); } break; case LIBIO_FLAGS_WRITE: pipe->writerCounter ++; 800aa7c: 59 63 00 24 sw (r11+36),r3 if (pipe->Writers ++ == 0) 800aa80: 59 62 00 14 sw (r11+20),r2 800aa84: 44 20 00 ba be r1,r0,800ad6c <== ALWAYS TAKEN PIPE_WAKEUPREADERS(pipe); if (pipe->Readers == 0 && LIBIO_NODELAY(iop)) { 800aa88: 29 61 00 10 lw r1,(r11+16) 800aa8c: 5c 20 ff de bne r1,r0,800aa04 800aa90: 29 a2 00 18 lw r2,(r13+24) 800aa94: 20 42 00 01 andi r2,r2,0x1 800aa98: 5c 41 00 c5 bne r2,r1,800adac err = -ENXIO; goto out_error; } if (pipe->Readers == 0) { prevCounter = pipe->readerCounter; 800aa9c: 29 6f 00 20 lw r15,(r11+32) 800aaa0: e0 00 00 06 bi 800aab8 err = -EINTR; do { PIPE_UNLOCK(pipe); if (! PIPE_WRITEWAIT(pipe)) goto out_error; if (! PIPE_LOCK(pipe)) 800aaa4: 29 61 00 28 lw r1,(r11+40) 800aaa8: fb ff ea b3 calli 8005574 800aaac: 5c 2c 00 0c bne r1,r12,800aadc <== NEVER TAKEN goto out_error; } while (prevCounter == pipe->readerCounter); 800aab0: 29 61 00 20 lw r1,(r11+32) 800aab4: 5c 2f ff d4 bne r1,r15,800aa04 <== ALWAYS TAKEN if (pipe->Readers == 0) { prevCounter = pipe->readerCounter; err = -EINTR; do { PIPE_UNLOCK(pipe); 800aab8: 29 61 00 28 lw r1,(r11+40) 800aabc: fb ff eb 0a calli 80056e4 if (! PIPE_WRITEWAIT(pipe)) 800aac0: 29 61 00 30 lw r1,(r11+48) 800aac4: 34 02 00 00 mvi r2,0 800aac8: f8 00 08 4f calli 800cc04 800aacc: b8 20 60 00 mv r12,r1 goto out_error; if (! PIPE_LOCK(pipe)) 800aad0: 34 02 00 00 mvi r2,0 800aad4: 34 03 00 00 mvi r3,0 if (pipe->Readers == 0) { prevCounter = pipe->readerCounter; err = -EINTR; do { PIPE_UNLOCK(pipe); if (! PIPE_WRITEWAIT(pipe)) 800aad8: 44 20 ff f3 be r1,r0,800aaa4 <== ALWAYS TAKEN goto out_error; } if (pipe->Readers == 0) { prevCounter = pipe->readerCounter; err = -EINTR; 800aadc: 34 0c ff fc mvi r12,-4 <== NOT EXECUTED PIPE_UNLOCK(pipe); return 0; out_error: pipe_release(pipep, iop); 800aae0: b9 c0 08 00 mv r1,r14 800aae4: b9 a0 10 00 mv r2,r13 800aae8: fb ff ff 4e calli 800a820 return err; 800aaec: e3 ff ff c9 bi 800aa10 return err; pipe = *pipep; switch (LIBIO_ACCMODE(iop)) { case LIBIO_FLAGS_READ: pipe->readerCounter ++; 800aaf0: 29 63 00 20 lw r3,(r11+32) if (pipe->Readers ++ == 0) 800aaf4: 29 61 00 10 lw r1,(r11+16) return err; pipe = *pipep; switch (LIBIO_ACCMODE(iop)) { case LIBIO_FLAGS_READ: pipe->readerCounter ++; 800aaf8: 34 63 00 01 addi r3,r3,1 if (pipe->Readers ++ == 0) 800aafc: 34 22 00 01 addi r2,r1,1 return err; pipe = *pipep; switch (LIBIO_ACCMODE(iop)) { case LIBIO_FLAGS_READ: pipe->readerCounter ++; 800ab00: 59 63 00 20 sw (r11+32),r3 if (pipe->Readers ++ == 0) 800ab04: 59 62 00 10 sw (r11+16),r2 800ab08: 44 20 00 91 be r1,r0,800ad4c <== ALWAYS TAKEN PIPE_WAKEUPWRITERS(pipe); if (pipe->Writers == 0) { 800ab0c: 29 61 00 14 lw r1,(r11+20) 800ab10: 5c 20 ff bd bne r1,r0,800aa04 /* Not an error */ if (LIBIO_NODELAY(iop)) 800ab14: 29 a2 00 18 lw r2,(r13+24) 800ab18: 20 42 00 01 andi r2,r2,0x1 800ab1c: 5c 41 ff ba bne r2,r1,800aa04 break; prevCounter = pipe->writerCounter; 800ab20: 29 6f 00 24 lw r15,(r11+36) 800ab24: e0 00 00 06 bi 800ab3c /* Wait until a writer opens the pipe */ do { PIPE_UNLOCK(pipe); if (! PIPE_READWAIT(pipe)) goto out_error; if (! PIPE_LOCK(pipe)) 800ab28: 29 61 00 28 lw r1,(r11+40) 800ab2c: fb ff ea 92 calli 8005574 800ab30: 5c 2c ff eb bne r1,r12,800aadc <== NEVER TAKEN goto out_error; } while (prevCounter == pipe->writerCounter); 800ab34: 29 61 00 24 lw r1,(r11+36) 800ab38: 5c 2f ff b3 bne r1,r15,800aa04 <== ALWAYS TAKEN prevCounter = pipe->writerCounter; err = -EINTR; /* Wait until a writer opens the pipe */ do { PIPE_UNLOCK(pipe); 800ab3c: 29 61 00 28 lw r1,(r11+40) 800ab40: fb ff ea e9 calli 80056e4 if (! PIPE_READWAIT(pipe)) 800ab44: 29 61 00 2c lw r1,(r11+44) 800ab48: 34 02 00 00 mvi r2,0 800ab4c: f8 00 08 2e calli 800cc04 800ab50: b8 20 60 00 mv r12,r1 goto out_error; if (! PIPE_LOCK(pipe)) 800ab54: 34 02 00 00 mvi r2,0 800ab58: 34 03 00 00 mvi r3,0 prevCounter = pipe->writerCounter; err = -EINTR; /* Wait until a writer opens the pipe */ do { PIPE_UNLOCK(pipe); if (! PIPE_READWAIT(pipe)) 800ab5c: 44 20 ff f3 be r1,r0,800ab28 <== ALWAYS TAKEN 800ab60: e3 ff ff df bi 800aadc <== NOT EXECUTED } while (prevCounter == pipe->readerCounter); } break; case LIBIO_FLAGS_READ_WRITE: pipe->readerCounter ++; 800ab64: 29 63 00 20 lw r3,(r11+32) if (pipe->Readers ++ == 0) 800ab68: 29 61 00 10 lw r1,(r11+16) } while (prevCounter == pipe->readerCounter); } break; case LIBIO_FLAGS_READ_WRITE: pipe->readerCounter ++; 800ab6c: 34 63 00 01 addi r3,r3,1 if (pipe->Readers ++ == 0) 800ab70: 34 22 00 01 addi r2,r1,1 } while (prevCounter == pipe->readerCounter); } break; case LIBIO_FLAGS_READ_WRITE: pipe->readerCounter ++; 800ab74: 59 63 00 20 sw (r11+32),r3 if (pipe->Readers ++ == 0) 800ab78: 59 62 00 10 sw (r11+16),r2 800ab7c: 44 20 00 78 be r1,r0,800ad5c <== ALWAYS TAKEN PIPE_WAKEUPWRITERS(pipe); pipe->writerCounter ++; 800ab80: 29 63 00 24 lw r3,(r11+36) if (pipe->Writers ++ == 0) 800ab84: 29 61 00 14 lw r1,(r11+20) case LIBIO_FLAGS_READ_WRITE: pipe->readerCounter ++; if (pipe->Readers ++ == 0) PIPE_WAKEUPWRITERS(pipe); pipe->writerCounter ++; 800ab88: 34 63 00 01 addi r3,r3,1 if (pipe->Writers ++ == 0) 800ab8c: 34 22 00 01 addi r2,r1,1 case LIBIO_FLAGS_READ_WRITE: pipe->readerCounter ++; if (pipe->Readers ++ == 0) PIPE_WAKEUPWRITERS(pipe); pipe->writerCounter ++; 800ab90: 59 63 00 24 sw (r11+36),r3 if (pipe->Writers ++ == 0) 800ab94: 59 62 00 14 sw (r11+20),r2 800ab98: 5c 20 ff 9b bne r1,r0,800aa04 <== NEVER TAKEN PIPE_WAKEUPREADERS(pipe); 800ab9c: 29 61 00 2c lw r1,(r11+44) 800aba0: 37 82 00 28 addi r2,sp,40 800aba4: f8 00 07 f7 calli 800cb80 800aba8: e3 ff ff 97 bi 800aa04 { static char c = 'a'; pipe_control_t *pipe; int err = -ENOMEM; pipe = malloc(sizeof(pipe_control_t)); 800abac: 34 01 00 34 mvi r1,52 800abb0: fb ff e4 d9 calli 8003f14 800abb4: b8 20 58 00 mv r11,r1 800abb8: b8 20 88 00 mv r17,r1 if (pipe == NULL) 800abbc: 44 20 00 88 be r1,r0,800addc return err; memset(pipe, 0, sizeof(pipe_control_t)); 800abc0: 58 20 00 00 sw (r1+0),r0 800abc4: 58 20 00 08 sw (r1+8),r0 800abc8: 58 20 00 0c sw (r1+12),r0 800abcc: 58 20 00 10 sw (r1+16),r0 800abd0: 58 20 00 14 sw (r1+20),r0 800abd4: 58 20 00 18 sw (r1+24),r0 800abd8: 58 20 00 1c sw (r1+28),r0 800abdc: 58 20 00 20 sw (r1+32),r0 800abe0: 58 20 00 24 sw (r1+36),r0 800abe4: 58 20 00 28 sw (r1+40),r0 800abe8: 58 20 00 2c sw (r1+44),r0 800abec: 58 20 00 30 sw (r1+48),r0 pipe->Size = PIPE_BUF; 800abf0: 34 01 02 00 mvi r1,512 800abf4: 59 61 00 04 sw (r11+4),r1 pipe->Buffer = malloc(pipe->Size); 800abf8: fb ff e4 c7 calli 8003f14 800abfc: 59 61 00 00 sw (r11+0),r1 if (! pipe->Buffer) 800ac00: 44 20 00 75 be r1,r0,800add4 <== NEVER TAKEN goto err_buf; err = -ENOMEM; if (rtems_barrier_create( rtems_build_name ('P', 'I', 'r', c), 800ac04: 78 0c 08 02 mvhi r12,0x802 if (! pipe->Buffer) goto err_buf; err = -ENOMEM; if (rtems_barrier_create( 800ac08: 78 05 08 02 mvhi r5,0x802 800ac0c: 38 a5 2b 94 ori r5,r5,0x2b94 rtems_build_name ('P', 'I', 'r', c), 800ac10: 39 8c 41 28 ori r12,r12,0x4128 800ac14: 41 84 00 00 lbu r4,(r12+0) if (! pipe->Buffer) goto err_buf; err = -ENOMEM; if (rtems_barrier_create( 800ac18: 28 a1 00 00 lw r1,(r5+0) 800ac1c: 34 02 00 00 mvi r2,0 800ac20: 34 03 00 00 mvi r3,0 800ac24: b8 81 08 00 or r1,r4,r1 800ac28: 35 64 00 2c addi r4,r11,44 800ac2c: f8 00 07 5e calli 800c9a4 800ac30: b8 20 78 00 mv r15,r1 800ac34: 5c 20 00 66 bne r1,r0,800adcc rtems_build_name ('P', 'I', 'r', c), RTEMS_BARRIER_MANUAL_RELEASE, 0, &pipe->readBarrier) != RTEMS_SUCCESSFUL) goto err_rbar; if (rtems_barrier_create( 800ac38: 78 05 08 02 mvhi r5,0x802 800ac3c: 38 a5 2b 98 ori r5,r5,0x2b98 rtems_build_name ('P', 'I', 'w', c), 800ac40: 41 84 00 00 lbu r4,(r12+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( 800ac44: 28 a1 00 00 lw r1,(r5+0) 800ac48: 34 02 00 00 mvi r2,0 800ac4c: 34 03 00 00 mvi r3,0 800ac50: b8 81 08 00 or r1,r4,r1 800ac54: 35 64 00 30 addi r4,r11,48 800ac58: f8 00 07 53 calli 800c9a4 800ac5c: b8 20 80 00 mv r16,r1 800ac60: 5c 2f 00 59 bne r1,r15,800adc4 rtems_build_name ('P', 'I', 'w', c), RTEMS_BARRIER_MANUAL_RELEASE, 0, &pipe->writeBarrier) != RTEMS_SUCCESSFUL) goto err_wbar; if (rtems_semaphore_create( 800ac64: 78 05 08 02 mvhi r5,0x802 800ac68: 38 a5 2b 9c ori r5,r5,0x2b9c rtems_build_name ('P', 'I', 's', c), 1, 800ac6c: 41 84 00 00 lbu r4,(r12+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( 800ac70: 28 a1 00 00 lw r1,(r5+0) 800ac74: 34 02 00 01 mvi r2,1 800ac78: 34 03 00 10 mvi r3,16 800ac7c: b8 81 08 00 or r1,r4,r1 800ac80: 35 65 00 28 addi r5,r11,40 800ac84: 34 04 00 00 mvi r4,0 800ac88: fb ff e9 80 calli 8005288 800ac8c: 5c 30 00 4c bne r1,r16,800adbc Objects_Id id, Objects_Locations *location ) { return (Barrier_Control *) _Objects_Get( &_Barrier_Information, id, location ); 800ac90: 29 62 00 2c lw r2,(r11+44) 800ac94: 78 0f 08 02 mvhi r15,0x802 800ac98: 39 ef 51 70 ori r15,r15,0x5170 /* 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 800ac9c: 37 91 00 24 addi r17,sp,36 800aca0: ba 20 18 00 mv r3,r17 800aca4: b9 e0 08 00 mv r1,r15 800aca8: fb ff f0 d7 calli 8007004 <_Objects_Get> |= STATES_INTERRUPTIBLE_BY_SIGNAL; 800acac: 28 22 00 4c lw r2,(r1+76) 800acb0: 78 10 10 00 mvhi r16,0x1000 800acb4: b8 50 10 00 or r2,r2,r16 800acb8: 58 22 00 4c sw (r1+76),r2 _Thread_Enable_dispatch(); 800acbc: fb ff f4 1f calli 8007d38 <_Thread_Enable_dispatch> 800acc0: 29 62 00 30 lw r2,(r11+48) 800acc4: ba 20 18 00 mv r3,r17 800acc8: b9 e0 08 00 mv r1,r15 800accc: fb ff f0 ce calli 8007004 <_Objects_Get> _Barrier_Get(pipe->writeBarrier, &location)->Barrier.Wait_queue.state |= STATES_INTERRUPTIBLE_BY_SIGNAL; 800acd0: 28 22 00 4c lw r2,(r1+76) 800acd4: b8 50 80 00 or r16,r2,r16 800acd8: 58 30 00 4c sw (r1+76),r16 _Thread_Enable_dispatch(); 800acdc: fb ff f4 17 calli 8007d38 <_Thread_Enable_dispatch> #ifdef RTEMS_POSIX_API pipe_interruptible(pipe); #endif *pipep = pipe; if (c ++ == 'z') 800ace0: 41 81 00 00 lbu r1,(r12+0) 800ace4: 34 22 00 01 addi r2,r1,1 800ace8: 31 82 00 00 sb (r12+0),r2 800acec: 34 02 00 7a mvi r2,122 800acf0: 5c 22 ff 30 bne r1,r2,800a9b0 c = 'a'; 800acf4: 34 01 00 61 mvi r1,97 800acf8: 31 81 00 00 sb (r12+0),r1 800acfc: e3 ff ff 2d bi 800a9b0 if (! PIPE_LOCK(pipe)) err = -EINTR; if (*pipep == NULL) { if (err) 800ad00: 5d 82 00 1f bne r12,r2,800ad7c <== NEVER TAKEN pipe_free(pipe); else *pipep = pipe; 800ad04: 59 cb 00 00 sw (r14+0),r11 } out: pipe_unlock(); 800ad08: fb ff fe bd calli 800a7fc 800ad0c: e3 ff ff 35 bi 800a9e0 if (pipe_semaphore == RTEMS_ID_NONE) { rtems_libio_lock(); if (pipe_semaphore == RTEMS_ID_NONE) { sc = rtems_semaphore_create( 800ad10: 78 02 08 02 mvhi r2,0x802 800ad14: 38 42 2b 90 ori r2,r2,0x2b90 800ad18: 28 41 00 00 lw r1,(r2+0) 800ad1c: 34 03 00 54 mvi r3,84 800ad20: 34 02 00 01 mvi r2,1 800ad24: 34 04 00 00 mvi r4,0 800ad28: b9 60 28 00 mv r5,r11 800ad2c: fb ff e9 57 calli 8005288 800ad30: b8 20 80 00 mv r16,r1 800ad34: 29 e1 00 00 lw r1,(r15+0) ) { pipe_control_t *pipe; int err = 0; err = pipe_lock(); 800ad38: 34 0c ff f4 mvi r12,-12 800ad3c: fb ff ea 6a calli 80056e4 } rtems_libio_unlock(); } if (sc == RTEMS_SUCCESSFUL) { 800ad40: 5e 00 ff 34 bne r16,r0,800aa10 800ad44: 29 6c 00 00 lw r12,(r11+0) 800ad48: e3 ff ff 12 bi 800a990 switch (LIBIO_ACCMODE(iop)) { case LIBIO_FLAGS_READ: pipe->readerCounter ++; if (pipe->Readers ++ == 0) PIPE_WAKEUPWRITERS(pipe); 800ad4c: 29 61 00 30 lw r1,(r11+48) 800ad50: 37 82 00 28 addi r2,sp,40 800ad54: f8 00 07 8b calli 800cb80 800ad58: e3 ff ff 6d bi 800ab0c break; case LIBIO_FLAGS_READ_WRITE: pipe->readerCounter ++; if (pipe->Readers ++ == 0) PIPE_WAKEUPWRITERS(pipe); 800ad5c: 29 61 00 30 lw r1,(r11+48) 800ad60: 37 82 00 28 addi r2,sp,40 800ad64: f8 00 07 87 calli 800cb80 800ad68: e3 ff ff 86 bi 800ab80 case LIBIO_FLAGS_WRITE: pipe->writerCounter ++; if (pipe->Writers ++ == 0) PIPE_WAKEUPREADERS(pipe); 800ad6c: 29 61 00 2c lw r1,(r11+44) 800ad70: 37 82 00 28 addi r2,sp,40 800ad74: f8 00 07 83 calli 800cb80 800ad78: e3 ff ff 44 bi 800aa88 /* Called with pipe_semaphore held. */ static inline void pipe_free( pipe_control_t *pipe ) { rtems_barrier_delete(pipe->readBarrier); 800ad7c: 29 61 00 2c lw r1,(r11+44) <== NOT EXECUTED 800ad80: f8 00 07 4c calli 800cab0 <== NOT EXECUTED rtems_barrier_delete(pipe->writeBarrier); 800ad84: 29 61 00 30 lw r1,(r11+48) <== NOT EXECUTED 800ad88: f8 00 07 4a calli 800cab0 <== NOT EXECUTED rtems_semaphore_delete(pipe->Semaphore); 800ad8c: 29 61 00 28 lw r1,(r11+40) <== NOT EXECUTED 800ad90: fb ff e9 c2 calli 8005498 <== NOT EXECUTED free(pipe->Buffer); 800ad94: 29 61 00 00 lw r1,(r11+0) <== NOT EXECUTED 800ad98: fb ff e1 ed calli 800354c <== NOT EXECUTED free(pipe); 800ad9c: b9 60 08 00 mv r1,r11 <== NOT EXECUTED 800ada0: fb ff e1 eb calli 800354c <== NOT EXECUTED else *pipep = pipe; } out: pipe_unlock(); 800ada4: fb ff fe 96 calli 800a7fc <== NOT EXECUTED 800ada8: e3 ff ff 1a bi 800aa10 <== NOT EXECUTED if (pipe->Writers ++ == 0) PIPE_WAKEUPREADERS(pipe); if (pipe->Readers == 0 && LIBIO_NODELAY(iop)) { PIPE_UNLOCK(pipe); 800adac: 29 61 00 28 lw r1,(r11+40) err = -ENXIO; 800adb0: 34 0c ff fa mvi r12,-6 if (pipe->Writers ++ == 0) PIPE_WAKEUPREADERS(pipe); if (pipe->Readers == 0 && LIBIO_NODELAY(iop)) { PIPE_UNLOCK(pipe); 800adb4: fb ff ea 4c calli 80056e4 err = -ENXIO; goto out_error; 800adb8: e3 ff ff 4a bi 800aae0 if (c ++ == 'z') c = 'a'; return 0; err_sem: rtems_barrier_delete(pipe->writeBarrier); 800adbc: 29 61 00 30 lw r1,(r11+48) 800adc0: f8 00 07 3c calli 800cab0 err_wbar: rtems_barrier_delete(pipe->readBarrier); 800adc4: 2a 21 00 2c lw r1,(r17+44) 800adc8: f8 00 07 3a calli 800cab0 err_rbar: free(pipe->Buffer); 800adcc: 2a 21 00 00 lw r1,(r17+0) 800add0: fb ff e1 df calli 800354c err_buf: free(pipe); 800add4: ba 20 08 00 mv r1,r17 800add8: fb ff e1 dd calli 800354c ) { pipe_control_t *pipe; int err = 0; err = pipe_lock(); 800addc: 34 0c ff f4 mvi r12,-12 else *pipep = pipe; } out: pipe_unlock(); 800ade0: fb ff fe 87 calli 800a7fc 800ade4: e3 ff ff 0b bi 800aa10 =============================================================================== 08002308 : long fpathconf( int fd, int name ) { 8002308: 37 9c ff fc addi sp,sp,-4 800230c: 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); 8002310: 78 03 08 01 mvhi r3,0x801 8002314: 38 63 60 10 ori r3,r3,0x6010 8002318: 28 63 00 00 lw r3,(r3+0) 800231c: 54 61 00 06 bgu r3,r1,8002334 iop = rtems_libio_iop(fd); rtems_libio_check_is_open(iop); 8002320: f8 00 2f a2 calli 800e1a8 <__errno> 8002324: 34 02 00 09 mvi r2,9 8002328: 58 22 00 00 sw (r1+0),r2 800232c: 34 01 ff ff mvi r1,-1 8002330: e0 00 00 1b bi 800239c long return_value; rtems_libio_t *iop; rtems_filesystem_limits_and_options_t *the_limits; rtems_libio_check_fd(fd); iop = rtems_libio_iop(fd); 8002334: b4 21 08 00 add r1,r1,r1 8002338: 78 03 08 01 mvhi r3,0x801 800233c: b4 21 08 00 add r1,r1,r1 8002340: 38 63 67 6c ori r3,r3,0x676c 8002344: b4 21 08 00 add r1,r1,r1 8002348: 28 63 00 00 lw r3,(r3+0) 800234c: b4 21 08 00 add r1,r1,r1 8002350: b4 21 08 00 add r1,r1,r1 8002354: b4 21 08 00 add r1,r1,r1 8002358: b4 61 08 00 add r1,r3,r1 rtems_libio_check_is_open(iop); 800235c: 28 23 00 18 lw r3,(r1+24) 8002360: 20 64 01 00 andi r4,r3,0x100 8002364: 44 80 ff ef be r4,r0,8002320 <== NEVER TAKEN rtems_libio_check_permissions(iop, LIBIO_FLAGS_READ); 8002368: 20 63 00 02 andi r3,r3,0x2 800236c: 44 60 00 25 be r3,r0,8002400 * Now process the information request. */ the_limits = &iop->pathinfo.mt_entry->pathconf_limits_and_options; switch ( name ) { 8002370: 34 03 00 0b mvi r3,11 /* * Now process the information request. */ the_limits = &iop->pathinfo.mt_entry->pathconf_limits_and_options; 8002374: 28 21 00 2c lw r1,(r1+44) switch ( name ) { 8002378: 54 43 00 22 bgu r2,r3,8002400 800237c: 78 03 08 01 mvhi r3,0x801 8002380: b4 42 10 00 add r2,r2,r2 8002384: 38 63 53 60 ori r3,r3,0x5360 8002388: b4 42 10 00 add r2,r2,r2 800238c: b4 62 10 00 add r2,r3,r2 8002390: 28 42 00 00 lw r2,(r2+0) 8002394: c0 40 00 00 b r2 break; case _PC_ASYNC_IO: return_value = the_limits->posix_async_io; break; case _PC_PRIO_IO: return_value = the_limits->posix_prio_io; 8002398: 28 21 00 5c lw r1,(r1+92) rtems_set_errno_and_return_minus_one( EINVAL ); break; } return return_value; } 800239c: 2b 9d 00 04 lw ra,(sp+4) 80023a0: 37 9c 00 04 addi sp,sp,4 80023a4: c3 a0 00 00 ret break; case _PC_VDISABLE: return_value = the_limits->posix_vdisable; break; case _PC_ASYNC_IO: return_value = the_limits->posix_async_io; 80023a8: 28 21 00 50 lw r1,(r1+80) break; 80023ac: e3 ff ff fc bi 800239c break; case _PC_NO_TRUNC: return_value = the_limits->posix_no_trunc; break; case _PC_VDISABLE: return_value = the_limits->posix_vdisable; 80023b0: 28 21 00 64 lw r1,(r1+100) break; 80023b4: e3 ff ff fa bi 800239c break; case _PC_CHOWN_RESTRICTED: return_value = the_limits->posix_chown_restrictions; break; case _PC_NO_TRUNC: return_value = the_limits->posix_no_trunc; 80023b8: 28 21 00 58 lw r1,(r1+88) break; 80023bc: e3 ff ff f8 bi 800239c break; case _PC_PIPE_BUF: return_value = the_limits->pipe_buf; break; case _PC_CHOWN_RESTRICTED: return_value = the_limits->posix_chown_restrictions; 80023c0: 28 21 00 54 lw r1,(r1+84) break; 80023c4: e3 ff ff f6 bi 800239c break; case _PC_PATH_MAX: return_value = the_limits->path_max; break; case _PC_PIPE_BUF: return_value = the_limits->pipe_buf; 80023c8: 28 21 00 4c lw r1,(r1+76) break; 80023cc: e3 ff ff f4 bi 800239c break; case _PC_NAME_MAX: return_value = the_limits->name_max; break; case _PC_PATH_MAX: return_value = the_limits->path_max; 80023d0: 28 21 00 48 lw r1,(r1+72) break; 80023d4: e3 ff ff f2 bi 800239c break; case _PC_MAX_INPUT: return_value = the_limits->max_input; break; case _PC_NAME_MAX: return_value = the_limits->name_max; 80023d8: 28 21 00 44 lw r1,(r1+68) break; 80023dc: e3 ff ff f0 bi 800239c break; case _PC_MAX_CANON: return_value = the_limits->max_canon; break; case _PC_MAX_INPUT: return_value = the_limits->max_input; 80023e0: 28 21 00 40 lw r1,(r1+64) break; 80023e4: e3 ff ff ee bi 800239c switch ( name ) { case _PC_LINK_MAX: return_value = the_limits->link_max; break; case _PC_MAX_CANON: return_value = the_limits->max_canon; 80023e8: 28 21 00 3c lw r1,(r1+60) break; 80023ec: e3 ff ff ec bi 800239c the_limits = &iop->pathinfo.mt_entry->pathconf_limits_and_options; switch ( name ) { case _PC_LINK_MAX: return_value = the_limits->link_max; 80023f0: 28 21 00 38 lw r1,(r1+56) break; 80023f4: e3 ff ff ea bi 800239c break; case _PC_PRIO_IO: return_value = the_limits->posix_prio_io; break; case _PC_SYNC_IO: return_value = the_limits->posix_sync_io; 80023f8: 28 21 00 60 lw r1,(r1+96) break; 80023fc: e3 ff ff e8 bi 800239c default: rtems_set_errno_and_return_minus_one( EINVAL ); 8002400: f8 00 2f 6a calli 800e1a8 <__errno> 8002404: 34 02 00 16 mvi r2,22 8002408: 58 22 00 00 sw (r1+0),r2 800240c: 34 01 ff ff mvi r1,-1 8002410: e3 ff ff e3 bi 800239c =============================================================================== 080014a8 : #include void free( void *ptr ) { 80014a8: 37 9c ff f4 addi sp,sp,-12 80014ac: 5b 8b 00 0c sw (sp+12),r11 80014b0: 5b 8c 00 08 sw (sp+8),r12 80014b4: 5b 9d 00 04 sw (sp+4),ra MSBUMP(free_calls, 1); 80014b8: 78 03 08 01 mvhi r3,0x801 80014bc: 38 63 47 88 ori r3,r3,0x4788 80014c0: 28 62 00 0c lw r2,(r3+12) #include void free( void *ptr ) { 80014c4: b8 20 58 00 mv r11,r1 MSBUMP(free_calls, 1); 80014c8: 34 41 00 01 addi r1,r2,1 80014cc: 58 61 00 0c sw (r3+12),r1 if ( !ptr ) 80014d0: 45 60 00 1a be r11,r0,8001538 return; /* * Do not attempt to free memory if in a critical section or ISR. */ if ( _System_state_Is_up(_System_state_Get()) && 80014d4: 78 01 08 01 mvhi r1,0x801 80014d8: 38 21 4a 60 ori r1,r1,0x4a60 80014dc: 28 22 00 00 lw r2,(r1+0) 80014e0: 34 01 00 03 mvi r1,3 80014e4: 44 41 00 1a be r2,r1,800154c <== ALWAYS TAKEN } /* * If configured, update the statistics */ if ( rtems_malloc_statistics_helpers ) 80014e8: 78 01 08 01 mvhi r1,0x801 80014ec: 38 21 46 a0 ori r1,r1,0x46a0 80014f0: 28 21 00 00 lw r1,(r1+0) 80014f4: 44 20 00 04 be r1,r0,8001504 (*rtems_malloc_statistics_helpers->at_free)(ptr); 80014f8: 28 22 00 08 lw r2,(r1+8) 80014fc: b9 60 08 00 mv r1,r11 8001500: d8 40 00 00 call r2 if ( !_Protected_heap_Free( RTEMS_Malloc_Heap, ptr ) ) { 8001504: 78 0c 08 01 mvhi r12,0x801 8001508: 39 8c 40 1c ori r12,r12,0x401c 800150c: 29 81 00 00 lw r1,(r12+0) 8001510: b9 60 10 00 mv r2,r11 8001514: f8 00 0e 65 calli 8004ea8 <_Protected_heap_Free> 8001518: 5c 20 00 08 bne r1,r0,8001538 printk( "Program heap: free of bad pointer %p -- range %p - %p \n", ptr, RTEMS_Malloc_Heap->area_begin, 800151c: 29 82 00 00 lw r2,(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", 8001520: 78 01 08 01 mvhi r1,0x801 8001524: 38 21 34 f4 ori r1,r1,0x34f4 8001528: 28 43 00 18 lw r3,(r2+24) 800152c: 28 44 00 1c lw r4,(r2+28) 8001530: b9 60 10 00 mv r2,r11 8001534: f8 00 04 05 calli 8002548 RTEMS_Malloc_Heap->area_begin, RTEMS_Malloc_Heap->area_end ); } } 8001538: 2b 9d 00 04 lw ra,(sp+4) 800153c: 2b 8b 00 0c lw r11,(sp+12) 8001540: 2b 8c 00 08 lw r12,(sp+8) 8001544: 37 9c 00 0c addi sp,sp,12 8001548: c3 a0 00 00 ret /* * Do not attempt to free memory if in a critical section or ISR. */ if ( _System_state_Is_up(_System_state_Get()) && !malloc_is_system_state_OK() ) { 800154c: f8 00 00 6b calli 80016f8 return; /* * Do not attempt to free memory if in a critical section or ISR. */ if ( _System_state_Is_up(_System_state_Get()) && 8001550: 5c 20 ff e6 bne r1,r0,80014e8 !malloc_is_system_state_OK() ) { malloc_deferred_free(ptr); 8001554: b9 60 08 00 mv r1,r11 8001558: f8 00 00 88 calli 8001778 return; 800155c: e3 ff ff f7 bi 8001538 =============================================================================== 08002cf4 : * NOTE: this must be called with * thread dispatching disabled! */ static void free_user_env(void *venv) { 8002cf4: 37 9c ff f8 addi sp,sp,-8 8002cf8: 5b 8b 00 08 sw (sp+8),r11 8002cfc: 5b 9d 00 04 sw (sp+4),ra rtems_user_env_t *env = (rtems_user_env_t*) venv ; if (env != &rtems_global_user_env 8002d00: 78 02 08 01 mvhi r2,0x801 8002d04: 38 42 57 90 ori r2,r2,0x5790 * NOTE: this must be called with * thread dispatching disabled! */ static void free_user_env(void *venv) { 8002d08: b8 20 58 00 mv r11,r1 rtems_user_env_t *env = (rtems_user_env_t*) venv ; if (env != &rtems_global_user_env 8002d0c: 44 22 00 07 be r1,r2,8002d28 <== NEVER TAKEN #ifdef HAVE_USERENV_REFCNT && --env->refcnt <= 0 #endif ) { rtems_filesystem_freenode( &env->current_directory); 8002d10: 34 21 00 04 addi r1,r1,4 8002d14: fb ff fa d6 calli 800186c rtems_filesystem_freenode( &env->root_directory); 8002d18: 35 61 00 18 addi r1,r11,24 8002d1c: fb ff fa d4 calli 800186c free(env); 8002d20: b9 60 08 00 mv r1,r11 8002d24: fb ff fa da calli 800188c } } 8002d28: 2b 9d 00 04 lw ra,(sp+4) 8002d2c: 2b 8b 00 08 lw r11,(sp+8) 8002d30: 37 9c 00 08 addi sp,sp,8 8002d34: c3 a0 00 00 ret =============================================================================== 080140bc : int getdents( int dd_fd, char *dd_buf, int dd_len ) { 80140bc: 37 9c ff dc addi sp,sp,-36 80140c0: 5b 8b 00 10 sw (sp+16),r11 80140c4: 5b 8c 00 0c sw (sp+12),r12 80140c8: 5b 8d 00 08 sw (sp+8),r13 80140cc: 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 ); 80140d0: 78 04 08 01 mvhi r4,0x801 80140d4: 38 84 70 10 ori r4,r4,0x7010 80140d8: 28 84 00 00 lw r4,(r4+0) int getdents( int dd_fd, char *dd_buf, int dd_len ) { 80140dc: b8 40 68 00 mv r13,r2 80140e0: 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 ); 80140e4: 34 0b 00 00 mvi r11,0 80140e8: 50 24 00 0b bgeu r1,r4,8014114 <== NEVER TAKEN 80140ec: b4 21 08 00 add r1,r1,r1 80140f0: 78 04 08 01 mvhi r4,0x801 80140f4: b4 21 08 00 add r1,r1,r1 80140f8: 38 84 78 78 ori r4,r4,0x7878 80140fc: b4 21 08 00 add r1,r1,r1 8014100: b4 21 08 00 add r1,r1,r1 8014104: 28 8b 00 00 lw r11,(r4+0) 8014108: b4 21 08 00 add r1,r1,r1 801410c: b4 21 08 00 add r1,r1,r1 8014110: b5 61 58 00 add r11,r11,r1 /* * Make sure we are working on a directory */ loc = iop->pathinfo; 8014114: 29 61 00 28 lw r1,(r11+40) 8014118: 29 66 00 1c lw r6,(r11+28) 801411c: 29 65 00 20 lw r5,(r11+32) 8014120: 29 63 00 24 lw r3,(r11+36) 8014124: 29 62 00 2c lw r2,(r11+44) if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) 8014128: 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; 801412c: 5b 81 00 20 sw (sp+32),r1 8014130: 5b 86 00 14 sw (sp+20),r6 8014134: 5b 85 00 18 sw (sp+24),r5 8014138: 5b 83 00 1c sw (sp+28),r3 801413c: 5b 82 00 24 sw (sp+36),r2 if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) 8014140: 37 81 00 14 addi r1,sp,20 8014144: d8 80 00 00 call r4 8014148: 34 04 00 01 mvi r4,1 801414c: 5c 24 00 0d bne r1,r4,8014180 /* * 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 ); 8014150: 29 63 00 24 lw r3,(r11+36) 8014154: b9 60 08 00 mv r1,r11 8014158: b9 a0 10 00 mv r2,r13 801415c: 28 64 00 08 lw r4,(r3+8) 8014160: b9 80 18 00 mv r3,r12 8014164: d8 80 00 00 call r4 } 8014168: 2b 9d 00 04 lw ra,(sp+4) 801416c: 2b 8b 00 10 lw r11,(sp+16) 8014170: 2b 8c 00 0c lw r12,(sp+12) 8014174: 2b 8d 00 08 lw r13,(sp+8) 8014178: 37 9c 00 24 addi sp,sp,36 801417c: c3 a0 00 00 ret /* * Make sure we are working on a directory */ loc = iop->pathinfo; if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) rtems_set_errno_and_return_minus_one( ENOTDIR ); 8014180: fb ff e6 c3 calli 800dc8c <__errno> 8014184: 34 02 00 14 mvi r2,20 8014188: 58 22 00 00 sw (r1+0),r2 801418c: 34 01 ff ff mvi r1,-1 8014190: e3 ff ff f6 bi 8014168 =============================================================================== 0800bc70 : 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 ) 800bc70: 28 23 00 1c lw r3,(r1+28) return -1; /* It wasn't a directory --> return error */ 800bc74: 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 ) 800bc78: 28 64 00 4c lw r4,(r3+76) 800bc7c: 34 03 00 01 mvi r3,1 800bc80: 5c 83 00 04 bne r4,r3,800bc90 <== NEVER TAKEN return -1; /* It wasn't a directory --> return error */ iop->offset = 0; 800bc84: 58 20 00 10 sw (r1+16),r0 800bc88: 58 20 00 14 sw (r1+20),r0 return 0; 800bc8c: 34 02 00 00 mvi r2,0 } 800bc90: b8 40 08 00 mv r1,r2 800bc94: c3 a0 00 00 ret =============================================================================== 0800bc98 : ssize_t imfs_dir_read( rtems_libio_t *iop, void *buffer, size_t count ) { 800bc98: 37 9c fe c0 addi sp,sp,-320 800bc9c: 5b 8b 00 34 sw (sp+52),r11 800bca0: 5b 8c 00 30 sw (sp+48),r12 800bca4: 5b 8d 00 2c sw (sp+44),r13 800bca8: 5b 8e 00 28 sw (sp+40),r14 800bcac: 5b 8f 00 24 sw (sp+36),r15 800bcb0: 5b 90 00 20 sw (sp+32),r16 800bcb4: 5b 91 00 1c sw (sp+28),r17 800bcb8: 5b 92 00 18 sw (sp+24),r18 800bcbc: 5b 93 00 14 sw (sp+20),r19 800bcc0: 5b 94 00 10 sw (sp+16),r20 800bcc4: 5b 95 00 0c sw (sp+12),r21 800bcc8: 5b 96 00 08 sw (sp+8),r22 800bccc: 5b 9d 00 04 sw (sp+4),ra int current_entry; int first_entry; int last_entry; struct dirent tmp_dirent; the_jnode = (IMFS_jnode_t *)iop->pathinfo.node_access; 800bcd0: 28 31 00 1c lw r17,(r1+28) ssize_t imfs_dir_read( rtems_libio_t *iop, void *buffer, size_t count ) { 800bcd4: b8 20 68 00 mv r13,r1 800bcd8: b8 40 98 00 mv r19,r2 IMFS_create_orphan( the_jnode ); IMFS_check_node_remove( the_jnode ); return 0; } 800bcdc: 2a 2c 00 50 lw r12,(r17+80) RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); 800bce0: 36 31 00 54 addi r17,r17,84 the_jnode = (IMFS_jnode_t *)iop->pathinfo.node_access; the_chain = &the_jnode->info.directory.Entries; if ( rtems_chain_is_empty( the_chain ) ) return 0; 800bce4: 34 12 00 00 mvi r18,0 struct dirent tmp_dirent; the_jnode = (IMFS_jnode_t *)iop->pathinfo.node_access; the_chain = &the_jnode->info.directory.Entries; if ( rtems_chain_is_empty( the_chain ) ) 800bce8: 45 91 00 34 be r12,r17,800bdb8 bytes_transferred = 0; first_entry = iop->offset; /* protect against using sizes that are not exact multiples of the */ /* -dirent- size. These could result in unexpected results */ last_entry = first_entry + (count/sizeof(struct dirent)) * sizeof(struct dirent); 800bcec: b8 60 08 00 mv r1,r3 800bcf0: 34 02 01 0c mvi r2,268 800bcf4: f8 00 1a 00 calli 80124f4 <__udivsi3> 800bcf8: b4 21 20 00 add r4,r1,r1 800bcfc: b4 84 20 00 add r4,r4,r4 800bd00: b4 84 18 00 add r3,r4,r4 800bd04: b4 63 18 00 add r3,r3,r3 800bd08: b4 63 18 00 add r3,r3,r3 800bd0c: b4 63 18 00 add r3,r3,r3 800bd10: b4 83 78 00 add r15,r4,r3 /* Move to the first of the desired directory entries */ the_node = rtems_chain_first( the_chain ); bytes_transferred = 0; first_entry = iop->offset; 800bd14: 29 b0 00 14 lw r16,(r13+20) /* protect against using sizes that are not exact multiples of the */ /* -dirent- size. These could result in unexpected results */ last_entry = first_entry + (count/sizeof(struct dirent)) * sizeof(struct dirent); 800bd18: c9 e1 78 00 sub r15,r15,r1 800bd1c: b5 ef 78 00 add r15,r15,r15 800bd20: b5 ef 78 00 add r15,r15,r15 800bd24: b5 f0 78 00 add r15,r15,r16 /* The directory was not empty so try to move to the desired entry in chain*/ for ( 800bd28: 34 0b 00 00 mvi r11,0 800bd2c: 34 0e 00 00 mvi r14,0 } if( current_entry >= first_entry ) { /* Move the entry to the return buffer */ tmp_dirent.d_off = current_entry; tmp_dirent.d_reclen = sizeof( struct dirent ); 800bd30: 34 16 01 0c mvi r22,268 the_jnode = (IMFS_jnode_t *) the_node; tmp_dirent.d_ino = the_jnode->st_ino; tmp_dirent.d_namlen = strlen( the_jnode->name ); strcpy( tmp_dirent.d_name, the_jnode->name ); 800bd34: 37 95 00 38 addi r21,sp,56 800bd38: 37 94 00 44 addi r20,sp,68 /* protect against using sizes that are not exact multiples of the */ /* -dirent- size. These could result in unexpected results */ last_entry = first_entry + (count/sizeof(struct dirent)) * sizeof(struct dirent); /* The directory was not empty so try to move to the desired entry in chain*/ for ( 800bd3c: 49 e0 00 03 bg r15,r0,800bd48 <== ALWAYS TAKEN 800bd40: e0 00 00 1e bi 800bdb8 <== NOT EXECUTED current_entry = 0; current_entry < last_entry; current_entry = current_entry + sizeof(struct dirent) ){ if ( rtems_chain_is_tail( the_chain, the_node ) ){ 800bd44: 45 91 00 1c be r12,r17,800bdb4 /* entry in the read */ return bytes_transferred; /* Indicate that there are no more */ /* entries to return */ } if( current_entry >= first_entry ) { 800bd48: 4a 0b 00 18 bg r16,r11,800bda8 /* Move the entry to the return buffer */ tmp_dirent.d_off = current_entry; tmp_dirent.d_reclen = sizeof( struct dirent ); the_jnode = (IMFS_jnode_t *) the_node; tmp_dirent.d_ino = the_jnode->st_ino; 800bd4c: 29 82 00 38 lw r2,(r12+56) tmp_dirent.d_namlen = strlen( the_jnode->name ); 800bd50: 35 92 00 0c addi r18,r12,12 800bd54: ba 40 08 00 mv r1,r18 if( current_entry >= first_entry ) { /* Move the entry to the return buffer */ tmp_dirent.d_off = current_entry; tmp_dirent.d_reclen = sizeof( struct dirent ); the_jnode = (IMFS_jnode_t *) the_node; tmp_dirent.d_ino = the_jnode->st_ino; 800bd58: 5b 82 00 38 sw (sp+56),r2 /* entries to return */ } if( current_entry >= first_entry ) { /* Move the entry to the return buffer */ tmp_dirent.d_off = current_entry; 800bd5c: 5b 8b 00 3c sw (sp+60),r11 tmp_dirent.d_reclen = sizeof( struct dirent ); 800bd60: 0f 96 00 40 sh (sp+64),r22 the_jnode = (IMFS_jnode_t *) the_node; tmp_dirent.d_ino = the_jnode->st_ino; tmp_dirent.d_namlen = strlen( the_jnode->name ); 800bd64: f8 00 08 bd calli 800e058 800bd68: 0f 81 00 42 sh (sp+66),r1 strcpy( tmp_dirent.d_name, the_jnode->name ); 800bd6c: ba 40 10 00 mv r2,r18 800bd70: ba 80 08 00 mv r1,r20 800bd74: f8 00 08 72 calli 800df3c memcpy( 800bd78: b6 6e 08 00 add r1,r19,r14 800bd7c: 34 03 01 0c mvi r3,268 800bd80: ba a0 10 00 mv r2,r21 800bd84: f8 00 06 ca calli 800d8ac buffer + bytes_transferred, (void *)&tmp_dirent, sizeof( struct dirent ) ); iop->offset = iop->offset + sizeof(struct dirent); 800bd88: 29 a4 00 14 lw r4,(r13+20) 800bd8c: 29 a1 00 10 lw r1,(r13+16) bytes_transferred = bytes_transferred + sizeof( struct dirent ); 800bd90: 35 ce 01 0c addi r14,r14,268 memcpy( buffer + bytes_transferred, (void *)&tmp_dirent, sizeof( struct dirent ) ); iop->offset = iop->offset + sizeof(struct dirent); 800bd94: 34 83 01 0c addi r3,r4,268 800bd98: f4 83 20 00 cmpgu r4,r4,r3 800bd9c: 59 a3 00 14 sw (r13+20),r3 800bda0: b4 81 18 00 add r3,r4,r1 800bda4: 59 a3 00 10 sw (r13+16),r3 * to the end of the exisiting file, the remaining entries will be placed in * the buffer and the returned value will be equal to -m actual- times the * size of a directory entry. */ ssize_t imfs_dir_read( 800bda8: 35 6b 01 0c addi r11,r11,268 ); iop->offset = iop->offset + sizeof(struct dirent); bytes_transferred = bytes_transferred + sizeof( struct dirent ); } the_node = the_node->next; 800bdac: 29 8c 00 00 lw r12,(r12+0) /* protect against using sizes that are not exact multiples of the */ /* -dirent- size. These could result in unexpected results */ last_entry = first_entry + (count/sizeof(struct dirent)) * sizeof(struct dirent); /* The directory was not empty so try to move to the desired entry in chain*/ for ( 800bdb0: 49 eb ff e5 bg r15,r11,800bd44 current_entry = 0; current_entry < last_entry; current_entry = current_entry + sizeof(struct dirent) ){ if ( rtems_chain_is_tail( the_chain, the_node ) ){ 800bdb4: b9 c0 90 00 mv r18,r14 the_node = the_node->next; } /* Success */ return bytes_transferred; } 800bdb8: ba 40 08 00 mv r1,r18 800bdbc: 2b 9d 00 04 lw ra,(sp+4) 800bdc0: 2b 8b 00 34 lw r11,(sp+52) 800bdc4: 2b 8c 00 30 lw r12,(sp+48) 800bdc8: 2b 8d 00 2c lw r13,(sp+44) 800bdcc: 2b 8e 00 28 lw r14,(sp+40) 800bdd0: 2b 8f 00 24 lw r15,(sp+36) 800bdd4: 2b 90 00 20 lw r16,(sp+32) 800bdd8: 2b 91 00 1c lw r17,(sp+28) 800bddc: 2b 92 00 18 lw r18,(sp+24) 800bde0: 2b 93 00 14 lw r19,(sp+20) 800bde4: 2b 94 00 10 lw r20,(sp+16) 800bde8: 2b 95 00 0c lw r21,(sp+12) 800bdec: 2b 96 00 08 lw r22,(sp+8) 800bdf0: 37 9c 01 40 addi sp,sp,320 800bdf4: c3 a0 00 00 ret =============================================================================== 0800bf90 : int imfs_dir_rmnod( rtems_filesystem_location_info_t *parent_pathloc, /* IN */ rtems_filesystem_location_info_t *pathloc /* IN */ ) { 800bf90: 37 9c ff f8 addi sp,sp,-8 800bf94: 5b 8b 00 08 sw (sp+8),r11 800bf98: 5b 9d 00 04 sw (sp+4),ra IMFS_jnode_t *the_jnode; the_jnode = (IMFS_jnode_t *) pathloc->node_access; 800bf9c: 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 ) ) 800bfa0: 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 ); 800bfa4: 35 61 00 54 addi r1,r11,84 800bfa8: 5c 61 00 17 bne r3,r1,800c004 /* * You cannot remove the file system root node. */ if ( pathloc->mt_entry->mt_fs_root.node_access == pathloc->node_access ) 800bfac: 28 41 00 10 lw r1,(r2+16) 800bfb0: 28 21 00 1c lw r1,(r1+28) 800bfb4: 45 61 00 0c be r11,r1,800bfe4 /* * You cannot remove a mountpoint. */ if ( the_jnode->info.directory.mt_fs != NULL ) 800bfb8: 29 61 00 5c lw r1,(r11+92) 800bfbc: 5c 20 00 0a bne r1,r0,800bfe4 <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EBUSY ); IMFS_create_orphan( the_jnode ); 800bfc0: b9 60 08 00 mv r1,r11 800bfc4: fb ff f0 a3 calli 8008250 IMFS_check_node_remove( the_jnode ); 800bfc8: b9 60 08 00 mv r1,r11 800bfcc: fb ff f0 b5 calli 80082a0 return 0; 800bfd0: 34 01 00 00 mvi r1,0 } 800bfd4: 2b 9d 00 04 lw ra,(sp+4) 800bfd8: 2b 8b 00 08 lw r11,(sp+8) 800bfdc: 37 9c 00 08 addi sp,sp,8 800bfe0: c3 a0 00 00 ret /* * You cannot remove a mountpoint. */ if ( the_jnode->info.directory.mt_fs != NULL ) rtems_set_errno_and_return_minus_one( EBUSY ); 800bfe4: f8 00 03 7c calli 800cdd4 <__errno> 800bfe8: 34 02 00 10 mvi r2,16 800bfec: 58 22 00 00 sw (r1+0),r2 800bff0: 34 01 ff ff mvi r1,-1 IMFS_create_orphan( the_jnode ); IMFS_check_node_remove( the_jnode ); return 0; } 800bff4: 2b 9d 00 04 lw ra,(sp+4) 800bff8: 2b 8b 00 08 lw r11,(sp+8) 800bffc: 37 9c 00 08 addi sp,sp,8 800c000: c3 a0 00 00 ret /* * You cannot remove a node that still has children */ if ( ! rtems_chain_is_empty( &the_jnode->info.directory.Entries ) ) rtems_set_errno_and_return_minus_one( ENOTEMPTY ); 800c004: f8 00 03 74 calli 800cdd4 <__errno> 800c008: 34 02 00 5a mvi r2,90 800c00c: 58 22 00 00 sw (r1+0),r2 800c010: 34 01 ff ff mvi r1,-1 800c014: e3 ff ff f0 bi 800bfd4 =============================================================================== 08002210 : /* * Initialize useable but dummy databases */ void init_etc_passwd_group(void) { 8002210: 37 9c ff ec addi sp,sp,-20 8002214: 5b 8b 00 14 sw (sp+20),r11 8002218: 5b 8c 00 10 sw (sp+16),r12 800221c: 5b 8d 00 0c sw (sp+12),r13 8002220: 5b 8e 00 08 sw (sp+8),r14 8002224: 5b 9d 00 04 sw (sp+4),ra FILE *fp; static char etc_passwd_initted = 0; if (etc_passwd_initted) 8002228: 78 03 08 01 mvhi r3,0x801 800222c: 38 63 68 b8 ori r3,r3,0x68b8 8002230: 40 6d 00 00 lbu r13,(r3+0) 8002234: 45 a0 00 08 be r13,r0,8002254 fprintf( fp, "root:x:0:root\n" "rtems:x:1:rtems\n" "tty:x:2:tty\n" ); fclose(fp); } } 8002238: 2b 9d 00 04 lw ra,(sp+4) 800223c: 2b 8b 00 14 lw r11,(sp+20) 8002240: 2b 8c 00 10 lw r12,(sp+16) 8002244: 2b 8d 00 0c lw r13,(sp+12) 8002248: 2b 8e 00 08 lw r14,(sp+8) 800224c: 37 9c 00 14 addi sp,sp,20 8002250: c3 a0 00 00 ret FILE *fp; static char etc_passwd_initted = 0; if (etc_passwd_initted) return; etc_passwd_initted = 1; 8002254: 34 04 00 01 mvi r4,1 mkdir("/etc", 0777); 8002258: 78 01 08 01 mvhi r1,0x801 800225c: 34 02 01 ff mvi r2,511 FILE *fp; static char etc_passwd_initted = 0; if (etc_passwd_initted) return; etc_passwd_initted = 1; 8002260: 30 64 00 00 sb (r3+0),r4 mkdir("/etc", 0777); 8002264: 38 21 52 e0 ori r1,r1,0x52e0 /* * Initialize /etc/passwd */ if ((fp = fopen("/etc/passwd", "r")) != NULL) { 8002268: 78 0c 08 01 mvhi r12,0x801 800226c: 78 0b 08 01 mvhi r11,0x801 static char etc_passwd_initted = 0; if (etc_passwd_initted) return; etc_passwd_initted = 1; mkdir("/etc", 0777); 8002270: f8 00 02 b5 calli 8002d44 /* * Initialize /etc/passwd */ if ((fp = fopen("/etc/passwd", "r")) != NULL) { 8002274: 39 8c 52 e8 ori r12,r12,0x52e8 8002278: 39 6b 52 f4 ori r11,r11,0x52f4 800227c: b9 80 08 00 mv r1,r12 8002280: b9 60 10 00 mv r2,r11 8002284: f8 00 31 f8 calli 800ea64 8002288: b8 20 70 00 mv r14,r1 800228c: 44 2d 00 20 be r1,r13,800230c } else if ((fp = fopen("/etc/passwd", "w")) != NULL) { fprintf(fp, "root:*:0:0:root::/:/bin/sh\n" "rtems:*:1:1:RTEMS Application::/:/bin/sh\n" "tty:!:2:2:tty owner::/:/bin/false\n" ); fclose(fp); 8002290: f8 00 2f c6 calli 800e1a8 } /* * Initialize /etc/group */ if ((fp = fopen("/etc/group", "r")) != NULL) { 8002294: 78 0c 08 01 mvhi r12,0x801 8002298: 39 8c 53 64 ori r12,r12,0x5364 800229c: b9 60 10 00 mv r2,r11 80022a0: b9 80 08 00 mv r1,r12 80022a4: f8 00 31 f0 calli 800ea64 80022a8: b8 20 58 00 mv r11,r1 80022ac: 44 20 00 09 be r1,r0,80022d0 } else if ((fp = fopen("/etc/group", "w")) != NULL) { fprintf( fp, "root:x:0:root\n" "rtems:x:1:rtems\n" "tty:x:2:tty\n" ); fclose(fp); 80022b0: f8 00 2f be calli 800e1a8 } } 80022b4: 2b 9d 00 04 lw ra,(sp+4) 80022b8: 2b 8b 00 14 lw r11,(sp+20) 80022bc: 2b 8c 00 10 lw r12,(sp+16) 80022c0: 2b 8d 00 0c lw r13,(sp+12) 80022c4: 2b 8e 00 08 lw r14,(sp+8) 80022c8: 37 9c 00 14 addi sp,sp,20 80022cc: c3 a0 00 00 ret * Initialize /etc/group */ if ((fp = fopen("/etc/group", "r")) != NULL) { fclose(fp); } else if ((fp = fopen("/etc/group", "w")) != NULL) { 80022d0: 78 02 08 01 mvhi r2,0x801 80022d4: b9 80 08 00 mv r1,r12 80022d8: 38 42 52 f8 ori r2,r2,0x52f8 80022dc: f8 00 31 e2 calli 800ea64 80022e0: b8 20 60 00 mv r12,r1 80022e4: 44 2b ff d5 be r1,r11,8002238 <== NEVER TAKEN fprintf( fp, "root:x:0:root\n" 80022e8: 78 01 08 01 mvhi r1,0x801 80022ec: 34 02 00 01 mvi r2,1 80022f0: 34 03 00 2a mvi r3,42 80022f4: b9 80 20 00 mv r4,r12 80022f8: 38 21 53 70 ori r1,r1,0x5370 80022fc: f8 00 33 c3 calli 800f208 "rtems:x:1:rtems\n" "tty:x:2:tty\n" ); fclose(fp); 8002300: b9 80 08 00 mv r1,r12 8002304: f8 00 2f a9 calli 800e1a8 8002308: e3 ff ff eb bi 80022b4 * Initialize /etc/passwd */ if ((fp = fopen("/etc/passwd", "r")) != NULL) { fclose(fp); } else if ((fp = fopen("/etc/passwd", "w")) != NULL) { 800230c: 78 02 08 01 mvhi r2,0x801 8002310: b9 80 08 00 mv r1,r12 8002314: 38 42 52 f8 ori r2,r2,0x52f8 8002318: f8 00 31 d3 calli 800ea64 800231c: b8 20 60 00 mv r12,r1 8002320: 44 2e ff dd be r1,r14,8002294 <== NEVER TAKEN fprintf(fp, "root:*:0:0:root::/:/bin/sh\n" 8002324: 78 01 08 01 mvhi r1,0x801 8002328: 38 21 52 fc ori r1,r1,0x52fc 800232c: 34 02 00 01 mvi r2,1 8002330: 34 03 00 66 mvi r3,102 8002334: b9 80 20 00 mv r4,r12 8002338: f8 00 33 b4 calli 800f208 "rtems:*:1:1:RTEMS Application::/:/bin/sh\n" "tty:!:2:2:tty owner::/:/bin/false\n" ); fclose(fp); 800233c: b9 80 08 00 mv r1,r12 8002340: e3 ff ff d4 bi 8002290 =============================================================================== 08005e24 : /* * Process a single input character */ static int iproc (unsigned char c, struct rtems_termios_tty *tty) { 8005e24: 37 9c ff f4 addi sp,sp,-12 8005e28: 5b 8b 00 0c sw (sp+12),r11 8005e2c: 5b 8c 00 08 sw (sp+8),r12 8005e30: 5b 9d 00 04 sw (sp+4),ra 8005e34: b8 40 60 00 mv r12,r2 if (tty->termios.c_iflag & ISTRIP) 8005e38: 28 42 00 30 lw r2,(r2+48) /* * Process a single input character */ static int iproc (unsigned char c, struct rtems_termios_tty *tty) { 8005e3c: b8 20 58 00 mv r11,r1 if (tty->termios.c_iflag & ISTRIP) 8005e40: 20 41 00 20 andi r1,r2,0x20 8005e44: 44 20 00 02 be r1,r0,8005e4c <== ALWAYS TAKEN c &= 0x7f; 8005e48: 21 6b 00 7f andi r11,r11,0x7f <== NOT EXECUTED if (tty->termios.c_iflag & IUCLC) 8005e4c: 20 41 02 00 andi r1,r2,0x200 8005e50: 44 20 00 0b be r1,r0,8005e7c c = tolower (c); 8005e54: 78 01 08 02 mvhi r1,0x802 8005e58: 38 21 44 14 ori r1,r1,0x4414 8005e5c: 28 23 00 00 lw r3,(r1+0) 8005e60: b9 60 08 00 mv r1,r11 8005e64: b4 6b 58 00 add r11,r3,r11 8005e68: 41 64 00 01 lbu r4,(r11+1) 8005e6c: 34 03 00 01 mvi r3,1 8005e70: 20 84 00 03 andi r4,r4,0x3 8005e74: 44 83 00 40 be r4,r3,8005f74 8005e78: 20 2b 00 ff andi r11,r1,0xff if (c == '\r') { 8005e7c: 34 01 00 0d mvi r1,13 8005e80: 45 61 00 19 be r11,r1,8005ee4 if (tty->termios.c_iflag & IGNCR) return 0; if (tty->termios.c_iflag & ICRNL) c = '\n'; } else if ((c == '\n') && (tty->termios.c_iflag & INLCR)) { 8005e84: 34 01 00 0a mvi r1,10 8005e88: 45 61 00 37 be r11,r1,8005f64 c = '\r'; } if ((c != '\0') && (tty->termios.c_lflag & ICANON)) { 8005e8c: 5d 60 00 1c bne r11,r0,8005efc <== ALWAYS TAKEN } /* * FIXME: Should do IMAXBEL handling somehow */ if (tty->ccount < (CBUFSIZE-1)) { 8005e90: 78 01 08 02 mvhi r1,0x802 8005e94: 38 21 43 40 ori r1,r1,0x4340 8005e98: 28 23 00 00 lw r3,(r1+0) 8005e9c: 29 82 00 20 lw r2,(r12+32) if (tty->termios.c_lflag & ECHO) echo (c, tty); tty->cbuf[tty->ccount++] = c; } return 0; 8005ea0: 34 01 00 00 mvi r1,0 } /* * FIXME: Should do IMAXBEL handling somehow */ if (tty->ccount < (CBUFSIZE-1)) { 8005ea4: 34 63 ff ff addi r3,r3,-1 8005ea8: 4c 43 00 0a bge r2,r3,8005ed0 <== NEVER TAKEN if (tty->termios.c_lflag & ECHO) 8005eac: 29 81 00 3c lw r1,(r12+60) 8005eb0: 20 21 00 08 andi r1,r1,0x8 8005eb4: 5c 20 00 32 bne r1,r0,8005f7c <== ALWAYS TAKEN echo (c, tty); tty->cbuf[tty->ccount++] = c; 8005eb8: 29 84 00 1c lw r4,(r12+28) 8005ebc: 34 43 00 01 addi r3,r2,1 } return 0; 8005ec0: 34 01 00 00 mvi r1,0 * FIXME: Should do IMAXBEL handling somehow */ if (tty->ccount < (CBUFSIZE-1)) { if (tty->termios.c_lflag & ECHO) echo (c, tty); tty->cbuf[tty->ccount++] = c; 8005ec4: b4 82 10 00 add r2,r4,r2 8005ec8: 30 4b 00 00 sb (r2+0),r11 8005ecc: 59 83 00 20 sw (r12+32),r3 } return 0; } 8005ed0: 2b 9d 00 04 lw ra,(sp+4) 8005ed4: 2b 8b 00 0c lw r11,(sp+12) 8005ed8: 2b 8c 00 08 lw r12,(sp+8) 8005edc: 37 9c 00 0c addi sp,sp,12 8005ee0: c3 a0 00 00 ret if (tty->termios.c_iflag & IUCLC) c = tolower (c); if (c == '\r') { if (tty->termios.c_iflag & IGNCR) 8005ee4: 20 43 00 80 andi r3,r2,0x80 return 0; 8005ee8: 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) 8005eec: 5c 60 ff f9 bne r3,r0,8005ed0 <== NEVER TAKEN return 0; if (tty->termios.c_iflag & ICRNL) 8005ef0: 20 42 01 00 andi r2,r2,0x100 8005ef4: 44 43 00 02 be r2,r3,8005efc <== NEVER TAKEN c = '\n'; 8005ef8: 34 0b 00 0a mvi r11,10 } else if ((c == '\n') && (tty->termios.c_iflag & INLCR)) { c = '\r'; } if ((c != '\0') && (tty->termios.c_lflag & ICANON)) { 8005efc: 29 82 00 3c lw r2,(r12+60) 8005f00: 20 41 00 02 andi r1,r2,0x2 8005f04: 44 20 ff e3 be r1,r0,8005e90 if (c == tty->termios.c_cc[VERASE]) { 8005f08: 41 81 00 43 lbu r1,(r12+67) 8005f0c: 44 2b 00 37 be r1,r11,8005fe8 erase (tty, 0); return 0; } else if (c == tty->termios.c_cc[VKILL]) { 8005f10: 41 81 00 44 lbu r1,(r12+68) 8005f14: 44 2b 00 23 be r1,r11,8005fa0 erase (tty, 1); return 0; } else if (c == tty->termios.c_cc[VEOF]) { 8005f18: 41 83 00 45 lbu r3,(r12+69) return 1; 8005f1c: 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]) { 8005f20: 44 6b ff ec be r3,r11,8005ed0 <== NEVER TAKEN return 1; } else if (c == '\n') { 8005f24: 34 01 00 0a mvi r1,10 8005f28: 45 61 00 23 be r11,r1,8005fb4 if (tty->termios.c_lflag & (ECHO | ECHONL)) echo (c, tty); tty->cbuf[tty->ccount++] = c; return 1; } else if ((c == tty->termios.c_cc[VEOL]) || 8005f2c: 41 81 00 4c lbu r1,(r12+76) 8005f30: 44 2b 00 03 be r1,r11,8005f3c <== NEVER TAKEN 8005f34: 41 81 00 51 lbu r1,(r12+81) 8005f38: 5c 2b ff d6 bne r1,r11,8005e90 <== ALWAYS TAKEN (c == tty->termios.c_cc[VEOL2])) { if (tty->termios.c_lflag & ECHO) 8005f3c: 20 42 00 08 andi r2,r2,0x8 <== NOT EXECUTED 8005f40: 5c 40 00 14 bne r2,r0,8005f90 <== NOT EXECUTED echo (c, tty); tty->cbuf[tty->ccount++] = c; 8005f44: 29 83 00 20 lw r3,(r12+32) <== NOT EXECUTED 8005f48: 29 84 00 1c lw r4,(r12+28) <== NOT EXECUTED return 1; 8005f4c: 34 01 00 01 mvi r1,1 <== NOT EXECUTED return 1; } else if ((c == tty->termios.c_cc[VEOL]) || (c == tty->termios.c_cc[VEOL2])) { if (tty->termios.c_lflag & ECHO) echo (c, tty); tty->cbuf[tty->ccount++] = c; 8005f50: 34 62 00 01 addi r2,r3,1 <== NOT EXECUTED 8005f54: b4 83 18 00 add r3,r4,r3 <== NOT EXECUTED 8005f58: 30 6b 00 00 sb (r3+0),r11 <== NOT EXECUTED 8005f5c: 59 82 00 20 sw (r12+32),r2 <== NOT EXECUTED return 1; 8005f60: e3 ff ff dc bi 8005ed0 <== NOT EXECUTED if (c == '\r') { if (tty->termios.c_iflag & IGNCR) return 0; if (tty->termios.c_iflag & ICRNL) c = '\n'; } else if ((c == '\n') && (tty->termios.c_iflag & INLCR)) { 8005f64: 20 42 00 40 andi r2,r2,0x40 8005f68: 44 40 ff e5 be r2,r0,8005efc <== ALWAYS TAKEN c = '\r'; 8005f6c: 34 0b 00 0d mvi r11,13 <== NOT EXECUTED 8005f70: e3 ff ff e3 bi 8005efc <== NOT EXECUTED { if (tty->termios.c_iflag & ISTRIP) c &= 0x7f; if (tty->termios.c_iflag & IUCLC) c = tolower (c); 8005f74: 34 21 00 20 addi r1,r1,32 8005f78: e3 ff ff c0 bi 8005e78 /* * FIXME: Should do IMAXBEL handling somehow */ if (tty->ccount < (CBUFSIZE-1)) { if (tty->termios.c_lflag & ECHO) echo (c, tty); 8005f7c: b9 80 10 00 mv r2,r12 8005f80: b9 60 08 00 mv r1,r11 8005f84: fb ff fe f7 calli 8005b60 8005f88: 29 82 00 20 lw r2,(r12+32) 8005f8c: e3 ff ff cb bi 8005eb8 tty->cbuf[tty->ccount++] = c; return 1; } else if ((c == tty->termios.c_cc[VEOL]) || (c == tty->termios.c_cc[VEOL2])) { if (tty->termios.c_lflag & ECHO) echo (c, tty); 8005f90: b9 60 08 00 mv r1,r11 <== NOT EXECUTED 8005f94: b9 80 10 00 mv r2,r12 <== NOT EXECUTED 8005f98: fb ff fe f2 calli 8005b60 <== NOT EXECUTED 8005f9c: e3 ff ff ea bi 8005f44 <== NOT EXECUTED if (c == tty->termios.c_cc[VERASE]) { erase (tty, 0); return 0; } else if (c == tty->termios.c_cc[VKILL]) { erase (tty, 1); 8005fa0: b9 80 08 00 mv r1,r12 8005fa4: 34 02 00 01 mvi r2,1 8005fa8: fb ff ff 16 calli 8005c00 return 0; 8005fac: 34 01 00 00 mvi r1,0 8005fb0: e3 ff ff c8 bi 8005ed0 } else if (c == tty->termios.c_cc[VEOF]) { return 1; } else if (c == '\n') { if (tty->termios.c_lflag & (ECHO | ECHONL)) 8005fb4: 20 42 00 48 andi r2,r2,0x48 8005fb8: 44 40 00 03 be r2,r0,8005fc4 <== NEVER TAKEN echo (c, tty); 8005fbc: b9 80 10 00 mv r2,r12 8005fc0: fb ff fe e8 calli 8005b60 tty->cbuf[tty->ccount++] = c; 8005fc4: 29 82 00 20 lw r2,(r12+32) 8005fc8: 29 83 00 1c lw r3,(r12+28) 8005fcc: 34 41 00 01 addi r1,r2,1 8005fd0: b4 62 10 00 add r2,r3,r2 8005fd4: 34 03 00 0a mvi r3,10 8005fd8: 30 43 00 00 sb (r2+0),r3 8005fdc: 59 81 00 20 sw (r12+32),r1 return 1; 8005fe0: 34 01 00 01 mvi r1,1 8005fe4: e3 ff ff bb bi 8005ed0 c = '\r'; } if ((c != '\0') && (tty->termios.c_lflag & ICANON)) { if (c == tty->termios.c_cc[VERASE]) { erase (tty, 0); 8005fe8: b9 80 08 00 mv r1,r12 8005fec: 34 02 00 00 mvi r2,0 8005ff0: fb ff ff 04 calli 8005c00 return 0; 8005ff4: 34 01 00 00 mvi r1,0 8005ff8: e3 ff ff b6 bi 8005ed0 =============================================================================== 08026ab8 : int killinfo( pid_t pid, int sig, const union sigval *value ) { 8026ab8: 37 9c ff d8 addi sp,sp,-40 8026abc: 5b 8b 00 1c sw (sp+28),r11 8026ac0: 5b 8c 00 18 sw (sp+24),r12 8026ac4: 5b 8d 00 14 sw (sp+20),r13 8026ac8: 5b 8e 00 10 sw (sp+16),r14 8026acc: 5b 8f 00 0c sw (sp+12),r15 8026ad0: 5b 90 00 08 sw (sp+8),r16 8026ad4: 5b 9d 00 04 sw (sp+4),ra 8026ad8: b8 20 58 00 mv r11,r1 8026adc: b8 40 60 00 mv r12,r2 8026ae0: b8 60 70 00 mv r14,r3 POSIX_signals_Siginfo_node *psiginfo; /* * Only supported for the "calling process" (i.e. this node). */ if ( pid != getpid() ) 8026ae4: fb ff fe e3 calli 8026670 8026ae8: 5c 2b 00 a5 bne r1,r11,8026d7c rtems_set_errno_and_return_minus_one( ESRCH ); /* * Validate the signal passed. */ if ( !sig ) 8026aec: 45 80 00 04 be r12,r0,8026afc static inline bool is_valid_signo( int signo ) { return ((signo) >= 1 && (signo) <= 32 ); 8026af0: 35 82 ff ff addi r2,r12,-1 rtems_set_errno_and_return_minus_one( EINVAL ); if ( !is_valid_signo(sig) ) 8026af4: 34 01 00 1f mvi r1,31 8026af8: 50 22 00 0e bgeu r1,r2,8026b30 rtems_set_errno_and_return_minus_one( EINVAL ); 8026afc: fb ff b4 cf calli 8013e38 <__errno> 8026b00: 34 02 00 16 mvi r2,22 8026b04: 58 22 00 00 sw (r1+0),r2 8026b08: 34 01 ff ff mvi r1,-1 } DEBUG_STEP("\n"); _Thread_Enable_dispatch(); return 0; } 8026b0c: 2b 9d 00 04 lw ra,(sp+4) 8026b10: 2b 8b 00 1c lw r11,(sp+28) 8026b14: 2b 8c 00 18 lw r12,(sp+24) 8026b18: 2b 8d 00 14 lw r13,(sp+20) 8026b1c: 2b 8e 00 10 lw r14,(sp+16) 8026b20: 2b 8f 00 0c lw r15,(sp+12) 8026b24: 2b 90 00 08 lw r16,(sp+8) 8026b28: 37 9c 00 28 addi sp,sp,40 8026b2c: c3 a0 00 00 ret 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 ) 8026b30: b5 8c 80 00 add r16,r12,r12 8026b34: b6 0c 08 00 add r1,r16,r12 8026b38: 78 0d 08 02 mvhi r13,0x802 8026b3c: b4 21 08 00 add r1,r1,r1 8026b40: 39 ad af 68 ori r13,r13,0xaf68 8026b44: b4 21 08 00 add r1,r1,r1 8026b48: b5 a1 08 00 add r1,r13,r1 8026b4c: 28 23 00 08 lw r3,(r1+8) 8026b50: 34 0f 00 01 mvi r15,1 return 0; 8026b54: 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 ) 8026b58: 44 6f ff ed be r3,r15,8026b0c /* * 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 ) ) 8026b5c: 65 83 00 04 cmpei r3,r12,4 8026b60: 65 81 00 08 cmpei r1,r12,8 8026b64: b8 61 08 00 or r1,r3,r1 8026b68: 5c 20 00 3f bne r1,r0,8026c64 8026b6c: 34 01 00 0b mvi r1,11 8026b70: 45 81 00 3d be r12,r1,8026c64 static inline sigset_t signo_to_mask( uint32_t sig ) { return 1u << (sig - 1); 8026b74: 34 01 00 01 mvi r1,1 8026b78: fb ff 6d 7c calli 8002168 <__ashlsi3> /* * Build up a siginfo structure */ siginfo = &siginfo_struct; siginfo->si_signo = sig; 8026b7c: 5b 8c 00 20 sw (sp+32),r12 siginfo->si_code = SI_USER; 8026b80: 5b 8f 00 24 sw (sp+36),r15 8026b84: b8 20 58 00 mv r11,r1 if ( !value ) { 8026b88: 45 c0 00 3b be r14,r0,8026c74 siginfo->si_value.sival_int = 0; } else { siginfo->si_value = *value; 8026b8c: 29 c1 00 00 lw r1,(r14+0) 8026b90: 5b 81 00 28 sw (sp+40),r1 8026b94: 78 01 08 02 mvhi r1,0x802 8026b98: 38 21 aa 50 ori r1,r1,0xaa50 8026b9c: 28 22 00 00 lw r2,(r1+0) 8026ba0: 34 42 00 01 addi r2,r2,1 8026ba4: 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; 8026ba8: 78 01 08 02 mvhi r1,0x802 8026bac: 38 21 af 1c ori r1,r1,0xaf1c 8026bb0: 28 21 00 0c lw r1,(r1+12) api = the_thread->API_Extensions[ THREAD_API_POSIX ]; if ( _POSIX_signals_Is_interested( api, mask ) ) { 8026bb4: 28 22 01 20 lw r2,(r1+288) 8026bb8: 28 42 00 d0 lw r2,(r2+208) 8026bbc: a4 40 10 00 not r2,r2 8026bc0: a1 62 10 00 and r2,r11,r2 8026bc4: 5c 40 00 18 bne r2,r0,8026c24 } DEBUG_STEP("\n"); _Thread_Enable_dispatch(); return 0; } 8026bc8: 78 01 08 02 mvhi r1,0x802 8026bcc: 38 21 b0 f4 ori r1,r1,0xb0f4 8026bd0: 28 23 00 00 lw r3,(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 ); 8026bd4: 78 04 08 02 mvhi r4,0x802 8026bd8: 38 84 b0 f8 ori r4,r4,0xb0f8 8026bdc: 44 64 00 28 be r3,r4,8026c7c #endif /* * Is this thread is actually blocked waiting for the signal? */ if (the_thread->Wait.option & mask) 8026be0: 28 62 00 30 lw r2,(r3+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; 8026be4: b8 60 08 00 mv r1,r3 api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 8026be8: 28 65 01 20 lw r5,(r3+288) #endif /* * Is this thread is actually blocked waiting for the signal? */ if (the_thread->Wait.option & mask) 8026bec: a1 62 10 00 and r2,r11,r2 8026bf0: 44 40 00 09 be r2,r0,8026c14 8026bf4: e0 00 00 0c bi 8026c24 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 ) { 8026bf8: 28 63 00 00 lw r3,(r3+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 ); 8026bfc: 44 64 00 20 be r3,r4,8026c7c <== ALWAYS TAKEN #endif /* * Is this thread is actually blocked waiting for the signal? */ if (the_thread->Wait.option & mask) 8026c00: 28 62 00 30 lw r2,(r3+48) <== NOT EXECUTED 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; api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 8026c04: 28 65 01 20 lw r5,(r3+288) <== NOT EXECUTED 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; 8026c08: b8 60 08 00 mv r1,r3 <== NOT EXECUTED #endif /* * Is this thread is actually blocked waiting for the signal? */ if (the_thread->Wait.option & mask) 8026c0c: a1 62 10 00 and r2,r11,r2 <== NOT EXECUTED 8026c10: 5c 40 00 05 bne r2,r0,8026c24 <== NOT EXECUTED /* * Is this thread is blocked waiting for another signal but has * not blocked this one? */ if (~api->signals_blocked & mask) 8026c14: 28 a5 00 d0 lw r5,(r5+208) 8026c18: a4 a0 28 00 not r5,r5 8026c1c: a1 65 28 00 and r5,r11,r5 8026c20: 44 a2 ff f6 be r5,r2,8026bf8 /* * 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 ) ) { 8026c24: b9 80 10 00 mv r2,r12 8026c28: 37 83 00 20 addi r3,sp,32 8026c2c: f8 00 00 6a calli 8026dd4 <_POSIX_signals_Unblock_thread> 8026c30: 5c 20 00 0a bne r1,r0,8026c58 /* * 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 ); 8026c34: b9 60 08 00 mv r1,r11 8026c38: f8 00 00 5c calli 8026da8 <_POSIX_signals_Set_process_signals> if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) { 8026c3c: b6 0c 60 00 add r12,r16,r12 8026c40: b5 8c 08 00 add r1,r12,r12 8026c44: b4 21 08 00 add r1,r1,r1 8026c48: b5 a1 68 00 add r13,r13,r1 8026c4c: 29 a2 00 00 lw r2,(r13+0) 8026c50: 34 01 00 02 mvi r1,2 8026c54: 44 41 00 38 be r2,r1,8026d34 _Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node ); } DEBUG_STEP("\n"); _Thread_Enable_dispatch(); 8026c58: fb ff 97 75 calli 800ca2c <_Thread_Enable_dispatch> return 0; 8026c5c: 34 01 00 00 mvi r1,0 8026c60: e3 ff ff ab bi 8026b0c * P1003.1c/Draft 10, p. 33 says that certain signals should always * be directed to the executing thread such as those caused by hardware * faults. */ if ( (sig == SIGFPE) || (sig == SIGILL) || (sig == SIGSEGV ) ) return pthread_kill( pthread_self(), sig ); 8026c64: f8 00 01 0b calli 8027090 8026c68: b9 80 10 00 mv r2,r12 8026c6c: f8 00 00 bd calli 8026f60 8026c70: e3 ff ff a7 bi 8026b0c */ siginfo = &siginfo_struct; siginfo->si_signo = sig; siginfo->si_code = SI_USER; if ( !value ) { siginfo->si_value.sival_int = 0; 8026c74: 5b 80 00 28 sw (sp+40),r0 8026c78: e3 ff ff c7 bi 8026b94 * NOTES: * * + rtems internal threads do not receive signals. */ interested = NULL; interested_priority = PRIORITY_MAXIMUM + 1; 8026c7c: 78 01 08 02 mvhi r1,0x802 8026c80: 38 21 a0 c0 ori r1,r1,0xa0c0 8026c84: 40 26 00 00 lbu r6,(r1+0) */ #define _POSIX_signals_Is_interested( _api, _mask ) \ ( ~(_api)->signals_blocked & (_mask) ) int killinfo( 8026c88: 78 01 08 02 mvhi r1,0x802 8026c8c: 38 21 a9 ec ori r1,r1,0xa9ec * NOTES: * * + rtems internal threads do not receive signals. */ interested = NULL; interested_priority = PRIORITY_MAXIMUM + 1; 8026c90: 78 08 08 02 mvhi r8,0x802 */ #define _POSIX_signals_Is_interested( _api, _mask ) \ ( ~(_api)->signals_blocked & (_mask) ) int killinfo( 8026c94: 34 2a 00 10 addi r10,r1,16 * NOTES: * * + rtems internal threads do not receive signals. */ interested = NULL; interested_priority = PRIORITY_MAXIMUM + 1; 8026c98: 34 c6 00 01 addi r6,r6,1 8026c9c: 39 08 a9 f4 ori r8,r8,0xa9f4 * * NOTES: * * + rtems internal threads do not receive signals. */ interested = NULL; 8026ca0: 34 01 00 00 mvi r1,0 */ RTEMS_INLINE_ROUTINE bool _States_Is_interruptible_by_signal ( States_Control the_states ) { return (the_states & STATES_INTERRUPTIBLE_BY_SIGNAL); 8026ca4: 78 0f 10 00 mvhi r15,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 ] ) 8026ca8: 29 02 00 00 lw r2,(r8+0) 8026cac: 44 40 00 1e be r2,r0,8026d24 <== NEVER TAKEN continue; the_info = _Objects_Information_table[ the_api ][ 1 ]; 8026cb0: 28 42 00 04 lw r2,(r2+4) */ if ( !the_info ) continue; #endif maximum = the_info->maximum; 8026cb4: 2c 47 00 10 lhu r7,(r2+16) object_table = the_info->local_table; 8026cb8: 28 44 00 1c lw r4,(r2+28) for ( index = 1 ; index <= maximum ; index++ ) { 8026cbc: 44 e0 00 1a be r7,r0,8026d24 8026cc0: 34 03 00 01 mvi r3,1 the_thread = (Thread_Control *) object_table[ index ]; 8026cc4: 28 82 00 04 lw r2,(r4+4) if ( !the_thread ) 8026cc8: 44 40 00 14 be r2,r0,8026d18 /* * If this thread is of lower priority than the interested thread, * go on to the next thread. */ if ( the_thread->current_priority > interested_priority ) 8026ccc: 28 45 00 14 lw r5,(r2+20) 8026cd0: 54 a6 00 12 bgu r5,r6,8026d18 #if defined(RTEMS_DEBUG) if ( !api ) continue; #endif if ( !_POSIX_signals_Is_interested( api, mask ) ) 8026cd4: 28 49 01 20 lw r9,(r2+288) 8026cd8: 29 29 00 d0 lw r9,(r9+208) 8026cdc: a5 20 48 00 not r9,r9 8026ce0: a1 69 48 00 and r9,r11,r9 8026ce4: 45 20 00 0d be r9,r0,8026d18 * * 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 ) { 8026ce8: 54 c5 00 0a bgu r6,r5,8026d10 * and blocking interruptibutable by signal. * * If the interested thread is ready, don't think about changing. */ if ( interested && !_States_Is_ready( interested->current_state ) ) { 8026cec: 44 20 00 0b be r1,r0,8026d18 <== NEVER TAKEN 8026cf0: 28 29 00 10 lw r9,(r1+16) 8026cf4: 45 20 00 09 be r9,r0,8026d18 <== NEVER TAKEN /* preferred ready over blocked */ DEBUG_STEP("5"); if ( _States_Is_ready( the_thread->current_state ) ) { 8026cf8: 28 4e 00 10 lw r14,(r2+16) 8026cfc: 45 c0 00 05 be r14,r0,8026d10 8026d00: a1 2f 48 00 and r9,r9,r15 continue; } DEBUG_STEP("6"); /* prefer blocked/interruptible over blocked/not interruptible */ if ( !_States_Is_interruptible_by_signal(interested->current_state) ) { 8026d04: 5d 20 00 05 bne r9,r0,8026d18 8026d08: a1 cf 70 00 and r14,r14,r15 DEBUG_STEP("7"); if ( _States_Is_interruptible_by_signal(the_thread->current_state) ) { 8026d0c: 45 c9 00 03 be r14,r9,8026d18 */ if ( interested && !_States_Is_ready( interested->current_state ) ) { /* preferred ready over blocked */ DEBUG_STEP("5"); if ( _States_Is_ready( the_thread->current_state ) ) { 8026d10: b8 a0 30 00 mv r6,r5 8026d14: b8 40 08 00 mv r1,r2 #endif maximum = the_info->maximum; object_table = the_info->local_table; for ( index = 1 ; index <= maximum ; index++ ) { 8026d18: 34 63 00 01 addi r3,r3,1 8026d1c: 34 84 00 04 addi r4,r4,4 8026d20: 50 e3 ff e9 bgeu r7,r3,8026cc4 8026d24: 35 08 00 04 addi r8,r8,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++) { 8026d28: 5d 0a ff e0 bne r8,r10,8026ca8 } } } } if ( interested ) { 8026d2c: 5c 20 ff be bne r1,r0,8026c24 8026d30: e3 ff ff c1 bi 8026c34 _POSIX_signals_Set_process_signals( mask ); if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) { psiginfo = (POSIX_signals_Siginfo_node *) _Chain_Get( &_POSIX_signals_Inactive_siginfo ); 8026d34: 78 01 08 02 mvhi r1,0x802 8026d38: 38 21 b0 e8 ori r1,r1,0xb0e8 8026d3c: fb ff 8e b8 calli 800a81c <_Chain_Get> 8026d40: b8 20 10 00 mv r2,r1 if ( !psiginfo ) { 8026d44: 44 20 00 13 be r1,r0,8026d90 _Thread_Enable_dispatch(); rtems_set_errno_and_return_minus_one( EAGAIN ); } psiginfo->Info = *siginfo; 8026d48: 2b 83 00 20 lw r3,(sp+32) _Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node ); 8026d4c: b5 8c 60 00 add r12,r12,r12 8026d50: 78 01 08 02 mvhi r1,0x802 if ( !psiginfo ) { _Thread_Enable_dispatch(); rtems_set_errno_and_return_minus_one( EAGAIN ); } psiginfo->Info = *siginfo; 8026d54: 58 43 00 08 sw (r2+8),r3 8026d58: 2b 83 00 24 lw r3,(sp+36) _Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node ); 8026d5c: b5 8c 60 00 add r12,r12,r12 8026d60: 38 21 b1 60 ori r1,r1,0xb160 if ( !psiginfo ) { _Thread_Enable_dispatch(); rtems_set_errno_and_return_minus_one( EAGAIN ); } psiginfo->Info = *siginfo; 8026d64: 58 43 00 0c sw (r2+12),r3 8026d68: 2b 83 00 28 lw r3,(sp+40) _Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node ); 8026d6c: b5 81 08 00 add r1,r12,r1 if ( !psiginfo ) { _Thread_Enable_dispatch(); rtems_set_errno_and_return_minus_one( EAGAIN ); } psiginfo->Info = *siginfo; 8026d70: 58 43 00 10 sw (r2+16),r3 _Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node ); 8026d74: fb ff 8e 94 calli 800a7c4 <_Chain_Append> 8026d78: e3 ff ff b8 bi 8026c58 /* * Only supported for the "calling process" (i.e. this node). */ if ( pid != getpid() ) rtems_set_errno_and_return_minus_one( ESRCH ); 8026d7c: fb ff b4 2f calli 8013e38 <__errno> 8026d80: 34 02 00 03 mvi r2,3 8026d84: 58 22 00 00 sw (r1+0),r2 8026d88: 34 01 ff ff mvi r1,-1 8026d8c: e3 ff ff 60 bi 8026b0c if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) { psiginfo = (POSIX_signals_Siginfo_node *) _Chain_Get( &_POSIX_signals_Inactive_siginfo ); if ( !psiginfo ) { _Thread_Enable_dispatch(); 8026d90: fb ff 97 27 calli 800ca2c <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one( EAGAIN ); 8026d94: fb ff b4 29 calli 8013e38 <__errno> 8026d98: 34 02 00 0b mvi r2,11 8026d9c: 58 22 00 00 sw (r1+0),r2 8026da0: 34 01 ff ff mvi r1,-1 8026da4: e3 ff ff 5a bi 8026b0c =============================================================================== 080128b8 : extern void _wrapup_reent(struct _reent *); extern void _reclaim_reent(struct _reent *); void libc_wrapup(void) { 80128b8: 37 9c ff f4 addi sp,sp,-12 80128bc: 5b 8b 00 0c sw (sp+12),r11 80128c0: 5b 8c 00 08 sw (sp+8),r12 80128c4: 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())) 80128c8: 78 01 08 01 mvhi r1,0x801 80128cc: 38 21 4a 60 ori r1,r1,0x4a60 80128d0: 28 22 00 00 lw r2,(r1+0) 80128d4: 34 01 00 03 mvi r1,3 80128d8: 44 41 00 06 be r2,r1,80128f0 <== ALWAYS TAKEN */ fclose (stdin); fclose (stdout); fclose (stderr); } 80128dc: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 80128e0: 2b 8b 00 0c lw r11,(sp+12) <== NOT EXECUTED 80128e4: 2b 8c 00 08 lw r12,(sp+8) <== NOT EXECUTED 80128e8: 37 9c 00 0c addi sp,sp,12 <== NOT EXECUTED 80128ec: c3 a0 00 00 ret <== NOT EXECUTED /* * This was already done if the user called exit() directly . _wrapup_reent(0); */ if (_REENT != _global_impure_ptr) { 80128f0: 78 0b 08 01 mvhi r11,0x801 80128f4: 78 01 08 01 mvhi r1,0x801 80128f8: 39 6b 41 c0 ori r11,r11,0x41c0 80128fc: 38 21 3b b4 ori r1,r1,0x3bb4 8012900: 29 62 00 00 lw r2,(r11+0) 8012904: 28 2c 00 00 lw r12,(r1+0) 8012908: 44 4c 00 05 be r2,r12,801291c _wrapup_reent(_global_impure_ptr); 801290c: b9 80 08 00 mv r1,r12 8012910: f8 00 02 1c calli 8013180 <_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; 8012914: b9 80 10 00 mv r2,r12 8012918: 59 6c 00 00 sw (r11+0),r12 * * Should this be changed to do *all* file streams? * _fwalk (_REENT, fclose); */ fclose (stdin); 801291c: 28 41 00 04 lw r1,(r2+4) 8012920: fb ff e9 8d calli 800cf54 fclose (stdout); 8012924: 29 61 00 00 lw r1,(r11+0) 8012928: 28 21 00 08 lw r1,(r1+8) 801292c: fb ff e9 8a calli 800cf54 fclose (stderr); 8012930: 29 61 00 00 lw r1,(r11+0) 8012934: 28 21 00 0c lw r1,(r1+12) 8012938: fb ff e9 87 calli 800cf54 } 801293c: 2b 9d 00 04 lw ra,(sp+4) 8012940: 2b 8b 00 0c lw r11,(sp+12) 8012944: 2b 8c 00 08 lw r12,(sp+8) 8012948: 37 9c 00 0c addi sp,sp,12 801294c: c3 a0 00 00 ret =============================================================================== 080018ac : #include "malloc_p.h" void *malloc( size_t size ) { 80018ac: 37 9c ff f4 addi sp,sp,-12 80018b0: 5b 8b 00 0c sw (sp+12),r11 80018b4: 5b 8c 00 08 sw (sp+8),r12 80018b8: 5b 9d 00 04 sw (sp+4),ra void *return_this; MSBUMP(malloc_calls, 1); 80018bc: 78 03 08 01 mvhi r3,0x801 80018c0: 38 63 47 88 ori r3,r3,0x4788 80018c4: 28 62 00 04 lw r2,(r3+4) #include "malloc_p.h" void *malloc( size_t size ) { 80018c8: b8 20 60 00 mv r12,r1 /* * Validate the parameters */ if ( !size ) return (void *) 0; 80018cc: 34 0b 00 00 mvi r11,0 size_t size ) { void *return_this; MSBUMP(malloc_calls, 1); 80018d0: 34 41 00 01 addi r1,r2,1 80018d4: 58 61 00 04 sw (r3+4),r1 /* * If some free's have been deferred, then do them now. */ malloc_deferred_frees_process(); 80018d8: fb ff ff 9a calli 8001740 /* * Validate the parameters */ if ( !size ) 80018dc: 45 80 00 1d be r12,r0,8001950 return (void *) 0; /* * Do not attempt to allocate memory if not in correct system state. */ if ( _System_state_Is_up(_System_state_Get()) && 80018e0: 78 01 08 01 mvhi r1,0x801 80018e4: 38 21 4a 60 ori r1,r1,0x4a60 80018e8: 28 22 00 00 lw r2,(r1+0) 80018ec: 34 01 00 03 mvi r1,3 80018f0: 44 41 00 28 be r2,r1,8001990 RTEMS_INLINE_ROUTINE void *_Protected_heap_Allocate( Heap_Control *heap, uintptr_t size ) { return _Protected_heap_Allocate_aligned_with_boundary( heap, size, 0, 0 ); 80018f4: 78 01 08 01 mvhi r1,0x801 80018f8: 38 21 40 1c ori r1,r1,0x401c 80018fc: 28 21 00 00 lw r1,(r1+0) 8001900: b9 80 10 00 mv r2,r12 8001904: 34 03 00 00 mvi r3,0 8001908: 34 04 00 00 mvi r4,0 800190c: f8 00 0d 4d calli 8004e40 <_Protected_heap_Allocate_aligned_with_boundary> 8001910: 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 ) { 8001914: 44 20 00 15 be r1,r0,8001968 } /* * If the user wants us to dirty the allocated memory, then do it. */ if ( rtems_malloc_dirty_helper ) 8001918: 78 01 08 01 mvhi r1,0x801 800191c: 38 21 46 a8 ori r1,r1,0x46a8 8001920: 28 23 00 00 lw r3,(r1+0) 8001924: 44 60 00 04 be r3,r0,8001934 (*rtems_malloc_dirty_helper)( return_this, size ); 8001928: b9 60 08 00 mv r1,r11 800192c: b9 80 10 00 mv r2,r12 8001930: d8 60 00 00 call r3 /* * If configured, update the statistics */ if ( rtems_malloc_statistics_helpers ) 8001934: 78 01 08 01 mvhi r1,0x801 8001938: 38 21 46 a0 ori r1,r1,0x46a0 800193c: 28 21 00 00 lw r1,(r1+0) 8001940: 44 20 00 04 be r1,r0,8001950 (*rtems_malloc_statistics_helpers->at_malloc)(return_this); 8001944: 28 22 00 04 lw r2,(r1+4) 8001948: b9 60 08 00 mv r1,r11 800194c: d8 40 00 00 call r2 return return_this; } 8001950: b9 60 08 00 mv r1,r11 8001954: 2b 9d 00 04 lw ra,(sp+4) 8001958: 2b 8b 00 0c lw r11,(sp+12) 800195c: 2b 8c 00 08 lw r12,(sp+8) 8001960: 37 9c 00 0c addi sp,sp,12 8001964: c3 a0 00 00 ret */ return_this = _Protected_heap_Allocate( RTEMS_Malloc_Heap, size ); if ( !return_this ) { if (rtems_malloc_sbrk_helpers) 8001968: 78 01 08 01 mvhi r1,0x801 800196c: 38 21 46 a4 ori r1,r1,0x46a4 8001970: 28 21 00 00 lw r1,(r1+0) 8001974: 44 2b 00 0a be r1,r11,800199c return_this = (*rtems_malloc_sbrk_helpers->extend)( size ); 8001978: 28 22 00 04 lw r2,(r1+4) 800197c: b9 80 08 00 mv r1,r12 8001980: d8 40 00 00 call r2 if ( !return_this ) { 8001984: 44 20 00 06 be r1,r0,800199c 8001988: b8 20 58 00 mv r11,r1 800198c: e3 ff ff e3 bi 8001918 /* * Do not attempt to allocate memory if not in correct system state. */ if ( _System_state_Is_up(_System_state_Get()) && !malloc_is_system_state_OK() ) 8001990: fb ff ff 5a calli 80016f8 return (void *) 0; /* * Do not attempt to allocate memory if not in correct system state. */ if ( _System_state_Is_up(_System_state_Get()) && 8001994: 5c 20 ff d8 bne r1,r0,80018f4 <== ALWAYS TAKEN 8001998: e3 ff ff ee bi 8001950 <== NOT EXECUTED if ( !return_this ) { if (rtems_malloc_sbrk_helpers) return_this = (*rtems_malloc_sbrk_helpers->extend)( size ); if ( !return_this ) { errno = ENOMEM; 800199c: f8 00 2d 0e calli 800cdd4 <__errno> 80019a0: 34 02 00 0c mvi r2,12 80019a4: 58 22 00 00 sw (r1+0),r2 return (void *) 0; 80019a8: e3 ff ff ea bi 8001950 =============================================================================== 08001d54 : } void *malloc_sbrk_extend_and_allocate( size_t size ) { 8001d54: 37 9c ff ec addi sp,sp,-20 8001d58: 5b 8b 00 14 sw (sp+20),r11 8001d5c: 5b 8c 00 10 sw (sp+16),r12 8001d60: 5b 8d 00 0c sw (sp+12),r13 8001d64: 5b 8e 00 08 sw (sp+8),r14 8001d68: 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; 8001d6c: 78 02 08 01 mvhi r2,0x801 8001d70: 38 42 58 f0 ori r2,r2,0x58f0 8001d74: 28 4b 00 00 lw r11,(r2+0) } void *malloc_sbrk_extend_and_allocate( size_t size ) { 8001d78: b8 20 68 00 mv r13,r1 */ sbrk_amount = RTEMS_Malloc_Sbrk_amount; if ( sbrk_amount == 0 ) return (void *) 0; 8001d7c: 34 0c 00 00 mvi r12,0 * in "page" amounts. */ sbrk_amount = RTEMS_Malloc_Sbrk_amount; if ( sbrk_amount == 0 ) 8001d80: 5d 60 00 09 bne r11,r0,8001da4 <== ALWAYS TAKEN MSBUMP(space_available, the_size); return_this = _Protected_heap_Allocate( RTEMS_Malloc_Heap, size ); return return_this; } 8001d84: b9 80 08 00 mv r1,r12 8001d88: 2b 9d 00 04 lw ra,(sp+4) 8001d8c: 2b 8b 00 14 lw r11,(sp+20) 8001d90: 2b 8c 00 10 lw r12,(sp+16) 8001d94: 2b 8d 00 0c lw r13,(sp+12) 8001d98: 2b 8e 00 08 lw r14,(sp+8) 8001d9c: 37 9c 00 14 addi sp,sp,20 8001da0: c3 a0 00 00 ret sbrk_amount = RTEMS_Malloc_Sbrk_amount; if ( sbrk_amount == 0 ) return (void *) 0; the_size = ((size + sbrk_amount) / sbrk_amount * sbrk_amount); 8001da4: b9 60 10 00 mv r2,r11 8001da8: b4 2b 08 00 add r1,r1,r11 8001dac: f8 00 43 56 calli 8012b04 <__udivsi3> 8001db0: b9 60 10 00 mv r2,r11 8001db4: f8 00 42 ef calli 8012970 <__mulsi3> 8001db8: b8 20 70 00 mv r14,r1 starting_address = (void *) sbrk(the_size); 8001dbc: fb ff f9 c2 calli 80004c4 8001dc0: b8 20 10 00 mv r2,r1 if ( starting_address == (void*) -1 ) 8001dc4: 34 01 ff ff mvi r1,-1 8001dc8: 44 41 ff ef be r2,r1,8001d84 return (void *) 0; if ( !_Protected_heap_Extend( 8001dcc: 78 0b 08 01 mvhi r11,0x801 8001dd0: 39 6b 50 1c ori r11,r11,0x501c 8001dd4: 29 61 00 00 lw r1,(r11+0) 8001dd8: b9 c0 18 00 mv r3,r14 8001ddc: f8 00 0d 07 calli 80051f8 <_Protected_heap_Extend> 8001de0: 44 20 00 0d be r1,r0,8001e14 sbrk(-the_size); errno = ENOMEM; return (void *) 0; } MSBUMP(space_available, the_size); 8001de4: 78 05 08 01 mvhi r5,0x801 8001de8: 38 a5 58 c0 ori r5,r5,0x58c0 8001dec: 28 a3 00 00 lw r3,(r5+0) 8001df0: 29 61 00 00 lw r1,(r11+0) 8001df4: b9 a0 10 00 mv r2,r13 8001df8: b5 c3 70 00 add r14,r14,r3 8001dfc: 34 04 00 00 mvi r4,0 8001e00: 34 03 00 00 mvi r3,0 8001e04: 58 ae 00 00 sw (r5+0),r14 8001e08: f8 00 0c e2 calli 8005190 <_Protected_heap_Allocate_aligned_with_boundary> 8001e0c: b8 20 60 00 mv r12,r1 return_this = _Protected_heap_Allocate( RTEMS_Malloc_Heap, size ); return return_this; 8001e10: e3 ff ff dd bi 8001d84 if ( starting_address == (void*) -1 ) return (void *) 0; if ( !_Protected_heap_Extend( RTEMS_Malloc_Heap, starting_address, the_size) ) { sbrk(-the_size); 8001e14: c8 0e 08 00 sub r1,r0,r14 8001e18: fb ff f9 ab calli 80004c4 errno = ENOMEM; 8001e1c: f8 00 2d b2 calli 800d4e4 <__errno> 8001e20: 34 02 00 0c mvi r2,12 8001e24: 58 22 00 00 sw (r1+0),r2 return (void *) 0; 8001e28: e3 ff ff d7 bi 8001d84 =============================================================================== 0800b1dc : */ void memfile_free_blocks_in_table( block_p **block_table, int entries ) { 800b1dc: 37 9c ff ec addi sp,sp,-20 800b1e0: 5b 8b 00 14 sw (sp+20),r11 800b1e4: 5b 8c 00 10 sw (sp+16),r12 800b1e8: 5b 8d 00 0c sw (sp+12),r13 800b1ec: 5b 8e 00 08 sw (sp+8),r14 800b1f0: 5b 9d 00 04 sw (sp+4),ra 800b1f4: b8 20 70 00 mv r14,r1 800b1f8: b8 40 68 00 mv r13,r2 IMFS_assert( block_table ); /* * Now go through all the slots in the table and free the memory. */ b = *block_table; 800b1fc: 28 2b 00 00 lw r11,(r1+0) for ( i=0 ; i<== NEVER TAKEN 800b204: 34 0c 00 00 mvi r12,0 if ( b[i] ) { 800b208: 29 63 00 00 lw r3,(r11+0) /* * Now go through all the slots in the table and free the memory. */ b = *block_table; for ( i=0 ; i memfile_free_block( b[i] ); 800b218: fb ff ff e6 calli 800b1b0 b[i] = 0; 800b21c: 59 60 00 00 sw (r11+0),r0 /* * Now go through all the slots in the table and free the memory. */ b = *block_table; for ( i=0 ; i 800b228: 29 cb 00 00 lw r11,(r14+0) /* * Now that all the blocks in the block table are free, we can * free the block table itself. */ memfile_free_block( *block_table ); 800b22c: b9 60 08 00 mv r1,r11 800b230: fb ff ff e0 calli 800b1b0 *block_table = 0; 800b234: 59 c0 00 00 sw (r14+0),r0 } 800b238: 2b 9d 00 04 lw ra,(sp+4) 800b23c: 2b 8b 00 14 lw r11,(sp+20) 800b240: 2b 8c 00 10 lw r12,(sp+16) 800b244: 2b 8d 00 0c lw r13,(sp+12) 800b248: 2b 8e 00 08 lw r14,(sp+8) 800b24c: 37 9c 00 14 addi sp,sp,20 800b250: c3 a0 00 00 ret =============================================================================== 0800b87c : */ int memfile_ftruncate( rtems_libio_t *iop, rtems_off64_t length ) { 800b87c: 37 9c ff f0 addi sp,sp,-16 800b880: 5b 8b 00 08 sw (sp+8),r11 800b884: 5b 9d 00 04 sw (sp+4),ra IMFS_jnode_t *the_jnode; the_jnode = iop->pathinfo.node_access; 800b888: 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 ) 800b88c: 29 64 00 50 lw r4,(r11+80) 800b890: 48 44 00 13 bg r2,r4,800b8dc <== NEVER TAKEN 800b894: 44 82 00 0f be r4,r2,800b8d0 <== ALWAYS TAKEN /* * 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; 800b898: 59 62 00 50 sw (r11+80),r2 800b89c: 59 63 00 54 sw (r11+84),r3 iop->size = the_jnode->info.file.size; 800b8a0: 58 22 00 08 sw (r1+8),r2 800b8a4: 58 23 00 0c sw (r1+12),r3 IMFS_update_atime( the_jnode ); 800b8a8: 34 02 00 00 mvi r2,0 800b8ac: 37 81 00 0c addi r1,sp,12 800b8b0: fb ff d7 2c calli 8001560 800b8b4: 2b 82 00 0c lw r2,(sp+12) return 0; 800b8b8: 34 01 00 00 mvi r1,0 * future use and just set the length. */ the_jnode->info.file.size = length; iop->size = the_jnode->info.file.size; IMFS_update_atime( the_jnode ); 800b8bc: 59 62 00 40 sw (r11+64),r2 return 0; } 800b8c0: 2b 9d 00 04 lw ra,(sp+4) 800b8c4: 2b 8b 00 08 lw r11,(sp+8) 800b8c8: 37 9c 00 10 addi sp,sp,16 800b8cc: c3 a0 00 00 ret * 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 ) 800b8d0: 29 64 00 54 lw r4,(r11+84) 800b8d4: 54 64 00 02 bgu r3,r4,800b8dc 800b8d8: e3 ff ff f0 bi 800b898 return IMFS_memfile_extend( the_jnode, length ); 800b8dc: b9 60 08 00 mv r1,r11 800b8e0: b8 60 10 00 mv r2,r3 800b8e4: fb ff fe d3 calli 800b430 iop->size = the_jnode->info.file.size; IMFS_update_atime( the_jnode ); return 0; } 800b8e8: 2b 9d 00 04 lw ra,(sp+4) 800b8ec: 2b 8b 00 08 lw r11,(sp+8) 800b8f0: 37 9c 00 10 addi sp,sp,16 800b8f4: c3 a0 00 00 ret =============================================================================== 0800b8f8 : rtems_off64_t memfile_lseek( rtems_libio_t *iop, rtems_off64_t offset, int whence ) { 800b8f8: 37 9c ff f4 addi sp,sp,-12 800b8fc: 5b 8b 00 0c sw (sp+12),r11 800b900: 5b 8c 00 08 sw (sp+8),r12 800b904: 5b 9d 00 04 sw (sp+4),ra IMFS_jnode_t *the_jnode; the_jnode = iop->pathinfo.node_access; 800b908: 28 2c 00 1c lw r12,(r1+28) rtems_off64_t memfile_lseek( rtems_libio_t *iop, rtems_off64_t offset, int whence ) { 800b90c: 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) { 800b910: 34 01 00 06 mvi r1,6 800b914: 29 82 00 4c lw r2,(r12+76) 800b918: 44 41 00 10 be r2,r1,800b958 if (iop->offset > the_jnode->info.linearfile.size) iop->offset = the_jnode->info.linearfile.size; } else { /* Must be a block file (IMFS_MEMORY_FILE). */ if (IMFS_memfile_extend( the_jnode, iop->offset )) 800b91c: 29 62 00 14 lw r2,(r11+20) 800b920: b9 80 08 00 mv r1,r12 800b924: fb ff fe c3 calli 800b430 800b928: 5c 20 00 1d bne r1,r0,800b99c rtems_set_errno_and_return_minus_one( ENOSPC ); iop->size = the_jnode->info.file.size; 800b92c: 29 83 00 50 lw r3,(r12+80) 800b930: 29 61 00 10 lw r1,(r11+16) 800b934: 29 62 00 14 lw r2,(r11+20) 800b938: 59 63 00 08 sw (r11+8),r3 800b93c: 29 83 00 54 lw r3,(r12+84) 800b940: 59 63 00 0c sw (r11+12),r3 } return iop->offset; } 800b944: 2b 9d 00 04 lw ra,(sp+4) 800b948: 2b 8b 00 0c lw r11,(sp+12) 800b94c: 2b 8c 00 08 lw r12,(sp+8) 800b950: 37 9c 00 0c addi sp,sp,12 800b954: c3 a0 00 00 ret IMFS_jnode_t *the_jnode; the_jnode = iop->pathinfo.node_access; if (the_jnode->type == IMFS_LINEAR_FILE) { if (iop->offset > the_jnode->info.linearfile.size) 800b958: 29 61 00 10 lw r1,(r11+16) 800b95c: 29 83 00 50 lw r3,(r12+80) 800b960: 29 62 00 14 lw r2,(r11+20) 800b964: 29 84 00 54 lw r4,(r12+84) 800b968: 48 23 00 04 bg r1,r3,800b978 <== NEVER TAKEN 800b96c: 5c 23 ff f6 bne r1,r3,800b944 <== NEVER TAKEN 800b970: 54 44 00 02 bgu r2,r4,800b978 <== NEVER TAKEN 800b974: e3 ff ff f4 bi 800b944 iop->offset = the_jnode->info.linearfile.size; 800b978: b8 60 08 00 mv r1,r3 <== NOT EXECUTED 800b97c: b8 80 10 00 mv r2,r4 <== NOT EXECUTED 800b980: 59 63 00 10 sw (r11+16),r3 <== NOT EXECUTED 800b984: 59 64 00 14 sw (r11+20),r4 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOSPC ); iop->size = the_jnode->info.file.size; } return iop->offset; } 800b988: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 800b98c: 2b 8b 00 0c lw r11,(sp+12) <== NOT EXECUTED 800b990: 2b 8c 00 08 lw r12,(sp+8) <== NOT EXECUTED 800b994: 37 9c 00 0c addi sp,sp,12 <== NOT EXECUTED 800b998: c3 a0 00 00 ret <== NOT EXECUTED if (iop->offset > the_jnode->info.linearfile.size) iop->offset = the_jnode->info.linearfile.size; } else { /* Must be a block file (IMFS_MEMORY_FILE). */ if (IMFS_memfile_extend( the_jnode, iop->offset )) rtems_set_errno_and_return_minus_one( ENOSPC ); 800b99c: f8 00 05 0e calli 800cdd4 <__errno> 800b9a0: 34 02 00 1c mvi r2,28 800b9a4: 58 22 00 00 sw (r1+0),r2 800b9a8: 34 01 ff ff mvi r1,-1 800b9ac: 34 02 ff ff mvi r2,-1 800b9b0: e3 ff ff e5 bi 800b944 =============================================================================== 0800b7ac : rtems_libio_t *iop, const char *pathname, uint32_t flag, uint32_t mode ) { 800b7ac: 37 9c ff f4 addi sp,sp,-12 800b7b0: 5b 8b 00 0c sw (sp+12),r11 800b7b4: 5b 8c 00 08 sw (sp+8),r12 800b7b8: 5b 9d 00 04 sw (sp+4),ra 800b7bc: b8 20 60 00 mv r12,r1 the_jnode = iop->pathinfo.node_access; /* * Perform 'copy on write' for linear files */ if ((iop->flags & (LIBIO_FLAGS_WRITE | LIBIO_FLAGS_APPEND)) 800b7c0: 28 21 00 18 lw r1,(r1+24) uint32_t mode ) { IMFS_jnode_t *the_jnode; the_jnode = iop->pathinfo.node_access; 800b7c4: 29 8b 00 1c lw r11,(r12+28) /* * Perform 'copy on write' for linear files */ if ((iop->flags & (LIBIO_FLAGS_WRITE | LIBIO_FLAGS_APPEND)) 800b7c8: 20 22 02 04 andi r2,r1,0x204 800b7cc: 44 40 00 04 be r2,r0,800b7dc && (the_jnode->type == IMFS_LINEAR_FILE)) { 800b7d0: 29 63 00 4c lw r3,(r11+76) 800b7d4: 34 02 00 06 mvi r2,6 800b7d8: 44 62 00 13 be r3,r2,800b824 <== NEVER TAKEN the_jnode->info.file.size = 0; the_jnode->info.file.indirect = 0; the_jnode->info.file.doubly_indirect = 0; the_jnode->info.file.triply_indirect = 0; if ((count != 0) && (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1)) 800b7dc: 29 63 00 50 lw r3,(r11+80) 800b7e0: 29 62 00 54 lw r2,(r11+84) return -1; } if (iop->flags & LIBIO_FLAGS_APPEND) 800b7e4: 20 21 02 00 andi r1,r1,0x200 800b7e8: 5c 20 00 0a bne r1,r0,800b810 iop->offset = the_jnode->info.file.size; iop->size = the_jnode->info.file.size; 800b7ec: 59 82 00 0c sw (r12+12),r2 800b7f0: 59 83 00 08 sw (r12+8),r3 return 0; 800b7f4: 34 02 00 00 mvi r2,0 } 800b7f8: b8 40 08 00 mv r1,r2 800b7fc: 2b 9d 00 04 lw ra,(sp+4) 800b800: 2b 8b 00 0c lw r11,(sp+12) 800b804: 2b 8c 00 08 lw r12,(sp+8) 800b808: 37 9c 00 0c addi sp,sp,12 800b80c: c3 a0 00 00 ret if ((count != 0) && (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1)) return -1; } if (iop->flags & LIBIO_FLAGS_APPEND) iop->offset = the_jnode->info.file.size; 800b810: 59 83 00 10 sw (r12+16),r3 800b814: 59 82 00 14 sw (r12+20),r2 800b818: 29 63 00 50 lw r3,(r11+80) 800b81c: 29 62 00 54 lw r2,(r11+84) 800b820: e3 ff ff f3 bi 800b7ec /* * 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; 800b824: 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; 800b828: 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; 800b82c: 29 63 00 58 lw r3,(r11+88) <== NOT EXECUTED the_jnode->type = IMFS_MEMORY_FILE; 800b830: 59 61 00 4c sw (r11+76),r1 <== NOT EXECUTED the_jnode->info.file.size = 0; 800b834: 59 60 00 50 sw (r11+80),r0 <== NOT EXECUTED 800b838: 59 60 00 54 sw (r11+84),r0 <== NOT EXECUTED the_jnode->info.file.indirect = 0; 800b83c: 59 60 00 58 sw (r11+88),r0 <== NOT EXECUTED the_jnode->info.file.doubly_indirect = 0; 800b840: 59 60 00 5c sw (r11+92),r0 <== NOT EXECUTED the_jnode->info.file.triply_indirect = 0; 800b844: 59 60 00 60 sw (r11+96),r0 <== NOT EXECUTED if ((count != 0) 800b848: 5c 80 00 05 bne r4,r0,800b85c <== NOT EXECUTED 800b84c: 29 81 00 18 lw r1,(r12+24) <== NOT EXECUTED 800b850: 34 03 00 00 mvi r3,0 <== NOT EXECUTED 800b854: 34 02 00 00 mvi r2,0 <== NOT EXECUTED 800b858: e3 ff ff e3 bi 800b7e4 <== NOT EXECUTED && (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1)) 800b85c: 34 02 00 00 mvi r2,0 <== NOT EXECUTED 800b860: b9 60 08 00 mv r1,r11 <== NOT EXECUTED 800b864: fb ff ff 49 calli 800b588 <== NOT EXECUTED 800b868: 34 03 ff ff mvi r3,-1 <== NOT EXECUTED return -1; 800b86c: 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)) 800b870: 44 23 ff e2 be r1,r3,800b7f8 <== NOT EXECUTED 800b874: 29 81 00 18 lw r1,(r12+24) <== NOT EXECUTED 800b878: e3 ff ff d9 bi 800b7dc <== NOT EXECUTED =============================================================================== 08001b68 : const char *target, const char *filesystemtype, rtems_filesystem_options_t options, const void *data ) { 8001b68: 37 9c ff b0 addi sp,sp,-80 8001b6c: 5b 8b 00 3c sw (sp+60),r11 8001b70: 5b 8c 00 38 sw (sp+56),r12 8001b74: 5b 8d 00 34 sw (sp+52),r13 8001b78: 5b 8e 00 30 sw (sp+48),r14 8001b7c: 5b 8f 00 2c sw (sp+44),r15 8001b80: 5b 90 00 28 sw (sp+40),r16 8001b84: 5b 91 00 24 sw (sp+36),r17 8001b88: 5b 92 00 20 sw (sp+32),r18 8001b8c: 5b 93 00 1c sw (sp+28),r19 8001b90: 5b 94 00 18 sw (sp+24),r20 8001b94: 5b 95 00 14 sw (sp+20),r21 8001b98: 5b 96 00 10 sw (sp+16),r22 8001b9c: 5b 97 00 0c sw (sp+12),r23 8001ba0: 5b 98 00 08 sw (sp+8),r24 8001ba4: 5b 9d 00 04 sw (sp+4),ra 8001ba8: b8 20 78 00 mv r15,r1 /* * Are the file system options valid? */ if ( options != RTEMS_FILESYSTEM_READ_ONLY && 8001bac: 34 01 00 01 mvi r1,1 const char *target, const char *filesystemtype, rtems_filesystem_options_t options, const void *data ) { 8001bb0: b8 80 b0 00 mv r22,r4 8001bb4: b8 40 68 00 mv r13,r2 8001bb8: b8 60 70 00 mv r14,r3 8001bbc: b8 a0 c0 00 mv r24,r5 /* * Are the file system options valid? */ if ( options != RTEMS_FILESYSTEM_READ_ONLY && 8001bc0: 50 24 00 16 bgeu r1,r4,8001c18 /* * Get mount handler */ mount_h = rtems_filesystem_get_mount_handler( filesystemtype ); if ( !mount_h ) rtems_set_errno_and_return_minus_one( EINVAL ); 8001bc4: f8 00 2c 84 calli 800cdd4 <__errno> 8001bc8: 34 02 00 16 mvi r2,22 8001bcc: 58 22 00 00 sw (r1+0),r2 8001bd0: 34 01 ff ff mvi r1,-1 if ( loc_to_free ) rtems_filesystem_freenode( loc_to_free ); return -1; } 8001bd4: 2b 9d 00 04 lw ra,(sp+4) 8001bd8: 2b 8b 00 3c lw r11,(sp+60) 8001bdc: 2b 8c 00 38 lw r12,(sp+56) 8001be0: 2b 8d 00 34 lw r13,(sp+52) 8001be4: 2b 8e 00 30 lw r14,(sp+48) 8001be8: 2b 8f 00 2c lw r15,(sp+44) 8001bec: 2b 90 00 28 lw r16,(sp+40) 8001bf0: 2b 91 00 24 lw r17,(sp+36) 8001bf4: 2b 92 00 20 lw r18,(sp+32) 8001bf8: 2b 93 00 1c lw r19,(sp+28) 8001bfc: 2b 94 00 18 lw r20,(sp+24) 8001c00: 2b 95 00 14 lw r21,(sp+20) 8001c04: 2b 96 00 10 lw r22,(sp+16) 8001c08: 2b 97 00 0c lw r23,(sp+12) 8001c0c: 2b 98 00 08 lw r24,(sp+8) 8001c10: 37 9c 00 50 addi sp,sp,80 8001c14: c3 a0 00 00 ret rtems_set_errno_and_return_minus_one( EINVAL ); /* * Get mount handler */ mount_h = rtems_filesystem_get_mount_handler( filesystemtype ); 8001c18: b8 60 08 00 mv r1,r3 8001c1c: f8 00 1b b2 calli 8008ae4 8001c20: b8 20 b8 00 mv r23,r1 if ( !mount_h ) 8001c24: 44 20 ff e8 be r1,r0,8001bc4 { 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; 8001c28: 7d b0 00 00 cmpnei r16,r13,0 const char *target_or_null, const char *filesystemtype, size_t *target_length_ptr ) { const char *target = target_or_null != NULL ? target_or_null : "/"; 8001c2c: 46 00 00 8e be r16,r0,8001e64 * 4) The mount point exists with the proper permissions to allow mounting * 5) The selected mount point already has a file system mounted to it * */ int mount( 8001c30: b9 a0 08 00 mv r1,r13 8001c34: f8 00 31 09 calli 800e058 8001c38: b8 20 a0 00 mv r20,r1 8001c3c: 34 33 00 01 addi r19,r1,1 8001c40: b9 a0 a8 00 mv r21,r13 const char *filesystemtype, size_t *target_length_ptr ) { const char *target = target_or_null != NULL ? target_or_null : "/"; size_t filesystemtype_size = strlen( filesystemtype ) + 1; 8001c44: b9 c0 08 00 mv r1,r14 8001c48: f8 00 31 04 calli 800e058 8001c4c: 34 31 00 01 addi r17,r1,1 size_t source_size = source_or_null != NULL ? strlen( source_or_null ) + 1 : 0; 8001c50: 34 0c 00 00 mvi r12,0 8001c54: 45 e0 00 04 be r15,r0,8001c64 8001c58: b9 e0 08 00 mv r1,r15 8001c5c: f8 00 30 ff calli 800e058 8001c60: 34 2c 00 01 addi r12,r1,1 size_t target_size = strlen( target ) + 1; size_t size = sizeof( rtems_filesystem_mount_table_entry_t ) + filesystemtype_size + source_size + target_size; 8001c64: 36 63 00 74 addi r3,r19,116 8001c68: b4 71 18 00 add r3,r3,r17 rtems_filesystem_mount_table_entry_t *mt_entry = calloc( 1, size ); 8001c6c: 34 01 00 01 mvi r1,1 8001c70: b4 6c 10 00 add r2,r3,r12 8001c74: fb ff fd 75 calli 8001248 8001c78: b8 20 58 00 mv r11,r1 if ( mt_entry != NULL ) { 8001c7c: 44 20 00 75 be r1,r0,8001e50 <== NEVER TAKEN char *str = (char *) mt_entry + sizeof( *mt_entry ); 8001c80: 34 32 00 74 addi r18,r1,116 memcpy( str, filesystemtype, filesystemtype_size ); 8001c84: b9 c0 10 00 mv r2,r14 8001c88: ba 20 18 00 mv r3,r17 8001c8c: ba 40 08 00 mv r1,r18 8001c90: f8 00 2f 07 calli 800d8ac mt_entry->type = str; str += filesystemtype_size; 8001c94: b6 51 88 00 add r17,r18,r17 memcpy( str, source_or_null, source_size ); 8001c98: b9 80 18 00 mv r3,r12 8001c9c: b9 e0 10 00 mv r2,r15 8001ca0: ba 20 08 00 mv r1,r17 mt_entry->dev = str; str += source_size; 8001ca4: b6 2c 60 00 add r12,r17,r12 if ( mt_entry != NULL ) { char *str = (char *) mt_entry + sizeof( *mt_entry ); memcpy( str, filesystemtype, filesystemtype_size ); mt_entry->type = str; 8001ca8: 59 72 00 6c sw (r11+108),r18 str += filesystemtype_size; memcpy( str, source_or_null, source_size ); 8001cac: f8 00 2f 00 calli 800d8ac mt_entry->dev = str; str += source_size; memcpy( str, target, target_size ); 8001cb0: ba 60 18 00 mv r3,r19 8001cb4: b9 80 08 00 mv r1,r12 8001cb8: ba a0 10 00 mv r2,r21 memcpy( str, filesystemtype, filesystemtype_size ); mt_entry->type = str; str += filesystemtype_size; memcpy( str, source_or_null, source_size ); mt_entry->dev = str; 8001cbc: 59 71 00 70 sw (r11+112),r17 str += source_size; memcpy( str, target, target_size ); 8001cc0: f8 00 2e fb calli 800d8ac 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; 8001cc4: 34 01 00 05 mvi r1,5 8001cc8: 59 61 00 38 sw (r11+56),r1 8001ccc: 34 01 00 80 mvi r1,128 8001cd0: 59 61 00 3c sw (r11+60),r1 8001cd4: 34 01 00 07 mvi r1,7 8001cd8: 34 03 00 ff mvi r3,255 8001cdc: 34 0e 00 01 mvi r14,1 8001ce0: 59 61 00 40 sw (r11+64),r1 8001ce4: 34 01 04 00 mvi r1,1024 memcpy( str, source_or_null, source_size ); mt_entry->dev = str; str += source_size; memcpy( str, target, target_size ); mt_entry->target = str; 8001ce8: 59 6c 00 68 sw (r11+104),r12 &target_length ); if ( !mt_entry ) rtems_set_errno_and_return_minus_one( ENOMEM ); mt_entry->mt_fs_root.mt_entry = mt_entry; 8001cec: 59 6b 00 2c sw (r11+44),r11 mt_entry->options = options; 8001cf0: 59 76 00 30 sw (r11+48),r22 mt_entry->pathconf_limits_and_options = rtems_filesystem_default_pathconf; 8001cf4: 59 63 00 44 sw (r11+68),r3 8001cf8: 59 63 00 48 sw (r11+72),r3 8001cfc: 59 61 00 4c sw (r11+76),r1 8001d00: 59 60 00 50 sw (r11+80),r0 8001d04: 59 60 00 54 sw (r11+84),r0 8001d08: 59 6e 00 58 sw (r11+88),r14 8001d0c: 59 60 00 5c sw (r11+92),r0 8001d10: 59 60 00 60 sw (r11+96),r0 8001d14: 59 60 00 64 sw (r11+100),r0 /* * The mount_point should be a directory with read/write/execute * permissions in the existing tree. */ if ( has_target ) { 8001d18: 5e 00 00 28 bne r16,r0,8001db8 stop = (*routine)( mt_entry, routine_arg ); } rtems_libio_unlock(); return stop; } 8001d1c: 78 03 08 01 mvhi r3,0x801 8001d20: 38 63 41 14 ori r3,r3,0x4114 } } else { /* * Do we already have a base file system ? */ if ( !rtems_chain_is_empty( &mount_chain ) ) { 8001d24: 28 61 00 00 lw r1,(r3+0) 8001d28: 78 03 08 01 mvhi r3,0x801 8001d2c: 38 63 41 18 ori r3,r3,0x4118 ) { 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; 8001d30: 34 0c 00 00 mvi r12,0 } } else { /* * Do we already have a base file system ? */ if ( !rtems_chain_is_empty( &mount_chain ) ) { 8001d34: 5c 23 00 51 bne r1,r3,8001e78 <== NEVER TAKEN * 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 ) ) { 8001d38: b9 60 08 00 mv r1,r11 8001d3c: bb 00 10 00 mv r2,r24 8001d40: da e0 00 00 call r23 8001d44: 5c 20 00 54 bne r1,r0,8001e94 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 ); 8001d48: 78 0c 08 01 mvhi r12,0x801 8001d4c: 39 8c 47 74 ori r12,r12,0x4774 8001d50: 29 81 00 00 lw r1,(r12+0) 8001d54: 34 03 00 00 mvi r3,0 8001d58: 34 02 00 00 mvi r2,0 8001d5c: f8 00 03 de calli 8002cd4 8001d60: 78 01 08 01 mvhi r1,0x801 8001d64: 38 21 41 14 ori r1,r1,0x4114 8001d68: b9 60 10 00 mv r2,r11 8001d6c: f8 00 06 d1 calli 80038b0 <_Chain_Append> } static inline void rtems_libio_unlock( void ) { rtems_semaphore_release( rtems_libio_semaphore ); 8001d70: 29 81 00 00 lw r1,(r12+0) 8001d74: f8 00 04 34 calli 8002e44 rtems_libio_unlock(); if ( !has_target ) rtems_filesystem_root = mt_entry->mt_fs_root; return 0; 8001d78: 34 01 00 00 mvi r1,0 */ rtems_libio_lock(); rtems_chain_append( &mount_chain, &mt_entry->Node ); rtems_libio_unlock(); if ( !has_target ) 8001d7c: 5e 01 ff 96 bne r16,r1,8001bd4 rtems_filesystem_root = mt_entry->mt_fs_root; 8001d80: 78 02 08 01 mvhi r2,0x801 8001d84: 38 42 41 20 ori r2,r2,0x4120 8001d88: 28 42 00 00 lw r2,(r2+0) 8001d8c: 29 67 00 1c lw r7,(r11+28) 8001d90: 29 66 00 20 lw r6,(r11+32) 8001d94: 29 65 00 24 lw r5,(r11+36) 8001d98: 29 64 00 28 lw r4,(r11+40) 8001d9c: 29 63 00 2c lw r3,(r11+44) 8001da0: 58 47 00 18 sw (r2+24),r7 8001da4: 58 46 00 1c sw (r2+28),r6 8001da8: 58 45 00 20 sw (r2+32),r5 8001dac: 58 44 00 24 sw (r2+36),r4 8001db0: 58 43 00 28 sw (r2+40),r3 8001db4: e3 ff ff 88 bi 8001bd4 * The mount_point should be a directory with read/write/execute * permissions in the existing tree. */ if ( has_target ) { if ( rtems_filesystem_evaluate_path( 8001db8: 37 8c 00 40 addi r12,sp,64 8001dbc: ba 80 10 00 mv r2,r20 8001dc0: b9 a0 08 00 mv r1,r13 8001dc4: 34 03 00 07 mvi r3,7 8001dc8: b9 80 20 00 mv r4,r12 8001dcc: 34 05 00 01 mvi r5,1 8001dd0: fb ff fd 60 calli 8001350 8001dd4: 34 02 ff ff mvi r2,-1 8001dd8: 44 22 00 2b be r1,r2,8001e84 <== NEVER TAKEN /* * Test to see if it is a directory */ if ( loc.ops->node_type_h( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) { 8001ddc: 2b 82 00 4c lw r2,(sp+76) 8001de0: b9 80 08 00 mv r1,r12 8001de4: 28 42 00 10 lw r2,(r2+16) 8001de8: d8 40 00 00 call r2 8001dec: 5c 2e 00 33 bne r1,r14,8001eb8 /* * You can only mount one file system onto a single mount point. */ if ( rtems_filesystem_mount_iterate( is_node_fs_root, loc.node_access ) ) { 8001df0: 2b 82 00 40 lw r2,(sp+64) 8001df4: 78 01 08 00 mvhi r1,0x800 8001df8: 38 21 1a b0 ori r1,r1,0x1ab0 8001dfc: fb ff ff 30 calli 8001abc 8001e00: b8 20 68 00 mv r13,r1 8001e04: 5c 20 00 31 bne r1,r0,8001ec8 * 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; 8001e08: 2b 81 00 4c lw r1,(sp+76) * 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; 8001e0c: 2b 83 00 40 lw r3,(sp+64) /* * 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 ) ) { 8001e10: 28 22 00 20 lw r2,(r1+32) * 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; 8001e14: 59 63 00 08 sw (r11+8),r3 mt_entry->mt_point_node.handlers = loc.handlers; mt_entry->mt_point_node.ops = loc.ops; 8001e18: 59 61 00 14 sw (r11+20),r1 * 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; 8001e1c: 2b 83 00 48 lw r3,(sp+72) mt_entry->mt_point_node.ops = loc.ops; mt_entry->mt_point_node.mt_entry = loc.mt_entry; 8001e20: 2b 81 00 50 lw r1,(sp+80) * 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; 8001e24: 59 63 00 10 sw (r11+16),r3 mt_entry->mt_point_node.ops = loc.ops; mt_entry->mt_point_node.mt_entry = loc.mt_entry; 8001e28: 59 61 00 18 sw (r11+24),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 ) ) { 8001e2c: b9 60 08 00 mv r1,r11 8001e30: d8 40 00 00 call r2 8001e34: 44 2d ff c1 be r1,r13,8001d38 <== ALWAYS TAKEN return 0; cleanup_and_bail: free( mt_entry ); 8001e38: b9 60 08 00 mv r1,r11 8001e3c: fb ff fd 9b calli 80014a8 if ( loc_to_free ) rtems_filesystem_freenode( loc_to_free ); 8001e40: b9 80 08 00 mv r1,r12 8001e44: fb ff fd 91 calli 8001488 return -1; 8001e48: 34 01 ff ff mvi r1,-1 8001e4c: e3 ff ff 62 bi 8001bd4 target, filesystemtype, &target_length ); if ( !mt_entry ) rtems_set_errno_and_return_minus_one( ENOMEM ); 8001e50: f8 00 2b e1 calli 800cdd4 <__errno> <== NOT EXECUTED 8001e54: 34 02 00 0c mvi r2,12 <== NOT EXECUTED 8001e58: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED 8001e5c: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED 8001e60: e3 ff ff 5d bi 8001bd4 <== NOT EXECUTED const char *target_or_null, const char *filesystemtype, size_t *target_length_ptr ) { const char *target = target_or_null != NULL ? target_or_null : "/"; 8001e64: 78 15 08 01 mvhi r21,0x801 8001e68: 34 13 00 02 mvi r19,2 8001e6c: 34 14 00 01 mvi r20,1 8001e70: 3a b5 34 dc ori r21,r21,0x34dc 8001e74: e3 ff ff 74 bi 8001c44 } else { /* * Do we already have a base file system ? */ if ( !rtems_chain_is_empty( &mount_chain ) ) { errno = EINVAL; 8001e78: f8 00 2b d7 calli 800cdd4 <__errno> <== NOT EXECUTED 8001e7c: 34 02 00 16 mvi r2,22 <== NOT EXECUTED 8001e80: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED return 0; cleanup_and_bail: free( mt_entry ); 8001e84: b9 60 08 00 mv r1,r11 <== NOT EXECUTED 8001e88: fb ff fd 88 calli 80014a8 <== NOT EXECUTED if ( loc_to_free ) rtems_filesystem_freenode( loc_to_free ); return -1; 8001e8c: 34 01 ff ff mvi r1,-1 <== NOT EXECUTED 8001e90: e3 ff ff 51 bi 8001bd4 <== NOT EXECUTED if ( (*mount_h)( mt_entry, data ) ) { /* * Try to undo the mount operation */ loc.ops->unmount_h( mt_entry ); 8001e94: 2b 82 00 4c lw r2,(sp+76) 8001e98: b9 60 08 00 mv r1,r11 8001e9c: 28 42 00 28 lw r2,(r2+40) 8001ea0: d8 40 00 00 call r2 return 0; cleanup_and_bail: free( mt_entry ); 8001ea4: b9 60 08 00 mv r1,r11 8001ea8: fb ff fd 80 calli 80014a8 if ( loc_to_free ) rtems_filesystem_freenode( loc_to_free ); return -1; 8001eac: 34 01 ff ff mvi r1,-1 cleanup_and_bail: free( mt_entry ); if ( loc_to_free ) 8001eb0: 45 80 ff 49 be r12,r0,8001bd4 <== NEVER TAKEN 8001eb4: e3 ff ff e3 bi 8001e40 /* * Test to see if it is a directory */ if ( loc.ops->node_type_h( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) { errno = ENOTDIR; 8001eb8: f8 00 2b c7 calli 800cdd4 <__errno> 8001ebc: 34 02 00 14 mvi r2,20 8001ec0: 58 22 00 00 sw (r1+0),r2 goto cleanup_and_bail; 8001ec4: e3 ff ff dd bi 8001e38 /* * You can only mount one file system onto a single mount point. */ if ( rtems_filesystem_mount_iterate( is_node_fs_root, loc.node_access ) ) { errno = EBUSY; 8001ec8: f8 00 2b c3 calli 800cdd4 <__errno> 8001ecc: 34 02 00 10 mvi r2,16 8001ed0: 58 22 00 00 sw (r1+0),r2 goto cleanup_and_bail; 8001ed4: e3 ff ff d9 bi 8001e38 =============================================================================== 080021dc : const char *target, const char *filesystemtype, rtems_filesystem_options_t options, const void *data ) { 80021dc: 37 9c ff e8 addi sp,sp,-24 80021e0: 5b 8b 00 18 sw (sp+24),r11 80021e4: 5b 8c 00 14 sw (sp+20),r12 80021e8: 5b 8d 00 10 sw (sp+16),r13 80021ec: 5b 8e 00 0c sw (sp+12),r14 80021f0: 5b 8f 00 08 sw (sp+8),r15 80021f4: 5b 9d 00 04 sw (sp+4),ra 80021f8: b8 40 58 00 mv r11,r2 80021fc: b8 20 78 00 mv r15,r1 8002200: b8 60 70 00 mv r14,r3 8002204: b8 80 68 00 mv r13,r4 8002208: b8 a0 60 00 mv r12,r5 int rv = -1; if (target != NULL) { 800220c: 44 40 00 1b be r2,r0,8002278 rv = rtems_mkdir(target, S_IRWXU | S_IRWXG | S_IRWXO); 8002210: b8 40 08 00 mv r1,r2 8002214: 34 02 01 ff mvi r2,511 8002218: f8 00 02 d2 calli 8002d60 if (rv == 0) { 800221c: 44 20 00 09 be r1,r0,8002240 <== ALWAYS TAKEN } else { errno = EINVAL; } return rv; } 8002220: 2b 9d 00 04 lw ra,(sp+4) 8002224: 2b 8b 00 18 lw r11,(sp+24) 8002228: 2b 8c 00 14 lw r12,(sp+20) 800222c: 2b 8d 00 10 lw r13,(sp+16) 8002230: 2b 8e 00 0c lw r14,(sp+12) 8002234: 2b 8f 00 08 lw r15,(sp+8) 8002238: 37 9c 00 18 addi sp,sp,24 800223c: c3 a0 00 00 ret int rv = -1; if (target != NULL) { rv = rtems_mkdir(target, S_IRWXU | S_IRWXG | S_IRWXO); if (rv == 0) { rv = mount( 8002240: b9 e0 08 00 mv r1,r15 8002244: b9 60 10 00 mv r2,r11 8002248: b9 c0 18 00 mv r3,r14 800224c: b9 a0 20 00 mv r4,r13 8002250: b9 80 28 00 mv r5,r12 8002254: f8 00 00 3c calli 8002344 } else { errno = EINVAL; } return rv; } 8002258: 2b 9d 00 04 lw ra,(sp+4) 800225c: 2b 8b 00 18 lw r11,(sp+24) 8002260: 2b 8c 00 14 lw r12,(sp+20) 8002264: 2b 8d 00 10 lw r13,(sp+16) 8002268: 2b 8e 00 0c lw r14,(sp+12) 800226c: 2b 8f 00 08 lw r15,(sp+8) 8002270: 37 9c 00 18 addi sp,sp,24 8002274: c3 a0 00 00 ret options, data ); } } else { errno = EINVAL; 8002278: f8 00 2b aa calli 800d120 <__errno> 800227c: 34 02 00 16 mvi r2,22 8002280: 58 22 00 00 sw (r1+0),r2 const char *filesystemtype, rtems_filesystem_options_t options, const void *data ) { int rv = -1; 8002284: 34 01 ff ff mvi r1,-1 8002288: e3 ff ff e6 bi 8002220 =============================================================================== 08008df4 : int oflag, ... /* mode_t mode, */ /* struct mq_attr attr */ ) { 8008df4: 37 9c ff b8 addi sp,sp,-72 8008df8: 5b 8b 00 20 sw (sp+32),r11 8008dfc: 5b 8c 00 1c sw (sp+28),r12 8008e00: 5b 8d 00 18 sw (sp+24),r13 8008e04: 5b 8e 00 14 sw (sp+20),r14 8008e08: 5b 8f 00 10 sw (sp+16),r15 8008e0c: 5b 90 00 0c sw (sp+12),r16 8008e10: 5b 91 00 08 sw (sp+8),r17 8008e14: 5b 9d 00 04 sw (sp+4),ra rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 8008e18: 78 09 08 02 mvhi r9,0x802 8008e1c: 39 29 9d f8 ori r9,r9,0x9df8 8008e20: 29 2a 00 00 lw r10,(r9+0) 8008e24: b8 20 80 00 mv r16,r1 8008e28: 5b 82 00 30 sw (sp+48),r2 8008e2c: 35 4a 00 01 addi r10,r10,1 8008e30: 5b 83 00 34 sw (sp+52),r3 8008e34: 5b 84 00 38 sw (sp+56),r4 8008e38: 5b 85 00 3c sw (sp+60),r5 8008e3c: 5b 86 00 40 sw (sp+64),r6 8008e40: 5b 87 00 44 sw (sp+68),r7 8008e44: 5b 88 00 48 sw (sp+72),r8 8008e48: b8 40 68 00 mv r13,r2 8008e4c: 59 2a 00 00 sw (r9+0),r10 POSIX_Message_queue_Control_fd *the_mq_fd; Objects_Locations location; _Thread_Disable_dispatch(); if ( oflag & O_CREAT ) { 8008e50: 20 4f 02 00 andi r15,r2,0x200 /* struct mq_attr attr */ ) { va_list arg; mode_t mode; struct mq_attr *attr = NULL; 8008e54: 34 11 00 00 mvi r17,0 POSIX_Message_queue_Control_fd *the_mq_fd; Objects_Locations location; _Thread_Disable_dispatch(); if ( oflag & O_CREAT ) { 8008e58: 5d e0 00 38 bne r15,r0,8008f38 RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control_fd * _POSIX_Message_queue_Allocate_fd( void ) { return (POSIX_Message_queue_Control_fd *) _Objects_Allocate( &_POSIX_Message_queue_Information_fds ); 8008e5c: 78 0c 08 02 mvhi r12,0x802 8008e60: 39 8c a2 58 ori r12,r12,0xa258 8008e64: b9 80 08 00 mv r1,r12 8008e68: f8 00 0c 20 calli 800bee8 <_Objects_Allocate> 8008e6c: b8 20 58 00 mv r11,r1 attr = (struct mq_attr *) va_arg( arg, struct mq_attr * ); va_end(arg); } the_mq_fd = _POSIX_Message_queue_Allocate_fd(); if ( !the_mq_fd ) { 8008e70: 44 20 00 39 be r1,r0,8008f54 <== NEVER TAKEN _Thread_Enable_dispatch(); rtems_set_errno_and_return_minus_one( ENFILE ); } the_mq_fd->oflag = oflag; 8008e74: 58 2d 00 14 sw (r1+20),r13 status = _POSIX_Message_queue_Name_to_id( name, &the_mq_id ); 8008e78: 37 82 00 2c addi r2,sp,44 8008e7c: ba 00 08 00 mv r1,r16 8008e80: f8 00 1f 8b calli 8010cac <_POSIX_Message_queue_Name_to_id> 8008e84: b8 20 70 00 mv r14,r1 * If the name to id translation worked, then the message queue exists * and we can just return a pointer to the id. Otherwise we may * need to check to see if this is a "message queue does not exist" * or some other miscellaneous error on the name. */ if ( status ) { 8008e88: 5c 20 00 22 bne r1,r0,8008f10 } else { /* name -> ID translation succeeded */ /* * Check for existence with creation. */ if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) { 8008e8c: 21 ad 0a 00 andi r13,r13,0xa00 8008e90: 34 01 0a 00 mvi r1,2560 8008e94: 45 a1 00 36 be r13,r1,8008f6c Objects_Id id, Objects_Locations *location ) { return (POSIX_Message_queue_Control *) _Objects_Get( &_POSIX_Message_queue_Information, id, location ); 8008e98: 2b 82 00 2c lw r2,(sp+44) 8008e9c: 78 01 08 02 mvhi r1,0x802 8008ea0: 37 83 00 24 addi r3,sp,36 8008ea4: 38 21 a0 cc ori r1,r1,0xa0cc 8008ea8: f8 00 0d 99 calli 800c50c <_Objects_Get> /* * In this case we need to do an ID->pointer conversion to * check the mode. */ the_mq = _POSIX_Message_queue_Get( the_mq_id, &location ); the_mq->open_count += 1; 8008eac: 28 24 00 18 lw r4,(r1+24) Objects_Information *information, Objects_Control *the_object, const char *name ) { _Objects_Set_local_object( 8008eb0: 2d 62 00 0a lhu r2,(r11+10) #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 8008eb4: 29 83 00 1c lw r3,(r12+28) 8008eb8: 34 84 00 01 addi r4,r4,1 8008ebc: b4 42 10 00 add r2,r2,r2 8008ec0: 58 24 00 18 sw (r1+24),r4 8008ec4: b4 42 10 00 add r2,r2,r2 /* * In this case we need to do an ID->pointer conversion to * check the mode. */ the_mq = _POSIX_Message_queue_Get( the_mq_id, &location ); 8008ec8: 5b 81 00 28 sw (sp+40),r1 the_mq->open_count += 1; the_mq_fd->Queue = the_mq; 8008ecc: 59 61 00 10 sw (r11+16),r1 8008ed0: b4 62 10 00 add r2,r3,r2 8008ed4: 58 4b 00 00 sw (r2+0),r11 the_object ); #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) /* ASSERT: information->is_string */ the_object->name.name_p = name; 8008ed8: 59 60 00 0c sw (r11+12),r0 _Objects_Open_string( &_POSIX_Message_queue_Information_fds, &the_mq_fd->Object, NULL ); _Thread_Enable_dispatch(); 8008edc: f8 00 11 2a calli 800d384 <_Thread_Enable_dispatch> _Thread_Enable_dispatch(); 8008ee0: f8 00 11 29 calli 800d384 <_Thread_Enable_dispatch> return (mqd_t)the_mq_fd->Object.id; 8008ee4: 29 61 00 08 lw r1,(r11+8) ); _Thread_Enable_dispatch(); return (mqd_t) the_mq_fd->Object.id; } 8008ee8: 2b 9d 00 04 lw ra,(sp+4) 8008eec: 2b 8b 00 20 lw r11,(sp+32) 8008ef0: 2b 8c 00 1c lw r12,(sp+28) 8008ef4: 2b 8d 00 18 lw r13,(sp+24) 8008ef8: 2b 8e 00 14 lw r14,(sp+20) 8008efc: 2b 8f 00 10 lw r15,(sp+16) 8008f00: 2b 90 00 0c lw r16,(sp+12) 8008f04: 2b 91 00 08 lw r17,(sp+8) 8008f08: 37 9c 00 48 addi sp,sp,72 8008f0c: c3 a0 00 00 ret if ( status ) { /* * Unless provided a valid name that did not already exist * and we are willing to create then it is an error. */ if ( !( status == ENOENT && (oflag & O_CREAT) ) ) { 8008f10: 34 01 00 02 mvi r1,2 8008f14: 45 c1 00 1f be r14,r1,8008f90 RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Free_fd ( POSIX_Message_queue_Control_fd *the_mq_fd ) { _Objects_Free( &_POSIX_Message_queue_Information_fds, &the_mq_fd->Object ); 8008f18: b9 80 08 00 mv r1,r12 8008f1c: b9 60 10 00 mv r2,r11 8008f20: f8 00 0d 02 calli 800c328 <_Objects_Free> _POSIX_Message_queue_Free_fd( the_mq_fd ); _Thread_Enable_dispatch(); 8008f24: f8 00 11 18 calli 800d384 <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one_cast( status, mqd_t ); 8008f28: f8 00 30 e0 calli 80152a8 <__errno> 8008f2c: 58 2e 00 00 sw (r1+0),r14 8008f30: 34 01 ff ff mvi r1,-1 8008f34: e3 ff ff ed bi 8008ee8 RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control_fd * _POSIX_Message_queue_Allocate_fd( void ) { return (POSIX_Message_queue_Control_fd *) _Objects_Allocate( &_POSIX_Message_queue_Information_fds ); 8008f38: 78 0c 08 02 mvhi r12,0x802 8008f3c: 39 8c a2 58 ori r12,r12,0xa258 8008f40: b9 80 08 00 mv r1,r12 _Thread_Disable_dispatch(); if ( oflag & O_CREAT ) { va_start(arg, oflag); mode = (mode_t) va_arg( arg, unsigned int ); attr = (struct mq_attr *) va_arg( arg, struct mq_attr * ); 8008f44: 2b 91 00 38 lw r17,(sp+56) 8008f48: f8 00 0b e8 calli 800bee8 <_Objects_Allocate> 8008f4c: b8 20 58 00 mv r11,r1 va_end(arg); } the_mq_fd = _POSIX_Message_queue_Allocate_fd(); if ( !the_mq_fd ) { 8008f50: 5c 20 ff c9 bne r1,r0,8008e74 _Thread_Enable_dispatch(); 8008f54: f8 00 11 0c calli 800d384 <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one( ENFILE ); 8008f58: f8 00 30 d4 calli 80152a8 <__errno> 8008f5c: 34 02 00 17 mvi r2,23 8008f60: 58 22 00 00 sw (r1+0),r2 8008f64: 34 01 ff ff mvi r1,-1 8008f68: e3 ff ff e0 bi 8008ee8 RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Free_fd ( POSIX_Message_queue_Control_fd *the_mq_fd ) { _Objects_Free( &_POSIX_Message_queue_Information_fds, &the_mq_fd->Object ); 8008f6c: b9 60 10 00 mv r2,r11 8008f70: b9 80 08 00 mv r1,r12 8008f74: f8 00 0c ed calli 800c328 <_Objects_Free> /* * Check for existence with creation. */ if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) { _POSIX_Message_queue_Free_fd( the_mq_fd ); _Thread_Enable_dispatch(); 8008f78: f8 00 11 03 calli 800d384 <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one_cast( EEXIST, mqd_t ); 8008f7c: f8 00 30 cb calli 80152a8 <__errno> 8008f80: 34 02 00 11 mvi r2,17 8008f84: 58 22 00 00 sw (r1+0),r2 8008f88: 34 01 ff ff mvi r1,-1 8008f8c: e3 ff ff d7 bi 8008ee8 if ( status ) { /* * Unless provided a valid name that did not already exist * and we are willing to create then it is an error. */ if ( !( status == ENOENT && (oflag & O_CREAT) ) ) { 8008f90: 45 e0 ff e2 be r15,r0,8008f18 /* * At this point, the message queue does not exist and everything has been * checked. We should go ahead and create a message queue. */ status = _POSIX_Message_queue_Create_support( 8008f94: 34 02 00 01 mvi r2,1 8008f98: ba 00 08 00 mv r1,r16 8008f9c: ba 20 18 00 mv r3,r17 8008fa0: 37 84 00 28 addi r4,sp,40 8008fa4: f8 00 1e d4 calli 8010af4 <_POSIX_Message_queue_Create_support> ); /* * errno was set by Create_support, so don't set it again. */ if ( status == -1 ) { 8008fa8: 34 02 ff ff mvi r2,-1 8008fac: 44 22 00 0d be r1,r2,8008fe0 Objects_Information *information, Objects_Control *the_object, const char *name ) { _Objects_Set_local_object( 8008fb0: 2d 61 00 0a lhu r1,(r11+10) #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 8008fb4: 29 82 00 1c lw r2,(r12+28) _POSIX_Message_queue_Free_fd( the_mq_fd ); _Thread_Enable_dispatch(); return (mqd_t) -1; } the_mq_fd->Queue = the_mq; 8008fb8: 2b 83 00 28 lw r3,(sp+40) 8008fbc: b4 21 08 00 add r1,r1,r1 8008fc0: b4 21 08 00 add r1,r1,r1 8008fc4: b4 41 08 00 add r1,r2,r1 8008fc8: 59 63 00 10 sw (r11+16),r3 8008fcc: 58 2b 00 00 sw (r1+0),r11 the_object ); #if defined(RTEMS_SCORE_OBJECT_ENABLE_STRING_NAMES) /* ASSERT: information->is_string */ the_object->name.name_p = name; 8008fd0: 59 60 00 0c sw (r11+12),r0 &_POSIX_Message_queue_Information_fds, &the_mq_fd->Object, NULL ); _Thread_Enable_dispatch(); 8008fd4: f8 00 10 ec calli 800d384 <_Thread_Enable_dispatch> return (mqd_t) the_mq_fd->Object.id; 8008fd8: 29 61 00 08 lw r1,(r11+8) 8008fdc: e3 ff ff c3 bi 8008ee8 8008fe0: b9 80 08 00 mv r1,r12 8008fe4: b9 60 10 00 mv r2,r11 8008fe8: f8 00 0c d0 calli 800c328 <_Objects_Free> /* * errno was set by Create_support, so don't set it again. */ if ( status == -1 ) { _POSIX_Message_queue_Free_fd( the_mq_fd ); _Thread_Enable_dispatch(); 8008fec: f8 00 10 e6 calli 800d384 <_Thread_Enable_dispatch> return (mqd_t) -1; 8008ff0: 34 01 ff ff mvi r1,-1 8008ff4: e3 ff ff bd bi 8008ee8 =============================================================================== 08002144 : void newlib_delete_hook( rtems_tcb *current_task, rtems_tcb *deleted_task ) { 8002144: 37 9c ff f0 addi sp,sp,-16 8002148: 5b 8b 00 10 sw (sp+16),r11 800214c: 5b 8c 00 0c sw (sp+12),r12 8002150: 5b 8d 00 08 sw (sp+8),r13 8002154: 5b 9d 00 04 sw (sp+4),ra 8002158: b8 20 68 00 mv r13,r1 800215c: b8 40 58 00 mv r11,r2 /* * The reentrancy structure was allocated by newlib using malloc() */ if (current_task == deleted_task) { 8002160: 44 22 00 1e be r1,r2,80021d8 ptr = _REENT; } else { ptr = deleted_task->libc_reent; 8002164: 28 4c 01 18 lw r12,(r2+280) } if (ptr && ptr != _global_impure_ptr) { 8002168: 45 80 00 0b be r12,r0,8002194 <== NEVER TAKEN 800216c: 78 02 08 01 mvhi r2,0x801 8002170: 38 42 3b b4 ori r2,r2,0x3bb4 8002174: 28 41 00 00 lw r1,(r2+0) 8002178: 45 81 00 07 be r12,r1,8002194 _reclaim_reent(ptr); */ /* * Just in case there are some buffers lying around. */ _fwalk(ptr, newlib_free_buffers); 800217c: 78 02 08 00 mvhi r2,0x800 8002180: b9 80 08 00 mv r1,r12 8002184: 38 42 1e dc ori r2,r2,0x1edc 8002188: f8 00 2d 61 calli 800d70c <_fwalk> #if REENT_MALLOCED free(ptr); #else _Workspace_Free(ptr); 800218c: b9 80 08 00 mv r1,r12 8002190: f8 00 13 7b calli 8006f7c <_Workspace_Free> #endif } deleted_task->libc_reent = NULL; 8002194: 59 60 01 18 sw (r11+280),r0 /* * Require the switch back to another task to install its own */ if ( current_task == deleted_task ) { 8002198: 45 ab 00 07 be r13,r11,80021b4 _REENT = 0; } } 800219c: 2b 9d 00 04 lw ra,(sp+4) 80021a0: 2b 8b 00 10 lw r11,(sp+16) 80021a4: 2b 8c 00 0c lw r12,(sp+12) 80021a8: 2b 8d 00 08 lw r13,(sp+8) 80021ac: 37 9c 00 10 addi sp,sp,16 80021b0: c3 a0 00 00 ret /* * Require the switch back to another task to install its own */ if ( current_task == deleted_task ) { _REENT = 0; 80021b4: 78 01 08 01 mvhi r1,0x801 80021b8: 38 21 41 c0 ori r1,r1,0x41c0 80021bc: 58 20 00 00 sw (r1+0),r0 } } 80021c0: 2b 9d 00 04 lw ra,(sp+4) 80021c4: 2b 8b 00 10 lw r11,(sp+16) 80021c8: 2b 8c 00 0c lw r12,(sp+12) 80021cc: 2b 8d 00 08 lw r13,(sp+8) 80021d0: 37 9c 00 10 addi sp,sp,16 80021d4: c3 a0 00 00 ret /* * The reentrancy structure was allocated by newlib using malloc() */ if (current_task == deleted_task) { ptr = _REENT; 80021d8: 78 01 08 01 mvhi r1,0x801 80021dc: 38 21 41 c0 ori r1,r1,0x41c0 80021e0: 28 2c 00 00 lw r12,(r1+0) 80021e4: e3 ff ff e1 bi 8002168 =============================================================================== 08001edc : */ int newlib_free_buffers( FILE *fp ) { 8001edc: 37 9c ff f8 addi sp,sp,-8 8001ee0: 5b 8b 00 08 sw (sp+8),r11 8001ee4: 5b 9d 00 04 sw (sp+4),ra 8001ee8: b8 20 58 00 mv r11,r1 switch ( fileno(fp) ) { 8001eec: f8 00 2c cf calli 800d228 8001ef0: 34 02 00 02 mvi r2,2 8001ef4: 54 22 00 09 bgu r1,r2,8001f18 <== NEVER TAKEN case 0: case 1: case 2: if (fp->_flags & __SMBF) { 8001ef8: 2d 61 00 0c lhu r1,(r11+12) 8001efc: 20 21 00 80 andi r1,r1,0x80 8001f00: 5c 20 00 0d bne r1,r0,8001f34 <== NEVER TAKEN break; default: fclose(fp); } return 0; } 8001f04: 34 01 00 00 mvi r1,0 8001f08: 2b 9d 00 04 lw ra,(sp+4) 8001f0c: 2b 8b 00 08 lw r11,(sp+8) 8001f10: 37 9c 00 08 addi sp,sp,8 8001f14: c3 a0 00 00 ret fp->_flags &= ~__SMBF; fp->_bf._base = fp->_p = (unsigned char *) NULL; } break; default: fclose(fp); 8001f18: b9 60 08 00 mv r1,r11 <== NOT EXECUTED 8001f1c: f8 00 2c 0e calli 800cf54 <== NOT EXECUTED } return 0; } 8001f20: 34 01 00 00 mvi r1,0 <== NOT EXECUTED 8001f24: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 8001f28: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED 8001f2c: 37 9c 00 08 addi sp,sp,8 <== NOT EXECUTED 8001f30: c3 a0 00 00 ret <== NOT EXECUTED switch ( fileno(fp) ) { case 0: case 1: case 2: if (fp->_flags & __SMBF) { free( fp->_bf._base ); 8001f34: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED 8001f38: fb ff fd 5c calli 80014a8 <== NOT EXECUTED fp->_flags &= ~__SMBF; 8001f3c: 2d 61 00 0c lhu r1,(r11+12) <== NOT EXECUTED fp->_bf._base = fp->_p = (unsigned char *) NULL; 8001f40: 59 60 00 00 sw (r11+0),r0 <== NOT EXECUTED 8001f44: 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; 8001f48: 20 21 ff 7f andi r1,r1,0xff7f <== NOT EXECUTED 8001f4c: 0d 61 00 0c sh (r11+12),r1 <== NOT EXECUTED break; default: fclose(fp); } return 0; } 8001f50: 34 01 00 00 mvi r1,0 <== NOT EXECUTED 8001f54: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 8001f58: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED 8001f5c: 37 9c 00 08 addi sp,sp,8 <== NOT EXECUTED 8001f60: c3 a0 00 00 ret <== NOT EXECUTED =============================================================================== 08002274 : int open( const char *pathname, int flags, ... ) { 8002274: 37 9c ff ac addi sp,sp,-84 8002278: 5b 8b 00 24 sw (sp+36),r11 800227c: 5b 8c 00 20 sw (sp+32),r12 8002280: 5b 8d 00 1c sw (sp+28),r13 8002284: 5b 8e 00 18 sw (sp+24),r14 8002288: 5b 8f 00 14 sw (sp+20),r15 800228c: 5b 90 00 10 sw (sp+16),r16 8002290: 5b 91 00 0c sw (sp+12),r17 8002294: 5b 92 00 08 sw (sp+8),r18 8002298: 5b 9d 00 04 sw (sp+4),ra /* * Set the Evaluation flags */ eval_flags = 0; status = flags + 1; 800229c: 34 49 00 01 addi r9,r2,1 if ( ( status & _FREAD ) == _FREAD ) eval_flags |= RTEMS_LIBIO_PERMS_READ; 80022a0: 21 2c 00 01 andi r12,r9,0x1 80022a4: b5 8c 60 00 add r12,r12,r12 int open( const char *pathname, int flags, ... ) { 80022a8: 5b 82 00 3c sw (sp+60),r2 80022ac: 5b 83 00 40 sw (sp+64),r3 80022b0: 5b 84 00 44 sw (sp+68),r4 80022b4: 5b 85 00 48 sw (sp+72),r5 80022b8: 5b 86 00 4c sw (sp+76),r6 80022bc: 5b 87 00 50 sw (sp+80),r7 80022c0: 5b 88 00 54 sw (sp+84),r8 */ eval_flags = 0; status = flags + 1; if ( ( status & _FREAD ) == _FREAD ) eval_flags |= RTEMS_LIBIO_PERMS_READ; if ( ( status & _FWRITE ) == _FWRITE ) 80022c4: 21 29 00 02 andi r9,r9,0x2 int open( const char *pathname, int flags, ... ) { 80022c8: b8 40 68 00 mv r13,r2 80022cc: b8 20 70 00 mv r14,r1 * Set the Evaluation flags */ eval_flags = 0; status = flags + 1; if ( ( status & _FREAD ) == _FREAD ) eval_flags |= RTEMS_LIBIO_PERMS_READ; 80022d0: b5 8c 60 00 add r12,r12,r12 if ( ( status & _FWRITE ) == _FWRITE ) 80022d4: 45 20 00 02 be r9,r0,80022dc eval_flags |= RTEMS_LIBIO_PERMS_WRITE; 80022d8: 39 8c 00 02 ori r12,r12,0x2 va_start(ap, flags); mode = va_arg( ap, int ); 80022dc: 2b 91 00 40 lw r17,(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(); 80022e0: f8 00 19 07 calli 80086fc 80022e4: b8 20 58 00 mv r11,r1 if ( iop == 0 ) { 80022e8: 44 20 00 3c be r1,r0,80023d8 } /* * See if the file exists. */ status = rtems_filesystem_evaluate_path( 80022ec: b9 c0 08 00 mv r1,r14 80022f0: f8 00 2f 5a calli 800e058 80022f4: 37 8f 00 28 addi r15,sp,40 80022f8: b8 20 10 00 mv r2,r1 80022fc: b9 80 18 00 mv r3,r12 8002300: b9 c0 08 00 mv r1,r14 8002304: b9 e0 20 00 mv r4,r15 8002308: 34 05 00 01 mvi r5,1 800230c: fb ff fc 11 calli 8001350 pathname, strlen( pathname ), eval_flags, &loc, true ); if ( status == -1 ) { 8002310: 34 02 ff ff mvi r2,-1 8002314: 44 22 00 46 be r1,r2,800242c if ( status != 0 ) { /* The file did not exist */ rc = EACCES; goto done; } } else if ((flags & (O_EXCL|O_CREAT)) == (O_EXCL|O_CREAT)) { 8002318: 21 a2 0a 00 andi r2,r13,0xa00 800231c: 34 01 0a 00 mvi r1,2560 8002320: 44 41 00 33 be r2,r1,80023ec <== NEVER TAKEN /* * Fill in the file control block based on the loc structure * returned by successful path evaluation. */ iop->flags |= rtems_libio_fcntl_flags( flags ); 8002324: b9 a0 08 00 mv r1,r13 8002328: 29 6c 00 18 lw r12,(r11+24) 800232c: f8 00 18 c9 calli 8008650 iop->pathinfo = loc; 8002330: 2b 82 00 30 lw r2,(sp+48) /* * Fill in the file control block based on the loc structure * returned by successful path evaluation. */ iop->flags |= rtems_libio_fcntl_flags( flags ); 8002334: b8 2c 08 00 or r1,r1,r12 iop->pathinfo = loc; rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode ); 8002338: b9 a0 18 00 mv r3,r13 800233c: 28 45 00 00 lw r5,(r2+0) /* * Fill in the file control block based on the loc structure * returned by successful path evaluation. */ iop->flags |= rtems_libio_fcntl_flags( flags ); 8002340: 59 61 00 18 sw (r11+24),r1 iop->pathinfo = loc; 8002344: 2b 81 00 28 lw r1,(sp+40) 8002348: 59 62 00 24 sw (r11+36),r2 rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode ); 800234c: ba 20 20 00 mv r4,r17 /* * 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; 8002350: 59 61 00 1c sw (r11+28),r1 8002354: 2b 81 00 2c lw r1,(sp+44) rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode ); 8002358: b9 c0 10 00 mv r2,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; 800235c: 59 61 00 20 sw (r11+32),r1 8002360: 2b 81 00 34 lw r1,(sp+52) 8002364: 59 61 00 28 sw (r11+40),r1 8002368: 2b 81 00 38 lw r1,(sp+56) 800236c: 59 61 00 2c sw (r11+44),r1 rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode ); 8002370: b9 60 08 00 mv r1,r11 8002374: d8 a0 00 00 call r5 if ( rc ) { 8002378: 5c 20 00 26 bne r1,r0,8002410 800237c: 78 0c 08 01 mvhi r12,0x801 } /* * Optionally truncate the file. */ if ( (flags & O_TRUNC) == O_TRUNC ) { 8002380: 21 ad 04 00 andi r13,r13,0x400 8002384: 39 8c 47 6c ori r12,r12,0x476c 8002388: 5d a1 00 31 bne r13,r1,800244c if ( loc_to_free ) rtems_filesystem_freenode( loc_to_free ); rtems_set_errno_and_return_minus_one( rc ); } return iop - rtems_libio_iops; 800238c: 29 81 00 00 lw r1,(r12+0) 8002390: c9 61 08 00 sub r1,r11,r1 8002394: 14 21 00 01 sri r1,r1,1 8002398: 14 21 00 01 sri r1,r1,1 800239c: 14 21 00 01 sri r1,r1,1 80023a0: 14 21 00 01 sri r1,r1,1 80023a4: 14 21 00 01 sri r1,r1,1 80023a8: 14 21 00 01 sri r1,r1,1 } 80023ac: 2b 9d 00 04 lw ra,(sp+4) 80023b0: 2b 8b 00 24 lw r11,(sp+36) 80023b4: 2b 8c 00 20 lw r12,(sp+32) 80023b8: 2b 8d 00 1c lw r13,(sp+28) 80023bc: 2b 8e 00 18 lw r14,(sp+24) 80023c0: 2b 8f 00 14 lw r15,(sp+20) 80023c4: 2b 90 00 10 lw r16,(sp+16) 80023c8: 2b 91 00 0c lw r17,(sp+12) 80023cc: 2b 92 00 08 lw r18,(sp+8) 80023d0: 37 9c 00 54 addi sp,sp,84 80023d4: c3 a0 00 00 ret */ /* allocate a file control block */ iop = rtems_libio_allocate(); if ( iop == 0 ) { rc = ENFILE; 80023d8: 34 10 00 17 mvi r16,23 if ( rc ) { if ( iop ) rtems_libio_free( iop ); if ( loc_to_free ) rtems_filesystem_freenode( loc_to_free ); rtems_set_errno_and_return_minus_one( rc ); 80023dc: f8 00 2a 7e calli 800cdd4 <__errno> 80023e0: 58 30 00 00 sw (r1+0),r16 80023e4: 34 01 ff ff mvi r1,-1 80023e8: e3 ff ff f1 bi 80023ac } } else if ((flags & (O_EXCL|O_CREAT)) == (O_EXCL|O_CREAT)) { /* We were trying to create a file that already exists */ rc = EEXIST; loc_to_free = &loc; 80023ec: b9 e0 90 00 mv r18,r15 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; 80023f0: 34 10 00 11 mvi r16,17 */ done: va_end(ap); if ( rc ) { if ( iop ) 80023f4: 45 60 00 03 be r11,r0,8002400 rtems_libio_free( iop ); 80023f8: b9 60 08 00 mv r1,r11 80023fc: f8 00 18 fb calli 80087e8 if ( loc_to_free ) 8002400: 46 40 ff f7 be r18,r0,80023dc rtems_filesystem_freenode( loc_to_free ); 8002404: ba 40 08 00 mv r1,r18 8002408: fb ff fc 20 calli 8001488 800240c: e3 ff ff f4 bi 80023dc iop->flags |= rtems_libio_fcntl_flags( flags ); iop->pathinfo = loc; rc = (*iop->pathinfo.handlers->open_h)( iop, pathname, flags, mode ); if ( rc ) { rc = errno; 8002410: f8 00 2a 71 calli 800cdd4 <__errno> 8002414: 28 30 00 00 lw r16,(r1+0) rc = EEXIST; loc_to_free = &loc; goto done; } loc_to_free = &loc; 8002418: b9 e0 90 00 mv r18,r15 800241c: 78 0c 08 01 mvhi r12,0x801 8002420: 39 8c 47 6c ori r12,r12,0x476c * Single exit and clean up path. */ done: va_end(ap); if ( rc ) { 8002424: 46 00 ff da be r16,r0,800238c <== NEVER TAKEN 8002428: e3 ff ff f3 bi 80023f4 */ status = rtems_filesystem_evaluate_path( pathname, strlen( pathname ), eval_flags, &loc, true ); if ( status == -1 ) { if ( errno != ENOENT ) { 800242c: f8 00 2a 6a calli 800cdd4 <__errno> 8002430: 28 22 00 00 lw r2,(r1+0) 8002434: 34 01 00 02 mvi r1,2 8002438: 44 41 00 20 be r2,r1,80024b8 rc = errno; 800243c: f8 00 2a 66 calli 800cdd4 <__errno> 8002440: 28 30 00 00 lw r16,(r1+0) 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; 8002444: 34 12 00 00 mvi r18,0 pathname, strlen( pathname ), eval_flags, &loc, true ); if ( status == -1 ) { if ( errno != ENOENT ) { rc = errno; goto done; 8002448: e3 ff ff f5 bi 800241c /* * Optionally truncate the file. */ if ( (flags & O_TRUNC) == O_TRUNC ) { rc = ftruncate( iop - rtems_libio_iops, 0 ); 800244c: 29 81 00 00 lw r1,(r12+0) 8002450: 34 02 00 00 mvi r2,0 8002454: c9 61 08 00 sub r1,r11,r1 8002458: 14 21 00 01 sri r1,r1,1 800245c: 14 21 00 01 sri r1,r1,1 8002460: 14 21 00 01 sri r1,r1,1 8002464: 14 21 00 01 sri r1,r1,1 8002468: 14 21 00 01 sri r1,r1,1 800246c: 14 21 00 01 sri r1,r1,1 8002470: f8 00 18 27 calli 800850c 8002474: b8 20 80 00 mv r16,r1 if ( rc ) { 8002478: 44 20 ff c5 be r1,r0,800238c if(errno) rc = errno; 800247c: f8 00 2a 56 calli 800cdd4 <__errno> 8002480: 28 21 00 00 lw r1,(r1+0) 8002484: 5c 20 00 1a bne r1,r0,80024ec <== ALWAYS TAKEN close( iop - rtems_libio_iops ); 8002488: 29 81 00 00 lw r1,(r12+0) /* those are released by close(): */ iop = 0; loc_to_free = NULL; 800248c: 34 12 00 00 mvi r18,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 ); 8002490: c9 61 08 00 sub r1,r11,r1 8002494: 14 21 00 01 sri r1,r1,1 /* those are released by close(): */ iop = 0; 8002498: 34 0b 00 00 mvi r11,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 ); 800249c: 14 21 00 01 sri r1,r1,1 80024a0: 14 21 00 01 sri r1,r1,1 80024a4: 14 21 00 01 sri r1,r1,1 80024a8: 14 21 00 01 sri r1,r1,1 80024ac: 14 21 00 01 sri r1,r1,1 80024b0: f8 00 17 e7 calli 800844c 80024b4: e3 ff ff da bi 800241c rc = errno; goto done; } /* If the file does not exist and we are not trying to create it--> error */ if ( !(flags & O_CREAT) ) { 80024b8: 21 a1 02 00 andi r1,r13,0x200 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; 80024bc: 34 12 00 00 mvi r18,0 goto done; } /* If the file does not exist and we are not trying to create it--> error */ if ( !(flags & O_CREAT) ) { rc = ENOENT; 80024c0: 34 10 00 02 mvi r16,2 rc = errno; goto done; } /* If the file does not exist and we are not trying to create it--> error */ if ( !(flags & O_CREAT) ) { 80024c4: 44 20 ff cc be r1,r0,80023f4 rc = ENOENT; goto done; } /* Create the node for the new regular file */ rc = mknod( pathname, S_IFREG | mode, 0LL ); 80024c8: b9 c0 08 00 mv r1,r14 80024cc: 3a 22 80 00 ori r2,r17,0x8000 80024d0: 34 03 00 00 mvi r3,0 80024d4: 34 04 00 00 mvi r4,0 80024d8: fb ff fd 3e calli 80019d0 if ( rc ) { 80024dc: 44 20 00 07 be r1,r0,80024f8 <== ALWAYS TAKEN rc = errno; 80024e0: f8 00 2a 3d calli 800cdd4 <__errno> <== NOT EXECUTED 80024e4: 28 30 00 00 lw r16,(r1+0) <== NOT EXECUTED goto done; 80024e8: e3 ff ff cd bi 800241c <== NOT EXECUTED * Optionally truncate the file. */ if ( (flags & O_TRUNC) == O_TRUNC ) { rc = ftruncate( iop - rtems_libio_iops, 0 ); if ( rc ) { if(errno) rc = errno; 80024ec: f8 00 2a 3a calli 800cdd4 <__errno> 80024f0: 28 30 00 00 lw r16,(r1+0) 80024f4: e3 ff ff e5 bi 8002488 /* * 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( 80024f8: b9 c0 08 00 mv r1,r14 80024fc: f8 00 2e d7 calli 800e058 8002500: b8 20 10 00 mv r2,r1 8002504: 34 03 00 00 mvi r3,0 8002508: b9 c0 08 00 mv r1,r14 800250c: b9 e0 20 00 mv r4,r15 8002510: 34 05 00 01 mvi r5,1 8002514: fb ff fb 8f calli 8001350 pathname, strlen( pathname ), 0x0, &loc, true ); if ( status != 0 ) { /* The file did not exist */ rc = EACCES; 8002518: 34 10 00 0d mvi r16,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 */ 800251c: 5e 41 ff b6 bne r18,r1,80023f4 <== NEVER TAKEN 8002520: e3 ff ff 81 bi 8002324 =============================================================================== 080021e8 : /* * This is a replaceable stub which opens the console, if present. */ void open_dev_console(void) { 80021e8: 37 9c ff f4 addi sp,sp,-12 80021ec: 5b 8b 00 0c sw (sp+12),r11 80021f0: 5b 8c 00 08 sw (sp+8),r12 80021f4: 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) { 80021f8: 78 0b 08 01 mvhi r11,0x801 80021fc: 39 6b 34 6c ori r11,r11,0x346c 8002200: b9 60 08 00 mv r1,r11 8002204: 34 02 00 00 mvi r2,0 8002208: 34 03 00 00 mvi r3,0 800220c: f8 00 00 1a calli 8002274 8002210: 34 0c ff ff mvi r12,-1 8002214: 44 2c 00 0b be r1,r12,8002240 /* * 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) 8002218: b9 60 08 00 mv r1,r11 800221c: 34 02 00 01 mvi r2,1 8002220: 34 03 00 00 mvi r3,0 8002224: f8 00 00 14 calli 8002274 8002228: 44 2c 00 0b be r1,r12,8002254 <== NEVER TAKEN rtems_fatal_error_occurred( 0x55544431 ); /* error STD1 */ if ((stderr_fd = open("/dev/console", O_WRONLY, 0)) == -1) 800222c: b9 60 08 00 mv r1,r11 8002230: 34 02 00 01 mvi r2,1 8002234: 34 03 00 00 mvi r3,0 8002238: f8 00 00 0f calli 8002274 800223c: 44 2c 00 0a be r1,r12,8002264 <== NEVER TAKEN rtems_fatal_error_occurred( 0x55544432 ); /* error STD2 */ } 8002240: 2b 9d 00 04 lw ra,(sp+4) 8002244: 2b 8b 00 0c lw r11,(sp+12) 8002248: 2b 8c 00 08 lw r12,(sp+8) 800224c: 37 9c 00 0c addi sp,sp,12 8002250: c3 a0 00 00 ret /* * 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) rtems_fatal_error_occurred( 0x55544431 ); /* error STD1 */ 8002254: 78 02 08 01 mvhi r2,0x801 <== NOT EXECUTED 8002258: 38 42 35 64 ori r2,r2,0x3564 <== NOT EXECUTED 800225c: 28 41 00 00 lw r1,(r2+0) <== NOT EXECUTED 8002260: f8 00 04 7b calli 800344c <== NOT EXECUTED if ((stderr_fd = open("/dev/console", O_WRONLY, 0)) == -1) rtems_fatal_error_occurred( 0x55544432 ); /* error STD2 */ 8002264: 78 02 08 01 mvhi r2,0x801 <== NOT EXECUTED 8002268: 38 42 35 68 ori r2,r2,0x3568 <== NOT EXECUTED 800226c: 28 41 00 00 lw r1,(r2+0) <== NOT EXECUTED 8002270: f8 00 04 77 calli 800344c <== NOT EXECUTED =============================================================================== 080059d8 : /* * Handle output processing */ static void oproc (unsigned char c, struct rtems_termios_tty *tty) { 80059d8: 37 9c ff f4 addi sp,sp,-12 80059dc: 5b 8b 00 08 sw (sp+8),r11 80059e0: 5b 9d 00 04 sw (sp+4),ra 80059e4: b8 40 58 00 mv r11,r2 int i; if (tty->termios.c_oflag & OPOST) { 80059e8: 28 42 00 34 lw r2,(r2+52) /* * Handle output processing */ static void oproc (unsigned char c, struct rtems_termios_tty *tty) { 80059ec: 33 81 00 0c sb (sp+12),r1 int i; if (tty->termios.c_oflag & OPOST) { 80059f0: 20 41 00 01 andi r1,r2,0x1 80059f4: 44 20 00 0b be r1,r0,8005a20 <== NEVER TAKEN switch (c) { 80059f8: 43 81 00 0c lbu r1,(sp+12) 80059fc: 34 03 00 09 mvi r3,9 8005a00: 44 23 00 39 be r1,r3,8005ae4 8005a04: 54 23 00 0f bgu r1,r3,8005a40 <== ALWAYS TAKEN 8005a08: 34 03 00 08 mvi r3,8 <== NOT EXECUTED 8005a0c: 5c 23 00 11 bne r1,r3,8005a50 <== NOT EXECUTED } tty->column += i; break; case '\b': if (tty->column > 0) 8005a10: 29 61 00 28 lw r1,(r11+40) <== NOT EXECUTED 8005a14: 4c 01 00 03 bge r0,r1,8005a20 <== NOT EXECUTED tty->column--; 8005a18: 34 21 ff ff addi r1,r1,-1 <== NOT EXECUTED 8005a1c: 59 61 00 28 sw (r11+40),r1 <== NOT EXECUTED if (!iscntrl(c)) tty->column++; break; } } rtems_termios_puts (&c, 1, tty); 8005a20: 37 81 00 0c addi r1,sp,12 8005a24: 34 02 00 01 mvi r2,1 8005a28: b9 60 18 00 mv r3,r11 8005a2c: fb ff ff 92 calli 8005874 } 8005a30: 2b 9d 00 04 lw ra,(sp+4) 8005a34: 2b 8b 00 08 lw r11,(sp+8) 8005a38: 37 9c 00 0c addi sp,sp,12 8005a3c: c3 a0 00 00 ret oproc (unsigned char c, struct rtems_termios_tty *tty) { int i; if (tty->termios.c_oflag & OPOST) { switch (c) { 8005a40: 34 03 00 0a mvi r3,10 8005a44: 44 23 00 10 be r1,r3,8005a84 8005a48: 34 03 00 0d mvi r3,13 8005a4c: 44 23 00 1a be r1,r3,8005ab4 <== NEVER TAKEN if (tty->column > 0) tty->column--; break; default: if (tty->termios.c_oflag & OLCUC) 8005a50: 20 42 00 02 andi r2,r2,0x2 8005a54: 5c 40 00 2e bne r2,r0,8005b0c <== NEVER TAKEN 8005a58: 78 02 08 02 mvhi r2,0x802 8005a5c: 38 42 44 14 ori r2,r2,0x4414 8005a60: 28 42 00 00 lw r2,(r2+0) c = toupper(c); if (!iscntrl(c)) 8005a64: b4 41 08 00 add r1,r2,r1 8005a68: 40 21 00 01 lbu r1,(r1+1) 8005a6c: 20 21 00 20 andi r1,r1,0x20 8005a70: 5c 20 ff ec bne r1,r0,8005a20 <== NEVER TAKEN tty->column++; 8005a74: 29 61 00 28 lw r1,(r11+40) 8005a78: 34 21 00 01 addi r1,r1,1 8005a7c: 59 61 00 28 sw (r11+40),r1 8005a80: e3 ff ff e8 bi 8005a20 int i; if (tty->termios.c_oflag & OPOST) { switch (c) { case '\n': if (tty->termios.c_oflag & ONLRET) 8005a84: 20 41 00 20 andi r1,r2,0x20 8005a88: 44 20 00 02 be r1,r0,8005a90 <== ALWAYS TAKEN tty->column = 0; 8005a8c: 59 60 00 28 sw (r11+40),r0 <== NOT EXECUTED if (tty->termios.c_oflag & ONLCR) { 8005a90: 20 42 00 04 andi r2,r2,0x4 8005a94: 44 40 ff e3 be r2,r0,8005a20 <== NEVER TAKEN rtems_termios_puts ("\r", 1, tty); 8005a98: 78 01 08 02 mvhi r1,0x802 8005a9c: 38 21 20 8c ori r1,r1,0x208c 8005aa0: 34 02 00 01 mvi r2,1 8005aa4: b9 60 18 00 mv r3,r11 8005aa8: fb ff ff 73 calli 8005874 tty->column = 0; 8005aac: 59 60 00 28 sw (r11+40),r0 8005ab0: e3 ff ff dc bi 8005a20 } break; case '\r': if ((tty->termios.c_oflag & ONOCR) && (tty->column == 0)) 8005ab4: 20 41 00 10 andi r1,r2,0x10 <== NOT EXECUTED 8005ab8: 44 20 00 03 be r1,r0,8005ac4 <== NOT EXECUTED 8005abc: 29 61 00 28 lw r1,(r11+40) <== NOT EXECUTED 8005ac0: 44 20 ff dc be r1,r0,8005a30 <== NOT EXECUTED return; if (tty->termios.c_oflag & OCRNL) { 8005ac4: 20 41 00 08 andi r1,r2,0x8 <== NOT EXECUTED 8005ac8: 44 20 00 05 be r1,r0,8005adc <== NOT EXECUTED c = '\n'; 8005acc: 34 01 00 0a mvi r1,10 <== NOT EXECUTED 8005ad0: 33 81 00 0c sb (sp+12),r1 <== NOT EXECUTED if (tty->termios.c_oflag & ONLRET) 8005ad4: 20 42 00 20 andi r2,r2,0x20 <== NOT EXECUTED 8005ad8: 44 40 ff d2 be r2,r0,8005a20 <== NOT EXECUTED tty->column = 0; break; } tty->column = 0; 8005adc: 59 60 00 28 sw (r11+40),r0 <== NOT EXECUTED break; 8005ae0: e3 ff ff d0 bi 8005a20 <== NOT EXECUTED case '\t': i = 8 - (tty->column & 7); 8005ae4: 29 61 00 28 lw r1,(r11+40) 8005ae8: 34 03 00 08 mvi r3,8 if ((tty->termios.c_oflag & TABDLY) == XTABS) { 8005aec: 20 44 18 00 andi r4,r2,0x1800 } tty->column = 0; break; case '\t': i = 8 - (tty->column & 7); 8005af0: 20 22 00 07 andi r2,r1,0x7 8005af4: c8 62 10 00 sub r2,r3,r2 if ((tty->termios.c_oflag & TABDLY) == XTABS) { 8005af8: 34 03 18 00 mvi r3,6144 8005afc: 44 83 00 12 be r4,r3,8005b44 <== ALWAYS TAKEN tty->column += i; rtems_termios_puts ( " ", i, tty); return; } tty->column += i; 8005b00: b4 41 08 00 add r1,r2,r1 <== NOT EXECUTED 8005b04: 59 61 00 28 sw (r11+40),r1 <== NOT EXECUTED break; 8005b08: e3 ff ff c6 bi 8005a20 <== NOT EXECUTED tty->column--; break; default: if (tty->termios.c_oflag & OLCUC) c = toupper(c); 8005b0c: 78 02 08 02 mvhi r2,0x802 <== NOT EXECUTED 8005b10: 38 42 44 14 ori r2,r2,0x4414 <== NOT EXECUTED 8005b14: 28 42 00 00 lw r2,(r2+0) <== NOT EXECUTED 8005b18: b8 20 18 00 mv r3,r1 <== NOT EXECUTED 8005b1c: b4 41 08 00 add r1,r2,r1 <== NOT EXECUTED 8005b20: 40 24 00 01 lbu r4,(r1+1) <== NOT EXECUTED 8005b24: 34 01 00 02 mvi r1,2 <== NOT EXECUTED 8005b28: 20 84 00 03 andi r4,r4,0x3 <== NOT EXECUTED 8005b2c: 44 81 00 04 be r4,r1,8005b3c <== NOT EXECUTED 8005b30: 20 61 00 ff andi r1,r3,0xff <== NOT EXECUTED 8005b34: 33 81 00 0c sb (sp+12),r1 <== NOT EXECUTED 8005b38: e3 ff ff cb bi 8005a64 <== NOT EXECUTED 8005b3c: 34 63 ff e0 addi r3,r3,-32 <== NOT EXECUTED 8005b40: e3 ff ff fc bi 8005b30 <== NOT EXECUTED break; case '\t': i = 8 - (tty->column & 7); if ((tty->termios.c_oflag & TABDLY) == XTABS) { tty->column += i; 8005b44: b4 41 08 00 add r1,r2,r1 8005b48: 59 61 00 28 sw (r11+40),r1 rtems_termios_puts ( " ", i, tty); 8005b4c: 78 01 08 02 mvhi r1,0x802 8005b50: 38 21 20 90 ori r1,r1,0x2090 8005b54: b9 60 18 00 mv r3,r11 8005b58: fb ff ff 47 calli 8005874 return; 8005b5c: e3 ff ff b5 bi 8005a30 =============================================================================== 08009850 : * Called by pipe() to create an anonymous pipe. */ int pipe_create( int filsdes[2] ) { 8009850: 37 9c ff d8 addi sp,sp,-40 8009854: 5b 8b 00 18 sw (sp+24),r11 8009858: 5b 8c 00 14 sw (sp+20),r12 800985c: 5b 8d 00 10 sw (sp+16),r13 8009860: 5b 8e 00 0c sw (sp+12),r14 8009864: 5b 8f 00 08 sw (sp+8),r15 8009868: 5b 9d 00 04 sw (sp+4),ra 800986c: b8 20 68 00 mv r13,r1 rtems_libio_t *iop; int err = 0; if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0) 8009870: 78 01 08 01 mvhi r1,0x801 8009874: 34 02 01 ff mvi r2,511 8009878: 38 21 f2 d4 ori r1,r1,0xf2d4 800987c: f8 00 07 02 calli 800b484 8009880: b8 20 70 00 mv r14,r1 return -1; 8009884: 34 0c ff ff mvi r12,-1 ) { rtems_libio_t *iop; int err = 0; if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0) 8009888: 44 20 00 0a be r1,r0,80098b0 <== ALWAYS TAKEN unlink(fifopath); } if(err != 0) rtems_set_errno_and_return_minus_one(err); return 0; } 800988c: b9 80 08 00 mv r1,r12 8009890: 2b 9d 00 04 lw ra,(sp+4) 8009894: 2b 8b 00 18 lw r11,(sp+24) 8009898: 2b 8c 00 14 lw r12,(sp+20) 800989c: 2b 8d 00 10 lw r13,(sp+16) 80098a0: 2b 8e 00 0c lw r14,(sp+12) 80098a4: 2b 8f 00 08 lw r15,(sp+8) 80098a8: 37 9c 00 28 addi sp,sp,40 80098ac: c3 a0 00 00 ret if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0) return -1; /* /tmp/.fifoXXXX */ char fifopath[15]; memcpy(fifopath, "/tmp/.fifo", 10); 80098b0: 78 07 08 01 mvhi r7,0x801 80098b4: 38 e7 f2 e4 ori r7,r7,0xf2e4 80098b8: 28 e6 00 00 lw r6,(r7+0) sprintf(fifopath + 10, "%04x", rtems_pipe_no ++); 80098bc: 78 04 08 02 mvhi r4,0x802 80098c0: 38 84 07 0c ori r4,r4,0x70c if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0) return -1; /* /tmp/.fifoXXXX */ char fifopath[15]; memcpy(fifopath, "/tmp/.fifo", 10); 80098c4: 78 07 08 01 mvhi r7,0x801 sprintf(fifopath + 10, "%04x", rtems_pipe_no ++); 80098c8: 2c 83 00 00 lhu r3,(r4+0) if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0) return -1; /* /tmp/.fifoXXXX */ char fifopath[15]; memcpy(fifopath, "/tmp/.fifo", 10); 80098cc: 38 e7 f2 e8 ori r7,r7,0xf2e8 80098d0: 5b 86 00 1c sw (sp+28),r6 80098d4: 28 e6 00 00 lw r6,(r7+0) 80098d8: 37 8b 00 1c addi r11,sp,28 sprintf(fifopath + 10, "%04x", rtems_pipe_no ++); 80098dc: 34 65 00 01 addi r5,r3,1 80098e0: 78 02 08 01 mvhi r2,0x801 80098e4: 38 42 f2 dc ori r2,r2,0xf2dc if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0) return -1; /* /tmp/.fifoXXXX */ char fifopath[15]; memcpy(fifopath, "/tmp/.fifo", 10); 80098e8: 59 66 00 04 sw (r11+4),r6 sprintf(fifopath + 10, "%04x", rtems_pipe_no ++); 80098ec: 0c 85 00 00 sh (r4+0),r5 if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0) return -1; /* /tmp/.fifoXXXX */ char fifopath[15]; memcpy(fifopath, "/tmp/.fifo", 10); 80098f0: 34 06 66 6f mvi r6,26223 sprintf(fifopath + 10, "%04x", rtems_pipe_no ++); 80098f4: 37 81 00 26 addi r1,sp,38 if (rtems_mkdir("/tmp", S_IRWXU | S_IRWXG | S_IRWXO) != 0) return -1; /* /tmp/.fifoXXXX */ char fifopath[15]; memcpy(fifopath, "/tmp/.fifo", 10); 80098f8: 0d 66 00 08 sh (r11+8),r6 sprintf(fifopath + 10, "%04x", rtems_pipe_no ++); 80098fc: f8 00 18 df calli 800fc78 /* Try creating FIFO file until find an available file name */ while (mkfifo(fifopath, S_IRUSR|S_IWUSR) != 0) { 8009900: b9 60 08 00 mv r1,r11 8009904: 34 02 01 80 mvi r2,384 8009908: f8 00 05 fb calli 800b0f4 800990c: b8 20 78 00 mv r15,r1 8009910: 5c 2e 00 31 bne r1,r14,80099d4 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); 8009914: 34 02 40 00 mvi r2,16384 8009918: b9 60 08 00 mv r1,r11 800991c: fb ff e8 a6 calli 8003bb4 8009920: 59 a1 00 00 sw (r13+0),r1 8009924: b8 20 10 00 mv r2,r1 if (filsdes[0] < 0) { 8009928: 4c 2f 00 06 bge r1,r15,8009940 err = errno; 800992c: f8 00 15 5d calli 800eea0 <__errno> 8009930: 28 2e 00 00 lw r14,(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); 8009934: b9 60 08 00 mv r1,r11 8009938: fb ff e9 ca calli 8004060 800993c: e0 00 00 20 bi 80099bc } else { /* Reset open file to blocking mode */ iop = rtems_libio_iop(filsdes[0]); 8009940: 78 01 08 02 mvhi r1,0x802 8009944: 38 21 00 10 ori r1,r1,0x10 8009948: 28 21 00 00 lw r1,(r1+0) 800994c: 34 03 00 00 mvi r3,0 8009950: 50 41 00 0b bgeu r2,r1,800997c <== NEVER TAKEN 8009954: b4 42 10 00 add r2,r2,r2 8009958: 78 01 08 02 mvhi r1,0x802 800995c: b4 42 10 00 add r2,r2,r2 8009960: 38 21 07 84 ori r1,r1,0x784 8009964: b4 42 10 00 add r2,r2,r2 8009968: b4 42 10 00 add r2,r2,r2 800996c: 28 23 00 00 lw r3,(r1+0) 8009970: b4 42 10 00 add r2,r2,r2 8009974: b4 42 10 00 add r2,r2,r2 8009978: b4 62 18 00 add r3,r3,r2 iop->flags &= ~LIBIO_FLAGS_NO_DELAY; 800997c: 28 64 00 18 lw r4,(r3+24) 8009980: 34 02 ff fe mvi r2,-2 filsdes[1] = open(fifopath, O_WRONLY); 8009984: b9 60 08 00 mv r1,r11 unlink(fifopath); } else { /* Reset open file to blocking mode */ iop = rtems_libio_iop(filsdes[0]); iop->flags &= ~LIBIO_FLAGS_NO_DELAY; 8009988: a0 82 10 00 and r2,r4,r2 800998c: 58 62 00 18 sw (r3+24),r2 filsdes[1] = open(fifopath, O_WRONLY); 8009990: 34 02 00 01 mvi r2,1 8009994: fb ff e8 88 calli 8003bb4 8009998: 59 a1 00 04 sw (r13+4),r1 int pipe_create( int filsdes[2] ) { rtems_libio_t *iop; int err = 0; 800999c: 34 0e 00 00 mvi r14,0 iop = rtems_libio_iop(filsdes[0]); iop->flags &= ~LIBIO_FLAGS_NO_DELAY; filsdes[1] = open(fifopath, O_WRONLY); if (filsdes[1] < 0) { 80099a0: 4c 20 00 05 bge r1,r0,80099b4 err = errno; 80099a4: f8 00 15 3f calli 800eea0 <__errno> 80099a8: 28 2e 00 00 lw r14,(r1+0) close(filsdes[0]); 80099ac: 29 a1 00 00 lw r1,(r13+0) 80099b0: fb ff e3 78 calli 8002790 } unlink(fifopath); 80099b4: b9 60 08 00 mv r1,r11 80099b8: fb ff e9 aa calli 8004060 } if(err != 0) rtems_set_errno_and_return_minus_one(err); return 0; 80099bc: 34 0c 00 00 mvi r12,0 err = errno; close(filsdes[0]); } unlink(fifopath); } if(err != 0) 80099c0: 45 c0 ff b3 be r14,r0,800988c rtems_set_errno_and_return_minus_one(err); 80099c4: f8 00 15 37 calli 800eea0 <__errno> 80099c8: 58 2e 00 00 sw (r1+0),r14 80099cc: 34 0c ff ff mvi r12,-1 80099d0: e3 ff ff af bi 800988c memcpy(fifopath, "/tmp/.fifo", 10); sprintf(fifopath + 10, "%04x", rtems_pipe_no ++); /* Try creating FIFO file until find an available file name */ while (mkfifo(fifopath, S_IRUSR|S_IWUSR) != 0) { if (errno != EEXIST){ 80099d4: f8 00 15 33 calli 800eea0 <__errno> 80099d8: e3 ff ff ad bi 800988c =============================================================================== 0800b20c : pipe_control_t *pipe, uint32_t cmd, void *buffer, rtems_libio_t *iop ) { 800b20c: 37 9c ff f4 addi sp,sp,-12 800b210: 5b 8b 00 0c sw (sp+12),r11 800b214: 5b 8c 00 08 sw (sp+8),r12 800b218: 5b 9d 00 04 sw (sp+4),ra 800b21c: b8 60 60 00 mv r12,r3 if (cmd == FIONREAD) { 800b220: 78 03 08 02 mvhi r3,0x802 800b224: 38 63 2b a0 ori r3,r3,0x2ba0 pipe_control_t *pipe, uint32_t cmd, void *buffer, rtems_libio_t *iop ) { 800b228: b8 20 58 00 mv r11,r1 if (cmd == FIONREAD) { 800b22c: 28 61 00 00 lw r1,(r3+0) *(unsigned int *)buffer = pipe->Length; PIPE_UNLOCK(pipe); return 0; } return -EINVAL; 800b230: 34 04 ff ea mvi r4,-22 uint32_t cmd, void *buffer, rtems_libio_t *iop ) { if (cmd == FIONREAD) { 800b234: 44 41 00 07 be r2,r1,800b250 PIPE_UNLOCK(pipe); return 0; } return -EINVAL; } 800b238: b8 80 08 00 mv r1,r4 800b23c: 2b 9d 00 04 lw ra,(sp+4) 800b240: 2b 8b 00 0c lw r11,(sp+12) 800b244: 2b 8c 00 08 lw r12,(sp+8) 800b248: 37 9c 00 0c addi sp,sp,12 800b24c: c3 a0 00 00 ret rtems_libio_t *iop ) { if (cmd == FIONREAD) { if (buffer == NULL) return -EFAULT; 800b250: 34 04 ff f2 mvi r4,-14 void *buffer, rtems_libio_t *iop ) { if (cmd == FIONREAD) { if (buffer == NULL) 800b254: 45 80 ff f9 be r12,r0,800b238 return -EFAULT; if (! PIPE_LOCK(pipe)) 800b258: 29 61 00 28 lw r1,(r11+40) 800b25c: 34 02 00 00 mvi r2,0 800b260: 34 03 00 00 mvi r3,0 800b264: fb ff e8 c4 calli 8005574 return -EINTR; 800b268: 34 04 ff fc mvi r4,-4 { if (cmd == FIONREAD) { if (buffer == NULL) return -EFAULT; if (! PIPE_LOCK(pipe)) 800b26c: 5c 20 ff f3 bne r1,r0,800b238 <== NEVER TAKEN return -EINTR; /* Return length of pipe */ *(unsigned int *)buffer = pipe->Length; 800b270: 29 62 00 0c lw r2,(r11+12) PIPE_UNLOCK(pipe); 800b274: 29 61 00 28 lw r1,(r11+40) if (! PIPE_LOCK(pipe)) return -EINTR; /* Return length of pipe */ *(unsigned int *)buffer = pipe->Length; 800b278: 59 82 00 00 sw (r12+0),r2 PIPE_UNLOCK(pipe); 800b27c: fb ff e9 1a calli 80056e4 return 0; 800b280: 34 04 00 00 mvi r4,0 800b284: e3 ff ff ed bi 800b238 =============================================================================== 0800ade8 : pipe_control_t *pipe, void *buffer, size_t count, rtems_libio_t *iop ) { 800ade8: 37 9c ff d4 addi sp,sp,-44 800adec: 5b 8b 00 28 sw (sp+40),r11 800adf0: 5b 8c 00 24 sw (sp+36),r12 800adf4: 5b 8d 00 20 sw (sp+32),r13 800adf8: 5b 8e 00 1c sw (sp+28),r14 800adfc: 5b 8f 00 18 sw (sp+24),r15 800ae00: 5b 90 00 14 sw (sp+20),r16 800ae04: 5b 91 00 10 sw (sp+16),r17 800ae08: 5b 92 00 0c sw (sp+12),r18 800ae0c: 5b 93 00 08 sw (sp+8),r19 800ae10: 5b 9d 00 04 sw (sp+4),ra 800ae14: b8 20 58 00 mv r11,r1 int chunk, chunk1, read = 0, ret = 0; if (! PIPE_LOCK(pipe)) 800ae18: 28 21 00 28 lw r1,(r1+40) pipe_control_t *pipe, void *buffer, size_t count, rtems_libio_t *iop ) { 800ae1c: b8 40 88 00 mv r17,r2 800ae20: b8 60 80 00 mv r16,r3 int chunk, chunk1, read = 0, ret = 0; if (! PIPE_LOCK(pipe)) 800ae24: 34 02 00 00 mvi r2,0 800ae28: 34 03 00 00 mvi r3,0 pipe_control_t *pipe, void *buffer, size_t count, rtems_libio_t *iop ) { 800ae2c: b8 80 68 00 mv r13,r4 int chunk, chunk1, read = 0, ret = 0; if (! PIPE_LOCK(pipe)) 800ae30: fb ff e9 d1 calli 8005574 return -EINTR; 800ae34: 34 0c ff fc mvi r12,-4 rtems_libio_t *iop ) { int chunk, chunk1, read = 0, ret = 0; if (! PIPE_LOCK(pipe)) 800ae38: 5c 20 00 24 bne r1,r0,800aec8 <== NEVER TAKEN return -EINTR; while (read < count) { 800ae3c: 34 0e 00 00 mvi r14,0 800ae40: 34 12 00 00 mvi r18,0 } /* Wait until pipe is no more empty or no writer exists */ pipe->waitingReaders ++; PIPE_UNLOCK(pipe); if (! PIPE_READWAIT(pipe)) 800ae44: 34 0f ff fc mvi r15,-4 int chunk, chunk1, read = 0, ret = 0; if (! PIPE_LOCK(pipe)) return -EINTR; while (read < count) { 800ae48: 46 0e 00 41 be r16,r14,800af4c <== NEVER TAKEN while (PIPE_EMPTY(pipe)) { 800ae4c: 29 65 00 0c lw r5,(r11+12) 800ae50: 5c a0 00 41 bne r5,r0,800af54 /* Not an error */ if (pipe->Writers == 0) 800ae54: 29 64 00 14 lw r4,(r11+20) 800ae58: 44 85 00 3d be r4,r5,800af4c goto out_locked; if (LIBIO_NODELAY(iop)) { 800ae5c: 29 ac 00 18 lw r12,(r13+24) 800ae60: 21 8c 00 01 andi r12,r12,0x1 800ae64: 5d 80 00 4f bne r12,r0,800afa0 ret = -EAGAIN; goto out_locked; } /* Wait until pipe is no more empty or no writer exists */ pipe->waitingReaders ++; 800ae68: 29 64 00 18 lw r4,(r11+24) PIPE_UNLOCK(pipe); 800ae6c: 29 61 00 28 lw r1,(r11+40) ret = -EAGAIN; goto out_locked; } /* Wait until pipe is no more empty or no writer exists */ pipe->waitingReaders ++; 800ae70: 34 84 00 01 addi r4,r4,1 800ae74: 59 64 00 18 sw (r11+24),r4 PIPE_UNLOCK(pipe); 800ae78: fb ff ea 1b calli 80056e4 if (! PIPE_READWAIT(pipe)) 800ae7c: 29 61 00 2c lw r1,(r11+44) 800ae80: 34 02 00 00 mvi r2,0 800ae84: f8 00 07 60 calli 800cc04 800ae88: fc 2c 60 00 cmpne r12,r1,r12 ret = -EINTR; if (! PIPE_LOCK(pipe)) { 800ae8c: 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)) 800ae90: c8 0c 60 00 sub r12,r0,r12 ret = -EINTR; if (! PIPE_LOCK(pipe)) { 800ae94: 34 02 00 00 mvi r2,0 800ae98: 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)) 800ae9c: a1 8f 60 00 and r12,r12,r15 ret = -EINTR; if (! PIPE_LOCK(pipe)) { 800aea0: fb ff e9 b5 calli 8005574 800aea4: 5c 20 00 41 bne r1,r0,800afa8 <== NEVER TAKEN /* WARN waitingReaders not restored! */ ret = -EINTR; goto out_nolock; } pipe->waitingReaders --; 800aea8: 29 64 00 18 lw r4,(r11+24) 800aeac: 34 84 ff ff addi r4,r4,-1 800aeb0: 59 64 00 18 sw (r11+24),r4 if (ret != 0) 800aeb4: 45 81 ff e6 be r12,r1,800ae4c <== ALWAYS TAKEN PIPE_WAKEUPWRITERS(pipe); read += chunk; } out_locked: PIPE_UNLOCK(pipe); 800aeb8: 29 61 00 28 lw r1,(r11+40) 800aebc: fb ff ea 0a calli 80056e4 out_nolock: if (read > 0) 800aec0: 4c 0e 00 02 bge r0,r14,800aec8 800aec4: b9 c0 60 00 mv r12,r14 return read; return ret; } 800aec8: b9 80 08 00 mv r1,r12 800aecc: 2b 9d 00 04 lw ra,(sp+4) 800aed0: 2b 8b 00 28 lw r11,(sp+40) 800aed4: 2b 8c 00 24 lw r12,(sp+36) 800aed8: 2b 8d 00 20 lw r13,(sp+32) 800aedc: 2b 8e 00 1c lw r14,(sp+28) 800aee0: 2b 8f 00 18 lw r15,(sp+24) 800aee4: 2b 90 00 14 lw r16,(sp+20) 800aee8: 2b 91 00 10 lw r17,(sp+16) 800aeec: 2b 92 00 0c lw r18,(sp+12) 800aef0: 2b 93 00 08 lw r19,(sp+8) 800aef4: 37 9c 00 2c addi sp,sp,44 800aef8: c3 a0 00 00 ret 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); 800aefc: 29 64 00 00 lw r4,(r11+0) 800af00: b6 32 08 00 add r1,r17,r18 800af04: b9 80 18 00 mv r3,r12 800af08: b4 82 10 00 add r2,r4,r2 800af0c: f8 00 17 17 calli 8010b68 pipe->Start += chunk; 800af10: 29 61 00 08 lw r1,(r11+8) pipe->Start %= pipe->Size; 800af14: 29 62 00 04 lw r2,(r11+4) 800af18: b5 81 08 00 add r1,r12,r1 800af1c: f8 00 58 a4 calli 80211ac <__umodsi3> pipe->Length -= chunk; 800af20: 29 62 00 0c lw r2,(r11+12) } else memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk); pipe->Start += chunk; pipe->Start %= pipe->Size; 800af24: 59 61 00 08 sw (r11+8),r1 pipe->Length -= chunk; 800af28: c8 4c 08 00 sub r1,r2,r12 800af2c: 59 61 00 0c sw (r11+12),r1 /* For buffering optimization */ if (PIPE_EMPTY(pipe)) 800af30: 5c 20 00 02 bne r1,r0,800af38 pipe->Start = 0; 800af34: 59 60 00 08 sw (r11+8),r0 if (pipe->waitingWriters > 0) 800af38: 29 61 00 1c lw r1,(r11+28) 800af3c: 5c 20 00 1e bne r1,r0,800afb4 PIPE_WAKEUPWRITERS(pipe); read += chunk; 800af40: b5 cc 70 00 add r14,r14,r12 int chunk, chunk1, read = 0, ret = 0; if (! PIPE_LOCK(pipe)) return -EINTR; while (read < count) { 800af44: b9 c0 90 00 mv r18,r14 800af48: 56 0e ff c1 bgu r16,r14,800ae4c <== NEVER TAKEN while (PIPE_EMPTY(pipe)) { /* Not an error */ if (pipe->Writers == 0) 800af4c: 34 0c 00 00 mvi r12,0 800af50: e3 ff ff da bi 800aeb8 if (ret != 0) goto out_locked; } /* Read chunk bytes */ chunk = MIN(count - read, pipe->Length); 800af54: ca 12 08 00 sub r1,r16,r18 800af58: b8 a0 60 00 mv r12,r5 800af5c: 50 25 00 02 bgeu r1,r5,800af64 800af60: b8 20 60 00 mv r12,r1 chunk1 = pipe->Size - pipe->Start; 800af64: 29 62 00 08 lw r2,(r11+8) 800af68: 29 73 00 04 lw r19,(r11+4) 800af6c: ca 62 98 00 sub r19,r19,r2 if (chunk > chunk1) { 800af70: 4e 6c ff e3 bge r19,r12,800aefc memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk1); 800af74: 29 64 00 00 lw r4,(r11+0) 800af78: ba 60 18 00 mv r3,r19 800af7c: b6 32 08 00 add r1,r17,r18 800af80: b4 82 10 00 add r2,r4,r2 800af84: f8 00 16 f9 calli 8010b68 memcpy(buffer + read + chunk1, pipe->Buffer, chunk - chunk1); 800af88: 29 62 00 00 lw r2,(r11+0) 800af8c: b6 53 08 00 add r1,r18,r19 800af90: b6 21 08 00 add r1,r17,r1 800af94: c9 93 18 00 sub r3,r12,r19 800af98: f8 00 16 f4 calli 8010b68 800af9c: e3 ff ff dd bi 800af10 /* Not an error */ if (pipe->Writers == 0) goto out_locked; if (LIBIO_NODELAY(iop)) { ret = -EAGAIN; 800afa0: 34 0c ff f5 mvi r12,-11 800afa4: e3 ff ff c5 bi 800aeb8 PIPE_UNLOCK(pipe); if (! PIPE_READWAIT(pipe)) ret = -EINTR; if (! PIPE_LOCK(pipe)) { /* WARN waitingReaders not restored! */ ret = -EINTR; 800afa8: 34 0c ff fc mvi r12,-4 <== NOT EXECUTED out_locked: PIPE_UNLOCK(pipe); out_nolock: if (read > 0) 800afac: 4c 0e ff c7 bge r0,r14,800aec8 <== NOT EXECUTED 800afb0: e3 ff ff c5 bi 800aec4 <== NOT EXECUTED /* For buffering optimization */ if (PIPE_EMPTY(pipe)) pipe->Start = 0; if (pipe->waitingWriters > 0) PIPE_WAKEUPWRITERS(pipe); 800afb4: 29 61 00 30 lw r1,(r11+48) 800afb8: 37 82 00 2c addi r2,sp,44 800afbc: f8 00 06 f1 calli 800cb80 800afc0: e3 ff ff e0 bi 800af40 =============================================================================== 0800a820 : */ void pipe_release( pipe_control_t **pipep, rtems_libio_t *iop ) { 800a820: 37 9c ff ec addi sp,sp,-20 800a824: 5b 8b 00 10 sw (sp+16),r11 800a828: 5b 8c 00 0c sw (sp+12),r12 800a82c: 5b 8d 00 08 sw (sp+8),r13 800a830: 5b 9d 00 04 sw (sp+4),ra /* WARN pipe not released! */ if (!PIPE_LOCK(pipe)) rtems_fatal_error_occurred(0xdeadbeef); #endif mode = LIBIO_ACCMODE(iop); 800a834: 28 4c 00 18 lw r12,(r2+24) */ void pipe_release( pipe_control_t **pipep, rtems_libio_t *iop ) { 800a838: b8 20 68 00 mv r13,r1 pipe_control_t *pipe = *pipep; 800a83c: 28 2b 00 00 lw r11,(r1+0) if (!PIPE_LOCK(pipe)) rtems_fatal_error_occurred(0xdeadbeef); #endif mode = LIBIO_ACCMODE(iop); if (mode & LIBIO_FLAGS_READ) 800a840: 21 81 00 02 andi r1,r12,0x2 /* WARN pipe not released! */ if (!PIPE_LOCK(pipe)) rtems_fatal_error_occurred(0xdeadbeef); #endif mode = LIBIO_ACCMODE(iop); 800a844: 21 8c 00 06 andi r12,r12,0x6 if (mode & LIBIO_FLAGS_READ) 800a848: 44 20 00 04 be r1,r0,800a858 pipe->Readers --; 800a84c: 29 61 00 10 lw r1,(r11+16) 800a850: 34 21 ff ff addi r1,r1,-1 800a854: 59 61 00 10 sw (r11+16),r1 if (mode & LIBIO_FLAGS_WRITE) 800a858: 21 81 00 04 andi r1,r12,0x4 800a85c: 44 20 00 04 be r1,r0,800a86c pipe->Writers --; 800a860: 29 61 00 14 lw r1,(r11+20) 800a864: 34 21 ff ff addi r1,r1,-1 800a868: 59 61 00 14 sw (r11+20),r1 PIPE_UNLOCK(pipe); 800a86c: 29 61 00 28 lw r1,(r11+40) 800a870: fb ff eb 9d calli 80056e4 if (pipe->Readers == 0 && pipe->Writers == 0) { 800a874: 29 62 00 10 lw r2,(r11+16) 800a878: 5c 40 00 0c bne r2,r0,800a8a8 800a87c: 29 61 00 14 lw r1,(r11+20) 800a880: 44 22 00 23 be r1,r2,800a90c delfile = TRUE; #endif pipe_free(pipe); *pipep = NULL; } else if (pipe->Readers == 0 && mode != LIBIO_FLAGS_WRITE) 800a884: 7d 8c 00 04 cmpnei r12,r12,4 800a888: 5d 80 00 17 bne r12,r0,800a8e4 <== ALWAYS TAKEN /* Notify waiting Writers that all their partners left */ PIPE_WAKEUPWRITERS(pipe); else if (pipe->Writers == 0 && mode != LIBIO_FLAGS_READ) PIPE_WAKEUPREADERS(pipe); pipe_unlock(); 800a88c: fb ff ff dc calli 800a7fc <== NOT EXECUTED iop->flags &= ~LIBIO_FLAGS_OPEN; if(iop->pathinfo.ops->unlink_h(&iop->pathinfo)) return; #endif } 800a890: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 800a894: 2b 8b 00 10 lw r11,(sp+16) <== NOT EXECUTED 800a898: 2b 8c 00 0c lw r12,(sp+12) <== NOT EXECUTED 800a89c: 2b 8d 00 08 lw r13,(sp+8) <== NOT EXECUTED 800a8a0: 37 9c 00 14 addi sp,sp,20 <== NOT EXECUTED 800a8a4: c3 a0 00 00 ret <== NOT EXECUTED *pipep = NULL; } else if (pipe->Readers == 0 && mode != LIBIO_FLAGS_WRITE) /* Notify waiting Writers that all their partners left */ PIPE_WAKEUPWRITERS(pipe); else if (pipe->Writers == 0 && mode != LIBIO_FLAGS_READ) 800a8a8: 29 61 00 14 lw r1,(r11+20) 800a8ac: 7d 8c 00 02 cmpnei r12,r12,2 800a8b0: 64 21 00 00 cmpei r1,r1,0 800a8b4: a0 2c 60 00 and r12,r1,r12 800a8b8: 45 80 ff f5 be r12,r0,800a88c <== NEVER TAKEN PIPE_WAKEUPREADERS(pipe); 800a8bc: 29 61 00 2c lw r1,(r11+44) 800a8c0: 37 82 00 14 addi r2,sp,20 800a8c4: f8 00 08 af calli 800cb80 pipe_unlock(); 800a8c8: fb ff ff cd calli 800a7fc iop->flags &= ~LIBIO_FLAGS_OPEN; if(iop->pathinfo.ops->unlink_h(&iop->pathinfo)) return; #endif } 800a8cc: 2b 9d 00 04 lw ra,(sp+4) 800a8d0: 2b 8b 00 10 lw r11,(sp+16) 800a8d4: 2b 8c 00 0c lw r12,(sp+12) 800a8d8: 2b 8d 00 08 lw r13,(sp+8) 800a8dc: 37 9c 00 14 addi sp,sp,20 800a8e0: c3 a0 00 00 ret pipe_free(pipe); *pipep = NULL; } else if (pipe->Readers == 0 && mode != LIBIO_FLAGS_WRITE) /* Notify waiting Writers that all their partners left */ PIPE_WAKEUPWRITERS(pipe); 800a8e4: 29 61 00 30 lw r1,(r11+48) 800a8e8: 37 82 00 14 addi r2,sp,20 800a8ec: f8 00 08 a5 calli 800cb80 else if (pipe->Writers == 0 && mode != LIBIO_FLAGS_READ) PIPE_WAKEUPREADERS(pipe); pipe_unlock(); 800a8f0: fb ff ff c3 calli 800a7fc iop->flags &= ~LIBIO_FLAGS_OPEN; if(iop->pathinfo.ops->unlink_h(&iop->pathinfo)) return; #endif } 800a8f4: 2b 9d 00 04 lw ra,(sp+4) 800a8f8: 2b 8b 00 10 lw r11,(sp+16) 800a8fc: 2b 8c 00 0c lw r12,(sp+12) 800a900: 2b 8d 00 08 lw r13,(sp+8) 800a904: 37 9c 00 14 addi sp,sp,20 800a908: c3 a0 00 00 ret /* Called with pipe_semaphore held. */ static inline void pipe_free( pipe_control_t *pipe ) { rtems_barrier_delete(pipe->readBarrier); 800a90c: 29 61 00 2c lw r1,(r11+44) 800a910: f8 00 08 68 calli 800cab0 rtems_barrier_delete(pipe->writeBarrier); 800a914: 29 61 00 30 lw r1,(r11+48) 800a918: f8 00 08 66 calli 800cab0 rtems_semaphore_delete(pipe->Semaphore); 800a91c: 29 61 00 28 lw r1,(r11+40) 800a920: fb ff ea de calli 8005498 free(pipe->Buffer); 800a924: 29 61 00 00 lw r1,(r11+0) 800a928: fb ff e3 09 calli 800354c free(pipe); 800a92c: b9 60 08 00 mv r1,r11 800a930: fb ff e3 07 calli 800354c /* To delete an anonymous pipe file when all users closed it */ if (pipe->Anonymous) delfile = TRUE; #endif pipe_free(pipe); *pipep = NULL; 800a934: 59 a0 00 00 sw (r13+0),r0 /* Notify waiting Writers that all their partners left */ PIPE_WAKEUPWRITERS(pipe); else if (pipe->Writers == 0 && mode != LIBIO_FLAGS_READ) PIPE_WAKEUPREADERS(pipe); pipe_unlock(); 800a938: fb ff ff b1 calli 800a7fc iop->flags &= ~LIBIO_FLAGS_OPEN; if(iop->pathinfo.ops->unlink_h(&iop->pathinfo)) return; #endif } 800a93c: 2b 9d 00 04 lw ra,(sp+4) 800a940: 2b 8b 00 10 lw r11,(sp+16) 800a944: 2b 8c 00 0c lw r12,(sp+12) 800a948: 2b 8d 00 08 lw r13,(sp+8) 800a94c: 37 9c 00 14 addi sp,sp,20 800a950: c3 a0 00 00 ret =============================================================================== 0800afc4 : pipe_control_t *pipe, const void *buffer, size_t count, rtems_libio_t *iop ) { 800afc4: 37 9c ff d4 addi sp,sp,-44 800afc8: 5b 8b 00 24 sw (sp+36),r11 800afcc: 5b 8c 00 20 sw (sp+32),r12 800afd0: 5b 8d 00 1c sw (sp+28),r13 800afd4: 5b 8e 00 18 sw (sp+24),r14 800afd8: 5b 8f 00 14 sw (sp+20),r15 800afdc: 5b 90 00 10 sw (sp+16),r16 800afe0: 5b 91 00 0c sw (sp+12),r17 800afe4: 5b 92 00 08 sw (sp+8),r18 800afe8: 5b 9d 00 04 sw (sp+4),ra 800afec: b8 20 58 00 mv r11,r1 800aff0: b8 60 60 00 mv r12,r3 800aff4: b8 40 68 00 mv r13,r2 int chunk, chunk1, written = 0, ret = 0; /* Write nothing */ if (count == 0) return 0; 800aff8: 34 01 00 00 mvi r1,0 ) { int chunk, chunk1, written = 0, ret = 0; /* Write nothing */ if (count == 0) 800affc: 5c 60 00 0c bne r3,r0,800b02c <== ALWAYS TAKEN #endif if (written > 0) return written; return ret; } 800b000: 2b 9d 00 04 lw ra,(sp+4) 800b004: 2b 8b 00 24 lw r11,(sp+36) 800b008: 2b 8c 00 20 lw r12,(sp+32) 800b00c: 2b 8d 00 1c lw r13,(sp+28) 800b010: 2b 8e 00 18 lw r14,(sp+24) 800b014: 2b 8f 00 14 lw r15,(sp+20) 800b018: 2b 90 00 10 lw r16,(sp+16) 800b01c: 2b 91 00 0c lw r17,(sp+12) 800b020: 2b 92 00 08 lw r18,(sp+8) 800b024: 37 9c 00 2c addi sp,sp,44 800b028: c3 a0 00 00 ret /* Write nothing */ if (count == 0) return 0; if (! PIPE_LOCK(pipe)) 800b02c: 29 61 00 28 lw r1,(r11+40) 800b030: 34 02 00 00 mvi r2,0 800b034: 34 03 00 00 mvi r3,0 800b038: 5b 84 00 28 sw (sp+40),r4 800b03c: fb ff e9 4e calli 8005574 800b040: b8 20 10 00 mv r2,r1 800b044: 2b 84 00 28 lw r4,(sp+40) return -EINTR; 800b048: 34 01 ff fc mvi r1,-4 /* Write nothing */ if (count == 0) return 0; if (! PIPE_LOCK(pipe)) 800b04c: 5c 40 ff ed bne r2,r0,800b000 <== NEVER TAKEN return -EINTR; if (pipe->Readers == 0) { 800b050: 29 61 00 10 lw r1,(r11+16) 800b054: 44 22 00 55 be r1,r2,800b1a8 ret = -EPIPE; goto out_locked; } /* Write of PIPE_BUF bytes or less shall not be interleaved */ chunk = count <= pipe->Size ? count : 1; 800b058: 29 6e 00 04 lw r14,(r11+4) 800b05c: 34 0f 00 01 mvi r15,1 800b060: 55 8e 00 02 bgu r12,r14,800b068 <== NEVER TAKEN 800b064: b9 80 78 00 mv r15,r12 800b068: 34 12 00 00 mvi r18,0 800b06c: 34 10 00 00 mvi r16,0 } /* Wait until there is chunk bytes space or no reader exists */ pipe->waitingWriters ++; PIPE_UNLOCK(pipe); if (! PIPE_WRITEWAIT(pipe)) 800b070: 34 11 ff fc mvi r17,-4 /* 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) { 800b074: 29 61 00 0c lw r1,(r11+12) 800b078: c9 c1 18 00 sub r3,r14,r1 800b07c: 55 e3 00 23 bgu r15,r3,800b108 ret = -EPIPE; goto out_locked; } } chunk = MIN(count - written, PIPE_SPACE(pipe)); 800b080: c9 92 10 00 sub r2,r12,r18 800b084: b8 60 78 00 mv r15,r3 800b088: 50 43 00 02 bgeu r2,r3,800b090 800b08c: b8 40 78 00 mv r15,r2 chunk1 = pipe->Size - PIPE_WSTART(pipe); 800b090: 29 63 00 08 lw r3,(r11+8) 800b094: b9 c0 10 00 mv r2,r14 800b098: 5b 84 00 28 sw (sp+40),r4 800b09c: b4 23 08 00 add r1,r1,r3 800b0a0: f8 00 58 43 calli 80211ac <__umodsi3> 800b0a4: c9 c1 70 00 sub r14,r14,r1 if (chunk > chunk1) { 800b0a8: 2b 84 00 28 lw r4,(sp+40) 800b0ac: 4d cf 00 4a bge r14,r15,800b1d4 memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk1); 800b0b0: 29 65 00 00 lw r5,(r11+0) 800b0b4: b5 b2 10 00 add r2,r13,r18 800b0b8: b9 c0 18 00 mv r3,r14 800b0bc: b4 a1 08 00 add r1,r5,r1 800b0c0: f8 00 16 aa calli 8010b68 memcpy(pipe->Buffer, buffer + written + chunk1, chunk - chunk1); 800b0c4: 29 61 00 00 lw r1,(r11+0) 800b0c8: b5 d2 10 00 add r2,r14,r18 800b0cc: b5 a2 10 00 add r2,r13,r2 800b0d0: c9 ee 18 00 sub r3,r15,r14 800b0d4: f8 00 16 a5 calli 8010b68 800b0d8: 2b 84 00 28 lw r4,(sp+40) } else memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk); pipe->Length += chunk; 800b0dc: 29 61 00 0c lw r1,(r11+12) if (pipe->waitingReaders > 0) 800b0e0: 29 62 00 18 lw r2,(r11+24) memcpy(pipe->Buffer, buffer + written + chunk1, chunk - chunk1); } else memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk); pipe->Length += chunk; 800b0e4: b4 2f 08 00 add r1,r1,r15 800b0e8: 59 61 00 0c sw (r11+12),r1 if (pipe->waitingReaders > 0) 800b0ec: 5c 40 00 42 bne r2,r0,800b1f4 PIPE_WAKEUPREADERS(pipe); written += chunk; 800b0f0: b6 0f 80 00 add r16,r16,r15 } /* Write of PIPE_BUF bytes or less shall not be interleaved */ chunk = count <= pipe->Size ? count : 1; while (written < count) { 800b0f4: ba 00 90 00 mv r18,r16 800b0f8: 52 0c 00 21 bgeu r16,r12,800b17c <== ALWAYS TAKEN 800b0fc: 29 6e 00 04 lw r14,(r11+4) <== NOT EXECUTED pipe->Length += chunk; if (pipe->waitingReaders > 0) PIPE_WAKEUPREADERS(pipe); written += chunk; /* Write of more than PIPE_BUF bytes can be interleaved */ chunk = 1; 800b100: 34 0f 00 01 mvi r15,1 <== NOT EXECUTED 800b104: e3 ff ff dc bi 800b074 <== NOT EXECUTED /* 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)) { 800b108: 28 8e 00 18 lw r14,(r4+24) 800b10c: 21 ce 00 01 andi r14,r14,0x1 800b110: 5d c0 00 2d bne r14,r0,800b1c4 ret = -EAGAIN; goto out_locked; } /* Wait until there is chunk bytes space or no reader exists */ pipe->waitingWriters ++; 800b114: 29 63 00 1c lw r3,(r11+28) PIPE_UNLOCK(pipe); 800b118: 29 61 00 28 lw r1,(r11+40) ret = -EAGAIN; goto out_locked; } /* Wait until there is chunk bytes space or no reader exists */ pipe->waitingWriters ++; 800b11c: 34 63 00 01 addi r3,r3,1 800b120: 59 63 00 1c sw (r11+28),r3 PIPE_UNLOCK(pipe); 800b124: 5b 84 00 28 sw (sp+40),r4 800b128: fb ff e9 6f calli 80056e4 if (! PIPE_WRITEWAIT(pipe)) 800b12c: 29 61 00 30 lw r1,(r11+48) 800b130: 34 02 00 00 mvi r2,0 800b134: f8 00 06 b4 calli 800cc04 800b138: fc 2e 70 00 cmpne r14,r1,r14 ret = -EINTR; if (! PIPE_LOCK(pipe)) { 800b13c: 29 61 00 28 lw r1,(r11+40) 800b140: 34 02 00 00 mvi r2,0 800b144: 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)) 800b148: c8 0e 70 00 sub r14,r0,r14 ret = -EINTR; if (! PIPE_LOCK(pipe)) { 800b14c: fb ff e9 0a calli 8005574 } /* Wait until there is chunk bytes space or no reader exists */ pipe->waitingWriters ++; PIPE_UNLOCK(pipe); if (! PIPE_WRITEWAIT(pipe)) 800b150: a1 d1 70 00 and r14,r14,r17 ret = -EINTR; if (! PIPE_LOCK(pipe)) { 800b154: 2b 84 00 28 lw r4,(sp+40) 800b158: 5c 20 00 1d bne r1,r0,800b1cc <== NEVER TAKEN /* WARN waitingWriters not restored! */ ret = -EINTR; goto out_nolock; } pipe->waitingWriters --; 800b15c: 29 63 00 1c lw r3,(r11+28) 800b160: 34 63 ff ff addi r3,r3,-1 800b164: 59 63 00 1c sw (r11+28),r3 if (ret != 0) 800b168: 5d c1 00 06 bne r14,r1,800b180 <== NEVER TAKEN goto out_locked; if (pipe->Readers == 0) { 800b16c: 29 61 00 10 lw r1,(r11+16) 800b170: 44 2e 00 0c be r1,r14,800b1a0 <== NEVER TAKEN 800b174: 29 6e 00 04 lw r14,(r11+4) 800b178: e3 ff ff bf bi 800b074 } /* Write of PIPE_BUF bytes or less shall not be interleaved */ chunk = count <= pipe->Size ? count : 1; while (written < count) { 800b17c: 34 0e 00 00 mvi r14,0 /* Write of more than PIPE_BUF bytes can be interleaved */ chunk = 1; } out_locked: PIPE_UNLOCK(pipe); 800b180: 29 61 00 28 lw r1,(r11+40) 800b184: fb ff e9 58 calli 80056e4 out_nolock: #ifdef RTEMS_POSIX_API /* Signal SIGPIPE */ if (ret == -EPIPE) 800b188: 34 01 ff e0 mvi r1,-32 800b18c: 45 c1 00 0a be r14,r1,800b1b4 kill(getpid(), SIGPIPE); #endif if (written > 0) 800b190: b9 c0 08 00 mv r1,r14 800b194: 4c 10 ff 9b bge r0,r16,800b000 800b198: ba 00 08 00 mv r1,r16 800b19c: e3 ff ff 99 bi 800b000 pipe->waitingWriters --; if (ret != 0) goto out_locked; if (pipe->Readers == 0) { ret = -EPIPE; 800b1a0: 34 0e ff e0 mvi r14,-32 <== NOT EXECUTED 800b1a4: e3 ff ff f7 bi 800b180 <== NOT EXECUTED if (! PIPE_LOCK(pipe)) return -EINTR; if (pipe->Readers == 0) { ret = -EPIPE; 800b1a8: 34 0e ff e0 mvi r14,-32 const void *buffer, size_t count, rtems_libio_t *iop ) { int chunk, chunk1, written = 0, ret = 0; 800b1ac: 34 10 00 00 mvi r16,0 800b1b0: e3 ff ff f4 bi 800b180 out_nolock: #ifdef RTEMS_POSIX_API /* Signal SIGPIPE */ if (ret == -EPIPE) kill(getpid(), SIGPIPE); 800b1b4: f8 00 02 a5 calli 800bc48 800b1b8: 34 02 00 0d mvi r2,13 800b1bc: f8 00 03 a2 calli 800c044 800b1c0: e3 ff ff f4 bi 800b190 chunk = count <= pipe->Size ? count : 1; while (written < count) { while (PIPE_SPACE(pipe) < chunk) { if (LIBIO_NODELAY(iop)) { ret = -EAGAIN; 800b1c4: 34 0e ff f5 mvi r14,-11 800b1c8: e3 ff ff ee bi 800b180 PIPE_UNLOCK(pipe); if (! PIPE_WRITEWAIT(pipe)) ret = -EINTR; if (! PIPE_LOCK(pipe)) { /* WARN waitingWriters not restored! */ ret = -EINTR; 800b1cc: 34 0e ff fc mvi r14,-4 <== NOT EXECUTED 800b1d0: e3 ff ff f0 bi 800b190 <== NOT EXECUTED if (chunk > chunk1) { memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk1); memcpy(pipe->Buffer, buffer + written + chunk1, chunk - chunk1); } else memcpy(pipe->Buffer + PIPE_WSTART(pipe), buffer + written, chunk); 800b1d4: 29 65 00 00 lw r5,(r11+0) 800b1d8: b5 b2 10 00 add r2,r13,r18 800b1dc: b9 e0 18 00 mv r3,r15 800b1e0: b4 a1 08 00 add r1,r5,r1 800b1e4: 5b 84 00 28 sw (sp+40),r4 800b1e8: f8 00 16 60 calli 8010b68 800b1ec: 2b 84 00 28 lw r4,(sp+40) 800b1f0: e3 ff ff bb bi 800b0dc pipe->Length += chunk; if (pipe->waitingReaders > 0) PIPE_WAKEUPREADERS(pipe); 800b1f4: 29 61 00 2c lw r1,(r11+44) 800b1f8: 37 82 00 2c addi r2,sp,44 800b1fc: 5b 84 00 28 sw (sp+40),r4 800b200: f8 00 06 60 calli 800cb80 800b204: 2b 84 00 28 lw r4,(sp+40) 800b208: e3 ff ff ba bi 800b0f0 =============================================================================== 08008564 : pthread_attr_t *attr, int policy ) { if ( !attr || !attr->is_initialized ) return EINVAL; 8008564: 34 03 00 16 mvi r3,22 int pthread_attr_setschedpolicy( pthread_attr_t *attr, int policy ) { if ( !attr || !attr->is_initialized ) 8008568: 44 20 00 09 be r1,r0,800858c 800856c: 28 24 00 00 lw r4,(r1+0) 8008570: 44 80 00 07 be r4,r0,800858c return EINVAL; switch ( policy ) { 8008574: 48 02 00 05 bg r0,r2,8008588 8008578: 34 03 00 02 mvi r3,2 800857c: 4c 62 00 06 bge r3,r2,8008594 8008580: 34 03 00 04 mvi r3,4 8008584: 44 43 00 04 be r2,r3,8008594 <== ALWAYS TAKEN case SCHED_SPORADIC: attr->schedpolicy = policy; return 0; default: return ENOTSUP; 8008588: 34 03 00 86 mvi r3,134 } } 800858c: b8 60 08 00 mv r1,r3 8008590: c3 a0 00 00 ret case SCHED_OTHER: case SCHED_FIFO: case SCHED_RR: case SCHED_SPORADIC: attr->schedpolicy = policy; return 0; 8008594: 34 03 00 00 mvi r3,0 switch ( policy ) { case SCHED_OTHER: case SCHED_FIFO: case SCHED_RR: case SCHED_SPORADIC: attr->schedpolicy = policy; 8008598: 58 22 00 14 sw (r1+20),r2 return 0; default: return ENOTSUP; } } 800859c: b8 60 08 00 mv r1,r3 80085a0: c3 a0 00 00 ret =============================================================================== 08003754 : int pthread_barrier_init( pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count ) { 8003754: 37 9c ff d8 addi sp,sp,-40 8003758: 5b 8b 00 14 sw (sp+20),r11 800375c: 5b 8c 00 10 sw (sp+16),r12 8003760: 5b 8d 00 0c sw (sp+12),r13 8003764: 5b 8e 00 08 sw (sp+8),r14 8003768: 5b 9d 00 04 sw (sp+4),ra /* * Error check parameters */ if ( !barrier ) return EINVAL; 800376c: 34 04 00 16 mvi r4,22 int pthread_barrier_init( pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count ) { 8003770: b8 20 58 00 mv r11,r1 const pthread_barrierattr_t *the_attr; /* * Error check parameters */ if ( !barrier ) 8003774: 44 20 00 08 be r1,r0,8003794 return EINVAL; if ( count == 0 ) 8003778: 44 60 00 07 be r3,r0,8003794 return EINVAL; /* * If the user passed in NULL, use the default attributes */ if ( attr ) { 800377c: 44 40 00 34 be r2,r0,800384c } /* * Now start error checking the attributes that we are going to use */ if ( !the_attr->is_initialized ) 8003780: 28 41 00 00 lw r1,(r2+0) return EINVAL; 8003784: 34 04 00 16 mvi r4,22 } /* * Now start error checking the attributes that we are going to use */ if ( !the_attr->is_initialized ) 8003788: 44 20 00 03 be r1,r0,8003794 return EINVAL; switch ( the_attr->process_shared ) { 800378c: 28 4e 00 04 lw r14,(r2+4) 8003790: 45 c0 00 09 be r14,r0,80037b4 <== ALWAYS TAKEN * Exit the critical section and return the user an operational barrier */ *barrier = the_barrier->Object.id; _Thread_Enable_dispatch(); return 0; } 8003794: b8 80 08 00 mv r1,r4 8003798: 2b 9d 00 04 lw ra,(sp+4) 800379c: 2b 8b 00 14 lw r11,(sp+20) 80037a0: 2b 8c 00 10 lw r12,(sp+16) 80037a4: 2b 8d 00 0c lw r13,(sp+12) 80037a8: 2b 8e 00 08 lw r14,(sp+8) 80037ac: 37 9c 00 28 addi sp,sp,40 80037b0: c3 a0 00 00 ret rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 80037b4: 78 01 08 01 mvhi r1,0x801 80037b8: 38 21 68 a8 ori r1,r1,0x68a8 80037bc: 28 22 00 00 lw r2,(r1+0) } /* * Convert from POSIX attributes to Core Barrier attributes */ the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE; 80037c0: 5b 80 00 24 sw (sp+36),r0 the_attributes.maximum_count = count; 80037c4: 5b 83 00 28 sw (sp+40),r3 80037c8: 34 42 00 01 addi r2,r2,1 80037cc: 58 22 00 00 sw (r1+0),r2 * 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 ); 80037d0: 78 0d 08 01 mvhi r13,0x801 80037d4: 39 ad 6b fc ori r13,r13,0x6bfc 80037d8: b9 a0 08 00 mv r1,r13 80037dc: f8 00 08 43 calli 80058e8 <_Objects_Allocate> 80037e0: b8 20 60 00 mv r12,r1 */ _Thread_Disable_dispatch(); /* prevents deletion */ the_barrier = _POSIX_Barrier_Allocate(); if ( !the_barrier ) { 80037e4: 44 2e 00 17 be r1,r14,8003840 _Thread_Enable_dispatch(); return EAGAIN; } _CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes ); 80037e8: 37 82 00 24 addi r2,sp,36 80037ec: 34 21 00 10 addi r1,r1,16 80037f0: f8 00 05 2c calli 8004ca0 <_CORE_barrier_Initialize> uint32_t name ) { _Objects_Set_local_object( information, _Objects_Get_index( the_object->id ), 80037f4: 29 82 00 08 lw r2,(r12+8) #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 80037f8: 29 a3 00 1c lw r3,(r13+28) Objects_Information *information, Objects_Control *the_object, uint32_t name ) { _Objects_Set_local_object( 80037fc: 20 41 ff ff andi r1,r2,0xffff #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 8003800: b4 21 08 00 add r1,r1,r1 8003804: b4 21 08 00 add r1,r1,r1 8003808: b4 61 08 00 add r1,r3,r1 800380c: 58 2c 00 00 sw (r1+0),r12 _Objects_Get_index( the_object->id ), the_object ); /* ASSERT: information->is_string == false */ the_object->name.name_u32 = name; 8003810: 59 80 00 0c sw (r12+12),r0 ); /* * Exit the critical section and return the user an operational barrier */ *barrier = the_barrier->Object.id; 8003814: 59 62 00 00 sw (r11+0),r2 _Thread_Enable_dispatch(); 8003818: f8 00 0c be calli 8006b10 <_Thread_Enable_dispatch> return 0; 800381c: 34 04 00 00 mvi r4,0 } 8003820: b8 80 08 00 mv r1,r4 8003824: 2b 9d 00 04 lw ra,(sp+4) 8003828: 2b 8b 00 14 lw r11,(sp+20) 800382c: 2b 8c 00 10 lw r12,(sp+16) 8003830: 2b 8d 00 0c lw r13,(sp+12) 8003834: 2b 8e 00 08 lw r14,(sp+8) 8003838: 37 9c 00 28 addi sp,sp,40 800383c: c3 a0 00 00 ret _Thread_Disable_dispatch(); /* prevents deletion */ the_barrier = _POSIX_Barrier_Allocate(); if ( !the_barrier ) { _Thread_Enable_dispatch(); 8003840: f8 00 0c b4 calli 8006b10 <_Thread_Enable_dispatch> return EAGAIN; 8003844: 34 04 00 0b mvi r4,11 8003848: e3 ff ff d3 bi 8003794 * If the user passed in NULL, use the default attributes */ if ( attr ) { the_attr = attr; } else { (void) pthread_barrierattr_init( &my_attr ); 800384c: 37 8c 00 1c addi r12,sp,28 8003850: b9 80 08 00 mv r1,r12 8003854: 5b 83 00 18 sw (sp+24),r3 8003858: fb ff ff 7c calli 8003648 the_attr = &my_attr; 800385c: b9 80 10 00 mv r2,r12 8003860: 2b 83 00 18 lw r3,(sp+24) 8003864: e3 ff ff c7 bi 8003780 =============================================================================== 08002f60 : void pthread_cleanup_push( void (*routine)( void * ), void *arg ) { 8002f60: 37 9c ff f4 addi sp,sp,-12 8002f64: 5b 8b 00 0c sw (sp+12),r11 8002f68: 5b 8c 00 08 sw (sp+8),r12 8002f6c: 5b 9d 00 04 sw (sp+4),ra 8002f70: b8 20 58 00 mv r11,r1 8002f74: 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 ) 8002f78: 44 20 00 14 be r1,r0,8002fc8 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 8002f7c: 78 03 08 01 mvhi r3,0x801 8002f80: 38 63 68 90 ori r3,r3,0x6890 8002f84: 28 61 00 00 lw r1,(r3+0) 8002f88: 34 21 00 01 addi r1,r1,1 8002f8c: 58 61 00 00 sw (r3+0),r1 return; _Thread_Disable_dispatch(); handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) ); 8002f90: 34 01 00 10 mvi r1,16 8002f94: f8 00 12 1e calli 800780c <_Workspace_Allocate> 8002f98: b8 20 18 00 mv r3,r1 if ( handler ) { 8002f9c: 44 20 00 0a be r1,r0,8002fc4 <== NEVER TAKEN thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; 8002fa0: 78 04 08 01 mvhi r4,0x801 8002fa4: 38 84 6d 5c ori r4,r4,0x6d5c 8002fa8: 28 81 00 0c lw r1,(r4+12) handler_stack = &thread_support->Cancellation_Handlers; handler->routine = routine; handler->arg = arg; _Chain_Append( handler_stack, &handler->Node ); 8002fac: b8 60 10 00 mv r2,r3 handler = _Workspace_Allocate( sizeof( POSIX_Cancel_Handler_control ) ); if ( handler ) { thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; handler_stack = &thread_support->Cancellation_Handlers; 8002fb0: 28 21 01 20 lw r1,(r1+288) handler->routine = routine; 8002fb4: 58 6b 00 08 sw (r3+8),r11 handler->arg = arg; 8002fb8: 58 6c 00 0c sw (r3+12),r12 _Chain_Append( handler_stack, &handler->Node ); 8002fbc: 34 21 00 e4 addi r1,r1,228 8002fc0: f8 00 05 2c calli 8004470 <_Chain_Append> } _Thread_Enable_dispatch(); 8002fc4: f8 00 0c a3 calli 8006250 <_Thread_Enable_dispatch> } 8002fc8: 2b 9d 00 04 lw ra,(sp+4) 8002fcc: 2b 8b 00 0c lw r11,(sp+12) 8002fd0: 2b 8c 00 08 lw r12,(sp+8) 8002fd4: 37 9c 00 0c addi sp,sp,12 8002fd8: c3 a0 00 00 ret =============================================================================== 0800406c : int pthread_cond_init( pthread_cond_t *cond, const pthread_condattr_t *attr ) { 800406c: 37 9c ff ec addi sp,sp,-20 8004070: 5b 8b 00 10 sw (sp+16),r11 8004074: 5b 8c 00 0c sw (sp+12),r12 8004078: 5b 8d 00 08 sw (sp+8),r13 800407c: 5b 9d 00 04 sw (sp+4),ra 8004080: b8 20 68 00 mv r13,r1 POSIX_Condition_variables_Control *the_cond; const pthread_condattr_t *the_attr; if ( attr ) the_attr = attr; 8004084: 44 40 00 35 be r2,r0,8004158 else the_attr = &_POSIX_Condition_variables_Default_attributes; /* * Be careful about attributes when global!!! */ if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED ) 8004088: 28 44 00 04 lw r4,(r2+4) 800408c: 34 03 00 01 mvi r3,1 return EINVAL; 8004090: 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 ) 8004094: 44 83 00 03 be r4,r3,80040a0 <== NEVER TAKEN return EINVAL; if ( !the_attr->is_initialized ) 8004098: 28 43 00 00 lw r3,(r2+0) 800409c: 5c 60 00 07 bne r3,r0,80040b8 *cond = the_cond->Object.id; _Thread_Enable_dispatch(); return 0; } 80040a0: 2b 9d 00 04 lw ra,(sp+4) 80040a4: 2b 8b 00 10 lw r11,(sp+16) 80040a8: 2b 8c 00 0c lw r12,(sp+12) 80040ac: 2b 8d 00 08 lw r13,(sp+8) 80040b0: 37 9c 00 14 addi sp,sp,20 80040b4: c3 a0 00 00 ret rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 80040b8: 78 03 08 01 mvhi r3,0x801 80040bc: 38 63 78 a8 ori r3,r3,0x78a8 80040c0: 28 61 00 00 lw r1,(r3+0) 80040c4: 34 21 00 01 addi r1,r1,1 80040c8: 58 61 00 00 sw (r3+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 ); 80040cc: 78 0c 08 01 mvhi r12,0x801 80040d0: 39 8c 7c 94 ori r12,r12,0x7c94 80040d4: b9 80 08 00 mv r1,r12 80040d8: 5b 82 00 14 sw (sp+20),r2 80040dc: f8 00 09 e7 calli 8006878 <_Objects_Allocate> 80040e0: b8 20 58 00 mv r11,r1 _Thread_Disable_dispatch(); the_cond = _POSIX_Condition_variables_Allocate(); if ( !the_cond ) { 80040e4: 2b 82 00 14 lw r2,(sp+20) 80040e8: 44 20 00 1f be r1,r0,8004164 the_cond->process_shared = the_attr->process_shared; the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX; _Thread_queue_Initialize( 80040ec: 78 01 08 01 mvhi r1,0x801 if ( !the_cond ) { _Thread_Enable_dispatch(); return ENOMEM; } the_cond->process_shared = the_attr->process_shared; 80040f0: 28 45 00 04 lw r5,(r2+4) the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX; _Thread_queue_Initialize( 80040f4: 38 21 62 d0 ori r1,r1,0x62d0 80040f8: 28 23 00 00 lw r3,(r1+0) 80040fc: 34 04 00 74 mvi r4,116 8004100: 35 61 00 18 addi r1,r11,24 if ( !the_cond ) { _Thread_Enable_dispatch(); return ENOMEM; } the_cond->process_shared = the_attr->process_shared; 8004104: 59 65 00 10 sw (r11+16),r5 the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX; _Thread_queue_Initialize( 8004108: 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; 800410c: 59 60 00 14 sw (r11+20),r0 _Thread_queue_Initialize( 8004110: f8 00 11 04 calli 8008520 <_Thread_queue_Initialize> uint32_t name ) { _Objects_Set_local_object( information, _Objects_Get_index( the_object->id ), 8004114: 29 61 00 08 lw r1,(r11+8) #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 8004118: 29 83 00 1c lw r3,(r12+28) Objects_Information *information, Objects_Control *the_object, uint32_t name ) { _Objects_Set_local_object( 800411c: 20 22 ff ff andi r2,r1,0xffff #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 8004120: b4 42 10 00 add r2,r2,r2 8004124: b4 42 10 00 add r2,r2,r2 8004128: b4 62 10 00 add r2,r3,r2 800412c: 58 4b 00 00 sw (r2+0),r11 _Objects_Get_index( the_object->id ), the_object ); /* ASSERT: information->is_string == false */ the_object->name.name_u32 = name; 8004130: 59 60 00 0c sw (r11+12),r0 &_POSIX_Condition_variables_Information, &the_cond->Object, 0 ); *cond = the_cond->Object.id; 8004134: 59 a1 00 00 sw (r13+0),r1 _Thread_Enable_dispatch(); 8004138: f8 00 0e c9 calli 8007c5c <_Thread_Enable_dispatch> return 0; 800413c: 34 01 00 00 mvi r1,0 } 8004140: 2b 9d 00 04 lw ra,(sp+4) 8004144: 2b 8b 00 10 lw r11,(sp+16) 8004148: 2b 8c 00 0c lw r12,(sp+12) 800414c: 2b 8d 00 08 lw r13,(sp+8) 8004150: 37 9c 00 14 addi sp,sp,20 8004154: c3 a0 00 00 ret { POSIX_Condition_variables_Control *the_cond; const pthread_condattr_t *the_attr; if ( attr ) the_attr = attr; else the_attr = &_POSIX_Condition_variables_Default_attributes; 8004158: 78 02 08 01 mvhi r2,0x801 800415c: 38 42 62 c8 ori r2,r2,0x62c8 8004160: e3 ff ff ca bi 8004088 _Thread_Disable_dispatch(); the_cond = _POSIX_Condition_variables_Allocate(); if ( !the_cond ) { _Thread_Enable_dispatch(); 8004164: f8 00 0e be calli 8007c5c <_Thread_Enable_dispatch> return ENOMEM; 8004168: 34 01 00 0c mvi r1,12 800416c: e3 ff ff cd bi 80040a0 =============================================================================== 08003ec8 : int pthread_condattr_destroy( pthread_condattr_t *attr ) { if ( !attr || attr->is_initialized == false ) return EINVAL; 8003ec8: 34 02 00 16 mvi r2,22 int pthread_condattr_destroy( pthread_condattr_t *attr ) { if ( !attr || attr->is_initialized == false ) 8003ecc: 44 20 00 05 be r1,r0,8003ee0 8003ed0: 28 23 00 00 lw r3,(r1+0) 8003ed4: 44 60 00 03 be r3,r0,8003ee0 <== NEVER TAKEN return EINVAL; attr->is_initialized = false; 8003ed8: 58 20 00 00 sw (r1+0),r0 return 0; 8003edc: 34 02 00 00 mvi r2,0 } 8003ee0: b8 40 08 00 mv r1,r2 8003ee4: c3 a0 00 00 ret =============================================================================== 080033e8 : pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)( void * ), void *arg ) { 80033e8: 37 9c ff a0 addi sp,sp,-96 80033ec: 5b 8b 00 3c sw (sp+60),r11 80033f0: 5b 8c 00 38 sw (sp+56),r12 80033f4: 5b 8d 00 34 sw (sp+52),r13 80033f8: 5b 8e 00 30 sw (sp+48),r14 80033fc: 5b 8f 00 2c sw (sp+44),r15 8003400: 5b 90 00 28 sw (sp+40),r16 8003404: 5b 91 00 24 sw (sp+36),r17 8003408: 5b 92 00 20 sw (sp+32),r18 800340c: 5b 93 00 1c sw (sp+28),r19 8003410: 5b 94 00 18 sw (sp+24),r20 8003414: 5b 95 00 14 sw (sp+20),r21 8003418: 5b 9d 00 10 sw (sp+16),ra struct sched_param schedparam; Objects_Name name; int rc; if ( !start_routine ) return EFAULT; 800341c: 34 0c 00 0e mvi r12,14 pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)( void * ), void *arg ) { 8003420: b8 60 68 00 mv r13,r3 8003424: b8 20 78 00 mv r15,r1 8003428: b8 80 70 00 mv r14,r4 int schedpolicy = SCHED_RR; struct sched_param schedparam; Objects_Name name; int rc; if ( !start_routine ) 800342c: 44 60 00 13 be r3,r0,8003478 <== NEVER TAKEN return EFAULT; the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes; 8003430: b8 40 58 00 mv r11,r2 8003434: 44 40 00 66 be r2,r0,80035cc if ( !the_attr->is_initialized ) 8003438: 29 61 00 00 lw r1,(r11+0) return EINVAL; 800343c: 34 0c 00 16 mvi r12,22 if ( !start_routine ) return EFAULT; the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes; if ( !the_attr->is_initialized ) 8003440: 44 20 00 0e be r1,r0,8003478 * 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) ) 8003444: 29 61 00 04 lw r1,(r11+4) 8003448: 44 20 00 06 be r1,r0,8003460 800344c: 78 02 08 02 mvhi r2,0x802 8003450: 38 42 00 e0 ori r2,r2,0xe0 8003454: 29 63 00 08 lw r3,(r11+8) 8003458: 28 41 00 00 lw r1,(r2+0) 800345c: 54 23 00 07 bgu r1,r3,8003478 * 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 ) { 8003460: 29 61 00 10 lw r1,(r11+16) 8003464: 34 02 00 01 mvi r2,1 8003468: 44 22 00 5c be r1,r2,80035d8 800346c: 34 02 00 02 mvi r2,2 schedpolicy = the_attr->schedpolicy; schedparam = the_attr->schedparam; break; default: return EINVAL; 8003470: 34 0c 00 16 mvi r12,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 ) { 8003474: 44 22 00 10 be r1,r2,80034b4 */ *thread = the_thread->Object.id; _RTEMS_Unlock_allocator(); return 0; } 8003478: b9 80 08 00 mv r1,r12 800347c: 2b 9d 00 10 lw ra,(sp+16) 8003480: 2b 8b 00 3c lw r11,(sp+60) 8003484: 2b 8c 00 38 lw r12,(sp+56) 8003488: 2b 8d 00 34 lw r13,(sp+52) 800348c: 2b 8e 00 30 lw r14,(sp+48) 8003490: 2b 8f 00 2c lw r15,(sp+44) 8003494: 2b 90 00 28 lw r16,(sp+40) 8003498: 2b 91 00 24 lw r17,(sp+36) 800349c: 2b 92 00 20 lw r18,(sp+32) 80034a0: 2b 93 00 1c lw r19,(sp+28) 80034a4: 2b 94 00 18 lw r20,(sp+24) 80034a8: 2b 95 00 14 lw r21,(sp+20) 80034ac: 37 9c 00 60 addi sp,sp,96 80034b0: c3 a0 00 00 ret schedparam = api->schedparam; break; case PTHREAD_EXPLICIT_SCHED: schedpolicy = the_attr->schedpolicy; schedparam = the_attr->schedparam; 80034b4: 29 67 00 18 lw r7,(r11+24) 80034b8: 29 66 00 1c lw r6,(r11+28) 80034bc: 29 65 00 20 lw r5,(r11+32) 80034c0: 29 64 00 24 lw r4,(r11+36) 80034c4: 29 63 00 28 lw r3,(r11+40) 80034c8: 29 62 00 2c lw r2,(r11+44) 80034cc: 29 61 00 30 lw r1,(r11+48) schedpolicy = api->schedpolicy; schedparam = api->schedparam; break; case PTHREAD_EXPLICIT_SCHED: schedpolicy = the_attr->schedpolicy; 80034d0: 29 71 00 14 lw r17,(r11+20) schedparam = the_attr->schedparam; 80034d4: 5b 87 00 40 sw (sp+64),r7 80034d8: 5b 86 00 44 sw (sp+68),r6 80034dc: 5b 85 00 48 sw (sp+72),r5 80034e0: 5b 84 00 4c sw (sp+76),r4 80034e4: 5b 83 00 50 sw (sp+80),r3 80034e8: 5b 82 00 54 sw (sp+84),r2 80034ec: 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 ) 80034f0: 29 70 00 0c lw r16,(r11+12) return ENOTSUP; 80034f4: 34 0c 00 86 mvi r12,134 /* * Check the contentionscope since rtems only supports PROCESS wide * contention (i.e. no system wide contention). */ if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS ) 80034f8: 5e 00 ff e0 bne r16,r0,8003478 return ENOTSUP; /* * Interpret the scheduling parameters. */ if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) ) 80034fc: 2b 81 00 40 lw r1,(sp+64) return EINVAL; 8003500: 34 0c 00 16 mvi r12,22 return ENOTSUP; /* * Interpret the scheduling parameters. */ if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) ) 8003504: f8 00 1c 6a calli 800a6ac <_POSIX_Priority_Is_valid> 8003508: 44 30 ff dc be r1,r16,8003478 <== NEVER TAKEN RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core( int priority ) { return (Priority_Control) (POSIX_SCHEDULER_MAXIMUM_PRIORITY - priority + 1); 800350c: 78 05 08 02 mvhi r5,0x802 8003510: 38 a5 00 e4 ori r5,r5,0xe4 core_priority = _POSIX_Priority_To_core( schedparam.sched_priority ); /* * Set the core scheduling policy information. */ rc = _POSIX_Thread_Translate_sched_param( 8003514: ba 20 08 00 mv r1,r17 8003518: 37 82 00 40 addi r2,sp,64 800351c: 37 83 00 60 addi r3,sp,96 8003520: 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 ); 8003524: 2b 94 00 40 lw r20,(sp+64) 8003528: 40 b5 00 00 lbu r21,(r5+0) /* * Set the core scheduling policy information. */ rc = _POSIX_Thread_Translate_sched_param( 800352c: f8 00 1c 68 calli 800a6cc <_POSIX_Thread_Translate_sched_param> 8003530: b8 20 60 00 mv r12,r1 schedpolicy, &schedparam, &budget_algorithm, &budget_callout ); if ( rc ) 8003534: 5c 20 ff d1 bne r1,r0,8003478 #endif /* * Lock the allocator mutex for protection */ _RTEMS_Lock_allocator(); 8003538: 78 12 08 02 mvhi r18,0x802 800353c: 3a 52 09 58 ori r18,r18,0x958 8003540: 2a 41 00 00 lw r1,(r18+0) * _POSIX_Threads_Allocate */ RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void ) { return (Thread_Control *) _Objects_Allocate( &_POSIX_Threads_Information ); 8003544: 78 10 08 02 mvhi r16,0x802 8003548: 3a 10 0a 6c ori r16,r16,0xa6c 800354c: f8 00 05 3a calli 8004a34 <_API_Mutex_Lock> 8003550: ba 00 08 00 mv r1,r16 8003554: f8 00 08 6a calli 80056fc <_Objects_Allocate> 8003558: b8 20 98 00 mv r19,r1 * Allocate the thread control block. * * NOTE: Global threads are not currently supported. */ the_thread = _POSIX_Threads_Allocate(); if ( !the_thread ) { 800355c: 44 2c 00 18 be r1,r12,80035bc static inline size_t _POSIX_Threads_Ensure_minimum_stack ( size_t size ) { if ( size >= PTHREAD_MINIMUM_STACK_SIZE ) 8003560: 78 01 08 02 mvhi r1,0x802 8003564: 38 21 00 e0 ori r1,r1,0xe0 8003568: 28 24 00 00 lw r4,(r1+0) /* * Initialize the core thread for this task. */ name.name_p = NULL; /* posix threads don't have a name by default */ status = _Thread_Initialize( 800356c: 29 61 00 08 lw r1,(r11+8) 8003570: 29 63 00 04 lw r3,(r11+4) static inline size_t _POSIX_Threads_Ensure_minimum_stack ( size_t size ) { if ( size >= PTHREAD_MINIMUM_STACK_SIZE ) 8003574: b4 84 20 00 add r4,r4,r4 /* * Initialize the core thread for this task. */ name.name_p = NULL; /* posix threads don't have a name by default */ status = _Thread_Initialize( 8003578: 50 81 00 02 bgeu r4,r1,8003580 800357c: b8 20 20 00 mv r4,r1 8003580: 2b 89 00 5c lw r9,(sp+92) 8003584: 2b 88 00 60 lw r8,(sp+96) 8003588: ba 00 08 00 mv r1,r16 800358c: ba 60 10 00 mv r2,r19 8003590: 34 05 00 00 mvi r5,0 8003594: ca b4 30 00 sub r6,r21,r20 8003598: 34 07 00 01 mvi r7,1 800359c: 5b 89 00 04 sw (sp+4),r9 80035a0: 5b 80 00 08 sw (sp+8),r0 80035a4: 5b 80 00 0c sw (sp+12),r0 80035a8: f8 00 0d 42 calli 8006ab0 <_Thread_Initialize> budget_callout, 0, /* isr level */ name /* posix threads don't have a name */ ); if ( !status ) { 80035ac: 5c 20 00 1f bne r1,r0,8003628 <== ALWAYS TAKEN RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free ( Thread_Control *the_pthread ) { _Objects_Free( &_POSIX_Threads_Information, &the_pthread->Object ); 80035b0: ba 00 08 00 mv r1,r16 <== NOT EXECUTED 80035b4: ba 60 10 00 mv r2,r19 <== NOT EXECUTED 80035b8: f8 00 09 55 calli 8005b0c <_Objects_Free> <== NOT EXECUTED _POSIX_Threads_Free( the_thread ); _RTEMS_Unlock_allocator(); 80035bc: 2a 41 00 00 lw r1,(r18+0) return EAGAIN; 80035c0: 34 0c 00 0b mvi r12,11 name /* posix threads don't have a name */ ); if ( !status ) { _POSIX_Threads_Free( the_thread ); _RTEMS_Unlock_allocator(); 80035c4: f8 00 05 38 calli 8004aa4 <_API_Mutex_Unlock> return EAGAIN; 80035c8: e3 ff ff ac bi 8003478 int rc; if ( !start_routine ) return EFAULT; the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes; 80035cc: 78 0b 08 01 mvhi r11,0x801 80035d0: 39 6b e1 dc ori r11,r11,0xe1dc 80035d4: e3 ff ff 99 bi 8003438 * PTHREAD_EXPLICIT_SCHED, then scheduling parameters come from the * attributes structure. */ switch ( the_attr->inheritsched ) { case PTHREAD_INHERIT_SCHED: api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; 80035d8: 78 01 08 02 mvhi r1,0x802 80035dc: 38 21 0d 64 ori r1,r1,0xd64 80035e0: 28 21 00 0c lw r1,(r1+12) 80035e4: 28 22 01 20 lw r2,(r1+288) schedpolicy = api->schedpolicy; schedparam = api->schedparam; 80035e8: 28 48 00 88 lw r8,(r2+136) 80035ec: 28 47 00 8c lw r7,(r2+140) 80035f0: 28 46 00 90 lw r6,(r2+144) 80035f4: 28 45 00 94 lw r5,(r2+148) 80035f8: 28 44 00 98 lw r4,(r2+152) 80035fc: 28 43 00 9c lw r3,(r2+156) 8003600: 28 41 00 a0 lw r1,(r2+160) * attributes structure. */ switch ( the_attr->inheritsched ) { case PTHREAD_INHERIT_SCHED: api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; schedpolicy = api->schedpolicy; 8003604: 28 51 00 84 lw r17,(r2+132) schedparam = api->schedparam; 8003608: 5b 88 00 40 sw (sp+64),r8 800360c: 5b 87 00 44 sw (sp+68),r7 8003610: 5b 86 00 48 sw (sp+72),r6 8003614: 5b 85 00 4c sw (sp+76),r5 8003618: 5b 84 00 50 sw (sp+80),r4 800361c: 5b 83 00 54 sw (sp+84),r3 8003620: 5b 81 00 58 sw (sp+88),r1 break; 8003624: e3 ff ff b3 bi 80034f0 } /* * finish initializing the per API structure */ api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 8003628: 2a 70 01 20 lw r16,(r19+288) api->Attributes = *the_attr; 800362c: 29 63 00 00 lw r3,(r11+0) api->schedparam = schedparam; /* * POSIX threads are allocated and started in one operation. */ status = _Thread_Start( 8003630: ba 60 08 00 mv r1,r19 8003634: 34 02 00 01 mvi r2,1 /* * finish initializing the per API structure */ api = the_thread->API_Extensions[ THREAD_API_POSIX ]; api->Attributes = *the_attr; 8003638: 5a 03 00 00 sw (r16+0),r3 800363c: 29 65 00 04 lw r5,(r11+4) api->schedparam = schedparam; /* * POSIX threads are allocated and started in one operation. */ status = _Thread_Start( 8003640: b9 a0 18 00 mv r3,r13 8003644: b9 c0 20 00 mv r4,r14 /* * finish initializing the per API structure */ api = the_thread->API_Extensions[ THREAD_API_POSIX ]; api->Attributes = *the_attr; 8003648: 5a 05 00 04 sw (r16+4),r5 800364c: 29 66 00 08 lw r6,(r11+8) api->schedparam = schedparam; /* * POSIX threads are allocated and started in one operation. */ status = _Thread_Start( 8003650: 34 05 00 00 mvi r5,0 /* * finish initializing the per API structure */ api = the_thread->API_Extensions[ THREAD_API_POSIX ]; api->Attributes = *the_attr; 8003654: 5a 06 00 08 sw (r16+8),r6 8003658: 29 66 00 0c lw r6,(r11+12) 800365c: 5a 06 00 0c sw (r16+12),r6 8003660: 29 66 00 10 lw r6,(r11+16) 8003664: 5a 06 00 10 sw (r16+16),r6 8003668: 29 66 00 14 lw r6,(r11+20) 800366c: 5a 06 00 14 sw (r16+20),r6 8003670: 29 66 00 18 lw r6,(r11+24) 8003674: 5a 06 00 18 sw (r16+24),r6 8003678: 29 66 00 1c lw r6,(r11+28) 800367c: 5a 06 00 1c sw (r16+28),r6 8003680: 29 66 00 20 lw r6,(r11+32) 8003684: 5a 06 00 20 sw (r16+32),r6 8003688: 29 66 00 24 lw r6,(r11+36) 800368c: 5a 06 00 24 sw (r16+36),r6 8003690: 29 66 00 28 lw r6,(r11+40) 8003694: 5a 06 00 28 sw (r16+40),r6 8003698: 29 66 00 2c lw r6,(r11+44) 800369c: 5a 06 00 2c sw (r16+44),r6 80036a0: 29 66 00 30 lw r6,(r11+48) 80036a4: 5a 06 00 30 sw (r16+48),r6 80036a8: 29 66 00 34 lw r6,(r11+52) 80036ac: 5a 06 00 34 sw (r16+52),r6 80036b0: 29 66 00 38 lw r6,(r11+56) 80036b4: 5a 06 00 38 sw (r16+56),r6 80036b8: 29 66 00 3c lw r6,(r11+60) 80036bc: 5a 06 00 3c sw (r16+60),r6 api->detachstate = the_attr->detachstate; 80036c0: 29 66 00 3c lw r6,(r11+60) 80036c4: 5a 06 00 40 sw (r16+64),r6 api->schedpolicy = schedpolicy; api->schedparam = schedparam; 80036c8: 2b 86 00 40 lw r6,(sp+64) */ api = the_thread->API_Extensions[ THREAD_API_POSIX ]; api->Attributes = *the_attr; api->detachstate = the_attr->detachstate; api->schedpolicy = schedpolicy; 80036cc: 5a 11 00 84 sw (r16+132),r17 api->schedparam = schedparam; 80036d0: 5a 06 00 88 sw (r16+136),r6 80036d4: 2b 86 00 44 lw r6,(sp+68) 80036d8: 5a 06 00 8c sw (r16+140),r6 80036dc: 2b 86 00 48 lw r6,(sp+72) 80036e0: 5a 06 00 90 sw (r16+144),r6 80036e4: 2b 86 00 4c lw r6,(sp+76) 80036e8: 5a 06 00 94 sw (r16+148),r6 80036ec: 2b 86 00 50 lw r6,(sp+80) 80036f0: 5a 06 00 98 sw (r16+152),r6 80036f4: 2b 86 00 54 lw r6,(sp+84) 80036f8: 5a 06 00 9c sw (r16+156),r6 80036fc: 2b 86 00 58 lw r6,(sp+88) 8003700: 5a 06 00 a0 sw (r16+160),r6 /* * POSIX threads are allocated and started in one operation. */ status = _Thread_Start( 8003704: f8 00 0f c6 calli 800761c <_Thread_Start> _RTEMS_Unlock_allocator(); return EINVAL; } #endif if ( schedpolicy == SCHED_SPORADIC ) { 8003708: 34 01 00 04 mvi r1,4 800370c: 46 21 00 06 be r17,r1,8003724 } /* * Return the id and indicate we successfully created the thread */ *thread = the_thread->Object.id; 8003710: 2a 62 00 08 lw r2,(r19+8) _RTEMS_Unlock_allocator(); 8003714: 2a 41 00 00 lw r1,(r18+0) } /* * Return the id and indicate we successfully created the thread */ *thread = the_thread->Object.id; 8003718: 59 e2 00 00 sw (r15+0),r2 _RTEMS_Unlock_allocator(); 800371c: f8 00 04 e2 calli 8004aa4 <_API_Mutex_Unlock> return 0; 8003720: e3 ff ff 56 bi 8003478 return EINVAL; } #endif if ( schedpolicy == SCHED_SPORADIC ) { _Watchdog_Insert_ticks( 8003724: 36 01 00 90 addi r1,r16,144 8003728: f8 00 10 50 calli 8007868 <_Timespec_To_ticks> Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 800372c: 5a 01 00 b4 sw (r16+180),r1 _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 8003730: 78 01 08 02 mvhi r1,0x802 8003734: 36 02 00 a8 addi r2,r16,168 8003738: 38 21 09 78 ori r1,r1,0x978 800373c: f8 00 11 96 calli 8007d94 <_Watchdog_Insert> 8003740: e3 ff ff f4 bi 8003710 =============================================================================== 0800c72c : void pthread_exit( void *value_ptr ) { 800c72c: 37 9c ff fc addi sp,sp,-4 800c730: 5b 9d 00 04 sw (sp+4),ra _POSIX_Thread_Exit( _Thread_Executing, value_ptr ); 800c734: 78 03 08 01 mvhi r3,0x801 800c738: 38 63 4d b4 ori r3,r3,0x4db4 } void pthread_exit( void *value_ptr ) { 800c73c: b8 20 10 00 mv r2,r1 _POSIX_Thread_Exit( _Thread_Executing, value_ptr ); 800c740: 28 61 00 0c lw r1,(r3+12) 800c744: fb ff ff d4 calli 800c694 <_POSIX_Thread_Exit> } 800c748: 2b 9d 00 04 lw ra,(sp+4) 800c74c: 37 9c 00 04 addi sp,sp,4 <== NOT EXECUTED 800c750: c3 a0 00 00 ret <== NOT EXECUTED =============================================================================== 08005954 : int pthread_mutex_timedlock( pthread_mutex_t *mutex, const struct timespec *abstime ) { 8005954: 37 9c ff f0 addi sp,sp,-16 8005958: 5b 8b 00 0c sw (sp+12),r11 800595c: 5b 8c 00 08 sw (sp+8),r12 8005960: 5b 9d 00 04 sw (sp+4),ra 8005964: b8 20 60 00 mv r12,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 ); 8005968: b8 40 08 00 mv r1,r2 800596c: 37 82 00 10 addi r2,sp,16 8005970: f8 00 00 49 calli 8005a94 <_POSIX_Absolute_timeout_to_ticks> 8005974: b8 20 58 00 mv r11,r1 if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE ) 8005978: 34 01 00 03 mvi r1,3 800597c: 45 61 00 15 be r11,r1,80059d0 do_wait = false; lock_status = _POSIX_Mutex_Lock_support( mutex, do_wait, ticks ); 8005980: 2b 83 00 10 lw r3,(sp+16) 8005984: 34 02 00 00 mvi r2,0 8005988: b9 80 08 00 mv r1,r12 800598c: fb ff ff 9f calli 8005808 <_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) ) { 8005990: 34 02 00 10 mvi r2,16 8005994: 44 22 00 06 be r1,r2,80059ac <== ALWAYS TAKEN status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; } return lock_status; } 8005998: 2b 9d 00 04 lw ra,(sp+4) 800599c: 2b 8b 00 0c lw r11,(sp+12) 80059a0: 2b 8c 00 08 lw r12,(sp+8) 80059a4: 37 9c 00 10 addi sp,sp,16 80059a8: c3 a0 00 00 ret * attempt to lock if the abstime was not in the future. If we did * not obtain the mutex, then not look at the status immediately, * make sure the right reason is returned. */ if ( !do_wait && (lock_status == EBUSY) ) { if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID ) 80059ac: 45 60 00 12 be r11,r0,80059f4 <== NEVER TAKEN return EINVAL; if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST || 80059b0: 35 6b ff ff addi r11,r11,-1 80059b4: 34 02 00 01 mvi r2,1 80059b8: 50 4b 00 11 bgeu r2,r11,80059fc <== ALWAYS TAKEN status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; } return lock_status; } 80059bc: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 80059c0: 2b 8b 00 0c lw r11,(sp+12) <== NOT EXECUTED 80059c4: 2b 8c 00 08 lw r12,(sp+8) <== NOT EXECUTED 80059c8: 37 9c 00 10 addi sp,sp,16 <== NOT EXECUTED 80059cc: c3 a0 00 00 ret <== NOT EXECUTED */ status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks ); if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE ) do_wait = false; lock_status = _POSIX_Mutex_Lock_support( mutex, do_wait, ticks ); 80059d0: 2b 83 00 10 lw r3,(sp+16) 80059d4: b9 80 08 00 mv r1,r12 80059d8: 34 02 00 01 mvi r2,1 80059dc: fb ff ff 8b calli 8005808 <_POSIX_Mutex_Lock_support> status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; } return lock_status; } 80059e0: 2b 9d 00 04 lw ra,(sp+4) 80059e4: 2b 8b 00 0c lw r11,(sp+12) 80059e8: 2b 8c 00 08 lw r12,(sp+8) 80059ec: 37 9c 00 10 addi sp,sp,16 80059f0: c3 a0 00 00 ret * 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; 80059f4: 34 01 00 16 mvi r1,22 <== NOT EXECUTED 80059f8: e3 ff ff e8 bi 8005998 <== NOT EXECUTED if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST || status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; 80059fc: 34 01 00 74 mvi r1,116 8005a00: e3 ff ff e6 bi 8005998 =============================================================================== 08002b88 : const pthread_mutexattr_t *attr, int *type ) { if ( !attr ) return EINVAL; 8002b88: 34 03 00 16 mvi r3,22 int pthread_mutexattr_gettype( const pthread_mutexattr_t *attr, int *type ) { if ( !attr ) 8002b8c: 44 20 00 07 be r1,r0,8002ba8 return EINVAL; if ( !attr->is_initialized ) 8002b90: 28 24 00 00 lw r4,(r1+0) 8002b94: 44 80 00 05 be r4,r0,8002ba8 return EINVAL; if ( !type ) 8002b98: 44 40 00 04 be r2,r0,8002ba8 <== NEVER TAKEN return EINVAL; *type = attr->type; 8002b9c: 28 21 00 10 lw r1,(r1+16) return 0; 8002ba0: 34 03 00 00 mvi r3,0 return EINVAL; if ( !type ) return EINVAL; *type = attr->type; 8002ba4: 58 41 00 00 sw (r2+0),r1 return 0; } 8002ba8: b8 60 08 00 mv r1,r3 8002bac: c3 a0 00 00 ret =============================================================================== 0800543c : pthread_mutexattr_t *attr, int pshared ) { if ( !attr || !attr->is_initialized ) return EINVAL; 800543c: 34 03 00 16 mvi r3,22 int pthread_mutexattr_setpshared( pthread_mutexattr_t *attr, int pshared ) { if ( !attr || !attr->is_initialized ) 8005440: 44 20 00 07 be r1,r0,800545c 8005444: 28 24 00 00 lw r4,(r1+0) 8005448: 44 80 00 05 be r4,r0,800545c return EINVAL; switch ( pshared ) { 800544c: 34 04 00 01 mvi r4,1 8005450: 54 44 00 03 bgu r2,r4,800545c <== NEVER TAKEN case PTHREAD_PROCESS_SHARED: case PTHREAD_PROCESS_PRIVATE: attr->process_shared = pshared; 8005454: 58 22 00 04 sw (r1+4),r2 return 0; 8005458: 34 03 00 00 mvi r3,0 default: return EINVAL; } } 800545c: b8 60 08 00 mv r1,r3 8005460: c3 a0 00 00 ret =============================================================================== 08002bfc : pthread_mutexattr_t *attr, int type ) { if ( !attr || !attr->is_initialized ) return EINVAL; 8002bfc: 34 03 00 16 mvi r3,22 int pthread_mutexattr_settype( pthread_mutexattr_t *attr, int type ) { if ( !attr || !attr->is_initialized ) 8002c00: 44 20 00 07 be r1,r0,8002c1c 8002c04: 28 24 00 00 lw r4,(r1+0) 8002c08: 44 80 00 05 be r4,r0,8002c1c <== NEVER TAKEN return EINVAL; switch ( type ) { 8002c0c: 34 04 00 03 mvi r4,3 8002c10: 54 44 00 03 bgu r2,r4,8002c1c case PTHREAD_MUTEX_NORMAL: case PTHREAD_MUTEX_RECURSIVE: case PTHREAD_MUTEX_ERRORCHECK: case PTHREAD_MUTEX_DEFAULT: attr->type = type; 8002c14: 58 22 00 10 sw (r1+16),r2 return 0; 8002c18: 34 03 00 00 mvi r3,0 default: return EINVAL; } } 8002c1c: b8 60 08 00 mv r1,r3 8002c20: c3 a0 00 00 ret =============================================================================== 08003c5c : int pthread_once( pthread_once_t *once_control, void (*init_routine)(void) ) { 8003c5c: 37 9c ff ec addi sp,sp,-20 8003c60: 5b 8b 00 10 sw (sp+16),r11 8003c64: 5b 8c 00 0c sw (sp+12),r12 8003c68: 5b 8d 00 08 sw (sp+8),r13 8003c6c: 5b 9d 00 04 sw (sp+4),ra if ( !once_control || !init_routine ) 8003c70: 64 43 00 00 cmpei r3,r2,0 int pthread_once( pthread_once_t *once_control, void (*init_routine)(void) ) { 8003c74: b8 40 60 00 mv r12,r2 if ( !once_control || !init_routine ) 8003c78: 64 22 00 00 cmpei r2,r1,0 int pthread_once( pthread_once_t *once_control, void (*init_routine)(void) ) { 8003c7c: b8 20 58 00 mv r11,r1 if ( !once_control || !init_routine ) 8003c80: b8 62 18 00 or r3,r3,r2 return EINVAL; 8003c84: 34 01 00 16 mvi r1,22 int pthread_once( pthread_once_t *once_control, void (*init_routine)(void) ) { if ( !once_control || !init_routine ) 8003c88: 5c 60 00 04 bne r3,r0,8003c98 return EINVAL; if ( !once_control->init_executed ) { 8003c8c: 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; 8003c90: 34 01 00 00 mvi r1,0 ) { if ( !once_control || !init_routine ) return EINVAL; if ( !once_control->init_executed ) { 8003c94: 45 a3 00 07 be r13,r3,8003cb0 (*init_routine)(); } rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); } return 0; } 8003c98: 2b 9d 00 04 lw ra,(sp+4) 8003c9c: 2b 8b 00 10 lw r11,(sp+16) 8003ca0: 2b 8c 00 0c lw r12,(sp+12) 8003ca4: 2b 8d 00 08 lw r13,(sp+8) 8003ca8: 37 9c 00 14 addi sp,sp,20 8003cac: c3 a0 00 00 ret if ( !once_control || !init_routine ) return EINVAL; if ( !once_control->init_executed ) { rtems_mode saveMode; rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode); 8003cb0: 34 01 01 00 mvi r1,256 8003cb4: 34 02 01 00 mvi r2,256 8003cb8: 37 83 00 14 addi r3,sp,20 8003cbc: f8 00 01 ab calli 8004368 if ( !once_control->init_executed ) { 8003cc0: 29 61 00 04 lw r1,(r11+4) 8003cc4: 44 2d 00 0c be r1,r13,8003cf4 <== ALWAYS TAKEN once_control->is_initialized = true; once_control->init_executed = true; (*init_routine)(); } rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); 8003cc8: 2b 81 00 14 lw r1,(sp+20) 8003ccc: 34 02 01 00 mvi r2,256 8003cd0: 37 83 00 14 addi r3,sp,20 8003cd4: f8 00 01 a5 calli 8004368 } return 0; 8003cd8: 34 01 00 00 mvi r1,0 } 8003cdc: 2b 9d 00 04 lw ra,(sp+4) 8003ce0: 2b 8b 00 10 lw r11,(sp+16) 8003ce4: 2b 8c 00 0c lw r12,(sp+12) 8003ce8: 2b 8d 00 08 lw r13,(sp+8) 8003cec: 37 9c 00 14 addi sp,sp,20 8003cf0: c3 a0 00 00 ret if ( !once_control->init_executed ) { rtems_mode saveMode; rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode); if ( !once_control->init_executed ) { once_control->is_initialized = true; 8003cf4: 34 01 00 01 mvi r1,1 8003cf8: 59 61 00 00 sw (r11+0),r1 once_control->init_executed = true; 8003cfc: 59 61 00 04 sw (r11+4),r1 (*init_routine)(); 8003d00: d9 80 00 00 call r12 8003d04: e3 ff ff f1 bi 8003cc8 =============================================================================== 0800452c : int pthread_rwlock_init( pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr ) { 800452c: 37 9c ff e0 addi sp,sp,-32 8004530: 5b 8b 00 14 sw (sp+20),r11 8004534: 5b 8c 00 10 sw (sp+16),r12 8004538: 5b 8d 00 0c sw (sp+12),r13 800453c: 5b 8e 00 08 sw (sp+8),r14 8004540: 5b 9d 00 04 sw (sp+4),ra 8004544: b8 20 58 00 mv r11,r1 /* * Error check parameters */ if ( !rwlock ) return EINVAL; 8004548: 34 01 00 16 mvi r1,22 const pthread_rwlockattr_t *the_attr; /* * Error check parameters */ if ( !rwlock ) 800454c: 45 60 00 07 be r11,r0,8004568 return EINVAL; /* * If the user passed in NULL, use the default attributes */ if ( attr ) { 8004550: 44 40 00 31 be r2,r0,8004614 } /* * Now start error checking the attributes that we are going to use */ if ( !the_attr->is_initialized ) 8004554: 28 43 00 00 lw r3,(r2+0) return EINVAL; 8004558: 34 01 00 16 mvi r1,22 } /* * Now start error checking the attributes that we are going to use */ if ( !the_attr->is_initialized ) 800455c: 44 60 00 03 be r3,r0,8004568 <== NEVER TAKEN return EINVAL; switch ( the_attr->process_shared ) { 8004560: 28 4e 00 04 lw r14,(r2+4) 8004564: 45 c0 00 08 be r14,r0,8004584 <== ALWAYS TAKEN *rwlock = the_rwlock->Object.id; _Thread_Enable_dispatch(); return 0; } 8004568: 2b 9d 00 04 lw ra,(sp+4) 800456c: 2b 8b 00 14 lw r11,(sp+20) 8004570: 2b 8c 00 10 lw r12,(sp+16) 8004574: 2b 8d 00 0c lw r13,(sp+12) 8004578: 2b 8e 00 08 lw r14,(sp+8) 800457c: 37 9c 00 20 addi sp,sp,32 8004580: c3 a0 00 00 ret rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 8004584: 78 01 08 01 mvhi r1,0x801 8004588: 38 21 98 a8 ori r1,r1,0x98a8 800458c: 28 22 00 00 lw r2,(r1+0) */ RTEMS_INLINE_ROUTINE void _CORE_RWLock_Initialize_attributes( CORE_RWLock_Attributes *the_attributes ) { the_attributes->XXX = 0; 8004590: 5b 80 00 20 sw (sp+32),r0 8004594: 34 42 00 01 addi r2,r2,1 8004598: 58 22 00 00 sw (r1+0),r2 * 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 ); 800459c: 78 0d 08 01 mvhi r13,0x801 80045a0: 39 ad 9a 3c ori r13,r13,0x9a3c 80045a4: b9 a0 08 00 mv r1,r13 80045a8: f8 00 0a 14 calli 8006df8 <_Objects_Allocate> 80045ac: b8 20 60 00 mv r12,r1 */ _Thread_Disable_dispatch(); /* prevents deletion */ the_rwlock = _POSIX_RWLock_Allocate(); if ( !the_rwlock ) { 80045b0: 44 2e 00 16 be r1,r14,8004608 _Thread_Enable_dispatch(); return EAGAIN; } _CORE_RWLock_Initialize( &the_rwlock->RWLock, &the_attributes ); 80045b4: 37 82 00 20 addi r2,sp,32 80045b8: 34 21 00 10 addi r1,r1,16 80045bc: f8 00 07 29 calli 8006260 <_CORE_RWLock_Initialize> uint32_t name ) { _Objects_Set_local_object( information, _Objects_Get_index( the_object->id ), 80045c0: 29 82 00 08 lw r2,(r12+8) #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 80045c4: 29 a3 00 1c lw r3,(r13+28) Objects_Information *information, Objects_Control *the_object, uint32_t name ) { _Objects_Set_local_object( 80045c8: 20 41 ff ff andi r1,r2,0xffff #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 80045cc: b4 21 08 00 add r1,r1,r1 80045d0: b4 21 08 00 add r1,r1,r1 80045d4: b4 61 08 00 add r1,r3,r1 80045d8: 58 2c 00 00 sw (r1+0),r12 _Objects_Get_index( the_object->id ), the_object ); /* ASSERT: information->is_string == false */ the_object->name.name_u32 = name; 80045dc: 59 80 00 0c sw (r12+12),r0 &_POSIX_RWLock_Information, &the_rwlock->Object, 0 ); *rwlock = the_rwlock->Object.id; 80045e0: 59 62 00 00 sw (r11+0),r2 _Thread_Enable_dispatch(); 80045e4: f8 00 0e 8f calli 8008020 <_Thread_Enable_dispatch> return 0; 80045e8: 34 01 00 00 mvi r1,0 } 80045ec: 2b 9d 00 04 lw ra,(sp+4) 80045f0: 2b 8b 00 14 lw r11,(sp+20) 80045f4: 2b 8c 00 10 lw r12,(sp+16) 80045f8: 2b 8d 00 0c lw r13,(sp+12) 80045fc: 2b 8e 00 08 lw r14,(sp+8) 8004600: 37 9c 00 20 addi sp,sp,32 8004604: c3 a0 00 00 ret _Thread_Disable_dispatch(); /* prevents deletion */ the_rwlock = _POSIX_RWLock_Allocate(); if ( !the_rwlock ) { _Thread_Enable_dispatch(); 8004608: f8 00 0e 86 calli 8008020 <_Thread_Enable_dispatch> return EAGAIN; 800460c: 34 01 00 0b mvi r1,11 8004610: e3 ff ff d6 bi 8004568 * If the user passed in NULL, use the default attributes */ if ( attr ) { the_attr = attr; } else { (void) pthread_rwlockattr_init( &default_attr ); 8004614: 37 8c 00 18 addi r12,sp,24 8004618: b9 80 08 00 mv r1,r12 800461c: f8 00 02 ee calli 80051d4 the_attr = &default_attr; 8004620: b9 80 10 00 mv r2,r12 8004624: e3 ff ff cc bi 8004554 =============================================================================== 080046ac : int pthread_rwlock_timedrdlock( pthread_rwlock_t *rwlock, const struct timespec *abstime ) { 80046ac: 37 9c ff e0 addi sp,sp,-32 80046b0: 5b 8b 00 18 sw (sp+24),r11 80046b4: 5b 8c 00 14 sw (sp+20),r12 80046b8: 5b 8d 00 10 sw (sp+16),r13 80046bc: 5b 8e 00 0c sw (sp+12),r14 80046c0: 5b 8f 00 08 sw (sp+8),r15 80046c4: 5b 9d 00 04 sw (sp+4),ra 80046c8: b8 20 58 00 mv r11,r1 Watchdog_Interval ticks; bool do_wait = true; POSIX_Absolute_timeout_conversion_results_t status; if ( !rwlock ) return EINVAL; 80046cc: 34 0c 00 16 mvi r12,22 int pthread_rwlock_timedrdlock( pthread_rwlock_t *rwlock, const struct timespec *abstime ) { 80046d0: 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 ) 80046d4: 45 60 00 0c be r11,r0,8004704 * * 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 ); 80046d8: 37 82 00 1c addi r2,sp,28 80046dc: f8 00 1c ef calli 800ba98 <_POSIX_Absolute_timeout_to_ticks> 80046e0: 78 03 08 01 mvhi r3,0x801 80046e4: 29 62 00 00 lw r2,(r11+0) 80046e8: b8 20 70 00 mv r14,r1 80046ec: b8 60 08 00 mv r1,r3 80046f0: 38 21 9a 3c ori r1,r1,0x9a3c 80046f4: 37 83 00 20 addi r3,sp,32 80046f8: f8 00 0b 12 calli 8007340 <_Objects_Get> if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE ) do_wait = false; the_rwlock = _POSIX_RWLock_Get( rwlock, &location ); switch ( location ) { 80046fc: 2b 8d 00 20 lw r13,(sp+32) 8004700: 45 a0 00 0a be r13,r0,8004728 case OBJECTS_ERROR: break; } return EINVAL; } 8004704: b9 80 08 00 mv r1,r12 8004708: 2b 9d 00 04 lw ra,(sp+4) 800470c: 2b 8b 00 18 lw r11,(sp+24) 8004710: 2b 8c 00 14 lw r12,(sp+20) 8004714: 2b 8d 00 10 lw r13,(sp+16) 8004718: 2b 8e 00 0c lw r14,(sp+12) 800471c: 2b 8f 00 08 lw r15,(sp+8) 8004720: 37 9c 00 20 addi sp,sp,32 8004724: c3 a0 00 00 ret 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, 8004728: 65 cf 00 03 cmpei r15,r14,3 the_rwlock = _POSIX_RWLock_Get( rwlock, &location ); switch ( location ) { case OBJECTS_LOCAL: _CORE_RWLock_Obtain_for_reading( 800472c: 29 62 00 00 lw r2,(r11+0) 8004730: 2b 84 00 1c lw r4,(sp+28) 8004734: 34 21 00 10 addi r1,r1,16 8004738: b9 e0 18 00 mv r3,r15 800473c: 34 05 00 00 mvi r5,0 8004740: f8 00 06 d5 calli 8006294 <_CORE_RWLock_Obtain_for_reading> do_wait, ticks, NULL ); _Thread_Enable_dispatch(); 8004744: f8 00 0e 37 calli 8008020 <_Thread_Enable_dispatch> if ( !do_wait ) { 8004748: 5d ed 00 10 bne r15,r13,8004788 if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) { 800474c: 78 01 08 01 mvhi r1,0x801 8004750: 38 21 9d 74 ori r1,r1,0x9d74 8004754: 28 21 00 0c lw r1,(r1+12) 8004758: 34 02 00 02 mvi r2,2 800475c: 28 21 00 34 lw r1,(r1+52) 8004760: 44 22 00 04 be r1,r2,8004770 status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; } } return _POSIX_RWLock_Translate_core_RWLock_return_code( 8004764: f8 00 00 4a calli 800488c <_POSIX_RWLock_Translate_core_RWLock_return_code> 8004768: b8 20 60 00 mv r12,r1 800476c: e3 ff ff e6 bi 8004704 ); _Thread_Enable_dispatch(); if ( !do_wait ) { if ( _Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE ) { if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID ) 8004770: 45 cf ff e5 be r14,r15,8004704 <== NEVER TAKEN return EINVAL; if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST || 8004774: 35 ce ff ff addi r14,r14,-1 8004778: 34 02 00 01 mvi r2,1 status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; 800477c: 34 0c 00 74 mvi r12,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 || 8004780: 50 4e ff e1 bgeu r2,r14,8004704 <== ALWAYS TAKEN 8004784: e3 ff ff f8 bi 8004764 <== NOT EXECUTED ticks, NULL ); _Thread_Enable_dispatch(); if ( !do_wait ) { 8004788: 78 01 08 01 mvhi r1,0x801 800478c: 38 21 9d 74 ori r1,r1,0x9d74 8004790: 28 21 00 0c lw r1,(r1+12) 8004794: 28 21 00 34 lw r1,(r1+52) 8004798: e3 ff ff f3 bi 8004764 =============================================================================== 0800479c : int pthread_rwlock_timedwrlock( pthread_rwlock_t *rwlock, const struct timespec *abstime ) { 800479c: 37 9c ff e0 addi sp,sp,-32 80047a0: 5b 8b 00 18 sw (sp+24),r11 80047a4: 5b 8c 00 14 sw (sp+20),r12 80047a8: 5b 8d 00 10 sw (sp+16),r13 80047ac: 5b 8e 00 0c sw (sp+12),r14 80047b0: 5b 8f 00 08 sw (sp+8),r15 80047b4: 5b 9d 00 04 sw (sp+4),ra 80047b8: b8 20 58 00 mv r11,r1 Watchdog_Interval ticks; bool do_wait = true; POSIX_Absolute_timeout_conversion_results_t status; if ( !rwlock ) return EINVAL; 80047bc: 34 0c 00 16 mvi r12,22 int pthread_rwlock_timedwrlock( pthread_rwlock_t *rwlock, const struct timespec *abstime ) { 80047c0: 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 ) 80047c4: 45 60 00 0c be r11,r0,80047f4 * * 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 ); 80047c8: 37 82 00 1c addi r2,sp,28 80047cc: f8 00 1c b3 calli 800ba98 <_POSIX_Absolute_timeout_to_ticks> 80047d0: 78 03 08 01 mvhi r3,0x801 80047d4: 29 62 00 00 lw r2,(r11+0) 80047d8: b8 20 70 00 mv r14,r1 80047dc: b8 60 08 00 mv r1,r3 80047e0: 38 21 9a 3c ori r1,r1,0x9a3c 80047e4: 37 83 00 20 addi r3,sp,32 80047e8: f8 00 0a d6 calli 8007340 <_Objects_Get> if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE ) do_wait = false; the_rwlock = _POSIX_RWLock_Get( rwlock, &location ); switch ( location ) { 80047ec: 2b 8d 00 20 lw r13,(sp+32) 80047f0: 45 a0 00 0a be r13,r0,8004818 case OBJECTS_ERROR: break; } return EINVAL; } 80047f4: b9 80 08 00 mv r1,r12 80047f8: 2b 9d 00 04 lw ra,(sp+4) 80047fc: 2b 8b 00 18 lw r11,(sp+24) 8004800: 2b 8c 00 14 lw r12,(sp+20) 8004804: 2b 8d 00 10 lw r13,(sp+16) 8004808: 2b 8e 00 0c lw r14,(sp+12) 800480c: 2b 8f 00 08 lw r15,(sp+8) 8004810: 37 9c 00 20 addi sp,sp,32 8004814: c3 a0 00 00 ret (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, 8004818: 65 cf 00 03 cmpei r15,r14,3 the_rwlock = _POSIX_RWLock_Get( rwlock, &location ); switch ( location ) { case OBJECTS_LOCAL: _CORE_RWLock_Obtain_for_writing( 800481c: 29 62 00 00 lw r2,(r11+0) 8004820: 2b 84 00 1c lw r4,(sp+28) 8004824: 34 21 00 10 addi r1,r1,16 8004828: b9 e0 18 00 mv r3,r15 800482c: 34 05 00 00 mvi r5,0 8004830: f8 00 06 e5 calli 80063c4 <_CORE_RWLock_Obtain_for_writing> do_wait, ticks, NULL ); _Thread_Enable_dispatch(); 8004834: f8 00 0d fb calli 8008020 <_Thread_Enable_dispatch> if ( !do_wait && 8004838: 5d ed 00 10 bne r15,r13,8004878 (_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) { 800483c: 78 01 08 01 mvhi r1,0x801 8004840: 38 21 9d 74 ori r1,r1,0x9d74 8004844: 28 21 00 0c lw r1,(r1+12) ticks, NULL ); _Thread_Enable_dispatch(); if ( !do_wait && 8004848: 34 02 00 02 mvi r2,2 (_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) { 800484c: 28 21 00 34 lw r1,(r1+52) ticks, NULL ); _Thread_Enable_dispatch(); if ( !do_wait && 8004850: 44 22 00 04 be r1,r2,8004860 if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST || status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; } return _POSIX_RWLock_Translate_core_RWLock_return_code( 8004854: f8 00 00 0e calli 800488c <_POSIX_RWLock_Translate_core_RWLock_return_code> 8004858: b8 20 60 00 mv r12,r1 800485c: e3 ff ff e6 bi 80047f4 ); _Thread_Enable_dispatch(); if ( !do_wait && (_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) { if ( status == POSIX_ABSOLUTE_TIMEOUT_INVALID ) 8004860: 45 cf ff e5 be r14,r15,80047f4 <== NEVER TAKEN return EINVAL; if ( status == POSIX_ABSOLUTE_TIMEOUT_IS_IN_PAST || 8004864: 35 ce ff ff addi r14,r14,-1 8004868: 34 02 00 01 mvi r2,1 status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) return ETIMEDOUT; 800486c: 34 0c 00 74 mvi r12,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 || 8004870: 50 4e ff e1 bgeu r2,r14,80047f4 <== ALWAYS TAKEN 8004874: e3 ff ff f8 bi 8004854 <== NOT EXECUTED ticks, NULL ); _Thread_Enable_dispatch(); if ( !do_wait && 8004878: 78 01 08 01 mvhi r1,0x801 800487c: 38 21 9d 74 ori r1,r1,0x9d74 8004880: 28 21 00 0c lw r1,(r1+12) 8004884: 28 21 00 34 lw r1,(r1+52) 8004888: e3 ff ff f3 bi 8004854 =============================================================================== 080051f4 : pthread_rwlockattr_t *attr, int pshared ) { if ( !attr ) return EINVAL; 80051f4: 34 03 00 16 mvi r3,22 int pthread_rwlockattr_setpshared( pthread_rwlockattr_t *attr, int pshared ) { if ( !attr ) 80051f8: 44 20 00 07 be r1,r0,8005214 return EINVAL; if ( !attr->is_initialized ) 80051fc: 28 24 00 00 lw r4,(r1+0) 8005200: 44 80 00 05 be r4,r0,8005214 return EINVAL; switch ( pshared ) { 8005204: 34 04 00 01 mvi r4,1 8005208: 54 44 00 03 bgu r2,r4,8005214 <== NEVER TAKEN case PTHREAD_PROCESS_SHARED: case PTHREAD_PROCESS_PRIVATE: attr->process_shared = pshared; 800520c: 58 22 00 04 sw (r1+4),r2 return 0; 8005210: 34 03 00 00 mvi r3,0 default: return EINVAL; } } 8005214: b8 60 08 00 mv r1,r3 8005218: c3 a0 00 00 ret =============================================================================== 080064dc : int pthread_setschedparam( pthread_t thread, int policy, struct sched_param *param ) { 80064dc: 37 9c ff dc addi sp,sp,-36 80064e0: 5b 8b 00 18 sw (sp+24),r11 80064e4: 5b 8c 00 14 sw (sp+20),r12 80064e8: 5b 8d 00 10 sw (sp+16),r13 80064ec: 5b 8e 00 0c sw (sp+12),r14 80064f0: 5b 8f 00 08 sw (sp+8),r15 80064f4: 5b 9d 00 04 sw (sp+4),ra /* * Check all the parameters */ if ( !param ) return EINVAL; 80064f8: 34 0c 00 16 mvi r12,22 int pthread_setschedparam( pthread_t thread, int policy, struct sched_param *param ) { 80064fc: b8 60 58 00 mv r11,r3 8006500: b8 20 68 00 mv r13,r1 8006504: b8 40 70 00 mv r14,r2 int rc; /* * Check all the parameters */ if ( !param ) 8006508: 44 60 00 08 be r3,r0,8006528 return EINVAL; rc = _POSIX_Thread_Translate_sched_param( 800650c: b8 40 08 00 mv r1,r2 8006510: 37 84 00 20 addi r4,sp,32 8006514: b8 60 10 00 mv r2,r3 8006518: 37 83 00 24 addi r3,sp,36 800651c: f8 00 1a 89 calli 800cf40 <_POSIX_Thread_Translate_sched_param> 8006520: b8 20 60 00 mv r12,r1 policy, param, &budget_algorithm, &budget_callout ); if ( rc ) 8006524: 44 20 00 0a be r1,r0,800654c case OBJECTS_ERROR: break; } return ESRCH; } 8006528: b9 80 08 00 mv r1,r12 800652c: 2b 9d 00 04 lw ra,(sp+4) 8006530: 2b 8b 00 18 lw r11,(sp+24) 8006534: 2b 8c 00 14 lw r12,(sp+20) 8006538: 2b 8d 00 10 lw r13,(sp+16) 800653c: 2b 8e 00 0c lw r14,(sp+12) 8006540: 2b 8f 00 08 lw r15,(sp+8) 8006544: 37 9c 00 24 addi sp,sp,36 8006548: c3 a0 00 00 ret 800654c: 78 01 08 01 mvhi r1,0x801 8006550: 38 21 aa cc ori r1,r1,0xaacc 8006554: b9 a0 10 00 mv r2,r13 8006558: 37 83 00 1c addi r3,sp,28 800655c: f8 00 07 be calli 8008454 <_Objects_Get> 8006560: b8 20 78 00 mv r15,r1 /* * Actually change the scheduling policy and parameters */ the_thread = _POSIX_Threads_Get( thread, &location ); switch ( location ) { 8006564: 2b 81 00 1c lw r1,(sp+28) 8006568: 44 2c 00 03 be r1,r12,8006574 #endif case OBJECTS_ERROR: break; } return ESRCH; 800656c: 34 0c 00 03 mvi r12,3 8006570: e3 ff ff ee bi 8006528 */ the_thread = _POSIX_Threads_Get( thread, &location ); switch ( location ) { case OBJECTS_LOCAL: api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 8006574: 29 ed 01 20 lw r13,(r15+288) if ( api->schedpolicy == SCHED_SPORADIC ) 8006578: 34 01 00 04 mvi r1,4 800657c: 29 a2 00 84 lw r2,(r13+132) 8006580: 44 41 00 31 be r2,r1,8006644 (void) _Watchdog_Remove( &api->Sporadic_timer ); api->schedpolicy = policy; 8006584: 59 ae 00 84 sw (r13+132),r14 api->schedparam = *param; 8006588: 29 62 00 00 lw r2,(r11+0) 800658c: 59 a2 00 88 sw (r13+136),r2 8006590: 29 61 00 04 lw r1,(r11+4) 8006594: 59 a1 00 8c sw (r13+140),r1 8006598: 29 61 00 08 lw r1,(r11+8) 800659c: 59 a1 00 90 sw (r13+144),r1 80065a0: 29 61 00 0c lw r1,(r11+12) 80065a4: 59 a1 00 94 sw (r13+148),r1 80065a8: 29 61 00 10 lw r1,(r11+16) 80065ac: 59 a1 00 98 sw (r13+152),r1 80065b0: 29 61 00 14 lw r1,(r11+20) 80065b4: 59 a1 00 9c sw (r13+156),r1 80065b8: 29 61 00 18 lw r1,(r11+24) 80065bc: 59 a1 00 a0 sw (r13+160),r1 the_thread->budget_algorithm = budget_algorithm; 80065c0: 2b 81 00 24 lw r1,(sp+36) 80065c4: 59 e1 00 7c sw (r15+124),r1 the_thread->budget_callout = budget_callout; 80065c8: 2b 81 00 20 lw r1,(sp+32) 80065cc: 59 e1 00 80 sw (r15+128),r1 switch ( api->schedpolicy ) { 80065d0: 48 0e 00 05 bg r0,r14,80065e4 <== NEVER TAKEN 80065d4: 34 01 00 02 mvi r1,2 80065d8: 4c 2e 00 0d bge r1,r14,800660c 80065dc: 34 01 00 04 mvi r1,4 80065e0: 45 c1 00 03 be r14,r1,80065ec <== ALWAYS TAKEN _Watchdog_Remove( &api->Sporadic_timer ); _POSIX_Threads_Sporadic_budget_TSR( 0, the_thread ); break; } _Thread_Enable_dispatch(); 80065e4: f8 00 0b 0c calli 8009214 <_Thread_Enable_dispatch> <== NOT EXECUTED return 0; 80065e8: e3 ff ff d0 bi 8006528 <== NOT EXECUTED true ); break; case SCHED_SPORADIC: api->ss_high_priority = api->schedparam.sched_priority; 80065ec: 59 a2 00 a4 sw (r13+164),r2 _Watchdog_Remove( &api->Sporadic_timer ); 80065f0: 35 a1 00 a8 addi r1,r13,168 80065f4: f8 00 10 78 calli 800a7d4 <_Watchdog_Remove> _POSIX_Threads_Sporadic_budget_TSR( 0, the_thread ); 80065f8: 34 01 00 00 mvi r1,0 80065fc: b9 e0 10 00 mv r2,r15 8006600: fb ff ff 66 calli 8006398 <_POSIX_Threads_Sporadic_budget_TSR> break; } _Thread_Enable_dispatch(); 8006604: f8 00 0b 04 calli 8009214 <_Thread_Enable_dispatch> 8006608: e3 ff ff c8 bi 8006528 800660c: 78 03 08 01 mvhi r3,0x801 8006610: 38 63 a0 e4 ori r3,r3,0xa0e4 switch ( api->schedpolicy ) { case SCHED_OTHER: case SCHED_FIFO: case SCHED_RR: the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice; 8006614: 78 01 08 01 mvhi r1,0x801 8006618: 38 21 a8 90 ori r1,r1,0xa890 800661c: 40 63 00 00 lbu r3,(r3+0) 8006620: 28 24 00 00 lw r4,(r1+0) the_thread->real_priority = _POSIX_Priority_To_core( api->schedparam.sched_priority ); _Thread_Change_priority( 8006624: b9 e0 08 00 mv r1,r15 8006628: c8 62 10 00 sub r2,r3,r2 switch ( api->schedpolicy ) { case SCHED_OTHER: case SCHED_FIFO: case SCHED_RR: the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice; 800662c: 59 e4 00 78 sw (r15+120),r4 the_thread->real_priority = 8006630: 59 e2 00 18 sw (r15+24),r2 _POSIX_Priority_To_core( api->schedparam.sched_priority ); _Thread_Change_priority( 8006634: 34 03 00 01 mvi r3,1 8006638: f8 00 09 98 calli 8008c98 <_Thread_Change_priority> _Watchdog_Remove( &api->Sporadic_timer ); _POSIX_Threads_Sporadic_budget_TSR( 0, the_thread ); break; } _Thread_Enable_dispatch(); 800663c: f8 00 0a f6 calli 8009214 <_Thread_Enable_dispatch> 8006640: e3 ff ff ba bi 8006528 case OBJECTS_LOCAL: api = the_thread->API_Extensions[ THREAD_API_POSIX ]; if ( api->schedpolicy == SCHED_SPORADIC ) (void) _Watchdog_Remove( &api->Sporadic_timer ); 8006644: 35 a1 00 a8 addi r1,r13,168 8006648: f8 00 10 63 calli 800a7d4 <_Watchdog_Remove> 800664c: e3 ff ff ce bi 8006584 =============================================================================== 08003934 : * * 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183 */ void pthread_testcancel( void ) { 8003934: 37 9c ff f8 addi sp,sp,-8 8003938: 5b 8b 00 08 sw (sp+8),r11 800393c: 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() ) 8003940: 78 0b 08 01 mvhi r11,0x801 8003944: 39 6b 6d 5c ori r11,r11,0x6d5c 8003948: 29 62 00 08 lw r2,(r11+8) 800394c: 5c 40 00 10 bne r2,r0,800398c <== NEVER TAKEN 8003950: 78 01 08 01 mvhi r1,0x801 8003954: 38 21 68 90 ori r1,r1,0x6890 8003958: 28 24 00 00 lw r4,(r1+0) return; thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; 800395c: 29 63 00 0c lw r3,(r11+12) 8003960: 34 84 00 01 addi r4,r4,1 8003964: 28 63 01 20 lw r3,(r3+288) 8003968: 58 24 00 00 sw (r1+0),r4 _Thread_Disable_dispatch(); if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE && 800396c: 28 61 00 d8 lw r1,(r3+216) 8003970: 5c 22 00 0b bne r1,r2,800399c <== NEVER TAKEN 8003974: 28 62 00 e0 lw r2,(r3+224) 8003978: 44 41 00 09 be r2,r1,800399c thread_support->cancelation_requested ) cancel = true; _Thread_Enable_dispatch(); 800397c: f8 00 0a 35 calli 8006250 <_Thread_Enable_dispatch> if ( cancel ) _POSIX_Thread_Exit( _Thread_Executing, PTHREAD_CANCELED ); 8003980: 29 61 00 0c lw r1,(r11+12) 8003984: 34 02 ff ff mvi r2,-1 8003988: f8 00 19 a2 calli 800a010 <_POSIX_Thread_Exit> } 800398c: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 8003990: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED 8003994: 37 9c 00 08 addi sp,sp,8 <== NOT EXECUTED 8003998: c3 a0 00 00 ret <== NOT EXECUTED _Thread_Disable_dispatch(); if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE && thread_support->cancelation_requested ) cancel = true; _Thread_Enable_dispatch(); 800399c: f8 00 0a 2d calli 8006250 <_Thread_Enable_dispatch> if ( cancel ) _POSIX_Thread_Exit( _Thread_Executing, PTHREAD_CANCELED ); } 80039a0: 2b 9d 00 04 lw ra,(sp+4) 80039a4: 2b 8b 00 08 lw r11,(sp+8) 80039a8: 37 9c 00 08 addi sp,sp,8 80039ac: c3 a0 00 00 ret =============================================================================== 0801296c : ssize_t read( int fd, void *buffer, size_t count ) { 801296c: 37 9c ff f4 addi sp,sp,-12 8012970: 5b 8b 00 0c sw (sp+12),r11 8012974: 5b 8c 00 08 sw (sp+8),r12 8012978: 5b 9d 00 04 sw (sp+4),ra ssize_t rc; rtems_libio_t *iop; rtems_libio_check_fd( fd ); 801297c: 78 04 08 01 mvhi r4,0x801 8012980: 38 84 40 10 ori r4,r4,0x4010 8012984: 28 84 00 00 lw r4,(r4+0) 8012988: 54 81 00 06 bgu r4,r1,80129a0 <== ALWAYS TAKEN iop = rtems_libio_iop( fd ); rtems_libio_check_is_open( iop ); 801298c: fb ff e9 12 calli 800cdd4 <__errno> 8012990: 34 02 00 09 mvi r2,9 8012994: 58 22 00 00 sw (r1+0),r2 8012998: 34 0c ff ff mvi r12,-1 801299c: e0 00 00 23 bi 8012a28 { ssize_t rc; rtems_libio_t *iop; rtems_libio_check_fd( fd ); iop = rtems_libio_iop( fd ); 80129a0: b4 21 08 00 add r1,r1,r1 80129a4: 78 04 08 01 mvhi r4,0x801 80129a8: b4 21 08 00 add r1,r1,r1 80129ac: 38 84 47 6c ori r4,r4,0x476c 80129b0: b4 21 08 00 add r1,r1,r1 80129b4: 28 8b 00 00 lw r11,(r4+0) 80129b8: b4 21 08 00 add r1,r1,r1 80129bc: b4 21 08 00 add r1,r1,r1 80129c0: b4 21 08 00 add r1,r1,r1 80129c4: b5 61 58 00 add r11,r11,r1 rtems_libio_check_is_open( iop ); 80129c8: 29 61 00 18 lw r1,(r11+24) 80129cc: 20 24 01 00 andi r4,r1,0x100 80129d0: 44 80 ff ef be r4,r0,801298c rtems_libio_check_buffer( buffer ); 80129d4: 44 40 00 1b be r2,r0,8012a40 <== NEVER TAKEN rtems_libio_check_count( count ); 80129d8: 34 0c 00 00 mvi r12,0 80129dc: 44 60 00 13 be r3,r0,8012a28 rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ ); 80129e0: 20 21 00 02 andi r1,r1,0x2 80129e4: 44 20 00 17 be r1,r0,8012a40 /* * Now process the read(). */ rc = (*iop->pathinfo.handlers->read_h)( iop, buffer, count ); 80129e8: 29 64 00 24 lw r4,(r11+36) 80129ec: b9 60 08 00 mv r1,r11 80129f0: 28 84 00 08 lw r4,(r4+8) 80129f4: d8 80 00 00 call r4 80129f8: b8 20 60 00 mv r12,r1 if ( rc > 0 ) 80129fc: 4c 01 00 0b bge r0,r1,8012a28 iop->offset += rc; 8012a00: 34 02 00 1f mvi r2,31 8012a04: fb ff fe 09 calli 8012228 <__ashrsi3> 8012a08: 29 62 00 14 lw r2,(r11+20) 8012a0c: 29 64 00 10 lw r4,(r11+16) 8012a10: b5 82 10 00 add r2,r12,r2 8012a14: f5 82 18 00 cmpgu r3,r12,r2 8012a18: b4 24 08 00 add r1,r1,r4 8012a1c: b4 61 08 00 add r1,r3,r1 8012a20: 59 61 00 10 sw (r11+16),r1 8012a24: 59 62 00 14 sw (r11+20),r2 return rc; } 8012a28: b9 80 08 00 mv r1,r12 8012a2c: 2b 9d 00 04 lw ra,(sp+4) 8012a30: 2b 8b 00 0c lw r11,(sp+12) 8012a34: 2b 8c 00 08 lw r12,(sp+8) 8012a38: 37 9c 00 0c addi sp,sp,12 8012a3c: c3 a0 00 00 ret rtems_libio_check_fd( fd ); iop = rtems_libio_iop( fd ); rtems_libio_check_is_open( iop ); rtems_libio_check_buffer( buffer ); rtems_libio_check_count( count ); rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ ); 8012a40: fb ff e8 e5 calli 800cdd4 <__errno> 8012a44: 34 02 00 16 mvi r2,22 8012a48: 58 22 00 00 sw (r1+0),r2 8012a4c: 34 0c ff ff mvi r12,-1 8012a50: e3 ff ff f6 bi 8012a28 =============================================================================== 080051c0 : ssize_t readlink( const char *pathname, char *buf, size_t bufsize ) { 80051c0: 37 9c ff d8 addi sp,sp,-40 80051c4: 5b 8b 00 14 sw (sp+20),r11 80051c8: 5b 8c 00 10 sw (sp+16),r12 80051cc: 5b 8d 00 0c sw (sp+12),r13 80051d0: 5b 8e 00 08 sw (sp+8),r14 80051d4: 5b 9d 00 04 sw (sp+4),ra 80051d8: b8 40 68 00 mv r13,r2 80051dc: b8 20 60 00 mv r12,r1 80051e0: b8 60 70 00 mv r14,r3 rtems_filesystem_location_info_t loc; int result; if (!buf) 80051e4: 44 40 00 2b be r2,r0,8005290 rtems_set_errno_and_return_minus_one( EFAULT ); result = rtems_filesystem_evaluate_path( pathname, strlen( pathname ), 80051e8: f8 00 34 d8 calli 8012548 80051ec: b8 20 20 00 mv r4,r1 80051f0: 37 8b 00 18 addi r11,sp,24 80051f4: b9 80 08 00 mv r1,r12 80051f8: b8 80 10 00 mv r2,r4 80051fc: 34 03 00 00 mvi r3,0 8005200: b9 60 20 00 mv r4,r11 8005204: 34 05 00 00 mvi r5,0 8005208: fb ff fa 93 calli 8003c54 0, &loc, false ); if ( result != 0 ) return -1; 800520c: 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 ) 8005210: 44 20 00 09 be r1,r0,8005234 <== ALWAYS TAKEN result = (*loc.ops->readlink_h)( &loc, buf, bufsize ); rtems_filesystem_freenode( &loc ); return result; } 8005214: b9 80 08 00 mv r1,r12 8005218: 2b 9d 00 04 lw ra,(sp+4) 800521c: 2b 8b 00 14 lw r11,(sp+20) 8005220: 2b 8c 00 10 lw r12,(sp+16) 8005224: 2b 8d 00 0c lw r13,(sp+12) 8005228: 2b 8e 00 08 lw r14,(sp+8) 800522c: 37 9c 00 28 addi sp,sp,40 8005230: c3 a0 00 00 ret result = rtems_filesystem_evaluate_path( pathname, strlen( pathname ), 0, &loc, false ); if ( result != 0 ) return -1; if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK ){ 8005234: 2b 82 00 24 lw r2,(sp+36) 8005238: b9 60 08 00 mv r1,r11 800523c: 28 42 00 10 lw r2,(r2+16) 8005240: d8 40 00 00 call r2 8005244: 34 02 00 04 mvi r2,4 8005248: 5c 22 00 1e bne r1,r2,80052c0 rtems_filesystem_freenode( &loc ); rtems_set_errno_and_return_minus_one( EINVAL ); } result = (*loc.ops->readlink_h)( &loc, buf, bufsize ); 800524c: 2b 81 00 24 lw r1,(sp+36) 8005250: b9 a0 10 00 mv r2,r13 8005254: b9 c0 18 00 mv r3,r14 8005258: 28 24 00 3c lw r4,(r1+60) 800525c: b9 60 08 00 mv r1,r11 8005260: d8 80 00 00 call r4 8005264: b8 20 60 00 mv r12,r1 rtems_filesystem_freenode( &loc ); 8005268: b9 60 08 00 mv r1,r11 800526c: fb ff fa c8 calli 8003d8c return result; } 8005270: b9 80 08 00 mv r1,r12 8005274: 2b 9d 00 04 lw ra,(sp+4) 8005278: 2b 8b 00 14 lw r11,(sp+20) 800527c: 2b 8c 00 10 lw r12,(sp+16) 8005280: 2b 8d 00 0c lw r13,(sp+12) 8005284: 2b 8e 00 08 lw r14,(sp+8) 8005288: 37 9c 00 28 addi sp,sp,40 800528c: c3 a0 00 00 ret { rtems_filesystem_location_info_t loc; int result; if (!buf) rtems_set_errno_and_return_minus_one( EFAULT ); 8005290: f8 00 2d 24 calli 8010720 <__errno> 8005294: 34 02 00 0e mvi r2,14 8005298: 34 0c ff ff mvi r12,-1 800529c: 58 22 00 00 sw (r1+0),r2 result = (*loc.ops->readlink_h)( &loc, buf, bufsize ); rtems_filesystem_freenode( &loc ); return result; } 80052a0: b9 80 08 00 mv r1,r12 80052a4: 2b 9d 00 04 lw ra,(sp+4) 80052a8: 2b 8b 00 14 lw r11,(sp+20) 80052ac: 2b 8c 00 10 lw r12,(sp+16) 80052b0: 2b 8d 00 0c lw r13,(sp+12) 80052b4: 2b 8e 00 08 lw r14,(sp+8) 80052b8: 37 9c 00 28 addi sp,sp,40 80052bc: c3 a0 00 00 ret 0, &loc, false ); if ( result != 0 ) return -1; if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK ){ rtems_filesystem_freenode( &loc ); 80052c0: b9 60 08 00 mv r1,r11 80052c4: fb ff fa b2 calli 8003d8c rtems_set_errno_and_return_minus_one( EINVAL ); 80052c8: f8 00 2d 16 calli 8010720 <__errno> 80052cc: 34 02 00 16 mvi r2,22 80052d0: 58 22 00 00 sw (r1+0),r2 80052d4: e3 ff ff d0 bi 8005214 =============================================================================== 080039fc : ssize_t readv( int fd, const struct iovec *iov, int iovcnt ) { 80039fc: 37 9c ff e4 addi sp,sp,-28 8003a00: 5b 8b 00 1c sw (sp+28),r11 8003a04: 5b 8c 00 18 sw (sp+24),r12 8003a08: 5b 8d 00 14 sw (sp+20),r13 8003a0c: 5b 8e 00 10 sw (sp+16),r14 8003a10: 5b 8f 00 0c sw (sp+12),r15 8003a14: 5b 90 00 08 sw (sp+8),r16 8003a18: 5b 9d 00 04 sw (sp+4),ra int v; int bytes; rtems_libio_t *iop; bool all_zeros; rtems_libio_check_fd( fd ); 8003a1c: 78 04 08 01 mvhi r4,0x801 8003a20: 38 84 60 10 ori r4,r4,0x6010 8003a24: 28 84 00 00 lw r4,(r4+0) ssize_t readv( int fd, const struct iovec *iov, int iovcnt ) { 8003a28: b8 60 60 00 mv r12,r3 int v; int bytes; rtems_libio_t *iop; bool all_zeros; rtems_libio_check_fd( fd ); 8003a2c: 54 81 00 06 bgu r4,r1,8003a44 iop = rtems_libio_iop( fd ); rtems_libio_check_is_open( iop ); 8003a30: f8 00 29 61 calli 800dfb4 <__errno> 8003a34: 34 02 00 09 mvi r2,9 8003a38: 58 22 00 00 sw (r1+0),r2 8003a3c: 34 0f ff ff mvi r15,-1 8003a40: e0 00 00 16 bi 8003a98 int bytes; rtems_libio_t *iop; bool all_zeros; rtems_libio_check_fd( fd ); iop = rtems_libio_iop( fd ); 8003a44: b4 21 08 00 add r1,r1,r1 8003a48: 78 03 08 01 mvhi r3,0x801 8003a4c: b4 21 08 00 add r1,r1,r1 8003a50: 38 63 67 6c ori r3,r3,0x676c 8003a54: b4 21 08 00 add r1,r1,r1 8003a58: 28 6b 00 00 lw r11,(r3+0) 8003a5c: b4 21 08 00 add r1,r1,r1 8003a60: b4 21 08 00 add r1,r1,r1 8003a64: b4 21 08 00 add r1,r1,r1 8003a68: b5 61 58 00 add r11,r11,r1 rtems_libio_check_is_open( iop ); 8003a6c: 29 61 00 18 lw r1,(r11+24) 8003a70: 20 23 01 00 andi r3,r1,0x100 8003a74: 44 60 ff ef be r3,r0,8003a30 rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ ); 8003a78: 20 21 00 02 andi r1,r1,0x2 8003a7c: 44 20 00 03 be r1,r0,8003a88 <== NEVER TAKEN /* * Argument validation on IO vector */ if ( !iov ) 8003a80: 44 40 00 02 be r2,r0,8003a88 rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt <= 0 ) 8003a84: 49 80 00 0f bg r12,r0,8003ac0 /* check for wrap */ old = total; total += iov[v].iov_len; if ( total < old ) rtems_set_errno_and_return_minus_one( EINVAL ); 8003a88: f8 00 29 4b calli 800dfb4 <__errno> 8003a8c: 34 02 00 16 mvi r2,22 8003a90: 58 22 00 00 sw (r1+0),r2 8003a94: 34 0f ff ff mvi r15,-1 if (bytes != iov[ v ].iov_len) break; } return total; } 8003a98: b9 e0 08 00 mv r1,r15 8003a9c: 2b 9d 00 04 lw ra,(sp+4) 8003aa0: 2b 8b 00 1c lw r11,(sp+28) 8003aa4: 2b 8c 00 18 lw r12,(sp+24) 8003aa8: 2b 8d 00 14 lw r13,(sp+20) 8003aac: 2b 8e 00 10 lw r14,(sp+16) 8003ab0: 2b 8f 00 0c lw r15,(sp+12) 8003ab4: 2b 90 00 08 lw r16,(sp+8) 8003ab8: 37 9c 00 1c addi sp,sp,28 8003abc: c3 a0 00 00 ret rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt <= 0 ) rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt > IOV_MAX ) 8003ac0: 34 01 04 00 mvi r1,1024 8003ac4: 4c 2c 00 02 bge r1,r12,8003acc <== ALWAYS TAKEN 8003ac8: e3 ff ff f0 bi 8003a88 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( EINVAL ); 8003acc: b8 40 70 00 mv r14,r2 rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt <= 0 ) rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt > IOV_MAX ) 8003ad0: b8 40 20 00 mv r4,r2 8003ad4: 34 07 00 01 mvi r7,1 8003ad8: 34 05 00 00 mvi r5,0 8003adc: 34 06 00 00 mvi r6,0 /* * 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 ) 8003ae0: 28 81 00 00 lw r1,(r4+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++ ) { 8003ae4: 34 a5 00 01 addi r5,r5,1 /* * 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 ) 8003ae8: 44 20 ff e8 be r1,r0,8003a88 rtems_set_errno_and_return_minus_one( EINVAL ); /* check for wrap */ old = total; total += iov[v].iov_len; 8003aec: 28 81 00 04 lw r1,(r4+4) * 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++ ) { 8003af0: 34 84 00 08 addi r4,r4,8 total += iov[v].iov_len; if ( total < old ) rtems_set_errno_and_return_minus_one( EINVAL ); if ( iov[v].iov_len ) all_zeros = false; 8003af4: 64 23 00 00 cmpei r3,r1,0 if ( iov[v].iov_base == 0 ) rtems_set_errno_and_return_minus_one( EINVAL ); /* check for wrap */ old = total; total += iov[v].iov_len; 8003af8: b4 c1 08 00 add r1,r6,r1 if ( total < old ) rtems_set_errno_and_return_minus_one( EINVAL ); if ( iov[v].iov_len ) all_zeros = false; 8003afc: c8 03 18 00 sub r3,r0,r3 rtems_set_errno_and_return_minus_one( EINVAL ); /* check for wrap */ old = total; total += iov[v].iov_len; if ( total < old ) 8003b00: 4c 26 00 02 bge r1,r6,8003b08 8003b04: e3 ff ff e1 bi 8003a88 rtems_set_errno_and_return_minus_one( EINVAL ); if ( iov[v].iov_len ) all_zeros = false; 8003b08: a0 e3 38 00 and r7,r7,r3 * 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++ ) { 8003b0c: 49 85 00 1e bg r12,r5,8003b84 * 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; 8003b10: 34 0f 00 00 mvi r15,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 ) { 8003b14: 5c e0 ff e1 bne r7,r0,8003a98 8003b18: 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)( 8003b1c: 29 61 00 24 lw r1,(r11+36) 8003b20: 29 c2 00 00 lw r2,(r14+0) 8003b24: 29 c3 00 04 lw r3,(r14+4) 8003b28: 28 24 00 08 lw r4,(r1+8) 8003b2c: b9 60 08 00 mv r1,r11 } /* * Now process the readv(). */ for ( total=0, v=0 ; v < iovcnt ; v++ ) { 8003b30: 36 10 00 01 addi r16,r16,1 bytes = (*iop->pathinfo.handlers->read_h)( 8003b34: d8 80 00 00 call r4 8003b38: b8 20 68 00 mv r13,r1 if ( bytes < 0 ) return -1; if ( bytes > 0 ) { iop->offset += bytes; 8003b3c: 34 02 00 1f mvi r2,31 iop, iov[v].iov_base, iov[v].iov_len ); if ( bytes < 0 ) 8003b40: 48 01 00 13 bg r0,r1,8003b8c <== NEVER TAKEN return -1; if ( bytes > 0 ) { 8003b44: 44 20 00 0b be r1,r0,8003b70 <== NEVER TAKEN iop->offset += bytes; 8003b48: f8 00 3e df calli 80136c4 <__ashrsi3> 8003b4c: 29 62 00 14 lw r2,(r11+20) 8003b50: 29 64 00 10 lw r4,(r11+16) total += bytes; 8003b54: b5 ed 78 00 add r15,r15,r13 if ( bytes < 0 ) return -1; if ( bytes > 0 ) { iop->offset += bytes; 8003b58: b5 a2 10 00 add r2,r13,r2 8003b5c: f5 a2 18 00 cmpgu r3,r13,r2 8003b60: b4 24 08 00 add r1,r1,r4 8003b64: b4 61 08 00 add r1,r3,r1 8003b68: 59 61 00 10 sw (r11+16),r1 8003b6c: 59 62 00 14 sw (r11+20),r2 total += bytes; } if (bytes != iov[ v ].iov_len) 8003b70: 29 c1 00 04 lw r1,(r14+4) } /* * Now process the readv(). */ for ( total=0, v=0 ; v < iovcnt ; v++ ) { 8003b74: 35 ce 00 08 addi r14,r14,8 if ( bytes > 0 ) { iop->offset += bytes; total += bytes; } if (bytes != iov[ v ].iov_len) 8003b78: 5d a1 ff c8 bne r13,r1,8003a98 <== NEVER TAKEN } /* * Now process the readv(). */ for ( total=0, v=0 ; v < iovcnt ; v++ ) { 8003b7c: 49 90 ff e8 bg r12,r16,8003b1c 8003b80: e3 ff ff c6 bi 8003a98 if ( iov[v].iov_base == 0 ) rtems_set_errno_and_return_minus_one( EINVAL ); /* check for wrap */ old = total; total += iov[v].iov_len; 8003b84: b8 20 30 00 mv r6,r1 8003b88: e3 ff ff d6 bi 8003ae0 iov[v].iov_base, iov[v].iov_len ); if ( bytes < 0 ) return -1; 8003b8c: 34 0f ff ff mvi r15,-1 <== NOT EXECUTED 8003b90: e3 ff ff c2 bi 8003a98 <== NOT EXECUTED =============================================================================== 08012afc : void *realloc( void *ptr, size_t size ) { 8012afc: 37 9c ff e4 addi sp,sp,-28 8012b00: 5b 8b 00 18 sw (sp+24),r11 8012b04: 5b 8c 00 14 sw (sp+20),r12 8012b08: 5b 8d 00 10 sw (sp+16),r13 8012b0c: 5b 8e 00 0c sw (sp+12),r14 8012b10: 5b 8f 00 08 sw (sp+8),r15 8012b14: 5b 9d 00 04 sw (sp+4),ra uintptr_t old_size; char *new_area; MSBUMP(realloc_calls, 1); 8012b18: 78 0c 08 01 mvhi r12,0x801 8012b1c: 39 8c 47 88 ori r12,r12,0x4788 8012b20: 29 84 00 10 lw r4,(r12+16) /* * Do not attempt to allocate memory if in a critical section or ISR. */ if (_System_state_Is_up(_System_state_Get())) { 8012b24: 78 03 08 01 mvhi r3,0x801 8012b28: 38 63 4a 60 ori r3,r3,0x4a60 8012b2c: 28 63 00 00 lw r3,(r3+0) ) { uintptr_t old_size; char *new_area; MSBUMP(realloc_calls, 1); 8012b30: 34 84 00 01 addi r4,r4,1 void *realloc( void *ptr, size_t size ) { 8012b34: b8 20 58 00 mv r11,r1 uintptr_t old_size; char *new_area; MSBUMP(realloc_calls, 1); 8012b38: 59 84 00 10 sw (r12+16),r4 /* * Do not attempt to allocate memory if in a critical section or ISR. */ if (_System_state_Is_up(_System_state_Get())) { 8012b3c: 34 01 00 03 mvi r1,3 void *realloc( void *ptr, size_t size ) { 8012b40: b8 40 70 00 mv r14,r2 /* * Do not attempt to allocate memory if in a critical section or ISR. */ if (_System_state_Is_up(_System_state_Get())) { 8012b44: 44 61 00 22 be r3,r1,8012bcc <== ALWAYS TAKEN } /* * Continue with realloc(). */ if ( !ptr ) 8012b48: 45 60 00 2d be r11,r0,8012bfc return malloc( size ); if ( !size ) { 8012b4c: 45 c0 00 17 be r14,r0,8012ba8 <== NEVER TAKEN free( ptr ); return (void *) 0; } if ( !_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, ptr, &old_size) ) { 8012b50: 78 0d 08 01 mvhi r13,0x801 8012b54: 39 ad 40 1c ori r13,r13,0x401c 8012b58: 29 a1 00 00 lw r1,(r13+0) 8012b5c: b9 60 10 00 mv r2,r11 8012b60: 37 83 00 1c addi r3,sp,28 8012b64: f8 00 00 76 calli 8012d3c <_Protected_heap_Get_block_size> 8012b68: 44 20 00 14 be r1,r0,8012bb8 <== NEVER TAKEN } /* * Now resize it. */ if ( _Protected_heap_Resize_block( RTEMS_Malloc_Heap, ptr, size ) ) { 8012b6c: 29 a1 00 00 lw r1,(r13+0) 8012b70: b9 60 10 00 mv r2,r11 8012b74: b9 c0 18 00 mv r3,r14 8012b78: f8 00 00 89 calli 8012d9c <_Protected_heap_Resize_block> 8012b7c: b8 20 68 00 mv r13,r1 8012b80: 44 20 00 23 be r1,r0,8012c0c <== ALWAYS TAKEN memcpy( new_area, ptr, (size < old_size) ? size : old_size ); free( ptr ); return new_area; } 8012b84: b9 60 08 00 mv r1,r11 8012b88: 2b 9d 00 04 lw ra,(sp+4) 8012b8c: 2b 8b 00 18 lw r11,(sp+24) 8012b90: 2b 8c 00 14 lw r12,(sp+20) 8012b94: 2b 8d 00 10 lw r13,(sp+16) 8012b98: 2b 8e 00 0c lw r14,(sp+12) 8012b9c: 2b 8f 00 08 lw r15,(sp+8) 8012ba0: 37 9c 00 1c addi sp,sp,28 8012ba4: c3 a0 00 00 ret */ if ( !ptr ) return malloc( size ); if ( !size ) { free( ptr ); 8012ba8: b9 60 08 00 mv r1,r11 <== NOT EXECUTED 8012bac: fb ff ba 3f calli 80014a8 <== NOT EXECUTED return (void *) 0; 8012bb0: 34 0b 00 00 mvi r11,0 <== NOT EXECUTED 8012bb4: e3 ff ff f4 bi 8012b84 <== NOT EXECUTED } if ( !_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, ptr, &old_size) ) { errno = EINVAL; 8012bb8: fb ff e8 87 calli 800cdd4 <__errno> 8012bbc: 34 02 00 16 mvi r2,22 8012bc0: 58 22 00 00 sw (r1+0),r2 return (void *) 0; 8012bc4: 34 0b 00 00 mvi r11,0 8012bc8: e3 ff ff ef bi 8012b84 /* * Do not attempt to allocate memory if in a critical section or ISR. */ if (_System_state_Is_up(_System_state_Get())) { if (_Thread_Dispatch_disable_level > 0) 8012bcc: 78 01 08 01 mvhi r1,0x801 8012bd0: 38 21 48 e8 ori r1,r1,0x48e8 8012bd4: 28 21 00 00 lw r1,(r1+0) 8012bd8: 44 20 00 03 be r1,r0,8012be4 <== ALWAYS TAKEN new_area = malloc( size ); MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */ if ( !new_area ) { return (void *) 0; 8012bdc: 34 0b 00 00 mvi r11,0 8012be0: e3 ff ff e9 bi 8012b84 if (_System_state_Is_up(_System_state_Get())) { if (_Thread_Dispatch_disable_level > 0) return (void *) 0; if (_ISR_Nest_level > 0) 8012be4: 78 02 08 01 mvhi r2,0x801 8012be8: 38 42 4d b4 ori r2,r2,0x4db4 8012bec: 28 42 00 08 lw r2,(r2+8) 8012bf0: 44 41 ff d6 be r2,r1,8012b48 <== ALWAYS TAKEN new_area = malloc( size ); MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */ if ( !new_area ) { return (void *) 0; 8012bf4: 34 0b 00 00 mvi r11,0 <== NOT EXECUTED 8012bf8: e3 ff ff e3 bi 8012b84 <== NOT EXECUTED /* * Continue with realloc(). */ if ( !ptr ) return malloc( size ); 8012bfc: b9 c0 08 00 mv r1,r14 8012c00: fb ff bb 2b calli 80018ac 8012c04: b8 20 58 00 mv r11,r1 8012c08: e3 ff ff df bi 8012b84 * 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 ); 8012c0c: b9 c0 08 00 mv r1,r14 8012c10: fb ff bb 27 calli 80018ac 8012c14: b8 20 78 00 mv r15,r1 MSBUMP(malloc_calls, (uint32_t) -1); /* subtract off the malloc */ 8012c18: 29 81 00 04 lw r1,(r12+4) 8012c1c: 34 21 ff ff addi r1,r1,-1 8012c20: 59 81 00 04 sw (r12+4),r1 if ( !new_area ) { 8012c24: 45 ed ff ee be r15,r13,8012bdc return (void *) 0; } memcpy( new_area, ptr, (size < old_size) ? size : old_size ); 8012c28: 2b 81 00 1c lw r1,(sp+28) 8012c2c: b9 c0 18 00 mv r3,r14 8012c30: 50 2e 00 02 bgeu r1,r14,8012c38 <== NEVER TAKEN 8012c34: b8 20 18 00 mv r3,r1 8012c38: b9 60 10 00 mv r2,r11 8012c3c: b9 e0 08 00 mv r1,r15 8012c40: fb ff eb 1b calli 800d8ac free( ptr ); 8012c44: b9 60 08 00 mv r1,r11 8012c48: fb ff ba 18 calli 80014a8 return new_area; 8012c4c: b9 e0 58 00 mv r11,r15 8012c50: e3 ff ff cd bi 8012b84 =============================================================================== 08002b1c : #include int rmdir( const char *pathname ) { 8002b1c: 37 9c ff bc addi sp,sp,-68 8002b20: 5b 8b 00 18 sw (sp+24),r11 8002b24: 5b 8c 00 14 sw (sp+20),r12 8002b28: 5b 8d 00 10 sw (sp+16),r13 8002b2c: 5b 8e 00 0c sw (sp+12),r14 8002b30: 5b 8f 00 08 sw (sp+8),r15 8002b34: 5b 9d 00 04 sw (sp+4),ra 8002b38: b8 20 68 00 mv r13,r1 /* * Get the parent node of the node we wish to remove. Find the parent path. */ parentpathlen = rtems_filesystem_dirname ( pathname ); 8002b3c: fb ff fb 86 calli 8001954 if ( parentpathlen == 0 ) 8002b40: 5c 20 00 4a bne r1,r0,8002c68 rtems_filesystem_get_start_loc( pathname, &i, &parentloc ); 8002b44: 37 8c 00 30 addi r12,sp,48 8002b48: b9 a0 08 00 mv r1,r13 8002b4c: 37 82 00 44 addi r2,sp,68 8002b50: b9 80 18 00 mv r3,r12 8002b54: f8 00 00 51 calli 8002c98 8002b58: 34 0b 00 00 mvi r11,0 const char *name; rtems_filesystem_location_info_t parentloc; rtems_filesystem_location_info_t loc; int i; int result; bool free_parentloc = false; 8002b5c: 34 0f 00 00 mvi r15,0 /* * Start from the parent to find the node that should be under it. */ loc = parentloc; 8002b60: 2b 82 00 30 lw r2,(sp+48) name = pathname + parentpathlen; 8002b64: b5 ab 58 00 add r11,r13,r11 name += rtems_filesystem_prefix_separators( name, strlen( name ) ); 8002b68: b9 60 08 00 mv r1,r11 /* * Start from the parent to find the node that should be under it. */ loc = parentloc; 8002b6c: 5b 82 00 1c sw (sp+28),r2 8002b70: 2b 82 00 34 lw r2,(sp+52) 8002b74: 5b 82 00 20 sw (sp+32),r2 8002b78: 2b 82 00 38 lw r2,(sp+56) 8002b7c: 5b 82 00 24 sw (sp+36),r2 8002b80: 2b 82 00 3c lw r2,(sp+60) 8002b84: 5b 82 00 28 sw (sp+40),r2 8002b88: 2b 82 00 40 lw r2,(sp+64) 8002b8c: 5b 82 00 2c sw (sp+44),r2 name = pathname + parentpathlen; name += rtems_filesystem_prefix_separators( name, strlen( name ) ); 8002b90: f8 00 2f 6b calli 800e93c 8002b94: b8 20 10 00 mv r2,r1 8002b98: b9 60 08 00 mv r1,r11 8002b9c: fb ff fb 83 calli 80019a8 8002ba0: b5 61 68 00 add r13,r11,r1 result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), 8002ba4: b9 a0 08 00 mv r1,r13 8002ba8: f8 00 2f 65 calli 800e93c 8002bac: 37 8b 00 1c addi r11,sp,28 8002bb0: b8 20 10 00 mv r2,r1 8002bb4: 34 03 00 00 mvi r3,0 8002bb8: b9 a0 08 00 mv r1,r13 8002bbc: b9 60 20 00 mv r4,r11 8002bc0: 34 05 00 00 mvi r5,0 8002bc4: fb ff fb 26 calli 800185c 0, &loc, false ); if ( result != 0 ) { 8002bc8: 5c 20 00 19 bne r1,r0,8002c2c } /* * Verify you can remove this node as a directory. */ if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) { 8002bcc: 2b 82 00 28 lw r2,(sp+40) 8002bd0: b9 60 08 00 mv r1,r11 8002bd4: 28 42 00 10 lw r2,(r2+16) 8002bd8: d8 40 00 00 call r2 8002bdc: 34 02 00 01 mvi r2,1 8002be0: 5c 22 00 18 bne r1,r2,8002c40 /* * Use the filesystems rmnod to remove the node. */ result = (*loc.handlers->rmnod_h)( &parentloc, &loc ); 8002be4: 2b 83 00 24 lw r3,(sp+36) 8002be8: b9 80 08 00 mv r1,r12 8002bec: b9 60 10 00 mv r2,r11 8002bf0: 28 63 00 34 lw r3,(r3+52) 8002bf4: d8 60 00 00 call r3 8002bf8: b8 20 70 00 mv r14,r1 rtems_filesystem_freenode( &loc ); 8002bfc: b9 60 08 00 mv r1,r11 8002c00: fb ff fb 88 calli 8001a20 if ( free_parentloc ) 8002c04: 5d e0 00 0c bne r15,r0,8002c34 rtems_filesystem_freenode( &parentloc ); return result; } 8002c08: b9 c0 08 00 mv r1,r14 8002c0c: 2b 9d 00 04 lw ra,(sp+4) 8002c10: 2b 8b 00 18 lw r11,(sp+24) 8002c14: 2b 8c 00 14 lw r12,(sp+20) 8002c18: 2b 8d 00 10 lw r13,(sp+16) 8002c1c: 2b 8e 00 0c lw r14,(sp+12) 8002c20: 2b 8f 00 08 lw r15,(sp+8) 8002c24: 37 9c 00 44 addi sp,sp,68 8002c28: c3 a0 00 00 ret result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), 0, &loc, false ); if ( result != 0 ) { if ( free_parentloc ) rtems_filesystem_freenode( &parentloc ); return -1; 8002c2c: 34 0e ff ff mvi r14,-1 name += rtems_filesystem_prefix_separators( name, strlen( name ) ); result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), 0, &loc, false ); if ( result != 0 ) { if ( free_parentloc ) 8002c30: 45 e0 ff f6 be r15,r0,8002c08 result = (*loc.handlers->rmnod_h)( &parentloc, &loc ); rtems_filesystem_freenode( &loc ); if ( free_parentloc ) rtems_filesystem_freenode( &parentloc ); 8002c34: b9 80 08 00 mv r1,r12 8002c38: fb ff fb 7a calli 8001a20 8002c3c: e3 ff ff f3 bi 8002c08 /* * Verify you can remove this node as a directory. */ if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) { rtems_filesystem_freenode( &loc ); 8002c40: b9 60 08 00 mv r1,r11 8002c44: fb ff fb 77 calli 8001a20 if ( free_parentloc ) 8002c48: 45 e0 00 03 be r15,r0,8002c54 <== NEVER TAKEN rtems_filesystem_freenode( &parentloc ); 8002c4c: b9 80 08 00 mv r1,r12 8002c50: fb ff fb 74 calli 8001a20 rtems_set_errno_and_return_minus_one( ENOTDIR ); 8002c54: f8 00 2a d9 calli 800d7b8 <__errno> 8002c58: 34 02 00 14 mvi r2,20 8002c5c: 58 22 00 00 sw (r1+0),r2 8002c60: 34 0e ff ff mvi r14,-1 8002c64: e3 ff ff e9 bi 8002c08 parentpathlen = rtems_filesystem_dirname ( pathname ); if ( parentpathlen == 0 ) rtems_filesystem_get_start_loc( pathname, &i, &parentloc ); else { result = rtems_filesystem_evaluate_path(pathname, parentpathlen, 8002c68: b8 20 58 00 mv r11,r1 8002c6c: 37 8c 00 30 addi r12,sp,48 8002c70: b9 a0 08 00 mv r1,r13 8002c74: b9 60 10 00 mv r2,r11 8002c78: 34 03 00 02 mvi r3,2 8002c7c: b9 80 20 00 mv r4,r12 8002c80: 34 05 00 00 mvi r5,0 8002c84: fb ff fb 19 calli 80018e8 RTEMS_LIBIO_PERMS_WRITE, &parentloc, false ); if ( result != 0 ) return -1; 8002c88: 34 0e ff ff mvi r14,-1 else { result = rtems_filesystem_evaluate_path(pathname, parentpathlen, RTEMS_LIBIO_PERMS_WRITE, &parentloc, false ); if ( result != 0 ) 8002c8c: 5c 20 ff df bne r1,r0,8002c08 <== NEVER TAKEN return -1; free_parentloc = true; 8002c90: 34 0f 00 01 mvi r15,1 8002c94: e3 ff ff b3 bi 8002b60 =============================================================================== 080046a4 : * errno - otherwise */ int rtems_aio_enqueue (rtems_aio_request *req) { 80046a4: 37 9c ff c4 addi sp,sp,-60 80046a8: 5b 8b 00 18 sw (sp+24),r11 80046ac: 5b 8c 00 14 sw (sp+20),r12 80046b0: 5b 8d 00 10 sw (sp+16),r13 80046b4: 5b 8e 00 0c sw (sp+12),r14 80046b8: 5b 8f 00 08 sw (sp+8),r15 80046bc: 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); 80046c0: 78 0b 08 01 mvhi r11,0x801 80046c4: 39 6b 88 38 ori r11,r11,0x8838 * errno - otherwise */ int rtems_aio_enqueue (rtems_aio_request *req) { 80046c8: b8 20 60 00 mv r12,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); 80046cc: b9 60 08 00 mv r1,r11 80046d0: f8 00 02 c6 calli 80051e8 80046d4: b8 20 68 00 mv r13,r1 if (result != 0) { 80046d8: 5c 20 00 52 bne r1,r0,8004820 <== NEVER TAKEN return result; } /* _POSIX_PRIORITIZED_IO and _POSIX_PRIORITY_SCHEDULING are defined, we can use aio_reqprio to lower the priority of the request */ pthread_getschedparam (pthread_self(), &policy, ¶m); 80046dc: f8 00 05 ae calli 8005d94 80046e0: 37 82 00 38 addi r2,sp,56 80046e4: 37 83 00 1c addi r3,sp,28 80046e8: f8 00 04 57 calli 8005844 req->caller_thread = pthread_self (); 80046ec: f8 00 05 aa calli 8005d94 req->priority = param.sched_priority - req->aiocbp->aio_reqprio; 80046f0: 29 82 00 14 lw r2,(r12+20) req->policy = policy; req->aiocbp->error_code = EINPROGRESS; req->aiocbp->return_value = 0; if ((aio_request_queue.idle_threads == 0) && 80046f4: 29 63 00 68 lw r3,(r11+104) /* _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 (); req->priority = param.sched_priority - req->aiocbp->aio_reqprio; 80046f8: 28 44 00 10 lw r4,(r2+16) /* _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 (); 80046fc: 59 81 00 10 sw (r12+16),r1 req->priority = param.sched_priority - req->aiocbp->aio_reqprio; 8004700: 2b 81 00 1c lw r1,(sp+28) 8004704: c8 24 08 00 sub r1,r1,r4 8004708: 59 81 00 0c sw (r12+12),r1 req->policy = policy; 800470c: 2b 81 00 38 lw r1,(sp+56) 8004710: 59 81 00 08 sw (r12+8),r1 req->aiocbp->error_code = EINPROGRESS; 8004714: 34 01 00 77 mvi r1,119 8004718: 58 41 00 2c sw (r2+44),r1 req->aiocbp->return_value = 0; 800471c: 58 40 00 30 sw (r2+48),r0 if ((aio_request_queue.idle_threads == 0) && 8004720: 5c 6d 00 24 bne r3,r13,80047b0 <== NEVER TAKEN 8004724: 29 63 00 64 lw r3,(r11+100) 8004728: 34 01 00 04 mvi r1,4 800472c: 48 61 00 21 bg r3,r1,80047b0 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); 8004730: 28 42 00 00 lw r2,(r2+0) 8004734: 78 01 08 01 mvhi r1,0x801 8004738: 38 21 88 80 ori r1,r1,0x8880 800473c: 34 03 00 01 mvi r3,1 8004740: fb ff fe 7e calli 8004138 if (r_chain->new_fd == 1) { 8004744: 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); 8004748: b8 20 70 00 mv r14,r1 if (r_chain->new_fd == 1) { 800474c: 34 01 00 01 mvi r1,1 8004750: 5c 41 00 1f bne r2,r1,80047cc RTEMS_INLINE_ROUTINE void _Chain_Prepend( Chain_Control *the_chain, Chain_Node *the_node ) { _Chain_Insert(_Chain_Head(the_chain), the_node); 8004754: b9 80 10 00 mv r2,r12 8004758: 35 c1 00 08 addi r1,r14,8 800475c: f8 00 09 04 calli 8006b6c <_Chain_Insert> rtems_chain_prepend (&r_chain->perfd, &req->next_prio); r_chain->new_fd = 0; pthread_mutex_init (&r_chain->mutex, NULL); 8004760: 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; 8004764: 59 c0 00 18 sw (r14+24),r0 pthread_mutex_init (&r_chain->mutex, NULL); 8004768: 35 c1 00 1c addi r1,r14,28 800476c: f8 00 02 3e calli 8005064 pthread_cond_init (&r_chain->cond, NULL); 8004770: 34 02 00 00 mvi r2,0 8004774: 35 c1 00 20 addi r1,r14,32 8004778: f8 00 01 03 calli 8004b84 AIO_printf ("New thread \n"); result = pthread_create (&thid, &aio_request_queue.attr, 800477c: 78 02 08 01 mvhi r2,0x801 8004780: 78 03 08 00 mvhi r3,0x800 8004784: 37 81 00 3c addi r1,sp,60 8004788: 38 42 88 40 ori r2,r2,0x8840 800478c: 38 63 42 78 ori r3,r3,0x4278 8004790: b9 c0 20 00 mv r4,r14 8004794: f8 00 03 55 calli 80054e8 8004798: b8 20 60 00 mv r12,r1 rtems_aio_handle, (void *) r_chain); if (result != 0) { 800479c: 5c 20 00 42 bne r1,r0,80048a4 <== NEVER TAKEN pthread_mutex_unlock (&aio_request_queue.mutex); return result; } ++aio_request_queue.active_threads; 80047a0: 29 61 00 64 lw r1,(r11+100) 80047a4: 34 21 00 01 addi r1,r1,1 80047a8: 59 61 00 64 sw (r11+100),r1 80047ac: e0 00 00 12 bi 80047f4 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, 80047b0: 28 42 00 00 lw r2,(r2+0) 80047b4: 78 01 08 01 mvhi r1,0x801 80047b8: 38 21 88 80 ori r1,r1,0x8880 80047bc: 34 03 00 00 mvi r3,0 80047c0: fb ff fe 5e calli 8004138 80047c4: b8 20 70 00 mv r14,r1 req->aiocbp->aio_fildes, 0); if (r_chain != NULL) 80047c8: 44 20 00 19 be r1,r0,800482c { pthread_mutex_lock (&r_chain->mutex); 80047cc: 35 cf 00 1c addi r15,r14,28 80047d0: b9 e0 08 00 mv r1,r15 80047d4: f8 00 02 85 calli 80051e8 rtems_aio_insert_prio (&r_chain->perfd, req); 80047d8: 35 c1 00 08 addi r1,r14,8 80047dc: b9 80 10 00 mv r2,r12 80047e0: fb ff ff 56 calli 8004538 pthread_cond_signal (&r_chain->cond); 80047e4: 35 c1 00 20 addi r1,r14,32 80047e8: f8 00 01 28 calli 8004c88 pthread_mutex_unlock (&r_chain->mutex); 80047ec: b9 e0 08 00 mv r1,r15 80047f0: f8 00 02 ae calli 80052a8 if (aio_request_queue.idle_threads > 0) pthread_cond_signal (&aio_request_queue.new_req); } } pthread_mutex_unlock (&aio_request_queue.mutex); 80047f4: b9 60 08 00 mv r1,r11 80047f8: f8 00 02 ac calli 80052a8 return 0; } 80047fc: b9 a0 08 00 mv r1,r13 8004800: 2b 9d 00 04 lw ra,(sp+4) 8004804: 2b 8b 00 18 lw r11,(sp+24) 8004808: 2b 8c 00 14 lw r12,(sp+20) 800480c: 2b 8d 00 10 lw r13,(sp+16) 8004810: 2b 8e 00 0c lw r14,(sp+12) 8004814: 2b 8f 00 08 lw r15,(sp+8) 8004818: 37 9c 00 3c addi sp,sp,60 800481c: c3 a0 00 00 ret /* The queue should be initialized */ AIO_assert (aio_request_queue.initialized == AIO_QUEUE_INITIALIZED); result = pthread_mutex_lock (&aio_request_queue.mutex); if (result != 0) { free (req); 8004820: b9 80 08 00 mv r1,r12 <== NOT EXECUTED 8004824: fb ff f6 c1 calli 8002328 <== NOT EXECUTED return result; 8004828: e3 ff ff f5 bi 80047fc <== NOT EXECUTED } else { /* or to the idle chain */ chain = &aio_request_queue.idle_req; r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1); 800482c: 29 82 00 14 lw r2,(r12+20) 8004830: 78 01 08 01 mvhi r1,0x801 8004834: 38 21 88 8c ori r1,r1,0x888c 8004838: 28 42 00 00 lw r2,(r2+0) 800483c: 34 03 00 01 mvi r3,1 8004840: fb ff fe 3e calli 8004138 if (r_chain->new_fd == 1) { 8004844: 28 22 00 18 lw r2,(r1+24) } else { /* or to the idle chain */ chain = &aio_request_queue.idle_req; r_chain = rtems_aio_search_fd (chain, req->aiocbp->aio_fildes, 1); 8004848: b8 20 70 00 mv r14,r1 if (r_chain->new_fd == 1) { 800484c: 34 01 00 01 mvi r1,1 8004850: 44 41 00 0a be r2,r1,8004878 r_chain->new_fd = 0; pthread_mutex_init (&r_chain->mutex, NULL); pthread_cond_init (&r_chain->cond, NULL); } else /* just insert the request in the existing fd chain */ rtems_aio_insert_prio (&r_chain->perfd, req); 8004854: 35 c1 00 08 addi r1,r14,8 8004858: b9 80 10 00 mv r2,r12 800485c: fb ff ff 37 calli 8004538 if (aio_request_queue.idle_threads > 0) 8004860: 29 61 00 68 lw r1,(r11+104) 8004864: 4c 01 ff e4 bge r0,r1,80047f4 <== ALWAYS TAKEN pthread_cond_signal (&aio_request_queue.new_req); 8004868: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED 800486c: 38 21 88 3c ori r1,r1,0x883c <== NOT EXECUTED 8004870: f8 00 01 06 calli 8004c88 <== NOT EXECUTED 8004874: e3 ff ff e0 bi 80047f4 <== NOT EXECUTED 8004878: 35 c1 00 08 addi r1,r14,8 800487c: b9 80 10 00 mv r2,r12 8004880: f8 00 08 bb calli 8006b6c <_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); 8004884: 35 c1 00 1c addi r1,r14,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; 8004888: 59 c0 00 18 sw (r14+24),r0 pthread_mutex_init (&r_chain->mutex, NULL); 800488c: 34 02 00 00 mvi r2,0 8004890: f8 00 01 f5 calli 8005064 pthread_cond_init (&r_chain->cond, NULL); 8004894: 35 c1 00 20 addi r1,r14,32 8004898: 34 02 00 00 mvi r2,0 800489c: f8 00 00 ba calli 8004b84 80048a0: e3 ff ff f0 bi 8004860 AIO_printf ("New thread \n"); result = pthread_create (&thid, &aio_request_queue.attr, rtems_aio_handle, (void *) r_chain); if (result != 0) { pthread_mutex_unlock (&aio_request_queue.mutex); 80048a4: b9 60 08 00 mv r1,r11 <== NOT EXECUTED 80048a8: f8 00 02 80 calli 80052a8 <== NOT EXECUTED return result; 80048ac: b9 80 68 00 mv r13,r12 <== NOT EXECUTED 80048b0: e3 ff ff d3 bi 80047fc <== NOT EXECUTED =============================================================================== 08004278 : * NULL - if error */ static void * rtems_aio_handle (void *arg) { 8004278: 37 9c ff 9c addi sp,sp,-100 800427c: 5b 8b 00 3c sw (sp+60),r11 8004280: 5b 8c 00 38 sw (sp+56),r12 8004284: 5b 8d 00 34 sw (sp+52),r13 8004288: 5b 8e 00 30 sw (sp+48),r14 800428c: 5b 8f 00 2c sw (sp+44),r15 8004290: 5b 90 00 28 sw (sp+40),r16 8004294: 5b 91 00 24 sw (sp+36),r17 8004298: 5b 92 00 20 sw (sp+32),r18 800429c: 5b 93 00 1c sw (sp+28),r19 80042a0: 5b 94 00 18 sw (sp+24),r20 80042a4: 5b 95 00 14 sw (sp+20),r21 80042a8: 5b 96 00 10 sw (sp+16),r22 80042ac: 5b 97 00 0c sw (sp+12),r23 80042b0: 5b 98 00 08 sw (sp+8),r24 80042b4: 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); 80042b8: 78 14 08 01 mvhi r20,0x801 80042bc: 3a 94 88 38 ori r20,r20,0x8838 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)) { 80042c0: 78 15 08 01 mvhi r21,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, 80042c4: 78 16 08 01 mvhi r22,0x801 * NULL - if error */ static void * rtems_aio_handle (void *arg) { 80042c8: b8 20 68 00 mv r13,r1 80042cc: 34 2e 00 1c addi r14,r1,28 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); 80042d0: ba 80 90 00 mv r18,r20 if (rtems_chain_is_empty (chain)) { clock_gettime (CLOCK_REALTIME, &timeout); 80042d4: 37 97 00 5c addi r23,sp,92 &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) { 80042d8: 34 18 00 74 mvi r24,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)) { 80042dc: 3a b5 88 90 ori r21,r21,0x8890 --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, 80042e0: 3a d6 88 3c ori r22,r22,0x883c 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); 80042e4: 37 8f 00 40 addi r15,sp,64 rtems_chain_extract (node); pthread_mutex_unlock (&r_chain->mutex); switch (req->aiocbp->aio_lio_opcode) { 80042e8: 34 10 00 02 mvi r16,2 default: result = -1; } if (result == -1) { req->aiocbp->return_value = -1; 80042ec: 34 11 ff ff mvi r17,-1 rtems_chain_extract (node); pthread_mutex_unlock (&r_chain->mutex); switch (req->aiocbp->aio_lio_opcode) { 80042f0: 34 13 00 03 mvi r19,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); 80042f4: b9 c0 08 00 mv r1,r14 80042f8: f8 00 03 bc calli 80051e8 if (result != 0) 80042fc: 5c 20 00 1f bne r1,r0,8004378 <== NEVER TAKEN } } AIO_printf ("Thread finished\n"); return NULL; } 8004300: 29 ab 00 08 lw r11,(r13+8) RTEMS_INLINE_ROUTINE bool _Chain_Is_empty( const Chain_Control *the_chain ) { return _Chain_Immutable_first( the_chain ) == _Chain_Immutable_tail( the_chain ); 8004304: 35 a4 00 0c addi r4,r13,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)) { 8004308: 45 64 00 44 be r11,r4,8004418 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); 800430c: f8 00 06 a2 calli 8005d94 8004310: 37 82 00 64 addi r2,sp,100 8004314: b9 e0 18 00 mv r3,r15 8004318: f8 00 05 4b calli 8005844 param.sched_priority = req->priority; 800431c: 29 64 00 0c lw r4,(r11+12) 8004320: 5b 84 00 40 sw (sp+64),r4 pthread_setschedparam (pthread_self(), req->policy, ¶m); 8004324: f8 00 06 9c calli 8005d94 8004328: 29 62 00 08 lw r2,(r11+8) 800432c: b9 e0 18 00 mv r3,r15 8004330: f8 00 06 9e calli 8005da8 */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); 8004334: b9 60 08 00 mv r1,r11 8004338: f8 00 09 f2 calli 8006b00 <_Chain_Extract> rtems_chain_extract (node); pthread_mutex_unlock (&r_chain->mutex); 800433c: b9 c0 08 00 mv r1,r14 8004340: f8 00 03 da calli 80052a8 switch (req->aiocbp->aio_lio_opcode) { 8004344: 29 6c 00 14 lw r12,(r11+20) 8004348: 29 84 00 28 lw r4,(r12+40) 800434c: 44 90 00 2c be r4,r16,80043fc 8004350: 44 93 00 27 be r4,r19,80043ec <== NEVER TAKEN 8004354: 34 05 00 01 mvi r5,1 8004358: 44 85 00 1a be r4,r5,80043c0 <== ALWAYS TAKEN default: result = -1; } if (result == -1) { req->aiocbp->return_value = -1; 800435c: 59 91 00 30 sw (r12+48),r17 <== NOT EXECUTED req->aiocbp->error_code = errno; 8004360: f8 00 2f 11 calli 800ffa4 <__errno> <== NOT EXECUTED 8004364: 28 21 00 00 lw r1,(r1+0) <== NOT EXECUTED 8004368: 59 81 00 2c sw (r12+44),r1 <== NOT EXECUTED /* 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); 800436c: b9 c0 08 00 mv r1,r14 <== NOT EXECUTED 8004370: f8 00 03 9e calli 80051e8 <== NOT EXECUTED if (result != 0) 8004374: 44 20 ff e3 be r1,r0,8004300 <== NOT EXECUTED } } AIO_printf ("Thread finished\n"); return NULL; } 8004378: 34 01 00 00 mvi r1,0 800437c: 2b 9d 00 04 lw ra,(sp+4) 8004380: 2b 8b 00 3c lw r11,(sp+60) 8004384: 2b 8c 00 38 lw r12,(sp+56) 8004388: 2b 8d 00 34 lw r13,(sp+52) 800438c: 2b 8e 00 30 lw r14,(sp+48) 8004390: 2b 8f 00 2c lw r15,(sp+44) 8004394: 2b 90 00 28 lw r16,(sp+40) 8004398: 2b 91 00 24 lw r17,(sp+36) 800439c: 2b 92 00 20 lw r18,(sp+32) 80043a0: 2b 93 00 1c lw r19,(sp+28) 80043a4: 2b 94 00 18 lw r20,(sp+24) 80043a8: 2b 95 00 14 lw r21,(sp+20) 80043ac: 2b 96 00 10 lw r22,(sp+16) 80043b0: 2b 97 00 0c lw r23,(sp+12) 80043b4: 2b 98 00 08 lw r24,(sp+8) 80043b8: 37 9c 00 64 addi sp,sp,100 80043bc: c3 a0 00 00 ret pthread_mutex_unlock (&r_chain->mutex); switch (req->aiocbp->aio_lio_opcode) { case LIO_READ: AIO_printf ("read\n"); result = pread (req->aiocbp->aio_fildes, 80043c0: 29 84 00 04 lw r4,(r12+4) 80043c4: 29 81 00 00 lw r1,(r12+0) 80043c8: 29 82 00 08 lw r2,(r12+8) 80043cc: 29 83 00 0c lw r3,(r12+12) 80043d0: f8 00 32 a4 calli 8010e60 80043d4: b8 20 20 00 mv r4,r1 break; default: result = -1; } if (result == -1) { 80043d8: 44 91 00 50 be r4,r17,8004518 <== NEVER TAKEN req->aiocbp->return_value = -1; req->aiocbp->error_code = errno; } else { req->aiocbp->return_value = result; 80043dc: 29 65 00 14 lw r5,(r11+20) 80043e0: 58 a4 00 30 sw (r5+48),r4 req->aiocbp->error_code = 0; 80043e4: 58 a0 00 2c sw (r5+44),r0 80043e8: e3 ff ff c3 bi 80042f4 req->aiocbp->aio_nbytes, req->aiocbp->aio_offset); break; case LIO_SYNC: AIO_printf ("sync\n"); result = fsync (req->aiocbp->aio_fildes); 80043ec: 29 81 00 00 lw r1,(r12+0) <== NOT EXECUTED 80043f0: f8 00 1d ed calli 800bba4 <== NOT EXECUTED 80043f4: b8 20 20 00 mv r4,r1 <== NOT EXECUTED break; 80043f8: e3 ff ff f8 bi 80043d8 <== NOT EXECUTED req->aiocbp->aio_nbytes, req->aiocbp->aio_offset); break; case LIO_WRITE: AIO_printf ("write\n"); result = pwrite (req->aiocbp->aio_fildes, 80043fc: 29 84 00 04 lw r4,(r12+4) 8004400: 29 81 00 00 lw r1,(r12+0) 8004404: 29 82 00 08 lw r2,(r12+8) 8004408: 29 83 00 0c lw r3,(r12+12) 800440c: f8 00 32 d9 calli 8010f70 8004410: b8 20 20 00 mv r4,r1 (void *) req->aiocbp->aio_buf, req->aiocbp->aio_nbytes, req->aiocbp->aio_offset); break; 8004414: e3 ff ff f1 bi 80043d8 struct timespec timeout; AIO_printf ("Chain is empty [WQ], wait for work\n"); pthread_mutex_unlock (&r_chain->mutex); 8004418: b9 c0 08 00 mv r1,r14 800441c: f8 00 03 a3 calli 80052a8 pthread_mutex_lock (&aio_request_queue.mutex); 8004420: ba 40 08 00 mv r1,r18 8004424: f8 00 03 71 calli 80051e8 if (rtems_chain_is_empty (chain)) 8004428: 29 a1 00 08 lw r1,(r13+8) 800442c: 45 61 00 04 be r11,r1,800443c <== ALWAYS TAKEN } } /* If there was a request added in the initial fd chain then release the mutex and process it */ pthread_mutex_unlock (&aio_request_queue.mutex); 8004430: ba 40 08 00 mv r1,r18 8004434: f8 00 03 9d calli 80052a8 8004438: e3 ff ff af bi 80042f4 pthread_mutex_unlock (&r_chain->mutex); pthread_mutex_lock (&aio_request_queue.mutex); if (rtems_chain_is_empty (chain)) { clock_gettime (CLOCK_REALTIME, &timeout); 800443c: ba e0 10 00 mv r2,r23 8004440: 34 01 00 01 mvi r1,1 8004444: f8 00 01 6d calli 80049f8 timeout.tv_sec += 3; 8004448: 2b 84 00 5c lw r4,(sp+92) timeout.tv_nsec = 0; result = pthread_cond_timedwait (&r_chain->cond, 800444c: 35 ab 00 20 addi r11,r13,32 8004450: b9 60 08 00 mv r1,r11 pthread_mutex_lock (&aio_request_queue.mutex); if (rtems_chain_is_empty (chain)) { clock_gettime (CLOCK_REALTIME, &timeout); timeout.tv_sec += 3; 8004454: 34 84 00 03 addi r4,r4,3 timeout.tv_nsec = 0; result = pthread_cond_timedwait (&r_chain->cond, 8004458: ba 40 10 00 mv r2,r18 800445c: ba e0 18 00 mv r3,r23 pthread_mutex_lock (&aio_request_queue.mutex); if (rtems_chain_is_empty (chain)) { clock_gettime (CLOCK_REALTIME, &timeout); timeout.tv_sec += 3; 8004460: 5b 84 00 5c sw (sp+92),r4 timeout.tv_nsec = 0; 8004464: 5b 80 00 60 sw (sp+96),r0 result = pthread_cond_timedwait (&r_chain->cond, 8004468: f8 00 02 31 calli 8004d2c &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) { 800446c: 5c 38 ff f1 bne r1,r24,8004430 <== NEVER TAKEN 8004470: b9 a0 08 00 mv r1,r13 8004474: f8 00 09 a3 calli 8006b00 <_Chain_Extract> rtems_chain_extract (&r_chain->next_fd); pthread_mutex_destroy (&r_chain->mutex); 8004478: b9 c0 08 00 mv r1,r14 800447c: f8 00 02 93 calli 8004ec8 pthread_cond_destroy (&r_chain->cond); 8004480: b9 60 08 00 mv r1,r11 8004484: f8 00 01 80 calli 8004a84 free (r_chain); 8004488: b9 a0 08 00 mv r1,r13 800448c: fb ff f7 a7 calli 8002328 } } AIO_printf ("Thread finished\n"); return NULL; } 8004490: 2a 4d 00 54 lw r13,(r18+84) 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)) { 8004494: 45 b5 00 0d be r13,r21,80044c8 } } /* 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; 8004498: 2a 83 00 68 lw r3,(r20+104) ++aio_request_queue.active_threads; 800449c: 2a 82 00 64 lw r2,(r20+100) 80044a0: b9 a0 08 00 mv r1,r13 } } /* 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; 80044a4: 34 63 ff ff addi r3,r3,-1 ++aio_request_queue.active_threads; 80044a8: 34 42 00 01 addi r2,r2,1 } } /* 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; 80044ac: 5a 83 00 68 sw (r20+104),r3 ++aio_request_queue.active_threads; 80044b0: 5a 82 00 64 sw (r20+100),r2 80044b4: f8 00 09 93 calli 8006b00 <_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); 80044b8: b9 a0 08 00 mv r1,r13 80044bc: fb ff ff 57 calli 8004218 80044c0: 35 ae 00 1c addi r14,r13,28 80044c4: e3 ff ff db bi 8004430 /* 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; 80044c8: 2a 44 00 68 lw r4,(r18+104) --aio_request_queue.active_threads; 80044cc: 2a 43 00 64 lw r3,(r18+100) clock_gettime (CLOCK_REALTIME, &timeout); 80044d0: ba e0 10 00 mv r2,r23 /* 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; 80044d4: 34 84 00 01 addi r4,r4,1 --aio_request_queue.active_threads; 80044d8: 34 63 ff ff addi r3,r3,-1 /* If the idle chain is empty sleep for 3 seconds and wait for a signal. The thread now becomes idle. */ if (rtems_chain_is_empty (&aio_request_queue.idle_req)) { AIO_printf ("Chain is empty [IQ], wait for work\n"); ++aio_request_queue.idle_threads; 80044dc: 5a 44 00 68 sw (r18+104),r4 --aio_request_queue.active_threads; 80044e0: 5a 43 00 64 sw (r18+100),r3 clock_gettime (CLOCK_REALTIME, &timeout); 80044e4: 34 01 00 01 mvi r1,1 80044e8: f8 00 01 44 calli 80049f8 timeout.tv_sec += 3; 80044ec: 2b 84 00 5c lw r4,(sp+92) timeout.tv_nsec = 0; result = pthread_cond_timedwait (&aio_request_queue.new_req, 80044f0: ba c0 08 00 mv r1,r22 80044f4: ba 40 10 00 mv r2,r18 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; 80044f8: 34 84 00 03 addi r4,r4,3 timeout.tv_nsec = 0; result = pthread_cond_timedwait (&aio_request_queue.new_req, 80044fc: ba e0 18 00 mv r3,r23 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; 8004500: 5b 84 00 5c sw (sp+92),r4 timeout.tv_nsec = 0; 8004504: 5b 80 00 60 sw (sp+96),r0 result = pthread_cond_timedwait (&aio_request_queue.new_req, 8004508: f8 00 02 09 calli 8004d2c &aio_request_queue.mutex, &timeout); /* If no new fd chain was added in the idle requests then this thread is finished */ if (result == ETIMEDOUT) { 800450c: 44 38 00 05 be r1,r24,8004520 <== ALWAYS TAKEN 8004510: 2a 4d 00 54 lw r13,(r18+84) <== NOT EXECUTED 8004514: e3 ff ff e1 bi 8004498 <== NOT EXECUTED break; default: result = -1; } if (result == -1) { 8004518: 29 6c 00 14 lw r12,(r11+20) <== NOT EXECUTED 800451c: e3 ff ff 90 bi 800435c <== NOT EXECUTED /* If no new fd chain was added in the idle requests then this thread is finished */ if (result == ETIMEDOUT) { AIO_printf ("Etimeout\n"); --aio_request_queue.idle_threads; 8004520: 2a 42 00 68 lw r2,(r18+104) pthread_mutex_unlock (&aio_request_queue.mutex); 8004524: ba 40 08 00 mv r1,r18 /* If no new fd chain was added in the idle requests then this thread is finished */ if (result == ETIMEDOUT) { AIO_printf ("Etimeout\n"); --aio_request_queue.idle_threads; 8004528: 34 42 ff ff addi r2,r2,-1 800452c: 5a 42 00 68 sw (r18+104),r2 pthread_mutex_unlock (&aio_request_queue.mutex); 8004530: f8 00 03 5e calli 80052a8 return NULL; 8004534: e3 ff ff 91 bi 8004378 =============================================================================== 08003ff8 : * 0 - if initialization succeeded */ int rtems_aio_init (void) { 8003ff8: 37 9c ff f0 addi sp,sp,-16 8003ffc: 5b 8b 00 10 sw (sp+16),r11 8004000: 5b 8c 00 0c sw (sp+12),r12 8004004: 5b 8d 00 08 sw (sp+8),r13 8004008: 5b 9d 00 04 sw (sp+4),ra int result = 0; result = pthread_attr_init (&aio_request_queue.attr); 800400c: 78 0c 08 01 mvhi r12,0x801 8004010: 39 8c 88 40 ori r12,r12,0x8840 8004014: b9 80 08 00 mv r1,r12 8004018: f8 00 04 f3 calli 80053e4 800401c: b8 20 68 00 mv r13,r1 if (result != 0) 8004020: 44 20 00 08 be r1,r0,8004040 <== ALWAYS TAKEN aio_request_queue.active_threads = 0; aio_request_queue.idle_threads = 0; aio_request_queue.initialized = AIO_QUEUE_INITIALIZED; return result; } 8004024: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED 8004028: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 800402c: 2b 8b 00 10 lw r11,(sp+16) <== NOT EXECUTED 8004030: 2b 8c 00 0c lw r12,(sp+12) <== NOT EXECUTED 8004034: 2b 8d 00 08 lw r13,(sp+8) <== NOT EXECUTED 8004038: 37 9c 00 10 addi sp,sp,16 <== NOT EXECUTED 800403c: c3 a0 00 00 ret <== NOT EXECUTED result = pthread_attr_init (&aio_request_queue.attr); if (result != 0) return result; result = 8004040: b9 80 08 00 mv r1,r12 8004044: 34 02 00 00 mvi r2,0 8004048: f8 00 05 1e calli 80054c0 pthread_attr_setdetachstate (&aio_request_queue.attr, PTHREAD_CREATE_DETACHED); if (result != 0) 800404c: 5c 2d 00 26 bne r1,r13,80040e4 <== NEVER TAKEN pthread_attr_destroy (&aio_request_queue.attr); result = pthread_mutex_init (&aio_request_queue.mutex, NULL); 8004050: 78 0b 08 01 mvhi r11,0x801 8004054: 39 6b 88 38 ori r11,r11,0x8838 8004058: b9 60 08 00 mv r1,r11 800405c: 34 02 00 00 mvi r2,0 8004060: f8 00 04 01 calli 8005064 if (result != 0) 8004064: 5c 20 00 28 bne r1,r0,8004104 <== NEVER TAKEN pthread_attr_destroy (&aio_request_queue.attr); result = pthread_cond_init (&aio_request_queue.new_req, NULL); 8004068: 78 01 08 01 mvhi r1,0x801 800406c: 38 21 88 3c ori r1,r1,0x883c 8004070: 34 02 00 00 mvi r2,0 8004074: f8 00 02 c4 calli 8004b84 8004078: b8 20 68 00 mv r13,r1 if (result != 0) { 800407c: 5c 20 00 2a bne r1,r0,8004124 <== NEVER TAKEN Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; head->previous = NULL; tail->previous = head; 8004080: 78 01 08 01 mvhi r1,0x801 8004084: 38 21 88 8c ori r1,r1,0x888c 8004088: 59 61 00 5c sw (r11+92),r1 ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; 800408c: 78 04 08 01 mvhi r4,0x801 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; 8004090: 38 01 b0 0b mvu r1,0xb00b head->previous = NULL; tail->previous = head; 8004094: 78 03 08 01 mvhi r3,0x801 ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; 8004098: 78 02 08 01 mvhi r2,0x801 800409c: 38 84 88 84 ori r4,r4,0x8884 head->previous = NULL; tail->previous = head; 80040a0: 38 63 88 80 ori r3,r3,0x8880 ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; 80040a4: 38 42 88 90 ori r2,r2,0x8890 80040a8: 59 61 00 60 sw (r11+96),r1 return result; } 80040ac: b9 a0 08 00 mv r1,r13 80040b0: 59 64 00 48 sw (r11+72),r4 head->previous = NULL; 80040b4: 59 60 00 4c sw (r11+76),r0 tail->previous = head; 80040b8: 59 63 00 50 sw (r11+80),r3 ) { Chain_Node *head = _Chain_Head( the_chain ); Chain_Node *tail = _Chain_Tail( the_chain ); head->next = tail; 80040bc: 59 62 00 54 sw (r11+84),r2 head->previous = NULL; 80040c0: 59 60 00 58 sw (r11+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; 80040c4: 59 60 00 64 sw (r11+100),r0 aio_request_queue.idle_threads = 0; 80040c8: 59 60 00 68 sw (r11+104),r0 aio_request_queue.initialized = AIO_QUEUE_INITIALIZED; return result; } 80040cc: 2b 9d 00 04 lw ra,(sp+4) 80040d0: 2b 8b 00 10 lw r11,(sp+16) 80040d4: 2b 8c 00 0c lw r12,(sp+12) 80040d8: 2b 8d 00 08 lw r13,(sp+8) 80040dc: 37 9c 00 10 addi sp,sp,16 80040e0: c3 a0 00 00 ret result = pthread_attr_setdetachstate (&aio_request_queue.attr, PTHREAD_CREATE_DETACHED); if (result != 0) pthread_attr_destroy (&aio_request_queue.attr); 80040e4: b9 80 08 00 mv r1,r12 <== NOT EXECUTED result = pthread_mutex_init (&aio_request_queue.mutex, NULL); 80040e8: 78 0b 08 01 mvhi r11,0x801 <== NOT EXECUTED result = pthread_attr_setdetachstate (&aio_request_queue.attr, PTHREAD_CREATE_DETACHED); if (result != 0) pthread_attr_destroy (&aio_request_queue.attr); 80040ec: f8 00 04 b6 calli 80053c4 <== NOT EXECUTED result = pthread_mutex_init (&aio_request_queue.mutex, NULL); 80040f0: 39 6b 88 38 ori r11,r11,0x8838 <== NOT EXECUTED 80040f4: b9 60 08 00 mv r1,r11 <== NOT EXECUTED 80040f8: 34 02 00 00 mvi r2,0 <== NOT EXECUTED 80040fc: f8 00 03 da calli 8005064 <== NOT EXECUTED if (result != 0) 8004100: 44 20 ff da be r1,r0,8004068 <== NOT EXECUTED pthread_attr_destroy (&aio_request_queue.attr); 8004104: b9 80 08 00 mv r1,r12 <== NOT EXECUTED 8004108: f8 00 04 af calli 80053c4 <== NOT EXECUTED result = pthread_cond_init (&aio_request_queue.new_req, NULL); 800410c: 78 01 08 01 mvhi r1,0x801 <== NOT EXECUTED 8004110: 38 21 88 3c ori r1,r1,0x883c <== NOT EXECUTED 8004114: 34 02 00 00 mvi r2,0 <== NOT EXECUTED 8004118: f8 00 02 9b calli 8004b84 <== NOT EXECUTED 800411c: b8 20 68 00 mv r13,r1 <== NOT EXECUTED if (result != 0) { 8004120: 44 20 ff d8 be r1,r0,8004080 <== NOT EXECUTED pthread_mutex_destroy (&aio_request_queue.mutex); 8004124: b9 60 08 00 mv r1,r11 <== NOT EXECUTED 8004128: f8 00 03 68 calli 8004ec8 <== NOT EXECUTED pthread_attr_destroy (&aio_request_queue.attr); 800412c: b9 80 08 00 mv r1,r12 <== NOT EXECUTED 8004130: f8 00 04 a5 calli 80053c4 <== NOT EXECUTED 8004134: e3 ff ff d3 bi 8004080 <== NOT EXECUTED =============================================================================== 08004538 : * NONE */ void rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req) { 8004538: 37 9c ff fc addi sp,sp,-4 800453c: 5b 9d 00 04 sw (sp+4),ra } } AIO_printf ("Thread finished\n"); return NULL; } 8004540: 28 24 00 00 lw r4,(r1+0) 8004544: 34 26 00 04 addi r6,r1,4 * NONE */ void rtems_aio_insert_prio (rtems_chain_control *chain, rtems_aio_request *req) { 8004548: b8 40 38 00 mv r7,r2 rtems_chain_node *node; AIO_printf ("FD exists \n"); node = rtems_chain_first (chain); if (rtems_chain_is_empty (chain)) { 800454c: 44 86 00 10 be r4,r6,800458c <== NEVER TAKEN rtems_chain_prepend (chain, &req->next_prio); } else { AIO_printf ("Add by priority \n"); int prio = ((rtems_aio_request *) node)->aiocbp->aio_reqprio; while (req->aiocbp->aio_reqprio > prio && 8004550: 28 41 00 14 lw r1,(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; 8004554: 28 82 00 14 lw r2,(r4+20) while (req->aiocbp->aio_reqprio > prio && 8004558: b8 80 18 00 mv r3,r4 800455c: 28 21 00 10 lw r1,(r1+16) 8004560: 28 42 00 10 lw r2,(r2+16) 8004564: 4c 41 00 08 bge r2,r1,8004584 <== ALWAYS TAKEN } } AIO_printf ("Thread finished\n"); return NULL; } 8004568: 28 83 00 00 lw r3,(r4+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; 800456c: 28 65 00 14 lw r5,(r3+20) <== 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 && 8004570: b8 60 20 00 mv r4,r3 <== NOT EXECUTED 8004574: 28 a5 00 10 lw r5,(r5+16) <== NOT EXECUTED 8004578: 4c a1 00 03 bge r5,r1,8004584 <== NOT EXECUTED 800457c: 5c 66 ff fb bne r3,r6,8004568 <== NOT EXECUTED } } AIO_printf ("Thread finished\n"); return NULL; } 8004580: b8 c0 18 00 mv r3,r6 <== NOT EXECUTED RTEMS_INLINE_ROUTINE void rtems_chain_insert( rtems_chain_node *after_node, rtems_chain_node *the_node ) { _Chain_Insert( after_node, the_node ); 8004584: 28 61 00 04 lw r1,(r3+4) 8004588: b8 e0 10 00 mv r2,r7 800458c: f8 00 09 78 calli 8006b6c <_Chain_Insert> } rtems_chain_insert (node->previous, &req->next_prio); } } 8004590: 2b 9d 00 04 lw ra,(sp+4) 8004594: 37 9c 00 04 addi sp,sp,4 8004598: c3 a0 00 00 ret =============================================================================== 08004218 : * NONE */ void rtems_aio_move_to_work (rtems_aio_request_chain *r_chain) { 8004218: 37 9c ff fc addi sp,sp,-4 800421c: 5b 9d 00 04 sw (sp+4),ra } } AIO_printf ("Thread finished\n"); return NULL; } 8004220: 78 02 08 01 mvhi r2,0x801 8004224: 38 42 88 38 ori r2,r2,0x8838 8004228: 28 44 00 48 lw r4,(r2+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 && 800422c: 28 26 00 14 lw r6,(r1+20) * NONE */ void rtems_aio_move_to_work (rtems_aio_request_chain *r_chain) { 8004230: b8 20 10 00 mv r2,r1 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 && 8004234: 28 81 00 14 lw r1,(r4+20) 8004238: b8 80 18 00 mv r3,r4 800423c: 4c 26 00 0a bge r1,r6,8004264 <== NEVER TAKEN 8004240: 78 05 08 01 mvhi r5,0x801 8004244: 38 a5 88 84 ori r5,r5,0x8884 8004248: 44 85 00 07 be r4,r5,8004264 <== NEVER TAKEN } } AIO_printf ("Thread finished\n"); return NULL; } 800424c: 28 83 00 00 lw r3,(r4+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 && 8004250: 28 67 00 14 lw r7,(r3+20) 8004254: b8 60 20 00 mv r4,r3 8004258: 4c e6 00 03 bge r7,r6,8004264 800425c: 5c 65 ff fc bne r3,r5,800424c <== ALWAYS TAKEN 8004260: b8 a0 18 00 mv r3,r5 <== NOT EXECUTED 8004264: 28 61 00 04 lw r1,(r3+4) 8004268: f8 00 0a 41 calli 8006b6c <_Chain_Insert> node = rtems_chain_next (node); temp = (rtems_aio_request_chain *) node; } rtems_chain_insert (rtems_chain_previous (node), &r_chain->next_fd); } 800426c: 2b 9d 00 04 lw ra,(sp+4) 8004270: 37 9c 00 04 addi sp,sp,4 8004274: c3 a0 00 00 ret =============================================================================== 0800459c : * Output parameters: * NONE */ void rtems_aio_remove_fd (rtems_aio_request_chain *r_chain) { 800459c: 37 9c ff e8 addi sp,sp,-24 80045a0: 5b 8b 00 18 sw (sp+24),r11 80045a4: 5b 8c 00 14 sw (sp+20),r12 80045a8: 5b 8d 00 10 sw (sp+16),r13 80045ac: 5b 8e 00 0c sw (sp+12),r14 80045b0: 5b 8f 00 08 sw (sp+8),r15 80045b4: 5b 9d 00 04 sw (sp+4),ra } } AIO_printf ("Thread finished\n"); return NULL; } 80045b8: 28 2b 00 08 lw r11,(r1+8) RTEMS_INLINE_ROUTINE bool _Chain_Is_tail( Chain_Control *the_chain, const Chain_Node *the_node ) { return (the_node == _Chain_Tail(the_chain)); 80045bc: 34 2d 00 0c addi r13,r1,12 while (!rtems_chain_is_tail (chain, node)) { rtems_chain_extract (node); rtems_aio_request *req = (rtems_aio_request *) node; node = rtems_chain_next (node); req->aiocbp->error_code = ECANCELED; 80045c0: 34 0f 00 8c mvi r15,140 req->aiocbp->return_value = -1; 80045c4: 34 0e ff ff mvi r14,-1 rtems_chain_control *chain; rtems_chain_node *node; chain = &r_chain->perfd; node = rtems_chain_first (chain); while (!rtems_chain_is_tail (chain, node)) 80045c8: 5d 6d 00 03 bne r11,r13,80045d4 <== ALWAYS TAKEN 80045cc: e0 00 00 0b bi 80045f8 <== NOT EXECUTED { rtems_chain_extract (node); rtems_aio_request *req = (rtems_aio_request *) node; node = rtems_chain_next (node); 80045d0: b9 80 58 00 mv r11,r12 */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); 80045d4: b9 60 08 00 mv r1,r11 80045d8: f8 00 09 4a calli 8006b00 <_Chain_Extract> req->aiocbp->error_code = ECANCELED; 80045dc: 29 62 00 14 lw r2,(r11+20) } } AIO_printf ("Thread finished\n"); return NULL; } 80045e0: 29 6c 00 00 lw r12,(r11+0) rtems_chain_extract (node); rtems_aio_request *req = (rtems_aio_request *) node; node = rtems_chain_next (node); req->aiocbp->error_code = ECANCELED; req->aiocbp->return_value = -1; free (req); 80045e4: b9 60 08 00 mv r1,r11 while (!rtems_chain_is_tail (chain, node)) { rtems_chain_extract (node); rtems_aio_request *req = (rtems_aio_request *) node; node = rtems_chain_next (node); req->aiocbp->error_code = ECANCELED; 80045e8: 58 4f 00 2c sw (r2+44),r15 req->aiocbp->return_value = -1; 80045ec: 58 4e 00 30 sw (r2+48),r14 free (req); 80045f0: fb ff f7 4e calli 8002328 rtems_chain_control *chain; rtems_chain_node *node; chain = &r_chain->perfd; node = rtems_chain_first (chain); while (!rtems_chain_is_tail (chain, node)) 80045f4: 5d 8d ff f7 bne r12,r13,80045d0 node = rtems_chain_next (node); req->aiocbp->error_code = ECANCELED; req->aiocbp->return_value = -1; free (req); } } 80045f8: 2b 9d 00 04 lw ra,(sp+4) 80045fc: 2b 8b 00 18 lw r11,(sp+24) 8004600: 2b 8c 00 14 lw r12,(sp+20) 8004604: 2b 8d 00 10 lw r13,(sp+16) 8004608: 2b 8e 00 0c lw r14,(sp+12) 800460c: 2b 8f 00 08 lw r15,(sp+8) 8004610: 37 9c 00 18 addi sp,sp,24 8004614: c3 a0 00 00 ret =============================================================================== 08004618 : * 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) { 8004618: 37 9c ff f8 addi sp,sp,-8 800461c: 5b 8b 00 08 sw (sp+8),r11 8004620: 5b 9d 00 04 sw (sp+4),ra } } AIO_printf ("Thread finished\n"); return NULL; } 8004624: 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 ); 8004628: 34 25 00 04 addi r5,r1,4 */ int rtems_aio_remove_req (rtems_chain_control *chain, struct aiocb *aiocbp) { if (rtems_chain_is_empty (chain)) return AIO_ALLDONE; 800462c: 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)) 8004630: 44 65 00 0b be r3,r5,800465c 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) { 8004634: 28 61 00 14 lw r1,(r3+20) return AIO_ALLDONE; rtems_chain_node *node = rtems_chain_first (chain); rtems_aio_request *current; current = (rtems_aio_request *) node; 8004638: b8 60 58 00 mv r11,r3 while (!rtems_chain_is_tail (chain, node) && current->aiocbp != aiocbp) { 800463c: 5c 22 00 05 bne r1,r2,8004650 <== NEVER TAKEN 8004640: e0 00 00 0b bi 800466c 8004644: 28 64 00 14 lw r4,(r3+20) <== NOT EXECUTED node = rtems_chain_next (node); current = (rtems_aio_request *) node; 8004648: b8 60 58 00 mv r11,r3 <== NOT EXECUTED rtems_chain_node *node = rtems_chain_first (chain); rtems_aio_request *current; current = (rtems_aio_request *) node; while (!rtems_chain_is_tail (chain, node) && current->aiocbp != aiocbp) { 800464c: 44 82 00 08 be r4,r2,800466c <== NOT EXECUTED } } AIO_printf ("Thread finished\n"); return NULL; } 8004650: 28 63 00 00 lw r3,(r3+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) { 8004654: 5c 65 ff fc bne r3,r5,8004644 <== NOT EXECUTED node = rtems_chain_next (node); current = (rtems_aio_request *) node; } if (rtems_chain_is_tail (chain, node)) return AIO_NOTCANCELED; 8004658: 34 01 00 01 mvi r1,1 <== NOT EXECUTED current->aiocbp->return_value = -1; free (current); } return AIO_CANCELED; } 800465c: 2b 9d 00 04 lw ra,(sp+4) 8004660: 2b 8b 00 08 lw r11,(sp+8) 8004664: 37 9c 00 08 addi sp,sp,8 8004668: c3 a0 00 00 ret 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) { 800466c: b9 60 08 00 mv r1,r11 8004670: f8 00 09 24 calli 8006b00 <_Chain_Extract> if (rtems_chain_is_tail (chain, node)) return AIO_NOTCANCELED; else { rtems_chain_extract (node); current->aiocbp->error_code = ECANCELED; 8004674: 29 61 00 14 lw r1,(r11+20) 8004678: 34 02 00 8c mvi r2,140 800467c: 58 22 00 2c sw (r1+44),r2 current->aiocbp->return_value = -1; 8004680: 34 02 ff ff mvi r2,-1 8004684: 58 22 00 30 sw (r1+48),r2 free (current); 8004688: b9 60 08 00 mv r1,r11 800468c: fb ff f7 27 calli 8002328 } return AIO_CANCELED; 8004690: 34 01 00 00 mvi r1,0 } 8004694: 2b 9d 00 04 lw ra,(sp+4) 8004698: 2b 8b 00 08 lw r11,(sp+8) 800469c: 37 9c 00 08 addi sp,sp,8 80046a0: c3 a0 00 00 ret =============================================================================== 0800c0a8 : uint32_t rtems_assoc_local_by_remote_bitfield( const rtems_assoc_t *ap, uint32_t remote_value ) { 800c0a8: 37 9c ff e8 addi sp,sp,-24 800c0ac: 5b 8b 00 18 sw (sp+24),r11 800c0b0: 5b 8c 00 14 sw (sp+20),r12 800c0b4: 5b 8d 00 10 sw (sp+16),r13 800c0b8: 5b 8e 00 0c sw (sp+12),r14 800c0bc: 5b 8f 00 08 sw (sp+8),r15 800c0c0: 5b 9d 00 04 sw (sp+4),ra 800c0c4: 34 0c 00 20 mvi r12,32 800c0c8: b8 20 78 00 mv r15,r1 800c0cc: b8 40 68 00 mv r13,r2 uint32_t b; uint32_t local_value = 0; 800c0d0: 34 0e 00 00 mvi r14,0 for (b = 1; b; b <<= 1) { 800c0d4: 34 0b 00 01 mvi r11,1 800c0d8: e0 00 00 03 bi 800c0e4 800c0dc: b5 6b 58 00 add r11,r11,r11 800c0e0: 45 80 00 0a be r12,r0,800c108 if (b & remote_value) 800c0e4: a1 6d 18 00 and r3,r11,r13 ) { uint32_t b; uint32_t local_value = 0; for (b = 1; b; b <<= 1) { 800c0e8: 35 8c ff ff addi r12,r12,-1 if (b & remote_value) 800c0ec: 44 60 ff fc be r3,r0,800c0dc local_value |= rtems_assoc_local_by_remote(ap, b); 800c0f0: b9 60 10 00 mv r2,r11 800c0f4: b9 e0 08 00 mv r1,r15 800c0f8: f8 00 00 0d calli 800c12c 800c0fc: b9 c1 70 00 or r14,r14,r1 ) { uint32_t b; uint32_t local_value = 0; for (b = 1; b; b <<= 1) { 800c100: b5 6b 58 00 add r11,r11,r11 800c104: 5d 80 ff f8 bne r12,r0,800c0e4 <== ALWAYS TAKEN if (b & remote_value) local_value |= rtems_assoc_local_by_remote(ap, b); } return local_value; } 800c108: b9 c0 08 00 mv r1,r14 800c10c: 2b 9d 00 04 lw ra,(sp+4) 800c110: 2b 8b 00 18 lw r11,(sp+24) 800c114: 2b 8c 00 14 lw r12,(sp+20) 800c118: 2b 8d 00 10 lw r13,(sp+16) 800c11c: 2b 8e 00 0c lw r14,(sp+12) 800c120: 2b 8f 00 08 lw r15,(sp+8) 800c124: 37 9c 00 18 addi sp,sp,24 800c128: c3 a0 00 00 ret =============================================================================== 0800f634 : const rtems_assoc_t *rtems_assoc_ptr_by_local( const rtems_assoc_t *ap, uint32_t local_value ) { 800f634: 37 9c ff f4 addi sp,sp,-12 800f638: 5b 8b 00 0c sw (sp+12),r11 800f63c: 5b 8c 00 08 sw (sp+8),r12 800f640: 5b 9d 00 04 sw (sp+4),ra 800f644: b8 20 58 00 mv r11,r1 const rtems_assoc_t *default_ap = 0; if (rtems_assoc_is_default(ap)) 800f648: 28 21 00 00 lw r1,(r1+0) const rtems_assoc_t *rtems_assoc_ptr_by_local( const rtems_assoc_t *ap, uint32_t local_value ) { 800f64c: b8 40 60 00 mv r12,r2 const rtems_assoc_t *default_ap = 0; if (rtems_assoc_is_default(ap)) 800f650: 44 20 00 1f be r1,r0,800f6cc <== NEVER TAKEN 800f654: 78 02 08 02 mvhi r2,0x802 800f658: 38 42 85 b8 ori r2,r2,0x85b8 800f65c: f8 00 17 59 calli 80153c0 const rtems_assoc_t *rtems_assoc_ptr_by_local( const rtems_assoc_t *ap, uint32_t local_value ) { const rtems_assoc_t *default_ap = 0; 800f660: 34 02 00 00 mvi r2,0 if (rtems_assoc_is_default(ap)) 800f664: 5c 20 00 0b bne r1,r0,800f690 default_ap = ap++; for ( ; ap->name; ap++) 800f668: 29 63 00 0c lw r3,(r11+12) ) { const rtems_assoc_t *default_ap = 0; if (rtems_assoc_is_default(ap)) default_ap = ap++; 800f66c: 35 61 00 0c addi r1,r11,12 for ( ; ap->name; ap++) 800f670: 44 62 00 0a be r3,r2,800f698 <== NEVER TAKEN 800f674: b9 60 10 00 mv r2,r11 800f678: b8 20 58 00 mv r11,r1 if (ap->local_value == local_value) 800f67c: 29 61 00 04 lw r1,(r11+4) 800f680: 44 2c 00 06 be r1,r12,800f698 <== NEVER TAKEN const rtems_assoc_t *default_ap = 0; if (rtems_assoc_is_default(ap)) default_ap = ap++; for ( ; ap->name; ap++) 800f684: 35 6b 00 0c addi r11,r11,12 800f688: 29 61 00 00 lw r1,(r11+0) 800f68c: 44 20 00 09 be r1,r0,800f6b0 if (ap->local_value == local_value) 800f690: 29 61 00 04 lw r1,(r11+4) 800f694: 5c 2c ff fc bne r1,r12,800f684 return ap; return default_ap; } 800f698: b9 60 08 00 mv r1,r11 800f69c: 2b 9d 00 04 lw ra,(sp+4) 800f6a0: 2b 8b 00 0c lw r11,(sp+12) 800f6a4: 2b 8c 00 08 lw r12,(sp+8) 800f6a8: 37 9c 00 0c addi sp,sp,12 800f6ac: c3 a0 00 00 ret const rtems_assoc_t *default_ap = 0; if (rtems_assoc_is_default(ap)) default_ap = ap++; for ( ; ap->name; ap++) 800f6b0: b8 40 58 00 mv r11,r2 if (ap->local_value == local_value) return ap; return default_ap; } 800f6b4: b9 60 08 00 mv r1,r11 800f6b8: 2b 9d 00 04 lw ra,(sp+4) 800f6bc: 2b 8b 00 0c lw r11,(sp+12) 800f6c0: 2b 8c 00 08 lw r12,(sp+8) 800f6c4: 37 9c 00 0c addi sp,sp,12 800f6c8: c3 a0 00 00 ret const rtems_assoc_t *rtems_assoc_ptr_by_local( const rtems_assoc_t *ap, uint32_t local_value ) { const rtems_assoc_t *default_ap = 0; 800f6cc: 34 0b 00 00 mvi r11,0 for ( ; ap->name; ap++) if (ap->local_value == local_value) return ap; return default_ap; } 800f6d0: b9 60 08 00 mv r1,r11 800f6d4: 2b 9d 00 04 lw ra,(sp+4) 800f6d8: 2b 8b 00 0c lw r11,(sp+12) 800f6dc: 2b 8c 00 08 lw r12,(sp+8) 800f6e0: 37 9c 00 0c addi sp,sp,12 800f6e4: c3 a0 00 00 ret =============================================================================== 08002050 : const rtems_assoc_t *rtems_assoc_ptr_by_name( const rtems_assoc_t *ap, const char *name ) { 8002050: 37 9c ff ec addi sp,sp,-20 8002054: 5b 8b 00 14 sw (sp+20),r11 8002058: 5b 8c 00 10 sw (sp+16),r12 800205c: 5b 8d 00 0c sw (sp+12),r13 8002060: 5b 8e 00 08 sw (sp+8),r14 8002064: 5b 9d 00 04 sw (sp+4),ra const rtems_assoc_t *default_ap = 0; if (rtems_assoc_is_default(ap)) 8002068: 28 2b 00 00 lw r11,(r1+0) const rtems_assoc_t *rtems_assoc_ptr_by_name( const rtems_assoc_t *ap, const char *name ) { 800206c: b8 20 60 00 mv r12,r1 8002070: b8 40 68 00 mv r13,r2 const rtems_assoc_t *default_ap = 0; if (rtems_assoc_is_default(ap)) 8002074: 45 60 00 28 be r11,r0,8002114 8002078: 78 02 08 01 mvhi r2,0x801 800207c: b9 60 08 00 mv r1,r11 8002080: 38 42 48 90 ori r2,r2,0x4890 8002084: f8 00 33 20 calli 800ed04 const rtems_assoc_t *rtems_assoc_ptr_by_name( const rtems_assoc_t *ap, const char *name ) { const rtems_assoc_t *default_ap = 0; 8002088: 34 0e 00 00 mvi r14,0 if (rtems_assoc_is_default(ap)) 800208c: 5c 20 00 0d bne r1,r0,80020c0 default_ap = ap++; for ( ; ap->name; ap++) 8002090: 29 8b 00 0c lw r11,(r12+12) ) { const rtems_assoc_t *default_ap = 0; if (rtems_assoc_is_default(ap)) default_ap = ap++; 8002094: 35 81 00 0c addi r1,r12,12 for ( ; ap->name; ap++) 8002098: 45 6e 00 0e be r11,r14,80020d0 <== NEVER TAKEN 800209c: b9 80 70 00 mv r14,r12 if (strcmp(ap->name, name) == 0) 80020a0: b9 a0 10 00 mv r2,r13 const rtems_assoc_t *default_ap = 0; if (rtems_assoc_is_default(ap)) default_ap = ap++; for ( ; ap->name; ap++) 80020a4: b8 20 60 00 mv r12,r1 if (strcmp(ap->name, name) == 0) 80020a8: b9 60 08 00 mv r1,r11 80020ac: f8 00 33 16 calli 800ed04 80020b0: 44 20 00 08 be r1,r0,80020d0 <== NEVER TAKEN const rtems_assoc_t *default_ap = 0; if (rtems_assoc_is_default(ap)) default_ap = ap++; for ( ; ap->name; ap++) 80020b4: 35 8c 00 0c addi r12,r12,12 80020b8: 29 8b 00 00 lw r11,(r12+0) 80020bc: 45 60 00 0d be r11,r0,80020f0 if (strcmp(ap->name, name) == 0) 80020c0: b9 60 08 00 mv r1,r11 80020c4: b9 a0 10 00 mv r2,r13 80020c8: f8 00 33 0f calli 800ed04 80020cc: 5c 20 ff fa bne r1,r0,80020b4 return ap; return default_ap; } 80020d0: b9 80 08 00 mv r1,r12 80020d4: 2b 9d 00 04 lw ra,(sp+4) 80020d8: 2b 8b 00 14 lw r11,(sp+20) 80020dc: 2b 8c 00 10 lw r12,(sp+16) 80020e0: 2b 8d 00 0c lw r13,(sp+12) 80020e4: 2b 8e 00 08 lw r14,(sp+8) 80020e8: 37 9c 00 14 addi sp,sp,20 80020ec: c3 a0 00 00 ret const rtems_assoc_t *default_ap = 0; if (rtems_assoc_is_default(ap)) default_ap = ap++; for ( ; ap->name; ap++) 80020f0: b9 c0 60 00 mv r12,r14 if (strcmp(ap->name, name) == 0) return ap; return default_ap; } 80020f4: b9 80 08 00 mv r1,r12 80020f8: 2b 9d 00 04 lw ra,(sp+4) 80020fc: 2b 8b 00 14 lw r11,(sp+20) 8002100: 2b 8c 00 10 lw r12,(sp+16) 8002104: 2b 8d 00 0c lw r13,(sp+12) 8002108: 2b 8e 00 08 lw r14,(sp+8) 800210c: 37 9c 00 14 addi sp,sp,20 8002110: c3 a0 00 00 ret const rtems_assoc_t *rtems_assoc_ptr_by_name( const rtems_assoc_t *ap, const char *name ) { const rtems_assoc_t *default_ap = 0; 8002114: 34 0c 00 00 mvi r12,0 for ( ; ap->name; ap++) if (strcmp(ap->name, name) == 0) return ap; return default_ap; } 8002118: b9 80 08 00 mv r1,r12 800211c: 2b 9d 00 04 lw ra,(sp+4) 8002120: 2b 8b 00 14 lw r11,(sp+20) 8002124: 2b 8c 00 10 lw r12,(sp+16) 8002128: 2b 8d 00 0c lw r13,(sp+12) 800212c: 2b 8e 00 08 lw r14,(sp+8) 8002130: 37 9c 00 14 addi sp,sp,20 8002134: c3 a0 00 00 ret =============================================================================== 0800c154 : const rtems_assoc_t *rtems_assoc_ptr_by_remote( const rtems_assoc_t *ap, uint32_t remote_value ) { 800c154: 37 9c ff f4 addi sp,sp,-12 800c158: 5b 8b 00 0c sw (sp+12),r11 800c15c: 5b 8c 00 08 sw (sp+8),r12 800c160: 5b 9d 00 04 sw (sp+4),ra 800c164: b8 20 58 00 mv r11,r1 const rtems_assoc_t *default_ap = 0; if (rtems_assoc_is_default(ap)) 800c168: 28 21 00 00 lw r1,(r1+0) const rtems_assoc_t *rtems_assoc_ptr_by_remote( const rtems_assoc_t *ap, uint32_t remote_value ) { 800c16c: b8 40 60 00 mv r12,r2 const rtems_assoc_t *default_ap = 0; if (rtems_assoc_is_default(ap)) 800c170: 44 20 00 1f be r1,r0,800c1ec 800c174: 78 02 08 01 mvhi r2,0x801 800c178: 38 42 3b 34 ori r2,r2,0x3b34 800c17c: f8 00 07 40 calli 800de7c const rtems_assoc_t *rtems_assoc_ptr_by_remote( const rtems_assoc_t *ap, uint32_t remote_value ) { const rtems_assoc_t *default_ap = 0; 800c180: 34 02 00 00 mvi r2,0 if (rtems_assoc_is_default(ap)) 800c184: 5c 20 00 0b bne r1,r0,800c1b0 default_ap = ap++; for ( ; ap->name; ap++) 800c188: 29 63 00 0c lw r3,(r11+12) ) { const rtems_assoc_t *default_ap = 0; if (rtems_assoc_is_default(ap)) default_ap = ap++; 800c18c: 35 61 00 0c addi r1,r11,12 for ( ; ap->name; ap++) 800c190: 44 62 00 0a be r3,r2,800c1b8 <== NEVER TAKEN 800c194: b9 60 10 00 mv r2,r11 800c198: b8 20 58 00 mv r11,r1 if (ap->remote_value == remote_value) 800c19c: 29 61 00 08 lw r1,(r11+8) 800c1a0: 44 2c 00 06 be r1,r12,800c1b8 <== NEVER TAKEN const rtems_assoc_t *default_ap = 0; if (rtems_assoc_is_default(ap)) default_ap = ap++; for ( ; ap->name; ap++) 800c1a4: 35 6b 00 0c addi r11,r11,12 800c1a8: 29 61 00 00 lw r1,(r11+0) 800c1ac: 44 20 00 09 be r1,r0,800c1d0 if (ap->remote_value == remote_value) 800c1b0: 29 61 00 08 lw r1,(r11+8) 800c1b4: 5c 2c ff fc bne r1,r12,800c1a4 return ap; return default_ap; } 800c1b8: b9 60 08 00 mv r1,r11 800c1bc: 2b 9d 00 04 lw ra,(sp+4) 800c1c0: 2b 8b 00 0c lw r11,(sp+12) 800c1c4: 2b 8c 00 08 lw r12,(sp+8) 800c1c8: 37 9c 00 0c addi sp,sp,12 800c1cc: c3 a0 00 00 ret const rtems_assoc_t *default_ap = 0; if (rtems_assoc_is_default(ap)) default_ap = ap++; for ( ; ap->name; ap++) 800c1d0: b8 40 58 00 mv r11,r2 if (ap->remote_value == remote_value) return ap; return default_ap; } 800c1d4: b9 60 08 00 mv r1,r11 800c1d8: 2b 9d 00 04 lw ra,(sp+4) 800c1dc: 2b 8b 00 0c lw r11,(sp+12) 800c1e0: 2b 8c 00 08 lw r12,(sp+8) 800c1e4: 37 9c 00 0c addi sp,sp,12 800c1e8: c3 a0 00 00 ret const rtems_assoc_t *rtems_assoc_ptr_by_remote( const rtems_assoc_t *ap, uint32_t remote_value ) { const rtems_assoc_t *default_ap = 0; 800c1ec: 34 0b 00 00 mvi r11,0 for ( ; ap->name; ap++) if (ap->remote_value == remote_value) return ap; return default_ap; } 800c1f0: b9 60 08 00 mv r1,r11 800c1f4: 2b 9d 00 04 lw ra,(sp+4) 800c1f8: 2b 8b 00 0c lw r11,(sp+12) 800c1fc: 2b 8c 00 08 lw r12,(sp+8) 800c200: 37 9c 00 0c addi sp,sp,12 800c204: c3 a0 00 00 ret =============================================================================== 080021ec : uint32_t rtems_assoc_remote_by_local_bitfield( const rtems_assoc_t *ap, uint32_t local_value ) { 80021ec: 37 9c ff e8 addi sp,sp,-24 80021f0: 5b 8b 00 18 sw (sp+24),r11 80021f4: 5b 8c 00 14 sw (sp+20),r12 80021f8: 5b 8d 00 10 sw (sp+16),r13 80021fc: 5b 8e 00 0c sw (sp+12),r14 8002200: 5b 8f 00 08 sw (sp+8),r15 8002204: 5b 9d 00 04 sw (sp+4),ra 8002208: 34 0c 00 20 mvi r12,32 800220c: b8 20 78 00 mv r15,r1 8002210: b8 40 68 00 mv r13,r2 uint32_t b; uint32_t remote_value = 0; 8002214: 34 0e 00 00 mvi r14,0 for (b = 1; b; b <<= 1) 8002218: 34 0b 00 01 mvi r11,1 800221c: e0 00 00 03 bi 8002228 8002220: b5 6b 58 00 add r11,r11,r11 8002224: 45 80 00 0a be r12,r0,800224c if (b & local_value) 8002228: a1 6d 18 00 and r3,r11,r13 ) { uint32_t b; uint32_t remote_value = 0; for (b = 1; b; b <<= 1) 800222c: 35 8c ff ff addi r12,r12,-1 if (b & local_value) 8002230: 44 60 ff fc be r3,r0,8002220 remote_value |= rtems_assoc_remote_by_local(ap, b); 8002234: b9 60 10 00 mv r2,r11 8002238: b9 e0 08 00 mv r1,r15 800223c: f8 00 00 0d calli 8002270 8002240: b9 c1 70 00 or r14,r14,r1 ) { uint32_t b; uint32_t remote_value = 0; for (b = 1; b; b <<= 1) 8002244: b5 6b 58 00 add r11,r11,r11 8002248: 5d 80 ff f8 bne r12,r0,8002228 <== ALWAYS TAKEN if (b & local_value) remote_value |= rtems_assoc_remote_by_local(ap, b); return remote_value; } 800224c: b9 c0 08 00 mv r1,r14 8002250: 2b 9d 00 04 lw ra,(sp+4) 8002254: 2b 8b 00 18 lw r11,(sp+24) 8002258: 2b 8c 00 14 lw r12,(sp+20) 800225c: 2b 8d 00 10 lw r13,(sp+16) 8002260: 2b 8e 00 0c lw r14,(sp+12) 8002264: 2b 8f 00 08 lw r15,(sp+8) 8002268: 37 9c 00 18 addi sp,sp,24 800226c: c3 a0 00 00 ret =============================================================================== 08000da4 : const char *rtems_bsp_cmdline_get_param( const char *name, char *value, size_t length ) { 8000da4: 37 9c ff f0 addi sp,sp,-16 8000da8: 5b 8b 00 08 sw (sp+8),r11 8000dac: 5b 9d 00 04 sw (sp+4),ra const char *p; if ( !name ) return NULL; 8000db0: 34 0b 00 00 mvi r11,0 size_t length ) { const char *p; if ( !name ) 8000db4: 5c 20 00 06 bne r1,r0,8000dcc return NULL; copy_string( p, value, length ); return value; } 8000db8: b9 60 08 00 mv r1,r11 8000dbc: 2b 9d 00 04 lw ra,(sp+4) 8000dc0: 2b 8b 00 08 lw r11,(sp+8) 8000dc4: 37 9c 00 10 addi sp,sp,16 8000dc8: c3 a0 00 00 ret const char *p; if ( !name ) return NULL; if ( !value ) 8000dcc: 44 40 ff fb be r2,r0,8000db8 return NULL; if ( !length ) 8000dd0: 44 60 ff fa be r3,r0,8000db8 return NULL; value[0] = '\0'; 8000dd4: 30 40 00 00 sb (r2+0),r0 p = rtems_bsp_cmdline_get_param_raw( name ); 8000dd8: 5b 82 00 10 sw (sp+16),r2 8000ddc: 5b 83 00 0c sw (sp+12),r3 8000de0: f8 00 00 20 calli 8000e60 if ( !p ) 8000de4: 2b 82 00 10 lw r2,(sp+16) 8000de8: 2b 83 00 0c lw r3,(sp+12) 8000dec: 44 20 ff f3 be r1,r0,8000db8 int i; int quotes; const char *p = start; quotes=0; for (i=0 ; *p && i<== NEVER TAKEN 8000dfc: 34 63 ff ff addi r3,r3,-1 8000e00: 44 60 ff ee be r3,r0,8000db8 <== NEVER TAKEN 8000e04: 34 07 00 00 mvi r7,0 8000e08: 34 04 00 00 mvi r4,0 8000e0c: 34 06 00 00 mvi r6,0 if ( *p == '\"' ) { 8000e10: 34 09 00 22 mvi r9,34 quotes++; } else if ( ((quotes % 2) == 0) && *p == ' ' ) 8000e14: 34 0a 00 20 mvi r10,32 8000e18: 20 c8 00 01 andi r8,r6,0x1 int quotes; const char *p = start; quotes=0; for (i=0 ; *p && i quotes++; } else if ( ((quotes % 2) == 0) && *p == ' ' ) 8000e20: 5d 00 00 02 bne r8,r0,8000e28 8000e24: 44 aa 00 0b be r5,r10,8000e50 break; value[i++] = *p++; 8000e28: 34 84 00 01 addi r4,r4,1 8000e2c: b4 47 38 00 add r7,r2,r7 8000e30: 30 e5 00 00 sb (r7+0),r5 value[i] = '\0'; } } const char *rtems_bsp_cmdline_get_param( 8000e34: b4 44 28 00 add r5,r2,r4 if ( *p == '\"' ) { quotes++; } else if ( ((quotes % 2) == 0) && *p == ' ' ) break; value[i++] = *p++; value[i] = '\0'; 8000e38: 30 a0 00 00 sb (r5+0),r0 } } const char *rtems_bsp_cmdline_get_param( 8000e3c: b4 24 28 00 add r5,r1,r4 int i; int quotes; const char *p = start; quotes=0; for (i=0 ; *p && i 8000e4c: 54 64 ff f3 bgu r3,r4,8000e18 8000e50: b8 40 58 00 mv r11,r2 8000e54: e3 ff ff d9 bi 8000db8 if ( *p == '\"' ) { quotes++; 8000e58: 34 c6 00 01 addi r6,r6,1 8000e5c: e3 ff ff f3 bi 8000e28 =============================================================================== 08003ab0 : rtems_chain_control *chain, rtems_chain_node *node, rtems_id task, rtems_event_set events ) { 8003ab0: 37 9c ff f4 addi sp,sp,-12 8003ab4: 5b 8b 00 0c sw (sp+12),r11 8003ab8: 5b 8c 00 08 sw (sp+8),r12 8003abc: 5b 9d 00 04 sw (sp+4),ra 8003ac0: b8 60 60 00 mv r12,r3 8003ac4: 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 ); 8003ac8: f8 00 01 a6 calli 8004160 <_Chain_Append_with_empty_check> rtems_status_code sc = RTEMS_SUCCESSFUL; 8003acc: 34 05 00 00 mvi r5,0 bool was_empty = rtems_chain_append_with_empty_check( chain, node ); if ( was_empty ) { 8003ad0: 44 20 00 05 be r1,r0,8003ae4 <== NEVER TAKEN sc = rtems_event_send( task, events ); 8003ad4: b9 80 08 00 mv r1,r12 8003ad8: b9 60 10 00 mv r2,r11 8003adc: f8 00 19 29 calli 8009f80 8003ae0: b8 20 28 00 mv r5,r1 } return sc; } 8003ae4: b8 a0 08 00 mv r1,r5 8003ae8: 2b 9d 00 04 lw ra,(sp+4) 8003aec: 2b 8b 00 0c lw r11,(sp+12) 8003af0: 2b 8c 00 08 lw r12,(sp+8) 8003af4: 37 9c 00 0c addi sp,sp,12 8003af8: c3 a0 00 00 ret =============================================================================== 08003b4c : rtems_chain_control *chain, rtems_event_set events, rtems_interval timeout, rtems_chain_node **node_ptr ) { 8003b4c: 37 9c ff e4 addi sp,sp,-28 8003b50: 5b 8b 00 18 sw (sp+24),r11 8003b54: 5b 8c 00 14 sw (sp+20),r12 8003b58: 5b 8d 00 10 sw (sp+16),r13 8003b5c: 5b 8e 00 0c sw (sp+12),r14 8003b60: 5b 8f 00 08 sw (sp+8),r15 8003b64: 5b 9d 00 04 sw (sp+4),ra 8003b68: b8 20 70 00 mv r14,r1 8003b6c: b8 40 68 00 mv r13,r2 8003b70: b8 60 60 00 mv r12,r3 8003b74: b8 80 78 00 mv r15,r4 */ RTEMS_INLINE_ROUTINE rtems_chain_node *rtems_chain_get( rtems_chain_control *the_chain ) { return _Chain_Get( the_chain ); 8003b78: b9 c0 08 00 mv r1,r14 8003b7c: f8 00 01 af calli 8004238 <_Chain_Get> 8003b80: b8 20 58 00 mv r11,r1 while ( sc == RTEMS_SUCCESSFUL && (node = rtems_chain_get( chain )) == NULL ) { rtems_event_set out; sc = rtems_event_receive( 8003b84: 34 02 00 00 mvi r2,0 8003b88: b9 a0 08 00 mv r1,r13 8003b8c: b9 80 18 00 mv r3,r12 8003b90: 37 84 00 1c addi r4,sp,28 rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_chain_node *node = NULL; while ( sc == RTEMS_SUCCESSFUL && (node = rtems_chain_get( chain )) == NULL 8003b94: 5d 60 00 0e bne r11,r0,8003bcc ) { rtems_event_set out; sc = rtems_event_receive( 8003b98: fb ff fd 9e calli 8003210 8003b9c: b8 20 28 00 mv r5,r1 ) { rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_chain_node *node = NULL; while ( 8003ba0: 44 2b ff f6 be r1,r11,8003b78 <== NEVER TAKEN } *node_ptr = node; return sc; } 8003ba4: b8 a0 08 00 mv r1,r5 timeout, &out ); } *node_ptr = node; 8003ba8: 59 eb 00 00 sw (r15+0),r11 return sc; } 8003bac: 2b 9d 00 04 lw ra,(sp+4) 8003bb0: 2b 8b 00 18 lw r11,(sp+24) 8003bb4: 2b 8c 00 14 lw r12,(sp+20) 8003bb8: 2b 8d 00 10 lw r13,(sp+16) 8003bbc: 2b 8e 00 0c lw r14,(sp+12) 8003bc0: 2b 8f 00 08 lw r15,(sp+8) 8003bc4: 37 9c 00 1c addi sp,sp,28 8003bc8: c3 a0 00 00 ret rtems_status_code sc = RTEMS_SUCCESSFUL; rtems_chain_node *node = NULL; while ( sc == RTEMS_SUCCESSFUL && (node = rtems_chain_get( chain )) == NULL 8003bcc: 34 05 00 00 mvi r5,0 8003bd0: e3 ff ff f5 bi 8003ba4 =============================================================================== 08003bd4 : rtems_chain_control *chain, rtems_chain_node *node, rtems_id task, rtems_event_set events ) { 8003bd4: 37 9c ff f4 addi sp,sp,-12 8003bd8: 5b 8b 00 0c sw (sp+12),r11 8003bdc: 5b 8c 00 08 sw (sp+8),r12 8003be0: 5b 9d 00 04 sw (sp+4),ra 8003be4: b8 60 60 00 mv r12,r3 8003be8: 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 ); 8003bec: f8 00 01 af calli 80042a8 <_Chain_Prepend_with_empty_check> rtems_status_code sc = RTEMS_SUCCESSFUL; 8003bf0: 34 05 00 00 mvi r5,0 bool was_empty = rtems_chain_prepend_with_empty_check( chain, node ); if (was_empty) { 8003bf4: 44 20 00 05 be r1,r0,8003c08 <== NEVER TAKEN sc = rtems_event_send( task, events ); 8003bf8: b9 80 08 00 mv r1,r12 8003bfc: b9 60 10 00 mv r2,r11 8003c00: f8 00 18 e0 calli 8009f80 8003c04: b8 20 28 00 mv r5,r1 } return sc; } 8003c08: b8 a0 08 00 mv r1,r5 8003c0c: 2b 9d 00 04 lw ra,(sp+4) 8003c10: 2b 8b 00 0c lw r11,(sp+12) 8003c14: 2b 8c 00 08 lw r12,(sp+8) 8003c18: 37 9c 00 0c addi sp,sp,12 8003c1c: c3 a0 00 00 ret =============================================================================== 08010300 : * error code - if unsuccessful */ rtems_status_code rtems_clock_set_nanoseconds_extension( rtems_nanoseconds_extension_routine routine ) { 8010300: b8 20 18 00 mv r3,r1 if ( !routine ) return RTEMS_INVALID_ADDRESS; 8010304: 34 01 00 09 mvi r1,9 */ rtems_status_code rtems_clock_set_nanoseconds_extension( rtems_nanoseconds_extension_routine routine ) { if ( !routine ) 8010308: 44 60 00 05 be r3,r0,801031c <== ALWAYS TAKEN return RTEMS_INVALID_ADDRESS; _Watchdog_Nanoseconds_since_tick_handler = routine; 801030c: 78 02 08 03 mvhi r2,0x803 8010310: 38 42 c1 40 ori r2,r2,0xc140 8010314: 58 43 00 00 sw (r2+0),r3 return RTEMS_SUCCESSFUL; 8010318: 34 01 00 00 mvi r1,0 } 801031c: c3 a0 00 00 ret =============================================================================== 08001944 : void rtems_cpu_usage_report_with_plugin( void *context, rtems_printk_plugin_t print ) { 8001944: 37 9c ff 7c addi sp,sp,-132 8001948: 5b 8b 00 44 sw (sp+68),r11 800194c: 5b 8c 00 40 sw (sp+64),r12 8001950: 5b 8d 00 3c sw (sp+60),r13 8001954: 5b 8e 00 38 sw (sp+56),r14 8001958: 5b 8f 00 34 sw (sp+52),r15 800195c: 5b 90 00 30 sw (sp+48),r16 8001960: 5b 91 00 2c sw (sp+44),r17 8001964: 5b 92 00 28 sw (sp+40),r18 8001968: 5b 93 00 24 sw (sp+36),r19 800196c: 5b 94 00 20 sw (sp+32),r20 8001970: 5b 95 00 1c sw (sp+28),r21 8001974: 5b 96 00 18 sw (sp+24),r22 8001978: 5b 97 00 14 sw (sp+20),r23 800197c: 5b 98 00 10 sw (sp+16),r24 8001980: 5b 99 00 0c sw (sp+12),r25 8001984: 5b 9b 00 08 sw (sp+8),fp 8001988: 5b 9d 00 04 sw (sp+4),ra 800198c: b8 40 78 00 mv r15,r2 8001990: b8 20 80 00 mv r16,r1 Timestamp_Control uptime, total, ran, last_context_switch; #else uint32_t total_units = 0; #endif if ( !print ) 8001994: 44 40 00 5d be r2,r0,8001b08 <== 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; 8001998: 78 01 08 02 mvhi r1,0x802 800199c: 38 21 a7 a4 ori r1,r1,0xa7a4 80019a0: 28 23 00 00 lw r3,(r1+0) 80019a4: 28 22 00 04 lw r2,(r1+4) _TOD_Get_uptime( &uptime ); 80019a8: 37 99 00 78 addi r25,sp,120 80019ac: bb 20 08 00 mv r1,r25 * 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; 80019b0: 5b 83 00 60 sw (sp+96),r3 80019b4: 5b 82 00 64 sw (sp+100),r2 _TOD_Get_uptime( &uptime ); 80019b8: f8 00 10 74 calli 8005b88 <_TOD_Get_uptime> _Timestamp_Subtract( &CPU_usage_Uptime_at_last_reset, &uptime, &total ); 80019bc: 37 97 00 70 addi r23,sp,112 80019c0: 78 01 08 02 mvhi r1,0x802 80019c4: 38 21 ac 30 ori r1,r1,0xac30 80019c8: bb 20 10 00 mv r2,r25 80019cc: ba e0 18 00 mv r3,r23 80019d0: f8 00 1d 08 calli 8008df0 <_Timespec_Subtract> } } } #endif (*print)( 80019d4: 78 02 08 01 mvhi r2,0x801 80019d8: ba 00 08 00 mv r1,r16 80019dc: 38 42 f7 98 ori r2,r2,0xf798 80019e0: 78 16 08 02 mvhi r22,0x802 if ( !the_thread ) continue; rtems_object_get_name( the_thread->Object.id, sizeof(name), name ); (*print)( 80019e4: 78 15 08 01 mvhi r21,0x801 /* * 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 ) { 80019e8: 78 11 08 02 mvhi r17,0x802 /* * Print the information */ (*print)( context, 80019ec: 78 14 08 01 mvhi r20,0x801 } } } #endif (*print)( 80019f0: d9 e0 00 00 call r15 80019f4: 3a d6 a6 78 ori r22,r22,0xa678 the_thread = (Thread_Control *)information->local_table[ i ]; if ( !the_thread ) continue; rtems_object_get_name( the_thread->Object.id, sizeof(name), name ); 80019f8: 37 93 00 48 addi r19,sp,72 (*print)( 80019fc: 3a b5 f9 0c ori r21,r21,0xf90c /* * 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 ) { 8001a00: 3a 31 ab e4 ori r17,r17,0xabe4 Timestamp_Control used; _Timestamp_Subtract( &last_context_switch, &uptime, &used ); _Timestamp_Add_to( &ran, &used ); }; _Timestamp_Divide( &ran, &total, &ival, &fval ); 8001a04: 37 98 00 80 addi r24,sp,128 /* * Print the information */ (*print)( context, 8001a08: 3a 94 f9 20 ori r20,r20,0xf920 * 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 ); 8001a0c: 37 9b 00 58 addi fp,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 ]; 8001a10: 2a c1 00 00 lw r1,(r22+0) 8001a14: 28 2e 00 04 lw r14,(r1+4) if ( information ) { 8001a18: 45 c0 00 2e be r14,r0,8001ad0 <== NEVER TAKEN for ( i=1 ; i <= information->maximum ; i++ ) { 8001a1c: 2d c5 00 10 lhu r5,(r14+16) 8001a20: 44 a0 00 2c be r5,r0,8001ad0 8001a24: 34 0d 00 04 mvi r13,4 8001a28: 34 0c 00 01 mvi r12,1 the_thread = (Thread_Control *)information->local_table[ i ]; 8001a2c: 29 c6 00 1c lw r6,(r14+28) if ( !the_thread ) continue; rtems_object_get_name( the_thread->Object.id, sizeof(name), name ); 8001a30: ba 60 18 00 mv r3,r19 8001a34: 34 02 00 0d mvi r2,13 #endif information = _Objects_Information_table[ api_index ][ 1 ]; if ( information ) { for ( i=1 ; i <= information->maximum ; i++ ) { the_thread = (Thread_Control *)information->local_table[ i ]; 8001a38: b4 cd 30 00 add r6,r6,r13 8001a3c: 28 cb 00 00 lw r11,(r6+0) continue; #endif information = _Objects_Information_table[ api_index ][ 1 ]; if ( information ) { for ( i=1 ; i <= information->maximum ; i++ ) { 8001a40: 35 8c 00 01 addi r12,r12,1 8001a44: 37 92 00 68 addi r18,sp,104 8001a48: 35 ad 00 04 addi r13,r13,4 the_thread = (Thread_Control *)information->local_table[ i ]; if ( !the_thread ) 8001a4c: 45 60 00 20 be r11,r0,8001acc <== NEVER TAKEN continue; rtems_object_get_name( the_thread->Object.id, sizeof(name), name ); 8001a50: 29 61 00 08 lw r1,(r11+8) 8001a54: f8 00 0a c3 calli 8004560 (*print)( 8001a58: 29 63 00 08 lw r3,(r11+8) 8001a5c: ba 60 20 00 mv r4,r19 8001a60: ba 00 08 00 mv r1,r16 8001a64: ba a0 10 00 mv r2,r21 8001a68: d9 e0 00 00 call r15 /* * 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 ) { 8001a6c: 2a 25 00 0c lw r5,(r17+12) #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; 8001a70: 29 67 00 84 lw r7,(r11+132) 8001a74: 29 64 00 88 lw r4,(r11+136) if ( _Thread_Executing->Object.id == the_thread->Object.id ) { 8001a78: 28 a6 00 08 lw r6,(r5+8) 8001a7c: 29 65 00 08 lw r5,(r11+8) #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; 8001a80: 5b 87 00 68 sw (sp+104),r7 8001a84: 5b 84 00 6c sw (sp+108),r4 if ( _Thread_Executing->Object.id == the_thread->Object.id ) { 8001a88: 44 c5 00 33 be r6,r5,8001b54 Timestamp_Control used; _Timestamp_Subtract( &last_context_switch, &uptime, &used ); _Timestamp_Add_to( &ran, &used ); }; _Timestamp_Divide( &ran, &total, &ival, &fval ); 8001a8c: 37 83 00 84 addi r3,sp,132 8001a90: bb 00 20 00 mv r4,r24 8001a94: ba 40 08 00 mv r1,r18 8001a98: ba e0 10 00 mv r2,r23 8001a9c: f8 00 1b 0e calli 80086d4 <_Timespec_Divide> /* * Print the information */ (*print)( context, 8001aa0: 2b 81 00 6c lw r1,(sp+108) 8001aa4: 34 02 03 e8 mvi r2,1000 8001aa8: f8 00 71 6a calli 801e050 <__udivsi3> 8001aac: 2b 85 00 84 lw r5,(sp+132) 8001ab0: 2b 83 00 68 lw r3,(sp+104) 8001ab4: 2b 86 00 80 lw r6,(sp+128) 8001ab8: b8 20 20 00 mv r4,r1 8001abc: ba 80 10 00 mv r2,r20 8001ac0: ba 00 08 00 mv r1,r16 8001ac4: d9 e0 00 00 call r15 8001ac8: 2d c5 00 10 lhu r5,(r14+16) continue; #endif information = _Objects_Information_table[ api_index ][ 1 ]; if ( information ) { for ( i=1 ; i <= information->maximum ; i++ ) { 8001acc: 50 ac ff d8 bgeu r5,r12,8001a2c " ID | NAME | TICKS | PERCENT\n" #endif "------------+----------------------------------------+---------------+---------\n" ); for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) { 8001ad0: 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++ ) { 8001ad4: 36 d6 00 04 addi r22,r22,4 " ID | NAME | TICKS | PERCENT\n" #endif "------------+----------------------------------------+---------------+---------\n" ); for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) { 8001ad8: 38 21 a6 84 ori r1,r1,0xa684 8001adc: 5e c1 ff cd bne r22,r1,8001a10 } } } #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ (*print)( 8001ae0: 2b 81 00 74 lw r1,(sp+116) 8001ae4: 34 02 03 e8 mvi r2,1000 8001ae8: 78 0b 08 01 mvhi r11,0x801 8001aec: f8 00 71 59 calli 801e050 <__udivsi3> 8001af0: 2b 83 00 70 lw r3,(sp+112) 8001af4: 39 6b f9 38 ori r11,r11,0xf938 8001af8: b8 20 20 00 mv r4,r1 8001afc: b9 60 10 00 mv r2,r11 8001b00: ba 00 08 00 mv r1,r16 8001b04: d9 e0 00 00 call r15 "-------------------------------------------------------------------------------\n", _Watchdog_Ticks_since_boot - CPU_usage_Ticks_at_last_reset, total_units ); #endif } 8001b08: 2b 9d 00 04 lw ra,(sp+4) 8001b0c: 2b 8b 00 44 lw r11,(sp+68) 8001b10: 2b 8c 00 40 lw r12,(sp+64) 8001b14: 2b 8d 00 3c lw r13,(sp+60) 8001b18: 2b 8e 00 38 lw r14,(sp+56) 8001b1c: 2b 8f 00 34 lw r15,(sp+52) 8001b20: 2b 90 00 30 lw r16,(sp+48) 8001b24: 2b 91 00 2c lw r17,(sp+44) 8001b28: 2b 92 00 28 lw r18,(sp+40) 8001b2c: 2b 93 00 24 lw r19,(sp+36) 8001b30: 2b 94 00 20 lw r20,(sp+32) 8001b34: 2b 95 00 1c lw r21,(sp+28) 8001b38: 2b 96 00 18 lw r22,(sp+24) 8001b3c: 2b 97 00 14 lw r23,(sp+20) 8001b40: 2b 98 00 10 lw r24,(sp+16) 8001b44: 2b 99 00 0c lw r25,(sp+12) 8001b48: 2b 9b 00 08 lw fp,(sp+8) 8001b4c: 37 9c 00 84 addi sp,sp,132 8001b50: c3 a0 00 00 ret * 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 ); 8001b54: 37 81 00 60 addi r1,sp,96 8001b58: bb 20 10 00 mv r2,r25 8001b5c: bb 60 18 00 mv r3,fp 8001b60: f8 00 1c a4 calli 8008df0 <_Timespec_Subtract> _Timestamp_Add_to( &ran, &used ); 8001b64: ba 40 08 00 mv r1,r18 8001b68: bb 60 10 00 mv r2,fp 8001b6c: f8 00 1a c3 calli 8008678 <_Timespec_Add_to> 8001b70: e3 ff ff c7 bi 8001a8c =============================================================================== 0800cc90 : [RTEMS_IO_ERROR] = EIO, [RTEMS_PROXY_BLOCKING] = EIO }; int rtems_deviceio_errno(rtems_status_code sc) { 800cc90: 37 9c ff f8 addi sp,sp,-8 800cc94: 5b 8b 00 08 sw (sp+8),r11 800cc98: 5b 9d 00 04 sw (sp+4),ra if (sc == RTEMS_SUCCESSFUL) { return 0; 800cc9c: 34 02 00 00 mvi r2,0 [RTEMS_PROXY_BLOCKING] = EIO }; int rtems_deviceio_errno(rtems_status_code sc) { if (sc == RTEMS_SUCCESSFUL) { 800cca0: 5c 20 00 06 bne r1,r0,800ccb8 errno = eno; return -1; } } 800cca4: b8 40 08 00 mv r1,r2 800cca8: 2b 9d 00 04 lw ra,(sp+4) 800ccac: 2b 8b 00 08 lw r11,(sp+8) 800ccb0: 37 9c 00 08 addi sp,sp,8 800ccb4: c3 a0 00 00 ret if (sc == RTEMS_SUCCESSFUL) { return 0; } else { int eno = EINVAL; if ((unsigned) sc <= RTEMS_STATUS_CODES_LAST) { 800ccb8: 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; 800ccbc: 34 0b 00 16 mvi r11,22 if ((unsigned) sc <= RTEMS_STATUS_CODES_LAST) { 800ccc0: 54 22 00 07 bgu r1,r2,800ccdc <== NEVER TAKEN eno = status_code_to_errno [sc]; 800ccc4: 78 02 08 01 mvhi r2,0x801 800ccc8: b4 21 08 00 add r1,r1,r1 800cccc: 38 42 3b 40 ori r2,r2,0x3b40 800ccd0: b4 21 08 00 add r1,r1,r1 800ccd4: b4 41 08 00 add r1,r2,r1 800ccd8: 28 2b 00 00 lw r11,(r1+0) } errno = eno; 800ccdc: f8 00 00 3e calli 800cdd4 <__errno> 800cce0: 58 2b 00 00 sw (r1+0),r11 return -1; 800cce4: 34 02 ff ff mvi r2,-1 800cce8: e3 ff ff ef bi 800cca4 =============================================================================== 080013bc : int rtems_filesystem_dirname( const char *pathname ) { 80013bc: 37 9c ff f4 addi sp,sp,-12 80013c0: 5b 8b 00 0c sw (sp+12),r11 80013c4: 5b 8c 00 08 sw (sp+8),r12 80013c8: 5b 9d 00 04 sw (sp+4),ra 80013cc: b8 20 60 00 mv r12,r1 int len = strlen( pathname ); 80013d0: f8 00 33 22 calli 800e058 80013d4: b8 20 58 00 mv r11,r1 while ( len ) { 80013d8: 5c 20 00 03 bne r1,r0,80013e4 <== ALWAYS TAKEN 80013dc: e0 00 00 07 bi 80013f8 <== NOT EXECUTED 80013e0: 45 61 00 06 be r11,r1,80013f8 len--; 80013e4: 35 6b ff ff addi r11,r11,-1 flags, pathloc, follow_link ); } int rtems_filesystem_dirname( 80013e8: b5 8b 10 00 add r2,r12,r11 { int len = strlen( pathname ); while ( len ) { len--; if ( rtems_filesystem_is_separator( pathname[len] ) ) 80013ec: 40 41 00 00 lbu r1,(r2+0) 80013f0: f8 00 04 95 calli 8002644 80013f4: 44 20 ff fb be r1,r0,80013e0 break; } return len; } 80013f8: b9 60 08 00 mv r1,r11 80013fc: 2b 9d 00 04 lw ra,(sp+4) 8001400: 2b 8b 00 0c lw r11,(sp+12) 8001404: 2b 8c 00 08 lw r12,(sp+8) 8001408: 37 9c 00 0c addi sp,sp,12 800140c: c3 a0 00 00 ret =============================================================================== 08008ae4 : rtems_filesystem_fsmount_me_t rtems_filesystem_get_mount_handler( const char *type ) { 8008ae4: 37 9c ff f4 addi sp,sp,-12 8008ae8: 5b 9d 00 04 sw (sp+4),ra find_arg fa = { 8008aec: 5b 81 00 08 sw (sp+8),r1 8008af0: 5b 80 00 0c sw (sp+12),r0 .type = type, .mount_h = NULL }; if ( type != NULL ) { 8008af4: 34 02 00 00 mvi r2,0 8008af8: 44 20 00 06 be r1,r0,8008b10 <== NEVER TAKEN rtems_filesystem_iterate( find_handler, &fa ); 8008afc: 78 01 08 00 mvhi r1,0x800 8008b00: 37 82 00 08 addi r2,sp,8 8008b04: 38 21 89 b0 ori r1,r1,0x89b0 8008b08: fb ff ff be calli 8008a00 8008b0c: 2b 82 00 0c lw r2,(sp+12) } return fa.mount_h; } 8008b10: b8 40 08 00 mv r1,r2 8008b14: 2b 9d 00 04 lw ra,(sp+4) 8008b18: 37 9c 00 0c addi sp,sp,12 8008b1c: c3 a0 00 00 ret =============================================================================== 080010ec : * configuration is a single instantiation of the IMFS or miniIMFS with * a single "/dev" directory in it. */ void rtems_filesystem_initialize( void ) { 80010ec: 37 9c ff dc addi sp,sp,-36 80010f0: 5b 8b 00 10 sw (sp+16),r11 80010f4: 5b 8c 00 0c sw (sp+12),r12 80010f8: 5b 8d 00 08 sw (sp+8),r13 80010fc: 5b 9d 00 04 sw (sp+4),ra /* * Set the default umask to "022". */ rtems_filesystem_umask = 022; 8001100: 78 0b 08 01 mvhi r11,0x801 8001104: 39 6b 41 20 ori r11,r11,0x4120 /* * mount the first filesystem. */ if ( rtems_filesystem_mount_table_size == 0 ) 8001108: 78 01 08 01 mvhi r1,0x801 /* * Set the default umask to "022". */ rtems_filesystem_umask = 022; 800110c: 29 63 00 00 lw r3,(r11+0) /* * mount the first filesystem. */ if ( rtems_filesystem_mount_table_size == 0 ) 8001110: 38 21 33 80 ori r1,r1,0x3380 8001114: 28 21 00 00 lw r1,(r1+0) /* * Set the default umask to "022". */ rtems_filesystem_umask = 022; 8001118: 34 02 00 12 mvi r2,18 800111c: 58 62 00 2c sw (r3+44),r2 /* * mount the first filesystem. */ if ( rtems_filesystem_mount_table_size == 0 ) 8001120: 44 20 00 3e be r1,r0,8001218 <== NEVER TAKEN rtems_fatal_error_occurred( 0xABCD0001 ); mt = &rtems_filesystem_mount_table[0]; 8001124: 78 01 08 01 mvhi r1,0x801 8001128: 38 21 40 18 ori r1,r1,0x4018 800112c: 28 24 00 00 lw r4,(r1+0) status = mount( mt->device, mt->mount_point, mt->type, mt->fsoptions, NULL ); 8001130: 34 05 00 00 mvi r5,0 8001134: 28 82 00 0c lw r2,(r4+12) 8001138: 28 81 00 08 lw r1,(r4+8) 800113c: 28 83 00 00 lw r3,(r4+0) 8001140: 28 84 00 04 lw r4,(r4+4) 8001144: f8 00 02 89 calli 8001b68 if ( status == -1 ) 8001148: 34 02 ff ff mvi r2,-1 800114c: 44 22 00 3b be r1,r2,8001238 <== NEVER TAKEN rtems_fatal_error_occurred( 0xABCD0002 ); rtems_filesystem_link_counts = 0; 8001150: 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); 8001154: 78 0c 08 01 mvhi r12,0x801 8001158: 39 8c 34 dc ori r12,r12,0x34dc 800115c: 37 8d 00 14 addi r13,sp,20 8001160: 34 02 00 01 mvi r2,1 8001164: 34 03 00 00 mvi r3,0 8001168: b9 a0 20 00 mv r4,r13 800116c: 34 05 00 00 mvi r5,0 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; 8001170: 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); 8001174: b9 80 08 00 mv r1,r12 8001178: f8 00 00 76 calli 8001350 rtems_filesystem_root = loc; 800117c: 29 61 00 00 lw r1,(r11+0) 8001180: 2b 83 00 14 lw r3,(sp+20) /* One more clone for the current node */ rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0); 8001184: 34 02 00 01 mvi r2,1 8001188: 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; 800118c: 58 23 00 18 sw (r1+24),r3 8001190: 2b 83 00 18 lw r3,(sp+24) /* One more clone for the current node */ rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0); 8001194: 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; 8001198: 58 23 00 1c sw (r1+28),r3 800119c: 2b 83 00 1c lw r3,(sp+28) 80011a0: 58 23 00 20 sw (r1+32),r3 80011a4: 2b 83 00 20 lw r3,(sp+32) 80011a8: 58 23 00 24 sw (r1+36),r3 80011ac: 2b 83 00 24 lw r3,(sp+36) 80011b0: 58 23 00 28 sw (r1+40),r3 /* One more clone for the current node */ rtems_filesystem_evaluate_path("/", 1, 0, &loc, 0); 80011b4: b9 80 08 00 mv r1,r12 80011b8: 34 03 00 00 mvi r3,0 80011bc: f8 00 00 65 calli 8001350 rtems_filesystem_current = loc; 80011c0: 29 61 00 00 lw r1,(r11+0) 80011c4: 2b 82 00 14 lw r2,(sp+20) 80011c8: 58 22 00 04 sw (r1+4),r2 80011cc: 2b 82 00 18 lw r2,(sp+24) 80011d0: 58 22 00 08 sw (r1+8),r2 80011d4: 2b 82 00 1c lw r2,(sp+28) 80011d8: 58 22 00 0c sw (r1+12),r2 80011dc: 2b 82 00 20 lw r2,(sp+32) 80011e0: 58 22 00 10 sw (r1+16),r2 80011e4: 2b 82 00 24 lw r2,(sp+36) 80011e8: 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); 80011ec: 78 01 08 01 mvhi r1,0x801 80011f0: 38 21 34 e0 ori r1,r1,0x34e0 80011f4: 34 02 01 ff mvi r2,511 80011f8: f8 00 01 ed calli 80019ac if ( status != 0 ) 80011fc: 5c 20 00 0b bne r1,r0,8001228 <== 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. */ } 8001200: 2b 9d 00 04 lw ra,(sp+4) 8001204: 2b 8b 00 10 lw r11,(sp+16) 8001208: 2b 8c 00 0c lw r12,(sp+12) 800120c: 2b 8d 00 08 lw r13,(sp+8) 8001210: 37 9c 00 24 addi sp,sp,36 8001214: c3 a0 00 00 ret /* * mount the first filesystem. */ if ( rtems_filesystem_mount_table_size == 0 ) rtems_fatal_error_occurred( 0xABCD0001 ); 8001218: 78 02 08 01 mvhi r2,0x801 <== NOT EXECUTED 800121c: 38 42 34 e8 ori r2,r2,0x34e8 <== NOT EXECUTED 8001220: 28 41 00 00 lw r1,(r2+0) <== NOT EXECUTED 8001224: f8 00 08 8a calli 800344c <== NOT EXECUTED * created that way by the IMFS. */ status = mkdir( "/dev", 0777); if ( status != 0 ) rtems_fatal_error_occurred( 0xABCD0003 ); 8001228: 78 02 08 01 mvhi r2,0x801 <== NOT EXECUTED 800122c: 38 42 34 f0 ori r2,r2,0x34f0 <== NOT EXECUTED 8001230: 28 41 00 00 lw r1,(r2+0) <== NOT EXECUTED 8001234: f8 00 08 86 calli 800344c <== NOT EXECUTED mt = &rtems_filesystem_mount_table[0]; status = mount( mt->device, mt->mount_point, mt->type, mt->fsoptions, NULL ); if ( status == -1 ) rtems_fatal_error_occurred( 0xABCD0002 ); 8001238: 78 02 08 01 mvhi r2,0x801 <== NOT EXECUTED 800123c: 38 42 34 ec ori r2,r2,0x34ec <== NOT EXECUTED 8001240: 28 41 00 00 lw r1,(r2+0) <== NOT EXECUTED 8001244: f8 00 08 82 calli 800344c <== NOT EXECUTED =============================================================================== 08008a00 : bool rtems_filesystem_iterate( rtems_per_filesystem_routine routine, void *routine_arg ) { 8008a00: 37 9c ff e4 addi sp,sp,-28 8008a04: 5b 8b 00 1c sw (sp+28),r11 8008a08: 5b 8c 00 18 sw (sp+24),r12 8008a0c: 5b 8d 00 14 sw (sp+20),r13 8008a10: 5b 8e 00 10 sw (sp+16),r14 8008a14: 5b 8f 00 0c sw (sp+12),r15 8008a18: 5b 90 00 08 sw (sp+8),r16 8008a1c: 5b 9d 00 04 sw (sp+4),ra const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0]; rtems_chain_node *node = NULL; bool stop = false; while ( table_entry->type && !stop ) { 8008a20: 78 0b 08 01 mvhi r11,0x801 8008a24: 39 6b 33 60 ori r11,r11,0x3360 8008a28: 29 63 00 00 lw r3,(r11+0) bool rtems_filesystem_iterate( rtems_per_filesystem_routine routine, void *routine_arg ) { 8008a2c: b8 20 68 00 mv r13,r1 8008a30: b8 40 70 00 mv r14,r2 const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0]; rtems_chain_node *node = NULL; bool stop = false; while ( table_entry->type && !stop ) { 8008a34: 5c 60 00 03 bne r3,r0,8008a40 <== ALWAYS TAKEN 8008a38: e0 00 00 0a bi 8008a60 <== NOT EXECUTED 8008a3c: 5c 20 00 20 bne r1,r0,8008abc stop = (*routine)( table_entry, routine_arg ); 8008a40: b9 60 08 00 mv r1,r11 8008a44: b9 c0 10 00 mv r2,r14 8008a48: d9 a0 00 00 call r13 ++table_entry; 8008a4c: 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 ) { 8008a50: 29 63 00 00 lw r3,(r11+0) stop = (*routine)( table_entry, routine_arg ); 8008a54: b8 20 60 00 mv r12,r1 { const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0]; rtems_chain_node *node = NULL; bool stop = false; while ( table_entry->type && !stop ) { 8008a58: 5c 60 ff f9 bne r3,r0,8008a3c stop = (*routine)( table_entry, routine_arg ); ++table_entry; } if ( !stop ) { 8008a5c: 5c 23 00 18 bne r1,r3,8008abc 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 ); 8008a60: 78 10 08 01 mvhi r16,0x801 8008a64: 3a 10 47 74 ori r16,r16,0x4774 8008a68: 2a 01 00 00 lw r1,(r16+0) 8008a6c: 34 02 00 00 mvi r2,0 8008a70: 34 03 00 00 mvi r3,0 8008a74: fb ff e8 98 calli 8002cd4 } } rtems_libio_unlock(); rtems_set_errno_and_return_minus_one( ENOENT ); } 8008a78: 78 01 08 01 mvhi r1,0x801 8008a7c: 38 21 41 28 ori r1,r1,0x4128 8008a80: 28 2b 00 00 lw r11,(r1+0) ++table_entry; } if ( !stop ) { rtems_libio_lock(); for ( 8008a84: 78 0f 08 01 mvhi r15,0x801 8008a88: 39 ef 41 2c ori r15,r15,0x412c 8008a8c: 34 0c 00 00 mvi r12,0 8008a90: 5d 6f 00 03 bne r11,r15,8008a9c 8008a94: e0 00 00 08 bi 8008ab4 node = rtems_chain_first( &filesystem_chain ); !rtems_chain_is_tail( &filesystem_chain, node ) && !stop; 8008a98: 5c 20 00 07 bne r1,r0,8008ab4 <== NEVER TAKEN node = rtems_chain_next( node ) ) { const filesystem_node *fsn = (filesystem_node *) node; stop = (*routine)( &fsn->entry, routine_arg ); 8008a9c: 35 61 00 08 addi r1,r11,8 8008aa0: b9 c0 10 00 mv r2,r14 8008aa4: d9 a0 00 00 call r13 } } rtems_libio_unlock(); rtems_set_errno_and_return_minus_one( ENOENT ); } 8008aa8: 29 6b 00 00 lw r11,(r11+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 ); 8008aac: b8 20 60 00 mv r12,r1 ++table_entry; } if ( !stop ) { rtems_libio_lock(); for ( 8008ab0: 5d 6f ff fa bne r11,r15,8008a98 } static inline void rtems_libio_unlock( void ) { rtems_semaphore_release( rtems_libio_semaphore ); 8008ab4: 2a 01 00 00 lw r1,(r16+0) 8008ab8: fb ff e8 e3 calli 8002e44 } rtems_libio_unlock(); } return stop; } 8008abc: b9 80 08 00 mv r1,r12 8008ac0: 2b 9d 00 04 lw ra,(sp+4) 8008ac4: 2b 8b 00 1c lw r11,(sp+28) 8008ac8: 2b 8c 00 18 lw r12,(sp+24) 8008acc: 2b 8d 00 14 lw r13,(sp+20) 8008ad0: 2b 8e 00 10 lw r14,(sp+16) 8008ad4: 2b 8f 00 0c lw r15,(sp+12) 8008ad8: 2b 90 00 08 lw r16,(sp+8) 8008adc: 37 9c 00 1c addi sp,sp,28 8008ae0: c3 a0 00 00 ret =============================================================================== 08001abc : bool rtems_filesystem_mount_iterate( rtems_per_filesystem_mount_routine routine, void *routine_arg ) { 8001abc: 37 9c ff e4 addi sp,sp,-28 8001ac0: 5b 8b 00 1c sw (sp+28),r11 8001ac4: 5b 8c 00 18 sw (sp+24),r12 8001ac8: 5b 8d 00 14 sw (sp+20),r13 8001acc: 5b 8e 00 10 sw (sp+16),r14 8001ad0: 5b 8f 00 0c sw (sp+12),r15 8001ad4: 5b 90 00 08 sw (sp+8),r16 8001ad8: 5b 9d 00 04 sw (sp+4),ra 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 ); 8001adc: 78 10 08 01 mvhi r16,0x801 8001ae0: 3a 10 47 74 ori r16,r16,0x4774 8001ae4: b8 20 70 00 mv r14,r1 8001ae8: 2a 01 00 00 lw r1,(r16+0) 8001aec: b8 40 78 00 mv r15,r2 8001af0: 34 03 00 00 mvi r3,0 8001af4: 34 02 00 00 mvi r2,0 8001af8: f8 00 04 77 calli 8002cd4 stop = (*routine)( mt_entry, routine_arg ); } rtems_libio_unlock(); return stop; } 8001afc: 78 01 08 01 mvhi r1,0x801 8001b00: 38 21 41 14 ori r1,r1,0x4114 8001b04: 28 2b 00 00 lw r11,(r1+0) { rtems_chain_node *node = NULL; bool stop = false; rtems_libio_lock(); for ( 8001b08: 78 0c 08 01 mvhi r12,0x801 8001b0c: 39 8c 41 18 ori r12,r12,0x4118 rtems_per_filesystem_mount_routine routine, void *routine_arg ) { rtems_chain_node *node = NULL; bool stop = false; 8001b10: 34 0d 00 00 mvi r13,0 rtems_libio_lock(); for ( 8001b14: 5d 6c 00 03 bne r11,r12,8001b20 <== ALWAYS TAKEN 8001b18: e0 00 00 08 bi 8001b38 <== NOT EXECUTED node = rtems_chain_first( &mount_chain ); !rtems_chain_is_tail( &mount_chain, node ) && !stop; 8001b1c: 5c 20 00 07 bne r1,r0,8001b38 <== NEVER TAKEN node = rtems_chain_next( node ) ) { const rtems_filesystem_mount_table_entry_t *mt_entry = (rtems_filesystem_mount_table_entry_t *) node; stop = (*routine)( mt_entry, routine_arg ); 8001b20: b9 60 08 00 mv r1,r11 8001b24: b9 e0 10 00 mv r2,r15 8001b28: d9 c0 00 00 call r14 } rtems_libio_unlock(); return stop; } 8001b2c: 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 ); 8001b30: b8 20 68 00 mv r13,r1 { rtems_chain_node *node = NULL; bool stop = false; rtems_libio_lock(); for ( 8001b34: 5d 6c ff fa bne r11,r12,8001b1c } static inline void rtems_libio_unlock( void ) { rtems_semaphore_release( rtems_libio_semaphore ); 8001b38: 2a 01 00 00 lw r1,(r16+0) 8001b3c: f8 00 04 c2 calli 8002e44 stop = (*routine)( mt_entry, routine_arg ); } rtems_libio_unlock(); return stop; } 8001b40: b9 a0 08 00 mv r1,r13 8001b44: 2b 9d 00 04 lw ra,(sp+4) 8001b48: 2b 8b 00 1c lw r11,(sp+28) 8001b4c: 2b 8c 00 18 lw r12,(sp+24) 8001b50: 2b 8d 00 14 lw r13,(sp+20) 8001b54: 2b 8e 00 10 lw r14,(sp+16) 8001b58: 2b 8f 00 0c lw r15,(sp+12) 8001b5c: 2b 90 00 08 lw r16,(sp+8) 8001b60: 37 9c 00 1c addi sp,sp,28 8001b64: c3 a0 00 00 ret =============================================================================== 08001410 : int rtems_filesystem_prefix_separators( const char *pathname, int pathnamelen ) { 8001410: 37 9c ff f0 addi sp,sp,-16 8001414: 5b 8b 00 10 sw (sp+16),r11 8001418: 5b 8c 00 0c sw (sp+12),r12 800141c: 5b 8d 00 08 sw (sp+8),r13 8001420: 5b 9d 00 04 sw (sp+4),ra 8001424: b8 20 68 00 mv r13,r1 /* * Eat any separators at start of the path. */ int stripped = 0; while ( *pathname && pathnamelen && rtems_filesystem_is_separator( *pathname ) ) 8001428: 40 21 00 00 lbu r1,(r1+0) 800142c: 7c 43 00 00 cmpnei r3,r2,0 int rtems_filesystem_prefix_separators( const char *pathname, int pathnamelen ) { 8001430: 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 ) ) 8001434: 7c 22 00 00 cmpnei r2,r1,0 8001438: 34 0b 00 00 mvi r11,0 800143c: a0 62 10 00 and r2,r3,r2 8001440: 5c 40 00 09 bne r2,r0,8001464 <== ALWAYS TAKEN 8001444: e0 00 00 0a bi 800146c <== NOT EXECUTED { pathname++; pathnamelen--; stripped++; 8001448: 35 6b 00 01 addi r11,r11,1 } return len; } int rtems_filesystem_prefix_separators( 800144c: b5 ab 18 00 add r3,r13,r11 { /* * Eat any separators at start of the path. */ int stripped = 0; while ( *pathname && pathnamelen && rtems_filesystem_is_separator( *pathname ) ) 8001450: 40 61 00 00 lbu r1,(r3+0) 8001454: fd 8b 20 00 cmpne r4,r12,r11 8001458: 7c 23 00 00 cmpnei r3,r1,0 800145c: a0 83 18 00 and r3,r4,r3 8001460: 44 60 00 03 be r3,r0,800146c <== NEVER TAKEN 8001464: f8 00 04 78 calli 8002644 8001468: 5c 20 ff f8 bne r1,r0,8001448 pathname++; pathnamelen--; stripped++; } return stripped; } 800146c: b9 60 08 00 mv r1,r11 8001470: 2b 9d 00 04 lw ra,(sp+4) 8001474: 2b 8b 00 10 lw r11,(sp+16) 8001478: 2b 8c 00 0c lw r12,(sp+12) 800147c: 2b 8d 00 08 lw r13,(sp+8) 8001480: 37 9c 00 10 addi sp,sp,16 8001484: c3 a0 00 00 ret =============================================================================== 08008c30 : int rtems_filesystem_unregister( const char *type ) { 8008c30: 37 9c ff ec addi sp,sp,-20 8008c34: 5b 8b 00 14 sw (sp+20),r11 8008c38: 5b 8c 00 10 sw (sp+16),r12 8008c3c: 5b 8d 00 0c sw (sp+12),r13 8008c40: 5b 8e 00 08 sw (sp+8),r14 8008c44: 5b 9d 00 04 sw (sp+4),ra 8008c48: b8 20 68 00 mv r13,r1 rtems_chain_node *node = NULL; if ( type == NULL ) { 8008c4c: 44 20 00 2f be r1,r0,8008d08 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 ); 8008c50: 78 0e 08 01 mvhi r14,0x801 8008c54: 39 ce 47 74 ori r14,r14,0x4774 8008c58: 29 c1 00 00 lw r1,(r14+0) 8008c5c: 34 02 00 00 mvi r2,0 8008c60: 34 03 00 00 mvi r3,0 8008c64: fb ff e8 1c calli 8002cd4 } } rtems_libio_unlock(); rtems_set_errno_and_return_minus_one( ENOENT ); } 8008c68: 78 01 08 01 mvhi r1,0x801 8008c6c: 38 21 41 28 ori r1,r1,0x4128 8008c70: 28 2b 00 00 lw r11,(r1+0) if ( type == NULL ) { rtems_set_errno_and_return_minus_one( EINVAL ); } rtems_libio_lock(); for ( 8008c74: 78 0c 08 01 mvhi r12,0x801 8008c78: 39 8c 41 2c ori r12,r12,0x412c 8008c7c: 5d 6c 00 04 bne r11,r12,8008c8c 8008c80: e0 00 00 15 bi 8008cd4 } } rtems_libio_unlock(); rtems_set_errno_and_return_minus_one( ENOENT ); } 8008c84: 29 6b 00 00 lw r11,(r11+0) if ( type == NULL ) { rtems_set_errno_and_return_minus_one( EINVAL ); } rtems_libio_lock(); for ( 8008c88: 45 6c 00 13 be r11,r12,8008cd4 <== ALWAYS TAKEN !rtems_chain_is_tail( &filesystem_chain, node ); node = rtems_chain_next( node ) ) { filesystem_node *fsn = (filesystem_node *) node; if ( strcmp( fsn->entry.type, type ) == 0 ) { 8008c8c: 29 61 00 08 lw r1,(r11+8) 8008c90: b9 a0 10 00 mv r2,r13 8008c94: f8 00 14 7a calli 800de7c 8008c98: 5c 20 ff fb bne r1,r0,8008c84 */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); 8008c9c: b9 60 08 00 mv r1,r11 8008ca0: fb ff eb 10 calli 80038e0 <_Chain_Extract> rtems_chain_extract( node ); free( fsn ); 8008ca4: b9 60 08 00 mv r1,r11 8008ca8: fb ff e2 00 calli 80014a8 } static inline void rtems_libio_unlock( void ) { rtems_semaphore_release( rtems_libio_semaphore ); 8008cac: 29 c1 00 00 lw r1,(r14+0) 8008cb0: fb ff e8 65 calli 8002e44 rtems_libio_unlock(); return 0; 8008cb4: 34 01 00 00 mvi r1,0 } } rtems_libio_unlock(); rtems_set_errno_and_return_minus_one( ENOENT ); } 8008cb8: 2b 9d 00 04 lw ra,(sp+4) 8008cbc: 2b 8b 00 14 lw r11,(sp+20) 8008cc0: 2b 8c 00 10 lw r12,(sp+16) 8008cc4: 2b 8d 00 0c lw r13,(sp+12) 8008cc8: 2b 8e 00 08 lw r14,(sp+8) 8008ccc: 37 9c 00 14 addi sp,sp,20 8008cd0: c3 a0 00 00 ret 8008cd4: 29 c1 00 00 lw r1,(r14+0) 8008cd8: fb ff e8 5b calli 8002e44 return 0; } } rtems_libio_unlock(); rtems_set_errno_and_return_minus_one( ENOENT ); 8008cdc: f8 00 10 3e calli 800cdd4 <__errno> 8008ce0: 34 02 00 02 mvi r2,2 8008ce4: 58 22 00 00 sw (r1+0),r2 8008ce8: 34 01 ff ff mvi r1,-1 } 8008cec: 2b 9d 00 04 lw ra,(sp+4) 8008cf0: 2b 8b 00 14 lw r11,(sp+20) 8008cf4: 2b 8c 00 10 lw r12,(sp+16) 8008cf8: 2b 8d 00 0c lw r13,(sp+12) 8008cfc: 2b 8e 00 08 lw r14,(sp+8) 8008d00: 37 9c 00 14 addi sp,sp,20 8008d04: c3 a0 00 00 ret ) { rtems_chain_node *node = NULL; if ( type == NULL ) { rtems_set_errno_and_return_minus_one( EINVAL ); 8008d08: f8 00 10 33 calli 800cdd4 <__errno> 8008d0c: 34 02 00 16 mvi r2,22 8008d10: 58 22 00 00 sw (r1+0),r2 8008d14: 34 01 ff ff mvi r1,-1 8008d18: e3 ff ff f5 bi 8008cec =============================================================================== 08002124 : int rtems_gxx_key_create (__gthread_key_t *key, void (*dtor) (void *)) { 8002124: 37 9c ff f0 addi sp,sp,-16 8002128: 5b 8b 00 10 sw (sp+16),r11 800212c: 5b 8c 00 0c sw (sp+12),r12 8002130: 5b 8d 00 08 sw (sp+8),r13 8002134: 5b 9d 00 04 sw (sp+4),ra 8002138: 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 ) ); 800213c: 34 01 00 08 mvi r1,8 } return 0; } int rtems_gxx_key_create (__gthread_key_t *key, void (*dtor) (void *)) { 8002140: 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 ) ); 8002144: f8 00 01 54 calli 8002694 8002148: b8 20 58 00 mv r11,r1 *key = new_key; 800214c: 59 a1 00 00 sw (r13+0),r1 "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 ); 8002150: b9 60 10 00 mv r2,r11 8002154: 34 01 00 00 mvi r1,0 8002158: b9 80 18 00 mv r3,r12 * deal with the value of the key, as used with the POSIX API. */ /* Do not pull your hair, trust me this works. :-) */ __gthread_key_t new_key = (__gthread_key_t) malloc( sizeof( *new_key ) ); *key = new_key; new_key->val = NULL; 800215c: 59 60 00 00 sw (r11+0),r0 new_key->dtor = dtor; 8002160: 59 6c 00 04 sw (r11+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 ); 8002164: f8 00 07 ed calli 8004118 if ( status == RTEMS_SUCCESSFUL ) return 0; 8002168: 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 ) 800216c: 5c 20 00 08 bne r1,r0,800218c <== NEVER TAKEN return 0; free( new_key ); return -1; } 8002170: b8 40 08 00 mv r1,r2 8002174: 2b 9d 00 04 lw ra,(sp+4) 8002178: 2b 8b 00 10 lw r11,(sp+16) 800217c: 2b 8c 00 0c lw r12,(sp+12) 8002180: 2b 8d 00 08 lw r13,(sp+8) 8002184: 37 9c 00 10 addi sp,sp,16 8002188: c3 a0 00 00 ret /* register with RTEMS the buffer that will hold the key values */ status = rtems_task_variable_add( RTEMS_SELF, (void **)new_key, dtor ); if ( status == RTEMS_SUCCESSFUL ) return 0; free( new_key ); 800218c: b9 60 08 00 mv r1,r11 <== NOT EXECUTED 8002190: fb ff ff 5c calli 8001f00 <== NOT EXECUTED return -1; 8002194: 34 02 ff ff mvi r2,-1 <== NOT EXECUTED 8002198: e3 ff ff f6 bi 8002170 <== NOT EXECUTED =============================================================================== 080021a8 : int rtems_gxx_key_delete (__gthread_key_t key) { 80021a8: 37 9c ff f8 addi sp,sp,-8 80021ac: 5b 8b 00 08 sw (sp+8),r11 80021b0: 5b 9d 00 04 sw (sp+4),ra 80021b4: 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 ); 80021b8: b8 20 10 00 mv r2,r1 80021bc: 34 01 00 00 mvi r1,0 80021c0: f8 00 08 15 calli 8004214 if ( status == RTEMS_SUCCESSFUL ) { 80021c4: 5c 20 00 04 bne r1,r0,80021d4 <== NEVER TAKEN /* Hmm - hopefully all tasks using this key have gone away... */ if ( key ) free( *(void **)key ); 80021c8: 45 61 00 03 be r11,r1,80021d4 <== NEVER TAKEN 80021cc: 29 61 00 00 lw r1,(r11+0) 80021d0: fb ff ff 4c calli 8001f00 return 0; } key = NULL; return 0; } 80021d4: 34 01 00 00 mvi r1,0 80021d8: 2b 9d 00 04 lw ra,(sp+4) 80021dc: 2b 8b 00 08 lw r11,(sp+8) 80021e0: 37 9c 00 08 addi sp,sp,8 80021e4: c3 a0 00 00 ret =============================================================================== 08002068 : /* 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)) { 8002068: 37 9c ff ec addi sp,sp,-20 800206c: 5b 8b 00 10 sw (sp+16),r11 8002070: 5b 8c 00 0c sw (sp+12),r12 8002074: 5b 8d 00 08 sw (sp+8),r13 8002078: 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 ) { 800207c: 28 2c 00 00 lw r12,(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)) { 8002080: b8 20 58 00 mv r11,r1 8002084: b8 40 68 00 mv r13,r2 #ifdef DEBUG_GXX_WRAPPERS printk( "gxx_wrappers: once=%x, func=%x\n", *once, func ); #endif if ( *(volatile __gthread_once_t *)once == 0 ) { 8002088: 45 80 00 08 be r12,r0,80020a8 rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); if ( o == 0 ) (*func)(); } return 0; } 800208c: 34 01 00 00 mvi r1,0 8002090: 2b 9d 00 04 lw ra,(sp+4) 8002094: 2b 8b 00 10 lw r11,(sp+16) 8002098: 2b 8c 00 0c lw r12,(sp+12) 800209c: 2b 8d 00 08 lw r13,(sp+8) 80020a0: 37 9c 00 14 addi sp,sp,20 80020a4: c3 a0 00 00 ret if ( *(volatile __gthread_once_t *)once == 0 ) { rtems_mode saveMode; __gthread_once_t o; rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode); 80020a8: 34 01 01 00 mvi r1,256 80020ac: 34 02 01 00 mvi r2,256 80020b0: 37 83 00 14 addi r3,sp,20 80020b4: f8 00 07 7b calli 8003ea0 if ( (o = *(volatile __gthread_once_t *)once) == 0 ) { 80020b8: 29 61 00 00 lw r1,(r11+0) 80020bc: 5c 2c 00 0f bne r1,r12,80020f8 <== NEVER TAKEN *(volatile __gthread_once_t *)once = 1; } rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); 80020c0: 2b 81 00 14 lw r1,(sp+20) rtems_mode saveMode; __gthread_once_t o; rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode); if ( (o = *(volatile __gthread_once_t *)once) == 0 ) { *(volatile __gthread_once_t *)once = 1; 80020c4: 34 04 00 01 mvi r4,1 } rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); 80020c8: 34 02 01 00 mvi r2,256 80020cc: 37 83 00 14 addi r3,sp,20 rtems_mode saveMode; __gthread_once_t o; rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode); if ( (o = *(volatile __gthread_once_t *)once) == 0 ) { *(volatile __gthread_once_t *)once = 1; 80020d0: 59 64 00 00 sw (r11+0),r4 } rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); 80020d4: f8 00 07 73 calli 8003ea0 if ( o == 0 ) (*func)(); 80020d8: d9 a0 00 00 call r13 } return 0; } 80020dc: 34 01 00 00 mvi r1,0 80020e0: 2b 9d 00 04 lw ra,(sp+4) 80020e4: 2b 8b 00 10 lw r11,(sp+16) 80020e8: 2b 8c 00 0c lw r12,(sp+12) 80020ec: 2b 8d 00 08 lw r13,(sp+8) 80020f0: 37 9c 00 14 addi sp,sp,20 80020f4: c3 a0 00 00 ret rtems_task_mode(RTEMS_NO_PREEMPT, RTEMS_PREEMPT_MASK, &saveMode); if ( (o = *(volatile __gthread_once_t *)once) == 0 ) { *(volatile __gthread_once_t *)once = 1; } rtems_task_mode(saveMode, RTEMS_PREEMPT_MASK, &saveMode); 80020f8: 2b 81 00 14 lw r1,(sp+20) <== NOT EXECUTED 80020fc: 34 02 01 00 mvi r2,256 <== NOT EXECUTED 8002100: 37 83 00 14 addi r3,sp,20 <== NOT EXECUTED 8002104: f8 00 07 67 calli 8003ea0 <== NOT EXECUTED if ( o == 0 ) (*func)(); } return 0; } 8002108: 34 01 00 00 mvi r1,0 <== NOT EXECUTED 800210c: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 8002110: 2b 8b 00 10 lw r11,(sp+16) <== NOT EXECUTED 8002114: 2b 8c 00 0c lw r12,(sp+12) <== NOT EXECUTED 8002118: 2b 8d 00 08 lw r13,(sp+8) <== NOT EXECUTED 800211c: 37 9c 00 14 addi sp,sp,20 <== NOT EXECUTED 8002120: c3 a0 00 00 ret <== NOT EXECUTED =============================================================================== 08002260 : #endif return p; } int rtems_gxx_setspecific(__gthread_key_t key, const void *ptr) { 8002260: 37 9c ff f4 addi sp,sp,-12 8002264: 5b 8b 00 0c sw (sp+12),r11 8002268: 5b 8c 00 08 sw (sp+8),r12 800226c: 5b 9d 00 04 sw (sp+4),ra 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 ); 8002270: 28 23 00 04 lw r3,(r1+4) #endif return p; } int rtems_gxx_setspecific(__gthread_key_t key, const void *ptr) { 8002274: b8 20 58 00 mv r11,r1 8002278: 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 ); 800227c: 34 01 00 00 mvi r1,0 8002280: b9 60 10 00 mv r2,r11 8002284: f8 00 07 a5 calli 8004118 if ( status == RTEMS_SUCCESSFUL ) { /* now let's set the proper value */ key->val = (void *)ptr; return 0; } return -1; 8002288: 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 ) { 800228c: 5c 20 00 03 bne r1,r0,8002298 <== NEVER TAKEN /* now let's set the proper value */ key->val = (void *)ptr; 8002290: 59 6c 00 00 sw (r11+0),r12 return 0; 8002294: 34 03 00 00 mvi r3,0 } return -1; } 8002298: b8 60 08 00 mv r1,r3 800229c: 2b 9d 00 04 lw ra,(sp+4) 80022a0: 2b 8b 00 0c lw r11,(sp+12) 80022a4: 2b 8c 00 08 lw r12,(sp+8) 80022a8: 37 9c 00 0c addi sp,sp,12 80022ac: c3 a0 00 00 ret =============================================================================== 080070f0 : void *rtems_heap_allocate_aligned_with_boundary( size_t size, uintptr_t alignment, uintptr_t boundary ) { 80070f0: 37 9c ff f0 addi sp,sp,-16 80070f4: 5b 8b 00 10 sw (sp+16),r11 80070f8: 5b 8c 00 0c sw (sp+12),r12 80070fc: 5b 8d 00 08 sw (sp+8),r13 8007100: 5b 9d 00 04 sw (sp+4),ra if ( 8007104: 78 04 08 02 mvhi r4,0x802 8007108: 38 84 73 70 ori r4,r4,0x7370 800710c: 28 86 00 00 lw r6,(r4+0) 8007110: 34 05 00 03 mvi r5,3 void *rtems_heap_allocate_aligned_with_boundary( size_t size, uintptr_t alignment, uintptr_t boundary ) { 8007114: b8 20 68 00 mv r13,r1 8007118: b8 40 60 00 mv r12,r2 800711c: b8 60 58 00 mv r11,r3 if ( 8007120: 44 c5 00 11 be r6,r5,8007164 <== ALWAYS TAKEN && !malloc_is_system_state_OK() ) { return NULL; } malloc_deferred_frees_process(); 8007124: fb ff fa b4 calli 8005bf4 /* FIXME: Statistics, boundary checks */ return _Protected_heap_Allocate_aligned_with_boundary( 8007128: 78 05 08 02 mvhi r5,0x802 800712c: 38 a5 60 1c ori r5,r5,0x601c 8007130: 28 a1 00 00 lw r1,(r5+0) 8007134: b9 a0 10 00 mv r2,r13 8007138: b9 80 18 00 mv r3,r12 800713c: b9 60 20 00 mv r4,r11 8007140: f8 00 0e cf calli 800ac7c <_Protected_heap_Allocate_aligned_with_boundary> 8007144: b8 20 28 00 mv r5,r1 RTEMS_Malloc_Heap, size, alignment, boundary ); } 8007148: b8 a0 08 00 mv r1,r5 800714c: 2b 9d 00 04 lw ra,(sp+4) 8007150: 2b 8b 00 10 lw r11,(sp+16) 8007154: 2b 8c 00 0c lw r12,(sp+12) 8007158: 2b 8d 00 08 lw r13,(sp+8) 800715c: 37 9c 00 10 addi sp,sp,16 8007160: c3 a0 00 00 ret uintptr_t boundary ) { if ( _System_state_Is_up( _System_state_Get() ) && !malloc_is_system_state_OK() 8007164: fb ff fa 92 calli 8005bac ) { return NULL; 8007168: 34 05 00 00 mvi r5,0 uintptr_t boundary ) { if ( _System_state_Is_up( _System_state_Get() ) && !malloc_is_system_state_OK() 800716c: 5c 20 ff ee bne r1,r0,8007124 8007170: e3 ff ff f6 bi 8007148 =============================================================================== 0800495c : rtems_status_code rtems_io_register_driver( rtems_device_major_number major, const rtems_driver_address_table *driver_table, rtems_device_major_number *registered_major ) { 800495c: 37 9c ff f8 addi sp,sp,-8 8004960: 5b 8b 00 08 sw (sp+8),r11 8004964: 5b 9d 00 04 sw (sp+4),ra rtems_device_major_number major_limit = _IO_Number_of_drivers; if ( rtems_interrupt_is_in_progress() ) 8004968: 78 04 08 01 mvhi r4,0x801 800496c: 38 84 ae 2c ori r4,r4,0xae2c 8004970: 28 85 00 08 lw r5,(r4+8) rtems_device_major_number major, const rtems_driver_address_table *driver_table, rtems_device_major_number *registered_major ) { rtems_device_major_number major_limit = _IO_Number_of_drivers; 8004974: 78 04 08 01 mvhi r4,0x801 8004978: 38 84 b2 98 ori r4,r4,0xb298 rtems_status_code rtems_io_register_driver( rtems_device_major_number major, const rtems_driver_address_table *driver_table, rtems_device_major_number *registered_major ) { 800497c: b8 20 58 00 mv r11,r1 rtems_device_major_number major_limit = _IO_Number_of_drivers; 8004980: 28 86 00 00 lw r6,(r4+0) if ( rtems_interrupt_is_in_progress() ) return RTEMS_CALLED_FROM_ISR; 8004984: 34 01 00 12 mvi r1,18 rtems_device_major_number *registered_major ) { rtems_device_major_number major_limit = _IO_Number_of_drivers; if ( rtems_interrupt_is_in_progress() ) 8004988: 5c a0 00 33 bne r5,r0,8004a54 return RTEMS_CALLED_FROM_ISR; if ( registered_major == NULL ) return RTEMS_INVALID_ADDRESS; 800498c: 34 01 00 09 mvi r1,9 rtems_device_major_number major_limit = _IO_Number_of_drivers; if ( rtems_interrupt_is_in_progress() ) return RTEMS_CALLED_FROM_ISR; if ( registered_major == NULL ) 8004990: 44 65 00 31 be r3,r5,8004a54 return RTEMS_INVALID_ADDRESS; /* Set it to an invalid value */ *registered_major = major_limit; 8004994: 58 66 00 00 sw (r3+0),r6 if ( driver_table == NULL ) 8004998: 44 40 00 2f be r2,r0,8004a54 static inline bool rtems_io_is_empty_table( const rtems_driver_address_table *table ) { return table->initialization_entry == NULL && table->open_entry == NULL; 800499c: 28 45 00 00 lw r5,(r2+0) 80049a0: 44 a0 00 42 be r5,r0,8004aa8 if ( rtems_io_is_empty_table( driver_table ) ) return RTEMS_INVALID_ADDRESS; if ( major >= major_limit ) return RTEMS_INVALID_NUMBER; 80049a4: 34 01 00 0a mvi r1,10 return RTEMS_INVALID_ADDRESS; if ( rtems_io_is_empty_table( driver_table ) ) return RTEMS_INVALID_ADDRESS; if ( major >= major_limit ) 80049a8: 51 66 00 2b bgeu r11,r6,8004a54 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 80049ac: 78 01 08 01 mvhi r1,0x801 80049b0: 38 21 a9 60 ori r1,r1,0xa960 80049b4: 28 25 00 00 lw r5,(r1+0) 80049b8: 34 a5 00 01 addi r5,r5,1 80049bc: 58 25 00 00 sw (r1+0),r5 return RTEMS_INVALID_NUMBER; _Thread_Disable_dispatch(); if ( major == 0 ) { 80049c0: 5d 60 00 29 bne r11,r0,8004a64 static rtems_status_code rtems_io_obtain_major_number( rtems_device_major_number *major ) { rtems_device_major_number n = _IO_Number_of_drivers; 80049c4: 28 85 00 00 lw r5,(r4+0) rtems_device_major_number m = 0; /* major is error checked by caller */ for ( m = 0; m < n; ++m ) { 80049c8: 44 ab 00 3e be r5,r11,8004ac0 <== NEVER TAKEN 80049cc: 78 06 08 01 mvhi r6,0x801 80049d0: 38 c6 b2 9c ori r6,r6,0xb29c 80049d4: 28 c1 00 00 lw r1,(r6+0) static inline bool rtems_io_is_empty_table( const rtems_driver_address_table *table ) { return table->initialization_entry == NULL && table->open_entry == NULL; 80049d8: 28 24 00 00 lw r4,(r1+0) 80049dc: 44 80 00 36 be r4,r0,8004ab4 rtems_device_major_number n = _IO_Number_of_drivers; rtems_device_major_number m = 0; /* major is error checked by caller */ for ( m = 0; m < n; ++m ) { 80049e0: 35 6b 00 01 addi r11,r11,1 80049e4: 34 21 00 18 addi r1,r1,24 80049e8: 54 ab ff fc bgu r5,r11,80049d8 if ( rtems_io_is_empty_table( table ) ) break; } /* Assigns invalid value in case of failure */ *major = m; 80049ec: 58 6b 00 00 sw (r3+0),r11 if ( m != n ) 80049f0: 44 ab 00 35 be r5,r11,8004ac4 80049f4: b5 6b 08 00 add r1,r11,r11 80049f8: b4 2b 08 00 add r1,r1,r11 80049fc: b4 21 08 00 add r1,r1,r1 8004a00: b4 21 08 00 add r1,r1,r1 8004a04: b4 21 08 00 add r1,r1,r1 } *registered_major = major; } _IO_Driver_address_table [major] = *driver_table; 8004a08: 28 c3 00 00 lw r3,(r6+0) 8004a0c: 28 44 00 00 lw r4,(r2+0) 8004a10: b4 61 08 00 add r1,r3,r1 8004a14: 58 24 00 00 sw (r1+0),r4 8004a18: 28 43 00 04 lw r3,(r2+4) 8004a1c: 58 23 00 04 sw (r1+4),r3 8004a20: 28 43 00 08 lw r3,(r2+8) 8004a24: 58 23 00 08 sw (r1+8),r3 8004a28: 28 43 00 0c lw r3,(r2+12) 8004a2c: 58 23 00 0c sw (r1+12),r3 8004a30: 28 43 00 10 lw r3,(r2+16) 8004a34: 58 23 00 10 sw (r1+16),r3 8004a38: 28 42 00 14 lw r2,(r2+20) 8004a3c: 58 22 00 14 sw (r1+20),r2 _Thread_Enable_dispatch(); 8004a40: f8 00 08 83 calli 8006c4c <_Thread_Enable_dispatch> return rtems_io_initialize( major, 0, NULL ); 8004a44: b9 60 08 00 mv r1,r11 8004a48: 34 02 00 00 mvi r2,0 8004a4c: 34 03 00 00 mvi r3,0 8004a50: f8 00 28 65 calli 800ebe4 } 8004a54: 2b 9d 00 04 lw ra,(sp+4) 8004a58: 2b 8b 00 08 lw r11,(sp+8) 8004a5c: 37 9c 00 08 addi sp,sp,8 8004a60: c3 a0 00 00 ret _Thread_Enable_dispatch(); return sc; } major = *registered_major; } else { rtems_driver_address_table *const table = _IO_Driver_address_table + major; 8004a64: b5 6b 08 00 add r1,r11,r11 8004a68: 78 06 08 01 mvhi r6,0x801 8004a6c: b4 2b 08 00 add r1,r1,r11 8004a70: 38 c6 b2 9c ori r6,r6,0xb29c 8004a74: b4 21 08 00 add r1,r1,r1 8004a78: 28 c5 00 00 lw r5,(r6+0) 8004a7c: b4 21 08 00 add r1,r1,r1 8004a80: b4 21 08 00 add r1,r1,r1 8004a84: b4 a1 28 00 add r5,r5,r1 static inline bool rtems_io_is_empty_table( const rtems_driver_address_table *table ) { return table->initialization_entry == NULL && table->open_entry == NULL; 8004a88: 28 a4 00 00 lw r4,(r5+0) 8004a8c: 44 80 00 11 be r4,r0,8004ad0 major = *registered_major; } else { rtems_driver_address_table *const table = _IO_Driver_address_table + major; if ( !rtems_io_is_empty_table( table ) ) { _Thread_Enable_dispatch(); 8004a90: f8 00 08 6f calli 8006c4c <_Thread_Enable_dispatch> return RTEMS_RESOURCE_IN_USE; 8004a94: 34 01 00 0c mvi r1,12 _IO_Driver_address_table [major] = *driver_table; _Thread_Enable_dispatch(); return rtems_io_initialize( major, 0, NULL ); } 8004a98: 2b 9d 00 04 lw ra,(sp+4) 8004a9c: 2b 8b 00 08 lw r11,(sp+8) 8004aa0: 37 9c 00 08 addi sp,sp,8 8004aa4: c3 a0 00 00 ret static inline bool rtems_io_is_empty_table( const rtems_driver_address_table *table ) { return table->initialization_entry == NULL && table->open_entry == NULL; 8004aa8: 28 47 00 04 lw r7,(r2+4) 8004aac: 5c e5 ff be bne r7,r5,80049a4 8004ab0: e3 ff ff e9 bi 8004a54 8004ab4: 28 27 00 04 lw r7,(r1+4) 8004ab8: 5c e4 ff ca bne r7,r4,80049e0 8004abc: e3 ff ff cc bi 80049ec if ( rtems_io_is_empty_table( table ) ) break; } /* Assigns invalid value in case of failure */ *major = m; 8004ac0: 58 60 00 00 sw (r3+0),r0 if ( major == 0 ) { rtems_status_code sc = rtems_io_obtain_major_number( registered_major ); if ( sc != RTEMS_SUCCESSFUL ) { _Thread_Enable_dispatch(); 8004ac4: f8 00 08 62 calli 8006c4c <_Thread_Enable_dispatch> *major = m; if ( m != n ) return RTEMS_SUCCESSFUL; return RTEMS_TOO_MANY; 8004ac8: 34 01 00 05 mvi r1,5 if ( major == 0 ) { rtems_status_code sc = rtems_io_obtain_major_number( registered_major ); if ( sc != RTEMS_SUCCESSFUL ) { _Thread_Enable_dispatch(); return sc; 8004acc: e3 ff ff e2 bi 8004a54 static inline bool rtems_io_is_empty_table( const rtems_driver_address_table *table ) { return table->initialization_entry == NULL && table->open_entry == NULL; 8004ad0: 28 a5 00 04 lw r5,(r5+4) 8004ad4: 5c a4 ff ef bne r5,r4,8004a90 if ( !rtems_io_is_empty_table( table ) ) { _Thread_Enable_dispatch(); return RTEMS_RESOURCE_IN_USE; } *registered_major = major; 8004ad8: 58 6b 00 00 sw (r3+0),r11 8004adc: e3 ff ff cb bi 8004a08 =============================================================================== 08004ae0 : */ rtems_status_code rtems_io_unregister_driver( rtems_device_major_number major ) { 8004ae0: 37 9c ff fc addi sp,sp,-4 8004ae4: 5b 9d 00 04 sw (sp+4),ra if ( rtems_interrupt_is_in_progress() ) 8004ae8: 78 02 08 01 mvhi r2,0x801 8004aec: 38 42 ae 2c ori r2,r2,0xae2c 8004af0: 28 43 00 08 lw r3,(r2+8) return RTEMS_CALLED_FROM_ISR; 8004af4: 34 02 00 12 mvi r2,18 rtems_status_code rtems_io_unregister_driver( rtems_device_major_number major ) { if ( rtems_interrupt_is_in_progress() ) 8004af8: 5c 60 00 19 bne r3,r0,8004b5c <== NEVER TAKEN return RTEMS_CALLED_FROM_ISR; if ( major < _IO_Number_of_drivers ) { 8004afc: 78 02 08 01 mvhi r2,0x801 8004b00: 38 42 b2 98 ori r2,r2,0xb298 8004b04: 28 43 00 00 lw r3,(r2+0) _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } return RTEMS_UNSATISFIED; 8004b08: 34 02 00 0d mvi r2,13 ) { if ( rtems_interrupt_is_in_progress() ) return RTEMS_CALLED_FROM_ISR; if ( major < _IO_Number_of_drivers ) { 8004b0c: 50 23 00 14 bgeu r1,r3,8004b5c <== NEVER TAKEN 8004b10: 78 02 08 01 mvhi r2,0x801 8004b14: 38 42 a9 60 ori r2,r2,0xa960 8004b18: 28 43 00 00 lw r3,(r2+0) 8004b1c: 34 63 00 01 addi r3,r3,1 8004b20: 58 43 00 00 sw (r2+0),r3 _Thread_Disable_dispatch(); memset( 8004b24: 78 02 08 01 mvhi r2,0x801 &_IO_Driver_address_table[major], 8004b28: b4 21 18 00 add r3,r1,r1 if ( rtems_interrupt_is_in_progress() ) return RTEMS_CALLED_FROM_ISR; if ( major < _IO_Number_of_drivers ) { _Thread_Disable_dispatch(); memset( 8004b2c: 38 42 b2 9c ori r2,r2,0xb29c &_IO_Driver_address_table[major], 8004b30: b4 61 08 00 add r1,r3,r1 if ( rtems_interrupt_is_in_progress() ) return RTEMS_CALLED_FROM_ISR; if ( major < _IO_Number_of_drivers ) { _Thread_Disable_dispatch(); memset( 8004b34: 28 44 00 00 lw r4,(r2+0) &_IO_Driver_address_table[major], 8004b38: b4 21 08 00 add r1,r1,r1 8004b3c: b4 21 08 00 add r1,r1,r1 8004b40: b4 21 08 00 add r1,r1,r1 if ( rtems_interrupt_is_in_progress() ) return RTEMS_CALLED_FROM_ISR; if ( major < _IO_Number_of_drivers ) { _Thread_Disable_dispatch(); memset( 8004b44: 34 02 00 00 mvi r2,0 8004b48: 34 03 00 18 mvi r3,24 8004b4c: b4 81 08 00 add r1,r4,r1 8004b50: f8 00 37 be calli 8012a48 &_IO_Driver_address_table[major], 0, sizeof( rtems_driver_address_table ) ); _Thread_Enable_dispatch(); 8004b54: f8 00 08 3e calli 8006c4c <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 8004b58: 34 02 00 00 mvi r2,0 } return RTEMS_UNSATISFIED; } 8004b5c: b8 40 08 00 mv r1,r2 8004b60: 2b 9d 00 04 lw ra,(sp+4) 8004b64: 37 9c 00 04 addi sp,sp,4 8004b68: c3 a0 00 00 ret =============================================================================== 08006378 : #include #include void rtems_iterate_over_all_threads(rtems_per_thread_routine routine) { 8006378: 37 9c ff e4 addi sp,sp,-28 800637c: 5b 8b 00 1c sw (sp+28),r11 8006380: 5b 8c 00 18 sw (sp+24),r12 8006384: 5b 8d 00 14 sw (sp+20),r13 8006388: 5b 8e 00 10 sw (sp+16),r14 800638c: 5b 8f 00 0c sw (sp+12),r15 8006390: 5b 90 00 08 sw (sp+8),r16 8006394: 5b 9d 00 04 sw (sp+4),ra 8006398: b8 20 78 00 mv r15,r1 uint32_t i; uint32_t api_index; Thread_Control *the_thread; Objects_Information *information; if ( !routine ) 800639c: 44 20 00 19 be r1,r0,8006400 <== NEVER TAKEN #endif #include #include void rtems_iterate_over_all_threads(rtems_per_thread_routine routine) 80063a0: 78 01 08 02 mvhi r1,0x802 uint32_t i; uint32_t api_index; Thread_Control *the_thread; Objects_Information *information; if ( !routine ) 80063a4: 78 0e 08 02 mvhi r14,0x802 #endif #include #include void rtems_iterate_over_all_threads(rtems_per_thread_routine routine) 80063a8: 38 21 a6 74 ori r1,r1,0xa674 uint32_t i; uint32_t api_index; Thread_Control *the_thread; Objects_Information *information; if ( !routine ) 80063ac: 39 ce a6 78 ori r14,r14,0xa678 #endif #include #include void rtems_iterate_over_all_threads(rtems_per_thread_routine routine) 80063b0: 34 30 00 10 addi r16,r1,16 #if !defined(RTEMS_POSIX_API) || defined(RTEMS_DEBUG) if ( !_Objects_Information_table[ api_index ] ) continue; #endif information = _Objects_Information_table[ api_index ][ 1 ]; 80063b4: 29 c1 00 00 lw r1,(r14+0) 80063b8: 28 2d 00 04 lw r13,(r1+4) if ( !information ) 80063bc: 45 a0 00 0f be r13,r0,80063f8 continue; for ( i=1 ; i <= information->maximum ; i++ ) { 80063c0: 2d a3 00 10 lhu r3,(r13+16) 80063c4: 44 60 00 0d be r3,r0,80063f8 80063c8: 34 0c 00 04 mvi r12,4 80063cc: 34 0b 00 01 mvi r11,1 the_thread = (Thread_Control *)information->local_table[ i ]; 80063d0: 29 a2 00 1c lw r2,(r13+28) information = _Objects_Information_table[ api_index ][ 1 ]; if ( !information ) continue; for ( i=1 ; i <= information->maximum ; i++ ) { 80063d4: 35 6b 00 01 addi r11,r11,1 the_thread = (Thread_Control *)information->local_table[ i ]; 80063d8: b4 4c 10 00 add r2,r2,r12 80063dc: 28 42 00 00 lw r2,(r2+0) information = _Objects_Information_table[ api_index ][ 1 ]; if ( !information ) continue; for ( i=1 ; i <= information->maximum ; i++ ) { 80063e0: 35 8c 00 04 addi r12,r12,4 the_thread = (Thread_Control *)information->local_table[ i ]; if ( !the_thread ) continue; (*routine)(the_thread); 80063e4: b8 40 08 00 mv r1,r2 continue; for ( i=1 ; i <= information->maximum ; i++ ) { the_thread = (Thread_Control *)information->local_table[ i ]; if ( !the_thread ) 80063e8: 44 40 00 03 be r2,r0,80063f4 continue; (*routine)(the_thread); 80063ec: d9 e0 00 00 call r15 80063f0: 2d a3 00 10 lhu r3,(r13+16) information = _Objects_Information_table[ api_index ][ 1 ]; if ( !information ) continue; for ( i=1 ; i <= information->maximum ; i++ ) { 80063f4: 50 6b ff f7 bgeu r3,r11,80063d0 80063f8: 35 ce 00 04 addi r14,r14,4 Objects_Information *information; if ( !routine ) return; for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) { 80063fc: 5d d0 ff ee bne r14,r16,80063b4 (*routine)(the_thread); } } } 8006400: 2b 9d 00 04 lw ra,(sp+4) 8006404: 2b 8b 00 1c lw r11,(sp+28) 8006408: 2b 8c 00 18 lw r12,(sp+24) 800640c: 2b 8d 00 14 lw r13,(sp+20) 8006410: 2b 8e 00 10 lw r14,(sp+16) 8006414: 2b 8f 00 0c lw r15,(sp+12) 8006418: 2b 90 00 08 lw r16,(sp+8) 800641c: 37 9c 00 1c addi sp,sp,28 8006420: c3 a0 00 00 ret =============================================================================== 080087e8 : */ void rtems_libio_free( rtems_libio_t *iop ) { 80087e8: 37 9c ff f4 addi sp,sp,-12 80087ec: 5b 8b 00 0c sw (sp+12),r11 80087f0: 5b 8c 00 08 sw (sp+8),r12 80087f4: 5b 9d 00 04 sw (sp+4),ra 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 ); 80087f8: 78 0c 08 01 mvhi r12,0x801 80087fc: 39 8c 47 74 ori r12,r12,0x4774 8008800: b8 20 58 00 mv r11,r1 8008804: 29 81 00 00 lw r1,(r12+0) 8008808: 34 02 00 00 mvi r2,0 800880c: 34 03 00 00 mvi r3,0 8008810: fb ff e9 31 calli 8002cd4 rtems_libio_lock(); if (iop->sem) 8008814: 29 61 00 30 lw r1,(r11+48) 8008818: 44 20 00 02 be r1,r0,8008820 <== NEVER TAKEN rtems_semaphore_delete(iop->sem); 800881c: f8 00 04 4b calli 8009948 iop->flags &= ~LIBIO_FLAGS_OPEN; iop->data1 = rtems_libio_iop_freelist; 8008820: 78 02 08 01 mvhi r2,0x801 rtems_libio_lock(); if (iop->sem) rtems_semaphore_delete(iop->sem); iop->flags &= ~LIBIO_FLAGS_OPEN; 8008824: 29 65 00 18 lw r5,(r11+24) iop->data1 = rtems_libio_iop_freelist; 8008828: 38 42 47 70 ori r2,r2,0x4770 800882c: 28 44 00 00 lw r4,(r2+0) } static inline void rtems_libio_unlock( void ) { rtems_semaphore_release( rtems_libio_semaphore ); 8008830: 29 81 00 00 lw r1,(r12+0) rtems_libio_lock(); if (iop->sem) rtems_semaphore_delete(iop->sem); iop->flags &= ~LIBIO_FLAGS_OPEN; 8008834: 34 03 fe ff mvi r3,-257 8008838: a0 a3 18 00 and r3,r5,r3 800883c: 59 63 00 18 sw (r11+24),r3 iop->data1 = rtems_libio_iop_freelist; 8008840: 59 64 00 38 sw (r11+56),r4 rtems_libio_iop_freelist = iop; 8008844: 58 4b 00 00 sw (r2+0),r11 8008848: fb ff e9 7f calli 8002e44 rtems_libio_unlock(); } 800884c: 2b 9d 00 04 lw ra,(sp+4) 8008850: 2b 8b 00 0c lw r11,(sp+12) 8008854: 2b 8c 00 08 lw r12,(sp+8) 8008858: 37 9c 00 0c addi sp,sp,12 800885c: c3 a0 00 00 ret =============================================================================== 08001610 : * * Called by BSP startup code to initialize the libio subsystem. */ void rtems_libio_init( void ) { 8001610: 37 9c ff f8 addi sp,sp,-8 8001614: 5b 8b 00 08 sw (sp+8),r11 8001618: 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) 800161c: 78 01 08 01 mvhi r1,0x801 8001620: 38 21 40 10 ori r1,r1,0x4010 8001624: 28 2b 00 00 lw r11,(r1+0) 8001628: 45 60 00 1d be r11,r0,800169c <== NEVER TAKEN { rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops, 800162c: 34 02 00 40 mvi r2,64 8001630: b9 60 08 00 mv r1,r11 8001634: fb ff ff 05 calli 8001248 8001638: 78 02 08 01 mvhi r2,0x801 800163c: 38 42 47 6c ori r2,r2,0x476c 8001640: 58 41 00 00 sw (r2+0),r1 8001644: b8 20 18 00 mv r3,r1 sizeof(rtems_libio_t)); if (rtems_libio_iops == NULL) 8001648: 44 20 00 2a be r1,r0,80016f0 rtems_fatal_error_occurred(RTEMS_NO_MEMORY); iop = rtems_libio_iop_freelist = rtems_libio_iops; 800164c: 78 02 08 01 mvhi r2,0x801 8001650: 38 42 47 70 ori r2,r2,0x4770 8001654: 58 41 00 00 sw (r2+0),r1 for (i = 0 ; (i + 1) < rtems_libio_number_iops ; i++, iop++) 8001658: 34 02 00 01 mvi r2,1 800165c: 50 4b 00 0f bgeu r2,r11,8001698 <== NEVER TAKEN * rtems_libio_init * * Called by BSP startup code to initialize the libio subsystem. */ void rtems_libio_init( void ) 8001660: 34 22 00 40 addi r2,r1,64 8001664: 34 03 00 01 mvi r3,1 if (rtems_libio_iops == NULL) rtems_fatal_error_occurred(RTEMS_NO_MEMORY); iop = rtems_libio_iop_freelist = rtems_libio_iops; for (i = 0 ; (i + 1) < rtems_libio_number_iops ; i++, iop++) iop->data1 = iop + 1; 8001668: 58 42 ff f8 sw (r2+-8),r2 800166c: 34 63 00 01 addi r3,r3,1 8001670: 34 42 00 40 addi r2,r2,64 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++) 8001674: 5c 6b ff fd bne r3,r11,8001668 * rtems_libio_init * * Called by BSP startup code to initialize the libio subsystem. */ void rtems_libio_init( void ) 8001678: 34 63 ff ff addi r3,r3,-1 800167c: b4 63 18 00 add r3,r3,r3 8001680: b4 63 18 00 add r3,r3,r3 8001684: b4 63 18 00 add r3,r3,r3 8001688: b4 63 18 00 add r3,r3,r3 800168c: b4 63 18 00 add r3,r3,r3 8001690: b4 63 18 00 add r3,r3,r3 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++) 8001694: b4 23 18 00 add r3,r1,r3 iop->data1 = iop + 1; iop->data1 = NULL; 8001698: 58 60 00 38 sw (r3+56),r0 /* * Create the binary semaphore used to provide mutual exclusion * on the IOP Table. */ rc = rtems_semaphore_create( 800169c: 78 02 08 01 mvhi r2,0x801 80016a0: 38 42 35 2c ori r2,r2,0x352c 80016a4: 28 41 00 00 lw r1,(r2+0) 80016a8: 78 05 08 01 mvhi r5,0x801 80016ac: 34 03 00 54 mvi r3,84 80016b0: 34 02 00 01 mvi r2,1 80016b4: 34 04 00 00 mvi r4,0 80016b8: 38 a5 47 74 ori r5,r5,0x4774 80016bc: f8 00 05 02 calli 8002ac4 80016c0: 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 ) 80016c4: 5c 20 00 0a bne r1,r0,80016ec <== NEVER TAKEN /* * Initialize the base file system infrastructure. */ if (rtems_fs_init_helper) 80016c8: 78 02 08 01 mvhi r2,0x801 80016cc: 38 42 40 0c ori r2,r2,0x400c 80016d0: 28 41 00 00 lw r1,(r2+0) 80016d4: 44 23 00 02 be r1,r3,80016dc <== NEVER TAKEN (* rtems_fs_init_helper)(); 80016d8: d8 20 00 00 call r1 } 80016dc: 2b 9d 00 04 lw ra,(sp+4) 80016e0: 2b 8b 00 08 lw r11,(sp+8) 80016e4: 37 9c 00 08 addi sp,sp,8 80016e8: c3 a0 00 00 ret RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY, RTEMS_NO_PRIORITY, &rtems_libio_semaphore ); if ( rc != RTEMS_SUCCESSFUL ) rtems_fatal_error_occurred( rc ); 80016ec: f8 00 07 58 calli 800344c <== NOT EXECUTED if (rtems_libio_number_iops > 0) { rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops, sizeof(rtems_libio_t)); if (rtems_libio_iops == NULL) rtems_fatal_error_occurred(RTEMS_NO_MEMORY); 80016f0: 34 01 00 1a mvi r1,26 80016f4: f8 00 07 56 calli 800344c =============================================================================== 08008908 : */ int rtems_libio_is_file_open( void *node_access ) { 8008908: 37 9c ff f0 addi sp,sp,-16 800890c: 5b 8b 00 10 sw (sp+16),r11 8008910: 5b 8c 00 0c sw (sp+12),r12 8008914: 5b 8d 00 08 sw (sp+8),r13 8008918: 5b 9d 00 04 sw (sp+4),ra 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 ); 800891c: 78 0c 08 01 mvhi r12,0x801 8008920: 39 8c 47 74 ori r12,r12,0x4774 8008924: b8 20 58 00 mv r11,r1 8008928: 29 81 00 00 lw r1,(r12+0) 800892c: 34 02 00 00 mvi r2,0 8008930: 34 03 00 00 mvi r3,0 8008934: fb ff e8 e8 calli 8002cd4 /* * Look for any active file descriptor entry. */ for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){ 8008938: 78 01 08 01 mvhi r1,0x801 800893c: 38 21 40 10 ori r1,r1,0x4010 8008940: 28 25 00 00 lw r5,(r1+0) 8008944: 78 01 08 01 mvhi r1,0x801 8008948: 38 21 47 6c ori r1,r1,0x476c 800894c: 28 22 00 00 lw r2,(r1+0) int rtems_libio_is_file_open( void *node_access ) { rtems_libio_t *iop; int result=0; 8008950: 34 0d 00 00 mvi r13,0 /* * Look for any active file descriptor entry. */ for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){ 8008954: 44 a0 00 0c be r5,r0,8008984 <== NEVER TAKEN 8008958: 34 03 00 00 mvi r3,0 if ((iop->flags & LIBIO_FLAGS_OPEN) != 0) { 800895c: 28 44 00 18 lw r4,(r2+24) /* * Look for any active file descriptor entry. */ for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){ 8008960: 34 63 00 01 addi r3,r3,1 if ((iop->flags & LIBIO_FLAGS_OPEN) != 0) { 8008964: 20 84 01 00 andi r4,r4,0x100 8008968: 44 80 00 03 be r4,r0,8008974 /* * Check if this node is under the file system that we * are trying to dismount. */ if ( iop->pathinfo.node_access == node_access ) { 800896c: 28 41 00 1c lw r1,(r2+28) 8008970: 44 2b 00 0e be r1,r11,80089a8 /* * Look for any active file descriptor entry. */ for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){ 8008974: 50 65 00 03 bgeu r3,r5,8008980 8008978: 34 42 00 40 addi r2,r2,64 800897c: e3 ff ff f8 bi 800895c int rtems_libio_is_file_open( void *node_access ) { rtems_libio_t *iop; int result=0; 8008980: 34 0d 00 00 mvi r13,0 } static inline void rtems_libio_unlock( void ) { rtems_semaphore_release( rtems_libio_semaphore ); 8008984: 29 81 00 00 lw r1,(r12+0) 8008988: fb ff e9 2f calli 8002e44 } rtems_libio_unlock(); return result; } 800898c: b9 a0 08 00 mv r1,r13 8008990: 2b 9d 00 04 lw ra,(sp+4) 8008994: 2b 8b 00 10 lw r11,(sp+16) 8008998: 2b 8c 00 0c lw r12,(sp+12) 800899c: 2b 8d 00 08 lw r13,(sp+8) 80089a0: 37 9c 00 10 addi sp,sp,16 80089a4: c3 a0 00 00 ret * Check if this node is under the file system that we * are trying to dismount. */ if ( iop->pathinfo.node_access == node_access ) { result = 1; 80089a8: 34 0d 00 01 mvi r13,1 80089ac: e3 ff ff f6 bi 8008984 =============================================================================== 08008860 : */ int rtems_libio_is_open_files_in_fs( rtems_filesystem_mount_table_entry_t * fs_mt_entry ) { 8008860: 37 9c ff f0 addi sp,sp,-16 8008864: 5b 8b 00 10 sw (sp+16),r11 8008868: 5b 8c 00 0c sw (sp+12),r12 800886c: 5b 8d 00 08 sw (sp+8),r13 8008870: 5b 9d 00 04 sw (sp+4),ra 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 ); 8008874: 78 0c 08 01 mvhi r12,0x801 8008878: 39 8c 47 74 ori r12,r12,0x4774 800887c: b8 20 58 00 mv r11,r1 8008880: 29 81 00 00 lw r1,(r12+0) 8008884: 34 02 00 00 mvi r2,0 8008888: 34 03 00 00 mvi r3,0 800888c: fb ff e9 12 calli 8002cd4 /* * Look for any active file descriptor entry. */ for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){ 8008890: 78 01 08 01 mvhi r1,0x801 8008894: 38 21 40 10 ori r1,r1,0x4010 8008898: 28 25 00 00 lw r5,(r1+0) 800889c: 78 01 08 01 mvhi r1,0x801 80088a0: 38 21 47 6c ori r1,r1,0x476c 80088a4: 28 22 00 00 lw r2,(r1+0) int rtems_libio_is_open_files_in_fs( rtems_filesystem_mount_table_entry_t * fs_mt_entry ) { rtems_libio_t *iop; int result = 0; 80088a8: 34 0d 00 00 mvi r13,0 /* * Look for any active file descriptor entry. */ for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){ 80088ac: 44 a0 00 0c be r5,r0,80088dc <== NEVER TAKEN 80088b0: 34 03 00 00 mvi r3,0 if ((iop->flags & LIBIO_FLAGS_OPEN) != 0) { 80088b4: 28 44 00 18 lw r4,(r2+24) /* * Look for any active file descriptor entry. */ for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){ 80088b8: 34 63 00 01 addi r3,r3,1 if ((iop->flags & LIBIO_FLAGS_OPEN) != 0) { 80088bc: 20 84 01 00 andi r4,r4,0x100 80088c0: 44 80 00 03 be r4,r0,80088cc /* * Check if this node is under the file system that we * are trying to dismount. */ if ( iop->pathinfo.mt_entry == fs_mt_entry ) { 80088c4: 28 41 00 2c lw r1,(r2+44) 80088c8: 44 2b 00 0e be r1,r11,8008900 /* * Look for any active file descriptor entry. */ for (iop=rtems_libio_iops,i=0; i < rtems_libio_number_iops; iop++, i++){ 80088cc: 50 65 00 03 bgeu r3,r5,80088d8 80088d0: 34 42 00 40 addi r2,r2,64 80088d4: e3 ff ff f8 bi 80088b4 int rtems_libio_is_open_files_in_fs( rtems_filesystem_mount_table_entry_t * fs_mt_entry ) { rtems_libio_t *iop; int result = 0; 80088d8: 34 0d 00 00 mvi r13,0 } static inline void rtems_libio_unlock( void ) { rtems_semaphore_release( rtems_libio_semaphore ); 80088dc: 29 81 00 00 lw r1,(r12+0) 80088e0: fb ff e9 59 calli 8002e44 } rtems_libio_unlock(); return result; } 80088e4: b9 a0 08 00 mv r1,r13 80088e8: 2b 9d 00 04 lw ra,(sp+4) 80088ec: 2b 8b 00 10 lw r11,(sp+16) 80088f0: 2b 8c 00 0c lw r12,(sp+12) 80088f4: 2b 8d 00 08 lw r13,(sp+8) 80088f8: 37 9c 00 10 addi sp,sp,16 80088fc: c3 a0 00 00 ret * Check if this node is under the file system that we * are trying to dismount. */ if ( iop->pathinfo.mt_entry == fs_mt_entry ) { result = 1; 8008900: 34 0d 00 01 mvi r13,1 8008904: e3 ff ff f6 bi 80088dc =============================================================================== 08002d38 : rtems_status_code rtems_libio_set_private_env(void) { 8002d38: 37 9c ff b8 addi sp,sp,-72 8002d3c: 5b 8b 00 20 sw (sp+32),r11 8002d40: 5b 8c 00 1c sw (sp+28),r12 8002d44: 5b 8d 00 18 sw (sp+24),r13 8002d48: 5b 8e 00 14 sw (sp+20),r14 8002d4c: 5b 8f 00 10 sw (sp+16),r15 8002d50: 5b 90 00 0c sw (sp+12),r16 8002d54: 5b 91 00 08 sw (sp+8),r17 8002d58: 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); 8002d5c: 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(); 8002d60: f8 00 03 73 calli 8003b2c 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); 8002d64: 39 6b 39 9c ori r11,r11,0x399c 8002d68: 37 8d 00 38 addi r13,sp,56 8002d6c: 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(); 8002d70: b8 20 78 00 mv r15,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); 8002d74: 34 03 00 00 mvi r3,0 8002d78: b9 60 08 00 mv r1,r11 8002d7c: b9 a0 20 00 mv r4,r13 8002d80: 34 05 00 00 mvi r5,0 8002d84: fb ff fa 6c calli 8001734 8002d88: b8 20 60 00 mv r12,r1 error_1: rtems_filesystem_freenode(&root_loc); error_0: return RTEMS_NO_MEMORY; 8002d8c: 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) 8002d90: 44 20 00 0c be r1,r0,8002dc0 <== ALWAYS TAKEN error_1: rtems_filesystem_freenode(&root_loc); error_0: return RTEMS_NO_MEMORY; } 8002d94: b8 40 08 00 mv r1,r2 8002d98: 2b 9d 00 04 lw ra,(sp+4) 8002d9c: 2b 8b 00 20 lw r11,(sp+32) 8002da0: 2b 8c 00 1c lw r12,(sp+28) 8002da4: 2b 8d 00 18 lw r13,(sp+24) 8002da8: 2b 8e 00 14 lw r14,(sp+20) 8002dac: 2b 8f 00 10 lw r15,(sp+16) 8002db0: 2b 90 00 0c lw r16,(sp+12) 8002db4: 2b 91 00 08 lw r17,(sp+8) 8002db8: 37 9c 00 48 addi sp,sp,72 8002dbc: c3 a0 00 00 ret rv = rtems_filesystem_evaluate_path("/", 1, 0, &root_loc, 0); if (rv != 0) goto error_0; rv = rtems_filesystem_evaluate_path("/", 1, 0, ¤t_loc, 0); 8002dc0: 37 90 00 24 addi r16,sp,36 8002dc4: b9 60 08 00 mv r1,r11 8002dc8: 34 02 00 01 mvi r2,1 8002dcc: 34 03 00 00 mvi r3,0 8002dd0: ba 00 20 00 mv r4,r16 8002dd4: 34 05 00 00 mvi r5,0 8002dd8: fb ff fa 57 calli 8001734 if (rv != 0) 8002ddc: 5c 2c 00 53 bne r1,r12,8002f28 <== 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 8002de0: 78 0e 08 01 mvhi r14,0x801 8002de4: 39 ce 51 08 ori r14,r14,0x5108 8002de8: 29 cb 00 00 lw r11,(r14+0) /* * Bharath: I'm not sure if the check can be reduced to * if( rtems_current_user_env->task_id != task_id ) { */ if ( 8002dec: 78 0c 08 01 mvhi r12,0x801 8002df0: 39 8c 57 90 ori r12,r12,0x5790 8002df4: 45 6c 00 03 be r11,r12,8002e00 rtems_current_user_env == &rtems_global_user_env || rtems_current_user_env->task_id != task_id 8002df8: 29 61 00 00 lw r1,(r11+0) 8002dfc: 44 2f 00 0c be r1,r15,8002e2c ) { new_env = malloc(sizeof(rtems_user_env_t)); 8002e00: 34 01 00 48 mvi r1,72 8002e04: fb ff fc 86 calli 800201c 8002e08: b8 20 58 00 mv r11,r1 if (new_env == NULL) 8002e0c: 44 20 00 45 be r1,r0,8002f20 #ifdef HAVE_USERENV_REFCNT new_env->refcnt = 1; #endif sc = rtems_task_variable_add( 8002e10: 78 03 08 00 mvhi r3,0x800 8002e14: 34 01 00 00 mvi r1,0 8002e18: b9 c0 10 00 mv r2,r14 8002e1c: 38 63 2c f4 ori r3,r3,0x2cf4 8002e20: f8 00 03 75 calli 8003bf4 RTEMS_SELF, (void*)&rtems_current_user_env, (void(*)(void *))free_user_env ); if (sc != RTEMS_SUCCESSFUL) 8002e24: 5c 20 00 3d bne r1,r0,8002f18 goto error_3; rtems_current_user_env = new_env; 8002e28: 59 cb 00 00 sw (r14+0),r11 } /* Inherit the global values */ *rtems_current_user_env = rtems_global_user_env; 8002e2c: 29 81 00 00 lw r1,(r12+0) * be freed when deleting the environment. */ rtems_filesystem_root = root_loc; rtems_filesystem_current = current_loc; return RTEMS_SUCCESSFUL; 8002e30: 34 02 00 00 mvi r2,0 rtems_current_user_env = new_env; } /* Inherit the global values */ *rtems_current_user_env = rtems_global_user_env; 8002e34: 59 61 00 00 sw (r11+0),r1 8002e38: 29 81 00 04 lw r1,(r12+4) 8002e3c: 59 61 00 04 sw (r11+4),r1 8002e40: 29 81 00 08 lw r1,(r12+8) 8002e44: 59 61 00 08 sw (r11+8),r1 8002e48: 29 81 00 0c lw r1,(r12+12) 8002e4c: 59 61 00 0c sw (r11+12),r1 8002e50: 29 81 00 10 lw r1,(r12+16) 8002e54: 59 61 00 10 sw (r11+16),r1 8002e58: 29 81 00 14 lw r1,(r12+20) 8002e5c: 59 61 00 14 sw (r11+20),r1 8002e60: 29 81 00 18 lw r1,(r12+24) 8002e64: 59 61 00 18 sw (r11+24),r1 8002e68: 29 81 00 1c lw r1,(r12+28) 8002e6c: 59 61 00 1c sw (r11+28),r1 8002e70: 29 81 00 20 lw r1,(r12+32) 8002e74: 59 61 00 20 sw (r11+32),r1 8002e78: 29 81 00 24 lw r1,(r12+36) 8002e7c: 59 61 00 24 sw (r11+36),r1 8002e80: 29 81 00 28 lw r1,(r12+40) 8002e84: 59 61 00 28 sw (r11+40),r1 8002e88: 29 81 00 2c lw r1,(r12+44) 8002e8c: 59 61 00 2c sw (r11+44),r1 8002e90: 29 81 00 30 lw r1,(r12+48) 8002e94: 59 61 00 30 sw (r11+48),r1 8002e98: 29 81 00 34 lw r1,(r12+52) 8002e9c: 59 61 00 34 sw (r11+52),r1 8002ea0: 29 81 00 38 lw r1,(r12+56) 8002ea4: 59 61 00 38 sw (r11+56),r1 8002ea8: 29 81 00 3c lw r1,(r12+60) 8002eac: 59 61 00 3c sw (r11+60),r1 8002eb0: 29 81 00 40 lw r1,(r12+64) 8002eb4: 59 61 00 40 sw (r11+64),r1 8002eb8: 29 81 00 44 lw r1,(r12+68) rtems_current_user_env->task_id = task_id; 8002ebc: 59 6f 00 00 sw (r11+0),r15 rtems_current_user_env = new_env; } /* Inherit the global values */ *rtems_current_user_env = rtems_global_user_env; 8002ec0: 59 61 00 44 sw (r11+68),r1 * 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; 8002ec4: 2b 81 00 38 lw r1,(sp+56) 8002ec8: 59 61 00 18 sw (r11+24),r1 8002ecc: 2b 81 00 3c lw r1,(sp+60) 8002ed0: 59 61 00 1c sw (r11+28),r1 8002ed4: 2b 81 00 40 lw r1,(sp+64) 8002ed8: 59 61 00 20 sw (r11+32),r1 8002edc: 2b 81 00 44 lw r1,(sp+68) 8002ee0: 59 61 00 24 sw (r11+36),r1 8002ee4: 2b 81 00 48 lw r1,(sp+72) 8002ee8: 59 61 00 28 sw (r11+40),r1 rtems_filesystem_current = current_loc; 8002eec: 2b 81 00 24 lw r1,(sp+36) 8002ef0: 59 61 00 04 sw (r11+4),r1 8002ef4: 2b 81 00 28 lw r1,(sp+40) 8002ef8: 59 61 00 08 sw (r11+8),r1 8002efc: 2b 81 00 2c lw r1,(sp+44) 8002f00: 59 61 00 0c sw (r11+12),r1 8002f04: 2b 81 00 30 lw r1,(sp+48) 8002f08: 59 61 00 10 sw (r11+16),r1 8002f0c: 2b 81 00 34 lw r1,(sp+52) 8002f10: 59 61 00 14 sw (r11+20),r1 return RTEMS_SUCCESSFUL; 8002f14: e3 ff ff a0 bi 8002d94 error_3: free(new_env); 8002f18: b9 60 08 00 mv r1,r11 8002f1c: fb ff fa 5c calli 800188c error_2: rtems_filesystem_freenode(¤t_loc); 8002f20: ba 00 08 00 mv r1,r16 8002f24: fb ff fa 52 calli 800186c error_1: rtems_filesystem_freenode(&root_loc); 8002f28: b9 a0 08 00 mv r1,r13 8002f2c: fb ff fa 50 calli 800186c error_0: return RTEMS_NO_MEMORY; 8002f30: 34 02 00 1a mvi r2,26 8002f34: e3 ff ff 98 bi 8002d94 =============================================================================== 08002f38 : * 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) { 8002f38: 37 9c ff e8 addi sp,sp,-24 8002f3c: 5b 8b 00 14 sw (sp+20),r11 8002f40: 5b 8c 00 10 sw (sp+16),r12 8002f44: 5b 8d 00 0c sw (sp+12),r13 8002f48: 5b 8e 00 08 sw (sp+8),r14 8002f4c: 5b 9d 00 04 sw (sp+4),ra 8002f50: b8 20 68 00 mv r13,r1 rtems_id current_task_id; /* * get current task id */ current_task_id = rtems_task_self(); 8002f54: f8 00 02 f6 calli 8003b2c 8002f58: b8 20 70 00 mv r14,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; 8002f5c: 34 0b 00 00 mvi r11,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 ) 8002f60: 45 a1 00 0e be r13,r1,8002f98 <== NEVER TAKEN return RTEMS_SUCCESSFUL; /* * Try to get the requested user environment */ sc = rtems_task_variable_get( 8002f64: 78 0c 08 01 mvhi r12,0x801 8002f68: 39 8c 51 08 ori r12,r12,0x5108 8002f6c: b9 a0 08 00 mv r1,r13 8002f70: b9 80 10 00 mv r2,r12 8002f74: 37 83 00 18 addi r3,sp,24 8002f78: f8 00 03 5e calli 8003cf0 8002f7c: b8 20 58 00 mv r11,r1 (void*)&shared_user_env ); /* * If it was not successful, return the error code */ if (sc != RTEMS_SUCCESSFUL) 8002f80: 5c 20 00 06 bne r1,r0,8002f98 * 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) { 8002f84: 29 81 00 00 lw r1,(r12+0) 8002f88: 28 22 00 00 lw r2,(r1+0) 8002f8c: 44 4e 00 0b be r2,r14,8002fb8 rtems_user_env_t *tmp = rtems_current_user_env; free_user_env( tmp ); } /* the current_user_env is the same pointer that remote env */ rtems_current_user_env = shared_user_env; 8002f90: 2b 81 00 18 lw r1,(sp+24) 8002f94: 59 81 00 00 sw (r12+0),r1 #ifdef HAVE_USERENV_REFCNT rtems_current_user_env->refcnt++; #endif return RTEMS_SUCCESSFUL; } 8002f98: b9 60 08 00 mv r1,r11 8002f9c: 2b 9d 00 04 lw ra,(sp+4) 8002fa0: 2b 8b 00 14 lw r11,(sp+20) 8002fa4: 2b 8c 00 10 lw r12,(sp+16) 8002fa8: 2b 8d 00 0c lw r13,(sp+12) 8002fac: 2b 8e 00 08 lw r14,(sp+8) 8002fb0: 37 9c 00 18 addi sp,sp,24 8002fb4: c3 a0 00 00 ret * shared_user_env */ if (rtems_current_user_env->task_id==current_task_id) { rtems_user_env_t *tmp = rtems_current_user_env; free_user_env( tmp ); 8002fb8: fb ff ff 4f calli 8002cf4 8002fbc: e3 ff ff f5 bi 8002f90 =============================================================================== 080086a8 : uint32_t flags ) { uint32_t fcntl_flags = 0; if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) { 80086a8: 20 24 00 06 andi r4,r1,0x6 80086ac: 34 03 00 06 mvi r3,6 fcntl_flags |= O_RDWR; 80086b0: 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 ) { 80086b4: 44 83 00 04 be r4,r3,80086c4 fcntl_flags |= O_RDWR; } else if ( (flags & LIBIO_FLAGS_READ) == LIBIO_FLAGS_READ) { 80086b8: 20 23 00 02 andi r3,r1,0x2 fcntl_flags |= O_RDONLY; 80086bc: 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) { 80086c0: 44 60 00 0c be r3,r0,80086f0 <== NEVER TAKEN 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 ) { 80086c4: 20 23 00 01 andi r3,r1,0x1 80086c8: 44 60 00 02 be r3,r0,80086d0 fcntl_flags |= O_NONBLOCK; 80086cc: 38 42 40 00 ori r2,r2,0x4000 } if ( (flags & LIBIO_FLAGS_APPEND) == LIBIO_FLAGS_APPEND ) { 80086d0: 20 23 02 00 andi r3,r1,0x200 80086d4: 44 60 00 02 be r3,r0,80086dc fcntl_flags |= O_APPEND; 80086d8: 38 42 00 08 ori r2,r2,0x8 } if ( (flags & LIBIO_FLAGS_CREATE) == LIBIO_FLAGS_CREATE ) { 80086dc: 20 21 04 00 andi r1,r1,0x400 80086e0: 44 20 00 02 be r1,r0,80086e8 fcntl_flags |= O_CREAT; 80086e4: 38 42 02 00 ori r2,r2,0x200 } return fcntl_flags; } 80086e8: b8 40 08 00 mv r1,r2 80086ec: c3 a0 00 00 ret if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) { fcntl_flags |= O_RDWR; } else if ( (flags & LIBIO_FLAGS_READ) == LIBIO_FLAGS_READ) { fcntl_flags |= O_RDONLY; } else if ( (flags & LIBIO_FLAGS_WRITE) == LIBIO_FLAGS_WRITE) { 80086f0: 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; 80086f4: 7c 42 00 00 cmpnei r2,r2,0 <== NOT EXECUTED 80086f8: e3 ff ff f3 bi 80086c4 <== NOT EXECUTED =============================================================================== 08006124 : * size and thus we skip updating the statistics. */ static void rtems_malloc_statistics_at_free( void *pointer ) { 8006124: 37 9c ff f8 addi sp,sp,-8 8006128: 5b 9d 00 04 sw (sp+4),ra uintptr_t size; if (_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &size) ) { 800612c: 78 03 08 02 mvhi r3,0x802 8006130: 38 63 60 1c ori r3,r3,0x601c * size and thus we skip updating the statistics. */ static void rtems_malloc_statistics_at_free( void *pointer ) { 8006134: b8 20 10 00 mv r2,r1 uintptr_t size; if (_Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &size) ) { 8006138: 28 61 00 00 lw r1,(r3+0) 800613c: 37 83 00 08 addi r3,sp,8 8006140: f8 00 13 18 calli 800ada0 <_Protected_heap_Get_block_size> 8006144: 44 20 00 0b be r1,r0,8006170 <== NEVER TAKEN MSBUMP(lifetime_freed, size); 8006148: 78 01 08 02 mvhi r1,0x802 800614c: 38 21 70 98 ori r1,r1,0x7098 8006150: 2b 83 00 08 lw r3,(sp+8) 8006154: 28 22 00 2c lw r2,(r1+44) 8006158: 28 24 00 28 lw r4,(r1+40) 800615c: b4 62 10 00 add r2,r3,r2 8006160: f4 62 18 00 cmpgu r3,r3,r2 8006164: 58 22 00 2c sw (r1+44),r2 8006168: b4 64 10 00 add r2,r3,r4 800616c: 58 22 00 28 sw (r1+40),r2 } } 8006170: 2b 9d 00 04 lw ra,(sp+4) 8006174: 37 9c 00 08 addi sp,sp,8 8006178: c3 a0 00 00 ret =============================================================================== 0800617c : } static void rtems_malloc_statistics_at_malloc( void *pointer ) { 800617c: 37 9c ff f8 addi sp,sp,-8 8006180: 5b 9d 00 04 sw (sp+4),ra uintptr_t actual_size = 0; 8006184: 5b 80 00 08 sw (sp+8),r0 } static void rtems_malloc_statistics_at_malloc( void *pointer ) { 8006188: 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 ) 800618c: 44 20 00 15 be r1,r0,80061e0 <== NEVER TAKEN return; _Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &actual_size); 8006190: 78 03 08 02 mvhi r3,0x802 8006194: 38 63 60 1c ori r3,r3,0x601c 8006198: 28 61 00 00 lw r1,(r3+0) 800619c: 37 83 00 08 addi r3,sp,8 80061a0: f8 00 13 00 calli 800ada0 <_Protected_heap_Get_block_size> MSBUMP(lifetime_allocated, actual_size); 80061a4: 78 01 08 02 mvhi r1,0x802 80061a8: 38 21 70 98 ori r1,r1,0x7098 80061ac: 2b 83 00 08 lw r3,(sp+8) 80061b0: 28 22 00 24 lw r2,(r1+36) 80061b4: 28 26 00 20 lw r6,(r1+32) current_depth = (uint32_t) (s->lifetime_allocated - s->lifetime_freed); 80061b8: 28 25 00 2c lw r5,(r1+44) if ( !pointer ) return; _Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &actual_size); MSBUMP(lifetime_allocated, actual_size); 80061bc: b4 62 10 00 add r2,r3,r2 80061c0: f4 62 18 00 cmpgu r3,r3,r2 current_depth = (uint32_t) (s->lifetime_allocated - s->lifetime_freed); if (current_depth > s->max_depth) 80061c4: 28 24 00 18 lw r4,(r1+24) if ( !pointer ) return; _Protected_heap_Get_block_size(RTEMS_Malloc_Heap, pointer, &actual_size); MSBUMP(lifetime_allocated, actual_size); 80061c8: b4 66 18 00 add r3,r3,r6 80061cc: 58 22 00 24 sw (r1+36),r2 80061d0: 58 23 00 20 sw (r1+32),r3 current_depth = (uint32_t) (s->lifetime_allocated - s->lifetime_freed); 80061d4: c8 45 10 00 sub r2,r2,r5 if (current_depth > s->max_depth) 80061d8: 50 82 00 02 bgeu r4,r2,80061e0 s->max_depth = current_depth; 80061dc: 58 22 00 18 sw (r1+24),r2 } 80061e0: 2b 9d 00 04 lw ra,(sp+4) 80061e4: 37 9c 00 08 addi sp,sp,8 80061e8: c3 a0 00 00 ret =============================================================================== 0800d304 : int rtems_memalign( void **pointer, size_t alignment, size_t size ) { 800d304: 37 9c ff ec addi sp,sp,-20 800d308: 5b 8b 00 14 sw (sp+20),r11 800d30c: 5b 8c 00 10 sw (sp+16),r12 800d310: 5b 8d 00 0c sw (sp+12),r13 800d314: 5b 8e 00 08 sw (sp+8),r14 800d318: 5b 9d 00 04 sw (sp+4),ra /* * Parameter error checks */ if ( !pointer ) return EINVAL; 800d31c: 34 0c 00 16 mvi r12,22 int rtems_memalign( void **pointer, size_t alignment, size_t size ) { 800d320: b8 20 58 00 mv r11,r1 800d324: b8 40 68 00 mv r13,r2 800d328: b8 60 70 00 mv r14,r3 void *return_this; /* * Parameter error checks */ if ( !pointer ) 800d32c: 44 20 00 1b be r1,r0,800d398 *pointer = NULL; /* * Do not attempt to allocate memory if not in correct system state. */ if ( _System_state_Is_up(_System_state_Get()) && 800d330: 78 01 08 01 mvhi r1,0x801 800d334: 38 21 aa d8 ori r1,r1,0xaad8 800d338: 28 22 00 00 lw r2,(r1+0) * Parameter error checks */ if ( !pointer ) return EINVAL; *pointer = NULL; 800d33c: 59 60 00 00 sw (r11+0),r0 /* * Do not attempt to allocate memory if not in correct system state. */ if ( _System_state_Is_up(_System_state_Get()) && 800d340: 34 01 00 03 mvi r1,3 800d344: 44 41 00 1d be r2,r1,800d3b8 <== ALWAYS TAKEN return EINVAL; /* * If some free's have been deferred, then do them now. */ malloc_deferred_frees_process(); 800d348: fb ff d5 b1 calli 8002a0c Heap_Control *heap, uintptr_t size, uintptr_t alignment ) { return 800d34c: 78 01 08 01 mvhi r1,0x801 800d350: 38 21 a0 1c ori r1,r1,0xa01c 800d354: 28 21 00 00 lw r1,(r1+0) 800d358: b9 a0 18 00 mv r3,r13 800d35c: b9 c0 10 00 mv r2,r14 800d360: 34 04 00 00 mvi r4,0 800d364: fb ff e3 9e calli 80061dc <_Protected_heap_Allocate_aligned_with_boundary> 800d368: b8 20 68 00 mv r13,r1 RTEMS_Malloc_Heap, size, alignment ); if ( !return_this ) return ENOMEM; 800d36c: 34 0c 00 0c mvi r12,12 return_this = _Protected_heap_Allocate_aligned( RTEMS_Malloc_Heap, size, alignment ); if ( !return_this ) 800d370: 44 20 00 0a be r1,r0,800d398 return ENOMEM; /* * If configured, update the more involved statistics */ if ( rtems_malloc_statistics_helpers ) 800d374: 78 02 08 01 mvhi r2,0x801 800d378: 38 42 a6 c0 ori r2,r2,0xa6c0 800d37c: 28 41 00 00 lw r1,(r2+0) 800d380: 44 20 00 04 be r1,r0,800d390 (*rtems_malloc_statistics_helpers->at_malloc)(pointer); 800d384: 28 22 00 04 lw r2,(r1+4) 800d388: b9 60 08 00 mv r1,r11 800d38c: d8 40 00 00 call r2 *pointer = return_this; 800d390: 59 6d 00 00 sw (r11+0),r13 return 0; 800d394: 34 0c 00 00 mvi r12,0 } 800d398: b9 80 08 00 mv r1,r12 800d39c: 2b 9d 00 04 lw ra,(sp+4) 800d3a0: 2b 8b 00 14 lw r11,(sp+20) 800d3a4: 2b 8c 00 10 lw r12,(sp+16) 800d3a8: 2b 8d 00 0c lw r13,(sp+12) 800d3ac: 2b 8e 00 08 lw r14,(sp+8) 800d3b0: 37 9c 00 14 addi sp,sp,20 800d3b4: c3 a0 00 00 ret /* * Do not attempt to allocate memory if not in correct system state. */ if ( _System_state_Is_up(_System_state_Get()) && !malloc_is_system_state_OK() ) 800d3b8: fb ff d5 83 calli 80029c4 *pointer = NULL; /* * Do not attempt to allocate memory if not in correct system state. */ if ( _System_state_Is_up(_System_state_Get()) && 800d3bc: 5c 20 ff e3 bne r1,r0,800d348 <== ALWAYS TAKEN 800d3c0: e3 ff ff f6 bi 800d398 =============================================================================== 0800b484 : return (retval); } int rtems_mkdir(const char *path, mode_t mode) { 800b484: 37 9c ff 84 addi sp,sp,-124 800b488: 5b 8b 00 34 sw (sp+52),r11 800b48c: 5b 8c 00 30 sw (sp+48),r12 800b490: 5b 8d 00 2c sw (sp+44),r13 800b494: 5b 8e 00 28 sw (sp+40),r14 800b498: 5b 8f 00 24 sw (sp+36),r15 800b49c: 5b 90 00 20 sw (sp+32),r16 800b4a0: 5b 91 00 1c sw (sp+28),r17 800b4a4: 5b 92 00 18 sw (sp+24),r18 800b4a8: 5b 93 00 14 sw (sp+20),r19 800b4ac: 5b 94 00 10 sw (sp+16),r20 800b4b0: 5b 95 00 0c sw (sp+12),r21 800b4b4: 5b 96 00 08 sw (sp+8),r22 800b4b8: 5b 9d 00 04 sw (sp+4),ra 800b4bc: b8 40 88 00 mv r17,r2 int success = 0; char *dup_path = strdup(path); 800b4c0: f8 00 12 f6 calli 8010098 800b4c4: b8 20 68 00 mv r13,r1 if (dup_path != NULL) { success = build(dup_path, mode); free(dup_path); } return success != 0 ? 0 : -1; 800b4c8: 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) { 800b4cc: 45 a0 00 31 be r13,r0,800b590 <== NEVER TAKEN char *p; p = path; oumask = 0; retval = 1; if (p[0] == '/') /* Skip leading '/'. */ 800b4d0: 41 a3 00 00 lbu r3,(r13+0) 800b4d4: 34 01 00 2f mvi r1,47 800b4d8: b9 a0 58 00 mv r11,r13 800b4dc: 44 61 00 4d be r3,r1,800b610 800b4e0: 34 0e 00 00 mvi r14,0 800b4e4: 34 04 00 01 mvi r4,1 retval = 0; break; } } if (!last) *p = '/'; 800b4e8: 34 10 00 2f mvi r16,47 first = 0; } if (last) (void)umask(oumask); if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) { if (errno == EEXIST || errno == EISDIR) { 800b4ec: 34 13 00 11 mvi r19,17 if (stat(path, &sb) < 0) { 800b4f0: 37 94 00 38 addi r20,sp,56 retval = 0; break; } else if (!S_ISDIR(sb.st_mode)) { 800b4f4: 34 15 40 00 mvi r21,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) { 800b4f8: 34 16 00 15 mvi r22,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); 800b4fc: 34 12 ff 3f mvi r18,-193 if (p[0] == '/') /* Skip leading '/'. */ ++p; for (first = 1, last = 0; !last ; ++p) { if (p[0] == '\0') last = 1; else if (p[0] != '/') 800b500: 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') 800b504: 44 60 00 05 be r3,r0,800b518 <== NEVER TAKEN last = 1; else if (p[0] != '/') 800b508: 44 6f 00 3e be r3,r15,800b600 p = path; oumask = 0; retval = 1; if (p[0] == '/') /* Skip leading '/'. */ ++p; for (first = 1, last = 0; !last ; ++p) { 800b50c: 35 6b 00 01 addi r11,r11,1 800b510: 41 63 00 00 lbu r3,(r11+0) if (p[0] == '\0') 800b514: 5c 60 ff fd bne r3,r0,800b508 last = 1; else if (p[0] != '/') continue; *p = '\0'; 800b518: 31 60 00 00 sb (r11+0),r0 800b51c: 34 0c 00 01 mvi r12,1 if (!last && p[1] == '\0') last = 1; if (first) { 800b520: 5c 80 00 32 bne r4,r0,800b5e8 (void)umask(numask); first = 0; } if (last) (void)umask(oumask); if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) { 800b524: 34 02 01 ff mvi r2,511 oumask = umask(0); numask = oumask & ~(S_IWUSR | S_IXUSR); (void)umask(numask); first = 0; } if (last) 800b528: 5d 80 00 2c bne r12,r0,800b5d8 (void)umask(oumask); if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) { 800b52c: b9 a0 08 00 mv r1,r13 800b530: fb ff df 6f calli 80032ec 800b534: 4c 20 00 11 bge r1,r0,800b578 if (errno == EEXIST || errno == EISDIR) { 800b538: f8 00 0e 5a calli 800eea0 <__errno> 800b53c: 28 21 00 00 lw r1,(r1+0) 800b540: 44 33 00 04 be r1,r19,800b550 800b544: f8 00 0e 57 calli 800eea0 <__errno> 800b548: 28 21 00 00 lw r1,(r1+0) 800b54c: 5c 36 00 45 bne r1,r22,800b660 <== ALWAYS TAKEN if (stat(path, &sb) < 0) { 800b550: b9 a0 08 00 mv r1,r13 800b554: ba 80 10 00 mv r2,r20 800b558: f8 00 00 44 calli 800b668 800b55c: 48 01 00 41 bg r0,r1,800b660 <== NEVER TAKEN retval = 0; break; } else if (!S_ISDIR(sb.st_mode)) { 800b560: 2b 81 00 44 lw r1,(sp+68) 800b564: 20 21 f0 00 andi r1,r1,0xf000 800b568: 5c 35 00 2d bne r1,r21,800b61c else errno = ENOTDIR; retval = 0; break; } if (last) 800b56c: 45 80 00 18 be r12,r0,800b5cc retval = 2; 800b570: 34 0b 00 02 mvi r11,2 800b574: e0 00 00 03 bi 800b580 } else { retval = 0; break; } } if (!last) 800b578: 45 80 00 15 be r12,r0,800b5cc 800b57c: 34 0b 00 01 mvi r11,1 int success = 0; char *dup_path = strdup(path); if (dup_path != NULL) { success = build(dup_path, mode); free(dup_path); 800b580: b9 a0 08 00 mv r1,r13 800b584: fb ff dd 2c calli 8002a34 } return success != 0 ? 0 : -1; 800b588: 34 01 00 00 mvi r1,0 800b58c: 45 60 00 33 be r11,r0,800b658 <== NEVER TAKEN } 800b590: 2b 9d 00 04 lw ra,(sp+4) 800b594: 2b 8b 00 34 lw r11,(sp+52) 800b598: 2b 8c 00 30 lw r12,(sp+48) 800b59c: 2b 8d 00 2c lw r13,(sp+44) 800b5a0: 2b 8e 00 28 lw r14,(sp+40) 800b5a4: 2b 8f 00 24 lw r15,(sp+36) 800b5a8: 2b 90 00 20 lw r16,(sp+32) 800b5ac: 2b 91 00 1c lw r17,(sp+28) 800b5b0: 2b 92 00 18 lw r18,(sp+24) 800b5b4: 2b 93 00 14 lw r19,(sp+20) 800b5b8: 2b 94 00 10 lw r20,(sp+16) 800b5bc: 2b 95 00 0c lw r21,(sp+12) 800b5c0: 2b 96 00 08 lw r22,(sp+8) 800b5c4: 37 9c 00 7c addi sp,sp,124 800b5c8: c3 a0 00 00 ret retval = 0; break; } } if (!last) *p = '/'; 800b5cc: 31 70 00 00 sb (r11+0),r16 800b5d0: 34 04 00 00 mvi r4,0 800b5d4: e3 ff ff ce bi 800b50c numask = oumask & ~(S_IWUSR | S_IXUSR); (void)umask(numask); first = 0; } if (last) (void)umask(oumask); 800b5d8: b9 c0 08 00 mv r1,r14 800b5dc: f8 00 00 5b calli 800b748 if (mkdir(path, last ? omode : S_IRWXU | S_IRWXG | S_IRWXO) < 0) { 800b5e0: ba 20 10 00 mv r2,r17 800b5e4: e3 ff ff d2 bi 800b52c * mkdir [-m mode] dir * * We change the user's umask and then restore it, * instead of doing chmod's. */ oumask = umask(0); 800b5e8: 34 01 00 00 mvi r1,0 800b5ec: f8 00 00 57 calli 800b748 800b5f0: b8 20 70 00 mv r14,r1 numask = oumask & ~(S_IWUSR | S_IXUSR); (void)umask(numask); 800b5f4: a0 32 08 00 and r1,r1,r18 800b5f8: f8 00 00 54 calli 800b748 800b5fc: e3 ff ff ca bi 800b524 if (p[0] == '\0') last = 1; else if (p[0] != '/') continue; *p = '\0'; if (!last && p[1] == '\0') 800b600: 41 6c 00 01 lbu r12,(r11+1) for (first = 1, last = 0; !last ; ++p) { if (p[0] == '\0') last = 1; else if (p[0] != '/') continue; *p = '\0'; 800b604: 31 60 00 00 sb (r11+0),r0 if (!last && p[1] == '\0') 800b608: 65 8c 00 00 cmpei r12,r12,0 800b60c: e3 ff ff c5 bi 800b520 p = path; oumask = 0; retval = 1; if (p[0] == '/') /* Skip leading '/'. */ ++p; 800b610: 41 a3 00 01 lbu r3,(r13+1) 800b614: 35 ab 00 01 addi r11,r13,1 800b618: e3 ff ff b2 bi 800b4e0 if (errno == EEXIST || errno == EISDIR) { if (stat(path, &sb) < 0) { retval = 0; break; } else if (!S_ISDIR(sb.st_mode)) { if (last) 800b61c: 45 80 00 08 be r12,r0,800b63c errno = EEXIST; 800b620: f8 00 0e 20 calli 800eea0 <__errno> 800b624: 34 02 00 11 mvi r2,17 800b628: 58 22 00 00 sw (r1+0),r2 int success = 0; char *dup_path = strdup(path); if (dup_path != NULL) { success = build(dup_path, mode); free(dup_path); 800b62c: b9 a0 08 00 mv r1,r13 800b630: fb ff dd 01 calli 8002a34 } return success != 0 ? 0 : -1; 800b634: 34 01 ff ff mvi r1,-1 800b638: e3 ff ff d6 bi 800b590 break; } else if (!S_ISDIR(sb.st_mode)) { if (last) errno = EEXIST; else errno = ENOTDIR; 800b63c: f8 00 0e 19 calli 800eea0 <__errno> 800b640: 34 02 00 14 mvi r2,20 800b644: 58 22 00 00 sw (r1+0),r2 } if (!last) *p = '/'; } if (!first && !last) (void)umask(oumask); 800b648: b9 c0 08 00 mv r1,r14 800b64c: f8 00 00 3f calli 800b748 int success = 0; char *dup_path = strdup(path); if (dup_path != NULL) { success = build(dup_path, mode); free(dup_path); 800b650: b9 a0 08 00 mv r1,r13 800b654: fb ff dc f8 calli 8002a34 } return success != 0 ? 0 : -1; 800b658: 34 01 ff ff mvi r1,-1 800b65c: e3 ff ff cd bi 800b590 } } if (!last) *p = '/'; } if (!first && !last) 800b660: 45 80 ff fa be r12,r0,800b648 <== NEVER TAKEN 800b664: e3 ff ff fb bi 800b650 =============================================================================== 08004de4 : rtems_status_code rtems_object_get_class_information( int the_api, int the_class, rtems_object_api_class_information *info ) { 8004de4: 37 9c ff f8 addi sp,sp,-8 8004de8: 5b 8b 00 08 sw (sp+8),r11 8004dec: 5b 9d 00 04 sw (sp+4),ra 8004df0: b8 60 58 00 mv r11,r3 /* * Validate parameters and look up information structure. */ if ( !info ) return RTEMS_INVALID_ADDRESS; 8004df4: 34 03 00 09 mvi r3,9 int i; /* * Validate parameters and look up information structure. */ if ( !info ) 8004df8: 45 60 00 1e be r11,r0,8004e70 return RTEMS_INVALID_ADDRESS; obj_info = _Objects_Get_information( the_api, the_class ); 8004dfc: 20 42 ff ff andi r2,r2,0xffff 8004e00: f8 00 07 c3 calli 8006d0c <_Objects_Get_information> 8004e04: b8 20 10 00 mv r2,r1 if ( !obj_info ) return RTEMS_INVALID_NUMBER; 8004e08: 34 03 00 0a mvi r3,10 */ if ( !info ) return RTEMS_INVALID_ADDRESS; obj_info = _Objects_Get_information( the_api, the_class ); if ( !obj_info ) 8004e0c: 44 20 00 19 be r1,r0,8004e70 return RTEMS_INVALID_NUMBER; /* * Return information about this object class to the user. */ info->minimum_id = obj_info->minimum_id; 8004e10: 28 24 00 08 lw r4,(r1+8) info->maximum_id = obj_info->maximum_id; 8004e14: 28 23 00 0c lw r3,(r1+12) info->auto_extend = obj_info->auto_extend; info->maximum = obj_info->maximum; 8004e18: 2c 46 00 10 lhu r6,(r2+16) /* * Return information about this object class to the user. */ info->minimum_id = obj_info->minimum_id; info->maximum_id = obj_info->maximum_id; info->auto_extend = obj_info->auto_extend; 8004e1c: 40 21 00 12 lbu r1,(r1+18) return RTEMS_INVALID_NUMBER; /* * Return information about this object class to the user. */ info->minimum_id = obj_info->minimum_id; 8004e20: 59 64 00 00 sw (r11+0),r4 info->maximum_id = obj_info->maximum_id; 8004e24: 59 63 00 04 sw (r11+4),r3 info->auto_extend = obj_info->auto_extend; 8004e28: 31 61 00 0c sb (r11+12),r1 info->maximum = obj_info->maximum; 8004e2c: 59 66 00 08 sw (r11+8),r6 for ( unallocated=0, i=1 ; i <= info->maximum ; i++ ) 8004e30: 34 04 00 00 mvi r4,0 8004e34: 44 c0 00 0d be r6,r0,8004e68 <== NEVER TAKEN 8004e38: 28 43 00 1c lw r3,(r2+28) 8004e3c: 34 01 00 01 mvi r1,1 8004e40: 34 02 00 01 mvi r2,1 if ( !obj_info->local_table[i] ) 8004e44: b4 21 08 00 add r1,r1,r1 8004e48: b4 21 08 00 add r1,r1,r1 8004e4c: b4 61 08 00 add r1,r3,r1 8004e50: 28 25 00 00 lw r5,(r1+0) info->minimum_id = obj_info->minimum_id; info->maximum_id = obj_info->maximum_id; info->auto_extend = obj_info->auto_extend; info->maximum = obj_info->maximum; for ( unallocated=0, i=1 ; i <= info->maximum ; i++ ) 8004e54: 34 42 00 01 addi r2,r2,1 8004e58: b8 40 08 00 mv r1,r2 if ( !obj_info->local_table[i] ) unallocated++; 8004e5c: 64 a5 00 00 cmpei r5,r5,0 8004e60: b4 85 20 00 add r4,r4,r5 info->minimum_id = obj_info->minimum_id; info->maximum_id = obj_info->maximum_id; info->auto_extend = obj_info->auto_extend; info->maximum = obj_info->maximum; for ( unallocated=0, i=1 ; i <= info->maximum ; i++ ) 8004e64: 50 c2 ff f8 bgeu r6,r2,8004e44 if ( !obj_info->local_table[i] ) unallocated++; info->unallocated = unallocated; 8004e68: 59 64 00 10 sw (r11+16),r4 return RTEMS_SUCCESSFUL; 8004e6c: 34 03 00 00 mvi r3,0 } 8004e70: b8 60 08 00 mv r1,r3 8004e74: 2b 9d 00 04 lw ra,(sp+4) 8004e78: 2b 8b 00 08 lw r11,(sp+8) 8004e7c: 37 9c 00 08 addi sp,sp,8 8004e80: c3 a0 00 00 ret =============================================================================== 080113c0 : uint32_t length, uint32_t buffer_size, rtems_attribute attribute_set, rtems_id *id ) { 80113c0: 37 9c ff d8 addi sp,sp,-40 80113c4: 5b 8b 00 18 sw (sp+24),r11 80113c8: 5b 8c 00 14 sw (sp+20),r12 80113cc: 5b 8d 00 10 sw (sp+16),r13 80113d0: 5b 8e 00 0c sw (sp+12),r14 80113d4: 5b 8f 00 08 sw (sp+8),r15 80113d8: 5b 9d 00 04 sw (sp+4),ra register Partition_Control *the_partition; if ( !rtems_is_name_valid( name ) ) return RTEMS_INVALID_NAME; 80113dc: 34 07 00 03 mvi r7,3 uint32_t length, uint32_t buffer_size, rtems_attribute attribute_set, rtems_id *id ) { 80113e0: b8 20 60 00 mv r12,r1 80113e4: b8 40 58 00 mv r11,r2 register Partition_Control *the_partition; if ( !rtems_is_name_valid( name ) ) 80113e8: 44 20 00 3e be r1,r0,80114e0 return RTEMS_INVALID_NAME; if ( !starting_address ) return RTEMS_INVALID_ADDRESS; 80113ec: 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 ) 80113f0: 44 40 00 3c be r2,r0,80114e0 return RTEMS_INVALID_ADDRESS; if ( !id ) 80113f4: 44 c0 00 3b be r6,r0,80114e0 <== NEVER TAKEN return RTEMS_INVALID_ADDRESS; if ( length == 0 || buffer_size == 0 || length < buffer_size || 80113f8: 64 82 00 00 cmpei r2,r4,0 80113fc: 64 61 00 00 cmpei r1,r3,0 !_Partition_Is_buffer_size_aligned( buffer_size ) ) return RTEMS_INVALID_SIZE; 8011400: 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 || 8011404: b8 41 08 00 or r1,r2,r1 8011408: 5c 20 00 36 bne r1,r0,80114e0 801140c: 54 83 00 35 bgu r4,r3,80114e0 */ RTEMS_INLINE_ROUTINE bool _Partition_Is_buffer_size_aligned ( uint32_t buffer_size ) { return ((buffer_size % CPU_PARTITION_ALIGNMENT) == 0); 8011410: 20 81 00 07 andi r1,r4,0x7 8011414: 5c 20 00 33 bne r1,r0,80114e0 ) { #if (CPU_ALIGNMENT == 0) return true; #else return (((uintptr_t)address % CPU_ALIGNMENT) == 0); 8011418: 21 6f 00 07 andi r15,r11,0x7 !_Partition_Is_buffer_size_aligned( buffer_size ) ) return RTEMS_INVALID_SIZE; if ( !_Addresses_Is_aligned( starting_address ) ) return RTEMS_INVALID_ADDRESS; 801141c: 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 ) ) 8011420: 5d e1 00 30 bne r15,r1,80114e0 8011424: 78 01 08 04 mvhi r1,0x804 8011428: 38 21 0c e0 ori r1,r1,0xce0 801142c: 28 22 00 00 lw r2,(r1+0) 8011430: 34 42 00 01 addi r2,r2,1 8011434: 58 22 00 00 sw (r1+0),r2 * 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 ); 8011438: 78 0e 08 04 mvhi r14,0x804 801143c: 39 ce 0b 38 ori r14,r14,0xb38 8011440: b9 c0 08 00 mv r1,r14 8011444: 5b 83 00 28 sw (sp+40),r3 8011448: 5b 84 00 20 sw (sp+32),r4 801144c: 5b 85 00 24 sw (sp+36),r5 8011450: 5b 86 00 1c sw (sp+28),r6 8011454: f8 00 16 f1 calli 8017018 <_Objects_Allocate> 8011458: b8 20 68 00 mv r13,r1 _Thread_Disable_dispatch(); /* prevents deletion */ the_partition = _Partition_Allocate(); if ( !the_partition ) { 801145c: 2b 83 00 28 lw r3,(sp+40) 8011460: 2b 84 00 20 lw r4,(sp+32) 8011464: 2b 85 00 24 lw r5,(sp+36) 8011468: 2b 86 00 1c lw r6,(sp+28) 801146c: 44 2f 00 26 be r1,r15,8011504 #endif the_partition->starting_address = starting_address; the_partition->length = length; the_partition->buffer_size = buffer_size; the_partition->attribute_set = attribute_set; 8011470: 58 25 00 1c sw (r1+28),r5 return RTEMS_TOO_MANY; } #endif the_partition->starting_address = starting_address; the_partition->length = length; 8011474: 58 23 00 14 sw (r1+20),r3 the_partition->buffer_size = buffer_size; 8011478: 58 24 00 18 sw (r1+24),r4 _Thread_Enable_dispatch(); return RTEMS_TOO_MANY; } #endif the_partition->starting_address = starting_address; 801147c: 58 2b 00 10 sw (r1+16),r11 the_partition->length = length; the_partition->buffer_size = buffer_size; the_partition->attribute_set = attribute_set; the_partition->number_of_used_blocks = 0; 8011480: 58 20 00 20 sw (r1+32),r0 _Chain_Initialize( &the_partition->Memory, starting_address, length / buffer_size, buffer_size ); 8011484: b8 80 10 00 mv r2,r4 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, 8011488: 34 2f 00 24 addi r15,r1,36 length / buffer_size, buffer_size ); 801148c: b8 60 08 00 mv r1,r3 8011490: 5b 86 00 1c sw (sp+28),r6 8011494: 5b 84 00 20 sw (sp+32),r4 8011498: f8 00 81 a9 calli 8031b3c <__udivsi3> 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, 801149c: 2b 84 00 20 lw r4,(sp+32) length / buffer_size, buffer_size ); 80114a0: 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, 80114a4: b9 60 10 00 mv r2,r11 80114a8: b9 e0 08 00 mv r1,r15 80114ac: f8 00 0f 9c calli 801531c <_Chain_Initialize> Objects_Name name ) { _Objects_Set_local_object( information, _Objects_Get_index( the_object->id ), 80114b0: 29 a2 00 08 lw r2,(r13+8) #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 80114b4: 29 c3 00 1c lw r3,(r14+28) Objects_Information *information, Objects_Control *the_object, Objects_Name name ) { _Objects_Set_local_object( 80114b8: 20 41 ff ff andi r1,r2,0xffff #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 80114bc: b4 21 08 00 add r1,r1,r1 80114c0: b4 21 08 00 add r1,r1,r1 80114c4: b4 61 08 00 add r1,r3,r1 80114c8: 58 2d 00 00 sw (r1+0),r13 information, _Objects_Get_index( the_object->id ), the_object ); the_object->name = name; 80114cc: 59 ac 00 0c sw (r13+12),r12 &_Partition_Information, &the_partition->Object, (Objects_Name) name ); *id = the_partition->Object.id; 80114d0: 2b 86 00 1c lw r6,(sp+28) 80114d4: 58 c2 00 00 sw (r6+0),r2 name, 0 /* Not used */ ); #endif _Thread_Enable_dispatch(); 80114d8: f8 00 1c 41 calli 80185dc <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 80114dc: 34 07 00 00 mvi r7,0 } 80114e0: b8 e0 08 00 mv r1,r7 80114e4: 2b 9d 00 04 lw ra,(sp+4) 80114e8: 2b 8b 00 18 lw r11,(sp+24) 80114ec: 2b 8c 00 14 lw r12,(sp+20) 80114f0: 2b 8d 00 10 lw r13,(sp+16) 80114f4: 2b 8e 00 0c lw r14,(sp+12) 80114f8: 2b 8f 00 08 lw r15,(sp+8) 80114fc: 37 9c 00 28 addi sp,sp,40 8011500: c3 a0 00 00 ret _Thread_Disable_dispatch(); /* prevents deletion */ the_partition = _Partition_Allocate(); if ( !the_partition ) { _Thread_Enable_dispatch(); 8011504: f8 00 1c 36 calli 80185dc <_Thread_Enable_dispatch> return RTEMS_TOO_MANY; 8011508: 34 07 00 05 mvi r7,5 801150c: e3 ff ff f5 bi 80114e0 =============================================================================== 08000900 : void rtems_print_buffer( const unsigned char *buffer, int length ) { 8000900: 37 9c ff 50 addi sp,sp,-176 8000904: 5b 8b 00 38 sw (sp+56),r11 8000908: 5b 8c 00 34 sw (sp+52),r12 800090c: 5b 8d 00 30 sw (sp+48),r13 8000910: 5b 8e 00 2c sw (sp+44),r14 8000914: 5b 8f 00 28 sw (sp+40),r15 8000918: 5b 90 00 24 sw (sp+36),r16 800091c: 5b 91 00 20 sw (sp+32),r17 8000920: 5b 92 00 1c sw (sp+28),r18 8000924: 5b 93 00 18 sw (sp+24),r19 8000928: 5b 94 00 14 sw (sp+20),r20 800092c: 5b 95 00 10 sw (sp+16),r21 8000930: 5b 96 00 0c sw (sp+12),r22 8000934: 5b 97 00 08 sw (sp+8),r23 8000938: 5b 9d 00 04 sw (sp+4),ra 800093c: b8 40 a8 00 mv r21,r2 8000940: b8 20 b0 00 mv r22,r1 int i, mod, max; if ( !length ) return; 8000944: 44 40 00 41 be r2,r0,8000a48 mod = length % 16; 8000948: b8 40 08 00 mv r1,r2 800094c: 34 02 00 1f mvi r2,31 8000950: f8 00 6c 60 calli 801bad0 <__ashrsi3> 8000954: 9a a1 98 00 xor r19,r21,r1 8000958: ca 61 98 00 sub r19,r19,r1 800095c: 22 73 00 0f andi r19,r19,0xf 8000960: 9a 61 98 00 xor r19,r19,r1 8000964: ca 61 98 00 sub r19,r19,r1 max = length - mod; 8000968: ca b3 a8 00 sub r21,r21,r19 for ( i=0 ; i 8000970: 78 0f 08 01 mvhi r15,0x801 8000974: 78 0d 08 01 mvhi r13,0x801 8000978: 78 0e 08 01 mvhi r14,0x801 800097c: 34 12 00 00 mvi r18,0 8000980: 37 8b 00 3c addi r11,sp,60 8000984: 39 ef cd 90 ori r15,r15,0xcd90 8000988: 39 ad e1 e4 ori r13,r13,0xe1e4 800098c: 39 ce cd 98 ori r14,r14,0xcd98 int i; char line_buffer[120]; line_buffer[0] = '\0'; for( i=0 ; i int i; char line_buffer[120]; line_buffer[0] = '\0'; for( i=0 ; i sprintf( line_buffer, "%s%02x ", line_buffer, buffer[ i ] ); for( ; i<16 ; i++ ) strcat( line_buffer, " " ); strcat( line_buffer, "|" ); 80009c8: b9 60 08 00 mv r1,r11 80009cc: f8 00 35 ff calli 800e1c8 80009d0: b5 61 10 00 add r2,r11,r1 80009d4: 30 54 00 00 sb (r2+0),r20 80009d8: 30 40 00 01 sb (r2+1),r0 for( i=0 ; i 8000a10: b8 a0 20 00 mv r4,r5 8000a14: f8 00 34 c2 calli 800dd1c for( ; i<16 ; i++ ) strcat( line_buffer, " " ); strcat( line_buffer, "|" ); for( i=0 ; i isprint( buffer[ i ] ) ? buffer[ i ] : '.' ); for( ; i<16 ; i++ ) strcat( line_buffer, " " ); strcat( line_buffer, "|\n" ); 8000a1c: b9 60 08 00 mv r1,r11 8000a20: f8 00 35 ea calli 800e1c8 8000a24: b5 61 10 00 add r2,r11,r1 mod = length % 16; max = length - mod; for ( i=0 ; i mod = length % 16; max = length - mod; for ( i=0 ; i Dump_Line( &buffer[ i ], 16 ); if ( mod ) 8000a44: 5e 60 00 11 bne r19,r0,8000a88 Dump_Line( &buffer[ max ], mod ); } 8000a48: 2b 9d 00 04 lw ra,(sp+4) 8000a4c: 2b 8b 00 38 lw r11,(sp+56) 8000a50: 2b 8c 00 34 lw r12,(sp+52) 8000a54: 2b 8d 00 30 lw r13,(sp+48) 8000a58: 2b 8e 00 2c lw r14,(sp+44) 8000a5c: 2b 8f 00 28 lw r15,(sp+40) 8000a60: 2b 90 00 24 lw r16,(sp+36) 8000a64: 2b 91 00 20 lw r17,(sp+32) 8000a68: 2b 92 00 1c lw r18,(sp+28) 8000a6c: 2b 93 00 18 lw r19,(sp+24) 8000a70: 2b 94 00 14 lw r20,(sp+20) 8000a74: 2b 95 00 10 lw r21,(sp+16) 8000a78: 2b 96 00 0c lw r22,(sp+12) 8000a7c: 2b 97 00 08 lw r23,(sp+8) 8000a80: 37 9c 00 b0 addi sp,sp,176 8000a84: c3 a0 00 00 ret { int i; char line_buffer[120]; line_buffer[0] = '\0'; 8000a88: 33 80 00 3c sb (sp+60),r0 for ( i=0 ; i 8000a94: 34 0c 00 00 mvi r12,0 8000a98: 37 8b 00 3c addi r11,sp,60 sprintf( line_buffer, "%s%02x ", line_buffer, buffer[ i ] ); for( ; i<16 ; i++ ) strcat( line_buffer, " " ); 8000a9c: 34 0d 00 20 mvi r13,32 line_buffer[0] = '\0'; for( i=0 ; i 8000aac: b5 61 08 00 add r1,r11,r1 8000ab0: 30 2d 00 00 sb (r1+0),r13 8000ab4: 30 2d 00 01 sb (r1+1),r13 8000ab8: 30 2d 00 02 sb (r1+2),r13 8000abc: 30 20 00 03 sb (r1+3),r0 line_buffer[0] = '\0'; for( i=0 ; i strcat( line_buffer, " " ); strcat( line_buffer, "|" ); 8000ac8: b9 60 08 00 mv r1,r11 8000acc: f8 00 35 bf calli 800e1c8 8000ad0: b5 61 08 00 add r1,r11,r1 8000ad4: 34 02 00 7c mvi r2,124 8000ad8: 30 22 00 00 sb (r1+0),r2 8000adc: 30 20 00 01 sb (r1+1),r0 for( i=0 ; i 8000ae4: 34 13 00 00 mvi r19,0 sprintf( line_buffer, "%s%c", line_buffer, isprint( buffer[ i ] ) ? buffer[ i ] : '.' ); for( ; i<16 ; i++ ) strcat( line_buffer, " " ); 8000ae8: 34 0d 00 20 mvi r13,32 strcat( line_buffer, "|" ); for( i=0 ; i 8000af8: b5 61 08 00 add r1,r11,r1 8000afc: 30 2d 00 00 sb (r1+0),r13 8000b00: 30 20 00 01 sb (r1+1),r0 strcat( line_buffer, "|" ); for( i=0 ; i strcat( line_buffer, " " ); strcat( line_buffer, "|\n" ); 8000b0c: b9 60 08 00 mv r1,r11 8000b10: f8 00 35 ae calli 800e1c8 8000b14: b5 61 08 00 add r1,r11,r1 8000b18: 34 02 00 7c mvi r2,124 8000b1c: 30 22 00 00 sb (r1+0),r2 8000b20: 34 02 00 0a mvi r2,10 8000b24: 30 22 00 01 sb (r1+1),r2 8000b28: 30 20 00 02 sb (r1+2),r0 printk( line_buffer ); 8000b2c: b9 60 08 00 mv r1,r11 8000b30: f8 00 07 47 calli 800284c 8000b34: e3 ff ff c5 bi 8000a48 8000b38: 78 0f 08 01 mvhi r15,0x801 int i; char line_buffer[120]; line_buffer[0] = '\0'; for( i=0 ; i int i; char line_buffer[120]; line_buffer[0] = '\0'; for( i=0 ; i sprintf( line_buffer, "%s%02x ", line_buffer, buffer[ i ] ); for( ; i<16 ; i++ ) 8000b68: 34 01 00 0f mvi r1,15 8000b6c: ba 60 60 00 mv r12,r19 8000b70: 4c 33 ff cb bge r1,r19,8000a9c <== ALWAYS TAKEN strcat( line_buffer, " " ); strcat( line_buffer, "|" ); 8000b74: b9 60 08 00 mv r1,r11 <== NOT EXECUTED 8000b78: f8 00 35 94 calli 800e1c8 <== NOT EXECUTED 8000b7c: b5 61 08 00 add r1,r11,r1 <== NOT EXECUTED 8000b80: 34 02 00 7c mvi r2,124 <== NOT EXECUTED 8000b84: 30 22 00 00 sb (r1+0),r2 <== NOT EXECUTED 8000b88: 30 20 00 01 sb (r1+1),r0 <== NOT EXECUTED 8000b8c: 78 0d 08 01 mvhi r13,0x801 8000b90: 78 0e 08 01 mvhi r14,0x801 for( i=0 ; i 8000bd0: b8 a0 20 00 mv r4,r5 8000bd4: f8 00 34 52 calli 800dd1c for( ; i<16 ; i++ ) strcat( line_buffer, " " ); strcat( line_buffer, "|" ); for( i=0 ; i sprintf( line_buffer, "%s%c", line_buffer, isprint( buffer[ i ] ) ? buffer[ i ] : '.' ); for( ; i<16 ; i++ ) 8000bdc: 34 01 00 0f mvi r1,15 8000be0: 4c 33 ff c2 bge r1,r19,8000ae8 <== ALWAYS TAKEN 8000be4: e3 ff ff ca bi 8000b0c <== NOT EXECUTED =============================================================================== 080042ec : rtems_status_code rtems_rate_monotonic_period( rtems_id id, rtems_interval length ) { 80042ec: 37 9c ff e0 addi sp,sp,-32 80042f0: 5b 8b 00 18 sw (sp+24),r11 80042f4: 5b 8c 00 14 sw (sp+20),r12 80042f8: 5b 8d 00 10 sw (sp+16),r13 80042fc: 5b 8e 00 0c sw (sp+12),r14 8004300: 5b 8f 00 08 sw (sp+8),r15 8004304: 5b 9d 00 04 sw (sp+4),ra Objects_Id id, Objects_Locations *location ) { return (Rate_monotonic_Control *) _Objects_Get( &_Rate_monotonic_Information, id, location ); 8004308: 78 03 08 02 mvhi r3,0x802 800430c: b8 20 68 00 mv r13,r1 8004310: b8 60 08 00 mv r1,r3 8004314: b8 40 70 00 mv r14,r2 8004318: 38 21 18 d0 ori r1,r1,0x18d0 800431c: b9 a0 10 00 mv r2,r13 8004320: 37 83 00 20 addi r3,sp,32 8004324: f8 00 0a 8a calli 8006d4c <_Objects_Get> 8004328: 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 ) { 800432c: 2b 81 00 20 lw r1,(sp+32) 8004330: 44 20 00 0a be r1,r0,8004358 #endif case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 8004334: 34 01 00 04 mvi r1,4 } 8004338: 2b 9d 00 04 lw ra,(sp+4) 800433c: 2b 8b 00 18 lw r11,(sp+24) 8004340: 2b 8c 00 14 lw r12,(sp+20) 8004344: 2b 8d 00 10 lw r13,(sp+16) 8004348: 2b 8e 00 0c lw r14,(sp+12) 800434c: 2b 8f 00 08 lw r15,(sp+8) 8004350: 37 9c 00 20 addi sp,sp,32 8004354: c3 a0 00 00 ret RTEMS_INLINE_ROUTINE bool _Thread_Is_executing ( const Thread_Control *the_thread ) { return ( the_thread == _Thread_Executing ); 8004358: 78 0c 08 02 mvhi r12,0x802 800435c: 39 8c 1e c4 ori r12,r12,0x1ec4 the_period = _Rate_monotonic_Get( id, &location ); switch ( location ) { case OBJECTS_LOCAL: if ( !_Thread_Is_executing( the_period->owner ) ) { 8004360: 29 62 00 40 lw r2,(r11+64) 8004364: 29 81 00 0c lw r1,(r12+12) 8004368: 44 41 00 0b be r2,r1,8004394 _Thread_Enable_dispatch(); 800436c: f8 00 0d f2 calli 8007b34 <_Thread_Enable_dispatch> return RTEMS_NOT_OWNER_OF_RESOURCE; 8004370: 34 01 00 17 mvi r1,23 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 8004374: 2b 9d 00 04 lw ra,(sp+4) 8004378: 2b 8b 00 18 lw r11,(sp+24) 800437c: 2b 8c 00 14 lw r12,(sp+20) 8004380: 2b 8d 00 10 lw r13,(sp+16) 8004384: 2b 8e 00 0c lw r14,(sp+12) 8004388: 2b 8f 00 08 lw r15,(sp+8) 800438c: 37 9c 00 20 addi sp,sp,32 8004390: c3 a0 00 00 ret if ( !_Thread_Is_executing( the_period->owner ) ) { _Thread_Enable_dispatch(); return RTEMS_NOT_OWNER_OF_RESOURCE; } if ( length == RTEMS_PERIOD_STATUS ) { 8004394: 5d c0 00 0f bne r14,r0,80043d0 switch ( the_period->state ) { 8004398: 29 62 00 38 lw r2,(r11+56) 800439c: 34 03 00 04 mvi r3,4 80043a0: 34 01 00 00 mvi r1,0 80043a4: 54 43 00 07 bgu r2,r3,80043c0 <== NEVER TAKEN 80043a8: 78 01 08 01 mvhi r1,0x801 80043ac: b4 42 10 00 add r2,r2,r2 80043b0: 38 21 f4 f0 ori r1,r1,0xf4f0 80043b4: b4 42 10 00 add r2,r2,r2 80043b8: b4 22 10 00 add r2,r1,r2 80043bc: 28 41 00 00 lw r1,(r2+0) ); the_period->next_length = length; _Watchdog_Insert_ticks( &the_period->Timer, length ); _Thread_Enable_dispatch(); 80043c0: 5b 81 00 1c sw (sp+28),r1 80043c4: f8 00 0d dc calli 8007b34 <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 80043c8: 2b 81 00 1c lw r1,(sp+28) 80043cc: e3 ff ff db bi 8004338 } _Thread_Enable_dispatch(); return( return_value ); } _ISR_Disable( level ); 80043d0: 90 00 78 00 rcsr r15,IE 80043d4: 34 01 ff fe mvi r1,-2 80043d8: a1 e1 08 00 and r1,r15,r1 80043dc: d0 01 00 00 wcsr IE,r1 if ( the_period->state == RATE_MONOTONIC_INACTIVE ) { 80043e0: 29 62 00 38 lw r2,(r11+56) 80043e4: 44 40 00 15 be r2,r0,8004438 _Watchdog_Insert_ticks( &the_period->Timer, length ); _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } if ( the_period->state == RATE_MONOTONIC_ACTIVE ) { 80043e8: 34 01 00 02 mvi r1,2 80043ec: 44 41 00 26 be r2,r1,8004484 #endif case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 80043f0: 34 01 00 04 mvi r1,4 _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } if ( the_period->state == RATE_MONOTONIC_EXPIRED ) { 80043f4: 5c 41 ff d1 bne r2,r1,8004338 <== NEVER TAKEN /* * Update statistics from the concluding period */ _Rate_monotonic_Update_statistics( the_period ); 80043f8: b9 60 08 00 mv r1,r11 80043fc: fb ff ff 72 calli 80041c4 <_Rate_monotonic_Update_statistics> _ISR_Enable( level ); 8004400: d0 0f 00 00 wcsr IE,r15 the_period->state = RATE_MONOTONIC_ACTIVE; 8004404: 34 03 00 02 mvi r3,2 ) { the_watchdog->initial = units; _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 8004408: 78 01 08 02 mvhi r1,0x802 800440c: 38 21 1a d8 ori r1,r1,0x1ad8 8004410: 35 62 00 10 addi r2,r11,16 8004414: 59 63 00 38 sw (r11+56),r3 the_period->next_length = length; 8004418: 59 6e 00 3c sw (r11+60),r14 Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 800441c: 59 6e 00 1c sw (r11+28),r14 _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 8004420: f8 00 13 3e calli 8009118 <_Watchdog_Insert> _Watchdog_Insert_ticks( &the_period->Timer, length ); _Thread_Enable_dispatch(); return RTEMS_TIMEOUT; 8004424: 34 01 00 06 mvi r1,6 the_period->state = RATE_MONOTONIC_ACTIVE; the_period->next_length = length; _Watchdog_Insert_ticks( &the_period->Timer, length ); _Thread_Enable_dispatch(); 8004428: 5b 81 00 1c sw (sp+28),r1 800442c: f8 00 0d c2 calli 8007b34 <_Thread_Enable_dispatch> return RTEMS_TIMEOUT; 8004430: 2b 81 00 1c lw r1,(sp+28) 8004434: e3 ff ff c1 bi 8004338 return( return_value ); } _ISR_Disable( level ); if ( the_period->state == RATE_MONOTONIC_INACTIVE ) { _ISR_Enable( level ); 8004438: d0 0f 00 00 wcsr IE,r15 /* * Baseline statistics information for the beginning of a period. */ _Rate_monotonic_Initiate_statistics( the_period ); 800443c: b9 60 08 00 mv r1,r11 8004440: fb ff ff 36 calli 8004118 <_Rate_monotonic_Initiate_statistics> Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; 8004444: 78 03 08 00 mvhi r3,0x800 8004448: 38 63 48 7c ori r3,r3,0x487c the_period->state = RATE_MONOTONIC_ACTIVE; 800444c: 34 04 00 02 mvi r4,2 ) { the_watchdog->initial = units; _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 8004450: 78 01 08 02 mvhi r1,0x802 8004454: 38 21 1a d8 ori r1,r1,0x1ad8 8004458: 35 62 00 10 addi r2,r11,16 800445c: 59 64 00 38 sw (r11+56),r4 Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 8004460: 59 60 00 18 sw (r11+24),r0 the_watchdog->routine = routine; 8004464: 59 63 00 2c sw (r11+44),r3 the_watchdog->id = id; 8004468: 59 6d 00 30 sw (r11+48),r13 the_watchdog->user_data = user_data; 800446c: 59 60 00 34 sw (r11+52),r0 _Rate_monotonic_Timeout, id, NULL ); the_period->next_length = length; 8004470: 59 6e 00 3c sw (r11+60),r14 Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 8004474: 59 6e 00 1c sw (r11+28),r14 _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 8004478: f8 00 13 28 calli 8009118 <_Watchdog_Insert> _Watchdog_Insert_ticks( &the_period->Timer, length ); _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; 800447c: 34 01 00 00 mvi r1,0 8004480: e3 ff ff d0 bi 80043c0 if ( the_period->state == RATE_MONOTONIC_ACTIVE ) { /* * Update statistics from the concluding period. */ _Rate_monotonic_Update_statistics( the_period ); 8004484: b9 60 08 00 mv r1,r11 8004488: fb ff ff 4f calli 80041c4 <_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; 800448c: 34 01 00 01 mvi r1,1 8004490: 59 61 00 38 sw (r11+56),r1 the_period->next_length = length; 8004494: 59 6e 00 3c sw (r11+60),r14 _ISR_Enable( level ); 8004498: d0 0f 00 00 wcsr IE,r15 _Thread_Executing->Wait.id = the_period->Object.id; 800449c: 29 83 00 0c lw r3,(r12+12) 80044a0: 29 64 00 08 lw r4,(r11+8) _Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); 80044a4: 34 02 40 00 mvi r2,16384 80044a8: b8 60 08 00 mv r1,r3 the_period->state = RATE_MONOTONIC_OWNER_IS_BLOCKING; the_period->next_length = length; _ISR_Enable( level ); _Thread_Executing->Wait.id = the_period->Object.id; 80044ac: 58 64 00 20 sw (r3+32),r4 _Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); 80044b0: f8 00 10 3b calli 800859c <_Thread_Set_state> /* * Did the watchdog timer expire while we were actually blocking * on it? */ _ISR_Disable( level ); 80044b4: 90 00 08 00 rcsr r1,IE 80044b8: 34 02 ff fe mvi r2,-2 80044bc: a0 22 10 00 and r2,r1,r2 80044c0: d0 02 00 00 wcsr IE,r2 local_state = the_period->state; the_period->state = RATE_MONOTONIC_ACTIVE; 80044c4: 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; 80044c8: 29 62 00 38 lw r2,(r11+56) the_period->state = RATE_MONOTONIC_ACTIVE; 80044cc: 59 63 00 38 sw (r11+56),r3 _ISR_Enable( level ); 80044d0: 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 ) 80044d4: 34 01 00 03 mvi r1,3 80044d8: 44 41 00 04 be r2,r1,80044e8 _Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); _Thread_Enable_dispatch(); 80044dc: f8 00 0d 96 calli 8007b34 <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 80044e0: 34 01 00 00 mvi r1,0 80044e4: e3 ff ff 95 bi 8004338 /* * If it did, then we want to unblock ourself and continue as * if nothing happen. The period was reset in the timeout routine. */ if ( local_state == RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING ) _Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); 80044e8: 29 81 00 0c lw r1,(r12+12) 80044ec: 34 02 40 00 mvi r2,16384 80044f0: f8 00 0c b6 calli 80077c8 <_Thread_Clear_state> 80044f4: e3 ff ff fa bi 80044dc =============================================================================== 080044f8 : */ void rtems_rate_monotonic_report_statistics_with_plugin( void *context, rtems_printk_plugin_t print ) { 80044f8: 37 9c ff 5c addi sp,sp,-164 80044fc: 5b 8b 00 44 sw (sp+68),r11 8004500: 5b 8c 00 40 sw (sp+64),r12 8004504: 5b 8d 00 3c sw (sp+60),r13 8004508: 5b 8e 00 38 sw (sp+56),r14 800450c: 5b 8f 00 34 sw (sp+52),r15 8004510: 5b 90 00 30 sw (sp+48),r16 8004514: 5b 91 00 2c sw (sp+44),r17 8004518: 5b 92 00 28 sw (sp+40),r18 800451c: 5b 93 00 24 sw (sp+36),r19 8004520: 5b 94 00 20 sw (sp+32),r20 8004524: 5b 95 00 1c sw (sp+28),r21 8004528: 5b 96 00 18 sw (sp+24),r22 800452c: 5b 97 00 14 sw (sp+20),r23 8004530: 5b 98 00 10 sw (sp+16),r24 8004534: 5b 99 00 0c sw (sp+12),r25 8004538: 5b 9b 00 08 sw (sp+8),fp 800453c: 5b 9d 00 04 sw (sp+4),ra 8004540: b8 40 68 00 mv r13,r2 8004544: b8 20 78 00 mv r15,r1 rtems_id id; rtems_rate_monotonic_period_statistics the_stats; rtems_rate_monotonic_period_status the_status; char name[5]; if ( !print ) 8004548: 44 40 00 2f be r2,r0,8004604 <== NEVER TAKEN return; (*print)( context, "Period information by period\n" ); 800454c: 78 02 08 01 mvhi r2,0x801 8004550: 38 42 f5 04 ori r2,r2,0xf504 8004554: d9 a0 00 00 call r13 #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ (*print)( context, "--- CPU times are in seconds ---\n" ); 8004558: 78 02 08 01 mvhi r2,0x801 800455c: 38 42 f5 24 ori r2,r2,0xf524 8004560: b9 e0 08 00 mv r1,r15 8004564: d9 a0 00 00 call r13 (*print)( context, "--- Wall times are in seconds ---\n" ); 8004568: 78 02 08 01 mvhi r2,0x801 800456c: 38 42 f5 48 ori r2,r2,0xf548 8004570: b9 e0 08 00 mv r1,r15 8004574: d9 a0 00 00 call r13 Be sure to test the various cases. (*print)( context,"\ 1234567890123456789012345678901234567890123456789012345678901234567890123456789\ \n"); */ (*print)( context, " ID OWNER COUNT MISSED " 8004578: 78 02 08 01 mvhi r2,0x801 800457c: 38 42 f5 6c ori r2,r2,0xf56c 8004580: b9 e0 08 00 mv r1,r15 8004584: d9 a0 00 00 call r13 #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ " " #endif " WALL TIME\n" ); (*print)( context, " " 8004588: 78 02 08 01 mvhi r2,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 ; 800458c: 78 0c 08 02 mvhi r12,0x802 #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ " " #endif " WALL TIME\n" ); (*print)( context, " " 8004590: b9 e0 08 00 mv r1,r15 8004594: 38 42 f5 b8 ori r2,r2,0xf5b8 /* * 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 ; 8004598: 39 8c 18 d0 ori r12,r12,0x18d0 #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ " " #endif " WALL TIME\n" ); (*print)( context, " " 800459c: d9 a0 00 00 call r13 /* * 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 ; 80045a0: 29 81 00 0c lw r1,(r12+12) 80045a4: 29 8b 00 08 lw r11,(r12+8) 80045a8: 55 61 00 17 bgu r11,r1,8004604 <== NEVER TAKEN rtems_object_get_name( the_status.owner, sizeof(name), name ); /* * Print part of report line that is not dependent on granularity */ (*print)( context, 80045ac: 78 12 08 01 mvhi r18,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, 80045b0: 78 15 08 01 mvhi r21,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, 80045b4: 78 14 08 01 mvhi r20,0x801 /* * If the count is zero, don't print statistics */ if (the_stats.count == 0) { (*print)( context, "\n" ); 80045b8: 78 11 08 01 mvhi r17,0x801 80045bc: 37 90 00 48 addi r16,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 ); 80045c0: 37 98 00 80 addi r24,sp,128 #endif rtems_object_get_name( the_status.owner, sizeof(name), name ); 80045c4: 37 93 00 a0 addi r19,sp,160 /* * Print part of report line that is not dependent on granularity */ (*print)( context, 80045c8: 3a 52 f6 04 ori r18,r18,0xf604 { #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; 80045cc: 37 97 00 60 addi r23,sp,96 _Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average ); 80045d0: 37 96 00 98 addi r22,sp,152 (*print)( context, 80045d4: 3a b5 f6 1c ori r21,r21,0xf61c { #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; 80045d8: 37 9b 00 78 addi fp,sp,120 _Timespec_Divide_by_integer(total_wall, the_stats.count, &wall_average); (*print)( context, 80045dc: 3a 94 f6 3c ori r20,r20,0xf63c /* * If the count is zero, don't print statistics */ if (the_stats.count == 0) { (*print)( context, "\n" ); 80045e0: 3a 31 eb 40 ori r17,r17,0xeb40 * is a period that is inactive, we just get an error back. No big deal. */ for ( id=_Rate_monotonic_Information.minimum_id ; id <= _Rate_monotonic_Information.maximum_id ; id++ ) { status = rtems_rate_monotonic_get_statistics( id, &the_stats ); 80045e4: b9 60 08 00 mv r1,r11 80045e8: ba 00 10 00 mv r2,r16 80045ec: f8 00 1e 5e calli 800bf64 80045f0: b8 20 70 00 mv r14,r1 if ( status != RTEMS_SUCCESSFUL ) 80045f4: 44 20 00 17 be r1,r0,8004650 /* * 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 ; 80045f8: 29 85 00 0c lw r5,(r12+12) id <= _Rate_monotonic_Information.maximum_id ; id++ ) { 80045fc: 35 6b 00 01 addi r11,r11,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 ; 8004600: 50 ab ff f9 bgeu r5,r11,80045e4 the_stats.min_wall_time, the_stats.max_wall_time, ival_wall, fval_wall ); #endif } } } 8004604: 2b 9d 00 04 lw ra,(sp+4) 8004608: 2b 8b 00 44 lw r11,(sp+68) 800460c: 2b 8c 00 40 lw r12,(sp+64) 8004610: 2b 8d 00 3c lw r13,(sp+60) 8004614: 2b 8e 00 38 lw r14,(sp+56) 8004618: 2b 8f 00 34 lw r15,(sp+52) 800461c: 2b 90 00 30 lw r16,(sp+48) 8004620: 2b 91 00 2c lw r17,(sp+44) 8004624: 2b 92 00 28 lw r18,(sp+40) 8004628: 2b 93 00 24 lw r19,(sp+36) 800462c: 2b 94 00 20 lw r20,(sp+32) 8004630: 2b 95 00 1c lw r21,(sp+28) 8004634: 2b 96 00 18 lw r22,(sp+24) 8004638: 2b 97 00 14 lw r23,(sp+20) 800463c: 2b 98 00 10 lw r24,(sp+16) 8004640: 2b 99 00 0c lw r25,(sp+12) 8004644: 2b 9b 00 08 lw fp,(sp+8) 8004648: 37 9c 00 a4 addi sp,sp,164 800464c: c3 a0 00 00 ret #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 ); 8004650: bb 00 10 00 mv r2,r24 8004654: b9 60 08 00 mv r1,r11 8004658: f8 00 1e 83 calli 800c064 #endif rtems_object_get_name( the_status.owner, sizeof(name), name ); 800465c: 2b 81 00 80 lw r1,(sp+128) 8004660: ba 60 18 00 mv r3,r19 8004664: 34 02 00 05 mvi r2,5 8004668: f8 00 00 ba calli 8004950 /* * Print part of report line that is not dependent on granularity */ (*print)( context, 800466c: 2b 85 00 48 lw r5,(sp+72) 8004670: 2b 86 00 4c lw r6,(sp+76) 8004674: ba 40 10 00 mv r2,r18 8004678: b9 60 18 00 mv r3,r11 800467c: b9 e0 08 00 mv r1,r15 8004680: ba 60 20 00 mv r4,r19 8004684: d9 a0 00 00 call r13 ); /* * If the count is zero, don't print statistics */ if (the_stats.count == 0) { 8004688: 2b 85 00 48 lw r5,(sp+72) 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 ); 800468c: ba c0 18 00 mv r3,r22 8004690: ba e0 08 00 mv r1,r23 /* * If the count is zero, don't print statistics */ if (the_stats.count == 0) { (*print)( context, "\n" ); 8004694: ba 20 10 00 mv r2,r17 ); /* * If the count is zero, don't print statistics */ if (the_stats.count == 0) { 8004698: 5c ae 00 04 bne r5,r14,80046a8 (*print)( context, "\n" ); 800469c: b9 e0 08 00 mv r1,r15 80046a0: d9 a0 00 00 call r13 continue; 80046a4: e3 ff ff d5 bi 80045f8 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 ); 80046a8: b8 a0 10 00 mv r2,r5 80046ac: f8 00 10 b4 calli 800897c <_Timespec_Divide_by_integer> (*print)( context, 80046b0: 2b 81 00 54 lw r1,(sp+84) 80046b4: 34 02 03 e8 mvi r2,1000 80046b8: f8 00 64 06 calli 801d6d0 <__divsi3> 80046bc: b8 20 c8 00 mv r25,r1 80046c0: 2b 81 00 5c lw r1,(sp+92) 80046c4: 34 02 03 e8 mvi r2,1000 80046c8: f8 00 64 02 calli 801d6d0 <__divsi3> 80046cc: b8 20 70 00 mv r14,r1 80046d0: 2b 81 00 9c lw r1,(sp+156) 80046d4: 34 02 03 e8 mvi r2,1000 80046d8: f8 00 63 fe calli 801d6d0 <__divsi3> 80046dc: 2b 85 00 58 lw r5,(sp+88) 80046e0: 2b 87 00 98 lw r7,(sp+152) 80046e4: 2b 83 00 50 lw r3,(sp+80) 80046e8: b8 20 40 00 mv r8,r1 80046ec: bb 20 20 00 mv r4,r25 80046f0: b9 c0 30 00 mv r6,r14 80046f4: ba a0 10 00 mv r2,r21 80046f8: b9 e0 08 00 mv r1,r15 80046fc: d9 a0 00 00 call r13 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); 8004700: 2b 82 00 48 lw r2,(sp+72) 8004704: ba c0 18 00 mv r3,r22 8004708: bb 60 08 00 mv r1,fp 800470c: f8 00 10 9c calli 800897c <_Timespec_Divide_by_integer> (*print)( context, 8004710: 2b 81 00 6c lw r1,(sp+108) 8004714: 34 02 03 e8 mvi r2,1000 8004718: f8 00 63 ee calli 801d6d0 <__divsi3> 800471c: b8 20 c8 00 mv r25,r1 8004720: 2b 81 00 74 lw r1,(sp+116) 8004724: 34 02 03 e8 mvi r2,1000 8004728: f8 00 63 ea calli 801d6d0 <__divsi3> 800472c: b8 20 70 00 mv r14,r1 8004730: 2b 81 00 9c lw r1,(sp+156) 8004734: 34 02 03 e8 mvi r2,1000 8004738: f8 00 63 e6 calli 801d6d0 <__divsi3> 800473c: 2b 83 00 68 lw r3,(sp+104) 8004740: 2b 85 00 70 lw r5,(sp+112) 8004744: 2b 87 00 98 lw r7,(sp+152) 8004748: b8 20 40 00 mv r8,r1 800474c: ba 80 10 00 mv r2,r20 8004750: b9 e0 08 00 mv r1,r15 8004754: bb 20 20 00 mv r4,r25 8004758: b9 c0 30 00 mv r6,r14 800475c: d9 a0 00 00 call r13 8004760: e3 ff ff a6 bi 80045f8 =============================================================================== 08004788 : /* * rtems_rate_monotonic_reset_all_statistics */ void rtems_rate_monotonic_reset_all_statistics( void ) { 8004788: 37 9c ff f4 addi sp,sp,-12 800478c: 5b 8b 00 0c sw (sp+12),r11 8004790: 5b 8c 00 08 sw (sp+8),r12 8004794: 5b 9d 00 04 sw (sp+4),ra rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 8004798: 78 01 08 02 mvhi r1,0x802 800479c: 38 21 19 f8 ori r1,r1,0x19f8 80047a0: 28 22 00 00 lw r2,(r1+0) 80047a4: 34 42 00 01 addi r2,r2,1 80047a8: 58 22 00 00 sw (r1+0),r2 /* * Cycle through all possible ids and try to reset each one. If it * is a period that is inactive, we just get an error back. No big deal. */ for ( id=_Rate_monotonic_Information.minimum_id ; 80047ac: 78 0c 08 02 mvhi r12,0x802 80047b0: 39 8c 18 d0 ori r12,r12,0x18d0 80047b4: 29 8b 00 08 lw r11,(r12+8) 80047b8: 29 81 00 0c lw r1,(r12+12) 80047bc: 55 61 00 06 bgu r11,r1,80047d4 <== NEVER TAKEN id <= _Rate_monotonic_Information.maximum_id ; id++ ) { (void) rtems_rate_monotonic_reset_statistics( id ); 80047c0: b9 60 08 00 mv r1,r11 80047c4: f8 00 00 0a calli 80047ec /* * Cycle through all possible ids and try to reset each one. If it * is a period that is inactive, we just get an error back. No big deal. */ for ( id=_Rate_monotonic_Information.minimum_id ; 80047c8: 29 81 00 0c lw r1,(r12+12) id <= _Rate_monotonic_Information.maximum_id ; id++ ) { 80047cc: 35 6b 00 01 addi r11,r11,1 /* * Cycle through all possible ids and try to reset each one. If it * is a period that is inactive, we just get an error back. No big deal. */ for ( id=_Rate_monotonic_Information.minimum_id ; 80047d0: 50 2b ff fc bgeu r1,r11,80047c0 } /* * Done so exit thread dispatching disabled critical section. */ _Thread_Enable_dispatch(); 80047d4: f8 00 0c d8 calli 8007b34 <_Thread_Enable_dispatch> } 80047d8: 2b 9d 00 04 lw ra,(sp+4) 80047dc: 2b 8b 00 0c lw r11,(sp+12) 80047e0: 2b 8c 00 08 lw r12,(sp+8) 80047e4: 37 9c 00 0c addi sp,sp,12 80047e8: c3 a0 00 00 ret =============================================================================== 08012fa8 : rtems_status_code rtems_signal_send( rtems_id id, rtems_signal_set signal_set ) { 8012fa8: 37 9c ff f4 addi sp,sp,-12 8012fac: 5b 8b 00 08 sw (sp+8),r11 8012fb0: 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; 8012fb4: 34 03 00 0a mvi r3,10 rtems_status_code rtems_signal_send( rtems_id id, rtems_signal_set signal_set ) { 8012fb8: 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 ) 8012fbc: 5c 40 00 06 bne r2,r0,8012fd4 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 8012fc0: b8 60 08 00 mv r1,r3 8012fc4: 2b 9d 00 04 lw ra,(sp+4) 8012fc8: 2b 8b 00 08 lw r11,(sp+8) 8012fcc: 37 9c 00 0c addi sp,sp,12 8012fd0: c3 a0 00 00 ret ASR_Information *asr; if ( !signal_set ) return RTEMS_INVALID_NUMBER; the_thread = _Thread_Get( id, &location ); 8012fd4: 37 82 00 0c addi r2,sp,12 8012fd8: f8 00 15 8e calli 8018610 <_Thread_Get> switch ( location ) { 8012fdc: 2b 83 00 0c lw r3,(sp+12) 8012fe0: 44 60 00 07 be r3,r0,8012ffc case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 8012fe4: 34 03 00 04 mvi r3,4 } 8012fe8: b8 60 08 00 mv r1,r3 8012fec: 2b 9d 00 04 lw ra,(sp+4) 8012ff0: 2b 8b 00 08 lw r11,(sp+8) 8012ff4: 37 9c 00 0c addi sp,sp,12 8012ff8: c3 a0 00 00 ret the_thread = _Thread_Get( id, &location ); switch ( location ) { case OBJECTS_LOCAL: api = the_thread->API_Extensions[ THREAD_API_RTEMS ]; 8012ffc: 28 22 01 1c lw r2,(r1+284) asr = &api->Signal; if ( ! _ASR_Is_null_handler( asr->handler ) ) { 8013000: 28 44 00 0c lw r4,(r2+12) 8013004: 44 83 00 23 be r4,r3,8013090 if ( asr->is_enabled ) { 8013008: 40 43 00 08 lbu r3,(r2+8) 801300c: 44 60 00 12 be r3,r0,8013054 rtems_signal_set *signal_set ) { ISR_Level _level; _ISR_Disable( _level ); 8013010: 90 00 18 00 rcsr r3,IE 8013014: 34 04 ff fe mvi r4,-2 8013018: a0 64 20 00 and r4,r3,r4 801301c: d0 04 00 00 wcsr IE,r4 *signal_set |= signals; 8013020: 28 44 00 14 lw r4,(r2+20) 8013024: b8 8b 58 00 or r11,r4,r11 8013028: 58 4b 00 14 sw (r2+20),r11 _ISR_Enable( _level ); 801302c: d0 03 00 00 wcsr IE,r3 _ASR_Post_signals( signal_set, &asr->signals_posted ); if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) ) 8013030: 78 02 08 04 mvhi r2,0x804 8013034: 38 42 11 b4 ori r2,r2,0x11b4 8013038: 28 43 00 08 lw r3,(r2+8) 801303c: 44 60 00 0e be r3,r0,8013074 8013040: 28 43 00 0c lw r3,(r2+12) 8013044: 5c 23 00 0c bne r1,r3,8013074 <== NEVER TAKEN _Thread_Dispatch_necessary = true; 8013048: 34 01 00 01 mvi r1,1 801304c: 30 41 00 18 sb (r2+24),r1 8013050: e0 00 00 09 bi 8013074 rtems_signal_set *signal_set ) { ISR_Level _level; _ISR_Disable( _level ); 8013054: 90 00 08 00 rcsr r1,IE 8013058: 34 03 ff fe mvi r3,-2 801305c: a0 23 18 00 and r3,r1,r3 8013060: d0 03 00 00 wcsr IE,r3 *signal_set |= signals; 8013064: 28 43 00 18 lw r3,(r2+24) 8013068: b8 6b 58 00 or r11,r3,r11 801306c: 58 4b 00 18 sw (r2+24),r11 _ISR_Enable( _level ); 8013070: d0 01 00 00 wcsr IE,r1 } else { _ASR_Post_signals( signal_set, &asr->signals_pending ); } _Thread_Enable_dispatch(); 8013074: f8 00 15 5a calli 80185dc <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 8013078: 34 03 00 00 mvi r3,0 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 801307c: b8 60 08 00 mv r1,r3 8013080: 2b 9d 00 04 lw ra,(sp+4) 8013084: 2b 8b 00 08 lw r11,(sp+8) 8013088: 37 9c 00 0c addi sp,sp,12 801308c: c3 a0 00 00 ret _ASR_Post_signals( signal_set, &asr->signals_pending ); } _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } _Thread_Enable_dispatch(); 8013090: f8 00 15 53 calli 80185dc <_Thread_Enable_dispatch> return RTEMS_NOT_DEFINED; 8013094: 34 03 00 0b mvi r3,11 8013098: e3 ff ff ca bi 8012fc0 =============================================================================== 080013e4 : Thread_Control *the_thread ) { Stack_check_Control *the_pattern; if ( the_thread->Object.id == 0 ) /* skip system tasks */ 80013e4: 28 22 00 08 lw r2,(r1+8) 80013e8: 44 40 00 0c be r2,r0,8001418 <== NEVER TAKEN return; the_pattern = Stack_check_Get_pattern_area(&the_thread->Start.Initial_stack); *the_pattern = Stack_check_Pattern; 80013ec: 78 02 08 01 mvhi r2,0x801 80013f0: 38 42 87 90 ori r2,r2,0x8790 80013f4: 28 43 00 00 lw r3,(r2+0) 80013f8: 28 21 00 bc lw r1,(r1+188) 80013fc: 58 23 00 08 sw (r1+8),r3 8001400: 28 43 00 04 lw r3,(r2+4) 8001404: 58 23 00 0c sw (r1+12),r3 8001408: 28 43 00 08 lw r3,(r2+8) 800140c: 58 23 00 10 sw (r1+16),r3 8001410: 28 42 00 0c lw r2,(r2+12) 8001414: 58 22 00 14 sw (r1+20),r2 8001418: c3 a0 00 00 ret =============================================================================== 080013a8 : */ bool rtems_stack_checker_create_extension( Thread_Control *running __attribute__((unused)), Thread_Control *the_thread ) { 80013a8: 37 9c ff f8 addi sp,sp,-8 80013ac: 5b 8b 00 08 sw (sp+8),r11 80013b0: 5b 9d 00 04 sw (sp+4),ra 80013b4: b8 40 58 00 mv r11,r2 Stack_check_Initialize(); 80013b8: fb ff ff ce calli 80012f0 if (the_thread) 80013bc: 45 60 00 05 be r11,r0,80013d0 <== NEVER TAKEN Stack_check_Dope_stack(&the_thread->Start.Initial_stack); 80013c0: 29 61 00 bc lw r1,(r11+188) 80013c4: 29 63 00 b8 lw r3,(r11+184) 80013c8: 34 02 00 a5 mvi r2,165 80013cc: f8 00 3e 0e calli 8010c04 return true; } 80013d0: 34 01 00 01 mvi r1,1 80013d4: 2b 9d 00 04 lw ra,(sp+4) 80013d8: 2b 8b 00 08 lw r11,(sp+8) 80013dc: 37 9c 00 08 addi sp,sp,8 80013e0: c3 a0 00 00 ret =============================================================================== 08001558 : /* * Check if blown */ bool rtems_stack_checker_is_blown( void ) { 8001558: 37 9c ff f0 addi sp,sp,-16 800155c: 5b 9b 00 08 sw (sp+8),fp 8001560: 34 1b 00 10 mvi fp,16 8001564: b7 7c d8 00 add fp,fp,sp 8001568: 5b 8b 00 10 sw (sp+16),r11 800156c: 5b 8c 00 0c sw (sp+12),r12 8001570: 5b 9d 00 04 sw (sp+4),ra Stack_Control *the_stack = &_Thread_Executing->Start.Initial_stack; 8001574: 78 0b 08 01 mvhi r11,0x801 8001578: 39 6b 8e 18 ori r11,r11,0x8e18 800157c: 29 62 00 0c lw r2,(r11+12) { #if defined(__GNUC__) void *sp = __builtin_frame_address(0); if ( sp < the_stack->area ) { return false; 8001580: 34 0c 00 00 mvi r12,0 ) { #if defined(__GNUC__) void *sp = __builtin_frame_address(0); if ( sp < the_stack->area ) { 8001584: 28 41 00 bc lw r1,(r2+188) 8001588: 54 3b 00 04 bgu r1,fp,8001598 <== NEVER TAKEN return false; } if ( sp > (the_stack->area + the_stack->size) ) { 800158c: 28 4c 00 b8 lw r12,(r2+184) } /* * Check if blown */ bool rtems_stack_checker_is_blown( void ) 8001590: b4 2c 60 00 add r12,r1,r12 8001594: f1 9b 60 00 cmpgeu r12,r12,fp /* * The stack checker must be initialized before the pattern is there * to check. */ if ( Stack_check_Initialized ) { 8001598: 78 02 08 01 mvhi r2,0x801 800159c: 38 42 87 04 ori r2,r2,0x8704 80015a0: 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; 80015a4: 34 02 00 01 mvi r2,1 /* * The stack checker must be initialized before the pattern is there * to check. */ if ( Stack_check_Initialized ) { 80015a8: 44 60 00 07 be r3,r0,80015c4 <== NEVER TAKEN pattern_ok = (!memcmp( 80015ac: 78 02 08 01 mvhi r2,0x801 80015b0: 38 42 87 90 ori r2,r2,0x8790 80015b4: 34 21 00 08 addi r1,r1,8 80015b8: 34 03 00 10 mvi r3,16 80015bc: f8 00 3d 30 calli 8010a7c 80015c0: 64 22 00 00 cmpei r2,r1,0 /* * Let's report as much as we can. */ if ( !sp_ok || !pattern_ok ) { 80015c4: 45 80 00 09 be r12,r0,80015e8 <== NEVER TAKEN 80015c8: 44 40 00 08 be r2,r0,80015e8 <== NEVER TAKEN /* * The Stack Pointer and the Pattern Area are OK so return false. */ return false; } 80015cc: 34 01 00 00 mvi r1,0 80015d0: 2b 9d 00 04 lw ra,(sp+4) 80015d4: 2b 8b 00 10 lw r11,(sp+16) 80015d8: 2b 8c 00 0c lw r12,(sp+12) 80015dc: 2b 9b 00 08 lw fp,(sp+8) 80015e0: 37 9c 00 10 addi sp,sp,16 80015e4: c3 a0 00 00 ret /* * Let's report as much as we can. */ if ( !sp_ok || !pattern_ok ) { Stack_check_report_blown_task( _Thread_Executing, pattern_ok ); 80015e8: 29 61 00 0c lw r1,(r11+12) <== NOT EXECUTED 80015ec: fb ff ff 8c calli 800141c <== NOT EXECUTED =============================================================================== 080015f0 : void rtems_stack_checker_report_usage_with_plugin( void *context, rtems_printk_plugin_t print ) { 80015f0: 37 9c ff ec addi sp,sp,-20 80015f4: 5b 8b 00 14 sw (sp+20),r11 80015f8: 5b 8c 00 10 sw (sp+16),r12 80015fc: 5b 8d 00 0c sw (sp+12),r13 8001600: 5b 8e 00 08 sw (sp+8),r14 8001604: 5b 9d 00 04 sw (sp+4),ra 8001608: b8 40 58 00 mv r11,r2 800160c: b8 20 70 00 mv r14,r1 if ( !print ) 8001610: 44 40 00 15 be r2,r0,8001664 <== NEVER TAKEN return; print_context = context; 8001614: 78 0d 08 01 mvhi r13,0x801 print_handler = print; 8001618: 78 0c 08 01 mvhi r12,0x801 ) { if ( !print ) return; print_context = context; 800161c: 39 ad 86 fc ori r13,r13,0x86fc print_handler = print; 8001620: 39 8c 87 00 ori r12,r12,0x8700 (*print)( context, "Stack usage by thread\n"); 8001624: 78 02 08 01 mvhi r2,0x801 8001628: 38 42 69 dc ori r2,r2,0x69dc ) { if ( !print ) return; print_context = context; 800162c: 59 a1 00 00 sw (r13+0),r1 print_handler = print; 8001630: 59 8b 00 00 sw (r12+0),r11 (*print)( context, "Stack usage by thread\n"); 8001634: d9 60 00 00 call r11 (*print)( context, 8001638: 78 02 08 01 mvhi r2,0x801 800163c: 38 42 69 f4 ori r2,r2,0x69f4 8001640: b9 c0 08 00 mv r1,r14 8001644: d9 60 00 00 call r11 " 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 ); 8001648: 78 01 08 00 mvhi r1,0x800 800164c: 38 21 11 1c ori r1,r1,0x111c 8001650: f8 00 18 4c calli 8007780 #if (CPU_ALLOCATE_INTERRUPT_STACK == TRUE) /* dump interrupt stack info if any */ Stack_check_Dump_threads_usage((Thread_Control *) -1); 8001654: 34 01 ff ff mvi r1,-1 8001658: fb ff fe b1 calli 800111c #endif print_context = NULL; 800165c: 59 a0 00 00 sw (r13+0),r0 print_handler = NULL; 8001660: 59 80 00 00 sw (r12+0),r0 } 8001664: 2b 9d 00 04 lw ra,(sp+4) 8001668: 2b 8b 00 14 lw r11,(sp+20) 800166c: 2b 8c 00 10 lw r12,(sp+16) 8001670: 2b 8d 00 0c lw r13,(sp+12) 8001674: 2b 8e 00 08 lw r14,(sp+8) 8001678: 37 9c 00 14 addi sp,sp,20 800167c: c3 a0 00 00 ret =============================================================================== 080014d8 : */ void rtems_stack_checker_switch_extension( Thread_Control *running __attribute__((unused)), Thread_Control *heir __attribute__((unused)) ) { 80014d8: 37 9c ff f4 addi sp,sp,-12 80014dc: 5b 9b 00 08 sw (sp+8),fp 80014e0: 34 1b 00 0c mvi fp,12 80014e4: b7 7c d8 00 add fp,fp,sp 80014e8: 5b 8b 00 0c sw (sp+12),r11 80014ec: 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); 80014f0: 28 22 00 bc lw r2,(r1+188) */ void rtems_stack_checker_switch_extension( Thread_Control *running __attribute__((unused)), Thread_Control *heir __attribute__((unused)) ) { 80014f4: b8 20 58 00 mv r11,r1 Stack_Control *the_stack = &running->Start.Initial_stack; void *pattern; bool sp_ok; bool pattern_ok = true; pattern = Stack_check_Get_pattern_area(the_stack); 80014f8: 34 41 00 08 addi r1,r2,8 ) { #if defined(__GNUC__) void *sp = __builtin_frame_address(0); if ( sp < the_stack->area ) { 80014fc: 54 5b 00 04 bgu r2,fp,800150c <== NEVER TAKEN return false; } if ( sp > (the_stack->area + the_stack->size) ) { 8001500: 29 63 00 b8 lw r3,(r11+184) 8001504: b4 43 10 00 add r2,r2,r3 8001508: 50 5b 00 08 bgeu r2,fp,8001528 /* * 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, 800150c: 78 02 08 01 mvhi r2,0x801 8001510: 38 42 87 90 ori r2,r2,0x8790 8001514: 34 03 00 10 mvi r3,16 8001518: f8 00 3d 59 calli 8010a7c 800151c: 64 22 00 00 cmpei r2,r1,0 (void *) Stack_check_Pattern.pattern, PATTERN_SIZE_BYTES)); if ( !sp_ok || !pattern_ok ) { Stack_check_report_blown_task( running, pattern_ok ); 8001520: b9 60 08 00 mv r1,r11 8001524: fb ff ff be calli 800141c /* * 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, 8001528: 78 02 08 01 mvhi r2,0x801 800152c: 38 42 87 90 ori r2,r2,0x8790 8001530: 34 03 00 10 mvi r3,16 8001534: f8 00 3d 52 calli 8010a7c (void *) Stack_check_Pattern.pattern, PATTERN_SIZE_BYTES)); if ( !sp_ok || !pattern_ok ) { 8001538: 5c 20 00 06 bne r1,r0,8001550 Stack_check_report_blown_task( running, pattern_ok ); } } 800153c: 2b 9d 00 04 lw ra,(sp+4) 8001540: 2b 8b 00 0c lw r11,(sp+12) 8001544: 2b 9b 00 08 lw fp,(sp+8) 8001548: 37 9c 00 0c addi sp,sp,12 800154c: c3 a0 00 00 ret sp_ok = Stack_check_Frame_pointer_in_range( the_stack ); pattern_ok = (!memcmp( pattern, (void *) Stack_check_Pattern.pattern, PATTERN_SIZE_BYTES)); if ( !sp_ok || !pattern_ok ) { 8001550: 34 02 00 00 mvi r2,0 8001554: e3 ff ff f3 bi 8001520 =============================================================================== 080093e0 : #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 80093e0: 37 9c ff e4 addi sp,sp,-28 80093e4: 5b 8b 00 18 sw (sp+24),r11 80093e8: 5b 8c 00 14 sw (sp+20),r12 80093ec: 5b 8d 00 10 sw (sp+16),r13 80093f0: 5b 8e 00 0c sw (sp+12),r14 80093f4: 5b 8f 00 08 sw (sp+8),r15 80093f8: 5b 9d 00 04 sw (sp+4),ra STRING_TO_INPUT_TYPE result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 80093fc: 34 04 00 09 mvi r4,9 #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 8009400: b8 40 58 00 mv r11,r2 8009404: b8 20 60 00 mv r12,r1 8009408: b8 60 68 00 mv r13,r3 STRING_TO_INPUT_TYPE result; char *end; if ( !n ) 800940c: 44 40 00 1a be r2,r0,8009474 return RTEMS_INVALID_ADDRESS; errno = 0; 8009410: f8 00 11 c1 calli 800db14 <__errno> 8009414: 58 20 00 00 sw (r1+0),r0 *n = 0; 8009418: 59 60 00 00 sw (r11+0),r0 800941c: 59 60 00 04 sw (r11+4),r0 #ifdef STRING_TO_FLOAT result = STRING_TO_METHOD( s, &end ); 8009420: b9 80 08 00 mv r1,r12 8009424: 37 82 00 1c addi r2,sp,28 8009428: f8 00 1c c6 calli 8010740 800942c: b8 20 78 00 mv r15,r1 8009430: b8 40 70 00 mv r14,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 ) 8009434: 45 a0 00 1f be r13,r0,80094b0 *endptr = end; 8009438: 2b 85 00 1c lw r5,(sp+28) 800943c: 59 a5 00 00 sw (r13+0),r5 /* nothing was converted */ if ( end == s ) return RTEMS_NOT_DEFINED; 8009440: 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 ) 8009444: 45 85 00 0c be r12,r5,8009474 return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 8009448: 78 01 08 02 mvhi r1,0x802 800944c: 38 21 16 0c ori r1,r1,0x160c 8009450: 28 23 00 00 lw r3,(r1+0) 8009454: b9 c0 10 00 mv r2,r14 8009458: b9 e0 08 00 mv r1,r15 800945c: 34 04 ff ff mvi r4,-1 8009460: f8 00 4b df calli 801c3dc <__gedf2> 8009464: 48 20 00 0d bg r1,r0,8009498 #endif #if defined(STRING_TO_POINTER) *n = (STRING_TO_TYPE) (uintptr_t)result; #else *n = (STRING_TO_TYPE) result; 8009468: 59 6f 00 00 sw (r11+0),r15 800946c: 59 6e 00 04 sw (r11+4),r14 #endif return RTEMS_SUCCESSFUL; 8009470: 34 04 00 00 mvi r4,0 } 8009474: b8 80 08 00 mv r1,r4 8009478: 2b 9d 00 04 lw ra,(sp+4) 800947c: 2b 8b 00 18 lw r11,(sp+24) 8009480: 2b 8c 00 14 lw r12,(sp+20) 8009484: 2b 8d 00 10 lw r13,(sp+16) 8009488: 2b 8e 00 0c lw r14,(sp+12) 800948c: 2b 8f 00 08 lw r15,(sp+8) 8009490: 37 9c 00 1c addi sp,sp,28 8009494: c3 a0 00 00 ret return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 8009498: f8 00 11 9f calli 800db14 <__errno> 800949c: 28 22 00 00 lw r2,(r1+0) 80094a0: 34 01 00 22 mvi r1,34 return RTEMS_INVALID_NUMBER; 80094a4: 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)) 80094a8: 5c 41 ff f0 bne r2,r1,8009468 <== NEVER TAKEN 80094ac: e3 ff ff f2 bi 8009474 #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 ) 80094b0: 2b 85 00 1c lw r5,(sp+28) 80094b4: e3 ff ff e3 bi 8009440 =============================================================================== 080094b8 : #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 80094b8: 37 9c ff e8 addi sp,sp,-24 80094bc: 5b 8b 00 14 sw (sp+20),r11 80094c0: 5b 8c 00 10 sw (sp+16),r12 80094c4: 5b 8d 00 0c sw (sp+12),r13 80094c8: 5b 8e 00 08 sw (sp+8),r14 80094cc: 5b 9d 00 04 sw (sp+4),ra STRING_TO_INPUT_TYPE result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 80094d0: 34 04 00 09 mvi r4,9 #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 80094d4: b8 40 58 00 mv r11,r2 80094d8: b8 20 60 00 mv r12,r1 80094dc: b8 60 68 00 mv r13,r3 STRING_TO_INPUT_TYPE result; char *end; if ( !n ) 80094e0: 44 40 00 15 be r2,r0,8009534 return RTEMS_INVALID_ADDRESS; errno = 0; 80094e4: f8 00 11 8c calli 800db14 <__errno> 80094e8: 58 20 00 00 sw (r1+0),r0 *n = 0; 80094ec: 59 60 00 00 sw (r11+0),r0 #ifdef STRING_TO_FLOAT result = STRING_TO_METHOD( s, &end ); 80094f0: b9 80 08 00 mv r1,r12 80094f4: 37 82 00 18 addi r2,sp,24 80094f8: f8 00 1c 9e calli 8010770 80094fc: b8 20 70 00 mv r14,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 ) 8009500: 45 a0 00 1b be r13,r0,800956c *endptr = end; 8009504: 2b 82 00 18 lw r2,(sp+24) 8009508: 59 a2 00 00 sw (r13+0),r2 /* nothing was converted */ if ( end == s ) return RTEMS_NOT_DEFINED; 800950c: 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 ) 8009510: 45 82 00 09 be r12,r2,8009534 return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 8009514: 78 01 08 02 mvhi r1,0x802 8009518: 38 21 16 10 ori r1,r1,0x1610 800951c: 28 22 00 00 lw r2,(r1+0) 8009520: b9 c0 08 00 mv r1,r14 8009524: f8 00 45 b4 calli 801abf4 <__gesf2> 8009528: 48 20 00 0b bg r1,r0,8009554 #endif #if defined(STRING_TO_POINTER) *n = (STRING_TO_TYPE) (uintptr_t)result; #else *n = (STRING_TO_TYPE) result; 800952c: 59 6e 00 00 sw (r11+0),r14 #endif return RTEMS_SUCCESSFUL; 8009530: 34 04 00 00 mvi r4,0 } 8009534: b8 80 08 00 mv r1,r4 8009538: 2b 9d 00 04 lw ra,(sp+4) 800953c: 2b 8b 00 14 lw r11,(sp+20) 8009540: 2b 8c 00 10 lw r12,(sp+16) 8009544: 2b 8d 00 0c lw r13,(sp+12) 8009548: 2b 8e 00 08 lw r14,(sp+8) 800954c: 37 9c 00 18 addi sp,sp,24 8009550: c3 a0 00 00 ret return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 8009554: f8 00 11 70 calli 800db14 <__errno> 8009558: 28 22 00 00 lw r2,(r1+0) 800955c: 34 01 00 22 mvi r1,34 return RTEMS_INVALID_NUMBER; 8009560: 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)) 8009564: 5c 41 ff f2 bne r2,r1,800952c <== NEVER TAKEN 8009568: e3 ff ff f3 bi 8009534 #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 ) 800956c: 2b 82 00 18 lw r2,(sp+24) 8009570: e3 ff ff e7 bi 800950c =============================================================================== 08009630 : #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 8009630: 37 9c ff e4 addi sp,sp,-28 8009634: 5b 8b 00 14 sw (sp+20),r11 8009638: 5b 8c 00 10 sw (sp+16),r12 800963c: 5b 8d 00 0c sw (sp+12),r13 8009640: 5b 8e 00 08 sw (sp+8),r14 8009644: 5b 9d 00 04 sw (sp+4),ra STRING_TO_INPUT_TYPE result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 8009648: 34 05 00 09 mvi r5,9 #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 800964c: b8 40 58 00 mv r11,r2 8009650: b8 20 68 00 mv r13,r1 8009654: b8 60 70 00 mv r14,r3 8009658: b8 80 60 00 mv r12,r4 STRING_TO_INPUT_TYPE result; char *end; if ( !n ) 800965c: 44 40 00 18 be r2,r0,80096bc return RTEMS_INVALID_ADDRESS; errno = 0; 8009660: f8 00 11 2d calli 800db14 <__errno> 8009664: 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 ); 8009668: b9 80 18 00 mv r3,r12 if ( !n ) return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; 800966c: 59 60 00 00 sw (r11+0),r0 8009670: 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 ); 8009674: b9 a0 08 00 mv r1,r13 8009678: 37 82 00 1c addi r2,sp,28 800967c: f8 00 1c fe calli 8010a74 8009680: b8 20 60 00 mv r12,r1 #endif /* If the user wants the end pointer back, then return it. */ if ( endptr ) 8009684: 45 c0 00 22 be r14,r0,800970c *endptr = end; 8009688: 2b 84 00 1c lw r4,(sp+28) 800968c: 59 c4 00 00 sw (r14+0),r4 /* nothing was converted */ if ( end == s ) return RTEMS_NOT_DEFINED; 8009690: 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 ) 8009694: 45 a4 00 0a be r13,r4,80096bc return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 8009698: 78 03 08 02 mvhi r3,0x802 800969c: 38 63 0e 80 ori r3,r3,0xe80 80096a0: 28 61 00 00 lw r1,(r3+0) 80096a4: 45 81 00 17 be r12,r1,8009700 return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MIN /* there was an underflow */ if ( (result == STRING_TO_MIN) && (errno == ERANGE)) 80096a8: 78 01 80 00 mvhi r1,0x8000 80096ac: 45 81 00 0c be r12,r1,80096dc #endif #if defined(STRING_TO_POINTER) *n = (STRING_TO_TYPE) (uintptr_t)result; #else *n = (STRING_TO_TYPE) result; 80096b0: 59 6c 00 00 sw (r11+0),r12 80096b4: 59 62 00 04 sw (r11+4),r2 #endif return RTEMS_SUCCESSFUL; 80096b8: 34 05 00 00 mvi r5,0 } 80096bc: b8 a0 08 00 mv r1,r5 80096c0: 2b 9d 00 04 lw ra,(sp+4) 80096c4: 2b 8b 00 14 lw r11,(sp+20) 80096c8: 2b 8c 00 10 lw r12,(sp+16) 80096cc: 2b 8d 00 0c lw r13,(sp+12) 80096d0: 2b 8e 00 08 lw r14,(sp+8) 80096d4: 37 9c 00 1c addi sp,sp,28 80096d8: c3 a0 00 00 ret return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MIN /* there was an underflow */ if ( (result == STRING_TO_MIN) && (errno == ERANGE)) 80096dc: 5c 40 ff f5 bne r2,r0,80096b0 <== NEVER TAKEN 80096e0: 5b 82 00 18 sw (sp+24),r2 80096e4: f8 00 11 0c calli 800db14 <__errno> 80096e8: 28 23 00 00 lw r3,(r1+0) 80096ec: 34 01 00 22 mvi r1,34 return RTEMS_INVALID_NUMBER; 80096f0: 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)) 80096f4: 2b 82 00 18 lw r2,(sp+24) 80096f8: 5c 61 ff ee bne r3,r1,80096b0 80096fc: e3 ff ff f0 bi 80096bc return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 8009700: 34 01 ff ff mvi r1,-1 8009704: 5c 41 ff e9 bne r2,r1,80096a8 <== NEVER TAKEN 8009708: e3 ff ff f6 bi 80096e0 #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 ) 800970c: 2b 84 00 1c lw r4,(sp+28) 8009710: e3 ff ff e0 bi 8009690 =============================================================================== 080097d8 : #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 80097d8: 37 9c ff e8 addi sp,sp,-24 80097dc: 5b 8b 00 14 sw (sp+20),r11 80097e0: 5b 8c 00 10 sw (sp+16),r12 80097e4: 5b 8d 00 0c sw (sp+12),r13 80097e8: 5b 8e 00 08 sw (sp+8),r14 80097ec: 5b 9d 00 04 sw (sp+4),ra STRING_TO_INPUT_TYPE result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 80097f0: 34 04 00 09 mvi r4,9 #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 80097f4: b8 40 58 00 mv r11,r2 80097f8: b8 20 68 00 mv r13,r1 80097fc: b8 60 70 00 mv r14,r3 STRING_TO_INPUT_TYPE result; char *end; if ( !n ) 8009800: 44 40 00 12 be r2,r0,8009848 return RTEMS_INVALID_ADDRESS; errno = 0; 8009804: f8 00 10 c4 calli 800db14 <__errno> 8009808: 58 20 00 00 sw (r1+0),r0 *n = 0; 800980c: 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 ); 8009810: b9 a0 08 00 mv r1,r13 8009814: 37 82 00 18 addi r2,sp,24 8009818: 34 03 00 10 mvi r3,16 800981c: f8 00 1e 01 calli 8011020 8009820: 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 ) 8009824: 45 c0 00 17 be r14,r0,8009880 *endptr = end; 8009828: 2b 82 00 18 lw r2,(sp+24) 800982c: 59 c2 00 00 sw (r14+0),r2 /* nothing was converted */ if ( end == s ) return RTEMS_NOT_DEFINED; 8009830: 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 ) 8009834: 45 a2 00 05 be r13,r2,8009848 return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 8009838: 34 01 ff ff mvi r1,-1 800983c: 45 81 00 0b be r12,r1,8009868 <== NEVER TAKEN if ( (result == STRING_TO_MIN) && (errno == ERANGE)) return RTEMS_INVALID_NUMBER; #endif #if defined(STRING_TO_POINTER) *n = (STRING_TO_TYPE) (uintptr_t)result; 8009840: 59 6c 00 00 sw (r11+0),r12 #else *n = (STRING_TO_TYPE) result; #endif return RTEMS_SUCCESSFUL; 8009844: 34 04 00 00 mvi r4,0 } 8009848: b8 80 08 00 mv r1,r4 800984c: 2b 9d 00 04 lw ra,(sp+4) 8009850: 2b 8b 00 14 lw r11,(sp+20) 8009854: 2b 8c 00 10 lw r12,(sp+16) 8009858: 2b 8d 00 0c lw r13,(sp+12) 800985c: 2b 8e 00 08 lw r14,(sp+8) 8009860: 37 9c 00 18 addi sp,sp,24 8009864: c3 a0 00 00 ret return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 8009868: f8 00 10 ab calli 800db14 <__errno> <== NOT EXECUTED 800986c: 28 22 00 00 lw r2,(r1+0) <== NOT EXECUTED 8009870: 34 01 00 22 mvi r1,34 <== NOT EXECUTED return RTEMS_INVALID_NUMBER; 8009874: 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)) 8009878: 5c 41 ff f2 bne r2,r1,8009840 <== NOT EXECUTED 800987c: e3 ff ff f3 bi 8009848 <== NOT EXECUTED #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 ) 8009880: 2b 82 00 18 lw r2,(sp+24) 8009884: e3 ff ff eb bi 8009830 =============================================================================== 08009918 : #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 8009918: 37 9c ff e8 addi sp,sp,-24 800991c: 5b 8b 00 14 sw (sp+20),r11 8009920: 5b 8c 00 10 sw (sp+16),r12 8009924: 5b 8d 00 0c sw (sp+12),r13 8009928: 5b 8e 00 08 sw (sp+8),r14 800992c: 5b 9d 00 04 sw (sp+4),ra STRING_TO_INPUT_TYPE result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 8009930: 34 05 00 09 mvi r5,9 #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 8009934: b8 40 58 00 mv r11,r2 8009938: b8 20 68 00 mv r13,r1 800993c: b8 60 70 00 mv r14,r3 8009940: b8 80 60 00 mv r12,r4 STRING_TO_INPUT_TYPE result; char *end; if ( !n ) 8009944: 44 40 00 12 be r2,r0,800998c return RTEMS_INVALID_ADDRESS; errno = 0; 8009948: f8 00 10 73 calli 800db14 <__errno> 800994c: 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 ); 8009950: b9 80 18 00 mv r3,r12 if ( !n ) return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; 8009954: 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 ); 8009958: b9 a0 08 00 mv r1,r13 800995c: 37 82 00 18 addi r2,sp,24 8009960: f8 00 1d b0 calli 8011020 8009964: b8 20 60 00 mv r12,r1 #endif /* If the user wants the end pointer back, then return it. */ if ( endptr ) 8009968: 45 c0 00 17 be r14,r0,80099c4 *endptr = end; 800996c: 2b 82 00 18 lw r2,(sp+24) 8009970: 59 c2 00 00 sw (r14+0),r2 /* nothing was converted */ if ( end == s ) return RTEMS_NOT_DEFINED; 8009974: 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 ) 8009978: 45 a2 00 05 be r13,r2,800998c return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 800997c: 34 01 ff ff mvi r1,-1 8009980: 45 81 00 0b be r12,r1,80099ac #endif #if defined(STRING_TO_POINTER) *n = (STRING_TO_TYPE) (uintptr_t)result; #else *n = (STRING_TO_TYPE) result; 8009984: 59 6c 00 00 sw (r11+0),r12 #endif return RTEMS_SUCCESSFUL; 8009988: 34 05 00 00 mvi r5,0 } 800998c: b8 a0 08 00 mv r1,r5 8009990: 2b 9d 00 04 lw ra,(sp+4) 8009994: 2b 8b 00 14 lw r11,(sp+20) 8009998: 2b 8c 00 10 lw r12,(sp+16) 800999c: 2b 8d 00 0c lw r13,(sp+12) 80099a0: 2b 8e 00 08 lw r14,(sp+8) 80099a4: 37 9c 00 18 addi sp,sp,24 80099a8: c3 a0 00 00 ret return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 80099ac: f8 00 10 5a calli 800db14 <__errno> 80099b0: 28 22 00 00 lw r2,(r1+0) 80099b4: 34 01 00 22 mvi r1,34 return RTEMS_INVALID_NUMBER; 80099b8: 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)) 80099bc: 5c 41 ff f2 bne r2,r1,8009984 <== NEVER TAKEN 80099c0: e3 ff ff f3 bi 800998c #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 ) 80099c4: 2b 82 00 18 lw r2,(sp+24) 80099c8: e3 ff ff eb bi 8009974 =============================================================================== 08009a94 : #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 8009a94: 37 9c ff e8 addi sp,sp,-24 8009a98: 5b 8b 00 14 sw (sp+20),r11 8009a9c: 5b 8c 00 10 sw (sp+16),r12 8009aa0: 5b 8d 00 0c sw (sp+12),r13 8009aa4: 5b 8e 00 08 sw (sp+8),r14 8009aa8: 5b 9d 00 04 sw (sp+4),ra STRING_TO_INPUT_TYPE result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 8009aac: 34 05 00 09 mvi r5,9 #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 8009ab0: b8 40 58 00 mv r11,r2 8009ab4: b8 20 68 00 mv r13,r1 8009ab8: b8 60 70 00 mv r14,r3 8009abc: b8 80 60 00 mv r12,r4 STRING_TO_INPUT_TYPE result; char *end; if ( !n ) 8009ac0: 44 40 00 12 be r2,r0,8009b08 return RTEMS_INVALID_ADDRESS; errno = 0; 8009ac4: f8 00 10 14 calli 800db14 <__errno> 8009ac8: 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 ); 8009acc: b9 80 18 00 mv r3,r12 if ( !n ) return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; 8009ad0: 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 ); 8009ad4: b9 a0 08 00 mv r1,r13 8009ad8: 37 82 00 18 addi r2,sp,24 8009adc: f8 00 1d 51 calli 8011020 8009ae0: b8 20 60 00 mv r12,r1 #endif /* If the user wants the end pointer back, then return it. */ if ( endptr ) 8009ae4: 45 c0 00 17 be r14,r0,8009b40 *endptr = end; 8009ae8: 2b 82 00 18 lw r2,(sp+24) 8009aec: 59 c2 00 00 sw (r14+0),r2 /* nothing was converted */ if ( end == s ) return RTEMS_NOT_DEFINED; 8009af0: 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 ) 8009af4: 45 a2 00 05 be r13,r2,8009b08 return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 8009af8: 34 01 ff ff mvi r1,-1 8009afc: 45 81 00 0b be r12,r1,8009b28 #endif #if defined(STRING_TO_POINTER) *n = (STRING_TO_TYPE) (uintptr_t)result; #else *n = (STRING_TO_TYPE) result; 8009b00: 59 6c 00 00 sw (r11+0),r12 #endif return RTEMS_SUCCESSFUL; 8009b04: 34 05 00 00 mvi r5,0 } 8009b08: b8 a0 08 00 mv r1,r5 8009b0c: 2b 9d 00 04 lw ra,(sp+4) 8009b10: 2b 8b 00 14 lw r11,(sp+20) 8009b14: 2b 8c 00 10 lw r12,(sp+16) 8009b18: 2b 8d 00 0c lw r13,(sp+12) 8009b1c: 2b 8e 00 08 lw r14,(sp+8) 8009b20: 37 9c 00 18 addi sp,sp,24 8009b24: c3 a0 00 00 ret return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 8009b28: f8 00 0f fb calli 800db14 <__errno> 8009b2c: 28 22 00 00 lw r2,(r1+0) 8009b30: 34 01 00 22 mvi r1,34 return RTEMS_INVALID_NUMBER; 8009b34: 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)) 8009b38: 5c 41 ff f2 bne r2,r1,8009b00 <== NEVER TAKEN 8009b3c: e3 ff ff f3 bi 8009b08 #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 ) 8009b40: 2b 82 00 18 lw r2,(sp+24) 8009b44: e3 ff ff eb bi 8009af0 =============================================================================== 080099cc : #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 80099cc: 37 9c ff e4 addi sp,sp,-28 80099d0: 5b 8b 00 14 sw (sp+20),r11 80099d4: 5b 8c 00 10 sw (sp+16),r12 80099d8: 5b 8d 00 0c sw (sp+12),r13 80099dc: 5b 8e 00 08 sw (sp+8),r14 80099e0: 5b 9d 00 04 sw (sp+4),ra STRING_TO_INPUT_TYPE result; char *end; if ( !n ) return RTEMS_INVALID_ADDRESS; 80099e4: 34 05 00 09 mvi r5,9 #if defined(STRING_TO_INTEGER) && !defined(STRING_TO_POINTER) , int base #endif ) { 80099e8: b8 40 58 00 mv r11,r2 80099ec: b8 20 68 00 mv r13,r1 80099f0: b8 60 70 00 mv r14,r3 80099f4: b8 80 60 00 mv r12,r4 STRING_TO_INPUT_TYPE result; char *end; if ( !n ) 80099f8: 44 40 00 14 be r2,r0,8009a48 return RTEMS_INVALID_ADDRESS; errno = 0; 80099fc: f8 00 10 46 calli 800db14 <__errno> 8009a00: 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 ); 8009a04: b9 80 18 00 mv r3,r12 if ( !n ) return RTEMS_INVALID_ADDRESS; errno = 0; *n = 0; 8009a08: 59 60 00 00 sw (r11+0),r0 8009a0c: 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 ); 8009a10: b9 a0 08 00 mv r1,r13 8009a14: 37 82 00 1c addi r2,sp,28 8009a18: f8 00 1d 90 calli 8011058 8009a1c: b8 20 60 00 mv r12,r1 #endif /* If the user wants the end pointer back, then return it. */ if ( endptr ) 8009a20: 45 c0 00 1b be r14,r0,8009a8c *endptr = end; 8009a24: 2b 84 00 1c lw r4,(sp+28) 8009a28: 59 c4 00 00 sw (r14+0),r4 /* nothing was converted */ if ( end == s ) return RTEMS_NOT_DEFINED; 8009a2c: 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 ) 8009a30: 45 a4 00 06 be r13,r4,8009a48 return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 8009a34: 34 01 ff ff mvi r1,-1 8009a38: 45 81 00 0c be r12,r1,8009a68 #endif #if defined(STRING_TO_POINTER) *n = (STRING_TO_TYPE) (uintptr_t)result; #else *n = (STRING_TO_TYPE) result; 8009a3c: 59 6c 00 00 sw (r11+0),r12 8009a40: 59 62 00 04 sw (r11+4),r2 #endif return RTEMS_SUCCESSFUL; 8009a44: 34 05 00 00 mvi r5,0 } 8009a48: b8 a0 08 00 mv r1,r5 8009a4c: 2b 9d 00 04 lw ra,(sp+4) 8009a50: 2b 8b 00 14 lw r11,(sp+20) 8009a54: 2b 8c 00 10 lw r12,(sp+16) 8009a58: 2b 8d 00 0c lw r13,(sp+12) 8009a5c: 2b 8e 00 08 lw r14,(sp+8) 8009a60: 37 9c 00 1c addi sp,sp,28 8009a64: c3 a0 00 00 ret return RTEMS_INVALID_NUMBER; #endif #ifdef STRING_TO_MAX /* there was an overflow */ if ( (result == STRING_TO_MAX) && (errno == ERANGE)) 8009a68: 5c 4c ff f5 bne r2,r12,8009a3c <== NEVER TAKEN 8009a6c: 5b 82 00 18 sw (sp+24),r2 8009a70: f8 00 10 29 calli 800db14 <__errno> 8009a74: 28 23 00 00 lw r3,(r1+0) 8009a78: 34 01 00 22 mvi r1,34 return RTEMS_INVALID_NUMBER; 8009a7c: 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)) 8009a80: 2b 82 00 18 lw r2,(sp+24) 8009a84: 5c 61 ff ee bne r3,r1,8009a3c <== NEVER TAKEN 8009a88: e3 ff ff f0 bi 8009a48 #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 ) 8009a8c: 2b 84 00 1c lw r4,(sp+28) 8009a90: e3 ff ff e7 bi 8009a2c =============================================================================== 08000fb8 : int rtems_tarfs_load( char *mountpoint, uint8_t *tar_image, size_t tar_size ) { 8000fb8: 37 9c fe 2c addi sp,sp,-468 8000fbc: 5b 8b 00 44 sw (sp+68),r11 8000fc0: 5b 8c 00 40 sw (sp+64),r12 8000fc4: 5b 8d 00 3c sw (sp+60),r13 8000fc8: 5b 8e 00 38 sw (sp+56),r14 8000fcc: 5b 8f 00 34 sw (sp+52),r15 8000fd0: 5b 90 00 30 sw (sp+48),r16 8000fd4: 5b 91 00 2c sw (sp+44),r17 8000fd8: 5b 92 00 28 sw (sp+40),r18 8000fdc: 5b 93 00 24 sw (sp+36),r19 8000fe0: 5b 94 00 20 sw (sp+32),r20 8000fe4: 5b 95 00 1c sw (sp+28),r21 8000fe8: 5b 96 00 18 sw (sp+24),r22 8000fec: 5b 97 00 14 sw (sp+20),r23 8000ff0: 5b 98 00 10 sw (sp+16),r24 8000ff4: 5b 99 00 0c sw (sp+12),r25 8000ff8: 5b 9b 00 08 sw (sp+8),fp 8000ffc: 5b 9d 00 04 sw (sp+4),ra 8001000: b8 20 c8 00 mv r25,r1 8001004: b8 60 90 00 mv r18,r3 8001008: b8 40 88 00 mv r17,r2 int offset; unsigned long nblocks; IMFS_jnode_t *node; int status; status = rtems_filesystem_evaluate_path( 800100c: f8 00 45 7c calli 80125fc 8001010: b8 20 10 00 mv r2,r1 8001014: 34 03 00 00 mvi r3,0 8001018: bb 20 08 00 mv r1,r25 800101c: 37 84 01 c0 addi r4,sp,448 8001020: 34 05 00 00 mvi r5,0 8001024: f8 00 03 56 calli 8001d7c 8001028: b8 20 b8 00 mv r23,r1 strlen(mountpoint), 0, &root_loc, 0 ); if (status != 0) 800102c: 5c 20 00 4b bne r1,r0,8001158 return -1; if (root_loc.ops != &IMFS_ops && root_loc.ops != &fifoIMFS_ops) 8001030: 2b 81 01 cc lw r1,(sp+460) 8001034: 78 03 08 02 mvhi r3,0x802 8001038: 38 63 1b bc ori r3,r3,0x1bbc 800103c: 34 0b 00 00 mvi r11,0 8001040: 5c 23 00 42 bne r1,r3,8001148 /* * Read a header. */ hdr_ptr = (char *) &tar_image[offset]; offset += 512; if (strncmp(&hdr_ptr[257], "ustar", 5)) 8001044: 78 10 08 02 mvhi r16,0x802 8001048: 3a 10 1c 04 ori r16,r16,0x1c04 break; strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE); 800104c: 37 8e 01 48 addi r14,sp,328 * 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) { 8001050: 34 14 00 35 mvi r20,53 * 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) { 8001054: 34 18 00 30 mvi r24,48 * - 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); 8001058: 37 95 00 48 addi r21,sp,72 if (full_filename[strlen(full_filename)-1] != '/') 800105c: 34 1b 00 2f mvi fp,47 /* * Create an IMFS node structure pointing to tar image memory. */ offset = 0; while (1) { if (offset + 512 > tar_size) 8001060: 35 6c 02 00 addi r12,r11,512 8001064: 55 92 00 3e bgu r12,r18,800115c <== NEVER TAKEN break; /* * Read a header. */ hdr_ptr = (char *) &tar_image[offset]; 8001068: b6 2b 58 00 add r11,r17,r11 offset += 512; if (strncmp(&hdr_ptr[257], "ustar", 5)) 800106c: 35 61 01 01 addi r1,r11,257 8001070: ba 00 10 00 mv r2,r16 8001074: 34 03 00 05 mvi r3,5 8001078: f8 00 45 90 calli 80126b8 800107c: 5c 20 00 38 bne r1,r0,800115c break; strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE); 8001080: 34 03 00 63 mvi r3,99 8001084: b9 60 10 00 mv r2,r11 8001088: b9 c0 08 00 mv r1,r14 800108c: f8 00 45 d8 calli 80127ec filename[MAX_NAME_FIELD_SIZE] = '\0'; linkflag = hdr_ptr[156]; file_mode = _rtems_octal2ulong(&hdr_ptr[100], 8); 8001090: 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'; 8001094: 33 80 01 ab sb (sp+427),r0 linkflag = hdr_ptr[156]; file_mode = _rtems_octal2ulong(&hdr_ptr[100], 8); 8001098: 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]; 800109c: 41 6d 00 9c lbu r13,(r11+156) file_mode = _rtems_octal2ulong(&hdr_ptr[100], 8); 80010a0: f8 00 1b 14 calli 8007cf0 <_rtems_octal2ulong> file_size = _rtems_octal2ulong(&hdr_ptr[124], 12); 80010a4: 34 02 00 0c mvi r2,12 strncpy(filename, hdr_ptr, MAX_NAME_FIELD_SIZE); filename[MAX_NAME_FIELD_SIZE] = '\0'; linkflag = hdr_ptr[156]; file_mode = _rtems_octal2ulong(&hdr_ptr[100], 8); 80010a8: b8 20 b0 00 mv r22,r1 file_size = _rtems_octal2ulong(&hdr_ptr[124], 12); 80010ac: 35 61 00 7c addi r1,r11,124 80010b0: f8 00 1b 10 calli 8007cf0 <_rtems_octal2ulong> 80010b4: b8 20 98 00 mv r19,r1 hdr_chksum = _rtems_octal2ulong(&hdr_ptr[148], 8); 80010b8: 34 02 00 08 mvi r2,8 80010bc: 35 61 00 94 addi r1,r11,148 80010c0: f8 00 1b 0c calli 8007cf0 <_rtems_octal2ulong> 80010c4: b8 20 78 00 mv r15,r1 if (_rtems_tar_header_checksum(hdr_ptr) != hdr_chksum) 80010c8: b9 60 08 00 mv r1,r11 80010cc: f8 00 1c 5d calli 8008240 <_rtems_tar_header_checksum> 80010d0: 5c 2f 00 23 bne r1,r15,800115c <== 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) { 80010d4: 45 b4 00 36 be r13,r20,80011ac * 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) { 80010d8: 45 b8 00 03 be r13,r24,80010e4 0 ); if (status != 0) return -1; if (root_loc.ops != &IMFS_ops && root_loc.ops != &fifoIMFS_ops) 80010dc: b9 80 58 00 mv r11,r12 80010e0: e3 ff ff e0 bi 8001060 * should not have this path. */ else if (linkflag == REGTYPE) { const char *name; loc = root_loc; 80010e4: 2b 84 01 c0 lw r4,(sp+448) if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) { 80010e8: b9 c0 08 00 mv r1,r14 80010ec: 37 82 01 ac addi r2,sp,428 * should not have this path. */ else if (linkflag == REGTYPE) { const char *name; loc = root_loc; 80010f0: 5b 84 01 ac sw (sp+428),r4 80010f4: 2b 84 01 c4 lw r4,(sp+452) if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) { 80010f8: 37 83 01 d4 addi r3,sp,468 * should not have this path. */ else if (linkflag == REGTYPE) { const char *name; loc = root_loc; 80010fc: 5b 84 01 b0 sw (sp+432),r4 8001100: 2b 84 01 c8 lw r4,(sp+456) 8001104: 5b 84 01 b4 sw (sp+436),r4 8001108: 2b 84 01 cc lw r4,(sp+460) 800110c: 5b 84 01 b8 sw (sp+440),r4 8001110: 2b 84 01 d0 lw r4,(sp+464) 8001114: 5b 84 01 bc sw (sp+444),r4 if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) { 8001118: f8 00 1e e5 calli 8008cac 800111c: 44 20 00 38 be r1,r0,80011fc <== ALWAYS TAKEN ); node->info.linearfile.size = file_size; node->info.linearfile.direct = &tar_image[offset]; } nblocks = (((file_size) + 511) & ~511) / 512; 8001120: 34 03 fe 00 mvi r3,-512 <== NOT EXECUTED 8001124: 36 61 01 ff addi r1,r19,511 <== NOT EXECUTED 8001128: 34 02 00 09 mvi r2,9 <== NOT EXECUTED 800112c: a0 23 08 00 and r1,r1,r3 <== NOT EXECUTED 8001130: f8 00 75 29 calli 801e5d4 <__lshrsi3> <== NOT EXECUTED offset += 512 * nblocks; 8001134: 34 02 00 09 mvi r2,9 <== NOT EXECUTED 8001138: f8 00 74 d9 calli 801e49c <__ashlsi3> <== NOT EXECUTED 800113c: b4 2c 60 00 add r12,r1,r12 <== NOT EXECUTED 0 ); if (status != 0) return -1; if (root_loc.ops != &IMFS_ops && root_loc.ops != &fifoIMFS_ops) 8001140: b9 80 58 00 mv r11,r12 8001144: e3 ff ff c7 bi 8001060 8001148: 78 02 08 02 mvhi r2,0x802 800114c: 38 42 24 24 ori r2,r2,0x2424 8001150: ba e0 58 00 mv r11,r23 8001154: 44 22 ff bc be r1,r2,8001044 <== NEVER TAKEN return -1; 8001158: 34 17 ff ff mvi r23,-1 nblocks = (((file_size) + 511) & ~511) / 512; offset += 512 * nblocks; } } return status; } 800115c: ba e0 08 00 mv r1,r23 8001160: 2b 9d 00 04 lw ra,(sp+4) 8001164: 2b 8b 00 44 lw r11,(sp+68) 8001168: 2b 8c 00 40 lw r12,(sp+64) 800116c: 2b 8d 00 3c lw r13,(sp+60) 8001170: 2b 8e 00 38 lw r14,(sp+56) 8001174: 2b 8f 00 34 lw r15,(sp+52) 8001178: 2b 90 00 30 lw r16,(sp+48) 800117c: 2b 91 00 2c lw r17,(sp+44) 8001180: 2b 92 00 28 lw r18,(sp+40) 8001184: 2b 93 00 24 lw r19,(sp+36) 8001188: 2b 94 00 20 lw r20,(sp+32) 800118c: 2b 95 00 1c lw r21,(sp+28) 8001190: 2b 96 00 18 lw r22,(sp+24) 8001194: 2b 97 00 14 lw r23,(sp+20) 8001198: 2b 98 00 10 lw r24,(sp+16) 800119c: 2b 99 00 0c lw r25,(sp+12) 80011a0: 2b 9b 00 08 lw fp,(sp+8) 80011a4: 37 9c 01 d4 addi sp,sp,468 80011a8: c3 a0 00 00 ret * - 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); 80011ac: bb 20 10 00 mv r2,r25 80011b0: ba a0 08 00 mv r1,r21 80011b4: f8 00 43 de calli 801212c if (full_filename[strlen(full_filename)-1] != '/') 80011b8: ba a0 08 00 mv r1,r21 80011bc: f8 00 45 10 calli 80125fc 80011c0: 37 82 00 47 addi r2,sp,71 80011c4: b4 41 18 00 add r3,r2,r1 80011c8: 40 63 00 00 lbu r3,(r3+0) 80011cc: 44 7b 00 04 be r3,fp,80011dc <== ALWAYS TAKEN strcat(full_filename, "/"); 80011d0: b6 a1 08 00 add r1,r21,r1 <== NOT EXECUTED 80011d4: 30 3b 00 00 sb (r1+0),fp <== NOT EXECUTED 80011d8: 30 20 00 01 sb (r1+1),r0 <== NOT EXECUTED strcat(full_filename, filename); 80011dc: b9 c0 10 00 mv r2,r14 80011e0: ba a0 08 00 mv r1,r21 80011e4: f8 00 43 7b calli 8011fd0 mkdir(full_filename, S_IRWXU | S_IRWXG | S_IRWXO); 80011e8: ba a0 08 00 mv r1,r21 80011ec: 34 02 01 ff mvi r2,511 80011f0: f8 00 05 bb calli 80028dc 0 ); if (status != 0) return -1; if (root_loc.ops != &IMFS_ops && root_loc.ops != &fifoIMFS_ops) 80011f4: b9 80 58 00 mv r11,r12 80011f8: e3 ff ff 9a bi 8001060 else if (linkflag == REGTYPE) { const char *name; loc = root_loc; if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) { node = IMFS_create_node( 80011fc: 2b 83 01 d4 lw r3,(sp+468) &loc, IMFS_LINEAR_FILE, (char *)name, (file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG, 8001200: 22 c4 01 ff andi r4,r22,0x1ff else if (linkflag == REGTYPE) { const char *name; loc = root_loc; if (IMFS_evaluate_for_make(filename, &loc, &name) == 0) { node = IMFS_create_node( 8001204: 38 84 80 00 ori r4,r4,0x8000 8001208: 34 05 00 00 mvi r5,0 800120c: 34 02 00 06 mvi r2,6 8001210: 37 81 01 ac addi r1,sp,428 8001214: f8 00 1c b4 calli 80084e4 IMFS_LINEAR_FILE, (char *)name, (file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG, NULL ); node->info.linearfile.size = file_size; node->info.linearfile.direct = &tar_image[offset]; 8001218: b6 2c 10 00 add r2,r17,r12 800121c: 58 22 00 58 sw (r1+88),r2 } nblocks = (((file_size) + 511) & ~511) / 512; 8001220: 34 03 fe 00 mvi r3,-512 &loc, IMFS_LINEAR_FILE, (char *)name, (file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG, NULL ); node->info.linearfile.size = file_size; 8001224: 58 20 00 50 sw (r1+80),r0 8001228: 58 33 00 54 sw (r1+84),r19 node->info.linearfile.direct = &tar_image[offset]; } nblocks = (((file_size) + 511) & ~511) / 512; 800122c: 36 61 01 ff addi r1,r19,511 8001230: 34 02 00 09 mvi r2,9 8001234: a0 23 08 00 and r1,r1,r3 8001238: f8 00 74 e7 calli 801e5d4 <__lshrsi3> offset += 512 * nblocks; 800123c: 34 02 00 09 mvi r2,9 8001240: f8 00 74 97 calli 801e49c <__ashlsi3> 8001244: b4 2c 60 00 add r12,r1,r12 8001248: e3 ff ff be bi 8001140 =============================================================================== 0800c754 : rtems_status_code rtems_task_mode( rtems_mode mode_set, rtems_mode mask, rtems_mode *previous_mode_set ) { 800c754: 37 9c ff dc addi sp,sp,-36 800c758: 5b 8b 00 24 sw (sp+36),r11 800c75c: 5b 8c 00 20 sw (sp+32),r12 800c760: 5b 8d 00 1c sw (sp+28),r13 800c764: 5b 8e 00 18 sw (sp+24),r14 800c768: 5b 8f 00 14 sw (sp+20),r15 800c76c: 5b 90 00 10 sw (sp+16),r16 800c770: 5b 91 00 0c sw (sp+12),r17 800c774: 5b 92 00 08 sw (sp+8),r18 800c778: 5b 9d 00 04 sw (sp+4),ra 800c77c: b8 40 70 00 mv r14,r2 800c780: b8 60 88 00 mv r17,r3 800c784: b8 20 80 00 mv r16,r1 bool is_asr_enabled = false; bool needs_asr_dispatching = false; rtems_mode old_mode; if ( !previous_mode_set ) return RTEMS_INVALID_ADDRESS; 800c788: 34 02 00 09 mvi r2,9 ASR_Information *asr; bool is_asr_enabled = false; bool needs_asr_dispatching = false; rtems_mode old_mode; if ( !previous_mode_set ) 800c78c: 44 60 00 46 be r3,r0,800c8a4 return RTEMS_INVALID_ADDRESS; executing = _Thread_Executing; 800c790: 78 0f 08 01 mvhi r15,0x801 800c794: 39 ef 4d b4 ori r15,r15,0x4db4 800c798: 29 eb 00 0c lw r11,(r15+12) api = executing->API_Extensions[ THREAD_API_RTEMS ]; asr = &api->Signal; old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT; 800c79c: 41 6d 00 74 lbu r13,(r11+116) if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE ) 800c7a0: 29 61 00 7c lw r1,(r11+124) if ( !previous_mode_set ) return RTEMS_INVALID_ADDRESS; executing = _Thread_Executing; api = executing->API_Extensions[ THREAD_API_RTEMS ]; 800c7a4: 29 6c 01 1c lw r12,(r11+284) asr = &api->Signal; old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT; 800c7a8: 65 ad 00 00 cmpei r13,r13,0 800c7ac: b5 ad 20 00 add r4,r13,r13 800c7b0: b4 84 20 00 add r4,r4,r4 800c7b4: b4 84 20 00 add r4,r4,r4 800c7b8: b4 84 20 00 add r4,r4,r4 800c7bc: b4 84 20 00 add r4,r4,r4 800c7c0: b4 84 20 00 add r4,r4,r4 800c7c4: b4 84 20 00 add r4,r4,r4 800c7c8: b4 84 68 00 add r13,r4,r4 if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE ) 800c7cc: 5c 20 00 42 bne r1,r0,800c8d4 old_mode |= RTEMS_NO_TIMESLICE; else old_mode |= RTEMS_TIMESLICE; old_mode |= (asr->is_enabled) ? RTEMS_ASR : RTEMS_NO_ASR; 800c7d0: 41 92 00 08 lbu r18,(r12+8) old_mode |= _ISR_Get_level(); 800c7d4: fb ff ea 67 calli 8007170 <_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; 800c7d8: 66 52 00 00 cmpei r18,r18,0 800c7dc: c8 12 90 00 sub r18,r0,r18 800c7e0: 22 52 04 00 andi r18,r18,0x400 800c7e4: ba 41 08 00 or r1,r18,r1 old_mode |= _ISR_Get_level(); 800c7e8: b8 2d 68 00 or r13,r1,r13 *previous_mode_set = old_mode; 800c7ec: 5a 2d 00 00 sw (r17+0),r13 /* * These are generic thread scheduling characteristics. */ if ( mask & RTEMS_PREEMPT_MASK ) 800c7f0: 21 c1 01 00 andi r1,r14,0x100 800c7f4: 44 20 00 04 be r1,r0,800c804 */ RTEMS_INLINE_ROUTINE bool _Modes_Is_preempt ( Modes_Control mode_set ) { return (mode_set & RTEMS_PREEMPT_MASK) == RTEMS_PREEMPT; 800c7f8: 22 01 01 00 andi r1,r16,0x100 executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false; 800c7fc: 64 21 00 00 cmpei r1,r1,0 800c800: 31 61 00 74 sb (r11+116),r1 if ( mask & RTEMS_TIMESLICE_MASK ) { 800c804: 21 c1 02 00 andi r1,r14,0x200 800c808: 44 20 00 09 be r1,r0,800c82c */ RTEMS_INLINE_ROUTINE bool _Modes_Is_timeslice ( Modes_Control mode_set ) { return (mode_set & RTEMS_TIMESLICE_MASK) == RTEMS_TIMESLICE; 800c80c: 22 01 02 00 andi r1,r16,0x200 if ( _Modes_Is_timeslice(mode_set) ) { 800c810: 44 20 00 3e be r1,r0,800c908 executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; executing->cpu_time_budget = _Thread_Ticks_per_timeslice; 800c814: 78 01 08 01 mvhi r1,0x801 800c818: 38 21 48 80 ori r1,r1,0x4880 800c81c: 28 22 00 00 lw r2,(r1+0) if ( mask & RTEMS_PREEMPT_MASK ) executing->is_preemptible = _Modes_Is_preempt(mode_set) ? true : false; if ( mask & RTEMS_TIMESLICE_MASK ) { if ( _Modes_Is_timeslice(mode_set) ) { executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; 800c820: 34 01 00 01 mvi r1,1 800c824: 59 61 00 7c sw (r11+124),r1 executing->cpu_time_budget = _Thread_Ticks_per_timeslice; 800c828: 59 62 00 78 sw (r11+120),r2 } /* * Set the new interrupt level */ if ( mask & RTEMS_INTERRUPT_MASK ) 800c82c: 21 c1 00 01 andi r1,r14,0x1 800c830: 44 20 00 04 be r1,r0,800c840 */ RTEMS_INLINE_ROUTINE ISR_Level _Modes_Get_interrupt_level ( Modes_Control mode_set ) { return ( mode_set & RTEMS_INTERRUPT_MASK ); 800c834: 22 01 00 01 andi r1,r16,0x1 */ RTEMS_INLINE_ROUTINE void _Modes_Set_interrupt_level ( Modes_Control mode_set ) { _ISR_Set_level( _Modes_Get_interrupt_level( mode_set ) ); 800c838: 64 21 00 00 cmpei r1,r1,0 800c83c: 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 ) { 800c840: 21 ce 04 00 andi r14,r14,0x400 /* * This is specific to the RTEMS API */ is_asr_enabled = false; needs_asr_dispatching = false; 800c844: 34 04 00 00 mvi r4,0 if ( mask & RTEMS_ASR_MASK ) { 800c848: 45 c0 00 11 be r14,r0,800c88c */ RTEMS_INLINE_ROUTINE bool _Modes_Is_asr_disabled ( Modes_Control mode_set ) { return (mode_set & RTEMS_ASR_MASK) == RTEMS_NO_ASR; 800c84c: 22 10 04 00 andi r16,r16,0x400 is_asr_enabled = _Modes_Is_asr_disabled( mode_set ) ? false : true; if ( is_asr_enabled != asr->is_enabled ) { 800c850: 41 81 00 08 lbu r1,(r12+8) * Output: * *previous_mode_set - previous mode set * always return RTEMS_SUCCESSFUL; */ rtems_status_code rtems_task_mode( 800c854: 66 10 00 00 cmpei r16,r16,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 ) { 800c858: 44 30 00 0d be r1,r16,800c88c asr->is_enabled = is_asr_enabled; 800c85c: 31 90 00 08 sb (r12+8),r16 ) { rtems_signal_set _signals; ISR_Level _level; _ISR_Disable( _level ); 800c860: 90 00 08 00 rcsr r1,IE 800c864: 34 02 ff fe mvi r2,-2 800c868: a0 22 10 00 and r2,r1,r2 800c86c: d0 02 00 00 wcsr IE,r2 _signals = information->signals_pending; 800c870: 29 83 00 18 lw r3,(r12+24) information->signals_pending = information->signals_posted; 800c874: 29 82 00 14 lw r2,(r12+20) information->signals_posted = _signals; 800c878: 59 83 00 14 sw (r12+20),r3 rtems_signal_set _signals; ISR_Level _level; _ISR_Disable( _level ); _signals = information->signals_pending; information->signals_pending = information->signals_posted; 800c87c: 59 82 00 18 sw (r12+24),r2 information->signals_posted = _signals; _ISR_Enable( _level ); 800c880: d0 01 00 00 wcsr IE,r1 _ASR_Swap_signals( asr ); if ( _ASR_Are_signals_pending( asr ) ) { 800c884: 29 84 00 14 lw r4,(r12+20) /* * This is specific to the RTEMS API */ is_asr_enabled = false; needs_asr_dispatching = false; 800c888: 7c 84 00 00 cmpnei r4,r4,0 needs_asr_dispatching = true; } } } if ( _System_state_Is_up( _System_state_Get() ) ) { 800c88c: 78 01 08 01 mvhi r1,0x801 800c890: 38 21 4a 60 ori r1,r1,0x4a60 800c894: 28 23 00 00 lw r3,(r1+0) 800c898: 34 01 00 03 mvi r1,3 if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) ) _Thread_Dispatch(); } return RTEMS_SUCCESSFUL; 800c89c: 34 02 00 00 mvi r2,0 needs_asr_dispatching = true; } } } if ( _System_state_Is_up( _System_state_Get() ) ) { 800c8a0: 44 61 00 0f be r3,r1,800c8dc <== ALWAYS TAKEN if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) ) _Thread_Dispatch(); } return RTEMS_SUCCESSFUL; } 800c8a4: b8 40 08 00 mv r1,r2 800c8a8: 2b 9d 00 04 lw ra,(sp+4) 800c8ac: 2b 8b 00 24 lw r11,(sp+36) 800c8b0: 2b 8c 00 20 lw r12,(sp+32) 800c8b4: 2b 8d 00 1c lw r13,(sp+28) 800c8b8: 2b 8e 00 18 lw r14,(sp+24) 800c8bc: 2b 8f 00 14 lw r15,(sp+20) 800c8c0: 2b 90 00 10 lw r16,(sp+16) 800c8c4: 2b 91 00 0c lw r17,(sp+12) 800c8c8: 2b 92 00 08 lw r18,(sp+8) 800c8cc: 37 9c 00 24 addi sp,sp,36 800c8d0: c3 a0 00 00 ret old_mode = (executing->is_preemptible) ? RTEMS_PREEMPT : RTEMS_NO_PREEMPT; if ( executing->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_NONE ) old_mode |= RTEMS_NO_TIMESLICE; else old_mode |= RTEMS_TIMESLICE; 800c8d4: 39 ad 02 00 ori r13,r13,0x200 800c8d8: e3 ff ff be bi 800c7d0 bool are_signals_pending ) { Thread_Control *executing; executing = _Thread_Executing; 800c8dc: 29 e1 00 0c lw r1,(r15+12) if ( are_signals_pending || 800c8e0: 5c 80 00 05 bne r4,r0,800c8f4 800c8e4: 29 e3 00 10 lw r3,(r15+16) 800c8e8: 44 23 ff ef be r1,r3,800c8a4 (!_Thread_Is_heir( executing ) && executing->is_preemptible) ) { 800c8ec: 40 21 00 74 lbu r1,(r1+116) 800c8f0: 44 20 ff ed be r1,r0,800c8a4 <== NEVER TAKEN _Thread_Dispatch_necessary = true; 800c8f4: 34 01 00 01 mvi r1,1 800c8f8: 31 e1 00 18 sb (r15+24),r1 } } if ( _System_state_Is_up( _System_state_Get() ) ) { if (_Thread_Evaluate_is_dispatch_needed( needs_asr_dispatching ) ) _Thread_Dispatch(); 800c8fc: fb ff e3 85 calli 8005710 <_Thread_Dispatch> } return RTEMS_SUCCESSFUL; 800c900: 34 02 00 00 mvi r2,0 800c904: e3 ff ff e8 bi 800c8a4 if ( mask & RTEMS_TIMESLICE_MASK ) { if ( _Modes_Is_timeslice(mode_set) ) { executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE; executing->cpu_time_budget = _Thread_Ticks_per_timeslice; } else executing->budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; 800c908: 59 60 00 7c sw (r11+124),r0 } /* * Set the new interrupt level */ if ( mask & RTEMS_INTERRUPT_MASK ) 800c90c: 21 c1 00 01 andi r1,r14,0x1 800c910: 44 20 ff cc be r1,r0,800c840 800c914: e3 ff ff c8 bi 800c834 =============================================================================== 08008bdc : rtems_status_code rtems_task_set_priority( rtems_id id, rtems_task_priority new_priority, rtems_task_priority *old_priority ) { 8008bdc: 37 9c ff f0 addi sp,sp,-16 8008be0: 5b 8b 00 0c sw (sp+12),r11 8008be4: 5b 8c 00 08 sw (sp+8),r12 8008be8: 5b 9d 00 04 sw (sp+4),ra 8008bec: b8 40 58 00 mv r11,r2 8008bf0: b8 60 60 00 mv r12,r3 register Thread_Control *the_thread; Objects_Locations location; if ( new_priority != RTEMS_CURRENT_PRIORITY && 8008bf4: 44 40 00 06 be r2,r0,8008c0c 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 ) ); 8008bf8: 78 02 08 01 mvhi r2,0x801 8008bfc: 38 42 b0 c0 ori r2,r2,0xb0c0 8008c00: 40 42 00 00 lbu r2,(r2+0) !_RTEMS_tasks_Priority_is_valid( new_priority ) ) return RTEMS_INVALID_PRIORITY; 8008c04: 34 04 00 13 mvi r4,19 */ RTEMS_INLINE_ROUTINE bool _RTEMS_tasks_Priority_is_valid ( rtems_task_priority the_priority ) { return ( ( the_priority >= RTEMS_MINIMUM_PRIORITY ) && 8008c08: 55 62 00 08 bgu r11,r2,8008c28 if ( !old_priority ) return RTEMS_INVALID_ADDRESS; 8008c0c: 34 04 00 09 mvi r4,9 if ( new_priority != RTEMS_CURRENT_PRIORITY && !_RTEMS_tasks_Priority_is_valid( new_priority ) ) return RTEMS_INVALID_PRIORITY; if ( !old_priority ) 8008c10: 45 80 00 06 be r12,r0,8008c28 return RTEMS_INVALID_ADDRESS; the_thread = _Thread_Get( id, &location ); 8008c14: 37 82 00 10 addi r2,sp,16 8008c18: f8 00 0a bc calli 800b708 <_Thread_Get> switch ( location ) { 8008c1c: 2b 82 00 10 lw r2,(sp+16) case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 8008c20: 34 04 00 04 mvi r4,4 if ( !old_priority ) return RTEMS_INVALID_ADDRESS; the_thread = _Thread_Get( id, &location ); switch ( location ) { 8008c24: 44 40 00 07 be r2,r0,8008c40 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 8008c28: b8 80 08 00 mv r1,r4 8008c2c: 2b 9d 00 04 lw ra,(sp+4) 8008c30: 2b 8b 00 0c lw r11,(sp+12) 8008c34: 2b 8c 00 08 lw r12,(sp+8) 8008c38: 37 9c 00 10 addi sp,sp,16 8008c3c: c3 a0 00 00 ret the_thread = _Thread_Get( id, &location ); switch ( location ) { case OBJECTS_LOCAL: /* XXX need helper to "convert" from core priority */ *old_priority = the_thread->current_priority; 8008c40: 28 23 00 14 lw r3,(r1+20) 8008c44: 59 83 00 00 sw (r12+0),r3 if ( new_priority != RTEMS_CURRENT_PRIORITY ) { 8008c48: 45 62 00 09 be r11,r2,8008c6c the_thread->real_priority = new_priority; if ( the_thread->resource_count == 0 || 8008c4c: 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; 8008c50: 58 2b 00 18 sw (r1+24),r11 if ( the_thread->resource_count == 0 || 8008c54: 44 40 00 03 be r2,r0,8008c60 8008c58: 28 22 00 14 lw r2,(r1+20) 8008c5c: 51 62 00 04 bgeu r11,r2,8008c6c <== ALWAYS TAKEN the_thread->current_priority > new_priority ) _Thread_Change_priority( the_thread, new_priority, false ); 8008c60: b9 60 10 00 mv r2,r11 8008c64: 34 03 00 00 mvi r3,0 8008c68: f8 00 09 1e calli 800b0e0 <_Thread_Change_priority> } _Thread_Enable_dispatch(); 8008c6c: f8 00 0a 9a calli 800b6d4 <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 8008c70: 34 04 00 00 mvi r4,0 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 8008c74: b8 80 08 00 mv r1,r4 8008c78: 2b 9d 00 04 lw ra,(sp+4) 8008c7c: 2b 8b 00 0c lw r11,(sp+12) 8008c80: 2b 8c 00 08 lw r12,(sp+8) 8008c84: 37 9c 00 10 addi sp,sp,16 8008c88: c3 a0 00 00 ret =============================================================================== 08003248 : rtems_status_code rtems_task_start( rtems_id id, rtems_task_entry entry_point, rtems_task_argument argument ) { 8003248: 37 9c ff ec addi sp,sp,-20 800324c: 5b 8b 00 10 sw (sp+16),r11 8003250: 5b 8c 00 0c sw (sp+12),r12 8003254: 5b 8d 00 08 sw (sp+8),r13 8003258: 5b 9d 00 04 sw (sp+4),ra register Thread_Control *the_thread; Objects_Locations location; if ( entry_point == NULL ) return RTEMS_INVALID_ADDRESS; 800325c: 34 04 00 09 mvi r4,9 rtems_status_code rtems_task_start( rtems_id id, rtems_task_entry entry_point, rtems_task_argument argument ) { 8003260: b8 40 58 00 mv r11,r2 8003264: b8 60 68 00 mv r13,r3 register Thread_Control *the_thread; Objects_Locations location; if ( entry_point == NULL ) 8003268: 44 40 00 06 be r2,r0,8003280 <== NEVER TAKEN return RTEMS_INVALID_ADDRESS; the_thread = _Thread_Get( id, &location ); 800326c: 37 82 00 14 addi r2,sp,20 8003270: f8 00 09 a3 calli 80058fc <_Thread_Get> switch ( location ) { 8003274: 2b 8c 00 14 lw r12,(sp+20) case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 8003278: 34 04 00 04 mvi r4,4 if ( entry_point == NULL ) return RTEMS_INVALID_ADDRESS; the_thread = _Thread_Get( id, &location ); switch ( location ) { 800327c: 45 80 00 08 be r12,r0,800329c case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 8003280: b8 80 08 00 mv r1,r4 8003284: 2b 9d 00 04 lw ra,(sp+4) 8003288: 2b 8b 00 10 lw r11,(sp+16) 800328c: 2b 8c 00 0c lw r12,(sp+12) 8003290: 2b 8d 00 08 lw r13,(sp+8) 8003294: 37 9c 00 14 addi sp,sp,20 8003298: c3 a0 00 00 ret the_thread = _Thread_Get( id, &location ); switch ( location ) { case OBJECTS_LOCAL: if ( _Thread_Start( 800329c: 34 02 00 00 mvi r2,0 80032a0: b9 60 18 00 mv r3,r11 80032a4: 34 04 00 00 mvi r4,0 80032a8: b9 a0 28 00 mv r5,r13 80032ac: f8 00 0c b6 calli 8006584 <_Thread_Start> 80032b0: 5c 2c 00 0a bne r1,r12,80032d8 the_thread, THREAD_START_NUMERIC, entry_point, NULL, argument ) ) { _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } _Thread_Enable_dispatch(); 80032b4: f8 00 09 85 calli 80058c8 <_Thread_Enable_dispatch> return RTEMS_INCORRECT_STATE; 80032b8: 34 04 00 0e mvi r4,14 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 80032bc: b8 80 08 00 mv r1,r4 80032c0: 2b 9d 00 04 lw ra,(sp+4) 80032c4: 2b 8b 00 10 lw r11,(sp+16) 80032c8: 2b 8c 00 0c lw r12,(sp+12) 80032cc: 2b 8d 00 08 lw r13,(sp+8) 80032d0: 37 9c 00 14 addi sp,sp,20 80032d4: c3 a0 00 00 ret switch ( location ) { case OBJECTS_LOCAL: if ( _Thread_Start( the_thread, THREAD_START_NUMERIC, entry_point, NULL, argument ) ) { _Thread_Enable_dispatch(); 80032d8: f8 00 09 7c calli 80058c8 <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 80032dc: 34 04 00 00 mvi r4,0 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 80032e0: b8 80 08 00 mv r1,r4 80032e4: 2b 9d 00 04 lw ra,(sp+4) 80032e8: 2b 8b 00 10 lw r11,(sp+16) 80032ec: 2b 8c 00 0c lw r12,(sp+12) 80032f0: 2b 8d 00 08 lw r13,(sp+8) 80032f4: 37 9c 00 14 addi sp,sp,20 80032f8: c3 a0 00 00 ret =============================================================================== 08004118 : rtems_status_code rtems_task_variable_add( rtems_id tid, void **ptr, void (*dtor)(void *) ) { 8004118: 37 9c ff ec addi sp,sp,-20 800411c: 5b 8b 00 10 sw (sp+16),r11 8004120: 5b 8c 00 0c sw (sp+12),r12 8004124: 5b 8d 00 08 sw (sp+8),r13 8004128: 5b 9d 00 04 sw (sp+4),ra 800412c: b8 40 58 00 mv r11,r2 8004130: b8 60 68 00 mv r13,r3 Thread_Control *the_thread; Objects_Locations location; rtems_task_variable_t *tvp, *new; if ( !ptr ) return RTEMS_INVALID_ADDRESS; 8004134: 34 02 00 09 mvi r2,9 { Thread_Control *the_thread; Objects_Locations location; rtems_task_variable_t *tvp, *new; if ( !ptr ) 8004138: 45 60 00 07 be r11,r0,8004154 return RTEMS_INVALID_ADDRESS; the_thread = _Thread_Get (tid, &location); 800413c: 37 82 00 14 addi r2,sp,20 8004140: f8 00 09 a3 calli 80067cc <_Thread_Get> 8004144: b8 20 60 00 mv r12,r1 switch (location) { 8004148: 2b 81 00 14 lw r1,(sp+20) #endif case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 800414c: 34 02 00 04 mvi r2,4 if ( !ptr ) return RTEMS_INVALID_ADDRESS; the_thread = _Thread_Get (tid, &location); switch (location) { 8004150: 44 20 00 08 be r1,r0,8004170 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 8004154: b8 40 08 00 mv r1,r2 8004158: 2b 9d 00 04 lw ra,(sp+4) 800415c: 2b 8b 00 10 lw r11,(sp+16) 8004160: 2b 8c 00 0c lw r12,(sp+12) 8004164: 2b 8d 00 08 lw r13,(sp+8) 8004168: 37 9c 00 14 addi sp,sp,20 800416c: c3 a0 00 00 ret case OBJECTS_LOCAL: /* * Figure out if the variable is already in this task's list. */ tvp = the_thread->task_variables; 8004170: 29 84 01 28 lw r4,(r12+296) while (tvp) { 8004174: 44 81 00 08 be r4,r1,8004194 if (tvp->ptr == ptr) { 8004178: 28 81 00 04 lw r1,(r4+4) 800417c: 5c 2b 00 04 bne r1,r11,800418c 8004180: e0 00 00 18 bi 80041e0 8004184: 28 82 00 04 lw r2,(r4+4) 8004188: 44 4b 00 16 be r2,r11,80041e0 <== NEVER TAKEN tvp->dtor = dtor; _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } tvp = (rtems_task_variable_t *)tvp->next; 800418c: 28 84 00 00 lw r4,(r4+0) case OBJECTS_LOCAL: /* * Figure out if the variable is already in this task's list. */ tvp = the_thread->task_variables; while (tvp) { 8004190: 5c 80 ff fd bne r4,r0,8004184 /* * Now allocate memory for this task variable. */ new = (rtems_task_variable_t *) _Workspace_Allocate(sizeof(rtems_task_variable_t)); 8004194: 34 01 00 14 mvi r1,20 8004198: f8 00 0f 07 calli 8007db4 <_Workspace_Allocate> if (new == NULL) { 800419c: 44 20 00 1b be r1,r0,8004208 } new->gval = *ptr; new->ptr = ptr; new->dtor = dtor; new->next = (struct rtems_task_variable_tt *)the_thread->task_variables; 80041a0: 29 82 01 28 lw r2,(r12+296) _Workspace_Allocate(sizeof(rtems_task_variable_t)); if (new == NULL) { _Thread_Enable_dispatch(); return RTEMS_NO_MEMORY; } new->gval = *ptr; 80041a4: 29 63 00 00 lw r3,(r11+0) new->ptr = ptr; 80041a8: 58 2b 00 04 sw (r1+4),r11 new->dtor = dtor; 80041ac: 58 2d 00 10 sw (r1+16),r13 _Workspace_Allocate(sizeof(rtems_task_variable_t)); if (new == NULL) { _Thread_Enable_dispatch(); return RTEMS_NO_MEMORY; } new->gval = *ptr; 80041b0: 58 23 00 08 sw (r1+8),r3 new->ptr = ptr; new->dtor = dtor; new->next = (struct rtems_task_variable_tt *)the_thread->task_variables; 80041b4: 58 22 00 00 sw (r1+0),r2 the_thread->task_variables = new; 80041b8: 59 81 01 28 sw (r12+296),r1 _Thread_Enable_dispatch(); 80041bc: f8 00 09 77 calli 8006798 <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 80041c0: 34 02 00 00 mvi r2,0 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 80041c4: b8 40 08 00 mv r1,r2 80041c8: 2b 9d 00 04 lw ra,(sp+4) 80041cc: 2b 8b 00 10 lw r11,(sp+16) 80041d0: 2b 8c 00 0c lw r12,(sp+12) 80041d4: 2b 8d 00 08 lw r13,(sp+8) 80041d8: 37 9c 00 14 addi sp,sp,20 80041dc: c3 a0 00 00 ret * Figure out if the variable is already in this task's list. */ tvp = the_thread->task_variables; while (tvp) { if (tvp->ptr == ptr) { tvp->dtor = dtor; 80041e0: 58 8d 00 10 sw (r4+16),r13 _Thread_Enable_dispatch(); 80041e4: f8 00 09 6d calli 8006798 <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 80041e8: 34 02 00 00 mvi r2,0 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 80041ec: b8 40 08 00 mv r1,r2 80041f0: 2b 9d 00 04 lw ra,(sp+4) 80041f4: 2b 8b 00 10 lw r11,(sp+16) 80041f8: 2b 8c 00 0c lw r12,(sp+12) 80041fc: 2b 8d 00 08 lw r13,(sp+8) 8004200: 37 9c 00 14 addi sp,sp,20 8004204: c3 a0 00 00 ret * Now allocate memory for this task variable. */ new = (rtems_task_variable_t *) _Workspace_Allocate(sizeof(rtems_task_variable_t)); if (new == NULL) { _Thread_Enable_dispatch(); 8004208: f8 00 09 64 calli 8006798 <_Thread_Enable_dispatch> return RTEMS_NO_MEMORY; 800420c: 34 02 00 1a mvi r2,26 8004210: e3 ff ff d1 bi 8004154 =============================================================================== 08004214 : rtems_status_code rtems_task_variable_delete( rtems_id tid, void **ptr ) { 8004214: 37 9c ff f4 addi sp,sp,-12 8004218: 5b 8b 00 08 sw (sp+8),r11 800421c: 5b 9d 00 04 sw (sp+4),ra 8004220: b8 40 58 00 mv r11,r2 Thread_Control *the_thread; Objects_Locations location; rtems_task_variable_t *tvp, *prev; if ( !ptr ) return RTEMS_INVALID_ADDRESS; 8004224: 34 02 00 09 mvi r2,9 { Thread_Control *the_thread; Objects_Locations location; rtems_task_variable_t *tvp, *prev; if ( !ptr ) 8004228: 45 60 00 06 be r11,r0,8004240 return RTEMS_INVALID_ADDRESS; prev = NULL; the_thread = _Thread_Get (tid, &location); 800422c: 37 82 00 0c addi r2,sp,12 8004230: f8 00 09 67 calli 80067cc <_Thread_Get> switch (location) { 8004234: 2b 82 00 0c lw r2,(sp+12) 8004238: 44 40 00 07 be r2,r0,8004254 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 800423c: 34 02 00 04 mvi r2,4 } 8004240: b8 40 08 00 mv r1,r2 8004244: 2b 9d 00 04 lw ra,(sp+4) 8004248: 2b 8b 00 08 lw r11,(sp+8) 800424c: 37 9c 00 0c addi sp,sp,12 8004250: c3 a0 00 00 ret the_thread = _Thread_Get (tid, &location); switch (location) { case OBJECTS_LOCAL: tvp = the_thread->task_variables; 8004254: 28 24 01 28 lw r4,(r1+296) while (tvp) { 8004258: 44 82 00 09 be r4,r2,800427c if (tvp->ptr == ptr) { 800425c: 28 82 00 04 lw r2,(r4+4) 8004260: 5c 4b 00 05 bne r2,r11,8004274 8004264: e0 00 00 18 bi 80042c4 8004268: 28 62 00 04 lw r2,(r3+4) 800426c: 44 4b 00 0b be r2,r11,8004298 8004270: b8 60 20 00 mv r4,r3 _RTEMS_Tasks_Invoke_task_variable_dtor( the_thread, tvp ); _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } prev = tvp; tvp = (rtems_task_variable_t *)tvp->next; 8004274: 28 83 00 00 lw r3,(r4+0) the_thread = _Thread_Get (tid, &location); switch (location) { case OBJECTS_LOCAL: tvp = the_thread->task_variables; while (tvp) { 8004278: 5c 60 ff fc bne r3,r0,8004268 <== ALWAYS TAKEN return RTEMS_SUCCESSFUL; } prev = tvp; tvp = (rtems_task_variable_t *)tvp->next; } _Thread_Enable_dispatch(); 800427c: f8 00 09 47 calli 8006798 <_Thread_Enable_dispatch> return RTEMS_INVALID_ADDRESS; 8004280: 34 02 00 09 mvi r2,9 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 8004284: b8 40 08 00 mv r1,r2 8004288: 2b 9d 00 04 lw ra,(sp+4) 800428c: 2b 8b 00 08 lw r11,(sp+8) 8004290: 37 9c 00 0c addi sp,sp,12 8004294: c3 a0 00 00 ret case OBJECTS_LOCAL: tvp = the_thread->task_variables; while (tvp) { if (tvp->ptr == ptr) { if (prev) prev->next = tvp->next; 8004298: 28 62 00 00 lw r2,(r3+0) 800429c: 58 82 00 00 sw (r4+0),r2 else the_thread->task_variables = (rtems_task_variable_t *)tvp->next; _RTEMS_Tasks_Invoke_task_variable_dtor( the_thread, tvp ); 80042a0: b8 60 10 00 mv r2,r3 80042a4: f8 00 00 39 calli 8004388 <_RTEMS_Tasks_Invoke_task_variable_dtor> _Thread_Enable_dispatch(); 80042a8: f8 00 09 3c calli 8006798 <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 80042ac: 34 02 00 00 mvi r2,0 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 80042b0: b8 40 08 00 mv r1,r2 80042b4: 2b 9d 00 04 lw ra,(sp+4) 80042b8: 2b 8b 00 08 lw r11,(sp+8) 80042bc: 37 9c 00 0c addi sp,sp,12 80042c0: c3 a0 00 00 ret while (tvp) { if (tvp->ptr == ptr) { if (prev) prev->next = tvp->next; else the_thread->task_variables = (rtems_task_variable_t *)tvp->next; 80042c4: 28 82 00 00 lw r2,(r4+0) 80042c8: b8 80 18 00 mv r3,r4 80042cc: 58 22 01 28 sw (r1+296),r2 80042d0: e3 ff ff f4 bi 80042a0 =============================================================================== 080042d4 : rtems_status_code rtems_task_variable_get( rtems_id tid, void **ptr, void **result ) { 80042d4: 37 9c ff f0 addi sp,sp,-16 80042d8: 5b 8b 00 0c sw (sp+12),r11 80042dc: 5b 8c 00 08 sw (sp+8),r12 80042e0: 5b 9d 00 04 sw (sp+4),ra 80042e4: b8 40 58 00 mv r11,r2 80042e8: b8 60 60 00 mv r12,r3 Thread_Control *the_thread; Objects_Locations location; rtems_task_variable_t *tvp; if ( !ptr ) return RTEMS_INVALID_ADDRESS; 80042ec: 34 02 00 09 mvi r2,9 { Thread_Control *the_thread; Objects_Locations location; rtems_task_variable_t *tvp; if ( !ptr ) 80042f0: 45 60 00 07 be r11,r0,800430c return RTEMS_INVALID_ADDRESS; if ( !result ) 80042f4: 44 60 00 06 be r3,r0,800430c return RTEMS_INVALID_ADDRESS; the_thread = _Thread_Get (tid, &location); 80042f8: 37 82 00 10 addi r2,sp,16 80042fc: f8 00 09 34 calli 80067cc <_Thread_Get> switch (location) { 8004300: 2b 82 00 10 lw r2,(sp+16) 8004304: 44 40 00 08 be r2,r0,8004324 #endif case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 8004308: 34 02 00 04 mvi r2,4 } 800430c: b8 40 08 00 mv r1,r2 8004310: 2b 9d 00 04 lw ra,(sp+4) 8004314: 2b 8b 00 0c lw r11,(sp+12) 8004318: 2b 8c 00 08 lw r12,(sp+8) 800431c: 37 9c 00 10 addi sp,sp,16 8004320: c3 a0 00 00 ret case OBJECTS_LOCAL: /* * Figure out if the variable is in this task's list. */ tvp = the_thread->task_variables; 8004324: 28 21 01 28 lw r1,(r1+296) while (tvp) { 8004328: 5c 22 00 04 bne r1,r2,8004338 800432c: e0 00 00 0f bi 8004368 */ *result = tvp->tval; _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } tvp = (rtems_task_variable_t *)tvp->next; 8004330: 28 21 00 00 lw r1,(r1+0) case OBJECTS_LOCAL: /* * Figure out if the variable is in this task's list. */ tvp = the_thread->task_variables; while (tvp) { 8004334: 44 20 00 0d be r1,r0,8004368 <== NEVER TAKEN if (tvp->ptr == ptr) { 8004338: 28 22 00 04 lw r2,(r1+4) 800433c: 5c 4b ff fd bne r2,r11,8004330 /* * Should this return the current (i.e not the * saved) value if `tid' is the current task? */ *result = tvp->tval; 8004340: 28 21 00 0c lw r1,(r1+12) 8004344: 59 81 00 00 sw (r12+0),r1 _Thread_Enable_dispatch(); 8004348: f8 00 09 14 calli 8006798 <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 800434c: 34 02 00 00 mvi r2,0 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 8004350: b8 40 08 00 mv r1,r2 8004354: 2b 9d 00 04 lw ra,(sp+4) 8004358: 2b 8b 00 0c lw r11,(sp+12) 800435c: 2b 8c 00 08 lw r12,(sp+8) 8004360: 37 9c 00 10 addi sp,sp,16 8004364: c3 a0 00 00 ret _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } tvp = (rtems_task_variable_t *)tvp->next; } _Thread_Enable_dispatch(); 8004368: f8 00 09 0c calli 8006798 <_Thread_Enable_dispatch> return RTEMS_INVALID_ADDRESS; 800436c: 34 02 00 09 mvi r2,9 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 8004370: b8 40 08 00 mv r1,r2 8004374: 2b 9d 00 04 lw ra,(sp+4) 8004378: 2b 8b 00 0c lw r11,(sp+12) 800437c: 2b 8c 00 08 lw r12,(sp+8) 8004380: 37 9c 00 10 addi sp,sp,16 8004384: c3 a0 00 00 ret =============================================================================== 08004afc : 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; 8004afc: 34 02 00 09 mvi r2,9 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004b00: 44 22 00 0b be r1,r2,8004b2c 8004b04: 48 22 00 0c bg r1,r2,8004b34 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; 8004b08: 34 02 00 04 mvi r2,4 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004b0c: 44 22 00 08 be r1,r2,8004b2c 8004b10: 48 22 00 22 bg r1,r2,8004b98 case B0: baud_index = 0; break; case B50: baud_index = 1; break; 8004b14: 34 02 00 01 mvi r2,1 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004b18: 44 22 00 05 be r1,r2,8004b2c 8004b1c: 48 22 00 2a bg r1,r2,8004bc4 case B0: baud_index = 0; break; 8004b20: 34 02 00 00 mvi r2,0 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004b24: 44 20 00 02 be r1,r0,8004b2c 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; 8004b28: 34 02 ff ff mvi r2,-1 } return baud_index; } 8004b2c: b8 40 08 00 mv r1,r2 8004b30: 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; 8004b34: 34 02 00 0e mvi r2,14 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004b38: 44 22 ff fd be r1,r2,8004b2c 8004b3c: 48 22 00 0c bg r1,r2,8004b6c 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; 8004b40: 34 02 00 0b mvi r2,11 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004b44: 44 22 ff fa be r1,r2,8004b2c 8004b48: 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; 8004b4c: 34 02 00 0a mvi r2,10 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004b50: 48 61 ff f7 bg r3,r1,8004b2c 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; 8004b54: 34 02 00 0c mvi r2,12 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004b58: 44 22 ff f5 be r1,r2,8004b2c 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; 8004b5c: 34 02 00 0d mvi r2,13 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004b60: 44 22 ff f3 be r1,r2,8004b2c <== 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; 8004b64: 34 02 ff ff mvi r2,-1 <== NOT EXECUTED 8004b68: e3 ff ff f1 bi 8004b2c <== NOT EXECUTED rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004b6c: 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; 8004b70: 34 02 00 11 mvi r2,17 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004b74: 44 23 ff ee be r1,r3,8004b2c 8004b78: 48 23 00 18 bg r1,r3,8004bd8 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; 8004b7c: 34 02 00 0f mvi r2,15 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004b80: 44 22 ff eb be r1,r2,8004b2c 8004b84: 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; 8004b88: 34 02 00 10 mvi r2,16 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004b8c: 44 23 ff e8 be r1,r3,8004b2c <== 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; 8004b90: 34 02 ff ff mvi r2,-1 <== NOT EXECUTED 8004b94: e3 ff ff e6 bi 8004b2c <== NOT EXECUTED 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; 8004b98: 34 02 00 06 mvi r2,6 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004b9c: 44 22 ff e4 be r1,r2,8004b2c 8004ba0: 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; 8004ba4: 34 02 00 05 mvi r2,5 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004ba8: 48 61 ff e1 bg r3,r1,8004b2c 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; 8004bac: 34 02 00 07 mvi r2,7 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004bb0: 44 22 ff df be r1,r2,8004b2c 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; 8004bb4: 34 02 00 08 mvi r2,8 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004bb8: 44 22 ff dd be r1,r2,8004b2c <== 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; 8004bbc: 34 02 ff ff mvi r2,-1 <== NOT EXECUTED 8004bc0: e3 ff ff db bi 8004b2c <== NOT EXECUTED int baud_index; switch (termios_baud) { case B0: baud_index = 0; break; case B50: baud_index = 1; break; case B75: baud_index = 2; break; 8004bc4: 34 02 00 02 mvi r2,2 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004bc8: 44 22 ff d9 be r1,r2,8004b2c case B0: baud_index = 0; break; case B50: baud_index = 1; break; case B75: baud_index = 2; break; case B110: baud_index = 3; break; 8004bcc: 34 02 00 03 mvi r2,3 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004bd0: 5c 22 ff d6 bne r1,r2,8004b28 <== NEVER TAKEN 8004bd4: e3 ff ff d6 bi 8004b2c 8004bd8: 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; 8004bdc: 34 02 00 12 mvi r2,18 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004be0: 44 23 ff d3 be r1,r3,8004b2c 8004be4: 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; 8004be8: 34 02 00 13 mvi r2,19 rtems_termios_baud_t termios_baud ) { int baud_index; switch (termios_baud) { 8004bec: 5c 23 ff cf bne r1,r3,8004b28 <== NEVER TAKEN 8004bf0: e3 ff ff cf bi 8004b2c =============================================================================== 08005200 : } } rtems_status_code rtems_termios_close (void *arg) { 8005200: 37 9c ff ec addi sp,sp,-20 8005204: 5b 8b 00 14 sw (sp+20),r11 8005208: 5b 8c 00 10 sw (sp+16),r12 800520c: 5b 8d 00 0c sw (sp+12),r13 8005210: 5b 8e 00 08 sw (sp+8),r14 8005214: 5b 9d 00 04 sw (sp+4),ra rtems_libio_open_close_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; rtems_status_code sc; sc = rtems_semaphore_obtain( 8005218: 78 0c 08 02 mvhi r12,0x802 800521c: 39 8c 4b 10 ori r12,r12,0x4b10 rtems_status_code rtems_termios_close (void *arg) { rtems_libio_open_close_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 8005220: 28 24 00 00 lw r4,(r1+0) } } rtems_status_code rtems_termios_close (void *arg) { 8005224: b8 20 70 00 mv r14,r1 rtems_libio_open_close_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; rtems_status_code sc; sc = rtems_semaphore_obtain( 8005228: 29 81 00 00 lw r1,(r12+0) 800522c: 34 02 00 00 mvi r2,0 8005230: 34 03 00 00 mvi r3,0 rtems_status_code rtems_termios_close (void *arg) { rtems_libio_open_close_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 8005234: 28 8b 00 38 lw r11,(r4+56) rtems_status_code sc; sc = rtems_semaphore_obtain( 8005238: f8 00 09 ae calli 80078f0 rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) 800523c: 5c 20 00 65 bne r1,r0,80053d0 <== NEVER TAKEN rtems_fatal_error_occurred (sc); if (--tty->refcount == 0) { 8005240: 29 64 00 08 lw r4,(r11+8) 8005244: 34 84 ff ff addi r4,r4,-1 8005248: 59 64 00 08 sw (r11+8),r4 800524c: 5c 81 00 31 bne r4,r1,8005310 <== NEVER TAKEN if (rtems_termios_linesw[tty->t_line].l_close != NULL) { 8005250: 29 62 00 cc lw r2,(r11+204) 8005254: 78 05 08 02 mvhi r5,0x802 8005258: 38 a5 49 44 ori r5,r5,0x4944 800525c: b4 42 10 00 add r2,r2,r2 8005260: b4 42 10 00 add r2,r2,r2 8005264: b4 42 10 00 add r2,r2,r2 8005268: b4 42 10 00 add r2,r2,r2 800526c: b4 42 10 00 add r2,r2,r2 8005270: b4 a2 10 00 add r2,r5,r2 8005274: 28 4d 00 04 lw r13,(r2+4) 8005278: 45 a4 00 41 be r13,r4,800537c /* * call discipline-specific close */ sc = rtems_termios_linesw[tty->t_line].l_close(tty); 800527c: b9 60 08 00 mv r1,r11 8005280: d9 a0 00 00 call r13 } drainOutput (tty); rtems_semaphore_release (tty->osem); } if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { 8005284: 29 62 00 b4 lw r2,(r11+180) 8005288: 34 01 00 02 mvi r1,2 800528c: 44 41 00 48 be r2,r1,80053ac <== NEVER TAKEN rtems_fatal_error_occurred (sc); sc = rtems_event_send( tty->txTaskId, TERMIOS_TX_TERMINATE_EVENT ); if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); } if (tty->device.lastClose) 8005290: 29 64 00 9c lw r4,(r11+156) 8005294: 44 80 00 05 be r4,r0,80052a8 <== ALWAYS TAKEN (*tty->device.lastClose)(tty->major, tty->minor, arg); 8005298: 29 61 00 0c lw r1,(r11+12) <== NOT EXECUTED 800529c: 29 62 00 10 lw r2,(r11+16) <== NOT EXECUTED 80052a0: b9 c0 18 00 mv r3,r14 <== NOT EXECUTED 80052a4: d8 80 00 00 call r4 <== NOT EXECUTED if (tty->forw == NULL) { 80052a8: 29 61 00 00 lw r1,(r11+0) 80052ac: 44 20 00 2c be r1,r0,800535c <== ALWAYS TAKEN rtems_termios_ttyTail = tty->back; if ( rtems_termios_ttyTail != NULL ) { rtems_termios_ttyTail->forw = NULL; } } else { tty->forw->back = tty->back; 80052b0: 29 62 00 04 lw r2,(r11+4) 80052b4: 58 22 00 04 sw (r1+4),r2 <== NOT EXECUTED 80052b8: 29 62 00 04 lw r2,(r11+4) <== NOT EXECUTED } if (tty->back == NULL) { 80052bc: 44 40 00 22 be r2,r0,8005344 <== NOT EXECUTED rtems_termios_ttyHead = tty->forw; if ( rtems_termios_ttyHead != NULL ) { rtems_termios_ttyHead->back = NULL; } } else { tty->back->forw = tty->forw; 80052c0: 58 41 00 00 sw (r2+0),r1 <== NOT EXECUTED } rtems_semaphore_delete (tty->isem); 80052c4: 29 61 00 14 lw r1,(r11+20) 80052c8: f8 00 09 53 calli 8007814 rtems_semaphore_delete (tty->osem); 80052cc: 29 61 00 18 lw r1,(r11+24) 80052d0: f8 00 09 51 calli 8007814 rtems_semaphore_delete (tty->rawOutBuf.Semaphore); 80052d4: 29 61 00 8c lw r1,(r11+140) 80052d8: f8 00 09 4f calli 8007814 if ((tty->device.pollRead == NULL) || 80052dc: 29 61 00 a0 lw r1,(r11+160) 80052e0: 44 20 00 16 be r1,r0,8005338 80052e4: 29 62 00 b4 lw r2,(r11+180) 80052e8: 34 01 00 02 mvi r1,2 80052ec: 44 41 00 13 be r2,r1,8005338 (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)) rtems_semaphore_delete (tty->rawInBuf.Semaphore); free (tty->rawInBuf.theBuf); 80052f0: 29 61 00 58 lw r1,(r11+88) 80052f4: fb ff f8 5a calli 800345c free (tty->rawOutBuf.theBuf); 80052f8: 29 61 00 7c lw r1,(r11+124) 80052fc: fb ff f8 58 calli 800345c free (tty->cbuf); 8005300: 29 61 00 1c lw r1,(r11+28) 8005304: fb ff f8 56 calli 800345c free (tty); 8005308: b9 60 08 00 mv r1,r11 800530c: fb ff f8 54 calli 800345c } rtems_semaphore_release (rtems_termios_ttyMutex); 8005310: 29 81 00 00 lw r1,(r12+0) 8005314: f8 00 09 d3 calli 8007a60 return RTEMS_SUCCESSFUL; } 8005318: 34 01 00 00 mvi r1,0 800531c: 2b 9d 00 04 lw ra,(sp+4) 8005320: 2b 8b 00 14 lw r11,(sp+20) 8005324: 2b 8c 00 10 lw r12,(sp+16) 8005328: 2b 8d 00 0c lw r13,(sp+12) 800532c: 2b 8e 00 08 lw r14,(sp+8) 8005330: 37 9c 00 14 addi sp,sp,20 8005334: c3 a0 00 00 ret rtems_semaphore_delete (tty->isem); rtems_semaphore_delete (tty->osem); rtems_semaphore_delete (tty->rawOutBuf.Semaphore); if ((tty->device.pollRead == NULL) || (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)) rtems_semaphore_delete (tty->rawInBuf.Semaphore); 8005338: 29 61 00 68 lw r1,(r11+104) 800533c: f8 00 09 36 calli 8007814 8005340: e3 ff ff ec bi 80052f0 } else { tty->forw->back = tty->back; } if (tty->back == NULL) { rtems_termios_ttyHead = tty->forw; 8005344: 78 02 08 02 mvhi r2,0x802 8005348: 38 42 4b 18 ori r2,r2,0x4b18 800534c: 58 41 00 00 sw (r2+0),r1 if ( rtems_termios_ttyHead != NULL ) { 8005350: 44 20 ff dd be r1,r0,80052c4 <== ALWAYS TAKEN rtems_termios_ttyHead->back = NULL; 8005354: 58 20 00 04 sw (r1+4),r0 <== NOT EXECUTED 8005358: e3 ff ff db bi 80052c4 <== NOT EXECUTED rtems_fatal_error_occurred (sc); } if (tty->device.lastClose) (*tty->device.lastClose)(tty->major, tty->minor, arg); if (tty->forw == NULL) { rtems_termios_ttyTail = tty->back; 800535c: 29 62 00 04 lw r2,(r11+4) 8005360: 78 03 08 02 mvhi r3,0x802 8005364: 38 63 4b 14 ori r3,r3,0x4b14 8005368: 58 62 00 00 sw (r3+0),r2 if ( rtems_termios_ttyTail != NULL ) { 800536c: 44 41 ff f6 be r2,r1,8005344 <== ALWAYS TAKEN rtems_termios_ttyTail->forw = NULL; 8005370: 58 40 00 00 sw (r2+0),r0 8005374: 29 61 00 00 lw r1,(r11+0) <== NOT EXECUTED 8005378: e3 ff ff d2 bi 80052c0 <== NOT EXECUTED sc = rtems_termios_linesw[tty->t_line].l_close(tty); } else { /* * default: just flush output buffer */ sc = rtems_semaphore_obtain(tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 800537c: 29 61 00 18 lw r1,(r11+24) 8005380: 34 02 00 00 mvi r2,0 8005384: 34 03 00 00 mvi r3,0 8005388: f8 00 09 5a calli 80078f0 if (sc != RTEMS_SUCCESSFUL) { 800538c: 5d a1 00 11 bne r13,r1,80053d0 <== NEVER TAKEN rtems_fatal_error_occurred (sc); } drainOutput (tty); 8005390: b9 60 08 00 mv r1,r11 8005394: fb ff fe 4e calli 8004ccc rtems_semaphore_release (tty->osem); 8005398: 29 61 00 18 lw r1,(r11+24) 800539c: f8 00 09 b1 calli 8007a60 } if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { 80053a0: 29 62 00 b4 lw r2,(r11+180) 80053a4: 34 01 00 02 mvi r1,2 80053a8: 5c 41 ff ba bne r2,r1,8005290 /* * send "terminate" to I/O tasks */ sc = rtems_event_send( tty->rxTaskId, TERMIOS_RX_TERMINATE_EVENT ); 80053ac: 29 61 00 c4 lw r1,(r11+196) 80053b0: 34 02 00 01 mvi r2,1 80053b4: f8 00 07 e4 calli 8007344 80053b8: b8 20 68 00 mv r13,r1 if (sc != RTEMS_SUCCESSFUL) 80053bc: 5c 20 00 05 bne r1,r0,80053d0 <== NEVER TAKEN rtems_fatal_error_occurred (sc); sc = rtems_event_send( tty->txTaskId, TERMIOS_TX_TERMINATE_EVENT ); 80053c0: 29 61 00 c8 lw r1,(r11+200) 80053c4: 34 02 00 01 mvi r2,1 80053c8: f8 00 07 df calli 8007344 if (sc != RTEMS_SUCCESSFUL) 80053cc: 44 2d ff b1 be r1,r13,8005290 <== ALWAYS TAKEN rtems_fatal_error_occurred (sc); 80053d0: f8 00 0b 47 calli 80080ec =============================================================================== 08006c38 : * for each transmitted character. * It returns number of characters left to transmit */ int rtems_termios_dequeue_characters (void *ttyp, int len) { 8006c38: 37 9c ff f8 addi sp,sp,-8 8006c3c: 5b 8b 00 08 sw (sp+8),r11 8006c40: 5b 9d 00 04 sw (sp+4),ra rtems_status_code sc; /* * sum up character count already sent */ tty->t_dqlen += len; 8006c44: 28 25 00 90 lw r5,(r1+144) if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { 8006c48: 28 24 00 b4 lw r4,(r1+180) rtems_status_code sc; /* * sum up character count already sent */ tty->t_dqlen += len; 8006c4c: b4 a2 10 00 add r2,r5,r2 8006c50: 58 22 00 90 sw (r1+144),r2 if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { 8006c54: 34 02 00 02 mvi r2,2 8006c58: 44 82 00 16 be r4,r2,8006cb0 if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); return 0; /* nothing to output in IRQ... */ } if (tty->t_line == PPPDISC ) { 8006c5c: 28 23 00 cc lw r3,(r1+204) 8006c60: 34 02 00 05 mvi r2,5 8006c64: 44 62 00 08 be r3,r2,8006c84 rtems_termios_linesw[tty->t_line].l_start(tty); } return 0; /* nothing to output in IRQ... */ } return rtems_termios_refill_transmitter(tty); 8006c68: fb ff ff 39 calli 800694c 8006c6c: b8 20 58 00 mv r11,r1 } 8006c70: b9 60 08 00 mv r1,r11 8006c74: 2b 9d 00 04 lw ra,(sp+4) 8006c78: 2b 8b 00 08 lw r11,(sp+8) 8006c7c: 37 9c 00 08 addi sp,sp,8 8006c80: c3 a0 00 00 ret if (tty->t_line == PPPDISC ) { /* * call any line discipline start function */ if (rtems_termios_linesw[tty->t_line].l_start != NULL) { 8006c84: 78 02 08 02 mvhi r2,0x802 8006c88: 38 42 49 44 ori r2,r2,0x4944 8006c8c: 28 42 00 b4 lw r2,(r2+180) rtems_termios_linesw[tty->t_line].l_start(tty); } return 0; /* nothing to output in IRQ... */ 8006c90: 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) { 8006c94: 44 40 ff f7 be r2,r0,8006c70 <== NEVER TAKEN rtems_termios_linesw[tty->t_line].l_start(tty); 8006c98: d8 40 00 00 call r2 } return 0; /* nothing to output in IRQ... */ } return rtems_termios_refill_transmitter(tty); } 8006c9c: b9 60 08 00 mv r1,r11 8006ca0: 2b 9d 00 04 lw ra,(sp+4) 8006ca4: 2b 8b 00 08 lw r11,(sp+8) 8006ca8: 37 9c 00 08 addi sp,sp,8 8006cac: c3 a0 00 00 ret if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { /* * send wake up to transmitter task */ sc = rtems_event_send(tty->txTaskId, TERMIOS_TX_START_EVENT); 8006cb0: 28 21 00 c8 lw r1,(r1+200) if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); return 0; /* nothing to output in IRQ... */ 8006cb4: 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); 8006cb8: f8 00 01 a3 calli 8007344 if (sc != RTEMS_SUCCESSFUL) 8006cbc: 44 20 ff ed be r1,r0,8006c70 <== ALWAYS TAKEN rtems_fatal_error_occurred (sc); 8006cc0: f8 00 05 0b calli 80080ec <== NOT EXECUTED =============================================================================== 0800655c : * 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) { 800655c: 37 9c ff bc addi sp,sp,-68 8006560: 5b 8b 00 44 sw (sp+68),r11 8006564: 5b 8c 00 40 sw (sp+64),r12 8006568: 5b 8d 00 3c sw (sp+60),r13 800656c: 5b 8e 00 38 sw (sp+56),r14 8006570: 5b 8f 00 34 sw (sp+52),r15 8006574: 5b 90 00 30 sw (sp+48),r16 8006578: 5b 91 00 2c sw (sp+44),r17 800657c: 5b 92 00 28 sw (sp+40),r18 8006580: 5b 93 00 24 sw (sp+36),r19 8006584: 5b 94 00 20 sw (sp+32),r20 8006588: 5b 95 00 1c sw (sp+28),r21 800658c: 5b 96 00 18 sw (sp+24),r22 8006590: 5b 97 00 14 sw (sp+20),r23 8006594: 5b 98 00 10 sw (sp+16),r24 8006598: 5b 99 00 0c sw (sp+12),r25 800659c: 5b 9b 00 08 sw (sp+8),fp 80065a0: 5b 9d 00 04 sw (sp+4),ra 80065a4: 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) { 80065a8: 28 21 00 cc lw r1,(r1+204) 80065ac: 78 0e 08 02 mvhi r14,0x802 80065b0: 39 ce 49 44 ori r14,r14,0x4944 80065b4: b4 21 08 00 add r1,r1,r1 80065b8: b4 21 08 00 add r1,r1,r1 80065bc: b4 21 08 00 add r1,r1,r1 80065c0: b4 21 08 00 add r1,r1,r1 80065c4: b4 21 08 00 add r1,r1,r1 80065c8: b5 c1 08 00 add r1,r14,r1 80065cc: 28 24 00 10 lw r4,(r1+16) * 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) { 80065d0: b8 40 68 00 mv r13,r2 80065d4: 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) { 80065d8: 44 80 00 30 be r4,r0,8006698 while (len--) { 80065dc: 44 60 00 11 be r3,r0,8006620 <== NEVER TAKEN 80065e0: 34 0c 00 00 mvi r12,0 80065e4: e0 00 00 09 bi 8006608 80065e8: 29 64 00 cc lw r4,(r11+204) 80065ec: b4 84 20 00 add r4,r4,r4 80065f0: b4 84 20 00 add r4,r4,r4 80065f4: b4 84 20 00 add r4,r4,r4 80065f8: b4 84 20 00 add r4,r4,r4 80065fc: b4 84 20 00 add r4,r4,r4 8006600: b5 c4 20 00 add r4,r14,r4 8006604: 28 84 00 10 lw r4,(r4+16) * NOTE: This routine runs in the context of the * device receive interrupt handler. * Returns the number of characters dropped because of overflow. */ int rtems_termios_enqueue_raw_characters (void *ttyp, char *buf, int len) 8006608: b5 ac 08 00 add r1,r13,r12 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); 800660c: 40 21 00 00 lbu r1,(r1+0) 8006610: 35 8c 00 01 addi r12,r12,1 8006614: b9 60 10 00 mv r2,r11 8006618: d8 80 00 00 call r4 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--) { 800661c: 5d 8f ff f3 bne r12,r15,80065e8 } /* * check to see if rcv wakeup callback was set */ if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) { 8006620: 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; 8006624: 34 10 00 00 mvi r16,0 } /* * check to see if rcv wakeup callback was set */ if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) { 8006628: 5c 20 00 08 bne r1,r0,8006648 <== NEVER TAKEN 800662c: 29 63 00 dc lw r3,(r11+220) 8006630: 44 70 00 06 be r3,r16,8006648 <== NEVER TAKEN (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg); 8006634: 29 62 00 e0 lw r2,(r11+224) 8006638: 35 61 00 30 addi r1,r11,48 800663c: d8 60 00 00 call r3 tty->tty_rcvwakeup = 1; 8006640: 34 01 00 01 mvi r1,1 8006644: 59 61 00 e4 sw (r11+228),r1 } tty->rawInBufDropped += dropped; rtems_semaphore_release (tty->rawInBuf.Semaphore); return dropped; } 8006648: ba 00 08 00 mv r1,r16 800664c: 2b 9d 00 04 lw ra,(sp+4) 8006650: 2b 8b 00 44 lw r11,(sp+68) 8006654: 2b 8c 00 40 lw r12,(sp+64) 8006658: 2b 8d 00 3c lw r13,(sp+60) 800665c: 2b 8e 00 38 lw r14,(sp+56) 8006660: 2b 8f 00 34 lw r15,(sp+52) 8006664: 2b 90 00 30 lw r16,(sp+48) 8006668: 2b 91 00 2c lw r17,(sp+44) 800666c: 2b 92 00 28 lw r18,(sp+40) 8006670: 2b 93 00 24 lw r19,(sp+36) 8006674: 2b 94 00 20 lw r20,(sp+32) 8006678: 2b 95 00 1c lw r21,(sp+28) 800667c: 2b 96 00 18 lw r22,(sp+24) 8006680: 2b 97 00 14 lw r23,(sp+20) 8006684: 2b 98 00 10 lw r24,(sp+16) 8006688: 2b 99 00 0c lw r25,(sp+12) 800668c: 2b 9b 00 08 lw fp,(sp+8) 8006690: 37 9c 00 44 addi sp,sp,68 8006694: c3 a0 00 00 ret 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) { 8006698: 34 12 00 00 mvi r18,0 800669c: 34 10 00 00 mvi r16,0 flow_rcv = true; } } if (flow_rcv) { /* restart output according to FL_ORCVXOF flag */ if ((tty->flow_ctrl & (FL_ORCVXOF | FL_OSTOP)) == FL_OSTOP) { 80066a0: 34 14 00 20 mvi r20,32 /* disable interrupts */ rtems_interrupt_disable(level); 80066a4: 34 13 ff fe mvi r19,-2 tty->flow_ctrl &= ~FL_OSTOP; 80066a8: 34 15 ff df mvi r21,-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); 80066ac: 35 77 00 30 addi r23,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)) 80066b0: 34 16 04 00 mvi r22,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) ) { 80066b4: 34 19 01 00 mvi r25,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, 80066b8: 35 7b 00 4a addi fp,r11,74 flow_rcv = true; } else if (c == tty->termios.c_cc[VSTART]) { /* VSTART received */ /* restart output */ tty->flow_ctrl &= ~FL_ORCVXOF; 80066bc: 34 18 ff ef mvi r24,-17 tty->tty_rcvwakeup = 1; } return 0; } while (len--) { 80066c0: 45 e0 00 39 be r15,r0,80067a4 <== NEVER TAKEN c = *buf++; /* FIXME: implement IXANY: any character restarts output */ /* if incoming XON/XOFF controls outgoing stream: */ if (tty->flow_ctrl & FL_MDXON) { 80066c4: 29 63 00 b8 lw r3,(r11+184) } return 0; } while (len--) { c = *buf++; 80066c8: 41 ae 00 00 lbu r14,(r13+0) 80066cc: 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) { 80066d0: 20 63 02 00 andi r3,r3,0x200 80066d4: 44 60 00 05 be r3,r0,80066e8 /* if received char is V_STOP and V_START (both are equal value) */ if (c == tty->termios.c_cc[VSTOP]) { 80066d8: 41 63 00 4a lbu r3,(r11+74) 80066dc: 44 6e 00 53 be r3,r14,8006828 /* stop output */ tty->flow_ctrl |= FL_ORCVXOF; } flow_rcv = true; } else if (c == tty->termios.c_cc[VSTART]) { 80066e0: 41 63 00 49 lbu r3,(r11+73) 80066e4: 44 6e 00 36 be r3,r14,80067bc <== NEVER TAKEN /* restart output */ tty->flow_ctrl &= ~FL_ORCVXOF; flow_rcv = true; } } if (flow_rcv) { 80066e8: 5e 40 00 39 bne r18,r0,80067cc <== NEVER TAKEN } /* reenable interrupts */ rtems_interrupt_enable(level); } } else { newTail = (tty->rawInBuf.Tail + 1) % tty->rawInBuf.Size; 80066ec: 29 63 00 60 lw r3,(r11+96) 80066f0: 29 62 00 64 lw r2,(r11+100) 80066f4: 34 61 00 01 addi r1,r3,1 80066f8: f8 00 65 80 calli 801fcf8 <__umodsi3> 80066fc: b8 20 60 00 mv r12,r1 /* if chars_in_buffer > highwater */ rtems_interrupt_disable(level); 8006700: 90 00 88 00 rcsr r17,IE 8006704: a2 33 18 00 and r3,r17,r19 8006708: d0 03 00 00 wcsr IE,r3 if ((((newTail - tty->rawInBuf.Head + tty->rawInBuf.Size) 800670c: 29 63 00 5c lw r3,(r11+92) 8006710: 29 64 00 64 lw r4,(r11+100) % tty->rawInBuf.Size) > tty->highwater) && 8006714: 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) 8006718: c8 83 18 00 sub r3,r4,r3 % tty->rawInBuf.Size) > tty->highwater) && 800671c: b4 61 08 00 add r1,r3,r1 8006720: f8 00 65 76 calli 801fcf8 <__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) 8006724: 29 63 00 c0 lw r3,(r11+192) 8006728: 50 61 00 0d bgeu r3,r1,800675c <== ALWAYS TAKEN % tty->rawInBuf.Size) > tty->highwater) && !(tty->flow_ctrl & FL_IREQXOF)) { 800672c: 29 63 00 b8 lw r3,(r11+184) <== NOT EXECUTED 8006730: 20 63 00 01 andi r3,r3,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) && 8006734: 5c 60 00 0a bne r3,r0,800675c <== NOT EXECUTED !(tty->flow_ctrl & FL_IREQXOF)) { /* incoming data stream should be stopped */ tty->flow_ctrl |= FL_IREQXOF; 8006738: 29 63 00 b8 lw r3,(r11+184) <== NOT EXECUTED 800673c: 38 63 00 01 ori r3,r3,0x1 <== NOT EXECUTED 8006740: 59 63 00 b8 sw (r11+184),r3 <== NOT EXECUTED if ((tty->flow_ctrl & (FL_MDXOF | FL_ISNTXOF)) 8006744: 29 63 00 b8 lw r3,(r11+184) <== NOT EXECUTED 8006748: 20 63 04 02 andi r3,r3,0x402 <== NOT EXECUTED 800674c: 44 76 00 44 be r3,r22,800685c <== NOT EXECUTED /* call write function here */ tty->flow_ctrl |= FL_ISNTXOF; (*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTOP]), 1); } } else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) == (FL_MDRTS) ) { 8006750: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED 8006754: 20 21 01 04 andi r1,r1,0x104 <== NOT EXECUTED 8006758: 44 39 00 4f be r1,r25,8006894 <== NOT EXECUTED } } } /* reenable interrupts */ rtems_interrupt_enable(level); 800675c: d0 11 00 00 wcsr IE,r17 if (newTail == tty->rawInBuf.Head) { 8006760: 29 63 00 5c lw r3,(r11+92) 8006764: 44 6c 00 37 be r3,r12,8006840 <== NEVER TAKEN dropped++; } else { tty->rawInBuf.theBuf[newTail] = c; 8006768: 29 63 00 58 lw r3,(r11+88) 800676c: b4 6c 18 00 add r3,r3,r12 8006770: 30 6e 00 00 sb (r3+0),r14 tty->rawInBuf.Tail = newTail; /* * check to see if rcv wakeup callback was set */ if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) { 8006774: 29 63 00 e4 lw r3,(r11+228) if (newTail == tty->rawInBuf.Head) { dropped++; } else { tty->rawInBuf.theBuf[newTail] = c; tty->rawInBuf.Tail = newTail; 8006778: 59 6c 00 60 sw (r11+96),r12 /* * check to see if rcv wakeup callback was set */ if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) { 800677c: 5c 60 00 08 bne r3,r0,800679c <== NEVER TAKEN 8006780: 29 64 00 dc lw r4,(r11+220) 8006784: 44 83 00 06 be r4,r3,800679c <== ALWAYS TAKEN (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg); 8006788: 29 62 00 e0 lw r2,(r11+224) <== NOT EXECUTED 800678c: ba e0 08 00 mv r1,r23 <== NOT EXECUTED 8006790: d8 80 00 00 call r4 <== NOT EXECUTED tty->tty_rcvwakeup = 1; 8006794: 34 03 00 01 mvi r3,1 <== NOT EXECUTED 8006798: 59 63 00 e4 sw (r11+228),r3 <== NOT EXECUTED 800679c: 35 ef ff ff addi r15,r15,-1 tty->tty_rcvwakeup = 1; } return 0; } while (len--) { 80067a0: 5d e0 ff c9 bne r15,r0,80066c4 <== NEVER TAKEN } } } } tty->rawInBufDropped += dropped; 80067a4: 29 62 00 78 lw r2,(r11+120) rtems_semaphore_release (tty->rawInBuf.Semaphore); 80067a8: 29 61 00 68 lw r1,(r11+104) } } } } tty->rawInBufDropped += dropped; 80067ac: b4 50 10 00 add r2,r2,r16 80067b0: 59 62 00 78 sw (r11+120),r2 rtems_semaphore_release (tty->rawInBuf.Semaphore); 80067b4: f8 00 04 ab calli 8007a60 return dropped; 80067b8: e3 ff ff a4 bi 8006648 flow_rcv = true; } else if (c == tty->termios.c_cc[VSTART]) { /* VSTART received */ /* restart output */ tty->flow_ctrl &= ~FL_ORCVXOF; 80067bc: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED 80067c0: a0 38 08 00 and r1,r1,r24 <== NOT EXECUTED 80067c4: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED 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--) { 80067c8: 34 12 00 01 mvi r18,1 flow_rcv = true; } } if (flow_rcv) { /* restart output according to FL_ORCVXOF flag */ if ((tty->flow_ctrl & (FL_ORCVXOF | FL_OSTOP)) == FL_OSTOP) { 80067cc: 29 63 00 b8 lw r3,(r11+184) 80067d0: 20 63 00 30 andi r3,r3,0x30 80067d4: 5c 74 ff f2 bne r3,r20,800679c <== ALWAYS TAKEN /* disable interrupts */ rtems_interrupt_disable(level); 80067d8: 90 00 60 00 rcsr r12,IE <== NOT EXECUTED 80067dc: a1 93 18 00 and r3,r12,r19 <== NOT EXECUTED 80067e0: d0 03 00 00 wcsr IE,r3 <== NOT EXECUTED tty->flow_ctrl &= ~FL_OSTOP; 80067e4: 29 63 00 b8 lw r3,(r11+184) <== NOT EXECUTED /* check for chars in output buffer (or rob_state?) */ if (tty->rawOutBufState != rob_idle) { 80067e8: 29 61 00 94 lw r1,(r11+148) <== NOT EXECUTED if (flow_rcv) { /* restart output according to FL_ORCVXOF flag */ if ((tty->flow_ctrl & (FL_ORCVXOF | FL_OSTOP)) == FL_OSTOP) { /* disable interrupts */ rtems_interrupt_disable(level); tty->flow_ctrl &= ~FL_OSTOP; 80067ec: a0 75 18 00 and r3,r3,r21 <== NOT EXECUTED 80067f0: 59 63 00 b8 sw (r11+184),r3 <== NOT EXECUTED /* check for chars in output buffer (or rob_state?) */ if (tty->rawOutBufState != rob_idle) { 80067f4: 5c 20 00 04 bne r1,r0,8006804 <== NOT EXECUTED /* if chars available, call write function... */ (*tty->device.write)( tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail], 1); } /* reenable interrupts */ rtems_interrupt_enable(level); 80067f8: d0 0c 00 00 wcsr IE,r12 <== NOT EXECUTED /* * check to see if rcv wakeup callback was set */ if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) { (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg); tty->tty_rcvwakeup = 1; 80067fc: 35 ef ff ff addi r15,r15,-1 <== NOT EXECUTED 8006800: e3 ff ff e8 bi 80067a0 <== 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)( 8006804: 29 63 00 7c lw r3,(r11+124) <== NOT EXECUTED tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail], 1); 8006808: 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)( 800680c: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED 8006810: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED 8006814: b4 62 10 00 add r2,r3,r2 <== NOT EXECUTED 8006818: 34 03 00 01 mvi r3,1 <== NOT EXECUTED 800681c: d8 80 00 00 call r4 <== NOT EXECUTED tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail], 1); } /* reenable interrupts */ rtems_interrupt_enable(level); 8006820: d0 0c 00 00 wcsr IE,r12 <== NOT EXECUTED 8006824: e3 ff ff f6 bi 80067fc <== NOT EXECUTED /* FIXME: implement IXANY: any character restarts output */ /* if incoming XON/XOFF controls outgoing stream: */ if (tty->flow_ctrl & FL_MDXON) { /* if received char is V_STOP and V_START (both are equal value) */ if (c == tty->termios.c_cc[VSTOP]) { if (c == tty->termios.c_cc[VSTART]) { 8006828: 41 64 00 49 lbu r4,(r11+73) 800682c: 44 83 00 08 be r4,r3,800684c <== NEVER TAKEN tty->flow_ctrl = tty->flow_ctrl ^ FL_ORCVXOF; } else { /* VSTOP received (other code than VSTART) */ /* stop output */ tty->flow_ctrl |= FL_ORCVXOF; 8006830: 29 61 00 b8 lw r1,(r11+184) 8006834: 38 21 00 10 ori r1,r1,0x10 8006838: 59 61 00 b8 sw (r11+184),r1 800683c: e3 ff ff e3 bi 80067c8 /* reenable interrupts */ rtems_interrupt_enable(level); if (newTail == tty->rawInBuf.Head) { dropped++; 8006840: 36 10 00 01 addi r16,r16,1 <== NOT EXECUTED /* * check to see if rcv wakeup callback was set */ if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) { (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg); tty->tty_rcvwakeup = 1; 8006844: 35 ef ff ff addi r15,r15,-1 <== NOT EXECUTED 8006848: e3 ff ff d6 bi 80067a0 <== NOT EXECUTED /* if received char is V_STOP and V_START (both are equal value) */ if (c == tty->termios.c_cc[VSTOP]) { if (c == tty->termios.c_cc[VSTART]) { /* received VSTOP and VSTART==VSTOP? */ /* then toggle "stop output" status */ tty->flow_ctrl = tty->flow_ctrl ^ FL_ORCVXOF; 800684c: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED 8006850: 18 21 00 10 xori r1,r1,0x10 <== NOT EXECUTED 8006854: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED 8006858: e3 ff ff dc bi 80067c8 <== NOT EXECUTED !(tty->flow_ctrl & FL_IREQXOF)) { /* incoming data stream should be stopped */ tty->flow_ctrl |= FL_IREQXOF; if ((tty->flow_ctrl & (FL_MDXOF | FL_ISNTXOF)) == (FL_MDXOF ) ) { if ((tty->flow_ctrl & FL_OSTOP) || 800685c: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED 8006860: 20 21 00 20 andi r1,r1,0x20 <== NOT EXECUTED 8006864: 5c 20 00 03 bne r1,r0,8006870 <== NOT EXECUTED 8006868: 29 62 00 94 lw r2,(r11+148) <== NOT EXECUTED 800686c: 5c 41 ff bc bne r2,r1,800675c <== 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; 8006870: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED (*tty->device.write)(tty->minor, 8006874: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED 8006878: 29 61 00 10 lw r1,(r11+16) <== 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; 800687c: 38 42 00 02 ori r2,r2,0x2 <== NOT EXECUTED 8006880: 59 62 00 b8 sw (r11+184),r2 <== NOT EXECUTED (*tty->device.write)(tty->minor, 8006884: 34 03 00 01 mvi r3,1 <== NOT EXECUTED 8006888: bb 60 10 00 mv r2,fp <== NOT EXECUTED 800688c: d8 80 00 00 call r4 <== NOT EXECUTED 8006890: e3 ff ff b3 bi 800675c <== NOT EXECUTED (void *)&(tty->termios.c_cc[VSTOP]), 1); } } else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) == (FL_MDRTS) ) { tty->flow_ctrl |= FL_IRTSOFF; 8006894: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED /* deactivate RTS line */ if (tty->device.stopRemoteTx != NULL) { 8006898: 29 62 00 ac lw r2,(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; 800689c: 38 21 00 04 ori r1,r1,0x4 <== NOT EXECUTED 80068a0: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED /* deactivate RTS line */ if (tty->device.stopRemoteTx != NULL) { 80068a4: 44 40 ff ae be r2,r0,800675c <== NOT EXECUTED tty->device.stopRemoteTx(tty->minor); 80068a8: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED 80068ac: d8 40 00 00 call r2 <== NOT EXECUTED 80068b0: e3 ff ff ab bi 800675c <== NOT EXECUTED =============================================================================== 08004c38 : struct rtems_termios_tty *rtems_termios_ttyTail; rtems_id rtems_termios_ttyMutex; void rtems_termios_initialize (void) { 8004c38: 37 9c ff f8 addi sp,sp,-8 8004c3c: 5b 8b 00 08 sw (sp+8),r11 8004c40: 5b 9d 00 04 sw (sp+4),ra rtems_status_code sc; /* * Create the mutex semaphore for the tty list */ if (!rtems_termios_ttyMutex) { 8004c44: 78 05 08 02 mvhi r5,0x802 8004c48: 38 a5 4b 10 ori r5,r5,0x4b10 8004c4c: 28 ab 00 00 lw r11,(r5+0) 8004c50: 45 60 00 05 be r11,r0,8004c64 <== ALWAYS TAKEN RTEMS_NO_PRIORITY, &rtems_termios_ttyMutex); if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); } } 8004c54: 2b 9d 00 04 lw ra,(sp+4) 8004c58: 2b 8b 00 08 lw r11,(sp+8) 8004c5c: 37 9c 00 08 addi sp,sp,8 8004c60: c3 a0 00 00 ret /* * Create the mutex semaphore for the tty list */ if (!rtems_termios_ttyMutex) { sc = rtems_semaphore_create ( 8004c64: 78 02 08 02 mvhi r2,0x802 8004c68: 38 42 20 64 ori r2,r2,0x2064 8004c6c: 28 41 00 00 lw r1,(r2+0) 8004c70: 34 03 00 54 mvi r3,84 8004c74: 34 02 00 01 mvi r2,1 8004c78: 34 04 00 00 mvi r4,0 8004c7c: f8 00 0a 62 calli 8007604 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) 8004c80: 44 2b ff f5 be r1,r11,8004c54 <== ALWAYS TAKEN rtems_fatal_error_occurred (sc); 8004c84: f8 00 0d 1a calli 80080ec <== NOT EXECUTED =============================================================================== 08005400 : } } rtems_status_code rtems_termios_ioctl (void *arg) { 8005400: 37 9c ff e8 addi sp,sp,-24 8005404: 5b 8b 00 18 sw (sp+24),r11 8005408: 5b 8c 00 14 sw (sp+20),r12 800540c: 5b 8d 00 10 sw (sp+16),r13 8005410: 5b 8e 00 0c sw (sp+12),r14 8005414: 5b 8f 00 08 sw (sp+8),r15 8005418: 5b 9d 00 04 sw (sp+4),ra 800541c: b8 20 60 00 mv r12,r1 rtems_libio_ioctl_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 8005420: 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); 8005424: 34 02 00 00 mvi r2,0 8005428: 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; 800542c: 28 2b 00 38 lw r11,(r1+56) struct ttywakeup *wakeup = (struct ttywakeup *)args->buffer; rtems_status_code sc; args->ioctl_return = 0; 8005430: 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; 8005434: 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); 8005438: 29 61 00 18 lw r1,(r11+24) 800543c: f8 00 09 2d calli 80078f0 8005440: b8 20 68 00 mv r13,r1 if (sc != RTEMS_SUCCESSFUL) { 8005444: 5c 20 00 21 bne r1,r0,80054c8 <== NEVER TAKEN args->ioctl_return = sc; return sc; } switch (args->command) { 8005448: 29 81 00 04 lw r1,(r12+4) 800544c: 34 02 00 04 mvi r2,4 8005450: 44 22 00 18 be r1,r2,80054b0 8005454: 54 22 00 27 bgu r1,r2,80054f0 8005458: 34 02 00 02 mvi r2,2 800545c: 44 22 00 31 be r1,r2,8005520 8005460: 54 22 00 e3 bgu r1,r2,80057ec 8005464: 34 02 00 01 mvi r2,1 8005468: 44 22 00 cd be r1,r2,800579c <== ALWAYS TAKEN default: if (rtems_termios_linesw[tty->t_line].l_ioctl != NULL) { 800546c: 29 61 00 cc lw r1,(r11+204) 8005470: 78 02 08 02 mvhi r2,0x802 8005474: 38 42 49 44 ori r2,r2,0x4944 8005478: b4 21 08 00 add r1,r1,r1 800547c: b4 21 08 00 add r1,r1,r1 8005480: b4 21 08 00 add r1,r1,r1 8005484: b4 21 08 00 add r1,r1,r1 8005488: b4 21 08 00 add r1,r1,r1 800548c: b4 41 08 00 add r1,r2,r1 8005490: 28 23 00 18 lw r3,(r1+24) sc = rtems_termios_linesw[tty->t_line].l_ioctl(tty,args); } else { sc = RTEMS_INVALID_NUMBER; 8005494: 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) { 8005498: 44 60 00 0a be r3,r0,80054c0 <== NEVER TAKEN sc = rtems_termios_linesw[tty->t_line].l_ioctl(tty,args); 800549c: b9 60 08 00 mv r1,r11 80054a0: b9 80 10 00 mv r2,r12 80054a4: d8 60 00 00 call r3 80054a8: b8 20 68 00 mv r13,r1 80054ac: e0 00 00 05 bi 80054c0 case RTEMS_IO_SNDWAKEUP: tty->tty_snd = *wakeup; break; case RTEMS_IO_RCVWAKEUP: tty->tty_rcv = *wakeup; 80054b0: 29 c1 00 00 lw r1,(r14+0) 80054b4: 59 61 00 dc sw (r11+220),r1 80054b8: 29 c1 00 04 lw r1,(r14+4) 80054bc: 59 61 00 e0 sw (r11+224),r1 *(int *)args->buffer = tty->ccount - tty->cindex + rawnc; } break; } rtems_semaphore_release (tty->osem); 80054c0: 29 61 00 18 lw r1,(r11+24) 80054c4: f8 00 09 67 calli 8007a60 args->ioctl_return = sc; return sc; } 80054c8: b9 a0 08 00 mv r1,r13 } break; } rtems_semaphore_release (tty->osem); args->ioctl_return = sc; 80054cc: 59 8d 00 0c sw (r12+12),r13 return sc; } 80054d0: 2b 9d 00 04 lw ra,(sp+4) 80054d4: 2b 8b 00 18 lw r11,(sp+24) 80054d8: 2b 8c 00 14 lw r12,(sp+20) 80054dc: 2b 8d 00 10 lw r13,(sp+16) 80054e0: 2b 8e 00 0c lw r14,(sp+12) 80054e4: 2b 8f 00 08 lw r15,(sp+8) 80054e8: 37 9c 00 18 addi sp,sp,24 80054ec: c3 a0 00 00 ret sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) { args->ioctl_return = sc; return sc; } switch (args->command) { 80054f0: 78 03 08 02 mvhi r3,0x802 80054f4: 38 63 20 80 ori r3,r3,0x2080 80054f8: 28 62 00 00 lw r2,(r3+0) 80054fc: 44 22 00 71 be r1,r2,80056c0 <== NEVER TAKEN 8005500: 54 22 00 7d bgu r1,r2,80056f4 8005504: 34 02 00 05 mvi r2,5 8005508: 5c 22 ff d9 bne r1,r2,800546c case RTEMS_IO_TCDRAIN: drainOutput (tty); break; case RTEMS_IO_SNDWAKEUP: tty->tty_snd = *wakeup; 800550c: 29 c1 00 00 lw r1,(r14+0) 8005510: 59 61 00 d4 sw (r11+212),r1 8005514: 29 c1 00 04 lw r1,(r14+4) 8005518: 59 61 00 d8 sw (r11+216),r1 break; 800551c: e3 ff ff e9 bi 80054c0 case RTEMS_IO_GET_ATTRIBUTES: *(struct termios *)args->buffer = tty->termios; break; case RTEMS_IO_SET_ATTRIBUTES: tty->termios = *(struct termios *)args->buffer; 8005520: 29 81 00 08 lw r1,(r12+8) /* * check for flow control options to be switched off */ /* check for outgoing XON/XOFF flow control switched off */ if (( tty->flow_ctrl & FL_MDXON) && 8005524: 29 63 00 b8 lw r3,(r11+184) case RTEMS_IO_GET_ATTRIBUTES: *(struct termios *)args->buffer = tty->termios; break; case RTEMS_IO_SET_ATTRIBUTES: tty->termios = *(struct termios *)args->buffer; 8005528: 28 22 00 00 lw r2,(r1+0) /* * check for flow control options to be switched off */ /* check for outgoing XON/XOFF flow control switched off */ if (( tty->flow_ctrl & FL_MDXON) && 800552c: 20 63 02 00 andi r3,r3,0x200 case RTEMS_IO_GET_ATTRIBUTES: *(struct termios *)args->buffer = tty->termios; break; case RTEMS_IO_SET_ATTRIBUTES: tty->termios = *(struct termios *)args->buffer; 8005530: 59 62 00 30 sw (r11+48),r2 8005534: 28 24 00 04 lw r4,(r1+4) 8005538: 59 64 00 34 sw (r11+52),r4 800553c: 28 24 00 08 lw r4,(r1+8) 8005540: 59 64 00 38 sw (r11+56),r4 8005544: 28 24 00 0c lw r4,(r1+12) 8005548: 59 64 00 3c sw (r11+60),r4 800554c: 28 24 00 10 lw r4,(r1+16) 8005550: 59 64 00 40 sw (r11+64),r4 8005554: 28 24 00 14 lw r4,(r1+20) 8005558: 59 64 00 44 sw (r11+68),r4 800555c: 28 24 00 18 lw r4,(r1+24) 8005560: 59 64 00 48 sw (r11+72),r4 8005564: 28 24 00 1c lw r4,(r1+28) 8005568: 59 64 00 4c sw (r11+76),r4 800556c: 28 21 00 20 lw r1,(r1+32) 8005570: 59 61 00 50 sw (r11+80),r1 /* * check for flow control options to be switched off */ /* check for outgoing XON/XOFF flow control switched off */ if (( tty->flow_ctrl & FL_MDXON) && 8005574: 44 60 00 15 be r3,r0,80055c8 !(tty->termios.c_iflag & IXON)) { 8005578: 20 42 04 00 andi r2,r2,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) && 800557c: 5c 40 00 13 bne r2,r0,80055c8 <== ALWAYS TAKEN !(tty->termios.c_iflag & IXON)) { /* clear related flags in flow_ctrl */ tty->flow_ctrl &= ~(FL_MDXON | FL_ORCVXOF); 8005580: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED 8005584: 34 01 fd ef mvi r1,-529 <== NOT EXECUTED 8005588: a0 41 08 00 and r1,r2,r1 <== NOT EXECUTED 800558c: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED /* has output been stopped due to received XOFF? */ if (tty->flow_ctrl & FL_OSTOP) { 8005590: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED 8005594: 20 21 00 20 andi r1,r1,0x20 <== NOT EXECUTED 8005598: 44 20 00 0c be r1,r0,80055c8 <== NOT EXECUTED /* disable interrupts */ rtems_interrupt_disable(level); 800559c: 90 00 70 00 rcsr r14,IE <== NOT EXECUTED 80055a0: 34 01 ff fe mvi r1,-2 <== NOT EXECUTED 80055a4: a1 c1 08 00 and r1,r14,r1 <== NOT EXECUTED 80055a8: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED tty->flow_ctrl &= ~FL_OSTOP; 80055ac: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED 80055b0: 34 01 ff df mvi r1,-33 <== NOT EXECUTED /* check for chars in output buffer (or rob_state?) */ if (tty->rawOutBufState != rob_idle) { 80055b4: 29 63 00 94 lw r3,(r11+148) <== NOT EXECUTED /* has output been stopped due to received XOFF? */ if (tty->flow_ctrl & FL_OSTOP) { /* disable interrupts */ rtems_interrupt_disable(level); tty->flow_ctrl &= ~FL_OSTOP; 80055b8: a0 41 08 00 and r1,r2,r1 <== NOT EXECUTED 80055bc: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED /* check for chars in output buffer (or rob_state?) */ if (tty->rawOutBufState != rob_idle) { 80055c0: 5c 60 00 90 bne r3,r0,8005800 <== NOT EXECUTED /* if chars available, call write function... */ (*tty->device.write)( tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1); } /* reenable interrupts */ rtems_interrupt_enable(level); 80055c4: 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)) { 80055c8: 29 61 00 b8 lw r1,(r11+184) 80055cc: 20 21 04 00 andi r1,r1,0x400 80055d0: 44 20 00 0c be r1,r0,8005600 <== ALWAYS TAKEN 80055d4: 29 61 00 30 lw r1,(r11+48) <== NOT EXECUTED 80055d8: 20 21 10 00 andi r1,r1,0x1000 <== NOT EXECUTED 80055dc: 5c 20 00 09 bne r1,r0,8005600 <== NOT EXECUTED /* clear related flags in flow_ctrl */ tty->flow_ctrl &= ~(FL_MDXOF); 80055e0: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED 80055e4: 34 01 fb ff mvi r1,-1025 <== NOT EXECUTED 80055e8: a0 41 08 00 and r1,r2,r1 <== NOT EXECUTED 80055ec: 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); 80055f0: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED 80055f4: 34 01 ff fd mvi r1,-3 <== NOT EXECUTED 80055f8: a0 41 08 00 and r1,r2,r1 <== NOT EXECUTED 80055fc: 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)) { 8005600: 29 61 00 b8 lw r1,(r11+184) 8005604: 20 21 01 00 andi r1,r1,0x100 8005608: 44 20 00 7c be r1,r0,80057f8 <== ALWAYS TAKEN 800560c: 29 62 00 38 lw r2,(r11+56) <== NOT EXECUTED 8005610: 48 02 00 12 bg r0,r2,8005658 <== NOT EXECUTED /* clear related flags in flow_ctrl */ tty->flow_ctrl &= ~(FL_MDRTS); 8005614: 29 63 00 b8 lw r3,(r11+184) <== NOT EXECUTED 8005618: 34 01 fe ff mvi r1,-257 <== NOT EXECUTED 800561c: a0 61 08 00 and r1,r3,r1 <== NOT EXECUTED 8005620: 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)) { 8005624: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED 8005628: 20 21 00 04 andi r1,r1,0x4 <== NOT EXECUTED 800562c: 44 20 00 06 be r1,r0,8005644 <== NOT EXECUTED 8005630: 29 63 00 b0 lw r3,(r11+176) <== NOT EXECUTED 8005634: 44 60 00 04 be r3,r0,8005644 <== NOT EXECUTED tty->device.startRemoteTx(tty->minor); 8005638: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED 800563c: d8 60 00 00 call r3 <== NOT EXECUTED 8005640: 29 62 00 38 lw r2,(r11+56) <== NOT EXECUTED } tty->flow_ctrl &= ~(FL_IRTSOFF); 8005644: 29 63 00 b8 lw r3,(r11+184) <== NOT EXECUTED 8005648: 34 01 ff fb mvi r1,-5 <== NOT EXECUTED 800564c: a0 61 08 00 and r1,r3,r1 <== NOT EXECUTED 8005650: 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) { 8005654: 4c 40 00 04 bge r2,r0,8005664 <== ALWAYS TAKEN tty->flow_ctrl |= FL_MDRTS; 8005658: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED 800565c: 38 21 01 00 ori r1,r1,0x100 <== NOT EXECUTED 8005660: 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) { 8005664: 29 61 00 30 lw r1,(r11+48) 8005668: 20 22 10 00 andi r2,r1,0x1000 800566c: 44 40 00 04 be r2,r0,800567c tty->flow_ctrl |= FL_MDXOF; 8005670: 29 62 00 b8 lw r2,(r11+184) 8005674: 38 42 04 00 ori r2,r2,0x400 8005678: 59 62 00 b8 sw (r11+184),r2 } /* check for outgoing XON/XOF flow control switched on */ if (tty->termios.c_iflag & IXON) { 800567c: 20 21 04 00 andi r1,r1,0x400 8005680: 44 20 00 04 be r1,r0,8005690 tty->flow_ctrl |= FL_MDXON; 8005684: 29 61 00 b8 lw r1,(r11+184) 8005688: 38 21 02 00 ori r1,r1,0x200 800568c: 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) { 8005690: 29 6e 00 3c lw r14,(r11+60) 8005694: 21 ce 00 02 andi r14,r14,0x2 8005698: 45 c0 00 63 be r14,r0,8005824 tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT; else tty->rawInBufSemaphoreFirstTimeout = tty->vtimeTicks; } else { if (tty->termios.c_cc[VMIN]) { tty->rawInBufSemaphoreOptions = RTEMS_WAIT; 800569c: 59 60 00 6c sw (r11+108),r0 tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT; 80056a0: 59 60 00 70 sw (r11+112),r0 tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT; 80056a4: 59 60 00 74 sw (r11+116),r0 } else { tty->rawInBufSemaphoreOptions = RTEMS_NO_WAIT; } } } if (tty->device.setAttributes) 80056a8: 29 63 00 a8 lw r3,(r11+168) 80056ac: 44 60 ff 85 be r3,r0,80054c0 <== NEVER TAKEN (*tty->device.setAttributes)(tty->minor, &tty->termios); 80056b0: 29 61 00 10 lw r1,(r11+16) 80056b4: 35 62 00 30 addi r2,r11,48 80056b8: d8 60 00 00 call r3 80056bc: e3 ff ff 81 bi 80054c0 case TIOCGETD: *(int*)(args->buffer)=tty->t_line; break; #endif case FIONREAD: { int rawnc = tty->rawInBuf.Tail - tty->rawInBuf.Head; 80056c0: 29 62 00 60 lw r2,(r11+96) <== NOT EXECUTED 80056c4: 29 61 00 5c lw r1,(r11+92) <== NOT EXECUTED 80056c8: c8 41 08 00 sub r1,r2,r1 <== NOT EXECUTED if ( rawnc < 0 ) 80056cc: 4c 20 00 03 bge r1,r0,80056d8 <== NOT EXECUTED rawnc += tty->rawInBuf.Size; 80056d0: 29 62 00 64 lw r2,(r11+100) <== NOT EXECUTED 80056d4: 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; 80056d8: 29 64 00 20 lw r4,(r11+32) <== NOT EXECUTED 80056dc: 29 62 00 24 lw r2,(r11+36) <== NOT EXECUTED 80056e0: 29 83 00 08 lw r3,(r12+8) <== NOT EXECUTED 80056e4: c8 82 10 00 sub r2,r4,r2 <== NOT EXECUTED 80056e8: b4 41 08 00 add r1,r2,r1 <== NOT EXECUTED 80056ec: 58 61 00 00 sw (r3+0),r1 <== NOT EXECUTED } break; 80056f0: e3 ff ff 74 bi 80054c0 <== NOT EXECUTED sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) { args->ioctl_return = sc; return sc; } switch (args->command) { 80056f4: 78 03 08 02 mvhi r3,0x802 80056f8: 38 63 20 84 ori r3,r3,0x2084 80056fc: 28 62 00 00 lw r2,(r3+0) 8005700: 44 22 00 23 be r1,r2,800578c 8005704: 78 03 08 02 mvhi r3,0x802 8005708: 38 63 20 88 ori r3,r3,0x2088 800570c: 28 62 00 00 lw r2,(r3+0) 8005710: 5c 22 ff 57 bne r1,r2,800546c <== NEVER TAKEN #if 1 /* FIXME */ case TIOCSETD: /* * close old line discipline */ if (rtems_termios_linesw[tty->t_line].l_close != NULL) { 8005714: 29 62 00 cc lw r2,(r11+204) 8005718: 78 0e 08 02 mvhi r14,0x802 800571c: 39 ce 49 44 ori r14,r14,0x4944 8005720: b4 42 10 00 add r2,r2,r2 8005724: b4 42 10 00 add r2,r2,r2 8005728: b4 42 10 00 add r2,r2,r2 800572c: b4 42 10 00 add r2,r2,r2 8005730: b4 42 10 00 add r2,r2,r2 8005734: b5 c2 10 00 add r2,r14,r2 8005738: 28 42 00 04 lw r2,(r2+4) 800573c: 44 40 00 04 be r2,r0,800574c sc = rtems_termios_linesw[tty->t_line].l_close(tty); 8005740: b9 60 08 00 mv r1,r11 8005744: d8 40 00 00 call r2 8005748: b8 20 68 00 mv r13,r1 } tty->t_line=*(int*)(args->buffer); 800574c: 29 81 00 08 lw r1,(r12+8) 8005750: 28 22 00 00 lw r2,(r1+0) tty->t_sc = NULL; /* ensure that no more valid data */ 8005754: 59 60 00 d0 sw (r11+208),r0 /* * open new line discipline */ if (rtems_termios_linesw[tty->t_line].l_open != NULL) { 8005758: b4 42 08 00 add r1,r2,r2 800575c: b4 21 08 00 add r1,r1,r1 8005760: b4 21 08 00 add r1,r1,r1 8005764: b4 21 08 00 add r1,r1,r1 8005768: b4 21 08 00 add r1,r1,r1 800576c: b5 c1 08 00 add r1,r14,r1 8005770: 28 23 00 00 lw r3,(r1+0) * 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); 8005774: 59 62 00 cc sw (r11+204),r2 tty->t_sc = NULL; /* ensure that no more valid data */ /* * open new line discipline */ if (rtems_termios_linesw[tty->t_line].l_open != NULL) { 8005778: 44 60 ff 52 be r3,r0,80054c0 <== NEVER TAKEN sc = rtems_termios_linesw[tty->t_line].l_open(tty); 800577c: b9 60 08 00 mv r1,r11 8005780: d8 60 00 00 call r3 8005784: b8 20 68 00 mv r13,r1 8005788: e3 ff ff 4e bi 80054c0 } break; case TIOCGETD: *(int*)(args->buffer)=tty->t_line; 800578c: 29 81 00 08 lw r1,(r12+8) 8005790: 29 62 00 cc lw r2,(r11+204) 8005794: 58 22 00 00 sw (r1+0),r2 break; 8005798: e3 ff ff 4a bi 80054c0 sc = RTEMS_INVALID_NUMBER; } break; case RTEMS_IO_GET_ATTRIBUTES: *(struct termios *)args->buffer = tty->termios; 800579c: 29 62 00 30 lw r2,(r11+48) 80057a0: 29 81 00 08 lw r1,(r12+8) 80057a4: 58 22 00 00 sw (r1+0),r2 80057a8: 29 62 00 34 lw r2,(r11+52) 80057ac: 58 22 00 04 sw (r1+4),r2 80057b0: 29 62 00 38 lw r2,(r11+56) 80057b4: 58 22 00 08 sw (r1+8),r2 80057b8: 29 62 00 3c lw r2,(r11+60) 80057bc: 58 22 00 0c sw (r1+12),r2 80057c0: 29 62 00 40 lw r2,(r11+64) 80057c4: 58 22 00 10 sw (r1+16),r2 80057c8: 29 62 00 44 lw r2,(r11+68) 80057cc: 58 22 00 14 sw (r1+20),r2 80057d0: 29 62 00 48 lw r2,(r11+72) 80057d4: 58 22 00 18 sw (r1+24),r2 80057d8: 29 62 00 4c lw r2,(r11+76) 80057dc: 58 22 00 1c sw (r1+28),r2 80057e0: 29 62 00 50 lw r2,(r11+80) 80057e4: 58 22 00 20 sw (r1+32),r2 break; 80057e8: e3 ff ff 36 bi 80054c0 if (tty->device.setAttributes) (*tty->device.setAttributes)(tty->minor, &tty->termios); break; case RTEMS_IO_TCDRAIN: drainOutput (tty); 80057ec: b9 60 08 00 mv r1,r11 80057f0: fb ff fd 37 calli 8004ccc break; 80057f4: e3 ff ff 33 bi 80054c0 /* FIXME: what happens, if we had sent XOFF but not yet XON? */ tty->flow_ctrl &= ~(FL_ISNTXOF); } /* check for incoming RTS/CTS flow control switched off */ if (( tty->flow_ctrl & FL_MDRTS) && !(tty->termios.c_cflag & CRTSCTS)) { 80057f8: 29 62 00 38 lw r2,(r11+56) 80057fc: e3 ff ff 96 bi 8005654 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)( 8005800: 29 63 00 7c lw r3,(r11+124) <== NOT EXECUTED tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1); 8005804: 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)( 8005808: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED 800580c: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED 8005810: b4 62 10 00 add r2,r3,r2 <== NOT EXECUTED 8005814: 34 03 00 01 mvi r3,1 <== NOT EXECUTED 8005818: d8 80 00 00 call r4 <== NOT EXECUTED tty->minor, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1); } /* reenable interrupts */ rtems_interrupt_enable(level); 800581c: d0 0e 00 00 wcsr IE,r14 <== NOT EXECUTED 8005820: e3 ff ff 6a bi 80055c8 <== NOT EXECUTED if (tty->termios.c_lflag & ICANON) { tty->rawInBufSemaphoreOptions = RTEMS_WAIT; tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT; tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT; } else { tty->vtimeTicks = tty->termios.c_cc[VTIME] * 8005824: 41 6f 00 46 lbu r15,(r11+70) rtems_clock_get_ticks_per_second() / 10; 8005828: f8 00 06 28 calli 80070c8 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] * 800582c: b9 e0 10 00 mv r2,r15 8005830: f8 00 68 bd calli 801fb24 <__mulsi3> rtems_clock_get_ticks_per_second() / 10; 8005834: 34 02 00 0a mvi r2,10 8005838: f8 00 69 20 calli 801fcb8 <__udivsi3> if (tty->termios.c_cc[VTIME]) { 800583c: 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] * 8005840: 59 61 00 54 sw (r11+84),r1 rtems_clock_get_ticks_per_second() / 10; if (tty->termios.c_cc[VTIME]) { 8005844: 44 4e 00 07 be r2,r14,8005860 tty->rawInBufSemaphoreOptions = RTEMS_WAIT; tty->rawInBufSemaphoreTimeout = tty->vtimeTicks; if (tty->termios.c_cc[VMIN]) 8005848: 41 62 00 47 lbu r2,(r11+71) tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT; } else { tty->vtimeTicks = tty->termios.c_cc[VTIME] * rtems_clock_get_ticks_per_second() / 10; if (tty->termios.c_cc[VTIME]) { tty->rawInBufSemaphoreOptions = RTEMS_WAIT; 800584c: 59 60 00 6c sw (r11+108),r0 tty->rawInBufSemaphoreTimeout = tty->vtimeTicks; 8005850: 59 61 00 70 sw (r11+112),r1 if (tty->termios.c_cc[VMIN]) 8005854: 5c 40 ff 94 bne r2,r0,80056a4 tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT; else tty->rawInBufSemaphoreFirstTimeout = tty->vtimeTicks; 8005858: 59 61 00 74 sw (r11+116),r1 800585c: e3 ff ff 93 bi 80056a8 } else { if (tty->termios.c_cc[VMIN]) { 8005860: 41 61 00 47 lbu r1,(r11+71) 8005864: 5c 22 ff 8e bne r1,r2,800569c <== NEVER TAKEN tty->rawInBufSemaphoreOptions = RTEMS_WAIT; tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT; tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT; } else { tty->rawInBufSemaphoreOptions = RTEMS_NO_WAIT; 8005868: 34 01 00 01 mvi r1,1 800586c: 59 61 00 6c sw (r11+108),r1 8005870: e3 ff ff 8e bi 80056a8 =============================================================================== 08004d64 : rtems_device_major_number major, rtems_device_minor_number minor, void *arg, const rtems_termios_callbacks *callbacks ) { 8004d64: 37 9c ff cc addi sp,sp,-52 8004d68: 5b 8b 00 34 sw (sp+52),r11 8004d6c: 5b 8c 00 30 sw (sp+48),r12 8004d70: 5b 8d 00 2c sw (sp+44),r13 8004d74: 5b 8e 00 28 sw (sp+40),r14 8004d78: 5b 8f 00 24 sw (sp+36),r15 8004d7c: 5b 90 00 20 sw (sp+32),r16 8004d80: 5b 91 00 1c sw (sp+28),r17 8004d84: 5b 92 00 18 sw (sp+24),r18 8004d88: 5b 93 00 14 sw (sp+20),r19 8004d8c: 5b 94 00 10 sw (sp+16),r20 8004d90: 5b 95 00 0c sw (sp+12),r21 8004d94: 5b 96 00 08 sw (sp+8),r22 8004d98: 5b 9d 00 04 sw (sp+4),ra struct rtems_termios_tty *tty; /* * See if the device has already been opened */ sc = rtems_semaphore_obtain( 8004d9c: 78 0d 08 02 mvhi r13,0x802 8004da0: 39 ad 4b 10 ori r13,r13,0x4b10 rtems_device_major_number major, rtems_device_minor_number minor, void *arg, const rtems_termios_callbacks *callbacks ) { 8004da4: b8 20 60 00 mv r12,r1 struct rtems_termios_tty *tty; /* * See if the device has already been opened */ sc = rtems_semaphore_obtain( 8004da8: 29 a1 00 00 lw r1,(r13+0) rtems_device_major_number major, rtems_device_minor_number minor, void *arg, const rtems_termios_callbacks *callbacks ) { 8004dac: b8 40 78 00 mv r15,r2 8004db0: b8 60 98 00 mv r19,r3 struct rtems_termios_tty *tty; /* * See if the device has already been opened */ sc = rtems_semaphore_obtain( 8004db4: 34 02 00 00 mvi r2,0 8004db8: 34 03 00 00 mvi r3,0 rtems_device_major_number major, rtems_device_minor_number minor, void *arg, const rtems_termios_callbacks *callbacks ) { 8004dbc: b8 80 a0 00 mv r20,r4 struct rtems_termios_tty *tty; /* * See if the device has already been opened */ sc = rtems_semaphore_obtain( 8004dc0: f8 00 0a cc calli 80078f0 8004dc4: b8 20 70 00 mv r14,r1 rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) 8004dc8: 5c 20 00 1e bne r1,r0,8004e40 <== NEVER TAKEN return sc; for (tty = rtems_termios_ttyHead ; tty != NULL ; tty = tty->forw) { 8004dcc: 78 10 08 02 mvhi r16,0x802 8004dd0: 3a 10 4b 18 ori r16,r16,0x4b18 8004dd4: 2a 12 00 00 lw r18,(r16+0) 8004dd8: 46 41 00 38 be r18,r1,8004eb8 <== ALWAYS TAKEN 8004ddc: ba 40 58 00 mv r11,r18 <== NOT EXECUTED 8004de0: e0 00 00 03 bi 8004dec <== NOT EXECUTED 8004de4: 29 6b 00 00 lw r11,(r11+0) <== NOT EXECUTED 8004de8: 45 60 00 34 be r11,r0,8004eb8 <== NOT EXECUTED if ((tty->major == major) && (tty->minor == minor)) 8004dec: 29 65 00 0c lw r5,(r11+12) <== NOT EXECUTED 8004df0: 5c ac ff fd bne r5,r12,8004de4 <== NOT EXECUTED 8004df4: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED 8004df8: 5c 2f ff fb bne r1,r15,8004de4 <== NOT EXECUTED */ if (c++ == 'z') c = 'a'; } args->iop->data1 = tty; 8004dfc: 2a 61 00 00 lw r1,(r19+0) if (!tty->refcount++) { 8004e00: 29 62 00 08 lw r2,(r11+8) */ if (c++ == 'z') c = 'a'; } args->iop->data1 = tty; 8004e04: 58 2b 00 38 sw (r1+56),r11 if (!tty->refcount++) { 8004e08: 34 41 00 01 addi r1,r2,1 8004e0c: 59 61 00 08 sw (r11+8),r1 8004e10: 5c 40 00 0a bne r2,r0,8004e38 <== NEVER TAKEN if (tty->device.firstOpen) 8004e14: 29 64 00 98 lw r4,(r11+152) 8004e18: 44 82 00 05 be r4,r2,8004e2c <== ALWAYS TAKEN (*tty->device.firstOpen)(major, minor, arg); 8004e1c: b9 80 08 00 mv r1,r12 <== NOT EXECUTED 8004e20: b9 e0 10 00 mv r2,r15 <== NOT EXECUTED 8004e24: ba 60 18 00 mv r3,r19 <== NOT EXECUTED 8004e28: d8 80 00 00 call r4 <== NOT EXECUTED /* * start I/O tasks, if needed */ if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { 8004e2c: 29 62 00 b4 lw r2,(r11+180) 8004e30: 34 01 00 02 mvi r1,2 8004e34: 44 41 00 13 be r2,r1,8004e80 tty->txTaskId, rtems_termios_txdaemon, (rtems_task_argument)tty); if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); } } rtems_semaphore_release (rtems_termios_ttyMutex); 8004e38: 29 a1 00 00 lw r1,(r13+0) 8004e3c: f8 00 0b 09 calli 8007a60 return RTEMS_SUCCESSFUL; } 8004e40: b9 c0 08 00 mv r1,r14 8004e44: 2b 9d 00 04 lw ra,(sp+4) 8004e48: 2b 8b 00 34 lw r11,(sp+52) 8004e4c: 2b 8c 00 30 lw r12,(sp+48) 8004e50: 2b 8d 00 2c lw r13,(sp+44) 8004e54: 2b 8e 00 28 lw r14,(sp+40) 8004e58: 2b 8f 00 24 lw r15,(sp+36) 8004e5c: 2b 90 00 20 lw r16,(sp+32) 8004e60: 2b 91 00 1c lw r17,(sp+28) 8004e64: 2b 92 00 18 lw r18,(sp+24) 8004e68: 2b 93 00 14 lw r19,(sp+20) 8004e6c: 2b 94 00 10 lw r20,(sp+16) 8004e70: 2b 95 00 0c lw r21,(sp+12) 8004e74: 2b 96 00 08 lw r22,(sp+8) 8004e78: 37 9c 00 34 addi sp,sp,52 8004e7c: c3 a0 00 00 ret /* * start I/O tasks, if needed */ if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { sc = rtems_task_start( 8004e80: 29 61 00 c4 lw r1,(r11+196) 8004e84: 78 02 08 00 mvhi r2,0x800 8004e88: 38 42 68 b4 ori r2,r2,0x68b4 8004e8c: b9 60 18 00 mv r3,r11 8004e90: f8 00 0b d7 calli 8007dec 8004e94: b8 20 60 00 mv r12,r1 tty->rxTaskId, rtems_termios_rxdaemon, (rtems_task_argument)tty); if (sc != RTEMS_SUCCESSFUL) 8004e98: 5c 20 00 bd bne r1,r0,800518c <== NEVER TAKEN rtems_fatal_error_occurred (sc); sc = rtems_task_start( 8004e9c: 29 61 00 c8 lw r1,(r11+200) 8004ea0: 78 02 08 00 mvhi r2,0x800 8004ea4: 38 42 6b b4 ori r2,r2,0x6bb4 8004ea8: b9 60 18 00 mv r3,r11 8004eac: f8 00 0b d0 calli 8007dec tty->txTaskId, rtems_termios_txdaemon, (rtems_task_argument)tty); if (sc != RTEMS_SUCCESSFUL) 8004eb0: 44 2c ff e2 be r1,r12,8004e38 <== ALWAYS TAKEN 8004eb4: e0 00 00 b6 bi 800518c <== NOT EXECUTED static char c = 'a'; /* * Create a new device */ tty = calloc (1, sizeof (struct rtems_termios_tty)); 8004eb8: 34 01 00 01 mvi r1,1 8004ebc: 34 02 00 e8 mvi r2,232 8004ec0: fb ff f7 b8 calli 8002da0 8004ec4: b8 20 88 00 mv r17,r1 8004ec8: b8 20 58 00 mv r11,r1 if (tty == NULL) { 8004ecc: 44 20 00 a1 be r1,r0,8005150 <== NEVER TAKEN return RTEMS_NO_MEMORY; } /* * allocate raw input buffer */ tty->rawInBuf.Size = RAW_INPUT_BUFFER_SIZE; 8004ed0: 78 01 08 02 mvhi r1,0x802 8004ed4: 38 21 43 44 ori r1,r1,0x4344 8004ed8: 28 21 00 00 lw r1,(r1+0) 8004edc: 5a 21 00 64 sw (r17+100),r1 tty->rawInBuf.theBuf = malloc (tty->rawInBuf.Size); 8004ee0: 2a 21 00 64 lw r1,(r17+100) 8004ee4: fb ff fb 42 calli 8003bec 8004ee8: 5a 21 00 58 sw (r17+88),r1 8004eec: b8 20 a8 00 mv r21,r1 if (tty->rawInBuf.theBuf == NULL) { 8004ef0: 44 20 00 96 be r1,r0,8005148 <== NEVER TAKEN return RTEMS_NO_MEMORY; } /* * allocate raw output buffer */ tty->rawOutBuf.Size = RAW_OUTPUT_BUFFER_SIZE; 8004ef4: 78 01 08 02 mvhi r1,0x802 8004ef8: 38 21 43 48 ori r1,r1,0x4348 8004efc: 28 21 00 00 lw r1,(r1+0) 8004f00: 5a 21 00 88 sw (r17+136),r1 tty->rawOutBuf.theBuf = malloc (tty->rawOutBuf.Size); 8004f04: 2a 21 00 88 lw r1,(r17+136) 8004f08: fb ff fb 39 calli 8003bec 8004f0c: 5a 21 00 7c sw (r17+124),r1 8004f10: b8 20 b0 00 mv r22,r1 if (tty->rawOutBuf.theBuf == NULL) { 8004f14: 44 20 00 8b be r1,r0,8005140 <== NEVER TAKEN return RTEMS_NO_MEMORY; } /* * allocate cooked buffer */ tty->cbuf = malloc (CBUFSIZE); 8004f18: 78 01 08 02 mvhi r1,0x802 8004f1c: 38 21 43 40 ori r1,r1,0x4340 8004f20: 28 21 00 00 lw r1,(r1+0) 8004f24: fb ff fb 32 calli 8003bec 8004f28: 5a 21 00 1c sw (r17+28),r1 if (tty->cbuf == NULL) { 8004f2c: 44 20 00 83 be r1,r0,8005138 <== NEVER TAKEN return RTEMS_NO_MEMORY; } /* * Initialize wakeup callbacks */ tty->tty_snd.sw_pfn = NULL; 8004f30: 5a 20 00 d4 sw (r17+212),r0 tty->tty_snd.sw_arg = NULL; 8004f34: 5a 20 00 d8 sw (r17+216),r0 tty->tty_rcv.sw_pfn = NULL; 8004f38: 5a 20 00 dc sw (r17+220),r0 tty->tty_rcv.sw_arg = NULL; 8004f3c: 5a 20 00 e0 sw (r17+224),r0 tty->tty_rcvwakeup = 0; 8004f40: 5a 20 00 e4 sw (r17+228),r0 /* * link tty */ tty->forw = rtems_termios_ttyHead; 8004f44: 5a 32 00 00 sw (r17+0),r18 tty->back = NULL; 8004f48: 5a 20 00 04 sw (r17+4),r0 if (rtems_termios_ttyHead != NULL) 8004f4c: 46 40 00 02 be r18,r0,8004f54 <== ALWAYS TAKEN rtems_termios_ttyHead->back = tty; 8004f50: 5a 51 00 04 sw (r18+4),r17 <== NOT EXECUTED rtems_termios_ttyHead = tty; if (rtems_termios_ttyTail == NULL) 8004f54: 78 01 08 02 mvhi r1,0x802 8004f58: 38 21 4b 14 ori r1,r1,0x4b14 8004f5c: 28 22 00 00 lw r2,(r1+0) */ tty->forw = rtems_termios_ttyHead; tty->back = NULL; if (rtems_termios_ttyHead != NULL) rtems_termios_ttyHead->back = tty; rtems_termios_ttyHead = tty; 8004f60: 5a 11 00 00 sw (r16+0),r17 if (rtems_termios_ttyTail == NULL) 8004f64: 44 40 00 a5 be r2,r0,80051f8 <== ALWAYS TAKEN /* * Set up mutex semaphores */ sc = rtems_semaphore_create ( rtems_build_name ('T', 'R', 'i', c), 8004f68: 78 10 08 02 mvhi r16,0x802 tty->major = major; /* * Set up mutex semaphores */ sc = rtems_semaphore_create ( 8004f6c: 78 05 08 02 mvhi r5,0x802 8004f70: 38 a5 20 68 ori r5,r5,0x2068 rtems_build_name ('T', 'R', 'i', c), 8004f74: 3a 10 43 4c ori r16,r16,0x434c 8004f78: 42 04 00 00 lbu r4,(r16+0) tty->major = major; /* * Set up mutex semaphores */ sc = rtems_semaphore_create ( 8004f7c: 28 a1 00 00 lw r1,(r5+0) 8004f80: 34 02 00 01 mvi r2,1 8004f84: 34 03 00 54 mvi r3,84 8004f88: b8 81 08 00 or r1,r4,r1 8004f8c: 36 25 00 14 addi r5,r17,20 8004f90: 34 04 00 00 mvi r4,0 rtems_termios_ttyHead->back = tty; rtems_termios_ttyHead = tty; if (rtems_termios_ttyTail == NULL) rtems_termios_ttyTail = tty; tty->minor = minor; 8004f94: 5a 2f 00 10 sw (r17+16),r15 tty->major = major; 8004f98: 5a 2c 00 0c sw (r17+12),r12 /* * Set up mutex semaphores */ sc = rtems_semaphore_create ( 8004f9c: f8 00 09 9a calli 8007604 8004fa0: b8 20 a8 00 mv r21,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) 8004fa4: 5c 20 00 7a bne r1,r0,800518c <== NEVER TAKEN rtems_fatal_error_occurred (sc); sc = rtems_semaphore_create ( 8004fa8: 78 05 08 02 mvhi r5,0x802 8004fac: 38 a5 20 6c ori r5,r5,0x206c rtems_build_name ('T', 'R', 'o', c), 8004fb0: 42 04 00 00 lbu r4,(r16+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 ( 8004fb4: 28 a1 00 00 lw r1,(r5+0) 8004fb8: 34 02 00 01 mvi r2,1 8004fbc: 34 03 00 54 mvi r3,84 8004fc0: b8 81 08 00 or r1,r4,r1 8004fc4: 36 25 00 18 addi r5,r17,24 8004fc8: 34 04 00 00 mvi r4,0 8004fcc: f8 00 09 8e calli 8007604 8004fd0: b8 20 90 00 mv r18,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) 8004fd4: 5c 35 00 6e bne r1,r21,800518c <== NEVER TAKEN rtems_fatal_error_occurred (sc); sc = rtems_semaphore_create ( 8004fd8: 78 05 08 02 mvhi r5,0x802 8004fdc: 38 a5 20 70 ori r5,r5,0x2070 rtems_build_name ('T', 'R', 'x', c), 8004fe0: 42 04 00 00 lbu r4,(r16+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 ( 8004fe4: 28 a1 00 00 lw r1,(r5+0) 8004fe8: 34 02 00 00 mvi r2,0 8004fec: 34 03 00 20 mvi r3,32 8004ff0: b8 81 08 00 or r1,r4,r1 8004ff4: 36 25 00 8c addi r5,r17,140 8004ff8: 34 04 00 00 mvi r4,0 8004ffc: f8 00 09 82 calli 8007604 8005000: b8 20 a8 00 mv r21,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) 8005004: 5c 32 00 62 bne r1,r18,800518c <== NEVER TAKEN tty->rawOutBufState = rob_idle; /* * Set callbacks */ tty->device = *callbacks; 8005008: 2a 82 00 18 lw r2,(r20+24) 800500c: 2a 88 00 00 lw r8,(r20+0) 8005010: 2a 87 00 04 lw r7,(r20+4) 8005014: 2a 86 00 08 lw r6,(r20+8) 8005018: 2a 85 00 0c lw r5,(r20+12) 800501c: 2a 84 00 10 lw r4,(r20+16) 8005020: 2a 83 00 14 lw r3,(r20+20) 8005024: 2a 81 00 1c lw r1,(r20+28) 8005028: 5a 22 00 b0 sw (r17+176),r2 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; 800502c: 5a 20 00 94 sw (r17+148),r0 /* * Set callbacks */ tty->device = *callbacks; 8005030: 5a 28 00 98 sw (r17+152),r8 8005034: 5a 27 00 9c sw (r17+156),r7 8005038: 5a 26 00 a0 sw (r17+160),r6 800503c: 5a 25 00 a4 sw (r17+164),r5 8005040: 5a 24 00 a8 sw (r17+168),r4 8005044: 5a 23 00 ac sw (r17+172),r3 8005048: 5a 21 00 b4 sw (r17+180),r1 /* * Create I/O tasks */ if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { 800504c: 34 02 00 02 mvi r2,2 8005050: 44 22 00 50 be r1,r2,8005190 &tty->rxTaskId); if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); } if ((tty->device.pollRead == NULL) || 8005054: 2a 21 00 a0 lw r1,(r17+160) 8005058: 44 20 00 42 be r1,r0,8005160 800505c: 2a 22 00 b4 lw r2,(r17+180) 8005060: 34 01 00 02 mvi r1,2 8005064: 44 41 00 3f be r2,r1,8005160 } /* * Set default parameters */ tty->termios.c_iflag = BRKINT | ICRNL | IXON | IMAXBEL; 8005068: 34 05 25 02 mvi r5,9474 800506c: 5a 25 00 30 sw (r17+48),r5 tty->termios.c_oflag = OPOST | ONLCR | XTABS; 8005070: 34 05 18 05 mvi r5,6149 8005074: 5a 25 00 34 sw (r17+52),r5 tty->termios.c_cflag = B9600 | CS8 | CREAD | CLOCAL; 8005078: 34 05 08 bd mvi r5,2237 800507c: 5a 25 00 38 sw (r17+56),r5 tty->termios.c_lflag = 8005080: 34 a5 79 7e addi r5,r5,31102 8005084: 5a 25 00 3c sw (r17+60),r5 ISIG | ICANON | IEXTEN | ECHO | ECHOK | ECHOE | ECHOCTL; tty->termios.c_cc[VINTR] = '\003'; 8005088: 34 05 00 03 mvi r5,3 800508c: 32 25 00 41 sb (r17+65),r5 tty->termios.c_cc[VQUIT] = '\034'; 8005090: 34 05 00 1c mvi r5,28 tty->termios.c_cc[VDISCARD] = '\017'; tty->termios.c_cc[VWERASE] = '\027'; tty->termios.c_cc[VLNEXT] = '\026'; /* start with no flow control, clear flow control flags */ tty->flow_ctrl = 0; 8005094: 5a 20 00 b8 sw (r17+184),r0 tty->termios.c_cflag = B9600 | CS8 | CREAD | CLOCAL; tty->termios.c_lflag = ISIG | ICANON | IEXTEN | ECHO | ECHOK | ECHOE | ECHOCTL; tty->termios.c_cc[VINTR] = '\003'; tty->termios.c_cc[VQUIT] = '\034'; 8005098: 32 25 00 42 sb (r17+66),r5 tty->termios.c_cc[VERASE] = '\177'; 800509c: 34 05 00 7f mvi r5,127 /* 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; 80050a0: 2a 24 00 64 lw r4,(r17+100) tty->termios.c_lflag = ISIG | ICANON | IEXTEN | ECHO | ECHOK | ECHOE | ECHOCTL; tty->termios.c_cc[VINTR] = '\003'; tty->termios.c_cc[VQUIT] = '\034'; tty->termios.c_cc[VERASE] = '\177'; 80050a4: 32 25 00 43 sb (r17+67),r5 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; 80050a8: 2a 21 00 64 lw r1,(r17+100) ISIG | ICANON | IEXTEN | ECHO | ECHOK | ECHOE | ECHOCTL; tty->termios.c_cc[VINTR] = '\003'; tty->termios.c_cc[VQUIT] = '\034'; tty->termios.c_cc[VERASE] = '\177'; tty->termios.c_cc[VKILL] = '\025'; 80050ac: 34 05 00 15 mvi r5,21 80050b0: 32 25 00 44 sb (r17+68),r5 tty->termios.c_cc[VEOF] = '\004'; 80050b4: 34 05 00 04 mvi r5,4 80050b8: 32 25 00 45 sb (r17+69),r5 tty->termios.c_cc[VEOL] = '\000'; tty->termios.c_cc[VEOL2] = '\000'; tty->termios.c_cc[VSTART] = '\021'; 80050bc: 34 05 00 11 mvi r5,17 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; 80050c0: b4 21 18 00 add r3,r1,r1 tty->termios.c_cc[VERASE] = '\177'; tty->termios.c_cc[VKILL] = '\025'; tty->termios.c_cc[VEOF] = '\004'; tty->termios.c_cc[VEOL] = '\000'; tty->termios.c_cc[VEOL2] = '\000'; tty->termios.c_cc[VSTART] = '\021'; 80050c4: 32 25 00 49 sb (r17+73),r5 tty->termios.c_cc[VSTOP] = '\023'; 80050c8: 34 05 00 13 mvi r5,19 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; 80050cc: b4 61 08 00 add r1,r3,r1 tty->termios.c_cc[VKILL] = '\025'; tty->termios.c_cc[VEOF] = '\004'; tty->termios.c_cc[VEOL] = '\000'; tty->termios.c_cc[VEOL2] = '\000'; tty->termios.c_cc[VSTART] = '\021'; tty->termios.c_cc[VSTOP] = '\023'; 80050d0: 32 25 00 4a sb (r17+74),r5 tty->termios.c_cc[VSUSP] = '\032'; 80050d4: 34 05 00 1a mvi r5,26 tty->lowwater = tty->rawInBuf.Size * 1/2; tty->highwater = tty->rawInBuf.Size * 3/4; /* * Bump name characer */ if (c++ == 'z') 80050d8: 42 02 00 00 lbu r2,(r16+0) 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; 80050dc: 00 21 00 01 srui r1,r1,1 tty->termios.c_cc[VEOF] = '\004'; tty->termios.c_cc[VEOL] = '\000'; tty->termios.c_cc[VEOL2] = '\000'; tty->termios.c_cc[VSTART] = '\021'; tty->termios.c_cc[VSTOP] = '\023'; tty->termios.c_cc[VSUSP] = '\032'; 80050e0: 32 25 00 4b sb (r17+75),r5 tty->termios.c_cc[VREPRINT] = '\022'; 80050e4: 34 05 00 12 mvi r5,18 80050e8: 32 25 00 4d sb (r17+77),r5 tty->termios.c_cc[VDISCARD] = '\017'; 80050ec: 34 05 00 0f mvi r5,15 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; 80050f0: 00 21 00 01 srui r1,r1,1 /* 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; 80050f4: 00 84 00 01 srui r4,r4,1 tty->termios.c_cc[VEOL2] = '\000'; tty->termios.c_cc[VSTART] = '\021'; tty->termios.c_cc[VSTOP] = '\023'; tty->termios.c_cc[VSUSP] = '\032'; tty->termios.c_cc[VREPRINT] = '\022'; tty->termios.c_cc[VDISCARD] = '\017'; 80050f8: 32 25 00 4e sb (r17+78),r5 tty->termios.c_cc[VWERASE] = '\027'; 80050fc: 34 05 00 17 mvi r5,23 tty->lowwater = tty->rawInBuf.Size * 1/2; tty->highwater = tty->rawInBuf.Size * 3/4; /* * Bump name characer */ if (c++ == 'z') 8005100: 34 43 00 01 addi r3,r2,1 tty->termios.c_cc[VSTART] = '\021'; 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'; 8005104: 32 25 00 4f sb (r17+79),r5 tty->termios.c_cc[VLNEXT] = '\026'; 8005108: 34 05 00 16 mvi r5,22 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; 800510c: 5a 21 00 c0 sw (r17+192),r1 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'; 8005110: 32 20 00 4c sb (r17+76),r0 tty->termios.c_cc[VEOL2] = '\000'; 8005114: 32 20 00 51 sb (r17+81),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'; 8005118: 32 25 00 50 sb (r17+80),r5 /* 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; 800511c: 5a 24 00 bc sw (r17+188),r4 tty->highwater = tty->rawInBuf.Size * 3/4; /* * Bump name characer */ if (c++ == 'z') 8005120: 32 03 00 00 sb (r16+0),r3 8005124: 34 01 00 7a mvi r1,122 8005128: 5c 41 ff 35 bne r2,r1,8004dfc c = 'a'; 800512c: 34 01 00 61 mvi r1,97 8005130: 32 01 00 00 sb (r16+0),r1 8005134: e3 ff ff 32 bi 8004dfc /* * allocate cooked buffer */ tty->cbuf = malloc (CBUFSIZE); if (tty->cbuf == NULL) { free((void *)(tty->rawOutBuf.theBuf)); 8005138: ba c0 08 00 mv r1,r22 <== NOT EXECUTED 800513c: fb ff f8 c8 calli 800345c <== NOT EXECUTED free((void *)(tty->rawInBuf.theBuf)); 8005140: ba a0 08 00 mv r1,r21 8005144: fb ff f8 c6 calli 800345c free(tty); 8005148: ba 20 08 00 mv r1,r17 800514c: fb ff f8 c4 calli 800345c rtems_semaphore_release (rtems_termios_ttyMutex); 8005150: 29 a1 00 00 lw r1,(r13+0) return RTEMS_NO_MEMORY; 8005154: 34 0e 00 1a mvi r14,26 tty->cbuf = malloc (CBUFSIZE); if (tty->cbuf == NULL) { free((void *)(tty->rawOutBuf.theBuf)); free((void *)(tty->rawInBuf.theBuf)); free(tty); rtems_semaphore_release (rtems_termios_ttyMutex); 8005158: f8 00 0a 42 calli 8007a60 return RTEMS_NO_MEMORY; 800515c: e3 ff ff 39 bi 8004e40 rtems_fatal_error_occurred (sc); } if ((tty->device.pollRead == NULL) || (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)){ sc = rtems_semaphore_create ( 8005160: 78 05 08 02 mvhi r5,0x802 8005164: 38 a5 20 7c ori r5,r5,0x207c rtems_build_name ('T', 'R', 'r', c), 8005168: 42 04 00 00 lbu r4,(r16+0) rtems_fatal_error_occurred (sc); } if ((tty->device.pollRead == NULL) || (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)){ sc = rtems_semaphore_create ( 800516c: 28 a1 00 00 lw r1,(r5+0) 8005170: 34 02 00 00 mvi r2,0 8005174: 34 03 00 24 mvi r3,36 8005178: b8 81 08 00 or r1,r4,r1 800517c: 36 25 00 68 addi r5,r17,104 8005180: 34 04 00 00 mvi r4,0 8005184: f8 00 09 20 calli 8007604 rtems_build_name ('T', 'R', 'r', c), 0, RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_PRIORITY, RTEMS_NO_PRIORITY, &tty->rawInBuf.Semaphore); if (sc != RTEMS_SUCCESSFUL) 8005188: 44 20 ff b8 be r1,r0,8005068 <== ALWAYS TAKEN rtems_fatal_error_occurred (sc); sc = rtems_task_start( tty->txTaskId, rtems_termios_txdaemon, (rtems_task_argument)tty); if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); 800518c: f8 00 0b d8 calli 80080ec <== NOT EXECUTED /* * Create I/O tasks */ if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { sc = rtems_task_create ( 8005190: 78 05 08 02 mvhi r5,0x802 8005194: 38 a5 20 74 ori r5,r5,0x2074 rtems_build_name ('T', 'x', 'T', c), 8005198: 42 04 00 00 lbu r4,(r16+0) /* * Create I/O tasks */ if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { sc = rtems_task_create ( 800519c: 28 a1 00 00 lw r1,(r5+0) 80051a0: 34 02 00 0a mvi r2,10 80051a4: 34 03 04 00 mvi r3,1024 80051a8: b8 81 08 00 or r1,r4,r1 80051ac: 34 05 00 00 mvi r5,0 80051b0: 34 04 05 00 mvi r4,1280 80051b4: 36 26 00 c8 addi r6,r17,200 80051b8: f8 00 0a 63 calli 8007b44 80051bc: b8 20 90 00 mv r18,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) 80051c0: 5c 35 ff f3 bne r1,r21,800518c <== NEVER TAKEN rtems_fatal_error_occurred (sc); sc = rtems_task_create ( 80051c4: 78 05 08 02 mvhi r5,0x802 80051c8: 38 a5 20 78 ori r5,r5,0x2078 rtems_build_name ('R', 'x', 'T', c), 80051cc: 42 04 00 00 lbu r4,(r16+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 ( 80051d0: 28 a1 00 00 lw r1,(r5+0) 80051d4: 34 02 00 09 mvi r2,9 80051d8: 34 03 04 00 mvi r3,1024 80051dc: b8 81 08 00 or r1,r4,r1 80051e0: 34 05 00 00 mvi r5,0 80051e4: 34 04 05 00 mvi r4,1280 80051e8: 36 26 00 c4 addi r6,r17,196 80051ec: f8 00 0a 56 calli 8007b44 TERMIOS_RXTASK_STACKSIZE, RTEMS_NO_PREEMPT | RTEMS_NO_TIMESLICE | RTEMS_NO_ASR, RTEMS_NO_FLOATING_POINT | RTEMS_LOCAL, &tty->rxTaskId); if (sc != RTEMS_SUCCESSFUL) 80051f0: 44 32 ff 99 be r1,r18,8005054 <== ALWAYS TAKEN 80051f4: e3 ff ff e6 bi 800518c <== NOT EXECUTED tty->back = NULL; if (rtems_termios_ttyHead != NULL) rtems_termios_ttyHead->back = tty; rtems_termios_ttyHead = tty; if (rtems_termios_ttyTail == NULL) rtems_termios_ttyTail = tty; 80051f8: 58 31 00 00 sw (r1+0),r17 80051fc: e3 ff ff 5b bi 8004f68 =============================================================================== 08005874 : * Send characters to device-specific code */ void rtems_termios_puts ( const void *_buf, int len, struct rtems_termios_tty *tty) { 8005874: 37 9c ff d8 addi sp,sp,-40 8005878: 5b 8b 00 24 sw (sp+36),r11 800587c: 5b 8c 00 20 sw (sp+32),r12 8005880: 5b 8d 00 1c sw (sp+28),r13 8005884: 5b 8e 00 18 sw (sp+24),r14 8005888: 5b 8f 00 14 sw (sp+20),r15 800588c: 5b 90 00 10 sw (sp+16),r16 8005890: 5b 91 00 0c sw (sp+12),r17 8005894: 5b 92 00 08 sw (sp+8),r18 8005898: 5b 9d 00 04 sw (sp+4),ra const unsigned char *buf = _buf; unsigned int newHead; rtems_interrupt_level level; rtems_status_code sc; if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) { 800589c: 28 64 00 b4 lw r4,(r3+180) * Send characters to device-specific code */ void rtems_termios_puts ( const void *_buf, int len, struct rtems_termios_tty *tty) { 80058a0: b8 60 58 00 mv r11,r3 80058a4: b8 40 88 00 mv r17,r2 80058a8: b8 20 18 00 mv r3,r1 const unsigned char *buf = _buf; 80058ac: b8 20 80 00 mv r16,r1 unsigned int newHead; rtems_interrupt_level level; rtems_status_code sc; if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) { 80058b0: 44 80 00 39 be r4,r0,8005994 (*tty->device.write)(tty->minor, (void *)buf, len); return; } newHead = tty->rawOutBuf.Head; 80058b4: 29 6f 00 80 lw r15,(r11+128) while (len) { 80058b8: 44 40 00 3c be r2,r0,80059a8 <== NEVER TAKEN * * To minimize latency, the memcpy should be done * with interrupts enabled. */ newHead = (newHead + 1) % tty->rawOutBuf.Size; rtems_interrupt_disable (level); 80058bc: 34 0d ff fe mvi r13,-2 while (newHead == tty->rawOutBuf.Tail) { tty->rawOutBufState = rob_wait; 80058c0: 34 0e 00 02 mvi r14,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; 80058c4: 34 12 00 01 mvi r18,1 * len -= ncopy * * To minimize latency, the memcpy should be done * with interrupts enabled. */ newHead = (newHead + 1) % tty->rawOutBuf.Size; 80058c8: 29 62 00 88 lw r2,(r11+136) 80058cc: 35 e1 00 01 addi r1,r15,1 80058d0: f8 00 69 0a calli 801fcf8 <__umodsi3> 80058d4: b8 20 78 00 mv r15,r1 rtems_interrupt_disable (level); 80058d8: 90 00 20 00 rcsr r4,IE 80058dc: a0 8d 08 00 and r1,r4,r13 80058e0: d0 01 00 00 wcsr IE,r1 while (newHead == tty->rawOutBuf.Tail) { 80058e4: 29 6c 00 84 lw r12,(r11+132) 80058e8: 5d 8f 00 0d bne r12,r15,800591c tty->rawOutBufState = rob_wait; 80058ec: 59 6e 00 94 sw (r11+148),r14 rtems_interrupt_enable (level); 80058f0: d0 04 00 00 wcsr IE,r4 sc = rtems_semaphore_obtain( 80058f4: 29 61 00 8c lw r1,(r11+140) 80058f8: 34 02 00 00 mvi r2,0 80058fc: 34 03 00 00 mvi r3,0 8005900: f8 00 07 fc calli 80078f0 tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) 8005904: 5c 20 00 34 bne r1,r0,80059d4 <== NEVER TAKEN rtems_fatal_error_occurred (sc); rtems_interrupt_disable (level); 8005908: 90 00 20 00 rcsr r4,IE 800590c: a0 8d 28 00 and r5,r4,r13 8005910: d0 05 00 00 wcsr IE,r5 * 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) { 8005914: 29 65 00 84 lw r5,(r11+132) 8005918: 44 ac ff f5 be r5,r12,80058ec <== NEVER TAKEN 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++; 800591c: 29 61 00 80 lw r1,(r11+128) 8005920: 29 63 00 7c lw r3,(r11+124) 8005924: 42 02 00 00 lbu r2,(r16+0) 8005928: b4 61 08 00 add r1,r3,r1 800592c: 30 22 00 00 sb (r1+0),r2 tty->rawOutBuf.Head = newHead; if (tty->rawOutBufState == rob_idle) { 8005930: 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; 8005934: 59 6f 00 80 sw (r11+128),r15 if (tty->rawOutBufState == rob_idle) { 8005938: 5c 20 00 08 bne r1,r0,8005958 /* check, whether XOFF has been received */ if (!(tty->flow_ctrl & FL_ORCVXOF)) { 800593c: 29 62 00 b8 lw r2,(r11+184) 8005940: 20 42 00 10 andi r2,r2,0x10 8005944: 44 41 00 0a be r2,r1,800596c <== ALWAYS TAKEN (*tty->device.write)(tty->minor, (char *)&tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1); } else { /* remember that output has been stopped due to flow ctrl*/ tty->flow_ctrl |= FL_OSTOP; 8005948: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED 800594c: 38 21 00 20 ori r1,r1,0x20 <== NOT EXECUTED 8005950: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED } tty->rawOutBufState = rob_busy; 8005954: 59 72 00 94 sw (r11+148),r18 } rtems_interrupt_enable (level); 8005958: d0 04 00 00 wcsr IE,r4 len--; 800595c: 36 31 ff ff addi r17,r17,-1 if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) { (*tty->device.write)(tty->minor, (void *)buf, len); return; } newHead = tty->rawOutBuf.Head; while (len) { 8005960: 46 20 00 12 be r17,r0,80059a8 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++; 8005964: 36 10 00 01 addi r16,r16,1 8005968: e3 ff ff d8 bi 80058c8 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, 800596c: 29 63 00 7c lw r3,(r11+124) (char *)&tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1); 8005970: 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, 8005974: 29 65 00 a4 lw r5,(r11+164) 8005978: 29 61 00 10 lw r1,(r11+16) 800597c: b4 62 10 00 add r2,r3,r2 8005980: 5b 84 00 28 sw (sp+40),r4 8005984: 34 03 00 01 mvi r3,1 8005988: d8 a0 00 00 call r5 800598c: 2b 84 00 28 lw r4,(sp+40) 8005990: e3 ff ff f1 bi 8005954 unsigned int newHead; rtems_interrupt_level level; rtems_status_code sc; if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) { (*tty->device.write)(tty->minor, (void *)buf, len); 8005994: 29 64 00 a4 lw r4,(r11+164) 8005998: 29 61 00 10 lw r1,(r11+16) 800599c: b8 60 10 00 mv r2,r3 80059a0: ba 20 18 00 mv r3,r17 80059a4: d8 80 00 00 call r4 tty->rawOutBufState = rob_busy; } rtems_interrupt_enable (level); len--; } } 80059a8: 2b 9d 00 04 lw ra,(sp+4) 80059ac: 2b 8b 00 24 lw r11,(sp+36) 80059b0: 2b 8c 00 20 lw r12,(sp+32) 80059b4: 2b 8d 00 1c lw r13,(sp+28) 80059b8: 2b 8e 00 18 lw r14,(sp+24) 80059bc: 2b 8f 00 14 lw r15,(sp+20) 80059c0: 2b 90 00 10 lw r16,(sp+16) 80059c4: 2b 91 00 0c lw r17,(sp+12) 80059c8: 2b 92 00 08 lw r18,(sp+8) 80059cc: 37 9c 00 28 addi sp,sp,40 80059d0: c3 a0 00 00 ret tty->rawOutBufState = rob_wait; rtems_interrupt_enable (level); sc = rtems_semaphore_obtain( tty->rawOutBuf.Semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); 80059d4: f8 00 09 c6 calli 80080ec <== NOT EXECUTED =============================================================================== 08006194 : return RTEMS_SUCCESSFUL; } rtems_status_code rtems_termios_read (void *arg) { 8006194: 37 9c ff cc addi sp,sp,-52 8006198: 5b 8b 00 34 sw (sp+52),r11 800619c: 5b 8c 00 30 sw (sp+48),r12 80061a0: 5b 8d 00 2c sw (sp+44),r13 80061a4: 5b 8e 00 28 sw (sp+40),r14 80061a8: 5b 8f 00 24 sw (sp+36),r15 80061ac: 5b 90 00 20 sw (sp+32),r16 80061b0: 5b 91 00 1c sw (sp+28),r17 80061b4: 5b 92 00 18 sw (sp+24),r18 80061b8: 5b 93 00 14 sw (sp+20),r19 80061bc: 5b 94 00 10 sw (sp+16),r20 80061c0: 5b 95 00 0c sw (sp+12),r21 80061c4: 5b 96 00 08 sw (sp+8),r22 80061c8: 5b 9d 00 04 sw (sp+4),ra 80061cc: b8 20 88 00 mv r17,r1 rtems_libio_rw_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 80061d0: 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); 80061d4: 34 02 00 00 mvi r2,0 80061d8: 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; 80061dc: 28 2b 00 38 lw r11,(r1+56) uint32_t count = args->count; 80061e0: 2a 2f 00 14 lw r15,(r17+20) char *buffer = args->buffer; 80061e4: 2a 30 00 10 lw r16,(r17+16) rtems_status_code sc; sc = rtems_semaphore_obtain (tty->isem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 80061e8: 29 61 00 14 lw r1,(r11+20) 80061ec: f8 00 05 c1 calli 80078f0 80061f0: b8 20 90 00 mv r18,r1 if (sc != RTEMS_SUCCESSFUL) 80061f4: 5c 20 00 13 bne r1,r0,8006240 <== NEVER TAKEN return sc; if (rtems_termios_linesw[tty->t_line].l_read != NULL) { 80061f8: 29 63 00 cc lw r3,(r11+204) 80061fc: 78 01 08 02 mvhi r1,0x802 8006200: 38 21 49 44 ori r1,r1,0x4944 8006204: b4 63 18 00 add r3,r3,r3 8006208: b4 63 18 00 add r3,r3,r3 800620c: b4 63 18 00 add r3,r3,r3 8006210: b4 63 18 00 add r3,r3,r3 8006214: b4 63 18 00 add r3,r3,r3 8006218: b4 23 18 00 add r3,r1,r3 800621c: 28 63 00 08 lw r3,(r3+8) 8006220: 44 72 00 18 be r3,r18,8006280 sc = rtems_termios_linesw[tty->t_line].l_read(tty,args); 8006224: b9 60 08 00 mv r1,r11 8006228: ba 20 10 00 mv r2,r17 800622c: d8 60 00 00 call r3 8006230: b8 20 90 00 mv r18,r1 tty->tty_rcvwakeup = 0; rtems_semaphore_release (tty->isem); 8006234: 29 61 00 14 lw r1,(r11+20) if (sc != RTEMS_SUCCESSFUL) return sc; if (rtems_termios_linesw[tty->t_line].l_read != NULL) { sc = rtems_termios_linesw[tty->t_line].l_read(tty,args); tty->tty_rcvwakeup = 0; 8006238: 59 60 00 e4 sw (r11+228),r0 rtems_semaphore_release (tty->isem); 800623c: f8 00 06 09 calli 8007a60 } args->bytes_moved = args->count - count; tty->tty_rcvwakeup = 0; rtems_semaphore_release (tty->isem); return sc; } 8006240: ba 40 08 00 mv r1,r18 8006244: 2b 9d 00 04 lw ra,(sp+4) 8006248: 2b 8b 00 34 lw r11,(sp+52) 800624c: 2b 8c 00 30 lw r12,(sp+48) 8006250: 2b 8d 00 2c lw r13,(sp+44) 8006254: 2b 8e 00 28 lw r14,(sp+40) 8006258: 2b 8f 00 24 lw r15,(sp+36) 800625c: 2b 90 00 20 lw r16,(sp+32) 8006260: 2b 91 00 1c lw r17,(sp+28) 8006264: 2b 92 00 18 lw r18,(sp+24) 8006268: 2b 93 00 14 lw r19,(sp+20) 800626c: 2b 94 00 10 lw r20,(sp+16) 8006270: 2b 95 00 0c lw r21,(sp+12) 8006274: 2b 96 00 08 lw r22,(sp+8) 8006278: 37 9c 00 34 addi sp,sp,52 800627c: c3 a0 00 00 ret tty->tty_rcvwakeup = 0; rtems_semaphore_release (tty->isem); return sc; } if (tty->cindex == tty->ccount) { 8006280: 29 62 00 24 lw r2,(r11+36) 8006284: 29 61 00 20 lw r1,(r11+32) 8006288: 44 41 00 15 be r2,r1,80062dc <== ALWAYS TAKEN sc = fillBufferQueue (tty); if (sc != RTEMS_SUCCESSFUL) tty->cindex = tty->ccount = 0; } while (count && (tty->cindex < tty->ccount)) { 800628c: 45 e0 00 0d be r15,r0,80062c0 <== NEVER TAKEN 8006290: 29 63 00 24 lw r3,(r11+36) 8006294: 29 61 00 20 lw r1,(r11+32) 8006298: 4c 61 00 0a bge r3,r1,80062c0 *buffer++ = tty->cbuf[tty->cindex++]; 800629c: 29 62 00 1c lw r2,(r11+28) count--; 80062a0: 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++]; 80062a4: b4 43 10 00 add r2,r2,r3 80062a8: 40 41 00 00 lbu r1,(r2+0) 80062ac: 34 63 00 01 addi r3,r3,1 80062b0: 32 01 00 00 sb (r16+0),r1 80062b4: 59 63 00 24 sw (r11+36),r3 80062b8: 36 10 00 01 addi r16,r16,1 sc = fillBufferQueue (tty); if (sc != RTEMS_SUCCESSFUL) tty->cindex = tty->ccount = 0; } while (count && (tty->cindex < tty->ccount)) { 80062bc: 5d e0 ff f6 bne r15,r0,8006294 *buffer++ = tty->cbuf[tty->cindex++]; count--; } args->bytes_moved = args->count - count; 80062c0: 2a 22 00 14 lw r2,(r17+20) tty->tty_rcvwakeup = 0; rtems_semaphore_release (tty->isem); 80062c4: 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; 80062c8: c8 4f 78 00 sub r15,r2,r15 80062cc: 5a 2f 00 1c sw (r17+28),r15 tty->tty_rcvwakeup = 0; 80062d0: 59 60 00 e4 sw (r11+228),r0 rtems_semaphore_release (tty->isem); 80062d4: f8 00 05 e3 calli 8007a60 return sc; 80062d8: e3 ff ff da bi 8006240 return sc; } if (tty->cindex == tty->ccount) { tty->cindex = tty->ccount = 0; tty->read_start_column = tty->column; 80062dc: 29 61 00 28 lw r1,(r11+40) if (tty->device.pollRead != NULL && 80062e0: 29 62 00 a0 lw r2,(r11+160) rtems_semaphore_release (tty->isem); return sc; } if (tty->cindex == tty->ccount) { tty->cindex = tty->ccount = 0; 80062e4: 59 60 00 20 sw (r11+32),r0 80062e8: 59 60 00 24 sw (r11+36),r0 tty->read_start_column = tty->column; 80062ec: 59 61 00 2c sw (r11+44),r1 if (tty->device.pollRead != NULL && 80062f0: 44 40 00 03 be r2,r0,80062fc 80062f4: 29 61 00 b4 lw r1,(r11+180) 80062f8: 44 20 00 5d be r1,r0,800646c * Fill the input buffer from the raw input queue */ static rtems_status_code fillBufferQueue (struct rtems_termios_tty *tty) { rtems_interval timeout = tty->rawInBufSemaphoreFirstTimeout; 80062fc: 29 6e 00 74 lw r14,(r11+116) while ( wait ) { /* * Process characters read from raw queue */ while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) && (tty->ccount < (CBUFSIZE-1))) { 8006300: 78 0c 08 02 mvhi r12,0x802 static rtems_status_code fillBufferQueue (struct rtems_termios_tty *tty) { rtems_interval timeout = tty->rawInBufSemaphoreFirstTimeout; rtems_status_code sc; int wait = (int)1; 8006304: 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))) { 8006308: 39 8c 43 40 ori r12,r12,0x4340 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; 800630c: 34 14 ff fe mvi r20,-2 /* if tx stopped and XON should be sent... */ if (((tty->flow_ctrl & (FL_MDXON | FL_ISNTXOF)) 8006310: 34 13 02 02 mvi r19,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; 8006314: 34 15 ff fb mvi r21,-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)( 8006318: 35 76 00 49 addi r22,r11,73 while ( wait ) { /* * Process characters read from raw queue */ while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) && 800631c: 29 63 00 5c lw r3,(r11+92) 8006320: 29 61 00 60 lw r1,(r11+96) 8006324: 44 61 00 05 be r3,r1,8006338 (tty->ccount < (CBUFSIZE-1))) { 8006328: 29 81 00 00 lw r1,(r12+0) while ( wait ) { /* * Process characters read from raw queue */ while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) && 800632c: 29 62 00 20 lw r2,(r11+32) (tty->ccount < (CBUFSIZE-1))) { 8006330: 34 21 ff ff addi r1,r1,-1 while ( wait ) { /* * Process characters read from raw queue */ while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) && 8006334: 48 22 00 08 bg r1,r2,8006354 <== ALWAYS TAKEN } /* * Wait for characters */ if ( wait ) { 8006338: 45 a0 ff d5 be r13,r0,800628c sc = rtems_semaphore_obtain( 800633c: 29 61 00 68 lw r1,(r11+104) 8006340: 29 62 00 6c lw r2,(r11+108) 8006344: b9 c0 18 00 mv r3,r14 8006348: f8 00 05 6a calli 80078f0 tty->rawInBuf.Semaphore, tty->rawInBufSemaphoreOptions, timeout); if (sc != RTEMS_SUCCESSFUL) 800634c: 44 20 ff f4 be r1,r0,800631c <== ALWAYS TAKEN 8006350: e3 ff ff cf bi 800628c <== NOT EXECUTED 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; 8006354: 29 63 00 5c lw r3,(r11+92) 8006358: 29 62 00 64 lw r2,(r11+100) 800635c: 34 61 00 01 addi r1,r3,1 8006360: f8 00 66 66 calli 801fcf8 <__umodsi3> c = tty->rawInBuf.theBuf[newHead]; 8006364: 29 64 00 58 lw r4,(r11+88) 8006368: b4 81 20 00 add r4,r4,r1 800636c: 40 8e 00 00 lbu r14,(r4+0) tty->rawInBuf.Head = newHead; 8006370: 59 61 00 5c sw (r11+92),r1 if(((tty->rawInBuf.Tail-newHead+tty->rawInBuf.Size) 8006374: 29 64 00 60 lw r4,(r11+96) 8006378: 29 65 00 64 lw r5,(r11+100) % tty->rawInBuf.Size) 800637c: 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) 8006380: b4 a4 20 00 add r4,r5,r4 % tty->rawInBuf.Size) 8006384: c8 81 08 00 sub r1,r4,r1 8006388: f8 00 66 5c calli 801fcf8 <__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) 800638c: 29 63 00 bc lw r3,(r11+188) 8006390: 50 23 00 11 bgeu r1,r3,80063d4 <== NEVER TAKEN % tty->rawInBuf.Size) < tty->lowwater) { tty->flow_ctrl &= ~FL_IREQXOF; 8006394: 29 63 00 b8 lw r3,(r11+184) 8006398: a0 74 18 00 and r3,r3,r20 800639c: 59 63 00 b8 sw (r11+184),r3 /* if tx stopped and XON should be sent... */ if (((tty->flow_ctrl & (FL_MDXON | FL_ISNTXOF)) 80063a0: 29 63 00 b8 lw r3,(r11+184) 80063a4: 20 63 02 02 andi r3,r3,0x202 80063a8: 44 73 00 26 be r3,r19,8006440 <== NEVER TAKEN && ((tty->rawOutBufState == rob_idle) || (tty->flow_ctrl & FL_OSTOP))) { /* XON should be sent now... */ (*tty->device.write)( tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1); } else if (tty->flow_ctrl & FL_MDRTS) { 80063ac: 29 63 00 b8 lw r3,(r11+184) 80063b0: 20 63 01 00 andi r3,r3,0x100 80063b4: 44 60 00 08 be r3,r0,80063d4 <== ALWAYS TAKEN tty->flow_ctrl &= ~FL_IRTSOFF; 80063b8: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED /* activate RTS line */ if (tty->device.startRemoteTx != NULL) { 80063bc: 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; 80063c0: a0 35 08 00 and r1,r1,r21 <== NOT EXECUTED 80063c4: 59 61 00 b8 sw (r11+184),r1 <== NOT EXECUTED /* activate RTS line */ if (tty->device.startRemoteTx != NULL) { 80063c8: 44 60 00 03 be r3,r0,80063d4 <== NOT EXECUTED tty->device.startRemoteTx(tty->minor); 80063cc: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED 80063d0: d8 60 00 00 call r3 <== NOT EXECUTED } } } /* continue processing new character */ if (tty->termios.c_lflag & ICANON) { 80063d4: 29 63 00 3c lw r3,(r11+60) 80063d8: 20 63 00 02 andi r3,r3,0x2 80063dc: 44 60 00 10 be r3,r0,800641c <== NEVER TAKEN if (siproc (c, tty)) 80063e0: b9 c0 08 00 mv r1,r14 80063e4: b9 60 10 00 mv r2,r11 80063e8: fb ff ff 05 calli 8005ffc wait = 0; 80063ec: 64 23 00 00 cmpei r3,r1,0 80063f0: c8 03 18 00 sub r3,r0,r3 80063f4: a1 a3 68 00 and r13,r13,r3 while ( wait ) { /* * Process characters read from raw queue */ while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) && 80063f8: 29 65 00 5c lw r5,(r11+92) 80063fc: 29 64 00 60 lw r4,(r11+96) } else { siproc (c, tty); if (tty->ccount >= tty->termios.c_cc[VMIN]) wait = 0; } timeout = tty->rawInBufSemaphoreTimeout; 8006400: 29 6e 00 70 lw r14,(r11+112) while ( wait ) { /* * Process characters read from raw queue */ while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) && 8006404: 44 a4 ff cd be r5,r4,8006338 (tty->ccount < (CBUFSIZE-1))) { 8006408: 29 84 00 00 lw r4,(r12+0) while ( wait ) { /* * Process characters read from raw queue */ while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) && 800640c: 29 63 00 20 lw r3,(r11+32) (tty->ccount < (CBUFSIZE-1))) { 8006410: 34 84 ff ff addi r4,r4,-1 while ( wait ) { /* * Process characters read from raw queue */ while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) && 8006414: 48 83 ff d0 bg r4,r3,8006354 <== ALWAYS TAKEN 8006418: e3 ff ff c8 bi 8006338 <== NOT EXECUTED /* continue processing new character */ if (tty->termios.c_lflag & ICANON) { if (siproc (c, tty)) wait = 0; } else { siproc (c, tty); 800641c: b9 c0 08 00 mv r1,r14 <== NOT EXECUTED 8006420: b9 60 10 00 mv r2,r11 <== NOT EXECUTED 8006424: fb ff fe f6 calli 8005ffc <== NOT EXECUTED if (tty->ccount >= tty->termios.c_cc[VMIN]) 8006428: 41 63 00 47 lbu r3,(r11+71) <== NOT EXECUTED 800642c: 29 61 00 20 lw r1,(r11+32) <== NOT EXECUTED wait = 0; 8006430: e8 61 18 00 cmpg r3,r3,r1 <== NOT EXECUTED 8006434: c8 03 18 00 sub r3,r0,r3 <== NOT EXECUTED 8006438: a1 a3 68 00 and r13,r13,r3 <== NOT EXECUTED 800643c: e3 ff ff ef bi 80063f8 <== NOT EXECUTED < tty->lowwater) { tty->flow_ctrl &= ~FL_IREQXOF; /* if tx stopped and XON should be sent... */ if (((tty->flow_ctrl & (FL_MDXON | FL_ISNTXOF)) == (FL_MDXON | FL_ISNTXOF)) && ((tty->rawOutBufState == rob_idle) 8006440: 29 61 00 94 lw r1,(r11+148) <== NOT EXECUTED 8006444: 44 20 00 04 be r1,r0,8006454 <== NOT EXECUTED || (tty->flow_ctrl & FL_OSTOP))) { 8006448: 29 61 00 b8 lw r1,(r11+184) <== NOT EXECUTED 800644c: 20 21 00 20 andi r1,r1,0x20 <== NOT EXECUTED 8006450: 44 20 ff d7 be r1,r0,80063ac <== NOT EXECUTED /* XON should be sent now... */ (*tty->device.write)( 8006454: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED 8006458: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED 800645c: ba c0 10 00 mv r2,r22 <== NOT EXECUTED 8006460: 34 03 00 01 mvi r3,1 <== NOT EXECUTED 8006464: d8 80 00 00 call r4 <== NOT EXECUTED 8006468: e3 ff ff db bi 80063d4 <== NOT EXECUTED static rtems_status_code fillBufferPoll (struct rtems_termios_tty *tty) { int n; if (tty->termios.c_lflag & ICANON) { 800646c: 29 61 00 3c lw r1,(r11+60) 8006470: 20 21 00 02 andi r1,r1,0x2 8006474: 44 20 00 14 be r1,r0,80064c4 for (;;) { n = (*tty->device.pollRead)(tty->minor); 8006478: 29 61 00 10 lw r1,(r11+16) 800647c: d8 40 00 00 call r2 8006480: b8 20 18 00 mv r3,r1 if (n < 0) { rtems_task_wake_after (1); } else { if (siproc (n, tty)) 8006484: b9 60 10 00 mv r2,r11 8006488: 20 21 00 ff andi r1,r1,0xff int n; if (tty->termios.c_lflag & ICANON) { for (;;) { n = (*tty->device.pollRead)(tty->minor); if (n < 0) { 800648c: 4c 60 00 21 bge r3,r0,8006510 rtems_task_wake_after (1); 8006490: 34 01 00 01 mvi r1,1 8006494: f8 00 06 83 calli 8007ea0 static rtems_status_code fillBufferPoll (struct rtems_termios_tty *tty) { int n; if (tty->termios.c_lflag & ICANON) { 8006498: 29 62 00 a0 lw r2,(r11+160) 800649c: e3 ff ff f7 bi 8006478 break; } } rtems_task_wake_after (1); } else { siproc (n, tty); 80064a0: b9 60 10 00 mv r2,r11 80064a4: 20 21 00 ff andi r1,r1,0xff 80064a8: fb ff fe d5 calli 8005ffc if (tty->ccount >= tty->termios.c_cc[VMIN]) 80064ac: 41 62 00 47 lbu r2,(r11+71) 80064b0: 29 61 00 20 lw r1,(r11+32) 80064b4: 4c 22 ff 76 bge r1,r2,800628c <== NEVER TAKEN break; if (tty->termios.c_cc[VMIN] && tty->termios.c_cc[VTIME]) 80064b8: 44 40 00 05 be r2,r0,80064cc <== NEVER TAKEN 80064bc: 41 61 00 46 lbu r1,(r11+70) 80064c0: 44 20 00 03 be r1,r0,80064cc <== NEVER TAKEN } } } else { rtems_interval then, now; then = rtems_clock_get_ticks_since_boot(); 80064c4: f8 00 03 0d calli 80070f8 80064c8: b8 20 60 00 mv r12,r1 for (;;) { n = (*tty->device.pollRead)(tty->minor); 80064cc: 29 62 00 a0 lw r2,(r11+160) 80064d0: 29 61 00 10 lw r1,(r11+16) 80064d4: d8 40 00 00 call r2 if (n < 0) { 80064d8: 4c 20 ff f2 bge r1,r0,80064a0 if (tty->termios.c_cc[VMIN]) { 80064dc: 41 62 00 47 lbu r2,(r11+71) 80064e0: 44 40 00 10 be r2,r0,8006520 <== NEVER TAKEN if (tty->termios.c_cc[VTIME] && tty->ccount) { 80064e4: 41 61 00 46 lbu r1,(r11+70) 80064e8: 44 20 00 03 be r1,r0,80064f4 <== NEVER TAKEN 80064ec: 29 61 00 20 lw r1,(r11+32) 80064f0: 5c 20 00 0e bne r1,r0,8006528 now = rtems_clock_get_ticks_since_boot(); if ((now - then) > tty->vtimeTicks) { break; } } rtems_task_wake_after (1); 80064f4: 34 01 00 01 mvi r1,1 80064f8: f8 00 06 6a calli 8007ea0 } else { rtems_interval then, now; then = rtems_clock_get_ticks_since_boot(); for (;;) { n = (*tty->device.pollRead)(tty->minor); 80064fc: 29 62 00 a0 lw r2,(r11+160) 8006500: 29 61 00 10 lw r1,(r11+16) 8006504: d8 40 00 00 call r2 if (n < 0) { 8006508: 4c 20 ff e6 bge r1,r0,80064a0 800650c: e3 ff ff f4 bi 80064dc for (;;) { n = (*tty->device.pollRead)(tty->minor); if (n < 0) { rtems_task_wake_after (1); } else { if (siproc (n, tty)) 8006510: fb ff fe bb calli 8005ffc 8006514: 5c 20 ff 5e bne r1,r0,800628c static rtems_status_code fillBufferPoll (struct rtems_termios_tty *tty) { int n; if (tty->termios.c_lflag & ICANON) { 8006518: 29 62 00 a0 lw r2,(r11+160) 800651c: e3 ff ff d7 bi 8006478 if ((now - then) > tty->vtimeTicks) { break; } } } else { if (!tty->termios.c_cc[VTIME]) 8006520: 41 61 00 46 lbu r1,(r11+70) <== NOT EXECUTED 8006524: 44 22 ff 5a be r1,r2,800628c <== NOT EXECUTED break; now = rtems_clock_get_ticks_since_boot(); 8006528: f8 00 02 f4 calli 80070f8 if ((now - then) > tty->vtimeTicks) { 800652c: 29 62 00 54 lw r2,(r11+84) 8006530: c8 2c 08 00 sub r1,r1,r12 8006534: 54 22 ff 56 bgu r1,r2,800628c 8006538: e3 ff ff ef bi 80064f4 =============================================================================== 0800694c : * 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) { 800694c: 37 9c ff f0 addi sp,sp,-16 8006950: 5b 8b 00 10 sw (sp+16),r11 8006954: 5b 8c 00 0c sw (sp+12),r12 8006958: 5b 8d 00 08 sw (sp+8),r13 800695c: 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)) 8006960: 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) { 8006964: 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)) 8006968: 34 01 04 01 mvi r1,1025 800696c: 20 42 04 03 andi r2,r2,0x403 8006970: 44 41 00 50 be r2,r1,8006ab0 <== NEVER TAKEN tty->flow_ctrl |= FL_ISNTXOF; rtems_interrupt_enable(level); nToSend = 1; } else if ((tty->flow_ctrl & (FL_IREQXOF | FL_ISNTXOF)) == FL_ISNTXOF) { 8006974: 29 62 00 b8 lw r2,(r11+184) 8006978: 34 01 00 02 mvi r1,2 800697c: 20 42 00 03 andi r2,r2,0x3 8006980: 44 41 00 64 be r2,r1,8006b10 <== NEVER TAKEN tty->flow_ctrl &= ~FL_ISNTXOF; rtems_interrupt_enable(level); nToSend = 1; } else { if ( tty->rawOutBuf.Head == tty->rawOutBuf.Tail ) { 8006984: 29 63 00 80 lw r3,(r11+128) 8006988: 29 62 00 84 lw r2,(r11+132) 800698c: 44 62 00 1c be r3,r2,80069fc rtems_semaphore_release (tty->rawOutBuf.Semaphore); } return 0; } rtems_interrupt_disable(level); 8006990: 90 00 10 00 rcsr r2,IE 8006994: 34 01 ff fe mvi r1,-2 8006998: a0 41 08 00 and r1,r2,r1 800699c: d0 01 00 00 wcsr IE,r1 len = tty->t_dqlen; 80069a0: 29 63 00 90 lw r3,(r11+144) tty->t_dqlen = 0; 80069a4: 59 60 00 90 sw (r11+144),r0 rtems_interrupt_enable(level); 80069a8: d0 02 00 00 wcsr IE,r2 newTail = (tty->rawOutBuf.Tail + len) % tty->rawOutBuf.Size; 80069ac: 29 61 00 84 lw r1,(r11+132) 80069b0: 29 62 00 88 lw r2,(r11+136) 80069b4: b4 61 08 00 add r1,r3,r1 80069b8: f8 00 64 d0 calli 801fcf8 <__umodsi3> tty->rawOutBuf.Tail = newTail; if (tty->rawOutBufState == rob_wait) { 80069bc: 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; 80069c0: b8 20 60 00 mv r12,r1 tty->rawOutBuf.Tail = newTail; 80069c4: 59 61 00 84 sw (r11+132),r1 if (tty->rawOutBufState == rob_wait) { 80069c8: 34 01 00 02 mvi r1,2 80069cc: 44 41 00 36 be r2,r1,8006aa4 * wake up any pending writer task */ rtems_semaphore_release (tty->rawOutBuf.Semaphore); } if (newTail == tty->rawOutBuf.Head) { 80069d0: 29 61 00 80 lw r1,(r11+128) 80069d4: 44 2c 00 14 be r1,r12,8006a24 if ( tty->tty_snd.sw_pfn != NULL) { (*tty->tty_snd.sw_pfn)(&tty->termios, tty->tty_snd.sw_arg); } } /* check, whether output should stop due to received XOFF */ else if ((tty->flow_ctrl & (FL_MDXON | FL_ORCVXOF)) 80069d8: 29 62 00 b8 lw r2,(r11+184) 80069dc: 34 01 02 10 mvi r1,528 80069e0: 20 42 02 10 andi r2,r2,0x210 80069e4: 44 41 00 64 be r2,r1,8006b74 <== NEVER TAKEN nToSend = 0; } else { /* * Buffer not empty, start tranmitter */ if (newTail > tty->rawOutBuf.Head) 80069e8: 29 61 00 80 lw r1,(r11+128) 80069ec: 50 2c 00 1d bgeu r1,r12,8006a60 nToSend = tty->rawOutBuf.Size - newTail; 80069f0: 29 6d 00 88 lw r13,(r11+136) 80069f4: c9 ac 68 00 sub r13,r13,r12 80069f8: e0 00 00 1c bi 8006a68 } else { if ( tty->rawOutBuf.Head == tty->rawOutBuf.Tail ) { /* * buffer was empty */ if (tty->rawOutBufState == rob_wait) { 80069fc: 29 62 00 94 lw r2,(r11+148) /* * this should never happen... */ rtems_semaphore_release (tty->rawOutBuf.Semaphore); } return 0; 8006a00: 34 0d 00 00 mvi r13,0 } else { if ( tty->rawOutBuf.Head == tty->rawOutBuf.Tail ) { /* * buffer was empty */ if (tty->rawOutBufState == rob_wait) { 8006a04: 44 41 00 69 be r2,r1,8006ba8 <== NEVER TAKEN tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend); } tty->rawOutBuf.Tail = newTail; /*apm*/ } return nToSend; } 8006a08: b9 a0 08 00 mv r1,r13 8006a0c: 2b 9d 00 04 lw ra,(sp+4) 8006a10: 2b 8b 00 10 lw r11,(sp+16) 8006a14: 2b 8c 00 0c lw r12,(sp+12) 8006a18: 2b 8d 00 08 lw r13,(sp+8) 8006a1c: 37 9c 00 10 addi sp,sp,16 8006a20: c3 a0 00 00 ret nToSend = 0; /* * check to see if snd wakeup callback was set */ if ( tty->tty_snd.sw_pfn != NULL) { 8006a24: 29 63 00 d4 lw r3,(r11+212) if (newTail == tty->rawOutBuf.Head) { /* * Buffer has become empty */ tty->rawOutBufState = rob_idle; 8006a28: 59 60 00 94 sw (r11+148),r0 nToSend = 0; 8006a2c: 34 0d 00 00 mvi r13,0 /* * check to see if snd wakeup callback was set */ if ( tty->tty_snd.sw_pfn != NULL) { 8006a30: 44 60 00 04 be r3,r0,8006a40 <== ALWAYS TAKEN (*tty->tty_snd.sw_pfn)(&tty->termios, tty->tty_snd.sw_arg); 8006a34: 29 62 00 d8 lw r2,(r11+216) <== NOT EXECUTED 8006a38: 35 61 00 30 addi r1,r11,48 <== NOT EXECUTED 8006a3c: d8 60 00 00 call r3 <== NOT EXECUTED } tty->rawOutBufState = rob_busy; /*apm*/ (*tty->device.write)( tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend); } tty->rawOutBuf.Tail = newTail; /*apm*/ 8006a40: 59 6c 00 84 sw (r11+132),r12 } return nToSend; } 8006a44: b9 a0 08 00 mv r1,r13 8006a48: 2b 9d 00 04 lw ra,(sp+4) 8006a4c: 2b 8b 00 10 lw r11,(sp+16) 8006a50: 2b 8c 00 0c lw r12,(sp+12) 8006a54: 2b 8d 00 08 lw r13,(sp+8) 8006a58: 37 9c 00 10 addi sp,sp,16 8006a5c: c3 a0 00 00 ret * Buffer not empty, start tranmitter */ if (newTail > tty->rawOutBuf.Head) nToSend = tty->rawOutBuf.Size - newTail; else nToSend = tty->rawOutBuf.Head - newTail; 8006a60: 29 6d 00 80 lw r13,(r11+128) 8006a64: c9 ac 68 00 sub r13,r13,r12 /* 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)) { 8006a68: 29 61 00 b8 lw r1,(r11+184) 8006a6c: b9 a0 18 00 mv r3,r13 8006a70: 20 21 06 00 andi r1,r1,0x600 8006a74: 44 20 00 03 be r1,r0,8006a80 8006a78: 34 03 00 01 mvi r3,1 nToSend = 1; 8006a7c: 34 0d 00 01 mvi r13,1 } tty->rawOutBufState = rob_busy; /*apm*/ (*tty->device.write)( 8006a80: 29 62 00 7c lw r2,(r11+124) 8006a84: 29 65 00 a4 lw r5,(r11+164) 8006a88: 29 61 00 10 lw r1,(r11+16) /* 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*/ 8006a8c: 34 04 00 01 mvi r4,1 8006a90: 59 64 00 94 sw (r11+148),r4 (*tty->device.write)( 8006a94: b4 4c 10 00 add r2,r2,r12 8006a98: d8 a0 00 00 call r5 tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend); } tty->rawOutBuf.Tail = newTail; /*apm*/ 8006a9c: 59 6c 00 84 sw (r11+132),r12 8006aa0: e3 ff ff e9 bi 8006a44 tty->rawOutBuf.Tail = newTail; if (tty->rawOutBufState == rob_wait) { /* * wake up any pending writer task */ rtems_semaphore_release (tty->rawOutBuf.Semaphore); 8006aa4: 29 61 00 8c lw r1,(r11+140) 8006aa8: f8 00 03 ee calli 8007a60 8006aac: e3 ff ff c9 bi 80069d0 /* check for XOF/XON to send */ if ((tty->flow_ctrl & (FL_MDXOF | FL_IREQXOF | FL_ISNTXOF)) == (FL_MDXOF | FL_IREQXOF)) { /* XOFF should be sent now... */ (*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTOP]), 1); 8006ab0: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED 8006ab4: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED 8006ab8: 35 62 00 4a addi r2,r11,74 <== NOT EXECUTED 8006abc: 34 03 00 01 mvi r3,1 <== NOT EXECUTED 8006ac0: d8 80 00 00 call r4 <== NOT EXECUTED rtems_interrupt_disable(level); 8006ac4: 90 00 08 00 rcsr r1,IE <== NOT EXECUTED 8006ac8: 34 02 ff fe mvi r2,-2 <== NOT EXECUTED 8006acc: a0 22 10 00 and r2,r1,r2 <== NOT EXECUTED 8006ad0: d0 02 00 00 wcsr IE,r2 <== NOT EXECUTED tty->t_dqlen--; 8006ad4: 29 63 00 90 lw r3,(r11+144) <== NOT EXECUTED tty->flow_ctrl |= FL_ISNTXOF; 8006ad8: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED == (FL_MDXOF | FL_IREQXOF)) { /* XOFF should be sent now... */ (*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTOP]), 1); rtems_interrupt_disable(level); tty->t_dqlen--; 8006adc: 34 63 ff ff addi r3,r3,-1 <== NOT EXECUTED tty->flow_ctrl |= FL_ISNTXOF; 8006ae0: 38 42 00 02 ori r2,r2,0x2 <== NOT EXECUTED == (FL_MDXOF | FL_IREQXOF)) { /* XOFF should be sent now... */ (*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTOP]), 1); rtems_interrupt_disable(level); tty->t_dqlen--; 8006ae4: 59 63 00 90 sw (r11+144),r3 <== NOT EXECUTED tty->flow_ctrl |= FL_ISNTXOF; 8006ae8: 59 62 00 b8 sw (r11+184),r2 <== NOT EXECUTED rtems_interrupt_enable(level); 8006aec: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED nToSend = 1; 8006af0: 34 0d 00 01 mvi r13,1 <== NOT EXECUTED tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend); } tty->rawOutBuf.Tail = newTail; /*apm*/ } return nToSend; } 8006af4: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED 8006af8: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 8006afc: 2b 8b 00 10 lw r11,(sp+16) <== NOT EXECUTED 8006b00: 2b 8c 00 0c lw r12,(sp+12) <== NOT EXECUTED 8006b04: 2b 8d 00 08 lw r13,(sp+8) <== NOT EXECUTED 8006b08: 37 9c 00 10 addi sp,sp,16 <== NOT EXECUTED 8006b0c: c3 a0 00 00 ret <== NOT EXECUTED * FIXME: this .write call will generate another * dequeue callback. This will advance the "Tail" in the data * buffer, although the corresponding data is not yet out! * Therefore the dequeue "length" should be reduced by 1 */ (*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1); 8006b10: 29 64 00 a4 lw r4,(r11+164) <== NOT EXECUTED 8006b14: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED 8006b18: 35 62 00 49 addi r2,r11,73 <== NOT EXECUTED 8006b1c: 34 03 00 01 mvi r3,1 <== NOT EXECUTED 8006b20: d8 80 00 00 call r4 <== NOT EXECUTED rtems_interrupt_disable(level); 8006b24: 90 00 08 00 rcsr r1,IE <== NOT EXECUTED 8006b28: 34 02 ff fe mvi r2,-2 <== NOT EXECUTED 8006b2c: a0 22 10 00 and r2,r1,r2 <== NOT EXECUTED 8006b30: d0 02 00 00 wcsr IE,r2 <== NOT EXECUTED tty->t_dqlen--; 8006b34: 29 63 00 90 lw r3,(r11+144) <== NOT EXECUTED tty->flow_ctrl &= ~FL_ISNTXOF; 8006b38: 29 64 00 b8 lw r4,(r11+184) <== NOT EXECUTED 8006b3c: 34 02 ff fd mvi r2,-3 <== 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--; 8006b40: 34 63 ff ff addi r3,r3,-1 <== NOT EXECUTED tty->flow_ctrl &= ~FL_ISNTXOF; 8006b44: a0 82 10 00 and r2,r4,r2 <== 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--; 8006b48: 59 63 00 90 sw (r11+144),r3 <== NOT EXECUTED tty->flow_ctrl &= ~FL_ISNTXOF; 8006b4c: 59 62 00 b8 sw (r11+184),r2 <== NOT EXECUTED rtems_interrupt_enable(level); 8006b50: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED nToSend = 1; 8006b54: 34 0d 00 01 mvi r13,1 <== NOT EXECUTED tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend); } tty->rawOutBuf.Tail = newTail; /*apm*/ } return nToSend; } 8006b58: b9 a0 08 00 mv r1,r13 <== NOT EXECUTED 8006b5c: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 8006b60: 2b 8b 00 10 lw r11,(sp+16) <== NOT EXECUTED 8006b64: 2b 8c 00 0c lw r12,(sp+12) <== NOT EXECUTED 8006b68: 2b 8d 00 08 lw r13,(sp+8) <== NOT EXECUTED 8006b6c: 37 9c 00 10 addi sp,sp,16 <== NOT EXECUTED 8006b70: c3 a0 00 00 ret <== NOT EXECUTED /* check, whether output should stop due to received XOFF */ else if ((tty->flow_ctrl & (FL_MDXON | FL_ORCVXOF)) == (FL_MDXON | FL_ORCVXOF)) { /* Buffer not empty, but output stops due to XOFF */ /* set flag, that output has been stopped */ rtems_interrupt_disable(level); 8006b74: 90 00 08 00 rcsr r1,IE <== NOT EXECUTED 8006b78: 34 02 ff fe mvi r2,-2 <== NOT EXECUTED 8006b7c: a0 22 10 00 and r2,r1,r2 <== NOT EXECUTED 8006b80: d0 02 00 00 wcsr IE,r2 <== NOT EXECUTED tty->flow_ctrl |= FL_OSTOP; 8006b84: 29 62 00 b8 lw r2,(r11+184) <== NOT EXECUTED tty->rawOutBufState = rob_busy; /*apm*/ 8006b88: 34 03 00 01 mvi r3,1 <== NOT EXECUTED 8006b8c: 59 63 00 94 sw (r11+148),r3 <== NOT EXECUTED else if ((tty->flow_ctrl & (FL_MDXON | FL_ORCVXOF)) == (FL_MDXON | FL_ORCVXOF)) { /* Buffer not empty, but output stops due to XOFF */ /* set flag, that output has been stopped */ rtems_interrupt_disable(level); tty->flow_ctrl |= FL_OSTOP; 8006b90: 38 42 00 20 ori r2,r2,0x20 <== NOT EXECUTED 8006b94: 59 62 00 b8 sw (r11+184),r2 <== NOT EXECUTED tty->rawOutBufState = rob_busy; /*apm*/ rtems_interrupt_enable(level); 8006b98: d0 01 00 00 wcsr IE,r1 <== NOT EXECUTED nToSend = 0; 8006b9c: 34 0d 00 00 mvi r13,0 <== NOT EXECUTED } tty->rawOutBufState = rob_busy; /*apm*/ (*tty->device.write)( tty->minor, &tty->rawOutBuf.theBuf[newTail], nToSend); } tty->rawOutBuf.Tail = newTail; /*apm*/ 8006ba0: 59 6c 00 84 sw (r11+132),r12 <== NOT EXECUTED 8006ba4: e3 ff ff a8 bi 8006a44 <== NOT EXECUTED */ if (tty->rawOutBufState == rob_wait) { /* * this should never happen... */ rtems_semaphore_release (tty->rawOutBuf.Semaphore); 8006ba8: 29 61 00 8c lw r1,(r11+140) <== NOT EXECUTED 8006bac: f8 00 03 ad calli 8007a60 <== NOT EXECUTED 8006bb0: e3 ff ff 96 bi 8006a08 <== NOT EXECUTED =============================================================================== 080068b4 : /* * this task actually processes any receive events */ static rtems_task rtems_termios_rxdaemon(rtems_task_argument argument) { 80068b4: 37 9c ff e4 addi sp,sp,-28 80068b8: 5b 8b 00 14 sw (sp+20),r11 80068bc: 5b 8c 00 10 sw (sp+16),r12 80068c0: 5b 8d 00 0c sw (sp+12),r13 80068c4: 5b 8e 00 08 sw (sp+8),r14 80068c8: 5b 9d 00 04 sw (sp+4),ra /* * do something */ c = tty->device.pollRead(tty->minor); if (c != EOF) { 80068cc: 34 0c ff ff mvi r12,-1 /* * this task actually processes any receive events */ static rtems_task rtems_termios_rxdaemon(rtems_task_argument argument) { 80068d0: b8 20 58 00 mv r11,r1 80068d4: 37 8d 00 18 addi r13,sp,24 80068d8: 37 8e 00 1f addi r14,sp,31 80068dc: e0 00 00 06 bi 80068f4 } /* * do something */ c = tty->device.pollRead(tty->minor); 80068e0: 29 63 00 a0 lw r3,(r11+160) 80068e4: 29 61 00 10 lw r1,(r11+16) 80068e8: d8 60 00 00 call r3 80068ec: b8 20 28 00 mv r5,r1 if (c != EOF) { 80068f0: 5c 2c 00 11 bne r1,r12,8006934 while (1) { /* * wait for rtems event */ rtems_event_receive( 80068f4: b9 a0 20 00 mv r4,r13 80068f8: 34 02 00 02 mvi r2,2 80068fc: 34 03 00 00 mvi r3,0 8006900: 34 01 00 03 mvi r1,3 8006904: f8 00 02 1a calli 800716c (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) { 8006908: 2b 81 00 18 lw r1,(sp+24) 800690c: 20 21 00 01 andi r1,r1,0x1 8006910: 44 20 ff f4 be r1,r0,80068e0 <== ALWAYS TAKEN tty->rxTaskId = 0; 8006914: 59 60 00 c4 sw (r11+196),r0 rtems_task_delete(RTEMS_SELF); 8006918: 34 01 00 00 mvi r1,0 <== NOT EXECUTED 800691c: f8 00 04 df calli 8007c98 <== NOT EXECUTED } /* * do something */ c = tty->device.pollRead(tty->minor); 8006920: 29 63 00 a0 lw r3,(r11+160) <== NOT EXECUTED 8006924: 29 61 00 10 lw r1,(r11+16) <== NOT EXECUTED 8006928: d8 60 00 00 call r3 <== NOT EXECUTED 800692c: b8 20 28 00 mv r5,r1 <== NOT EXECUTED if (c != EOF) { 8006930: 44 2c ff f1 be r1,r12,80068f4 <== NOT EXECUTED /* * pollRead did call enqueue on its own */ c_buf = c; rtems_termios_enqueue_raw_characters ( tty,&c_buf,1); 8006934: b9 60 08 00 mv r1,r11 8006938: b9 c0 10 00 mv r2,r14 800693c: 34 03 00 01 mvi r3,1 c = tty->device.pollRead(tty->minor); if (c != EOF) { /* * pollRead did call enqueue on its own */ c_buf = c; 8006940: 33 85 00 1f sb (sp+31),r5 rtems_termios_enqueue_raw_characters ( tty,&c_buf,1); 8006944: fb ff ff 06 calli 800655c 8006948: e3 ff ff eb bi 80068f4 =============================================================================== 08006bb4 : /* * this task actually processes any transmit events */ static rtems_task rtems_termios_txdaemon(rtems_task_argument argument) { 8006bb4: 37 9c ff f0 addi sp,sp,-16 8006bb8: 5b 8b 00 0c sw (sp+12),r11 8006bbc: 5b 8c 00 08 sw (sp+8),r12 8006bc0: 5b 9d 00 04 sw (sp+4),ra 8006bc4: 78 0c 08 02 mvhi r12,0x802 8006bc8: b8 20 58 00 mv r11,r1 8006bcc: 39 8c 49 44 ori r12,r12,0x4944 8006bd0: e0 00 00 0e bi 8006c08 } /* * call any line discipline start function */ if (rtems_termios_linesw[tty->t_line].l_start != NULL) { 8006bd4: 29 62 00 cc lw r2,(r11+204) rtems_termios_linesw[tty->t_line].l_start(tty); 8006bd8: b9 60 08 00 mv r1,r11 } /* * call any line discipline start function */ if (rtems_termios_linesw[tty->t_line].l_start != NULL) { 8006bdc: b4 42 10 00 add r2,r2,r2 8006be0: b4 42 10 00 add r2,r2,r2 8006be4: b4 42 10 00 add r2,r2,r2 8006be8: b4 42 10 00 add r2,r2,r2 8006bec: b4 42 10 00 add r2,r2,r2 8006bf0: b5 82 10 00 add r2,r12,r2 8006bf4: 28 42 00 14 lw r2,(r2+20) 8006bf8: 44 40 00 02 be r2,r0,8006c00 <== ALWAYS TAKEN rtems_termios_linesw[tty->t_line].l_start(tty); 8006bfc: d8 40 00 00 call r2 <== NOT EXECUTED } /* * try to push further characters to device */ rtems_termios_refill_transmitter(tty); 8006c00: b9 60 08 00 mv r1,r11 8006c04: fb ff ff 52 calli 800694c while (1) { /* * wait for rtems event */ rtems_event_receive( 8006c08: 34 02 00 02 mvi r2,2 8006c0c: 34 03 00 00 mvi r3,0 8006c10: 37 84 00 10 addi r4,sp,16 8006c14: 34 01 00 03 mvi r1,3 8006c18: f8 00 01 55 calli 800716c (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) { 8006c1c: 2b 81 00 10 lw r1,(sp+16) 8006c20: 20 21 00 01 andi r1,r1,0x1 8006c24: 44 20 ff ec be r1,r0,8006bd4 <== ALWAYS TAKEN tty->txTaskId = 0; 8006c28: 59 60 00 c8 sw (r11+200),r0 <== NOT EXECUTED rtems_task_delete(RTEMS_SELF); 8006c2c: 34 01 00 00 mvi r1,0 <== NOT EXECUTED 8006c30: f8 00 04 1a calli 8007c98 <== NOT EXECUTED 8006c34: e3 ff ff e8 bi 8006bd4 <== NOT EXECUTED =============================================================================== 08006084 : rtems_termios_puts (&c, 1, tty); } rtems_status_code rtems_termios_write (void *arg) { 8006084: 37 9c ff e4 addi sp,sp,-28 8006088: 5b 8b 00 1c sw (sp+28),r11 800608c: 5b 8c 00 18 sw (sp+24),r12 8006090: 5b 8d 00 14 sw (sp+20),r13 8006094: 5b 8e 00 10 sw (sp+16),r14 8006098: 5b 8f 00 0c sw (sp+12),r15 800609c: 5b 90 00 08 sw (sp+8),r16 80060a0: 5b 9d 00 04 sw (sp+4),ra 80060a4: b8 20 68 00 mv r13,r1 rtems_libio_rw_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 80060a8: 28 21 00 00 lw r1,(r1+0) rtems_status_code sc; sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 80060ac: 34 02 00 00 mvi r2,0 80060b0: 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; 80060b4: 28 2b 00 38 lw r11,(r1+56) rtems_status_code sc; sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 80060b8: 29 61 00 18 lw r1,(r11+24) 80060bc: f8 00 06 0d calli 80078f0 80060c0: b8 20 70 00 mv r14,r1 if (sc != RTEMS_SUCCESSFUL) 80060c4: 5c 20 00 12 bne r1,r0,800610c <== NEVER TAKEN return sc; if (rtems_termios_linesw[tty->t_line].l_write != NULL) { 80060c8: 29 64 00 cc lw r4,(r11+204) 80060cc: 78 01 08 02 mvhi r1,0x802 80060d0: 38 21 49 44 ori r1,r1,0x4944 80060d4: b4 84 20 00 add r4,r4,r4 80060d8: b4 84 20 00 add r4,r4,r4 80060dc: b4 84 20 00 add r4,r4,r4 80060e0: b4 84 20 00 add r4,r4,r4 80060e4: b4 84 20 00 add r4,r4,r4 80060e8: b4 24 20 00 add r4,r1,r4 80060ec: 28 83 00 0c lw r3,(r4+12) 80060f0: 44 6e 00 11 be r3,r14,8006134 sc = rtems_termios_linesw[tty->t_line].l_write(tty,args); 80060f4: b9 60 08 00 mv r1,r11 80060f8: b9 a0 10 00 mv r2,r13 80060fc: d8 60 00 00 call r3 8006100: b8 20 70 00 mv r14,r1 rtems_semaphore_release (tty->osem); 8006104: 29 61 00 18 lw r1,(r11+24) 8006108: f8 00 06 56 calli 8007a60 rtems_termios_puts (args->buffer, args->count, tty); args->bytes_moved = args->count; } rtems_semaphore_release (tty->osem); return sc; } 800610c: b9 c0 08 00 mv r1,r14 8006110: 2b 9d 00 04 lw ra,(sp+4) 8006114: 2b 8b 00 1c lw r11,(sp+28) 8006118: 2b 8c 00 18 lw r12,(sp+24) 800611c: 2b 8d 00 14 lw r13,(sp+20) 8006120: 2b 8e 00 10 lw r14,(sp+16) 8006124: 2b 8f 00 0c lw r15,(sp+12) 8006128: 2b 90 00 08 lw r16,(sp+8) 800612c: 37 9c 00 1c addi sp,sp,28 8006130: c3 a0 00 00 ret 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) { 8006134: 29 61 00 34 lw r1,(r11+52) 8006138: 20 21 00 01 andi r1,r1,0x1 800613c: 44 20 00 11 be r1,r0,8006180 <== NEVER TAKEN uint32_t count = args->count; 8006140: 29 af 00 14 lw r15,(r13+20) char *buffer = args->buffer; 8006144: 29 b0 00 10 lw r16,(r13+16) while (count--) 8006148: 34 01 00 00 mvi r1,0 800614c: 45 e0 00 09 be r15,r0,8006170 <== NEVER TAKEN 8006150: 34 0c 00 00 mvi r12,0 } rtems_termios_puts (&c, 1, tty); } rtems_status_code rtems_termios_write (void *arg) 8006154: b6 0c 08 00 add r1,r16,r12 } if (tty->termios.c_oflag & OPOST) { uint32_t count = args->count; char *buffer = args->buffer; while (count--) oproc (*buffer++, tty); 8006158: 40 21 00 00 lbu r1,(r1+0) 800615c: 35 8c 00 01 addi r12,r12,1 8006160: b9 60 10 00 mv r2,r11 8006164: fb ff fe 1d calli 80059d8 return sc; } if (tty->termios.c_oflag & OPOST) { uint32_t count = args->count; char *buffer = args->buffer; while (count--) 8006168: 5d 8f ff fb bne r12,r15,8006154 oproc (*buffer++, tty); args->bytes_moved = args->count; } else { rtems_termios_puts (args->buffer, args->count, tty); args->bytes_moved = args->count; 800616c: 29 a1 00 14 lw r1,(r13+20) 8006170: 59 a1 00 1c sw (r13+28),r1 } rtems_semaphore_release (tty->osem); 8006174: 29 61 00 18 lw r1,(r11+24) 8006178: f8 00 06 3a calli 8007a60 return sc; 800617c: e3 ff ff e4 bi 800610c char *buffer = args->buffer; while (count--) oproc (*buffer++, tty); args->bytes_moved = args->count; } else { rtems_termios_puts (args->buffer, args->count, tty); 8006180: 29 a1 00 10 lw r1,(r13+16) <== NOT EXECUTED 8006184: 29 a2 00 14 lw r2,(r13+20) <== NOT EXECUTED 8006188: b9 60 18 00 mv r3,r11 <== NOT EXECUTED 800618c: fb ff fd ba calli 8005874 <== NOT EXECUTED 8006190: e3 ff ff f7 bi 800616c <== NOT EXECUTED =============================================================================== 08013bf8 : */ rtems_status_code rtems_timer_cancel( rtems_id id ) { 8013bf8: 37 9c ff f8 addi sp,sp,-8 8013bfc: 5b 9d 00 04 sw (sp+4),ra 8013c00: b8 20 10 00 mv r2,r1 Objects_Id id, Objects_Locations *location ) { return (Timer_Control *) _Objects_Get( &_Timer_Information, id, location ); 8013c04: 78 01 08 04 mvhi r1,0x804 8013c08: 38 21 15 e4 ori r1,r1,0x15e4 8013c0c: 37 83 00 08 addi r3,sp,8 8013c10: f8 00 0e 9c calli 8017680 <_Objects_Get> Timer_Control *the_timer; Objects_Locations location; the_timer = _Timer_Get( id, &location ); switch ( location ) { 8013c14: 2b 82 00 08 lw r2,(sp+8) 8013c18: 44 40 00 05 be r2,r0,8013c2c #endif case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 8013c1c: 34 01 00 04 mvi r1,4 } 8013c20: 2b 9d 00 04 lw ra,(sp+4) 8013c24: 37 9c 00 08 addi sp,sp,8 8013c28: c3 a0 00 00 ret the_timer = _Timer_Get( id, &location ); switch ( location ) { case OBJECTS_LOCAL: if ( !_Timer_Is_dormant_class( the_timer->the_class ) ) 8013c2c: 28 23 00 38 lw r3,(r1+56) 8013c30: 34 02 00 04 mvi r2,4 8013c34: 44 62 00 03 be r3,r2,8013c40 <== NEVER TAKEN (void) _Watchdog_Remove( &the_timer->Ticker ); 8013c38: 34 21 00 10 addi r1,r1,16 8013c3c: f8 00 18 7c calli 8019e2c <_Watchdog_Remove> _Thread_Enable_dispatch(); 8013c40: f8 00 12 67 calli 80185dc <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 8013c44: 34 01 00 00 mvi r1,0 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 8013c48: 2b 9d 00 04 lw ra,(sp+4) 8013c4c: 37 9c 00 08 addi sp,sp,8 8013c50: c3 a0 00 00 ret =============================================================================== 08014274 : rtems_id id, rtems_time_of_day *wall_time, rtems_timer_service_routine_entry routine, void *user_data ) { 8014274: 37 9c ff dc addi sp,sp,-36 8014278: 5b 8b 00 20 sw (sp+32),r11 801427c: 5b 8c 00 1c sw (sp+28),r12 8014280: 5b 8d 00 18 sw (sp+24),r13 8014284: 5b 8e 00 14 sw (sp+20),r14 8014288: 5b 8f 00 10 sw (sp+16),r15 801428c: 5b 90 00 0c sw (sp+12),r16 8014290: 5b 91 00 08 sw (sp+8),r17 8014294: 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; 8014298: 78 05 08 04 mvhi r5,0x804 801429c: 38 a5 16 24 ori r5,r5,0x1624 80142a0: 28 ac 00 00 lw r12,(r5+0) rtems_id id, rtems_time_of_day *wall_time, rtems_timer_service_routine_entry routine, void *user_data ) { 80142a4: b8 20 80 00 mv r16,r1 80142a8: b8 40 70 00 mv r14,r2 80142ac: b8 60 78 00 mv r15,r3 80142b0: 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; 80142b4: 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 ) 80142b8: 45 80 00 0c be r12,r0,80142e8 return RTEMS_INCORRECT_STATE; if ( !_TOD_Is_set ) 80142bc: 78 05 08 04 mvhi r5,0x804 80142c0: 38 a5 0c f0 ori r5,r5,0xcf0 80142c4: 40 a5 00 00 lbu r5,(r5+0) return RTEMS_NOT_DEFINED; 80142c8: 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 ) 80142cc: 44 a0 00 07 be r5,r0,80142e8 <== NEVER TAKEN return RTEMS_NOT_DEFINED; if ( !routine ) return RTEMS_INVALID_ADDRESS; 80142d0: 34 0b 00 09 mvi r11,9 return RTEMS_INCORRECT_STATE; if ( !_TOD_Is_set ) return RTEMS_NOT_DEFINED; if ( !routine ) 80142d4: 44 60 00 05 be r3,r0,80142e8 return RTEMS_INVALID_ADDRESS; if ( !_TOD_Validate( wall_time ) ) 80142d8: b8 40 08 00 mv r1,r2 80142dc: fb ff f0 af calli 8010598 <_TOD_Validate> return RTEMS_INVALID_CLOCK; 80142e0: 34 0b 00 14 mvi r11,20 return RTEMS_NOT_DEFINED; if ( !routine ) return RTEMS_INVALID_ADDRESS; if ( !_TOD_Validate( wall_time ) ) 80142e4: 5c 20 00 0c bne r1,r0,8014314 case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; } 80142e8: b9 60 08 00 mv r1,r11 80142ec: 2b 9d 00 04 lw ra,(sp+4) 80142f0: 2b 8b 00 20 lw r11,(sp+32) 80142f4: 2b 8c 00 1c lw r12,(sp+28) 80142f8: 2b 8d 00 18 lw r13,(sp+24) 80142fc: 2b 8e 00 14 lw r14,(sp+20) 8014300: 2b 8f 00 10 lw r15,(sp+16) 8014304: 2b 90 00 0c lw r16,(sp+12) 8014308: 2b 91 00 08 lw r17,(sp+8) 801430c: 37 9c 00 24 addi sp,sp,36 8014310: c3 a0 00 00 ret return RTEMS_INVALID_ADDRESS; if ( !_TOD_Validate( wall_time ) ) return RTEMS_INVALID_CLOCK; seconds = _TOD_To_seconds( wall_time ); 8014314: b9 c0 08 00 mv r1,r14 if ( seconds <= _TOD_Seconds_since_epoch() ) 8014318: 78 0d 08 04 mvhi r13,0x804 return RTEMS_INVALID_ADDRESS; if ( !_TOD_Validate( wall_time ) ) return RTEMS_INVALID_CLOCK; seconds = _TOD_To_seconds( wall_time ); 801431c: fb ff f0 46 calli 8010434 <_TOD_To_seconds> if ( seconds <= _TOD_Seconds_since_epoch() ) 8014320: 39 ad 0d 88 ori r13,r13,0xd88 return RTEMS_INVALID_ADDRESS; if ( !_TOD_Validate( wall_time ) ) return RTEMS_INVALID_CLOCK; seconds = _TOD_To_seconds( wall_time ); 8014324: b8 20 70 00 mv r14,r1 if ( seconds <= _TOD_Seconds_since_epoch() ) 8014328: 29 a1 00 00 lw r1,(r13+0) 801432c: 50 2e ff ef bgeu r1,r14,80142e8 8014330: 78 01 08 04 mvhi r1,0x804 8014334: 38 21 15 e4 ori r1,r1,0x15e4 8014338: ba 00 10 00 mv r2,r16 801433c: 37 83 00 24 addi r3,sp,36 8014340: f8 00 0c d0 calli 8017680 <_Objects_Get> 8014344: b8 20 58 00 mv r11,r1 return RTEMS_INVALID_CLOCK; the_timer = _Timer_Get( id, &location ); switch ( location ) { 8014348: 2b 81 00 24 lw r1,(sp+36) 801434c: 44 20 00 03 be r1,r0,8014358 #endif case OBJECTS_ERROR: break; } return RTEMS_INVALID_ID; 8014350: 34 0b 00 04 mvi r11,4 8014354: e3 ff ff e5 bi 80142e8 the_timer = _Timer_Get( id, &location ); switch ( location ) { case OBJECTS_LOCAL: (void) _Watchdog_Remove( &the_timer->Ticker ); 8014358: 35 61 00 10 addi r1,r11,16 801435c: f8 00 16 b4 calli 8019e2c <_Watchdog_Remove> 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(); 8014360: 29 a1 00 00 lw r1,(r13+0) (*timer_server->schedule_operation)( timer_server, the_timer ); 8014364: 29 83 00 04 lw r3,(r12+4) the_timer = _Timer_Get( id, &location ); switch ( location ) { case OBJECTS_LOCAL: (void) _Watchdog_Remove( &the_timer->Ticker ); the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK; 8014368: 34 04 00 03 mvi r4,3 _Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data ); the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch(); 801436c: c9 c1 70 00 sub r14,r14,r1 (*timer_server->schedule_operation)( timer_server, the_timer ); 8014370: b9 60 10 00 mv r2,r11 the_timer = _Timer_Get( id, &location ); switch ( location ) { case OBJECTS_LOCAL: (void) _Watchdog_Remove( &the_timer->Ticker ); the_timer->the_class = TIMER_TIME_OF_DAY_ON_TASK; 8014374: 59 64 00 38 sw (r11+56),r4 Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; 8014378: 59 6f 00 2c sw (r11+44),r15 the_watchdog->id = id; 801437c: 59 70 00 30 sw (r11+48),r16 the_watchdog->user_data = user_data; 8014380: 59 71 00 34 sw (r11+52),r17 _Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data ); the_timer->Ticker.initial = seconds - _TOD_Seconds_since_epoch(); 8014384: 59 6e 00 1c sw (r11+28),r14 (*timer_server->schedule_operation)( timer_server, the_timer ); 8014388: b9 80 08 00 mv r1,r12 Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 801438c: 59 60 00 18 sw (r11+24),r0 8014390: d8 60 00 00 call r3 _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; 8014394: 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(); 8014398: f8 00 10 91 calli 80185dc <_Thread_Enable_dispatch> return RTEMS_SUCCESSFUL; 801439c: e3 ff ff d3 bi 80142e8 =============================================================================== 080070b4 : static int rtems_verror( rtems_error_code_t error_flag, const char *printf_format, va_list arglist ) { 80070b4: 37 9c ff e4 addi sp,sp,-28 80070b8: 5b 8b 00 1c sw (sp+28),r11 80070bc: 5b 8c 00 18 sw (sp+24),r12 80070c0: 5b 8d 00 14 sw (sp+20),r13 80070c4: 5b 8e 00 10 sw (sp+16),r14 80070c8: 5b 8f 00 0c sw (sp+12),r15 80070cc: 5b 90 00 08 sw (sp+8),r16 80070d0: 5b 9d 00 04 sw (sp+4),ra 80070d4: b8 20 68 00 mv r13,r1 int local_errno = 0; int chars_written = 0; rtems_status_code status; if (error_flag & RTEMS_ERROR_PANIC) { 80070d8: 78 01 20 00 mvhi r1,0x2000 80070dc: a1 a1 08 00 and r1,r13,r1 static int rtems_verror( rtems_error_code_t error_flag, const char *printf_format, va_list arglist ) { 80070e0: b8 40 80 00 mv r16,r2 80070e4: 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) { 80070e8: 44 20 00 10 be r1,r0,8007128 if (rtems_panic_in_progress++) 80070ec: 78 04 08 02 mvhi r4,0x802 80070f0: 38 84 a8 d4 ori r4,r4,0xa8d4 80070f4: 28 81 00 00 lw r1,(r4+0) 80070f8: 34 25 00 01 addi r5,r1,1 80070fc: 58 85 00 00 sw (r4+0),r5 8007100: 44 20 00 07 be r1,r0,800711c <== ALWAYS TAKEN rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 8007104: 78 01 08 02 mvhi r1,0x802 <== NOT EXECUTED 8007108: 38 21 aa 50 ori r1,r1,0xaa50 <== NOT EXECUTED 800710c: 28 22 00 00 lw r2,(r1+0) <== NOT EXECUTED 8007110: 34 42 00 01 addi r2,r2,1 <== NOT EXECUTED 8007114: 58 22 00 00 sw (r1+0),r2 <== NOT EXECUTED RTEMS_COMPILER_MEMORY_BARRIER(); 8007118: 28 85 00 00 lw r5,(r4+0) <== NOT EXECUTED _Thread_Disable_dispatch(); /* disable task switches */ /* don't aggravate things */ if (rtems_panic_in_progress > 2) 800711c: 34 01 00 02 mvi r1,2 return 0; 8007120: 34 0c 00 00 mvi r12,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) 8007124: 48 a1 00 2b bg r5,r1,80071d0 <== NEVER TAKEN return 0; } (void) fflush(stdout); /* in case stdout/stderr same */ 8007128: 78 0b 08 02 mvhi r11,0x802 800712c: 39 6b a2 38 ori r11,r11,0xa238 8007130: 29 61 00 00 lw r1,(r11+0) rtems_error_code_t error_flag, const char *printf_format, va_list arglist ) { int local_errno = 0; 8007134: 34 0e 00 00 mvi r14,0 /* don't aggravate things */ if (rtems_panic_in_progress > 2) return 0; } (void) fflush(stdout); /* in case stdout/stderr same */ 8007138: 28 21 00 08 lw r1,(r1+8) 800713c: f8 00 34 40 calli 801423c status = error_flag & ~RTEMS_ERROR_MASK; 8007140: 78 03 08 02 mvhi r3,0x802 8007144: 38 63 80 74 ori r3,r3,0x8074 8007148: 28 62 00 00 lw r2,(r3+0) if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */ 800714c: 78 01 40 00 mvhi r1,0x4000 8007150: a1 a1 08 00 and r1,r13,r1 return 0; } (void) fflush(stdout); /* in case stdout/stderr same */ status = error_flag & ~RTEMS_ERROR_MASK; 8007154: a1 a2 68 00 and r13,r13,r2 if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */ 8007158: 5c 20 00 34 bne r1,r0,8007228 #if defined(RTEMS_MULTIPROCESSING) if (_System_state_Is_multiprocessing) fprintf(stderr, "[%" PRIu32 "] ", _Configuration_MP_table->node); #endif chars_written += vfprintf(stderr, printf_format, arglist); 800715c: 29 61 00 00 lw r1,(r11+0) 8007160: ba 00 10 00 mv r2,r16 8007164: b9 e0 18 00 mv r3,r15 8007168: 28 21 00 0c lw r1,(r1+12) 800716c: f8 00 4d 23 calli 801a5f8 8007170: b8 20 60 00 mv r12,r1 if (status) 8007174: 5d a0 00 21 bne r13,r0,80071f8 chars_written += fprintf(stderr, " (status: %s)", rtems_status_text(status)); if (local_errno) { 8007178: 45 c0 00 0d be r14,r0,80071ac if ((local_errno > 0) && *strerror(local_errno)) 800717c: 4c 0e 00 05 bge r0,r14,8007190 8007180: b9 c0 08 00 mv r1,r14 8007184: f8 00 39 06 calli 801559c 8007188: 40 21 00 00 lbu r1,(r1+0) 800718c: 5c 20 00 2a bne r1,r0,8007234 <== ALWAYS TAKEN chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno)); else chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno); 8007190: 29 61 00 00 lw r1,(r11+0) 8007194: 78 02 08 02 mvhi r2,0x802 8007198: 38 42 7d 50 ori r2,r2,0x7d50 800719c: 28 21 00 0c lw r1,(r1+12) 80071a0: b9 c0 18 00 mv r3,r14 80071a4: f8 00 35 5e calli 801471c 80071a8: b5 81 60 00 add r12,r12,r1 } chars_written += fprintf(stderr, "\n"); 80071ac: 29 61 00 00 lw r1,(r11+0) 80071b0: 78 02 08 02 mvhi r2,0x802 80071b4: 38 42 74 98 ori r2,r2,0x7498 80071b8: 28 21 00 0c lw r1,(r1+12) 80071bc: f8 00 35 58 calli 801471c (void) fflush(stderr); 80071c0: 29 62 00 00 lw r2,(r11+0) chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno)); else chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno); } chars_written += fprintf(stderr, "\n"); 80071c4: b4 2c 60 00 add r12,r1,r12 (void) fflush(stderr); 80071c8: 28 41 00 0c lw r1,(r2+12) 80071cc: f8 00 34 1c calli 801423c return chars_written; } 80071d0: b9 80 08 00 mv r1,r12 80071d4: 2b 9d 00 04 lw ra,(sp+4) 80071d8: 2b 8b 00 1c lw r11,(sp+28) 80071dc: 2b 8c 00 18 lw r12,(sp+24) 80071e0: 2b 8d 00 14 lw r13,(sp+20) 80071e4: 2b 8e 00 10 lw r14,(sp+16) 80071e8: 2b 8f 00 0c lw r15,(sp+12) 80071ec: 2b 90 00 08 lw r16,(sp+8) 80071f0: 37 9c 00 1c addi sp,sp,28 80071f4: c3 a0 00 00 ret chars_written += vfprintf(stderr, printf_format, arglist); if (status) chars_written += fprintf(stderr, " (status: %s)", rtems_status_text(status)); 80071f8: 29 62 00 00 lw r2,(r11+0) 80071fc: b9 a0 08 00 mv r1,r13 8007200: 28 4d 00 0c lw r13,(r2+12) 8007204: fb ff ff a3 calli 8007090 8007208: 78 02 08 02 mvhi r2,0x802 800720c: b8 20 18 00 mv r3,r1 8007210: 38 42 7d 30 ori r2,r2,0x7d30 8007214: b9 a0 08 00 mv r1,r13 8007218: f8 00 35 41 calli 801471c #endif chars_written += vfprintf(stderr, printf_format, arglist); if (status) chars_written += 800721c: b5 81 60 00 add r12,r12,r1 fprintf(stderr, " (status: %s)", rtems_status_text(status)); if (local_errno) { 8007220: 45 c0 ff e3 be r14,r0,80071ac 8007224: e3 ff ff d6 bi 800717c (void) fflush(stdout); /* in case stdout/stderr same */ status = error_flag & ~RTEMS_ERROR_MASK; if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */ local_errno = errno; 8007228: f8 00 33 04 calli 8013e38 <__errno> 800722c: 28 2e 00 00 lw r14,(r1+0) 8007230: e3 ff ff cb bi 800715c chars_written += fprintf(stderr, " (status: %s)", rtems_status_text(status)); if (local_errno) { if ((local_errno > 0) && *strerror(local_errno)) chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno)); 8007234: 29 62 00 00 lw r2,(r11+0) 8007238: b9 c0 08 00 mv r1,r14 800723c: 28 4d 00 0c lw r13,(r2+12) 8007240: f8 00 38 d7 calli 801559c 8007244: 78 02 08 02 mvhi r2,0x802 8007248: b8 20 18 00 mv r3,r1 800724c: 38 42 7d 40 ori r2,r2,0x7d40 8007250: b9 a0 08 00 mv r1,r13 8007254: f8 00 35 32 calli 801471c 8007258: b5 81 60 00 add r12,r12,r1 800725c: e3 ff ff d4 bi 80071ac =============================================================================== 08001cbc : /* * Extract an integer value from the database */ static int scanInt(FILE *fp, int *val) { 8001cbc: 37 9c ff d4 addi sp,sp,-44 8001cc0: 5b 8b 00 2c sw (sp+44),r11 8001cc4: 5b 8c 00 28 sw (sp+40),r12 8001cc8: 5b 8d 00 24 sw (sp+36),r13 8001ccc: 5b 8e 00 20 sw (sp+32),r14 8001cd0: 5b 8f 00 1c sw (sp+28),r15 8001cd4: 5b 90 00 18 sw (sp+24),r16 8001cd8: 5b 91 00 14 sw (sp+20),r17 8001cdc: 5b 92 00 10 sw (sp+16),r18 8001ce0: 5b 93 00 0c sw (sp+12),r19 8001ce4: 5b 94 00 08 sw (sp+8),r20 8001ce8: 5b 9d 00 04 sw (sp+4),ra int c; unsigned int i = 0; unsigned int limit = INT_MAX; 8001cec: 78 03 08 01 mvhi r3,0x801 8001cf0: 38 63 52 dc ori r3,r3,0x52dc 8001cf4: 28 70 00 00 lw r16,(r3+0) int sign = 0; int d; for (;;) { c = getc(fp); 8001cf8: 78 13 08 01 mvhi r19,0x801 limit++; continue; } sign = 1; } if (!isdigit(c)) 8001cfc: 78 0e 08 01 mvhi r14,0x801 /* * Extract an integer value from the database */ static int scanInt(FILE *fp, int *val) { 8001d00: b8 20 58 00 mv r11,r1 8001d04: b8 40 a0 00 mv r20,r2 int c; unsigned int i = 0; unsigned int limit = INT_MAX; int sign = 0; 8001d08: 34 0f 00 00 mvi r15,0 */ static int scanInt(FILE *fp, int *val) { int c; unsigned int i = 0; 8001d0c: 34 0d 00 00 mvi r13,0 unsigned int limit = INT_MAX; int sign = 0; int d; for (;;) { c = getc(fp); 8001d10: 3a 73 61 c0 ori r19,r19,0x61c0 if (c == ':') 8001d14: 34 11 00 3a mvi r17,58 limit++; continue; } sign = 1; } if (!isdigit(c)) 8001d18: 39 ce 61 bc ori r14,r14,0x61bc for (;;) { c = getc(fp); if (c == ':') break; if (sign == 0) { if (c == '-') { 8001d1c: 34 12 00 2d mvi r18,45 unsigned int limit = INT_MAX; int sign = 0; int d; for (;;) { c = getc(fp); 8001d20: 29 63 00 04 lw r3,(r11+4) 8001d24: 34 63 ff ff addi r3,r3,-1 8001d28: 59 63 00 04 sw (r11+4),r3 8001d2c: 4c 60 00 1a bge r3,r0,8001d94 <== ALWAYS TAKEN 8001d30: 2a 61 00 00 lw r1,(r19+0) <== NOT EXECUTED 8001d34: b9 60 10 00 mv r2,r11 <== NOT EXECUTED 8001d38: f8 00 37 06 calli 800f950 <__srget_r> <== NOT EXECUTED 8001d3c: b8 20 60 00 mv r12,r1 <== NOT EXECUTED if (c == ':') 8001d40: 45 91 00 1a be r12,r17,8001da8 <== NOT EXECUTED break; if (sign == 0) { 8001d44: 5d e0 00 03 bne r15,r0,8001d50 if (c == '-') { sign = -1; limit++; continue; } sign = 1; 8001d48: 34 0f 00 01 mvi r15,1 for (;;) { c = getc(fp); if (c == ':') break; if (sign == 0) { if (c == '-') { 8001d4c: 45 92 00 32 be r12,r18,8001e14 <== NEVER TAKEN limit++; continue; } sign = 1; } if (!isdigit(c)) 8001d50: 29 c1 00 00 lw r1,(r14+0) 8001d54: b4 2c 08 00 add r1,r1,r12 8001d58: 40 21 00 01 lbu r1,(r1+1) 8001d5c: 20 21 00 04 andi r1,r1,0x4 8001d60: 44 20 00 1f be r1,r0,8001ddc return 0; d = c - '0'; if ((i > (limit / 10)) 8001d64: ba 00 08 00 mv r1,r16 8001d68: 34 02 00 0a mvi r2,10 8001d6c: f8 00 48 ea calli 8014114 <__udivsi3> 8001d70: 55 a1 00 1b bgu r13,r1,8001ddc } sign = 1; } if (!isdigit(c)) return 0; d = c - '0'; 8001d74: 35 8c ff d0 addi r12,r12,-48 if ((i > (limit / 10)) || ((i == (limit / 10)) && (d > (limit % 10)))) 8001d78: 45 a1 00 14 be r13,r1,8001dc8 return 0; i = i * 10 + d; 8001d7c: b5 ad 68 00 add r13,r13,r13 8001d80: b5 ad 18 00 add r3,r13,r13 8001d84: b4 63 18 00 add r3,r3,r3 8001d88: b5 a3 68 00 add r13,r13,r3 8001d8c: b5 8d 68 00 add r13,r12,r13 8001d90: e3 ff ff e4 bi 8001d20 unsigned int limit = INT_MAX; int sign = 0; int d; for (;;) { c = getc(fp); 8001d94: 29 63 00 00 lw r3,(r11+0) 8001d98: 40 6c 00 00 lbu r12,(r3+0) 8001d9c: 34 61 00 01 addi r1,r3,1 8001da0: 59 61 00 00 sw (r11+0),r1 if (c == ':') 8001da4: 5d 91 ff e8 bne r12,r17,8001d44 || ((i == (limit / 10)) && (d > (limit % 10)))) return 0; i = i * 10 + d; } if (sign == 0) return 0; 8001da8: 34 01 00 00 mvi r1,0 if ((i > (limit / 10)) || ((i == (limit / 10)) && (d > (limit % 10)))) return 0; i = i * 10 + d; } if (sign == 0) 8001dac: 45 e0 00 0d be r15,r0,8001de0 <== NEVER TAKEN return 0; *val = i * sign; 8001db0: b9 e0 08 00 mv r1,r15 8001db4: b9 a0 10 00 mv r2,r13 8001db8: f8 00 48 72 calli 8013f80 <__mulsi3> 8001dbc: 5a 81 00 00 sw (r20+0),r1 return 1; 8001dc0: 34 01 00 01 mvi r1,1 8001dc4: e0 00 00 07 bi 8001de0 } if (!isdigit(c)) return 0; d = c - '0'; if ((i > (limit / 10)) || ((i == (limit / 10)) && (d > (limit % 10)))) 8001dc8: ba 00 08 00 mv r1,r16 8001dcc: 34 02 00 0a mvi r2,10 8001dd0: f8 00 48 e1 calli 8014154 <__umodsi3> 8001dd4: 55 81 00 02 bgu r12,r1,8001ddc <== ALWAYS TAKEN 8001dd8: e3 ff ff e9 bi 8001d7c <== NOT EXECUTED return 0; 8001ddc: 34 01 00 00 mvi r1,0 } if (sign == 0) return 0; *val = i * sign; return 1; } 8001de0: 2b 9d 00 04 lw ra,(sp+4) 8001de4: 2b 8b 00 2c lw r11,(sp+44) 8001de8: 2b 8c 00 28 lw r12,(sp+40) 8001dec: 2b 8d 00 24 lw r13,(sp+36) 8001df0: 2b 8e 00 20 lw r14,(sp+32) 8001df4: 2b 8f 00 1c lw r15,(sp+28) 8001df8: 2b 90 00 18 lw r16,(sp+24) 8001dfc: 2b 91 00 14 lw r17,(sp+20) 8001e00: 2b 92 00 10 lw r18,(sp+16) 8001e04: 2b 93 00 0c lw r19,(sp+12) 8001e08: 2b 94 00 08 lw r20,(sp+8) 8001e0c: 37 9c 00 2c addi sp,sp,44 8001e10: c3 a0 00 00 ret if (c == ':') break; if (sign == 0) { if (c == '-') { sign = -1; limit++; 8001e14: 36 10 00 01 addi r16,r16,1 c = getc(fp); if (c == ':') break; if (sign == 0) { if (c == '-') { sign = -1; 8001e18: 34 0f ff ff mvi r15,-1 limit++; continue; 8001e1c: e3 ff ff c1 bi 8001d20 =============================================================================== 08001e20 : /* * Extract a string value from the database */ static int scanString(FILE *fp, char **name, char **bufp, size_t *nleft, int nlFlag) { 8001e20: 37 9c ff d8 addi sp,sp,-40 8001e24: 5b 8b 00 28 sw (sp+40),r11 8001e28: 5b 8c 00 24 sw (sp+36),r12 8001e2c: 5b 8d 00 20 sw (sp+32),r13 8001e30: 5b 8e 00 1c sw (sp+28),r14 8001e34: 5b 8f 00 18 sw (sp+24),r15 8001e38: 5b 90 00 14 sw (sp+20),r16 8001e3c: 5b 91 00 10 sw (sp+16),r17 8001e40: 5b 92 00 0c sw (sp+12),r18 8001e44: 5b 93 00 08 sw (sp+8),r19 8001e48: 5b 9d 00 04 sw (sp+4),ra 8001e4c: b8 60 58 00 mv r11,r3 int c; *name = *bufp; 8001e50: 28 63 00 00 lw r3,(r3+0) for (;;) { c = getc(fp); 8001e54: 78 12 08 01 mvhi r18,0x801 /* * Extract a string value from the database */ static int scanString(FILE *fp, char **name, char **bufp, size_t *nleft, int nlFlag) { 8001e58: b8 20 60 00 mv r12,r1 8001e5c: b8 80 68 00 mv r13,r4 8001e60: b8 a0 98 00 mv r19,r5 int c; *name = *bufp; 8001e64: 58 43 00 00 sw (r2+0),r3 for (;;) { c = getc(fp); 8001e68: 3a 52 61 c0 ori r18,r18,0x61c0 if (c == ':') { 8001e6c: 34 0e 00 3a mvi r14,58 if (nlFlag) return 0; break; } if (c == '\n') { 8001e70: 34 0f 00 0a mvi r15,10 if (!nlFlag) return 0; break; } if (c == EOF) 8001e74: 34 10 ff ff mvi r16,-1 return 0; if (*nleft < 2) 8001e78: 34 11 00 01 mvi r17,1 { int c; *name = *bufp; for (;;) { c = getc(fp); 8001e7c: 29 81 00 04 lw r1,(r12+4) 8001e80: 34 21 ff ff addi r1,r1,-1 8001e84: 59 81 00 04 sw (r12+4),r1 8001e88: 4c 20 00 12 bge r1,r0,8001ed0 8001e8c: 2a 41 00 00 lw r1,(r18+0) 8001e90: b9 80 10 00 mv r2,r12 8001e94: f8 00 36 af calli 800f950 <__srget_r> if (c == ':') { 8001e98: 44 2e 00 13 be r1,r14,8001ee4 <== NEVER TAKEN if (nlFlag) return 0; break; } if (c == '\n') { 8001e9c: 44 2f 00 2b be r1,r15,8001f48 if (!nlFlag) return 0; break; } if (c == EOF) 8001ea0: 44 30 00 1d be r1,r16,8001f14 return 0; if (*nleft < 2) 8001ea4: 29 a2 00 00 lw r2,(r13+0) 8001ea8: 52 22 00 1b bgeu r17,r2,8001f14 return 0; **bufp = c; 8001eac: 29 62 00 00 lw r2,(r11+0) 8001eb0: 30 41 00 00 sb (r2+0),r1 ++(*bufp); 8001eb4: 29 62 00 00 lw r2,(r11+0) --(*nleft); 8001eb8: 29 a1 00 00 lw r1,(r13+0) if (c == EOF) return 0; if (*nleft < 2) return 0; **bufp = c; ++(*bufp); 8001ebc: 34 42 00 01 addi r2,r2,1 8001ec0: 59 62 00 00 sw (r11+0),r2 --(*nleft); 8001ec4: 34 21 ff ff addi r1,r1,-1 8001ec8: 59 a1 00 00 sw (r13+0),r1 } 8001ecc: e3 ff ff ec bi 8001e7c { int c; *name = *bufp; for (;;) { c = getc(fp); 8001ed0: 29 81 00 00 lw r1,(r12+0) 8001ed4: 34 22 00 01 addi r2,r1,1 8001ed8: 40 21 00 00 lbu r1,(r1+0) 8001edc: 59 82 00 00 sw (r12+0),r2 if (c == ':') { 8001ee0: 5c 2e ff ef bne r1,r14,8001e9c if (nlFlag) return 0; 8001ee4: 34 01 00 00 mvi r1,0 *name = *bufp; for (;;) { c = getc(fp); if (c == ':') { if (nlFlag) 8001ee8: 5e 60 00 0c bne r19,r0,8001f18 return 0; **bufp = c; ++(*bufp); --(*nleft); } **bufp = '\0'; 8001eec: 29 62 00 00 lw r2,(r11+0) ++(*bufp); --(*nleft); return 1; 8001ef0: 34 01 00 01 mvi r1,1 return 0; **bufp = c; ++(*bufp); --(*nleft); } **bufp = '\0'; 8001ef4: 30 40 00 00 sb (r2+0),r0 ++(*bufp); 8001ef8: 29 63 00 00 lw r3,(r11+0) --(*nleft); 8001efc: 29 a2 00 00 lw r2,(r13+0) **bufp = c; ++(*bufp); --(*nleft); } **bufp = '\0'; ++(*bufp); 8001f00: 34 63 00 01 addi r3,r3,1 8001f04: 59 63 00 00 sw (r11+0),r3 --(*nleft); 8001f08: 34 42 ff ff addi r2,r2,-1 8001f0c: 59 a2 00 00 sw (r13+0),r2 return 1; 8001f10: e0 00 00 02 bi 8001f18 break; } if (c == EOF) return 0; if (*nleft < 2) return 0; 8001f14: 34 01 00 00 mvi r1,0 } **bufp = '\0'; ++(*bufp); --(*nleft); return 1; } 8001f18: 2b 9d 00 04 lw ra,(sp+4) 8001f1c: 2b 8b 00 28 lw r11,(sp+40) 8001f20: 2b 8c 00 24 lw r12,(sp+36) 8001f24: 2b 8d 00 20 lw r13,(sp+32) 8001f28: 2b 8e 00 1c lw r14,(sp+28) 8001f2c: 2b 8f 00 18 lw r15,(sp+24) 8001f30: 2b 90 00 14 lw r16,(sp+20) 8001f34: 2b 91 00 10 lw r17,(sp+16) 8001f38: 2b 92 00 0c lw r18,(sp+12) 8001f3c: 2b 93 00 08 lw r19,(sp+8) 8001f40: 37 9c 00 28 addi sp,sp,40 8001f44: c3 a0 00 00 ret return 0; break; } if (c == '\n') { if (!nlFlag) return 0; 8001f48: 34 01 00 00 mvi r1,0 if (nlFlag) return 0; break; } if (c == '\n') { if (!nlFlag) 8001f4c: 5e 60 ff e8 bne r19,r0,8001eec 8001f50: e3 ff ff f2 bi 8001f18 =============================================================================== 08001f54 : FILE *fp, struct group *grp, char *buffer, size_t bufsize ) { 8001f54: 37 9c ff d8 addi sp,sp,-40 8001f58: 5b 8b 00 18 sw (sp+24),r11 8001f5c: 5b 8c 00 14 sw (sp+20),r12 8001f60: 5b 8d 00 10 sw (sp+16),r13 8001f64: 5b 8e 00 0c sw (sp+12),r14 8001f68: 5b 8f 00 08 sw (sp+8),r15 8001f6c: 5b 9d 00 04 sw (sp+4),ra int grgid; char *grmem, *cp; int memcount; if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0) 8001f70: 37 8c 00 20 addi r12,sp,32 8001f74: 37 8b 00 1c addi r11,sp,28 FILE *fp, struct group *grp, char *buffer, size_t bufsize ) { 8001f78: 5b 83 00 20 sw (sp+32),r3 8001f7c: 5b 84 00 1c sw (sp+28),r4 int grgid; char *grmem, *cp; int memcount; if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0) 8001f80: b9 80 18 00 mv r3,r12 8001f84: b9 60 20 00 mv r4,r11 8001f88: 34 05 00 00 mvi r5,0 FILE *fp, struct group *grp, char *buffer, size_t bufsize ) { 8001f8c: b8 20 70 00 mv r14,r1 8001f90: b8 40 78 00 mv r15,r2 int grgid; char *grmem, *cp; int memcount; if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0) 8001f94: fb ff ff a3 calli 8001e20 || !scanString(fp, &grp->gr_passwd, &buffer, &bufsize, 0) || !scanInt(fp, &grgid) || !scanString(fp, &grmem, &buffer, &bufsize, 1)) return 0; 8001f98: 34 0d 00 00 mvi r13,0 { int grgid; char *grmem, *cp; int memcount; if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0) 8001f9c: 5c 20 00 0a bne r1,r0,8001fc4 grp->gr_mem[memcount++] = cp + 1; } } grp->gr_mem[memcount] = NULL; return 1; } 8001fa0: b9 a0 08 00 mv r1,r13 8001fa4: 2b 9d 00 04 lw ra,(sp+4) 8001fa8: 2b 8b 00 18 lw r11,(sp+24) 8001fac: 2b 8c 00 14 lw r12,(sp+20) 8001fb0: 2b 8d 00 10 lw r13,(sp+16) 8001fb4: 2b 8e 00 0c lw r14,(sp+12) 8001fb8: 2b 8f 00 08 lw r15,(sp+8) 8001fbc: 37 9c 00 28 addi sp,sp,40 8001fc0: c3 a0 00 00 ret int grgid; char *grmem, *cp; int memcount; if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0) || !scanString(fp, &grp->gr_passwd, &buffer, &bufsize, 0) 8001fc4: b9 c0 08 00 mv r1,r14 8001fc8: 35 e2 00 04 addi r2,r15,4 8001fcc: b9 80 18 00 mv r3,r12 8001fd0: b9 60 20 00 mv r4,r11 8001fd4: 34 05 00 00 mvi r5,0 8001fd8: fb ff ff 92 calli 8001e20 8001fdc: 44 20 ff f1 be r1,r0,8001fa0 <== NEVER TAKEN || !scanInt(fp, &grgid) 8001fe0: b9 c0 08 00 mv r1,r14 8001fe4: 37 82 00 28 addi r2,sp,40 8001fe8: fb ff ff 35 calli 8001cbc 8001fec: 44 20 ff ed be r1,r0,8001fa0 <== NEVER TAKEN || !scanString(fp, &grmem, &buffer, &bufsize, 1)) 8001ff0: b9 c0 08 00 mv r1,r14 8001ff4: 37 82 00 24 addi r2,sp,36 8001ff8: b9 80 18 00 mv r3,r12 8001ffc: b9 60 20 00 mv r4,r11 8002000: 34 05 00 01 mvi r5,1 8002004: fb ff ff 87 calli 8001e20 8002008: 44 20 ff e6 be r1,r0,8001fa0 <== NEVER TAKEN return 0; grp->gr_gid = grgid; 800200c: 2b 81 00 28 lw r1,(sp+40) /* * Determine number of members */ for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 8002010: 2b 85 00 24 lw r5,(sp+36) 8002014: 34 03 00 17 mvi r3,23 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; 8002018: 0d e1 00 08 sh (r15+8),r1 /* * Determine number of members */ for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 800201c: 40 a1 00 00 lbu r1,(r5+0) 8002020: 44 20 00 0c be r1,r0,8002050 <== NEVER TAKEN 8002024: b8 a0 10 00 mv r2,r5 8002028: 34 03 00 01 mvi r3,1 800202c: 34 42 00 01 addi r2,r2,1 if(*cp == ',') memcount++; 8002030: 64 24 00 2c cmpei r4,r1,44 grp->gr_gid = grgid; /* * Determine number of members */ for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 8002034: 40 41 00 00 lbu r1,(r2+0) if(*cp == ',') memcount++; 8002038: b4 64 18 00 add r3,r3,r4 grp->gr_gid = grgid; /* * Determine number of members */ for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 800203c: 5c 20 ff fc bne r1,r0,800202c 8002040: 34 63 00 01 addi r3,r3,1 8002044: b4 63 18 00 add r3,r3,r3 8002048: b4 63 18 00 add r3,r3,r3 800204c: 34 63 00 0f addi r3,r3,15 } /* * Hack to produce (hopefully) a suitably-aligned array of pointers */ if (bufsize < (((memcount+1)*sizeof(char *)) + 15)) 8002050: 2b 81 00 1c lw r1,(sp+28) return 0; 8002054: 34 0d 00 00 mvi r13,0 } /* * Hack to produce (hopefully) a suitably-aligned array of pointers */ if (bufsize < (((memcount+1)*sizeof(char *)) + 15)) 8002058: 54 61 ff d2 bgu r3,r1,8001fa0 <== NEVER TAKEN return 0; grp->gr_mem = (char **)(((uintptr_t)buffer + 15) & ~15); 800205c: 2b 84 00 20 lw r4,(sp+32) 8002060: 34 01 ff f0 mvi r1,-16 /* * Fill in pointer array */ grp->gr_mem[0] = grmem; for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 8002064: 34 03 00 04 mvi r3,4 /* * 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); 8002068: 34 84 00 0f addi r4,r4,15 800206c: a0 81 20 00 and r4,r4,r1 8002070: 59 e4 00 0c sw (r15+12),r4 /* * Fill in pointer array */ grp->gr_mem[0] = grmem; 8002074: 58 85 00 00 sw (r4+0),r5 for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 8002078: 2b 81 00 24 lw r1,(sp+36) 800207c: 40 22 00 00 lbu r2,(r1+0) 8002080: 44 40 00 0b be r2,r0,80020ac <== NEVER TAKEN } /* * Extract a single group record from the database */ static int scangr( 8002084: 34 21 00 01 addi r1,r1,1 /* * Fill in pointer array */ grp->gr_mem[0] = grmem; for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 8002088: 34 03 00 01 mvi r3,1 if(*cp == ',') { 800208c: 34 04 00 2c mvi r4,44 8002090: 44 44 00 0b be r2,r4,80020bc /* * Fill in pointer array */ grp->gr_mem[0] = grmem; for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 8002094: 40 22 00 00 lbu r2,(r1+0) 8002098: 34 21 00 01 addi r1,r1,1 800209c: 5c 40 ff fd bne r2,r0,8002090 80020a0: 29 e4 00 0c lw r4,(r15+12) 80020a4: b4 63 18 00 add r3,r3,r3 80020a8: b4 63 18 00 add r3,r3,r3 if(*cp == ',') { *cp = '\0'; grp->gr_mem[memcount++] = cp + 1; } } grp->gr_mem[memcount] = NULL; 80020ac: b4 83 18 00 add r3,r4,r3 80020b0: 58 60 00 00 sw (r3+0),r0 return 1; 80020b4: 34 0d 00 01 mvi r13,1 80020b8: e3 ff ff ba bi 8001fa0 * Fill in pointer array */ grp->gr_mem[0] = grmem; for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { if(*cp == ',') { *cp = '\0'; 80020bc: 30 20 ff ff sb (r1+-1),r0 grp->gr_mem[memcount++] = cp + 1; 80020c0: 29 e5 00 0c lw r5,(r15+12) 80020c4: b4 63 10 00 add r2,r3,r3 80020c8: b4 42 10 00 add r2,r2,r2 80020cc: b4 a2 10 00 add r2,r5,r2 80020d0: 58 41 00 00 sw (r2+0),r1 80020d4: 34 63 00 01 addi r3,r3,1 80020d8: e3 ff ff ef bi 8002094 =============================================================================== 080020dc : FILE *fp, struct passwd *pwd, char *buffer, size_t bufsize ) { 80020dc: 37 9c ff d8 addi sp,sp,-40 80020e0: 5b 8b 00 18 sw (sp+24),r11 80020e4: 5b 8c 00 14 sw (sp+20),r12 80020e8: 5b 8d 00 10 sw (sp+16),r13 80020ec: 5b 8e 00 0c sw (sp+12),r14 80020f0: 5b 8f 00 08 sw (sp+8),r15 80020f4: 5b 9d 00 04 sw (sp+4),ra int pwuid, pwgid; if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0) 80020f8: 37 8c 00 20 addi r12,sp,32 80020fc: 37 8b 00 1c addi r11,sp,28 FILE *fp, struct passwd *pwd, char *buffer, size_t bufsize ) { 8002100: 5b 83 00 20 sw (sp+32),r3 8002104: 5b 84 00 1c sw (sp+28),r4 int pwuid, pwgid; if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0) 8002108: b9 80 18 00 mv r3,r12 800210c: b9 60 20 00 mv r4,r11 8002110: 34 05 00 00 mvi r5,0 FILE *fp, struct passwd *pwd, char *buffer, size_t bufsize ) { 8002114: b8 20 68 00 mv r13,r1 8002118: b8 40 70 00 mv r14,r2 int pwuid, pwgid; if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0) 800211c: fb ff ff 41 calli 8001e20 || !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; 8002120: 34 0f 00 00 mvi r15,0 size_t bufsize ) { int pwuid, pwgid; if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0) 8002124: 5c 20 00 0a bne r1,r0,800214c || !scanString(fp, &pwd->pw_shell, &buffer, &bufsize, 1)) return 0; pwd->pw_uid = pwuid; pwd->pw_gid = pwgid; return 1; } 8002128: b9 e0 08 00 mv r1,r15 800212c: 2b 9d 00 04 lw ra,(sp+4) 8002130: 2b 8b 00 18 lw r11,(sp+24) 8002134: 2b 8c 00 14 lw r12,(sp+20) 8002138: 2b 8d 00 10 lw r13,(sp+16) 800213c: 2b 8e 00 0c lw r14,(sp+12) 8002140: 2b 8f 00 08 lw r15,(sp+8) 8002144: 37 9c 00 28 addi sp,sp,40 8002148: c3 a0 00 00 ret ) { int pwuid, pwgid; if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0) || !scanString(fp, &pwd->pw_passwd, &buffer, &bufsize, 0) 800214c: b9 a0 08 00 mv r1,r13 8002150: 35 c2 00 04 addi r2,r14,4 8002154: b9 80 18 00 mv r3,r12 8002158: b9 60 20 00 mv r4,r11 800215c: 34 05 00 00 mvi r5,0 8002160: fb ff ff 30 calli 8001e20 8002164: 44 20 ff f1 be r1,r0,8002128 <== NEVER TAKEN || !scanInt(fp, &pwuid) 8002168: b9 a0 08 00 mv r1,r13 800216c: 37 82 00 28 addi r2,sp,40 8002170: fb ff fe d3 calli 8001cbc 8002174: 44 20 ff ed be r1,r0,8002128 || !scanInt(fp, &pwgid) 8002178: b9 a0 08 00 mv r1,r13 800217c: 37 82 00 24 addi r2,sp,36 8002180: fb ff fe cf calli 8001cbc 8002184: 44 20 ff e9 be r1,r0,8002128 || !scanString(fp, &pwd->pw_comment, &buffer, &bufsize, 0) 8002188: b9 a0 08 00 mv r1,r13 800218c: 35 c2 00 0c addi r2,r14,12 8002190: b9 80 18 00 mv r3,r12 8002194: b9 60 20 00 mv r4,r11 8002198: 34 05 00 00 mvi r5,0 800219c: fb ff ff 21 calli 8001e20 80021a0: 44 20 ff e2 be r1,r0,8002128 <== NEVER TAKEN || !scanString(fp, &pwd->pw_gecos, &buffer, &bufsize, 0) 80021a4: b9 a0 08 00 mv r1,r13 80021a8: 35 c2 00 10 addi r2,r14,16 80021ac: b9 80 18 00 mv r3,r12 80021b0: b9 60 20 00 mv r4,r11 80021b4: 34 05 00 00 mvi r5,0 80021b8: fb ff ff 1a calli 8001e20 80021bc: 44 20 ff db be r1,r0,8002128 <== NEVER TAKEN || !scanString(fp, &pwd->pw_dir, &buffer, &bufsize, 0) 80021c0: b9 a0 08 00 mv r1,r13 80021c4: 35 c2 00 14 addi r2,r14,20 80021c8: b9 80 18 00 mv r3,r12 80021cc: b9 60 20 00 mv r4,r11 80021d0: 34 05 00 00 mvi r5,0 80021d4: fb ff ff 13 calli 8001e20 80021d8: 44 20 ff d4 be r1,r0,8002128 <== NEVER TAKEN || !scanString(fp, &pwd->pw_shell, &buffer, &bufsize, 1)) 80021dc: b9 a0 08 00 mv r1,r13 80021e0: 35 c2 00 18 addi r2,r14,24 80021e4: b9 80 18 00 mv r3,r12 80021e8: b9 60 20 00 mv r4,r11 80021ec: 34 05 00 01 mvi r5,1 80021f0: fb ff ff 0c calli 8001e20 80021f4: 44 20 ff cd be r1,r0,8002128 return 0; pwd->pw_uid = pwuid; 80021f8: 2b 81 00 28 lw r1,(sp+40) pwd->pw_gid = pwgid; return 1; 80021fc: 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; 8002200: 0d c1 00 08 sh (r14+8),r1 pwd->pw_gid = pwgid; 8002204: 2b 81 00 24 lw r1,(sp+36) 8002208: 0d c1 00 0a sh (r14+10),r1 return 1; 800220c: e3 ff ff c7 bi 8002128 =============================================================================== 08003d1c : #include int sched_get_priority_max( int policy ) { 8003d1c: 37 9c ff fc addi sp,sp,-4 8003d20: 5b 9d 00 04 sw (sp+4),ra switch ( policy ) { 8003d24: 48 01 00 05 bg r0,r1,8003d38 8003d28: 34 02 00 02 mvi r2,2 8003d2c: 4c 41 00 08 bge r2,r1,8003d4c 8003d30: 34 02 00 04 mvi r2,4 8003d34: 44 22 00 06 be r1,r2,8003d4c <== ALWAYS TAKEN case SCHED_RR: case SCHED_SPORADIC: break; default: rtems_set_errno_and_return_minus_one( EINVAL ); 8003d38: f8 00 27 d0 calli 800dc78 <__errno> 8003d3c: 34 02 00 16 mvi r2,22 8003d40: 58 22 00 00 sw (r1+0),r2 8003d44: 34 01 ff ff mvi r1,-1 8003d48: e0 00 00 05 bi 8003d5c } return POSIX_SCHEDULER_MAXIMUM_PRIORITY; 8003d4c: 78 01 08 02 mvhi r1,0x802 8003d50: 38 21 00 e4 ori r1,r1,0xe4 8003d54: 40 21 00 00 lbu r1,(r1+0) 8003d58: 34 21 ff ff addi r1,r1,-1 } 8003d5c: 2b 9d 00 04 lw ra,(sp+4) 8003d60: 37 9c 00 04 addi sp,sp,4 8003d64: c3 a0 00 00 ret =============================================================================== 08003d68 : #include int sched_get_priority_min( int policy ) { 8003d68: 37 9c ff fc addi sp,sp,-4 8003d6c: 5b 9d 00 04 sw (sp+4),ra switch ( policy ) { 8003d70: 48 01 00 05 bg r0,r1,8003d84 8003d74: 34 02 00 02 mvi r2,2 8003d78: 4c 41 00 08 bge r2,r1,8003d98 <== ALWAYS TAKEN 8003d7c: 34 02 00 04 mvi r2,4 8003d80: 44 22 00 06 be r1,r2,8003d98 <== NOT EXECUTED case SCHED_RR: case SCHED_SPORADIC: break; default: rtems_set_errno_and_return_minus_one( EINVAL ); 8003d84: f8 00 27 bd calli 800dc78 <__errno> 8003d88: 34 02 00 16 mvi r2,22 8003d8c: 58 22 00 00 sw (r1+0),r2 8003d90: 34 01 ff ff mvi r1,-1 8003d94: e0 00 00 02 bi 8003d9c } return POSIX_SCHEDULER_MINIMUM_PRIORITY; 8003d98: 34 01 00 01 mvi r1,1 } 8003d9c: 2b 9d 00 04 lw ra,(sp+4) 8003da0: 37 9c 00 04 addi sp,sp,4 8003da4: c3 a0 00 00 ret =============================================================================== 08003da8 : int sched_rr_get_interval( pid_t pid, struct timespec *interval ) { 8003da8: 37 9c ff f4 addi sp,sp,-12 8003dac: 5b 8b 00 08 sw (sp+8),r11 8003db0: 5b 9d 00 04 sw (sp+4),ra 8003db4: b8 20 58 00 mv r11,r1 /* * Only supported for the "calling process" (i.e. this node). */ if ( pid && pid != getpid() ) 8003db8: 5c 20 00 0b bne r1,r0,8003de4 <== ALWAYS TAKEN rtems_set_errno_and_return_minus_one( ESRCH ); if ( !interval ) 8003dbc: 44 40 00 13 be r2,r0,8003e08 rtems_set_errno_and_return_minus_one( EINVAL ); _Timespec_From_ticks( _Thread_Ticks_per_timeslice, interval ); 8003dc0: 78 01 08 02 mvhi r1,0x802 8003dc4: 38 21 08 30 ori r1,r1,0x830 8003dc8: 28 21 00 00 lw r1,(r1+0) 8003dcc: f8 00 0e 6b calli 8007778 <_Timespec_From_ticks> return 0; 8003dd0: 34 01 00 00 mvi r1,0 } 8003dd4: 2b 9d 00 04 lw ra,(sp+4) 8003dd8: 2b 8b 00 08 lw r11,(sp+8) 8003ddc: 37 9c 00 0c addi sp,sp,12 8003de0: c3 a0 00 00 ret { /* * Only supported for the "calling process" (i.e. this node). */ if ( pid && pid != getpid() ) 8003de4: 5b 82 00 0c sw (sp+12),r2 8003de8: fb ff f8 21 calli 8001e6c 8003dec: 2b 82 00 0c lw r2,(sp+12) 8003df0: 44 2b ff f3 be r1,r11,8003dbc rtems_set_errno_and_return_minus_one( ESRCH ); 8003df4: f8 00 27 a1 calli 800dc78 <__errno> 8003df8: 34 02 00 03 mvi r2,3 8003dfc: 58 22 00 00 sw (r1+0),r2 8003e00: 34 01 ff ff mvi r1,-1 8003e04: e3 ff ff f4 bi 8003dd4 if ( !interval ) rtems_set_errno_and_return_minus_one( EINVAL ); 8003e08: f8 00 27 9c calli 800dc78 <__errno> 8003e0c: 34 02 00 16 mvi r2,22 8003e10: 58 22 00 00 sw (r1+0),r2 8003e14: 34 01 ff ff mvi r1,-1 8003e18: e3 ff ff ef bi 8003dd4 =============================================================================== 08006190 : int oflag, ... /* mode_t mode, */ /* unsigned int value */ ) { 8006190: 37 9c ff c0 addi sp,sp,-64 8006194: 5b 8b 00 18 sw (sp+24),r11 8006198: 5b 8c 00 14 sw (sp+20),r12 800619c: 5b 8d 00 10 sw (sp+16),r13 80061a0: 5b 8e 00 0c sw (sp+12),r14 80061a4: 5b 8f 00 08 sw (sp+8),r15 80061a8: 5b 9d 00 04 sw (sp+4),ra rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 80061ac: 78 09 08 02 mvhi r9,0x802 80061b0: 39 29 4a 90 ori r9,r9,0x4a90 80061b4: 29 2a 00 00 lw r10,(r9+0) 80061b8: b8 20 70 00 mv r14,r1 80061bc: 5b 82 00 28 sw (sp+40),r2 80061c0: 35 41 00 01 addi r1,r10,1 80061c4: 5b 83 00 2c sw (sp+44),r3 80061c8: 5b 84 00 30 sw (sp+48),r4 80061cc: 5b 85 00 34 sw (sp+52),r5 80061d0: 5b 86 00 38 sw (sp+56),r6 80061d4: 5b 87 00 3c sw (sp+60),r7 80061d8: 5b 88 00 40 sw (sp+64),r8 80061dc: b8 40 60 00 mv r12,r2 80061e0: 59 21 00 00 sw (r9+0),r1 POSIX_Semaphore_Control *the_semaphore; Objects_Locations location; _Thread_Disable_dispatch(); if ( oflag & O_CREAT ) { 80061e4: 20 4d 02 00 andi r13,r2,0x200 /* unsigned int value */ ) { va_list arg; mode_t mode; unsigned int value = 0; 80061e8: 34 0f 00 00 mvi r15,0 POSIX_Semaphore_Control *the_semaphore; Objects_Locations location; _Thread_Disable_dispatch(); if ( oflag & O_CREAT ) { 80061ec: 5d a0 00 2d bne r13,r0,80062a0 mode = (mode_t) va_arg( arg, unsigned int ); value = va_arg( arg, unsigned int ); va_end(arg); } status = _POSIX_Semaphore_Name_to_id( name, &the_semaphore_id ); 80061f0: b9 c0 08 00 mv r1,r14 80061f4: 37 82 00 24 addi r2,sp,36 80061f8: f8 00 1b f7 calli 800d1d4 <_POSIX_Semaphore_Name_to_id> 80061fc: 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 ) { 8006200: 44 20 00 10 be r1,r0,8006240 /* * 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) ) ) { 8006204: 34 01 00 02 mvi r1,2 8006208: 5d 61 00 02 bne r11,r1,8006210 <== NEVER TAKEN 800620c: 5d a0 00 27 bne r13,r0,80062a8 _Thread_Enable_dispatch(); 8006210: f8 00 0b 14 calli 8008e60 <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one_cast( status, sem_t * ); 8006214: f8 00 2b cd calli 8011148 <__errno> 8006218: 58 2b 00 00 sw (r1+0),r11 800621c: 34 01 ff ff mvi r1,-1 id = &the_semaphore->Semaphore_id; #else id = (sem_t *)&the_semaphore->Object.id; #endif return id; } 8006220: 2b 9d 00 04 lw ra,(sp+4) 8006224: 2b 8b 00 18 lw r11,(sp+24) 8006228: 2b 8c 00 14 lw r12,(sp+20) 800622c: 2b 8d 00 10 lw r13,(sp+16) 8006230: 2b 8e 00 0c lw r14,(sp+12) 8006234: 2b 8f 00 08 lw r15,(sp+8) 8006238: 37 9c 00 40 addi sp,sp,64 800623c: c3 a0 00 00 ret /* * Check for existence with creation. */ if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) { 8006240: 21 8c 0a 00 andi r12,r12,0xa00 8006244: 34 01 0a 00 mvi r1,2560 8006248: 45 81 00 22 be r12,r1,80062d0 800624c: 2b 82 00 24 lw r2,(sp+36) 8006250: 78 01 08 02 mvhi r1,0x802 8006254: 37 83 00 1c addi r3,sp,28 8006258: 38 21 4c e4 ori r1,r1,0x4ce4 800625c: f8 00 07 9b calli 80080c8 <_Objects_Get> _Thread_Enable_dispatch(); rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * ); } the_semaphore = _POSIX_Semaphore_Get( &the_semaphore_id, &location ); the_semaphore->open_count += 1; 8006260: 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 ); 8006264: 5b 81 00 20 sw (sp+32),r1 the_semaphore->open_count += 1; 8006268: 34 42 00 01 addi r2,r2,1 800626c: 58 22 00 18 sw (r1+24),r2 _Thread_Enable_dispatch(); 8006270: f8 00 0a fc calli 8008e60 <_Thread_Enable_dispatch> _Thread_Enable_dispatch(); 8006274: f8 00 0a fb calli 8008e60 <_Thread_Enable_dispatch> 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; 8006278: 2b 81 00 20 lw r1,(sp+32) 800627c: 34 21 00 08 addi r1,r1,8 #endif return id; } 8006280: 2b 9d 00 04 lw ra,(sp+4) 8006284: 2b 8b 00 18 lw r11,(sp+24) 8006288: 2b 8c 00 14 lw r12,(sp+20) 800628c: 2b 8d 00 10 lw r13,(sp+16) 8006290: 2b 8e 00 0c lw r14,(sp+12) 8006294: 2b 8f 00 08 lw r15,(sp+8) 8006298: 37 9c 00 40 addi sp,sp,64 800629c: c3 a0 00 00 ret _Thread_Disable_dispatch(); if ( oflag & O_CREAT ) { va_start(arg, oflag); mode = (mode_t) va_arg( arg, unsigned int ); value = va_arg( arg, unsigned int ); 80062a0: 2b 8f 00 30 lw r15,(sp+48) 80062a4: e3 ff ff d3 bi 80061f0 /* * 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( 80062a8: 34 02 00 00 mvi r2,0 80062ac: b9 e0 18 00 mv r3,r15 80062b0: 37 84 00 20 addi r4,sp,32 80062b4: b9 c0 08 00 mv r1,r14 80062b8: f8 00 1b 59 calli 800d01c <_POSIX_Semaphore_Create_support> 80062bc: b8 20 58 00 mv r11,r1 /* * errno was set by Create_support, so don't set it again. */ _Thread_Enable_dispatch(); 80062c0: f8 00 0a e8 calli 8008e60 <_Thread_Enable_dispatch> if ( status == -1 ) return SEM_FAILED; 80062c4: 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 ) 80062c8: 5d 61 ff ec bne r11,r1,8006278 80062cc: e3 ff ff ed bi 8006280 /* * Check for existence with creation. */ if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) { _Thread_Enable_dispatch(); 80062d0: f8 00 0a e4 calli 8008e60 <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one_cast( EEXIST, sem_t * ); 80062d4: f8 00 2b 9d calli 8011148 <__errno> 80062d8: 34 02 00 11 mvi r2,17 80062dc: 58 22 00 00 sw (r1+0),r2 80062e0: 34 01 ff ff mvi r1,-1 80062e4: e3 ff ff e7 bi 8006280 =============================================================================== 0800634c : int sem_timedwait( sem_t *sem, const struct timespec *abstime ) { 800634c: 37 9c ff f4 addi sp,sp,-12 8006350: 5b 8b 00 08 sw (sp+8),r11 8006354: 5b 9d 00 04 sw (sp+4),ra 8006358: b8 20 58 00 mv r11,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 ); 800635c: b8 40 08 00 mv r1,r2 8006360: 37 82 00 0c addi r2,sp,12 8006364: f8 00 17 ee calli 800c31c <_POSIX_Absolute_timeout_to_ticks> if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE ) 8006368: 34 02 00 03 mvi r2,3 800636c: 44 22 00 09 be r1,r2,8006390 <== ALWAYS TAKEN do_wait = false; lock_status = _POSIX_Semaphore_Wait_support( sem, do_wait, ticks ); 8006370: 2b 83 00 0c lw r3,(sp+12) <== NOT EXECUTED 8006374: b9 60 08 00 mv r1,r11 <== NOT EXECUTED 8006378: 34 02 00 00 mvi r2,0 <== NOT EXECUTED 800637c: f8 00 1b bc calli 800d26c <_POSIX_Semaphore_Wait_support> <== NOT EXECUTED lock_status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) rtems_set_errno_and_return_minus_one( ETIMEDOUT ); } return lock_status; } 8006380: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 8006384: 2b 8b 00 08 lw r11,(sp+8) <== NOT EXECUTED 8006388: 37 9c 00 0c addi sp,sp,12 <== NOT EXECUTED 800638c: c3 a0 00 00 ret <== NOT EXECUTED */ status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks ); if ( status != POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE ) do_wait = false; lock_status = _POSIX_Semaphore_Wait_support( sem, do_wait, ticks ); 8006390: 2b 83 00 0c lw r3,(sp+12) 8006394: b9 60 08 00 mv r1,r11 8006398: 34 02 00 01 mvi r2,1 800639c: f8 00 1b b4 calli 800d26c <_POSIX_Semaphore_Wait_support> lock_status == POSIX_ABSOLUTE_TIMEOUT_IS_NOW ) rtems_set_errno_and_return_minus_one( ETIMEDOUT ); } return lock_status; } 80063a0: 2b 9d 00 04 lw ra,(sp+4) 80063a4: 2b 8b 00 08 lw r11,(sp+8) 80063a8: 37 9c 00 0c addi sp,sp,12 80063ac: c3 a0 00 00 ret =============================================================================== 08003c74 : int sigaction( int sig, const struct sigaction *act, struct sigaction *oact ) { 8003c74: 37 9c ff f0 addi sp,sp,-16 8003c78: 5b 8b 00 10 sw (sp+16),r11 8003c7c: 5b 8c 00 0c sw (sp+12),r12 8003c80: 5b 8d 00 08 sw (sp+8),r13 8003c84: 5b 9d 00 04 sw (sp+4),ra 8003c88: b8 20 58 00 mv r11,r1 8003c8c: b8 40 60 00 mv r12,r2 ISR_Level level; if ( oact ) 8003c90: 44 60 00 0e be r3,r0,8003cc8 *oact = _POSIX_signals_Vectors[ sig ]; 8003c94: b4 21 08 00 add r1,r1,r1 8003c98: b4 2b 08 00 add r1,r1,r11 8003c9c: 78 02 08 02 mvhi r2,0x802 8003ca0: b4 21 08 00 add r1,r1,r1 8003ca4: 38 42 1e 00 ori r2,r2,0x1e00 8003ca8: b4 21 08 00 add r1,r1,r1 8003cac: b4 41 08 00 add r1,r2,r1 8003cb0: 28 22 00 00 lw r2,(r1+0) 8003cb4: 58 62 00 00 sw (r3+0),r2 8003cb8: 28 22 00 04 lw r2,(r1+4) 8003cbc: 58 62 00 04 sw (r3+4),r2 8003cc0: 28 21 00 08 lw r1,(r1+8) 8003cc4: 58 61 00 08 sw (r3+8),r1 if ( !sig ) 8003cc8: 45 60 00 04 be r11,r0,8003cd8 static inline bool is_valid_signo( int signo ) { return ((signo) >= 1 && (signo) <= 32 ); 8003ccc: 35 61 ff ff addi r1,r11,-1 rtems_set_errno_and_return_minus_one( EINVAL ); if ( !is_valid_signo(sig) ) 8003cd0: 34 02 00 1f mvi r2,31 8003cd4: 50 41 00 06 bgeu r2,r1,8003cec * NOTE: Solaris documentation claims to "silently enforce" this which * contradicts the POSIX specification. */ if ( sig == SIGKILL ) rtems_set_errno_and_return_minus_one( EINVAL ); 8003cd8: f8 00 29 5f calli 800e254 <__errno> 8003cdc: 34 02 00 16 mvi r2,22 8003ce0: 58 22 00 00 sw (r1+0),r2 8003ce4: 34 01 ff ff mvi r1,-1 8003ce8: e0 00 00 1c bi 8003d58 * * NOTE: Solaris documentation claims to "silently enforce" this which * contradicts the POSIX specification. */ if ( sig == SIGKILL ) 8003cec: 34 01 00 09 mvi r1,9 8003cf0: 45 61 ff fa be r11,r1,8003cd8 * 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; 8003cf4: 34 01 00 00 mvi r1,0 /* * Evaluate the new action structure and set the global signal vector * appropriately. */ if ( act ) { 8003cf8: 45 80 00 18 be r12,r0,8003d58 <== 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 ); 8003cfc: 90 00 68 00 rcsr r13,IE 8003d00: 34 01 ff fe mvi r1,-2 8003d04: a1 a1 08 00 and r1,r13,r1 8003d08: d0 01 00 00 wcsr IE,r1 if ( act->sa_handler == SIG_DFL ) { 8003d0c: 29 81 00 08 lw r1,(r12+8) 8003d10: 44 20 00 18 be r1,r0,8003d70 _POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ]; } else { _POSIX_signals_Clear_process_signals( sig ); 8003d14: b9 60 08 00 mv r1,r11 8003d18: f8 00 19 69 calli 800a2bc <_POSIX_signals_Clear_process_signals> _POSIX_signals_Vectors[ sig ] = *act; 8003d1c: b5 6b 08 00 add r1,r11,r11 8003d20: b4 2b 58 00 add r11,r1,r11 8003d24: 29 82 00 00 lw r2,(r12+0) 8003d28: 78 01 08 02 mvhi r1,0x802 8003d2c: b5 6b 58 00 add r11,r11,r11 8003d30: 38 21 1e 00 ori r1,r1,0x1e00 8003d34: b5 6b 58 00 add r11,r11,r11 8003d38: b4 2b 58 00 add r11,r1,r11 8003d3c: 59 62 00 00 sw (r11+0),r2 8003d40: 29 81 00 04 lw r1,(r12+4) 8003d44: 59 61 00 04 sw (r11+4),r1 8003d48: 29 81 00 08 lw r1,(r12+8) 8003d4c: 59 61 00 08 sw (r11+8),r1 } _ISR_Enable( level ); 8003d50: d0 0d 00 00 wcsr IE,r13 * 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; 8003d54: 34 01 00 00 mvi r1,0 } 8003d58: 2b 9d 00 04 lw ra,(sp+4) 8003d5c: 2b 8b 00 10 lw r11,(sp+16) 8003d60: 2b 8c 00 0c lw r12,(sp+12) 8003d64: 2b 8d 00 08 lw r13,(sp+8) 8003d68: 37 9c 00 10 addi sp,sp,16 8003d6c: c3 a0 00 00 ret * we can just copy the provided sigaction structure into the vectors. */ _ISR_Disable( level ); if ( act->sa_handler == SIG_DFL ) { _POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ]; 8003d70: b5 6b 08 00 add r1,r11,r11 8003d74: b4 2b 58 00 add r11,r1,r11 8003d78: b5 6b 58 00 add r11,r11,r11 8003d7c: 78 02 08 01 mvhi r2,0x801 8003d80: b5 6b 58 00 add r11,r11,r11 8003d84: 38 42 f7 80 ori r2,r2,0xf780 8003d88: b4 4b 10 00 add r2,r2,r11 8003d8c: 28 44 00 00 lw r4,(r2+0) 8003d90: 28 43 00 04 lw r3,(r2+4) 8003d94: 78 01 08 02 mvhi r1,0x802 8003d98: 28 42 00 08 lw r2,(r2+8) 8003d9c: 38 21 1e 00 ori r1,r1,0x1e00 8003da0: b4 2b 58 00 add r11,r1,r11 8003da4: 59 64 00 00 sw (r11+0),r4 8003da8: 59 63 00 04 sw (r11+4),r3 8003dac: 59 62 00 08 sw (r11+8),r2 8003db0: e3 ff ff e8 bi 8003d50 =============================================================================== 0800421c : int sigtimedwait( const sigset_t *set, siginfo_t *info, const struct timespec *timeout ) { 800421c: 37 9c ff d8 addi sp,sp,-40 8004220: 5b 8b 00 1c sw (sp+28),r11 8004224: 5b 8c 00 18 sw (sp+24),r12 8004228: 5b 8d 00 14 sw (sp+20),r13 800422c: 5b 8e 00 10 sw (sp+16),r14 8004230: 5b 8f 00 0c sw (sp+12),r15 8004234: 5b 90 00 08 sw (sp+8),r16 8004238: 5b 9d 00 04 sw (sp+4),ra 800423c: b8 20 68 00 mv r13,r1 8004240: b8 40 58 00 mv r11,r2 8004244: b8 60 60 00 mv r12,r3 ISR_Level level; /* * Error check parameters before disabling interrupts. */ if ( !set ) 8004248: 44 20 00 70 be r1,r0,8004408 /* NOTE: This is very specifically a RELATIVE not ABSOLUTE time * in the Open Group specification. */ interval = 0; if ( timeout ) { 800424c: 44 60 00 5c be r3,r0,80043bc if ( !_Timespec_Is_valid( timeout ) ) 8004250: b8 60 08 00 mv r1,r3 8004254: f8 00 0e 84 calli 8007c64 <_Timespec_Is_valid> 8004258: 44 20 00 6c be r1,r0,8004408 rtems_set_errno_and_return_minus_one( EINVAL ); interval = _Timespec_To_ticks( timeout ); 800425c: b9 80 08 00 mv r1,r12 8004260: f8 00 0e a3 calli 8007cec <_Timespec_To_ticks> if ( !interval ) 8004264: 44 20 00 69 be r1,r0,8004408 <== NEVER TAKEN /* * Initialize local variables. */ the_info = ( info ) ? info : &signal_information; 8004268: 45 60 00 57 be r11,r0,80043c4 <== NEVER TAKEN the_thread = _Thread_Executing; 800426c: 78 0c 08 02 mvhi r12,0x802 8004270: 39 8c 1d b4 ori r12,r12,0x1db4 8004274: 29 83 00 0c lw r3,(r12+12) api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 8004278: 28 6f 01 20 lw r15,(r3+288) * What if they are already pending? */ /* API signals pending? */ _ISR_Disable( level ); 800427c: 90 00 80 00 rcsr r16,IE 8004280: 34 02 ff fe mvi r2,-2 8004284: a2 02 10 00 and r2,r16,r2 8004288: d0 02 00 00 wcsr IE,r2 if ( *set & api->signals_pending ) { 800428c: 29 a5 00 00 lw r5,(r13+0) 8004290: 29 e4 00 d4 lw r4,(r15+212) 8004294: a0 a4 10 00 and r2,r5,r4 8004298: 5c 40 00 4d bne r2,r0,80043cc return the_info->si_signo; } /* Process pending signals? */ if ( *set & _POSIX_signals_Pending ) { 800429c: 78 04 08 02 mvhi r4,0x802 80042a0: 38 84 1f f4 ori r4,r4,0x1ff4 80042a4: 28 84 00 00 lw r4,(r4+0) 80042a8: a0 a4 28 00 and r5,r5,r4 80042ac: 5c a2 00 35 bne r5,r2,8004380 80042b0: 78 02 08 02 mvhi r2,0x802 80042b4: 38 42 18 e8 ori r2,r2,0x18e8 80042b8: 28 44 00 00 lw r4,(r2+0) the_info->si_code = SI_USER; the_info->si_value.sival_int = 0; return signo; } the_info->si_signo = -1; 80042bc: 34 05 ff ff mvi r5,-1 80042c0: 59 65 00 00 sw (r11+0),r5 80042c4: 34 84 00 01 addi r4,r4,1 80042c8: 58 44 00 00 sw (r2+0),r4 _Thread_Disable_dispatch(); the_thread->Wait.queue = &_POSIX_signals_Wait_queue; the_thread->Wait.return_code = EINTR; 80042cc: 34 02 00 04 mvi r2,4 80042d0: 58 62 00 34 sw (r3+52),r2 the_thread->Wait.option = *set; 80042d4: 29 a4 00 00 lw r4,(r13+0) } the_info->si_signo = -1; _Thread_Disable_dispatch(); the_thread->Wait.queue = &_POSIX_signals_Wait_queue; 80042d8: 78 02 08 02 mvhi r2,0x802 80042dc: 38 42 1f 8c ori r2,r2,0x1f8c the_thread->Wait.return_code = EINTR; the_thread->Wait.option = *set; 80042e0: 58 64 00 30 sw (r3+48),r4 the_thread->Wait.return_argument = the_info; 80042e4: 58 6b 00 28 sw (r3+40),r11 } the_info->si_signo = -1; _Thread_Disable_dispatch(); the_thread->Wait.queue = &_POSIX_signals_Wait_queue; 80042e8: 58 62 00 44 sw (r3+68),r2 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; 80042ec: 34 03 00 01 mvi r3,1 80042f0: 58 43 00 30 sw (r2+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 ); 80042f4: d0 10 00 00 wcsr IE,r16 _Thread_queue_Enqueue( &_POSIX_signals_Wait_queue, interval ); 80042f8: 78 03 08 00 mvhi r3,0x800 80042fc: b8 20 10 00 mv r2,r1 8004300: 78 01 08 02 mvhi r1,0x802 8004304: 38 63 78 84 ori r3,r3,0x7884 8004308: 38 21 1f 8c ori r1,r1,0x1f8c 800430c: f8 00 0c 51 calli 8007450 <_Thread_queue_Enqueue_with_handler> _Thread_Enable_dispatch(); 8004310: f8 00 0b 16 calli 8006f68 <_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 ); 8004314: 29 62 00 00 lw r2,(r11+0) 8004318: b9 e0 08 00 mv r1,r15 800431c: b9 60 18 00 mv r3,r11 8004320: 34 04 00 00 mvi r4,0 8004324: 34 05 00 00 mvi r5,0 8004328: f8 00 1a 49 calli 800ac4c <_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) 800432c: 29 81 00 0c lw r1,(r12+12) 8004330: 28 22 00 34 lw r2,(r1+52) 8004334: 34 01 00 04 mvi r1,4 8004338: 5c 41 00 39 bne r2,r1,800441c || !(*set & signo_to_mask( the_info->si_signo )) ) { 800433c: 29 6e 00 00 lw r14,(r11+0) 8004340: 34 01 00 01 mvi r1,1 8004344: 35 c2 ff ff addi r2,r14,-1 8004348: f8 00 68 2a calli 801e3f0 <__ashlsi3> 800434c: 29 a2 00 00 lw r2,(r13+0) 8004350: a0 22 08 00 and r1,r1,r2 8004354: 44 20 00 32 be r1,r0,800441c errno = _Thread_Executing->Wait.return_code; return -1; } return the_info->si_signo; } 8004358: b9 c0 08 00 mv r1,r14 800435c: 2b 9d 00 04 lw ra,(sp+4) 8004360: 2b 8b 00 1c lw r11,(sp+28) 8004364: 2b 8c 00 18 lw r12,(sp+24) 8004368: 2b 8d 00 14 lw r13,(sp+20) 800436c: 2b 8e 00 10 lw r14,(sp+16) 8004370: 2b 8f 00 0c lw r15,(sp+12) 8004374: 2b 90 00 08 lw r16,(sp+8) 8004378: 37 9c 00 28 addi sp,sp,40 800437c: c3 a0 00 00 ret } /* Process pending signals? */ if ( *set & _POSIX_signals_Pending ) { signo = _POSIX_signals_Get_lowest( _POSIX_signals_Pending ); 8004380: b8 80 08 00 mv r1,r4 8004384: fb ff ff 86 calli 800419c <_POSIX_signals_Get_lowest> 8004388: b8 20 70 00 mv r14,r1 _POSIX_signals_Clear_signals( api, signo, the_info, true, false ); 800438c: b9 c0 10 00 mv r2,r14 8004390: b9 e0 08 00 mv r1,r15 8004394: b9 60 18 00 mv r3,r11 8004398: 34 04 00 01 mvi r4,1 800439c: 34 05 00 00 mvi r5,0 80043a0: f8 00 1a 2b calli 800ac4c <_POSIX_signals_Clear_signals> _ISR_Enable( level ); 80043a4: d0 10 00 00 wcsr IE,r16 the_info->si_signo = signo; the_info->si_code = SI_USER; 80043a8: 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; 80043ac: 59 6e 00 00 sw (r11+0),r14 the_info->si_code = SI_USER; 80043b0: 59 61 00 04 sw (r11+4),r1 the_info->si_value.sival_int = 0; 80043b4: 59 60 00 08 sw (r11+8),r0 return signo; 80043b8: e3 ff ff e8 bi 8004358 /* NOTE: This is very specifically a RELATIVE not ABSOLUTE time * in the Open Group specification. */ interval = 0; 80043bc: 34 01 00 00 mvi r1,0 /* * Initialize local variables. */ the_info = ( info ) ? info : &signal_information; 80043c0: 5d 60 ff ab bne r11,r0,800426c 80043c4: 37 8b 00 20 addi r11,sp,32 80043c8: e3 ff ff a9 bi 800426c /* API signals pending? */ _ISR_Disable( level ); if ( *set & api->signals_pending ) { /* XXX real info later */ the_info->si_signo = _POSIX_signals_Get_lowest( api->signals_pending ); 80043cc: b8 80 08 00 mv r1,r4 80043d0: fb ff ff 73 calli 800419c <_POSIX_signals_Get_lowest> 80043d4: b8 20 10 00 mv r2,r1 80043d8: 59 61 00 00 sw (r11+0),r1 _POSIX_signals_Clear_signals( 80043dc: b9 60 18 00 mv r3,r11 80043e0: b9 e0 08 00 mv r1,r15 80043e4: 34 04 00 00 mvi r4,0 80043e8: 34 05 00 00 mvi r5,0 80043ec: f8 00 1a 18 calli 800ac4c <_POSIX_signals_Clear_signals> the_info->si_signo, the_info, false, false ); _ISR_Enable( level ); 80043f0: d0 10 00 00 wcsr IE,r16 the_info->si_code = SI_USER; 80043f4: 34 01 00 01 mvi r1,1 80043f8: 59 61 00 04 sw (r11+4),r1 the_info->si_value.sival_int = 0; 80043fc: 59 60 00 08 sw (r11+8),r0 return the_info->si_signo; 8004400: 29 6e 00 00 lw r14,(r11+0) 8004404: e3 ff ff d5 bi 8004358 rtems_set_errno_and_return_minus_one( EINVAL ); interval = _Timespec_To_ticks( timeout ); if ( !interval ) rtems_set_errno_and_return_minus_one( EINVAL ); 8004408: f8 00 29 4f calli 800e944 <__errno> 800440c: 34 02 00 16 mvi r2,22 8004410: 58 22 00 00 sw (r1+0),r2 8004414: 34 0e ff ff mvi r14,-1 8004418: e3 ff ff d0 bi 8004358 * was not in our set. */ if ( (_Thread_Executing->Wait.return_code != EINTR) || !(*set & signo_to_mask( the_info->si_signo )) ) { errno = _Thread_Executing->Wait.return_code; 800441c: f8 00 29 4a calli 800e944 <__errno> 8004420: 29 82 00 0c lw r2,(r12+12) return -1; 8004424: 34 0e ff ff mvi r14,-1 * was not in our set. */ if ( (_Thread_Executing->Wait.return_code != EINTR) || !(*set & signo_to_mask( the_info->si_signo )) ) { errno = _Thread_Executing->Wait.return_code; 8004428: 28 42 00 34 lw r2,(r2+52) 800442c: 58 22 00 00 sw (r1+0),r2 return -1; 8004430: e3 ff ff ca bi 8004358 =============================================================================== 080064dc : int sigwait( const sigset_t *set, int *sig ) { 80064dc: 37 9c ff f8 addi sp,sp,-8 80064e0: 5b 8b 00 08 sw (sp+8),r11 80064e4: 5b 9d 00 04 sw (sp+4),ra int status; status = sigtimedwait( set, NULL, NULL ); 80064e8: 34 03 00 00 mvi r3,0 int sigwait( const sigset_t *set, int *sig ) { 80064ec: b8 40 58 00 mv r11,r2 int status; status = sigtimedwait( set, NULL, NULL ); 80064f0: 34 02 00 00 mvi r2,0 80064f4: fb ff ff 6d calli 80062a8 if ( status != -1 ) { 80064f8: 34 02 ff ff mvi r2,-1 80064fc: 44 22 00 09 be r1,r2,8006520 if ( sig ) *sig = status; return 0; 8006500: 34 03 00 00 mvi r3,0 int status; status = sigtimedwait( set, NULL, NULL ); if ( status != -1 ) { if ( sig ) 8006504: 45 60 00 02 be r11,r0,800650c <== NEVER TAKEN *sig = status; 8006508: 59 61 00 00 sw (r11+0),r1 return 0; } return errno; } 800650c: b8 60 08 00 mv r1,r3 8006510: 2b 9d 00 04 lw ra,(sp+4) 8006514: 2b 8b 00 08 lw r11,(sp+8) 8006518: 37 9c 00 08 addi sp,sp,8 800651c: c3 a0 00 00 ret if ( sig ) *sig = status; return 0; } return errno; 8006520: f8 00 28 24 calli 80105b0 <__errno> 8006524: 28 23 00 00 lw r3,(r1+0) } 8006528: b8 60 08 00 mv r1,r3 800652c: 2b 9d 00 04 lw ra,(sp+4) 8006530: 2b 8b 00 08 lw r11,(sp+8) 8006534: 37 9c 00 08 addi sp,sp,8 8006538: c3 a0 00 00 ret =============================================================================== 08005ffc : /* * Process input character, with semaphore. */ static int siproc (unsigned char c, struct rtems_termios_tty *tty) { 8005ffc: 37 9c ff f4 addi sp,sp,-12 8006000: 5b 8b 00 0c sw (sp+12),r11 8006004: 5b 8c 00 08 sw (sp+8),r12 8006008: 5b 9d 00 04 sw (sp+4),ra int i; /* * Obtain output semaphore if character will be echoed */ if (tty->termios.c_lflag & (ECHO|ECHOE|ECHOK|ECHONL|ECHOPRT|ECHOCTL|ECHOKE)) { 800600c: 28 43 00 3c lw r3,(r2+60) /* * Process input character, with semaphore. */ static int siproc (unsigned char c, struct rtems_termios_tty *tty) { 8006010: b8 20 60 00 mv r12,r1 8006014: 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)) { 8006018: 20 61 0e 78 andi r1,r3,0xe78 800601c: 5c 20 00 0a bne r1,r0,8006044 <== ALWAYS TAKEN rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); i = iproc (c, tty); rtems_semaphore_release (tty->osem); } else { i = iproc (c, tty); 8006020: b9 80 08 00 mv r1,r12 <== NOT EXECUTED 8006024: fb ff ff 80 calli 8005e24 <== NOT EXECUTED 8006028: b8 20 60 00 mv r12,r1 <== NOT EXECUTED } return i; } 800602c: b9 80 08 00 mv r1,r12 <== NOT EXECUTED 8006030: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 8006034: 2b 8b 00 0c lw r11,(sp+12) <== NOT EXECUTED 8006038: 2b 8c 00 08 lw r12,(sp+8) <== NOT EXECUTED 800603c: 37 9c 00 0c addi sp,sp,12 <== NOT EXECUTED 8006040: c3 a0 00 00 ret <== NOT EXECUTED /* * Obtain output semaphore if character will be echoed */ if (tty->termios.c_lflag & (ECHO|ECHOE|ECHOK|ECHONL|ECHOPRT|ECHOCTL|ECHOKE)) { rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 8006044: 28 41 00 18 lw r1,(r2+24) 8006048: 34 03 00 00 mvi r3,0 800604c: 34 02 00 00 mvi r2,0 8006050: f8 00 06 28 calli 80078f0 i = iproc (c, tty); 8006054: b9 60 10 00 mv r2,r11 8006058: b9 80 08 00 mv r1,r12 800605c: fb ff ff 72 calli 8005e24 8006060: b8 20 60 00 mv r12,r1 rtems_semaphore_release (tty->osem); 8006064: 29 61 00 18 lw r1,(r11+24) 8006068: f8 00 06 7e calli 8007a60 } else { i = iproc (c, tty); } return i; } 800606c: b9 80 08 00 mv r1,r12 8006070: 2b 9d 00 04 lw ra,(sp+4) 8006074: 2b 8b 00 0c lw r11,(sp+12) 8006078: 2b 8c 00 08 lw r12,(sp+8) 800607c: 37 9c 00 0c addi sp,sp,12 8006080: c3 a0 00 00 ret =============================================================================== 08005534 : #include int statvfs (const char *path, struct statvfs *sb) { 8005534: 37 9c ff dc addi sp,sp,-36 8005538: 5b 8b 00 10 sw (sp+16),r11 800553c: 5b 8c 00 0c sw (sp+12),r12 8005540: 5b 8d 00 08 sw (sp+8),r13 8005544: 5b 9d 00 04 sw (sp+4),ra 8005548: b8 20 60 00 mv r12,r1 800554c: b8 40 58 00 mv r11,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 ) ) 8005550: 37 8d 00 14 addi r13,sp,20 8005554: f8 00 33 fd calli 8012548 8005558: b8 20 10 00 mv r2,r1 800555c: 34 03 00 00 mvi r3,0 8005560: b9 80 08 00 mv r1,r12 8005564: b9 a0 20 00 mv r4,r13 8005568: 34 05 00 01 mvi r5,1 800556c: fb ff f9 ba calli 8003c54 return -1; 8005570: 34 0c ff ff mvi r12,-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 ) ) 8005574: 5c 20 00 18 bne r1,r0,80055d4 <== NEVER TAKEN return -1; mt_entry = loc.mt_entry; 8005578: 2b 81 00 24 lw r1,(sp+36) fs_mount_root = &mt_entry->mt_fs_root; memset (sb, 0, sizeof (struct statvfs)); 800557c: 59 60 00 00 sw (r11+0),r0 8005580: 59 60 00 04 sw (r11+4),r0 8005584: 59 60 00 08 sw (r11+8),r0 8005588: 59 60 00 0c sw (r11+12),r0 800558c: 59 60 00 10 sw (r11+16),r0 8005590: 59 60 00 14 sw (r11+20),r0 8005594: 59 60 00 18 sw (r11+24),r0 8005598: 59 60 00 1c sw (r11+28),r0 800559c: 59 60 00 20 sw (r11+32),r0 80055a0: 59 60 00 24 sw (r11+36),r0 80055a4: 59 60 00 28 sw (r11+40),r0 80055a8: 59 60 00 2c sw (r11+44),r0 80055ac: 59 60 00 30 sw (r11+48),r0 80055b0: 59 60 00 34 sw (r11+52),r0 result = ( fs_mount_root->ops->statvfs_h )( fs_mount_root, sb ); 80055b4: 28 23 00 28 lw r3,(r1+40) 80055b8: b9 60 10 00 mv r2,r11 80055bc: 34 21 00 1c addi r1,r1,28 80055c0: 28 63 00 44 lw r3,(r3+68) 80055c4: d8 60 00 00 call r3 80055c8: b8 20 60 00 mv r12,r1 rtems_filesystem_freenode( &loc ); 80055cc: b9 a0 08 00 mv r1,r13 80055d0: fb ff f9 ef calli 8003d8c return result; } 80055d4: b9 80 08 00 mv r1,r12 80055d8: 2b 9d 00 04 lw ra,(sp+4) 80055dc: 2b 8b 00 10 lw r11,(sp+16) 80055e0: 2b 8c 00 0c lw r12,(sp+12) 80055e4: 2b 8d 00 08 lw r13,(sp+8) 80055e8: 37 9c 00 24 addi sp,sp,36 80055ec: c3 a0 00 00 ret =============================================================================== 08003d9c : fdatasync(fn); } /* iterate over all FILE *'s for this thread */ static void sync_per_thread(Thread_Control *t) { 8003d9c: 37 9c ff f4 addi sp,sp,-12 8003da0: 5b 8b 00 0c sw (sp+12),r11 8003da4: 5b 8c 00 08 sw (sp+8),r12 8003da8: 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; 8003dac: 28 23 01 18 lw r3,(r1+280) if ( this_reent ) { 8003db0: 44 60 00 0c be r3,r0,8003de0 <== NEVER TAKEN current_reent = _Thread_Executing->libc_reent; 8003db4: 78 0b 08 01 mvhi r11,0x801 8003db8: 39 6b 6d 74 ori r11,r11,0x6d74 8003dbc: 29 64 00 0c lw r4,(r11+12) _Thread_Executing->libc_reent = this_reent; _fwalk (t->libc_reent, sync_wrapper); 8003dc0: 78 02 08 00 mvhi r2,0x800 8003dc4: 38 42 3d f4 ori r2,r2,0x3df4 * The sync_wrapper() function will operate on the current thread's * reent structure so we will temporarily use that. */ this_reent = t->libc_reent; if ( this_reent ) { current_reent = _Thread_Executing->libc_reent; 8003dc8: 28 8c 01 18 lw r12,(r4+280) _Thread_Executing->libc_reent = this_reent; 8003dcc: 58 83 01 18 sw (r4+280),r3 _fwalk (t->libc_reent, sync_wrapper); 8003dd0: 28 21 01 18 lw r1,(r1+280) 8003dd4: f8 00 2c f4 calli 800f1a4 <_fwalk> _Thread_Executing->libc_reent = current_reent; 8003dd8: 29 61 00 0c lw r1,(r11+12) 8003ddc: 58 2c 01 18 sw (r1+280),r12 } } 8003de0: 2b 9d 00 04 lw ra,(sp+4) 8003de4: 2b 8b 00 0c lw r11,(sp+12) 8003de8: 2b 8c 00 08 lw r12,(sp+8) 8003dec: 37 9c 00 0c addi sp,sp,12 8003df0: c3 a0 00 00 ret =============================================================================== 08004a78 : int tcsetattr( int fd, int opt, struct termios *tp ) { 8004a78: 37 9c ff f4 addi sp,sp,-12 8004a7c: 5b 8b 00 0c sw (sp+12),r11 8004a80: 5b 8c 00 08 sw (sp+8),r12 8004a84: 5b 9d 00 04 sw (sp+4),ra 8004a88: b8 20 60 00 mv r12,r1 8004a8c: b8 60 58 00 mv r11,r3 switch (opt) { 8004a90: 44 40 00 12 be r2,r0,8004ad8 8004a94: 34 03 00 01 mvi r3,1 8004a98: 44 43 00 0a be r2,r3,8004ac0 default: rtems_set_errno_and_return_minus_one( ENOTSUP ); 8004a9c: f8 00 33 ae calli 8011954 <__errno> 8004aa0: 34 02 00 86 mvi r2,134 8004aa4: 58 22 00 00 sw (r1+0),r2 8004aa8: 34 01 ff ff mvi r1,-1 * Fall through to.... */ case TCSANOW: return ioctl( fd, RTEMS_IO_SET_ATTRIBUTES, tp ); } } 8004aac: 2b 9d 00 04 lw ra,(sp+4) 8004ab0: 2b 8b 00 0c lw r11,(sp+12) 8004ab4: 2b 8c 00 08 lw r12,(sp+8) 8004ab8: 37 9c 00 0c addi sp,sp,12 8004abc: c3 a0 00 00 ret switch (opt) { default: rtems_set_errno_and_return_minus_one( ENOTSUP ); case TCSADRAIN: if (ioctl( fd, RTEMS_IO_TCDRAIN, NULL ) < 0) 8004ac0: 34 02 00 03 mvi r2,3 8004ac4: 34 03 00 00 mvi r3,0 8004ac8: f8 00 23 4e calli 800d800 8004acc: b8 20 10 00 mv r2,r1 return -1; 8004ad0: 34 01 ff ff mvi r1,-1 switch (opt) { default: rtems_set_errno_and_return_minus_one( ENOTSUP ); case TCSADRAIN: if (ioctl( fd, RTEMS_IO_TCDRAIN, NULL ) < 0) 8004ad4: 48 02 ff f6 bg r0,r2,8004aac <== NEVER TAKEN return -1; /* * Fall through to.... */ case TCSANOW: return ioctl( fd, RTEMS_IO_SET_ATTRIBUTES, tp ); 8004ad8: b9 80 08 00 mv r1,r12 8004adc: 34 02 00 02 mvi r2,2 8004ae0: b9 60 18 00 mv r3,r11 8004ae4: f8 00 23 47 calli 800d800 } } 8004ae8: 2b 9d 00 04 lw ra,(sp+4) 8004aec: 2b 8b 00 0c lw r11,(sp+12) 8004af0: 2b 8c 00 08 lw r12,(sp+8) 8004af4: 37 9c 00 0c addi sp,sp,12 8004af8: c3 a0 00 00 ret =============================================================================== 08003130 : int timer_create( clockid_t clock_id, struct sigevent *evp, timer_t *timerid ) { 8003130: 37 9c ff f0 addi sp,sp,-16 8003134: 5b 8b 00 10 sw (sp+16),r11 8003138: 5b 8c 00 0c sw (sp+12),r12 800313c: 5b 8d 00 08 sw (sp+8),r13 8003140: 5b 9d 00 04 sw (sp+4),ra 8003144: b8 40 58 00 mv r11,r2 POSIX_Timer_Control *ptimer; if ( clock_id != CLOCK_REALTIME ) 8003148: 34 02 00 01 mvi r2,1 int timer_create( clockid_t clock_id, struct sigevent *evp, timer_t *timerid ) { 800314c: b8 60 68 00 mv r13,r3 POSIX_Timer_Control *ptimer; if ( clock_id != CLOCK_REALTIME ) 8003150: 5c 22 00 06 bne r1,r2,8003168 rtems_set_errno_and_return_minus_one( EINVAL ); if ( !timerid ) 8003154: 44 60 00 05 be r3,r0,8003168 /* * The data of the structure evp are checked in order to verify if they * are coherent. */ if (evp != NULL) { 8003158: 45 60 00 14 be r11,r0,80031a8 /* The structure has data */ if ( ( evp->sigev_notify != SIGEV_NONE ) && 800315c: 29 62 00 00 lw r2,(r11+0) 8003160: 34 42 ff ff addi r2,r2,-1 8003164: 50 22 00 0b bgeu r1,r2,8003190 <== ALWAYS TAKEN if ( !evp->sigev_signo ) rtems_set_errno_and_return_minus_one( EINVAL ); if ( !is_valid_signo(evp->sigev_signo) ) rtems_set_errno_and_return_minus_one( EINVAL ); 8003168: f8 00 2b 47 calli 800de84 <__errno> 800316c: 34 02 00 16 mvi r2,22 8003170: 58 22 00 00 sw (r1+0),r2 8003174: 34 01 ff ff mvi r1,-1 _Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0); *timerid = ptimer->Object.id; _Thread_Enable_dispatch(); return 0; } 8003178: 2b 9d 00 04 lw ra,(sp+4) 800317c: 2b 8b 00 10 lw r11,(sp+16) 8003180: 2b 8c 00 0c lw r12,(sp+12) 8003184: 2b 8d 00 08 lw r13,(sp+8) 8003188: 37 9c 00 10 addi sp,sp,16 800318c: c3 a0 00 00 ret ( 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 ) 8003190: 29 61 00 04 lw r1,(r11+4) 8003194: 44 20 ff f5 be r1,r0,8003168 <== NEVER TAKEN static inline bool is_valid_signo( int signo ) { return ((signo) >= 1 && (signo) <= 32 ); 8003198: 34 21 ff ff addi r1,r1,-1 rtems_set_errno_and_return_minus_one( EINVAL ); if ( !is_valid_signo(evp->sigev_signo) ) 800319c: 34 02 00 1f mvi r2,31 80031a0: 50 41 00 02 bgeu r2,r1,80031a8 <== ALWAYS TAKEN 80031a4: e3 ff ff f1 bi 8003168 <== NOT EXECUTED rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 80031a8: 78 01 08 02 mvhi r1,0x802 80031ac: 38 21 08 f8 ori r1,r1,0x8f8 80031b0: 28 22 00 00 lw r2,(r1+0) 80031b4: 34 42 00 01 addi r2,r2,1 80031b8: 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 ); 80031bc: 78 0c 08 02 mvhi r12,0x802 80031c0: 39 8c 0b 8c ori r12,r12,0xb8c 80031c4: b9 80 08 00 mv r1,r12 80031c8: f8 00 07 62 calli 8004f50 <_Objects_Allocate> /* * Allocate a timer */ ptimer = _POSIX_Timer_Allocate(); if ( !ptimer ) { 80031cc: 44 20 00 29 be r1,r0,8003270 } /* The data of the created timer are stored to use them later */ ptimer->state = POSIX_TIMER_STATE_CREATE_NEW; ptimer->thread_id = _Thread_Executing->Object.id; 80031d0: 78 02 08 02 mvhi r2,0x802 rtems_set_errno_and_return_minus_one( EAGAIN ); } /* The data of the created timer are stored to use them later */ ptimer->state = POSIX_TIMER_STATE_CREATE_NEW; 80031d4: 34 03 00 02 mvi r3,2 80031d8: 30 23 00 3c sb (r1+60),r3 ptimer->thread_id = _Thread_Executing->Object.id; 80031dc: 38 42 0d c4 ori r2,r2,0xdc4 80031e0: 28 42 00 0c lw r2,(r2+12) 80031e4: 28 42 00 08 lw r2,(r2+8) 80031e8: 58 22 00 38 sw (r1+56),r2 if ( evp != NULL ) { 80031ec: 45 60 00 07 be r11,r0,8003208 ptimer->inf.sigev_notify = evp->sigev_notify; 80031f0: 29 64 00 00 lw r4,(r11+0) ptimer->inf.sigev_signo = evp->sigev_signo; 80031f4: 29 63 00 04 lw r3,(r11+4) ptimer->inf.sigev_value = evp->sigev_value; 80031f8: 29 62 00 08 lw r2,(r11+8) ptimer->state = POSIX_TIMER_STATE_CREATE_NEW; ptimer->thread_id = _Thread_Executing->Object.id; if ( evp != NULL ) { ptimer->inf.sigev_notify = evp->sigev_notify; 80031fc: 58 24 00 40 sw (r1+64),r4 ptimer->inf.sigev_signo = evp->sigev_signo; 8003200: 58 23 00 44 sw (r1+68),r3 ptimer->inf.sigev_value = evp->sigev_value; 8003204: 58 22 00 48 sw (r1+72),r2 uint32_t name ) { _Objects_Set_local_object( information, _Objects_Get_index( the_object->id ), 8003208: 28 23 00 08 lw r3,(r1+8) #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 800320c: 29 84 00 1c lw r4,(r12+28) } ptimer->overrun = 0; 8003210: 58 20 00 68 sw (r1+104),r0 Objects_Information *information, Objects_Control *the_object, uint32_t name ) { _Objects_Set_local_object( 8003214: 20 62 ff ff andi r2,r3,0xffff #if defined(RTEMS_DEBUG) if ( index > information->maximum ) return; #endif information->local_table[ index ] = the_object; 8003218: b4 42 10 00 add r2,r2,r2 800321c: b4 42 10 00 add r2,r2,r2 ptimer->timer_data.it_value.tv_sec = 0; 8003220: 58 20 00 5c sw (r1+92),r0 ptimer->timer_data.it_value.tv_nsec = 0; 8003224: 58 20 00 60 sw (r1+96),r0 ptimer->timer_data.it_interval.tv_sec = 0; 8003228: 58 20 00 54 sw (r1+84),r0 ptimer->timer_data.it_interval.tv_nsec = 0; 800322c: 58 20 00 58 sw (r1+88),r0 Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 8003230: 58 20 00 18 sw (r1+24),r0 the_watchdog->routine = routine; 8003234: 58 20 00 2c sw (r1+44),r0 the_watchdog->id = id; 8003238: 58 20 00 30 sw (r1+48),r0 the_watchdog->user_data = user_data; 800323c: 58 20 00 34 sw (r1+52),r0 8003240: b4 82 10 00 add r2,r4,r2 8003244: 58 41 00 00 sw (r2+0),r1 _Objects_Get_index( the_object->id ), the_object ); /* ASSERT: information->is_string == false */ the_object->name.name_u32 = name; 8003248: 58 20 00 0c sw (r1+12),r0 _Watchdog_Initialize( &ptimer->Timer, NULL, 0, NULL ); _Objects_Open_u32(&_POSIX_Timer_Information, &ptimer->Object, 0); *timerid = ptimer->Object.id; 800324c: 59 a3 00 00 sw (r13+0),r3 _Thread_Enable_dispatch(); 8003250: f8 00 0b b1 calli 8006114 <_Thread_Enable_dispatch> return 0; 8003254: 34 01 00 00 mvi r1,0 } 8003258: 2b 9d 00 04 lw ra,(sp+4) 800325c: 2b 8b 00 10 lw r11,(sp+16) 8003260: 2b 8c 00 0c lw r12,(sp+12) 8003264: 2b 8d 00 08 lw r13,(sp+8) 8003268: 37 9c 00 10 addi sp,sp,16 800326c: c3 a0 00 00 ret /* * Allocate a timer */ ptimer = _POSIX_Timer_Allocate(); if ( !ptimer ) { _Thread_Enable_dispatch(); 8003270: f8 00 0b a9 calli 8006114 <_Thread_Enable_dispatch> rtems_set_errno_and_return_minus_one( EAGAIN ); 8003274: f8 00 2b 04 calli 800de84 <__errno> 8003278: 34 02 00 0b mvi r2,11 800327c: 58 22 00 00 sw (r1+0),r2 8003280: 34 01 ff ff mvi r1,-1 8003284: e3 ff ff f5 bi 8003258 =============================================================================== 08003288 : timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue ) { 8003288: 37 9c ff cc addi sp,sp,-52 800328c: 5b 8b 00 18 sw (sp+24),r11 8003290: 5b 8c 00 14 sw (sp+20),r12 8003294: 5b 8d 00 10 sw (sp+16),r13 8003298: 5b 8e 00 0c sw (sp+12),r14 800329c: 5b 8f 00 08 sw (sp+8),r15 80032a0: 5b 9d 00 04 sw (sp+4),ra 80032a4: b8 60 60 00 mv r12,r3 80032a8: b8 20 70 00 mv r14,r1 80032ac: b8 40 58 00 mv r11,r2 80032b0: b8 80 68 00 mv r13,r4 Objects_Locations location; bool activated; uint32_t initial_period; struct itimerspec normalize; if ( !value ) 80032b4: 44 60 00 1e be r3,r0,800332c <== 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) ) ) { 80032b8: 34 61 00 08 addi r1,r3,8 80032bc: f8 00 0f 17 calli 8006f18 <_Timespec_Is_valid> 80032c0: 44 20 00 1b be r1,r0,800332c rtems_set_errno_and_return_minus_one( EINVAL ); } if ( !_Timespec_Is_valid( &(value->it_interval) ) ) { 80032c4: b9 80 08 00 mv r1,r12 80032c8: f8 00 0f 14 calli 8006f18 <_Timespec_Is_valid> 80032cc: 44 20 00 18 be r1,r0,800332c <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EINVAL ); } if ( flags != TIMER_ABSTIME && flags != POSIX_TIMER_RELATIVE ) { 80032d0: 7d 62 00 00 cmpnei r2,r11,0 80032d4: 7d 61 00 04 cmpnei r1,r11,4 80032d8: a0 41 08 00 and r1,r2,r1 80032dc: 5c 20 00 14 bne r1,r0,800332c rtems_set_errno_and_return_minus_one( EINVAL ); } normalize = *value; 80032e0: 29 81 00 0c lw r1,(r12+12) 80032e4: 29 84 00 00 lw r4,(r12+0) 80032e8: 29 83 00 04 lw r3,(r12+4) 80032ec: 29 82 00 08 lw r2,(r12+8) 80032f0: 5b 81 00 28 sw (sp+40),r1 80032f4: 5b 84 00 1c sw (sp+28),r4 80032f8: 5b 83 00 20 sw (sp+32),r3 80032fc: 5b 82 00 24 sw (sp+36),r2 /* Convert absolute to relative time */ if (flags == TIMER_ABSTIME) { 8003300: 34 01 00 04 mvi r1,4 8003304: 45 61 00 46 be r11,r1,800341c timer_t id, Objects_Locations *location ) { return (POSIX_Timer_Control *) _Objects_Get( &_POSIX_Timer_Information, (Objects_Id) id, location ); 8003308: 78 03 08 02 mvhi r3,0x802 800330c: b8 60 08 00 mv r1,r3 8003310: 38 21 0b 8c ori r1,r1,0xb8c 8003314: b9 c0 10 00 mv r2,r14 8003318: 37 83 00 34 addi r3,sp,52 800331c: f8 00 08 53 calli 8005468 <_Objects_Get> 8003320: b8 20 58 00 mv r11,r1 * something with the structure of times of the timer: to stop, start * or start it again */ ptimer = _POSIX_Timer_Get( timerid, &location ); switch ( location ) { 8003324: 2b 81 00 34 lw r1,(sp+52) 8003328: 44 20 00 0d be r1,r0,800335c #endif case OBJECTS_ERROR: break; } rtems_set_errno_and_return_minus_one( EINVAL ); 800332c: f8 00 2a d6 calli 800de84 <__errno> 8003330: 34 02 00 16 mvi r2,22 8003334: 58 22 00 00 sw (r1+0),r2 8003338: 34 01 ff ff mvi r1,-1 } 800333c: 2b 9d 00 04 lw ra,(sp+4) 8003340: 2b 8b 00 18 lw r11,(sp+24) 8003344: 2b 8c 00 14 lw r12,(sp+20) 8003348: 2b 8d 00 10 lw r13,(sp+16) 800334c: 2b 8e 00 0c lw r14,(sp+12) 8003350: 2b 8f 00 08 lw r15,(sp+8) 8003354: 37 9c 00 34 addi sp,sp,52 8003358: c3 a0 00 00 ret ptimer = _POSIX_Timer_Get( timerid, &location ); switch ( location ) { 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 ) { 800335c: 2b 82 00 24 lw r2,(sp+36) 8003360: 5c 41 00 03 bne r2,r1,800336c 8003364: 2b 8e 00 28 lw r14,(sp+40) 8003368: 45 c2 00 3a be r14,r2,8003450 _Thread_Enable_dispatch(); return 0; } /* Convert from seconds and nanoseconds to ticks */ ptimer->ticks = _Timespec_To_ticks( &value->it_interval ); 800336c: b9 80 08 00 mv r1,r12 8003370: f8 00 0f 0c calli 8006fa0 <_Timespec_To_ticks> 8003374: 59 61 00 64 sw (r11+100),r1 initial_period = _Timespec_To_ticks( &normalize.it_value ); 8003378: 37 81 00 24 addi r1,sp,36 800337c: f8 00 0f 09 calli 8006fa0 <_Timespec_To_ticks> activated = _POSIX_Timer_Insert_helper( 8003380: 29 63 00 08 lw r3,(r11+8) 8003384: 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 ); 8003388: b8 20 10 00 mv r2,r1 activated = _POSIX_Timer_Insert_helper( 800338c: 38 84 34 cc ori r4,r4,0x34cc 8003390: 35 61 00 10 addi r1,r11,16 8003394: b9 60 28 00 mv r5,r11 8003398: f8 00 1b aa calli 800a240 <_POSIX_Timer_Insert_helper> initial_period, ptimer->Object.id, _POSIX_Timer_TSR, ptimer ); if ( !activated ) { 800339c: 44 20 00 16 be r1,r0,80033f4 /* * The timer has been started and is running. So we return the * old ones in "ovalue" */ if ( ovalue ) 80033a0: 45 a0 00 09 be r13,r0,80033c4 *ovalue = ptimer->timer_data; 80033a4: 29 61 00 54 lw r1,(r11+84) 80033a8: 59 a1 00 00 sw (r13+0),r1 80033ac: 29 61 00 58 lw r1,(r11+88) 80033b0: 59 a1 00 04 sw (r13+4),r1 80033b4: 29 61 00 5c lw r1,(r11+92) 80033b8: 59 a1 00 08 sw (r13+8),r1 80033bc: 29 61 00 60 lw r1,(r11+96) 80033c0: 59 a1 00 0c sw (r13+12),r1 ptimer->timer_data = normalize; 80033c4: 2b 82 00 1c lw r2,(sp+28) /* Indicate that the time is running */ ptimer->state = POSIX_TIMER_STATE_CREATE_RUN; _TOD_Get( &ptimer->time ); 80033c8: 35 61 00 6c addi r1,r11,108 * The timer has been started and is running. So we return the * old ones in "ovalue" */ if ( ovalue ) *ovalue = ptimer->timer_data; ptimer->timer_data = normalize; 80033cc: 59 62 00 54 sw (r11+84),r2 80033d0: 2b 82 00 20 lw r2,(sp+32) 80033d4: 59 62 00 58 sw (r11+88),r2 80033d8: 2b 82 00 24 lw r2,(sp+36) 80033dc: 59 62 00 5c sw (r11+92),r2 80033e0: 2b 82 00 28 lw r2,(sp+40) 80033e4: 59 62 00 60 sw (r11+96),r2 /* Indicate that the time is running */ ptimer->state = POSIX_TIMER_STATE_CREATE_RUN; 80033e8: 34 02 00 03 mvi r2,3 80033ec: 31 62 00 3c sb (r11+60),r2 _TOD_Get( &ptimer->time ); 80033f0: f8 00 05 04 calli 8004800 <_TOD_Get> _Thread_Enable_dispatch(); 80033f4: f8 00 0b 48 calli 8006114 <_Thread_Enable_dispatch> return 0; 80033f8: 34 01 00 00 mvi r1,0 case OBJECTS_ERROR: break; } rtems_set_errno_and_return_minus_one( EINVAL ); } 80033fc: 2b 9d 00 04 lw ra,(sp+4) 8003400: 2b 8b 00 18 lw r11,(sp+24) 8003404: 2b 8c 00 14 lw r12,(sp+20) 8003408: 2b 8d 00 10 lw r13,(sp+16) 800340c: 2b 8e 00 0c lw r14,(sp+12) 8003410: 2b 8f 00 08 lw r15,(sp+8) 8003414: 37 9c 00 34 addi sp,sp,52 8003418: c3 a0 00 00 ret normalize = *value; /* Convert absolute to relative time */ if (flags == TIMER_ABSTIME) { struct timespec now; _TOD_Get( &now ); 800341c: 37 8b 00 2c addi r11,sp,44 8003420: b9 60 08 00 mv r1,r11 8003424: f8 00 04 f7 calli 8004800 <_TOD_Get> /* Check for seconds in the past */ if ( _Timespec_Greater_than( &now, &normalize.it_value ) ) 8003428: 37 8f 00 24 addi r15,sp,36 800342c: b9 60 08 00 mv r1,r11 8003430: b9 e0 10 00 mv r2,r15 8003434: f8 00 0e ae calli 8006eec <_Timespec_Greater_than> 8003438: 5c 20 ff bd bne r1,r0,800332c rtems_set_errno_and_return_minus_one( EINVAL ); _Timespec_Subtract( &now, &normalize.it_value, &normalize.it_value ); 800343c: b9 e0 10 00 mv r2,r15 8003440: b9 60 08 00 mv r1,r11 8003444: b9 e0 18 00 mv r3,r15 8003448: f8 00 0e c0 calli 8006f48 <_Timespec_Subtract> 800344c: e3 ff ff af bi 8003308 case OBJECTS_LOCAL: /* First, it verifies if the timer must be stopped */ if ( normalize.it_value.tv_sec == 0 && normalize.it_value.tv_nsec == 0 ) { /* Stop the timer */ (void) _Watchdog_Remove( &ptimer->Timer ); 8003450: 35 61 00 10 addi r1,r11,16 8003454: f8 00 10 5b calli 80075c0 <_Watchdog_Remove> /* The old data of the timer are returned */ if ( ovalue ) 8003458: 45 ae 00 09 be r13,r14,800347c *ovalue = ptimer->timer_data; 800345c: 29 61 00 54 lw r1,(r11+84) 8003460: 59 a1 00 00 sw (r13+0),r1 8003464: 29 61 00 58 lw r1,(r11+88) 8003468: 59 a1 00 04 sw (r13+4),r1 800346c: 29 61 00 5c lw r1,(r11+92) 8003470: 59 a1 00 08 sw (r13+8),r1 8003474: 29 61 00 60 lw r1,(r11+96) 8003478: 59 a1 00 0c sw (r13+12),r1 /* The new data are set */ ptimer->timer_data = normalize; 800347c: 2b 81 00 1c lw r1,(sp+28) 8003480: 59 61 00 54 sw (r11+84),r1 8003484: 2b 81 00 20 lw r1,(sp+32) 8003488: 59 61 00 58 sw (r11+88),r1 800348c: 2b 81 00 24 lw r1,(sp+36) 8003490: 59 61 00 5c sw (r11+92),r1 8003494: 2b 81 00 28 lw r1,(sp+40) 8003498: 59 61 00 60 sw (r11+96),r1 /* Indicates that the timer is created and stopped */ ptimer->state = POSIX_TIMER_STATE_CREATE_STOP; 800349c: 34 01 00 04 mvi r1,4 80034a0: 31 61 00 3c sb (r11+60),r1 /* Returns with success */ _Thread_Enable_dispatch(); 80034a4: f8 00 0b 1c calli 8006114 <_Thread_Enable_dispatch> return 0; 80034a8: 34 01 00 00 mvi r1,0 case OBJECTS_ERROR: break; } rtems_set_errno_and_return_minus_one( EINVAL ); } 80034ac: 2b 9d 00 04 lw ra,(sp+4) 80034b0: 2b 8b 00 18 lw r11,(sp+24) 80034b4: 2b 8c 00 14 lw r12,(sp+20) 80034b8: 2b 8d 00 10 lw r13,(sp+16) 80034bc: 2b 8e 00 0c lw r14,(sp+12) 80034c0: 2b 8f 00 08 lw r15,(sp+8) 80034c4: 37 9c 00 34 addi sp,sp,52 80034c8: c3 a0 00 00 ret =============================================================================== 08003054 : useconds_t ualarm( useconds_t useconds, useconds_t interval ) { 8003054: 37 9c ff e4 addi sp,sp,-28 8003058: 5b 8b 00 14 sw (sp+20),r11 800305c: 5b 8c 00 10 sw (sp+16),r12 8003060: 5b 8d 00 0c sw (sp+12),r13 8003064: 5b 8e 00 08 sw (sp+8),r14 8003068: 5b 9d 00 04 sw (sp+4),ra /* * Initialize the timer used to implement alarm(). */ if ( !the_timer->routine ) { 800306c: 78 0b 08 01 mvhi r11,0x801 8003070: 39 6b 81 88 ori r11,r11,0x8188 8003074: 29 62 00 1c lw r2,(r11+28) useconds_t ualarm( useconds_t useconds, useconds_t interval ) { 8003078: b8 20 60 00 mv r12,r1 /* * Initialize the timer used to implement alarm(). */ if ( !the_timer->routine ) { 800307c: 44 40 00 55 be r2,r0,80031d0 _Watchdog_Initialize( the_timer, _POSIX_signals_Ualarm_TSR, 0, NULL ); } else { Watchdog_States state; state = _Watchdog_Remove( the_timer ); 8003080: b9 60 08 00 mv r1,r11 8003084: f8 00 0f bf calli 8006f80 <_Watchdog_Remove> if ( (state == WATCHDOG_ACTIVE) || (state == WATCHDOG_REMOVE_IT) ) { 8003088: 34 21 ff fe addi r1,r1,-2 800308c: 34 02 00 01 mvi r2,1 useconds_t ualarm( useconds_t useconds, useconds_t interval ) { useconds_t remaining = 0; 8003090: 34 0d 00 00 mvi r13,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) ) { 8003094: 54 22 00 24 bgu r1,r2,8003124 <== 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); 8003098: 29 64 00 14 lw r4,(r11+20) 800309c: 29 61 00 0c lw r1,(r11+12) 80030a0: 29 63 00 18 lw r3,(r11+24) /* remaining is now in ticks */ _Timespec_From_ticks( ticks, &tp ); 80030a4: 37 82 00 18 addi r2,sp,24 * 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); 80030a8: b4 81 08 00 add r1,r4,r1 /* remaining is now in ticks */ _Timespec_From_ticks( ticks, &tp ); 80030ac: c8 23 08 00 sub r1,r1,r3 80030b0: f8 00 0d b2 calli 8006778 <_Timespec_From_ticks> remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND; 80030b4: 2b 85 00 18 lw r5,(sp+24) remaining += tp.tv_nsec / 1000; 80030b8: 2b 81 00 1c lw r1,(sp+28) 80030bc: 34 02 03 e8 mvi r2,1000 ticks = the_timer->initial; ticks -= (the_timer->stop_time - the_timer->start_time); /* remaining is now in ticks */ _Timespec_From_ticks( ticks, &tp ); remaining = tp.tv_sec * TOD_MICROSECONDS_PER_SECOND; 80030c0: b4 a5 18 00 add r3,r5,r5 80030c4: b4 63 18 00 add r3,r3,r3 80030c8: b4 63 18 00 add r3,r3,r3 80030cc: b4 63 20 00 add r4,r3,r3 80030d0: b4 84 20 00 add r4,r4,r4 80030d4: b4 84 20 00 add r4,r4,r4 80030d8: b4 84 20 00 add r4,r4,r4 80030dc: b4 84 20 00 add r4,r4,r4 80030e0: c8 83 20 00 sub r4,r4,r3 80030e4: b4 84 18 00 add r3,r4,r4 80030e8: b4 63 18 00 add r3,r3,r3 80030ec: b4 63 18 00 add r3,r3,r3 80030f0: b4 63 18 00 add r3,r3,r3 80030f4: b4 63 18 00 add r3,r3,r3 80030f8: b4 63 18 00 add r3,r3,r3 80030fc: c8 64 18 00 sub r3,r3,r4 8003100: b4 65 68 00 add r13,r3,r5 8003104: b5 ad 68 00 add r13,r13,r13 8003108: b5 ad 68 00 add r13,r13,r13 800310c: b5 ad 68 00 add r13,r13,r13 8003110: b5 ad 68 00 add r13,r13,r13 8003114: b5 ad 68 00 add r13,r13,r13 8003118: b5 ad 68 00 add r13,r13,r13 remaining += tp.tv_nsec / 1000; 800311c: f8 00 44 be calli 8014414 <__divsi3> 8003120: b4 2d 68 00 add r13,r1,r13 /* * 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 ) { 8003124: 45 80 00 23 be r12,r0,80031b0 Watchdog_Interval ticks; tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND; 8003128: 78 01 08 01 mvhi r1,0x801 800312c: 38 21 57 1c ori r1,r1,0x571c 8003130: 28 22 00 00 lw r2,(r1+0) 8003134: b9 80 08 00 mv r1,r12 tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000; ticks = _Timespec_To_ticks( &tp ); 8003138: 37 8e 00 18 addi r14,sp,24 * 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; 800313c: f8 00 45 0f calli 8014578 <__udivsi3> tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000; 8003140: 78 03 08 01 mvhi r3,0x801 8003144: 38 63 57 1c ori r3,r3,0x571c 8003148: 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; 800314c: 5b 81 00 18 sw (sp+24),r1 tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000; 8003150: b9 80 08 00 mv r1,r12 8003154: f8 00 45 19 calli 80145b8 <__umodsi3> 8003158: b4 21 10 00 add r2,r1,r1 800315c: b4 42 10 00 add r2,r2,r2 8003160: b4 42 10 00 add r2,r2,r2 8003164: b4 42 18 00 add r3,r2,r2 8003168: b4 63 18 00 add r3,r3,r3 800316c: b4 43 10 00 add r2,r2,r3 8003170: b4 42 18 00 add r3,r2,r2 8003174: b4 63 18 00 add r3,r3,r3 8003178: b4 43 10 00 add r2,r2,r3 800317c: b4 42 18 00 add r3,r2,r2 8003180: b4 63 18 00 add r3,r3,r3 8003184: b4 43 18 00 add r3,r2,r3 ticks = _Timespec_To_ticks( &tp ); 8003188: b9 c0 08 00 mv r1,r14 */ if ( useconds ) { Watchdog_Interval ticks; tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND; tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000; 800318c: 5b 83 00 1c sw (sp+28),r3 ticks = _Timespec_To_ticks( &tp ); 8003190: f8 00 0d b6 calli 8006868 <_Timespec_To_ticks> if ( ticks == 0 ) ticks = 1; _Watchdog_Insert_ticks( the_timer, _Timespec_To_ticks( &tp ) ); 8003194: b9 c0 08 00 mv r1,r14 8003198: f8 00 0d b4 calli 8006868 <_Timespec_To_ticks> Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 800319c: 59 61 00 0c sw (r11+12),r1 _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 80031a0: 78 01 08 01 mvhi r1,0x801 80031a4: b9 60 10 00 mv r2,r11 80031a8: 38 21 79 d8 ori r1,r1,0x79d8 80031ac: f8 00 0f 0a calli 8006dd4 <_Watchdog_Insert> } return remaining; } 80031b0: b9 a0 08 00 mv r1,r13 80031b4: 2b 9d 00 04 lw ra,(sp+4) 80031b8: 2b 8b 00 14 lw r11,(sp+20) 80031bc: 2b 8c 00 10 lw r12,(sp+16) 80031c0: 2b 8d 00 0c lw r13,(sp+12) 80031c4: 2b 8e 00 08 lw r14,(sp+8) 80031c8: 37 9c 00 1c addi sp,sp,28 80031cc: c3 a0 00 00 ret Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; 80031d0: 78 01 08 00 mvhi r1,0x800 80031d4: 38 21 30 0c ori r1,r1,0x300c Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 80031d8: 59 60 00 08 sw (r11+8),r0 the_watchdog->routine = routine; 80031dc: 59 61 00 1c sw (r11+28),r1 the_watchdog->id = id; 80031e0: 59 60 00 20 sw (r11+32),r0 the_watchdog->user_data = user_data; 80031e4: 59 60 00 24 sw (r11+36),r0 useconds_t ualarm( useconds_t useconds, useconds_t interval ) { useconds_t remaining = 0; 80031e8: 34 0d 00 00 mvi r13,0 80031ec: e3 ff ff ce bi 8003124 =============================================================================== 08002f80 : */ int uname( struct utsname *name ) { 8002f80: 37 9c ff f8 addi sp,sp,-8 8002f84: 5b 8b 00 08 sw (sp+8),r11 8002f88: 5b 9d 00 04 sw (sp+4),ra 8002f8c: b8 20 58 00 mv r11,r1 release = 5.3 version = Generic_101318-12 machine = sun4m */ if ( !name ) 8002f90: 44 20 00 23 be r1,r0,800301c <== NEVER TAKEN rtems_set_errno_and_return_minus_one( EFAULT ); strncpy( name->sysname, "RTEMS", sizeof(name->sysname) ); 8002f94: 78 02 08 01 mvhi r2,0x801 8002f98: 38 42 e1 94 ori r2,r2,0xe194 8002f9c: 34 03 00 20 mvi r3,32 8002fa0: f8 00 30 20 calli 800f020 snprintf( name->nodename, sizeof(name->nodename), "Node %" PRId16, _Objects_Local_node ); 8002fa4: 78 03 08 01 mvhi r3,0x801 8002fa8: 34 04 00 01 mvi r4,1 8002fac: 34 02 00 20 mvi r2,32 8002fb0: 38 63 e1 9c ori r3,r3,0xe19c 8002fb4: 35 61 00 20 addi r1,r11,32 8002fb8: f8 00 2e b6 calli 800ea90 strncpy( name->release, RTEMS_VERSION, sizeof(name->release) ); 8002fbc: 78 02 08 01 mvhi r2,0x801 8002fc0: 38 42 e1 a4 ori r2,r2,0xe1a4 8002fc4: 34 03 00 20 mvi r3,32 8002fc8: 35 61 00 40 addi r1,r11,64 8002fcc: f8 00 30 15 calli 800f020 strncpy( name->version, "", sizeof(name->version) ); 8002fd0: 78 02 08 01 mvhi r2,0x801 8002fd4: 38 42 db 60 ori r2,r2,0xdb60 8002fd8: 34 03 00 20 mvi r3,32 8002fdc: 35 61 00 60 addi r1,r11,96 8002fe0: f8 00 30 10 calli 800f020 snprintf( name->machine, sizeof(name->machine), "%s/%s", CPU_NAME, CPU_MODEL_NAME ); 8002fe4: 78 03 08 01 mvhi r3,0x801 8002fe8: 78 04 08 01 mvhi r4,0x801 8002fec: 78 05 08 01 mvhi r5,0x801 8002ff0: 35 61 00 80 addi r1,r11,128 8002ff4: 34 02 00 20 mvi r2,32 8002ff8: 38 63 e1 b0 ori r3,r3,0xe1b0 8002ffc: 38 84 e1 b8 ori r4,r4,0xe1b8 8003000: 38 a5 e1 c0 ori r5,r5,0xe1c0 8003004: f8 00 2e a3 calli 800ea90 return 0; 8003008: 34 01 00 00 mvi r1,0 } 800300c: 2b 9d 00 04 lw ra,(sp+4) 8003010: 2b 8b 00 08 lw r11,(sp+8) 8003014: 37 9c 00 08 addi sp,sp,8 8003018: c3 a0 00 00 ret version = Generic_101318-12 machine = sun4m */ if ( !name ) rtems_set_errno_and_return_minus_one( EFAULT ); 800301c: f8 00 2b 17 calli 800dc78 <__errno> 8003020: 34 02 00 0e mvi r2,14 8003024: 58 22 00 00 sw (r1+0),r2 8003028: 34 01 ff ff mvi r1,-1 800302c: e3 ff ff f8 bi 800300c =============================================================================== 08003a88 : #include int unlink( const char *path ) { 8003a88: 37 9c ff bc addi sp,sp,-68 8003a8c: 5b 8b 00 18 sw (sp+24),r11 8003a90: 5b 8c 00 14 sw (sp+20),r12 8003a94: 5b 8d 00 10 sw (sp+16),r13 8003a98: 5b 8e 00 0c sw (sp+12),r14 8003a9c: 5b 8f 00 08 sw (sp+8),r15 8003aa0: 5b 9d 00 04 sw (sp+4),ra 8003aa4: b8 20 68 00 mv r13,r1 /* * Get the node to be unlinked. Find the parent path first. */ parentpathlen = rtems_filesystem_dirname ( path ); 8003aa8: fb ff fa f8 calli 8002688 if ( parentpathlen == 0 ) 8003aac: 5c 20 00 40 bne r1,r0,8003bac rtems_filesystem_get_start_loc( path, &i, &parentloc ); 8003ab0: 37 8c 00 30 addi r12,sp,48 8003ab4: b9 a0 08 00 mv r1,r13 8003ab8: 37 82 00 44 addi r2,sp,68 8003abc: b9 80 18 00 mv r3,r12 8003ac0: fb ff ff ba calli 80039a8 8003ac4: 34 0b 00 00 mvi r11,0 const char *name; rtems_filesystem_location_info_t parentloc; rtems_filesystem_location_info_t loc; int i; int result; bool free_parentloc = false; 8003ac8: 34 0f 00 00 mvi r15,0 /* * Start from the parent to find the node that should be under it. */ loc = parentloc; 8003acc: 2b 82 00 30 lw r2,(sp+48) name = path + parentpathlen; 8003ad0: b5 ab 58 00 add r11,r13,r11 name += rtems_filesystem_prefix_separators( name, strlen( name ) ); 8003ad4: b9 60 08 00 mv r1,r11 /* * Start from the parent to find the node that should be under it. */ loc = parentloc; 8003ad8: 5b 82 00 1c sw (sp+28),r2 8003adc: 2b 82 00 34 lw r2,(sp+52) 8003ae0: 5b 82 00 20 sw (sp+32),r2 8003ae4: 2b 82 00 38 lw r2,(sp+56) 8003ae8: 5b 82 00 24 sw (sp+36),r2 8003aec: 2b 82 00 3c lw r2,(sp+60) 8003af0: 5b 82 00 28 sw (sp+40),r2 8003af4: 2b 82 00 40 lw r2,(sp+64) 8003af8: 5b 82 00 2c sw (sp+44),r2 name = path + parentpathlen; name += rtems_filesystem_prefix_separators( name, strlen( name ) ); 8003afc: f8 00 3d 3d calli 8012ff0 8003b00: b8 20 10 00 mv r2,r1 8003b04: b9 60 08 00 mv r1,r11 8003b08: fb ff fa f5 calli 80026dc 8003b0c: b5 61 68 00 add r13,r11,r1 result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), 8003b10: b9 a0 08 00 mv r1,r13 8003b14: f8 00 3d 37 calli 8012ff0 8003b18: 37 8b 00 1c addi r11,sp,28 8003b1c: b8 20 10 00 mv r2,r1 8003b20: 34 03 00 00 mvi r3,0 8003b24: b9 a0 08 00 mv r1,r13 8003b28: b9 60 20 00 mv r4,r11 8003b2c: 34 05 00 00 mvi r5,0 8003b30: fb ff fa 98 calli 8002590 0, &loc, false ); if ( result != 0 ) { 8003b34: 5c 20 00 19 bne r1,r0,8003b98 if ( free_parentloc ) rtems_filesystem_freenode( &parentloc ); return -1; } if ( (*loc.ops->node_type_h)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) { 8003b38: 2b 82 00 28 lw r2,(sp+40) 8003b3c: b9 60 08 00 mv r1,r11 8003b40: 28 42 00 10 lw r2,(r2+16) 8003b44: d8 40 00 00 call r2 8003b48: 34 02 00 01 mvi r2,1 8003b4c: 44 22 00 24 be r1,r2,8003bdc if ( free_parentloc ) rtems_filesystem_freenode( &parentloc ); rtems_set_errno_and_return_minus_one( EISDIR ); } result = (*loc.ops->unlink_h)( &parentloc, &loc ); 8003b50: 2b 83 00 28 lw r3,(sp+40) 8003b54: b9 80 08 00 mv r1,r12 8003b58: b9 60 10 00 mv r2,r11 8003b5c: 28 63 00 0c lw r3,(r3+12) 8003b60: d8 60 00 00 call r3 8003b64: b8 20 70 00 mv r14,r1 rtems_filesystem_freenode( &loc ); 8003b68: b9 60 08 00 mv r1,r11 8003b6c: fb ff fa fa calli 8002754 if ( free_parentloc ) 8003b70: 5d e0 00 0c bne r15,r0,8003ba0 rtems_filesystem_freenode( &parentloc ); return result; } 8003b74: b9 c0 08 00 mv r1,r14 8003b78: 2b 9d 00 04 lw ra,(sp+4) 8003b7c: 2b 8b 00 18 lw r11,(sp+24) 8003b80: 2b 8c 00 14 lw r12,(sp+20) 8003b84: 2b 8d 00 10 lw r13,(sp+16) 8003b88: 2b 8e 00 0c lw r14,(sp+12) 8003b8c: 2b 8f 00 08 lw r15,(sp+8) 8003b90: 37 9c 00 44 addi sp,sp,68 8003b94: c3 a0 00 00 ret result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), 0, &loc, false ); if ( result != 0 ) { if ( free_parentloc ) rtems_filesystem_freenode( &parentloc ); return -1; 8003b98: 34 0e ff ff mvi r14,-1 name += rtems_filesystem_prefix_separators( name, strlen( name ) ); result = rtems_filesystem_evaluate_relative_path( name , strlen( name ), 0, &loc, false ); if ( result != 0 ) { if ( free_parentloc ) 8003b9c: 45 e0 ff f6 be r15,r0,8003b74 <== NEVER TAKEN result = (*loc.ops->unlink_h)( &parentloc, &loc ); rtems_filesystem_freenode( &loc ); if ( free_parentloc ) rtems_filesystem_freenode( &parentloc ); 8003ba0: b9 80 08 00 mv r1,r12 8003ba4: fb ff fa ec calli 8002754 8003ba8: e3 ff ff f3 bi 8003b74 parentpathlen = rtems_filesystem_dirname ( path ); if ( parentpathlen == 0 ) rtems_filesystem_get_start_loc( path, &i, &parentloc ); else { result = rtems_filesystem_evaluate_path( path, parentpathlen, 8003bac: b8 20 58 00 mv r11,r1 8003bb0: 37 8c 00 30 addi r12,sp,48 8003bb4: b9 a0 08 00 mv r1,r13 8003bb8: b9 60 10 00 mv r2,r11 8003bbc: 34 03 00 02 mvi r3,2 8003bc0: b9 80 20 00 mv r4,r12 8003bc4: 34 05 00 00 mvi r5,0 8003bc8: fb ff fa 95 calli 800261c RTEMS_LIBIO_PERMS_WRITE, &parentloc, false ); if ( result != 0 ) return -1; 8003bcc: 34 0e ff ff mvi r14,-1 else { result = rtems_filesystem_evaluate_path( path, parentpathlen, RTEMS_LIBIO_PERMS_WRITE, &parentloc, false ); if ( result != 0 ) 8003bd0: 5c 20 ff e9 bne r1,r0,8003b74 <== NEVER TAKEN return -1; free_parentloc = true; 8003bd4: 34 0f 00 01 mvi r15,1 8003bd8: e3 ff ff bd bi 8003acc rtems_filesystem_freenode( &parentloc ); return -1; } if ( (*loc.ops->node_type_h)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) { rtems_filesystem_freenode( &loc ); 8003bdc: b9 60 08 00 mv r1,r11 8003be0: fb ff fa dd calli 8002754 if ( free_parentloc ) 8003be4: 45 e0 00 03 be r15,r0,8003bf0 rtems_filesystem_freenode( &parentloc ); 8003be8: b9 80 08 00 mv r1,r12 8003bec: fb ff fa da calli 8002754 rtems_set_errno_and_return_minus_one( EISDIR ); 8003bf0: f8 00 38 9f calli 8011e6c <__errno> 8003bf4: 34 02 00 15 mvi r2,21 8003bf8: 58 22 00 00 sw (r1+0),r2 8003bfc: 34 0e ff ff mvi r14,-1 8003c00: e3 ff ff dd bi 8003b74 =============================================================================== 08003bb8 : */ int unmount( const char *path ) { 8003bb8: 37 9c ff dc addi sp,sp,-36 8003bbc: 5b 8b 00 10 sw (sp+16),r11 8003bc0: 5b 8c 00 0c sw (sp+12),r12 8003bc4: 5b 8d 00 08 sw (sp+8),r13 8003bc8: 5b 9d 00 04 sw (sp+4),ra 8003bcc: 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 ) ) 8003bd0: 37 8c 00 14 addi r12,sp,20 8003bd4: f8 00 2d cb calli 800f300 8003bd8: b8 20 10 00 mv r2,r1 8003bdc: 34 03 00 00 mvi r3,0 8003be0: b9 60 08 00 mv r1,r11 8003be4: b9 80 20 00 mv r4,r12 8003be8: 34 05 00 01 mvi r5,1 8003bec: fb ff f9 aa calli 8002294 8003bf0: 5c 20 00 23 bne r1,r0,8003c7c return -1; mt_entry = loc.mt_entry; 8003bf4: 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 ){ 8003bf8: 2b 81 00 14 lw r1,(sp+20) 8003bfc: 29 62 00 1c lw r2,(r11+28) 8003c00: 5c 41 00 27 bne r2,r1,8003c9c /* * Free the loc node and just use the nodes from the mt_entry . */ rtems_filesystem_freenode( &loc ); 8003c04: b9 80 08 00 mv r1,r12 8003c08: fb ff f9 f1 calli 80023cc * 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 ) 8003c0c: 78 01 08 01 mvhi r1,0x801 8003c10: 38 21 71 a4 ori r1,r1,0x71a4 8003c14: 28 21 00 00 lw r1,(r1+0) 8003c18: 28 21 00 14 lw r1,(r1+20) 8003c1c: 44 2b 00 2d be r1,r11,8003cd0 /* * Verify there are no file systems below the path specified */ if ( rtems_filesystem_mount_iterate( is_fs_below_mount_point, 8003c20: 29 62 00 2c lw r2,(r11+44) 8003c24: 78 01 08 00 mvhi r1,0x800 8003c28: 38 21 3b ac ori r1,r1,0x3bac 8003c2c: fb ff fc 99 calli 8002e90 8003c30: 5c 20 00 28 bne r1,r0,8003cd0 * 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 ) 8003c34: b9 60 08 00 mv r1,r11 8003c38: fb ff fb 05 calli 800284c 8003c3c: 34 02 00 01 mvi r2,1 8003c40: 44 22 00 24 be r1,r2,8003cd0 * 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 ) 8003c44: 29 62 00 14 lw r2,(r11+20) 8003c48: b9 60 08 00 mv r1,r11 return -1; 8003c4c: 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 ) 8003c50: 28 42 00 28 lw r2,(r2+40) 8003c54: d8 40 00 00 call r2 8003c58: b8 20 68 00 mv r13,r1 8003c5c: 44 20 00 28 be r1,r0,8003cfc <== ALWAYS TAKEN rtems_filesystem_freenode( fs_mount_loc ); free( mt_entry ); return 0; } 8003c60: b9 80 08 00 mv r1,r12 <== NOT EXECUTED 8003c64: 2b 9d 00 04 lw ra,(sp+4) <== NOT EXECUTED 8003c68: 2b 8b 00 10 lw r11,(sp+16) <== NOT EXECUTED 8003c6c: 2b 8c 00 0c lw r12,(sp+12) <== NOT EXECUTED 8003c70: 2b 8d 00 08 lw r13,(sp+8) <== NOT EXECUTED 8003c74: 37 9c 00 24 addi sp,sp,36 <== NOT EXECUTED 8003c78: c3 a0 00 00 ret <== NOT EXECUTED * 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; 8003c7c: 34 0c ff ff mvi r12,-1 rtems_filesystem_freenode( fs_mount_loc ); free( mt_entry ); return 0; } 8003c80: b9 80 08 00 mv r1,r12 8003c84: 2b 9d 00 04 lw ra,(sp+4) 8003c88: 2b 8b 00 10 lw r11,(sp+16) 8003c8c: 2b 8c 00 0c lw r12,(sp+12) 8003c90: 2b 8d 00 08 lw r13,(sp+8) 8003c94: 37 9c 00 24 addi sp,sp,36 8003c98: c3 a0 00 00 ret /* * Verify this is the root node for the file system to be unmounted. */ if ( fs_root_loc->node_access != loc.node_access ){ rtems_filesystem_freenode( &loc ); 8003c9c: b9 80 08 00 mv r1,r12 8003ca0: fb ff f9 cb calli 80023cc rtems_set_errno_and_return_minus_one( EACCES ); 8003ca4: f8 00 27 fa calli 800dc8c <__errno> 8003ca8: 34 02 00 0d mvi r2,13 8003cac: 34 0c ff ff mvi r12,-1 8003cb0: 58 22 00 00 sw (r1+0),r2 rtems_filesystem_freenode( fs_mount_loc ); free( mt_entry ); return 0; } 8003cb4: b9 80 08 00 mv r1,r12 8003cb8: 2b 9d 00 04 lw ra,(sp+4) 8003cbc: 2b 8b 00 10 lw r11,(sp+16) 8003cc0: 2b 8c 00 0c lw r12,(sp+12) 8003cc4: 2b 8d 00 08 lw r13,(sp+8) 8003cc8: 37 9c 00 24 addi sp,sp,36 8003ccc: c3 a0 00 00 ret * descriptors that are currently active and reference nodes in the * file system that we are trying to unmount */ if ( rtems_libio_is_open_files_in_fs( mt_entry ) == 1 ) rtems_set_errno_and_return_minus_one( EBUSY ); 8003cd0: f8 00 27 ef calli 800dc8c <__errno> 8003cd4: 34 02 00 10 mvi r2,16 8003cd8: 34 0c ff ff mvi r12,-1 8003cdc: 58 22 00 00 sw (r1+0),r2 rtems_filesystem_freenode( fs_mount_loc ); free( mt_entry ); return 0; } 8003ce0: b9 80 08 00 mv r1,r12 8003ce4: 2b 9d 00 04 lw ra,(sp+4) 8003ce8: 2b 8b 00 10 lw r11,(sp+16) 8003cec: 2b 8c 00 0c lw r12,(sp+12) 8003cf0: 2b 8d 00 08 lw r13,(sp+8) 8003cf4: 37 9c 00 24 addi sp,sp,36 8003cf8: c3 a0 00 00 ret * 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){ 8003cfc: 29 62 00 28 lw r2,(r11+40) 8003d00: b9 60 08 00 mv r1,r11 8003d04: 28 42 00 2c lw r2,(r2+44) 8003d08: d8 40 00 00 call r2 8003d0c: 5c 2d 00 17 bne r1,r13,8003d68 <== NEVER TAKEN rtems_status_code rtems_libio_set_private_env(void); rtems_status_code rtems_libio_share_private_env(rtems_id task_id) ; static inline void rtems_libio_lock( void ) { rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT ); 8003d10: 78 0c 08 01 mvhi r12,0x801 8003d14: 39 8c 78 80 ori r12,r12,0x7880 8003d18: 29 81 00 00 lw r1,(r12+0) 8003d1c: 34 02 00 00 mvi r2,0 8003d20: 34 03 00 00 mvi r3,0 8003d24: f8 00 01 c1 calli 8004428 */ RTEMS_INLINE_ROUTINE void rtems_chain_extract( rtems_chain_node *the_node ) { _Chain_Extract( the_node ); 8003d28: b9 60 08 00 mv r1,r11 8003d2c: f8 00 04 0a calli 8004d54 <_Chain_Extract> } static inline void rtems_libio_unlock( void ) { rtems_semaphore_release( rtems_libio_semaphore ); 8003d30: 29 81 00 00 lw r1,(r12+0) */ rtems_filesystem_freenode( fs_mount_loc ); free( mt_entry ); return 0; 8003d34: 34 0c 00 00 mvi r12,0 8003d38: f8 00 02 18 calli 8004598 /* * 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 ); 8003d3c: 35 61 00 08 addi r1,r11,8 8003d40: fb ff f9 a3 calli 80023cc free( mt_entry ); 8003d44: b9 60 08 00 mv r1,r11 8003d48: fb ff f9 a9 calli 80023ec return 0; } 8003d4c: b9 80 08 00 mv r1,r12 8003d50: 2b 9d 00 04 lw ra,(sp+4) 8003d54: 2b 8b 00 10 lw r11,(sp+16) 8003d58: 2b 8c 00 0c lw r12,(sp+12) 8003d5c: 2b 8d 00 08 lw r13,(sp+8) 8003d60: 37 9c 00 24 addi sp,sp,36 8003d64: c3 a0 00 00 ret * This was response was questionable but the best we could * come up with. */ if ((fs_root_loc->ops->fsunmount_me_h )( mt_entry ) != 0){ if (( fs_mount_loc->ops->mount_h )( mt_entry ) != 0 ) 8003d68: 29 62 00 14 lw r2,(r11+20) <== NOT EXECUTED 8003d6c: b9 60 08 00 mv r1,r11 <== NOT EXECUTED 8003d70: 28 42 00 20 lw r2,(r2+32) <== NOT EXECUTED 8003d74: d8 40 00 00 call r2 <== NOT EXECUTED 8003d78: 44 20 ff ba be r1,r0,8003c60 <== NOT EXECUTED rtems_fatal_error_occurred( 0 ); 8003d7c: 34 01 00 00 mvi r1,0 <== NOT EXECUTED 8003d80: f8 00 02 ed calli 8004934 <== NOT EXECUTED =============================================================================== 08002664 : */ void vprintk( const char *fmt, va_list ap ) { 8002664: 37 9c ff a4 addi sp,sp,-92 8002668: 5b 8b 00 44 sw (sp+68),r11 800266c: 5b 8c 00 40 sw (sp+64),r12 8002670: 5b 8d 00 3c sw (sp+60),r13 8002674: 5b 8e 00 38 sw (sp+56),r14 8002678: 5b 8f 00 34 sw (sp+52),r15 800267c: 5b 90 00 30 sw (sp+48),r16 8002680: 5b 91 00 2c sw (sp+44),r17 8002684: 5b 92 00 28 sw (sp+40),r18 8002688: 5b 93 00 24 sw (sp+36),r19 800268c: 5b 94 00 20 sw (sp+32),r20 8002690: 5b 95 00 1c sw (sp+28),r21 8002694: 5b 96 00 18 sw (sp+24),r22 8002698: 5b 97 00 14 sw (sp+20),r23 800269c: 5b 98 00 10 sw (sp+16),r24 80026a0: 5b 99 00 0c sw (sp+12),r25 80026a4: 5b 9b 00 08 sw (sp+8),fp 80026a8: 5b 9d 00 04 sw (sp+4),ra 80026ac: b8 20 58 00 mv r11,r1 for (; *fmt != '\0'; fmt++) { 80026b0: 40 21 00 00 lbu r1,(r1+0) */ void vprintk( const char *fmt, va_list ap ) { 80026b4: b8 40 b8 00 mv r23,r2 for (; *fmt != '\0'; fmt++) { 80026b8: 44 20 00 12 be r1,r0,8002700 <== NEVER TAKEN char *s, *str; str = va_arg(ap, char *); if ( str == NULL ) { str = ""; 80026bc: 78 02 08 01 mvhi r2,0x801 bool sign = false; char lead = ' '; char c; if (*fmt != '%') { BSP_output_char(*fmt); 80026c0: 78 0c 08 01 mvhi r12,0x801 80026c4: 78 13 08 01 mvhi r19,0x801 char *s, *str; str = va_arg(ap, char *); if ( str == NULL ) { str = ""; 80026c8: 38 42 34 3c ori r2,r2,0x343c bool minus = false; bool sign = false; char lead = ' '; char c; if (*fmt != '%') { 80026cc: 34 18 00 25 mvi r24,37 BSP_output_char(*fmt); 80026d0: 39 8c 41 0c ori r12,r12,0x410c } if (*fmt == '-' ) { minus = true; fmt++; } while (*fmt >= '0' && *fmt <= '9' ) { 80026d4: 34 15 00 09 mvi r21,9 width *= 10; width += ((unsigned) *fmt - '0'); fmt++; } if ((c = *fmt) == 'l') { 80026d8: 34 1b 00 6c mvi fp,108 lflag = true; c = *++fmt; } if ( c == 'c' ) { 80026dc: 34 19 00 63 mvi r25,99 80026e0: 3a 73 35 6c ori r19,r19,0x356c char *s, *str; str = va_arg(ap, char *); if ( str == NULL ) { str = ""; 80026e4: 5b 82 00 48 sw (sp+72),r2 bool minus = false; bool sign = false; char lead = ' '; char c; if (*fmt != '%') { 80026e8: 44 38 00 19 be r1,r24,800274c BSP_output_char(*fmt); 80026ec: 29 82 00 00 lw r2,(r12+0) 80026f0: d8 40 00 00 call r2 void vprintk( const char *fmt, va_list ap ) { for (; *fmt != '\0'; fmt++) { 80026f4: 35 6b 00 01 addi r11,r11,1 80026f8: 41 61 00 00 lbu r1,(r11+0) 80026fc: 5c 20 ff fb bne r1,r0,80026e8 sign, width, lead ); } } 8002700: 2b 9d 00 04 lw ra,(sp+4) 8002704: 2b 8b 00 44 lw r11,(sp+68) 8002708: 2b 8c 00 40 lw r12,(sp+64) 800270c: 2b 8d 00 3c lw r13,(sp+60) 8002710: 2b 8e 00 38 lw r14,(sp+56) 8002714: 2b 8f 00 34 lw r15,(sp+52) 8002718: 2b 90 00 30 lw r16,(sp+48) 800271c: 2b 91 00 2c lw r17,(sp+44) 8002720: 2b 92 00 28 lw r18,(sp+40) 8002724: 2b 93 00 24 lw r19,(sp+36) 8002728: 2b 94 00 20 lw r20,(sp+32) 800272c: 2b 95 00 1c lw r21,(sp+28) 8002730: 2b 96 00 18 lw r22,(sp+24) 8002734: 2b 97 00 14 lw r23,(sp+20) 8002738: 2b 98 00 10 lw r24,(sp+16) 800273c: 2b 99 00 0c lw r25,(sp+12) 8002740: 2b 9b 00 08 lw fp,(sp+8) 8002744: 37 9c 00 5c addi sp,sp,92 8002748: c3 a0 00 00 ret if (*fmt != '%') { BSP_output_char(*fmt); continue; } fmt++; 800274c: 35 6b 00 01 addi r11,r11,1 if (*fmt == '0' ) { 8002750: 41 64 00 00 lbu r4,(r11+0) 8002754: 34 01 00 30 mvi r1,48 unsigned base = 0; unsigned width = 0; bool lflag = false; bool minus = false; bool sign = false; char lead = ' '; 8002758: 34 16 00 20 mvi r22,32 if (*fmt != '%') { BSP_output_char(*fmt); continue; } fmt++; if (*fmt == '0' ) { 800275c: 44 81 00 69 be r4,r1,8002900 lead = '0'; fmt++; } if (*fmt == '-' ) { 8002760: 34 02 00 2d mvi r2,45 { for (; *fmt != '\0'; fmt++) { unsigned base = 0; unsigned width = 0; bool lflag = false; bool minus = false; 8002764: 34 11 00 00 mvi r17,0 fmt++; if (*fmt == '0' ) { lead = '0'; fmt++; } if (*fmt == '-' ) { 8002768: 44 82 00 62 be r4,r2,80028f0 minus = true; fmt++; } while (*fmt >= '0' && *fmt <= '9' ) { 800276c: 34 81 ff d0 addi r1,r4,-48 8002770: 20 21 00 ff andi r1,r1,0xff 8002774: 34 0e 00 00 mvi r14,0 8002778: 54 35 00 0c bgu r1,r21,80027a8 width *= 10; 800277c: b5 ce 70 00 add r14,r14,r14 8002780: b5 ce 18 00 add r3,r14,r14 8002784: b4 63 18 00 add r3,r3,r3 8002788: b5 c3 70 00 add r14,r14,r3 width += ((unsigned) *fmt - '0'); fmt++; 800278c: 35 6b 00 01 addi r11,r11,1 minus = true; fmt++; } while (*fmt >= '0' && *fmt <= '9' ) { width *= 10; width += ((unsigned) *fmt - '0'); 8002790: b5 c4 70 00 add r14,r14,r4 } if (*fmt == '-' ) { minus = true; fmt++; } while (*fmt >= '0' && *fmt <= '9' ) { 8002794: 41 64 00 00 lbu r4,(r11+0) width *= 10; width += ((unsigned) *fmt - '0'); 8002798: 35 ce ff d0 addi r14,r14,-48 } if (*fmt == '-' ) { minus = true; fmt++; } while (*fmt >= '0' && *fmt <= '9' ) { 800279c: 34 83 ff d0 addi r3,r4,-48 80027a0: 20 63 00 ff andi r3,r3,0xff 80027a4: 52 a3 ff f6 bgeu r21,r3,800277c width *= 10; width += ((unsigned) *fmt - '0'); fmt++; } if ((c = *fmt) == 'l') { 80027a8: 44 9b 00 4a be r4,fp,80028d0 lflag = true; c = *++fmt; } if ( c == 'c' ) { 80027ac: 44 99 00 4c be r4,r25,80028dc /* need a cast here since va_arg() only takes fully promoted types */ char chr = (char) va_arg(ap, int); BSP_output_char(chr); continue; } if ( c == 's' ) { 80027b0: 34 01 00 73 mvi r1,115 80027b4: 44 81 00 57 be r4,r1,8002910 continue; } /* must be a numeric format or something unsupported */ if ( c == 'o' || c == 'O' ) { 80027b8: 64 85 00 4f cmpei r5,r4,79 80027bc: 64 83 00 6f cmpei r3,r4,111 base = 8; sign = false; 80027c0: 34 01 00 00 mvi r1,0 continue; } /* must be a numeric format or something unsupported */ if ( c == 'o' || c == 'O' ) { 80027c4: b8 a3 18 00 or r3,r5,r3 base = 8; sign = false; 80027c8: 34 11 00 08 mvi r17,8 continue; } /* must be a numeric format or something unsupported */ if ( c == 'o' || c == 'O' ) { 80027cc: 5c 60 00 0b bne r3,r0,80027f8 base = 8; sign = false; } else if ( c == 'i' || c == 'I' || 80027d0: 64 86 00 49 cmpei r6,r4,73 80027d4: 64 85 00 69 cmpei r5,r4,105 c == 'd' || c == 'D' ) { base = 10; sign = true; 80027d8: 34 01 00 01 mvi r1,1 } /* must be a numeric format or something unsupported */ if ( c == 'o' || c == 'O' ) { base = 8; sign = false; } else if ( c == 'i' || c == 'I' || 80027dc: b8 c5 28 00 or r5,r6,r5 c == 'd' || c == 'D' ) { base = 10; sign = true; 80027e0: 34 11 00 0a mvi r17,10 } /* must be a numeric format or something unsupported */ if ( c == 'o' || c == 'O' ) { base = 8; sign = false; } else if ( c == 'i' || c == 'I' || 80027e4: 5c a3 00 05 bne r5,r3,80027f8 c == 'd' || c == 'D' ) { 80027e8: 64 86 00 44 cmpei r6,r4,68 80027ec: 64 83 00 64 cmpei r3,r4,100 80027f0: b8 c3 18 00 or r3,r6,r3 80027f4: 44 65 00 72 be r3,r5,80029bc } else { BSP_output_char(c); continue; } printNum( 80027f8: 2a f0 00 00 lw r16,(r23+0) lflag ? va_arg(ap, long) : (long) va_arg(ap, int), 80027fc: 36 f7 00 04 addi r23,r23,4 unsigned long unsigned_num; unsigned long n; unsigned count; char toPrint[20]; if ( sign && (num < 0) ) { 8002800: 44 20 00 08 be r1,r0,8002820 8002804: 4e 00 00 07 bge r16,r0,8002820 BSP_output_char('-'); 8002808: 29 82 00 00 lw r2,(r12+0) 800280c: 34 01 00 2d mvi r1,45 unsigned_num = (unsigned long) -num; 8002810: c8 10 80 00 sub r16,r0,r16 unsigned long n; unsigned count; char toPrint[20]; if ( sign && (num < 0) ) { BSP_output_char('-'); 8002814: d8 40 00 00 call r2 unsigned_num = (unsigned long) -num; if (maxwidth) maxwidth--; 8002818: 7d c1 00 00 cmpnei r1,r14,0 800281c: c9 c1 70 00 sub r14,r14,r1 } else { unsigned_num = (unsigned long) num; } count = 0; while ((n = unsigned_num / base) > 0) { 8002820: ba 00 08 00 mv r1,r16 8002824: ba 20 10 00 mv r2,r17 8002828: f8 00 3f 33 calli 80124f4 <__udivsi3> 800282c: b8 20 68 00 mv r13,r1 8002830: 22 34 00 ff andi r20,r17,0xff if (maxwidth) maxwidth--; } else { unsigned_num = (unsigned long) num; } count = 0; 8002834: 34 0f 00 00 mvi r15,0 8002838: 37 92 00 4c addi r18,sp,76 while ((n = unsigned_num / base) > 0) { 800283c: 5c 20 00 04 bne r1,r0,800284c 8002840: e0 00 00 72 bi 8002a08 8002844: b9 a0 80 00 mv r16,r13 8002848: b8 20 68 00 mv r13,r1 toPrint[count++] = (char) (unsigned_num - (n * base)); 800284c: b9 a0 10 00 mv r2,r13 8002850: ba 80 08 00 mv r1,r20 8002854: f8 00 3e c3 calli 8012360 <__mulsi3> * console is not yet initialized or in ISR's. * * Arguments: * as in printf: fmt - format string, ... - unnamed arguments. */ void vprintk( 8002858: b6 4f 18 00 add r3,r18,r15 unsigned_num = (unsigned long) num; } count = 0; while ((n = unsigned_num / base) > 0) { toPrint[count++] = (char) (unsigned_num - (n * base)); 800285c: ca 01 80 00 sub r16,r16,r1 8002860: 30 70 00 00 sb (r3+0),r16 } else { unsigned_num = (unsigned long) num; } count = 0; while ((n = unsigned_num / base) > 0) { 8002864: b9 a0 08 00 mv r1,r13 8002868: ba 20 10 00 mv r2,r17 800286c: f8 00 3f 22 calli 80124f4 <__udivsi3> toPrint[count++] = (char) (unsigned_num - (n * base)); 8002870: 35 ef 00 01 addi r15,r15,1 } else { unsigned_num = (unsigned long) num; } count = 0; while ((n = unsigned_num / base) > 0) { 8002874: 5c 20 ff f4 bne r1,r0,8002844 8002878: 35 f0 00 01 addi r16,r15,1 toPrint[count++] = (char) (unsigned_num - (n * base)); unsigned_num = n; } toPrint[count++] = (char) unsigned_num; 800287c: b6 4f 78 00 add r15,r18,r15 8002880: 31 ed 00 00 sb (r15+0),r13 for (n=maxwidth ; n > count; n-- ) 8002884: 52 0e 00 06 bgeu r16,r14,800289c BSP_output_char(lead); 8002888: 29 82 00 00 lw r2,(r12+0) toPrint[count++] = (char) (unsigned_num - (n * base)); unsigned_num = n; } toPrint[count++] = (char) unsigned_num; for (n=maxwidth ; n > count; n-- ) 800288c: 35 ce ff ff addi r14,r14,-1 BSP_output_char(lead); 8002890: ba c0 08 00 mv r1,r22 8002894: d8 40 00 00 call r2 toPrint[count++] = (char) (unsigned_num - (n * base)); unsigned_num = n; } toPrint[count++] = (char) unsigned_num; for (n=maxwidth ; n > count; n-- ) 8002898: 55 d0 ff fc bgu r14,r16,8002888 BSP_output_char(lead); for (n = 0; n < count; n++) { 800289c: 46 00 ff 96 be r16,r0,80026f4 <== NEVER TAKEN BSP_output_char("0123456789ABCDEF"[(int)(toPrint[count-(n+1)])]); 80028a0: 36 0e ff ff addi r14,r16,-1 * console is not yet initialized or in ISR's. * * Arguments: * as in printf: fmt - format string, ... - unnamed arguments. */ void vprintk( 80028a4: b6 4e 70 00 add r14,r18,r14 80028a8: 34 0d 00 00 mvi r13,0 for (n=maxwidth ; n > count; n-- ) BSP_output_char(lead); for (n = 0; n < count; n++) { BSP_output_char("0123456789ABCDEF"[(int)(toPrint[count-(n+1)])]); 80028ac: 41 c1 00 00 lbu r1,(r14+0) 80028b0: 29 83 00 00 lw r3,(r12+0) toPrint[count++] = (char) unsigned_num; for (n=maxwidth ; n > count; n-- ) BSP_output_char(lead); for (n = 0; n < count; n++) { 80028b4: 35 ad 00 01 addi r13,r13,1 BSP_output_char("0123456789ABCDEF"[(int)(toPrint[count-(n+1)])]); 80028b8: b6 61 08 00 add r1,r19,r1 80028bc: 40 21 00 00 lbu r1,(r1+0) toPrint[count++] = (char) unsigned_num; for (n=maxwidth ; n > count; n-- ) BSP_output_char(lead); for (n = 0; n < count; n++) { 80028c0: 35 ce ff ff addi r14,r14,-1 BSP_output_char("0123456789ABCDEF"[(int)(toPrint[count-(n+1)])]); 80028c4: d8 60 00 00 call r3 toPrint[count++] = (char) unsigned_num; for (n=maxwidth ; n > count; n-- ) BSP_output_char(lead); for (n = 0; n < count; n++) { 80028c8: 56 0d ff f9 bgu r16,r13,80028ac 80028cc: e3 ff ff 8a bi 80026f4 fmt++; } if ((c = *fmt) == 'l') { lflag = true; c = *++fmt; 80028d0: 35 6b 00 01 addi r11,r11,1 80028d4: 41 64 00 00 lbu r4,(r11+0) } if ( c == 'c' ) { 80028d8: 5c 99 ff b6 bne r4,r25,80027b0 <== ALWAYS TAKEN /* need a cast here since va_arg() only takes fully promoted types */ char chr = (char) va_arg(ap, int); BSP_output_char(chr); 80028dc: 42 e1 00 03 lbu r1,(r23+3) 80028e0: 29 82 00 00 lw r2,(r12+0) lflag = true; c = *++fmt; } if ( c == 'c' ) { /* need a cast here since va_arg() only takes fully promoted types */ char chr = (char) va_arg(ap, int); 80028e4: 36 f7 00 04 addi r23,r23,4 BSP_output_char(chr); 80028e8: d8 40 00 00 call r2 continue; 80028ec: e3 ff ff 82 bi 80026f4 lead = '0'; fmt++; } if (*fmt == '-' ) { minus = true; fmt++; 80028f0: 35 6b 00 01 addi r11,r11,1 80028f4: 41 64 00 00 lbu r4,(r11+0) if (*fmt == '0' ) { lead = '0'; fmt++; } if (*fmt == '-' ) { minus = true; 80028f8: 34 11 00 01 mvi r17,1 80028fc: e3 ff ff 9c bi 800276c continue; } fmt++; if (*fmt == '0' ) { lead = '0'; fmt++; 8002900: 35 6b 00 01 addi r11,r11,1 8002904: 41 64 00 00 lbu r4,(r11+0) BSP_output_char(*fmt); continue; } fmt++; if (*fmt == '0' ) { lead = '0'; 8002908: 34 16 00 30 mvi r22,48 800290c: e3 ff ff 95 bi 8002760 } if ( c == 's' ) { unsigned i, len; char *s, *str; str = va_arg(ap, char *); 8002910: 2a ef 00 00 lw r15,(r23+0) 8002914: 36 f2 00 04 addi r18,r23,4 if ( str == NULL ) { 8002918: 45 e0 00 3a be r15,r0,8002a00 str = ""; } /* calculate length of string */ for ( len=0, s=str ; *s ; len++, s++ ) 800291c: 41 e1 00 00 lbu r1,(r15+0) 8002920: 34 0d 00 00 mvi r13,0 8002924: 44 20 00 05 be r1,r0,8002938 8002928: 35 ad 00 01 addi r13,r13,1 * console is not yet initialized or in ISR's. * * Arguments: * as in printf: fmt - format string, ... - unnamed arguments. */ void vprintk( 800292c: b5 ed 08 00 add r1,r15,r13 if ( str == NULL ) { str = ""; } /* calculate length of string */ for ( len=0, s=str ; *s ; len++, s++ ) 8002930: 40 21 00 00 lbu r1,(r1+0) 8002934: 5c 20 ff fd bne r1,r0,8002928 ; /* leading spaces */ if ( !minus ) 8002938: 5e 20 00 08 bne r17,r0,8002958 for ( i=len ; i 8002940: b9 a0 80 00 mv r16,r13 BSP_output_char(' '); 8002944: 29 82 00 00 lw r2,(r12+0) for ( len=0, s=str ; *s ; len++, s++ ) ; /* leading spaces */ if ( !minus ) for ( i=len ; i BSP_output_char(' '); /* no width option */ if (width == 0) { 8002958: 5d c0 00 03 bne r14,r0,8002964 width = len; } /* output the string */ for ( i=0 ; i 8002960: b9 a0 70 00 mv r14,r13 8002964: 41 e1 00 00 lbu r1,(r15+0) 8002968: 44 20 00 0b be r1,r0,8002994 <== NEVER TAKEN BSP_output_char(*str); 800296c: 29 82 00 00 lw r2,(r12+0) if (width == 0) { width = len; } /* output the string */ for ( i=0 ; i 800297c: 29 82 00 00 lw r2,(r12+0) 8002980: d8 40 00 00 call r2 if (width == 0) { width = len; } /* output the string */ for ( i=0 ; i } if ( c == 's' ) { unsigned i, len; char *s, *str; str = va_arg(ap, char *); 8002994: ba 40 b8 00 mv r23,r18 /* output the string */ for ( i=0 ; i for ( i=len ; i BSP_output_char(' '); 80029a0: 29 82 00 00 lw r2,(r12+0) for ( i=0 ; i } if ( c == 's' ) { unsigned i, len; char *s, *str; str = va_arg(ap, char *); 80029b4: ba 40 b8 00 mv r23,r18 80029b8: e3 ff ff 4f bi 80026f4 if ( c == 'o' || c == 'O' ) { base = 8; sign = false; } else if ( c == 'i' || c == 'I' || c == 'd' || c == 'D' ) { base = 10; sign = true; } else if ( c == 'u' || c == 'U' ) { 80029bc: 64 86 00 55 cmpei r6,r4,85 80029c0: 64 85 00 75 cmpei r5,r4,117 base = 10; sign = false; 80029c4: 34 01 00 00 mvi r1,0 if ( c == 'o' || c == 'O' ) { base = 8; sign = false; } else if ( c == 'i' || c == 'I' || c == 'd' || c == 'D' ) { base = 10; sign = true; } else if ( c == 'u' || c == 'U' ) { 80029c8: b8 c5 28 00 or r5,r6,r5 80029cc: 5c a3 ff 8b bne r5,r3,80027f8 base = 10; sign = false; } else if ( c == 'x' || c == 'X' ) { 80029d0: 64 86 00 58 cmpei r6,r4,88 80029d4: 64 83 00 78 cmpei r3,r4,120 base = 16; sign = false; 80029d8: b8 a0 08 00 mv r1,r5 } else if ( c == 'i' || c == 'I' || c == 'd' || c == 'D' ) { base = 10; sign = true; } else if ( c == 'u' || c == 'U' ) { base = 10; sign = false; } else if ( c == 'x' || c == 'X' ) { 80029dc: b8 c3 18 00 or r3,r6,r3 base = 16; sign = false; 80029e0: 34 11 00 10 mvi r17,16 } else if ( c == 'i' || c == 'I' || c == 'd' || c == 'D' ) { base = 10; sign = true; } else if ( c == 'u' || c == 'U' ) { base = 10; sign = false; } else if ( c == 'x' || c == 'X' ) { 80029e4: 5c 65 ff 85 bne r3,r5,80027f8 base = 16; sign = false; } else if ( c == 'p' ) { 80029e8: 34 02 00 70 mvi r2,112 80029ec: 44 82 ff 83 be r4,r2,80027f8 base = 16; sign = false; lflag = true; } else { BSP_output_char(c); 80029f0: 29 82 00 00 lw r2,(r12+0) 80029f4: b8 80 08 00 mv r1,r4 80029f8: d8 40 00 00 call r2 continue; 80029fc: e3 ff ff 3e bi 80026f4 char *s, *str; str = va_arg(ap, char *); if ( str == NULL ) { str = ""; 8002a00: 2b 8f 00 48 lw r15,(sp+72) 8002a04: e3 ff ff c6 bi 800291c } else { unsigned_num = (unsigned long) num; } count = 0; while ((n = unsigned_num / base) > 0) { 8002a08: ba 00 68 00 mv r13,r16 if (maxwidth) maxwidth--; } else { unsigned_num = (unsigned long) num; } count = 0; 8002a0c: 34 0f 00 00 mvi r15,0 while ((n = unsigned_num / base) > 0) { 8002a10: 34 10 00 01 mvi r16,1 8002a14: 37 92 00 4c addi r18,sp,76 8002a18: e3 ff ff 99 bi 800287c =============================================================================== 08012c54 : ssize_t write( int fd, const void *buffer, size_t count ) { 8012c54: 37 9c ff f4 addi sp,sp,-12 8012c58: 5b 8b 00 0c sw (sp+12),r11 8012c5c: 5b 8c 00 08 sw (sp+8),r12 8012c60: 5b 9d 00 04 sw (sp+4),ra ssize_t rc; rtems_libio_t *iop; rtems_libio_check_fd( fd ); 8012c64: 78 04 08 01 mvhi r4,0x801 8012c68: 38 84 40 10 ori r4,r4,0x4010 8012c6c: 28 84 00 00 lw r4,(r4+0) 8012c70: 54 81 00 06 bgu r4,r1,8012c88 iop = rtems_libio_iop( fd ); rtems_libio_check_is_open( iop ); 8012c74: fb ff e8 58 calli 800cdd4 <__errno> 8012c78: 34 02 00 09 mvi r2,9 8012c7c: 58 22 00 00 sw (r1+0),r2 8012c80: 34 0c ff ff mvi r12,-1 8012c84: e0 00 00 23 bi 8012d10 { ssize_t rc; rtems_libio_t *iop; rtems_libio_check_fd( fd ); iop = rtems_libio_iop( fd ); 8012c88: b4 21 08 00 add r1,r1,r1 8012c8c: 78 04 08 01 mvhi r4,0x801 8012c90: b4 21 08 00 add r1,r1,r1 8012c94: 38 84 47 6c ori r4,r4,0x476c 8012c98: b4 21 08 00 add r1,r1,r1 8012c9c: 28 8b 00 00 lw r11,(r4+0) 8012ca0: b4 21 08 00 add r1,r1,r1 8012ca4: b4 21 08 00 add r1,r1,r1 8012ca8: b4 21 08 00 add r1,r1,r1 8012cac: b5 61 58 00 add r11,r11,r1 rtems_libio_check_is_open( iop ); 8012cb0: 29 61 00 18 lw r1,(r11+24) 8012cb4: 20 24 01 00 andi r4,r1,0x100 8012cb8: 44 80 ff ef be r4,r0,8012c74 rtems_libio_check_buffer( buffer ); 8012cbc: 44 40 00 1b be r2,r0,8012d28 <== NEVER TAKEN rtems_libio_check_count( count ); 8012cc0: 34 0c 00 00 mvi r12,0 8012cc4: 44 60 00 13 be r3,r0,8012d10 rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE ); 8012cc8: 20 21 00 04 andi r1,r1,0x4 8012ccc: 44 20 00 17 be r1,r0,8012d28 /* * Now process the write() request. */ rc = (*iop->pathinfo.handlers->write_h)( iop, buffer, count ); 8012cd0: 29 64 00 24 lw r4,(r11+36) 8012cd4: b9 60 08 00 mv r1,r11 8012cd8: 28 84 00 0c lw r4,(r4+12) 8012cdc: d8 80 00 00 call r4 8012ce0: b8 20 60 00 mv r12,r1 if ( rc > 0 ) 8012ce4: 4c 01 00 0b bge r0,r1,8012d10 iop->offset += rc; 8012ce8: 34 02 00 1f mvi r2,31 8012cec: fb ff fd 4f calli 8012228 <__ashrsi3> 8012cf0: 29 62 00 14 lw r2,(r11+20) 8012cf4: 29 64 00 10 lw r4,(r11+16) 8012cf8: b5 82 10 00 add r2,r12,r2 8012cfc: f5 82 18 00 cmpgu r3,r12,r2 8012d00: b4 24 08 00 add r1,r1,r4 8012d04: b4 61 08 00 add r1,r3,r1 8012d08: 59 61 00 10 sw (r11+16),r1 8012d0c: 59 62 00 14 sw (r11+20),r2 return rc; } 8012d10: b9 80 08 00 mv r1,r12 8012d14: 2b 9d 00 04 lw ra,(sp+4) 8012d18: 2b 8b 00 0c lw r11,(sp+12) 8012d1c: 2b 8c 00 08 lw r12,(sp+8) 8012d20: 37 9c 00 0c addi sp,sp,12 8012d24: c3 a0 00 00 ret rtems_libio_check_fd( fd ); iop = rtems_libio_iop( fd ); rtems_libio_check_is_open( iop ); rtems_libio_check_buffer( buffer ); rtems_libio_check_count( count ); rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE ); 8012d28: fb ff e8 2b calli 800cdd4 <__errno> 8012d2c: 34 02 00 16 mvi r2,22 8012d30: 58 22 00 00 sw (r1+0),r2 8012d34: 34 0c ff ff mvi r12,-1 8012d38: e3 ff ff f6 bi 8012d10 =============================================================================== 08004114 : ssize_t writev( int fd, const struct iovec *iov, int iovcnt ) { 8004114: 37 9c ff e4 addi sp,sp,-28 8004118: 5b 8b 00 1c sw (sp+28),r11 800411c: 5b 8c 00 18 sw (sp+24),r12 8004120: 5b 8d 00 14 sw (sp+20),r13 8004124: 5b 8e 00 10 sw (sp+16),r14 8004128: 5b 8f 00 0c sw (sp+12),r15 800412c: 5b 90 00 08 sw (sp+8),r16 8004130: 5b 9d 00 04 sw (sp+4),ra int bytes; rtems_libio_t *iop; ssize_t old; bool all_zeros; rtems_libio_check_fd( fd ); 8004134: 78 04 08 01 mvhi r4,0x801 8004138: 38 84 60 10 ori r4,r4,0x6010 800413c: 28 84 00 00 lw r4,(r4+0) ssize_t writev( int fd, const struct iovec *iov, int iovcnt ) { 8004140: b8 60 60 00 mv r12,r3 int bytes; rtems_libio_t *iop; ssize_t old; bool all_zeros; rtems_libio_check_fd( fd ); 8004144: 54 81 00 0f bgu r4,r1,8004180 iop = rtems_libio_iop( fd ); rtems_libio_check_is_open( iop ); 8004148: f8 00 27 9b calli 800dfb4 <__errno> 800414c: 34 02 00 09 mvi r2,9 8004150: 58 22 00 00 sw (r1+0),r2 8004154: 34 0e ff ff mvi r14,-1 if (bytes != iov[ v ].iov_len) break; } return total; } 8004158: b9 c0 08 00 mv r1,r14 800415c: 2b 9d 00 04 lw ra,(sp+4) 8004160: 2b 8b 00 1c lw r11,(sp+28) 8004164: 2b 8c 00 18 lw r12,(sp+24) 8004168: 2b 8d 00 14 lw r13,(sp+20) 800416c: 2b 8e 00 10 lw r14,(sp+16) 8004170: 2b 8f 00 0c lw r15,(sp+12) 8004174: 2b 90 00 08 lw r16,(sp+8) 8004178: 37 9c 00 1c addi sp,sp,28 800417c: c3 a0 00 00 ret rtems_libio_t *iop; ssize_t old; bool all_zeros; rtems_libio_check_fd( fd ); iop = rtems_libio_iop( fd ); 8004180: b4 21 08 00 add r1,r1,r1 8004184: 78 03 08 01 mvhi r3,0x801 8004188: b4 21 08 00 add r1,r1,r1 800418c: 38 63 67 6c ori r3,r3,0x676c 8004190: b4 21 08 00 add r1,r1,r1 8004194: 28 6f 00 00 lw r15,(r3+0) 8004198: b4 21 08 00 add r1,r1,r1 800419c: b4 21 08 00 add r1,r1,r1 80041a0: b4 21 08 00 add r1,r1,r1 80041a4: b5 e1 78 00 add r15,r15,r1 rtems_libio_check_is_open( iop ); 80041a8: 29 e1 00 18 lw r1,(r15+24) 80041ac: 20 23 01 00 andi r3,r1,0x100 80041b0: 44 60 ff e6 be r3,r0,8004148 rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE ); 80041b4: 20 21 00 04 andi r1,r1,0x4 80041b8: 44 20 00 03 be r1,r0,80041c4 <== NEVER TAKEN /* * Argument validation on IO vector */ if ( !iov ) 80041bc: 44 40 00 02 be r2,r0,80041c4 rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt <= 0 ) 80041c0: 49 80 00 06 bg r12,r0,80041d8 /* check for wrap */ old = total; total += iov[v].iov_len; if ( total < old || total > SSIZE_MAX ) rtems_set_errno_and_return_minus_one( EINVAL ); 80041c4: f8 00 27 7c calli 800dfb4 <__errno> 80041c8: 34 02 00 16 mvi r2,22 80041cc: 58 22 00 00 sw (r1+0),r2 80041d0: 34 0e ff ff mvi r14,-1 80041d4: e3 ff ff e1 bi 8004158 rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt <= 0 ) rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt > IOV_MAX ) 80041d8: 34 01 04 00 mvi r1,1024 80041dc: 4c 2c 00 02 bge r1,r12,80041e4 <== ALWAYS TAKEN 80041e0: e3 ff ff f9 bi 80041c4 rtems_set_errno_and_return_minus_one( EINVAL ); 80041e4: b8 40 58 00 mv r11,r2 rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt <= 0 ) rtems_set_errno_and_return_minus_one( EINVAL ); if ( iovcnt > IOV_MAX ) 80041e8: b8 40 20 00 mv r4,r2 80041ec: 34 08 00 01 mvi r8,1 80041f0: 34 06 00 00 mvi r6,0 80041f4: 34 07 00 00 mvi r7,0 /* * 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 ) 80041f8: 28 82 00 00 lw r2,(r4+0) * 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++ ) { 80041fc: 34 c6 00 01 addi r6,r6,1 /* * 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 ) 8004200: 44 40 ff f1 be r2,r0,80041c4 rtems_set_errno_and_return_minus_one( EINVAL ); if ( iov[v].iov_len ) 8004204: 28 82 00 04 lw r2,(r4+4) * 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++ ) { 8004208: 34 84 00 08 addi r4,r4,8 if ( iov[v].iov_len ) all_zeros = false; /* check for wrap */ old = total; total += iov[v].iov_len; 800420c: b4 e2 28 00 add r5,r7,r2 if ( total < old || total > SSIZE_MAX ) 8004210: e8 e5 38 00 cmpg r7,r7,r5 */ if ( iov[v].iov_base == 0 ) rtems_set_errno_and_return_minus_one( EINVAL ); if ( iov[v].iov_len ) all_zeros = false; 8004214: 64 42 00 00 cmpei r2,r2,0 /* check for wrap */ old = total; total += iov[v].iov_len; if ( total < old || total > SSIZE_MAX ) 8004218: 68 a3 7f ff cmpgi r3,r5,32767 */ if ( iov[v].iov_base == 0 ) rtems_set_errno_and_return_minus_one( EINVAL ); if ( iov[v].iov_len ) all_zeros = false; 800421c: c8 02 10 00 sub r2,r0,r2 /* check for wrap */ old = total; total += iov[v].iov_len; if ( total < old || total > SSIZE_MAX ) 8004220: b8 67 38 00 or r7,r3,r7 */ if ( iov[v].iov_base == 0 ) rtems_set_errno_and_return_minus_one( EINVAL ); if ( iov[v].iov_len ) all_zeros = false; 8004224: a1 02 40 00 and r8,r8,r2 /* check for wrap */ old = total; total += iov[v].iov_len; if ( total < old || total > SSIZE_MAX ) 8004228: 5c e0 ff e7 bne r7,r0,80041c4 * 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++ ) { 800422c: 49 86 00 0a bg r12,r6,8004254 /* * A writev with all zeros is supposed to have no effect per OpenGroup. */ if ( all_zeros == true ) { return 0; 8004230: 34 0e 00 00 mvi r14,0 } /* * A writev with all zeros is supposed to have no effect per OpenGroup. */ if ( all_zeros == true ) { 8004234: 5d 00 ff c9 bne r8,r0,8004158 8004238: 34 0d 00 00 mvi r13,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 ) 800423c: 29 63 00 04 lw r3,(r11+4) } /* * Now process the writev(). */ for ( total=0, v=0 ; v < iovcnt ; v++ ) { 8004240: 35 ad 00 01 addi r13,r13,1 /* all zero lengths has no effect */ if ( iov[v].iov_len == 0 ) 8004244: 5c 60 00 06 bne r3,r0,800425c <== ALWAYS TAKEN } /* * Now process the writev(). */ for ( total=0, v=0 ; v < iovcnt ; v++ ) { 8004248: 35 6b 00 08 addi r11,r11,8 800424c: 49 8d ff fc bg r12,r13,800423c 8004250: e3 ff ff c2 bi 8004158 if ( iov[v].iov_len ) all_zeros = false; /* check for wrap */ old = total; total += iov[v].iov_len; 8004254: b8 a0 38 00 mv r7,r5 8004258: e3 ff ff e8 bi 80041f8 for ( total=0, v=0 ; v < iovcnt ; v++ ) { /* all zero lengths has no effect */ if ( iov[v].iov_len == 0 ) continue; bytes = (*iop->pathinfo.handlers->write_h)( 800425c: 29 e1 00 24 lw r1,(r15+36) 8004260: 29 62 00 00 lw r2,(r11+0) 8004264: 28 24 00 0c lw r4,(r1+12) 8004268: b9 e0 08 00 mv r1,r15 800426c: d8 80 00 00 call r4 8004270: b8 20 80 00 mv r16,r1 if ( bytes < 0 ) return -1; if ( bytes > 0 ) { iop->offset += bytes; 8004274: 34 02 00 1f mvi r2,31 iop, iov[v].iov_base, iov[v].iov_len ); if ( bytes < 0 ) 8004278: 48 01 00 0f bg r0,r1,80042b4 <== NEVER TAKEN return -1; if ( bytes > 0 ) { 800427c: 44 20 00 0b be r1,r0,80042a8 <== NEVER TAKEN iop->offset += bytes; 8004280: f8 00 3d 11 calli 80136c4 <__ashrsi3> 8004284: 29 e2 00 14 lw r2,(r15+20) 8004288: 29 e4 00 10 lw r4,(r15+16) total += bytes; 800428c: b5 d0 70 00 add r14,r14,r16 if ( bytes < 0 ) return -1; if ( bytes > 0 ) { iop->offset += bytes; 8004290: b6 02 10 00 add r2,r16,r2 8004294: f6 02 18 00 cmpgu r3,r16,r2 8004298: b4 24 08 00 add r1,r1,r4 800429c: b4 61 08 00 add r1,r3,r1 80042a0: 59 e1 00 10 sw (r15+16),r1 80042a4: 59 e2 00 14 sw (r15+20),r2 total += bytes; } if (bytes != iov[ v ].iov_len) 80042a8: 29 61 00 04 lw r1,(r11+4) 80042ac: 46 01 ff e7 be r16,r1,8004248 <== ALWAYS TAKEN 80042b0: e3 ff ff aa bi 8004158 iov[v].iov_base, iov[v].iov_len ); if ( bytes < 0 ) return -1; 80042b4: 34 0e ff ff mvi r14,-1 <== NOT EXECUTED 80042b8: e3 ff ff a8 bi 8004158 <== NOT EXECUTED