40015d60 : int IMFS_chown( rtems_filesystem_location_info_t *pathloc, /* IN */ uid_t owner, /* IN */ gid_t group /* IN */ ) { 40015d60: 9d e3 bf 90 save %sp, -112, %sp /* * Verify I am the owner of the node or the super user. */ #if defined(RTEMS_POSIX_API) st_uid = geteuid(); 40015d64: 40 00 06 78 call 40017744 40015d68: f0 06 00 00 ld [ %i0 ], %i0 if ( ( st_uid != jnode->st_uid ) && ( st_uid != 0 ) ) 40015d6c: c2 16 20 38 lduh [ %i0 + 0x38 ], %g1 40015d70: 91 2a 20 10 sll %o0, 0x10, %o0 40015d74: 91 32 20 10 srl %o0, 0x10, %o0 40015d78: 80 a2 00 01 cmp %o0, %g1 40015d7c: 02 80 00 0a be 40015da4 40015d80: 80 a2 20 00 cmp %o0, 0 40015d84: 22 80 00 09 be,a 40015da8 <== NOT EXECUTED 40015d88: f2 36 20 38 sth %i1, [ %i0 + 0x38 ] <== NOT EXECUTED rtems_set_errno_and_return_minus_one( EPERM ); 40015d8c: 40 00 37 00 call 4002398c <__errno> <== NOT EXECUTED 40015d90: 01 00 00 00 nop <== NOT EXECUTED 40015d94: 82 10 20 01 mov 1, %g1 ! 1 <== NOT EXECUTED 40015d98: 84 10 3f ff mov -1, %g2 <== NOT EXECUTED 40015d9c: 10 80 00 0a b 40015dc4 <== NOT EXECUTED 40015da0: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED #endif jnode->st_uid = owner; 40015da4: f2 36 20 38 sth %i1, [ %i0 + 0x38 ] jnode->st_gid = group; 40015da8: f4 36 20 3a sth %i2, [ %i0 + 0x3a ] IMFS_update_ctime( jnode ); 40015dac: 90 07 bf f0 add %fp, -16, %o0 40015db0: 7f ff bf ac call 40005c60 40015db4: 92 10 20 00 clr %o1 40015db8: c2 07 bf f0 ld [ %fp + -16 ], %g1 40015dbc: 84 10 20 00 clr %g2 40015dc0: c2 26 20 44 st %g1, [ %i0 + 0x44 ] return 0; } 40015dc4: 81 c7 e0 08 ret 40015dc8: 91 e8 00 02 restore %g0, %g2, %o0 4000e378 : IMFS_jnode_types_t type, char *name, mode_t mode, IMFS_types_union *info ) { 4000e378: 9d e3 bf 90 save %sp, -112, %sp struct timeval tv; IMFS_jnode_t *parent = NULL; IMFS_fs_info_t *fs_info; char *sym_name; if ( parent_loc != NULL ) 4000e37c: a6 96 20 00 orcc %i0, 0, %l3 4000e380: 02 80 00 03 be 4000e38c 4000e384: a4 10 20 00 clr %l2 parent = parent_loc->node_access; 4000e388: e4 04 c0 00 ld [ %l3 ], %l2 /* * Allocate an IMFS jnode */ node = calloc( 1, sizeof( IMFS_jnode_t ) ); 4000e38c: 90 10 20 01 mov 1, %o0 4000e390: 92 10 20 5c mov 0x5c, %o1 4000e394: 7f ff d3 ec call 40003344 4000e398: b0 10 20 00 clr %i0 if ( !node ) 4000e39c: a2 92 20 00 orcc %o0, 0, %l1 4000e3a0: 02 80 00 53 be 4000e4ec 4000e3a4: 82 10 20 01 mov 1, %g1 * Fill in the basic information */ node->st_nlink = 1; node->type = type; strncpy( node->name, name, IMFS_NAME_MAX ); 4000e3a8: 92 10 00 1a mov %i2, %o1 4000e3ac: 94 10 20 20 mov 0x20, %o2 /* * Fill in the basic information */ node->st_nlink = 1; node->type = type; 4000e3b0: f2 24 60 48 st %i1, [ %l1 + 0x48 ] /* * Fill in the basic information */ node->st_nlink = 1; 4000e3b4: c2 34 60 30 sth %g1, [ %l1 + 0x30 ] node->type = type; strncpy( node->name, name, IMFS_NAME_MAX ); 4000e3b8: 40 00 08 49 call 400104dc 4000e3bc: 90 04 60 0c add %l1, 0xc, %o0 /* * Fill in the mode and permission information for the jnode structure. */ node->st_mode = mode & ~rtems_filesystem_umask; 4000e3c0: 03 10 00 68 sethi %hi(0x4001a000), %g1 4000e3c4: c2 00 60 40 ld [ %g1 + 0x40 ], %g1 ! 4001a040 /* * Set the type specific information */ switch (type) { 4000e3c8: b2 06 7f ff add %i1, -1, %i1 /* * Fill in the mode and permission information for the jnode structure. */ node->st_mode = mode & ~rtems_filesystem_umask; 4000e3cc: c2 10 60 24 lduh [ %g1 + 0x24 ], %g1 /* * Allocate an IMFS jnode */ node = calloc( 1, sizeof( IMFS_jnode_t ) ); 4000e3d0: b0 10 00 11 mov %l1, %i0 /* * Fill in the mode and permission information for the jnode structure. */ node->st_mode = mode & ~rtems_filesystem_umask; 4000e3d4: 82 2e c0 01 andn %i3, %g1, %g1 #if defined(RTEMS_POSIX_API) node->st_uid = geteuid(); 4000e3d8: 7f ff f8 82 call 4000c5e0 4000e3dc: c2 34 60 2e sth %g1, [ %l1 + 0x2e ] node->st_gid = getegid(); 4000e3e0: 7f ff f8 7c call 4000c5d0 4000e3e4: d0 34 60 38 sth %o0, [ %l1 + 0x38 ] /* * Now set all the times. */ gettimeofday( &tv, 0 ); 4000e3e8: 92 10 20 00 clr %o1 node->st_mode = mode & ~rtems_filesystem_umask; #if defined(RTEMS_POSIX_API) node->st_uid = geteuid(); node->st_gid = getegid(); 4000e3ec: d0 34 60 3a sth %o0, [ %l1 + 0x3a ] /* * Now set all the times. */ gettimeofday( &tv, 0 ); 4000e3f0: 7f ff f8 80 call 4000c5f0 4000e3f4: 90 07 bf f0 add %fp, -16, %o0 node->stat_atime = (time_t) tv.tv_sec; 4000e3f8: c2 07 bf f0 ld [ %fp + -16 ], %g1 /* * Set the type specific information */ switch (type) { 4000e3fc: 80 a6 60 05 cmp %i1, 5 gettimeofday( &tv, 0 ); node->stat_atime = (time_t) tv.tv_sec; node->stat_mtime = (time_t) tv.tv_sec; node->stat_ctime = (time_t) tv.tv_sec; 4000e400: c2 24 60 44 st %g1, [ %l1 + 0x44 ] * Now set all the times. */ gettimeofday( &tv, 0 ); node->stat_atime = (time_t) tv.tv_sec; 4000e404: c2 24 60 3c st %g1, [ %l1 + 0x3c ] /* * Set the type specific information */ switch (type) { 4000e408: 18 80 00 27 bgu 4000e4a4 4000e40c: c2 24 60 40 st %g1, [ %l1 + 0x40 ] 4000e410: 83 2e 60 02 sll %i1, 2, %g1 4000e414: 05 10 00 38 sethi %hi(0x4000e000), %g2 4000e418: 84 10 a3 60 or %g2, 0x360, %g2 ! 4000e360 4000e41c: c2 00 80 01 ld [ %g2 + %g1 ], %g1 4000e420: 81 c0 40 00 jmp %g1 4000e424: 01 00 00 00 nop */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 4000e428: 82 04 60 50 add %l1, 0x50, %g1 the_chain->permanent_null = NULL; 4000e42c: c0 24 60 50 clr [ %l1 + 0x50 ] */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 4000e430: c2 24 60 4c st %g1, [ %l1 + 0x4c ] the_chain->permanent_null = NULL; the_chain->last = _Chain_Head(the_chain); 4000e434: 82 04 60 4c add %l1, 0x4c, %g1 4000e438: 10 80 00 21 b 4000e4bc 4000e43c: c2 24 60 54 st %g1, [ %l1 + 0x54 ] case IMFS_DIRECTORY: Chain_Initialize_empty(&node->info.directory.Entries); break; case IMFS_HARD_LINK: node->info.hard_link.link_node = info->hard_link.link_node; 4000e440: c2 07 00 00 ld [ %i4 ], %g1 4000e444: 10 80 00 1e b 4000e4bc 4000e448: c2 24 60 4c st %g1, [ %l1 + 0x4c ] break; case IMFS_SYM_LINK: sym_name = calloc( 1, strlen( info->sym_link.name ) + 1 ); 4000e44c: 40 00 07 ba call 40010334 4000e450: d0 07 00 00 ld [ %i4 ], %o0 4000e454: 92 02 20 01 add %o0, 1, %o1 4000e458: 7f ff d3 bb call 40003344 4000e45c: 90 10 20 01 mov 1, %o0 strcpy( sym_name, info->sym_link.name ); 4000e460: d2 07 00 00 ld [ %i4 ], %o1 4000e464: 40 00 07 94 call 400102b4 4000e468: a0 10 00 08 mov %o0, %l0 node->info.sym_link.name = sym_name; 4000e46c: 10 80 00 14 b 4000e4bc 4000e470: e0 24 60 4c st %l0, [ %l1 + 0x4c ] break; case IMFS_DEVICE: node->info.device.major = info->device.major; node->info.device.minor = info->device.minor; 4000e474: c2 07 20 04 ld [ %i4 + 4 ], %g1 strcpy( sym_name, info->sym_link.name ); node->info.sym_link.name = sym_name; break; case IMFS_DEVICE: node->info.device.major = info->device.major; 4000e478: c4 07 00 00 ld [ %i4 ], %g2 node->info.device.minor = info->device.minor; 4000e47c: c2 24 60 50 st %g1, [ %l1 + 0x50 ] strcpy( sym_name, info->sym_link.name ); node->info.sym_link.name = sym_name; break; case IMFS_DEVICE: node->info.device.major = info->device.major; 4000e480: 10 80 00 0f b 4000e4bc 4000e484: c4 24 60 4c st %g2, [ %l1 + 0x4c ] node->info.device.minor = info->device.minor; break; case IMFS_LINEAR_FILE: node->info.linearfile.size = 0; 4000e488: c0 24 60 4c clr [ %l1 + 0x4c ] <== NOT EXECUTED node->info.linearfile.direct = 0; 4000e48c: c0 24 60 50 clr [ %l1 + 0x50 ] <== NOT EXECUTED case IMFS_MEMORY_FILE: node->info.file.size = 0; 4000e490: c0 24 60 4c clr [ %l1 + 0x4c ] node->info.file.indirect = 0; 4000e494: c0 24 60 50 clr [ %l1 + 0x50 ] node->info.file.doubly_indirect = 0; 4000e498: c0 24 60 54 clr [ %l1 + 0x54 ] node->info.file.triply_indirect = 0; 4000e49c: 10 80 00 08 b 4000e4bc 4000e4a0: c0 24 60 58 clr [ %l1 + 0x58 ] break; default: assert(0); 4000e4a4: 11 10 00 64 sethi %hi(0x40019000), %o0 <== NOT EXECUTED 4000e4a8: 15 10 00 62 sethi %hi(0x40018800), %o2 <== NOT EXECUTED 4000e4ac: 90 12 21 b0 or %o0, 0x1b0, %o0 <== NOT EXECUTED 4000e4b0: 94 12 a3 e8 or %o2, 0x3e8, %o2 <== NOT EXECUTED 4000e4b4: 7f ff d2 28 call 40002d54 <__assert> <== NOT EXECUTED 4000e4b8: 92 10 20 77 mov 0x77, %o1 <== NOT EXECUTED /* * If this node has a parent, then put it in that directory list. */ if ( parent ) { 4000e4bc: 80 a4 a0 00 cmp %l2, 0 4000e4c0: 02 80 00 0b be 4000e4ec 4000e4c4: 90 04 a0 4c add %l2, 0x4c, %o0 Chain_Append( &parent->info.directory.Entries, &node->Node ); 4000e4c8: 7f ff e4 7c call 400076b8 <_Chain_Append> 4000e4cc: 92 10 00 11 mov %l1, %o1 node->Parent = parent; fs_info = parent_loc->mt_entry->fs_info; 4000e4d0: c2 04 e0 0c ld [ %l3 + 0xc ], %g1 * If this node has a parent, then put it in that directory list. */ if ( parent ) { Chain_Append( &parent->info.directory.Entries, &node->Node ); node->Parent = parent; 4000e4d4: e4 24 60 08 st %l2, [ %l1 + 8 ] fs_info = parent_loc->mt_entry->fs_info; 4000e4d8: c4 00 60 2c ld [ %g1 + 0x2c ], %g2 node->st_ino = ++fs_info->ino_count; 4000e4dc: c2 00 80 00 ld [ %g2 ], %g1 4000e4e0: 82 00 60 01 inc %g1 4000e4e4: c2 20 80 00 st %g1, [ %g2 ] 4000e4e8: c2 24 60 34 st %g1, [ %l1 + 0x34 ] } return node; } 4000e4ec: 81 c7 e0 08 ret 4000e4f0: 81 e8 00 00 restore 40004770 : void IMFS_dump_directory( IMFS_jnode_t *the_directory, int level ) { 40004770: 9d e3 bf 98 save %sp, -104, %sp Chain_Node *the_node; Chain_Control *the_chain; IMFS_jnode_t *the_jnode; int i; assert( the_directory ); 40004774: 80 a6 20 00 cmp %i0, 0 40004778: 12 80 00 09 bne 4000479c 4000477c: 80 a6 60 00 cmp %i1, 0 40004780: 11 10 00 7e sethi %hi(0x4001f800), %o0 <== NOT EXECUTED 40004784: 15 10 00 7e sethi %hi(0x4001f800), %o2 <== NOT EXECUTED 40004788: 90 12 22 b0 or %o0, 0x2b0, %o0 <== NOT EXECUTED 4000478c: 94 12 a3 70 or %o2, 0x370, %o2 <== NOT EXECUTED 40004790: 40 00 01 c1 call 40004e94 <__assert> <== NOT EXECUTED 40004794: 92 10 20 7f mov 0x7f, %o1 <== NOT EXECUTED assert( level >= 0 ); 40004798: 80 a6 60 00 cmp %i1, 0 <== NOT EXECUTED 4000479c: 36 80 00 09 bge,a 400047c0 400047a0: c2 06 20 48 ld [ %i0 + 0x48 ], %g1 400047a4: 11 10 00 7e sethi %hi(0x4001f800), %o0 <== NOT EXECUTED 400047a8: 15 10 00 7e sethi %hi(0x4001f800), %o2 <== NOT EXECUTED 400047ac: 90 12 22 b0 or %o0, 0x2b0, %o0 <== NOT EXECUTED 400047b0: 94 12 a3 80 or %o2, 0x380, %o2 <== NOT EXECUTED 400047b4: 40 00 01 b8 call 40004e94 <__assert> <== NOT EXECUTED 400047b8: 92 10 20 81 mov 0x81, %o1 <== NOT EXECUTED assert( the_directory->type == IMFS_DIRECTORY ); 400047bc: c2 06 20 48 ld [ %i0 + 0x48 ], %g1 <== NOT EXECUTED 400047c0: 80 a0 60 01 cmp %g1, 1 400047c4: 02 80 00 07 be 400047e0 400047c8: 11 10 00 7e sethi %hi(0x4001f800), %o0 400047cc: 15 10 00 7e sethi %hi(0x4001f800), %o2 <== NOT EXECUTED 400047d0: 90 12 22 b0 or %o0, 0x2b0, %o0 <== NOT EXECUTED 400047d4: 94 12 a3 90 or %o2, 0x390, %o2 <== NOT EXECUTED 400047d8: 40 00 01 af call 40004e94 <__assert> <== NOT EXECUTED 400047dc: 92 10 20 83 mov 0x83, %o1 <== NOT EXECUTED the_chain = &the_directory->info.directory.Entries; for ( the_node = the_chain->first; 400047e0: e0 06 20 4c ld [ %i0 + 0x4c ], %l0 the_node = the_node->next ) { the_jnode = (IMFS_jnode_t *) the_node; for ( i=0 ; i<=level ; i++ ) fprintf(stdout, "...." ); 400047e4: 03 10 00 7e sethi %hi(0x4001f800), %g1 assert( the_directory->type == IMFS_DIRECTORY ); the_chain = &the_directory->info.directory.Entries; for ( the_node = the_chain->first; !_Chain_Is_tail( the_chain, the_node ); 400047e8: b0 06 20 50 add %i0, 0x50, %i0 the_node = the_node->next ) { the_jnode = (IMFS_jnode_t *) the_node; for ( i=0 ; i<=level ; i++ ) fprintf(stdout, "...." ); 400047ec: a8 10 63 b8 or %g1, 0x3b8, %l4 400047f0: 27 10 00 87 sethi %hi(0x40021c00), %l3 IMFS_print_jnode( the_jnode ); if ( the_jnode->type == IMFS_DIRECTORY ) IMFS_dump_directory( the_jnode, level + 1 ); 400047f4: 10 80 00 13 b 40004840 400047f8: a4 06 60 01 add %i1, 1, %l2 !_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++ ) 400047fc: a2 04 60 01 inc %l1 fprintf(stdout, "...." ); 40004800: d2 00 60 08 ld [ %g1 + 8 ], %o1 40004804: 40 00 3b c5 call 40013718 40004808: 90 10 00 14 mov %l4, %o0 !_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++ ) 4000480c: 80 a4 40 19 cmp %l1, %i1 40004810: 04 bf ff fb ble 400047fc 40004814: c2 04 e0 b8 ld [ %l3 + 0xb8 ], %g1 fprintf(stdout, "...." ); IMFS_print_jnode( the_jnode ); 40004818: 7f ff ff 82 call 40004620 4000481c: 90 10 00 10 mov %l0, %o0 if ( the_jnode->type == IMFS_DIRECTORY ) 40004820: c2 04 20 48 ld [ %l0 + 0x48 ], %g1 40004824: 80 a0 60 01 cmp %g1, 1 40004828: 32 80 00 06 bne,a 40004840 4000482c: e0 04 00 00 ld [ %l0 ], %l0 IMFS_dump_directory( the_jnode, level + 1 ); 40004830: 90 10 00 10 mov %l0, %o0 40004834: 7f ff ff cf call 40004770 40004838: 92 10 00 12 mov %l2, %o1 the_chain = &the_directory->info.directory.Entries; for ( the_node = the_chain->first; !_Chain_Is_tail( the_chain, the_node ); the_node = the_node->next ) { 4000483c: e0 04 00 00 ld [ %l0 ], %l0 assert( the_directory->type == IMFS_DIRECTORY ); the_chain = &the_directory->info.directory.Entries; for ( the_node = the_chain->first; !_Chain_Is_tail( the_chain, the_node ); 40004840: 80 a4 00 18 cmp %l0, %i0 40004844: 12 bf ff f2 bne 4000480c 40004848: a2 10 20 00 clr %l1 fprintf(stdout, "...." ); IMFS_print_jnode( the_jnode ); if ( the_jnode->type == IMFS_DIRECTORY ) IMFS_dump_directory( the_jnode, level + 1 ); } } 4000484c: 81 c7 e0 08 ret 40004850: 81 e8 00 00 restore 4000b78c : int IMFS_eval_path( const char *pathname, /* IN */ int flags, /* IN */ rtems_filesystem_location_info_t *pathloc /* IN/OUT */ ) { 4000b78c: 9d e3 bf 60 save %sp, -160, %sp /* * This was filled in by the caller and is valid in the * mount table. */ node = pathloc->node_access; 4000b790: e0 06 80 00 ld [ %i2 ], %l0 int IMFS_eval_path( const char *pathname, /* IN */ int flags, /* IN */ rtems_filesystem_location_info_t *pathloc /* IN/OUT */ ) { 4000b794: a6 10 00 18 mov %i0, %l3 /* * This was filled in by the caller and is valid in the * mount table. */ node = pathloc->node_access; 4000b798: a4 10 20 00 clr %l2 4000b79c: a2 10 20 01 mov 1, %l1 * 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], token, &len ); 4000b7a0: a8 07 bf c3 add %fp, -61, %l4 4000b7a4: ac 07 bf f4 add %fp, -12, %l6 case IMFS_UP_DIR: /* * Am I at the root of all filesystems? (chroot'ed?) */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) 4000b7a8: 10 80 00 69 b 4000b94c 4000b7ac: 2b 10 00 68 sethi %hi(0x4001a000), %l5 * 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], token, &len ); 4000b7b0: 92 10 00 14 mov %l4, %o1 4000b7b4: 40 00 01 d5 call 4000bf08 4000b7b8: 94 10 00 16 mov %l6, %o2 i += len; if ( !pathloc->node_access ) 4000b7bc: c2 06 80 00 ld [ %i2 ], %g1 * 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], token, &len ); 4000b7c0: a2 10 00 08 mov %o0, %l1 i += len; if ( !pathloc->node_access ) 4000b7c4: 80 a0 60 00 cmp %g1, 0 4000b7c8: 02 80 00 59 be 4000b92c 4000b7cc: c4 07 bf f4 ld [ %fp + -12 ], %g2 rtems_set_errno_and_return_minus_one( ENOENT ); /* * I cannot move out of this directory without execute permission. */ if ( type != IMFS_NO_MORE_PATH ) 4000b7d0: 80 a2 20 00 cmp %o0, 0 4000b7d4: 02 80 00 12 be 4000b81c 4000b7d8: a4 04 80 02 add %l2, %g2, %l2 if ( node->type == IMFS_DIRECTORY ) 4000b7dc: c2 04 20 48 ld [ %l0 + 0x48 ], %g1 4000b7e0: 80 a0 60 01 cmp %g1, 1 4000b7e4: 12 80 00 0f bne 4000b820 4000b7e8: 80 a4 60 03 cmp %l1, 3 if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) ) 4000b7ec: 90 10 00 1a mov %i2, %o0 4000b7f0: 7f ff ff b6 call 4000b6c8 4000b7f4: 92 10 20 01 mov 1, %o1 4000b7f8: 80 a2 20 00 cmp %o0, 0 4000b7fc: 12 80 00 09 bne 4000b820 4000b800: 80 a4 60 03 cmp %l1, 3 rtems_set_errno_and_return_minus_one( EACCES ); 4000b804: 40 00 0d ee call 4000efbc <__errno> 4000b808: b0 10 3f ff mov -1, %i0 4000b80c: 82 10 20 0d mov 0xd, %g1 4000b810: c2 22 00 00 st %g1, [ %o0 ] 4000b814: 81 c7 e0 08 ret 4000b818: 81 e8 00 00 restore node = pathloc->node_access; switch( type ) { 4000b81c: 80 a4 60 03 cmp %l1, 3 4000b820: 02 80 00 1b be 4000b88c 4000b824: e0 06 80 00 ld [ %i2 ], %l0 4000b828: 80 a4 60 04 cmp %l1, 4 4000b82c: 02 80 00 44 be 4000b93c 4000b830: 80 a4 60 02 cmp %l1, 2 4000b834: 12 80 00 47 bne 4000b950 4000b838: 80 a4 60 00 cmp %l1, 0 case IMFS_UP_DIR: /* * Am I at the root of all filesystems? (chroot'ed?) */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) 4000b83c: c2 05 60 40 ld [ %l5 + 0x40 ], %g1 4000b840: c2 00 60 14 ld [ %g1 + 0x14 ], %g1 4000b844: 80 a4 00 01 cmp %l0, %g1 4000b848: 02 bf ff da be 4000b7b0 4000b84c: 90 04 c0 12 add %l3, %l2, %o0 /* * Am I at the root of this mounted filesystem? */ if (pathloc->node_access == 4000b850: d2 06 a0 0c ld [ %i2 + 0xc ], %o1 4000b854: c2 02 60 18 ld [ %o1 + 0x18 ], %g1 4000b858: 80 a4 00 01 cmp %l0, %g1 4000b85c: 32 80 00 04 bne,a 4000b86c 4000b860: e0 04 20 08 ld [ %l0 + 8 ], %l0 */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) { break; /* Throw out the .. in this case */ } else { newloc = pathloc->mt_entry->mt_point_node; 4000b864: 10 80 00 48 b 4000b984 4000b868: 92 02 60 08 add %o1, 8, %o1 *pathloc = newloc; return (*pathloc->ops->evalpath_h)(&(pathname[i-len]),flags,pathloc); } } else { if ( !node->Parent ) 4000b86c: 80 a4 20 00 cmp %l0, 0 4000b870: 32 80 00 3a bne,a 4000b958 4000b874: e0 26 80 00 st %l0, [ %i2 ] rtems_set_errno_and_return_minus_one( ENOENT ); 4000b878: 40 00 0d d1 call 4000efbc <__errno> 4000b87c: b0 10 3f ff mov -1, %i0 4000b880: e2 22 00 00 st %l1, [ %o0 ] 4000b884: 81 c7 e0 08 ret 4000b888: 81 e8 00 00 restore case IMFS_NAME: /* * If we are at a link follow it. */ if ( node->type == IMFS_HARD_LINK ) { 4000b88c: c2 04 20 48 ld [ %l0 + 0x48 ], %g1 4000b890: 80 a0 60 03 cmp %g1, 3 4000b894: 12 80 00 0a bne 4000b8bc 4000b898: 80 a0 60 04 cmp %g1, 4 IMFS_evaluate_hard_link( pathloc, 0 ); 4000b89c: 90 10 00 1a mov %i2, %o0 4000b8a0: 7f ff ff a2 call 4000b728 4000b8a4: 92 10 20 00 clr %o1 node = pathloc->node_access; 4000b8a8: d0 06 80 00 ld [ %i2 ], %o0 if ( !node ) 4000b8ac: 80 a2 20 00 cmp %o0, 0 4000b8b0: 32 80 00 0d bne,a 4000b8e4 4000b8b4: a0 10 00 08 mov %o0, %l0 4000b8b8: 30 80 00 0f b,a 4000b8f4 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOTDIR ); } else if ( node->type == IMFS_SYM_LINK ) { 4000b8bc: 32 80 00 0b bne,a 4000b8e8 4000b8c0: c2 04 20 48 ld [ %l0 + 0x48 ], %g1 result = IMFS_evaluate_sym_link( pathloc, 0 ); 4000b8c4: 90 10 00 1a mov %i2, %o0 4000b8c8: 40 00 00 50 call 4000ba08 4000b8cc: 92 10 20 00 clr %o1 4000b8d0: b0 10 00 08 mov %o0, %i0 node = pathloc->node_access; if ( result == -1 ) 4000b8d4: 80 a2 3f ff cmp %o0, -1 4000b8d8: 02 bf ff cf be 4000b814 4000b8dc: d0 06 80 00 ld [ %i2 ], %o0 } else if ( node->type == IMFS_SYM_LINK ) { result = IMFS_evaluate_sym_link( pathloc, 0 ); node = pathloc->node_access; 4000b8e0: a0 10 00 08 mov %o0, %l0 /* * Only a directory can be decended into. */ if ( node->type != IMFS_DIRECTORY ) 4000b8e4: c2 04 20 48 ld [ %l0 + 0x48 ], %g1 4000b8e8: 80 a0 60 01 cmp %g1, 1 4000b8ec: 22 80 00 06 be,a 4000b904 4000b8f0: d2 04 20 58 ld [ %l0 + 0x58 ], %o1 rtems_set_errno_and_return_minus_one( ENOTDIR ); 4000b8f4: 40 00 0d b2 call 4000efbc <__errno> 4000b8f8: b0 10 3f ff mov -1, %i0 4000b8fc: 10 bf ff c5 b 4000b810 4000b900: 82 10 20 14 mov 0x14, %g1 /* * 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 ) { 4000b904: 80 a2 60 00 cmp %o1, 0 4000b908: 02 80 00 04 be 4000b918 4000b90c: 90 10 00 10 mov %l0, %o0 newloc = node->info.directory.mt_fs->mt_fs_root; 4000b910: 10 80 00 1d b 4000b984 4000b914: 92 02 60 18 add %o1, 0x18, %o1 /* * Otherwise find the token name in the present location. */ node = IMFS_find_match_in_dir( node, token ); 4000b918: 40 00 01 4e call 4000be50 4000b91c: 92 10 00 14 mov %l4, %o1 if ( !node ) 4000b920: a0 92 20 00 orcc %o0, 0, %l0 4000b924: 32 80 00 0d bne,a 4000b958 4000b928: e0 26 80 00 st %l0, [ %i2 ] rtems_set_errno_and_return_minus_one( ENOENT ); 4000b92c: 40 00 0d a4 call 4000efbc <__errno> 4000b930: b0 10 3f ff mov -1, %i0 4000b934: 10 bf ff b7 b 4000b810 4000b938: 82 10 20 02 mov 2, %g1 case IMFS_NO_MORE_PATH: case IMFS_CURRENT_DIR: break; case IMFS_INVALID_TOKEN: rtems_set_errno_and_return_minus_one( ENAMETOOLONG ); 4000b93c: 40 00 0d a0 call 4000efbc <__errno> 4000b940: b0 10 3f ff mov -1, %i0 4000b944: 10 bf ff b3 b 4000b810 4000b948: 82 10 20 5b mov 0x5b, %g1 /* * Evaluate all tokens until we are done or an error occurs. */ while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) { 4000b94c: 80 a4 60 00 cmp %l1, 0 4000b950: 22 80 00 06 be,a 4000b968 4000b954: c2 04 20 48 ld [ %l0 + 0x48 ], %g1 4000b958: 80 a4 60 04 cmp %l1, 4 4000b95c: 12 bf ff 95 bne 4000b7b0 4000b960: 90 04 c0 12 add %l3, %l2, %o0 * 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 ) { 4000b964: c2 04 20 48 ld [ %l0 + 0x48 ], %g1 <== NOT EXECUTED 4000b968: 80 a0 60 01 cmp %g1, 1 4000b96c: 12 80 00 18 bne 4000b9cc 4000b970: 01 00 00 00 nop if ( node->info.directory.mt_fs != NULL ) { 4000b974: d0 04 20 58 ld [ %l0 + 0x58 ], %o0 4000b978: 80 a2 20 00 cmp %o0, 0 4000b97c: 02 80 00 14 be 4000b9cc 4000b980: 92 02 20 18 add %o0, 0x18, %o1 newloc = node->info.directory.mt_fs->mt_fs_root; 4000b984: a0 07 bf e4 add %fp, -28, %l0 4000b988: 94 10 20 10 mov 0x10, %o2 4000b98c: 40 00 0f 61 call 4000f710 4000b990: 90 10 00 10 mov %l0, %o0 *pathloc = newloc; 4000b994: 92 10 00 10 mov %l0, %o1 4000b998: 94 10 20 10 mov 0x10, %o2 4000b99c: 40 00 0f 5d call 4000f710 4000b9a0: 90 10 00 1a mov %i2, %o0 return (*pathloc->ops->evalpath_h)( &pathname[i-len], flags, pathloc ); 4000b9a4: c2 06 a0 08 ld [ %i2 + 8 ], %g1 4000b9a8: d0 07 bf f4 ld [ %fp + -12 ], %o0 4000b9ac: c2 00 40 00 ld [ %g1 ], %g1 4000b9b0: 90 24 80 08 sub %l2, %o0, %o0 4000b9b4: 92 10 00 19 mov %i1, %o1 4000b9b8: 90 04 c0 08 add %l3, %o0, %o0 4000b9bc: 9f c0 40 00 call %g1 4000b9c0: 94 10 00 1a mov %i2, %o2 4000b9c4: 81 c7 e0 08 ret 4000b9c8: 91 e8 00 08 restore %g0, %o0, %o0 } else { result = IMFS_Set_handlers( pathloc ); } } else { result = IMFS_Set_handlers( pathloc ); 4000b9cc: 7f ff ff 26 call 4000b664 4000b9d0: 90 10 00 1a mov %i2, %o0 /* * Verify we have the correct permissions for this node. */ if ( !IMFS_evaluate_permission( pathloc, flags ) ) 4000b9d4: 92 10 00 19 mov %i1, %o1 return (*pathloc->ops->evalpath_h)( &pathname[i-len], flags, pathloc ); } else { result = IMFS_Set_handlers( pathloc ); } } else { result = IMFS_Set_handlers( pathloc ); 4000b9d8: b0 10 00 08 mov %o0, %i0 /* * Verify we have the correct permissions for this node. */ if ( !IMFS_evaluate_permission( pathloc, flags ) ) 4000b9dc: 7f ff ff 3b call 4000b6c8 4000b9e0: 90 10 00 1a mov %i2, %o0 4000b9e4: 80 a2 20 00 cmp %o0, 0 4000b9e8: 12 80 00 06 bne 4000ba00 4000b9ec: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( EACCES ); 4000b9f0: 40 00 0d 73 call 4000efbc <__errno> 4000b9f4: b0 10 3f ff mov -1, %i0 ! ffffffff 4000b9f8: 82 10 20 0d mov 0xd, %g1 4000b9fc: c2 22 00 00 st %g1, [ %o0 ] return result; } 4000ba00: 81 c7 e0 08 ret 4000ba04: 81 e8 00 00 restore 4000bb8c : int IMFS_evaluate_for_make( const char *path, /* IN */ rtems_filesystem_location_info_t *pathloc, /* IN/OUT */ const char **name /* OUT */ ) { 4000bb8c: 9d e3 bf 60 save %sp, -160, %sp /* * This was filled in by the caller and is valid in the * mount table. */ node = pathloc->node_access; 4000bb90: e0 06 40 00 ld [ %i1 ], %l0 int IMFS_evaluate_for_make( const char *path, /* IN */ rtems_filesystem_location_info_t *pathloc, /* IN/OUT */ const char **name /* OUT */ ) { 4000bb94: a8 10 00 18 mov %i0, %l4 /* * This was filled in by the caller and is valid in the * mount table. */ node = pathloc->node_access; 4000bb98: a6 10 20 00 clr %l3 * Evaluate all tokens until we are done or an error occurs. */ while( !done ) { type = IMFS_get_token( &path[i], token, &len ); 4000bb9c: aa 07 bf c3 add %fp, -61, %l5 4000bba0: ae 07 bf f4 add %fp, -12, %l7 case IMFS_UP_DIR: /* * Am I at the root of all filesystems? (chroot'ed?) */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) 4000bba4: 2d 10 00 68 sethi %hi(0x4001a000), %l6 * Evaluate all tokens until we are done or an error occurs. */ while( !done ) { type = IMFS_get_token( &path[i], token, &len ); 4000bba8: 90 05 00 13 add %l4, %l3, %o0 4000bbac: 92 10 00 15 mov %l5, %o1 4000bbb0: 40 00 00 d6 call 4000bf08 4000bbb4: 94 10 00 17 mov %l7, %o2 i += len; if ( !pathloc->node_access ) 4000bbb8: c2 06 40 00 ld [ %i1 ], %g1 * Evaluate all tokens until we are done or an error occurs. */ while( !done ) { type = IMFS_get_token( &path[i], token, &len ); 4000bbbc: a2 10 00 08 mov %o0, %l1 i += len; if ( !pathloc->node_access ) 4000bbc0: 80 a0 60 00 cmp %g1, 0 4000bbc4: 02 80 00 82 be 4000bdcc 4000bbc8: e4 07 bf f4 ld [ %fp + -12 ], %l2 /* * I cannot move out of this directory without execute permission. */ if ( type != IMFS_NO_MORE_PATH ) 4000bbcc: 80 a2 20 00 cmp %o0, 0 4000bbd0: 22 80 00 10 be,a 4000bc10 4000bbd4: a6 04 c0 12 add %l3, %l2, %l3 if ( node->type == IMFS_DIRECTORY ) 4000bbd8: c2 04 20 48 ld [ %l0 + 0x48 ], %g1 4000bbdc: 80 a0 60 01 cmp %g1, 1 4000bbe0: 32 80 00 0c bne,a 4000bc10 4000bbe4: a6 04 c0 12 add %l3, %l2, %l3 if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) ) 4000bbe8: 90 10 00 19 mov %i1, %o0 4000bbec: 7f ff fe b7 call 4000b6c8 4000bbf0: 92 10 20 01 mov 1, %o1 4000bbf4: 80 a2 20 00 cmp %o0, 0 4000bbf8: 32 80 00 06 bne,a 4000bc10 4000bbfc: a6 04 c0 12 add %l3, %l2, %l3 rtems_set_errno_and_return_minus_one( EACCES ); 4000bc00: 40 00 0c ef call 4000efbc <__errno> 4000bc04: b0 10 3f ff mov -1, %i0 4000bc08: 10 80 00 83 b 4000be14 4000bc0c: 82 10 20 0d mov 0xd, %g1 node = pathloc->node_access; switch( type ) { 4000bc10: 80 a4 60 02 cmp %l1, 2 4000bc14: 02 80 00 0f be 4000bc50 4000bc18: e0 06 40 00 ld [ %i1 ], %l0 4000bc1c: 80 a4 60 02 cmp %l1, 2 4000bc20: 18 80 00 07 bgu 4000bc3c 4000bc24: 80 a4 60 03 cmp %l1, 3 4000bc28: 80 a4 60 00 cmp %l1, 0 4000bc2c: 02 80 00 56 be 4000bd84 4000bc30: 01 00 00 00 nop * Evaluate all tokens until we are done or an error occurs. */ while( !done ) { type = IMFS_get_token( &path[i], token, &len ); 4000bc34: 10 bf ff de b 4000bbac 4000bc38: 90 05 00 13 add %l4, %l3, %o0 if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) ) rtems_set_errno_and_return_minus_one( EACCES ); node = pathloc->node_access; switch( type ) { 4000bc3c: 02 80 00 19 be 4000bca0 4000bc40: 80 a4 60 04 cmp %l1, 4 4000bc44: 32 bf ff da bne,a 4000bbac 4000bc48: 90 05 00 13 add %l4, %l3, %o0 <== NOT EXECUTED 4000bc4c: 30 80 00 52 b,a 4000bd94 case IMFS_UP_DIR: /* * Am I at the root of all filesystems? (chroot'ed?) */ if ( pathloc->node_access == rtems_filesystem_root.node_access ) 4000bc50: c2 05 a0 40 ld [ %l6 + 0x40 ], %g1 4000bc54: c2 00 60 14 ld [ %g1 + 0x14 ], %g1 4000bc58: 80 a4 00 01 cmp %l0, %g1 4000bc5c: 02 bf ff d4 be 4000bbac 4000bc60: 90 05 00 13 add %l4, %l3, %o0 /* * Am I at the root of this mounted filesystem? */ if (pathloc->node_access == pathloc->mt_entry->mt_fs_root.node_access){ 4000bc64: d2 06 60 0c ld [ %i1 + 0xc ], %o1 4000bc68: c2 02 60 18 ld [ %o1 + 0x18 ], %g1 4000bc6c: 80 a4 00 01 cmp %l0, %g1 4000bc70: 32 80 00 04 bne,a 4000bc80 4000bc74: e0 04 20 08 ld [ %l0 + 8 ], %l0 if ( pathloc->node_access == rtems_filesystem_root.node_access ) { break; } else { newloc = pathloc->mt_entry->mt_point_node; 4000bc78: 10 80 00 2a b 4000bd20 4000bc7c: 92 02 60 08 add %o1, 8, %o1 *pathloc = newloc; return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name ); } } else { if ( !node->Parent ) 4000bc80: 80 a4 20 00 cmp %l0, 0 4000bc84: 32 bf ff c9 bne,a 4000bba8 4000bc88: e0 26 40 00 st %l0, [ %i1 ] rtems_set_errno_and_return_minus_one( ENOENT ); 4000bc8c: 40 00 0c cc call 4000efbc <__errno> 4000bc90: b0 10 3f ff mov -1, %i0 4000bc94: e2 22 00 00 st %l1, [ %o0 ] 4000bc98: 81 c7 e0 08 ret 4000bc9c: 81 e8 00 00 restore pathloc->node_access = node; break; case IMFS_NAME: if ( node->type == IMFS_HARD_LINK ) { 4000bca0: d0 04 20 48 ld [ %l0 + 0x48 ], %o0 4000bca4: 80 a2 20 03 cmp %o0, 3 4000bca8: 12 80 00 0a bne 4000bcd0 4000bcac: 80 a2 20 04 cmp %o0, 4 result = IMFS_evaluate_link( pathloc, 0 ); 4000bcb0: 90 10 00 19 mov %i1, %o0 4000bcb4: 7f ff ff 89 call 4000bad8 4000bcb8: 92 10 20 00 clr %o1 if ( result == -1 ) 4000bcbc: 80 a2 3f ff cmp %o0, -1 4000bcc0: 12 80 00 0c bne 4000bcf0 4000bcc4: b0 10 00 08 mov %o0, %i0 4000bcc8: 81 c7 e0 08 ret <== NOT EXECUTED 4000bccc: 81 e8 00 00 restore <== NOT EXECUTED return -1; } else if ( node->type == IMFS_SYM_LINK ) { 4000bcd0: 32 80 00 09 bne,a 4000bcf4 4000bcd4: d0 06 40 00 ld [ %i1 ], %o0 result = IMFS_evaluate_link( pathloc, 0 ); 4000bcd8: 90 10 00 19 mov %i1, %o0 4000bcdc: 7f ff ff 7f call 4000bad8 4000bce0: 92 10 20 00 clr %o1 if ( result == -1 ) 4000bce4: 80 a2 3f ff cmp %o0, -1 4000bce8: 02 bf ff ec be 4000bc98 4000bcec: b0 10 00 08 mov %o0, %i0 return -1; } node = pathloc->node_access; 4000bcf0: d0 06 40 00 ld [ %i1 ], %o0 if ( !node ) 4000bcf4: 80 a2 20 00 cmp %o0, 0 4000bcf8: 02 80 00 44 be 4000be08 4000bcfc: 01 00 00 00 nop /* * Only a directory can be decended into. */ if ( node->type != IMFS_DIRECTORY ) 4000bd00: c2 02 20 48 ld [ %o0 + 0x48 ], %g1 4000bd04: 80 a0 60 01 cmp %g1, 1 4000bd08: 12 80 00 40 bne 4000be08 4000bd0c: 01 00 00 00 nop /* * 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 ) { 4000bd10: d2 02 20 58 ld [ %o0 + 0x58 ], %o1 4000bd14: 80 a2 60 00 cmp %o1, 0 4000bd18: 02 80 00 14 be 4000bd68 4000bd1c: 92 02 60 18 add %o1, 0x18, %o1 newloc = node->info.directory.mt_fs->mt_fs_root; 4000bd20: a0 07 bf e4 add %fp, -28, %l0 4000bd24: 94 10 20 10 mov 0x10, %o2 4000bd28: 40 00 0e 7a call 4000f710 4000bd2c: 90 10 00 10 mov %l0, %o0 *pathloc = newloc; 4000bd30: 92 10 00 10 mov %l0, %o1 4000bd34: 94 10 20 10 mov 0x10, %o2 4000bd38: 40 00 0e 76 call 4000f710 4000bd3c: 90 10 00 19 mov %i1, %o0 return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name ); 4000bd40: c2 06 60 08 ld [ %i1 + 8 ], %g1 4000bd44: d0 07 bf f4 ld [ %fp + -12 ], %o0 4000bd48: c2 00 60 04 ld [ %g1 + 4 ], %g1 4000bd4c: 90 24 c0 08 sub %l3, %o0, %o0 4000bd50: 92 10 00 19 mov %i1, %o1 4000bd54: 90 05 00 08 add %l4, %o0, %o0 4000bd58: 9f c0 40 00 call %g1 4000bd5c: 94 10 00 1a mov %i2, %o2 4000bd60: 81 c7 e0 08 ret 4000bd64: 91 e8 00 08 restore %g0, %o0, %o0 /* * Otherwise find the token name in the present location. */ node = IMFS_find_match_in_dir( node, token ); 4000bd68: 40 00 00 3a call 4000be50 4000bd6c: 92 10 00 15 mov %l5, %o1 /* * If there is no node we have found the name of the node we * wish to create. */ if ( ! node ) 4000bd70: a0 92 20 00 orcc %o0, 0, %l0 4000bd74: 02 80 00 0c be 4000bda4 4000bd78: c2 07 bf f4 ld [ %fp + -12 ], %g1 done = TRUE; else pathloc->node_access = node; 4000bd7c: 10 bf ff 8b b 4000bba8 4000bd80: e0 26 40 00 st %l0, [ %i1 ] break; case IMFS_NO_MORE_PATH: rtems_set_errno_and_return_minus_one( EEXIST ); 4000bd84: 40 00 0c 8e call 4000efbc <__errno> 4000bd88: b0 10 3f ff mov -1, %i0 4000bd8c: 10 80 00 22 b 4000be14 4000bd90: 82 10 20 11 mov 0x11, %g1 break; case IMFS_INVALID_TOKEN: rtems_set_errno_and_return_minus_one( ENAMETOOLONG ); 4000bd94: 40 00 0c 8a call 4000efbc <__errno> 4000bd98: b0 10 3f ff mov -1, %i0 4000bd9c: 10 80 00 1e b 4000be14 4000bda0: 82 10 20 5b mov 0x5b, %g1 case IMFS_CURRENT_DIR: break; } } *name = &path[ i - len ]; 4000bda4: 84 05 00 13 add %l4, %l3, %g2 4000bda8: 82 24 c0 01 sub %l3, %g1, %g1 4000bdac: 82 05 00 01 add %l4, %g1, %g1 4000bdb0: 10 80 00 0b b 4000bddc 4000bdb4: c2 26 80 00 st %g1, [ %i2 ] * 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++) { if ( !IMFS_is_separator( path[ i ] ) ) 4000bdb8: 80 a0 60 2f cmp %g1, 0x2f 4000bdbc: 02 80 00 08 be 4000bddc 4000bdc0: 80 a0 60 5c cmp %g1, 0x5c 4000bdc4: 22 80 00 07 be,a 4000bde0 4000bdc8: c2 48 80 00 ldsb [ %g2 ], %g1 rtems_set_errno_and_return_minus_one( ENOENT ); 4000bdcc: 40 00 0c 7c call 4000efbc <__errno> 4000bdd0: b0 10 3f ff mov -1, %i0 4000bdd4: 10 80 00 10 b 4000be14 4000bdd8: 82 10 20 02 mov 2, %g1 /* * 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++) { 4000bddc: c2 48 80 00 ldsb [ %g2 ], %g1 4000bde0: 80 a0 60 00 cmp %g1, 0 4000bde4: 12 bf ff f5 bne 4000bdb8 4000bde8: 84 00 a0 01 inc %g2 /* * Verify we can execute and write to this directory. */ result = IMFS_Set_handlers( pathloc ); 4000bdec: 7f ff fe 1e call 4000b664 4000bdf0: 90 10 00 19 mov %i1, %o0 /* * The returned node must be a directory */ node = pathloc->node_access; if ( node->type != IMFS_DIRECTORY ) 4000bdf4: c2 06 40 00 ld [ %i1 ], %g1 4000bdf8: c2 00 60 48 ld [ %g1 + 0x48 ], %g1 4000bdfc: 80 a0 60 01 cmp %g1, 1 4000be00: 02 80 00 08 be 4000be20 4000be04: b0 10 00 08 mov %o0, %i0 rtems_set_errno_and_return_minus_one( ENOTDIR ); 4000be08: 40 00 0c 6d call 4000efbc <__errno> 4000be0c: b0 10 3f ff mov -1, %i0 4000be10: 82 10 20 14 mov 0x14, %g1 4000be14: c2 22 00 00 st %g1, [ %o0 ] 4000be18: 81 c7 e0 08 ret 4000be1c: 81 e8 00 00 restore /* * We must have Write and execute permission on the returned node. */ if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_WX ) ) 4000be20: 90 10 00 19 mov %i1, %o0 4000be24: 7f ff fe 29 call 4000b6c8 4000be28: 92 10 20 03 mov 3, %o1 4000be2c: 80 a2 20 00 cmp %o0, 0 4000be30: 12 80 00 06 bne 4000be48 4000be34: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( EACCES ); 4000be38: 40 00 0c 61 call 4000efbc <__errno> 4000be3c: b0 10 3f ff mov -1, %i0 ! ffffffff 4000be40: 82 10 20 0d mov 0xd, %g1 4000be44: c2 22 00 00 st %g1, [ %o0 ] return result; } 4000be48: 81 c7 e0 08 ret 4000be4c: 81 e8 00 00 restore 4000b728 : int IMFS_evaluate_hard_link( rtems_filesystem_location_info_t *node, /* IN/OUT */ int flags /* IN */ ) { 4000b728: 9d e3 bf 98 save %sp, -104, %sp IMFS_jnode_t *jnode = node->node_access; 4000b72c: e0 06 00 00 ld [ %i0 ], %l0 /* * Check for things that should never happen. */ if ( jnode->type != IMFS_HARD_LINK ) 4000b730: c2 04 20 48 ld [ %l0 + 0x48 ], %g1 4000b734: 80 a0 60 03 cmp %g1, 3 4000b738: 22 80 00 05 be,a 4000b74c 4000b73c: c2 04 20 4c ld [ %l0 + 0x4c ], %g1 rtems_fatal_error_occurred (0xABCD0000); 4000b740: 7f ff ef 1f call 400073bc <== NOT EXECUTED 4000b744: 11 2a f3 40 sethi %hi(0xabcd0000), %o0 <== NOT EXECUTED /* * Set the hard link value and the handlers. */ node->node_access = jnode->info.hard_link.link_node; 4000b748: c2 04 20 4c ld [ %l0 + 0x4c ], %g1 <== NOT EXECUTED IMFS_Set_handlers( node ); 4000b74c: 90 10 00 18 mov %i0, %o0 4000b750: 7f ff ff c5 call 4000b664 4000b754: c2 26 00 00 st %g1, [ %i0 ] /* * Verify we have the correct permissions for this node. */ if ( !IMFS_evaluate_permission( node, flags ) ) 4000b758: 90 10 00 18 mov %i0, %o0 4000b75c: 92 10 00 19 mov %i1, %o1 4000b760: 7f ff ff da call 4000b6c8 4000b764: b0 10 20 00 clr %i0 4000b768: 80 a2 20 00 cmp %o0, 0 4000b76c: 12 80 00 06 bne 4000b784 4000b770: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( EACCES ); 4000b774: 40 00 0e 12 call 4000efbc <__errno> <== NOT EXECUTED 4000b778: b0 10 3f ff mov -1, %i0 ! ffffffff <== NOT EXECUTED 4000b77c: 82 10 20 0d mov 0xd, %g1 <== NOT EXECUTED 4000b780: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED return result; } 4000b784: 81 c7 e0 08 ret 4000b788: 81 e8 00 00 restore 4000ba08 : int IMFS_evaluate_sym_link( rtems_filesystem_location_info_t *node, /* IN/OUT */ int flags /* IN */ ) { 4000ba08: 9d e3 bf 98 save %sp, -104, %sp IMFS_jnode_t *jnode = node->node_access; 4000ba0c: e0 06 00 00 ld [ %i0 ], %l0 /* * Check for things that should never happen. */ if ( jnode->type != IMFS_SYM_LINK ) 4000ba10: c2 04 20 48 ld [ %l0 + 0x48 ], %g1 4000ba14: 80 a0 60 04 cmp %g1, 4 4000ba18: 02 80 00 04 be 4000ba28 4000ba1c: a2 10 00 18 mov %i0, %l1 rtems_fatal_error_occurred (0xABCD0000); 4000ba20: 7f ff ee 67 call 400073bc <== NOT EXECUTED 4000ba24: 11 2a f3 40 sethi %hi(0xabcd0000), %o0 <== NOT EXECUTED if ( !jnode->Parent ) 4000ba28: c2 04 20 08 ld [ %l0 + 8 ], %g1 4000ba2c: 80 a0 60 00 cmp %g1, 0 4000ba30: 32 80 00 06 bne,a 4000ba48 4000ba34: c2 24 40 00 st %g1, [ %l1 ] rtems_fatal_error_occurred( 0xBAD00000 ); 4000ba38: 7f ff ee 61 call 400073bc <== NOT EXECUTED 4000ba3c: 11 2e b4 00 sethi %hi(0xbad00000), %o0 <== NOT EXECUTED /* * Move the node_access to either the symbolic links parent or * root depending on the symbolic links path. */ node->node_access = jnode->Parent; 4000ba40: c2 04 20 08 ld [ %l0 + 8 ], %g1 <== NOT EXECUTED 4000ba44: c2 24 40 00 st %g1, [ %l1 ] <== NOT EXECUTED rtems_filesystem_get_sym_start_loc( 4000ba48: c2 04 20 4c ld [ %l0 + 0x4c ], %g1 4000ba4c: c2 48 40 00 ldsb [ %g1 ], %g1 4000ba50: 80 a0 60 2f cmp %g1, 0x2f 4000ba54: 02 80 00 06 be 4000ba6c 4000ba58: 80 a0 60 5c cmp %g1, 0x5c 4000ba5c: 02 80 00 04 be 4000ba6c 4000ba60: 80 a0 60 00 cmp %g1, 0 4000ba64: 12 80 00 09 bne 4000ba88 4000ba68: 82 10 20 00 clr %g1 4000ba6c: 03 10 00 68 sethi %hi(0x4001a000), %g1 4000ba70: d2 00 60 40 ld [ %g1 + 0x40 ], %o1 ! 4001a040 4000ba74: 90 10 00 11 mov %l1, %o0 4000ba78: 92 02 60 14 add %o1, 0x14, %o1 4000ba7c: 40 00 0f 25 call 4000f710 4000ba80: 94 10 20 10 mov 0x10, %o2 4000ba84: 82 10 20 01 mov 1, %g1 /* * Use eval path to evaluate the path of the symbolic link. */ result = IMFS_eval_path( 4000ba88: d0 04 20 4c ld [ %l0 + 0x4c ], %o0 4000ba8c: 94 10 00 11 mov %l1, %o2 4000ba90: 90 00 40 08 add %g1, %o0, %o0 4000ba94: 7f ff ff 3e call 4000b78c 4000ba98: 92 10 00 19 mov %i1, %o1 4000ba9c: b0 10 00 08 mov %o0, %i0 &jnode->info.sym_link.name[i], flags, node ); IMFS_Set_handlers( node ); 4000baa0: 7f ff fe f1 call 4000b664 4000baa4: 90 10 00 11 mov %l1, %o0 /* * Verify we have the correct permissions for this node. */ if ( !IMFS_evaluate_permission( node, flags ) ) 4000baa8: 90 10 00 11 mov %l1, %o0 4000baac: 7f ff ff 07 call 4000b6c8 4000bab0: 92 10 00 19 mov %i1, %o1 4000bab4: 80 a2 20 00 cmp %o0, 0 4000bab8: 12 80 00 06 bne 4000bad0 4000babc: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( EACCES ); 4000bac0: 40 00 0d 3f call 4000efbc <__errno> <== NOT EXECUTED 4000bac4: b0 10 3f ff mov -1, %i0 ! ffffffff <== NOT EXECUTED 4000bac8: 82 10 20 0d mov 0xd, %g1 <== NOT EXECUTED 4000bacc: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED return result; } 4000bad0: 81 c7 e0 08 ret 4000bad4: 81 e8 00 00 restore 4000e4f4 : int IMFS_fchmod( rtems_filesystem_location_info_t *loc, mode_t mode ) { 4000e4f4: 9d e3 bf 90 save %sp, -112, %sp /* * Verify I am the owner of the node or the super user. */ #if defined(RTEMS_POSIX_API) st_uid = geteuid(); 4000e4f8: 7f ff f8 3a call 4000c5e0 4000e4fc: f0 06 00 00 ld [ %i0 ], %i0 if ( ( st_uid != jnode->st_uid ) && ( st_uid != 0 ) ) 4000e500: c2 16 20 38 lduh [ %i0 + 0x38 ], %g1 4000e504: 91 2a 20 10 sll %o0, 0x10, %o0 4000e508: 91 32 20 10 srl %o0, 0x10, %o0 4000e50c: 80 a2 00 01 cmp %o0, %g1 4000e510: 02 80 00 04 be 4000e520 4000e514: 80 a2 20 00 cmp %o0, 0 4000e518: 12 80 00 08 bne 4000e538 <== NOT EXECUTED 4000e51c: 01 00 00 00 nop <== NOT EXECUTED #endif /* * Change only the RWX permissions on the jnode to mode. */ if ( mode & (~ (S_IRWXU | S_IRWXG | S_IRWXO ) ) ) 4000e520: 83 2e 60 10 sll %i1, 0x10, %g1 4000e524: 83 30 60 10 srl %g1, 0x10, %g1 4000e528: 82 08 7e 00 and %g1, -512, %g1 4000e52c: 80 a0 60 00 cmp %g1, 0 4000e530: 22 80 00 08 be,a 4000e550 4000e534: c2 16 20 2e lduh [ %i0 + 0x2e ], %g1 rtems_set_errno_and_return_minus_one( EPERM ); 4000e538: 40 00 02 a1 call 4000efbc <__errno> 4000e53c: 01 00 00 00 nop 4000e540: 82 10 20 01 mov 1, %g1 ! 1 4000e544: 84 10 3f ff mov -1, %g2 4000e548: 10 80 00 0b b 4000e574 4000e54c: c2 22 00 00 st %g1, [ %o0 ] jnode->st_mode &= ~(S_IRWXU | S_IRWXG | S_IRWXO); jnode->st_mode |= mode; IMFS_update_ctime( jnode ); 4000e550: 90 07 bf f0 add %fp, -16, %o0 */ if ( mode & (~ (S_IRWXU | S_IRWXG | S_IRWXO ) ) ) rtems_set_errno_and_return_minus_one( EPERM ); jnode->st_mode &= ~(S_IRWXU | S_IRWXG | S_IRWXO); jnode->st_mode |= mode; 4000e554: 82 08 7e 00 and %g1, -512, %g1 4000e558: 82 10 40 19 or %g1, %i1, %g1 IMFS_update_ctime( jnode ); 4000e55c: 92 10 20 00 clr %o1 4000e560: 7f ff f8 24 call 4000c5f0 4000e564: c2 36 20 2e sth %g1, [ %i0 + 0x2e ] 4000e568: c2 07 bf f0 ld [ %fp + -16 ], %g1 4000e56c: 84 10 20 00 clr %g2 4000e570: c2 26 20 44 st %g1, [ %i0 + 0x44 ] return 0; } 4000e574: 81 c7 e0 08 ret 4000e578: 91 e8 00 02 restore %g0, %g2, %o0 4000be50 : IMFS_jnode_t *IMFS_find_match_in_dir( IMFS_jnode_t *directory, char *name ) { 4000be50: 9d e3 bf 98 save %sp, -104, %sp /* * Check for fatal errors. A NULL directory show a problem in the * the IMFS code. */ assert( directory ); 4000be54: 80 a6 20 00 cmp %i0, 0 4000be58: 12 80 00 09 bne 4000be7c 4000be5c: 80 a6 60 00 cmp %i1, 0 4000be60: 11 10 00 64 sethi %hi(0x40019000), %o0 <== NOT EXECUTED 4000be64: 15 10 00 64 sethi %hi(0x40019000), %o2 <== NOT EXECUTED 4000be68: 90 12 20 30 or %o0, 0x30, %o0 <== NOT EXECUTED 4000be6c: 94 12 a0 80 or %o2, 0x80, %o2 <== NOT EXECUTED 4000be70: 7f ff db b9 call 40002d54 <__assert> <== NOT EXECUTED 4000be74: 92 10 20 2a mov 0x2a, %o1 <== NOT EXECUTED if ( !name ) 4000be78: 80 a6 60 00 cmp %i1, 0 <== NOT EXECUTED 4000be7c: 22 80 00 12 be,a 4000bec4 4000be80: b0 10 20 00 clr %i0 <== NOT EXECUTED return 0; assert( name ); if ( !directory ) 4000be84: 80 a6 20 00 cmp %i0, 0 4000be88: 02 80 00 0f be 4000bec4 4000be8c: 90 10 00 19 mov %i1, %o0 /* * Check for "." and ".." */ if ( !strcmp( name, dotname ) ) 4000be90: 13 10 00 67 sethi %hi(0x40019c00), %o1 4000be94: 40 00 10 d8 call 400101f4 4000be98: 92 12 63 c0 or %o1, 0x3c0, %o1 ! 40019fc0 4000be9c: 80 a2 20 00 cmp %o0, 0 4000bea0: 02 80 00 09 be 4000bec4 4000bea4: 90 10 00 19 mov %i1, %o0 return directory; if ( !strcmp( name, dotdotname ) ) 4000bea8: 13 10 00 67 sethi %hi(0x40019c00), %o1 4000beac: 40 00 10 d2 call 400101f4 4000beb0: 92 12 63 c8 or %o1, 0x3c8, %o1 ! 40019fc8 4000beb4: 80 a2 20 00 cmp %o0, 0 4000beb8: 32 80 00 05 bne,a 4000becc 4000bebc: e0 06 20 4c ld [ %i0 + 0x4c ], %l0 return directory->Parent; 4000bec0: f0 06 20 08 ld [ %i0 + 8 ], %i0 <== NOT EXECUTED 4000bec4: 81 c7 e0 08 ret <== NOT EXECUTED 4000bec8: 81 e8 00 00 restore <== NOT EXECUTED the_chain = &directory->info.directory.Entries; for ( the_node = the_chain->first; !_Chain_Is_tail( the_chain, the_node ); 4000becc: 10 80 00 09 b 4000bef0 4000bed0: b0 06 20 50 add %i0, 0x50, %i0 the_node = the_node->next ) { the_jnode = (IMFS_jnode_t *) the_node; if ( !strcmp( name, the_jnode->name ) ) 4000bed4: 40 00 10 c8 call 400101f4 4000bed8: 90 10 00 19 mov %i1, %o0 4000bedc: 80 a2 20 00 cmp %o0, 0 4000bee0: 32 80 00 04 bne,a 4000bef0 4000bee4: e0 04 00 00 ld [ %l0 ], %l0 4000bee8: 81 c7 e0 08 ret 4000beec: 91 e8 00 10 restore %g0, %l0, %o0 return directory->Parent; the_chain = &directory->info.directory.Entries; for ( the_node = the_chain->first; !_Chain_Is_tail( the_chain, the_node ); 4000bef0: 80 a4 00 18 cmp %l0, %i0 4000bef4: 12 bf ff f8 bne 4000bed4 4000bef8: 92 04 20 0c add %l0, 0xc, %o1 4000befc: b0 10 20 00 clr %i0 if ( !strcmp( name, the_jnode->name ) ) return the_jnode; } return 0; } 4000bf00: 81 c7 e0 08 ret 4000bf04: 81 e8 00 00 restore 4001676c : ((IMFS_jnode_t *)( Chain_Head( jnode_get_control( jnode ) )->next)) int IMFS_fsunmount( rtems_filesystem_mount_table_entry_t *temp_mt_entry ) { 4001676c: 9d e3 bf 88 save %sp, -120, %sp * Traverse tree that starts at the mt_fs_root and deallocate memory * associated memory space */ jnode = (IMFS_jnode_t *)temp_mt_entry->mt_fs_root.node_access; loc = temp_mt_entry->mt_fs_root; 40016770: 94 10 20 10 mov 0x10, %o2 40016774: 90 07 bf e8 add %fp, -24, %o0 /* * 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; 40016778: e0 06 20 18 ld [ %i0 + 0x18 ], %l0 temp_mt_entry->mt_fs_root.node_access = NULL; do { next = jnode->Parent; loc.node_access = (void *)jnode; IMFS_Set_handlers( &loc ); 4001677c: a2 10 00 08 mov %o0, %l1 * Traverse tree that starts at the mt_fs_root and deallocate memory * associated memory space */ jnode = (IMFS_jnode_t *)temp_mt_entry->mt_fs_root.node_access; loc = temp_mt_entry->mt_fs_root; 40016780: 40 00 3b 37 call 4002545c 40016784: 92 06 20 18 add %i0, 0x18, %o1 /* * Set this to null to indicate that it is being unmounted. */ temp_mt_entry->mt_fs_root.node_access = NULL; 40016788: c0 26 20 18 clr [ %i0 + 0x18 ] do { next = jnode->Parent; loc.node_access = (void *)jnode; 4001678c: e0 27 bf e8 st %l0, [ %fp + -24 ] */ temp_mt_entry->mt_fs_root.node_access = NULL; do { next = jnode->Parent; 40016790: f0 04 20 08 ld [ %l0 + 8 ], %i0 loc.node_access = (void *)jnode; IMFS_Set_handlers( &loc ); 40016794: 7f ff fd f9 call 40015f78 40016798: 90 10 00 11 mov %l1, %o0 if ( jnode->type != IMFS_DIRECTORY ) { 4001679c: c2 04 20 48 ld [ %l0 + 0x48 ], %g1 400167a0: 80 a0 60 01 cmp %g1, 1 400167a4: 12 80 00 06 bne 400167bc 400167a8: 84 04 20 50 add %l0, 0x50, %g2 result = IMFS_unlink( &loc ); if (result != 0) return -1; jnode = next; } else if ( jnode_has_no_children( jnode ) ) { 400167ac: c2 04 20 4c ld [ %l0 + 0x4c ], %g1 400167b0: 80 a0 40 02 cmp %g1, %g2 400167b4: 12 80 00 08 bne 400167d4 400167b8: 80 a4 20 00 cmp %l0, 0 result = IMFS_unlink( &loc ); 400167bc: 7f ff bb d2 call 40005704 400167c0: 90 10 00 11 mov %l1, %o0 if (result != 0) 400167c4: 80 a2 20 00 cmp %o0, 0 400167c8: 12 80 00 13 bne 40016814 400167cc: a0 10 00 18 mov %i0, %l0 return -1; jnode = next; } if ( jnode != NULL ) { 400167d0: 80 a4 20 00 cmp %l0, 0 400167d4: 02 80 00 12 be 4001681c 400167d8: 01 00 00 00 nop if ( jnode->type == IMFS_DIRECTORY ) { 400167dc: c2 04 20 48 ld [ %l0 + 0x48 ], %g1 400167e0: 80 a0 60 01 cmp %g1, 1 400167e4: 32 bf ff eb bne,a 40016790 400167e8: e0 27 bf e8 st %l0, [ %fp + -24 ] <== NOT EXECUTED if ( jnode_has_children( jnode ) ) 400167ec: c4 04 20 4c ld [ %l0 + 0x4c ], %g2 400167f0: 82 04 20 50 add %l0, 0x50, %g1 400167f4: 80 a0 80 01 cmp %g2, %g1 400167f8: 22 bf ff e6 be,a 40016790 400167fc: e0 27 bf e8 st %l0, [ %fp + -24 ] jnode = jnode_get_first_child( jnode ); } } } while (jnode != NULL); 40016800: 80 a0 a0 00 cmp %g2, 0 40016804: 02 80 00 06 be 4001681c 40016808: a0 10 00 02 mov %g2, %l0 temp_mt_entry->mt_fs_root.node_access = NULL; do { next = jnode->Parent; loc.node_access = (void *)jnode; 4001680c: 10 bf ff e1 b 40016790 40016810: e0 27 bf e8 st %l0, [ %fp + -24 ] jnode = next; } if ( jnode != NULL ) { if ( jnode->type == IMFS_DIRECTORY ) { if ( jnode_has_children( jnode ) ) jnode = jnode_get_first_child( jnode ); 40016814: 81 c7 e0 08 ret <== NOT EXECUTED 40016818: 91 e8 3f ff restore %g0, -1, %o0 <== NOT EXECUTED } } } while (jnode != NULL); return 0; } 4001681c: 81 c7 e0 08 ret 40016820: 91 e8 20 00 restore %g0, 0, %o0 4000bfec : rtems_filesystem_mount_table_entry_t *temp_mt_entry, rtems_filesystem_operations_table *op_table, rtems_filesystem_file_handlers_r *memfile_handlers, rtems_filesystem_file_handlers_r *directory_handlers ) { 4000bfec: 9d e3 bf 98 save %sp, -104, %sp IMFS_jnode_t *jnode; /* * determine/check value for imfs_memfile_bytes_per_block */ IMFS_determine_bytes_per_block(&imfs_memfile_bytes_per_block, 4000bff0: 03 10 00 66 sethi %hi(0x40019800), %g1 4000bff4: c4 00 62 20 ld [ %g1 + 0x220 ], %g2 ! 40019a20 4000bff8: 86 10 20 00 clr %g3 4000bffc: 10 80 00 05 b 4000c010 4000c000: 82 10 20 10 mov 0x10, %g1 * 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) { 4000c004: 22 80 00 02 be,a 4000c00c 4000c008: 86 10 20 01 mov 1, %g3 /* * check, whether requested bytes per block is valid */ for (bit_mask = 16; !is_valid && (bit_mask <= 512); bit_mask <<= 1) { 4000c00c: 83 28 60 01 sll %g1, 1, %g1 int bit_mask; /* * check, whether requested bytes per block is valid */ for (bit_mask = 16; !is_valid && (bit_mask <= 512); 4000c010: 80 a0 e0 00 cmp %g3, 0 4000c014: 32 80 00 07 bne,a 4000c030 4000c018: 03 10 00 6a sethi %hi(0x4001a800), %g1 4000c01c: 80 a0 62 00 cmp %g1, 0x200 4000c020: 04 bf ff f9 ble 4000c004 4000c024: 80 a0 40 02 cmp %g1, %g2 bit_mask <<= 1) { if (bit_mask == requested_bytes_per_block) { is_valid = TRUE; } } *dest_bytes_per_block = ((is_valid) 4000c028: 84 10 20 80 mov 0x80, %g2 <== NOT EXECUTED 4000c02c: 03 10 00 6a sethi %hi(0x4001a800), %g1 <== NOT EXECUTED * 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_node( 4000c030: 98 10 20 00 clr %o4 bit_mask <<= 1) { if (bit_mask == requested_bytes_per_block) { is_valid = TRUE; } } *dest_bytes_per_block = ((is_valid) 4000c034: c4 20 63 b4 st %g2, [ %g1 + 0x3b4 ] * 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_node( 4000c038: 92 10 20 01 mov 1, %o1 4000c03c: 90 10 20 00 clr %o0 4000c040: 15 10 00 63 sethi %hi(0x40018c00), %o2 4000c044: 17 00 00 10 sethi %hi(0x4000), %o3 4000c048: 94 12 a1 c0 or %o2, 0x1c0, %o2 4000c04c: 40 00 08 cb call 4000e378 4000c050: 96 12 e1 ed or %o3, 0x1ed, %o3 NULL ); 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; 4000c054: 94 10 20 30 mov 0x30, %o2 * 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_node( 4000c058: d0 26 20 18 st %o0, [ %i0 + 0x18 ] ( S_IFDIR | 0755 ), NULL ); temp_mt_entry->mt_fs_root.handlers = directory_handlers; temp_mt_entry->mt_fs_root.ops = op_table; 4000c05c: f2 26 20 20 st %i1, [ %i0 + 0x20 ] "", ( S_IFDIR | 0755 ), NULL ); temp_mt_entry->mt_fs_root.handlers = directory_handlers; 4000c060: f6 26 20 1c st %i3, [ %i0 + 0x1c ] temp_mt_entry->mt_fs_root.ops = op_table; temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS; 4000c064: 13 10 00 68 sethi %hi(0x4001a000), %o1 4000c068: 90 06 20 30 add %i0, 0x30, %o0 4000c06c: 40 00 0d a9 call 4000f710 4000c070: 92 12 63 38 or %o1, 0x338, %o1 /* * Create custom file system data. */ fs_info = calloc( 1, sizeof( IMFS_fs_info_t ) ); 4000c074: 90 10 20 01 mov 1, %o0 4000c078: 7f ff dc b3 call 40003344 4000c07c: 92 10 20 0c mov 0xc, %o1 if ( !fs_info ){ 4000c080: 80 a2 20 00 cmp %o0, 0 4000c084: 12 80 00 0a bne 4000c0ac 4000c088: c4 06 20 18 ld [ %i0 + 0x18 ], %g2 free(temp_mt_entry->mt_fs_root.node_access); 4000c08c: 7f ff db f0 call 4000304c <== NOT EXECUTED 4000c090: 90 10 00 02 mov %g2, %o0 <== NOT EXECUTED rtems_set_errno_and_return_minus_one(ENOMEM); 4000c094: 40 00 0b ca call 4000efbc <__errno> <== NOT EXECUTED 4000c098: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 4000c09c: 82 10 20 0c mov 0xc, %g1 <== NOT EXECUTED 4000c0a0: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 4000c0a4: 81 c7 e0 08 ret <== NOT EXECUTED 4000c0a8: 81 e8 00 00 restore <== NOT EXECUTED /* * Set st_ino for the root to 1. */ fs_info->ino_count = 1; 4000c0ac: 82 10 20 01 mov 1, %g1 4000c0b0: c2 22 00 00 st %g1, [ %o0 ] 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; 4000c0b4: d0 26 20 2c st %o0, [ %i0 + 0x2c ] * Set st_ino for the root to 1. */ fs_info->ino_count = 1; fs_info->memfile_handlers = memfile_handlers; fs_info->directory_handlers = directory_handlers; 4000c0b8: f6 22 20 08 st %i3, [ %o0 + 8 ] jnode = temp_mt_entry->mt_fs_root.node_access; jnode->st_ino = fs_info->ino_count; 4000c0bc: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] /* * Set st_ino for the root to 1. */ fs_info->ino_count = 1; fs_info->memfile_handlers = memfile_handlers; 4000c0c0: f4 22 20 04 st %i2, [ %o0 + 4 ] jnode = temp_mt_entry->mt_fs_root.node_access; jnode->st_ino = fs_info->ino_count; return 0; } 4000c0c4: 81 c7 e0 08 ret 4000c0c8: 91 e8 20 00 restore %g0, 0, %o0 40005498 : int IMFS_link( rtems_filesystem_location_info_t *to_loc, /* IN */ rtems_filesystem_location_info_t *parent_loc, /* IN */ const char *token /* IN */ ) { 40005498: 9d e3 bf 58 save %sp, -168, %sp /* * Verify this node can be linked to. */ info.hard_link.link_node = to_loc->node_access; 4000549c: c2 06 00 00 ld [ %i0 ], %g1 400054a0: c2 27 bf dc st %g1, [ %fp + -36 ] if ( info.hard_link.link_node->st_nlink >= LINK_MAX ) 400054a4: c2 10 60 30 lduh [ %g1 + 0x30 ], %g1 400054a8: 80 a0 60 07 cmp %g1, 7 400054ac: 08 80 00 06 bleu 400054c4 400054b0: 90 10 00 1a mov %i2, %o0 rtems_set_errno_and_return_minus_one( EMLINK ); 400054b4: 40 00 79 36 call 4002398c <__errno> 400054b8: 01 00 00 00 nop 400054bc: 10 80 00 13 b 40005508 400054c0: 82 10 20 1f mov 0x1f, %g1 ! 1f /* * Remove any separators at the end of the string. */ IMFS_get_token( token, new_name, &i ); 400054c4: a0 07 bf bb add %fp, -69, %l0 400054c8: 94 07 bf f4 add %fp, -12, %o2 400054cc: 7f ff ff 78 call 400052ac 400054d0: 92 10 00 10 mov %l0, %o1 /* * Create a new link node. */ new_node = IMFS_create_node( 400054d4: 90 10 00 19 mov %i1, %o0 400054d8: 94 10 00 10 mov %l0, %o2 400054dc: 92 10 20 03 mov 3, %o1 400054e0: 17 00 00 28 sethi %hi(0xa000), %o3 400054e4: 98 07 bf dc add %fp, -36, %o4 400054e8: 40 00 42 3f call 40015de4 400054ec: 96 12 e1 ff or %o3, 0x1ff, %o3 new_name, ( S_IFLNK | ( S_IRWXU | S_IRWXG | S_IRWXO )), &info ); if ( !new_node ) 400054f0: 80 a2 20 00 cmp %o0, 0 400054f4: 12 80 00 08 bne 40005514 400054f8: c4 07 bf dc ld [ %fp + -36 ], %g2 rtems_set_errno_and_return_minus_one( ENOMEM ); 400054fc: 40 00 79 24 call 4002398c <__errno> <== NOT EXECUTED 40005500: 01 00 00 00 nop <== NOT EXECUTED 40005504: 82 10 20 0c mov 0xc, %g1 ! c <== NOT EXECUTED 40005508: c2 22 00 00 st %g1, [ %o0 ] 4000550c: 81 c7 e0 08 ret 40005510: 91 e8 3f ff restore %g0, -1, %o0 /* * Increment the link count of the node being pointed to. */ info.hard_link.link_node->st_nlink++; IMFS_update_ctime( info.hard_link.link_node ); 40005514: 90 07 bf ec add %fp, -20, %o0 /* * Increment the link count of the node being pointed to. */ info.hard_link.link_node->st_nlink++; 40005518: c2 10 a0 30 lduh [ %g2 + 0x30 ], %g1 IMFS_update_ctime( info.hard_link.link_node ); 4000551c: 92 10 20 00 clr %o1 /* * Increment the link count of the node being pointed to. */ info.hard_link.link_node->st_nlink++; 40005520: 82 00 60 01 inc %g1 IMFS_update_ctime( info.hard_link.link_node ); 40005524: 40 00 01 cf call 40005c60 40005528: c2 30 a0 30 sth %g1, [ %g2 + 0x30 ] 4000552c: c4 07 bf ec ld [ %fp + -20 ], %g2 40005530: c2 07 bf dc ld [ %fp + -36 ], %g1 40005534: c4 20 60 44 st %g2, [ %g1 + 0x44 ] return 0; } 40005538: 81 c7 e0 08 ret 4000553c: 91 e8 20 00 restore %g0, 0, %o0 4001ae10 : MEMFILE_STATIC int IMFS_memfile_addblock( IMFS_jnode_t *the_jnode, unsigned int block ) { 4001ae10: 9d e3 bf 98 save %sp, -104, %sp block_p memory; block_p *block_entry_ptr; assert( the_jnode ); 4001ae14: 80 a6 20 00 cmp %i0, 0 4001ae18: 32 80 00 09 bne,a 4001ae3c 4001ae1c: c2 06 20 48 ld [ %i0 + 0x48 ], %g1 4001ae20: 92 10 21 69 mov 0x169, %o1 <== NOT EXECUTED 4001ae24: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED 4001ae28: 15 10 00 da sethi %hi(0x40036800), %o2 <== NOT EXECUTED 4001ae2c: 90 12 22 10 or %o0, 0x210, %o0 <== NOT EXECUTED 4001ae30: 7f ff aa d1 call 40005974 <__assert> <== NOT EXECUTED 4001ae34: 94 12 a2 60 or %o2, 0x260, %o2 <== NOT EXECUTED 4001ae38: 30 80 00 0d b,a 4001ae6c <== NOT EXECUTED if ( !the_jnode ) rtems_set_errno_and_return_minus_one( EIO ); assert( the_jnode->type == IMFS_MEMORY_FILE ); 4001ae3c: 80 a0 60 05 cmp %g1, 5 4001ae40: 02 80 00 07 be 4001ae5c 4001ae44: 11 10 00 da sethi %hi(0x40036800), %o0 4001ae48: 15 10 00 da sethi %hi(0x40036800), %o2 <== NOT EXECUTED 4001ae4c: 90 12 22 10 or %o0, 0x210, %o0 <== NOT EXECUTED 4001ae50: 94 12 a2 70 or %o2, 0x270, %o2 <== NOT EXECUTED 4001ae54: 7f ff aa c8 call 40005974 <__assert> <== NOT EXECUTED 4001ae58: 92 10 21 6d mov 0x16d, %o1 <== NOT EXECUTED if ( the_jnode->type != IMFS_MEMORY_FILE ) 4001ae5c: c2 06 20 48 ld [ %i0 + 0x48 ], %g1 4001ae60: 80 a0 60 05 cmp %g1, 5 4001ae64: 02 80 00 08 be 4001ae84 4001ae68: 90 10 00 18 mov %i0, %o0 rtems_set_errno_and_return_minus_one( EIO ); 4001ae6c: 40 00 22 c8 call 4002398c <__errno> <== NOT EXECUTED 4001ae70: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 4001ae74: 82 10 20 05 mov 5, %g1 <== NOT EXECUTED 4001ae78: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 4001ae7c: 81 c7 e0 08 ret 4001ae80: 81 e8 00 00 restore block_entry_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 1 ); 4001ae84: 92 10 00 19 mov %i1, %o1 4001ae88: 7f ff fe 68 call 4001a828 4001ae8c: 94 10 20 01 mov 1, %o2 if ( *block_entry_ptr ) 4001ae90: c2 02 00 00 ld [ %o0 ], %g1 assert( the_jnode->type == IMFS_MEMORY_FILE ); if ( the_jnode->type != IMFS_MEMORY_FILE ) rtems_set_errno_and_return_minus_one( EIO ); block_entry_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 1 ); 4001ae94: b2 10 00 08 mov %o0, %i1 if ( *block_entry_ptr ) 4001ae98: 80 a0 60 00 cmp %g1, 0 4001ae9c: 12 bf ff f8 bne 4001ae7c 4001aea0: b0 10 20 00 clr %i0 #if 0 fprintf(stdout, "%d %p", block, block_entry_ptr ); fflush(stdout); #endif memory = memfile_alloc_block(); 4001aea4: 7f ff fe 54 call 4001a7f4 4001aea8: b0 10 20 01 mov 1, %i0 if ( !memory ) 4001aeac: 80 a2 20 00 cmp %o0, 0 4001aeb0: 02 80 00 04 be 4001aec0 4001aeb4: 01 00 00 00 nop return 1; *block_entry_ptr = memory; 4001aeb8: d0 26 40 00 st %o0, [ %i1 ] 4001aebc: b0 10 20 00 clr %i0 return 0; } 4001aec0: 81 c7 e0 08 ret 4001aec4: 81 e8 00 00 restore 4001aec8 : MEMFILE_STATIC int IMFS_memfile_extend( IMFS_jnode_t *the_jnode, off_t new_length ) { 4001aec8: 9d e3 bf 98 save %sp, -104, %sp /* * Perform internal consistency checks */ assert( the_jnode ); 4001aecc: 80 a6 20 00 cmp %i0, 0 4001aed0: 32 80 00 09 bne,a 4001aef4 4001aed4: c2 06 20 48 ld [ %i0 + 0x48 ], %g1 4001aed8: 92 10 21 31 mov 0x131, %o1 <== NOT EXECUTED 4001aedc: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED 4001aee0: 15 10 00 da sethi %hi(0x40036800), %o2 <== NOT EXECUTED 4001aee4: 90 12 22 10 or %o0, 0x210, %o0 <== NOT EXECUTED 4001aee8: 7f ff aa a3 call 40005974 <__assert> <== NOT EXECUTED 4001aeec: 94 12 a2 60 or %o2, 0x260, %o2 <== NOT EXECUTED 4001aef0: 30 80 00 0d b,a 4001af24 <== NOT EXECUTED if ( !the_jnode ) rtems_set_errno_and_return_minus_one( EIO ); assert( the_jnode->type == IMFS_MEMORY_FILE ); 4001aef4: 80 a0 60 05 cmp %g1, 5 4001aef8: 02 80 00 07 be 4001af14 4001aefc: 11 10 00 da sethi %hi(0x40036800), %o0 4001af00: 15 10 00 da sethi %hi(0x40036800), %o2 <== NOT EXECUTED 4001af04: 90 12 22 10 or %o0, 0x210, %o0 <== NOT EXECUTED 4001af08: 94 12 a2 70 or %o2, 0x270, %o2 <== NOT EXECUTED 4001af0c: 7f ff aa 9a call 40005974 <__assert> <== NOT EXECUTED 4001af10: 92 10 21 35 mov 0x135, %o1 <== NOT EXECUTED if ( the_jnode->type != IMFS_MEMORY_FILE ) 4001af14: c2 06 20 48 ld [ %i0 + 0x48 ], %g1 4001af18: 80 a0 60 05 cmp %g1, 5 4001af1c: 22 80 00 06 be,a 4001af34 4001af20: 03 10 00 ec sethi %hi(0x4003b000), %g1 rtems_set_errno_and_return_minus_one( EIO ); 4001af24: 40 00 22 9a call 4002398c <__errno> <== NOT EXECUTED 4001af28: 01 00 00 00 nop <== NOT EXECUTED 4001af2c: 10 80 00 31 b 4001aff0 <== NOT EXECUTED 4001af30: 82 10 20 05 mov 5, %g1 ! 5 <== NOT EXECUTED if ( new_length >= IMFS_MEMFILE_MAXIMUM_SIZE ) 4001af34: e2 00 62 a8 ld [ %g1 + 0x2a8 ], %l1 4001af38: a1 34 60 02 srl %l1, 2, %l0 4001af3c: 92 10 00 10 mov %l0, %o1 4001af40: 7f ff a0 2e call 40002ff8 <.umul> 4001af44: 90 04 20 01 add %l0, 1, %o0 4001af48: 92 10 00 10 mov %l0, %o1 4001af4c: 7f ff a0 2b call 40002ff8 <.umul> 4001af50: 90 02 20 01 inc %o0 4001af54: 92 10 00 11 mov %l1, %o1 4001af58: 7f ff a0 28 call 40002ff8 <.umul> 4001af5c: 90 02 3f ff add %o0, -1, %o0 4001af60: 80 a6 40 08 cmp %i1, %o0 4001af64: 2a 80 00 06 bcs,a 4001af7c 4001af68: e0 06 20 4c ld [ %i0 + 0x4c ], %l0 rtems_set_errno_and_return_minus_one( EINVAL ); 4001af6c: 40 00 22 88 call 4002398c <__errno> <== NOT EXECUTED 4001af70: 01 00 00 00 nop <== NOT EXECUTED 4001af74: 10 80 00 1f b 4001aff0 <== NOT EXECUTED 4001af78: 82 10 20 16 mov 0x16, %g1 ! 16 <== NOT EXECUTED if ( new_length <= the_jnode->info.file.size ) 4001af7c: 80 a6 40 10 cmp %i1, %l0 4001af80: 04 80 00 24 ble 4001b010 4001af84: 82 10 20 00 clr %g1 /* * Calculate the number of range of blocks to allocate */ new_blocks = new_length / IMFS_MEMFILE_BYTES_PER_BLOCK; 4001af88: 92 10 00 11 mov %l1, %o1 4001af8c: 40 00 5f 5f call 40032d08 <.div> 4001af90: 90 10 00 19 mov %i1, %o0 old_blocks = the_jnode->info.file.size / IMFS_MEMFILE_BYTES_PER_BLOCK; 4001af94: 92 10 00 11 mov %l1, %o1 /* * Calculate the number of range of blocks to allocate */ new_blocks = new_length / IMFS_MEMFILE_BYTES_PER_BLOCK; 4001af98: a4 10 00 08 mov %o0, %l2 old_blocks = the_jnode->info.file.size / IMFS_MEMFILE_BYTES_PER_BLOCK; 4001af9c: 40 00 5f 5b call 40032d08 <.div> 4001afa0: 90 10 00 10 mov %l0, %o0 4001afa4: a0 10 00 08 mov %o0, %l0 4001afa8: 10 80 00 15 b 4001affc 4001afac: a2 10 00 08 mov %o0, %l1 /* * Now allocate each of those blocks. */ for ( block=old_blocks ; block<=new_blocks ; block++ ) { if ( IMFS_memfile_addblock( the_jnode, block ) ) { 4001afb0: 7f ff ff 98 call 4001ae10 4001afb4: 90 10 00 18 mov %i0, %o0 4001afb8: 80 a2 20 00 cmp %o0, 0 4001afbc: 22 80 00 10 be,a 4001affc 4001afc0: a0 04 20 01 inc %l0 for ( ; block>=old_blocks ; block-- ) { 4001afc4: 10 80 00 06 b 4001afdc <== NOT EXECUTED 4001afc8: 80 a4 00 11 cmp %l0, %l1 <== NOT EXECUTED IMFS_memfile_remove_block( the_jnode, block ); 4001afcc: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 4001afd0: 7f ff fe c6 call 4001aae8 <== NOT EXECUTED 4001afd4: a0 04 3f ff add %l0, -1, %l0 <== NOT EXECUTED * 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-- ) { 4001afd8: 80 a4 00 11 cmp %l0, %l1 <== NOT EXECUTED 4001afdc: 1a bf ff fc bcc 4001afcc <== NOT EXECUTED 4001afe0: 92 10 00 10 mov %l0, %o1 <== NOT EXECUTED IMFS_memfile_remove_block( the_jnode, block ); } rtems_set_errno_and_return_minus_one( ENOSPC ); 4001afe4: 40 00 22 6a call 4002398c <__errno> <== NOT EXECUTED 4001afe8: 01 00 00 00 nop <== NOT EXECUTED 4001afec: 82 10 20 1c mov 0x1c, %g1 ! 1c <== NOT EXECUTED 4001aff0: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 4001aff4: 10 80 00 07 b 4001b010 <== NOT EXECUTED 4001aff8: 82 10 3f ff mov -1, %g1 <== NOT EXECUTED /* * Now allocate each of those blocks. */ for ( block=old_blocks ; block<=new_blocks ; block++ ) { 4001affc: 80 a4 00 12 cmp %l0, %l2 4001b000: 08 bf ff ec bleu 4001afb0 4001b004: 92 10 00 10 mov %l0, %o1 /* * Set the new length of the file. */ the_jnode->info.file.size = new_length; 4001b008: f2 26 20 4c st %i1, [ %i0 + 0x4c ] 4001b00c: 82 10 20 00 clr %g1 return 0; } 4001b010: 81 c7 e0 08 ret 4001b014: 91 e8 00 01 restore %g0, %g1, %o0 4001a828 : #endif IMFS_jnode_t *the_jnode, unsigned int block, int malloc_it ) { 4001a828: 9d e3 bf 98 save %sp, -104, %sp /* * Perform internal consistency checks */ assert( the_jnode ); 4001a82c: 80 a6 20 00 cmp %i0, 0 4001a830: 32 80 00 0a bne,a 4001a858 4001a834: c2 06 20 48 ld [ %i0 + 0x48 ], %g1 4001a838: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED 4001a83c: 92 10 23 86 mov 0x386, %o1 <== NOT EXECUTED 4001a840: 90 12 22 10 or %o0, 0x210, %o0 <== NOT EXECUTED 4001a844: 15 10 00 da sethi %hi(0x40036800), %o2 <== NOT EXECUTED 4001a848: 7f ff ac 4b call 40005974 <__assert> <== NOT EXECUTED 4001a84c: 94 12 a2 60 or %o2, 0x260, %o2 ! 40036a60 <_POSIX_Threads_Default_attributes+0x88> <== NOT EXECUTED 4001a850: 81 c7 e0 08 ret <== NOT EXECUTED 4001a854: 81 e8 00 00 restore <== NOT EXECUTED if ( !the_jnode ) return NULL; assert( the_jnode->type == IMFS_MEMORY_FILE ); 4001a858: 80 a0 60 05 cmp %g1, 5 4001a85c: 02 80 00 07 be 4001a878 4001a860: 11 10 00 da sethi %hi(0x40036800), %o0 4001a864: 15 10 00 da sethi %hi(0x40036800), %o2 <== NOT EXECUTED 4001a868: 90 12 22 10 or %o0, 0x210, %o0 <== NOT EXECUTED 4001a86c: 94 12 a2 70 or %o2, 0x270, %o2 <== NOT EXECUTED 4001a870: 7f ff ac 41 call 40005974 <__assert> <== NOT EXECUTED 4001a874: 92 10 23 8a mov 0x38a, %o1 <== NOT EXECUTED if ( the_jnode->type != IMFS_MEMORY_FILE ) 4001a878: c2 06 20 48 ld [ %i0 + 0x48 ], %g1 4001a87c: 80 a0 60 05 cmp %g1, 5 4001a880: 32 bf ff f4 bne,a 4001a850 4001a884: b0 10 20 00 clr %i0 <== NOT EXECUTED /* * Is the block number in the simple indirect portion? */ if ( my_block <= LAST_INDIRECT ) { 4001a888: 03 10 00 ec sethi %hi(0x4003b000), %g1 4001a88c: c2 00 62 a8 ld [ %g1 + 0x2a8 ], %g1 ! 4003b2a8 4001a890: a3 30 60 02 srl %g1, 2, %l1 4001a894: 82 04 7f ff add %l1, -1, %g1 4001a898: 80 a6 40 01 cmp %i1, %g1 4001a89c: 18 80 00 15 bgu 4001a8f0 4001a8a0: 90 04 60 01 add %l1, 1, %o0 fprintf(stdout, "(s %d) ", block ); fflush(stdout); #endif p = info->indirect; if ( malloc_it ) { 4001a8a4: 80 a6 a0 00 cmp %i2, 0 4001a8a8: 02 80 00 0e be 4001a8e0 4001a8ac: e0 06 20 50 ld [ %i0 + 0x50 ], %l0 if ( !p ) { 4001a8b0: 80 a4 20 00 cmp %l0, 0 4001a8b4: 32 80 00 09 bne,a 4001a8d8 4001a8b8: c4 06 20 50 ld [ %i0 + 0x50 ], %g2 p = memfile_alloc_block(); 4001a8bc: 7f ff ff ce call 4001a7f4 4001a8c0: 01 00 00 00 nop if ( !p ) 4001a8c4: 80 a2 20 00 cmp %o0, 0 4001a8c8: 22 bf ff e2 be,a 4001a850 4001a8cc: b0 10 20 00 clr %i0 <== NOT EXECUTED return 0; info->indirect = p; 4001a8d0: d0 26 20 50 st %o0, [ %i0 + 0x50 ] } return &info->indirect[ my_block ]; 4001a8d4: c4 06 20 50 ld [ %i0 + 0x50 ], %g2 4001a8d8: 10 80 00 7f b 4001aad4 4001a8dc: 83 2e 60 02 sll %i1, 2, %g1 } if ( !p ) return 0; return &info->indirect[ my_block ]; 4001a8e0: 83 2e 60 02 sll %i1, 2, %g1 info->indirect = p; } return &info->indirect[ my_block ]; } if ( !p ) 4001a8e4: 80 a4 20 00 cmp %l0, 0 return 0; return &info->indirect[ my_block ]; 4001a8e8: 10 80 00 32 b 4001a9b0 4001a8ec: b0 04 00 01 add %l0, %g1, %i0 /* * Is the block number in the doubly indirect portion? */ if ( my_block <= LAST_DOUBLY_INDIRECT ) { 4001a8f0: 7f ff a1 c2 call 40002ff8 <.umul> <== NOT EXECUTED 4001a8f4: 92 10 00 11 mov %l1, %o1 <== NOT EXECUTED 4001a8f8: 82 02 3f ff add %o0, -1, %g1 <== NOT EXECUTED 4001a8fc: 80 a6 40 01 cmp %i1, %g1 <== NOT EXECUTED 4001a900: 18 80 00 30 bgu 4001a9c0 <== NOT EXECUTED 4001a904: a0 10 00 08 mov %o0, %l0 <== NOT EXECUTED #if 0 fprintf(stdout, "(d %d) ", block ); fflush(stdout); #endif my_block -= FIRST_DOUBLY_INDIRECT; 4001a908: a0 26 40 11 sub %i1, %l1, %l0 <== NOT EXECUTED singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; 4001a90c: 92 10 00 11 mov %l1, %o1 <== NOT EXECUTED 4001a910: 40 00 61 a8 call 40032fb0 <.urem> <== NOT EXECUTED 4001a914: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; 4001a918: 92 10 00 11 mov %l1, %o1 <== NOT EXECUTED fflush(stdout); #endif my_block -= FIRST_DOUBLY_INDIRECT; singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; 4001a91c: a4 10 00 08 mov %o0, %l2 <== NOT EXECUTED doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; 4001a920: 40 00 60 f8 call 40032d00 <.udiv> <== NOT EXECUTED 4001a924: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED p = info->doubly_indirect; if ( malloc_it ) { 4001a928: 80 a6 a0 00 cmp %i2, 0 <== NOT EXECUTED #endif my_block -= FIRST_DOUBLY_INDIRECT; singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; 4001a92c: a2 10 00 08 mov %o0, %l1 <== NOT EXECUTED p = info->doubly_indirect; if ( malloc_it ) { 4001a930: 02 80 00 18 be 4001a990 <== NOT EXECUTED 4001a934: e0 06 20 54 ld [ %i0 + 0x54 ], %l0 <== NOT EXECUTED if ( !p ) { 4001a938: 80 a4 20 00 cmp %l0, 0 <== NOT EXECUTED 4001a93c: 32 80 00 09 bne,a 4001a960 <== NOT EXECUTED 4001a940: a3 2c 60 02 sll %l1, 2, %l1 <== NOT EXECUTED p = memfile_alloc_block(); 4001a944: 7f ff ff ac call 4001a7f4 <== NOT EXECUTED 4001a948: 01 00 00 00 nop <== NOT EXECUTED if ( !p ) 4001a94c: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 4001a950: 02 80 00 63 be 4001aadc <== NOT EXECUTED 4001a954: a0 10 00 08 mov %o0, %l0 <== NOT EXECUTED return 0; info->doubly_indirect = p; 4001a958: d0 26 20 54 st %o0, [ %i0 + 0x54 ] <== NOT EXECUTED } p1 = (block_p *)p[ doubly ]; 4001a95c: a3 2c 60 02 sll %l1, 2, %l1 <== NOT EXECUTED 4001a960: c2 04 00 11 ld [ %l0 + %l1 ], %g1 <== NOT EXECUTED if ( !p1 ) { 4001a964: 90 90 60 00 orcc %g1, 0, %o0 <== NOT EXECUTED 4001a968: 12 80 00 4f bne 4001aaa4 <== NOT EXECUTED 4001a96c: 83 2c a0 02 sll %l2, 2, %g1 <== NOT EXECUTED p1 = memfile_alloc_block(); 4001a970: 7f ff ff a1 call 4001a7f4 <== NOT EXECUTED 4001a974: 01 00 00 00 nop <== NOT EXECUTED if ( !p1 ) 4001a978: 82 92 20 00 orcc %o0, 0, %g1 <== NOT EXECUTED 4001a97c: 02 80 00 58 be 4001aadc <== NOT EXECUTED 4001a980: 90 10 00 01 mov %g1, %o0 <== NOT EXECUTED return 0; p[ doubly ] = (block_p) p1; 4001a984: c2 24 00 11 st %g1, [ %l0 + %l1 ] <== NOT EXECUTED } return (block_p *)&p1[ singly ]; 4001a988: 10 80 00 47 b 4001aaa4 <== NOT EXECUTED 4001a98c: 83 2c a0 02 sll %l2, 2, %g1 <== NOT EXECUTED } if ( !p ) 4001a990: 80 a4 20 00 cmp %l0, 0 <== NOT EXECUTED 4001a994: 02 bf ff af be 4001a850 <== NOT EXECUTED 4001a998: b0 10 20 00 clr %i0 <== NOT EXECUTED return 0; p = (block_p *)p[ doubly ]; 4001a99c: 83 2a 20 02 sll %o0, 2, %g1 <== NOT EXECUTED 4001a9a0: c2 04 00 01 ld [ %l0 + %g1 ], %g1 <== NOT EXECUTED #if 0 fprintf(stdout, "(d %d %d %d %d %p %p) ", block, my_block, doubly, singly, p, &p[singly] ); fflush(stdout); #endif return (block_p *)&p[ singly ]; 4001a9a4: 85 2c a0 02 sll %l2, 2, %g2 <== NOT EXECUTED if ( !p ) return 0; p = (block_p *)p[ doubly ]; if ( !p ) 4001a9a8: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED #if 0 fprintf(stdout, "(d %d %d %d %d %p %p) ", block, my_block, doubly, singly, p, &p[singly] ); fflush(stdout); #endif return (block_p *)&p[ singly ]; 4001a9ac: b0 00 40 02 add %g1, %g2, %i0 <== NOT EXECUTED if ( !p ) return 0; p = (block_p *)p[ doubly ]; if ( !p ) 4001a9b0: 12 80 00 4c bne 4001aae0 4001a9b4: 01 00 00 00 nop p2 = (block_p *)p1[ doubly ]; if ( !p ) return 0; return (block_p *)&p2[ singly ]; 4001a9b8: 81 c7 e0 08 ret <== NOT EXECUTED 4001a9bc: 91 e8 20 00 restore %g0, 0, %o0 <== NOT EXECUTED #endif /* * Is the block number in the triply indirect portion? */ if ( my_block <= LAST_TRIPLY_INDIRECT ) { 4001a9c0: 90 02 20 01 inc %o0 <== NOT EXECUTED 4001a9c4: 7f ff a1 8d call 40002ff8 <.umul> <== NOT EXECUTED 4001a9c8: 92 10 00 11 mov %l1, %o1 <== NOT EXECUTED 4001a9cc: 90 02 3f ff add %o0, -1, %o0 <== NOT EXECUTED 4001a9d0: 80 a6 40 08 cmp %i1, %o0 <== NOT EXECUTED 4001a9d4: 18 80 00 42 bgu 4001aadc <== NOT EXECUTED 4001a9d8: a0 26 40 10 sub %i1, %l0, %l0 <== NOT EXECUTED my_block -= FIRST_TRIPLY_INDIRECT; singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; 4001a9dc: 92 10 00 11 mov %l1, %o1 <== NOT EXECUTED 4001a9e0: 40 00 61 74 call 40032fb0 <.urem> <== NOT EXECUTED 4001a9e4: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; 4001a9e8: 92 10 00 11 mov %l1, %o1 <== NOT EXECUTED */ if ( my_block <= LAST_TRIPLY_INDIRECT ) { my_block -= FIRST_TRIPLY_INDIRECT; singly = my_block % IMFS_MEMFILE_BLOCK_SLOTS; 4001a9ec: a6 10 00 08 mov %o0, %l3 <== NOT EXECUTED doubly = my_block / IMFS_MEMFILE_BLOCK_SLOTS; 4001a9f0: 40 00 60 c4 call 40032d00 <.udiv> <== NOT EXECUTED 4001a9f4: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED triply = doubly / IMFS_MEMFILE_BLOCK_SLOTS; 4001a9f8: 92 10 00 11 mov %l1, %o1 <== NOT EXECUTED 4001a9fc: 40 00 60 c1 call 40032d00 <.udiv> <== NOT EXECUTED 4001aa00: a0 10 00 08 mov %o0, %l0 <== NOT EXECUTED doubly %= IMFS_MEMFILE_BLOCK_SLOTS; 4001aa04: 92 10 00 11 mov %l1, %o1 <== NOT EXECUTED 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; 4001aa08: b2 10 00 08 mov %o0, %i1 <== NOT EXECUTED doubly %= IMFS_MEMFILE_BLOCK_SLOTS; 4001aa0c: 40 00 61 69 call 40032fb0 <.urem> <== NOT EXECUTED 4001aa10: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED p = info->triply_indirect; if ( malloc_it ) { 4001aa14: 80 a6 a0 00 cmp %i2, 0 <== NOT EXECUTED 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; doubly %= IMFS_MEMFILE_BLOCK_SLOTS; 4001aa18: a4 10 00 08 mov %o0, %l2 <== NOT EXECUTED p = info->triply_indirect; if ( malloc_it ) { 4001aa1c: 02 80 00 24 be 4001aaac <== NOT EXECUTED 4001aa20: e0 06 20 58 ld [ %i0 + 0x58 ], %l0 <== NOT EXECUTED if ( !p ) { 4001aa24: 80 a4 20 00 cmp %l0, 0 <== NOT EXECUTED 4001aa28: 12 80 00 09 bne 4001aa4c <== NOT EXECUTED 4001aa2c: b5 2e 60 02 sll %i1, 2, %i2 <== NOT EXECUTED p = memfile_alloc_block(); 4001aa30: 7f ff ff 71 call 4001a7f4 <== NOT EXECUTED 4001aa34: 01 00 00 00 nop <== NOT EXECUTED if ( !p ) 4001aa38: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 4001aa3c: 02 80 00 28 be 4001aadc <== NOT EXECUTED 4001aa40: a0 10 00 08 mov %o0, %l0 <== NOT EXECUTED return 0; info->triply_indirect = p; 4001aa44: d0 26 20 58 st %o0, [ %i0 + 0x58 ] <== NOT EXECUTED } p1 = (block_p *) p[ triply ]; 4001aa48: b5 2e 60 02 sll %i1, 2, %i2 <== NOT EXECUTED 4001aa4c: c2 04 00 1a ld [ %l0 + %i2 ], %g1 <== NOT EXECUTED if ( !p1 ) { 4001aa50: a2 90 60 00 orcc %g1, 0, %l1 <== NOT EXECUTED 4001aa54: 32 80 00 09 bne,a 4001aa78 <== NOT EXECUTED 4001aa58: a1 2c a0 02 sll %l2, 2, %l0 <== NOT EXECUTED p1 = memfile_alloc_block(); 4001aa5c: 7f ff ff 66 call 4001a7f4 <== NOT EXECUTED 4001aa60: 01 00 00 00 nop <== NOT EXECUTED if ( !p1 ) 4001aa64: 82 92 20 00 orcc %o0, 0, %g1 <== NOT EXECUTED 4001aa68: 02 80 00 1d be 4001aadc <== NOT EXECUTED 4001aa6c: a2 10 00 01 mov %g1, %l1 <== NOT EXECUTED return 0; p[ triply ] = (block_p) p1; 4001aa70: c2 24 00 1a st %g1, [ %l0 + %i2 ] <== NOT EXECUTED } p2 = (block_p *)p1[ doubly ]; 4001aa74: a1 2c a0 02 sll %l2, 2, %l0 <== NOT EXECUTED 4001aa78: c2 04 40 10 ld [ %l1 + %l0 ], %g1 <== NOT EXECUTED if ( !p2 ) { 4001aa7c: 90 90 60 00 orcc %g1, 0, %o0 <== NOT EXECUTED 4001aa80: 12 80 00 09 bne 4001aaa4 <== NOT EXECUTED 4001aa84: 83 2c e0 02 sll %l3, 2, %g1 <== NOT EXECUTED p2 = memfile_alloc_block(); 4001aa88: 7f ff ff 5b call 4001a7f4 <== NOT EXECUTED 4001aa8c: 01 00 00 00 nop <== NOT EXECUTED if ( !p2 ) 4001aa90: 82 92 20 00 orcc %o0, 0, %g1 <== NOT EXECUTED 4001aa94: 02 80 00 12 be 4001aadc <== NOT EXECUTED 4001aa98: 90 10 00 01 mov %g1, %o0 <== NOT EXECUTED return 0; p1[ doubly ] = (block_p) p2; 4001aa9c: c2 24 40 10 st %g1, [ %l1 + %l0 ] <== NOT EXECUTED } return (block_p *)&p2[ singly ]; 4001aaa0: 83 2c e0 02 sll %l3, 2, %g1 <== NOT EXECUTED 4001aaa4: 81 c7 e0 08 ret <== NOT EXECUTED 4001aaa8: 91 ea 00 01 restore %o0, %g1, %o0 <== NOT EXECUTED } if ( !p ) 4001aaac: 80 a4 20 00 cmp %l0, 0 <== NOT EXECUTED 4001aab0: 02 bf ff 68 be 4001a850 <== NOT EXECUTED 4001aab4: b0 10 20 00 clr %i0 <== NOT EXECUTED #if 0 fprintf(stdout, "(t %d %d %d %d %d) ", block, my_block, triply, doubly, singly ); fflush(stdout); #endif p1 = (block_p *) p[ triply ]; 4001aab8: 83 2e 60 02 sll %i1, 2, %g1 <== NOT EXECUTED 4001aabc: d0 04 00 01 ld [ %l0 + %g1 ], %o0 <== NOT EXECUTED if ( !p1 ) 4001aac0: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 4001aac4: 02 bf ff 63 be 4001a850 <== NOT EXECUTED 4001aac8: 83 2c a0 02 sll %l2, 2, %g1 <== NOT EXECUTED p2 = (block_p *)p1[ doubly ]; if ( !p ) return 0; return (block_p *)&p2[ singly ]; 4001aacc: c4 02 00 01 ld [ %o0 + %g1 ], %g2 <== NOT EXECUTED 4001aad0: 83 2c e0 02 sll %l3, 2, %g1 <== NOT EXECUTED 4001aad4: 81 c7 e0 08 ret 4001aad8: 91 e8 40 02 restore %g1, %g2, %o0 4001aadc: b0 10 20 00 clr %i0 <== NOT EXECUTED /* * This means the requested block number is out of range. */ return 0; } 4001aae0: 81 c7 e0 08 ret 4001aae4: 81 e8 00 00 restore 4001b408 : IMFS_jnode_t *the_jnode, off_t start, unsigned char *destination, unsigned int length ) { 4001b408: 9d e3 bf 90 save %sp, -112, %sp /* * Perform internal consistency checks */ assert( the_jnode ); 4001b40c: a8 96 20 00 orcc %i0, 0, %l4 4001b410: 32 80 00 09 bne,a 4001b434 4001b414: c2 05 20 48 ld [ %l4 + 0x48 ], %g1 4001b418: 92 10 22 4a mov 0x24a, %o1 <== NOT EXECUTED 4001b41c: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED 4001b420: 15 10 00 da sethi %hi(0x40036800), %o2 <== NOT EXECUTED 4001b424: 90 12 22 10 or %o0, 0x210, %o0 <== NOT EXECUTED 4001b428: 7f ff a9 53 call 40005974 <__assert> <== NOT EXECUTED 4001b42c: 94 12 a2 60 or %o2, 0x260, %o2 <== NOT EXECUTED 4001b430: 30 80 00 0f b,a 4001b46c <== NOT EXECUTED if ( !the_jnode ) rtems_set_errno_and_return_minus_one( EIO ); assert( the_jnode->type == IMFS_MEMORY_FILE || 4001b434: 82 00 7f fb add %g1, -5, %g1 4001b438: 80 a0 60 01 cmp %g1, 1 4001b43c: 08 80 00 07 bleu 4001b458 4001b440: 11 10 00 da sethi %hi(0x40036800), %o0 4001b444: 15 10 00 da sethi %hi(0x40036800), %o2 <== NOT EXECUTED 4001b448: 90 12 22 10 or %o0, 0x210, %o0 <== NOT EXECUTED 4001b44c: 94 12 a2 c0 or %o2, 0x2c0, %o2 <== NOT EXECUTED 4001b450: 7f ff a9 49 call 40005974 <__assert> <== NOT EXECUTED 4001b454: 92 10 22 4f mov 0x24f, %o1 <== NOT EXECUTED the_jnode->type == IMFS_LINEAR_FILE ); if ( the_jnode->type != IMFS_MEMORY_FILE && 4001b458: c4 05 20 48 ld [ %l4 + 0x48 ], %g2 4001b45c: 82 00 bf fb add %g2, -5, %g1 4001b460: 80 a0 60 01 cmp %g1, 1 4001b464: 08 80 00 06 bleu 4001b47c 4001b468: 80 a6 a0 00 cmp %i2, 0 the_jnode->type != IMFS_LINEAR_FILE ) rtems_set_errno_and_return_minus_one( EIO ); 4001b46c: 40 00 21 48 call 4002398c <__errno> <== NOT EXECUTED 4001b470: 01 00 00 00 nop <== NOT EXECUTED 4001b474: 10 80 00 0d b 4001b4a8 <== NOT EXECUTED 4001b478: 82 10 20 05 mov 5, %g1 ! 5 <== NOT EXECUTED /* * Error checks on arguments */ assert( dest ); 4001b47c: 12 80 00 0e bne 4001b4b4 4001b480: 80 a6 e0 00 cmp %i3, 0 4001b484: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED 4001b488: 15 10 00 da sethi %hi(0x40036800), %o2 <== NOT EXECUTED 4001b48c: 92 10 22 58 mov 0x258, %o1 <== NOT EXECUTED 4001b490: 90 12 22 10 or %o0, 0x210, %o0 <== NOT EXECUTED 4001b494: 7f ff a9 38 call 40005974 <__assert> <== NOT EXECUTED 4001b498: 94 12 a3 10 or %o2, 0x310, %o2 <== NOT EXECUTED if ( !dest ) rtems_set_errno_and_return_minus_one( EINVAL ); 4001b49c: 40 00 21 3c call 4002398c <__errno> <== NOT EXECUTED 4001b4a0: 01 00 00 00 nop <== NOT EXECUTED 4001b4a4: 82 10 20 16 mov 0x16, %g1 ! 16 <== NOT EXECUTED 4001b4a8: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 4001b4ac: 10 80 00 74 b 4001b67c <== NOT EXECUTED 4001b4b0: 94 10 3f ff mov -1, %o2 <== NOT EXECUTED /* * If there is nothing to read, then quick exit. */ my_length = length; if ( !my_length ) 4001b4b4: 02 bf ff fa be 4001b49c 4001b4b8: 80 a0 a0 06 cmp %g2, 6 /* * Linear files (as created from a tar file are easier to handle * than block files). */ if (the_jnode->type == IMFS_LINEAR_FILE) { 4001b4bc: 32 80 00 0d bne,a 4001b4f0 4001b4c0: c4 05 20 4c ld [ %l4 + 0x4c ], %g2 unsigned char *file_ptr; file_ptr = (unsigned char *)the_jnode->info.linearfile.direct; if (my_length > (the_jnode->info.linearfile.size - start)) 4001b4c4: c2 05 20 4c ld [ %l4 + 0x4c ], %g1 <== NOT EXECUTED 4001b4c8: b0 10 00 1b mov %i3, %i0 <== NOT EXECUTED 4001b4cc: 82 20 40 19 sub %g1, %i1, %g1 <== NOT EXECUTED 4001b4d0: 80 a6 c0 01 cmp %i3, %g1 <== NOT EXECUTED 4001b4d4: 08 80 00 03 bleu 4001b4e0 <== NOT EXECUTED 4001b4d8: d2 05 20 50 ld [ %l4 + 0x50 ], %o1 <== NOT EXECUTED my_length = the_jnode->info.linearfile.size - start; 4001b4dc: b0 10 00 01 mov %g1, %i0 <== NOT EXECUTED memcpy(dest, &file_ptr[start], my_length); 4001b4e0: 92 02 40 19 add %o1, %i1, %o1 <== NOT EXECUTED 4001b4e4: 90 10 00 1a mov %i2, %o0 <== NOT EXECUTED 4001b4e8: 10 80 00 5d b 4001b65c <== NOT EXECUTED 4001b4ec: 94 10 00 18 mov %i0, %o2 <== 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 ) 4001b4f0: 82 06 c0 19 add %i3, %i1, %g1 4001b4f4: 80 a0 40 02 cmp %g1, %g2 4001b4f8: 08 80 00 03 bleu 4001b504 4001b4fc: a0 10 00 1b mov %i3, %l0 my_length = the_jnode->info.file.size - start; 4001b500: a0 20 80 19 sub %g2, %i1, %l0 /* * Phase 1: possibly the last part of one block */ start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK; 4001b504: 03 10 00 ec sethi %hi(0x4003b000), %g1 4001b508: e2 00 62 a8 ld [ %g1 + 0x2a8 ], %l1 ! 4003b2a8 4001b50c: 90 10 00 19 mov %i1, %o0 4001b510: 40 00 5e aa call 40032fb8 <.rem> 4001b514: 92 10 00 11 mov %l1, %o1 block = start / IMFS_MEMFILE_BYTES_PER_BLOCK; 4001b518: 92 10 00 11 mov %l1, %o1 /* * Phase 1: possibly the last part of one block */ start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK; 4001b51c: a4 10 00 08 mov %o0, %l2 block = start / IMFS_MEMFILE_BYTES_PER_BLOCK; 4001b520: 40 00 5d fa call 40032d08 <.div> 4001b524: 90 10 00 19 mov %i1, %o0 if ( start_offset ) { 4001b528: 80 a4 a0 00 cmp %l2, 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; 4001b52c: b2 10 00 08 mov %o0, %i1 if ( start_offset ) { 4001b530: a6 10 00 1a mov %i2, %l3 4001b534: 02 80 00 1d be 4001b5a8 4001b538: b0 10 20 00 clr %i0 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 ); 4001b53c: 90 10 00 14 mov %l4, %o0 4001b540: 92 10 00 19 mov %i1, %o1 4001b544: 7f ff fc b9 call 4001a828 4001b548: 94 10 20 00 clr %o2 assert( block_ptr ); 4001b54c: 80 a2 20 00 cmp %o0, 0 4001b550: 12 80 00 0a bne 4001b578 4001b554: 92 24 40 12 sub %l1, %l2, %o1 4001b558: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED 4001b55c: 92 10 22 94 mov 0x294, %o1 <== NOT EXECUTED 4001b560: 90 12 22 10 or %o0, 0x210, %o0 <== NOT EXECUTED 4001b564: 15 10 00 da sethi %hi(0x40036800), %o2 <== NOT EXECUTED 4001b568: 7f ff a9 03 call 40005974 <__assert> <== NOT EXECUTED 4001b56c: 94 12 a2 b0 or %o2, 0x2b0, %o2 ! 40036ab0 <_POSIX_Threads_Default_attributes+0xd8> <== NOT EXECUTED 4001b570: 10 80 00 43 b 4001b67c <== NOT EXECUTED 4001b574: 94 10 20 00 clr %o2 <== NOT EXECUTED */ 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; 4001b578: 80 a4 00 09 cmp %l0, %o1 4001b57c: 08 80 00 03 bleu 4001b588 4001b580: 94 10 00 10 mov %l0, %o2 4001b584: 94 10 00 09 mov %o1, %o2 to_copy = my_length; block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); assert( block_ptr ); if ( !block_ptr ) return copied; memcpy( dest, &(*block_ptr)[ start_offset ], to_copy ); 4001b588: d2 02 00 00 ld [ %o0 ], %o1 dest += to_copy; 4001b58c: a6 06 80 0a add %i2, %o2, %l3 to_copy = my_length; block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); assert( block_ptr ); if ( !block_ptr ) return copied; memcpy( dest, &(*block_ptr)[ start_offset ], to_copy ); 4001b590: 92 04 80 09 add %l2, %o1, %o1 dest += to_copy; block++; 4001b594: b2 06 60 01 inc %i1 my_length -= to_copy; 4001b598: a0 24 00 0a sub %l0, %o2, %l0 4001b59c: b0 10 00 0a mov %o2, %i0 to_copy = my_length; block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); assert( block_ptr ); if ( !block_ptr ) return copied; memcpy( dest, &(*block_ptr)[ start_offset ], to_copy ); 4001b5a0: 40 00 27 af call 4002545c 4001b5a4: 90 10 00 1a mov %i2, %o0 /* * Phase 2: all of zero of more blocks */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; 4001b5a8: 03 10 00 ec sethi %hi(0x4003b000), %g1 4001b5ac: f4 00 62 a8 ld [ %g1 + 0x2a8 ], %i2 ! 4003b2a8 while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { 4001b5b0: 10 80 00 12 b 4001b5f8 4001b5b4: a2 10 00 01 mov %g1, %l1 block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); 4001b5b8: 7f ff fc 9c call 4001a828 4001b5bc: 01 00 00 00 nop assert( block_ptr ); 4001b5c0: 80 a2 20 00 cmp %o0, 0 4001b5c4: 32 80 00 06 bne,a 4001b5dc 4001b5c8: d2 02 00 00 ld [ %o0 ], %o1 4001b5cc: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED 4001b5d0: 92 10 22 a5 mov 0x2a5, %o1 <== NOT EXECUTED 4001b5d4: 10 80 00 1a b 4001b63c <== NOT EXECUTED 4001b5d8: 90 12 22 10 or %o0, 0x210, %o0 <== NOT EXECUTED if ( !block_ptr ) return copied; memcpy( dest, &(*block_ptr)[ 0 ], to_copy ); dest += to_copy; block++; 4001b5dc: b2 06 60 01 inc %i1 while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); assert( block_ptr ); if ( !block_ptr ) return copied; memcpy( dest, &(*block_ptr)[ 0 ], to_copy ); 4001b5e0: 90 10 00 13 mov %l3, %o0 dest += to_copy; block++; my_length -= to_copy; 4001b5e4: a0 24 00 1a sub %l0, %i2, %l0 copied += to_copy; 4001b5e8: b0 06 00 1a add %i0, %i2, %i0 while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); assert( block_ptr ); if ( !block_ptr ) return copied; memcpy( dest, &(*block_ptr)[ 0 ], to_copy ); 4001b5ec: a6 04 c0 1a add %l3, %i2, %l3 4001b5f0: 40 00 27 9b call 4002545c 4001b5f4: 94 10 00 1a mov %i2, %o2 /* * Phase 2: all of zero of more blocks */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { 4001b5f8: c2 04 62 a8 ld [ %l1 + 0x2a8 ], %g1 block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); 4001b5fc: 92 10 00 19 mov %i1, %o1 4001b600: 94 10 20 00 clr %o2 /* * Phase 2: all of zero of more blocks */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { 4001b604: 80 a4 00 01 cmp %l0, %g1 4001b608: 1a bf ff ec bcc 4001b5b8 4001b60c: 90 10 00 14 mov %l4, %o0 * Phase 3: possibly the first part of one block */ assert( my_length < IMFS_MEMFILE_BYTES_PER_BLOCK ); if ( my_length ) { 4001b610: 80 a4 20 00 cmp %l0, 0 4001b614: 22 80 00 15 be,a 4001b668 4001b618: 90 07 bf f0 add %fp, -16, %o0 block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); 4001b61c: 7f ff fc 83 call 4001a828 4001b620: 01 00 00 00 nop assert( block_ptr ); 4001b624: 80 a2 20 00 cmp %o0, 0 4001b628: 32 80 00 0a bne,a 4001b650 4001b62c: d2 02 00 00 ld [ %o0 ], %o1 4001b630: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED 4001b634: 92 10 22 b7 mov 0x2b7, %o1 <== NOT EXECUTED 4001b638: 90 12 22 10 or %o0, 0x210, %o0 <== NOT EXECUTED 4001b63c: 15 10 00 da sethi %hi(0x40036800), %o2 <== NOT EXECUTED 4001b640: 7f ff a8 cd call 40005974 <__assert> <== NOT EXECUTED 4001b644: 94 12 a2 b0 or %o2, 0x2b0, %o2 ! 40036ab0 <_POSIX_Threads_Default_attributes+0xd8> <== NOT EXECUTED if ( !block_ptr ) return copied; 4001b648: 10 80 00 0d b 4001b67c <== NOT EXECUTED 4001b64c: 94 10 00 18 mov %i0, %o2 <== NOT EXECUTED memcpy( dest, &(*block_ptr)[ 0 ], my_length ); copied += my_length; 4001b650: b0 06 00 10 add %i0, %l0, %i0 if ( my_length ) { block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); assert( block_ptr ); if ( !block_ptr ) return copied; memcpy( dest, &(*block_ptr)[ 0 ], my_length ); 4001b654: 90 10 00 13 mov %l3, %o0 4001b658: 94 10 00 10 mov %l0, %o2 4001b65c: 40 00 27 80 call 4002545c 4001b660: 01 00 00 00 nop copied += my_length; } IMFS_update_atime( the_jnode ); 4001b664: 90 07 bf f0 add %fp, -16, %o0 4001b668: 7f ff a9 7e call 40005c60 4001b66c: 92 10 20 00 clr %o1 4001b670: c2 07 bf f0 ld [ %fp + -16 ], %g1 return copied; 4001b674: 94 10 00 18 mov %i0, %o2 return copied; memcpy( dest, &(*block_ptr)[ 0 ], my_length ); copied += my_length; } IMFS_update_atime( the_jnode ); 4001b678: c2 25 20 3c st %g1, [ %l4 + 0x3c ] return copied; } 4001b67c: 81 c7 e0 08 ret 4001b680: 91 e8 00 0a restore %g0, %o2, %o0 4001ab88 : */ int IMFS_memfile_remove( IMFS_jnode_t *the_jnode ) { 4001ab88: 9d e3 bf 98 save %sp, -104, %sp /* * Perform internal consistency checks */ assert( the_jnode ); 4001ab8c: 80 a6 20 00 cmp %i0, 0 4001ab90: 32 80 00 09 bne,a 4001abb4 4001ab94: c2 06 20 48 ld [ %i0 + 0x48 ], %g1 4001ab98: 92 10 21 ec mov 0x1ec, %o1 <== NOT EXECUTED 4001ab9c: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED 4001aba0: 15 10 00 da sethi %hi(0x40036800), %o2 <== NOT EXECUTED 4001aba4: 90 12 22 10 or %o0, 0x210, %o0 <== NOT EXECUTED 4001aba8: 7f ff ab 73 call 40005974 <__assert> <== NOT EXECUTED 4001abac: 94 12 a2 60 or %o2, 0x260, %o2 <== NOT EXECUTED 4001abb0: 30 80 00 0d b,a 4001abe4 <== NOT EXECUTED if ( !the_jnode ) rtems_set_errno_and_return_minus_one( EIO ); assert( the_jnode->type == IMFS_MEMORY_FILE ); 4001abb4: 80 a0 60 05 cmp %g1, 5 4001abb8: 02 80 00 07 be 4001abd4 4001abbc: 11 10 00 da sethi %hi(0x40036800), %o0 4001abc0: 15 10 00 da sethi %hi(0x40036800), %o2 <== NOT EXECUTED 4001abc4: 90 12 22 10 or %o0, 0x210, %o0 <== NOT EXECUTED 4001abc8: 94 12 a2 70 or %o2, 0x270, %o2 <== NOT EXECUTED 4001abcc: 7f ff ab 6a call 40005974 <__assert> <== NOT EXECUTED 4001abd0: 92 10 21 f0 mov 0x1f0, %o1 <== NOT EXECUTED if ( the_jnode->type != IMFS_MEMORY_FILE ) 4001abd4: c2 06 20 48 ld [ %i0 + 0x48 ], %g1 4001abd8: 80 a0 60 05 cmp %g1, 5 4001abdc: 22 80 00 08 be,a 4001abfc 4001abe0: 21 10 00 ec sethi %hi(0x4003b000), %l0 rtems_set_errno_and_return_minus_one( EIO ); 4001abe4: 40 00 23 6a call 4002398c <__errno> <== NOT EXECUTED 4001abe8: 01 00 00 00 nop <== NOT EXECUTED 4001abec: 82 10 20 05 mov 5, %g1 ! 5 <== NOT EXECUTED 4001abf0: 84 10 3f ff mov -1, %g2 <== NOT EXECUTED 4001abf4: 10 80 00 4b b 4001ad20 <== NOT EXECUTED 4001abf8: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED * + triply indirect */ info = &the_jnode->info.file; if ( info->indirect ) { 4001abfc: c2 06 20 50 ld [ %i0 + 0x50 ], %g1 /* * 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; 4001ac00: c4 04 22 a8 ld [ %l0 + 0x2a8 ], %g2 * + triply indirect */ info = &the_jnode->info.file; if ( info->indirect ) { 4001ac04: 80 a0 60 00 cmp %g1, 0 4001ac08: 02 80 00 05 be 4001ac1c 4001ac0c: a5 30 a0 02 srl %g2, 2, %l2 memfile_free_blocks_in_table( &info->indirect, to_free ); 4001ac10: 90 06 20 50 add %i0, 0x50, %o0 4001ac14: 7f ff ff c1 call 4001ab18 4001ac18: 92 10 00 12 mov %l2, %o1 } if ( info->doubly_indirect ) { 4001ac1c: c2 06 20 54 ld [ %i0 + 0x54 ], %g1 for ( i=0 ; iindirect ) { memfile_free_blocks_in_table( &info->indirect, to_free ); } if ( info->doubly_indirect ) { 4001ac24: 80 a0 60 00 cmp %g1, 0 4001ac28: 12 80 00 0c bne 4001ac58 4001ac2c: a0 10 20 00 clr %l0 } memfile_free_blocks_in_table( &info->doubly_indirect, to_free ); } if ( info->triply_indirect ) { 4001ac30: 10 80 00 13 b 4001ac7c 4001ac34: c2 06 20 58 ld [ %i0 + 0x58 ], %g1 } if ( info->doubly_indirect ) { for ( i=0 ; idoubly_indirect[i] ) { 4001ac38: c2 06 20 54 ld [ %i0 + 0x54 ], %g1 <== NOT EXECUTED memfile_free_blocks_in_table( &info->indirect, to_free ); } if ( info->doubly_indirect ) { for ( i=0 ; idoubly_indirect[i] ) { 4001ac40: c4 02 00 01 ld [ %o0 + %g1 ], %g2 <== NOT EXECUTED 4001ac44: 80 a0 a0 00 cmp %g2, 0 <== NOT EXECUTED 4001ac48: 02 80 00 04 be 4001ac58 <== NOT EXECUTED 4001ac4c: 90 02 00 01 add %o0, %g1, %o0 <== NOT EXECUTED memfile_free_blocks_in_table( 4001ac50: 7f ff ff b2 call 4001ab18 <== NOT EXECUTED 4001ac54: 92 10 00 12 mov %l2, %o1 <== NOT EXECUTED memfile_free_blocks_in_table( &info->indirect, to_free ); } if ( info->doubly_indirect ) { for ( i=0 ; i <== NOT EXECUTED 4001ac68: 91 2c 20 02 sll %l0, 2, %o0 <== NOT EXECUTED 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 ); 4001ac6c: 90 06 20 54 add %i0, 0x54, %o0 <== NOT EXECUTED 4001ac70: 7f ff ff aa call 4001ab18 <== NOT EXECUTED 4001ac74: 92 10 00 12 mov %l2, %o1 <== NOT EXECUTED } if ( info->triply_indirect ) { 4001ac78: c2 06 20 58 ld [ %i0 + 0x58 ], %g1 <== NOT EXECUTED 4001ac7c: 84 10 20 00 clr %g2 4001ac80: 80 a0 60 00 cmp %g1, 0 4001ac84: a6 10 20 00 clr %l3 4001ac88: 12 80 00 1d bne 4001acfc 4001ac8c: 2b 10 00 ec sethi %hi(0x4003b000), %l5 memfile_free_blocks_in_table( (block_p **)&info->triply_indirect, to_free ); } return 0; } 4001ac90: 81 c7 e0 08 ret 4001ac94: 91 e8 00 02 restore %g0, %g2, %o0 } memfile_free_blocks_in_table( &info->doubly_indirect, to_free ); } if ( info->triply_indirect ) { 4001ac98: a9 2c e0 02 sll %l3, 2, %l4 <== NOT EXECUTED for ( i=0 ; itriply_indirect[i]; 4001ac9c: d0 00 40 14 ld [ %g1 + %l4 ], %o0 <== NOT EXECUTED if ( !p ) /* ensure we have a valid pointer */ 4001aca0: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 4001aca4: 22 80 00 1c be,a 4001ad14 <== NOT EXECUTED 4001aca8: 90 06 20 58 add %i0, 0x58, %o0 <== NOT EXECUTED break; 4001acac: a0 10 00 08 mov %o0, %l0 <== NOT EXECUTED 4001acb0: 10 80 00 09 b 4001acd4 <== NOT EXECUTED 4001acb4: a2 10 20 00 clr %l1 <== NOT EXECUTED for ( j=0 ; j <== NOT EXECUTED 4001acc4: a2 04 60 01 inc %l1 <== NOT EXECUTED memfile_free_blocks_in_table( (block_p **)&p[j], to_free); 4001acc8: 7f ff ff 94 call 4001ab18 <== NOT EXECUTED 4001accc: 92 10 00 12 mov %l2, %o1 <== NOT EXECUTED if ( info->triply_indirect ) { for ( i=0 ; itriply_indirect[i]; if ( !p ) /* ensure we have a valid pointer */ break; for ( j=0 ; j <== NOT EXECUTED 4001ace4: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED if ( p[j] ) { memfile_free_blocks_in_table( (block_p **)&p[j], to_free); } } memfile_free_blocks_in_table( 4001ace8: d0 06 20 58 ld [ %i0 + 0x58 ], %o0 <== NOT EXECUTED memfile_free_blocks_in_table( &info->doubly_indirect, to_free ); } if ( info->triply_indirect ) { for ( i=0 ; i <== NOT EXECUTED 4001acf8: 92 10 00 12 mov %l2, %o1 <== NOT EXECUTED memfile_free_blocks_in_table( &info->doubly_indirect, to_free ); } if ( info->triply_indirect ) { for ( i=0 ; i <== NOT EXECUTED 4001ad0c: c2 06 20 58 ld [ %i0 + 0x58 ], %g1 <== NOT EXECUTED } } memfile_free_blocks_in_table( (block_p **)&info->triply_indirect[i], to_free ); } memfile_free_blocks_in_table( 4001ad10: 90 06 20 58 add %i0, 0x58, %o0 <== NOT EXECUTED 4001ad14: 7f ff ff 81 call 4001ab18 <== NOT EXECUTED 4001ad18: 92 10 00 12 mov %l2, %o1 <== NOT EXECUTED 4001ad1c: 84 10 20 00 clr %g2 <== NOT EXECUTED (block_p **)&info->triply_indirect, to_free ); } return 0; } 4001ad20: b0 10 00 02 mov %g2, %i0 <== NOT EXECUTED 4001ad24: 81 c7 e0 08 ret <== NOT EXECUTED 4001ad28: 81 e8 00 00 restore <== NOT EXECUTED 4001aae8 : MEMFILE_STATIC int IMFS_memfile_remove_block( IMFS_jnode_t *the_jnode, unsigned int block ) { 4001aae8: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED block_p *block_entry_ptr; block_p ptr; block_entry_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); 4001aaec: 94 10 20 00 clr %o2 <== NOT EXECUTED 4001aaf0: 92 10 00 19 mov %i1, %o1 <== NOT EXECUTED 4001aaf4: 7f ff ff 4d call 4001a828 <== NOT EXECUTED 4001aaf8: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED ptr = *block_entry_ptr; 4001aafc: c2 02 00 00 ld [ %o0 ], %g1 <== NOT EXECUTED *block_entry_ptr = 0; memfile_free_block( ptr ); return 1; } 4001ab00: b0 10 20 01 mov 1, %i0 <== NOT EXECUTED block_p *block_entry_ptr; block_p ptr; block_entry_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); ptr = *block_entry_ptr; *block_entry_ptr = 0; 4001ab04: c0 22 00 00 clr [ %o0 ] <== NOT EXECUTED memfile_free_block( ptr ); 4001ab08: 7f ff ff 32 call 4001a7d0 <== NOT EXECUTED 4001ab0c: 90 10 00 01 mov %g1, %o0 <== NOT EXECUTED return 1; } 4001ab10: 81 c7 e0 08 ret <== NOT EXECUTED 4001ab14: 81 e8 00 00 restore <== NOT EXECUTED 4001b0dc : IMFS_jnode_t *the_jnode, off_t start, const unsigned char *source, unsigned int length ) { 4001b0dc: 9d e3 bf 90 save %sp, -112, %sp /* * Perform internal consistency checks */ assert( the_jnode ); 4001b0e0: 80 a6 20 00 cmp %i0, 0 4001b0e4: 32 80 00 09 bne,a 4001b108 4001b0e8: c2 06 20 48 ld [ %i0 + 0x48 ], %g1 4001b0ec: 92 10 22 e1 mov 0x2e1, %o1 <== NOT EXECUTED 4001b0f0: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED 4001b0f4: 15 10 00 da sethi %hi(0x40036800), %o2 <== NOT EXECUTED 4001b0f8: 90 12 22 10 or %o0, 0x210, %o0 <== NOT EXECUTED 4001b0fc: 7f ff aa 1e call 40005974 <__assert> <== NOT EXECUTED 4001b100: 94 12 a2 60 or %o2, 0x260, %o2 <== NOT EXECUTED 4001b104: 30 80 00 0d b,a 4001b138 <== NOT EXECUTED if ( !the_jnode ) rtems_set_errno_and_return_minus_one( EIO ); assert( the_jnode->type == IMFS_MEMORY_FILE ); 4001b108: 80 a0 60 05 cmp %g1, 5 4001b10c: 02 80 00 07 be 4001b128 4001b110: 11 10 00 da sethi %hi(0x40036800), %o0 4001b114: 15 10 00 da sethi %hi(0x40036800), %o2 <== NOT EXECUTED 4001b118: 90 12 22 10 or %o0, 0x210, %o0 <== NOT EXECUTED 4001b11c: 94 12 a2 70 or %o2, 0x270, %o2 <== NOT EXECUTED 4001b120: 7f ff aa 15 call 40005974 <__assert> <== NOT EXECUTED 4001b124: 92 10 22 e5 mov 0x2e5, %o1 <== NOT EXECUTED if ( the_jnode->type != IMFS_MEMORY_FILE ) 4001b128: c2 06 20 48 ld [ %i0 + 0x48 ], %g1 4001b12c: 80 a0 60 05 cmp %g1, 5 4001b130: 02 80 00 06 be 4001b148 4001b134: 80 a6 a0 00 cmp %i2, 0 rtems_set_errno_and_return_minus_one( EIO ); 4001b138: 40 00 22 15 call 4002398c <__errno> <== NOT EXECUTED 4001b13c: a4 10 3f ff mov -1, %l2 <== NOT EXECUTED 4001b140: 10 80 00 0d b 4001b174 <== NOT EXECUTED 4001b144: 82 10 20 05 mov 5, %g1 <== NOT EXECUTED /* * Error check arguments */ assert( source ); 4001b148: 12 80 00 0d bne 4001b17c 4001b14c: 80 a6 e0 00 cmp %i3, 0 4001b150: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED 4001b154: 15 10 00 da sethi %hi(0x40036800), %o2 <== NOT EXECUTED 4001b158: 92 10 22 ed mov 0x2ed, %o1 <== NOT EXECUTED 4001b15c: 90 12 22 10 or %o0, 0x210, %o0 <== NOT EXECUTED 4001b160: 7f ff aa 05 call 40005974 <__assert> <== NOT EXECUTED 4001b164: 94 12 a2 a8 or %o2, 0x2a8, %o2 <== NOT EXECUTED if ( !source ) rtems_set_errno_and_return_minus_one( EINVAL ); 4001b168: 40 00 22 09 call 4002398c <__errno> <== NOT EXECUTED 4001b16c: a4 10 3f ff mov -1, %l2 <== NOT EXECUTED 4001b170: 82 10 20 16 mov 0x16, %g1 <== NOT EXECUTED 4001b174: 10 80 00 71 b 4001b338 <== NOT EXECUTED 4001b178: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED /* * If there is nothing to write, then quick exit. */ my_length = length; if ( !my_length ) 4001b17c: 02 bf ff fb be 4001b168 4001b180: 01 00 00 00 nop * 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 + length; if ( last_byte > the_jnode->info.file.size ) { 4001b184: c2 06 20 4c ld [ %i0 + 0x4c ], %g1 /* * 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 + length; 4001b188: 92 06 c0 19 add %i3, %i1, %o1 if ( last_byte > the_jnode->info.file.size ) { 4001b18c: 80 a2 40 01 cmp %o1, %g1 4001b190: 08 80 00 0b bleu 4001b1bc 4001b194: 03 10 00 ec sethi %hi(0x4003b000), %g1 status = IMFS_memfile_extend( the_jnode, last_byte ); 4001b198: 7f ff ff 4c call 4001aec8 4001b19c: 90 10 00 18 mov %i0, %o0 if ( status ) 4001b1a0: 80 a2 20 00 cmp %o0, 0 4001b1a4: 22 80 00 06 be,a 4001b1bc 4001b1a8: 03 10 00 ec sethi %hi(0x4003b000), %g1 rtems_set_errno_and_return_minus_one( ENOSPC ); 4001b1ac: 40 00 21 f8 call 4002398c <__errno> <== NOT EXECUTED 4001b1b0: a4 10 3f ff mov -1, %l2 <== NOT EXECUTED 4001b1b4: 10 bf ff f0 b 4001b174 <== NOT EXECUTED 4001b1b8: 82 10 20 1c mov 0x1c, %g1 <== NOT EXECUTED /* * Phase 1: possibly the last part of one block */ start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK; 4001b1bc: e0 00 62 a8 ld [ %g1 + 0x2a8 ], %l0 4001b1c0: 90 10 00 19 mov %i1, %o0 4001b1c4: 40 00 5f 7d call 40032fb8 <.rem> 4001b1c8: 92 10 00 10 mov %l0, %o1 block = start / IMFS_MEMFILE_BYTES_PER_BLOCK; 4001b1cc: 92 10 00 10 mov %l0, %o1 /* * Phase 1: possibly the last part of one block */ start_offset = start % IMFS_MEMFILE_BYTES_PER_BLOCK; 4001b1d0: a2 10 00 08 mov %o0, %l1 block = start / IMFS_MEMFILE_BYTES_PER_BLOCK; 4001b1d4: 40 00 5e cd call 40032d08 <.div> 4001b1d8: 90 10 00 19 mov %i1, %o0 if ( start_offset ) { 4001b1dc: 80 a4 60 00 cmp %l1, 0 4001b1e0: 12 80 00 05 bne 4001b1f4 4001b1e4: b2 10 00 08 mov %o0, %i1 4001b1e8: a0 10 00 1a mov %i2, %l0 4001b1ec: 10 80 00 1d b 4001b260 4001b1f0: a4 10 20 00 clr %l2 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 ); 4001b1f4: 90 10 00 18 mov %i0, %o0 4001b1f8: 92 10 00 19 mov %i1, %o1 4001b1fc: 7f ff fd 8b call 4001a828 4001b200: 94 10 20 00 clr %o2 assert( block_ptr ); 4001b204: 80 a2 20 00 cmp %o0, 0 4001b208: 32 80 00 0b bne,a 4001b234 4001b20c: 94 24 00 11 sub %l0, %l1, %o2 4001b210: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED 4001b214: 92 10 23 1a mov 0x31a, %o1 <== NOT EXECUTED 4001b218: 90 12 22 10 or %o0, 0x210, %o0 <== NOT EXECUTED 4001b21c: 15 10 00 da sethi %hi(0x40036800), %o2 <== NOT EXECUTED 4001b220: a4 10 20 00 clr %l2 <== NOT EXECUTED 4001b224: 7f ff a9 d4 call 40005974 <__assert> <== NOT EXECUTED 4001b228: 94 12 a2 b0 or %o2, 0x2b0, %o2 <== NOT EXECUTED } IMFS_atime_mtime_update( the_jnode ); return copied; } 4001b22c: 81 c7 e0 08 ret <== NOT EXECUTED 4001b230: 91 e8 00 12 restore %g0, %l2, %o0 <== NOT EXECUTED */ 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; 4001b234: 80 a2 80 1b cmp %o2, %i3 4001b238: 38 80 00 02 bgu,a 4001b240 4001b23c: 94 10 00 1b mov %i3, %o2 if ( !block_ptr ) return copied; #if 0 fprintf(stdout, "write %d at %d in %d: %*s\n", to_copy, start_offset, block, to_copy, src ); #endif memcpy( &(*block_ptr)[ start_offset ], src, to_copy ); 4001b240: d0 02 00 00 ld [ %o0 ], %o0 src += to_copy; 4001b244: a0 06 80 0a add %i2, %o2, %l0 if ( !block_ptr ) return copied; #if 0 fprintf(stdout, "write %d at %d in %d: %*s\n", to_copy, start_offset, block, to_copy, src ); #endif memcpy( &(*block_ptr)[ start_offset ], src, to_copy ); 4001b248: 90 04 40 08 add %l1, %o0, %o0 src += to_copy; block++; 4001b24c: b2 06 60 01 inc %i1 my_length -= to_copy; 4001b250: b6 26 c0 0a sub %i3, %o2, %i3 copied += to_copy; 4001b254: a4 10 00 0a mov %o2, %l2 if ( !block_ptr ) return copied; #if 0 fprintf(stdout, "write %d at %d in %d: %*s\n", to_copy, start_offset, block, to_copy, src ); #endif memcpy( &(*block_ptr)[ start_offset ], src, to_copy ); 4001b258: 40 00 28 81 call 4002545c 4001b25c: 92 10 00 1a mov %i2, %o1 /* * Phase 2: all of zero of more blocks */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; 4001b260: 03 10 00 ec sethi %hi(0x4003b000), %g1 4001b264: f4 00 62 a8 ld [ %g1 + 0x2a8 ], %i2 ! 4003b2a8 while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { 4001b268: 10 80 00 14 b 4001b2b8 4001b26c: a2 10 00 01 mov %g1, %l1 block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); 4001b270: 7f ff fd 6e call 4001a828 4001b274: 01 00 00 00 nop assert( block_ptr ); 4001b278: 80 a2 20 00 cmp %o0, 0 4001b27c: 32 80 00 08 bne,a 4001b29c 4001b280: d0 02 00 00 ld [ %o0 ], %o0 4001b284: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED 4001b288: 15 10 00 da sethi %hi(0x40036800), %o2 <== NOT EXECUTED 4001b28c: 90 12 22 10 or %o0, 0x210, %o0 <== NOT EXECUTED 4001b290: 94 12 a2 b0 or %o2, 0x2b0, %o2 <== NOT EXECUTED 4001b294: 10 80 00 1c b 4001b304 <== NOT EXECUTED 4001b298: 92 10 23 2e mov 0x32e, %o1 <== NOT EXECUTED 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 ); 4001b29c: 92 10 00 10 mov %l0, %o1 src += to_copy; block++; 4001b2a0: b2 06 60 01 inc %i1 my_length -= to_copy; 4001b2a4: b6 26 c0 1a sub %i3, %i2, %i3 4001b2a8: a4 04 80 1a add %l2, %i2, %l2 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 ); 4001b2ac: a0 04 00 1a add %l0, %i2, %l0 4001b2b0: 40 00 28 6b call 4002545c 4001b2b4: 94 10 00 1a mov %i2, %o2 /* * Phase 2: all of zero of more blocks */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { 4001b2b8: c2 04 62 a8 ld [ %l1 + 0x2a8 ], %g1 block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); 4001b2bc: 92 10 00 19 mov %i1, %o1 4001b2c0: 94 10 20 00 clr %o2 /* * Phase 2: all of zero of more blocks */ to_copy = IMFS_MEMFILE_BYTES_PER_BLOCK; while ( my_length >= IMFS_MEMFILE_BYTES_PER_BLOCK ) { 4001b2c4: 80 a6 c0 01 cmp %i3, %g1 4001b2c8: 1a bf ff ea bcc 4001b270 4001b2cc: 90 10 00 18 mov %i0, %o0 */ assert( my_length < IMFS_MEMFILE_BYTES_PER_BLOCK ); to_copy = my_length; if ( my_length ) { 4001b2d0: 80 a6 e0 00 cmp %i3, 0 4001b2d4: 22 80 00 14 be,a 4001b324 4001b2d8: 90 07 bf f0 add %fp, -16, %o0 block_ptr = IMFS_memfile_get_block_pointer( the_jnode, block, 0 ); 4001b2dc: 7f ff fd 53 call 4001a828 4001b2e0: 01 00 00 00 nop assert( block_ptr ); 4001b2e4: 80 a2 20 00 cmp %o0, 0 4001b2e8: 32 80 00 0a bne,a 4001b310 4001b2ec: d0 02 00 00 ld [ %o0 ], %o0 4001b2f0: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED 4001b2f4: 15 10 00 da sethi %hi(0x40036800), %o2 <== NOT EXECUTED 4001b2f8: 90 12 22 10 or %o0, 0x210, %o0 <== NOT EXECUTED 4001b2fc: 94 12 a2 b0 or %o2, 0x2b0, %o2 <== NOT EXECUTED 4001b300: 92 10 23 44 mov 0x344, %o1 <== NOT EXECUTED 4001b304: 7f ff a9 9c call 40005974 <__assert> <== NOT EXECUTED 4001b308: b0 10 00 12 mov %l2, %i0 <== NOT EXECUTED 4001b30c: 30 80 00 0c b,a 4001b33c <== NOT EXECUTED #if 0 fprintf(stdout, "write %d in %d: %*s\n", to_copy, block, to_copy, src ); #endif memcpy( &(*block_ptr)[ 0 ], src, my_length ); my_length = 0; copied += to_copy; 4001b310: a4 04 80 1b add %l2, %i3, %l2 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, my_length ); 4001b314: 92 10 00 10 mov %l0, %o1 4001b318: 40 00 28 51 call 4002545c 4001b31c: 94 10 00 1b mov %i3, %o2 my_length = 0; copied += to_copy; } IMFS_atime_mtime_update( the_jnode ); 4001b320: 90 07 bf f0 add %fp, -16, %o0 4001b324: 7f ff aa 4f call 40005c60 4001b328: 92 10 20 00 clr %o1 4001b32c: c2 07 bf f0 ld [ %fp + -16 ], %g1 4001b330: c2 26 20 3c st %g1, [ %i0 + 0x3c ] 4001b334: c2 26 20 40 st %g1, [ %i0 + 0x40 ] return copied; } 4001b338: b0 10 00 12 mov %l2, %i0 4001b33c: 81 c7 e0 08 ret 4001b340: 81 e8 00 00 restore 4000c0cc : const char *token, /* IN */ mode_t mode, /* IN */ dev_t dev, /* IN */ rtems_filesystem_location_info_t *pathloc /* IN/OUT */ ) { 4000c0cc: 9d e3 bf 60 save %sp, -160, %sp IMFS_jnode_t *new_node; int result; char new_name[ IMFS_NAME_MAX + 1 ]; IMFS_types_union info; IMFS_get_token( token, new_name, &result ); 4000c0d0: 90 10 00 18 mov %i0, %o0 4000c0d4: 92 07 bf c3 add %fp, -61, %o1 4000c0d8: 7f ff ff 8c call 4000bf08 4000c0dc: 94 07 bf f4 add %fp, -12, %o2 /* * Figure out what type of IMFS node this is. */ if ( S_ISDIR(mode) ) 4000c0e0: 03 00 00 3c sethi %hi(0xf000), %g1 4000c0e4: b3 2e 60 10 sll %i1, 0x10, %i1 4000c0e8: 97 36 60 10 srl %i1, 0x10, %o3 4000c0ec: 84 0a c0 01 and %o3, %g1, %g2 4000c0f0: 03 00 00 10 sethi %hi(0x4000), %g1 4000c0f4: 80 a0 80 01 cmp %g2, %g1 4000c0f8: 02 80 00 17 be 4000c154 4000c0fc: 90 10 00 1c mov %i4, %o0 type = IMFS_DIRECTORY; else if ( S_ISREG(mode) ) 4000c100: 03 00 00 20 sethi %hi(0x8000), %g1 4000c104: 80 a0 80 01 cmp %g2, %g1 4000c108: 02 80 00 14 be 4000c158 4000c10c: 92 10 20 05 mov 5, %o1 type = IMFS_MEMORY_FILE; else if ( S_ISBLK(mode) || S_ISCHR(mode) ) { 4000c110: 03 00 00 18 sethi %hi(0x6000), %g1 4000c114: 80 a0 80 01 cmp %g2, %g1 4000c118: 02 80 00 05 be 4000c12c 4000c11c: 03 00 00 08 sethi %hi(0x2000), %g1 4000c120: 80 a0 80 01 cmp %g2, %g1 4000c124: 12 80 00 06 bne 4000c13c 4000c128: 01 00 00 00 nop type = IMFS_DEVICE; rtems_filesystem_split_dev_t( dev, info.device.major, info.device.minor ); 4000c12c: f6 27 bf e8 st %i3, [ %fp + -24 ] 4000c130: f4 27 bf e4 st %i2, [ %fp + -28 ] 4000c134: 10 80 00 09 b 4000c158 4000c138: 92 10 20 02 mov 2, %o1 } else { rtems_set_errno_and_return_minus_one( EINVAL ); 4000c13c: 40 00 0b a0 call 4000efbc <__errno> <== NOT EXECUTED 4000c140: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 4000c144: 82 10 20 16 mov 0x16, %g1 <== NOT EXECUTED 4000c148: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 4000c14c: 81 c7 e0 08 ret <== NOT EXECUTED 4000c150: 81 e8 00 00 restore <== NOT EXECUTED 4000c154: 92 10 20 01 mov 1, %o1 /* * Allocate and fill in an IMFS jnode */ new_node = IMFS_create_node( 4000c158: 94 07 bf c3 add %fp, -61, %o2 4000c15c: 98 07 bf e4 add %fp, -28, %o4 4000c160: 40 00 08 86 call 4000e378 4000c164: b0 10 20 00 clr %i0 new_name, mode, &info ); if ( !new_node ) 4000c168: 80 a2 20 00 cmp %o0, 0 4000c16c: 12 80 00 06 bne 4000c184 4000c170: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( ENOMEM ); 4000c174: 40 00 0b 92 call 4000efbc <__errno> <== NOT EXECUTED 4000c178: b0 10 3f ff mov -1, %i0 ! ffffffff <== NOT EXECUTED 4000c17c: 82 10 20 0c mov 0xc, %g1 <== NOT EXECUTED 4000c180: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED return 0; } 4000c184: 81 c7 e0 08 ret 4000c188: 81 e8 00 00 restore 40005600 : #include int IMFS_mount( rtems_filesystem_mount_table_entry_t *mt_entry ) { 40005600: 9d e3 bf 98 save %sp, -104, %sp IMFS_jnode_t *node; node = mt_entry->mt_point_node.node_access; 40005604: c4 06 20 08 ld [ %i0 + 8 ], %g2 /* * Is the node that we are mounting onto a directory node ? */ if ( node->type != IMFS_DIRECTORY ) 40005608: c2 00 a0 48 ld [ %g2 + 0x48 ], %g1 4000560c: 80 a0 60 01 cmp %g1, 1 40005610: 22 80 00 08 be,a 40005630 40005614: f0 20 a0 58 st %i0, [ %g2 + 0x58 ] rtems_set_errno_and_return_minus_one( ENOTDIR ); 40005618: 40 00 78 dd call 4002398c <__errno> <== NOT EXECUTED 4000561c: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40005620: 82 10 20 14 mov 0x14, %g1 <== NOT EXECUTED 40005624: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 40005628: 81 c7 e0 08 ret <== NOT EXECUTED 4000562c: 81 e8 00 00 restore <== NOT EXECUTED * the mounted file system. */ node->info.directory.mt_fs = mt_entry; return 0; } 40005630: 81 c7 e0 08 ret 40005634: 91 e8 20 00 restore %g0, 0, %o0 40004620 : */ void IMFS_print_jnode( IMFS_jnode_t *the_jnode ) { 40004620: 9d e3 bf 98 save %sp, -104, %sp assert( the_jnode ); 40004624: 80 a6 20 00 cmp %i0, 0 40004628: 12 80 00 09 bne 4000464c 4000462c: 21 10 00 87 sethi %hi(0x40021c00), %l0 40004630: 11 10 00 7e sethi %hi(0x4001f800), %o0 <== NOT EXECUTED 40004634: 15 10 00 7e sethi %hi(0x4001f800), %o2 <== NOT EXECUTED 40004638: 90 12 22 b0 or %o0, 0x2b0, %o0 <== NOT EXECUTED 4000463c: 94 12 a3 00 or %o2, 0x300, %o2 <== NOT EXECUTED 40004640: 40 00 02 15 call 40004e94 <__assert> <== NOT EXECUTED 40004644: 92 10 20 38 mov 0x38, %o1 <== NOT EXECUTED fprintf(stdout, "%s", the_jnode->name ); 40004648: 21 10 00 87 sethi %hi(0x40021c00), %l0 <== NOT EXECUTED 4000464c: c2 04 20 b8 ld [ %l0 + 0xb8 ], %g1 ! 40021cb8 <_impure_ptr> 40004650: 90 06 20 0c add %i0, 0xc, %o0 40004654: 40 00 3c 31 call 40013718 40004658: d2 00 60 08 ld [ %g1 + 8 ], %o1 switch( the_jnode->type ) { 4000465c: d4 06 20 48 ld [ %i0 + 0x48 ], %o2 40004660: 82 02 bf ff add %o2, -1, %g1 40004664: 80 a0 60 05 cmp %g1, 5 40004668: 38 80 00 34 bgu,a 40004738 4000466c: c2 04 20 b8 ld [ %l0 + 0xb8 ], %g1 <== NOT EXECUTED 40004670: 83 28 60 02 sll %g1, 2, %g1 40004674: 05 10 00 11 sethi %hi(0x40004400), %g2 40004678: 84 10 a1 cc or %g2, 0x1cc, %g2 ! 400045cc 4000467c: c2 00 80 01 ld [ %g2 + %g1 ], %g1 40004680: 81 c0 40 00 jmp %g1 40004684: 01 00 00 00 nop case IMFS_DIRECTORY: fprintf(stdout, "/" ); 40004688: c2 04 20 b8 ld [ %l0 + 0xb8 ], %g1 4000468c: 90 10 20 2f mov 0x2f, %o0 40004690: 40 00 3b e1 call 40013614 40004694: d2 00 60 08 ld [ %g1 + 8 ], %o1 default: fprintf(stdout, " bad type %d\n", the_jnode->type ); assert(0); break; } puts(""); 40004698: 10 80 00 33 b 40004764 4000469c: 31 10 00 7e sethi %hi(0x4001f800), %i0 case IMFS_DIRECTORY: fprintf(stdout, "/" ); break; case IMFS_DEVICE: fprintf(stdout, " (device %" PRId32 ", %" PRId32 ")", 400046a0: c2 04 20 b8 ld [ %l0 + 0xb8 ], %g1 400046a4: d6 06 20 50 ld [ %i0 + 0x50 ], %o3 400046a8: d0 00 60 08 ld [ %g1 + 8 ], %o0 400046ac: d4 06 20 4c ld [ %i0 + 0x4c ], %o2 400046b0: 13 10 00 7e sethi %hi(0x4001f800), %o1 400046b4: 10 80 00 08 b 400046d4 400046b8: 92 12 63 10 or %o1, 0x310, %o1 ! 4001fb10 the_jnode->info.device.major, the_jnode->info.device.minor ); break; case IMFS_LINEAR_FILE: fprintf(stdout, " (file %" PRId32 " %p)", 400046bc: c2 04 20 b8 ld [ %l0 + 0xb8 ], %g1 <== NOT EXECUTED 400046c0: d6 06 20 50 ld [ %i0 + 0x50 ], %o3 <== NOT EXECUTED 400046c4: d0 00 60 08 ld [ %g1 + 8 ], %o0 <== NOT EXECUTED 400046c8: d4 06 20 4c ld [ %i0 + 0x4c ], %o2 <== NOT EXECUTED 400046cc: 13 10 00 7e sethi %hi(0x4001f800), %o1 <== NOT EXECUTED 400046d0: 92 12 63 28 or %o1, 0x328, %o1 ! 4001fb28 <== NOT EXECUTED 400046d4: 40 00 3b c4 call 400135e4 400046d8: 31 10 00 7e sethi %hi(0x4001f800), %i0 400046dc: 30 80 00 22 b,a 40004764 the_jnode->info.file.indirect, the_jnode->info.file.doubly_indirect, the_jnode->info.file.triply_indirect ); #else fprintf(stdout, " (file %" PRId32 ")", 400046e0: c2 04 20 b8 ld [ %l0 + 0xb8 ], %g1 400046e4: d4 06 20 4c ld [ %i0 + 0x4c ], %o2 400046e8: d0 00 60 08 ld [ %g1 + 8 ], %o0 400046ec: 13 10 00 7e sethi %hi(0x4001f800), %o1 400046f0: 40 00 3b bd call 400135e4 400046f4: 92 12 63 38 or %o1, 0x338, %o1 ! 4001fb38 default: fprintf(stdout, " bad type %d\n", the_jnode->type ); assert(0); break; } puts(""); 400046f8: 10 80 00 1b b 40004764 400046fc: 31 10 00 7e sethi %hi(0x4001f800), %i0 (uint32_t)the_jnode->info.file.size ); #endif break; case IMFS_HARD_LINK: fprintf(stdout, " links not printed\n" ); 40004700: c2 04 20 b8 ld [ %l0 + 0xb8 ], %g1 <== NOT EXECUTED 40004704: 11 10 00 7e sethi %hi(0x4001f800), %o0 <== NOT EXECUTED 40004708: d2 00 60 08 ld [ %g1 + 8 ], %o1 <== NOT EXECUTED 4000470c: 40 00 3c 03 call 40013718 <== NOT EXECUTED 40004710: 90 12 23 48 or %o0, 0x348, %o0 <== NOT EXECUTED assert(0); 40004714: 10 80 00 0e b 4000474c <== NOT EXECUTED 40004718: 92 10 20 5d mov 0x5d, %o1 <== NOT EXECUTED break; case IMFS_SYM_LINK: fprintf(stdout, " links not printed\n" ); 4000471c: c2 04 20 b8 ld [ %l0 + 0xb8 ], %g1 <== NOT EXECUTED 40004720: 11 10 00 7e sethi %hi(0x4001f800), %o0 <== NOT EXECUTED 40004724: d2 00 60 08 ld [ %g1 + 8 ], %o1 <== NOT EXECUTED 40004728: 40 00 3b fc call 40013718 <== NOT EXECUTED 4000472c: 90 12 23 48 or %o0, 0x348, %o0 <== NOT EXECUTED assert(0); 40004730: 10 80 00 07 b 4000474c <== NOT EXECUTED 40004734: 92 10 20 62 mov 0x62, %o1 <== NOT EXECUTED break; default: fprintf(stdout, " bad type %d\n", the_jnode->type ); 40004738: 13 10 00 7e sethi %hi(0x4001f800), %o1 <== NOT EXECUTED 4000473c: d0 00 60 08 ld [ %g1 + 8 ], %o0 <== NOT EXECUTED 40004740: 40 00 3b a9 call 400135e4 <== NOT EXECUTED 40004744: 92 12 63 60 or %o1, 0x360, %o1 <== NOT EXECUTED assert(0); 40004748: 92 10 20 67 mov 0x67, %o1 <== NOT EXECUTED 4000474c: 11 10 00 7e sethi %hi(0x4001f800), %o0 <== NOT EXECUTED 40004750: 15 10 00 7e sethi %hi(0x4001f800), %o2 <== NOT EXECUTED 40004754: 90 12 22 b0 or %o0, 0x2b0, %o0 <== NOT EXECUTED 40004758: 40 00 01 cf call 40004e94 <__assert> <== NOT EXECUTED 4000475c: 94 12 a0 a8 or %o2, 0xa8, %o2 <== NOT EXECUTED break; } puts(""); 40004760: 31 10 00 7e sethi %hi(0x4001f800), %i0 <== NOT EXECUTED 40004764: 40 00 42 3e call 4001505c 40004768: 91 ee 22 80 restore %i0, 0x280, %o0 4000476c: 01 00 00 00 nop 40005644 : int IMFS_readlink( rtems_filesystem_location_info_t *loc, char *buf, /* OUT */ size_t bufsize ) { 40005644: 9d e3 bf 98 save %sp, -104, %sp IMFS_jnode_t *node; int i; node = loc->node_access; 40005648: c6 06 00 00 ld [ %i0 ], %g3 if ( node->type != IMFS_SYM_LINK ) 4000564c: c2 00 e0 48 ld [ %g3 + 0x48 ], %g1 40005650: 80 a0 60 04 cmp %g1, 4 40005654: 02 80 00 0a be 4000567c 40005658: b0 10 20 00 clr %i0 rtems_set_errno_and_return_minus_one( EINVAL ); 4000565c: 40 00 78 cc call 4002398c <__errno> <== NOT EXECUTED 40005660: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40005664: 82 10 20 16 mov 0x16, %g1 <== NOT EXECUTED 40005668: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 4000566c: 81 c7 e0 08 ret <== NOT EXECUTED 40005670: 81 e8 00 00 restore <== NOT EXECUTED for( i=0; ((iinfo.sym_link.name[i] != '\0')); i++ ) buf[i] = node->info.sym_link.name[i]; 40005674: c2 2e 00 19 stb %g1, [ %i0 + %i1 ] node = loc->node_access; if ( node->type != IMFS_SYM_LINK ) rtems_set_errno_and_return_minus_one( EINVAL ); for( i=0; ((iinfo.sym_link.name[i] != '\0')); i++ ) 40005678: b0 06 20 01 inc %i0 4000567c: 80 a6 00 1a cmp %i0, %i2 40005680: 02 80 00 07 be 4000569c 40005684: 01 00 00 00 nop 40005688: c2 00 e0 4c ld [ %g3 + 0x4c ], %g1 4000568c: c4 48 40 18 ldsb [ %g1 + %i0 ], %g2 40005690: 80 a0 a0 00 cmp %g2, 0 40005694: 12 bf ff f8 bne 40005674 40005698: c2 08 40 18 ldub [ %g1 + %i0 ], %g1 buf[i] = node->info.sym_link.name[i]; return i; } 4000569c: 81 c7 e0 08 ret 400056a0: 81 e8 00 00 restore 4000c198 : */ int IMFS_rmnod( rtems_filesystem_location_info_t *pathloc /* IN */ ) { 4000c198: 9d e3 bf 90 save %sp, -112, %sp IMFS_jnode_t *the_jnode; the_jnode = (IMFS_jnode_t *) pathloc->node_access; 4000c19c: e0 06 00 00 ld [ %i0 ], %l0 /* * Take the node out of the parent's chain that contains this node */ if ( the_jnode->Parent != NULL ) { 4000c1a0: c2 04 20 08 ld [ %l0 + 8 ], %g1 4000c1a4: 80 a0 60 00 cmp %g1, 0 4000c1a8: 22 80 00 06 be,a 4000c1c0 4000c1ac: c2 14 20 30 lduh [ %l0 + 0x30 ], %g1 <== NOT EXECUTED Chain_Extract( (Chain_Node *) the_jnode ); 4000c1b0: 40 00 05 65 call 4000d744 <_Chain_Extract> 4000c1b4: 90 10 00 10 mov %l0, %o0 the_jnode->Parent = NULL; 4000c1b8: c0 24 20 08 clr [ %l0 + 8 ] /* * Decrement the link counter and see if we can free the space. */ the_jnode->st_nlink--; 4000c1bc: c2 14 20 30 lduh [ %l0 + 0x30 ], %g1 IMFS_update_ctime( the_jnode ); 4000c1c0: 92 10 20 00 clr %o1 /* * Decrement the link counter and see if we can free the space. */ the_jnode->st_nlink--; 4000c1c4: 82 00 7f ff add %g1, -1, %g1 IMFS_update_ctime( the_jnode ); 4000c1c8: 90 07 bf f0 add %fp, -16, %o0 4000c1cc: 40 00 01 09 call 4000c5f0 4000c1d0: c2 34 20 30 sth %g1, [ %l0 + 0x30 ] 4000c1d4: c2 07 bf f0 ld [ %fp + -16 ], %g1 /* * The file cannot be open and the link must be less than 1 to free. */ if ( !rtems_libio_is_file_open( the_jnode ) && (the_jnode->st_nlink < 1) ) { 4000c1d8: 90 10 00 10 mov %l0, %o0 4000c1dc: 40 00 01 3e call 4000c6d4 4000c1e0: c2 24 20 44 st %g1, [ %l0 + 0x44 ] 4000c1e4: 80 a2 20 00 cmp %o0, 0 4000c1e8: 12 80 00 18 bne 4000c248 4000c1ec: 01 00 00 00 nop 4000c1f0: c2 14 20 30 lduh [ %l0 + 0x30 ], %g1 4000c1f4: 80 a0 60 00 cmp %g1, 0 4000c1f8: 12 80 00 14 bne 4000c248 4000c1fc: 03 10 00 68 sethi %hi(0x4001a000), %g1 /* * Is rtems_filesystem_current this node? */ if ( rtems_filesystem_current.node_access == pathloc->node_access ) 4000c200: c6 00 60 40 ld [ %g1 + 0x40 ], %g3 ! 4001a040 4000c204: c4 06 00 00 ld [ %i0 ], %g2 4000c208: c2 00 e0 04 ld [ %g3 + 4 ], %g1 4000c20c: 80 a0 40 02 cmp %g1, %g2 4000c210: 22 80 00 02 be,a 4000c218 4000c214: c0 20 e0 04 clr [ %g3 + 4 ] <== NOT EXECUTED /* * Free memory associated with a memory file. */ if ( the_jnode->type == IMFS_SYM_LINK ) { 4000c218: c2 04 20 48 ld [ %l0 + 0x48 ], %g1 4000c21c: 80 a0 60 04 cmp %g1, 4 4000c220: 12 80 00 08 bne 4000c240 4000c224: 01 00 00 00 nop if ( the_jnode->info.sym_link.name ) 4000c228: d0 04 20 4c ld [ %l0 + 0x4c ], %o0 4000c22c: 80 a2 20 00 cmp %o0, 0 4000c230: 02 80 00 04 be 4000c240 4000c234: 01 00 00 00 nop free( the_jnode->info.sym_link.name ); 4000c238: 7f ff db 85 call 4000304c 4000c23c: 01 00 00 00 nop } free( the_jnode ); 4000c240: 7f ff db 83 call 4000304c 4000c244: 90 10 00 10 mov %l0, %o0 } return 0; } 4000c248: 81 c7 e0 08 ret 4000c24c: 91 e8 20 00 restore %g0, 0, %o0 4000c250 : int IMFS_stat( rtems_filesystem_location_info_t *loc, struct stat *buf ) { 4000c250: 9d e3 bf 98 save %sp, -104, %sp IMFS_jnode_t *the_jnode; IMFS_device_t *io; the_jnode = loc->node_access; 4000c254: f0 06 00 00 ld [ %i0 ], %i0 switch ( the_jnode->type ) { 4000c258: c2 06 20 48 ld [ %i0 + 0x48 ], %g1 4000c25c: 80 a0 60 04 cmp %g1, 4 4000c260: 22 80 00 18 be,a 4000c2c0 4000c264: c0 26 60 20 clr [ %i1 + 0x20 ] <== NOT EXECUTED 4000c268: 14 80 00 07 bg 4000c284 4000c26c: 80 a0 60 06 cmp %g1, 6 4000c270: 80 a0 60 02 cmp %g1, 2 4000c274: 12 80 00 0d bne 4000c2a8 4000c278: 01 00 00 00 nop rtems_device_minor_number _minor ) { union __rtems_dev_t temp; temp.__overlay.major = _major; 4000c27c: 10 80 00 06 b 4000c294 4000c280: c4 06 20 4c ld [ %i0 + 0x4c ], %g2 4000c284: 14 80 00 09 bg 4000c2a8 4000c288: 01 00 00 00 nop buf->st_dev = 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; 4000c28c: 10 80 00 05 b 4000c2a0 4000c290: c2 06 20 4c ld [ %i0 + 0x4c ], %g1 temp.__overlay.minor = _minor; 4000c294: c6 06 20 50 ld [ %i0 + 0x50 ], %g3 switch ( the_jnode->type ) { case IMFS_DEVICE: io = &the_jnode->info.device; buf->st_dev = rtems_filesystem_make_dev_t( io->major, io->minor ); 4000c298: 10 80 00 0a b 4000c2c0 4000c29c: c4 3e 40 00 std %g2, [ %i1 ] break; case IMFS_LINEAR_FILE: case IMFS_MEMORY_FILE: buf->st_size = the_jnode->info.file.size; 4000c2a0: 10 80 00 08 b 4000c2c0 4000c2a4: c2 26 60 20 st %g1, [ %i1 + 0x20 ] case IMFS_SYM_LINK: buf->st_size = 0; break; default: rtems_set_errno_and_return_minus_one( ENOTSUP ); 4000c2a8: 40 00 0b 45 call 4000efbc <__errno> <== NOT EXECUTED 4000c2ac: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 4000c2b0: 82 10 20 86 mov 0x86, %g1 <== NOT EXECUTED 4000c2b4: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 4000c2b8: 81 c7 e0 08 ret <== NOT EXECUTED 4000c2bc: 81 e8 00 00 restore <== NOT EXECUTED break; } buf->st_mode = the_jnode->st_mode; 4000c2c0: c2 16 20 2e lduh [ %i0 + 0x2e ], %g1 buf->st_nlink = the_jnode->st_nlink; buf->st_ino = the_jnode->st_ino; 4000c2c4: c4 06 20 34 ld [ %i0 + 0x34 ], %g2 default: rtems_set_errno_and_return_minus_one( ENOTSUP ); break; } buf->st_mode = the_jnode->st_mode; 4000c2c8: c2 36 60 0c sth %g1, [ %i1 + 0xc ] buf->st_nlink = the_jnode->st_nlink; buf->st_ino = the_jnode->st_ino; 4000c2cc: c4 26 60 08 st %g2, [ %i1 + 8 ] rtems_set_errno_and_return_minus_one( ENOTSUP ); break; } buf->st_mode = the_jnode->st_mode; buf->st_nlink = the_jnode->st_nlink; 4000c2d0: c2 16 20 30 lduh [ %i0 + 0x30 ], %g1 buf->st_ino = the_jnode->st_ino; buf->st_uid = the_jnode->st_uid; buf->st_gid = the_jnode->st_gid; buf->st_atime = the_jnode->stat_atime; 4000c2d4: c4 06 20 3c ld [ %i0 + 0x3c ], %g2 rtems_set_errno_and_return_minus_one( ENOTSUP ); break; } buf->st_mode = the_jnode->st_mode; buf->st_nlink = the_jnode->st_nlink; 4000c2d8: c2 36 60 0e sth %g1, [ %i1 + 0xe ] buf->st_ino = the_jnode->st_ino; buf->st_uid = the_jnode->st_uid; buf->st_gid = the_jnode->st_gid; buf->st_atime = the_jnode->stat_atime; 4000c2dc: c4 26 60 24 st %g2, [ %i1 + 0x24 ] } 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; 4000c2e0: c2 16 20 38 lduh [ %i0 + 0x38 ], %g1 buf->st_gid = the_jnode->st_gid; buf->st_atime = the_jnode->stat_atime; buf->st_mtime = the_jnode->stat_mtime; 4000c2e4: c4 06 20 40 ld [ %i0 + 0x40 ], %g2 } 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; 4000c2e8: c2 36 60 10 sth %g1, [ %i1 + 0x10 ] buf->st_gid = the_jnode->st_gid; buf->st_atime = the_jnode->stat_atime; buf->st_mtime = the_jnode->stat_mtime; 4000c2ec: c4 26 60 2c st %g2, [ %i1 + 0x2c ] 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; 4000c2f0: c4 16 20 3a lduh [ %i0 + 0x3a ], %g2 buf->st_atime = the_jnode->stat_atime; buf->st_mtime = the_jnode->stat_mtime; buf->st_ctime = the_jnode->stat_ctime; 4000c2f4: c2 06 20 44 ld [ %i0 + 0x44 ], %g1 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; 4000c2f8: c4 36 60 12 sth %g2, [ %i1 + 0x12 ] buf->st_atime = the_jnode->stat_atime; buf->st_mtime = the_jnode->stat_mtime; buf->st_ctime = the_jnode->stat_ctime; 4000c2fc: c2 26 60 34 st %g1, [ %i1 + 0x34 ] return 0; } 4000c300: 81 c7 e0 08 ret 4000c304: 91 e8 20 00 restore %g0, 0, %o0 400056a4 : int IMFS_symlink( rtems_filesystem_location_info_t *parent_loc, const char *link_name, const char *node_name ) { 400056a4: 9d e3 bf 60 save %sp, -160, %sp /* * Remove any separators at the end of the string. */ IMFS_get_token( node_name, new_name, &i ); 400056a8: a0 07 bf c3 add %fp, -61, %l0 400056ac: 94 07 bf f4 add %fp, -12, %o2 400056b0: 92 10 00 10 mov %l0, %o1 400056b4: 7f ff fe fe call 400052ac 400056b8: 90 10 00 1a mov %i2, %o0 int IMFS_symlink( rtems_filesystem_location_info_t *parent_loc, const char *link_name, const char *node_name ) { 400056bc: 90 10 00 18 mov %i0, %o0 * Remove any separators at the end of the string. */ IMFS_get_token( node_name, new_name, &i ); info.sym_link.name = link_name; 400056c0: f2 27 bf e4 st %i1, [ %fp + -28 ] /* * Create a new link node. */ new_node = IMFS_create_node( 400056c4: 94 10 00 10 mov %l0, %o2 400056c8: 92 10 20 04 mov 4, %o1 400056cc: 17 00 00 28 sethi %hi(0xa000), %o3 400056d0: 98 07 bf e4 add %fp, -28, %o4 400056d4: 96 12 e1 ff or %o3, 0x1ff, %o3 400056d8: 40 00 41 c3 call 40015de4 400056dc: b0 10 20 00 clr %i0 new_name, ( S_IFLNK | ( S_IRWXU | S_IRWXG | S_IRWXO )), &info ); if ( !new_node ) 400056e0: 80 a2 20 00 cmp %o0, 0 400056e4: 12 80 00 06 bne 400056fc 400056e8: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( ENOMEM ); 400056ec: 40 00 78 a8 call 4002398c <__errno> <== NOT EXECUTED 400056f0: b0 10 3f ff mov -1, %i0 ! ffffffff <== NOT EXECUTED 400056f4: 82 10 20 0c mov 0xc, %g1 <== NOT EXECUTED 400056f8: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED return 0; } 400056fc: 81 c7 e0 08 ret 40005700: 81 e8 00 00 restore 40005704 : #include int IMFS_unlink( rtems_filesystem_location_info_t *loc /* IN */ ) { 40005704: 9d e3 bf 80 save %sp, -128, %sp IMFS_jnode_t *node; rtems_filesystem_location_info_t the_link; int result = 0; node = loc->node_access; 40005708: e0 06 00 00 ld [ %i0 ], %l0 /* * If this is the last last pointer to the node * free the node. */ if ( node->type == IMFS_HARD_LINK ) { 4000570c: c2 04 20 48 ld [ %l0 + 0x48 ], %g1 40005710: 80 a0 60 03 cmp %g1, 3 40005714: 32 80 00 2a bne,a 400057bc 40005718: c2 06 20 04 ld [ %i0 + 4 ], %g1 if ( !node->info.hard_link.link_node ) 4000571c: c2 04 20 4c ld [ %l0 + 0x4c ], %g1 40005720: 80 a0 60 00 cmp %g1, 0 40005724: 12 80 00 08 bne 40005744 40005728: a2 07 bf e0 add %fp, -32, %l1 rtems_set_errno_and_return_minus_one( EINVAL ); 4000572c: 40 00 78 98 call 4002398c <__errno> <== NOT EXECUTED 40005730: 01 00 00 00 nop <== NOT EXECUTED 40005734: 82 10 20 16 mov 0x16, %g1 ! 16 <== NOT EXECUTED 40005738: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 4000573c: 10 80 00 23 b 400057c8 <== NOT EXECUTED 40005740: 90 10 3f ff mov -1, %o0 <== NOT EXECUTED the_link = *loc; 40005744: 92 10 00 18 mov %i0, %o1 40005748: 94 10 20 10 mov 0x10, %o2 4000574c: 40 00 7f 44 call 4002545c 40005750: 90 10 00 11 mov %l1, %o0 the_link.node_access = node->info.hard_link.link_node; 40005754: c2 04 20 4c ld [ %l0 + 0x4c ], %g1 IMFS_Set_handlers( &the_link ); 40005758: 90 10 00 11 mov %l1, %o0 4000575c: 40 00 42 07 call 40015f78 40005760: c2 27 bf e0 st %g1, [ %fp + -32 ] /* * 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) 40005764: c4 04 20 4c ld [ %l0 + 0x4c ], %g2 40005768: c2 10 a0 30 lduh [ %g2 + 0x30 ], %g1 4000576c: 80 a0 60 01 cmp %g1, 1 40005770: 12 80 00 0b bne 4000579c 40005774: 82 00 7f ff add %g1, -1, %g1 { result = (*the_link.handlers->rmnod_h)( &the_link ); 40005778: c2 07 bf e4 ld [ %fp + -28 ], %g1 4000577c: c2 00 60 34 ld [ %g1 + 0x34 ], %g1 40005780: 9f c0 40 00 call %g1 40005784: 90 10 00 11 mov %l1, %o0 if ( result != 0 ) 40005788: 80 a2 20 00 cmp %o0, 0 4000578c: 12 80 00 0f bne 400057c8 40005790: 90 10 3f ff mov -1, %o0 /* * Now actually free the node we were asked to free. */ result = (*loc->handlers->rmnod_h)( loc ); 40005794: 10 80 00 0a b 400057bc 40005798: c2 06 20 04 ld [ %i0 + 4 ], %g1 return -1; } else { node->info.hard_link.link_node->st_nlink --; IMFS_update_ctime( node->info.hard_link.link_node ); 4000579c: 90 07 bf f0 add %fp, -16, %o0 if ( result != 0 ) return -1; } else { node->info.hard_link.link_node->st_nlink --; 400057a0: c2 30 a0 30 sth %g1, [ %g2 + 0x30 ] IMFS_update_ctime( node->info.hard_link.link_node ); 400057a4: 40 00 01 2f call 40005c60 400057a8: 92 10 20 00 clr %o1 400057ac: c4 04 20 4c ld [ %l0 + 0x4c ], %g2 400057b0: c2 07 bf f0 ld [ %fp + -16 ], %g1 400057b4: c2 20 a0 44 st %g1, [ %g2 + 0x44 ] /* * Now actually free the node we were asked to free. */ result = (*loc->handlers->rmnod_h)( loc ); 400057b8: c2 06 20 04 ld [ %i0 + 4 ], %g1 400057bc: c2 00 60 34 ld [ %g1 + 0x34 ], %g1 400057c0: 9f c0 40 00 call %g1 400057c4: 90 10 00 18 mov %i0, %o0 return result; } 400057c8: 81 c7 e0 08 ret 400057cc: 91 e8 00 08 restore %g0, %o0, %o0 400057d0 : #include int IMFS_unmount( rtems_filesystem_mount_table_entry_t *mt_entry ) { 400057d0: 9d e3 bf 98 save %sp, -104, %sp IMFS_jnode_t *node; node = mt_entry->mt_point_node.node_access; 400057d4: c4 06 20 08 ld [ %i0 + 8 ], %g2 /* * Is the node that we are mounting onto a directory node ? */ if ( node->type != IMFS_DIRECTORY ) 400057d8: c2 00 a0 48 ld [ %g2 + 0x48 ], %g1 400057dc: 80 a0 60 01 cmp %g1, 1 400057e0: 22 80 00 06 be,a 400057f8 400057e4: c2 00 a0 58 ld [ %g2 + 0x58 ], %g1 rtems_set_errno_and_return_minus_one( ENOTDIR ); 400057e8: 40 00 78 69 call 4002398c <__errno> <== NOT EXECUTED 400057ec: 01 00 00 00 nop <== NOT EXECUTED 400057f0: 10 80 00 08 b 40005810 <== NOT EXECUTED 400057f4: 82 10 20 14 mov 0x14, %g1 ! 14 <== NOT EXECUTED /* * Did the node indicate that there was a directory mounted here? */ if ( node->info.directory.mt_fs == NULL ) 400057f8: 80 a0 60 00 cmp %g1, 0 400057fc: 32 80 00 08 bne,a 4000581c 40005800: c0 20 a0 58 clr [ %g2 + 0x58 ] rtems_set_errno_and_return_minus_one( EINVAL ); /* XXX */ 40005804: 40 00 78 62 call 4002398c <__errno> <== NOT EXECUTED 40005808: 01 00 00 00 nop <== NOT EXECUTED 4000580c: 82 10 20 16 mov 0x16, %g1 ! 16 <== NOT EXECUTED 40005810: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 40005814: 81 c7 e0 08 ret <== NOT EXECUTED 40005818: 91 e8 3f ff restore %g0, -1, %o0 <== NOT EXECUTED */ node->info.directory.mt_fs = NULL; return 0; } 4000581c: 81 c7 e0 08 ret 40005820: 91 e8 20 00 restore %g0, 0, %o0 400237ac : assert( 0 ); return 0; } int POSIX_BOTTOM_REACHED() { 400237ac: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED assert( 0 ); 400237b0: 92 10 20 22 mov 0x22, %o1 <== NOT EXECUTED 400237b4: 11 10 00 9d sethi %hi(0x40027400), %o0 <== NOT EXECUTED 400237b8: 15 10 00 8f sethi %hi(0x40023c00), %o2 <== NOT EXECUTED 400237bc: 90 12 22 08 or %o0, 0x208, %o0 <== NOT EXECUTED 400237c0: 94 12 a0 28 or %o2, 0x28, %o2 <== NOT EXECUTED 400237c4: 7f ff 8d 90 call 40006e04 <__assert> <== NOT EXECUTED 400237c8: b0 10 20 00 clr %i0 <== NOT EXECUTED return 0; } 400237cc: 81 c7 e0 08 ret <== NOT EXECUTED 400237d0: 81 e8 00 00 restore <== NOT EXECUTED 400237d4 : */ #include int POSIX_MP_NOT_IMPLEMENTED() { 400237d4: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED assert( 0 ); 400237d8: 92 10 20 1c mov 0x1c, %o1 <== NOT EXECUTED 400237dc: 11 10 00 9d sethi %hi(0x40027400), %o0 <== NOT EXECUTED 400237e0: 15 10 00 8f sethi %hi(0x40023c00), %o2 <== NOT EXECUTED 400237e4: 90 12 22 08 or %o0, 0x208, %o0 <== NOT EXECUTED 400237e8: 94 12 a0 28 or %o2, 0x28, %o2 <== NOT EXECUTED 400237ec: 7f ff 8d 86 call 40006e04 <__assert> <== NOT EXECUTED 400237f0: b0 10 20 00 clr %i0 <== NOT EXECUTED return 0; } 400237f4: 81 c7 e0 08 ret <== NOT EXECUTED 400237f8: 81 e8 00 00 restore <== NOT EXECUTED 40023784 : assert( 0 ); return 0; } int POSIX_NOT_IMPLEMENTED() { 40023784: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED assert( 0 ); 40023788: 92 10 20 28 mov 0x28, %o1 <== NOT EXECUTED 4002378c: 11 10 00 9d sethi %hi(0x40027400), %o0 <== NOT EXECUTED 40023790: 15 10 00 8f sethi %hi(0x40023c00), %o2 <== NOT EXECUTED 40023794: 90 12 22 08 or %o0, 0x208, %o0 <== NOT EXECUTED 40023798: 94 12 a0 28 or %o2, 0x28, %o2 <== NOT EXECUTED 4002379c: 7f ff 8d 9a call 40006e04 <__assert> <== NOT EXECUTED 400237a0: b0 10 20 00 clr %i0 <== NOT EXECUTED return 0; } 400237a4: 81 c7 e0 08 ret <== NOT EXECUTED 400237a8: 81 e8 00 00 restore <== NOT EXECUTED 40003390 : void RTEMS_Malloc_Initialize( void *start, size_t length, size_t sbrk_amount ) { 40003390: 9d e3 bf 98 save %sp, -104, %sp */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 40003394: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40003398: 82 10 60 74 or %g1, 0x74, %g1 ! 4001ac74 */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 4000339c: c2 20 7f fc st %g1, [ %g1 + -4 ] 400033a0: 82 00 7f fc add %g1, -4, %g1 the_chain->permanent_null = NULL; the_chain->last = _Chain_Head(the_chain); 400033a4: c2 20 60 08 st %g1, [ %g1 + 8 ] RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); the_chain->permanent_null = NULL; 400033a8: c0 20 60 04 clr [ %g1 + 4 ] * get length worth of memory using sbrk. Make sure we * align the address that we get back. */ starting_address = start; RTEMS_Malloc_Sbrk_amount = sbrk_amount; 400033ac: 03 10 00 6b sethi %hi(0x4001ac00), %g1 if (!starting_address) { 400033b0: 80 a6 20 00 cmp %i0, 0 400033b4: 12 80 00 11 bne 400033f8 400033b8: f4 20 60 6c st %i2, [ %g1 + 0x6c ] uaddress = (uintptr_t)sbrk(length); 400033bc: 7f ff fa 29 call 40001c60 <== NOT EXECUTED 400033c0: 90 10 00 19 mov %i1, %o0 <== NOT EXECUTED if (uaddress == (uintptr_t) -1) { 400033c4: 80 a2 3f ff cmp %o0, -1 <== NOT EXECUTED 400033c8: 12 80 00 04 bne 400033d8 <== NOT EXECUTED 400033cc: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED rtems_fatal_error_occurred( RTEMS_NO_MEMORY ); 400033d0: 40 00 0f fb call 400073bc <== NOT EXECUTED 400033d4: 90 10 20 1a mov 0x1a, %o0 <== NOT EXECUTED /* DOES NOT RETURN!!! */ } if (uaddress & (CPU_HEAP_ALIGNMENT-1)) { 400033d8: 80 8e 20 07 btst 7, %i0 <== NOT EXECUTED 400033dc: 02 80 00 08 be 400033fc <== NOT EXECUTED 400033e0: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED old_address = uaddress; uaddress = (uaddress + CPU_HEAP_ALIGNMENT) & ~(CPU_HEAP_ALIGNMENT-1); 400033e4: 82 06 20 08 add %i0, 8, %g1 <== NOT EXECUTED 400033e8: 82 08 7f f8 and %g1, -8, %g1 <== NOT EXECUTED /* * adjust the length by whatever we aligned by */ length -= uaddress - old_address; 400033ec: 84 20 40 18 sub %g1, %i0, %g2 <== NOT EXECUTED 400033f0: b0 10 00 01 mov %g1, %i0 <== NOT EXECUTED 400033f4: b2 26 40 02 sub %i1, %g2, %i1 <== NOT EXECUTED * 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 ( rtems_cpu_configuration_get_do_zero_of_workspace() ) 400033f8: 03 10 00 6b sethi %hi(0x4001ac00), %g1 400033fc: c2 00 61 f4 ld [ %g1 + 0x1f4 ], %g1 ! 4001adf4 <_CPU_Table+0x10> 40003400: 80 a0 60 00 cmp %g1, 0 40003404: 02 80 00 07 be 40003420 40003408: 92 10 00 18 mov %i0, %o1 memset( starting_address, 0, length ); 4000340c: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40003410: 92 10 20 00 clr %o1 <== NOT EXECUTED 40003414: 40 00 30 ec call 4000f7c4 <== NOT EXECUTED 40003418: 94 10 00 19 mov %i1, %o2 <== NOT EXECUTED void *starting_address, size_t size, uint32_t page_size ) { return _Heap_Initialize( the_heap, starting_address, size, page_size ); 4000341c: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED 40003420: 94 10 00 19 mov %i1, %o2 40003424: 11 10 00 6b sethi %hi(0x4001ac00), %o0 40003428: 96 10 20 08 mov 8, %o3 4000342c: 40 00 12 c1 call 40007f30 <_Heap_Initialize> 40003430: 90 12 20 14 or %o0, 0x14, %o0 &RTEMS_Malloc_Heap, starting_address, length, CPU_HEAP_ALIGNMENT ); if ( !status ) 40003434: 80 a2 20 00 cmp %o0, 0 40003438: 12 80 00 04 bne 40003448 4000343c: 01 00 00 00 nop rtems_fatal_error_occurred( status ); 40003440: 40 00 0f df call 400073bc <== NOT EXECUTED 40003444: 91 e8 20 00 restore %g0, 0, %o0 <== NOT EXECUTED 40003448: 81 c7 e0 08 ret 4000344c: 81 e8 00 00 restore 40003520 : static rtems_printk_plugin_t print_handler; void Stack_check_Dump_threads_usage( Thread_Control *the_thread ) { 40003520: 9d e3 bf 88 save %sp, -120, %sp <== NOT EXECUTED void *low; void *high_water_mark; Stack_Control *stack; char name[5]; if ( !the_thread ) 40003524: 80 a6 20 00 cmp %i0, 0 <== NOT EXECUTED 40003528: 02 80 00 3e be 40003620 <== NOT EXECUTED 4000352c: 03 10 00 7c sethi %hi(0x4001f000), %g1 <== NOT EXECUTED return; if ( !print_handler ) 40003530: c2 00 60 30 ld [ %g1 + 0x30 ], %g1 ! 4001f030 <== NOT EXECUTED 40003534: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40003538: 02 80 00 3a be 40003620 <== NOT EXECUTED 4000353c: 80 a6 3f ff cmp %i0, -1 <== NOT EXECUTED /* * XXX HACK to get to interrupt stack */ if (the_thread == (Thread_Control *) -1) { 40003540: 12 80 00 09 bne 40003564 <== NOT EXECUTED 40003544: a2 06 20 d0 add %i0, 0xd0, %l1 <== NOT EXECUTED if (Stack_check_Interrupt_stack.area) { 40003548: 03 10 00 7c sethi %hi(0x4001f000), %g1 <== NOT EXECUTED 4000354c: 82 10 61 f4 or %g1, 0x1f4, %g1 ! 4001f1f4 <== NOT EXECUTED 40003550: c4 00 60 04 ld [ %g1 + 4 ], %g2 <== NOT EXECUTED stack = &Stack_check_Interrupt_stack; the_thread = 0; } else return; 40003554: a2 10 00 01 mov %g1, %l1 <== NOT EXECUTED /* * XXX HACK to get to interrupt stack */ if (the_thread == (Thread_Control *) -1) { if (Stack_check_Interrupt_stack.area) { 40003558: 80 a0 a0 00 cmp %g2, 0 <== NOT EXECUTED 4000355c: 02 80 00 31 be 40003620 <== NOT EXECUTED 40003560: b0 10 20 00 clr %i0 <== NOT EXECUTED else return; } else stack = &the_thread->Start.Initial_stack; low = Stack_check_usable_stack_start(stack); 40003564: c2 04 60 04 ld [ %l1 + 4 ], %g1 <== NOT EXECUTED size = Stack_check_usable_stack_size(stack); 40003568: c4 04 40 00 ld [ %l1 ], %g2 <== NOT EXECUTED else return; } else stack = &the_thread->Start.Initial_stack; low = Stack_check_usable_stack_start(stack); 4000356c: a0 00 60 10 add %g1, 0x10, %l0 <== NOT EXECUTED size = Stack_check_usable_stack_size(stack); 40003570: a4 00 bf f0 add %g2, -16, %l2 <== NOT EXECUTED high_water_mark = Stack_check_find_high_water_mark(low, size); 40003574: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 40003578: 92 10 00 12 mov %l2, %o1 <== NOT EXECUTED 4000357c: 7f ff ff d9 call 400034e0 <== NOT EXECUTED 40003580: a6 10 20 00 clr %l3 <== NOT EXECUTED if ( high_water_mark ) 40003584: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40003588: 02 80 00 03 be 40003594 <== NOT EXECUTED 4000358c: 82 04 00 12 add %l0, %l2, %g1 <== NOT EXECUTED used = Stack_check_Calculate_used( low, size, high_water_mark ); 40003590: a6 20 40 08 sub %g1, %o0, %l3 <== NOT EXECUTED else used = 0; if ( the_thread ) { 40003594: 80 a6 20 00 cmp %i0, 0 <== NOT EXECUTED 40003598: 02 80 00 07 be 400035b4 <== NOT EXECUTED 4000359c: 92 10 20 05 mov 5, %o1 <== NOT EXECUTED rtems_object_get_name( the_thread->Object.id, sizeof(name), name ); 400035a0: d0 06 20 08 ld [ %i0 + 8 ], %o0 <== NOT EXECUTED 400035a4: 40 00 10 21 call 40007628 <== NOT EXECUTED 400035a8: 94 07 bf f3 add %fp, -13, %o2 <== NOT EXECUTED name[ 2 ] = 'T'; name[ 3 ] = 'R'; name[ 4 ] = '\0'; } (*print_handler)( 400035ac: 10 80 00 0c b 400035dc <== NOT EXECUTED 400035b0: 03 10 00 7c sethi %hi(0x4001f000), %g1 <== NOT EXECUTED used = 0; if ( the_thread ) { rtems_object_get_name( the_thread->Object.id, sizeof(name), name ); } else { name[ 0 ] = 'I'; 400035b4: 82 10 20 49 mov 0x49, %g1 <== NOT EXECUTED 400035b8: c2 2f bf f3 stb %g1, [ %fp + -13 ] <== NOT EXECUTED name[ 1 ] = 'N'; 400035bc: 82 10 20 4e mov 0x4e, %g1 <== NOT EXECUTED 400035c0: c2 2f bf f4 stb %g1, [ %fp + -12 ] <== NOT EXECUTED name[ 2 ] = 'T'; 400035c4: 82 10 20 54 mov 0x54, %g1 <== NOT EXECUTED name[ 3 ] = 'R'; name[ 4 ] = '\0'; 400035c8: c0 2f bf f7 clrb [ %fp + -9 ] <== NOT EXECUTED if ( the_thread ) { rtems_object_get_name( the_thread->Object.id, sizeof(name), name ); } else { name[ 0 ] = 'I'; name[ 1 ] = 'N'; name[ 2 ] = 'T'; 400035cc: c2 2f bf f5 stb %g1, [ %fp + -11 ] <== NOT EXECUTED name[ 3 ] = 'R'; 400035d0: 82 10 20 52 mov 0x52, %g1 <== NOT EXECUTED 400035d4: c2 2f bf f6 stb %g1, [ %fp + -10 ] <== NOT EXECUTED name[ 4 ] = '\0'; } (*print_handler)( 400035d8: 03 10 00 7c sethi %hi(0x4001f000), %g1 <== NOT EXECUTED 400035dc: 80 a6 20 00 cmp %i0, 0 <== NOT EXECUTED 400035e0: c4 00 60 30 ld [ %g1 + 0x30 ], %g2 <== NOT EXECUTED 400035e4: 94 10 3f ff mov -1, %o2 <== NOT EXECUTED 400035e8: 03 10 00 7c sethi %hi(0x4001f000), %g1 <== NOT EXECUTED 400035ec: 02 80 00 03 be 400035f8 <== NOT EXECUTED 400035f0: d0 00 60 2c ld [ %g1 + 0x2c ], %o0 ! 4001f02c <== NOT EXECUTED 400035f4: d4 06 20 08 ld [ %i0 + 8 ], %o2 <== NOT EXECUTED 400035f8: da 04 40 00 ld [ %l1 ], %o5 <== NOT EXECUTED 400035fc: d8 04 60 04 ld [ %l1 + 4 ], %o4 <== NOT EXECUTED 40003600: 13 10 00 70 sethi %hi(0x4001c000), %o1 <== NOT EXECUTED 40003604: 9a 03 00 0d add %o4, %o5, %o5 <== NOT EXECUTED 40003608: e4 23 a0 5c st %l2, [ %sp + 0x5c ] <== NOT EXECUTED 4000360c: e6 23 a0 60 st %l3, [ %sp + 0x60 ] <== NOT EXECUTED 40003610: 9a 03 7f ff add %o5, -1, %o5 <== NOT EXECUTED 40003614: 92 12 63 b0 or %o1, 0x3b0, %o1 <== NOT EXECUTED 40003618: 9f c0 80 00 call %g2 <== NOT EXECUTED 4000361c: 96 07 bf f3 add %fp, -13, %o3 <== NOT EXECUTED 40003620: 81 c7 e0 08 ret <== NOT EXECUTED 40003624: 81 e8 00 00 restore <== NOT EXECUTED 400034e0 : /* * start at lower memory and find first word that does not * match pattern */ base += PATTERN_SIZE_WORDS; 400034e0: 90 02 20 10 add %o0, 0x10, %o0 <== NOT EXECUTED for (ebase = base + length; base < ebase; base++) 400034e4: 92 0a 7f fc and %o1, -4, %o1 <== NOT EXECUTED if (*base != U32_PATTERN) 400034e8: 03 29 69 69 sethi %hi(0xa5a5a400), %g1 <== NOT EXECUTED * start at lower memory and find first word that does not * match pattern */ base += PATTERN_SIZE_WORDS; for (ebase = base + length; base < ebase; base++) 400034ec: 84 02 00 09 add %o0, %o1, %g2 <== NOT EXECUTED if (*base != U32_PATTERN) 400034f0: 10 80 00 06 b 40003508 <== NOT EXECUTED 400034f4: 86 10 61 a5 or %g1, 0x1a5, %g3 <== NOT EXECUTED 400034f8: 80 a0 40 03 cmp %g1, %g3 <== NOT EXECUTED 400034fc: 12 80 00 07 bne 40003518 <== NOT EXECUTED 40003500: 01 00 00 00 nop <== NOT EXECUTED * start at lower memory and find first word that does not * match pattern */ base += PATTERN_SIZE_WORDS; for (ebase = base + length; base < ebase; base++) 40003504: 90 02 20 04 add %o0, 4, %o0 <== NOT EXECUTED 40003508: 80 a2 00 02 cmp %o0, %g2 <== NOT EXECUTED 4000350c: 2a bf ff fb bcs,a 400034f8 <== NOT EXECUTED 40003510: c2 02 00 00 ld [ %o0 ], %g1 <== NOT EXECUTED 40003514: 90 10 20 00 clr %o0 <== NOT EXECUTED if (*base != U32_PATTERN) return (void *) base; #endif return (void *)0; } 40003518: 81 c3 e0 08 retl <== NOT EXECUTED 4000351c: 01 00 00 00 nop 400036dc : */ void Stack_check_report_blown_task( Thread_Control *running, boolean pattern_ok ) { 400036dc: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED Stack_Control *stack = &running->Start.Initial_stack; printk( 400036e0: d4 1e 20 08 ldd [ %i0 + 8 ], %o2 <== NOT EXECUTED 400036e4: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED 400036e8: 11 10 00 71 sethi %hi(0x4001c400), %o0 <== NOT EXECUTED 400036ec: 40 00 05 b9 call 40004dd0 <== NOT EXECUTED 400036f0: 90 12 20 38 or %o0, 0x38, %o0 ! 4001c438 <== NOT EXECUTED rtems_configuration_get_user_multiprocessing_table()->node ); } #endif printk( 400036f4: d4 06 20 d4 ld [ %i0 + 0xd4 ], %o2 <== NOT EXECUTED 400036f8: c2 06 20 d0 ld [ %i0 + 0xd0 ], %g1 <== NOT EXECUTED 400036fc: 92 10 00 0a mov %o2, %o1 <== NOT EXECUTED 40003700: 96 10 00 01 mov %g1, %o3 <== NOT EXECUTED 40003704: 94 02 80 01 add %o2, %g1, %o2 <== NOT EXECUTED 40003708: 11 10 00 71 sethi %hi(0x4001c400), %o0 <== NOT EXECUTED 4000370c: 94 02 bf ff add %o2, -1, %o2 <== NOT EXECUTED 40003710: 40 00 05 b0 call 40004dd0 <== NOT EXECUTED 40003714: 90 12 20 78 or %o0, 0x78, %o0 <== NOT EXECUTED stack->area, stack->area + stack->size - 1, stack->size ); if ( !pattern_ok ) { 40003718: 80 a6 60 00 cmp %i1, 0 <== NOT EXECUTED 4000371c: 12 80 00 07 bne 40003738 <== NOT EXECUTED 40003720: 11 10 00 71 sethi %hi(0x4001c400), %o0 <== NOT EXECUTED printk( 40003724: d2 06 20 d4 ld [ %i0 + 0xd4 ], %o1 <== NOT EXECUTED 40003728: 92 02 60 08 add %o1, 8, %o1 <== NOT EXECUTED 4000372c: 90 12 20 a8 or %o0, 0xa8, %o0 <== NOT EXECUTED 40003730: 40 00 05 a8 call 40004dd0 <== NOT EXECUTED 40003734: 94 10 20 10 mov 0x10, %o2 <== NOT EXECUTED " Damaged pattern begins at 0x%08lx and is %ld bytes long\n", (unsigned long) Stack_check_Get_pattern_area(stack), (long) PATTERN_SIZE_BYTES); } rtems_fatal_error_occurred( 0x81 ); 40003738: 40 00 13 b8 call 40008618 <== NOT EXECUTED 4000373c: 91 e8 20 81 restore %g0, 0x81, %o0 <== NOT EXECUTED 40003740: 01 00 00 00 nop 400075cc <_API_extensions_Run_postdriver>: * * _API_extensions_Run_postdriver */ void _API_extensions_Run_postdriver( void ) { 400075cc: 9d e3 bf 98 save %sp, -104, %sp Chain_Node *the_node; API_extensions_Control *the_extension; for ( the_node = _API_extensions_List.first ; 400075d0: 03 10 00 6c sethi %hi(0x4001b000), %g1 400075d4: e0 00 60 60 ld [ %g1 + 0x60 ], %l0 ! 4001b060 <_API_extensions_List> */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 400075d8: 03 10 00 6c sethi %hi(0x4001b000), %g1 400075dc: 10 80 00 08 b 400075fc <_API_extensions_Run_postdriver+0x30> 400075e0: a2 10 60 64 or %g1, 0x64, %l1 ! 4001b064 <_API_extensions_List+0x4> !_Chain_Is_tail( &_API_extensions_List, the_node ) ; the_node = the_node->next ) { the_extension = (API_extensions_Control *) the_node; if ( the_extension->postdriver_hook ) 400075e4: 80 a0 60 00 cmp %g1, 0 400075e8: 22 80 00 05 be,a 400075fc <_API_extensions_Run_postdriver+0x30> 400075ec: e0 04 00 00 ld [ %l0 ], %l0 <== NOT EXECUTED (*the_extension->postdriver_hook)(); 400075f0: 9f c0 40 00 call %g1 400075f4: 01 00 00 00 nop Chain_Node *the_node; API_extensions_Control *the_extension; for ( the_node = _API_extensions_List.first ; !_Chain_Is_tail( &_API_extensions_List, the_node ) ; the_node = the_node->next ) { 400075f8: e0 04 00 00 ld [ %l0 ], %l0 { Chain_Node *the_node; API_extensions_Control *the_extension; for ( the_node = _API_extensions_List.first ; !_Chain_Is_tail( &_API_extensions_List, the_node ) ; 400075fc: 80 a4 00 11 cmp %l0, %l1 40007600: 32 bf ff f9 bne,a 400075e4 <_API_extensions_Run_postdriver+0x18> 40007604: c2 04 20 0c ld [ %l0 + 0xc ], %g1 the_extension = (API_extensions_Control *) the_node; if ( the_extension->postdriver_hook ) (*the_extension->postdriver_hook)(); } } 40007608: 81 c7 e0 08 ret 4000760c: 81 e8 00 00 restore 40007670 <_API_extensions_Run_postswitch>: * * _API_extensions_Run_postswitch */ void _API_extensions_Run_postswitch( void ) { 40007670: 9d e3 bf 98 save %sp, -104, %sp Chain_Node *the_node; API_extensions_Control *the_extension; for ( the_node = _API_extensions_List.first ; 40007674: 03 10 00 6c sethi %hi(0x4001b000), %g1 40007678: e0 00 60 60 ld [ %g1 + 0x60 ], %l0 ! 4001b060 <_API_extensions_List> the_node = the_node->next ) { the_extension = (API_extensions_Control *) the_node; if ( the_extension->postswitch_hook ) (*the_extension->postswitch_hook)( _Thread_Executing ); 4000767c: 23 10 00 6b sethi %hi(0x4001ac00), %l1 40007680: 03 10 00 6c sethi %hi(0x4001b000), %g1 40007684: 10 80 00 08 b 400076a4 <_API_extensions_Run_postswitch+0x34> 40007688: a4 10 60 64 or %g1, 0x64, %l2 ! 4001b064 <_API_extensions_List+0x4> !_Chain_Is_tail( &_API_extensions_List, the_node ) ; the_node = the_node->next ) { the_extension = (API_extensions_Control *) the_node; if ( the_extension->postswitch_hook ) 4000768c: 80 a0 60 00 cmp %g1, 0 40007690: 22 80 00 05 be,a 400076a4 <_API_extensions_Run_postswitch+0x34> 40007694: e0 04 00 00 ld [ %l0 ], %l0 <== NOT EXECUTED (*the_extension->postswitch_hook)( _Thread_Executing ); 40007698: 9f c0 40 00 call %g1 4000769c: d0 04 62 ac ld [ %l1 + 0x2ac ], %o0 Chain_Node *the_node; API_extensions_Control *the_extension; for ( the_node = _API_extensions_List.first ; !_Chain_Is_tail( &_API_extensions_List, the_node ) ; the_node = the_node->next ) { 400076a0: e0 04 00 00 ld [ %l0 ], %l0 { Chain_Node *the_node; API_extensions_Control *the_extension; for ( the_node = _API_extensions_List.first ; !_Chain_Is_tail( &_API_extensions_List, the_node ) ; 400076a4: 80 a4 00 12 cmp %l0, %l2 400076a8: 32 bf ff f9 bne,a 4000768c <_API_extensions_Run_postswitch+0x1c> 400076ac: c2 04 20 10 ld [ %l0 + 0x10 ], %g1 the_extension = (API_extensions_Control *) the_node; if ( the_extension->postswitch_hook ) (*the_extension->postswitch_hook)( _Thread_Executing ); } } 400076b0: 81 c7 e0 08 ret 400076b4: 81 e8 00 00 restore 4000762c <_API_extensions_Run_predriver>: * * _API_extensions_Run_predriver */ void _API_extensions_Run_predriver( void ) { 4000762c: 9d e3 bf 98 save %sp, -104, %sp Chain_Node *the_node; API_extensions_Control *the_extension; for ( the_node = _API_extensions_List.first ; 40007630: 03 10 00 6c sethi %hi(0x4001b000), %g1 40007634: e0 00 60 60 ld [ %g1 + 0x60 ], %l0 ! 4001b060 <_API_extensions_List> 40007638: 03 10 00 6c sethi %hi(0x4001b000), %g1 4000763c: 10 80 00 08 b 4000765c <_API_extensions_Run_predriver+0x30> 40007640: a2 10 60 64 or %g1, 0x64, %l1 ! 4001b064 <_API_extensions_List+0x4> !_Chain_Is_tail( &_API_extensions_List, the_node ) ; the_node = the_node->next ) { the_extension = (API_extensions_Control *) the_node; if ( the_extension->predriver_hook ) 40007644: 80 a0 60 00 cmp %g1, 0 40007648: 22 80 00 05 be,a 4000765c <_API_extensions_Run_predriver+0x30> 4000764c: e0 04 00 00 ld [ %l0 ], %l0 (*the_extension->predriver_hook)(); 40007650: 9f c0 40 00 call %g1 <== NOT EXECUTED 40007654: 01 00 00 00 nop <== NOT EXECUTED Chain_Node *the_node; API_extensions_Control *the_extension; for ( the_node = _API_extensions_List.first ; !_Chain_Is_tail( &_API_extensions_List, the_node ) ; the_node = the_node->next ) { 40007658: e0 04 00 00 ld [ %l0 ], %l0 <== NOT EXECUTED { Chain_Node *the_node; API_extensions_Control *the_extension; for ( the_node = _API_extensions_List.first ; !_Chain_Is_tail( &_API_extensions_List, the_node ) ; 4000765c: 80 a4 00 11 cmp %l0, %l1 40007660: 32 bf ff f9 bne,a 40007644 <_API_extensions_Run_predriver+0x18> 40007664: c2 04 20 08 ld [ %l0 + 8 ], %g1 the_extension = (API_extensions_Control *) the_node; if ( the_extension->predriver_hook ) (*the_extension->predriver_hook)(); } } 40007668: 81 c7 e0 08 ret 4000766c: 81 e8 00 00 restore 40009948 <_CORE_RWLock_Release>: */ CORE_RWLock_Status _CORE_RWLock_Release( CORE_RWLock_Control *the_rwlock ) { 40009948: 9d e3 bf 98 save %sp, -104, %sp ISR_Level level; Thread_Control *executing = _Thread_Executing; 4000994c: 03 10 00 76 sethi %hi(0x4001d800), %g1 * 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 ); 40009950: 7f ff e5 0a call 40002d78 40009954: e0 00 61 ac ld [ %g1 + 0x1ac ], %l0 ! 4001d9ac <_Thread_Executing> 40009958: 84 10 00 08 mov %o0, %g2 switch ( the_rwlock->current_state ) { 4000995c: c2 06 20 44 ld [ %i0 + 0x44 ], %g1 40009960: 80 a0 60 01 cmp %g1, 1 40009964: 22 80 00 0e be,a 4000999c <_CORE_RWLock_Release+0x54> 40009968: c2 06 20 48 ld [ %i0 + 0x48 ], %g1 4000996c: 0a 80 00 06 bcs 40009984 <_CORE_RWLock_Release+0x3c> 40009970: 80 a0 60 02 cmp %g1, 2 40009974: 32 80 00 13 bne,a 400099c0 <_CORE_RWLock_Release+0x78> 40009978: c0 26 20 44 clr [ %i0 + 0x44 ] <== NOT EXECUTED return CORE_RWLOCK_SUCCESSFUL; } executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL; break; case CORE_RWLOCK_LOCKED_FOR_WRITING: executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL; 4000997c: 10 80 00 10 b 400099bc <_CORE_RWLock_Release+0x74> 40009980: c0 24 20 34 clr [ %l0 + 0x34 ] */ _ISR_Disable( level ); switch ( the_rwlock->current_state ) { case CORE_RWLOCK_UNLOCKED: _ISR_Enable( level ); 40009984: 7f ff e5 01 call 40002d88 <== NOT EXECUTED 40009988: b0 10 20 00 clr %i0 <== NOT EXECUTED executing->Wait.return_code = CORE_RWLOCK_UNAVAILABLE; 4000998c: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED 40009990: c2 24 20 34 st %g1, [ %l0 + 0x34 ] <== NOT EXECUTED 40009994: 81 c7 e0 08 ret <== NOT EXECUTED 40009998: 81 e8 00 00 restore <== NOT EXECUTED return CORE_RWLOCK_SUCCESSFUL; case CORE_RWLOCK_LOCKED_FOR_READING: the_rwlock->number_of_readers -= 1; 4000999c: 82 00 7f ff add %g1, -1, %g1 if ( the_rwlock->number_of_readers != 0 ) { 400099a0: 80 a0 60 00 cmp %g1, 0 400099a4: 02 80 00 05 be 400099b8 <_CORE_RWLock_Release+0x70> 400099a8: c2 26 20 48 st %g1, [ %i0 + 0x48 ] /* must be unlocked again */ _ISR_Enable( level ); 400099ac: 7f ff e4 f7 call 40002d88 400099b0: b0 10 20 00 clr %i0 400099b4: 30 80 00 25 b,a 40009a48 <_CORE_RWLock_Release+0x100> return CORE_RWLOCK_SUCCESSFUL; } executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL; break; case CORE_RWLOCK_LOCKED_FOR_WRITING: executing->Wait.return_code = CORE_RWLOCK_SUCCESSFUL; 400099b8: c0 24 20 34 clr [ %l0 + 0x34 ] /* * Implicitly transition to "unlocked" and find another thread interested * in obtaining this rwlock. */ the_rwlock->current_state = CORE_RWLOCK_UNLOCKED; 400099bc: c0 26 20 44 clr [ %i0 + 0x44 ] _ISR_Enable( level ); 400099c0: 7f ff e4 f2 call 40002d88 400099c4: 90 10 00 02 mov %g2, %o0 next = _Thread_queue_Dequeue( &the_rwlock->Wait_queue ); 400099c8: 40 00 09 36 call 4000bea0 <_Thread_queue_Dequeue> 400099cc: 90 10 00 18 mov %i0, %o0 if ( next ) { 400099d0: 80 a2 20 00 cmp %o0, 0 400099d4: 22 80 00 1d be,a 40009a48 <_CORE_RWLock_Release+0x100> 400099d8: b0 10 20 00 clr %i0 if ( next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) { 400099dc: c2 02 20 30 ld [ %o0 + 0x30 ], %g1 400099e0: 80 a0 60 01 cmp %g1, 1 400099e4: 32 80 00 05 bne,a 400099f8 <_CORE_RWLock_Release+0xb0> 400099e8: c2 06 20 48 ld [ %i0 + 0x48 ], %g1 the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_WRITING; 400099ec: 82 10 20 02 mov 2, %g1 400099f0: 10 80 00 15 b 40009a44 <_CORE_RWLock_Release+0xfc> 400099f4: c2 26 20 44 st %g1, [ %i0 + 0x44 ] /* * Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING */ the_rwlock->number_of_readers += 1; the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING; 400099f8: 84 10 20 01 mov 1, %g2 } /* * Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING */ the_rwlock->number_of_readers += 1; 400099fc: 82 00 60 01 inc %g1 the_rwlock->current_state = CORE_RWLOCK_LOCKED_FOR_READING; 40009a00: c4 26 20 44 st %g2, [ %i0 + 0x44 ] } /* * Must be CORE_RWLOCK_THREAD_WAITING_FOR_READING */ the_rwlock->number_of_readers += 1; 40009a04: c2 26 20 48 st %g1, [ %i0 + 0x48 ] /* * Now see if more readers can be let go. */ while ( 1 ) { next = _Thread_queue_First( &the_rwlock->Wait_queue ); 40009a08: 40 00 0a ba call 4000c4f0 <_Thread_queue_First> 40009a0c: 90 10 00 18 mov %i0, %o0 if ( !next || 40009a10: 80 a2 20 00 cmp %o0, 0 40009a14: 22 80 00 0d be,a 40009a48 <_CORE_RWLock_Release+0x100> 40009a18: b0 10 20 00 clr %i0 40009a1c: c2 02 20 30 ld [ %o0 + 0x30 ], %g1 40009a20: 80 a0 60 01 cmp %g1, 1 40009a24: 02 80 00 08 be 40009a44 <_CORE_RWLock_Release+0xfc> 40009a28: 92 10 00 08 mov %o0, %o1 next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) return CORE_RWLOCK_SUCCESSFUL; the_rwlock->number_of_readers += 1; 40009a2c: c2 06 20 48 ld [ %i0 + 0x48 ], %g1 _Thread_queue_Extract( &the_rwlock->Wait_queue, next ); 40009a30: 90 10 00 18 mov %i0, %o0 while ( 1 ) { next = _Thread_queue_First( &the_rwlock->Wait_queue ); if ( !next || next->Wait.option == CORE_RWLOCK_THREAD_WAITING_FOR_WRITE ) return CORE_RWLOCK_SUCCESSFUL; the_rwlock->number_of_readers += 1; 40009a34: 82 00 60 01 inc %g1 _Thread_queue_Extract( &the_rwlock->Wait_queue, next ); 40009a38: 40 00 0a 41 call 4000c33c <_Thread_queue_Extract> 40009a3c: c2 26 20 48 st %g1, [ %i0 + 0x48 ] 40009a40: 30 bf ff f2 b,a 40009a08 <_CORE_RWLock_Release+0xc0> } } /* indentation is to match _ISR_Disable at top */ return CORE_RWLOCK_SUCCESSFUL; } 40009a44: b0 10 20 00 clr %i0 40009a48: 81 c7 e0 08 ret 40009a4c: 81 e8 00 00 restore 40009a50 <_CORE_RWLock_Timeout>: void _CORE_RWLock_Timeout( Objects_Id id, void *ignored ) { 40009a50: 9d e3 bf 90 save %sp, -112, %sp uint32_t the_api; uint32_t the_class; Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { 40009a54: 92 96 20 00 orcc %i0, 0, %o1 40009a58: 12 80 00 0a bne 40009a80 <_CORE_RWLock_Timeout+0x30> 40009a5c: 83 32 60 18 srl %o1, 0x18, %g1 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40009a60: 03 10 00 76 sethi %hi(0x4001d800), %g1 <== NOT EXECUTED 40009a64: c4 00 60 d0 ld [ %g1 + 0xd0 ], %g2 ! 4001d8d0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40009a68: 84 00 a0 01 inc %g2 <== NOT EXECUTED 40009a6c: c4 20 60 d0 st %g2, [ %g1 + 0xd0 ] <== NOT EXECUTED Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; tp = _Thread_Executing; 40009a70: 03 10 00 76 sethi %hi(0x4001d800), %g1 <== NOT EXECUTED 40009a74: d2 00 61 ac ld [ %g1 + 0x1ac ], %o1 ! 4001d9ac <_Thread_Executing> <== NOT EXECUTED Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; 40009a78: 10 80 00 18 b 40009ad8 <_CORE_RWLock_Timeout+0x88> <== NOT EXECUTED 40009a7c: c0 27 bf f4 clr [ %fp + -12 ] <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API( Objects_Id id ) { return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS); 40009a80: 84 08 60 07 and %g1, 7, %g2 tp = _Thread_Executing; goto done; } the_api = _Objects_Get_API( id ); if ( the_api && the_api > OBJECTS_APIS_LAST ) { 40009a84: 80 a0 a0 04 cmp %g2, 4 40009a88: 18 80 00 0e bgu 40009ac0 <_CORE_RWLock_Timeout+0x70> 40009a8c: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; goto done; } the_class = _Objects_Get_class( id ); if ( the_class != 1 ) { /* threads are always first class :) */ 40009a90: 83 32 60 1b srl %o1, 0x1b, %g1 40009a94: 80 a0 60 01 cmp %g1, 1 40009a98: 12 80 00 0a bne 40009ac0 <_CORE_RWLock_Timeout+0x70> 40009a9c: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; goto done; } information = _Objects_Information_table[ the_api ][ the_class ]; 40009aa0: 83 28 a0 02 sll %g2, 2, %g1 40009aa4: 05 10 00 76 sethi %hi(0x4001d800), %g2 40009aa8: 84 10 a0 30 or %g2, 0x30, %g2 ! 4001d830 <_Objects_Information_table> 40009aac: c2 00 80 01 ld [ %g2 + %g1 ], %g1 40009ab0: d0 00 60 04 ld [ %g1 + 4 ], %o0 if ( !information ) { 40009ab4: 80 a2 20 00 cmp %o0, 0 40009ab8: 12 80 00 05 bne 40009acc <_CORE_RWLock_Timeout+0x7c> 40009abc: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 40009ac0: 92 10 20 00 clr %o1 <== NOT EXECUTED 40009ac4: 10 80 00 05 b 40009ad8 <_CORE_RWLock_Timeout+0x88> <== NOT EXECUTED 40009ac8: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED goto done; } tp = (Thread_Control *) _Objects_Get( information, id, location ); 40009acc: 40 00 03 46 call 4000a7e4 <_Objects_Get> 40009ad0: 94 07 bf f4 add %fp, -12, %o2 40009ad4: 92 10 00 08 mov %o0, %o1 Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); switch ( location ) { 40009ad8: c2 07 bf f4 ld [ %fp + -12 ], %g1 40009adc: 80 a0 60 00 cmp %g1, 0 40009ae0: 12 80 00 18 bne 40009b40 <_CORE_RWLock_Timeout+0xf0> 40009ae4: 01 00 00 00 nop */ static inline void _Thread_queue_Process_timeout( Thread_Control *the_thread ) { Thread_queue_Control *the_thread_queue = the_thread->Wait.queue; 40009ae8: c4 02 60 44 ld [ %o1 + 0x44 ], %g2 * 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_QUEUE_SYNCHRONIZED && 40009aec: c6 00 a0 30 ld [ %g2 + 0x30 ], %g3 40009af0: 80 a0 e0 00 cmp %g3, 0 40009af4: 02 80 00 0b be 40009b20 <_CORE_RWLock_Timeout+0xd0> 40009af8: 03 10 00 76 sethi %hi(0x4001d800), %g1 40009afc: c2 00 61 ac ld [ %g1 + 0x1ac ], %g1 ! 4001d9ac <_Thread_Executing> <== NOT EXECUTED 40009b00: 80 a2 40 01 cmp %o1, %g1 <== NOT EXECUTED 40009b04: 32 80 00 08 bne,a 40009b24 <_CORE_RWLock_Timeout+0xd4> <== NOT EXECUTED 40009b08: c2 00 a0 3c ld [ %g2 + 0x3c ], %g1 <== NOT EXECUTED _Thread_Is_executing( the_thread ) ) { if ( the_thread_queue->sync_state != THREAD_QUEUE_SATISFIED ) 40009b0c: 80 a0 e0 03 cmp %g3, 3 <== NOT EXECUTED 40009b10: 02 80 00 08 be 40009b30 <_CORE_RWLock_Timeout+0xe0> <== NOT EXECUTED 40009b14: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED the_thread_queue->sync_state = THREAD_QUEUE_TIMEOUT; 40009b18: 10 80 00 06 b 40009b30 <_CORE_RWLock_Timeout+0xe0> <== NOT EXECUTED 40009b1c: c2 20 a0 30 st %g1, [ %g2 + 0x30 ] <== NOT EXECUTED } else { the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status; 40009b20: c2 00 a0 3c ld [ %g2 + 0x3c ], %g1 _Thread_queue_Extract( the_thread->Wait.queue, the_thread ); 40009b24: d0 02 60 44 ld [ %o1 + 0x44 ], %o0 40009b28: 40 00 0a 05 call 4000c33c <_Thread_queue_Extract> 40009b2c: c2 22 60 34 st %g1, [ %o1 + 0x34 ] */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; 40009b30: 05 10 00 76 sethi %hi(0x4001d800), %g2 40009b34: c2 00 a0 d0 ld [ %g2 + 0xd0 ], %g1 ! 4001d8d0 <_Thread_Dispatch_disable_level> 40009b38: 82 00 7f ff add %g1, -1, %g1 40009b3c: c2 20 a0 d0 st %g1, [ %g2 + 0xd0 ] 40009b40: 81 c7 e0 08 ret 40009b44: 81 e8 00 00 restore 40014378 <_CORE_message_queue_Broadcast>: size_t size, Objects_Id id, CORE_message_queue_API_mp_support_callout api_message_queue_mp_support, uint32_t *count ) { 40014378: 9d e3 bf 98 save %sp, -104, %sp Thread_Control *the_thread; uint32_t number_broadcasted; Thread_Wait_information *waitp; if ( size > the_message_queue->maximum_message_size ) { 4001437c: c2 06 20 4c ld [ %i0 + 0x4c ], %g1 size_t size, Objects_Id id, CORE_message_queue_API_mp_support_callout api_message_queue_mp_support, uint32_t *count ) { 40014380: a4 10 00 18 mov %i0, %l2 Thread_Control *the_thread; uint32_t number_broadcasted; Thread_Wait_information *waitp; if ( size > the_message_queue->maximum_message_size ) { 40014384: 80 a6 80 01 cmp %i2, %g1 40014388: 18 80 00 17 bgu 400143e4 <_CORE_message_queue_Broadcast+0x6c> 4001438c: b0 10 20 01 mov 1, %i0 * 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 ) { 40014390: c2 04 a0 48 ld [ %l2 + 0x48 ], %g1 40014394: 80 a0 60 00 cmp %g1, 0 40014398: 02 80 00 0a be 400143c0 <_CORE_message_queue_Broadcast+0x48> 4001439c: a2 10 20 00 clr %l1 *count = 0; 400143a0: c0 27 40 00 clr [ %i5 ] <== NOT EXECUTED 400143a4: 81 c7 e0 08 ret <== NOT EXECUTED 400143a8: 91 e8 20 00 restore %g0, 0, %o0 <== NOT EXECUTED const void *source, void *destination, size_t size ) { memcpy(destination, source, size); 400143ac: d0 04 20 28 ld [ %l0 + 0x28 ], %o0 400143b0: 40 00 22 be call 4001cea8 400143b4: a2 04 60 01 inc %l1 buffer, waitp->return_argument, size ); *(uint32_t *)the_thread->Wait.return_argument_1 = size; 400143b8: c2 04 20 2c ld [ %l0 + 0x2c ], %g1 400143bc: f4 20 40 00 st %i2, [ %g1 ] * There must be no pending messages if there is a thread waiting to * receive a message. */ number_broadcasted = 0; while ((the_thread = _Thread_queue_Dequeue(&the_message_queue->Wait_queue))) { 400143c0: 40 00 0b 3f call 400170bc <_Thread_queue_Dequeue> 400143c4: 90 10 00 12 mov %l2, %o0 400143c8: 92 10 00 19 mov %i1, %o1 400143cc: a0 10 00 08 mov %o0, %l0 400143d0: 80 a2 20 00 cmp %o0, 0 400143d4: 12 bf ff f6 bne 400143ac <_CORE_message_queue_Broadcast+0x34> 400143d8: 94 10 00 1a mov %i2, %o2 if ( !_Objects_Is_local_id( the_thread->Object.id ) ) (*api_message_queue_mp_support) ( the_thread, id ); #endif } *count = number_broadcasted; 400143dc: e2 27 40 00 st %l1, [ %i5 ] 400143e0: b0 10 20 00 clr %i0 return CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL; } 400143e4: 81 c7 e0 08 ret 400143e8: 81 e8 00 00 restore 40014664 <_CORE_message_queue_Initialize>: CORE_message_queue_Control *the_message_queue, CORE_message_queue_Attributes *the_message_queue_attributes, uint32_t maximum_pending_messages, uint32_t maximum_message_size ) { 40014664: 9d e3 bf 98 save %sp, -104, %sp uint32_t message_buffering_required; uint32_t allocated_message_size; the_message_queue->maximum_pending_messages = maximum_pending_messages; the_message_queue->number_of_pending_messages = 0; 40014668: c0 26 20 48 clr [ %i0 + 0x48 ] ) { uint32_t message_buffering_required; uint32_t allocated_message_size; the_message_queue->maximum_pending_messages = maximum_pending_messages; 4001466c: f4 26 20 44 st %i2, [ %i0 + 0x44 ] the_message_queue->number_of_pending_messages = 0; the_message_queue->maximum_message_size = maximum_message_size; 40014670: f6 26 20 4c st %i3, [ %i0 + 0x4c ] CORE_message_queue_Control *the_message_queue, CORE_message_queue_Notify_Handler the_handler, void *the_argument ) { the_message_queue->notify_handler = the_handler; 40014674: c0 26 20 60 clr [ %i0 + 0x60 ] the_message_queue->notify_argument = the_argument; 40014678: c0 26 20 64 clr [ %i0 + 0x64 ] * 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)) { 4001467c: 80 8e e0 03 btst 3, %i3 40014680: 02 80 00 07 be 4001469c <_CORE_message_queue_Initialize+0x38> 40014684: a0 10 00 1b mov %i3, %l0 allocated_message_size += sizeof(uint32_t); 40014688: 82 06 e0 04 add %i3, 4, %g1 allocated_message_size &= ~(sizeof(uint32_t) - 1); 4001468c: a0 08 7f fc and %g1, -4, %l0 } if (allocated_message_size < maximum_message_size) 40014690: 80 a4 00 1b cmp %l0, %i3 40014694: 0a 80 00 24 bcs 40014724 <_CORE_message_queue_Initialize+0xc0> 40014698: 01 00 00 00 nop /* * Calculate how much total memory is required for message buffering and * check for overflow on the multiplication. */ message_buffering_required = maximum_pending_messages * 4001469c: b6 04 20 14 add %l0, 0x14, %i3 400146a0: 92 10 00 1a mov %i2, %o1 400146a4: 40 00 2a 67 call 4001f040 <.umul> 400146a8: 90 10 00 1b mov %i3, %o0 (allocated_message_size + sizeof(CORE_message_queue_Buffer_control)); if (message_buffering_required < allocated_message_size) 400146ac: 80 a2 00 10 cmp %o0, %l0 400146b0: 0a 80 00 1d bcs 40014724 <_CORE_message_queue_Initialize+0xc0> 400146b4: 92 10 00 08 mov %o0, %o1 400146b8: 11 10 00 97 sethi %hi(0x40025c00), %o0 400146bc: 7f ff e7 da call 4000e624 <_Heap_Allocate> 400146c0: 90 12 20 8c or %o0, 0x8c, %o0 ! 40025c8c <_Workspace_Area> * Attempt to allocate the message memory */ the_message_queue->message_buffers = (CORE_message_queue_Buffer *) _Workspace_Allocate( message_buffering_required ); if (the_message_queue->message_buffers == 0) 400146c4: 80 a2 20 00 cmp %o0, 0 400146c8: 02 80 00 17 be 40014724 <_CORE_message_queue_Initialize+0xc0> 400146cc: d0 26 20 5c st %o0, [ %i0 + 0x5c ] /* * Initialize the pool of inactive messages, pending messages, * and set of waiting threads. */ _Chain_Initialize ( 400146d0: 92 10 00 08 mov %o0, %o1 400146d4: 94 10 00 1a mov %i2, %o2 400146d8: 90 06 20 68 add %i0, 0x68, %o0 400146dc: 7f ff ff 88 call 400144fc <_Chain_Initialize> 400146e0: 96 10 00 1b mov %i3, %o3 allocated_message_size + sizeof( CORE_message_queue_Buffer_control ) ); _Chain_Initialize_empty( &the_message_queue->Pending_messages ); _Thread_queue_Initialize( 400146e4: c2 06 40 00 ld [ %i1 ], %g1 RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); the_chain->permanent_null = NULL; 400146e8: c0 26 20 54 clr [ %i0 + 0x54 ] 400146ec: 82 18 60 01 xor %g1, 1, %g1 400146f0: 80 a0 00 01 cmp %g0, %g1 */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 400146f4: 82 06 20 54 add %i0, 0x54, %g1 400146f8: c2 26 20 50 st %g1, [ %i0 + 0x50 ] the_chain->permanent_null = NULL; the_chain->last = _Chain_Head(the_chain); 400146fc: 82 06 20 50 add %i0, 0x50, %g1 40014700: 90 10 00 18 mov %i0, %o0 40014704: c2 26 20 58 st %g1, [ %i0 + 0x58 ] 40014708: 92 60 3f ff subx %g0, -1, %o1 4001470c: 94 10 20 80 mov 0x80, %o2 40014710: 96 10 20 06 mov 6, %o3 40014714: 7f ff f1 64 call 40010ca4 <_Thread_queue_Initialize> 40014718: b0 10 20 01 mov 1, %i0 4001471c: 81 c7 e0 08 ret 40014720: 81 e8 00 00 restore STATES_WAITING_FOR_MESSAGE, CORE_MESSAGE_QUEUE_STATUS_TIMEOUT ); return TRUE; } 40014724: 81 c7 e0 08 ret <== NOT EXECUTED 40014728: 91 e8 20 00 restore %g0, 0, %o0 <== NOT EXECUTED 400141f0 <_CORE_message_queue_Seize>: void *buffer, size_t *size, boolean wait, Watchdog_Interval timeout ) { 400141f0: 9d e3 bf 98 save %sp, -104, %sp ISR_Level level; CORE_message_queue_Buffer_control *the_message; Thread_Control *executing; Thread_Control *the_thread; executing = _Thread_Executing; 400141f4: 03 10 00 a7 sethi %hi(0x40029c00), %g1 400141f8: e2 00 61 3c ld [ %g1 + 0x13c ], %l1 ! 40029d3c <_Thread_Executing> void *buffer, size_t *size, boolean wait, Watchdog_Interval timeout ) { 400141fc: a0 10 00 18 mov %i0, %l0 Thread_Control *executing; Thread_Control *the_thread; executing = _Thread_Executing; executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_SUCCESSFUL; _ISR_Disable( level ); 40014200: 7f ff b9 1d call 40002674 40014204: c0 24 60 34 clr [ %l1 + 0x34 ] 40014208: 86 10 00 08 mov %o0, %g3 if ( the_message_queue->number_of_pending_messages != 0 ) { 4001420c: c2 06 20 48 ld [ %i0 + 0x48 ], %g1 40014210: 80 a0 60 00 cmp %g1, 0 40014214: 02 80 00 2a be 400142bc <_CORE_message_queue_Seize+0xcc> 40014218: 80 a7 20 00 cmp %i4, 0 */ RTEMS_INLINE_ROUTINE boolean _Chain_Is_empty( Chain_Control *the_chain ) { return (the_chain->first == _Chain_Tail(the_chain)); 4001421c: f2 06 20 50 ld [ %i0 + 0x50 ], %i1 the_message_queue->number_of_pending_messages -= 1; 40014220: 82 00 7f ff add %g1, -1, %g1 40014224: c2 26 20 48 st %g1, [ %i0 + 0x48 ] */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected( Chain_Control *the_chain ) { if ( !_Chain_Is_empty(the_chain)) 40014228: 82 06 20 54 add %i0, 0x54, %g1 4001422c: 80 a6 40 01 cmp %i1, %g1 40014230: 32 80 00 04 bne,a 40014240 <_CORE_message_queue_Seize+0x50> 40014234: c2 06 40 00 ld [ %i1 ], %g1 40014238: 10 80 00 05 b 4001424c <_CORE_message_queue_Seize+0x5c> <== NOT EXECUTED 4001423c: b2 10 20 00 clr %i1 <== NOT EXECUTED Chain_Node *new_first; return_node = the_chain->first; new_first = return_node->next; the_chain->first = new_first; new_first->previous = _Chain_Head(the_chain); 40014240: 84 06 20 50 add %i0, 0x50, %g2 Chain_Node *return_node; Chain_Node *new_first; return_node = the_chain->first; new_first = return_node->next; the_chain->first = new_first; 40014244: c2 26 20 50 st %g1, [ %i0 + 0x50 ] new_first->previous = _Chain_Head(the_chain); 40014248: c4 20 60 04 st %g2, [ %g1 + 4 ] the_message = _CORE_message_queue_Get_pending_message( the_message_queue ); _ISR_Enable( level ); 4001424c: 7f ff b9 0e call 40002684 40014250: 90 10 00 03 mov %g3, %o0 *size = the_message->Contents.size; 40014254: d4 06 60 0c ld [ %i1 + 0xc ], %o2 _Thread_Executing->Wait.count = the_message->priority; 40014258: 03 10 00 a7 sethi %hi(0x40029c00), %g1 the_message_queue->number_of_pending_messages -= 1; the_message = _CORE_message_queue_Get_pending_message( the_message_queue ); _ISR_Enable( level ); *size = the_message->Contents.size; 4001425c: d4 26 c0 00 st %o2, [ %i3 ] _Thread_Executing->Wait.count = the_message->priority; 40014260: c4 00 61 3c ld [ %g1 + 0x13c ], %g2 40014264: c2 06 60 08 ld [ %i1 + 8 ], %g1 _CORE_message_queue_Copy_buffer(the_message->Contents.buffer,buffer,*size); 40014268: 92 10 00 1a mov %i2, %o1 the_message = _CORE_message_queue_Get_pending_message( the_message_queue ); _ISR_Enable( level ); *size = the_message->Contents.size; _Thread_Executing->Wait.count = the_message->priority; 4001426c: c2 20 a0 24 st %g1, [ %g2 + 0x24 ] _CORE_message_queue_Copy_buffer(the_message->Contents.buffer,buffer,*size); 40014270: a2 06 60 10 add %i1, 0x10, %l1 40014274: 7f ff ff d8 call 400141d4 <_CORE_message_queue_Copy_buffer> 40014278: 90 10 00 11 mov %l1, %o0 * * NOTE: If we note that the queue was not full before this receive, * then we can avoid this dequeue. */ the_thread = _Thread_queue_Dequeue( &the_message_queue->Wait_queue ); 4001427c: 7f ff e9 03 call 4000e688 <_Thread_queue_Dequeue> 40014280: 90 10 00 10 mov %l0, %o0 if ( !the_thread ) { 40014284: 82 92 20 00 orcc %o0, 0, %g1 40014288: 32 80 00 04 bne,a 40014298 <_CORE_message_queue_Seize+0xa8> 4001428c: d4 00 60 30 ld [ %g1 + 0x30 ], %o2 RTEMS_INLINE_ROUTINE void _CORE_message_queue_Free_message_buffer ( CORE_message_queue_Control *the_message_queue, CORE_message_queue_Buffer_control *the_message ) { _Chain_Append( &the_message_queue->Inactive_messages, &the_message->Node ); 40014290: 7f ff df 21 call 4000bf14 <_Chain_Append> 40014294: 91 ec 20 68 restore %l0, 0x68, %o0 * waiting task. */ the_message->priority = the_thread->Wait.count; the_message->Contents.size = (uint32_t)the_thread->Wait.option; _CORE_message_queue_Copy_buffer( 40014298: d0 00 60 28 ld [ %g1 + 0x28 ], %o0 * There was a thread waiting to send a message. This code * puts the messages in the message queue on behalf of the * waiting task. */ the_message->priority = the_thread->Wait.count; 4001429c: c2 00 60 24 ld [ %g1 + 0x24 ], %g1 the_message->Contents.size = (uint32_t)the_thread->Wait.option; 400142a0: d4 26 60 0c st %o2, [ %i1 + 0xc ] * There was a thread waiting to send a message. This code * puts the messages in the message queue on behalf of the * waiting task. */ the_message->priority = the_thread->Wait.count; 400142a4: c2 26 60 08 st %g1, [ %i1 + 8 ] the_message->Contents.size = (uint32_t)the_thread->Wait.option; _CORE_message_queue_Copy_buffer( 400142a8: 7f ff ff cb call 400141d4 <_CORE_message_queue_Copy_buffer> 400142ac: 92 10 00 11 mov %l1, %o1 the_thread->Wait.return_argument, the_message->Contents.buffer, the_message->Contents.size ); _CORE_message_queue_Insert_message( 400142b0: f4 06 60 08 ld [ %i1 + 8 ], %i2 400142b4: 40 00 0c 18 call 40017314 <_CORE_message_queue_Insert_message> 400142b8: 91 e8 00 10 restore %g0, %l0, %o0 the_message->priority ); return; } if ( !wait ) { 400142bc: 12 80 00 08 bne 400142dc <_CORE_message_queue_Seize+0xec> 400142c0: 82 10 20 01 mov 1, %g1 _ISR_Enable( level ); 400142c4: 7f ff b8 f0 call 40002684 400142c8: 01 00 00 00 nop executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT; 400142cc: 82 10 20 04 mov 4, %g1 ! 4 400142d0: c2 24 60 34 st %g1, [ %l1 + 0x34 ] executing->Wait.return_argument_1 = (void *)size; /* Wait.count will be filled in with the message priority */ _ISR_Enable( level ); _Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout ); } 400142d4: 81 c7 e0 08 ret 400142d8: 81 e8 00 00 restore _Thread_queue_Enter_critical_section( &the_message_queue->Wait_queue ); executing->Wait.queue = &the_message_queue->Wait_queue; executing->Wait.id = id; executing->Wait.return_argument = buffer; executing->Wait.return_argument_1 = (void *)size; 400142dc: f6 24 60 2c st %i3, [ %l1 + 0x2c ] executing->Wait.return_code = CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_NOWAIT; return; } _Thread_queue_Enter_critical_section( &the_message_queue->Wait_queue ); executing->Wait.queue = &the_message_queue->Wait_queue; 400142e0: f0 24 60 44 st %i0, [ %l1 + 0x44 ] executing->Wait.id = id; 400142e4: f2 24 60 20 st %i1, [ %l1 + 0x20 ] executing->Wait.return_argument = buffer; 400142e8: f4 24 60 28 st %i2, [ %l1 + 0x28 ] RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section ( Thread_queue_Control *the_thread_queue ) { the_thread_queue->sync_state = THREAD_QUEUE_NOTHING_HAPPENED; 400142ec: c2 26 20 30 st %g1, [ %i0 + 0x30 ] executing->Wait.return_argument_1 = (void *)size; /* Wait.count will be filled in with the message priority */ _ISR_Enable( level ); 400142f0: 7f ff b8 e5 call 40002684 400142f4: 35 10 00 3b sethi %hi(0x4000ec00), %i2 _Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout ); 400142f8: b2 10 00 1d mov %i5, %i1 400142fc: 7f ff e9 51 call 4000e840 <_Thread_queue_Enqueue_with_handler> 40014300: 95 ee a0 d8 restore %i2, 0xd8, %o2 40014304: 01 00 00 00 nop 40014324 <_CORE_message_queue_Submit>: CORE_message_queue_API_mp_support_callout api_message_queue_mp_support, CORE_message_queue_Submit_types submit_type, boolean wait, Watchdog_Interval timeout ) { 40014324: 9d e3 bf 98 save %sp, -104, %sp ISR_Level level; CORE_message_queue_Buffer_control *the_message; Thread_Control *the_thread; if ( size > the_message_queue->maximum_message_size ) { 40014328: c2 06 20 4c ld [ %i0 + 0x4c ], %g1 CORE_message_queue_API_mp_support_callout api_message_queue_mp_support, CORE_message_queue_Submit_types submit_type, boolean wait, Watchdog_Interval timeout ) { 4001432c: a2 10 00 18 mov %i0, %l1 ISR_Level level; CORE_message_queue_Buffer_control *the_message; Thread_Control *the_thread; if ( size > the_message_queue->maximum_message_size ) { 40014330: 80 a6 80 01 cmp %i2, %g1 40014334: 18 80 00 3f bgu 40014430 <_CORE_message_queue_Submit+0x10c> 40014338: b0 10 20 01 mov 1, %i0 /* * Is there a thread currently waiting on this message queue? */ if ( the_message_queue->number_of_pending_messages == 0 ) { 4001433c: c2 04 60 48 ld [ %l1 + 0x48 ], %g1 40014340: 80 a0 60 00 cmp %g1, 0 40014344: 32 80 00 0f bne,a 40014380 <_CORE_message_queue_Submit+0x5c> 40014348: c4 04 60 48 ld [ %l1 + 0x48 ], %g2 the_thread = _Thread_queue_Dequeue( &the_message_queue->Wait_queue ); 4001434c: 7f ff e8 cf call 4000e688 <_Thread_queue_Dequeue> 40014350: 90 10 00 11 mov %l1, %o0 if ( the_thread ) { 40014354: a0 92 20 00 orcc %o0, 0, %l0 40014358: 02 80 00 09 be 4001437c <_CORE_message_queue_Submit+0x58> 4001435c: 90 10 00 19 mov %i1, %o0 _CORE_message_queue_Copy_buffer( 40014360: d2 04 20 28 ld [ %l0 + 0x28 ], %o1 40014364: 7f ff ff e9 call 40014308 <_CORE_message_queue_Copy_buffer> 40014368: 94 10 00 1a mov %i2, %o2 buffer, the_thread->Wait.return_argument, size ); *(size_t *)the_thread->Wait.return_argument_1 = size; 4001436c: c2 04 20 2c ld [ %l0 + 0x2c ], %g1 the_thread->Wait.count = submit_type; 40014370: fa 24 20 24 st %i5, [ %l0 + 0x24 ] _CORE_message_queue_Copy_buffer( buffer, the_thread->Wait.return_argument, size ); *(size_t *)the_thread->Wait.return_argument_1 = size; 40014374: 10 80 00 15 b 400143c8 <_CORE_message_queue_Submit+0xa4> 40014378: f4 20 40 00 st %i2, [ %g1 ] /* * No one waiting on the message queue at this time, so attempt to * queue the message up for a future receive. */ if ( the_message_queue->number_of_pending_messages < 4001437c: c4 04 60 48 ld [ %l1 + 0x48 ], %g2 40014380: c2 04 60 44 ld [ %l1 + 0x44 ], %g1 40014384: 80 a0 80 01 cmp %g2, %g1 40014388: 1a 80 00 12 bcc 400143d0 <_CORE_message_queue_Submit+0xac> 4001438c: c2 07 a0 5c ld [ %fp + 0x5c ], %g1 RTEMS_INLINE_ROUTINE CORE_message_queue_Buffer_control * _CORE_message_queue_Allocate_message_buffer ( CORE_message_queue_Control *the_message_queue ) { return (CORE_message_queue_Buffer_control *) 40014390: 7f ff de ed call 4000bf44 <_Chain_Get> 40014394: 90 04 60 68 add %l1, 0x68, %o0 /* * NOTE: If the system is consistent, this error should never occur. */ if ( !the_message ) { 40014398: a0 92 20 00 orcc %o0, 0, %l0 4001439c: 02 80 00 27 be 40014438 <_CORE_message_queue_Submit+0x114> 400143a0: 90 10 00 19 mov %i1, %o0 return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED; } _CORE_message_queue_Copy_buffer( 400143a4: 92 04 20 10 add %l0, 0x10, %o1 400143a8: 7f ff ff d8 call 40014308 <_CORE_message_queue_Copy_buffer> 400143ac: 94 10 00 1a mov %i2, %o2 size ); the_message->Contents.size = size; the_message->priority = submit_type; _CORE_message_queue_Insert_message( 400143b0: 90 10 00 11 mov %l1, %o0 _CORE_message_queue_Copy_buffer( buffer, the_message->Contents.buffer, size ); the_message->Contents.size = size; 400143b4: f4 24 20 0c st %i2, [ %l0 + 0xc ] the_message->priority = submit_type; 400143b8: fa 24 20 08 st %i5, [ %l0 + 8 ] _CORE_message_queue_Insert_message( 400143bc: 92 10 00 10 mov %l0, %o1 400143c0: 40 00 0b d5 call 40017314 <_CORE_message_queue_Insert_message> 400143c4: 94 10 00 1d mov %i5, %o2 400143c8: 81 c7 e0 08 ret 400143cc: 91 e8 20 00 restore %g0, 0, %o0 * No message buffers were available so we may need to return an * overflow error or block the sender until the message is placed * on the queue. */ if ( !wait ) { 400143d0: 80 a0 60 00 cmp %g1, 0 400143d4: 02 80 00 17 be 40014430 <_CORE_message_queue_Submit+0x10c> 400143d8: b0 10 20 02 mov 2, %i0 /* * Do NOT block on a send if the caller is in an ISR. It is * deadly to block in an ISR. */ if ( _ISR_Is_in_progress() ) { 400143dc: 03 10 00 a7 sethi %hi(0x40029c00), %g1 400143e0: c2 00 61 24 ld [ %g1 + 0x124 ], %g1 ! 40029d24 <_ISR_Nest_level> 400143e4: 80 a0 60 00 cmp %g1, 0 400143e8: 12 80 00 14 bne 40014438 <_CORE_message_queue_Submit+0x114> 400143ec: 03 10 00 a7 sethi %hi(0x40029c00), %g1 */ { Thread_Control *executing = _Thread_Executing; _ISR_Disable( level ); 400143f0: 7f ff b8 a1 call 40002674 400143f4: e0 00 61 3c ld [ %g1 + 0x13c ], %l0 ! 40029d3c <_Thread_Executing> 400143f8: 82 10 20 01 mov 1, %g1 _Thread_queue_Enter_critical_section( &the_message_queue->Wait_queue ); executing->Wait.queue = &the_message_queue->Wait_queue; executing->Wait.id = id; executing->Wait.return_argument = buffer; executing->Wait.option = size; executing->Wait.count = submit_type; 400143fc: fa 24 20 24 st %i5, [ %l0 + 0x24 ] Thread_Control *executing = _Thread_Executing; _ISR_Disable( level ); _Thread_queue_Enter_critical_section( &the_message_queue->Wait_queue ); executing->Wait.queue = &the_message_queue->Wait_queue; executing->Wait.id = id; 40014400: f6 24 20 20 st %i3, [ %l0 + 0x20 ] executing->Wait.return_argument = buffer; 40014404: f2 24 20 28 st %i1, [ %l0 + 0x28 ] executing->Wait.option = size; 40014408: f4 24 20 30 st %i2, [ %l0 + 0x30 ] { Thread_Control *executing = _Thread_Executing; _ISR_Disable( level ); _Thread_queue_Enter_critical_section( &the_message_queue->Wait_queue ); executing->Wait.queue = &the_message_queue->Wait_queue; 4001440c: e2 24 20 44 st %l1, [ %l0 + 0x44 ] 40014410: c2 24 60 30 st %g1, [ %l1 + 0x30 ] executing->Wait.id = id; executing->Wait.return_argument = buffer; executing->Wait.option = size; executing->Wait.count = submit_type; _ISR_Enable( level ); 40014414: 7f ff b8 9c call 40002684 40014418: b0 10 20 07 mov 7, %i0 _Thread_queue_Enqueue( &the_message_queue->Wait_queue, timeout ); 4001441c: d2 07 a0 60 ld [ %fp + 0x60 ], %o1 40014420: 90 10 00 11 mov %l1, %o0 40014424: 15 10 00 3b sethi %hi(0x4000ec00), %o2 40014428: 7f ff e9 06 call 4000e840 <_Thread_queue_Enqueue_with_handler> 4001442c: 94 12 a0 d8 or %o2, 0xd8, %o2 ! 4000ecd8 <_Thread_queue_Timeout> 40014430: 81 c7 e0 08 ret 40014434: 81 e8 00 00 restore } return CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT; 40014438: b0 10 20 03 mov 3, %i0 <== NOT EXECUTED } 4001443c: 81 c7 e0 08 ret <== NOT EXECUTED 40014440: 81 e8 00 00 restore <== NOT EXECUTED 400077f0 <_CORE_mutex_Seize_interrupt_blocking>: void _CORE_mutex_Seize_interrupt_blocking( CORE_mutex_Control *the_mutex, Watchdog_Interval timeout ) { 400077f0: 9d e3 bf 98 save %sp, -104, %sp Thread_Control *executing; executing = _Thread_Executing; if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ) { 400077f4: c2 06 20 48 ld [ %i0 + 0x48 ], %g1 400077f8: 80 a0 60 02 cmp %g1, 2 Watchdog_Interval timeout ) { Thread_Control *executing; executing = _Thread_Executing; 400077fc: 03 10 00 6b sethi %hi(0x4001ac00), %g1 if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) ) { 40007800: 12 80 00 0a bne 40007828 <_CORE_mutex_Seize_interrupt_blocking+0x38> 40007804: d2 00 62 ac ld [ %g1 + 0x2ac ], %o1 ! 4001aeac <_Thread_Executing> if ( the_mutex->holder->current_priority > executing->current_priority ) { 40007808: d0 06 20 5c ld [ %i0 + 0x5c ], %o0 4000780c: d2 02 60 14 ld [ %o1 + 0x14 ], %o1 40007810: c2 02 20 14 ld [ %o0 + 0x14 ], %g1 40007814: 80 a0 40 09 cmp %g1, %o1 40007818: 28 80 00 05 bleu,a 4000782c <_CORE_mutex_Seize_interrupt_blocking+0x3c> 4000781c: c2 06 20 58 ld [ %i0 + 0x58 ], %g1 _Thread_Change_priority( 40007820: 40 00 07 47 call 4000953c <_Thread_Change_priority> 40007824: 94 10 20 00 clr %o2 FALSE ); } } the_mutex->blocked_count++; 40007828: c2 06 20 58 ld [ %i0 + 0x58 ], %g1 _Thread_queue_Enqueue( &the_mutex->Wait_queue, timeout ); 4000782c: 90 10 00 18 mov %i0, %o0 FALSE ); } } the_mutex->blocked_count++; 40007830: 82 00 60 01 inc %g1 _Thread_queue_Enqueue( &the_mutex->Wait_queue, timeout ); 40007834: 92 10 00 19 mov %i1, %o1 FALSE ); } } the_mutex->blocked_count++; 40007838: c2 26 20 58 st %g1, [ %i0 + 0x58 ] _Thread_queue_Enqueue( &the_mutex->Wait_queue, timeout ); 4000783c: 15 10 00 29 sethi %hi(0x4000a400), %o2 40007840: 40 00 09 d3 call 40009f8c <_Thread_queue_Enqueue_with_handler> 40007844: 94 12 a0 24 or %o2, 0x24, %o2 ! 4000a424 <_Thread_queue_Timeout> #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40007848: 05 10 00 6b sethi %hi(0x4001ac00), %g2 4000784c: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> 40007850: 82 00 7f ff add %g1, -1, %g1 40007854: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] 40007858: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 4000785c: 80 a0 60 00 cmp %g1, 0 40007860: 12 80 00 04 bne 40007870 <_CORE_mutex_Seize_interrupt_blocking+0x80> 40007864: 01 00 00 00 nop _Thread_Dispatch(); 40007868: 40 00 08 61 call 400099ec <_Thread_Dispatch> 4000786c: 81 e8 00 00 restore 40007870: 81 c7 e0 08 ret <== NOT EXECUTED 40007874: 81 e8 00 00 restore <== NOT EXECUTED 40007878 <_CORE_mutex_Surrender>: CORE_mutex_Status _CORE_mutex_Surrender( CORE_mutex_Control *the_mutex, Objects_Id id, CORE_mutex_API_mp_support_callout api_mutex_mp_support ) { 40007878: 9d e3 bf 98 save %sp, -104, %sp * allowed when the mutex in quetion is FIFO or simple Priority * discipline. But Priority Ceiling or Priority Inheritance mutexes * must be released by the thread which acquired them. */ if ( the_mutex->Attributes.only_owner_release ) { 4000787c: c2 06 20 44 ld [ %i0 + 0x44 ], %g1 40007880: 80 a0 60 00 cmp %g1, 0 40007884: 02 80 00 07 be 400078a0 <_CORE_mutex_Surrender+0x28> 40007888: d0 06 20 5c ld [ %i0 + 0x5c ], %o0 if ( !_Thread_Is_executing( holder ) ) 4000788c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40007890: c2 00 62 ac ld [ %g1 + 0x2ac ], %g1 ! 4001aeac <_Thread_Executing> 40007894: 80 a2 00 01 cmp %o0, %g1 40007898: 12 80 00 51 bne 400079dc <_CORE_mutex_Surrender+0x164> 4000789c: 84 10 20 03 mov 3, %g2 return CORE_MUTEX_STATUS_NOT_OWNER_OF_RESOURCE; } /* XXX already unlocked -- not right status */ if ( !the_mutex->nest_count ) 400078a0: c2 06 20 54 ld [ %i0 + 0x54 ], %g1 400078a4: 80 a0 60 00 cmp %g1, 0 400078a8: 02 80 00 4c be 400079d8 <_CORE_mutex_Surrender+0x160> 400078ac: 82 00 7f ff add %g1, -1, %g1 return CORE_MUTEX_STATUS_SUCCESSFUL; the_mutex->nest_count--; if ( the_mutex->nest_count != 0 ) { 400078b0: 80 a0 60 00 cmp %g1, 0 400078b4: 02 80 00 09 be 400078d8 <_CORE_mutex_Surrender+0x60> 400078b8: c2 26 20 54 st %g1, [ %i0 + 0x54 ] switch ( the_mutex->Attributes.lock_nesting_behavior ) { 400078bc: c2 06 20 40 ld [ %i0 + 0x40 ], %g1 400078c0: 80 a0 60 00 cmp %g1, 0 400078c4: 02 80 00 46 be 400079dc <_CORE_mutex_Surrender+0x164> 400078c8: 84 10 20 00 clr %g2 400078cc: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 400078d0: 02 80 00 43 be 400079dc <_CORE_mutex_Surrender+0x164> <== NOT EXECUTED 400078d4: 84 10 20 02 mov 2, %g2 <== NOT EXECUTED 400078d8: c2 06 20 48 ld [ %i0 + 0x48 ], %g1 /* * Formally release the mutex before possibly transferring it to a * blocked thread. */ if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || 400078dc: 80 a0 60 02 cmp %g1, 2 400078e0: 22 80 00 06 be,a 400078f8 <_CORE_mutex_Surrender+0x80> 400078e4: c2 02 20 1c ld [ %o0 + 0x1c ], %g1 400078e8: 80 a0 60 03 cmp %g1, 3 400078ec: 32 80 00 07 bne,a 40007908 <_CORE_mutex_Surrender+0x90> 400078f0: c0 26 20 5c clr [ %i0 + 0x5c ] _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) holder->resource_count--; 400078f4: c2 02 20 1c ld [ %o0 + 0x1c ], %g1 400078f8: 82 00 7f ff add %g1, -1, %g1 400078fc: c2 22 20 1c st %g1, [ %o0 + 0x1c ] 40007900: c2 06 20 48 ld [ %i0 + 0x48 ], %g1 the_mutex->holder = NULL; 40007904: c0 26 20 5c clr [ %i0 + 0x5c ] /* * Whether or not someone is waiting for the mutex, an * inherited priority must be lowered if this is the last * mutex (i.e. resource) this task has. */ if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || 40007908: 80 a0 60 02 cmp %g1, 2 4000790c: 02 80 00 05 be 40007920 <_CORE_mutex_Surrender+0xa8> 40007910: c0 26 20 60 clr [ %i0 + 0x60 ] 40007914: 80 a0 60 03 cmp %g1, 3 40007918: 12 80 00 0d bne 4000794c <_CORE_mutex_Surrender+0xd4> 4000791c: 01 00 00 00 nop _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) { if ( holder->resource_count == 0 && 40007920: c2 02 20 1c ld [ %o0 + 0x1c ], %g1 40007924: 80 a0 60 00 cmp %g1, 0 40007928: 12 80 00 09 bne 4000794c <_CORE_mutex_Surrender+0xd4> 4000792c: 01 00 00 00 nop 40007930: d2 02 20 18 ld [ %o0 + 0x18 ], %o1 40007934: c2 02 20 14 ld [ %o0 + 0x14 ], %g1 40007938: 80 a2 40 01 cmp %o1, %g1 4000793c: 02 80 00 04 be 4000794c <_CORE_mutex_Surrender+0xd4> 40007940: 01 00 00 00 nop holder->real_priority != holder->current_priority ) { _Thread_Change_priority( holder, holder->real_priority, TRUE ); 40007944: 40 00 06 fe call 4000953c <_Thread_Change_priority> 40007948: 94 10 20 01 mov 1, %o2 ! 1 /* * Now we check if another thread was waiting for this mutex. If so, * transfer the mutex to that thread. */ if ( ( the_thread = _Thread_queue_Dequeue( &the_mutex->Wait_queue ) ) ) { 4000794c: 40 00 09 22 call 40009dd4 <_Thread_queue_Dequeue> 40007950: 90 10 00 18 mov %i0, %o0 40007954: 86 92 20 00 orcc %o0, 0, %g3 40007958: 02 80 00 1f be 400079d4 <_CORE_mutex_Surrender+0x15c> 4000795c: 82 10 20 01 mov 1, %g1 } else #endif { the_mutex->holder = the_thread; the_mutex->holder_id = the_thread->Object.id; 40007960: c2 00 e0 08 ld [ %g3 + 8 ], %g1 the_mutex->nest_count = 1; switch ( the_mutex->Attributes.discipline ) { 40007964: c4 06 20 48 ld [ %i0 + 0x48 ], %g2 } else #endif { the_mutex->holder = the_thread; the_mutex->holder_id = the_thread->Object.id; 40007968: c2 26 20 60 st %g1, [ %i0 + 0x60 ] } else #endif { the_mutex->holder = the_thread; 4000796c: c6 26 20 5c st %g3, [ %i0 + 0x5c ] the_mutex->holder_id = the_thread->Object.id; the_mutex->nest_count = 1; 40007970: 82 10 20 01 mov 1, %g1 switch ( the_mutex->Attributes.discipline ) { 40007974: 80 a0 a0 02 cmp %g2, 2 40007978: 02 80 00 07 be 40007994 <_CORE_mutex_Surrender+0x11c> 4000797c: c2 26 20 54 st %g1, [ %i0 + 0x54 ] 40007980: 80 a0 a0 03 cmp %g2, 3 40007984: 12 80 00 16 bne 400079dc <_CORE_mutex_Surrender+0x164> 40007988: 84 10 20 00 clr %g2 break; case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT: the_thread->resource_count++; break; case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING: the_thread->resource_count++; 4000798c: 10 80 00 07 b 400079a8 <_CORE_mutex_Surrender+0x130> 40007990: c2 00 e0 1c ld [ %g3 + 0x1c ], %g1 switch ( the_mutex->Attributes.discipline ) { case CORE_MUTEX_DISCIPLINES_FIFO: case CORE_MUTEX_DISCIPLINES_PRIORITY: break; case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT: the_thread->resource_count++; 40007994: c2 00 e0 1c ld [ %g3 + 0x1c ], %g1 40007998: 84 10 20 00 clr %g2 4000799c: 82 00 60 01 inc %g1 400079a0: 10 80 00 0f b 400079dc <_CORE_mutex_Surrender+0x164> 400079a4: c2 20 e0 1c st %g1, [ %g3 + 0x1c ] break; case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING: the_thread->resource_count++; if (the_mutex->Attributes.priority_ceiling < 400079a8: c4 00 e0 14 ld [ %g3 + 0x14 ], %g2 break; case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT: the_thread->resource_count++; break; case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING: the_thread->resource_count++; 400079ac: 82 00 60 01 inc %g1 400079b0: c2 20 e0 1c st %g1, [ %g3 + 0x1c ] if (the_mutex->Attributes.priority_ceiling < 400079b4: d2 06 20 4c ld [ %i0 + 0x4c ], %o1 400079b8: 80 a2 40 02 cmp %o1, %g2 400079bc: 3a 80 00 08 bcc,a 400079dc <_CORE_mutex_Surrender+0x164> 400079c0: 84 10 20 00 clr %g2 <== NOT EXECUTED the_thread->current_priority){ _Thread_Change_priority( 400079c4: 40 00 06 de call 4000953c <_Thread_Change_priority> 400079c8: 94 10 20 00 clr %o2 } break; } } } else the_mutex->lock = CORE_MUTEX_UNLOCKED; 400079cc: 10 80 00 04 b 400079dc <_CORE_mutex_Surrender+0x164> 400079d0: 84 10 20 00 clr %g2 400079d4: c2 26 20 50 st %g1, [ %i0 + 0x50 ] 400079d8: 84 10 20 00 clr %g2 return CORE_MUTEX_STATUS_SUCCESSFUL; } 400079dc: 81 c7 e0 08 ret 400079e0: 91 e8 00 02 restore %g0, %g2, %o0 40008560 <_CORE_spinlock_Release>: */ CORE_spinlock_Status _CORE_spinlock_Release( CORE_spinlock_Control *the_spinlock ) { 40008560: 9d e3 bf 98 save %sp, -104, %sp ISR_Level level; _ISR_Disable( level ); 40008564: 7f ff e7 fc call 40002554 40008568: 01 00 00 00 nop /* * It must locked before it can be unlocked. */ if ( the_spinlock->lock == CORE_SPINLOCK_UNLOCKED ) { 4000856c: c2 06 20 04 ld [ %i0 + 4 ], %g1 40008570: 80 a0 60 00 cmp %g1, 0 40008574: 12 80 00 06 bne 4000858c <_CORE_spinlock_Release+0x2c> 40008578: 03 10 00 54 sethi %hi(0x40015000), %g1 _ISR_Enable( level ); 4000857c: 7f ff e7 fa call 40002564 40008580: b0 10 20 06 mov 6, %i0 40008584: 81 c7 e0 08 ret 40008588: 81 e8 00 00 restore } /* * It must locked by the current thread before it can be unlocked. */ if ( the_spinlock->holder != _Thread_Executing->Object.id ) { 4000858c: c2 00 62 7c ld [ %g1 + 0x27c ], %g1 40008590: c4 06 20 0c ld [ %i0 + 0xc ], %g2 40008594: c2 00 60 08 ld [ %g1 + 8 ], %g1 40008598: 80 a0 80 01 cmp %g2, %g1 4000859c: 02 80 00 06 be 400085b4 <_CORE_spinlock_Release+0x54> 400085a0: 01 00 00 00 nop _ISR_Enable( level ); 400085a4: 7f ff e7 f0 call 40002564 <== NOT EXECUTED 400085a8: b0 10 20 02 mov 2, %i0 ! 2 <== NOT EXECUTED 400085ac: 81 c7 e0 08 ret <== NOT EXECUTED 400085b0: 81 e8 00 00 restore <== NOT EXECUTED } /* * Let it be unlocked. */ the_spinlock->users -= 1; 400085b4: c2 06 20 08 ld [ %i0 + 8 ], %g1 400085b8: 82 00 7f ff add %g1, -1, %g1 400085bc: c2 26 20 08 st %g1, [ %i0 + 8 ] the_spinlock->lock = CORE_SPINLOCK_UNLOCKED; 400085c0: c0 26 20 04 clr [ %i0 + 4 ] the_spinlock->holder = 0; 400085c4: c0 26 20 0c clr [ %i0 + 0xc ] _ISR_Enable( level ); 400085c8: 7f ff e7 e7 call 40002564 400085cc: b0 10 20 00 clr %i0 return CORE_SPINLOCK_SUCCESSFUL; } 400085d0: 81 c7 e0 08 ret 400085d4: 81 e8 00 00 restore 400085d8 <_CORE_spinlock_Wait>: CORE_spinlock_Status _CORE_spinlock_Wait( CORE_spinlock_Control *the_spinlock, boolean wait, Watchdog_Interval timeout ) { 400085d8: 9d e3 bf 98 save %sp, -104, %sp ISR_Level level; Watchdog_Interval limit = _Watchdog_Ticks_since_boot + timeout; 400085dc: 03 10 00 54 sethi %hi(0x40015000), %g1 400085e0: c2 00 63 24 ld [ %g1 + 0x324 ], %g1 ! 40015324 <_Watchdog_Ticks_since_boot> _ISR_Disable( level ); 400085e4: 7f ff e7 dc call 40002554 400085e8: a2 06 80 01 add %i2, %g1, %l1 400085ec: 86 10 00 08 mov %o0, %g3 if ( (the_spinlock->lock == CORE_SPINLOCK_LOCKED) && 400085f0: c2 06 20 04 ld [ %i0 + 4 ], %g1 400085f4: 80 a0 60 01 cmp %g1, 1 400085f8: 12 80 00 0c bne 40008628 <_CORE_spinlock_Wait+0x50> 400085fc: 03 10 00 54 sethi %hi(0x40015000), %g1 40008600: c2 00 62 7c ld [ %g1 + 0x27c ], %g1 ! 4001527c <_Thread_Executing> 40008604: c4 06 20 0c ld [ %i0 + 0xc ], %g2 40008608: c2 00 60 08 ld [ %g1 + 8 ], %g1 4000860c: 80 a0 80 01 cmp %g2, %g1 40008610: 12 80 00 06 bne 40008628 <_CORE_spinlock_Wait+0x50> 40008614: 01 00 00 00 nop (the_spinlock->holder == _Thread_Executing->Object.id) ) { _ISR_Enable( level ); 40008618: 7f ff e7 d3 call 40002564 4000861c: b0 10 20 01 mov 1, %i0 ! 1 40008620: 81 c7 e0 08 ret 40008624: 81 e8 00 00 restore return CORE_SPINLOCK_HOLDER_RELOCKING; } the_spinlock->users += 1; 40008628: c2 06 20 08 ld [ %i0 + 8 ], %g1 } /* * They are willing to wait but there could be a timeout. */ if ( timeout && (limit <= _Watchdog_Ticks_since_boot) ) { 4000862c: 25 10 00 54 sethi %hi(0x40015000), %l2 if ( (the_spinlock->lock == CORE_SPINLOCK_LOCKED) && (the_spinlock->holder == _Thread_Executing->Object.id) ) { _ISR_Enable( level ); return CORE_SPINLOCK_HOLDER_RELOCKING; } the_spinlock->users += 1; 40008630: 82 00 60 01 inc %g1 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40008634: 21 10 00 54 sethi %hi(0x40015000), %l0 40008638: c2 26 20 08 st %g1, [ %i0 + 8 ] for ( ;; ) { if ( the_spinlock->lock == CORE_SPINLOCK_UNLOCKED ) { 4000863c: c2 06 20 04 ld [ %i0 + 4 ], %g1 40008640: 80 a0 60 00 cmp %g1, 0 40008644: 12 80 00 0d bne 40008678 <_CORE_spinlock_Wait+0xa0> 40008648: 80 a6 60 00 cmp %i1, 0 the_spinlock->lock = CORE_SPINLOCK_LOCKED; the_spinlock->holder = _Thread_Executing->Object.id; 4000864c: 03 10 00 54 sethi %hi(0x40015000), %g1 40008650: c4 00 62 7c ld [ %g1 + 0x27c ], %g2 ! 4001527c <_Thread_Executing> return CORE_SPINLOCK_HOLDER_RELOCKING; } the_spinlock->users += 1; for ( ;; ) { if ( the_spinlock->lock == CORE_SPINLOCK_UNLOCKED ) { the_spinlock->lock = CORE_SPINLOCK_LOCKED; 40008654: 82 10 20 01 mov 1, %g1 40008658: c2 26 20 04 st %g1, [ %i0 + 4 ] the_spinlock->holder = _Thread_Executing->Object.id; 4000865c: c2 00 a0 08 ld [ %g2 + 8 ], %g1 40008660: c2 26 20 0c st %g1, [ %i0 + 0xc ] _ISR_Enable( level ); 40008664: b0 10 20 00 clr %i0 40008668: 7f ff e7 bf call 40002564 4000866c: 90 10 00 03 mov %g3, %o0 40008670: 81 c7 e0 08 ret 40008674: 81 e8 00 00 restore } /* * Spinlock is unavailable. If not willing to wait, return. */ if ( !wait ) { 40008678: 12 80 00 0a bne 400086a0 <_CORE_spinlock_Wait+0xc8> 4000867c: 80 a6 a0 00 cmp %i2, 0 the_spinlock->users -= 1; 40008680: c2 06 20 08 ld [ %i0 + 8 ], %g1 <== NOT EXECUTED 40008684: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 40008688: c2 26 20 08 st %g1, [ %i0 + 8 ] <== NOT EXECUTED _ISR_Enable( level ); 4000868c: b0 10 20 05 mov 5, %i0 <== NOT EXECUTED 40008690: 7f ff e7 b5 call 40002564 <== NOT EXECUTED 40008694: 90 10 00 03 mov %g3, %o0 <== NOT EXECUTED 40008698: 81 c7 e0 08 ret <== NOT EXECUTED 4000869c: 81 e8 00 00 restore <== NOT EXECUTED } /* * They are willing to wait but there could be a timeout. */ if ( timeout && (limit <= _Watchdog_Ticks_since_boot) ) { 400086a0: 02 80 00 0e be 400086d8 <_CORE_spinlock_Wait+0x100> 400086a4: 01 00 00 00 nop 400086a8: c2 04 a3 24 ld [ %l2 + 0x324 ], %g1 <== NOT EXECUTED 400086ac: 80 a4 40 01 cmp %l1, %g1 <== NOT EXECUTED 400086b0: 18 80 00 0a bgu 400086d8 <_CORE_spinlock_Wait+0x100> <== NOT EXECUTED 400086b4: 01 00 00 00 nop <== NOT EXECUTED the_spinlock->users -= 1; 400086b8: c2 06 20 08 ld [ %i0 + 8 ], %g1 <== NOT EXECUTED 400086bc: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 400086c0: c2 26 20 08 st %g1, [ %i0 + 8 ] <== NOT EXECUTED _ISR_Enable( level ); 400086c4: b0 10 20 03 mov 3, %i0 <== NOT EXECUTED 400086c8: 7f ff e7 a7 call 40002564 <== NOT EXECUTED 400086cc: 90 10 00 03 mov %g3, %o0 <== NOT EXECUTED 400086d0: 81 c7 e0 08 ret <== NOT EXECUTED 400086d4: 81 e8 00 00 restore <== NOT EXECUTED * * A spinlock cannot be deleted while it is being used so we are * safe from deletion. */ _ISR_Enable( level ); 400086d8: 7f ff e7 a3 call 40002564 400086dc: 90 10 00 03 mov %g3, %o0 400086e0: c2 04 21 a0 ld [ %l0 + 0x1a0 ], %g1 400086e4: 82 00 7f ff add %g1, -1, %g1 400086e8: c2 24 21 a0 st %g1, [ %l0 + 0x1a0 ] 400086ec: c2 04 21 a0 ld [ %l0 + 0x1a0 ], %g1 400086f0: 80 a0 60 00 cmp %g1, 0 400086f4: 12 80 00 04 bne 40008704 <_CORE_spinlock_Wait+0x12c> 400086f8: 01 00 00 00 nop _Thread_Dispatch(); 400086fc: 40 00 07 a4 call 4000a58c <_Thread_Dispatch> 40008700: 01 00 00 00 nop rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40008704: c2 04 21 a0 ld [ %l0 + 0x1a0 ], %g1 40008708: 82 00 60 01 inc %g1 4000870c: c2 24 21 a0 st %g1, [ %l0 + 0x1a0 ] /* Another thread could get dispatched here */ /* Reenter the critical sections so we can attempt the lock again. */ _Thread_Disable_dispatch(); _ISR_Disable( level ); 40008710: 7f ff e7 91 call 40002554 40008714: 01 00 00 00 nop 40008718: 86 10 00 08 mov %o0, %g3 4000871c: 30 bf ff c8 b,a 4000863c <_CORE_spinlock_Wait+0x64> 4000d6cc <_Debug_Is_enabled>: */ boolean _Debug_Is_enabled( rtems_debug_control level ) { 4000d6cc: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 4000d6d0: c2 00 62 b0 ld [ %g1 + 0x2b0 ], %g1 ! 4001aeb0 <_Debug_Level> <== NOT EXECUTED 4000d6d4: 90 0a 00 01 and %o0, %g1, %o0 <== NOT EXECUTED return (_Debug_Level & level) ? TRUE : FALSE; } 4000d6d8: 80 a0 00 08 cmp %g0, %o0 <== NOT EXECUTED 4000d6dc: 81 c3 e0 08 retl <== NOT EXECUTED 4000d6e0: 90 40 20 00 addx %g0, 0, %o0 <== NOT EXECUTED 40005f1c <_Event_Seize>: rtems_event_set event_in, rtems_option option_set, rtems_interval ticks, rtems_event_set *event_out ) { 40005f1c: 9d e3 bf 98 save %sp, -104, %sp rtems_event_set pending_events; ISR_Level level; RTEMS_API_Control *api; Event_Sync_states sync_state; executing = _Thread_Executing; 40005f20: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40005f24: e0 00 62 ac ld [ %g1 + 0x2ac ], %l0 ! 4001aeac <_Thread_Executing> executing->Wait.return_code = RTEMS_SUCCESSFUL; 40005f28: c0 24 20 34 clr [ %l0 + 0x34 ] api = executing->API_Extensions[ THREAD_API_RTEMS ]; _ISR_Disable( level ); 40005f2c: 7f ff ef e8 call 40001ecc 40005f30: e4 04 21 6c ld [ %l0 + 0x16c ], %l2 40005f34: 84 10 00 08 mov %o0, %g2 pending_events = api->pending_events; 40005f38: c2 04 a0 40 ld [ %l2 + 0x40 ], %g1 seized_events = _Event_sets_Get( pending_events, event_in ); if ( !_Event_sets_Is_empty( seized_events ) && 40005f3c: a2 8e 00 01 andcc %i0, %g1, %l1 40005f40: 02 80 00 0e be 40005f78 <_Event_Seize+0x5c> 40005f44: 80 8e 60 01 btst 1, %i1 40005f48: 80 a4 40 18 cmp %l1, %i0 40005f4c: 02 80 00 04 be 40005f5c <_Event_Seize+0x40> 40005f50: 80 8e 60 02 btst 2, %i1 40005f54: 02 80 00 09 be 40005f78 <_Event_Seize+0x5c> 40005f58: 80 8e 60 01 btst 1, %i1 (seized_events == event_in || _Options_Is_any( option_set )) ) { api->pending_events = 40005f5c: 82 28 40 11 andn %g1, %l1, %g1 40005f60: c2 24 a0 40 st %g1, [ %l2 + 0x40 ] _Event_sets_Clear( pending_events, seized_events ); _ISR_Enable( level ); 40005f64: 7f ff ef de call 40001edc 40005f68: 01 00 00 00 nop 40005f6c: e2 26 c0 00 st %l1, [ %i3 ] 40005f70: 81 c7 e0 08 ret 40005f74: 81 e8 00 00 restore *event_out = seized_events; return; } if ( _Options_Is_no_wait( option_set ) ) { 40005f78: 22 80 00 09 be,a 40005f9c <_Event_Seize+0x80> 40005f7c: 23 10 00 6d sethi %hi(0x4001b400), %l1 _ISR_Enable( level ); 40005f80: 7f ff ef d7 call 40001edc 40005f84: 90 10 00 02 mov %g2, %o0 executing->Wait.return_code = RTEMS_UNSATISFIED; 40005f88: 82 10 20 0d mov 0xd, %g1 40005f8c: c2 24 20 34 st %g1, [ %l0 + 0x34 ] *event_out = seized_events; 40005f90: e2 26 c0 00 st %l1, [ %i3 ] 40005f94: 81 c7 e0 08 ret 40005f98: 81 e8 00 00 restore return; } _Event_Sync_state = EVENT_SYNC_NOTHING_HAPPENED; 40005f9c: 82 10 20 01 mov 1, %g1 executing->Wait.option = (uint32_t ) option_set; 40005fa0: f2 24 20 30 st %i1, [ %l0 + 0x30 ] executing->Wait.count = (uint32_t ) event_in; 40005fa4: f0 24 20 24 st %i0, [ %l0 + 0x24 ] executing->Wait.return_argument = event_out; 40005fa8: f6 24 20 28 st %i3, [ %l0 + 0x28 ] executing->Wait.return_code = RTEMS_UNSATISFIED; *event_out = seized_events; return; } _Event_Sync_state = EVENT_SYNC_NOTHING_HAPPENED; 40005fac: c2 24 63 b4 st %g1, [ %l1 + 0x3b4 ] executing->Wait.option = (uint32_t ) option_set; executing->Wait.count = (uint32_t ) event_in; executing->Wait.return_argument = event_out; _ISR_Enable( level ); 40005fb0: 7f ff ef cb call 40001edc 40005fb4: 90 10 00 02 mov %g2, %o0 if ( ticks ) { 40005fb8: 80 a6 a0 00 cmp %i2, 0 40005fbc: 02 80 00 0f be 40005ff8 <_Event_Seize+0xdc> 40005fc0: 90 10 00 10 mov %l0, %o0 _Watchdog_Initialize( 40005fc4: c2 04 20 08 ld [ %l0 + 8 ], %g1 ) { the_watchdog->initial = units; _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 40005fc8: 11 10 00 6b sethi %hi(0x4001ac00), %o0 void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; the_watchdog->id = id; 40005fcc: c2 24 20 68 st %g1, [ %l0 + 0x68 ] Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; 40005fd0: 03 10 00 18 sethi %hi(0x40006000), %g1 40005fd4: 82 10 62 a4 or %g1, 0x2a4, %g1 ! 400062a4 <_Event_Timeout> Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 40005fd8: f4 24 20 54 st %i2, [ %l0 + 0x54 ] Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 40005fdc: c0 24 20 50 clr [ %l0 + 0x50 ] the_watchdog->routine = routine; the_watchdog->id = id; the_watchdog->user_data = user_data; 40005fe0: c0 24 20 6c clr [ %l0 + 0x6c ] Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; 40005fe4: c2 24 20 64 st %g1, [ %l0 + 0x64 ] ) { the_watchdog->initial = units; _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 40005fe8: 90 12 22 cc or %o0, 0x2cc, %o0 40005fec: 40 00 13 5d call 4000ad60 <_Watchdog_Insert> 40005ff0: 92 04 20 48 add %l0, 0x48, %o1 NULL ); _Watchdog_Insert_ticks( &executing->Timer, ticks ); } _Thread_Set_state( executing, STATES_WAITING_FOR_EVENT ); 40005ff4: 90 10 00 10 mov %l0, %o0 40005ff8: 40 00 11 63 call 4000a584 <_Thread_Set_state> 40005ffc: 92 10 21 00 mov 0x100, %o1 _ISR_Disable( level ); 40006000: 7f ff ef b3 call 40001ecc 40006004: 01 00 00 00 nop 40006008: b0 10 00 08 mov %o0, %i0 sync_state = _Event_Sync_state; 4000600c: c4 04 63 b4 ld [ %l1 + 0x3b4 ], %g2 _Event_Sync_state = EVENT_SYNC_SYNCHRONIZED; 40006010: c0 24 63 b4 clr [ %l1 + 0x3b4 ] switch ( sync_state ) { 40006014: 80 a0 a0 02 cmp %g2, 2 40006018: 02 80 00 08 be 40006038 <_Event_Seize+0x11c> 4000601c: 80 a0 a0 03 cmp %g2, 3 40006020: 02 80 00 09 be 40006044 <_Event_Seize+0x128> 40006024: 80 a0 a0 01 cmp %g2, 1 40006028: 12 80 00 15 bne 4000607c <_Event_Seize+0x160> 4000602c: 01 00 00 00 nop * enter the synchronization states above. */ return; case EVENT_SYNC_NOTHING_HAPPENED: _ISR_Enable( level ); 40006030: 7f ff ef ab call 40001edc 40006034: 81 e8 00 00 restore return; case EVENT_SYNC_TIMEOUT: executing->Wait.return_code = RTEMS_TIMEOUT; 40006038: 82 10 20 06 mov 6, %g1 <== NOT EXECUTED 4000603c: c2 24 20 34 st %g1, [ %l0 + 0x34 ] <== NOT EXECUTED _ISR_Enable( level ); 40006040: 30 80 00 0b b,a 4000606c <_Event_Seize+0x150> <== NOT EXECUTED _Thread_Unblock( executing ); return; case EVENT_SYNC_SATISFIED: if ( _Watchdog_Is_active( &executing->Timer ) ) { 40006044: c2 04 20 50 ld [ %l0 + 0x50 ], %g1 <== NOT EXECUTED 40006048: 80 a0 60 02 cmp %g1, 2 <== NOT EXECUTED 4000604c: 12 80 00 08 bne 4000606c <_Event_Seize+0x150> <== NOT EXECUTED 40006050: 01 00 00 00 nop <== NOT EXECUTED RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate( Watchdog_Control *the_watchdog ) { the_watchdog->state = WATCHDOG_REMOVE_IT; 40006054: c4 24 20 50 st %g2, [ %l0 + 0x50 ] <== NOT EXECUTED _Watchdog_Deactivate( &executing->Timer ); _ISR_Enable( level ); 40006058: 7f ff ef a1 call 40001edc <== NOT EXECUTED 4000605c: b0 10 00 10 mov %l0, %i0 <== NOT EXECUTED (void) _Watchdog_Remove( &executing->Timer ); 40006060: 40 00 13 98 call 4000aec0 <_Watchdog_Remove> <== NOT EXECUTED 40006064: 90 04 20 48 add %l0, 0x48, %o0 <== NOT EXECUTED 40006068: 30 80 00 03 b,a 40006074 <_Event_Seize+0x158> <== NOT EXECUTED } else _ISR_Enable( level ); 4000606c: 7f ff ef 9c call 40001edc <== NOT EXECUTED 40006070: b0 10 00 10 mov %l0, %i0 <== NOT EXECUTED _Thread_Unblock( executing ); 40006074: 7f ff ff a4 call 40005f04 <_Thread_Unblock> <== NOT EXECUTED 40006078: 81 e8 00 00 restore <== NOT EXECUTED 4000607c: 81 c7 e0 08 ret <== NOT EXECUTED 40006080: 81 e8 00 00 restore <== NOT EXECUTED 4000619c <_Event_Surrender>: */ void _Event_Surrender( Thread_Control *the_thread ) { 4000619c: 9d e3 bf 98 save %sp, -104, %sp 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 ]; 400061a0: e2 06 21 6c ld [ %i0 + 0x16c ], %l1 option_set = (rtems_option) the_thread->Wait.option; 400061a4: e6 06 20 30 ld [ %i0 + 0x30 ], %l3 _ISR_Disable( level ); 400061a8: 7f ff ef 49 call 40001ecc 400061ac: a0 10 00 18 mov %i0, %l0 400061b0: a4 10 00 08 mov %o0, %l2 pending_events = api->pending_events; 400061b4: c8 04 60 40 ld [ %l1 + 0x40 ], %g4 event_condition = (rtems_event_set) the_thread->Wait.count; 400061b8: c4 06 20 24 ld [ %i0 + 0x24 ], %g2 seized_events = _Event_sets_Get( pending_events, event_condition ); if ( !_Event_sets_Is_empty( seized_events ) ) { 400061bc: 86 88 80 04 andcc %g2, %g4, %g3 400061c0: 02 80 00 36 be 40006298 <_Event_Surrender+0xfc> 400061c4: 01 00 00 00 nop if ( _States_Is_waiting_for_event( the_thread->current_state ) ) { 400061c8: c2 06 20 10 ld [ %i0 + 0x10 ], %g1 400061cc: 80 88 61 00 btst 0x100, %g1 400061d0: 02 80 00 1e be 40006248 <_Event_Surrender+0xac> 400061d4: 1b 10 00 6d sethi %hi(0x4001b400), %o5 if ( seized_events == event_condition || _Options_Is_any( option_set ) ) { 400061d8: 80 a0 c0 02 cmp %g3, %g2 400061dc: 02 80 00 04 be 400061ec <_Event_Surrender+0x50> 400061e0: 80 8c e0 02 btst 2, %l3 400061e4: 02 80 00 19 be 40006248 <_Event_Surrender+0xac> 400061e8: 01 00 00 00 nop api->pending_events = 400061ec: 82 29 00 03 andn %g4, %g3, %g1 400061f0: c2 24 60 40 st %g1, [ %l1 + 0x40 ] _Event_sets_Clear( pending_events, seized_events ); the_thread->Wait.count = 0; *(rtems_event_set *)the_thread->Wait.return_argument = seized_events; 400061f4: c2 04 20 28 ld [ %l0 + 0x28 ], %g1 if ( !_Event_sets_Is_empty( seized_events ) ) { 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 ); the_thread->Wait.count = 0; 400061f8: c0 24 20 24 clr [ %l0 + 0x24 ] *(rtems_event_set *)the_thread->Wait.return_argument = seized_events; 400061fc: c6 20 40 00 st %g3, [ %g1 ] _ISR_Flash( level ); 40006200: 7f ff ef 37 call 40001edc 40006204: 01 00 00 00 nop 40006208: 7f ff ef 31 call 40001ecc 4000620c: 01 00 00 00 nop if ( !_Watchdog_Is_active( &the_thread->Timer ) ) { 40006210: c2 04 20 50 ld [ %l0 + 0x50 ], %g1 40006214: 80 a0 60 02 cmp %g1, 2 40006218: 02 80 00 05 be 4000622c <_Event_Surrender+0x90> 4000621c: 82 10 20 03 mov 3, %g1 _ISR_Enable( level ); 40006220: 7f ff ef 2f call 40001edc 40006224: 90 10 00 12 mov %l2, %o0 40006228: 30 80 00 06 b,a 40006240 <_Event_Surrender+0xa4> 4000622c: c2 24 20 50 st %g1, [ %l0 + 0x50 ] _Thread_Unblock( the_thread ); } else { _Watchdog_Deactivate( &the_thread->Timer ); _ISR_Enable( level ); 40006230: 7f ff ef 2b call 40001edc 40006234: 90 10 00 12 mov %l2, %o0 (void) _Watchdog_Remove( &the_thread->Timer ); 40006238: 40 00 13 22 call 4000aec0 <_Watchdog_Remove> 4000623c: 90 04 20 48 add %l0, 0x48, %o0 _Thread_Unblock( the_thread ); 40006240: 7f ff ff d1 call 40006184 <_Thread_Unblock> 40006244: 81 e8 00 00 restore } return; } } switch ( _Event_Sync_state ) { 40006248: c2 03 63 b4 ld [ %o5 + 0x3b4 ], %g1 <== NOT EXECUTED 4000624c: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 40006250: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 40006254: 18 80 00 11 bgu 40006298 <_Event_Surrender+0xfc> <== NOT EXECUTED 40006258: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED case EVENT_SYNC_SATISFIED: break; case EVENT_SYNC_NOTHING_HAPPENED: case EVENT_SYNC_TIMEOUT: if ( !_Thread_Is_executing( the_thread ) ) 4000625c: c2 00 62 ac ld [ %g1 + 0x2ac ], %g1 ! 4001aeac <_Thread_Executing> <== NOT EXECUTED 40006260: 80 a4 00 01 cmp %l0, %g1 <== NOT EXECUTED 40006264: 12 80 00 0d bne 40006298 <_Event_Surrender+0xfc> <== NOT EXECUTED 40006268: 80 a0 c0 02 cmp %g3, %g2 <== NOT EXECUTED break; if ( seized_events == event_condition || _Options_Is_any(option_set) ) { 4000626c: 02 80 00 04 be 4000627c <_Event_Surrender+0xe0> <== NOT EXECUTED 40006270: 80 8c e0 02 btst 2, %l3 <== NOT EXECUTED 40006274: 02 80 00 09 be 40006298 <_Event_Surrender+0xfc> <== NOT EXECUTED 40006278: 01 00 00 00 nop <== NOT EXECUTED api->pending_events = 4000627c: 82 29 00 03 andn %g4, %g3, %g1 <== NOT EXECUTED 40006280: c2 24 60 40 st %g1, [ %l1 + 0x40 ] <== NOT EXECUTED _Event_sets_Clear( pending_events,seized_events ); the_thread->Wait.count = 0; *(rtems_event_set *)the_thread->Wait.return_argument = seized_events; 40006284: c2 04 20 28 ld [ %l0 + 0x28 ], %g1 <== NOT EXECUTED break; if ( seized_events == event_condition || _Options_Is_any(option_set) ) { api->pending_events = _Event_sets_Clear( pending_events,seized_events ); the_thread->Wait.count = 0; 40006288: c0 24 20 24 clr [ %l0 + 0x24 ] <== NOT EXECUTED *(rtems_event_set *)the_thread->Wait.return_argument = seized_events; 4000628c: c6 20 40 00 st %g3, [ %g1 ] <== NOT EXECUTED _Event_Sync_state = EVENT_SYNC_SATISFIED; 40006290: 82 10 20 03 mov 3, %g1 <== NOT EXECUTED 40006294: c2 23 63 b4 st %g1, [ %o5 + 0x3b4 ] <== NOT EXECUTED } break; } } _ISR_Enable( level ); 40006298: 7f ff ef 11 call 40001edc 4000629c: 91 e8 00 12 restore %g0, %l2, %o0 400062a0: 01 00 00 00 nop 400062a4 <_Event_Timeout>: void _Event_Timeout( Objects_Id id, void *ignored ) { 400062a4: 9d e3 bf 90 save %sp, -112, %sp uint32_t the_api; uint32_t the_class; Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { 400062a8: 92 96 20 00 orcc %i0, 0, %o1 400062ac: 12 80 00 0a bne 400062d4 <_Event_Timeout+0x30> 400062b0: 83 32 60 18 srl %o1, 0x18, %g1 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 400062b4: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 400062b8: c4 00 61 d0 ld [ %g1 + 0x1d0 ], %g2 ! 4001add0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 400062bc: 84 00 a0 01 inc %g2 <== NOT EXECUTED 400062c0: c4 20 61 d0 st %g2, [ %g1 + 0x1d0 ] <== NOT EXECUTED Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; tp = _Thread_Executing; 400062c4: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 400062c8: f0 00 62 ac ld [ %g1 + 0x2ac ], %i0 ! 4001aeac <_Thread_Executing> <== NOT EXECUTED Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; 400062cc: 10 80 00 18 b 4000632c <_Event_Timeout+0x88> <== NOT EXECUTED 400062d0: c0 27 bf f4 clr [ %fp + -12 ] <== NOT EXECUTED 400062d4: 84 08 60 07 and %g1, 7, %g2 tp = _Thread_Executing; goto done; } the_api = _Objects_Get_API( id ); if ( the_api && the_api > OBJECTS_APIS_LAST ) { 400062d8: 80 a0 a0 04 cmp %g2, 4 400062dc: 18 80 00 0e bgu 40006314 <_Event_Timeout+0x70> 400062e0: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; goto done; } the_class = _Objects_Get_class( id ); if ( the_class != 1 ) { /* threads are always first class :) */ 400062e4: 83 32 60 1b srl %o1, 0x1b, %g1 400062e8: 80 a0 60 01 cmp %g1, 1 400062ec: 12 80 00 0a bne 40006314 <_Event_Timeout+0x70> 400062f0: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; goto done; } information = _Objects_Information_table[ the_api ][ the_class ]; 400062f4: 83 28 a0 02 sll %g2, 2, %g1 400062f8: 05 10 00 6b sethi %hi(0x4001ac00), %g2 400062fc: 84 10 a1 30 or %g2, 0x130, %g2 ! 4001ad30 <_Objects_Information_table> 40006300: c2 00 80 01 ld [ %g2 + %g1 ], %g1 40006304: d0 00 60 04 ld [ %g1 + 4 ], %o0 if ( !information ) { 40006308: 80 a2 20 00 cmp %o0, 0 4000630c: 12 80 00 05 bne 40006320 <_Event_Timeout+0x7c> 40006310: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 40006314: b0 10 20 00 clr %i0 <== NOT EXECUTED 40006318: 10 80 00 05 b 4000632c <_Event_Timeout+0x88> <== NOT EXECUTED 4000631c: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED goto done; } tp = (Thread_Control *) _Objects_Get( information, id, location ); 40006320: 40 00 08 bf call 4000861c <_Objects_Get> 40006324: 94 07 bf f4 add %fp, -12, %o2 40006328: b0 10 00 08 mov %o0, %i0 Thread_Control *the_thread; Objects_Locations location; ISR_Level level; the_thread = _Thread_Get( id, &location ); switch ( location ) { 4000632c: c2 07 bf f4 ld [ %fp + -12 ], %g1 40006330: 80 a0 60 00 cmp %g1, 0 40006334: 12 80 00 27 bne 400063d0 <_Event_Timeout+0x12c> 40006338: 01 00 00 00 nop * 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 ); 4000633c: 7f ff ee e4 call 40001ecc 40006340: 01 00 00 00 nop 40006344: 86 10 00 08 mov %o0, %g3 if ( the_thread->Wait.count ) { /* verify thread is waiting */ 40006348: c2 06 20 24 ld [ %i0 + 0x24 ], %g1 4000634c: 80 a0 60 00 cmp %g1, 0 40006350: 02 80 00 1a be 400063b8 <_Event_Timeout+0x114> 40006354: 05 10 00 6d sethi %hi(0x4001b400), %g2 the_thread->Wait.count = 0; if ( _Event_Sync_state != EVENT_SYNC_SYNCHRONIZED && 40006358: c2 00 a3 b4 ld [ %g2 + 0x3b4 ], %g1 ! 4001b7b4 <_Event_Sync_state> 4000635c: 80 a0 60 00 cmp %g1, 0 40006360: 02 80 00 0d be 40006394 <_Event_Timeout+0xf0> 40006364: c0 26 20 24 clr [ %i0 + 0x24 ] 40006368: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 4000636c: c2 00 62 ac ld [ %g1 + 0x2ac ], %g1 ! 4001aeac <_Thread_Executing> <== NOT EXECUTED 40006370: 80 a6 00 01 cmp %i0, %g1 <== NOT EXECUTED 40006374: 12 80 00 09 bne 40006398 <_Event_Timeout+0xf4> <== NOT EXECUTED 40006378: 82 10 20 06 mov 6, %g1 <== NOT EXECUTED _Thread_Is_executing( the_thread ) ) { if ( _Event_Sync_state != EVENT_SYNC_SATISFIED ) { 4000637c: c2 00 a3 b4 ld [ %g2 + 0x3b4 ], %g1 <== NOT EXECUTED 40006380: 80 a0 60 03 cmp %g1, 3 <== NOT EXECUTED 40006384: 02 80 00 03 be 40006390 <_Event_Timeout+0xec> <== NOT EXECUTED 40006388: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED _Event_Sync_state = EVENT_SYNC_TIMEOUT; 4000638c: c2 20 a3 b4 st %g1, [ %g2 + 0x3b4 ] <== NOT EXECUTED } _ISR_Enable( level ); 40006390: 30 80 00 0a b,a 400063b8 <_Event_Timeout+0x114> <== NOT EXECUTED } else { the_thread->Wait.return_code = RTEMS_TIMEOUT; 40006394: 82 10 20 06 mov 6, %g1 40006398: c2 26 20 34 st %g1, [ %i0 + 0x34 ] _ISR_Enable( level ); 4000639c: 7f ff ee d0 call 40001edc 400063a0: 90 10 00 03 mov %g3, %o0 RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); 400063a4: 90 10 00 18 mov %i0, %o0 400063a8: 13 04 00 ff sethi %hi(0x1003fc00), %o1 400063ac: 40 00 0c d6 call 40009704 <_Thread_Clear_state> 400063b0: 92 12 63 f8 or %o1, 0x3f8, %o1 ! 1003fff8 400063b4: 30 80 00 03 b,a 400063c0 <_Event_Timeout+0x11c> _Thread_Unblock( the_thread ); } } else { _ISR_Enable( level ); 400063b8: 7f ff ee c9 call 40001edc <== NOT EXECUTED 400063bc: 01 00 00 00 nop <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; 400063c0: 05 10 00 6b sethi %hi(0x4001ac00), %g2 400063c4: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> 400063c8: 82 00 7f ff add %g1, -1, %g1 400063cc: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] 400063d0: 81 c7 e0 08 ret 400063d4: 81 e8 00 00 restore 40019da4 <_Heap_Get_free_information>: */ RTEMS_INLINE_ROUTINE Heap_Block *_Heap_First ( Heap_Control *the_heap ) { return _Heap_Head(the_heap)->next; 40019da4: da 02 20 08 ld [ %o0 + 8 ], %o5 <== NOT EXECUTED ) { Heap_Block *the_block; Heap_Block *const tail = _Heap_Tail(the_heap); info->number = 0; 40019da8: c0 22 40 00 clr [ %o1 ] <== NOT EXECUTED info->largest = 0; 40019dac: c0 22 60 04 clr [ %o1 + 4 ] <== NOT EXECUTED info->total = 0; 40019db0: 10 80 00 0e b 40019de8 <_Heap_Get_free_information+0x44> <== NOT EXECUTED 40019db4: c0 22 60 08 clr [ %o1 + 8 ] <== NOT EXECUTED uint32_t const the_size = _Heap_Block_size(the_block); /* As we always coalesce free blocks, prev block must have been used. */ _HAssert(_Heap_Is_prev_used(the_block)); info->number++; 40019db8: c2 02 40 00 ld [ %o1 ], %g1 <== NOT EXECUTED info->total += the_size; 40019dbc: c4 02 60 08 ld [ %o1 + 8 ], %g2 <== NOT EXECUTED if ( info->largest < the_size ) 40019dc0: c8 02 60 04 ld [ %o1 + 4 ], %g4 <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE uint32_t _Heap_Block_size ( Heap_Block *the_block ) { return (the_block->size & ~HEAP_PREV_USED); 40019dc4: 86 08 ff fe and %g3, -2, %g3 <== NOT EXECUTED uint32_t const the_size = _Heap_Block_size(the_block); /* As we always coalesce free blocks, prev block must have been used. */ _HAssert(_Heap_Is_prev_used(the_block)); info->number++; 40019dc8: 82 00 60 01 inc %g1 <== NOT EXECUTED info->total += the_size; 40019dcc: 84 00 80 03 add %g2, %g3, %g2 <== NOT EXECUTED uint32_t const the_size = _Heap_Block_size(the_block); /* As we always coalesce free blocks, prev block must have been used. */ _HAssert(_Heap_Is_prev_used(the_block)); info->number++; 40019dd0: c2 22 40 00 st %g1, [ %o1 ] <== NOT EXECUTED info->total += the_size; if ( info->largest < the_size ) 40019dd4: 80 a1 00 03 cmp %g4, %g3 <== NOT EXECUTED 40019dd8: 1a 80 00 03 bcc 40019de4 <_Heap_Get_free_information+0x40> <== NOT EXECUTED 40019ddc: c4 22 60 08 st %g2, [ %o1 + 8 ] <== NOT EXECUTED info->largest = the_size; 40019de0: c6 22 60 04 st %g3, [ %o1 + 4 ] <== NOT EXECUTED info->largest = 0; info->total = 0; for(the_block = _Heap_First(the_heap); the_block != tail; the_block = the_block->next) 40019de4: da 03 60 08 ld [ %o5 + 8 ], %o5 <== NOT EXECUTED info->number = 0; info->largest = 0; info->total = 0; for(the_block = _Heap_First(the_heap); the_block != tail; 40019de8: 80 a3 40 08 cmp %o5, %o0 <== NOT EXECUTED 40019dec: 32 bf ff f3 bne,a 40019db8 <_Heap_Get_free_information+0x14> <== NOT EXECUTED 40019df0: c6 03 60 04 ld [ %o5 + 4 ], %g3 <== NOT EXECUTED info->number++; info->total += the_size; if ( info->largest < the_size ) info->largest = the_size; } } 40019df4: 81 c3 e0 08 retl <== NOT EXECUTED 40019df8: 01 00 00 00 nop 40007f30 <_Heap_Initialize>: Heap_Control *the_heap, void *starting_address, size_t size, uint32_t page_size ) { 40007f30: 9d e3 bf 98 save %sp, -104, %sp _H_uptr_t start; _H_uptr_t aligned_start; uint32_t overhead; Heap_Statistics *const stats = &the_heap->stats; if (page_size == 0) 40007f34: 80 a6 e0 00 cmp %i3, 0 40007f38: 12 80 00 05 bne 40007f4c <_Heap_Initialize+0x1c> 40007f3c: f6 27 a0 50 st %i3, [ %fp + 0x50 ] page_size = CPU_ALIGNMENT; 40007f40: 82 10 20 08 mov 8, %g1 <== NOT EXECUTED 40007f44: 10 80 00 05 b 40007f58 <_Heap_Initialize+0x28> <== NOT EXECUTED 40007f48: c2 27 a0 50 st %g1, [ %fp + 0x50 ] <== NOT EXECUTED else _Heap_Align_up( &page_size, CPU_ALIGNMENT ); 40007f4c: 90 07 a0 50 add %fp, 0x50, %o0 40007f50: 7f ff ff b0 call 40007e10 <_Heap_Align_up> 40007f54: 92 10 20 08 mov 8, %o1 /* Calculate aligned_start so that aligned_start + HEAP_BLOCK_USER_OFFSET (value of user pointer) is aligned on 'page_size' boundary. Make sure resulting 'aligned_start' is not below 'starting_address'. */ start = _H_p2u(starting_address); aligned_start = start + HEAP_BLOCK_USER_OFFSET; _Heap_Align_up_uptr ( &aligned_start, page_size ); 40007f58: e0 07 a0 50 ld [ %fp + 0x50 ], %l0 /* Calculate aligned_start so that aligned_start + HEAP_BLOCK_USER_OFFSET (value of user pointer) is aligned on 'page_size' boundary. Make sure resulting 'aligned_start' is not below 'starting_address'. */ start = _H_p2u(starting_address); aligned_start = start + HEAP_BLOCK_USER_OFFSET; 40007f5c: a4 06 60 08 add %i1, 8, %l2 uint32_t alignment ) { _H_uptr_t v = *value; uint32_t a = alignment; _H_uptr_t r = v % a; 40007f60: 92 10 00 10 mov %l0, %o1 40007f64: 40 00 38 eb call 40016310 <.urem> 40007f68: 90 10 00 12 mov %l2, %o0 *value = r ? v - r + a : v; 40007f6c: 80 a2 20 00 cmp %o0, 0 40007f70: 02 80 00 05 be 40007f84 <_Heap_Initialize+0x54> 40007f74: 82 10 20 10 mov 0x10, %g1 40007f78: 82 04 80 10 add %l2, %l0, %g1 40007f7c: a4 20 40 08 sub %g1, %o0, %l2 _Heap_Align_up_uptr ( &aligned_start, page_size ); aligned_start -= HEAP_BLOCK_USER_OFFSET; /* Calculate 'min_block_size'. It's HEAP_MIN_BLOCK_SIZE aligned up to the nearest multiple of 'page_size'. */ the_heap->min_block_size = HEAP_MIN_BLOCK_SIZE; 40007f80: 82 10 20 10 mov 0x10, %g1 _Heap_Align_up ( &the_heap->min_block_size, page_size ); 40007f84: 92 10 00 10 mov %l0, %o1 _Heap_Align_up_uptr ( &aligned_start, page_size ); aligned_start -= HEAP_BLOCK_USER_OFFSET; /* Calculate 'min_block_size'. It's HEAP_MIN_BLOCK_SIZE aligned up to the nearest multiple of 'page_size'. */ the_heap->min_block_size = HEAP_MIN_BLOCK_SIZE; 40007f88: c2 26 20 14 st %g1, [ %i0 + 0x14 ] _Heap_Align_up ( &the_heap->min_block_size, page_size ); 40007f8c: 7f ff ff a1 call 40007e10 <_Heap_Align_up> 40007f90: 90 06 20 14 add %i0, 0x14, %o0 (value of user pointer) is aligned on 'page_size' boundary. Make sure resulting 'aligned_start' is not below 'starting_address'. */ start = _H_p2u(starting_address); aligned_start = start + HEAP_BLOCK_USER_OFFSET; _Heap_Align_up_uptr ( &aligned_start, page_size ); aligned_start -= HEAP_BLOCK_USER_OFFSET; 40007f94: b6 04 bf f8 add %l2, -8, %i3 /* Calculate 'the_size' -- size of the first block so that there is enough space at the end for the permanent last block. It is equal to 'size' minus total overhead aligned down to the nearest multiple of 'page_size'. */ overhead = HEAP_OVERHEAD + (aligned_start - start); 40007f98: 82 26 c0 19 sub %i3, %i1, %g1 40007f9c: 82 00 60 08 add %g1, 8, %g1 if ( size < overhead ) 40007fa0: 80 a6 80 01 cmp %i2, %g1 40007fa4: 0a 80 00 2b bcs 40008050 <_Heap_Initialize+0x120> 40007fa8: e2 07 a0 50 ld [ %fp + 0x50 ], %l1 return 0; /* Too small area for the heap */ the_size = size - overhead; 40007fac: a0 26 80 01 sub %i2, %g1, %l0 uint32_t *value, uint32_t alignment ) { uint32_t v = *value; *value = v - (v % alignment); 40007fb0: 92 10 00 11 mov %l1, %o1 40007fb4: 40 00 38 d7 call 40016310 <.urem> 40007fb8: 90 10 00 10 mov %l0, %o0 _Heap_Align_down ( &the_size, page_size ); if ( the_size == 0 ) 40007fbc: a0 a4 00 08 subcc %l0, %o0, %l0 40007fc0: 02 80 00 24 be 40008050 <_Heap_Initialize+0x120> 40007fc4: 07 10 00 6a sethi %hi(0x4001a800), %g3 return 0; /* Too small area for the heap */ the_heap->page_size = page_size; 40007fc8: e2 26 20 10 st %l1, [ %i0 + 0x10 ] the_heap->begin = starting_address; the_heap->end = starting_address + size; the_block = (Heap_Block *) aligned_start; the_block->prev_size = page_size; 40007fcc: e2 24 bf f8 st %l1, [ %l2 + -8 ] the_block->size = the_size | HEAP_PREV_USED; 40007fd0: 82 14 20 01 or %l0, 1, %g1 stats->max_search = 0; stats->allocs = 0; stats->searches = 0; stats->frees = 0; stats->resizes = 0; stats->instance = instance++; 40007fd4: c4 00 e3 ac ld [ %g3 + 0x3ac ], %g2 the_heap->end = starting_address + size; the_block = (Heap_Block *) aligned_start; the_block->prev_size = page_size; the_block->size = the_size | HEAP_PREV_USED; 40007fd8: c2 26 e0 04 st %g1, [ %i3 + 4 ] _HAssert(_Heap_Is_aligned(the_heap->min_block_size, page_size)); _HAssert(_Heap_Is_aligned_ptr(_Heap_User_area(the_block), page_size)); the_block = _Heap_Block_at( the_block, the_size ); the_heap->final = the_block; /* Permanent final block of the heap */ the_block->prev_size = the_size; /* Previous block is free */ 40007fdc: e0 26 c0 10 st %l0, [ %i3 + %l0 ] RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( void *base, uint32_t offset ) { return (Heap_Block *) _Addresses_Add_offset( base, offset ); 40007fe0: 88 06 c0 10 add %i3, %l0, %g4 the_block->size = page_size; 40007fe4: e2 21 20 04 st %l1, [ %g4 + 4 ] the_block = (Heap_Block *) aligned_start; the_block->prev_size = page_size; the_block->size = the_size | HEAP_PREV_USED; the_block->next = _Heap_Tail( the_heap ); 40007fe8: f0 26 e0 08 st %i0, [ %i3 + 8 ] the_block->prev = _Heap_Head( the_heap ); 40007fec: f0 26 e0 0c st %i0, [ %i3 + 0xc ] stats->max_search = 0; stats->allocs = 0; stats->searches = 0; stats->frees = 0; stats->resizes = 0; stats->instance = instance++; 40007ff0: c4 26 20 28 st %g2, [ %i0 + 0x28 ] the_block->size = page_size; stats->size = size; stats->free_size = the_size; stats->min_free_size = the_size; stats->free_blocks = 1; 40007ff4: 82 10 20 01 mov 1, %g1 the_block = _Heap_Block_at( the_block, the_size ); the_heap->final = the_block; /* Permanent final block of the heap */ the_block->prev_size = the_size; /* Previous block is free */ the_block->size = page_size; stats->size = size; 40007ff8: f4 26 20 2c st %i2, [ %i0 + 0x2c ] stats->free_size = the_size; stats->min_free_size = the_size; stats->free_blocks = 1; stats->max_free_blocks = 1; 40007ffc: c2 26 20 3c st %g1, [ %i0 + 0x3c ] the_block->size = page_size; stats->size = size; stats->free_size = the_size; stats->min_free_size = the_size; stats->free_blocks = 1; 40008000: c2 26 20 38 st %g1, [ %i0 + 0x38 ] the_heap->final = the_block; /* Permanent final block of the heap */ the_block->prev_size = the_size; /* Previous block is free */ the_block->size = page_size; stats->size = size; stats->free_size = the_size; 40008004: e0 26 20 30 st %l0, [ %i0 + 0x30 ] stats->min_free_size = the_size; 40008008: e0 26 20 34 st %l0, [ %i0 + 0x34 ] stats->free_blocks = 1; stats->max_free_blocks = 1; stats->used_blocks = 0; 4000800c: c0 26 20 40 clr [ %i0 + 0x40 ] stats->max_search = 0; 40008010: c0 26 20 44 clr [ %i0 + 0x44 ] stats->allocs = 0; 40008014: c0 26 20 48 clr [ %i0 + 0x48 ] stats->searches = 0; 40008018: c0 26 20 4c clr [ %i0 + 0x4c ] stats->frees = 0; 4000801c: c0 26 20 50 clr [ %i0 + 0x50 ] stats->resizes = 0; 40008020: c0 26 20 54 clr [ %i0 + 0x54 ] if ( the_size == 0 ) return 0; /* Too small area for the heap */ the_heap->page_size = page_size; the_heap->begin = starting_address; the_heap->end = starting_address + size; 40008024: 82 06 40 1a add %i1, %i2, %g1 stats->max_search = 0; stats->allocs = 0; stats->searches = 0; stats->frees = 0; stats->resizes = 0; stats->instance = instance++; 40008028: 84 00 a0 01 inc %g2 if ( the_size == 0 ) return 0; /* Too small area for the heap */ the_heap->page_size = page_size; the_heap->begin = starting_address; the_heap->end = starting_address + size; 4000802c: c2 26 20 1c st %g1, [ %i0 + 0x1c ] _Heap_Align_down ( &the_size, page_size ); if ( the_size == 0 ) return 0; /* Too small area for the heap */ the_heap->page_size = page_size; the_heap->begin = starting_address; 40008030: f2 26 20 18 st %i1, [ %i0 + 0x18 ] the_block->prev_size = page_size; the_block->size = the_size | HEAP_PREV_USED; the_block->next = _Heap_Tail( the_heap ); the_block->prev = _Heap_Head( the_heap ); _Heap_Head(the_heap)->next = the_block; 40008034: f6 26 20 08 st %i3, [ %i0 + 8 ] _Heap_Tail(the_heap)->prev = the_block; 40008038: f6 26 20 0c st %i3, [ %i0 + 0xc ] the_heap->start = the_block; 4000803c: f6 26 20 20 st %i3, [ %i0 + 0x20 ] _HAssert(_Heap_Is_aligned(the_heap->page_size, CPU_ALIGNMENT)); _HAssert(_Heap_Is_aligned(the_heap->min_block_size, page_size)); _HAssert(_Heap_Is_aligned_ptr(_Heap_User_area(the_block), page_size)); the_block = _Heap_Block_at( the_block, the_size ); the_heap->final = the_block; /* Permanent final block of the heap */ 40008040: c8 26 20 24 st %g4, [ %i0 + 0x24 ] stats->max_search = 0; stats->allocs = 0; stats->searches = 0; stats->frees = 0; stats->resizes = 0; stats->instance = instance++; 40008044: c4 20 e3 ac st %g2, [ %g3 + 0x3ac ] return ( the_size - HEAP_BLOCK_USED_OVERHEAD ); 40008048: 81 c7 e0 08 ret 4000804c: 91 ec 3f fc restore %l0, -4, %o0 } 40008050: 81 c7 e0 08 ret 40008054: 91 e8 20 00 restore %g0, 0, %o0 4000d8cc <_Heap_Resize_block>: void *starting_address, size_t size, uint32_t *old_mem_size, uint32_t *avail_mem_size ) { 4000d8cc: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED uint32_t old_block_size; uint32_t old_user_size; uint32_t prev_used_flag; Heap_Statistics *const stats = &the_heap->stats; uint32_t const min_block_size = the_heap->min_block_size; uint32_t const page_size = the_heap->page_size; 4000d8d0: e6 06 20 10 ld [ %i0 + 0x10 ], %l3 <== NOT EXECUTED Heap_Block *next_next_block; uint32_t old_block_size; uint32_t old_user_size; uint32_t prev_used_flag; Heap_Statistics *const stats = &the_heap->stats; uint32_t const min_block_size = the_heap->min_block_size; 4000d8d4: ea 06 20 14 ld [ %i0 + 0x14 ], %l5 <== NOT EXECUTED uint32_t const page_size = the_heap->page_size; *old_mem_size = 0; 4000d8d8: c0 26 c0 00 clr [ %i3 ] <== NOT EXECUTED *avail_mem_size = 0; 4000d8dc: c0 27 00 00 clr [ %i4 ] <== NOT EXECUTED /* The address passed could be greater than the block address plus * HEAP_BLOCK_USER_OFFSET as _Heap_Allocate_aligned() may produce such user * pointers. To get rid of this offset we need to align the address down * to the nearest 'page_size' boundary. */ _Heap_Align_down_uptr ( &addr, the_heap->page_size ); *the_block = (Heap_Block *)(addr - HEAP_BLOCK_USER_OFFSET); 4000d8e0: 90 10 00 19 mov %i1, %o0 <== NOT EXECUTED 4000d8e4: 40 00 22 8b call 40016310 <.urem> <== NOT EXECUTED 4000d8e8: 92 10 00 13 mov %l3, %o1 <== NOT EXECUTED RTEMS_INLINE_ROUTINE boolean _Heap_Is_block_in ( Heap_Control *the_heap, Heap_Block *the_block ) { return _Addresses_Is_in_range( the_block, the_heap->start, the_heap->final ); 4000d8ec: c2 06 20 20 ld [ %i0 + 0x20 ], %g1 <== NOT EXECUTED /* The address passed could be greater than the block address plus * HEAP_BLOCK_USER_OFFSET as _Heap_Allocate_aligned() may produce such user * pointers. To get rid of this offset we need to align the address down * to the nearest 'page_size' boundary. */ _Heap_Align_down_uptr ( &addr, the_heap->page_size ); *the_block = (Heap_Block *)(addr - HEAP_BLOCK_USER_OFFSET); 4000d8f0: 90 26 40 08 sub %i1, %o0, %o0 <== NOT EXECUTED 4000d8f4: a4 02 3f f8 add %o0, -8, %l2 <== NOT EXECUTED _Heap_Start_of_block(the_heap, starting_address, &the_block); _HAssert(_Heap_Is_block_in(the_heap, the_block)); if (!_Heap_Is_block_in(the_heap, the_block)) 4000d8f8: 80 a4 80 01 cmp %l2, %g1 <== NOT EXECUTED 4000d8fc: 0a 80 00 78 bcs 4000dadc <_Heap_Resize_block+0x210> <== NOT EXECUTED 4000d900: c4 06 20 24 ld [ %i0 + 0x24 ], %g2 <== NOT EXECUTED 4000d904: 80 a4 80 02 cmp %l2, %g2 <== NOT EXECUTED 4000d908: 38 80 00 78 bgu,a 4000dae8 <_Heap_Resize_block+0x21c> <== NOT EXECUTED 4000d90c: 84 10 20 02 mov 2, %g2 <== NOT EXECUTED return HEAP_RESIZE_FATAL_ERROR; prev_used_flag = the_block->size & HEAP_PREV_USED; 4000d910: c6 04 a0 04 ld [ %l2 + 4 ], %g3 <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE uint32_t _Heap_Block_size ( Heap_Block *the_block ) { return (the_block->size & ~HEAP_PREV_USED); 4000d914: ae 08 ff fe and %g3, -2, %l7 <== NOT EXECUTED RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( void *base, uint32_t offset ) { return (Heap_Block *) _Addresses_Add_offset( base, offset ); 4000d918: a2 04 80 17 add %l2, %l7, %l1 <== NOT EXECUTED old_block_size = _Heap_Block_size(the_block); next_block = _Heap_Block_at(the_block, old_block_size); _HAssert(_Heap_Is_block_in(the_heap, next_block)); _HAssert(_Heap_Is_prev_used(next_block)); if ( !_Heap_Is_block_in(the_heap, next_block) || 4000d91c: 80 a4 40 01 cmp %l1, %g1 <== NOT EXECUTED 4000d920: 2a 80 00 72 bcs,a 4000dae8 <_Heap_Resize_block+0x21c> <== NOT EXECUTED 4000d924: 84 10 20 02 mov 2, %g2 <== NOT EXECUTED 4000d928: 80 a4 40 02 cmp %l1, %g2 <== NOT EXECUTED 4000d92c: 38 80 00 6f bgu,a 4000dae8 <_Heap_Resize_block+0x21c> <== NOT EXECUTED 4000d930: 84 10 20 02 mov 2, %g2 <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE boolean _Heap_Is_prev_used ( Heap_Block *the_block ) { return (the_block->size & HEAP_PREV_USED); 4000d934: c2 04 60 04 ld [ %l1 + 4 ], %g1 <== NOT EXECUTED 4000d938: 80 88 60 01 btst 1, %g1 <== NOT EXECUTED 4000d93c: 02 80 00 68 be 4000dadc <_Heap_Resize_block+0x210> <== NOT EXECUTED 4000d940: a8 08 7f fe and %g1, -2, %l4 <== NOT EXECUTED !_Heap_Is_prev_used(next_block)) return HEAP_RESIZE_FATAL_ERROR; next_block_size = _Heap_Block_size(next_block); next_next_block = _Heap_Block_at(next_block, next_block_size); next_is_used = (next_block == the_heap->final) || 4000d944: 80 a4 40 02 cmp %l1, %g2 <== NOT EXECUTED 4000d948: ac 10 20 01 mov 1, %l6 <== NOT EXECUTED 4000d94c: 02 80 00 04 be 4000d95c <_Heap_Resize_block+0x90> <== NOT EXECUTED 4000d950: ba 04 40 14 add %l1, %l4, %i5 <== NOT EXECUTED 4000d954: c2 07 60 04 ld [ %i5 + 4 ], %g1 <== NOT EXECUTED 4000d958: ac 08 60 01 and %g1, 1, %l6 <== NOT EXECUTED _Heap_Is_prev_used(next_next_block); /* See _Heap_Size_of_user_area() source for explanations */ old_user_size = _Addresses_Subtract(next_block, starting_address) 4000d95c: 82 24 40 19 sub %l1, %i1, %g1 <== NOT EXECUTED 4000d960: 82 00 60 04 add %g1, 4, %g1 <== NOT EXECUTED + HEAP_BLOCK_HEADER_OFFSET; *old_mem_size = old_user_size; 4000d964: c2 26 c0 00 st %g1, [ %i3 ] <== NOT EXECUTED if (size > old_user_size) { 4000d968: 80 a6 80 01 cmp %i2, %g1 <== NOT EXECUTED 4000d96c: 08 80 00 1f bleu 4000d9e8 <_Heap_Resize_block+0x11c> <== NOT EXECUTED 4000d970: b6 08 e0 01 and %g3, 1, %i3 <== NOT EXECUTED /* Need to extend the block: allocate part of the next block and then merge 'the_block' and allocated block together. */ if (next_is_used) /* Next block is in use, -- no way to extend */ 4000d974: 80 a5 a0 00 cmp %l6, 0 <== NOT EXECUTED 4000d978: 12 80 00 5b bne 4000dae4 <_Heap_Resize_block+0x218> <== NOT EXECUTED 4000d97c: a0 26 80 01 sub %i2, %g1, %l0 <== NOT EXECUTED uint32_t alignment ) { uint32_t v = *value; uint32_t a = alignment; uint32_t r = v % a; 4000d980: 92 10 00 13 mov %l3, %o1 <== NOT EXECUTED 4000d984: 40 00 22 63 call 40016310 <.urem> <== NOT EXECUTED 4000d988: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED *value = r ? v - r + a : v; 4000d98c: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 4000d990: 02 80 00 05 be 4000d9a4 <_Heap_Resize_block+0xd8> <== NOT EXECUTED 4000d994: 80 a4 00 15 cmp %l0, %l5 <== NOT EXECUTED 4000d998: 82 04 00 13 add %l0, %l3, %g1 <== NOT EXECUTED 4000d99c: a0 20 40 08 sub %g1, %o0, %l0 <== NOT EXECUTED 4000d9a0: 80 a4 00 15 cmp %l0, %l5 <== NOT EXECUTED 4000d9a4: 1a 80 00 03 bcc 4000d9b0 <_Heap_Resize_block+0xe4> <== NOT EXECUTED 4000d9a8: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 4000d9ac: 90 10 00 15 mov %l5, %o0 <== NOT EXECUTED else { uint32_t add_block_size = size - old_user_size; _Heap_Align_up(&add_block_size, page_size); if (add_block_size < min_block_size) add_block_size = min_block_size; if (add_block_size > next_block_size) 4000d9b0: 80 a2 00 14 cmp %o0, %l4 <== NOT EXECUTED 4000d9b4: 38 80 00 4d bgu,a 4000dae8 <_Heap_Resize_block+0x21c> <== NOT EXECUTED 4000d9b8: 84 10 20 01 mov 1, %g2 <== NOT EXECUTED return HEAP_RESIZE_UNSATISFIED; /* Next block is too small or none. */ add_block_size = 4000d9bc: 94 10 00 08 mov %o0, %o2 <== NOT EXECUTED 4000d9c0: 92 10 00 11 mov %l1, %o1 <== NOT EXECUTED 4000d9c4: 7f ff e9 31 call 40007e88 <_Heap_Block_allocate> <== NOT EXECUTED 4000d9c8: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED _Heap_Block_allocate(the_heap, next_block, add_block_size); /* Merge two subsequent blocks */ the_block->size = (old_block_size + add_block_size) | prev_used_flag; 4000d9cc: 90 02 00 17 add %o0, %l7, %o0 <== NOT EXECUTED 4000d9d0: 90 12 00 1b or %o0, %i3, %o0 <== NOT EXECUTED 4000d9d4: d0 24 a0 04 st %o0, [ %l2 + 4 ] <== NOT EXECUTED --stats->used_blocks; 4000d9d8: c2 06 20 40 ld [ %i0 + 0x40 ], %g1 <== NOT EXECUTED 4000d9dc: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 4000d9e0: 10 80 00 3a b 4000dac8 <_Heap_Resize_block+0x1fc> <== NOT EXECUTED 4000d9e4: c2 26 20 40 st %g1, [ %i0 + 0x40 ] <== NOT EXECUTED } } else { /* Calculate how much memory we could free */ uint32_t free_block_size = old_user_size - size; 4000d9e8: a0 20 40 1a sub %g1, %i2, %l0 <== NOT EXECUTED uint32_t *value, uint32_t alignment ) { uint32_t v = *value; *value = v - (v % alignment); 4000d9ec: 92 10 00 13 mov %l3, %o1 <== NOT EXECUTED 4000d9f0: 40 00 22 48 call 40016310 <.urem> <== NOT EXECUTED 4000d9f4: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED _Heap_Align_down(&free_block_size, page_size); if (free_block_size > 0) { 4000d9f8: a0 a4 00 08 subcc %l0, %o0, %l0 <== NOT EXECUTED 4000d9fc: 22 80 00 34 be,a 4000dacc <_Heap_Resize_block+0x200> <== NOT EXECUTED 4000da00: c2 06 20 54 ld [ %i0 + 0x54 ], %g1 <== NOT EXECUTED /* To free some memory the block should be shortened so that it can can hold 'size' user bytes and still remain not shorter than 'min_block_size'. */ uint32_t new_block_size = old_block_size - free_block_size; 4000da04: 84 25 c0 10 sub %l7, %l0, %g2 <== NOT EXECUTED if (new_block_size < min_block_size) { 4000da08: 80 a0 80 15 cmp %g2, %l5 <== NOT EXECUTED 4000da0c: 1a 80 00 08 bcc 4000da2c <_Heap_Resize_block+0x160> <== NOT EXECUTED 4000da10: 80 a5 a0 00 cmp %l6, 0 <== NOT EXECUTED uint32_t delta = min_block_size - new_block_size; 4000da14: 82 25 40 02 sub %l5, %g2, %g1 <== NOT EXECUTED _HAssert(free_block_size >= delta); free_block_size -= delta; if (free_block_size == 0) { 4000da18: a0 a4 00 01 subcc %l0, %g1, %l0 <== NOT EXECUTED 4000da1c: 22 80 00 2c be,a 4000dacc <_Heap_Resize_block+0x200> <== NOT EXECUTED 4000da20: c2 06 20 54 ld [ %i0 + 0x54 ], %g1 <== NOT EXECUTED ++stats->resizes; return HEAP_RESIZE_SUCCESSFUL; } new_block_size += delta; 4000da24: 84 00 80 01 add %g2, %g1, %g2 <== NOT EXECUTED _HAssert(new_block_size >= min_block_size); _HAssert(new_block_size + free_block_size == old_block_size); _HAssert(_Heap_Is_aligned(new_block_size, page_size)); _HAssert(_Heap_Is_aligned(free_block_size, page_size)); if (!next_is_used) { 4000da28: 80 a5 a0 00 cmp %l6, 0 <== NOT EXECUTED 4000da2c: 12 80 00 15 bne 4000da80 <_Heap_Resize_block+0x1b4> <== NOT EXECUTED 4000da30: 80 a4 00 15 cmp %l0, %l5 <== NOT EXECUTED Heap_Block *const new_next_block = _Heap_Block_at(the_block, new_block_size); uint32_t const new_next_block_size = next_block_size + free_block_size; _HAssert(_Heap_Is_block_in(the_heap, next_next_block)); the_block->size = new_block_size | prev_used_flag; 4000da34: 82 10 80 1b or %g2, %i3, %g1 <== NOT EXECUTED if (!next_is_used) { /* Extend the next block to the low addresses by 'free_block_size' */ Heap_Block *const new_next_block = _Heap_Block_at(the_block, new_block_size); uint32_t const new_next_block_size = next_block_size + free_block_size; 4000da38: 86 04 00 14 add %l0, %l4, %g3 <== NOT EXECUTED _HAssert(_Heap_Is_block_in(the_heap, next_next_block)); the_block->size = new_block_size | prev_used_flag; 4000da3c: c2 24 a0 04 st %g1, [ %l2 + 4 ] <== NOT EXECUTED new_next_block->size = new_next_block_size | HEAP_PREV_USED; 4000da40: 82 10 e0 01 or %g3, 1, %g1 <== NOT EXECUTED RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( void *base, uint32_t offset ) { return (Heap_Block *) _Addresses_Add_offset( base, offset ); 4000da44: 84 04 80 02 add %l2, %g2, %g2 <== NOT EXECUTED next_next_block->prev_size = new_next_block_size; 4000da48: c6 27 40 00 st %g3, [ %i5 ] <== NOT EXECUTED Heap_Block *new_block ) { Heap_Block *block = old_block; Heap_Block *next = block->next; Heap_Block *prev = block->prev; 4000da4c: da 04 60 0c ld [ %l1 + 0xc ], %o5 <== NOT EXECUTED Heap_Block *old_block, Heap_Block *new_block ) { Heap_Block *block = old_block; Heap_Block *next = block->next; 4000da50: c8 04 60 08 ld [ %l1 + 8 ], %g4 <== NOT EXECUTED _Heap_Block_at(the_block, new_block_size); uint32_t const new_next_block_size = next_block_size + free_block_size; _HAssert(_Heap_Is_block_in(the_heap, next_next_block)); the_block->size = new_block_size | prev_used_flag; new_next_block->size = new_next_block_size | HEAP_PREV_USED; 4000da54: c2 20 a0 04 st %g1, [ %g2 + 4 ] <== NOT EXECUTED next_next_block->prev_size = new_next_block_size; _Heap_Block_replace(next_block, new_next_block); the_heap->stats.free_size += free_block_size; 4000da58: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 <== NOT EXECUTED Heap_Block *prev = block->prev; block = new_block; block->next = next; 4000da5c: c8 20 a0 08 st %g4, [ %g2 + 8 ] <== NOT EXECUTED 4000da60: 82 00 40 10 add %g1, %l0, %g1 <== NOT EXECUTED block->prev = prev; 4000da64: da 20 a0 0c st %o5, [ %g2 + 0xc ] <== NOT EXECUTED 4000da68: c2 26 20 30 st %g1, [ %i0 + 0x30 ] <== NOT EXECUTED *avail_mem_size = new_next_block_size - HEAP_BLOCK_USED_OVERHEAD; 4000da6c: 86 00 ff fc add %g3, -4, %g3 <== NOT EXECUTED next->prev = prev->next = block; 4000da70: c4 21 20 0c st %g2, [ %g4 + 0xc ] <== NOT EXECUTED 4000da74: c4 23 60 08 st %g2, [ %o5 + 8 ] <== NOT EXECUTED 4000da78: 10 80 00 14 b 4000dac8 <_Heap_Resize_block+0x1fc> <== NOT EXECUTED 4000da7c: c6 27 00 00 st %g3, [ %i4 ] <== NOT EXECUTED } else if (free_block_size >= min_block_size) { 4000da80: 2a 80 00 13 bcs,a 4000dacc <_Heap_Resize_block+0x200> <== NOT EXECUTED 4000da84: c2 06 20 54 ld [ %i0 + 0x54 ], %g1 <== NOT EXECUTED /* Split the block into 2 used parts, then free the second one. */ the_block->size = new_block_size | prev_used_flag; 4000da88: 82 10 80 1b or %g2, %i3, %g1 <== NOT EXECUTED 4000da8c: c2 24 a0 04 st %g1, [ %l2 + 4 ] <== NOT EXECUTED next_block = _Heap_Block_at(the_block, new_block_size); next_block->size = free_block_size | HEAP_PREV_USED; 4000da90: 82 14 20 01 or %l0, 1, %g1 <== NOT EXECUTED RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( void *base, uint32_t offset ) { return (Heap_Block *) _Addresses_Add_offset( base, offset ); 4000da94: 92 04 80 02 add %l2, %g2, %o1 <== NOT EXECUTED 4000da98: c2 22 60 04 st %g1, [ %o1 + 4 ] <== NOT EXECUTED ++stats->used_blocks; /* We have created used block */ 4000da9c: c2 06 20 40 ld [ %i0 + 0x40 ], %g1 <== NOT EXECUTED --stats->frees; /* Don't count next call in stats */ 4000daa0: c4 06 20 50 ld [ %i0 + 0x50 ], %g2 <== NOT EXECUTED } else if (free_block_size >= min_block_size) { /* Split the block into 2 used parts, then free the second one. */ the_block->size = new_block_size | prev_used_flag; next_block = _Heap_Block_at(the_block, new_block_size); next_block->size = free_block_size | HEAP_PREV_USED; ++stats->used_blocks; /* We have created used block */ 4000daa4: 82 00 60 01 inc %g1 <== NOT EXECUTED --stats->frees; /* Don't count next call in stats */ 4000daa8: 84 00 bf ff add %g2, -1, %g2 <== NOT EXECUTED } else if (free_block_size >= min_block_size) { /* Split the block into 2 used parts, then free the second one. */ the_block->size = new_block_size | prev_used_flag; next_block = _Heap_Block_at(the_block, new_block_size); next_block->size = free_block_size | HEAP_PREV_USED; ++stats->used_blocks; /* We have created used block */ 4000daac: c2 26 20 40 st %g1, [ %i0 + 0x40 ] <== NOT EXECUTED --stats->frees; /* Don't count next call in stats */ 4000dab0: c4 26 20 50 st %g2, [ %i0 + 0x50 ] <== NOT EXECUTED _Heap_Free(the_heap, _Heap_User_area(next_block)); 4000dab4: 92 02 60 08 add %o1, 8, %o1 <== NOT EXECUTED 4000dab8: 7f ff e8 64 call 40007c48 <_Heap_Free> <== NOT EXECUTED 4000dabc: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED *avail_mem_size = free_block_size - HEAP_BLOCK_USED_OVERHEAD; 4000dac0: 82 04 3f fc add %l0, -4, %g1 <== NOT EXECUTED 4000dac4: c2 27 00 00 st %g1, [ %i4 ] <== NOT EXECUTED } } } ++stats->resizes; 4000dac8: c2 06 20 54 ld [ %i0 + 0x54 ], %g1 <== NOT EXECUTED 4000dacc: 84 10 20 00 clr %g2 <== NOT EXECUTED 4000dad0: 82 00 60 01 inc %g1 <== NOT EXECUTED 4000dad4: 10 80 00 05 b 4000dae8 <_Heap_Resize_block+0x21c> <== NOT EXECUTED 4000dad8: c2 26 20 54 st %g1, [ %i0 + 0x54 ] <== NOT EXECUTED return HEAP_RESIZE_SUCCESSFUL; 4000dadc: 10 80 00 03 b 4000dae8 <_Heap_Resize_block+0x21c> <== NOT EXECUTED 4000dae0: 84 10 20 02 mov 2, %g2 <== NOT EXECUTED 4000dae4: 84 10 20 01 mov 1, %g2 <== NOT EXECUTED } 4000dae8: 81 c7 e0 08 ret <== NOT EXECUTED 4000daec: 91 e8 00 02 restore %g0, %g2, %o0 <== NOT EXECUTED 4000daf0 <_Heap_Size_of_user_area>: boolean _Heap_Size_of_user_area( Heap_Control *the_heap, void *starting_address, size_t *size ) { 4000daf0: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED Heap_Block *the_block; Heap_Block *next_block; uint32_t the_size; if ( !_Addresses_Is_in_range( 4000daf4: e2 06 20 20 ld [ %i0 + 0x20 ], %l1 <== NOT EXECUTED 4000daf8: 80 a6 40 11 cmp %i1, %l1 <== NOT EXECUTED 4000dafc: 0a 80 00 1f bcs 4000db78 <_Heap_Size_of_user_area+0x88> <== NOT EXECUTED 4000db00: e0 06 20 24 ld [ %i0 + 0x24 ], %l0 <== NOT EXECUTED 4000db04: 80 a6 40 10 cmp %i1, %l0 <== NOT EXECUTED 4000db08: 18 80 00 1c bgu 4000db78 <_Heap_Size_of_user_area+0x88> <== NOT EXECUTED 4000db0c: 01 00 00 00 nop <== NOT EXECUTED /* The address passed could be greater than the block address plus * HEAP_BLOCK_USER_OFFSET as _Heap_Allocate_aligned() may produce such user * pointers. To get rid of this offset we need to align the address down * to the nearest 'page_size' boundary. */ _Heap_Align_down_uptr ( &addr, the_heap->page_size ); *the_block = (Heap_Block *)(addr - HEAP_BLOCK_USER_OFFSET); 4000db10: d2 06 20 10 ld [ %i0 + 0x10 ], %o1 <== NOT EXECUTED 4000db14: 40 00 21 ff call 40016310 <.urem> <== NOT EXECUTED 4000db18: 90 10 00 19 mov %i1, %o0 <== NOT EXECUTED 4000db1c: 90 26 40 08 sub %i1, %o0, %o0 <== NOT EXECUTED 4000db20: 90 02 3f f8 add %o0, -8, %o0 <== NOT EXECUTED return( FALSE ); _Heap_Start_of_block( the_heap, starting_address, &the_block ); _HAssert(_Heap_Is_block_in( the_heap, the_block )); if ( !_Heap_Is_block_in( the_heap, the_block ) ) 4000db24: 80 a2 00 11 cmp %o0, %l1 <== NOT EXECUTED 4000db28: 0a 80 00 14 bcs 4000db78 <_Heap_Size_of_user_area+0x88> <== NOT EXECUTED 4000db2c: 80 a2 00 10 cmp %o0, %l0 <== NOT EXECUTED 4000db30: 18 80 00 12 bgu 4000db78 <_Heap_Size_of_user_area+0x88> <== NOT EXECUTED 4000db34: 01 00 00 00 nop <== NOT EXECUTED RTEMS_INLINE_ROUTINE Heap_Block *_Heap_Block_at( void *base, uint32_t offset ) { return (Heap_Block *) _Addresses_Add_offset( base, offset ); 4000db38: c2 02 20 04 ld [ %o0 + 4 ], %g1 <== NOT EXECUTED 4000db3c: 82 08 7f fe and %g1, -2, %g1 <== NOT EXECUTED 4000db40: 90 02 00 01 add %o0, %g1, %o0 <== NOT EXECUTED the_size = _Heap_Block_size( the_block ); next_block = _Heap_Block_at( the_block, the_size ); _HAssert(_Heap_Is_block_in( the_heap, next_block )); _HAssert(_Heap_Is_prev_used( next_block )); if ( 4000db44: 80 a2 00 11 cmp %o0, %l1 <== NOT EXECUTED 4000db48: 0a 80 00 0c bcs 4000db78 <_Heap_Size_of_user_area+0x88> <== NOT EXECUTED 4000db4c: 80 a2 00 10 cmp %o0, %l0 <== NOT EXECUTED 4000db50: 18 80 00 0a bgu 4000db78 <_Heap_Size_of_user_area+0x88> <== NOT EXECUTED 4000db54: 01 00 00 00 nop <== NOT EXECUTED 4000db58: c2 02 20 04 ld [ %o0 + 4 ], %g1 <== NOT EXECUTED 4000db5c: 80 88 60 01 btst 1, %g1 <== NOT EXECUTED 4000db60: 02 80 00 06 be 4000db78 <_Heap_Size_of_user_area+0x88> <== NOT EXECUTED 4000db64: 82 22 00 19 sub %o0, %i1, %g1 <== NOT EXECUTED and then add correction equal to the offset of the 'size' field of the 'Heap_Block' structure. The correction is due to the fact that 'prev_size' field of the next block is actually used as user accessible area of 'the_block'. */ *size = _Addresses_Subtract ( next_block, starting_address ) 4000db68: 82 00 60 04 add %g1, 4, %g1 <== NOT EXECUTED 4000db6c: c2 26 80 00 st %g1, [ %i2 ] <== NOT EXECUTED 4000db70: 81 c7 e0 08 ret <== NOT EXECUTED 4000db74: 91 e8 20 01 restore %g0, 1, %o0 <== NOT EXECUTED + HEAP_BLOCK_HEADER_OFFSET; return( TRUE ); } 4000db78: 81 c7 e0 08 ret <== NOT EXECUTED 4000db7c: 91 e8 20 00 restore %g0, 0, %o0 <== NOT EXECUTED 4000741c <_IO_Manager_initialization>: void _IO_Manager_initialization( rtems_driver_address_table *driver_table, uint32_t drivers_in_table, uint32_t number_of_drivers ) { 4000741c: 9d e3 bf 98 save %sp, -104, %sp 40007420: 23 10 00 6e sethi %hi(0x4001b800), %l1 /* * 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 ) 40007424: 80 a6 80 19 cmp %i2, %i1 40007428: 18 80 00 06 bgu 40007440 <_IO_Manager_initialization+0x24> 4000742c: 25 10 00 6e sethi %hi(0x4001b800), %l2 * 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; 40007430: f0 24 60 08 st %i0, [ %l1 + 8 ] _IO_Number_of_drivers = number_of_drivers; 40007434: f2 24 a0 04 st %i1, [ %l2 + 4 ] 40007438: 81 c7 e0 08 ret 4000743c: 81 e8 00 00 restore /* * 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 *) 40007440: 83 2e a0 03 sll %i2, 3, %g1 <== NOT EXECUTED 40007444: a1 2e a0 05 sll %i2, 5, %l0 <== NOT EXECUTED 40007448: a0 24 00 01 sub %l0, %g1, %l0 <== NOT EXECUTED 4000744c: 40 00 0e f0 call 4000b00c <_Workspace_Allocate_or_fatal_error> <== NOT EXECUTED 40007450: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED _Workspace_Allocate_or_fatal_error( sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); _IO_Number_of_drivers = number_of_drivers; memset( 40007454: 94 10 00 10 mov %l0, %o2 <== NOT EXECUTED _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; 40007458: f4 24 a0 04 st %i2, [ %l2 + 4 ] <== NOT EXECUTED /* * 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 *) 4000745c: d0 24 60 08 st %o0, [ %l1 + 8 ] <== NOT EXECUTED _Workspace_Allocate_or_fatal_error( sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); _IO_Number_of_drivers = number_of_drivers; memset( 40007460: 40 00 20 d9 call 4000f7c4 <== NOT EXECUTED 40007464: 92 10 20 00 clr %o1 <== NOT EXECUTED _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]; 40007468: e2 04 60 08 ld [ %l1 + 8 ], %l1 <== NOT EXECUTED 4000746c: b4 10 20 00 clr %i2 <== NOT EXECUTED 40007470: 10 80 00 07 b 4000748c <_IO_Manager_initialization+0x70> <== NOT EXECUTED 40007474: a0 10 20 00 clr %l0 <== NOT EXECUTED 40007478: 92 04 00 18 add %l0, %i0, %o1 <== NOT EXECUTED memset( _IO_Driver_address_table, 0, sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); for ( index = 0 ; index < drivers_in_table ; index++ ) 4000747c: b4 06 a0 01 inc %i2 <== NOT EXECUTED 40007480: a0 04 20 18 add %l0, 0x18, %l0 <== NOT EXECUTED _IO_Driver_address_table[index] = driver_table[index]; 40007484: 40 00 20 a3 call 4000f710 <== NOT EXECUTED 40007488: 94 10 20 18 mov 0x18, %o2 <== NOT EXECUTED memset( _IO_Driver_address_table, 0, sizeof( rtems_driver_address_table ) * ( number_of_drivers ) ); for ( index = 0 ; index < drivers_in_table ; index++ ) 4000748c: 80 a6 80 19 cmp %i2, %i1 <== NOT EXECUTED 40007490: 12 bf ff fa bne 40007478 <_IO_Manager_initialization+0x5c> <== NOT EXECUTED 40007494: 90 04 00 11 add %l0, %l1, %o0 <== NOT EXECUTED 40007498: 81 c7 e0 08 ret <== NOT EXECUTED 4000749c: 81 e8 00 00 restore <== NOT EXECUTED 40008098 <_ISR_Handler_initialization>: * * Output parameters: NONE */ void _ISR_Handler_initialization( void ) { 40008098: 9d e3 bf 98 save %sp, -104, %sp _ISR_Signals_to_thread_executing = FALSE; 4000809c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 400080a0: c0 20 63 58 clr [ %g1 + 0x358 ] ! 4001af58 <_ISR_Signals_to_thread_executing> _ISR_Nest_level = 0; 400080a4: 03 10 00 6b sethi %hi(0x4001ac00), %g1 _ISR_Vector_table = _Workspace_Allocate_or_fatal_error( 400080a8: 90 10 24 00 mov 0x400, %o0 void _ISR_Handler_initialization( void ) { _ISR_Signals_to_thread_executing = FALSE; _ISR_Nest_level = 0; 400080ac: c0 20 62 94 clr [ %g1 + 0x294 ] _ISR_Vector_table = _Workspace_Allocate_or_fatal_error( 400080b0: 40 00 0b d7 call 4000b00c <_Workspace_Allocate_or_fatal_error> 400080b4: 01 00 00 00 nop _CPU_Initialize_vectors(); #if ( CPU_ALLOCATE_INTERRUPT_STACK == TRUE ) if ( _CPU_Table.interrupt_stack_size < STACK_MINIMUM_SIZE ) 400080b8: 03 10 00 6b sethi %hi(0x4001ac00), %g1 400080bc: a0 10 61 e4 or %g1, 0x1e4, %l0 ! 4001ade4 <_CPU_Table> 400080c0: c4 04 20 18 ld [ %l0 + 0x18 ], %g2 { _ISR_Signals_to_thread_executing = FALSE; _ISR_Nest_level = 0; _ISR_Vector_table = _Workspace_Allocate_or_fatal_error( 400080c4: 03 10 00 6b sethi %hi(0x4001ac00), %g1 _CPU_Initialize_vectors(); #if ( CPU_ALLOCATE_INTERRUPT_STACK == TRUE ) if ( _CPU_Table.interrupt_stack_size < STACK_MINIMUM_SIZE ) 400080c8: 80 a0 af ff cmp %g2, 0xfff 400080cc: 18 80 00 06 bgu 400080e4 <_ISR_Handler_initialization+0x4c> 400080d0: d0 20 62 74 st %o0, [ %g1 + 0x274 ] _Internal_error_Occurred( 400080d4: 90 10 20 00 clr %o0 <== NOT EXECUTED 400080d8: 92 10 20 01 mov 1, %o1 <== NOT EXECUTED 400080dc: 7f ff ff df call 40008058 <_Internal_error_Occurred> <== NOT EXECUTED 400080e0: 94 10 20 05 mov 5, %o2 <== NOT EXECUTED INTERNAL_ERROR_CORE, TRUE, INTERNAL_ERROR_INTERRUPT_STACK_TOO_SMALL ); _CPU_Interrupt_stack_low = 400080e4: 40 00 0b ca call 4000b00c <_Workspace_Allocate_or_fatal_error> 400080e8: d0 04 20 18 ld [ %l0 + 0x18 ], %o0 _Workspace_Allocate_or_fatal_error( _CPU_Table.interrupt_stack_size ); _CPU_Interrupt_stack_high = _Addresses_Add_offset( 400080ec: c4 04 20 18 ld [ %l0 + 0x18 ], %g2 INTERNAL_ERROR_CORE, TRUE, INTERNAL_ERROR_INTERRUPT_STACK_TOO_SMALL ); _CPU_Interrupt_stack_low = 400080f0: 03 10 00 6b sethi %hi(0x4001ac00), %g1 _Workspace_Allocate_or_fatal_error( _CPU_Table.interrupt_stack_size ); _CPU_Interrupt_stack_high = _Addresses_Add_offset( 400080f4: 84 02 00 02 add %o0, %g2, %g2 INTERNAL_ERROR_CORE, TRUE, INTERNAL_ERROR_INTERRUPT_STACK_TOO_SMALL ); _CPU_Interrupt_stack_low = 400080f8: d0 20 61 e0 st %o0, [ %g1 + 0x1e0 ] _Workspace_Allocate_or_fatal_error( _CPU_Table.interrupt_stack_size ); _CPU_Interrupt_stack_high = _Addresses_Add_offset( 400080fc: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40008100: c4 20 61 2c st %g2, [ %g1 + 0x12c ] ! 4001ad2c <_CPU_Interrupt_stack_high> #if ( CPU_HAS_HARDWARE_INTERRUPT_STACK == TRUE ) _CPU_Install_interrupt_stack(); #endif } 40008104: 81 c7 e0 08 ret 40008108: 81 e8 00 00 restore 40017444 <_Objects_Copy_name_raw>: const size_t length ) { uint32_t *source_p = (uint32_t *) source; uint32_t *destination_p = (uint32_t *) destination; size_t tmp_length = length / OBJECTS_NAME_ALIGNMENT; 40017444: 10 80 00 05 b 40017458 <_Objects_Copy_name_raw+0x14> <== NOT EXECUTED 40017448: 95 32 a0 02 srl %o2, 2, %o2 <== NOT EXECUTED while ( tmp_length-- ) *destination_p++ = *source_p++; 4001744c: 90 02 20 04 add %o0, 4, %o0 <== NOT EXECUTED 40017450: c2 22 40 00 st %g1, [ %o1 ] <== NOT EXECUTED 40017454: 92 02 60 04 add %o1, 4, %o1 <== NOT EXECUTED { uint32_t *source_p = (uint32_t *) source; uint32_t *destination_p = (uint32_t *) destination; size_t tmp_length = length / OBJECTS_NAME_ALIGNMENT; while ( tmp_length-- ) 40017458: 94 02 bf ff add %o2, -1, %o2 <== NOT EXECUTED 4001745c: 80 a2 bf ff cmp %o2, -1 <== NOT EXECUTED 40017460: 32 bf ff fb bne,a 4001744c <_Objects_Copy_name_raw+0x8> <== NOT EXECUTED 40017464: c2 02 00 00 ld [ %o0 ], %g1 <== NOT EXECUTED *destination_p++ = *source_p++; } 40017468: 81 c3 e0 08 retl <== NOT EXECUTED 4001746c: 01 00 00 00 nop 400081e8 <_Objects_Extend_information>: */ void _Objects_Extend_information( Objects_Information *information ) { 400081e8: 9d e3 bf 88 save %sp, -120, %sp */ RTEMS_INLINE_ROUTINE uint32_t _Objects_Get_index( Objects_Id id ) { return (id >> OBJECTS_INDEX_START_BIT) & OBJECTS_INDEX_VALID_BITS; 400081ec: c4 06 20 08 ld [ %i0 + 8 ], %g2 minimum_index = _Objects_Get_index( information->minimum_id ); index_base = minimum_index; block = 0; if ( information->maximum < minimum_index ) 400081f0: e0 16 20 10 lduh [ %i0 + 0x10 ], %l0 400081f4: 03 00 00 3f sethi %hi(0xfc00), %g1 400081f8: 82 10 63 ff or %g1, 0x3ff, %g1 ! ffff 400081fc: a2 08 80 01 and %g2, %g1, %l1 40008200: 80 a4 00 11 cmp %l0, %l1 40008204: 3a 80 00 06 bcc,a 4000821c <_Objects_Extend_information+0x34> 40008208: e4 06 20 18 ld [ %i0 + 0x18 ], %l2 4000820c: ac 10 00 11 mov %l1, %l6 40008210: 90 10 20 00 clr %o0 40008214: 10 80 00 12 b 4000825c <_Objects_Extend_information+0x74> 40008218: b8 10 20 00 clr %i4 block_count = 0; else { block_count = information->maximum / information->allocation_size; 4000821c: 90 10 00 10 mov %l0, %o0 40008220: 92 10 00 12 mov %l2, %o1 40008224: 40 00 37 8f call 40016060 <.udiv> 40008228: ac 10 00 11 mov %l1, %l6 4000822c: 10 80 00 09 b 40008250 <_Objects_Extend_information+0x68> 40008230: b8 10 20 00 clr %i4 for ( ; block < block_count; block++ ) { if ( information->object_blocks[ block ] == NULL ) 40008234: c2 06 20 3c ld [ %i0 + 0x3c ], %g1 40008238: c2 00 40 02 ld [ %g1 + %g2 ], %g1 4000823c: 80 a0 60 00 cmp %g1, 0 40008240: 02 80 00 08 be 40008260 <_Objects_Extend_information+0x78> 40008244: 80 a5 80 10 cmp %l6, %l0 break; else index_base += information->allocation_size; 40008248: ac 05 80 12 add %l6, %l2, %l6 if ( information->maximum < minimum_index ) block_count = 0; else { block_count = information->maximum / information->allocation_size; for ( ; block < block_count; block++ ) { 4000824c: b8 07 20 01 inc %i4 40008250: 80 a7 00 08 cmp %i4, %o0 40008254: 12 bf ff f8 bne 40008234 <_Objects_Extend_information+0x4c> 40008258: 85 2f 20 02 sll %i4, 2, %g2 /* * If the index_base is the maximum we need to grow the tables. */ if (index_base >= information->maximum ) { 4000825c: 80 a5 80 10 cmp %l6, %l0 40008260: 2a 80 00 63 bcs,a 400083ec <_Objects_Extend_information+0x204> 40008264: c2 06 20 14 ld [ %i0 + 0x14 ], %g1 * Up the block count and maximum */ block_count++; maximum = information->maximum + information->allocation_size; 40008268: c2 06 20 18 ld [ %i0 + 0x18 ], %g1 /* * Allocate the tables and break it up. */ if ( information->auto_extend ) { 4000826c: c4 06 20 14 ld [ %i0 + 0x14 ], %g2 * Up the block count and maximum */ block_count++; maximum = information->maximum + information->allocation_size; 40008270: ae 04 00 01 add %l0, %g1, %l7 /* * Allocate the tables and break it up. */ if ( information->auto_extend ) { 40008274: 80 a0 a0 00 cmp %g2, 0 /* * Up the block count and maximum */ block_count++; 40008278: a0 02 20 01 add %o0, 1, %l0 4000827c: 82 05 c0 11 add %l7, %l1, %g1 /* * Allocate the tables and break it up. */ if ( information->auto_extend ) { 40008280: 02 80 00 0b be 400082ac <_Objects_Extend_information+0xc4> 40008284: 91 2c 20 01 sll %l0, 1, %o0 object_blocks = (void**) 40008288: 90 02 00 10 add %o0, %l0, %o0 4000828c: 90 00 40 08 add %g1, %o0, %o0 40008290: 7f ff ff cf call 400081cc <_Workspace_Allocate> 40008294: 91 2a 20 02 sll %o0, 2, %o0 block_count * (sizeof(void *) + sizeof(uint32_t ) + sizeof(Objects_Name *)) + ((maximum + minimum_index) * sizeof(Objects_Control *)) ); if ( !object_blocks ) 40008298: a4 92 20 00 orcc %o0, 0, %l2 4000829c: 32 80 00 0a bne,a 400082c4 <_Objects_Extend_information+0xdc> 400082a0: c2 16 20 10 lduh [ %i0 + 0x10 ], %g1 400082a4: 81 c7 e0 08 ret <== NOT EXECUTED 400082a8: 81 e8 00 00 restore <== NOT EXECUTED return; } else { object_blocks = (void**) 400082ac: 90 02 00 10 add %o0, %l0, %o0 400082b0: 90 00 40 08 add %g1, %o0, %o0 400082b4: 40 00 0b 56 call 4000b00c <_Workspace_Allocate_or_fatal_error> 400082b8: 91 2a 20 02 sll %o0, 2, %o0 400082bc: a4 10 00 08 mov %o0, %l2 * in the copies. */ block_count--; if ( information->maximum > minimum_index ) { 400082c0: c2 16 20 10 lduh [ %i0 + 0x10 ], %g1 /* * Take the block count down. Saves all the (block_count - 1) * in the copies. */ block_count--; 400082c4: ba 04 3f ff add %l0, -1, %i5 if ( information->maximum > minimum_index ) { 400082c8: 80 a0 40 11 cmp %g1, %l1 400082cc: 84 10 20 00 clr %g2 400082d0: 83 2c 20 02 sll %l0, 2, %g1 /* * Break the block into the various sections. * */ inactive_per_block = (uint32_t *) _Addresses_Add_offset( 400082d4: a8 04 80 01 add %l2, %g1, %l4 object_blocks, block_count * sizeof(void*) ); name_table = (Objects_Name *) _Addresses_Add_offset( 400082d8: aa 05 00 01 add %l4, %g1, %l5 * in the copies. */ block_count--; if ( information->maximum > minimum_index ) { 400082dc: 08 80 00 19 bleu 40008340 <_Objects_Extend_information+0x158> 400082e0: a6 05 40 01 add %l5, %g1, %l3 /* * 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, 400082e4: d2 06 20 3c ld [ %i0 + 0x3c ], %o1 400082e8: a1 2f 60 02 sll %i5, 2, %l0 400082ec: 90 10 00 12 mov %l2, %o0 400082f0: 40 00 1d 08 call 4000f710 400082f4: 94 10 00 10 mov %l0, %o2 information->object_blocks, block_count * sizeof(void*) ); memcpy( inactive_per_block, 400082f8: d2 06 20 38 ld [ %i0 + 0x38 ], %o1 400082fc: 94 10 00 10 mov %l0, %o2 40008300: 40 00 1d 04 call 4000f710 40008304: 90 10 00 14 mov %l4, %o0 information->inactive_per_block, block_count * sizeof(uint32_t ) ); memcpy( name_table, 40008308: d2 06 20 24 ld [ %i0 + 0x24 ], %o1 4000830c: 94 10 00 10 mov %l0, %o2 40008310: 40 00 1d 00 call 4000f710 40008314: 90 10 00 15 mov %l5, %o0 information->name_table, block_count * sizeof(Objects_Name *) ); memcpy( local_table, 40008318: d4 16 20 10 lduh [ %i0 + 0x10 ], %o2 4000831c: d2 06 20 20 ld [ %i0 + 0x20 ], %o1 40008320: 94 02 80 11 add %o2, %l1, %o2 40008324: 90 10 00 13 mov %l3, %o0 40008328: 40 00 1c fa call 4000f710 4000832c: 95 2a a0 02 sll %o2, 2, %o2 /* * Initialise the new entries in the table. */ object_blocks[block_count] = NULL; 40008330: 10 80 00 08 b 40008350 <_Objects_Extend_information+0x168> 40008334: 83 2f 60 02 sll %i5, 2, %g1 else { /* * Deal with the special case of the 0 to minimum_index */ for ( index = 0; index < minimum_index; index++ ) { 40008338: 84 00 a0 01 inc %g2 local_table[ index ] = NULL; 4000833c: c0 20 40 13 clr [ %g1 + %l3 ] else { /* * Deal with the special case of the 0 to minimum_index */ for ( index = 0; index < minimum_index; index++ ) { 40008340: 80 a0 80 11 cmp %g2, %l1 40008344: 32 bf ff fd bne,a 40008338 <_Objects_Extend_information+0x150> 40008348: 83 28 a0 02 sll %g2, 2, %g1 /* * Initialise the new entries in the table. */ object_blocks[block_count] = NULL; 4000834c: 83 2f 60 02 sll %i5, 2, %g1 inactive_per_block[block_count] = 0; 40008350: c0 25 00 01 clr [ %l4 + %g1 ] /* * Initialise the new entries in the table. */ object_blocks[block_count] = NULL; 40008354: c0 24 80 01 clr [ %l2 + %g1 ] inactive_per_block[block_count] = 0; name_table[block_count] = NULL; for ( index=index_base ; index < ( information->allocation_size + index_base ); 40008358: c4 06 20 18 ld [ %i0 + 0x18 ], %g2 * Initialise the new entries in the table. */ object_blocks[block_count] = NULL; inactive_per_block[block_count] = 0; name_table[block_count] = NULL; 4000835c: c0 25 40 01 clr [ %l5 + %g1 ] for ( index=index_base ; index < ( information->allocation_size + index_base ); 40008360: 83 2d a0 02 sll %l6, 2, %g1 40008364: 86 05 80 02 add %l6, %g2, %g3 40008368: 84 04 c0 01 add %l3, %g1, %g2 4000836c: 10 80 00 04 b 4000837c <_Objects_Extend_information+0x194> 40008370: 82 10 00 16 mov %l6, %g1 index++ ) { local_table[ index ] = NULL; 40008374: c0 20 bf fc clr [ %g2 + -4 ] inactive_per_block[block_count] = 0; name_table[block_count] = NULL; for ( index=index_base ; index < ( information->allocation_size + index_base ); index++ ) { 40008378: 82 00 60 01 inc %g1 object_blocks[block_count] = NULL; inactive_per_block[block_count] = 0; name_table[block_count] = NULL; for ( index=index_base ; index < ( information->allocation_size + index_base ); 4000837c: 80 a0 40 03 cmp %g1, %g3 40008380: 0a bf ff fd bcs 40008374 <_Objects_Extend_information+0x18c> 40008384: 84 00 a0 04 add %g2, 4, %g2 index++ ) { local_table[ index ] = NULL; } _ISR_Disable( level ); 40008388: 7f ff e6 d1 call 40001ecc 4000838c: 01 00 00 00 nop 40008390: a0 10 00 08 mov %o0, %l0 information->object_blocks = object_blocks; information->inactive_per_block = inactive_per_block; information->name_table = name_table; information->local_table = local_table; information->maximum = maximum; information->maximum_id = _Objects_Build_id( 40008394: d0 06 00 00 ld [ %i0 ], %o0 40008398: d2 16 20 04 lduh [ %i0 + 4 ], %o1 _ISR_Disable( level ); old_tables = information->object_blocks; information->object_blocks = object_blocks; information->inactive_per_block = inactive_per_block; 4000839c: e8 26 20 38 st %l4, [ %i0 + 0x38 ] information->name_table = name_table; 400083a0: ea 26 20 24 st %l5, [ %i0 + 0x24 ] information->local_table = local_table; 400083a4: e6 26 20 20 st %l3, [ %i0 + 0x20 ] information->maximum = maximum; 400083a8: ee 36 20 10 sth %l7, [ %i0 + 0x10 ] information->maximum_id = _Objects_Build_id( 400083ac: 97 2d e0 10 sll %l7, 0x10, %o3 local_table[ index ] = NULL; } _ISR_Disable( level ); old_tables = information->object_blocks; 400083b0: e2 06 20 3c ld [ %i0 + 0x3c ], %l1 information->object_blocks = object_blocks; information->inactive_per_block = inactive_per_block; information->name_table = name_table; information->local_table = local_table; information->maximum = maximum; information->maximum_id = _Objects_Build_id( 400083b4: 97 32 e0 10 srl %o3, 0x10, %o3 _ISR_Disable( level ); old_tables = information->object_blocks; information->object_blocks = object_blocks; 400083b8: e4 26 20 3c st %l2, [ %i0 + 0x3c ] information->inactive_per_block = inactive_per_block; information->name_table = name_table; information->local_table = local_table; information->maximum = maximum; information->maximum_id = _Objects_Build_id( 400083bc: 7f ff ff 7d call 400081b0 <_Objects_Build_id> 400083c0: 94 10 20 01 mov 1, %o2 400083c4: d0 26 20 0c st %o0, [ %i0 + 0xc ] information->the_class, _Objects_Local_node, information->maximum ); _ISR_Enable( level ); 400083c8: 7f ff e6 c5 call 40001edc 400083cc: 90 10 00 10 mov %l0, %o0 if ( old_tables ) 400083d0: 80 a4 60 00 cmp %l1, 0 400083d4: 02 80 00 05 be 400083e8 <_Objects_Extend_information+0x200> 400083d8: 11 10 00 6b sethi %hi(0x4001ac00), %o0 RTEMS_INLINE_ROUTINE boolean _Workspace_Free( void *block ) { return _Heap_Free( &_Workspace_Area, block ); 400083dc: 92 10 00 11 mov %l1, %o1 400083e0: 7f ff fe 1a call 40007c48 <_Heap_Free> 400083e4: 90 12 22 1c or %o0, 0x21c, %o0 /* * Allocate the name table, and the objects */ if ( information->auto_extend ) { 400083e8: c2 06 20 14 ld [ %i0 + 0x14 ], %g1 400083ec: e2 06 20 3c ld [ %i0 + 0x3c ], %l1 400083f0: 80 a0 60 00 cmp %g1, 0 400083f4: a1 2f 20 02 sll %i4, 2, %l0 400083f8: d0 16 20 44 lduh [ %i0 + 0x44 ], %o0 400083fc: 02 80 00 11 be 40008440 <_Objects_Extend_information+0x258> 40008400: c2 06 20 1c ld [ %i0 + 0x1c ], %g1 information->object_blocks[ block ] = 40008404: d2 06 20 18 ld [ %i0 + 0x18 ], %o1 40008408: 91 2a 20 10 sll %o0, 0x10, %o0 4000840c: 91 32 20 10 srl %o0, 0x10, %o0 40008410: 40 00 36 da call 40015f78 <.umul> 40008414: 90 02 00 01 add %o0, %g1, %o0 40008418: 7f ff ff 6d call 400081cc <_Workspace_Allocate> 4000841c: 01 00 00 00 nop _Workspace_Allocate( (information->allocation_size * information->name_length) + (information->allocation_size * information->size) ); if ( !information->object_blocks[ block ] ) 40008420: c2 06 20 3c ld [ %i0 + 0x3c ], %g1 /* * Allocate the name table, and the objects */ if ( information->auto_extend ) { information->object_blocks[ block ] = 40008424: d0 24 00 11 st %o0, [ %l0 + %l1 ] _Workspace_Allocate( (information->allocation_size * information->name_length) + (information->allocation_size * information->size) ); if ( !information->object_blocks[ block ] ) 40008428: c2 00 40 10 ld [ %g1 + %l0 ], %g1 4000842c: 80 a0 60 00 cmp %g1, 0 40008430: 32 80 00 0d bne,a 40008464 <_Objects_Extend_information+0x27c> 40008434: d2 06 20 18 ld [ %i0 + 0x18 ], %o1 40008438: 81 c7 e0 08 ret <== NOT EXECUTED 4000843c: 81 e8 00 00 restore <== NOT EXECUTED return; } else { information->object_blocks[ block ] = 40008440: d2 06 20 18 ld [ %i0 + 0x18 ], %o1 40008444: 91 2a 20 10 sll %o0, 0x10, %o0 40008448: 91 32 20 10 srl %o0, 0x10, %o0 4000844c: 40 00 36 cb call 40015f78 <.umul> 40008450: 90 02 00 01 add %o0, %g1, %o0 40008454: 40 00 0a ee call 4000b00c <_Workspace_Allocate_or_fatal_error> 40008458: 01 00 00 00 nop 4000845c: d0 24 00 11 st %o0, [ %l0 + %l1 ] 40008460: d2 06 20 18 ld [ %i0 + 0x18 ], %o1 40008464: d0 06 20 1c ld [ %i0 + 0x1c ], %o0 40008468: 40 00 36 c4 call 40015f78 <.umul> 4000846c: e0 06 20 3c ld [ %i0 + 0x3c ], %l0 (information->allocation_size * information->name_length) + (information->allocation_size * information->size) ); } name_area = (Objects_Name *) _Addresses_Add_offset( 40008470: a7 2f 20 02 sll %i4, 2, %l3 information->object_blocks[ block ], (information->allocation_size * information->size) ); information->name_table[ block ] = name_area; 40008474: c4 06 20 24 ld [ %i0 + 0x24 ], %g2 40008478: c2 04 00 13 ld [ %l0 + %l3 ], %g1 /* * Initialize objects .. add to a local chain first. */ _Chain_Initialize( 4000847c: d4 06 20 18 ld [ %i0 + 0x18 ], %o2 40008480: a2 02 00 01 add %o0, %g1, %l1 40008484: d6 06 20 1c ld [ %i0 + 0x1c ], %o3 name_area = (Objects_Name *) _Addresses_Add_offset( information->object_blocks[ block ], (information->allocation_size * information->size) ); information->name_table[ block ] = name_area; 40008488: e2 20 80 13 st %l1, [ %g2 + %l3 ] /* * Initialize objects .. add to a local chain first. */ _Chain_Initialize( 4000848c: d2 04 00 13 ld [ %l0 + %l3 ], %o1 40008490: 90 07 bf ec add %fp, -20, %o0 40008494: a4 10 00 16 mov %l6, %l2 * Move from the local chain, initialise, then append to the inactive chain */ index = index_base; while ( (the_object = (Objects_Control *) _Chain_Get( &Inactive ) ) != NULL ) { 40008498: aa 10 00 08 mov %o0, %l5 /* * Initialize objects .. add to a local chain first. */ _Chain_Initialize( 4000849c: 40 00 14 b4 call 4000d76c <_Chain_Initialize> 400084a0: a8 06 20 28 add %i0, 0x28, %l4 400084a4: 30 80 00 0c b,a 400084d4 <_Objects_Extend_information+0x2ec> index = index_base; while ( (the_object = (Objects_Control *) _Chain_Get( &Inactive ) ) != NULL ) { the_object->id = _Objects_Build_id( 400084a8: d2 16 20 04 lduh [ %i0 + 4 ], %o1 400084ac: d0 06 00 00 ld [ %i0 ], %o0 400084b0: 7f ff ff 40 call 400081b0 <_Objects_Build_id> 400084b4: a4 04 a0 01 inc %l2 400084b8: c2 16 20 44 lduh [ %i0 + 0x44 ], %g1 400084bc: d0 24 20 08 st %o0, [ %l0 + 8 ] information->the_class, _Objects_Local_node, index ); the_object->name = (void *) name_area; 400084c0: e2 24 20 0c st %l1, [ %l0 + 0xc ] name_area = _Addresses_Add_offset( name_area, information->name_length ); _Chain_Append( &information->Inactive, &the_object->Node ); 400084c4: 92 10 00 10 mov %l0, %o1 400084c8: a2 04 40 01 add %l1, %g1, %l1 400084cc: 7f ff fc 7b call 400076b8 <_Chain_Append> 400084d0: 90 10 00 14 mov %l4, %o0 * Move from the local chain, initialise, then append to the inactive chain */ index = index_base; while ( (the_object = (Objects_Control *) _Chain_Get( &Inactive ) ) != NULL ) { 400084d4: 7f ff fc 85 call 400076e8 <_Chain_Get> 400084d8: 90 10 00 15 mov %l5, %o0 the_object->id = _Objects_Build_id( 400084dc: 96 10 00 12 mov %l2, %o3 * Move from the local chain, initialise, then append to the inactive chain */ index = index_base; while ( (the_object = (Objects_Control *) _Chain_Get( &Inactive ) ) != NULL ) { 400084e0: a0 10 00 08 mov %o0, %l0 400084e4: 80 a2 20 00 cmp %o0, 0 400084e8: 12 bf ff f0 bne 400084a8 <_Objects_Extend_information+0x2c0> 400084ec: 94 10 20 01 mov 1, %o2 _Chain_Append( &information->Inactive, &the_object->Node ); index++; } information->inactive_per_block[ block ] = information->allocation_size; 400084f0: c2 06 20 18 ld [ %i0 + 0x18 ], %g1 400084f4: c4 06 20 38 ld [ %i0 + 0x38 ], %g2 information->inactive += information->allocation_size; 400084f8: c6 16 20 34 lduh [ %i0 + 0x34 ], %g3 _Chain_Append( &information->Inactive, &the_object->Node ); index++; } information->inactive_per_block[ block ] = information->allocation_size; 400084fc: c2 20 80 13 st %g1, [ %g2 + %l3 ] information->inactive += information->allocation_size; 40008500: c2 06 20 18 ld [ %i0 + 0x18 ], %g1 40008504: 82 00 40 03 add %g1, %g3, %g1 40008508: c2 36 20 34 sth %g1, [ %i0 + 0x34 ] 4000850c: 81 c7 e0 08 ret 40008510: 81 e8 00 00 restore 4000a070 <_Objects_Get_name_as_string>: char *_Objects_Get_name_as_string( Objects_Id id, size_t length, char *name ) { 4000a070: 9d e3 bf 88 save %sp, -120, %sp 4000a074: 92 10 00 18 mov %i0, %o1 uint32_t i; char lname[5]; Objects_Control *the_object; Objects_Locations location; if ( length == 0 ) 4000a078: 80 a6 60 00 cmp %i1, 0 4000a07c: 02 80 00 43 be 4000a188 <_Objects_Get_name_as_string+0x118> 4000a080: b0 10 00 1a mov %i2, %i0 return NULL; if ( name == NULL ) 4000a084: 80 a6 a0 00 cmp %i2, 0 4000a088: 02 80 00 3e be 4000a180 <_Objects_Get_name_as_string+0x110> 4000a08c: 85 32 60 16 srl %o1, 0x16, %g2 if ( !_Objects_Is_class_valid( the_class ) ) return NULL; the_api = _Objects_Get_API( id ); return _Objects_Information_table[ the_api ][ the_class ]; 4000a090: 03 10 00 9e sethi %hi(0x40027800), %g1 4000a094: 84 08 a0 1c and %g2, 0x1c, %g2 4000a098: 82 10 61 50 or %g1, 0x150, %g1 4000a09c: c4 00 40 02 ld [ %g1 + %g2 ], %g2 4000a0a0: 83 32 60 1b srl %o1, 0x1b, %g1 4000a0a4: 83 28 60 02 sll %g1, 2, %g1 4000a0a8: e0 00 80 01 ld [ %g2 + %g1 ], %l0 return NULL; information = _Objects_Get_information( id ); if ( !information ) 4000a0ac: 80 a4 20 00 cmp %l0, 0 4000a0b0: 22 80 00 34 be,a 4000a180 <_Objects_Get_name_as_string+0x110> 4000a0b4: b0 10 20 00 clr %i0 <== NOT EXECUTED return NULL; the_object = _Objects_Get( information, id, &location ); 4000a0b8: 90 10 00 10 mov %l0, %o0 4000a0bc: 40 00 00 36 call 4000a194 <_Objects_Get> 4000a0c0: 94 07 bf f4 add %fp, -12, %o2 switch ( location ) { 4000a0c4: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000a0c8: 80 a0 60 00 cmp %g1, 0 4000a0cc: 32 80 00 2d bne,a 4000a180 <_Objects_Get_name_as_string+0x110> 4000a0d0: b0 10 20 00 clr %i0 <== NOT EXECUTED case OBJECTS_ERROR: return NULL; case OBJECTS_LOCAL: if ( information->is_string ) { 4000a0d4: c2 04 20 40 ld [ %l0 + 0x40 ], %g1 4000a0d8: 80 a0 60 00 cmp %g1, 0 4000a0dc: 12 80 00 0b bne 4000a108 <_Objects_Get_name_as_string+0x98> 4000a0e0: d0 02 20 0c ld [ %o0 + 0xc ], %o0 s = the_object->name; } else { uint32_t u32_name = (uint32_t) the_object->name; lname[ 0 ] = (u32_name >> 24) & 0xff; 4000a0e4: 83 32 20 18 srl %o0, 0x18, %g1 4000a0e8: c2 2f bf ef stb %g1, [ %fp + -17 ] lname[ 1 ] = (u32_name >> 16) & 0xff; 4000a0ec: 83 32 20 10 srl %o0, 0x10, %g1 lname[ 2 ] = (u32_name >> 8) & 0xff; lname[ 3 ] = (u32_name >> 0) & 0xff; 4000a0f0: d0 2f bf f2 stb %o0, [ %fp + -14 ] s = the_object->name; } else { uint32_t u32_name = (uint32_t) the_object->name; lname[ 0 ] = (u32_name >> 24) & 0xff; lname[ 1 ] = (u32_name >> 16) & 0xff; 4000a0f4: c2 2f bf f0 stb %g1, [ %fp + -16 ] lname[ 2 ] = (u32_name >> 8) & 0xff; lname[ 3 ] = (u32_name >> 0) & 0xff; lname[ 4 ] = '\0'; 4000a0f8: c0 2f bf f3 clrb [ %fp + -13 ] } else { uint32_t u32_name = (uint32_t) the_object->name; lname[ 0 ] = (u32_name >> 24) & 0xff; lname[ 1 ] = (u32_name >> 16) & 0xff; lname[ 2 ] = (u32_name >> 8) & 0xff; 4000a0fc: 83 32 20 08 srl %o0, 8, %g1 lname[ 3 ] = (u32_name >> 0) & 0xff; lname[ 4 ] = '\0'; 4000a100: 90 07 bf ef add %fp, -17, %o0 } else { uint32_t u32_name = (uint32_t) the_object->name; lname[ 0 ] = (u32_name >> 24) & 0xff; lname[ 1 ] = (u32_name >> 16) & 0xff; lname[ 2 ] = (u32_name >> 8) & 0xff; 4000a104: c2 2f bf f1 stb %g1, [ %fp + -15 ] lname[ 3 ] = (u32_name >> 0) & 0xff; lname[ 4 ] = '\0'; 4000a108: 84 10 00 18 mov %i0, %g2 4000a10c: 88 10 20 01 mov 1, %g4 s = lname; } for ( i=0, d=name ; i<(length-1) && *s ; i++, s++, d++ ) { *d = (!isprint(*s)) ? '*' : *s; 4000a110: 10 80 00 09 b 4000a134 <_Objects_Get_name_as_string+0xc4> 4000a114: 19 10 00 7c sethi %hi(0x4001f000), %o4 4000a118: c2 03 22 20 ld [ %o4 + 0x220 ], %g1 ! 4001f220 <__ctype_ptr> 4000a11c: c2 48 40 03 ldsb [ %g1 + %g3 ], %g1 4000a120: 80 88 60 97 btst 0x97, %g1 4000a124: 22 80 00 02 be,a 4000a12c <_Objects_Get_name_as_string+0xbc> 4000a128: 9a 10 20 2a mov 0x2a, %o5 <== NOT EXECUTED 4000a12c: da 28 80 00 stb %o5, [ %g2 ] lname[ 3 ] = (u32_name >> 0) & 0xff; lname[ 4 ] = '\0'; s = lname; } for ( i=0, d=name ; i<(length-1) && *s ; i++, s++, d++ ) { 4000a130: 84 00 a0 01 inc %g2 4000a134: 80 a1 00 19 cmp %g4, %i1 4000a138: 02 80 00 07 be 4000a154 <_Objects_Get_name_as_string+0xe4> 4000a13c: 82 02 00 04 add %o0, %g4, %g1 4000a140: c6 48 7f ff ldsb [ %g1 + -1 ], %g3 4000a144: 88 01 20 01 inc %g4 4000a148: 80 a0 e0 00 cmp %g3, 0 4000a14c: 12 bf ff f3 bne 4000a118 <_Objects_Get_name_as_string+0xa8> 4000a150: da 08 7f ff ldub [ %g1 + -1 ], %o5 *d = (!isprint(*s)) ? '*' : *s; } *d = '\0'; 4000a154: c0 28 80 00 clrb [ %g2 ] #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 4000a158: 03 10 00 9e sethi %hi(0x40027800), %g1 4000a15c: c4 00 61 f0 ld [ %g1 + 0x1f0 ], %g2 ! 400279f0 <_Thread_Dispatch_disable_level> 4000a160: 84 00 bf ff add %g2, -1, %g2 4000a164: c4 20 61 f0 st %g2, [ %g1 + 0x1f0 ] 4000a168: c2 00 61 f0 ld [ %g1 + 0x1f0 ], %g1 4000a16c: 80 a0 60 00 cmp %g1, 0 4000a170: 12 80 00 07 bne 4000a18c <_Objects_Get_name_as_string+0x11c> 4000a174: 01 00 00 00 nop _Thread_Dispatch(); 4000a178: 40 00 04 bc call 4000b468 <_Thread_Dispatch> 4000a17c: 01 00 00 00 nop 4000a180: 81 c7 e0 08 ret 4000a184: 81 e8 00 00 restore 4000a188: b0 10 20 00 clr %i0 <== NOT EXECUTED _Thread_Enable_dispatch(); return name; } return NULL; /* unreachable path */ } 4000a18c: 81 c7 e0 08 ret <== NOT EXECUTED 4000a190: 81 e8 00 00 restore <== NOT EXECUTED 40017470 <_Objects_Get_next>: Objects_Information *information, Objects_Id id, Objects_Locations *location_p, Objects_Id *next_id_p ) { 40017470: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED Objects_Control *object; Objects_Id next_id; if (_Objects_Get_index(id) == OBJECTS_ID_INITIAL_INDEX) 40017474: 03 00 00 3f sethi %hi(0xfc00), %g1 <== NOT EXECUTED 40017478: 82 10 63 ff or %g1, 0x3ff, %g1 ! ffff <== NOT EXECUTED 4001747c: 80 8e 40 01 btst %i1, %g1 <== NOT EXECUTED 40017480: 22 80 00 02 be,a 40017488 <_Objects_Get_next+0x18> <== NOT EXECUTED 40017484: f2 06 20 08 ld [ %i0 + 8 ], %i1 <== NOT EXECUTED else next_id = id; do { /* walked off end of list? */ if (_Objects_Get_index(next_id) > information->maximum) 40017488: 03 00 00 3f sethi %hi(0xfc00), %g1 <== NOT EXECUTED 4001748c: a0 10 63 ff or %g1, 0x3ff, %l0 ! ffff <== NOT EXECUTED 40017490: c4 16 20 10 lduh [ %i0 + 0x10 ], %g2 <== NOT EXECUTED 40017494: 82 0e 40 10 and %i1, %l0, %g1 <== NOT EXECUTED *location_p = OBJECTS_ERROR; goto final; } /* try to grab one */ object = _Objects_Get(information, next_id, location_p); 40017498: 92 10 00 19 mov %i1, %o1 <== NOT EXECUTED 4001749c: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED else next_id = id; do { /* walked off end of list? */ if (_Objects_Get_index(next_id) > information->maximum) 400174a0: 80 a0 40 02 cmp %g1, %g2 <== NOT EXECUTED 400174a4: 18 80 00 0a bgu 400174cc <_Objects_Get_next+0x5c> <== NOT EXECUTED 400174a8: 94 10 00 1a mov %i2, %o2 <== NOT EXECUTED *location_p = OBJECTS_ERROR; goto final; } /* try to grab one */ object = _Objects_Get(information, next_id, location_p); 400174ac: 7f ff d6 73 call 4000ce78 <_Objects_Get> <== NOT EXECUTED 400174b0: b2 06 60 01 inc %i1 <== NOT EXECUTED next_id++; } while (*location_p != OBJECTS_LOCAL); 400174b4: c2 06 80 00 ld [ %i2 ], %g1 <== NOT EXECUTED 400174b8: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400174bc: 32 bf ff f6 bne,a 40017494 <_Objects_Get_next+0x24> <== NOT EXECUTED 400174c0: c4 16 20 10 lduh [ %i0 + 0x10 ], %g2 <== NOT EXECUTED *next_id_p = next_id; 400174c4: 10 80 00 07 b 400174e0 <_Objects_Get_next+0x70> <== NOT EXECUTED 400174c8: f2 26 c0 00 st %i1, [ %i3 ] <== NOT EXECUTED do { /* walked off end of list? */ if (_Objects_Get_index(next_id) > information->maximum) { *location_p = OBJECTS_ERROR; 400174cc: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED *next_id_p = next_id; return object; final: *next_id_p = OBJECTS_ID_FINAL; 400174d0: 90 10 20 00 clr %o0 <== NOT EXECUTED do { /* walked off end of list? */ if (_Objects_Get_index(next_id) > information->maximum) { *location_p = OBJECTS_ERROR; 400174d4: c2 26 80 00 st %g1, [ %i2 ] <== NOT EXECUTED *next_id_p = next_id; return object; final: *next_id_p = OBJECTS_ID_FINAL; 400174d8: 82 10 3f ff mov -1, %g1 <== NOT EXECUTED 400174dc: c2 26 c0 00 st %g1, [ %i3 ] <== NOT EXECUTED return 0; } 400174e0: 81 c7 e0 08 ret <== NOT EXECUTED 400174e4: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED 400158b4 <_Objects_Get_no_protection>: ) { Objects_Control *the_object; uint32_t index; index = id - information->minimum_id + 1; 400158b4: c2 02 20 08 ld [ %o0 + 8 ], %g1 if ( information->maximum >= index ) { 400158b8: c4 12 20 10 lduh [ %o0 + 0x10 ], %g2 ) { Objects_Control *the_object; uint32_t index; index = id - information->minimum_id + 1; 400158bc: 92 22 40 01 sub %o1, %g1, %o1 400158c0: 82 02 60 01 add %o1, 1, %g1 if ( information->maximum >= index ) { 400158c4: 80 a0 80 01 cmp %g2, %g1 400158c8: 0a 80 00 0b bcs 400158f4 <_Objects_Get_no_protection+0x40> 400158cc: 83 28 60 02 sll %g1, 2, %g1 if ( (the_object = information->local_table[ index ]) != NULL ) { 400158d0: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 400158d4: d0 00 80 01 ld [ %g2 + %g1 ], %o0 400158d8: 80 a2 20 00 cmp %o0, 0 400158dc: 02 80 00 04 be 400158ec <_Objects_Get_no_protection+0x38> 400158e0: 82 10 20 02 mov 2, %g1 *location = OBJECTS_LOCAL; 400158e4: 81 c3 e0 08 retl 400158e8: c0 22 80 00 clr [ %o2 ] return the_object; } *location = OBJECTS_ERROR; 400158ec: 81 c3 e0 08 retl <== NOT EXECUTED 400158f0: c2 22 80 00 st %g1, [ %o2 ] <== NOT EXECUTED return NULL; } *location = OBJECTS_ERROR; 400158f4: 82 10 20 02 mov 2, %g1 400158f8: 90 10 20 00 clr %o0 /* * Not supported for multiprocessing */ return NULL; } 400158fc: 81 c3 e0 08 retl 40015900: c2 22 80 00 st %g1, [ %o2 ] 40008880 <_Objects_Handler_initialization>: uint32_t node, uint32_t maximum_nodes, uint32_t maximum_global_objects ) { if ( node < 1 || node > maximum_nodes ) 40008880: 80 a2 20 00 cmp %o0, 0 40008884: 22 80 00 05 be,a 40008898 <_Objects_Handler_initialization+0x18> 40008888: 90 10 20 00 clr %o0 <== NOT EXECUTED 4000888c: 80 a2 00 09 cmp %o0, %o1 40008890: 08 80 00 07 bleu 400088ac <_Objects_Handler_initialization+0x2c> 40008894: 90 10 20 00 clr %o0 _Internal_error_Occurred( 40008898: 92 10 20 01 mov 1, %o1 <== NOT EXECUTED 4000889c: 94 10 20 08 mov 8, %o2 <== NOT EXECUTED 400088a0: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 400088a4: 7f ff fd ed call 40008058 <_Internal_error_Occurred> <== NOT EXECUTED 400088a8: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED 400088ac: 81 c3 e0 08 retl 400088b0: 01 00 00 00 nop 40009cc4 <_Objects_Id_to_name>: Objects_Name_or_id_lookup_errors _Objects_Id_to_name ( Objects_Id id, Objects_Name *name ) { 40009cc4: 9d e3 bf 90 save %sp, -112, %sp 40009cc8: 92 10 00 18 mov %i0, %o1 uint32_t the_class; Objects_Information *information; Objects_Control *the_object = (Objects_Control *) 0; Objects_Locations ignored_location; if ( !name ) 40009ccc: 80 a6 60 00 cmp %i1, 0 40009cd0: 02 80 00 26 be 40009d68 <_Objects_Id_to_name+0xa4> 40009cd4: b0 10 20 01 mov 1, %i0 */ RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API( Objects_Id id ) { return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS); 40009cd8: 83 32 60 18 srl %o1, 0x18, %g1 40009cdc: 82 08 60 07 and %g1, 7, %g1 return OBJECTS_INVALID_NAME; the_api = _Objects_Get_API( id ); if ( the_api && the_api > OBJECTS_APIS_LAST ) 40009ce0: 80 a0 60 04 cmp %g1, 4 40009ce4: 18 80 00 23 bgu 40009d70 <_Objects_Id_to_name+0xac> 40009ce8: 85 28 60 02 sll %g1, 2, %g2 return OBJECTS_INVALID_ID; the_class = _Objects_Get_class( id ); information = _Objects_Information_table[ the_api ][ the_class ]; 40009cec: 03 10 00 7e sethi %hi(0x4001f800), %g1 40009cf0: 82 10 60 60 or %g1, 0x60, %g1 ! 4001f860 <_Objects_Information_table> 40009cf4: c4 00 40 02 ld [ %g1 + %g2 ], %g2 40009cf8: 83 32 60 1b srl %o1, 0x1b, %g1 40009cfc: 83 28 60 02 sll %g1, 2, %g1 40009d00: d0 00 80 01 ld [ %g2 + %g1 ], %o0 if ( !information ) 40009d04: 80 a2 20 00 cmp %o0, 0 40009d08: 02 80 00 18 be 40009d68 <_Objects_Id_to_name+0xa4> 40009d0c: b0 10 20 03 mov 3, %i0 return OBJECTS_INVALID_ID; if ( information->is_string ) 40009d10: c2 02 20 40 ld [ %o0 + 0x40 ], %g1 40009d14: 80 a0 60 00 cmp %g1, 0 40009d18: 12 80 00 17 bne 40009d74 <_Objects_Id_to_name+0xb0> 40009d1c: 01 00 00 00 nop return OBJECTS_INVALID_ID; the_object = _Objects_Get( information, id, &ignored_location ); 40009d20: 7f ff ff c4 call 40009c30 <_Objects_Get> 40009d24: 94 07 bf f4 add %fp, -12, %o2 if ( !the_object ) 40009d28: 80 a2 20 00 cmp %o0, 0 40009d2c: 02 80 00 0f be 40009d68 <_Objects_Id_to_name+0xa4> 40009d30: b0 10 20 03 mov 3, %i0 return OBJECTS_INVALID_ID; *name = the_object->name; 40009d34: c2 02 20 0c ld [ %o0 + 0xc ], %g1 40009d38: c2 26 40 00 st %g1, [ %i1 ] #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40009d3c: 05 10 00 7e sethi %hi(0x4001f800), %g2 40009d40: c2 00 a1 00 ld [ %g2 + 0x100 ], %g1 ! 4001f900 <_Thread_Dispatch_disable_level> 40009d44: b0 10 20 00 clr %i0 40009d48: 82 00 7f ff add %g1, -1, %g1 40009d4c: c2 20 a1 00 st %g1, [ %g2 + 0x100 ] 40009d50: c2 00 a1 00 ld [ %g2 + 0x100 ], %g1 40009d54: 80 a0 60 00 cmp %g1, 0 40009d58: 12 80 00 07 bne 40009d74 <_Objects_Id_to_name+0xb0> 40009d5c: 01 00 00 00 nop _Thread_Dispatch(); 40009d60: 40 00 04 d6 call 4000b0b8 <_Thread_Dispatch> 40009d64: 01 00 00 00 nop 40009d68: 81 c7 e0 08 ret 40009d6c: 81 e8 00 00 restore 40009d70: b0 10 20 03 mov 3, %i0 <== NOT EXECUTED _Thread_Enable_dispatch(); return OBJECTS_NAME_OR_ID_LOOKUP_SUCCESSFUL; } 40009d74: 81 c7 e0 08 ret <== NOT EXECUTED 40009d78: 81 e8 00 00 restore <== NOT EXECUTED 40008784 <_Objects_Name_to_id>: Objects_Information *information, Objects_Name name, uint32_t node, Objects_Id *id ) { 40008784: 9d e3 bf 98 save %sp, -104, %sp 40008788: a2 10 00 18 mov %i0, %l1 Objects_Control *the_object; uint32_t index; uint32_t name_length; Objects_Name_comparators compare_them; if ( !id ) 4000878c: 80 a6 e0 00 cmp %i3, 0 40008790: 02 80 00 3a be 40008878 <_Objects_Name_to_id+0xf4> 40008794: b0 10 20 02 mov 2, %i0 return OBJECTS_INVALID_ADDRESS; if ( name == 0 ) 40008798: 80 a6 60 00 cmp %i1, 0 4000879c: 02 80 00 2d be 40008850 <_Objects_Name_to_id+0xcc> 400087a0: 01 00 00 00 nop return OBJECTS_INVALID_NAME; search_local_node = FALSE; if ( information->maximum != 0 && 400087a4: c2 14 60 10 lduh [ %l1 + 0x10 ], %g1 400087a8: 80 a0 60 00 cmp %g1, 0 400087ac: 02 80 00 29 be 40008850 <_Objects_Name_to_id+0xcc> 400087b0: 80 a6 a0 00 cmp %i2, 0 400087b4: 22 80 00 2a be,a 4000885c <_Objects_Name_to_id+0xd8> 400087b8: c2 04 60 40 ld [ %l1 + 0x40 ], %g1 400087bc: 03 1f ff ff sethi %hi(0x7ffffc00), %g1 400087c0: 82 10 63 ff or %g1, 0x3ff, %g1 ! 7fffffff 400087c4: 80 a6 80 01 cmp %i2, %g1 400087c8: 02 80 00 24 be 40008858 <_Objects_Name_to_id+0xd4> 400087cc: 80 a6 a0 01 cmp %i2, 1 400087d0: 22 80 00 23 be,a 4000885c <_Objects_Name_to_id+0xd8> 400087d4: c2 04 60 40 ld [ %l1 + 0x40 ], %g1 name_length = information->name_length; if ( information->is_string ) compare_them = _Objects_Compare_name_string; else compare_them = _Objects_Compare_name_raw; for ( index = 1; index <= information->maximum; index++ ) { 400087d8: 81 c7 e0 08 ret 400087dc: 91 e8 20 01 restore %g0, 1, %o0 if ( name == 0 ) return OBJECTS_INVALID_NAME; search_local_node = FALSE; if ( information->maximum != 0 && 400087e0: a4 10 63 90 or %g1, 0x390, %l2 for ( index = 1; index <= information->maximum; index++ ) { the_object = information->local_table[ index ]; if ( !the_object || !the_object->name ) continue; if ( (*compare_them)( name, the_object->name, name_length ) ) { 400087e4: 83 28 a0 10 sll %g2, 0x10, %g1 if ( name == 0 ) return OBJECTS_INVALID_NAME; search_local_node = FALSE; if ( information->maximum != 0 && 400087e8: a0 10 20 01 mov 1, %l0 for ( index = 1; index <= information->maximum; index++ ) { the_object = information->local_table[ index ]; if ( !the_object || !the_object->name ) continue; if ( (*compare_them)( name, the_object->name, name_length ) ) { 400087ec: 10 80 00 15 b 40008840 <_Objects_Name_to_id+0xbc> 400087f0: b1 30 60 10 srl %g1, 0x10, %i0 if ( information->is_string ) compare_them = _Objects_Compare_name_string; else compare_them = _Objects_Compare_name_raw; for ( index = 1; index <= information->maximum; index++ ) { the_object = information->local_table[ index ]; 400087f4: c2 04 60 20 ld [ %l1 + 0x20 ], %g1 name_length = information->name_length; if ( information->is_string ) compare_them = _Objects_Compare_name_string; else compare_them = _Objects_Compare_name_raw; for ( index = 1; index <= information->maximum; index++ ) { 400087f8: a0 04 20 01 inc %l0 the_object = information->local_table[ index ]; 400087fc: f4 00 40 02 ld [ %g1 + %g2 ], %i2 if ( !the_object || !the_object->name ) 40008800: 80 a6 a0 00 cmp %i2, 0 40008804: 02 80 00 0f be 40008840 <_Objects_Name_to_id+0xbc> 40008808: 90 10 00 19 mov %i1, %o0 4000880c: d2 06 a0 0c ld [ %i2 + 0xc ], %o1 40008810: 80 a2 60 00 cmp %o1, 0 40008814: 02 80 00 0b be 40008840 <_Objects_Name_to_id+0xbc> 40008818: 94 10 00 18 mov %i0, %o2 continue; if ( (*compare_them)( name, the_object->name, name_length ) ) { 4000881c: 9f c4 80 00 call %l2 40008820: 01 00 00 00 nop 40008824: 80 a2 20 00 cmp %o0, 0 40008828: 22 80 00 07 be,a 40008844 <_Objects_Name_to_id+0xc0> 4000882c: c2 14 60 10 lduh [ %l1 + 0x10 ], %g1 *id = the_object->id; 40008830: c2 06 a0 08 ld [ %i2 + 8 ], %g1 40008834: c2 26 c0 00 st %g1, [ %i3 ] 40008838: 81 c7 e0 08 ret 4000883c: 91 e8 20 00 restore %g0, 0, %o0 name_length = information->name_length; if ( information->is_string ) compare_them = _Objects_Compare_name_string; else compare_them = _Objects_Compare_name_raw; for ( index = 1; index <= information->maximum; index++ ) { 40008840: c2 14 60 10 lduh [ %l1 + 0x10 ], %g1 40008844: 80 a4 00 01 cmp %l0, %g1 40008848: 08 bf ff eb bleu 400087f4 <_Objects_Name_to_id+0x70> 4000884c: 85 2c 20 02 sll %l0, 2, %g2 40008850: 81 c7 e0 08 ret 40008854: 91 e8 20 01 restore %g0, 1, %o0 search_local_node = TRUE; if ( search_local_node ) { name_length = information->name_length; if ( information->is_string ) compare_them = _Objects_Compare_name_string; 40008858: c2 04 60 40 ld [ %l1 + 0x40 ], %g1 _Objects_Is_local_node( node ) )) search_local_node = TRUE; if ( search_local_node ) { name_length = information->name_length; 4000885c: c4 14 60 44 lduh [ %l1 + 0x44 ], %g2 if ( information->is_string ) compare_them = _Objects_Compare_name_string; 40008860: 80 a0 60 00 cmp %g1, 0 40008864: 03 10 00 36 sethi %hi(0x4000d800), %g1 40008868: 02 bf ff df be 400087e4 <_Objects_Name_to_id+0x60> 4000886c: a4 10 63 80 or %g1, 0x380, %l2 ! 4000db80 <_Objects_Compare_name_raw> if ( name == 0 ) return OBJECTS_INVALID_NAME; search_local_node = FALSE; if ( information->maximum != 0 && 40008870: 10 bf ff dc b 400087e0 <_Objects_Name_to_id+0x5c> 40008874: 03 10 00 36 sethi %hi(0x4000d800), %g1 return ( _Objects_MP_Global_name_search( information, name, node, id ) ); #else return OBJECTS_INVALID_NAME; #endif } 40008878: 81 c7 e0 08 ret <== NOT EXECUTED 4000887c: 81 e8 00 00 restore <== NOT EXECUTED 400088b4 <_Objects_Shrink_information>: */ void _Objects_Shrink_information( Objects_Information *information ) { 400088b4: 9d e3 bf 98 save %sp, -104, %sp 400088b8: c4 06 20 08 ld [ %i0 + 8 ], %g2 /* * Search the list to find block or chunnk with all objects inactive. */ index_base = _Objects_Get_index( information->minimum_id ); block_count = ( information->maximum - index_base ) / information->allocation_size; 400088bc: e0 06 20 18 ld [ %i0 + 0x18 ], %l0 400088c0: d0 16 20 10 lduh [ %i0 + 0x10 ], %o0 400088c4: 03 00 00 3f sethi %hi(0xfc00), %g1 400088c8: 82 10 63 ff or %g1, 0x3ff, %g1 ! ffff 400088cc: 92 10 00 10 mov %l0, %o1 400088d0: a2 08 80 01 and %g2, %g1, %l1 400088d4: 40 00 35 e3 call 40016060 <.udiv> 400088d8: 90 22 00 11 sub %o0, %l1, %o0 400088dc: 86 10 20 00 clr %g3 400088e0: 10 80 00 33 b 400089ac <_Objects_Shrink_information+0xf8> 400088e4: a4 10 20 00 clr %l2 for ( block = 0; block < block_count; block++ ) { 400088e8: 86 00 e0 01 inc %g3 if ( information->inactive_per_block[ block ] == information->allocation_size ) { 400088ec: c2 00 40 12 ld [ %g1 + %l2 ], %g1 400088f0: 80 a0 40 10 cmp %g1, %l0 400088f4: 12 80 00 2c bne 400089a4 <_Objects_Shrink_information+0xf0> 400088f8: 84 04 a0 04 add %l2, 4, %g2 /* * XXX - Not to sure how to use a chain where you need to iterate and * and remove elements. */ the_object = (Objects_Control *) information->Inactive.first; 400088fc: e0 06 20 28 ld [ %i0 + 0x28 ], %l0 40008900: 03 00 00 3f sethi %hi(0xfc00), %g1 40008904: a6 10 63 ff or %g1, 0x3ff, %l3 ! ffff 40008908: c2 04 20 08 ld [ %l0 + 8 ], %g1 4000890c: 84 08 40 13 and %g1, %l3, %g2 */ do { index = _Objects_Get_index( the_object->id ); if ((index >= index_base) && 40008910: 80 a0 80 11 cmp %g2, %l1 40008914: 2a 80 00 0c bcs,a 40008944 <_Objects_Shrink_information+0x90> 40008918: e0 04 00 00 ld [ %l0 ], %l0 4000891c: c2 06 20 18 ld [ %i0 + 0x18 ], %g1 40008920: 82 04 40 01 add %l1, %g1, %g1 40008924: 80 a0 80 01 cmp %g2, %g1 40008928: 1a 80 00 06 bcc 40008940 <_Objects_Shrink_information+0x8c> 4000892c: 90 10 00 10 mov %l0, %o0 if ( !_Chain_Is_last( &the_object->Node ) ) the_object = (Objects_Control *) the_object->Node.next; else the_object = NULL; _Chain_Extract( &extract_me->Node ); 40008930: 40 00 13 85 call 4000d744 <_Chain_Extract> 40008934: e0 04 00 00 ld [ %l0 ], %l0 } else { the_object = (Objects_Control *) the_object->Node.next; } } while ( the_object && !_Chain_Is_last( &the_object->Node ) ); 40008938: 10 80 00 04 b 40008948 <_Objects_Shrink_information+0x94> 4000893c: 80 a4 20 00 cmp %l0, 0 the_object = NULL; _Chain_Extract( &extract_me->Node ); } else { the_object = (Objects_Control *) the_object->Node.next; 40008940: e0 04 00 00 ld [ %l0 ], %l0 } } while ( the_object && !_Chain_Is_last( &the_object->Node ) ); 40008944: 80 a4 20 00 cmp %l0, 0 40008948: 22 80 00 07 be,a 40008964 <_Objects_Shrink_information+0xb0> 4000894c: c2 06 20 3c ld [ %i0 + 0x3c ], %g1 <== NOT EXECUTED 40008950: c2 04 00 00 ld [ %l0 ], %g1 40008954: 80 a0 60 00 cmp %g1, 0 40008958: 32 bf ff ed bne,a 4000890c <_Objects_Shrink_information+0x58> 4000895c: c2 04 20 08 ld [ %l0 + 8 ], %g1 40008960: c2 06 20 3c ld [ %i0 + 0x3c ], %g1 40008964: 11 10 00 6b sethi %hi(0x4001ac00), %o0 40008968: d2 00 40 12 ld [ %g1 + %l2 ], %o1 4000896c: 7f ff fc b7 call 40007c48 <_Heap_Free> 40008970: 90 12 22 1c or %o0, 0x21c, %o0 */ _Workspace_Free( information->object_blocks[ block ] ); information->name_table[ block ] = NULL; information->object_blocks[ block ] = NULL; information->inactive_per_block[ block ] = 0; 40008974: c2 06 20 38 ld [ %i0 + 0x38 ], %g1 /* * Free the memory and reset the structures in the object' information */ _Workspace_Free( information->object_blocks[ block ] ); information->name_table[ block ] = NULL; 40008978: c6 06 20 24 ld [ %i0 + 0x24 ], %g3 information->object_blocks[ block ] = NULL; information->inactive_per_block[ block ] = 0; 4000897c: c0 20 40 12 clr [ %g1 + %l2 ] * Free the memory and reset the structures in the object' information */ _Workspace_Free( information->object_blocks[ block ] ); information->name_table[ block ] = NULL; information->object_blocks[ block ] = NULL; 40008980: c8 06 20 3c ld [ %i0 + 0x3c ], %g4 information->inactive_per_block[ block ] = 0; information->inactive -= information->allocation_size; 40008984: c2 16 20 34 lduh [ %i0 + 0x34 ], %g1 40008988: c4 06 20 18 ld [ %i0 + 0x18 ], %g2 /* * Free the memory and reset the structures in the object' information */ _Workspace_Free( information->object_blocks[ block ] ); information->name_table[ block ] = NULL; 4000898c: c0 20 c0 12 clr [ %g3 + %l2 ] information->object_blocks[ block ] = NULL; information->inactive_per_block[ block ] = 0; information->inactive -= information->allocation_size; 40008990: 82 20 40 02 sub %g1, %g2, %g1 * Free the memory and reset the structures in the object' information */ _Workspace_Free( information->object_blocks[ block ] ); information->name_table[ block ] = NULL; information->object_blocks[ block ] = NULL; 40008994: c0 21 00 12 clr [ %g4 + %l2 ] information->inactive_per_block[ block ] = 0; information->inactive -= information->allocation_size; 40008998: c2 36 20 34 sth %g1, [ %i0 + 0x34 ] 4000899c: 81 c7 e0 08 ret 400089a0: 81 e8 00 00 restore return; } index_base += information->allocation_size; 400089a4: a2 04 40 10 add %l1, %l0, %l1 */ index_base = _Objects_Get_index( information->minimum_id ); block_count = ( information->maximum - index_base ) / information->allocation_size; for ( block = 0; block < block_count; block++ ) { 400089a8: a4 10 00 02 mov %g2, %l2 400089ac: 80 a0 c0 08 cmp %g3, %o0 400089b0: 32 bf ff ce bne,a 400088e8 <_Objects_Shrink_information+0x34> 400089b4: c2 06 20 38 ld [ %i0 + 0x38 ], %g1 400089b8: 81 c7 e0 08 ret 400089bc: 81 e8 00 00 restore 400074a0 <_POSIX_API_Initialize>: void _POSIX_API_Initialize( rtems_configuration_table *configuration_table ) { 400074a0: 9d e3 bf 98 save %sp, -104, %sp /* XXX need to assert here based on size assumptions */ assert( sizeof(pthread_t) == sizeof(Objects_Id) ); api_configuration = configuration_table->POSIX_api_configuration; 400074a4: f0 06 20 30 ld [ %i0 + 0x30 ], %i0 if ( !api_configuration ) 400074a8: 80 a6 20 00 cmp %i0, 0 400074ac: 32 80 00 05 bne,a 400074c0 <_POSIX_API_Initialize+0x20> 400074b0: d0 06 20 14 ld [ %i0 + 0x14 ], %o0 400074b4: 03 10 00 6a sethi %hi(0x4001a800), %g1 <== NOT EXECUTED 400074b8: b0 10 63 78 or %g1, 0x378, %i0 ! 4001ab78 <_POSIX_Default_configuration> <== NOT EXECUTED api_configuration = &_POSIX_Default_configuration; _Objects_Information_table[OBJECTS_POSIX_API] = _POSIX_Objects; _POSIX_signals_Manager_Initialization( 400074bc: d0 06 20 14 ld [ %i0 + 0x14 ], %o0 <== NOT EXECUTED api_configuration = configuration_table->POSIX_api_configuration; if ( !api_configuration ) api_configuration = &_POSIX_Default_configuration; _Objects_Information_table[OBJECTS_POSIX_API] = _POSIX_Objects; 400074c0: 05 10 00 6b sethi %hi(0x4001ac00), %g2 400074c4: 03 10 00 6c sethi %hi(0x4001b000), %g1 400074c8: 82 10 63 68 or %g1, 0x368, %g1 ! 4001b368 <_POSIX_Objects> _POSIX_signals_Manager_Initialization( 400074cc: 40 00 16 22 call 4000cd54 <_POSIX_signals_Manager_Initialization> 400074d0: c2 20 a1 3c st %g1, [ %g2 + 0x13c ] api_configuration->maximum_queued_signals ); _POSIX_Threads_Manager_initialization( 400074d4: d2 06 20 2c ld [ %i0 + 0x2c ], %o1 400074d8: d4 06 20 30 ld [ %i0 + 0x30 ], %o2 400074dc: 40 00 16 92 call 4000cf24 <_POSIX_Threads_Manager_initialization> 400074e0: d0 06 00 00 ld [ %i0 ], %o0 api_configuration->maximum_threads, api_configuration->number_of_initialization_threads, api_configuration->User_initialization_threads_table ); _POSIX_Condition_variables_Manager_initialization( 400074e4: 40 00 15 ca call 4000cc0c <_POSIX_Condition_variables_Manager_initialization> 400074e8: d0 06 20 08 ld [ %i0 + 8 ], %o0 api_configuration->maximum_condition_variables ); _POSIX_Key_Manager_initialization( api_configuration->maximum_keys ); 400074ec: 40 00 15 d4 call 4000cc3c <_POSIX_Key_Manager_initialization> 400074f0: d0 06 20 0c ld [ %i0 + 0xc ], %o0 _POSIX_Mutex_Manager_initialization( 400074f4: 40 00 15 f4 call 4000ccc4 <_POSIX_Mutex_Manager_initialization> 400074f8: d0 06 20 04 ld [ %i0 + 4 ], %o0 api_configuration->maximum_mutexes ); _POSIX_Message_queue_Manager_initialization( 400074fc: 40 00 15 dc call 4000cc6c <_POSIX_Message_queue_Manager_initialization> 40007500: d0 06 20 18 ld [ %i0 + 0x18 ], %o0 api_configuration->maximum_message_queues ); _POSIX_Semaphore_Manager_initialization( 40007504: 40 00 17 45 call 4000d218 <_POSIX_Semaphore_Manager_initialization> 40007508: d0 06 20 1c ld [ %i0 + 0x1c ], %o0 api_configuration->maximum_semaphores ); _POSIX_Timer_Manager_initialization( api_configuration->maximum_timers ); 4000750c: 40 00 17 36 call 4000d1e4 <_POSIX_Timer_Manager_initialization> 40007510: d0 06 20 10 ld [ %i0 + 0x10 ], %o0 _POSIX_Barrier_Manager_initialization( api_configuration->maximum_barriers ); 40007514: 40 00 15 f8 call 4000ccf4 <_POSIX_Barrier_Manager_initialization> 40007518: d0 06 20 20 ld [ %i0 + 0x20 ], %o0 _POSIX_RWLock_Manager_initialization( api_configuration->maximum_rwlocks ); 4000751c: 40 00 16 02 call 4000cd24 <_POSIX_RWLock_Manager_initialization> 40007520: d0 06 20 24 ld [ %i0 + 0x24 ], %o0 _POSIX_Spinlock_Manager_initialization(api_configuration->maximum_spinlocks); 40007524: f0 06 20 28 ld [ %i0 + 0x28 ], %i0 40007528: 40 00 16 69 call 4000cecc <_POSIX_Spinlock_Manager_initialization> 4000752c: 81 e8 00 00 restore 40007530: 01 00 00 00 nop 4000e1dc <_POSIX_Barrier_Translate_core_barrier_return_code>: int _POSIX_Barrier_Translate_core_barrier_return_code( CORE_barrier_Status the_barrier_status ) { if ( the_barrier_status <= CORE_BARRIER_TIMEOUT ) 4000e1dc: 80 a2 20 03 cmp %o0, 3 4000e1e0: 08 80 00 05 bleu 4000e1f4 <_POSIX_Barrier_Translate_core_barrier_return_code+0x18> 4000e1e4: 85 2a 20 02 sll %o0, 2, %g2 return _POSIX_Barrier_Return_codes[the_barrier_status]; return POSIX_BOTTOM_REACHED(); 4000e1e8: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 4000e1ec: 7f ff e3 29 call 40006e90 <== NOT EXECUTED 4000e1f0: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED } 4000e1f4: 03 10 00 6a sethi %hi(0x4001a800), %g1 4000e1f8: 82 10 60 58 or %g1, 0x58, %g1 ! 4001a858 <_POSIX_Barrier_Return_codes> 4000e1fc: 81 c3 e0 08 retl 4000e200: d0 00 40 02 ld [ %g1 + %g2 ], %o0 4000720c <_POSIX_Condition_variables_Signal_support>: int _POSIX_Condition_variables_Signal_support( pthread_cond_t *cond, boolean is_broadcast ) { 4000720c: 9d e3 bf 90 save %sp, -112, %sp ) { Objects_Id *id = (Objects_Id *)cond; int status; if ( !id ) { 40007210: 80 a6 20 00 cmp %i0, 0 40007214: 02 80 00 0d be 40007248 <_POSIX_Condition_variables_Signal_support+0x3c> 40007218: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; return (POSIX_Condition_variables_Control *) 0; } if ( *id == PTHREAD_COND_INITIALIZER ) { 4000721c: c2 06 00 00 ld [ %i0 ], %g1 40007220: 80 a0 7f ff cmp %g1, -1 40007224: 32 80 00 0c bne,a 40007254 <_POSIX_Condition_variables_Signal_support+0x48> 40007228: d2 06 00 00 ld [ %i0 ], %o1 /* * Do an "auto-create" here. */ status = pthread_cond_init( (pthread_cond_t *)id, 0 ); 4000722c: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40007230: 7f ff ff ba call 40007118 <== NOT EXECUTED 40007234: 92 10 20 00 clr %o1 <== NOT EXECUTED if ( status ) { 40007238: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 4000723c: 22 80 00 06 be,a 40007254 <_POSIX_Condition_variables_Signal_support+0x48> <== NOT EXECUTED 40007240: d2 06 00 00 ld [ %i0 ], %o1 <== NOT EXECUTED *location = OBJECTS_ERROR; 40007244: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED 40007248: a0 10 20 00 clr %l0 4000724c: 10 80 00 07 b 40007268 <_POSIX_Condition_variables_Signal_support+0x5c> 40007250: c2 27 bf f4 st %g1, [ %fp + -12 ] /* * Now call Objects_Get() */ return (POSIX_Condition_variables_Control *) 40007254: 11 10 00 66 sethi %hi(0x40019800), %o0 40007258: 94 07 bf f4 add %fp, -12, %o2 4000725c: 40 00 0e b9 call 4000ad40 <_Objects_Get> 40007260: 90 12 20 2c or %o0, 0x2c, %o0 40007264: a0 10 00 08 mov %o0, %l0 register POSIX_Condition_variables_Control *the_cond; Objects_Locations location; Thread_Control *the_thread; the_cond = _POSIX_Condition_variables_Get( cond, &location ); switch ( location ) { 40007268: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000726c: 80 a0 60 00 cmp %g1, 0 40007270: 02 80 00 06 be 40007288 <_POSIX_Condition_variables_Signal_support+0x7c> 40007274: b0 04 20 18 add %l0, 0x18, %i0 40007278: 80 a0 60 02 cmp %g1, 2 4000727c: 08 80 00 1c bleu 400072ec <_POSIX_Condition_variables_Signal_support+0xe0> 40007280: 90 10 20 16 mov 0x16, %o0 40007284: 30 80 00 18 b,a 400072e4 <_POSIX_Condition_variables_Signal_support+0xd8> <== NOT EXECUTED case OBJECTS_ERROR: return EINVAL; case OBJECTS_LOCAL: do { the_thread = _Thread_queue_Dequeue( &the_cond->Wait_queue ); 40007288: 40 00 14 5d call 4000c3fc <_Thread_queue_Dequeue> 4000728c: 90 10 00 18 mov %i0, %o0 if ( !the_thread ) 40007290: 80 a2 20 00 cmp %o0, 0 40007294: 22 80 00 02 be,a 4000729c <_POSIX_Condition_variables_Signal_support+0x90> 40007298: c0 24 20 14 clr [ %l0 + 0x14 ] the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX; } while ( is_broadcast && the_thread ); 4000729c: 80 a6 60 00 cmp %i1, 0 400072a0: 02 80 00 04 be 400072b0 <_POSIX_Condition_variables_Signal_support+0xa4> 400072a4: 80 a2 20 00 cmp %o0, 0 400072a8: 12 bf ff f8 bne 40007288 <_POSIX_Condition_variables_Signal_support+0x7c> 400072ac: 01 00 00 00 nop #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 400072b0: 03 10 00 64 sethi %hi(0x40019000), %g1 400072b4: c4 00 62 e0 ld [ %g1 + 0x2e0 ], %g2 ! 400192e0 <_Thread_Dispatch_disable_level> 400072b8: 90 10 20 00 clr %o0 400072bc: 84 00 bf ff add %g2, -1, %g2 400072c0: c4 20 62 e0 st %g2, [ %g1 + 0x2e0 ] 400072c4: c2 00 62 e0 ld [ %g1 + 0x2e0 ], %g1 400072c8: 80 a0 60 00 cmp %g1, 0 400072cc: 12 80 00 08 bne 400072ec <_POSIX_Condition_variables_Signal_support+0xe0> 400072d0: 01 00 00 00 nop _Thread_Dispatch(); 400072d4: 40 00 13 50 call 4000c014 <_Thread_Dispatch> 400072d8: 01 00 00 00 nop 400072dc: 10 80 00 04 b 400072ec <_POSIX_Condition_variables_Signal_support+0xe0> 400072e0: 90 10 20 00 clr %o0 ! 0 _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); 400072e4: 40 00 04 47 call 40008400 <== NOT EXECUTED 400072e8: 01 00 00 00 nop <== NOT EXECUTED } 400072ec: 81 c7 e0 08 ret 400072f0: 91 e8 00 08 restore %g0, %o0, %o0 4000738c <_POSIX_Condition_variables_Wait_support>: pthread_cond_t *cond, pthread_mutex_t *mutex, Watchdog_Interval timeout, boolean already_timedout ) { 4000738c: 9d e3 bf 90 save %sp, -112, %sp Objects_Locations *location ) { Objects_Id *id = (Objects_Id *)mutex; ___POSIX_Mutex_Get_support( id, location ); 40007390: 80 a6 60 00 cmp %i1, 0 40007394: 22 80 00 40 be,a 40007494 <_POSIX_Condition_variables_Wait_support+0x108> 40007398: b0 10 20 16 mov 0x16, %i0 4000739c: c2 06 40 00 ld [ %i1 ], %g1 400073a0: 80 a0 7f ff cmp %g1, -1 400073a4: 32 80 00 09 bne,a 400073c8 <_POSIX_Condition_variables_Wait_support+0x3c> 400073a8: d2 06 40 00 ld [ %i1 ], %o1 400073ac: 90 10 00 19 mov %i1, %o0 <== NOT EXECUTED 400073b0: 40 00 00 c2 call 400076b8 <== NOT EXECUTED 400073b4: 92 10 20 00 clr %o1 <== NOT EXECUTED 400073b8: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400073bc: 32 80 00 36 bne,a 40007494 <_POSIX_Condition_variables_Wait_support+0x108> <== NOT EXECUTED 400073c0: b0 10 20 16 mov 0x16, %i0 <== NOT EXECUTED return (POSIX_Mutex_Control *) 400073c4: d2 06 40 00 ld [ %i1 ], %o1 <== NOT EXECUTED 400073c8: 11 10 00 65 sethi %hi(0x40019400), %o0 400073cc: 94 07 bf f4 add %fp, -12, %o2 400073d0: 40 00 0e 5c call 4000ad40 <_Objects_Get> 400073d4: 90 12 23 44 or %o0, 0x344, %o0 register POSIX_Condition_variables_Control *the_cond; Objects_Locations location; int status; int mutex_status; if ( !_POSIX_Mutex_Get( mutex, &location ) ) { 400073d8: 80 a2 20 00 cmp %o0, 0 400073dc: 22 80 00 2e be,a 40007494 <_POSIX_Condition_variables_Wait_support+0x108> 400073e0: b0 10 20 16 mov 0x16, %i0 <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; 400073e4: 05 10 00 64 sethi %hi(0x40019000), %g2 400073e8: c2 00 a2 e0 ld [ %g2 + 0x2e0 ], %g1 ! 400192e0 <_Thread_Dispatch_disable_level> ) { Objects_Id *id = (Objects_Id *)cond; int status; if ( !id ) { 400073ec: 80 a6 20 00 cmp %i0, 0 400073f0: 82 00 7f ff add %g1, -1, %g1 400073f4: c2 20 a2 e0 st %g1, [ %g2 + 0x2e0 ] 400073f8: 02 80 00 0d be 4000742c <_POSIX_Condition_variables_Wait_support+0xa0> 400073fc: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; return (POSIX_Condition_variables_Control *) 0; } if ( *id == PTHREAD_COND_INITIALIZER ) { 40007400: c2 06 00 00 ld [ %i0 ], %g1 40007404: 80 a0 7f ff cmp %g1, -1 40007408: 32 80 00 0c bne,a 40007438 <_POSIX_Condition_variables_Wait_support+0xac> 4000740c: d2 06 00 00 ld [ %i0 ], %o1 /* * Do an "auto-create" here. */ status = pthread_cond_init( (pthread_cond_t *)id, 0 ); 40007410: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40007414: 7f ff ff 41 call 40007118 <== NOT EXECUTED 40007418: 92 10 20 00 clr %o1 <== NOT EXECUTED if ( status ) { 4000741c: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40007420: 22 80 00 06 be,a 40007438 <_POSIX_Condition_variables_Wait_support+0xac> <== NOT EXECUTED 40007424: d2 06 00 00 ld [ %i0 ], %o1 <== NOT EXECUTED *location = OBJECTS_ERROR; 40007428: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED 4000742c: a2 10 20 00 clr %l1 40007430: 10 80 00 07 b 4000744c <_POSIX_Condition_variables_Wait_support+0xc0> 40007434: c2 27 bf f4 st %g1, [ %fp + -12 ] /* * Now call Objects_Get() */ return (POSIX_Condition_variables_Control *) 40007438: 11 10 00 66 sethi %hi(0x40019800), %o0 4000743c: 94 07 bf f4 add %fp, -12, %o2 40007440: 40 00 0e 40 call 4000ad40 <_Objects_Get> 40007444: 90 12 20 2c or %o0, 0x2c, %o0 40007448: a2 10 00 08 mov %o0, %l1 } _Thread_Unnest_dispatch(); the_cond = _POSIX_Condition_variables_Get( cond, &location ); switch ( location ) { 4000744c: c2 07 bf f4 ld [ %fp + -12 ], %g1 40007450: 80 a0 60 00 cmp %g1, 0 40007454: 22 80 00 07 be,a 40007470 <_POSIX_Condition_variables_Wait_support+0xe4> 40007458: c4 04 60 14 ld [ %l1 + 0x14 ], %g2 4000745c: 80 a0 60 02 cmp %g1, 2 40007460: 18 80 00 36 bgu 40007538 <_POSIX_Condition_variables_Wait_support+0x1ac> 40007464: 01 00 00 00 nop if ( mutex_status ) return EINVAL; return status; } return POSIX_BOTTOM_REACHED(); 40007468: 81 c7 e0 08 ret 4000746c: 91 e8 20 16 restore %g0, 0x16, %o0 #endif case OBJECTS_ERROR: return EINVAL; case OBJECTS_LOCAL: if ( the_cond->Mutex && ( the_cond->Mutex != *mutex ) ) { 40007470: 80 a0 a0 00 cmp %g2, 0 40007474: 02 80 00 0a be 4000749c <_POSIX_Condition_variables_Wait_support+0x110> 40007478: 01 00 00 00 nop 4000747c: c2 06 40 00 ld [ %i1 ], %g1 40007480: 80 a0 80 01 cmp %g2, %g1 40007484: 02 80 00 06 be 4000749c <_POSIX_Condition_variables_Wait_support+0x110> 40007488: 01 00 00 00 nop _Thread_Enable_dispatch(); 4000748c: 7f ff ff b3 call 40007358 <_Thread_Enable_dispatch> <== NOT EXECUTED 40007490: b0 10 20 16 mov 0x16, %i0 ! 16 <== NOT EXECUTED 40007494: 81 c7 e0 08 ret 40007498: 81 e8 00 00 restore return EINVAL; } (void) pthread_mutex_unlock( mutex ); 4000749c: 40 00 01 95 call 40007af0 400074a0: 90 10 00 19 mov %i1, %o0 _Thread_Enable_dispatch(); return EINVAL; } */ if ( !already_timedout ) { 400074a4: 80 a6 e0 00 cmp %i3, 0 400074a8: 12 80 00 1b bne 40007514 <_POSIX_Condition_variables_Wait_support+0x188> 400074ac: 21 10 00 64 sethi %hi(0x40019000), %l0 the_cond->Mutex = *mutex; 400074b0: c2 06 40 00 ld [ %i1 ], %g1 400074b4: c2 24 60 14 st %g1, [ %l1 + 0x14 ] _Thread_queue_Enter_critical_section( &the_cond->Wait_queue ); _Thread_Executing->Wait.return_code = 0; 400074b8: c2 04 23 bc ld [ %l0 + 0x3bc ], %g1 _Thread_Executing->Wait.queue = &the_cond->Wait_queue; _Thread_Executing->Wait.id = *cond; 400074bc: c6 06 00 00 ld [ %i0 ], %g3 if ( !already_timedout ) { the_cond->Mutex = *mutex; _Thread_queue_Enter_critical_section( &the_cond->Wait_queue ); _Thread_Executing->Wait.return_code = 0; _Thread_Executing->Wait.queue = &the_cond->Wait_queue; 400074c0: 84 04 60 18 add %l1, 0x18, %g2 _Thread_Executing->Wait.id = *cond; 400074c4: c6 20 60 20 st %g3, [ %g1 + 0x20 ] if ( !already_timedout ) { the_cond->Mutex = *mutex; _Thread_queue_Enter_critical_section( &the_cond->Wait_queue ); _Thread_Executing->Wait.return_code = 0; _Thread_Executing->Wait.queue = &the_cond->Wait_queue; 400074c8: c4 20 60 44 st %g2, [ %g1 + 0x44 ] _Thread_Executing->Wait.id = *cond; _Thread_queue_Enqueue( &the_cond->Wait_queue, timeout ); 400074cc: 92 10 00 1a mov %i2, %o1 400074d0: 90 10 00 02 mov %g2, %o0 if ( !already_timedout ) { the_cond->Mutex = *mutex; _Thread_queue_Enter_critical_section( &the_cond->Wait_queue ); _Thread_Executing->Wait.return_code = 0; 400074d4: c0 20 60 34 clr [ %g1 + 0x34 ] _Thread_Executing->Wait.queue = &the_cond->Wait_queue; _Thread_Executing->Wait.id = *cond; _Thread_queue_Enqueue( &the_cond->Wait_queue, timeout ); 400074d8: 15 10 00 32 sethi %hi(0x4000c800), %o2 RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section ( Thread_queue_Control *the_thread_queue ) { the_thread_queue->sync_state = THREAD_QUEUE_NOTHING_HAPPENED; 400074dc: 82 10 20 01 mov 1, %g1 400074e0: 94 12 a2 d4 or %o2, 0x2d4, %o2 400074e4: 40 00 14 34 call 4000c5b4 <_Thread_queue_Enqueue_with_handler> 400074e8: c2 24 60 48 st %g1, [ %l1 + 0x48 ] _Thread_Enable_dispatch(); 400074ec: 7f ff ff 9b call 40007358 <_Thread_Enable_dispatch> 400074f0: 01 00 00 00 nop /* * Switch ourself out because we blocked as a result of the * _Thread_queue_Enqueue. */ status = _Thread_Executing->Wait.return_code; 400074f4: c2 04 23 bc ld [ %l0 + 0x3bc ], %g1 400074f8: f0 00 60 34 ld [ %g1 + 0x34 ], %i0 if ( status && status != ETIMEDOUT ) 400074fc: 80 a6 20 00 cmp %i0, 0 40007500: 02 80 00 07 be 4000751c <_POSIX_Condition_variables_Wait_support+0x190> 40007504: 80 a6 20 74 cmp %i0, 0x74 40007508: 12 80 00 0f bne 40007544 <_POSIX_Condition_variables_Wait_support+0x1b8> 4000750c: 01 00 00 00 nop 40007510: 30 80 00 03 b,a 4000751c <_POSIX_Condition_variables_Wait_support+0x190> return status; } else { _Thread_Enable_dispatch(); 40007514: 7f ff ff 91 call 40007358 <_Thread_Enable_dispatch> 40007518: b0 10 20 74 mov 0x74, %i0 /* * When we get here the dispatch disable level is 0. */ mutex_status = pthread_mutex_lock( mutex ); 4000751c: 40 00 00 c7 call 40007838 40007520: 90 10 00 19 mov %i1, %o0 if ( mutex_status ) 40007524: 80 a2 20 00 cmp %o0, 0 40007528: 02 80 00 07 be 40007544 <_POSIX_Condition_variables_Wait_support+0x1b8> 4000752c: 01 00 00 00 nop return EINVAL; return status; } return POSIX_BOTTOM_REACHED(); 40007530: 81 c7 e0 08 ret 40007534: 91 e8 20 16 restore %g0, 0x16, %o0 40007538: 40 00 03 b2 call 40008400 <== NOT EXECUTED 4000753c: 01 00 00 00 nop <== NOT EXECUTED 40007540: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED } 40007544: 81 c7 e0 08 ret 40007548: 81 e8 00 00 restore 4000e674 <_POSIX_Keys_Run_destructors>: */ void _POSIX_Keys_Run_destructors( Thread_Control *thread ) { 4000e674: 9d e3 bf 98 save %sp, -104, %sp uint32_t iterations; boolean are_all_null; POSIX_Keys_Control *the_key; void *value; thread_index = _Objects_Get_index( thread->Object.id ); 4000e678: c2 06 20 08 ld [ %i0 + 8 ], %g1 the_key = (POSIX_Keys_Control *) _POSIX_Keys_Information.local_table[ index ]; if ( the_key && the_key->is_active && the_key->destructor ) { value = the_key->Values[ thread_api ][ thread_index ]; 4000e67c: 05 00 00 3f sethi %hi(0xfc00), %g2 4000e680: 84 10 a3 ff or %g2, 0x3ff, %g2 ! ffff 4000e684: 84 08 40 02 and %g1, %g2, %g2 */ RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API( Objects_Id id ) { return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS); 4000e688: 83 30 60 16 srl %g1, 0x16, %g1 4000e68c: a7 28 a0 02 sll %g2, 2, %l3 4000e690: a8 08 60 1c and %g1, 0x1c, %l4 4000e694: a4 10 20 00 clr %l2 for ( ; ; ) { are_all_null = TRUE; for ( index=1 ; index <= _POSIX_Keys_Information.maximum ; index++ ) { 4000e698: 03 10 00 6c sethi %hi(0x4001b000), %g1 4000e69c: aa 10 62 d0 or %g1, 0x2d0, %l5 ! 4001b2d0 <_POSIX_Keys_Information> the_key = (POSIX_Keys_Control *) _POSIX_Keys_Information.local_table[ index ]; if ( the_key && the_key->is_active && the_key->destructor ) { value = the_key->Values[ thread_api ][ thread_index ]; 4000e6a0: a0 10 20 01 mov 1, %l0 4000e6a4: 10 80 00 1b b 4000e710 <_POSIX_Keys_Run_destructors+0x9c> 4000e6a8: a2 10 20 01 mov 1, %l1 are_all_null = TRUE; for ( index=1 ; index <= _POSIX_Keys_Information.maximum ; index++ ) { the_key = (POSIX_Keys_Control *) 4000e6ac: c2 05 60 20 ld [ %l5 + 0x20 ], %g1 4000e6b0: c4 00 40 02 ld [ %g1 + %g2 ], %g2 _POSIX_Keys_Information.local_table[ index ]; if ( the_key && the_key->is_active && the_key->destructor ) { 4000e6b4: 80 a0 a0 00 cmp %g2, 0 4000e6b8: 02 80 00 16 be 4000e710 <_POSIX_Keys_Run_destructors+0x9c> 4000e6bc: a0 04 20 01 inc %l0 4000e6c0: c2 00 a0 10 ld [ %g2 + 0x10 ], %g1 4000e6c4: 80 a0 60 00 cmp %g1, 0 4000e6c8: 02 80 00 12 be 4000e710 <_POSIX_Keys_Run_destructors+0x9c> 4000e6cc: b0 05 00 02 add %l4, %g2, %i0 4000e6d0: c4 00 a0 14 ld [ %g2 + 0x14 ], %g2 4000e6d4: 80 a0 a0 00 cmp %g2, 0 4000e6d8: 22 80 00 0f be,a 4000e714 <_POSIX_Keys_Run_destructors+0xa0> 4000e6dc: c2 15 60 10 lduh [ %l5 + 0x10 ], %g1 <== NOT EXECUTED value = the_key->Values[ thread_api ][ thread_index ]; 4000e6e0: c2 06 20 18 ld [ %i0 + 0x18 ], %g1 4000e6e4: c2 00 40 13 ld [ %g1 + %l3 ], %g1 if ( value ) { 4000e6e8: 90 90 60 00 orcc %g1, 0, %o0 4000e6ec: 22 80 00 0a be,a 4000e714 <_POSIX_Keys_Run_destructors+0xa0> 4000e6f0: c2 15 60 10 lduh [ %l5 + 0x10 ], %g1 <== NOT EXECUTED (*the_key->destructor)( value ); 4000e6f4: 9f c0 80 00 call %g2 4000e6f8: 01 00 00 00 nop if ( the_key->Values[ thread_api ][ thread_index ] ) 4000e6fc: c2 06 20 18 ld [ %i0 + 0x18 ], %g1 4000e700: c2 00 40 13 ld [ %g1 + %l3 ], %g1 4000e704: 80 a0 00 01 cmp %g0, %g1 4000e708: 82 40 3f ff addx %g0, -1, %g1 4000e70c: a2 0c 40 01 and %l1, %g1, %l1 for ( ; ; ) { are_all_null = TRUE; for ( index=1 ; index <= _POSIX_Keys_Information.maximum ; index++ ) { 4000e710: c2 15 60 10 lduh [ %l5 + 0x10 ], %g1 4000e714: 80 a4 00 01 cmp %l0, %g1 4000e718: 08 bf ff e5 bleu 4000e6ac <_POSIX_Keys_Run_destructors+0x38> 4000e71c: 85 2c 20 02 sll %l0, 2, %g2 are_all_null = FALSE; } } } if ( are_all_null == TRUE ) 4000e720: 80 a4 60 01 cmp %l1, 1 4000e724: 02 80 00 05 be 4000e738 <_POSIX_Keys_Run_destructors+0xc4> 4000e728: a4 04 a0 01 inc %l2 * loop. It seems rude to unnecessarily lock up a system. * * Reference: 17.1.1.2 P1003.1c/Draft 10, p. 163, line 99. */ if ( iterations >= PTHREAD_DESTRUCTOR_ITERATIONS ) 4000e72c: 80 a4 a0 04 cmp %l2, 4 4000e730: 12 bf ff dd bne 4000e6a4 <_POSIX_Keys_Run_destructors+0x30> 4000e734: a0 10 20 01 mov 1, %l0 4000e738: 81 c7 e0 08 ret 4000e73c: 81 e8 00 00 restore 400137e8 <_POSIX_Message_queue_Create_support>: const char *name_arg, int pshared, struct mq_attr *attr_ptr, POSIX_Message_queue_Control **message_queue ) { 400137e8: 9d e3 bf 88 save %sp, -120, %sp CORE_message_queue_Attributes *the_mq_attr; struct mq_attr attr; char *name; size_t n; n = strnlen( name_arg, NAME_MAX ); 400137ec: 92 10 20 ff mov 0xff, %o1 400137f0: 40 00 11 a9 call 40017e94 400137f4: 90 10 00 18 mov %i0, %o0 const char *name_arg, int pshared, struct mq_attr *attr_ptr, POSIX_Message_queue_Control **message_queue ) { 400137f8: a8 10 00 18 mov %i0, %l4 CORE_message_queue_Attributes *the_mq_attr; struct mq_attr attr; char *name; size_t n; n = strnlen( name_arg, NAME_MAX ); 400137fc: a0 10 00 08 mov %o0, %l0 const char *name_arg, int pshared, struct mq_attr *attr_ptr, POSIX_Message_queue_Control **message_queue ) { 40013800: 92 10 00 1a mov %i2, %o1 struct mq_attr attr; char *name; size_t n; n = strnlen( name_arg, NAME_MAX ); if ( n > NAME_MAX ) 40013804: 80 a2 20 ff cmp %o0, 0xff 40013808: 18 80 00 62 bgu 40013990 <_POSIX_Message_queue_Create_support+0x1a8> 4001380c: b0 10 20 5b mov 0x5b, %i0 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40013810: 05 10 00 97 sethi %hi(0x40025c00), %g2 40013814: c2 00 a0 40 ld [ %g2 + 0x40 ], %g1 ! 40025c40 <_Thread_Dispatch_disable_level> 40013818: 82 00 60 01 inc %g1 4001381c: c2 20 a0 40 st %g1, [ %g2 + 0x40 ] * but were not compared against any existing implementation for * compatibility. See README.mqueue for an example program we * think will print out the defaults. Report anything you find with it. */ if ( attr_ptr == NULL ) { 40013820: a4 10 20 10 mov 0x10, %l2 40013824: 80 a6 a0 00 cmp %i2, 0 40013828: 02 80 00 14 be 40013878 <_POSIX_Message_queue_Create_support+0x90> 4001382c: a2 10 20 0a mov 0xa, %l1 attr.mq_maxmsg = 10; attr.mq_msgsize = 16; } else { if ( attr_ptr->mq_maxmsg <= 0 ){ 40013830: c2 06 a0 04 ld [ %i2 + 4 ], %g1 40013834: 80 a0 60 00 cmp %g1, 0 40013838: 04 80 00 06 ble 40013850 <_POSIX_Message_queue_Create_support+0x68> 4001383c: 01 00 00 00 nop _Thread_Enable_dispatch(); rtems_set_errno_and_return_minus_one( EINVAL ); } if ( attr_ptr->mq_msgsize <= 0 ){ 40013840: c2 06 a0 08 ld [ %i2 + 8 ], %g1 40013844: 80 a0 60 00 cmp %g1, 0 40013848: 34 80 00 08 bg,a 40013868 <_POSIX_Message_queue_Create_support+0x80> 4001384c: 90 07 bf e8 add %fp, -24, %o0 _Thread_Enable_dispatch(); 40013850: 7f ff ff d9 call 400137b4 <_Thread_Enable_dispatch> 40013854: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( EINVAL ); 40013858: 40 00 0a 46 call 40016170 <__errno> 4001385c: 01 00 00 00 nop 40013860: 10 80 00 3a b 40013948 <_POSIX_Message_queue_Create_support+0x160> 40013864: 82 10 20 16 mov 0x16, %g1 ! 16 } attr = *attr_ptr; 40013868: 40 00 0c 28 call 40016908 4001386c: 94 10 20 10 mov 0x10, %o2 40013870: e4 07 bf f0 ld [ %fp + -16 ], %l2 40013874: e2 07 bf ec ld [ %fp + -20 ], %l1 */ RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control *_POSIX_Message_queue_Allocate( void ) { return (POSIX_Message_queue_Control *) 40013878: 27 10 00 98 sethi %hi(0x40026000), %l3 4001387c: 7f ff ec c2 call 4000eb84 <_Objects_Allocate> 40013880: 90 14 e0 58 or %l3, 0x58, %o0 ! 40026058 <_POSIX_Message_queue_Information> rtems_set_errno_and_return_minus_one( ENFILE ); } #endif the_mq = _POSIX_Message_queue_Allocate(); if ( !the_mq ) { 40013884: b4 92 20 00 orcc %o0, 0, %i2 40013888: 32 80 00 08 bne,a 400138a8 <_POSIX_Message_queue_Create_support+0xc0> 4001388c: 82 10 20 01 mov 1, %g1 _Thread_Enable_dispatch(); 40013890: 7f ff ff c9 call 400137b4 <_Thread_Enable_dispatch> <== NOT EXECUTED 40013894: 01 00 00 00 nop <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENFILE ); 40013898: 40 00 0a 36 call 40016170 <__errno> <== NOT EXECUTED 4001389c: 01 00 00 00 nop <== NOT EXECUTED 400138a0: 10 80 00 2a b 40013948 <_POSIX_Message_queue_Create_support+0x160> <== NOT EXECUTED 400138a4: 82 10 20 17 mov 0x17, %g1 ! 17 <== NOT EXECUTED } the_mq->process_shared = pshared; 400138a8: f2 26 a0 10 st %i1, [ %i2 + 0x10 ] 400138ac: 92 10 00 10 mov %l0, %o1 the_mq->named = TRUE; the_mq->open_count = 1; the_mq->linked = TRUE; 400138b0: c2 26 a0 18 st %g1, [ %i2 + 0x18 ] _Thread_Enable_dispatch(); rtems_set_errno_and_return_minus_one( ENFILE ); } the_mq->process_shared = pshared; the_mq->named = TRUE; 400138b4: c2 26 a0 14 st %g1, [ %i2 + 0x14 ] the_mq->open_count = 1; 400138b8: c2 26 a0 1c st %g1, [ %i2 + 0x1c ] 400138bc: 21 10 00 97 sethi %hi(0x40025c00), %l0 400138c0: 7f ff eb 59 call 4000e624 <_Heap_Allocate> 400138c4: 90 14 20 8c or %l0, 0x8c, %o0 ! 40025c8c <_Workspace_Area> * Make a copy of the user's string for name just in case it was * dynamically constructed. */ name = _Workspace_Allocate(n); if (!name) { 400138c8: b2 92 20 00 orcc %o0, 0, %i1 400138cc: 12 80 00 0a bne 400138f4 <_POSIX_Message_queue_Create_support+0x10c> 400138d0: 01 00 00 00 nop _POSIX_Message_queue_Free( the_mq ); 400138d4: 7f ff ff b1 call 40013798 <_POSIX_Message_queue_Free> <== NOT EXECUTED 400138d8: 90 10 00 1a mov %i2, %o0 <== NOT EXECUTED _Thread_Enable_dispatch(); 400138dc: 7f ff ff b6 call 400137b4 <_Thread_Enable_dispatch> <== NOT EXECUTED 400138e0: 01 00 00 00 nop <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOMEM ); 400138e4: 40 00 0a 23 call 40016170 <__errno> <== NOT EXECUTED 400138e8: 01 00 00 00 nop <== NOT EXECUTED 400138ec: 10 80 00 17 b 40013948 <_POSIX_Message_queue_Create_support+0x160> <== NOT EXECUTED 400138f0: 82 10 20 0c mov 0xc, %g1 ! c <== NOT EXECUTED } strcpy( name, name_arg ); 400138f4: 40 00 0f 03 call 40017500 400138f8: 92 10 00 14 mov %l4, %o1 */ the_mq_attr = &the_mq->Message_queue.Attributes; the_mq_attr->discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO; if ( ! _CORE_message_queue_Initialize( 400138fc: 94 10 00 11 mov %l1, %o2 * Note that thread blocking discipline should be based on the * current scheduling policy. */ the_mq_attr = &the_mq->Message_queue.Attributes; the_mq_attr->discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO; 40013900: c0 26 a0 60 clr [ %i2 + 0x60 ] if ( ! _CORE_message_queue_Initialize( 40013904: 96 10 00 12 mov %l2, %o3 40013908: 90 06 a0 20 add %i2, 0x20, %o0 4001390c: 40 00 03 56 call 40014664 <_CORE_message_queue_Initialize> 40013910: 92 06 a0 60 add %i2, 0x60, %o1 40013914: 80 a2 20 00 cmp %o0, 0 40013918: 12 80 00 0f bne 40013954 <_POSIX_Message_queue_Create_support+0x16c> 4001391c: 90 14 e0 58 or %l3, 0x58, %o0 #if 0 && defined(RTEMS_MULTIPROCESSING) if ( pshared == PTHREAD_PROCESS_SHARED ) _Objects_MP_Close( &_POSIX_Message_queue_Information, the_mq->Object.id ); #endif _POSIX_Message_queue_Free( the_mq ); 40013920: 7f ff ff 9e call 40013798 <_POSIX_Message_queue_Free> <== NOT EXECUTED 40013924: 90 10 00 1a mov %i2, %o0 <== NOT EXECUTED RTEMS_INLINE_ROUTINE boolean _Workspace_Free( void *block ) { return _Heap_Free( &_Workspace_Area, block ); 40013928: 92 10 00 19 mov %i1, %o1 <== NOT EXECUTED 4001392c: 7f ff eb 65 call 4000e6c0 <_Heap_Free> <== NOT EXECUTED 40013930: 90 14 20 8c or %l0, 0x8c, %o0 <== NOT EXECUTED _Workspace_Free(name); _Thread_Enable_dispatch(); 40013934: 7f ff ff a0 call 400137b4 <_Thread_Enable_dispatch> <== NOT EXECUTED 40013938: 01 00 00 00 nop <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOSPC ); 4001393c: 40 00 0a 0d call 40016170 <__errno> <== NOT EXECUTED 40013940: 01 00 00 00 nop <== NOT EXECUTED 40013944: 82 10 20 1c mov 0x1c, %g1 ! 1c <== NOT EXECUTED 40013948: c2 22 00 00 st %g1, [ %o0 ] 4001394c: 81 c7 e0 08 ret 40013950: 91 e8 3f ff restore %g0, -1, %o0 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, the_object ); 40013954: c2 06 a0 08 ld [ %i2 + 8 ], %g1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40013958: c6 12 20 10 lduh [ %o0 + 0x10 ], %g3 4001395c: 05 00 00 3f sethi %hi(0xfc00), %g2 40013960: 84 10 a3 ff or %g2, 0x3ff, %g2 ! ffff 40013964: 82 08 40 02 and %g1, %g2, %g1 40013968: 80 a0 40 03 cmp %g1, %g3 4001396c: 38 80 00 06 bgu,a 40013984 <_POSIX_Message_queue_Create_support+0x19c> 40013970: f4 26 c0 00 st %i2, [ %i3 ] <== NOT EXECUTED information->local_table[ index ] = the_object; 40013974: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 40013978: 83 28 60 02 sll %g1, 2, %g1 4001397c: f4 20 80 01 st %i2, [ %g2 + %g1 ] &_POSIX_Message_queue_Information, &the_mq->Object, (char *) name ); *message_queue = the_mq; 40013980: f4 26 c0 00 st %i2, [ %i3 ] if ( information->is_string ) /* _Objects_Copy_name_string( name, the_object->name ); */ the_object->name = name; else /* _Objects_Copy_name_raw( name, the_object->name, information->name_length ); */ the_object->name = name; 40013984: f2 26 a0 0c st %i1, [ %i2 + 0xc ] (char *) name, 0 /* Not used */ ); #endif _Thread_Enable_dispatch(); 40013988: 7f ff ff 8b call 400137b4 <_Thread_Enable_dispatch> 4001398c: b0 10 20 00 clr %i0 return 0; } 40013990: 81 c7 e0 08 ret 40013994: 81 e8 00 00 restore 4000a7d0 <_POSIX_Message_queue_Delete>: */ void _POSIX_Message_queue_Delete( POSIX_Message_queue_Control *the_mq ) { 4000a7d0: 9d e3 bf 98 save %sp, -104, %sp if ( !the_mq->linked && !the_mq->open_count ) { 4000a7d4: c2 06 20 18 ld [ %i0 + 0x18 ], %g1 4000a7d8: 80 a0 60 00 cmp %g1, 0 4000a7dc: 12 80 00 1f bne 4000a858 <_POSIX_Message_queue_Delete+0x88> 4000a7e0: b2 10 00 18 mov %i0, %i1 4000a7e4: c2 06 20 1c ld [ %i0 + 0x1c ], %g1 4000a7e8: 80 a0 60 00 cmp %g1, 0 4000a7ec: 12 80 00 1b bne 4000a858 <_POSIX_Message_queue_Delete+0x88> 4000a7f0: 01 00 00 00 nop /* the name memory may have been freed by unlink. */ if ( the_mq->Object.name ) 4000a7f4: d2 06 20 0c ld [ %i0 + 0xc ], %o1 4000a7f8: 80 a2 60 00 cmp %o1, 0 4000a7fc: 02 80 00 04 be 4000a80c <_POSIX_Message_queue_Delete+0x3c> 4000a800: 11 10 00 97 sethi %hi(0x40025c00), %o0 RTEMS_INLINE_ROUTINE boolean _Workspace_Free( void *block ) { return _Heap_Free( &_Workspace_Area, block ); 4000a804: 40 00 0f af call 4000e6c0 <_Heap_Free> <== NOT EXECUTED 4000a808: 90 12 20 8c or %o0, 0x8c, %o0 ! 40025c8c <_Workspace_Area> <== NOT EXECUTED Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 4000a80c: 03 10 00 98 sethi %hi(0x40026000), %g1 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); 4000a810: c6 06 60 08 ld [ %i1 + 8 ], %g3 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 4000a814: b0 10 60 58 or %g1, 0x58, %i0 4000a818: c4 16 20 10 lduh [ %i0 + 0x10 ], %g2 4000a81c: 03 00 00 3f sethi %hi(0xfc00), %g1 4000a820: 82 10 63 ff or %g1, 0x3ff, %g1 ! ffff 4000a824: 82 08 c0 01 and %g3, %g1, %g1 4000a828: 80 a0 40 02 cmp %g1, %g2 4000a82c: 18 80 00 05 bgu 4000a840 <_POSIX_Message_queue_Delete+0x70> 4000a830: 90 06 60 20 add %i1, 0x20, %o0 information->local_table[ index ] = the_object; 4000a834: c4 06 20 20 ld [ %i0 + 0x20 ], %g2 4000a838: 83 28 60 02 sll %g1, 2, %g1 4000a83c: c0 20 80 01 clr [ %g2 + %g1 ] _Workspace_Free( the_mq->Object.name ); _Objects_Close( &_POSIX_Message_queue_Information, &the_mq->Object ); _CORE_message_queue_Close( 4000a840: 92 10 20 00 clr %o1 4000a844: 94 10 20 05 mov 5, %o2 4000a848: 40 00 0d 7b call 4000de34 <_CORE_message_queue_Close> 4000a84c: c0 26 60 0c clr [ %i1 + 0xc ] RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Free ( POSIX_Message_queue_Control *the_mq ) { _Objects_Free( &_POSIX_Message_queue_Information, &the_mq->Object ); 4000a850: 40 00 11 cf call 4000ef8c <_Objects_Free> 4000a854: 81 e8 00 00 restore 4000a858: 81 c7 e0 08 ret 4000a85c: 81 e8 00 00 restore 40013798 <_POSIX_Message_queue_Free>: */ RTEMS_INLINE_ROUTINE void _POSIX_Message_queue_Free ( POSIX_Message_queue_Control *the_mq ) { 40013798: 92 10 00 08 mov %o0, %o1 <== NOT EXECUTED _Objects_Free( &_POSIX_Message_queue_Information, &the_mq->Object ); 4001379c: 11 10 00 98 sethi %hi(0x40026000), %o0 <== NOT EXECUTED 400137a0: 90 12 20 58 or %o0, 0x58, %o0 ! 40026058 <_POSIX_Message_queue_Information> <== NOT EXECUTED 400137a4: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 400137a8: 7f ff ed f9 call 4000ef8c <_Objects_Free> <== NOT EXECUTED 400137ac: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED 400137b0: 01 00 00 00 nop 4000ad00 <_POSIX_Message_queue_Receive_support>: size_t msg_len, unsigned int *msg_prio, boolean wait, Watchdog_Interval timeout ) { 4000ad00: 9d e3 bf 90 save %sp, -112, %sp RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control_fd *_POSIX_Message_queue_Get_fd ( Objects_Id id, Objects_Locations *location ) { return (POSIX_Message_queue_Control_fd *) 4000ad04: 11 10 00 98 sethi %hi(0x40026000), %o0 4000ad08: 94 07 bf f4 add %fp, -12, %o2 4000ad0c: 90 12 22 10 or %o0, 0x210, %o0 4000ad10: 40 00 10 e1 call 4000f094 <_Objects_Get> 4000ad14: 92 10 00 18 mov %i0, %o1 Objects_Locations location; size_t length_out; boolean do_wait; the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location ); switch ( location ) { 4000ad18: c2 07 bf f4 ld [ %fp + -12 ], %g1 size_t msg_len, unsigned int *msg_prio, boolean wait, Watchdog_Interval timeout ) { 4000ad1c: 94 10 00 19 mov %i1, %o2 Objects_Locations location; size_t length_out; boolean do_wait; the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location ); switch ( location ) { 4000ad20: 80 a0 60 01 cmp %g1, 1 4000ad24: 02 80 00 09 be 4000ad48 <_POSIX_Message_queue_Receive_support+0x48> 4000ad28: 9a 10 00 1d mov %i5, %o5 4000ad2c: 80 a0 60 01 cmp %g1, 1 4000ad30: 2a 80 00 0c bcs,a 4000ad60 <_POSIX_Message_queue_Receive_support+0x60> 4000ad34: c4 02 20 14 ld [ %o0 + 0x14 ], %g2 4000ad38: 80 a0 60 02 cmp %g1, 2 4000ad3c: 12 80 00 3f bne 4000ae38 <_POSIX_Message_queue_Receive_support+0x138> 4000ad40: 01 00 00 00 nop 4000ad44: 30 80 00 0d b,a 4000ad78 <_POSIX_Message_queue_Receive_support+0x78> case OBJECTS_ERROR: rtems_set_errno_and_return_minus_one( EBADF ); case OBJECTS_REMOTE: _Thread_Dispatch(); 4000ad48: 40 00 15 88 call 40010368 <_Thread_Dispatch> <== NOT EXECUTED 4000ad4c: 01 00 00 00 nop <== NOT EXECUTED return POSIX_MP_NOT_IMPLEMENTED(); 4000ad50: 40 00 05 c9 call 4000c474 <== NOT EXECUTED 4000ad54: 01 00 00 00 nop <== NOT EXECUTED _Thread_Executing->Wait.return_code ) ); } return POSIX_BOTTOM_REACHED(); } 4000ad58: 81 c7 e0 08 ret <== NOT EXECUTED 4000ad5c: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED case OBJECTS_REMOTE: _Thread_Dispatch(); return POSIX_MP_NOT_IMPLEMENTED(); rtems_set_errno_and_return_minus_one( EINVAL ); case OBJECTS_LOCAL: if ( (the_mq_fd->oflag & O_ACCMODE) == O_WRONLY ) { 4000ad60: 82 08 a0 03 and %g2, 3, %g1 4000ad64: 80 a0 60 01 cmp %g1, 1 4000ad68: 32 80 00 0a bne,a 4000ad90 <_POSIX_Message_queue_Receive_support+0x90> 4000ad6c: d0 02 20 10 ld [ %o0 + 0x10 ], %o0 _Thread_Enable_dispatch(); 4000ad70: 7f ff ff d7 call 4000accc <_Thread_Enable_dispatch> 4000ad74: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( EBADF ); 4000ad78: 40 00 2c fe call 40016170 <__errno> 4000ad7c: 01 00 00 00 nop 4000ad80: 82 10 20 09 mov 9, %g1 ! 9 4000ad84: c2 22 00 00 st %g1, [ %o0 ] 4000ad88: 10 80 00 2e b 4000ae40 <_POSIX_Message_queue_Receive_support+0x140> 4000ad8c: 90 10 3f ff mov -1, %o0 } the_mq = the_mq_fd->Queue; if ( msg_len < the_mq->Message_queue.maximum_message_size ) { 4000ad90: c2 02 20 6c ld [ %o0 + 0x6c ], %g1 4000ad94: 80 a6 80 01 cmp %i2, %g1 4000ad98: 1a 80 00 08 bcc 4000adb8 <_POSIX_Message_queue_Receive_support+0xb8> 4000ad9c: 80 a7 20 00 cmp %i4, 0 _Thread_Enable_dispatch(); 4000ada0: 7f ff ff cb call 4000accc <_Thread_Enable_dispatch> 4000ada4: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( EMSGSIZE ); 4000ada8: 40 00 2c f2 call 40016170 <__errno> 4000adac: 01 00 00 00 nop 4000adb0: 10 bf ff f5 b 4000ad84 <_POSIX_Message_queue_Receive_support+0x84> 4000adb4: 82 10 20 7a mov 0x7a, %g1 ! 7a length_out = -1; /* * A timed receive with a bad time will do a poll regardless. */ if ( wait ) 4000adb8: 02 80 00 05 be 4000adcc <_POSIX_Message_queue_Receive_support+0xcc> 4000adbc: 98 10 20 00 clr %o4 do_wait = (the_mq_fd->oflag & O_NONBLOCK) ? FALSE : TRUE; 4000adc0: 83 30 a0 0e srl %g2, 0xe, %g1 4000adc4: 82 18 60 01 xor %g1, 1, %g1 4000adc8: 98 08 60 01 and %g1, 1, %o4 /* * Now if something goes wrong, we return a "length" of -1 * to indicate an error. */ length_out = -1; 4000adcc: 82 10 3f ff mov -1, %g1 do_wait = wait; /* * Now perform the actual message receive */ _CORE_message_queue_Seize( 4000add0: 90 02 20 20 add %o0, 0x20, %o0 4000add4: 92 10 00 18 mov %i0, %o1 4000add8: 96 07 bf f0 add %fp, -16, %o3 4000addc: 40 00 0c 43 call 4000dee8 <_CORE_message_queue_Seize> 4000ade0: c2 27 bf f0 st %g1, [ %fp + -16 ] &length_out, do_wait, timeout ); _Thread_Enable_dispatch(); 4000ade4: 7f ff ff ba call 4000accc <_Thread_Enable_dispatch> 4000ade8: 3b 10 00 97 sethi %hi(0x40025c00), %i5 *msg_prio = 4000adec: c4 07 61 1c ld [ %i5 + 0x11c ], %g2 ! 40025d1c <_Thread_Executing> 4000adf0: c2 00 a0 24 ld [ %g2 + 0x24 ], %g1 _POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count); if ( !_Thread_Executing->Wait.return_code ) 4000adf4: c6 00 a0 34 ld [ %g2 + 0x34 ], %g3 do_wait, timeout ); _Thread_Enable_dispatch(); *msg_prio = 4000adf8: 85 38 60 1f sra %g1, 0x1f, %g2 4000adfc: 82 18 80 01 xor %g2, %g1, %g1 4000ae00: 82 20 40 02 sub %g1, %g2, %g1 _POSIX_Message_queue_Priority_from_core(_Thread_Executing->Wait.count); if ( !_Thread_Executing->Wait.return_code ) 4000ae04: 80 a0 e0 00 cmp %g3, 0 4000ae08: 12 80 00 04 bne 4000ae18 <_POSIX_Message_queue_Receive_support+0x118> 4000ae0c: c2 26 c0 00 st %g1, [ %i3 ] return length_out; 4000ae10: 10 80 00 0c b 4000ae40 <_POSIX_Message_queue_Receive_support+0x140> 4000ae14: d0 07 bf f0 ld [ %fp + -16 ], %o0 rtems_set_errno_and_return_minus_one( 4000ae18: 40 00 2c d6 call 40016170 <__errno> 4000ae1c: 01 00 00 00 nop 4000ae20: c2 07 61 1c ld [ %i5 + 0x11c ], %g1 4000ae24: a0 10 00 08 mov %o0, %l0 4000ae28: 40 00 00 d2 call 4000b170 <_POSIX_Message_queue_Translate_core_message_queue_return_code> 4000ae2c: d0 00 60 34 ld [ %g1 + 0x34 ], %o0 4000ae30: 10 bf ff d6 b 4000ad88 <_POSIX_Message_queue_Receive_support+0x88> 4000ae34: d0 24 00 00 st %o0, [ %l0 ] _POSIX_Message_queue_Translate_core_message_queue_return_code( _Thread_Executing->Wait.return_code ) ); } return POSIX_BOTTOM_REACHED(); 4000ae38: 40 00 05 85 call 4000c44c <== NOT EXECUTED 4000ae3c: 01 00 00 00 nop <== NOT EXECUTED } 4000ae40: b0 10 00 08 mov %o0, %i0 4000ae44: 81 c7 e0 08 ret 4000ae48: 81 e8 00 00 restore 4000ae98 <_POSIX_Message_queue_Send_support>: size_t msg_len, uint32_t msg_prio, boolean wait, Watchdog_Interval timeout ) { 4000ae98: 9d e3 bf 88 save %sp, -120, %sp /* * Validate the priority. * XXX - Do not validate msg_prio is not less than 0. */ if ( msg_prio > MQ_PRIO_MAX ) 4000ae9c: 80 a6 e0 20 cmp %i3, 0x20 4000aea0: 28 80 00 06 bleu,a 4000aeb8 <_POSIX_Message_queue_Send_support+0x20> 4000aea4: 11 10 00 98 sethi %hi(0x40026000), %o0 rtems_set_errno_and_return_minus_one( EINVAL ); 4000aea8: 40 00 2c b2 call 40016170 <__errno> 4000aeac: 01 00 00 00 nop 4000aeb0: 10 80 00 12 b 4000aef8 <_POSIX_Message_queue_Send_support+0x60> 4000aeb4: 82 10 20 16 mov 0x16, %g1 ! 16 4000aeb8: 92 10 00 18 mov %i0, %o1 4000aebc: 90 12 22 10 or %o0, 0x210, %o0 4000aec0: 40 00 10 75 call 4000f094 <_Objects_Get> 4000aec4: 94 07 bf f4 add %fp, -12, %o2 the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location ); switch ( location ) { 4000aec8: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000aecc: 80 a0 60 01 cmp %g1, 1 4000aed0: 02 80 00 0d be 4000af04 <_POSIX_Message_queue_Send_support+0x6c> 4000aed4: 01 00 00 00 nop 4000aed8: 2a 80 00 11 bcs,a 4000af1c <_POSIX_Message_queue_Send_support+0x84> 4000aedc: c4 02 20 14 ld [ %o0 + 0x14 ], %g2 4000aee0: 80 a0 60 02 cmp %g1, 2 4000aee4: 12 80 00 35 bne 4000afb8 <_POSIX_Message_queue_Send_support+0x120> 4000aee8: 01 00 00 00 nop case OBJECTS_ERROR: rtems_set_errno_and_return_minus_one( EBADF ); 4000aeec: 40 00 2c a1 call 40016170 <__errno> 4000aef0: 01 00 00 00 nop 4000aef4: 82 10 20 09 mov 9, %g1 ! 9 4000aef8: c2 22 00 00 st %g1, [ %o0 ] 4000aefc: 10 80 00 31 b 4000afc0 <_POSIX_Message_queue_Send_support+0x128> 4000af00: 90 10 3f ff mov -1, %o0 case OBJECTS_REMOTE: _Thread_Dispatch(); 4000af04: 40 00 15 19 call 40010368 <_Thread_Dispatch> <== NOT EXECUTED 4000af08: 01 00 00 00 nop <== NOT EXECUTED return POSIX_MP_NOT_IMPLEMENTED(); 4000af0c: 40 00 05 5a call 4000c474 <== NOT EXECUTED 4000af10: 01 00 00 00 nop <== NOT EXECUTED msg_status ) ); } return POSIX_BOTTOM_REACHED(); } 4000af14: 81 c7 e0 08 ret <== NOT EXECUTED 4000af18: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED _Thread_Dispatch(); return POSIX_MP_NOT_IMPLEMENTED(); rtems_set_errno_and_return_minus_one( EINVAL ); case OBJECTS_LOCAL: if ( (the_mq_fd->oflag & O_ACCMODE) == O_RDONLY ) { 4000af1c: 80 88 a0 03 btst 3, %g2 4000af20: 12 80 00 05 bne 4000af34 <_POSIX_Message_queue_Send_support+0x9c> 4000af24: 80 a7 20 00 cmp %i4, 0 _Thread_Enable_dispatch(); 4000af28: 7f ff ff cf call 4000ae64 <_Thread_Enable_dispatch> 4000af2c: 01 00 00 00 nop 4000af30: 30 bf ff ef b,a 4000aeec <_POSIX_Message_queue_Send_support+0x54> rtems_set_errno_and_return_minus_one( EBADF ); } the_mq = the_mq_fd->Queue; 4000af34: d0 02 20 10 ld [ %o0 + 0x10 ], %o0 /* * A timed receive with a bad time will do a poll regardless. */ if ( wait ) 4000af38: 02 80 00 05 be 4000af4c <_POSIX_Message_queue_Send_support+0xb4> 4000af3c: 82 10 20 00 clr %g1 do_wait = (the_mq_fd->oflag & O_NONBLOCK) ? FALSE : TRUE; 4000af40: 83 30 a0 0e srl %g2, 0xe, %g1 4000af44: 82 18 60 01 xor %g1, 1, %g1 4000af48: 82 08 60 01 and %g1, 1, %g1 do_wait = wait; /* * Now perform the actual message receive */ msg_status = _CORE_message_queue_Submit( 4000af4c: c2 23 a0 5c st %g1, [ %sp + 0x5c ] 4000af50: fa 23 a0 60 st %i5, [ %sp + 0x60 ] 4000af54: 92 10 00 19 mov %i1, %o1 4000af58: 94 10 00 1a mov %i2, %o2 4000af5c: 96 10 00 18 mov %i0, %o3 4000af60: 9a 20 00 1b neg %i3, %o5 4000af64: 98 10 20 00 clr %o4 4000af68: 40 00 0c 2d call 4000e01c <_CORE_message_queue_Submit> 4000af6c: 90 02 20 20 add %o0, 0x20, %o0 _POSIX_Message_queue_Priority_to_core( msg_prio ), do_wait, timeout /* no timeout */ ); _Thread_Enable_dispatch(); 4000af70: 7f ff ff bd call 4000ae64 <_Thread_Enable_dispatch> 4000af74: ba 10 00 08 mov %o0, %i5 * after it wakes up. The returned status is correct for * non-blocking operations but if we blocked, then we need * to look at the status in our TCB. */ if ( msg_status == CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED_WAIT ) 4000af78: 80 a7 60 07 cmp %i5, 7 4000af7c: 12 80 00 06 bne 4000af94 <_POSIX_Message_queue_Send_support+0xfc> 4000af80: 80 a7 60 00 cmp %i5, 0 msg_status = _Thread_Executing->Wait.return_code; 4000af84: 03 10 00 97 sethi %hi(0x40025c00), %g1 4000af88: c2 00 61 1c ld [ %g1 + 0x11c ], %g1 ! 40025d1c <_Thread_Executing> 4000af8c: fa 00 60 34 ld [ %g1 + 0x34 ], %i5 if ( !msg_status ) 4000af90: 80 a7 60 00 cmp %i5, 0 4000af94: 02 80 00 0b be 4000afc0 <_POSIX_Message_queue_Send_support+0x128> 4000af98: 90 10 20 00 clr %o0 return msg_status; rtems_set_errno_and_return_minus_one( 4000af9c: 40 00 2c 75 call 40016170 <__errno> 4000afa0: 01 00 00 00 nop 4000afa4: a0 10 00 08 mov %o0, %l0 4000afa8: 40 00 00 72 call 4000b170 <_POSIX_Message_queue_Translate_core_message_queue_return_code> 4000afac: 90 10 00 1d mov %i5, %o0 4000afb0: 10 bf ff d3 b 4000aefc <_POSIX_Message_queue_Send_support+0x64> 4000afb4: d0 24 00 00 st %o0, [ %l0 ] _POSIX_Message_queue_Translate_core_message_queue_return_code( msg_status ) ); } return POSIX_BOTTOM_REACHED(); 4000afb8: 40 00 05 25 call 4000c44c <== NOT EXECUTED 4000afbc: 01 00 00 00 nop <== NOT EXECUTED } 4000afc0: b0 10 00 08 mov %o0, %i0 4000afc4: 81 c7 e0 08 ret 4000afc8: 81 e8 00 00 restore 4000b170 <_POSIX_Message_queue_Translate_core_message_queue_return_code>: */ int _POSIX_Message_queue_Translate_core_message_queue_return_code( uint32_t the_message_queue_status ) { 4000b170: 9d e3 bf 98 save %sp, -104, %sp switch ( the_message_queue_status ) { 4000b174: 80 a6 20 03 cmp %i0, 3 4000b178: 02 80 00 1c be 4000b1e8 <_POSIX_Message_queue_Translate_core_message_queue_return_code+0x78> 4000b17c: 94 10 00 18 mov %i0, %o2 4000b180: 80 a6 20 03 cmp %i0, 3 4000b184: 18 80 00 0a bgu 4000b1ac <_POSIX_Message_queue_Translate_core_message_queue_return_code+0x3c> 4000b188: 80 a6 20 05 cmp %i0, 5 4000b18c: 80 a6 20 01 cmp %i0, 1 4000b190: 02 80 00 1e be 4000b208 <_POSIX_Message_queue_Translate_core_message_queue_return_code+0x98> 4000b194: b0 10 20 7a mov 0x7a, %i0 4000b198: 80 a2 a0 01 cmp %o2, 1 4000b19c: 38 80 00 1b bgu,a 4000b208 <_POSIX_Message_queue_Translate_core_message_queue_return_code+0x98> 4000b1a0: b0 10 20 0b mov 0xb, %i0 4000b1a4: 81 c7 e0 08 ret <== NOT EXECUTED 4000b1a8: 91 e8 20 00 restore %g0, 0, %o0 <== NOT EXECUTED 4000b1ac: 02 80 00 11 be 4000b1f0 <_POSIX_Message_queue_Translate_core_message_queue_return_code+0x80> 4000b1b0: 80 a6 20 05 cmp %i0, 5 4000b1b4: 2a 80 00 15 bcs,a 4000b208 <_POSIX_Message_queue_Translate_core_message_queue_return_code+0x98> 4000b1b8: b0 10 20 0b mov 0xb, %i0 4000b1bc: 80 a6 20 06 cmp %i0, 6 4000b1c0: 02 80 00 08 be 4000b1e0 <_POSIX_Message_queue_Translate_core_message_queue_return_code+0x70> 4000b1c4: 03 00 44 44 sethi %hi(0x1111000), %g1 4000b1c8: 82 10 61 11 or %g1, 0x111, %g1 ! 1111111 <== NOT EXECUTED 4000b1cc: 80 a6 00 01 cmp %i0, %g1 <== NOT EXECUTED 4000b1d0: 12 80 00 0a bne 4000b1f8 <_POSIX_Message_queue_Translate_core_message_queue_return_code+0x88> <== NOT EXECUTED 4000b1d4: 90 10 20 02 mov 2, %o0 <== NOT EXECUTED 4000b1d8: 81 c7 e0 08 ret <== NOT EXECUTED 4000b1dc: 91 e8 20 58 restore %g0, 0x58, %o0 <== NOT EXECUTED 4000b1e0: 81 c7 e0 08 ret 4000b1e4: 91 e8 20 74 restore %g0, 0x74, %o0 /* * Bad message size */ case CORE_MESSAGE_QUEUE_STATUS_INVALID_SIZE: return EMSGSIZE; 4000b1e8: 81 c7 e0 08 ret <== NOT EXECUTED 4000b1ec: 91 e8 20 0c restore %g0, 0xc, %o0 <== NOT EXECUTED /* * Out of message buffers to queue pending message */ case CORE_MESSAGE_QUEUE_STATUS_UNSATISFIED: return ENOMEM; 4000b1f0: 81 c7 e0 08 ret 4000b1f4: 91 e8 20 09 restore %g0, 9, %o0 * RTEMS POSIX API implementation does not support multiprocessing. */ case THREAD_STATUS_PROXY_BLOCKING: return ENOSYS; } _Internal_error_Occurred( 4000b1f8: 40 00 0e 36 call 4000ead0 <_Internal_error_Occurred> <== NOT EXECUTED 4000b1fc: 92 10 20 01 mov 1, %o1 <== NOT EXECUTED INTERNAL_ERROR_POSIX_API, TRUE, the_message_queue_status ); return POSIX_BOTTOM_REACHED(); 4000b200: 40 00 04 93 call 4000c44c <== NOT EXECUTED 4000b204: 81 e8 00 00 restore <== NOT EXECUTED } 4000b208: 81 c7 e0 08 ret 4000b20c: 81 e8 00 00 restore 400103b8 <_POSIX_Mutex_From_core_mutex_status>: */ int _POSIX_Mutex_From_core_mutex_status( CORE_mutex_Status status ) { 400103b8: 9d e3 bf 98 save %sp, -104, %sp switch ( status ) { 400103bc: 80 a6 20 06 cmp %i0, 6 400103c0: 18 80 00 14 bgu 40010410 <_POSIX_Mutex_From_core_mutex_status+0x58> 400103c4: 92 10 20 32 mov 0x32, %o1 400103c8: 83 2e 20 02 sll %i0, 2, %g1 400103cc: 05 10 00 40 sethi %hi(0x40010000), %g2 400103d0: 84 10 a3 9c or %g2, 0x39c, %g2 ! 4001039c <_POSIX_Message_queue_Manager_initialization+0x58> 400103d4: c2 00 80 01 ld [ %g2 + %g1 ], %g1 400103d8: 81 c0 40 00 jmp %g1 400103dc: 01 00 00 00 nop 400103e0: 81 c7 e0 08 ret 400103e4: 91 e8 20 74 restore %g0, 0x74, %o0 400103e8: 81 c7 e0 08 ret 400103ec: 91 e8 20 16 restore %g0, 0x16, %o0 400103f0: 81 c7 e0 08 ret 400103f4: 91 e8 20 00 restore %g0, 0, %o0 case CORE_MUTEX_STATUS_SUCCESSFUL: return 0; 400103f8: 81 c7 e0 08 ret 400103fc: 91 e8 20 10 restore %g0, 0x10, %o0 case CORE_MUTEX_STATUS_UNSATISFIED_NOWAIT: return EBUSY; 40010400: 81 c7 e0 08 ret 40010404: 91 e8 20 2d restore %g0, 0x2d, %o0 case CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED: return EDEADLK; 40010408: 81 c7 e0 08 ret 4001040c: 91 e8 20 01 restore %g0, 1, %o0 case CORE_MUTEX_STATUS_CEILING_VIOLATED: return EINVAL; default: break; } assert( 0 ); 40010410: 11 10 00 65 sethi %hi(0x40019400), %o0 <== NOT EXECUTED 40010414: 15 10 00 5e sethi %hi(0x40017800), %o2 <== NOT EXECUTED 40010418: 90 12 21 78 or %o0, 0x178, %o0 <== NOT EXECUTED 4001041c: 94 12 a3 f0 or %o2, 0x3f0, %o2 <== NOT EXECUTED 40010420: 7f ff d2 18 call 40004c80 <__assert> <== NOT EXECUTED 40010424: b0 10 20 00 clr %i0 <== NOT EXECUTED return 0; } 40010428: 81 c7 e0 08 ret <== NOT EXECUTED 4001042c: 81 e8 00 00 restore <== NOT EXECUTED 40008290 <_POSIX_Mutex_Lock_support>: int _POSIX_Mutex_Lock_support( pthread_mutex_t *mutex, boolean blocking, Watchdog_Interval timeout ) { 40008290: 9d e3 bf 90 save %sp, -112, %sp ISR_Level *level ) { Objects_Id *id = (Objects_Id *)mutex; ___POSIX_Mutex_Get_support( id, location ); 40008294: 80 a6 20 00 cmp %i0, 0 40008298: 32 80 00 05 bne,a 400082ac <_POSIX_Mutex_Lock_support+0x1c> 4000829c: c2 06 00 00 ld [ %i0 ], %g1 400082a0: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED 400082a4: 10 80 00 15 b 400082f8 <_POSIX_Mutex_Lock_support+0x68> <== NOT EXECUTED 400082a8: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED 400082ac: 80 a0 7f ff cmp %g1, -1 400082b0: 32 80 00 0c bne,a 400082e0 <_POSIX_Mutex_Lock_support+0x50> 400082b4: d2 06 00 00 ld [ %i0 ], %o1 400082b8: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 400082bc: 7f ff ff 8f call 400080f8 <== NOT EXECUTED 400082c0: 92 10 20 00 clr %o1 <== NOT EXECUTED 400082c4: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400082c8: 22 80 00 06 be,a 400082e0 <_POSIX_Mutex_Lock_support+0x50> <== NOT EXECUTED 400082cc: d2 06 00 00 ld [ %i0 ], %o1 <== NOT EXECUTED 400082d0: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED 400082d4: b0 10 20 00 clr %i0 <== NOT EXECUTED 400082d8: 10 80 00 08 b 400082f8 <_POSIX_Mutex_Lock_support+0x68> <== NOT EXECUTED 400082dc: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED return (POSIX_Mutex_Control *) 400082e0: 11 10 00 6d sethi %hi(0x4001b400), %o0 400082e4: 94 07 bf f4 add %fp, -12, %o2 400082e8: 90 12 21 24 or %o0, 0x124, %o0 400082ec: 40 00 0e 1e call 4000bb64 <_Objects_Get_isr_disable> 400082f0: 96 07 bf f0 add %fp, -16, %o3 400082f4: b0 10 00 08 mov %o0, %i0 register POSIX_Mutex_Control *the_mutex; Objects_Locations location; ISR_Level level; the_mutex = _POSIX_Mutex_Get_interrupt_disable( mutex, &location, &level ); switch ( location ) { 400082f8: c2 07 bf f4 ld [ %fp + -12 ], %g1 400082fc: 80 a0 60 00 cmp %g1, 0 40008300: 22 80 00 06 be,a 40008318 <_POSIX_Mutex_Lock_support+0x88> 40008304: 03 10 00 6c sethi %hi(0x4001b000), %g1 40008308: 80 a0 60 02 cmp %g1, 2 4000830c: 08 80 00 86 bleu 40008524 <_POSIX_Mutex_Lock_support+0x294> 40008310: 90 10 20 16 mov 0x16, %o0 40008314: 30 80 00 82 b,a 4000851c <_POSIX_Mutex_Lock_support+0x28c> <== NOT EXECUTED ); #endif case OBJECTS_ERROR: return EINVAL; case OBJECTS_LOCAL: _CORE_mutex_Seize( 40008318: c2 00 60 c0 ld [ %g1 + 0xc0 ], %g1 4000831c: 80 a0 60 00 cmp %g1, 0 40008320: 02 80 00 0e be 40008358 <_POSIX_Mutex_Lock_support+0xc8> 40008324: 03 10 00 6c sethi %hi(0x4001b000), %g1 40008328: 80 a6 60 00 cmp %i1, 0 <== NOT EXECUTED 4000832c: 02 80 00 0c be 4000835c <_POSIX_Mutex_Lock_support+0xcc> <== NOT EXECUTED 40008330: c4 00 61 9c ld [ %g1 + 0x19c ], %g2 <== NOT EXECUTED 40008334: 03 10 00 6c sethi %hi(0x4001b000), %g1 <== NOT EXECUTED 40008338: c2 00 62 a0 ld [ %g1 + 0x2a0 ], %g1 ! 4001b2a0 <_System_state_Current> <== NOT EXECUTED 4000833c: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 40008340: 08 80 00 05 bleu 40008354 <_POSIX_Mutex_Lock_support+0xc4> <== NOT EXECUTED 40008344: 90 10 20 00 clr %o0 <== NOT EXECUTED 40008348: 92 10 20 00 clr %o1 <== NOT EXECUTED 4000834c: 40 00 0c b3 call 4000b618 <_Internal_error_Occurred> <== NOT EXECUTED 40008350: 94 10 20 12 mov 0x12, %o2 <== NOT EXECUTED Thread_Control *executing; ISR_Level level = *level_p; /* disabled when you get here */ executing = _Thread_Executing; 40008354: 03 10 00 6c sethi %hi(0x4001b000), %g1 <== NOT EXECUTED 40008358: c4 00 61 9c ld [ %g1 + 0x19c ], %g2 ! 4001b19c <_Thread_Executing> CORE_mutex_Control *the_mutex, ISR_Level *level_p ) { Thread_Control *executing; ISR_Level level = *level_p; 4000835c: d0 07 bf f0 ld [ %fp + -16 ], %o0 /* disabled when you get here */ executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; 40008360: c0 20 a0 34 clr [ %g2 + 0x34 ] if ( !_CORE_mutex_Is_locked( the_mutex ) ) { 40008364: c2 06 20 64 ld [ %i0 + 0x64 ], %g1 40008368: 80 a0 60 00 cmp %g1, 0 4000836c: 22 80 00 3a be,a 40008454 <_POSIX_Mutex_Lock_support+0x1c4> 40008370: c2 06 20 70 ld [ %i0 + 0x70 ], %g1 the_mutex->lock = CORE_MUTEX_LOCKED; 40008374: c0 26 20 64 clr [ %i0 + 0x64 ] the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 40008378: c2 00 a0 08 ld [ %g2 + 8 ], %g1 */ RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_inherit_priority( CORE_mutex_Attributes *the_attribute ) { return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT; 4000837c: c6 06 20 5c ld [ %i0 + 0x5c ], %g3 executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 40008380: c2 26 20 74 st %g1, [ %i0 + 0x74 ] executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; 40008384: c4 26 20 70 st %g2, [ %i0 + 0x70 ] the_mutex->holder_id = executing->Object.id; the_mutex->nest_count = 1; 40008388: 82 10 20 01 mov 1, %g1 if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || 4000838c: 80 a0 e0 02 cmp %g3, 2 40008390: 02 80 00 05 be 400083a4 <_POSIX_Mutex_Lock_support+0x114> 40008394: c2 26 20 68 st %g1, [ %i0 + 0x68 ] 40008398: 80 a0 e0 03 cmp %g3, 3 4000839c: 32 80 00 06 bne,a 400083b4 <_POSIX_Mutex_Lock_support+0x124> 400083a0: c2 06 20 5c ld [ %i0 + 0x5c ], %g1 _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) executing->resource_count++; 400083a4: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 400083a8: 82 00 60 01 inc %g1 400083ac: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) { 400083b0: c2 06 20 5c ld [ %i0 + 0x5c ], %g1 400083b4: 80 a0 60 03 cmp %g1, 3 400083b8: 22 80 00 03 be,a 400083c4 <_POSIX_Mutex_Lock_support+0x134> 400083bc: c6 06 20 60 ld [ %i0 + 0x60 ], %g3 _ISR_Enable( level ); 400083c0: 30 80 00 35 b,a 40008494 <_POSIX_Mutex_Lock_support+0x204> { Priority_Control ceiling; Priority_Control current; ceiling = the_mutex->Attributes.priority_ceiling; current = executing->current_priority; 400083c4: c2 00 a0 14 ld [ %g2 + 0x14 ], %g1 if ( current == ceiling ) { 400083c8: 80 a0 40 03 cmp %g1, %g3 400083cc: 12 80 00 03 bne 400083d8 <_POSIX_Mutex_Lock_support+0x148> 400083d0: 01 00 00 00 nop _ISR_Enable( level ); 400083d4: 30 80 00 30 b,a 40008494 <_POSIX_Mutex_Lock_support+0x204> <== NOT EXECUTED return 0; } if ( current > ceiling ) { 400083d8: 08 80 00 17 bleu 40008434 <_POSIX_Mutex_Lock_support+0x1a4> 400083dc: 82 10 20 06 mov 6, %g1 400083e0: 21 10 00 6c sethi %hi(0x4001b000), %l0 400083e4: c2 04 20 c0 ld [ %l0 + 0xc0 ], %g1 ! 4001b0c0 <_Thread_Dispatch_disable_level> 400083e8: 82 00 60 01 inc %g1 400083ec: c2 24 20 c0 st %g1, [ %l0 + 0xc0 ] _Thread_Disable_dispatch(); _ISR_Enable( level ); 400083f0: 7f ff ee 86 call 40003e08 400083f4: 01 00 00 00 nop _Thread_Change_priority( 400083f8: d2 06 20 60 ld [ %i0 + 0x60 ], %o1 400083fc: d0 06 20 70 ld [ %i0 + 0x70 ], %o0 40008400: 40 00 11 80 call 4000ca00 <_Thread_Change_priority> 40008404: 94 10 20 00 clr %o2 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40008408: c2 04 20 c0 ld [ %l0 + 0xc0 ], %g1 4000840c: 82 00 7f ff add %g1, -1, %g1 40008410: c2 24 20 c0 st %g1, [ %l0 + 0xc0 ] 40008414: c2 04 20 c0 ld [ %l0 + 0xc0 ], %g1 40008418: 80 a0 60 00 cmp %g1, 0 4000841c: 32 80 00 3b bne,a 40008508 <_POSIX_Mutex_Lock_support+0x278> 40008420: 03 10 00 6c sethi %hi(0x4001b000), %g1 <== NOT EXECUTED _Thread_Dispatch(); 40008424: 40 00 12 a3 call 4000ceb0 <_Thread_Dispatch> 40008428: 01 00 00 00 nop the_mutex->Object.id, blocking, timeout, level ); return _POSIX_Mutex_From_core_mutex_status( 4000842c: 10 80 00 37 b 40008508 <_POSIX_Mutex_Lock_support+0x278> 40008430: 03 10 00 6c sethi %hi(0x4001b000), %g1 ); _Thread_Enable_dispatch(); return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; 40008434: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] the_mutex->lock = CORE_MUTEX_UNLOCKED; 40008438: 82 10 20 01 mov 1, %g1 the_mutex->nest_count = 0; /* undo locking above */ 4000843c: c0 26 20 68 clr [ %i0 + 0x68 ] _Thread_Enable_dispatch(); return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; the_mutex->lock = CORE_MUTEX_UNLOCKED; 40008440: c2 26 20 64 st %g1, [ %i0 + 0x64 ] the_mutex->nest_count = 0; /* undo locking above */ executing->resource_count--; /* undo locking above */ 40008444: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 40008448: 82 00 7f ff add %g1, -1, %g1 4000844c: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] _ISR_Enable( level ); 40008450: 30 80 00 11 b,a 40008494 <_POSIX_Mutex_Lock_support+0x204> /* * At this point, we know the mutex was not available. If this thread * is the thread that has locked the mutex, let's see if we are allowed * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { 40008454: 80 a0 40 02 cmp %g1, %g2 40008458: 12 80 00 13 bne 400084a4 <_POSIX_Mutex_Lock_support+0x214> 4000845c: 80 a6 60 00 cmp %i1, 0 switch ( the_mutex->Attributes.lock_nesting_behavior ) { 40008460: c2 06 20 54 ld [ %i0 + 0x54 ], %g1 40008464: 80 a0 60 00 cmp %g1, 0 40008468: 22 80 00 07 be,a 40008484 <_POSIX_Mutex_Lock_support+0x1f4> 4000846c: c2 06 20 68 ld [ %i0 + 0x68 ], %g1 <== NOT EXECUTED 40008470: 80 a0 60 01 cmp %g1, 1 40008474: 12 80 00 0c bne 400084a4 <_POSIX_Mutex_Lock_support+0x214> 40008478: 80 a6 60 00 cmp %i1, 0 case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; _ISR_Enable( level ); return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 4000847c: 10 80 00 05 b 40008490 <_POSIX_Mutex_Lock_support+0x200> 40008480: 82 10 20 02 mov 2, %g1 * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { switch ( the_mutex->Attributes.lock_nesting_behavior ) { case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; 40008484: 82 00 60 01 inc %g1 <== NOT EXECUTED 40008488: c2 26 20 68 st %g1, [ %i0 + 0x68 ] <== NOT EXECUTED _ISR_Enable( level ); 4000848c: 30 80 00 02 b,a 40008494 <_POSIX_Mutex_Lock_support+0x204> <== NOT EXECUTED return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 40008490: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] _ISR_Enable( level ); 40008494: 7f ff ee 5d call 40003e08 40008498: 01 00 00 00 nop 4000849c: 10 80 00 1b b 40008508 <_POSIX_Mutex_Lock_support+0x278> 400084a0: 03 10 00 6c sethi %hi(0x4001b000), %g1 ); #endif case OBJECTS_ERROR: return EINVAL; case OBJECTS_LOCAL: _CORE_mutex_Seize( 400084a4: 12 80 00 08 bne 400084c4 <_POSIX_Mutex_Lock_support+0x234> 400084a8: 21 10 00 6c sethi %hi(0x4001b000), %l0 400084ac: 7f ff ee 57 call 40003e08 400084b0: d0 07 bf f0 ld [ %fp + -16 ], %o0 400084b4: c4 04 21 9c ld [ %l0 + 0x19c ], %g2 400084b8: 82 10 20 01 mov 1, %g1 400084bc: 10 80 00 12 b 40008504 <_POSIX_Mutex_Lock_support+0x274> 400084c0: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] 400084c4: c8 04 21 9c ld [ %l0 + 0x19c ], %g4 400084c8: c6 06 20 08 ld [ %i0 + 8 ], %g3 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 400084cc: 05 10 00 6c sethi %hi(0x4001b000), %g2 400084d0: c2 00 a0 c0 ld [ %g2 + 0xc0 ], %g1 ! 4001b0c0 <_Thread_Dispatch_disable_level> 400084d4: c6 21 20 20 st %g3, [ %g4 + 0x20 ] 400084d8: 82 00 60 01 inc %g1 400084dc: a0 06 20 14 add %i0, 0x14, %l0 400084e0: c2 20 a0 c0 st %g1, [ %g2 + 0xc0 ] 400084e4: e0 21 20 44 st %l0, [ %g4 + 0x44 ] RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section ( Thread_queue_Control *the_thread_queue ) { the_thread_queue->sync_state = THREAD_QUEUE_NOTHING_HAPPENED; 400084e8: 82 10 20 01 mov 1, %g1 400084ec: c2 26 20 44 st %g1, [ %i0 + 0x44 ] 400084f0: 7f ff ee 46 call 40003e08 400084f4: d0 07 bf f0 ld [ %fp + -16 ], %o0 400084f8: 90 10 00 10 mov %l0, %o0 400084fc: 40 00 09 ff call 4000acf8 <_CORE_mutex_Seize_interrupt_blocking> 40008500: 92 10 00 1a mov %i2, %o1 the_mutex->Object.id, blocking, timeout, level ); return _POSIX_Mutex_From_core_mutex_status( 40008504: 03 10 00 6c sethi %hi(0x4001b000), %g1 40008508: c2 00 61 9c ld [ %g1 + 0x19c ], %g1 ! 4001b19c <_Thread_Executing> 4000850c: 40 00 1f ab call 400103b8 <_POSIX_Mutex_From_core_mutex_status> 40008510: d0 00 60 34 ld [ %g1 + 0x34 ], %o0 (CORE_mutex_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); } 40008514: 81 c7 e0 08 ret 40008518: 91 e8 00 08 restore %g0, %o0, %o0 ); return _POSIX_Mutex_From_core_mutex_status( (CORE_mutex_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); 4000851c: 40 00 03 4b call 40009248 <== NOT EXECUTED 40008520: 01 00 00 00 nop <== NOT EXECUTED } 40008524: b0 10 00 08 mov %o0, %i0 40008528: 81 c7 e0 08 ret 4000852c: 81 e8 00 00 restore 400070bc <_POSIX_RWLock_Translate_core_RWLock_return_code>: int _POSIX_RWLock_Translate_core_RWLock_return_code( CORE_RWLock_Status the_rwlock_status ) { if ( the_rwlock_status <= CORE_RWLOCK_STATUS_LAST ) 400070bc: 80 a2 20 03 cmp %o0, 3 400070c0: 08 80 00 05 bleu 400070d4 <_POSIX_RWLock_Translate_core_RWLock_return_code+0x18> 400070c4: 85 2a 20 02 sll %o0, 2, %g2 return _POSIX_RWLock_Return_codes[the_rwlock_status]; return POSIX_BOTTOM_REACHED(); 400070c8: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 400070cc: 40 00 02 68 call 40007a6c <== NOT EXECUTED 400070d0: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED } 400070d4: 03 10 00 6e sethi %hi(0x4001b800), %g1 400070d8: 82 10 61 4c or %g1, 0x14c, %g1 ! 4001b94c <_POSIX_RWLock_Return_codes> 400070dc: 81 c3 e0 08 retl 400070e0: d0 00 40 02 ld [ %g1 + %g2 ], %o0 4000f480 <_POSIX_Semaphore_Create_support>: const char *name, int pshared, unsigned int value, POSIX_Semaphore_Control **the_sem ) { 4000f480: 9d e3 bf 98 save %sp, -104, %sp rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 4000f484: 03 10 00 80 sethi %hi(0x40020000), %g1 4000f488: c4 00 62 30 ld [ %g1 + 0x230 ], %g2 ! 40020230 <_Thread_Dispatch_disable_level> 4000f48c: 84 00 a0 01 inc %g2 4000f490: c4 20 62 30 st %g2, [ %g1 + 0x230 ] char *name_p = (char *)name; _Thread_Disable_dispatch(); /* Sharing semaphores among processes is not currently supported */ if (pshared != 0) { 4000f494: 80 a6 60 00 cmp %i1, 0 4000f498: 02 80 00 08 be 4000f4b8 <_POSIX_Semaphore_Create_support+0x38> 4000f49c: 80 a6 20 00 cmp %i0, 0 _Thread_Enable_dispatch(); 4000f4a0: 7f ff ff eb call 4000f44c <_Thread_Enable_dispatch> 4000f4a4: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( ENOSYS ); 4000f4a8: 40 00 08 93 call 400116f4 <__errno> 4000f4ac: 01 00 00 00 nop 4000f4b0: 10 80 00 19 b 4000f514 <_POSIX_Semaphore_Create_support+0x94> 4000f4b4: 82 10 20 58 mov 0x58, %g1 ! 58 } if ( name ) { 4000f4b8: 02 80 00 0d be 4000f4ec <_POSIX_Semaphore_Create_support+0x6c> 4000f4bc: 11 10 00 81 sethi %hi(0x40020400), %o0 if( strlen(name) > PATH_MAX ) { 4000f4c0: 40 00 0f 05 call 400130d4 4000f4c4: 90 10 00 18 mov %i0, %o0 4000f4c8: 80 a2 20 ff cmp %o0, 0xff 4000f4cc: 28 80 00 08 bleu,a 4000f4ec <_POSIX_Semaphore_Create_support+0x6c> 4000f4d0: 11 10 00 81 sethi %hi(0x40020400), %o0 _Thread_Enable_dispatch(); 4000f4d4: 7f ff ff de call 4000f44c <_Thread_Enable_dispatch> <== NOT EXECUTED 4000f4d8: 01 00 00 00 nop <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENAMETOOLONG ); 4000f4dc: 40 00 08 86 call 400116f4 <__errno> <== NOT EXECUTED 4000f4e0: 01 00 00 00 nop <== NOT EXECUTED 4000f4e4: 10 80 00 0c b 4000f514 <_POSIX_Semaphore_Create_support+0x94> <== NOT EXECUTED 4000f4e8: 82 10 20 5b mov 0x5b, %g1 ! 5b <== NOT EXECUTED * _POSIX_Semaphore_Allocate */ RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Allocate( void ) { return (POSIX_Semaphore_Control *) 4000f4ec: 7f ff ea d8 call 4000a04c <_Objects_Allocate> 4000f4f0: 90 12 21 b0 or %o0, 0x1b0, %o0 } } the_semaphore = _POSIX_Semaphore_Allocate(); if ( !the_semaphore ) { 4000f4f4: b2 92 20 00 orcc %o0, 0, %i1 4000f4f8: 12 80 00 0a bne 4000f520 <_POSIX_Semaphore_Create_support+0xa0> 4000f4fc: 80 a6 20 00 cmp %i0, 0 _Thread_Enable_dispatch(); 4000f500: 7f ff ff d3 call 4000f44c <_Thread_Enable_dispatch> 4000f504: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( ENOSPC ); 4000f508: 40 00 08 7b call 400116f4 <__errno> 4000f50c: 01 00 00 00 nop 4000f510: 82 10 20 1c mov 0x1c, %g1 ! 1c 4000f514: c2 22 00 00 st %g1, [ %o0 ] 4000f518: 81 c7 e0 08 ret 4000f51c: 91 e8 3f ff restore %g0, -1, %o0 } #endif the_semaphore->process_shared = pshared; if ( name ) { 4000f520: 02 80 00 07 be 4000f53c <_POSIX_Semaphore_Create_support+0xbc> 4000f524: c0 26 60 10 clr [ %i1 + 0x10 ] the_semaphore->named = TRUE; 4000f528: 82 10 20 01 mov 1, %g1 the_semaphore->open_count = 1; the_semaphore->linked = TRUE; 4000f52c: c2 26 60 18 st %g1, [ %i1 + 0x18 ] #endif the_semaphore->process_shared = pshared; if ( name ) { the_semaphore->named = TRUE; 4000f530: c2 26 60 14 st %g1, [ %i1 + 0x14 ] the_semaphore->open_count = 1; 4000f534: 10 80 00 05 b 4000f548 <_POSIX_Semaphore_Create_support+0xc8> 4000f538: c2 26 60 1c st %g1, [ %i1 + 0x1c ] the_semaphore->linked = TRUE; } else { the_semaphore->named = FALSE; 4000f53c: c0 26 60 14 clr [ %i1 + 0x14 ] the_semaphore->open_count = 0; 4000f540: c0 26 60 1c clr [ %i1 + 0x1c ] the_semaphore->linked = FALSE; 4000f544: c0 26 60 18 clr [ %i1 + 0x18 ] /* * This effectively disables limit checking. */ the_sem_attr->maximum_count = 0xFFFFFFFF; 4000f548: 82 10 3f ff mov -1, %g1 * be derived from the current scheduling policy. One * thing is certain, no matter what we decide, it won't be * the same as all other POSIX implementations. :) */ the_sem_attr->discipline = CORE_SEMAPHORE_DISCIPLINES_FIFO; 4000f54c: c0 26 60 64 clr [ %i1 + 0x64 ] /* * This effectively disables limit checking. */ the_sem_attr->maximum_count = 0xFFFFFFFF; 4000f550: c2 26 60 60 st %g1, [ %i1 + 0x60 ] _CORE_semaphore_Initialize( &the_semaphore->Semaphore, the_sem_attr, value ); 4000f554: 94 10 00 1a mov %i2, %o2 4000f558: 90 06 60 20 add %i1, 0x20, %o0 4000f55c: 7f ff e8 f6 call 40009934 <_CORE_semaphore_Initialize> 4000f560: 92 06 60 60 add %i1, 0x60, %o1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 4000f564: 03 10 00 81 sethi %hi(0x40020400), %g1 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, the_object ); 4000f568: c6 06 60 08 ld [ %i1 + 8 ], %g3 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 4000f56c: 88 10 61 b0 or %g1, 0x1b0, %g4 4000f570: c4 11 20 10 lduh [ %g4 + 0x10 ], %g2 4000f574: 03 00 00 3f sethi %hi(0xfc00), %g1 4000f578: 82 10 63 ff or %g1, 0x3ff, %g1 ! ffff 4000f57c: 82 08 c0 01 and %g3, %g1, %g1 4000f580: 80 a0 40 02 cmp %g1, %g2 4000f584: 38 80 00 06 bgu,a 4000f59c <_POSIX_Semaphore_Create_support+0x11c> 4000f588: f0 26 60 0c st %i0, [ %i1 + 0xc ] <== NOT EXECUTED information->local_table[ index ] = the_object; 4000f58c: c4 01 20 20 ld [ %g4 + 0x20 ], %g2 4000f590: 83 28 60 02 sll %g1, 2, %g1 4000f594: f2 20 80 01 st %i1, [ %g2 + %g1 ] if ( information->is_string ) /* _Objects_Copy_name_string( name, the_object->name ); */ the_object->name = name; else /* _Objects_Copy_name_raw( name, the_object->name, information->name_length ); */ the_object->name = name; 4000f598: f0 26 60 0c st %i0, [ %i1 + 0xc ] * Make the semaphore available for use. */ _Objects_Open(&_POSIX_Semaphore_Information, &the_semaphore->Object, name_p); *the_sem = the_semaphore; 4000f59c: f2 26 c0 00 st %i1, [ %i3 ] name_p, 0 /* proxy id - Not used */ ); #endif _Thread_Enable_dispatch(); 4000f5a0: 7f ff ff ab call 4000f44c <_Thread_Enable_dispatch> 4000f5a4: b0 10 20 00 clr %i0 return 0; } 4000f5a8: 81 c7 e0 08 ret 4000f5ac: 81 e8 00 00 restore 4000f6a0 <_POSIX_Semaphore_Wait_support>: int _POSIX_Semaphore_Wait_support( sem_t *sem, boolean blocking, Watchdog_Interval timeout ) { 4000f6a0: 9d e3 bf 90 save %sp, -112, %sp RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Get ( sem_t *id, Objects_Locations *location ) { return (POSIX_Semaphore_Control *) 4000f6a4: d2 06 00 00 ld [ %i0 ], %o1 4000f6a8: 94 07 bf f4 add %fp, -12, %o2 4000f6ac: 11 10 00 81 sethi %hi(0x40020400), %o0 4000f6b0: 7f ff eb ab call 4000a55c <_Objects_Get> 4000f6b4: 90 12 21 b0 or %o0, 0x1b0, %o0 ! 400205b0 <_POSIX_Semaphore_Information> POSIX_Semaphore_Control *the_semaphore; Objects_Locations location; the_semaphore = _POSIX_Semaphore_Get( sem, &location ); switch ( location ) { 4000f6b8: c2 07 bf f4 ld [ %fp + -12 ], %g1 int _POSIX_Semaphore_Wait_support( sem_t *sem, boolean blocking, Watchdog_Interval timeout ) { 4000f6bc: 94 10 00 19 mov %i1, %o2 POSIX_Semaphore_Control *the_semaphore; Objects_Locations location; the_semaphore = _POSIX_Semaphore_Get( sem, &location ); switch ( location ) { 4000f6c0: 80 a0 60 01 cmp %g1, 1 4000f6c4: 02 80 00 09 be 4000f6e8 <_POSIX_Semaphore_Wait_support+0x48> 4000f6c8: 96 10 00 1a mov %i2, %o3 4000f6cc: 80 a0 60 01 cmp %g1, 1 4000f6d0: 2a 80 00 0c bcs,a 4000f700 <_POSIX_Semaphore_Wait_support+0x60> 4000f6d4: d2 02 20 08 ld [ %o0 + 8 ], %o1 4000f6d8: 80 a0 60 02 cmp %g1, 2 4000f6dc: 12 80 00 29 bne 4000f780 <_POSIX_Semaphore_Wait_support+0xe0> 4000f6e0: 01 00 00 00 nop 4000f6e4: 30 80 00 03 b,a 4000f6f0 <_POSIX_Semaphore_Wait_support+0x50> case OBJECTS_ERROR: rtems_set_errno_and_return_minus_one( EINVAL ); case OBJECTS_REMOTE: _Thread_Dispatch(); 4000f6e8: 7f ff f0 52 call 4000b830 <_Thread_Dispatch> <== NOT EXECUTED 4000f6ec: 01 00 00 00 nop <== NOT EXECUTED rtems_set_errno_and_return_minus_one( EINVAL ); 4000f6f0: 40 00 08 01 call 400116f4 <__errno> 4000f6f4: 01 00 00 00 nop 4000f6f8: 10 80 00 1f b 4000f774 <_POSIX_Semaphore_Wait_support+0xd4> 4000f6fc: 82 10 20 16 mov 0x16, %g1 ! 16 case OBJECTS_LOCAL: _CORE_semaphore_Seize( 4000f700: 40 00 01 78 call 4000fce0 <_CORE_semaphore_Seize> 4000f704: 90 02 20 20 add %o0, 0x20, %o0 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 4000f708: 03 10 00 80 sethi %hi(0x40020000), %g1 4000f70c: c4 00 62 30 ld [ %g1 + 0x230 ], %g2 ! 40020230 <_Thread_Dispatch_disable_level> 4000f710: 84 00 bf ff add %g2, -1, %g2 4000f714: c4 20 62 30 st %g2, [ %g1 + 0x230 ] 4000f718: c2 00 62 30 ld [ %g1 + 0x230 ], %g1 4000f71c: 80 a0 60 00 cmp %g1, 0 4000f720: 12 80 00 05 bne 4000f734 <_POSIX_Semaphore_Wait_support+0x94> 4000f724: 03 10 00 80 sethi %hi(0x40020000), %g1 _Thread_Dispatch(); 4000f728: 7f ff f0 42 call 4000b830 <_Thread_Dispatch> 4000f72c: 01 00 00 00 nop the_semaphore->Object.id, blocking, timeout ); _Thread_Enable_dispatch(); switch ( _Thread_Executing->Wait.return_code ) { 4000f730: 03 10 00 80 sethi %hi(0x40020000), %g1 4000f734: c2 00 63 0c ld [ %g1 + 0x30c ], %g1 ! 4002030c <_Thread_Executing> 4000f738: c2 00 60 34 ld [ %g1 + 0x34 ], %g1 4000f73c: 80 a0 60 02 cmp %g1, 2 4000f740: 02 80 00 06 be 4000f758 <_POSIX_Semaphore_Wait_support+0xb8> 4000f744: 80 a0 60 03 cmp %g1, 3 4000f748: 02 80 00 08 be 4000f768 <_POSIX_Semaphore_Wait_support+0xc8> 4000f74c: 80 a0 60 01 cmp %g1, 1 4000f750: 12 80 00 0c bne 4000f780 <_POSIX_Semaphore_Wait_support+0xe0> 4000f754: 01 00 00 00 nop case CORE_SEMAPHORE_STATUS_SUCCESSFUL: break; case CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT: rtems_set_errno_and_return_minus_one( EAGAIN ); case CORE_SEMAPHORE_WAS_DELETED: rtems_set_errno_and_return_minus_one( EAGAIN ); 4000f758: 40 00 07 e7 call 400116f4 <__errno> 4000f75c: 01 00 00 00 nop 4000f760: 10 80 00 05 b 4000f774 <_POSIX_Semaphore_Wait_support+0xd4> 4000f764: 82 10 20 0b mov 0xb, %g1 ! b case CORE_SEMAPHORE_TIMEOUT: rtems_set_errno_and_return_minus_one( ETIMEDOUT ); 4000f768: 40 00 07 e3 call 400116f4 <__errno> 4000f76c: 01 00 00 00 nop 4000f770: 82 10 20 74 mov 0x74, %g1 ! 74 4000f774: c2 22 00 00 st %g1, [ %o0 ] 4000f778: 81 c7 e0 08 ret 4000f77c: 91 e8 3f ff restore %g0, -1, %o0 */ break; } } return 0; } 4000f780: 81 c7 e0 08 ret 4000f784: 91 e8 20 00 restore %g0, 0, %o0 40006588 <_POSIX_Spinlock_Translate_core_spinlock_return_code>: int _POSIX_Spinlock_Translate_core_spinlock_return_code( CORE_spinlock_Status the_spinlock_status ) { if ( the_spinlock_status <= CORE_SPINLOCK_STATUS_LAST ) 40006588: 80 a2 20 06 cmp %o0, 6 4000658c: 08 80 00 05 bleu 400065a0 <_POSIX_Spinlock_Translate_core_spinlock_return_code+0x18> 40006590: 85 2a 20 02 sll %o0, 2, %g2 return _POSIX_Spinlock_Return_codes[the_spinlock_status]; return POSIX_BOTTOM_REACHED(); 40006594: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 40006598: 40 00 00 6d call 4000674c <== NOT EXECUTED 4000659c: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED } 400065a0: 03 10 00 4d sethi %hi(0x40013400), %g1 400065a4: 82 10 61 cc or %g1, 0x1cc, %g1 ! 400135cc <_POSIX_Spinlock_Return_codes> 400065a8: 81 c3 e0 08 retl 400065ac: d0 00 40 02 ld [ %g1 + %g2 ], %o0 4000cfdc <_POSIX_Threads_Create_extension>: boolean _POSIX_Threads_Create_extension( Thread_Control *executing, Thread_Control *created ) { 4000cfdc: 9d e3 bf 98 save %sp, -104, %sp RTEMS_INLINE_ROUTINE void *_Workspace_Allocate( size_t size ) { return _Heap_Allocate( &_Workspace_Area, size ); 4000cfe0: 11 10 00 6b sethi %hi(0x4001ac00), %o0 4000cfe4: 92 10 20 e4 mov 0xe4, %o1 4000cfe8: 90 12 22 1c or %o0, 0x21c, %o0 4000cfec: 7f ff ea f0 call 40007bac <_Heap_Allocate> 4000cff0: b0 10 20 00 clr %i0 POSIX_API_Control *api; POSIX_API_Control *executing_api; api = _Workspace_Allocate( sizeof( POSIX_API_Control ) ); if ( !api ) 4000cff4: a2 92 20 00 orcc %o0, 0, %l1 4000cff8: 02 80 00 39 be 4000d0dc <_POSIX_Threads_Create_extension+0x100> 4000cffc: 94 10 20 38 mov 0x38, %o2 return FALSE; created->API_Extensions[ THREAD_API_POSIX ] = api; 4000d000: e2 26 61 70 st %l1, [ %i1 + 0x170 ] /* XXX check all fields are touched */ api->Attributes = _POSIX_Threads_Default_attributes; 4000d004: 21 10 00 64 sethi %hi(0x40019000), %l0 4000d008: a0 14 20 e8 or %l0, 0xe8, %l0 ! 400190e8 <_POSIX_Threads_Default_attributes> 4000d00c: 40 00 09 c1 call 4000f710 4000d010: 92 10 00 10 mov %l0, %o1 api->detachstate = _POSIX_Threads_Default_attributes.detachstate; 4000d014: c2 04 20 34 ld [ %l0 + 0x34 ], %g1 api->schedpolicy = _POSIX_Threads_Default_attributes.schedpolicy; 4000d018: c4 04 20 14 ld [ %l0 + 0x14 ], %g2 created->API_Extensions[ THREAD_API_POSIX ] = api; /* XXX check all fields are touched */ api->Attributes = _POSIX_Threads_Default_attributes; api->detachstate = _POSIX_Threads_Default_attributes.detachstate; 4000d01c: c2 24 60 38 st %g1, [ %l1 + 0x38 ] api->schedpolicy = _POSIX_Threads_Default_attributes.schedpolicy; 4000d020: c4 24 60 7c st %g2, [ %l1 + 0x7c ] api->schedparam = _POSIX_Threads_Default_attributes.schedparam; 4000d024: 92 04 20 18 add %l0, 0x18, %o1 4000d028: 90 04 60 80 add %l1, 0x80, %o0 4000d02c: 40 00 09 b9 call 4000f710 4000d030: 94 10 20 18 mov 0x18, %o2 api->schedparam.sched_priority = 4000d034: c4 06 60 14 ld [ %i1 + 0x14 ], %g2 4000d038: 82 10 20 ff mov 0xff, %g1 4000d03c: 82 20 40 02 sub %g1, %g2, %g1 * If the thread is not a posix thread, then all posix signals are blocked * by default. */ /* XXX use signal constants */ api->signals_pending = 0; 4000d040: c0 24 60 c8 clr [ %l1 + 0xc8 ] /* XXX check all fields are touched */ api->Attributes = _POSIX_Threads_Default_attributes; api->detachstate = _POSIX_Threads_Default_attributes.detachstate; api->schedpolicy = _POSIX_Threads_Default_attributes.schedpolicy; api->schedparam = _POSIX_Threads_Default_attributes.schedparam; api->schedparam.sched_priority = 4000d044: c2 24 60 80 st %g1, [ %l1 + 0x80 ] * by default. */ /* XXX use signal constants */ api->signals_pending = 0; if ( _Objects_Get_API( created->Object.id ) == OBJECTS_POSIX_API && 4000d048: c6 06 60 08 ld [ %i1 + 8 ], %g3 */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 4000d04c: 82 04 60 dc add %l1, 0xdc, %g1 _POSIX_Priority_From_core( created->current_priority ); /* * POSIX 1003.1 1996, 18.2.2.2 */ api->cancelation_requested = 0; 4000d050: c0 24 60 d4 clr [ %l1 + 0xd4 ] 4000d054: c2 24 60 d8 st %g1, [ %l1 + 0xd8 ] api->cancelability_state = PTHREAD_CANCEL_ENABLE; 4000d058: c0 24 60 cc clr [ %l1 + 0xcc ] the_chain->permanent_null = NULL; the_chain->last = _Chain_Head(the_chain); 4000d05c: 82 04 60 d8 add %l1, 0xd8, %g1 api->cancelability_type = PTHREAD_CANCEL_DEFERRED; 4000d060: c0 24 60 d0 clr [ %l1 + 0xd0 ] 4000d064: c2 24 60 e0 st %g1, [ %l1 + 0xe0 ] * by default. */ /* XXX use signal constants */ api->signals_pending = 0; if ( _Objects_Get_API( created->Object.id ) == OBJECTS_POSIX_API && 4000d068: 83 30 e0 18 srl %g3, 0x18, %g1 4000d06c: 82 08 60 07 and %g1, 7, %g1 4000d070: 80 a0 60 03 cmp %g1, 3 4000d074: 12 80 00 0b bne 4000d0a0 <_POSIX_Threads_Create_extension+0xc4> 4000d078: c0 24 60 dc clr [ %l1 + 0xdc ] 4000d07c: 83 30 e0 1b srl %g3, 0x1b, %g1 4000d080: 80 a0 60 01 cmp %g1, 1 4000d084: 32 80 00 08 bne,a 4000d0a4 <_POSIX_Threads_Create_extension+0xc8> 4000d088: 82 10 3f ff mov -1, %g1 <== NOT EXECUTED _Objects_Get_class( created->Object.id ) == 1 ) { executing_api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; api->signals_blocked = executing_api->signals_blocked; 4000d08c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 4000d090: c2 00 62 ac ld [ %g1 + 0x2ac ], %g1 ! 4001aeac <_Thread_Executing> 4000d094: c2 00 61 70 ld [ %g1 + 0x170 ], %g1 4000d098: 10 80 00 03 b 4000d0a4 <_POSIX_Threads_Create_extension+0xc8> 4000d09c: c2 00 60 c4 ld [ %g1 + 0xc4 ], %g1 } else { api->signals_blocked = 0xffffffff; 4000d0a0: 82 10 3f ff mov -1, %g1 4000d0a4: c2 24 60 c4 st %g1, [ %l1 + 0xc4 ] } _Thread_queue_Initialize( 4000d0a8: 90 04 60 3c add %l1, 0x3c, %o0 4000d0ac: 92 10 20 00 clr %o1 4000d0b0: 15 00 00 04 sethi %hi(0x1000), %o2 4000d0b4: 7f ff f4 9d call 4000a328 <_Thread_queue_Initialize> 4000d0b8: 96 10 20 00 clr %o3 THREAD_QUEUE_DISCIPLINE_FIFO, STATES_WAITING_FOR_JOIN_AT_EXIT, 0 ); _Watchdog_Initialize( 4000d0bc: c2 06 60 08 ld [ %i1 + 8 ], %g1 ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; the_watchdog->id = id; the_watchdog->user_data = user_data; 4000d0c0: f2 24 60 c0 st %i1, [ %l1 + 0xc0 ] void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; the_watchdog->id = id; 4000d0c4: c2 24 60 bc st %g1, [ %l1 + 0xbc ] Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 4000d0c8: c0 24 60 a4 clr [ %l1 + 0xa4 ] the_watchdog->routine = routine; 4000d0cc: 03 10 00 34 sethi %hi(0x4000d000), %g1 the_watchdog->id = id; the_watchdog->user_data = user_data; 4000d0d0: b0 10 20 01 mov 1, %i0 Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; 4000d0d4: 82 10 61 34 or %g1, 0x134, %g1 4000d0d8: c2 24 60 b8 st %g1, [ %l1 + 0xb8 ] created->Object.id, created ); return TRUE; } 4000d0dc: 81 c7 e0 08 ret 4000d0e0: 81 e8 00 00 restore 40007264 <_POSIX_Threads_Initialize_user_threads_body>: * * Output parameters: NONE */ void _POSIX_Threads_Initialize_user_threads_body( void ) { 40007264: 9d e3 bf 58 save %sp, -168, %sp uint32_t maximum; posix_initialization_threads_table *user_threads; pthread_t thread_id; pthread_attr_t attr; user_threads = _POSIX_Threads_User_initialization_threads; 40007268: 03 10 00 7b sethi %hi(0x4001ec00), %g1 4000726c: e0 00 63 ec ld [ %g1 + 0x3ec ], %l0 ! 4001efec <_POSIX_Threads_User_initialization_threads> maximum = _POSIX_Threads_Number_of_initialization_threads; 40007270: 03 10 00 7c sethi %hi(0x4001f000), %g1 if ( !user_threads || maximum == 0 ) 40007274: 80 a4 20 00 cmp %l0, 0 40007278: 02 80 00 3b be 40007364 <_POSIX_Threads_Initialize_user_threads_body+0x100> 4000727c: ec 00 60 bc ld [ %g1 + 0xbc ], %l6 40007280: 80 a5 a0 00 cmp %l6, 0 40007284: 02 80 00 38 be 40007364 <_POSIX_Threads_Initialize_user_threads_body+0x100> 40007288: 03 10 00 72 sethi %hi(0x4001c800), %g1 return; 4000728c: aa 10 20 00 clr %l5 * to inherit the idle tasks attributes. */ for ( index=0 ; index < maximum ; index++ ) { status = pthread_attr_init( &attr ); assert( !status ); 40007290: a8 10 62 b0 or %g1, 0x2b0, %l4 user_threads = _POSIX_Threads_User_initialization_threads; maximum = _POSIX_Threads_Number_of_initialization_threads; if ( !user_threads || maximum == 0 ) return; 40007294: a4 10 20 00 clr %l2 * to inherit the idle tasks attributes. */ for ( index=0 ; index < maximum ; index++ ) { status = pthread_attr_init( &attr ); assert( !status ); 40007298: 03 10 00 6f sethi %hi(0x4001bc00), %g1 * Setting the attributes explicitly is critical, since we don't want * to inherit the idle tasks attributes. */ for ( index=0 ; index < maximum ; index++ ) { status = pthread_attr_init( &attr ); 4000729c: a2 07 bf bc add %fp, -68, %l1 assert( !status ); 400072a0: a6 10 62 c8 or %g1, 0x2c8, %l3 assert( !status ); status = pthread_attr_setstacksize( &attr, user_threads[ index ].stack_size); assert( !status ); status = pthread_create( 400072a4: 10 80 00 2d b 40007358 <_POSIX_Threads_Initialize_user_threads_body+0xf4> 400072a8: ae 07 bf f4 add %fp, -12, %l7 * Setting the attributes explicitly is critical, since we don't want * to inherit the idle tasks attributes. */ for ( index=0 ; index < maximum ; index++ ) { status = pthread_attr_init( &attr ); 400072ac: 40 00 1f 11 call 4000eef0 400072b0: aa 05 60 01 inc %l5 assert( !status ); 400072b4: 80 a2 20 00 cmp %o0, 0 400072b8: 02 80 00 07 be 400072d4 <_POSIX_Threads_Initialize_user_threads_body+0x70> 400072bc: 92 10 20 02 mov 2, %o1 400072c0: 94 10 00 13 mov %l3, %o2 <== NOT EXECUTED 400072c4: 90 10 00 14 mov %l4, %o0 <== NOT EXECUTED 400072c8: 7f ff f2 3f call 40003bc4 <__assert> <== NOT EXECUTED 400072cc: 92 10 20 47 mov 0x47, %o1 <== NOT EXECUTED status = pthread_attr_setinheritsched( &attr, PTHREAD_EXPLICIT_SCHED ); 400072d0: 92 10 20 02 mov 2, %o1 <== NOT EXECUTED 400072d4: 40 00 1f 12 call 4000ef1c 400072d8: 90 10 00 11 mov %l1, %o0 assert( !status ); 400072dc: 80 a2 20 00 cmp %o0, 0 400072e0: 02 80 00 07 be 400072fc <_POSIX_Threads_Initialize_user_threads_body+0x98> 400072e4: 82 04 00 12 add %l0, %l2, %g1 400072e8: 94 10 00 13 mov %l3, %o2 <== NOT EXECUTED 400072ec: 90 10 00 14 mov %l4, %o0 <== NOT EXECUTED 400072f0: 7f ff f2 35 call 40003bc4 <__assert> <== NOT EXECUTED 400072f4: 92 10 20 4a mov 0x4a, %o1 <== NOT EXECUTED status = pthread_attr_setstacksize( &attr, user_threads[ index ].stack_size); 400072f8: 82 04 00 12 add %l0, %l2, %g1 <== NOT EXECUTED 400072fc: d2 00 60 04 ld [ %g1 + 4 ], %o1 40007300: 40 00 1f 17 call 4000ef5c 40007304: 90 10 00 11 mov %l1, %o0 assert( !status ); 40007308: 80 a2 20 00 cmp %o0, 0 4000730c: 22 80 00 07 be,a 40007328 <_POSIX_Threads_Initialize_user_threads_body+0xc4> 40007310: d4 04 80 10 ld [ %l2 + %l0 ], %o2 40007314: 90 10 00 14 mov %l4, %o0 <== NOT EXECUTED 40007318: 92 10 20 4d mov 0x4d, %o1 <== NOT EXECUTED 4000731c: 7f ff f2 2a call 40003bc4 <__assert> <== NOT EXECUTED 40007320: 94 10 00 13 mov %l3, %o2 <== NOT EXECUTED status = pthread_create( 40007324: d4 04 80 10 ld [ %l2 + %l0 ], %o2 <== NOT EXECUTED 40007328: 92 10 00 11 mov %l1, %o1 4000732c: 96 10 20 00 clr %o3 40007330: 90 10 00 17 mov %l7, %o0 40007334: 7f ff fe fe call 40006f2c 40007338: a4 04 a0 08 add %l2, 8, %l2 &thread_id, &attr, user_threads[ index ].thread_entry, NULL ); assert( !status ); 4000733c: 80 a2 20 00 cmp %o0, 0 40007340: 02 80 00 07 be 4000735c <_POSIX_Threads_Initialize_user_threads_body+0xf8> 40007344: 80 a5 40 16 cmp %l5, %l6 40007348: 90 10 00 14 mov %l4, %o0 <== NOT EXECUTED 4000734c: 92 10 20 55 mov 0x55, %o1 <== NOT EXECUTED 40007350: 7f ff f2 1d call 40003bc4 <__assert> <== NOT EXECUTED 40007354: 94 10 00 13 mov %l3, %o2 <== NOT EXECUTED * * Setting the attributes explicitly is critical, since we don't want * to inherit the idle tasks attributes. */ for ( index=0 ; index < maximum ; index++ ) { 40007358: 80 a5 40 16 cmp %l5, %l6 4000735c: 12 bf ff d4 bne 400072ac <_POSIX_Threads_Initialize_user_threads_body+0x48> 40007360: 90 10 00 11 mov %l1, %o0 40007364: 81 c7 e0 08 ret 40007368: 81 e8 00 00 restore 4000d134 <_POSIX_Threads_Sporadic_budget_TSR>: void _POSIX_Threads_Sporadic_budget_TSR( Objects_Id id, void *argument ) { 4000d134: 9d e3 bf 98 save %sp, -104, %sp Thread_Control *the_thread; POSIX_API_Control *api; the_thread = argument; api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 4000d138: f0 06 61 70 ld [ %i1 + 0x170 ], %i0 ticks = _Timespec_To_ticks( &api->schedparam.ss_initial_budget ); 4000d13c: 40 00 03 d2 call 4000e084 <_Timespec_To_ticks> 4000d140: 90 06 20 90 add %i0, 0x90, %o0 if ( !ticks ) 4000d144: 80 a2 20 00 cmp %o0, 0 4000d148: 22 80 00 02 be,a 4000d150 <_POSIX_Threads_Sporadic_budget_TSR+0x1c> 4000d14c: 90 10 20 01 mov 1, %o0 <== NOT EXECUTED 4000d150: c2 06 20 98 ld [ %i0 + 0x98 ], %g1 the_thread->cpu_time_budget = ticks; new_priority = _POSIX_Priority_To_core( api->ss_high_priority ); the_thread->real_priority = new_priority; if ( the_thread->resource_count == 0 || 4000d154: c6 06 60 1c ld [ %i1 + 0x1c ], %g3 4000d158: 84 10 20 ff mov 0xff, %g2 ticks = _Timespec_To_ticks( &api->schedparam.ss_initial_budget ); if ( !ticks ) ticks = 1; the_thread->cpu_time_budget = ticks; 4000d15c: d0 26 60 84 st %o0, [ %i1 + 0x84 ] 4000d160: 92 20 80 01 sub %g2, %g1, %o1 new_priority = _POSIX_Priority_To_core( api->ss_high_priority ); the_thread->real_priority = new_priority; if ( the_thread->resource_count == 0 || 4000d164: 80 a0 e0 00 cmp %g3, 0 4000d168: 02 80 00 06 be 4000d180 <_POSIX_Threads_Sporadic_budget_TSR+0x4c> 4000d16c: d2 26 60 18 st %o1, [ %i1 + 0x18 ] 4000d170: c2 06 60 14 ld [ %i1 + 0x14 ], %g1 4000d174: 80 a0 40 09 cmp %g1, %o1 4000d178: 08 80 00 05 bleu 4000d18c <_POSIX_Threads_Sporadic_budget_TSR+0x58> 4000d17c: 01 00 00 00 nop the_thread->current_priority > new_priority ) _Thread_Change_priority( the_thread, new_priority, TRUE ); 4000d180: 90 10 00 19 mov %i1, %o0 4000d184: 7f ff f0 ee call 4000953c <_Thread_Change_priority> 4000d188: 94 10 20 01 mov 1, %o2 ticks = _Timespec_To_ticks( &api->schedparam.ss_replenish_period ); 4000d18c: 40 00 03 be call 4000e084 <_Timespec_To_ticks> 4000d190: 90 06 20 88 add %i0, 0x88, %o0 if ( !ticks ) 4000d194: 80 a2 20 00 cmp %o0, 0 4000d198: 22 80 00 02 be,a 4000d1a0 <_POSIX_Threads_Sporadic_budget_TSR+0x6c> 4000d19c: 90 10 20 01 mov 1, %o0 <== NOT EXECUTED Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 4000d1a0: d0 26 20 a8 st %o0, [ %i0 + 0xa8 ] _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 4000d1a4: b2 06 20 9c add %i0, 0x9c, %i1 4000d1a8: 31 10 00 6b sethi %hi(0x4001ac00), %i0 4000d1ac: 7f ff f6 ed call 4000ad60 <_Watchdog_Insert> 4000d1b0: 91 ee 22 cc restore %i0, 0x2cc, %o0 4000d1b4: 01 00 00 00 nop 4000d0e4 <_POSIX_Threads_Sporadic_budget_callout>: ) { POSIX_API_Control *api; uint32_t new_priority; api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 4000d0e4: c2 02 21 70 ld [ %o0 + 0x170 ], %g1 the_thread->cpu_time_budget = 0xFFFFFFFF; /* XXX should be based on MAX_U32 */ new_priority = _POSIX_Priority_To_core( api->schedparam.ss_low_priority ); the_thread->real_priority = new_priority; if ( the_thread->resource_count == 0 || 4000d0e8: c6 02 20 1c ld [ %o0 + 0x1c ], %g3 RTEMS_INLINE_ROUTINE Priority_Control _POSIX_Priority_To_core( int priority ) { return (Priority_Control) (255 - priority); 4000d0ec: c4 00 60 84 ld [ %g1 + 0x84 ], %g2 * 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 */ 4000d0f0: 82 10 3f ff mov -1, %g1 4000d0f4: c2 22 20 84 st %g1, [ %o0 + 0x84 ] 4000d0f8: 82 10 20 ff mov 0xff, %g1 4000d0fc: 92 20 40 02 sub %g1, %g2, %o1 new_priority = _POSIX_Priority_To_core( api->schedparam.ss_low_priority ); the_thread->real_priority = new_priority; if ( the_thread->resource_count == 0 || 4000d100: 80 a0 e0 00 cmp %g3, 0 4000d104: 02 80 00 06 be 4000d11c <_POSIX_Threads_Sporadic_budget_callout+0x38> 4000d108: d2 22 20 18 st %o1, [ %o0 + 0x18 ] 4000d10c: c2 02 20 14 ld [ %o0 + 0x14 ], %g1 <== NOT EXECUTED 4000d110: 80 a0 40 09 cmp %g1, %o1 <== NOT EXECUTED 4000d114: 08 80 00 06 bleu 4000d12c <_POSIX_Threads_Sporadic_budget_callout+0x48> <== NOT EXECUTED 4000d118: 01 00 00 00 nop <== NOT EXECUTED the_thread->current_priority > new_priority ) _Thread_Change_priority( the_thread, new_priority, TRUE ); 4000d11c: 94 10 20 01 mov 1, %o2 ! 1 4000d120: 82 13 c0 00 mov %o7, %g1 4000d124: 7f ff f1 06 call 4000953c <_Thread_Change_priority> 4000d128: 9e 10 40 00 mov %g1, %o7 4000d12c: 81 c3 e0 08 retl <== NOT EXECUTED 4000d130: 01 00 00 00 nop 40005e4c <_POSIX_Threads_cancel_run>: */ void _POSIX_Threads_cancel_run( Thread_Control *the_thread ) { 40005e4c: 9d e3 bf 98 save %sp, -104, %sp 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 ]; 40005e50: f2 06 21 70 ld [ %i0 + 0x170 ], %i1 handler_stack = &thread_support->Cancellation_Handlers; thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE; 40005e54: 82 10 20 01 mov 1, %g1 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 40005e58: a2 06 60 dc add %i1, 0xdc, %l1 40005e5c: c2 26 60 cc st %g1, [ %i1 + 0xcc ] RTEMS_INLINE_ROUTINE boolean _Workspace_Free( void *block ) { return _Heap_Free( &_Workspace_Area, block ); 40005e60: 03 10 00 5f sethi %hi(0x40017c00), %g1 40005e64: 10 80 00 11 b 40005ea8 <_POSIX_Threads_cancel_run+0x5c> 40005e68: a4 10 62 1c or %g1, 0x21c, %l2 ! 40017e1c <_Workspace_Area> while ( !_Chain_Is_empty( handler_stack ) ) { _ISR_Disable( level ); 40005e6c: 7f ff f0 56 call 40001fc4 <== NOT EXECUTED 40005e70: 01 00 00 00 nop <== NOT EXECUTED handler = (POSIX_Cancel_Handler_control *) 40005e74: e0 04 60 04 ld [ %l1 + 4 ], %l0 <== NOT EXECUTED ) { Chain_Node *next; Chain_Node *previous; next = the_node->next; 40005e78: c4 04 00 00 ld [ %l0 ], %g2 <== NOT EXECUTED previous = the_node->previous; 40005e7c: c2 04 20 04 ld [ %l0 + 4 ], %g1 <== NOT EXECUTED next->previous = previous; previous->next = next; 40005e80: c4 20 40 00 st %g2, [ %g1 ] <== NOT EXECUTED Chain_Node *next; Chain_Node *previous; next = the_node->next; previous = the_node->previous; next->previous = previous; 40005e84: c2 20 a0 04 st %g1, [ %g2 + 4 ] <== NOT EXECUTED _Chain_Tail( handler_stack )->previous; _Chain_Extract_unprotected( &handler->Node ); _ISR_Enable( level ); 40005e88: 7f ff f0 53 call 40001fd4 <== NOT EXECUTED 40005e8c: 01 00 00 00 nop <== NOT EXECUTED (*handler->routine)( handler->arg ); 40005e90: c2 04 20 08 ld [ %l0 + 8 ], %g1 <== NOT EXECUTED 40005e94: 9f c0 40 00 call %g1 <== NOT EXECUTED 40005e98: d0 04 20 0c ld [ %l0 + 0xc ], %o0 <== NOT EXECUTED 40005e9c: 90 10 00 12 mov %l2, %o0 <== NOT EXECUTED 40005ea0: 40 00 0a 4a call 400087c8 <_Heap_Free> <== NOT EXECUTED 40005ea4: 92 10 00 10 mov %l0, %o1 <== NOT EXECUTED handler_stack = &thread_support->Cancellation_Handlers; thread_support->cancelability_state = PTHREAD_CANCEL_DISABLE; while ( !_Chain_Is_empty( handler_stack ) ) { 40005ea8: c2 06 60 d8 ld [ %i1 + 0xd8 ], %g1 40005eac: 80 a0 40 11 cmp %g1, %l1 40005eb0: 12 bf ff ef bne 40005e6c <_POSIX_Threads_cancel_run+0x20> 40005eb4: 03 10 00 5f sethi %hi(0x40017c00), %g1 } /* Now we can delete the thread */ the_thread->Wait.return_argument = PTHREAD_CANCELED; _Thread_Close( 40005eb8: c6 06 20 08 ld [ %i0 + 8 ], %g3 40005ebc: 85 30 e0 16 srl %g3, 0x16, %g2 40005ec0: 82 10 61 30 or %g1, 0x130, %g1 40005ec4: 84 08 a0 1c and %g2, 0x1c, %g2 40005ec8: c2 00 40 02 ld [ %g1 + %g2 ], %g1 40005ecc: 87 30 e0 1b srl %g3, 0x1b, %g3 40005ed0: 87 28 e0 02 sll %g3, 2, %g3 40005ed4: d0 00 40 03 ld [ %g1 + %g3 ], %o0 40005ed8: 92 10 00 18 mov %i0, %o1 _Workspace_Free( handler ); } /* Now we can delete the thread */ the_thread->Wait.return_argument = PTHREAD_CANCELED; 40005edc: 82 10 3f ff mov -1, %g1 RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free ( Thread_Control *the_pthread ) { _Objects_Free( &_POSIX_Threads_Information, &the_pthread->Object ); 40005ee0: b2 10 00 18 mov %i0, %i1 40005ee4: c2 26 20 28 st %g1, [ %i0 + 0x28 ] _Thread_Close( 40005ee8: 40 00 10 dd call 4000a25c <_Thread_Close> 40005eec: 31 10 00 60 sethi %hi(0x40018000), %i0 40005ef0: 40 00 0c 69 call 40009094 <_Objects_Free> 40005ef4: 91 ee 20 b8 restore %i0, 0xb8, %o0 40005ef8: 01 00 00 00 nop 4000bfc0 <_POSIX_Timer_TSR>: * Description: This is the operation that is ran when a timer expires * ***************************************************************************/ void _POSIX_Timer_TSR(Objects_Id timer, void *data) { 4000bfc0: 9d e3 bf 98 save %sp, -104, %sp boolean activated; ptimer = (POSIX_Timer_Control *)data; /* Increment the number of expirations. */ ptimer->overrun = ptimer->overrun + 1; 4000bfc4: c2 06 60 68 ld [ %i1 + 0x68 ], %g1 /* The timer must be reprogrammed */ if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) || 4000bfc8: c4 06 60 54 ld [ %i1 + 0x54 ], %g2 boolean activated; ptimer = (POSIX_Timer_Control *)data; /* Increment the number of expirations. */ ptimer->overrun = ptimer->overrun + 1; 4000bfcc: 82 00 60 01 inc %g1 /* The timer must be reprogrammed */ if ( ( ptimer->timer_data.it_interval.tv_sec != 0 ) || 4000bfd0: 80 a0 a0 00 cmp %g2, 0 4000bfd4: 12 80 00 06 bne 4000bfec <_POSIX_Timer_TSR+0x2c> 4000bfd8: c2 26 60 68 st %g1, [ %i1 + 0x68 ] 4000bfdc: c2 06 60 58 ld [ %i1 + 0x58 ], %g1 <== NOT EXECUTED 4000bfe0: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000bfe4: 02 80 00 0f be 4000c020 <_POSIX_Timer_TSR+0x60> <== NOT EXECUTED 4000bfe8: 82 10 20 04 mov 4, %g1 <== NOT EXECUTED ( ptimer->timer_data.it_interval.tv_nsec != 0 ) ) { #if 0 status = rtems_timer_fire_after( ptimer->timer_id, ptimer->ticks, _POSIX_Timer_TSR, ptimer ); #endif activated = _Watchdog_Insert_ticks_helper( 4000bfec: d2 06 60 64 ld [ %i1 + 0x64 ], %o1 4000bff0: d4 06 60 08 ld [ %i1 + 8 ], %o2 4000bff4: 90 06 60 10 add %i1, 0x10, %o0 4000bff8: 17 10 00 2f sethi %hi(0x4000bc00), %o3 4000bffc: 98 10 00 19 mov %i1, %o4 4000c000: 7f ff ff 68 call 4000bda0 <_Watchdog_Insert_ticks_helper> 4000c004: 96 12 e3 c0 or %o3, 0x3c0, %o3 ptimer->ticks, ptimer->Object.id, _POSIX_Timer_TSR, ptimer ); if ( !activated ) 4000c008: 80 a2 20 00 cmp %o0, 0 4000c00c: 02 80 00 0a be 4000c034 <_POSIX_Timer_TSR+0x74> 4000c010: 01 00 00 00 nop return; /* Store the time when the timer was started again */ _TOD_Get( &ptimer->time ); 4000c014: 40 00 09 21 call 4000e498 <_TOD_Get> 4000c018: 90 06 60 6c add %i1, 0x6c, %o0 4000c01c: 82 10 20 03 mov 3, %g1 /* * 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 ) ) { 4000c020: d0 06 60 38 ld [ %i1 + 0x38 ], %o0 4000c024: d2 06 60 44 ld [ %i1 + 0x44 ], %o1 4000c028: 40 00 1f 9e call 40013ea0 4000c02c: c2 2e 60 3c stb %g1, [ %i1 + 0x3c ] } /* After the signal handler returns, the count of expirations of the * timer must be set to 0. */ ptimer->overrun = 0; 4000c030: c0 26 60 68 clr [ %i1 + 0x68 ] 4000c034: 81 c7 e0 08 ret 4000c038: 81 e8 00 00 restore 4000cebc <_POSIX_signals_Abnormal_termination_handler>: /*** PROCESS WIDE STUFF ****/ sigset_t _POSIX_signals_Pending; void _POSIX_signals_Abnormal_termination_handler( int signo ) { 4000cebc: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED exit( 1 ); 4000cec0: 40 00 08 42 call 4000efc8 <== NOT EXECUTED 4000cec4: 90 10 20 01 mov 1, %o0 <== NOT EXECUTED 4000cec8: 01 00 00 00 nop 4000e740 <_POSIX_signals_Check_signal>: boolean _POSIX_signals_Check_signal( POSIX_API_Control *api, int signo, boolean is_global ) { 4000e740: 9d e3 bf 88 save %sp, -120, %sp siginfo_t siginfo_struct; sigset_t saved_signals_blocked; if ( ! _POSIX_signals_Clear_signals( api, signo, &siginfo_struct, 4000e744: 98 10 20 01 mov 1, %o4 4000e748: 96 10 00 1a mov %i2, %o3 4000e74c: a6 07 bf ec add %fp, -20, %l3 4000e750: 90 10 00 18 mov %i0, %o0 4000e754: 92 10 00 19 mov %i1, %o1 4000e758: 40 00 00 2e call 4000e810 <_POSIX_signals_Clear_signals> 4000e75c: 94 10 00 13 mov %l3, %o2 4000e760: 80 a2 20 00 cmp %o0, 0 4000e764: 02 80 00 29 be 4000e808 <_POSIX_signals_Check_signal+0xc8> 4000e768: 03 10 00 6d sethi %hi(0x4001b400), %g1 /* * Since we made a union of these, only one test is necessary but this is * safer. */ assert( _POSIX_signals_Vectors[ signo ].sa_handler || 4000e76c: a4 10 60 64 or %g1, 0x64, %l2 ! 4001b464 <_POSIX_signals_Vectors> 4000e770: 83 2e 60 04 sll %i1, 4, %g1 4000e774: 85 2e 60 02 sll %i1, 2, %g2 4000e778: a2 20 40 02 sub %g1, %g2, %l1 4000e77c: b4 04 40 12 add %l1, %l2, %i2 4000e780: c2 06 a0 08 ld [ %i2 + 8 ], %g1 4000e784: 80 a0 60 00 cmp %g1, 0 4000e788: 12 80 00 0a bne 4000e7b0 <_POSIX_signals_Check_signal+0x70> 4000e78c: 80 a0 60 01 cmp %g1, 1 4000e790: 11 10 00 64 sethi %hi(0x40019000), %o0 <== NOT EXECUTED 4000e794: 15 10 00 64 sethi %hi(0x40019000), %o2 <== NOT EXECUTED 4000e798: 90 12 22 10 or %o0, 0x210, %o0 <== NOT EXECUTED 4000e79c: 94 12 a2 60 or %o2, 0x260, %o2 <== NOT EXECUTED 4000e7a0: 7f ff d1 6d call 40002d54 <__assert> <== NOT EXECUTED 4000e7a4: 92 10 20 33 mov 0x33, %o1 <== NOT EXECUTED /* * Just to prevent sending a signal which is currently being ignored. */ if ( _POSIX_signals_Vectors[ signo ].sa_handler == SIG_IGN ) 4000e7a8: c2 06 a0 08 ld [ %i2 + 8 ], %g1 <== NOT EXECUTED 4000e7ac: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 4000e7b0: 02 80 00 16 be 4000e808 <_POSIX_signals_Check_signal+0xc8> 4000e7b4: 01 00 00 00 nop /* * Block the signals requested in sa_mask */ saved_signals_blocked = api->signals_blocked; 4000e7b8: e0 06 20 c4 ld [ %i0 + 0xc4 ], %l0 api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask; 4000e7bc: c2 06 a0 04 ld [ %i2 + 4 ], %g1 /* Here, the signal handler function executes */ switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) { 4000e7c0: c4 04 80 11 ld [ %l2 + %l1 ], %g2 /* * Block the signals requested in sa_mask */ saved_signals_blocked = api->signals_blocked; api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask; 4000e7c4: 82 10 40 10 or %g1, %l0, %g1 /* Here, the signal handler function executes */ switch ( _POSIX_signals_Vectors[ signo ].sa_flags ) { 4000e7c8: 80 a0 a0 02 cmp %g2, 2 4000e7cc: 12 80 00 09 bne 4000e7f0 <_POSIX_signals_Check_signal+0xb0> 4000e7d0: c2 26 20 c4 st %g1, [ %i0 + 0xc4 ] case SA_SIGINFO: /* * * assert( is_global ); */ (*_POSIX_signals_Vectors[ signo ].sa_sigaction)( 4000e7d4: c2 06 a0 08 ld [ %i2 + 8 ], %g1 4000e7d8: 90 10 00 19 mov %i1, %o0 4000e7dc: 92 10 00 13 mov %l3, %o1 4000e7e0: 9f c0 40 00 call %g1 4000e7e4: 94 10 20 00 clr %o2 /* * Restore the previous set of blocked signals */ api->signals_blocked = saved_signals_blocked; 4000e7e8: 10 80 00 06 b 4000e800 <_POSIX_signals_Check_signal+0xc0> 4000e7ec: e0 26 20 c4 st %l0, [ %i0 + 0xc4 ] &siginfo_struct, NULL /* context is undefined per 1003.1b-1993, p. 66 */ ); break; default: (*_POSIX_signals_Vectors[ signo ].sa_handler)( signo ); 4000e7f0: c2 06 a0 08 ld [ %i2 + 8 ], %g1 4000e7f4: 9f c0 40 00 call %g1 4000e7f8: 90 10 00 19 mov %i1, %o0 /* * Restore the previous set of blocked signals */ api->signals_blocked = saved_signals_blocked; 4000e7fc: e0 26 20 c4 st %l0, [ %i0 + 0xc4 ] 4000e800: 81 c7 e0 08 ret 4000e804: 91 e8 20 01 restore %g0, 1, %o0 return TRUE; } 4000e808: 81 c7 e0 08 ret 4000e80c: 91 e8 20 00 restore %g0, 0, %o0 4000e810 <_POSIX_signals_Clear_signals>: int signo, siginfo_t *info, boolean is_global, boolean check_blocked ) { 4000e810: 9d e3 bf 98 save %sp, -104, %sp sigset_t signals_blocked; ISR_Level level; boolean do_callout; POSIX_signals_Siginfo_node *psiginfo; mask = signo_to_mask( signo ); 4000e814: 82 10 20 01 mov 1, %g1 /* set blocked signals based on if checking for them, SIGNAL_ALL_MASK * insures that no signals are blocked and all are checked. */ if ( check_blocked ) 4000e818: 80 a7 20 00 cmp %i4, 0 sigset_t signals_blocked; ISR_Level level; boolean do_callout; POSIX_signals_Siginfo_node *psiginfo; mask = signo_to_mask( signo ); 4000e81c: 84 06 7f ff add %i1, -1, %g2 /* set blocked signals based on if checking for them, SIGNAL_ALL_MASK * insures that no signals are blocked and all are checked. */ if ( check_blocked ) 4000e820: b8 10 3f ff mov -1, %i4 4000e824: 02 80 00 04 be 4000e834 <_POSIX_signals_Clear_signals+0x24> 4000e828: a1 28 40 02 sll %g1, %g2, %l0 signals_blocked = ~api->signals_blocked; 4000e82c: c2 06 20 c4 ld [ %i0 + 0xc4 ], %g1 4000e830: b8 38 00 01 xnor %g0, %g1, %i4 signals_blocked = SIGNAL_ALL_MASK; /* XXX this is not right for siginfo type signals yet */ /* XXX since they can't be cleared the same way */ _ISR_Disable( level ); 4000e834: 7f ff cd a6 call 40001ecc 4000e838: 01 00 00 00 nop 4000e83c: a2 10 00 08 mov %o0, %l1 if ( is_global ) { 4000e840: 80 a6 e0 00 cmp %i3, 0 4000e844: 22 80 00 35 be,a 4000e918 <_POSIX_signals_Clear_signals+0x108> 4000e848: d0 06 20 c8 ld [ %i0 + 0xc8 ], %o0 if ( mask & (_POSIX_signals_Pending & signals_blocked) ) { 4000e84c: 03 10 00 6d sethi %hi(0x4001b400), %g1 4000e850: c2 00 62 30 ld [ %g1 + 0x230 ], %g1 ! 4001b630 <_POSIX_signals_Pending> 4000e854: 82 0c 00 01 and %l0, %g1, %g1 4000e858: 80 88 40 1c btst %g1, %i4 4000e85c: 02 80 00 36 be 4000e934 <_POSIX_signals_Clear_signals+0x124> 4000e860: 83 2e 60 02 sll %i1, 2, %g1 if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) { 4000e864: 85 2e 60 04 sll %i1, 4, %g2 4000e868: 84 20 80 01 sub %g2, %g1, %g2 4000e86c: 03 10 00 6d sethi %hi(0x4001b400), %g1 4000e870: 82 10 60 64 or %g1, 0x64, %g1 ! 4001b464 <_POSIX_signals_Vectors> 4000e874: c2 00 40 02 ld [ %g1 + %g2 ], %g1 4000e878: 80 a0 60 02 cmp %g1, 2 4000e87c: 12 80 00 23 bne 4000e908 <_POSIX_signals_Clear_signals+0xf8> 4000e880: 03 10 00 6d sethi %hi(0x4001b400), %g1 psiginfo = (POSIX_signals_Siginfo_node *) 4000e884: 88 10 62 34 or %g1, 0x234, %g4 ! 4001b634 <_POSIX_signals_Siginfo> */ RTEMS_INLINE_ROUTINE boolean _Chain_Is_empty( Chain_Control *the_chain ) { return (the_chain->first == _Chain_Tail(the_chain)); 4000e888: f8 00 80 04 ld [ %g2 + %g4 ], %i4 4000e88c: 86 00 80 04 add %g2, %g4, %g3 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 4000e890: 9a 00 e0 04 add %g3, 4, %o5 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Get_unprotected( Chain_Control *the_chain ) { if ( !_Chain_Is_empty(the_chain)) 4000e894: 80 a7 00 0d cmp %i4, %o5 4000e898: 32 80 00 04 bne,a 4000e8a8 <_POSIX_signals_Clear_signals+0x98> 4000e89c: c2 07 00 00 ld [ %i4 ], %g1 4000e8a0: 10 80 00 04 b 4000e8b0 <_POSIX_signals_Clear_signals+0xa0> <== NOT EXECUTED 4000e8a4: b8 10 20 00 clr %i4 <== NOT EXECUTED Chain_Node *return_node; Chain_Node *new_first; return_node = the_chain->first; new_first = return_node->next; the_chain->first = new_first; 4000e8a8: c2 20 80 04 st %g1, [ %g2 + %g4 ] new_first->previous = _Chain_Head(the_chain); 4000e8ac: c6 20 60 04 st %g3, [ %g1 + 4 ] _Chain_Get_unprotected( &_POSIX_signals_Siginfo[ signo ] ); if ( _Chain_Is_empty( &_POSIX_signals_Siginfo[ signo ] ) ) 4000e8b0: c2 00 c0 00 ld [ %g3 ], %g1 4000e8b4: 80 a0 40 0d cmp %g1, %o5 4000e8b8: 12 80 00 05 bne 4000e8cc <_POSIX_signals_Clear_signals+0xbc> 4000e8bc: 80 a7 20 00 cmp %i4, 0 _POSIX_signals_Clear_process_signals( mask ); 4000e8c0: 40 00 01 a7 call 4000ef5c <_POSIX_signals_Clear_process_signals> 4000e8c4: 90 10 00 10 mov %l0, %o0 if ( psiginfo ) { 4000e8c8: 80 a7 20 00 cmp %i4, 0 4000e8cc: 02 80 00 1b be 4000e938 <_POSIX_signals_Clear_signals+0x128> 4000e8d0: b0 10 20 01 mov 1, %i0 *info = psiginfo->Info; 4000e8d4: 90 10 00 1a mov %i2, %o0 4000e8d8: 92 07 20 08 add %i4, 8, %o1 4000e8dc: 40 00 03 8d call 4000f710 4000e8e0: 94 10 20 0c mov 0xc, %o2 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 4000e8e4: 03 10 00 6d sethi %hi(0x4001b400), %g1 4000e8e8: 82 10 61 e8 or %g1, 0x1e8, %g1 ! 4001b5e8 <_POSIX_signals_Inactive_siginfo+0x4> Chain_Node *the_node ) { Chain_Node *old_last_node; the_node->next = _Chain_Tail(the_chain); 4000e8ec: c2 27 00 00 st %g1, [ %i4 ] old_last_node = the_chain->last; 4000e8f0: 82 00 7f fc add %g1, -4, %g1 4000e8f4: c4 00 60 08 ld [ %g1 + 8 ], %g2 the_chain->last = the_node; 4000e8f8: f8 20 60 08 st %i4, [ %g1 + 8 ] old_last_node->next = the_node; the_node->previous = old_last_node; 4000e8fc: c4 27 20 04 st %g2, [ %i4 + 4 ] Chain_Node *old_last_node; the_node->next = _Chain_Tail(the_chain); old_last_node = the_chain->last; the_chain->last = the_node; old_last_node->next = the_node; 4000e900: 10 80 00 0e b 4000e938 <_POSIX_signals_Clear_signals+0x128> 4000e904: f8 20 80 00 st %i4, [ %g2 ] &psiginfo->Node ); } else do_callout = FALSE; } else _POSIX_signals_Clear_process_signals( mask ); 4000e908: 40 00 01 95 call 4000ef5c <_POSIX_signals_Clear_process_signals> 4000e90c: 90 10 00 10 mov %l0, %o0 do_callout = TRUE; } } else { if ( mask & (api->signals_pending & signals_blocked) ) { api->signals_pending &= ~mask; 4000e910: 10 80 00 0a b 4000e938 <_POSIX_signals_Clear_signals+0x128> 4000e914: b0 10 20 01 mov 1, %i0 } else _POSIX_signals_Clear_process_signals( mask ); do_callout = TRUE; } } else { if ( mask & (api->signals_pending & signals_blocked) ) { 4000e918: 82 0c 00 08 and %l0, %o0, %g1 4000e91c: 80 88 40 1c btst %g1, %i4 4000e920: 02 80 00 05 be 4000e934 <_POSIX_signals_Clear_signals+0x124> 4000e924: 82 2a 00 10 andn %o0, %l0, %g1 api->signals_pending &= ~mask; 4000e928: c2 26 20 c8 st %g1, [ %i0 + 0xc8 ] 4000e92c: 10 80 00 03 b 4000e938 <_POSIX_signals_Clear_signals+0x128> 4000e930: b0 10 20 01 mov 1, %i0 4000e934: b0 10 20 00 clr %i0 do_callout = TRUE; } } _ISR_Enable( level ); 4000e938: 7f ff cd 69 call 40001edc 4000e93c: 90 10 00 11 mov %l1, %o0 return do_callout; } 4000e940: 81 c7 e0 08 ret 4000e944: 81 e8 00 00 restore 4000710c <_POSIX_signals_Get_highest>: #include int _POSIX_signals_Get_highest( sigset_t set ) { 4000710c: 86 10 00 08 mov %o0, %g3 40007110: 90 10 20 1b mov 0x1b, %o0 int signo; for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { if ( set & signo_to_mask( signo ) ) 40007114: 84 02 3f ff add %o0, -1, %g2 40007118: 82 10 20 01 mov 1, %g1 4000711c: 83 28 40 02 sll %g1, %g2, %g1 40007120: 80 88 40 03 btst %g1, %g3 40007124: 12 80 00 12 bne 4000716c <_POSIX_signals_Get_highest+0x60> 40007128: 01 00 00 00 nop sigset_t set ) { int signo; for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { 4000712c: 90 02 20 01 inc %o0 40007130: 80 a2 20 20 cmp %o0, 0x20 40007134: 12 bf ff f9 bne 40007118 <_POSIX_signals_Get_highest+0xc> 40007138: 84 02 3f ff add %o0, -1, %g2 4000713c: 90 10 20 01 mov 1, %o0 } /* XXX - add __SIGFIRSTNOTRT or something like that to newlib signal .h */ for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) { if ( set & signo_to_mask( signo ) ) 40007140: 84 02 3f ff add %o0, -1, %g2 40007144: 82 10 20 01 mov 1, %g1 40007148: 83 28 40 02 sll %g1, %g2, %g1 4000714c: 80 88 40 03 btst %g1, %g3 40007150: 12 80 00 07 bne 4000716c <_POSIX_signals_Get_highest+0x60> 40007154: 01 00 00 00 nop return signo; } /* XXX - add __SIGFIRSTNOTRT or something like that to newlib signal .h */ for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) { 40007158: 90 02 20 01 inc %o0 4000715c: 80 a2 20 1b cmp %o0, 0x1b 40007160: 12 bf ff f9 bne 40007144 <_POSIX_signals_Get_highest+0x38> 40007164: 84 02 3f ff add %o0, -1, %g2 40007168: 90 10 20 00 clr %o0 <== NOT EXECUTED if ( set & signo_to_mask( signo ) ) return signo; } return 0; } 4000716c: 81 c3 e0 08 retl 40007170: 01 00 00 00 nop 4000cdec <_POSIX_signals_Post_switch_extension>: */ void _POSIX_signals_Post_switch_extension( Thread_Control *the_thread ) { 4000cdec: 9d e3 bf 98 save %sp, -104, %sp POSIX_API_Control *api; int signo; ISR_Level level; api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 4000cdf0: e0 06 21 70 ld [ %i0 + 0x170 ], %l0 * processed at all. No point in doing this loop otherwise. */ restart: _ISR_Disable( level ); if ( !(~api->signals_blocked & 4000cdf4: 23 10 00 6d sethi %hi(0x4001b400), %l1 * The first thing done is to check there are any signals to be * processed at all. No point in doing this loop otherwise. */ restart: _ISR_Disable( level ); 4000cdf8: 7f ff d4 35 call 40001ecc 4000cdfc: 01 00 00 00 nop 4000ce00: b0 10 00 08 mov %o0, %i0 if ( !(~api->signals_blocked & 4000ce04: c2 04 62 30 ld [ %l1 + 0x230 ], %g1 4000ce08: c4 04 20 c8 ld [ %l0 + 0xc8 ], %g2 4000ce0c: c6 04 20 c4 ld [ %l0 + 0xc4 ], %g3 4000ce10: 82 10 40 02 or %g1, %g2, %g1 4000ce14: 80 a8 40 03 andncc %g1, %g3, %g0 4000ce18: 12 80 00 04 bne 4000ce28 <_POSIX_signals_Post_switch_extension+0x3c> 4000ce1c: 01 00 00 00 nop (api->signals_pending | _POSIX_signals_Pending)) ) { _ISR_Enable( level ); 4000ce20: 7f ff d4 2f call 40001edc 4000ce24: 81 e8 00 00 restore return; } _ISR_Enable( level ); 4000ce28: 7f ff d4 2d call 40001edc 4000ce2c: b0 10 20 1b mov 0x1b, %i0 for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { if ( _POSIX_signals_Check_signal( api, signo, FALSE ) ) 4000ce30: 92 10 00 18 mov %i0, %o1 4000ce34: 94 10 20 00 clr %o2 4000ce38: 40 00 06 42 call 4000e740 <_POSIX_signals_Check_signal> 4000ce3c: 90 10 00 10 mov %l0, %o0 4000ce40: 80 a2 20 00 cmp %o0, 0 4000ce44: 12 bf ff ed bne 4000cdf8 <_POSIX_signals_Post_switch_extension+0xc> 4000ce48: 92 10 00 18 mov %i0, %o1 goto restart; if ( _POSIX_signals_Check_signal( api, signo, TRUE ) ) 4000ce4c: 90 10 00 10 mov %l0, %o0 4000ce50: 94 10 20 01 mov 1, %o2 4000ce54: 40 00 06 3b call 4000e740 <_POSIX_signals_Check_signal> 4000ce58: b0 06 20 01 inc %i0 4000ce5c: 80 a2 20 00 cmp %o0, 0 4000ce60: 12 bf ff e6 bne 4000cdf8 <_POSIX_signals_Post_switch_extension+0xc> 4000ce64: 80 a6 20 20 cmp %i0, 0x20 _ISR_Enable( level ); return; } _ISR_Enable( level ); for ( signo = SIGRTMIN ; signo <= SIGRTMAX ; signo++ ) { 4000ce68: 12 bf ff f3 bne 4000ce34 <_POSIX_signals_Post_switch_extension+0x48> 4000ce6c: 92 10 00 18 mov %i0, %o1 4000ce70: b0 10 20 01 mov 1, %i0 /* XXX - add __SIGFIRSTNOTRT or something like that to newlib signal .h */ for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) { if ( _POSIX_signals_Check_signal( api, signo, FALSE ) ) 4000ce74: 92 10 00 18 mov %i0, %o1 4000ce78: 94 10 20 00 clr %o2 4000ce7c: 40 00 06 31 call 4000e740 <_POSIX_signals_Check_signal> 4000ce80: 90 10 00 10 mov %l0, %o0 4000ce84: 80 a2 20 00 cmp %o0, 0 4000ce88: 12 bf ff dc bne 4000cdf8 <_POSIX_signals_Post_switch_extension+0xc> 4000ce8c: 92 10 00 18 mov %i0, %o1 goto restart; if ( _POSIX_signals_Check_signal( api, signo, TRUE ) ) 4000ce90: 90 10 00 10 mov %l0, %o0 4000ce94: 94 10 20 01 mov 1, %o2 4000ce98: 40 00 06 2a call 4000e740 <_POSIX_signals_Check_signal> 4000ce9c: b0 06 20 01 inc %i0 4000cea0: 80 a2 20 00 cmp %o0, 0 4000cea4: 12 bf ff d5 bne 4000cdf8 <_POSIX_signals_Post_switch_extension+0xc> 4000cea8: 80 a6 20 1b cmp %i0, 0x1b } /* XXX - add __SIGFIRSTNOTRT or something like that to newlib signal .h */ for ( signo = SIGHUP ; signo <= __SIGLASTNOTRT ; signo++ ) { 4000ceac: 12 bf ff f3 bne 4000ce78 <_POSIX_signals_Post_switch_extension+0x8c> 4000ceb0: 92 10 00 18 mov %i0, %o1 if ( _POSIX_signals_Check_signal( api, signo, TRUE ) ) goto restart; } } 4000ceb4: 81 c7 e0 08 ret <== NOT EXECUTED 4000ceb8: 81 e8 00 00 restore <== NOT EXECUTED 40023528 <_POSIX_signals_Unblock_thread>: boolean _POSIX_signals_Unblock_thread( Thread_Control *the_thread, int signo, siginfo_t *info ) { 40023528: 9d e3 bf 98 save %sp, -104, %sp /* * Is the thread is specifically waiting for a signal? */ if ( _States_Is_interruptible_signal( the_thread->current_state ) ) { 4002352c: c8 06 20 10 ld [ %i0 + 0x10 ], %g4 40023530: 05 04 00 20 sethi %hi(0x10008000), %g2 sigset_t mask; siginfo_t *the_info = NULL; api = the_thread->API_Extensions[ THREAD_API_POSIX ]; mask = signo_to_mask( signo ); 40023534: 82 06 7f ff add %i1, -1, %g1 40023538: 9a 10 20 01 mov 1, %o5 boolean _POSIX_signals_Unblock_thread( Thread_Control *the_thread, int signo, siginfo_t *info ) { 4002353c: 92 10 00 1a mov %i2, %o1 sigset_t mask; siginfo_t *the_info = NULL; api = the_thread->API_Extensions[ THREAD_API_POSIX ]; mask = signo_to_mask( signo ); 40023540: 87 2b 40 01 sll %o5, %g1, %g3 /* * Is the thread is specifically waiting for a signal? */ if ( _States_Is_interruptible_signal( the_thread->current_state ) ) { 40023544: 82 09 00 02 and %g4, %g2, %g1 40023548: 80 a0 40 02 cmp %g1, %g2 4002354c: 12 80 00 19 bne 400235b0 <_POSIX_signals_Unblock_thread+0x88> 40023550: c4 06 21 70 ld [ %i0 + 0x170 ], %g2 if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) { 40023554: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 40023558: 80 88 c0 01 btst %g3, %g1 4002355c: 12 80 00 06 bne 40023574 <_POSIX_signals_Unblock_thread+0x4c> 40023560: 82 10 20 04 mov 4, %g1 40023564: c2 00 a0 c4 ld [ %g2 + 0xc4 ], %g1 40023568: 80 a8 c0 01 andncc %g3, %g1, %g0 4002356c: 02 80 00 31 be 40023630 <_POSIX_signals_Unblock_thread+0x108> 40023570: 82 10 20 04 mov 4, %g1 the_thread->Wait.return_code = EINTR; 40023574: c2 26 20 34 st %g1, [ %i0 + 0x34 ] the_info = (siginfo_t *) the_thread->Wait.return_argument; if ( !info ) { 40023578: 80 a2 60 00 cmp %o1, 0 4002357c: 12 80 00 06 bne 40023594 <_POSIX_signals_Unblock_thread+0x6c> 40023580: d0 06 20 28 ld [ %i0 + 0x28 ], %o0 the_info->si_signo = signo; 40023584: f2 22 00 00 st %i1, [ %o0 ] the_info->si_code = SI_USER; 40023588: da 22 20 04 st %o5, [ %o0 + 4 ] the_info->si_value.sival_int = 0; 4002358c: 10 80 00 04 b 4002359c <_POSIX_signals_Unblock_thread+0x74> 40023590: c0 22 20 08 clr [ %o0 + 8 ] } else { *the_info = *info; 40023594: 7f ff d6 47 call 40018eb0 40023598: 94 10 20 0c mov 0xc, %o2 } _Thread_queue_Extract_with_proxy( the_thread ); 4002359c: 90 10 00 18 mov %i0, %o0 400235a0: 7f ff ad 61 call 4000eb24 <_Thread_queue_Extract_with_proxy> 400235a4: b0 10 20 01 mov 1, %i0 400235a8: 81 c7 e0 08 ret 400235ac: 81 e8 00 00 restore */ return FALSE; } if ( ~api->signals_blocked & mask ) { 400235b0: c2 00 a0 c4 ld [ %g2 + 0xc4 ], %g1 400235b4: 80 a8 c0 01 andncc %g3, %g1, %g0 400235b8: 02 80 00 1e be 40023630 <_POSIX_signals_Unblock_thread+0x108> 400235bc: 03 04 00 00 sethi %hi(0x10000000), %g1 the_thread->do_post_task_switch_extension = TRUE; if ( the_thread->current_state & STATES_INTERRUPTIBLE_BY_SIGNAL ) { 400235c0: 80 89 00 01 btst %g4, %g1 400235c4: 02 80 00 1b be 40023630 <_POSIX_signals_Unblock_thread+0x108> 400235c8: da 26 20 78 st %o5, [ %i0 + 0x78 ] the_thread->Wait.return_code = EINTR; 400235cc: 82 10 20 04 mov 4, %g1 400235d0: c2 26 20 34 st %g1, [ %i0 + 0x34 ] if ( _States_Is_waiting_on_thread_queue(the_thread->current_state) ) 400235d4: 03 00 00 ef sethi %hi(0x3bc00), %g1 400235d8: 82 10 62 e0 or %g1, 0x2e0, %g1 ! 3bee0 400235dc: 80 89 00 01 btst %g4, %g1 400235e0: 02 80 00 06 be 400235f8 <_POSIX_signals_Unblock_thread+0xd0> 400235e4: 80 89 20 08 btst 8, %g4 _Thread_queue_Extract_with_proxy( the_thread ); 400235e8: 7f ff ad 4f call 4000eb24 <_Thread_queue_Extract_with_proxy> <== NOT EXECUTED 400235ec: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); 400235f0: 81 c7 e0 08 ret <== NOT EXECUTED 400235f4: 91 e8 20 00 restore %g0, 0, %o0 <== NOT EXECUTED else if ( _States_Is_delaying(the_thread->current_state)){ 400235f8: 22 bf ff ec be,a 400235a8 <_POSIX_signals_Unblock_thread+0x80> 400235fc: b0 10 20 00 clr %i0 <== NOT EXECUTED if ( _Watchdog_Is_active( &the_thread->Timer ) ) 40023600: c2 06 20 50 ld [ %i0 + 0x50 ], %g1 40023604: 80 a0 60 02 cmp %g1, 2 40023608: 32 80 00 05 bne,a 4002361c <_POSIX_signals_Unblock_thread+0xf4> 4002360c: 13 04 00 ff sethi %hi(0x1003fc00), %o1 <== NOT EXECUTED (void) _Watchdog_Remove( &the_thread->Timer ); 40023610: 7f ff b0 77 call 4000f7ec <_Watchdog_Remove> 40023614: 90 06 20 48 add %i0, 0x48, %o0 40023618: 13 04 00 ff sethi %hi(0x1003fc00), %o1 4002361c: 90 10 00 18 mov %i0, %o0 40023620: 7f ff aa 50 call 4000df60 <_Thread_Clear_state> 40023624: 92 12 63 f8 or %o1, 0x3f8, %o1 40023628: 81 c7 e0 08 ret 4002362c: 91 e8 20 00 restore %g0, 0, %o0 40023630: b0 10 20 00 clr %i0 } } } return FALSE; } 40023634: 81 c7 e0 08 ret 40023638: 81 e8 00 00 restore 400089f4 <_Protected_heap_Allocate>: void *_Protected_heap_Allocate( Heap_Control *the_heap, size_t size ) { 400089f4: 9d e3 bf 98 save %sp, -104, %sp void *p; _RTEMS_Lock_allocator(); 400089f8: 7f ff e5 35 call 40001ecc 400089fc: 01 00 00 00 nop 40008a00: a2 10 00 08 mov %o0, %l1 40008a04: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40008a08: c2 00 61 d0 ld [ %g1 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> 40008a0c: 80 a0 60 00 cmp %g1, 0 40008a10: 02 80 00 0b be 40008a3c <_Protected_heap_Allocate+0x48> 40008a14: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40008a18: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40008a1c: c2 00 63 b0 ld [ %g1 + 0x3b0 ], %g1 ! 4001afb0 <_System_state_Current> 40008a20: 80 a0 60 01 cmp %g1, 1 40008a24: 08 80 00 05 bleu 40008a38 <_Protected_heap_Allocate+0x44> 40008a28: 90 10 20 00 clr %o0 40008a2c: 92 10 20 00 clr %o1 <== NOT EXECUTED 40008a30: 7f ff fd 8a call 40008058 <_Internal_error_Occurred> <== NOT EXECUTED 40008a34: 94 10 20 12 mov 0x12, %o2 <== NOT EXECUTED 40008a38: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40008a3c: e0 00 62 a4 ld [ %g1 + 0x2a4 ], %l0 ! 4001aea4 <_RTEMS_Allocator_Mutex> Thread_Control *executing; ISR_Level level = *level_p; /* disabled when you get here */ executing = _Thread_Executing; 40008a40: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40008a44: c4 00 62 ac ld [ %g1 + 0x2ac ], %g2 ! 4001aeac <_Thread_Executing> executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; 40008a48: c0 20 a0 34 clr [ %g2 + 0x34 ] if ( !_CORE_mutex_Is_locked( the_mutex ) ) { 40008a4c: c2 04 20 60 ld [ %l0 + 0x60 ], %g1 40008a50: 80 a0 60 00 cmp %g1, 0 40008a54: 22 80 00 33 be,a 40008b20 <_Protected_heap_Allocate+0x12c> 40008a58: c2 04 20 6c ld [ %l0 + 0x6c ], %g1 <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_LOCKED; 40008a5c: c0 24 20 60 clr [ %l0 + 0x60 ] the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 40008a60: c2 00 a0 08 ld [ %g2 + 8 ], %g1 */ RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_inherit_priority( CORE_mutex_Attributes *the_attribute ) { return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT; 40008a64: c6 04 20 58 ld [ %l0 + 0x58 ], %g3 executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 40008a68: c2 24 20 70 st %g1, [ %l0 + 0x70 ] executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; 40008a6c: c4 24 20 6c st %g2, [ %l0 + 0x6c ] the_mutex->holder_id = executing->Object.id; the_mutex->nest_count = 1; 40008a70: 82 10 20 01 mov 1, %g1 if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || 40008a74: 80 a0 e0 02 cmp %g3, 2 40008a78: 02 80 00 05 be 40008a8c <_Protected_heap_Allocate+0x98> 40008a7c: c2 24 20 64 st %g1, [ %l0 + 0x64 ] 40008a80: 80 a0 e0 03 cmp %g3, 3 <== NOT EXECUTED 40008a84: 32 80 00 06 bne,a 40008a9c <_Protected_heap_Allocate+0xa8> <== NOT EXECUTED 40008a88: c2 04 20 58 ld [ %l0 + 0x58 ], %g1 <== NOT EXECUTED _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) executing->resource_count++; 40008a8c: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 40008a90: 82 00 60 01 inc %g1 40008a94: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) { 40008a98: c2 04 20 58 ld [ %l0 + 0x58 ], %g1 40008a9c: 80 a0 60 03 cmp %g1, 3 40008aa0: 22 80 00 03 be,a 40008aac <_Protected_heap_Allocate+0xb8> 40008aa4: c6 04 20 5c ld [ %l0 + 0x5c ], %g3 <== NOT EXECUTED _ISR_Enable( level ); 40008aa8: 30 80 00 2c b,a 40008b58 <_Protected_heap_Allocate+0x164> { Priority_Control ceiling; Priority_Control current; ceiling = the_mutex->Attributes.priority_ceiling; current = executing->current_priority; 40008aac: c2 00 a0 14 ld [ %g2 + 0x14 ], %g1 <== NOT EXECUTED if ( current == ceiling ) { 40008ab0: 80 a0 40 03 cmp %g1, %g3 <== NOT EXECUTED 40008ab4: 12 80 00 03 bne 40008ac0 <_Protected_heap_Allocate+0xcc> <== NOT EXECUTED 40008ab8: 01 00 00 00 nop <== NOT EXECUTED _ISR_Enable( level ); 40008abc: 30 80 00 27 b,a 40008b58 <_Protected_heap_Allocate+0x164> <== NOT EXECUTED return 0; } if ( current > ceiling ) { 40008ac0: 08 80 00 10 bleu 40008b00 <_Protected_heap_Allocate+0x10c> <== NOT EXECUTED 40008ac4: 82 10 20 06 mov 6, %g1 <== NOT EXECUTED rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40008ac8: 05 10 00 6b sethi %hi(0x4001ac00), %g2 <== NOT EXECUTED 40008acc: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40008ad0: 82 00 60 01 inc %g1 <== NOT EXECUTED 40008ad4: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] <== NOT EXECUTED _Thread_Disable_dispatch(); _ISR_Enable( level ); 40008ad8: 7f ff e5 01 call 40001edc <== NOT EXECUTED 40008adc: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED _Thread_Change_priority( 40008ae0: d2 04 20 5c ld [ %l0 + 0x5c ], %o1 <== NOT EXECUTED 40008ae4: d0 04 20 6c ld [ %l0 + 0x6c ], %o0 <== NOT EXECUTED 40008ae8: 40 00 02 95 call 4000953c <_Thread_Change_priority> <== NOT EXECUTED 40008aec: 94 10 20 00 clr %o2 <== NOT EXECUTED the_mutex->holder, the_mutex->Attributes.priority_ceiling, FALSE ); _Thread_Enable_dispatch(); 40008af0: 7f ff ff b4 call 400089c0 <_Thread_Enable_dispatch> <== NOT EXECUTED 40008af4: 01 00 00 00 nop <== NOT EXECUTED p = _Heap_Allocate( the_heap, size ); 40008af8: 10 80 00 32 b 40008bc0 <_Protected_heap_Allocate+0x1cc> <== NOT EXECUTED 40008afc: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; 40008b00: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_UNLOCKED; 40008b04: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ 40008b08: c0 24 20 64 clr [ %l0 + 0x64 ] <== NOT EXECUTED _Thread_Enable_dispatch(); return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; the_mutex->lock = CORE_MUTEX_UNLOCKED; 40008b0c: c2 24 20 60 st %g1, [ %l0 + 0x60 ] <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ executing->resource_count--; /* undo locking above */ 40008b10: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 <== NOT EXECUTED 40008b14: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 40008b18: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] <== NOT EXECUTED _ISR_Enable( level ); 40008b1c: 30 80 00 0f b,a 40008b58 <_Protected_heap_Allocate+0x164> <== NOT EXECUTED /* * At this point, we know the mutex was not available. If this thread * is the thread that has locked the mutex, let's see if we are allowed * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { 40008b20: 80 a0 40 02 cmp %g1, %g2 <== NOT EXECUTED 40008b24: 32 80 00 13 bne,a 40008b70 <_Protected_heap_Allocate+0x17c> <== NOT EXECUTED 40008b28: 21 10 00 6b sethi %hi(0x4001ac00), %l0 <== NOT EXECUTED switch ( the_mutex->Attributes.lock_nesting_behavior ) { 40008b2c: c2 04 20 50 ld [ %l0 + 0x50 ], %g1 ! 4001ac50 <== NOT EXECUTED 40008b30: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40008b34: 22 80 00 07 be,a 40008b50 <_Protected_heap_Allocate+0x15c> <== NOT EXECUTED 40008b38: c2 04 20 64 ld [ %l0 + 0x64 ], %g1 <== NOT EXECUTED 40008b3c: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 40008b40: 32 80 00 0c bne,a 40008b70 <_Protected_heap_Allocate+0x17c> <== NOT EXECUTED 40008b44: 21 10 00 6b sethi %hi(0x4001ac00), %l0 <== NOT EXECUTED case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; _ISR_Enable( level ); return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 40008b48: 10 80 00 08 b 40008b68 <_Protected_heap_Allocate+0x174> <== NOT EXECUTED 40008b4c: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { switch ( the_mutex->Attributes.lock_nesting_behavior ) { case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; 40008b50: 82 00 60 01 inc %g1 <== NOT EXECUTED 40008b54: c2 24 20 64 st %g1, [ %l0 + 0x64 ] <== NOT EXECUTED _ISR_Enable( level ); 40008b58: 7f ff e4 e1 call 40001edc 40008b5c: 90 10 00 11 mov %l1, %o0 40008b60: 10 80 00 18 b 40008bc0 <_Protected_heap_Allocate+0x1cc> 40008b64: 90 10 00 18 mov %i0, %o0 return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 40008b68: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED _ISR_Enable( level ); 40008b6c: 30 bf ff fb b,a 40008b58 <_Protected_heap_Allocate+0x164> <== NOT EXECUTED size_t size ) { void *p; _RTEMS_Lock_allocator(); 40008b70: c6 04 22 a4 ld [ %l0 + 0x2a4 ], %g3 <== NOT EXECUTED 40008b74: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40008b78: da 00 e0 08 ld [ %g3 + 8 ], %o5 <== NOT EXECUTED 40008b7c: c8 00 62 ac ld [ %g1 + 0x2ac ], %g4 <== NOT EXECUTED 40008b80: 05 10 00 6b sethi %hi(0x4001ac00), %g2 <== NOT EXECUTED 40008b84: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40008b88: da 21 20 20 st %o5, [ %g4 + 0x20 ] <== NOT EXECUTED 40008b8c: 82 00 60 01 inc %g1 <== NOT EXECUTED 40008b90: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] <== NOT EXECUTED 40008b94: 82 00 e0 10 add %g3, 0x10, %g1 <== NOT EXECUTED 40008b98: c2 21 20 44 st %g1, [ %g4 + 0x44 ] <== NOT EXECUTED RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section ( Thread_queue_Control *the_thread_queue ) { the_thread_queue->sync_state = THREAD_QUEUE_NOTHING_HAPPENED; 40008b9c: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED 40008ba0: c2 20 e0 40 st %g1, [ %g3 + 0x40 ] <== NOT EXECUTED 40008ba4: 7f ff e4 ce call 40001edc <== NOT EXECUTED 40008ba8: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 40008bac: d0 04 22 a4 ld [ %l0 + 0x2a4 ], %o0 <== NOT EXECUTED 40008bb0: 92 10 20 00 clr %o1 <== NOT EXECUTED 40008bb4: 7f ff fb 0f call 400077f0 <_CORE_mutex_Seize_interrupt_blocking> <== NOT EXECUTED 40008bb8: 90 02 20 10 add %o0, 0x10, %o0 <== NOT EXECUTED p = _Heap_Allocate( the_heap, size ); 40008bbc: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40008bc0: 7f ff fb fb call 40007bac <_Heap_Allocate> 40008bc4: 92 10 00 19 mov %i1, %o1 40008bc8: 05 10 00 6b sethi %hi(0x4001ac00), %g2 40008bcc: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> 40008bd0: b0 10 00 08 mov %o0, %i0 40008bd4: 82 00 60 01 inc %g1 40008bd8: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] _RTEMS_Unlock_allocator(); 40008bdc: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40008be0: d0 00 62 a4 ld [ %g1 + 0x2a4 ], %o0 ! 4001aea4 <_RTEMS_Allocator_Mutex> 40008be4: 94 10 20 00 clr %o2 40008be8: d2 02 20 08 ld [ %o0 + 8 ], %o1 40008bec: 7f ff fb 23 call 40007878 <_CORE_mutex_Surrender> 40008bf0: 90 02 20 10 add %o0, 0x10, %o0 40008bf4: 7f ff ff 73 call 400089c0 <_Thread_Enable_dispatch> 40008bf8: 01 00 00 00 nop return p; } 40008bfc: 81 c7 e0 08 ret 40008c00: 81 e8 00 00 restore 40008c38 <_Protected_heap_Extend>: boolean _Protected_heap_Extend( Heap_Control *the_heap, void *starting_address, size_t size ) { 40008c38: 9d e3 bf 90 save %sp, -112, %sp <== NOT EXECUTED Heap_Extend_status status; uint32_t amount_extended; _RTEMS_Lock_allocator(); 40008c3c: 7f ff e4 a4 call 40001ecc <== NOT EXECUTED 40008c40: 01 00 00 00 nop <== NOT EXECUTED 40008c44: a2 10 00 08 mov %o0, %l1 <== NOT EXECUTED 40008c48: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40008c4c: c2 00 61 d0 ld [ %g1 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40008c50: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40008c54: 02 80 00 0b be 40008c80 <_Protected_heap_Extend+0x48> <== NOT EXECUTED 40008c58: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40008c5c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40008c60: c2 00 63 b0 ld [ %g1 + 0x3b0 ], %g1 ! 4001afb0 <_System_state_Current> <== NOT EXECUTED 40008c64: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 40008c68: 08 80 00 05 bleu 40008c7c <_Protected_heap_Extend+0x44> <== NOT EXECUTED 40008c6c: 90 10 20 00 clr %o0 <== NOT EXECUTED 40008c70: 92 10 20 00 clr %o1 <== NOT EXECUTED 40008c74: 7f ff fc f9 call 40008058 <_Internal_error_Occurred> <== NOT EXECUTED 40008c78: 94 10 20 12 mov 0x12, %o2 <== NOT EXECUTED 40008c7c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40008c80: e0 00 62 a4 ld [ %g1 + 0x2a4 ], %l0 ! 4001aea4 <_RTEMS_Allocator_Mutex> <== NOT EXECUTED Thread_Control *executing; ISR_Level level = *level_p; /* disabled when you get here */ executing = _Thread_Executing; 40008c84: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40008c88: c4 00 62 ac ld [ %g1 + 0x2ac ], %g2 ! 4001aeac <_Thread_Executing> <== NOT EXECUTED executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; 40008c8c: c0 20 a0 34 clr [ %g2 + 0x34 ] <== NOT EXECUTED if ( !_CORE_mutex_Is_locked( the_mutex ) ) { 40008c90: c2 04 20 60 ld [ %l0 + 0x60 ], %g1 <== NOT EXECUTED 40008c94: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40008c98: 22 80 00 33 be,a 40008d64 <_Protected_heap_Extend+0x12c> <== NOT EXECUTED 40008c9c: c2 04 20 6c ld [ %l0 + 0x6c ], %g1 <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_LOCKED; 40008ca0: c0 24 20 60 clr [ %l0 + 0x60 ] <== NOT EXECUTED the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 40008ca4: c2 00 a0 08 ld [ %g2 + 8 ], %g1 <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_inherit_priority( CORE_mutex_Attributes *the_attribute ) { return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT; 40008ca8: c6 04 20 58 ld [ %l0 + 0x58 ], %g3 <== NOT EXECUTED executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 40008cac: c2 24 20 70 st %g1, [ %l0 + 0x70 ] <== NOT EXECUTED executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; 40008cb0: c4 24 20 6c st %g2, [ %l0 + 0x6c ] <== NOT EXECUTED the_mutex->holder_id = executing->Object.id; the_mutex->nest_count = 1; 40008cb4: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || 40008cb8: 80 a0 e0 02 cmp %g3, 2 <== NOT EXECUTED 40008cbc: 02 80 00 05 be 40008cd0 <_Protected_heap_Extend+0x98> <== NOT EXECUTED 40008cc0: c2 24 20 64 st %g1, [ %l0 + 0x64 ] <== NOT EXECUTED 40008cc4: 80 a0 e0 03 cmp %g3, 3 <== NOT EXECUTED 40008cc8: 32 80 00 06 bne,a 40008ce0 <_Protected_heap_Extend+0xa8> <== NOT EXECUTED 40008ccc: c2 04 20 58 ld [ %l0 + 0x58 ], %g1 <== NOT EXECUTED _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) executing->resource_count++; 40008cd0: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 <== NOT EXECUTED 40008cd4: 82 00 60 01 inc %g1 <== NOT EXECUTED 40008cd8: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] <== NOT EXECUTED if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) { 40008cdc: c2 04 20 58 ld [ %l0 + 0x58 ], %g1 <== NOT EXECUTED 40008ce0: 80 a0 60 03 cmp %g1, 3 <== NOT EXECUTED 40008ce4: 22 80 00 03 be,a 40008cf0 <_Protected_heap_Extend+0xb8> <== NOT EXECUTED 40008ce8: c6 04 20 5c ld [ %l0 + 0x5c ], %g3 <== NOT EXECUTED _ISR_Enable( level ); 40008cec: 30 80 00 2c b,a 40008d9c <_Protected_heap_Extend+0x164> <== NOT EXECUTED { Priority_Control ceiling; Priority_Control current; ceiling = the_mutex->Attributes.priority_ceiling; current = executing->current_priority; 40008cf0: c2 00 a0 14 ld [ %g2 + 0x14 ], %g1 <== NOT EXECUTED if ( current == ceiling ) { 40008cf4: 80 a0 40 03 cmp %g1, %g3 <== NOT EXECUTED 40008cf8: 12 80 00 03 bne 40008d04 <_Protected_heap_Extend+0xcc> <== NOT EXECUTED 40008cfc: 01 00 00 00 nop <== NOT EXECUTED _ISR_Enable( level ); 40008d00: 30 80 00 27 b,a 40008d9c <_Protected_heap_Extend+0x164> <== NOT EXECUTED return 0; } if ( current > ceiling ) { 40008d04: 08 80 00 10 bleu 40008d44 <_Protected_heap_Extend+0x10c> <== NOT EXECUTED 40008d08: 82 10 20 06 mov 6, %g1 <== NOT EXECUTED rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40008d0c: 05 10 00 6b sethi %hi(0x4001ac00), %g2 <== NOT EXECUTED 40008d10: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40008d14: 82 00 60 01 inc %g1 <== NOT EXECUTED 40008d18: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] <== NOT EXECUTED _Thread_Disable_dispatch(); _ISR_Enable( level ); 40008d1c: 7f ff e4 70 call 40001edc <== NOT EXECUTED 40008d20: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED _Thread_Change_priority( 40008d24: d2 04 20 5c ld [ %l0 + 0x5c ], %o1 <== NOT EXECUTED 40008d28: d0 04 20 6c ld [ %l0 + 0x6c ], %o0 <== NOT EXECUTED 40008d2c: 40 00 02 04 call 4000953c <_Thread_Change_priority> <== NOT EXECUTED 40008d30: 94 10 20 00 clr %o2 <== NOT EXECUTED the_mutex->holder, the_mutex->Attributes.priority_ceiling, FALSE ); _Thread_Enable_dispatch(); 40008d34: 7f ff ff b4 call 40008c04 <_Thread_Enable_dispatch> <== NOT EXECUTED 40008d38: 01 00 00 00 nop <== NOT EXECUTED status = _Heap_Extend(the_heap, starting_address, size, &amount_extended); 40008d3c: 10 80 00 32 b 40008e04 <_Protected_heap_Extend+0x1cc> <== NOT EXECUTED 40008d40: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; 40008d44: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_UNLOCKED; 40008d48: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ 40008d4c: c0 24 20 64 clr [ %l0 + 0x64 ] <== NOT EXECUTED _Thread_Enable_dispatch(); return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; the_mutex->lock = CORE_MUTEX_UNLOCKED; 40008d50: c2 24 20 60 st %g1, [ %l0 + 0x60 ] <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ executing->resource_count--; /* undo locking above */ 40008d54: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 <== NOT EXECUTED 40008d58: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 40008d5c: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] <== NOT EXECUTED _ISR_Enable( level ); 40008d60: 30 80 00 0f b,a 40008d9c <_Protected_heap_Extend+0x164> <== NOT EXECUTED /* * At this point, we know the mutex was not available. If this thread * is the thread that has locked the mutex, let's see if we are allowed * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { 40008d64: 80 a0 40 02 cmp %g1, %g2 <== NOT EXECUTED 40008d68: 32 80 00 13 bne,a 40008db4 <_Protected_heap_Extend+0x17c> <== NOT EXECUTED 40008d6c: 21 10 00 6b sethi %hi(0x4001ac00), %l0 <== NOT EXECUTED switch ( the_mutex->Attributes.lock_nesting_behavior ) { 40008d70: c2 04 20 50 ld [ %l0 + 0x50 ], %g1 ! 4001ac50 <== NOT EXECUTED 40008d74: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40008d78: 22 80 00 07 be,a 40008d94 <_Protected_heap_Extend+0x15c> <== NOT EXECUTED 40008d7c: c2 04 20 64 ld [ %l0 + 0x64 ], %g1 <== NOT EXECUTED 40008d80: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 40008d84: 12 80 00 0c bne 40008db4 <_Protected_heap_Extend+0x17c> <== NOT EXECUTED 40008d88: 21 10 00 6b sethi %hi(0x4001ac00), %l0 <== NOT EXECUTED case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; _ISR_Enable( level ); return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 40008d8c: 10 80 00 08 b 40008dac <_Protected_heap_Extend+0x174> <== NOT EXECUTED 40008d90: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { switch ( the_mutex->Attributes.lock_nesting_behavior ) { case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; 40008d94: 82 00 60 01 inc %g1 <== NOT EXECUTED 40008d98: c2 24 20 64 st %g1, [ %l0 + 0x64 ] <== NOT EXECUTED _ISR_Enable( level ); 40008d9c: 7f ff e4 50 call 40001edc <== NOT EXECUTED 40008da0: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 40008da4: 10 80 00 18 b 40008e04 <_Protected_heap_Extend+0x1cc> <== NOT EXECUTED 40008da8: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 40008dac: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED _ISR_Enable( level ); 40008db0: 30 bf ff fb b,a 40008d9c <_Protected_heap_Extend+0x164> <== NOT EXECUTED ) { Heap_Extend_status status; uint32_t amount_extended; _RTEMS_Lock_allocator(); 40008db4: c6 04 22 a4 ld [ %l0 + 0x2a4 ], %g3 <== NOT EXECUTED 40008db8: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40008dbc: da 00 e0 08 ld [ %g3 + 8 ], %o5 <== NOT EXECUTED 40008dc0: c8 00 62 ac ld [ %g1 + 0x2ac ], %g4 <== NOT EXECUTED 40008dc4: 05 10 00 6b sethi %hi(0x4001ac00), %g2 <== NOT EXECUTED 40008dc8: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40008dcc: da 21 20 20 st %o5, [ %g4 + 0x20 ] <== NOT EXECUTED 40008dd0: 82 00 60 01 inc %g1 <== NOT EXECUTED 40008dd4: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] <== NOT EXECUTED 40008dd8: 82 00 e0 10 add %g3, 0x10, %g1 <== NOT EXECUTED 40008ddc: c2 21 20 44 st %g1, [ %g4 + 0x44 ] <== NOT EXECUTED 40008de0: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED 40008de4: c2 20 e0 40 st %g1, [ %g3 + 0x40 ] <== NOT EXECUTED 40008de8: 7f ff e4 3d call 40001edc <== NOT EXECUTED 40008dec: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 40008df0: d0 04 22 a4 ld [ %l0 + 0x2a4 ], %o0 <== NOT EXECUTED 40008df4: 92 10 20 00 clr %o1 <== NOT EXECUTED 40008df8: 7f ff fa 7e call 400077f0 <_CORE_mutex_Seize_interrupt_blocking> <== NOT EXECUTED 40008dfc: 90 02 20 10 add %o0, 0x10, %o0 <== NOT EXECUTED status = _Heap_Extend(the_heap, starting_address, size, &amount_extended); 40008e00: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40008e04: 92 10 00 19 mov %i1, %o1 <== NOT EXECUTED 40008e08: 94 10 00 1a mov %i2, %o2 <== NOT EXECUTED 40008e0c: 40 00 12 7f call 4000d808 <_Heap_Extend> <== NOT EXECUTED 40008e10: 96 07 bf f4 add %fp, -12, %o3 <== NOT EXECUTED 40008e14: 05 10 00 6b sethi %hi(0x4001ac00), %g2 <== NOT EXECUTED 40008e18: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40008e1c: a0 10 00 08 mov %o0, %l0 <== NOT EXECUTED 40008e20: 82 00 60 01 inc %g1 <== NOT EXECUTED 40008e24: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] <== NOT EXECUTED _RTEMS_Unlock_allocator(); 40008e28: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40008e2c: d0 00 62 a4 ld [ %g1 + 0x2a4 ], %o0 ! 4001aea4 <_RTEMS_Allocator_Mutex> <== NOT EXECUTED 40008e30: 94 10 20 00 clr %o2 <== NOT EXECUTED 40008e34: d2 02 20 08 ld [ %o0 + 8 ], %o1 <== NOT EXECUTED 40008e38: 7f ff fa 90 call 40007878 <_CORE_mutex_Surrender> <== NOT EXECUTED 40008e3c: 90 02 20 10 add %o0, 0x10, %o0 <== NOT EXECUTED 40008e40: 7f ff ff 71 call 40008c04 <_Thread_Enable_dispatch> <== NOT EXECUTED 40008e44: 01 00 00 00 nop <== NOT EXECUTED return (status == HEAP_EXTEND_SUCCESSFUL); } 40008e48: 80 a0 00 10 cmp %g0, %l0 <== NOT EXECUTED 40008e4c: b0 60 3f ff subx %g0, -1, %i0 <== NOT EXECUTED 40008e50: 81 c7 e0 08 ret <== NOT EXECUTED 40008e54: 81 e8 00 00 restore <== NOT EXECUTED 40008e8c <_Protected_heap_Free>: boolean _Protected_heap_Free( Heap_Control *the_heap, void *start_address ) { 40008e8c: 9d e3 bf 98 save %sp, -104, %sp boolean status; _RTEMS_Lock_allocator(); 40008e90: 7f ff e4 0f call 40001ecc 40008e94: 01 00 00 00 nop 40008e98: a2 10 00 08 mov %o0, %l1 40008e9c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40008ea0: c2 00 61 d0 ld [ %g1 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> 40008ea4: 80 a0 60 00 cmp %g1, 0 40008ea8: 02 80 00 0b be 40008ed4 <_Protected_heap_Free+0x48> 40008eac: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40008eb0: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40008eb4: c2 00 63 b0 ld [ %g1 + 0x3b0 ], %g1 ! 4001afb0 <_System_state_Current> <== NOT EXECUTED 40008eb8: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 40008ebc: 08 80 00 05 bleu 40008ed0 <_Protected_heap_Free+0x44> <== NOT EXECUTED 40008ec0: 90 10 20 00 clr %o0 <== NOT EXECUTED 40008ec4: 92 10 20 00 clr %o1 <== NOT EXECUTED 40008ec8: 7f ff fc 64 call 40008058 <_Internal_error_Occurred> <== NOT EXECUTED 40008ecc: 94 10 20 12 mov 0x12, %o2 <== NOT EXECUTED 40008ed0: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40008ed4: e0 00 62 a4 ld [ %g1 + 0x2a4 ], %l0 ! 4001aea4 <_RTEMS_Allocator_Mutex> Thread_Control *executing; ISR_Level level = *level_p; /* disabled when you get here */ executing = _Thread_Executing; 40008ed8: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40008edc: c4 00 62 ac ld [ %g1 + 0x2ac ], %g2 ! 4001aeac <_Thread_Executing> executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; 40008ee0: c0 20 a0 34 clr [ %g2 + 0x34 ] if ( !_CORE_mutex_Is_locked( the_mutex ) ) { 40008ee4: c2 04 20 60 ld [ %l0 + 0x60 ], %g1 40008ee8: 80 a0 60 00 cmp %g1, 0 40008eec: 22 80 00 33 be,a 40008fb8 <_Protected_heap_Free+0x12c> 40008ef0: c2 04 20 6c ld [ %l0 + 0x6c ], %g1 <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_LOCKED; 40008ef4: c0 24 20 60 clr [ %l0 + 0x60 ] the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 40008ef8: c2 00 a0 08 ld [ %g2 + 8 ], %g1 */ RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_inherit_priority( CORE_mutex_Attributes *the_attribute ) { return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT; 40008efc: c6 04 20 58 ld [ %l0 + 0x58 ], %g3 executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 40008f00: c2 24 20 70 st %g1, [ %l0 + 0x70 ] executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; 40008f04: c4 24 20 6c st %g2, [ %l0 + 0x6c ] the_mutex->holder_id = executing->Object.id; the_mutex->nest_count = 1; 40008f08: 82 10 20 01 mov 1, %g1 if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || 40008f0c: 80 a0 e0 02 cmp %g3, 2 40008f10: 02 80 00 05 be 40008f24 <_Protected_heap_Free+0x98> 40008f14: c2 24 20 64 st %g1, [ %l0 + 0x64 ] 40008f18: 80 a0 e0 03 cmp %g3, 3 <== NOT EXECUTED 40008f1c: 32 80 00 06 bne,a 40008f34 <_Protected_heap_Free+0xa8> <== NOT EXECUTED 40008f20: c2 04 20 58 ld [ %l0 + 0x58 ], %g1 <== NOT EXECUTED _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) executing->resource_count++; 40008f24: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 40008f28: 82 00 60 01 inc %g1 40008f2c: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) { 40008f30: c2 04 20 58 ld [ %l0 + 0x58 ], %g1 40008f34: 80 a0 60 03 cmp %g1, 3 40008f38: 22 80 00 03 be,a 40008f44 <_Protected_heap_Free+0xb8> 40008f3c: c6 04 20 5c ld [ %l0 + 0x5c ], %g3 <== NOT EXECUTED _ISR_Enable( level ); 40008f40: 30 80 00 2c b,a 40008ff0 <_Protected_heap_Free+0x164> { Priority_Control ceiling; Priority_Control current; ceiling = the_mutex->Attributes.priority_ceiling; current = executing->current_priority; 40008f44: c2 00 a0 14 ld [ %g2 + 0x14 ], %g1 <== NOT EXECUTED if ( current == ceiling ) { 40008f48: 80 a0 40 03 cmp %g1, %g3 <== NOT EXECUTED 40008f4c: 12 80 00 03 bne 40008f58 <_Protected_heap_Free+0xcc> <== NOT EXECUTED 40008f50: 01 00 00 00 nop <== NOT EXECUTED _ISR_Enable( level ); 40008f54: 30 80 00 27 b,a 40008ff0 <_Protected_heap_Free+0x164> <== NOT EXECUTED return 0; } if ( current > ceiling ) { 40008f58: 08 80 00 10 bleu 40008f98 <_Protected_heap_Free+0x10c> <== NOT EXECUTED 40008f5c: 82 10 20 06 mov 6, %g1 <== NOT EXECUTED rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40008f60: 05 10 00 6b sethi %hi(0x4001ac00), %g2 <== NOT EXECUTED 40008f64: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40008f68: 82 00 60 01 inc %g1 <== NOT EXECUTED 40008f6c: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] <== NOT EXECUTED _Thread_Disable_dispatch(); _ISR_Enable( level ); 40008f70: 7f ff e3 db call 40001edc <== NOT EXECUTED 40008f74: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED _Thread_Change_priority( 40008f78: d2 04 20 5c ld [ %l0 + 0x5c ], %o1 <== NOT EXECUTED 40008f7c: d0 04 20 6c ld [ %l0 + 0x6c ], %o0 <== NOT EXECUTED 40008f80: 40 00 01 6f call 4000953c <_Thread_Change_priority> <== NOT EXECUTED 40008f84: 94 10 20 00 clr %o2 <== NOT EXECUTED the_mutex->holder, the_mutex->Attributes.priority_ceiling, FALSE ); _Thread_Enable_dispatch(); 40008f88: 7f ff ff b4 call 40008e58 <_Thread_Enable_dispatch> <== NOT EXECUTED 40008f8c: 01 00 00 00 nop <== NOT EXECUTED status = _Heap_Free( the_heap, start_address ); 40008f90: 10 80 00 32 b 40009058 <_Protected_heap_Free+0x1cc> <== NOT EXECUTED 40008f94: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; 40008f98: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_UNLOCKED; 40008f9c: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ 40008fa0: c0 24 20 64 clr [ %l0 + 0x64 ] <== NOT EXECUTED _Thread_Enable_dispatch(); return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; the_mutex->lock = CORE_MUTEX_UNLOCKED; 40008fa4: c2 24 20 60 st %g1, [ %l0 + 0x60 ] <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ executing->resource_count--; /* undo locking above */ 40008fa8: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 <== NOT EXECUTED 40008fac: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 40008fb0: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] <== NOT EXECUTED _ISR_Enable( level ); 40008fb4: 30 80 00 0f b,a 40008ff0 <_Protected_heap_Free+0x164> <== NOT EXECUTED /* * At this point, we know the mutex was not available. If this thread * is the thread that has locked the mutex, let's see if we are allowed * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { 40008fb8: 80 a0 40 02 cmp %g1, %g2 <== NOT EXECUTED 40008fbc: 32 80 00 13 bne,a 40009008 <_Protected_heap_Free+0x17c> <== NOT EXECUTED 40008fc0: 21 10 00 6b sethi %hi(0x4001ac00), %l0 <== NOT EXECUTED switch ( the_mutex->Attributes.lock_nesting_behavior ) { 40008fc4: c2 04 20 50 ld [ %l0 + 0x50 ], %g1 ! 4001ac50 <== NOT EXECUTED 40008fc8: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40008fcc: 22 80 00 07 be,a 40008fe8 <_Protected_heap_Free+0x15c> <== NOT EXECUTED 40008fd0: c2 04 20 64 ld [ %l0 + 0x64 ], %g1 <== NOT EXECUTED 40008fd4: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 40008fd8: 32 80 00 0c bne,a 40009008 <_Protected_heap_Free+0x17c> <== NOT EXECUTED 40008fdc: 21 10 00 6b sethi %hi(0x4001ac00), %l0 <== NOT EXECUTED case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; _ISR_Enable( level ); return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 40008fe0: 10 80 00 08 b 40009000 <_Protected_heap_Free+0x174> <== NOT EXECUTED 40008fe4: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { switch ( the_mutex->Attributes.lock_nesting_behavior ) { case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; 40008fe8: 82 00 60 01 inc %g1 <== NOT EXECUTED 40008fec: c2 24 20 64 st %g1, [ %l0 + 0x64 ] <== NOT EXECUTED _ISR_Enable( level ); 40008ff0: 7f ff e3 bb call 40001edc 40008ff4: 90 10 00 11 mov %l1, %o0 40008ff8: 10 80 00 18 b 40009058 <_Protected_heap_Free+0x1cc> 40008ffc: 90 10 00 18 mov %i0, %o0 return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 40009000: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED _ISR_Enable( level ); 40009004: 30 bf ff fb b,a 40008ff0 <_Protected_heap_Free+0x164> <== NOT EXECUTED void *start_address ) { boolean status; _RTEMS_Lock_allocator(); 40009008: c6 04 22 a4 ld [ %l0 + 0x2a4 ], %g3 <== NOT EXECUTED 4000900c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40009010: da 00 e0 08 ld [ %g3 + 8 ], %o5 <== NOT EXECUTED 40009014: c8 00 62 ac ld [ %g1 + 0x2ac ], %g4 <== NOT EXECUTED 40009018: 05 10 00 6b sethi %hi(0x4001ac00), %g2 <== NOT EXECUTED 4000901c: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40009020: da 21 20 20 st %o5, [ %g4 + 0x20 ] <== NOT EXECUTED 40009024: 82 00 60 01 inc %g1 <== NOT EXECUTED 40009028: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] <== NOT EXECUTED 4000902c: 82 00 e0 10 add %g3, 0x10, %g1 <== NOT EXECUTED 40009030: c2 21 20 44 st %g1, [ %g4 + 0x44 ] <== NOT EXECUTED 40009034: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED 40009038: c2 20 e0 40 st %g1, [ %g3 + 0x40 ] <== NOT EXECUTED 4000903c: 7f ff e3 a8 call 40001edc <== NOT EXECUTED 40009040: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 40009044: d0 04 22 a4 ld [ %l0 + 0x2a4 ], %o0 <== NOT EXECUTED 40009048: 92 10 20 00 clr %o1 <== NOT EXECUTED 4000904c: 7f ff f9 e9 call 400077f0 <_CORE_mutex_Seize_interrupt_blocking> <== NOT EXECUTED 40009050: 90 02 20 10 add %o0, 0x10, %o0 <== NOT EXECUTED status = _Heap_Free( the_heap, start_address ); 40009054: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40009058: 7f ff fa fc call 40007c48 <_Heap_Free> 4000905c: 92 10 00 19 mov %i1, %o1 40009060: 05 10 00 6b sethi %hi(0x4001ac00), %g2 40009064: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> 40009068: b0 10 00 08 mov %o0, %i0 4000906c: 82 00 60 01 inc %g1 40009070: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] _RTEMS_Unlock_allocator(); 40009074: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40009078: d0 00 62 a4 ld [ %g1 + 0x2a4 ], %o0 ! 4001aea4 <_RTEMS_Allocator_Mutex> 4000907c: 94 10 20 00 clr %o2 40009080: d2 02 20 08 ld [ %o0 + 8 ], %o1 40009084: 7f ff f9 fd call 40007878 <_CORE_mutex_Surrender> 40009088: 90 02 20 10 add %o0, 0x10, %o0 4000908c: 7f ff ff 73 call 40008e58 <_Thread_Enable_dispatch> 40009090: 01 00 00 00 nop return status; } 40009094: 81 c7 e0 08 ret 40009098: 81 e8 00 00 restore 400090d0 <_Protected_heap_Get_block_size>: boolean _Protected_heap_Get_block_size( Heap_Control *the_heap, void *starting_address, size_t *size ) { 400090d0: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED boolean status; _RTEMS_Lock_allocator(); 400090d4: 7f ff e3 7e call 40001ecc <== NOT EXECUTED 400090d8: 01 00 00 00 nop <== NOT EXECUTED 400090dc: a2 10 00 08 mov %o0, %l1 <== NOT EXECUTED 400090e0: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 400090e4: c2 00 61 d0 ld [ %g1 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 400090e8: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400090ec: 02 80 00 0b be 40009118 <_Protected_heap_Get_block_size+0x48> <== NOT EXECUTED 400090f0: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 400090f4: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 400090f8: c2 00 63 b0 ld [ %g1 + 0x3b0 ], %g1 ! 4001afb0 <_System_state_Current> <== NOT EXECUTED 400090fc: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 40009100: 08 80 00 05 bleu 40009114 <_Protected_heap_Get_block_size+0x44> <== NOT EXECUTED 40009104: 90 10 20 00 clr %o0 <== NOT EXECUTED 40009108: 92 10 20 00 clr %o1 <== NOT EXECUTED 4000910c: 7f ff fb d3 call 40008058 <_Internal_error_Occurred> <== NOT EXECUTED 40009110: 94 10 20 12 mov 0x12, %o2 <== NOT EXECUTED 40009114: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40009118: e0 00 62 a4 ld [ %g1 + 0x2a4 ], %l0 ! 4001aea4 <_RTEMS_Allocator_Mutex> <== NOT EXECUTED Thread_Control *executing; ISR_Level level = *level_p; /* disabled when you get here */ executing = _Thread_Executing; 4000911c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40009120: c4 00 62 ac ld [ %g1 + 0x2ac ], %g2 ! 4001aeac <_Thread_Executing> <== NOT EXECUTED executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; 40009124: c0 20 a0 34 clr [ %g2 + 0x34 ] <== NOT EXECUTED if ( !_CORE_mutex_Is_locked( the_mutex ) ) { 40009128: c2 04 20 60 ld [ %l0 + 0x60 ], %g1 <== NOT EXECUTED 4000912c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40009130: 22 80 00 33 be,a 400091fc <_Protected_heap_Get_block_size+0x12c> <== NOT EXECUTED 40009134: c2 04 20 6c ld [ %l0 + 0x6c ], %g1 <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_LOCKED; 40009138: c0 24 20 60 clr [ %l0 + 0x60 ] <== NOT EXECUTED the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 4000913c: c2 00 a0 08 ld [ %g2 + 8 ], %g1 <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_inherit_priority( CORE_mutex_Attributes *the_attribute ) { return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT; 40009140: c6 04 20 58 ld [ %l0 + 0x58 ], %g3 <== NOT EXECUTED executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 40009144: c2 24 20 70 st %g1, [ %l0 + 0x70 ] <== NOT EXECUTED executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; 40009148: c4 24 20 6c st %g2, [ %l0 + 0x6c ] <== NOT EXECUTED the_mutex->holder_id = executing->Object.id; the_mutex->nest_count = 1; 4000914c: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || 40009150: 80 a0 e0 02 cmp %g3, 2 <== NOT EXECUTED 40009154: 02 80 00 05 be 40009168 <_Protected_heap_Get_block_size+0x98> <== NOT EXECUTED 40009158: c2 24 20 64 st %g1, [ %l0 + 0x64 ] <== NOT EXECUTED 4000915c: 80 a0 e0 03 cmp %g3, 3 <== NOT EXECUTED 40009160: 32 80 00 06 bne,a 40009178 <_Protected_heap_Get_block_size+0xa8> <== NOT EXECUTED 40009164: c2 04 20 58 ld [ %l0 + 0x58 ], %g1 <== NOT EXECUTED _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) executing->resource_count++; 40009168: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 <== NOT EXECUTED 4000916c: 82 00 60 01 inc %g1 <== NOT EXECUTED 40009170: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] <== NOT EXECUTED if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) { 40009174: c2 04 20 58 ld [ %l0 + 0x58 ], %g1 <== NOT EXECUTED 40009178: 80 a0 60 03 cmp %g1, 3 <== NOT EXECUTED 4000917c: 22 80 00 03 be,a 40009188 <_Protected_heap_Get_block_size+0xb8> <== NOT EXECUTED 40009180: c6 04 20 5c ld [ %l0 + 0x5c ], %g3 <== NOT EXECUTED _ISR_Enable( level ); 40009184: 30 80 00 2c b,a 40009234 <_Protected_heap_Get_block_size+0x164> <== NOT EXECUTED { Priority_Control ceiling; Priority_Control current; ceiling = the_mutex->Attributes.priority_ceiling; current = executing->current_priority; 40009188: c2 00 a0 14 ld [ %g2 + 0x14 ], %g1 <== NOT EXECUTED if ( current == ceiling ) { 4000918c: 80 a0 40 03 cmp %g1, %g3 <== NOT EXECUTED 40009190: 12 80 00 03 bne 4000919c <_Protected_heap_Get_block_size+0xcc> <== NOT EXECUTED 40009194: 01 00 00 00 nop <== NOT EXECUTED _ISR_Enable( level ); 40009198: 30 80 00 27 b,a 40009234 <_Protected_heap_Get_block_size+0x164> <== NOT EXECUTED return 0; } if ( current > ceiling ) { 4000919c: 08 80 00 10 bleu 400091dc <_Protected_heap_Get_block_size+0x10c> <== NOT EXECUTED 400091a0: 82 10 20 06 mov 6, %g1 <== NOT EXECUTED rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 400091a4: 05 10 00 6b sethi %hi(0x4001ac00), %g2 <== NOT EXECUTED 400091a8: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 400091ac: 82 00 60 01 inc %g1 <== NOT EXECUTED 400091b0: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] <== NOT EXECUTED _Thread_Disable_dispatch(); _ISR_Enable( level ); 400091b4: 7f ff e3 4a call 40001edc <== NOT EXECUTED 400091b8: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED _Thread_Change_priority( 400091bc: d2 04 20 5c ld [ %l0 + 0x5c ], %o1 <== NOT EXECUTED 400091c0: d0 04 20 6c ld [ %l0 + 0x6c ], %o0 <== NOT EXECUTED 400091c4: 40 00 00 de call 4000953c <_Thread_Change_priority> <== NOT EXECUTED 400091c8: 94 10 20 00 clr %o2 <== NOT EXECUTED the_mutex->holder, the_mutex->Attributes.priority_ceiling, FALSE ); _Thread_Enable_dispatch(); 400091cc: 7f ff ff b4 call 4000909c <_Thread_Enable_dispatch> <== NOT EXECUTED 400091d0: 01 00 00 00 nop <== NOT EXECUTED status = _Heap_Size_of_user_area( the_heap, starting_address, size ); 400091d4: 10 80 00 32 b 4000929c <_Protected_heap_Get_block_size+0x1cc> <== NOT EXECUTED 400091d8: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; 400091dc: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_UNLOCKED; 400091e0: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ 400091e4: c0 24 20 64 clr [ %l0 + 0x64 ] <== NOT EXECUTED _Thread_Enable_dispatch(); return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; the_mutex->lock = CORE_MUTEX_UNLOCKED; 400091e8: c2 24 20 60 st %g1, [ %l0 + 0x60 ] <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ executing->resource_count--; /* undo locking above */ 400091ec: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 <== NOT EXECUTED 400091f0: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 400091f4: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] <== NOT EXECUTED _ISR_Enable( level ); 400091f8: 30 80 00 0f b,a 40009234 <_Protected_heap_Get_block_size+0x164> <== NOT EXECUTED /* * At this point, we know the mutex was not available. If this thread * is the thread that has locked the mutex, let's see if we are allowed * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { 400091fc: 80 a0 40 02 cmp %g1, %g2 <== NOT EXECUTED 40009200: 32 80 00 13 bne,a 4000924c <_Protected_heap_Get_block_size+0x17c> <== NOT EXECUTED 40009204: 21 10 00 6b sethi %hi(0x4001ac00), %l0 <== NOT EXECUTED switch ( the_mutex->Attributes.lock_nesting_behavior ) { 40009208: c2 04 20 50 ld [ %l0 + 0x50 ], %g1 ! 4001ac50 <== NOT EXECUTED 4000920c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40009210: 22 80 00 07 be,a 4000922c <_Protected_heap_Get_block_size+0x15c> <== NOT EXECUTED 40009214: c2 04 20 64 ld [ %l0 + 0x64 ], %g1 <== NOT EXECUTED 40009218: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 4000921c: 32 80 00 0c bne,a 4000924c <_Protected_heap_Get_block_size+0x17c> <== NOT EXECUTED 40009220: 21 10 00 6b sethi %hi(0x4001ac00), %l0 <== NOT EXECUTED case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; _ISR_Enable( level ); return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 40009224: 10 80 00 08 b 40009244 <_Protected_heap_Get_block_size+0x174> <== NOT EXECUTED 40009228: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { switch ( the_mutex->Attributes.lock_nesting_behavior ) { case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; 4000922c: 82 00 60 01 inc %g1 <== NOT EXECUTED 40009230: c2 24 20 64 st %g1, [ %l0 + 0x64 ] <== NOT EXECUTED _ISR_Enable( level ); 40009234: 7f ff e3 2a call 40001edc <== NOT EXECUTED 40009238: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 4000923c: 10 80 00 18 b 4000929c <_Protected_heap_Get_block_size+0x1cc> <== NOT EXECUTED 40009240: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 40009244: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED _ISR_Enable( level ); 40009248: 30 bf ff fb b,a 40009234 <_Protected_heap_Get_block_size+0x164> <== NOT EXECUTED size_t *size ) { boolean status; _RTEMS_Lock_allocator(); 4000924c: c6 04 22 a4 ld [ %l0 + 0x2a4 ], %g3 <== NOT EXECUTED 40009250: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40009254: da 00 e0 08 ld [ %g3 + 8 ], %o5 <== NOT EXECUTED 40009258: c8 00 62 ac ld [ %g1 + 0x2ac ], %g4 <== NOT EXECUTED 4000925c: 05 10 00 6b sethi %hi(0x4001ac00), %g2 <== NOT EXECUTED 40009260: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40009264: da 21 20 20 st %o5, [ %g4 + 0x20 ] <== NOT EXECUTED 40009268: 82 00 60 01 inc %g1 <== NOT EXECUTED 4000926c: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] <== NOT EXECUTED 40009270: 82 00 e0 10 add %g3, 0x10, %g1 <== NOT EXECUTED 40009274: c2 21 20 44 st %g1, [ %g4 + 0x44 ] <== NOT EXECUTED 40009278: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED 4000927c: c2 20 e0 40 st %g1, [ %g3 + 0x40 ] <== NOT EXECUTED 40009280: 7f ff e3 17 call 40001edc <== NOT EXECUTED 40009284: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 40009288: d0 04 22 a4 ld [ %l0 + 0x2a4 ], %o0 <== NOT EXECUTED 4000928c: 92 10 20 00 clr %o1 <== NOT EXECUTED 40009290: 7f ff f9 58 call 400077f0 <_CORE_mutex_Seize_interrupt_blocking> <== NOT EXECUTED 40009294: 90 02 20 10 add %o0, 0x10, %o0 <== NOT EXECUTED status = _Heap_Size_of_user_area( the_heap, starting_address, size ); 40009298: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 4000929c: 92 10 00 19 mov %i1, %o1 <== NOT EXECUTED 400092a0: 40 00 12 14 call 4000daf0 <_Heap_Size_of_user_area> <== NOT EXECUTED 400092a4: 94 10 00 1a mov %i2, %o2 <== NOT EXECUTED 400092a8: 05 10 00 6b sethi %hi(0x4001ac00), %g2 <== NOT EXECUTED 400092ac: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 400092b0: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED 400092b4: 82 00 60 01 inc %g1 <== NOT EXECUTED 400092b8: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] <== NOT EXECUTED _RTEMS_Unlock_allocator(); 400092bc: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 400092c0: d0 00 62 a4 ld [ %g1 + 0x2a4 ], %o0 ! 4001aea4 <_RTEMS_Allocator_Mutex> <== NOT EXECUTED 400092c4: 94 10 20 00 clr %o2 <== NOT EXECUTED 400092c8: d2 02 20 08 ld [ %o0 + 8 ], %o1 <== NOT EXECUTED 400092cc: 7f ff f9 6b call 40007878 <_CORE_mutex_Surrender> <== NOT EXECUTED 400092d0: 90 02 20 10 add %o0, 0x10, %o0 <== NOT EXECUTED 400092d4: 7f ff ff 72 call 4000909c <_Thread_Enable_dispatch> <== NOT EXECUTED 400092d8: 01 00 00 00 nop <== NOT EXECUTED return status; } 400092dc: 81 c7 e0 08 ret <== NOT EXECUTED 400092e0: 81 e8 00 00 restore <== NOT EXECUTED 4000c898 <_Protected_heap_Get_free_information>: void _Protected_heap_Get_free_information( Heap_Control *the_heap, Heap_Information *info ) { 4000c898: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED _RTEMS_Lock_allocator(); 4000c89c: 7f ff dd 24 call 40003d2c <== NOT EXECUTED 4000c8a0: 01 00 00 00 nop <== NOT EXECUTED 4000c8a4: a2 10 00 08 mov %o0, %l1 <== NOT EXECUTED 4000c8a8: 03 10 00 ef sethi %hi(0x4003bc00), %g1 <== NOT EXECUTED 4000c8ac: c2 00 63 20 ld [ %g1 + 0x320 ], %g1 ! 4003bf20 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 4000c8b0: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000c8b4: 02 80 00 0b be 4000c8e0 <_Protected_heap_Get_free_information+0x48> <== NOT EXECUTED 4000c8b8: 03 10 00 ef sethi %hi(0x4003bc00), %g1 <== NOT EXECUTED 4000c8bc: 03 10 00 f0 sethi %hi(0x4003c000), %g1 <== NOT EXECUTED 4000c8c0: c2 00 61 00 ld [ %g1 + 0x100 ], %g1 ! 4003c100 <_System_state_Current> <== NOT EXECUTED 4000c8c4: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 4000c8c8: 08 80 00 05 bleu 4000c8dc <_Protected_heap_Get_free_information+0x44> <== NOT EXECUTED 4000c8cc: 90 10 20 00 clr %o0 <== NOT EXECUTED 4000c8d0: 92 10 20 00 clr %o1 <== NOT EXECUTED 4000c8d4: 7f ff fb 80 call 4000b6d4 <_Internal_error_Occurred> <== NOT EXECUTED 4000c8d8: 94 10 20 12 mov 0x12, %o2 <== NOT EXECUTED 4000c8dc: 03 10 00 ef sethi %hi(0x4003bc00), %g1 <== NOT EXECUTED 4000c8e0: e0 00 63 f4 ld [ %g1 + 0x3f4 ], %l0 ! 4003bff4 <_RTEMS_Allocator_Mutex> <== NOT EXECUTED Thread_Control *executing; ISR_Level level = *level_p; /* disabled when you get here */ executing = _Thread_Executing; 4000c8e4: 03 10 00 ef sethi %hi(0x4003bc00), %g1 <== NOT EXECUTED 4000c8e8: c4 00 63 fc ld [ %g1 + 0x3fc ], %g2 ! 4003bffc <_Thread_Executing> <== NOT EXECUTED executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; 4000c8ec: c0 20 a0 34 clr [ %g2 + 0x34 ] <== NOT EXECUTED if ( !_CORE_mutex_Is_locked( the_mutex ) ) { 4000c8f0: c2 04 20 60 ld [ %l0 + 0x60 ], %g1 <== NOT EXECUTED 4000c8f4: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000c8f8: 22 80 00 33 be,a 4000c9c4 <_Protected_heap_Get_free_information+0x12c> <== NOT EXECUTED 4000c8fc: c2 04 20 6c ld [ %l0 + 0x6c ], %g1 <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_LOCKED; 4000c900: c0 24 20 60 clr [ %l0 + 0x60 ] <== NOT EXECUTED the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 4000c904: c2 00 a0 08 ld [ %g2 + 8 ], %g1 <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_inherit_priority( CORE_mutex_Attributes *the_attribute ) { return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT; 4000c908: c6 04 20 58 ld [ %l0 + 0x58 ], %g3 <== NOT EXECUTED executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 4000c90c: c2 24 20 70 st %g1, [ %l0 + 0x70 ] <== NOT EXECUTED executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; 4000c910: c4 24 20 6c st %g2, [ %l0 + 0x6c ] <== NOT EXECUTED the_mutex->holder_id = executing->Object.id; the_mutex->nest_count = 1; 4000c914: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || 4000c918: 80 a0 e0 02 cmp %g3, 2 <== NOT EXECUTED 4000c91c: 02 80 00 05 be 4000c930 <_Protected_heap_Get_free_information+0x98> <== NOT EXECUTED 4000c920: c2 24 20 64 st %g1, [ %l0 + 0x64 ] <== NOT EXECUTED 4000c924: 80 a0 e0 03 cmp %g3, 3 <== NOT EXECUTED 4000c928: 32 80 00 06 bne,a 4000c940 <_Protected_heap_Get_free_information+0xa8> <== NOT EXECUTED 4000c92c: c2 04 20 58 ld [ %l0 + 0x58 ], %g1 <== NOT EXECUTED _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) executing->resource_count++; 4000c930: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 <== NOT EXECUTED 4000c934: 82 00 60 01 inc %g1 <== NOT EXECUTED 4000c938: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] <== NOT EXECUTED if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) { 4000c93c: c2 04 20 58 ld [ %l0 + 0x58 ], %g1 <== NOT EXECUTED 4000c940: 80 a0 60 03 cmp %g1, 3 <== NOT EXECUTED 4000c944: 22 80 00 03 be,a 4000c950 <_Protected_heap_Get_free_information+0xb8> <== NOT EXECUTED 4000c948: c6 04 20 5c ld [ %l0 + 0x5c ], %g3 <== NOT EXECUTED _ISR_Enable( level ); 4000c94c: 30 80 00 2c b,a 4000c9fc <_Protected_heap_Get_free_information+0x164> <== NOT EXECUTED { Priority_Control ceiling; Priority_Control current; ceiling = the_mutex->Attributes.priority_ceiling; current = executing->current_priority; 4000c950: c2 00 a0 14 ld [ %g2 + 0x14 ], %g1 <== NOT EXECUTED if ( current == ceiling ) { 4000c954: 80 a0 40 03 cmp %g1, %g3 <== NOT EXECUTED 4000c958: 12 80 00 03 bne 4000c964 <_Protected_heap_Get_free_information+0xcc> <== NOT EXECUTED 4000c95c: 01 00 00 00 nop <== NOT EXECUTED _ISR_Enable( level ); 4000c960: 30 80 00 27 b,a 4000c9fc <_Protected_heap_Get_free_information+0x164> <== NOT EXECUTED return 0; } if ( current > ceiling ) { 4000c964: 08 80 00 10 bleu 4000c9a4 <_Protected_heap_Get_free_information+0x10c> <== NOT EXECUTED 4000c968: 82 10 20 06 mov 6, %g1 <== NOT EXECUTED rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 4000c96c: 05 10 00 ef sethi %hi(0x4003bc00), %g2 <== NOT EXECUTED 4000c970: c2 00 a3 20 ld [ %g2 + 0x320 ], %g1 ! 4003bf20 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 4000c974: 82 00 60 01 inc %g1 <== NOT EXECUTED 4000c978: c2 20 a3 20 st %g1, [ %g2 + 0x320 ] <== NOT EXECUTED _Thread_Disable_dispatch(); _ISR_Enable( level ); 4000c97c: 7f ff dc f0 call 40003d3c <== NOT EXECUTED 4000c980: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED _Thread_Change_priority( 4000c984: d2 04 20 5c ld [ %l0 + 0x5c ], %o1 <== NOT EXECUTED 4000c988: d0 04 20 6c ld [ %l0 + 0x6c ], %o0 <== NOT EXECUTED 4000c98c: 40 00 00 db call 4000ccf8 <_Thread_Change_priority> <== NOT EXECUTED 4000c990: 94 10 20 00 clr %o2 <== NOT EXECUTED the_mutex->holder, the_mutex->Attributes.priority_ceiling, FALSE ); _Thread_Enable_dispatch(); 4000c994: 7f ff ff b4 call 4000c864 <_Thread_Enable_dispatch> <== NOT EXECUTED 4000c998: 01 00 00 00 nop <== NOT EXECUTED _Heap_Get_free_information( the_heap, info ); 4000c99c: 10 80 00 32 b 4000ca64 <_Protected_heap_Get_free_information+0x1cc> <== NOT EXECUTED 4000c9a0: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; 4000c9a4: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_UNLOCKED; 4000c9a8: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ 4000c9ac: c0 24 20 64 clr [ %l0 + 0x64 ] <== NOT EXECUTED _Thread_Enable_dispatch(); return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; the_mutex->lock = CORE_MUTEX_UNLOCKED; 4000c9b0: c2 24 20 60 st %g1, [ %l0 + 0x60 ] <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ executing->resource_count--; /* undo locking above */ 4000c9b4: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 <== NOT EXECUTED 4000c9b8: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 4000c9bc: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] <== NOT EXECUTED _ISR_Enable( level ); 4000c9c0: 30 80 00 0f b,a 4000c9fc <_Protected_heap_Get_free_information+0x164> <== NOT EXECUTED /* * At this point, we know the mutex was not available. If this thread * is the thread that has locked the mutex, let's see if we are allowed * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { 4000c9c4: 80 a0 40 02 cmp %g1, %g2 <== NOT EXECUTED 4000c9c8: 32 80 00 13 bne,a 4000ca14 <_Protected_heap_Get_free_information+0x17c> <== NOT EXECUTED 4000c9cc: 21 10 00 ef sethi %hi(0x4003bc00), %l0 <== NOT EXECUTED switch ( the_mutex->Attributes.lock_nesting_behavior ) { 4000c9d0: c2 04 20 50 ld [ %l0 + 0x50 ], %g1 ! 4003bc50 <== NOT EXECUTED 4000c9d4: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000c9d8: 22 80 00 07 be,a 4000c9f4 <_Protected_heap_Get_free_information+0x15c> <== NOT EXECUTED 4000c9dc: c2 04 20 64 ld [ %l0 + 0x64 ], %g1 <== NOT EXECUTED 4000c9e0: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 4000c9e4: 32 80 00 0c bne,a 4000ca14 <_Protected_heap_Get_free_information+0x17c> <== NOT EXECUTED 4000c9e8: 21 10 00 ef sethi %hi(0x4003bc00), %l0 <== NOT EXECUTED case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; _ISR_Enable( level ); return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 4000c9ec: 10 80 00 08 b 4000ca0c <_Protected_heap_Get_free_information+0x174> <== NOT EXECUTED 4000c9f0: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { switch ( the_mutex->Attributes.lock_nesting_behavior ) { case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; 4000c9f4: 82 00 60 01 inc %g1 <== NOT EXECUTED 4000c9f8: c2 24 20 64 st %g1, [ %l0 + 0x64 ] <== NOT EXECUTED _ISR_Enable( level ); 4000c9fc: 7f ff dc d0 call 40003d3c <== NOT EXECUTED 4000ca00: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 4000ca04: 10 80 00 18 b 4000ca64 <_Protected_heap_Get_free_information+0x1cc> <== NOT EXECUTED 4000ca08: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 4000ca0c: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED _ISR_Enable( level ); 4000ca10: 30 bf ff fb b,a 4000c9fc <_Protected_heap_Get_free_information+0x164> <== NOT EXECUTED void _Protected_heap_Get_free_information( Heap_Control *the_heap, Heap_Information *info ) { _RTEMS_Lock_allocator(); 4000ca14: c6 04 23 f4 ld [ %l0 + 0x3f4 ], %g3 <== NOT EXECUTED 4000ca18: 03 10 00 ef sethi %hi(0x4003bc00), %g1 <== NOT EXECUTED 4000ca1c: da 00 e0 08 ld [ %g3 + 8 ], %o5 <== NOT EXECUTED 4000ca20: c8 00 63 fc ld [ %g1 + 0x3fc ], %g4 <== NOT EXECUTED 4000ca24: 05 10 00 ef sethi %hi(0x4003bc00), %g2 <== NOT EXECUTED 4000ca28: c2 00 a3 20 ld [ %g2 + 0x320 ], %g1 ! 4003bf20 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 4000ca2c: da 21 20 20 st %o5, [ %g4 + 0x20 ] <== NOT EXECUTED 4000ca30: 82 00 60 01 inc %g1 <== NOT EXECUTED 4000ca34: c2 20 a3 20 st %g1, [ %g2 + 0x320 ] <== NOT EXECUTED 4000ca38: 82 00 e0 10 add %g3, 0x10, %g1 <== NOT EXECUTED 4000ca3c: c2 21 20 44 st %g1, [ %g4 + 0x44 ] <== NOT EXECUTED 4000ca40: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED 4000ca44: c2 20 e0 40 st %g1, [ %g3 + 0x40 ] <== NOT EXECUTED 4000ca48: 7f ff dc bd call 40003d3c <== NOT EXECUTED 4000ca4c: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 4000ca50: d0 04 23 f4 ld [ %l0 + 0x3f4 ], %o0 <== NOT EXECUTED 4000ca54: 92 10 20 00 clr %o1 <== NOT EXECUTED 4000ca58: 7f ff f9 05 call 4000ae6c <_CORE_mutex_Seize_interrupt_blocking> <== NOT EXECUTED 4000ca5c: 90 02 20 10 add %o0, 0x10, %o0 <== NOT EXECUTED _Heap_Get_free_information( the_heap, info ); 4000ca60: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 4000ca64: 40 00 34 d0 call 40019da4 <_Heap_Get_free_information> <== NOT EXECUTED 4000ca68: 92 10 00 19 mov %i1, %o1 <== NOT EXECUTED 4000ca6c: 05 10 00 ef sethi %hi(0x4003bc00), %g2 <== NOT EXECUTED 4000ca70: c2 00 a3 20 ld [ %g2 + 0x320 ], %g1 ! 4003bf20 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 4000ca74: 82 00 60 01 inc %g1 <== NOT EXECUTED 4000ca78: c2 20 a3 20 st %g1, [ %g2 + 0x320 ] <== NOT EXECUTED _RTEMS_Unlock_allocator(); 4000ca7c: 03 10 00 ef sethi %hi(0x4003bc00), %g1 <== NOT EXECUTED 4000ca80: d0 00 63 f4 ld [ %g1 + 0x3f4 ], %o0 ! 4003bff4 <_RTEMS_Allocator_Mutex> <== NOT EXECUTED 4000ca84: 94 10 20 00 clr %o2 <== NOT EXECUTED 4000ca88: d2 02 20 08 ld [ %o0 + 8 ], %o1 <== NOT EXECUTED 4000ca8c: 7f ff f9 1a call 4000aef4 <_CORE_mutex_Surrender> <== NOT EXECUTED 4000ca90: 90 02 20 10 add %o0, 0x10, %o0 <== NOT EXECUTED 4000ca94: 7f ff ff 74 call 4000c864 <_Thread_Enable_dispatch> <== NOT EXECUTED 4000ca98: 81 e8 00 00 restore <== NOT EXECUTED 4000ca9c: 01 00 00 00 nop 40009318 <_Protected_heap_Resize_block>: boolean _Protected_heap_Resize_block( Heap_Control *the_heap, void *starting_address, size_t size ) { 40009318: 9d e3 bf 90 save %sp, -112, %sp <== NOT EXECUTED Heap_Resize_status status; uint32_t old_mem_size; uint32_t avail_mem_size; _RTEMS_Lock_allocator(); 4000931c: 7f ff e2 ec call 40001ecc <== NOT EXECUTED 40009320: 01 00 00 00 nop <== NOT EXECUTED 40009324: a2 10 00 08 mov %o0, %l1 <== NOT EXECUTED 40009328: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 4000932c: c2 00 61 d0 ld [ %g1 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40009330: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40009334: 02 80 00 0b be 40009360 <_Protected_heap_Resize_block+0x48> <== NOT EXECUTED 40009338: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 4000933c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40009340: c2 00 63 b0 ld [ %g1 + 0x3b0 ], %g1 ! 4001afb0 <_System_state_Current> <== NOT EXECUTED 40009344: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 40009348: 08 80 00 05 bleu 4000935c <_Protected_heap_Resize_block+0x44> <== NOT EXECUTED 4000934c: 90 10 20 00 clr %o0 <== NOT EXECUTED 40009350: 92 10 20 00 clr %o1 <== NOT EXECUTED 40009354: 7f ff fb 41 call 40008058 <_Internal_error_Occurred> <== NOT EXECUTED 40009358: 94 10 20 12 mov 0x12, %o2 <== NOT EXECUTED 4000935c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40009360: e0 00 62 a4 ld [ %g1 + 0x2a4 ], %l0 ! 4001aea4 <_RTEMS_Allocator_Mutex> <== NOT EXECUTED Thread_Control *executing; ISR_Level level = *level_p; /* disabled when you get here */ executing = _Thread_Executing; 40009364: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40009368: c4 00 62 ac ld [ %g1 + 0x2ac ], %g2 ! 4001aeac <_Thread_Executing> <== NOT EXECUTED executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; 4000936c: c0 20 a0 34 clr [ %g2 + 0x34 ] <== NOT EXECUTED if ( !_CORE_mutex_Is_locked( the_mutex ) ) { 40009370: c2 04 20 60 ld [ %l0 + 0x60 ], %g1 <== NOT EXECUTED 40009374: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40009378: 22 80 00 33 be,a 40009444 <_Protected_heap_Resize_block+0x12c> <== NOT EXECUTED 4000937c: c2 04 20 6c ld [ %l0 + 0x6c ], %g1 <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_LOCKED; 40009380: c0 24 20 60 clr [ %l0 + 0x60 ] <== NOT EXECUTED the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 40009384: c2 00 a0 08 ld [ %g2 + 8 ], %g1 <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_inherit_priority( CORE_mutex_Attributes *the_attribute ) { return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT; 40009388: c6 04 20 58 ld [ %l0 + 0x58 ], %g3 <== NOT EXECUTED executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 4000938c: c2 24 20 70 st %g1, [ %l0 + 0x70 ] <== NOT EXECUTED executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; 40009390: c4 24 20 6c st %g2, [ %l0 + 0x6c ] <== NOT EXECUTED the_mutex->holder_id = executing->Object.id; the_mutex->nest_count = 1; 40009394: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || 40009398: 80 a0 e0 02 cmp %g3, 2 <== NOT EXECUTED 4000939c: 02 80 00 05 be 400093b0 <_Protected_heap_Resize_block+0x98> <== NOT EXECUTED 400093a0: c2 24 20 64 st %g1, [ %l0 + 0x64 ] <== NOT EXECUTED 400093a4: 80 a0 e0 03 cmp %g3, 3 <== NOT EXECUTED 400093a8: 32 80 00 06 bne,a 400093c0 <_Protected_heap_Resize_block+0xa8> <== NOT EXECUTED 400093ac: c2 04 20 58 ld [ %l0 + 0x58 ], %g1 <== NOT EXECUTED _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) executing->resource_count++; 400093b0: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 <== NOT EXECUTED 400093b4: 82 00 60 01 inc %g1 <== NOT EXECUTED 400093b8: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] <== NOT EXECUTED if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) { 400093bc: c2 04 20 58 ld [ %l0 + 0x58 ], %g1 <== NOT EXECUTED 400093c0: 80 a0 60 03 cmp %g1, 3 <== NOT EXECUTED 400093c4: 22 80 00 03 be,a 400093d0 <_Protected_heap_Resize_block+0xb8> <== NOT EXECUTED 400093c8: c6 04 20 5c ld [ %l0 + 0x5c ], %g3 <== NOT EXECUTED _ISR_Enable( level ); 400093cc: 30 80 00 2c b,a 4000947c <_Protected_heap_Resize_block+0x164> <== NOT EXECUTED { Priority_Control ceiling; Priority_Control current; ceiling = the_mutex->Attributes.priority_ceiling; current = executing->current_priority; 400093d0: c2 00 a0 14 ld [ %g2 + 0x14 ], %g1 <== NOT EXECUTED if ( current == ceiling ) { 400093d4: 80 a0 40 03 cmp %g1, %g3 <== NOT EXECUTED 400093d8: 12 80 00 03 bne 400093e4 <_Protected_heap_Resize_block+0xcc> <== NOT EXECUTED 400093dc: 01 00 00 00 nop <== NOT EXECUTED _ISR_Enable( level ); 400093e0: 30 80 00 27 b,a 4000947c <_Protected_heap_Resize_block+0x164> <== NOT EXECUTED return 0; } if ( current > ceiling ) { 400093e4: 08 80 00 10 bleu 40009424 <_Protected_heap_Resize_block+0x10c> <== NOT EXECUTED 400093e8: 82 10 20 06 mov 6, %g1 <== NOT EXECUTED rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 400093ec: 05 10 00 6b sethi %hi(0x4001ac00), %g2 <== NOT EXECUTED 400093f0: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 400093f4: 82 00 60 01 inc %g1 <== NOT EXECUTED 400093f8: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] <== NOT EXECUTED _Thread_Disable_dispatch(); _ISR_Enable( level ); 400093fc: 7f ff e2 b8 call 40001edc <== NOT EXECUTED 40009400: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED _Thread_Change_priority( 40009404: d2 04 20 5c ld [ %l0 + 0x5c ], %o1 <== NOT EXECUTED 40009408: d0 04 20 6c ld [ %l0 + 0x6c ], %o0 <== NOT EXECUTED 4000940c: 40 00 00 4c call 4000953c <_Thread_Change_priority> <== NOT EXECUTED 40009410: 94 10 20 00 clr %o2 <== NOT EXECUTED the_mutex->holder, the_mutex->Attributes.priority_ceiling, FALSE ); _Thread_Enable_dispatch(); 40009414: 7f ff ff b4 call 400092e4 <_Thread_Enable_dispatch> <== NOT EXECUTED 40009418: 01 00 00 00 nop <== NOT EXECUTED status = _Heap_Resize_block( 4000941c: 10 80 00 32 b 400094e4 <_Protected_heap_Resize_block+0x1cc> <== NOT EXECUTED 40009420: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; 40009424: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_UNLOCKED; 40009428: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ 4000942c: c0 24 20 64 clr [ %l0 + 0x64 ] <== NOT EXECUTED _Thread_Enable_dispatch(); return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; the_mutex->lock = CORE_MUTEX_UNLOCKED; 40009430: c2 24 20 60 st %g1, [ %l0 + 0x60 ] <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ executing->resource_count--; /* undo locking above */ 40009434: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 <== NOT EXECUTED 40009438: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 4000943c: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] <== NOT EXECUTED _ISR_Enable( level ); 40009440: 30 80 00 0f b,a 4000947c <_Protected_heap_Resize_block+0x164> <== NOT EXECUTED /* * At this point, we know the mutex was not available. If this thread * is the thread that has locked the mutex, let's see if we are allowed * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { 40009444: 80 a0 40 02 cmp %g1, %g2 <== NOT EXECUTED 40009448: 32 80 00 13 bne,a 40009494 <_Protected_heap_Resize_block+0x17c> <== NOT EXECUTED 4000944c: 21 10 00 6b sethi %hi(0x4001ac00), %l0 <== NOT EXECUTED switch ( the_mutex->Attributes.lock_nesting_behavior ) { 40009450: c2 04 20 50 ld [ %l0 + 0x50 ], %g1 ! 4001ac50 <== NOT EXECUTED 40009454: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40009458: 22 80 00 07 be,a 40009474 <_Protected_heap_Resize_block+0x15c> <== NOT EXECUTED 4000945c: c2 04 20 64 ld [ %l0 + 0x64 ], %g1 <== NOT EXECUTED 40009460: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 40009464: 12 80 00 0c bne 40009494 <_Protected_heap_Resize_block+0x17c> <== NOT EXECUTED 40009468: 21 10 00 6b sethi %hi(0x4001ac00), %l0 <== NOT EXECUTED case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; _ISR_Enable( level ); return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 4000946c: 10 80 00 08 b 4000948c <_Protected_heap_Resize_block+0x174> <== NOT EXECUTED 40009470: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { switch ( the_mutex->Attributes.lock_nesting_behavior ) { case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; 40009474: 82 00 60 01 inc %g1 <== NOT EXECUTED 40009478: c2 24 20 64 st %g1, [ %l0 + 0x64 ] <== NOT EXECUTED _ISR_Enable( level ); 4000947c: 7f ff e2 98 call 40001edc <== NOT EXECUTED 40009480: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 40009484: 10 80 00 18 b 400094e4 <_Protected_heap_Resize_block+0x1cc> <== NOT EXECUTED 40009488: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 4000948c: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED _ISR_Enable( level ); 40009490: 30 bf ff fb b,a 4000947c <_Protected_heap_Resize_block+0x164> <== NOT EXECUTED { Heap_Resize_status status; uint32_t old_mem_size; uint32_t avail_mem_size; _RTEMS_Lock_allocator(); 40009494: c6 04 22 a4 ld [ %l0 + 0x2a4 ], %g3 <== NOT EXECUTED 40009498: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 4000949c: da 00 e0 08 ld [ %g3 + 8 ], %o5 <== NOT EXECUTED 400094a0: c8 00 62 ac ld [ %g1 + 0x2ac ], %g4 <== NOT EXECUTED 400094a4: 05 10 00 6b sethi %hi(0x4001ac00), %g2 <== NOT EXECUTED 400094a8: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 400094ac: da 21 20 20 st %o5, [ %g4 + 0x20 ] <== NOT EXECUTED 400094b0: 82 00 60 01 inc %g1 <== NOT EXECUTED 400094b4: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] <== NOT EXECUTED 400094b8: 82 00 e0 10 add %g3, 0x10, %g1 <== NOT EXECUTED 400094bc: c2 21 20 44 st %g1, [ %g4 + 0x44 ] <== NOT EXECUTED 400094c0: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED 400094c4: c2 20 e0 40 st %g1, [ %g3 + 0x40 ] <== NOT EXECUTED 400094c8: 7f ff e2 85 call 40001edc <== NOT EXECUTED 400094cc: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 400094d0: d0 04 22 a4 ld [ %l0 + 0x2a4 ], %o0 <== NOT EXECUTED 400094d4: 92 10 20 00 clr %o1 <== NOT EXECUTED 400094d8: 7f ff f8 c6 call 400077f0 <_CORE_mutex_Seize_interrupt_blocking> <== NOT EXECUTED 400094dc: 90 02 20 10 add %o0, 0x10, %o0 <== NOT EXECUTED status = _Heap_Resize_block( 400094e0: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 400094e4: 92 10 00 19 mov %i1, %o1 <== NOT EXECUTED 400094e8: 94 10 00 1a mov %i2, %o2 <== NOT EXECUTED 400094ec: 96 07 bf f4 add %fp, -12, %o3 <== NOT EXECUTED 400094f0: 40 00 10 f7 call 4000d8cc <_Heap_Resize_block> <== NOT EXECUTED 400094f4: 98 07 bf f0 add %fp, -16, %o4 <== NOT EXECUTED 400094f8: 05 10 00 6b sethi %hi(0x4001ac00), %g2 <== NOT EXECUTED 400094fc: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40009500: a0 10 00 08 mov %o0, %l0 <== NOT EXECUTED 40009504: 82 00 60 01 inc %g1 <== NOT EXECUTED 40009508: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] <== NOT EXECUTED the_heap, starting_address, size, &old_mem_size, &avail_mem_size ); _RTEMS_Unlock_allocator(); 4000950c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40009510: d0 00 62 a4 ld [ %g1 + 0x2a4 ], %o0 ! 4001aea4 <_RTEMS_Allocator_Mutex> <== NOT EXECUTED 40009514: 94 10 20 00 clr %o2 <== NOT EXECUTED 40009518: d2 02 20 08 ld [ %o0 + 8 ], %o1 <== NOT EXECUTED 4000951c: 7f ff f8 d7 call 40007878 <_CORE_mutex_Surrender> <== NOT EXECUTED 40009520: 90 02 20 10 add %o0, 0x10, %o0 <== NOT EXECUTED 40009524: 7f ff ff 70 call 400092e4 <_Thread_Enable_dispatch> <== NOT EXECUTED 40009528: 01 00 00 00 nop <== NOT EXECUTED return (status == HEAP_RESIZE_SUCCESSFUL); } 4000952c: 80 a0 00 10 cmp %g0, %l0 <== NOT EXECUTED 40009530: b0 60 3f ff subx %g0, -1, %i0 <== NOT EXECUTED 40009534: 81 c7 e0 08 ret <== NOT EXECUTED 40009538: 81 e8 00 00 restore <== NOT EXECUTED 4000d5ac <_RTEMS_tasks_Delete_extension>: User_extensions_routine _RTEMS_tasks_Delete_extension( Thread_Control *executing, Thread_Control *deleted ) { 4000d5ac: 9d e3 bf 98 save %sp, -104, %sp /* * Free per task variable memory */ tvp = deleted->task_variables; 4000d5b0: e0 06 61 7c ld [ %i1 + 0x17c ], %l0 deleted->task_variables = NULL; while (tvp) { next = (rtems_task_variable_t *)tvp->next; if (_Thread_Is_executing(deleted)) { 4000d5b4: 25 10 00 6b sethi %hi(0x4001ac00), %l2 /* * Free per task variable memory */ tvp = deleted->task_variables; deleted->task_variables = NULL; 4000d5b8: 10 80 00 18 b 4000d618 <_RTEMS_tasks_Delete_extension+0x6c> 4000d5bc: c0 26 61 7c clr [ %i1 + 0x17c ] 4000d5c0: c4 04 20 10 ld [ %l0 + 0x10 ], %g2 <== NOT EXECUTED while (tvp) { next = (rtems_task_variable_t *)tvp->next; if (_Thread_Is_executing(deleted)) { 4000d5c4: 80 a6 40 01 cmp %i1, %g1 <== NOT EXECUTED 4000d5c8: 12 80 00 0c bne 4000d5f8 <_RTEMS_tasks_Delete_extension+0x4c> <== NOT EXECUTED 4000d5cc: e2 04 00 00 ld [ %l0 ], %l1 <== NOT EXECUTED if (tvp->dtor) 4000d5d0: 80 a0 a0 00 cmp %g2, 0 <== NOT EXECUTED 4000d5d4: 22 80 00 06 be,a 4000d5ec <_RTEMS_tasks_Delete_extension+0x40> <== NOT EXECUTED 4000d5d8: c4 04 20 04 ld [ %l0 + 4 ], %g2 <== NOT EXECUTED (*tvp->dtor)(*tvp->ptr); 4000d5dc: c2 04 20 04 ld [ %l0 + 4 ], %g1 <== NOT EXECUTED 4000d5e0: 9f c0 80 00 call %g2 <== NOT EXECUTED 4000d5e4: d0 00 40 00 ld [ %g1 ], %o0 <== NOT EXECUTED *tvp->ptr = tvp->gval; 4000d5e8: c4 04 20 04 ld [ %l0 + 4 ], %g2 <== NOT EXECUTED 4000d5ec: c2 04 20 08 ld [ %l0 + 8 ], %g1 <== NOT EXECUTED 4000d5f0: 10 80 00 07 b 4000d60c <_RTEMS_tasks_Delete_extension+0x60> <== NOT EXECUTED 4000d5f4: c2 20 80 00 st %g1, [ %g2 ] <== NOT EXECUTED } else { if (tvp->dtor) 4000d5f8: 80 a0 a0 00 cmp %g2, 0 <== NOT EXECUTED 4000d5fc: 02 80 00 05 be 4000d610 <_RTEMS_tasks_Delete_extension+0x64> <== NOT EXECUTED 4000d600: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED (*tvp->dtor)(tvp->tval); 4000d604: 9f c0 80 00 call %g2 <== NOT EXECUTED 4000d608: d0 04 20 0c ld [ %l0 + 0xc ], %o0 <== NOT EXECUTED } _Workspace_Free( tvp ); 4000d60c: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 4000d610: 7f ff ff e0 call 4000d590 <_Workspace_Free> <== NOT EXECUTED 4000d614: a0 10 00 11 mov %l1, %l0 <== NOT EXECUTED * Free per task variable memory */ tvp = deleted->task_variables; deleted->task_variables = NULL; while (tvp) { 4000d618: 80 a4 20 00 cmp %l0, 0 4000d61c: 12 bf ff e9 bne 4000d5c0 <_RTEMS_tasks_Delete_extension+0x14> 4000d620: c2 04 a2 ac ld [ %l2 + 0x2ac ], %g1 /* * Free API specific memory */ (void) _Workspace_Free( deleted->API_Extensions[ THREAD_API_RTEMS ] ); 4000d624: 7f ff ff db call 4000d590 <_Workspace_Free> 4000d628: d0 06 61 6c ld [ %i1 + 0x16c ], %o0 deleted->API_Extensions[ THREAD_API_RTEMS ] = NULL; 4000d62c: c0 26 61 6c clr [ %i1 + 0x16c ] } 4000d630: 81 c7 e0 08 ret 4000d634: 81 e8 00 00 restore 40006ed8 <_RTEMS_tasks_Initialize_user_tasks_body>: * * Output parameters: NONE */ void _RTEMS_tasks_Initialize_user_tasks_body( void ) { 40006ed8: 9d e3 bf 90 save %sp, -112, %sp rtems_status_code return_value; rtems_initialization_tasks_table *user_tasks; rtems_api_configuration_table *api_configuration; api_configuration = _Configuration_Table->RTEMS_api_configuration; 40006edc: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40006ee0: c2 00 62 90 ld [ %g1 + 0x290 ], %g1 ! 4001ae90 <_Configuration_Table> 40006ee4: c2 00 60 2c ld [ %g1 + 0x2c ], %g1 /* * NOTE: This is slightly different from the Ada implementation. */ user_tasks = api_configuration->User_initialization_tasks_table; 40006ee8: d0 00 60 28 ld [ %g1 + 0x28 ], %o0 maximum = api_configuration->number_of_initialization_tasks; if ( !user_tasks || maximum == 0 ) 40006eec: 80 a2 20 00 cmp %o0, 0 40006ef0: 02 80 00 25 be 40006f84 <_RTEMS_tasks_Initialize_user_tasks_body+0xac> 40006ef4: e4 00 60 24 ld [ %g1 + 0x24 ], %l2 40006ef8: 80 a4 a0 00 cmp %l2, 0 40006efc: 02 80 00 22 be 40006f84 <_RTEMS_tasks_Initialize_user_tasks_body+0xac> 40006f00: a0 10 00 08 mov %o0, %l0 return; 40006f04: a2 10 20 00 clr %l1 for ( index=0 ; index < maximum ; index++ ) { return_value = rtems_task_create( 40006f08: 10 80 00 1c b 40006f78 <_RTEMS_tasks_Initialize_user_tasks_body+0xa0> 40006f0c: a6 07 bf f4 add %fp, -12, %l3 40006f10: d6 04 20 14 ld [ %l0 + 0x14 ], %o3 40006f14: d8 04 20 0c ld [ %l0 + 0xc ], %o4 40006f18: d2 04 20 08 ld [ %l0 + 8 ], %o1 40006f1c: d4 04 20 04 ld [ %l0 + 4 ], %o2 40006f20: d0 04 00 00 ld [ %l0 ], %o0 40006f24: 7f ff ff 34 call 40006bf4 40006f28: a2 04 60 01 inc %l1 user_tasks[ index ].mode_set, user_tasks[ index ].attribute_set, &id ); if ( !rtems_is_status_successful( return_value ) ) 40006f2c: 80 a2 20 00 cmp %o0, 0 40006f30: 22 80 00 07 be,a 40006f4c <_RTEMS_tasks_Initialize_user_tasks_body+0x74> 40006f34: d2 04 20 10 ld [ %l0 + 0x10 ], %o1 _Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, TRUE, return_value ); 40006f38: 94 10 00 08 mov %o0, %o2 <== NOT EXECUTED 40006f3c: 92 10 20 01 mov 1, %o1 <== NOT EXECUTED 40006f40: 40 00 04 46 call 40008058 <_Internal_error_Occurred> <== NOT EXECUTED 40006f44: 90 10 20 01 mov 1, %o0 <== NOT EXECUTED return_value = rtems_task_start( 40006f48: d2 04 20 10 ld [ %l0 + 0x10 ], %o1 <== NOT EXECUTED 40006f4c: d4 04 20 18 ld [ %l0 + 0x18 ], %o2 40006f50: d0 07 bf f4 ld [ %fp + -12 ], %o0 40006f54: 40 00 00 1b call 40006fc0 40006f58: a0 04 20 1c add %l0, 0x1c, %l0 id, user_tasks[ index ].entry_point, user_tasks[ index ].argument ); if ( !rtems_is_status_successful( return_value ) ) 40006f5c: 80 a2 20 00 cmp %o0, 0 40006f60: 02 80 00 07 be 40006f7c <_RTEMS_tasks_Initialize_user_tasks_body+0xa4> 40006f64: 80 a4 40 12 cmp %l1, %l2 _Internal_error_Occurred( INTERNAL_ERROR_RTEMS_API, TRUE, return_value ); 40006f68: 94 10 00 08 mov %o0, %o2 <== NOT EXECUTED 40006f6c: 92 10 20 01 mov 1, %o1 <== NOT EXECUTED 40006f70: 40 00 04 3a call 40008058 <_Internal_error_Occurred> <== NOT EXECUTED 40006f74: 90 10 20 01 mov 1, %o0 <== NOT EXECUTED maximum = api_configuration->number_of_initialization_tasks; if ( !user_tasks || maximum == 0 ) return; for ( index=0 ; index < maximum ; index++ ) { 40006f78: 80 a4 40 12 cmp %l1, %l2 40006f7c: 12 bf ff e5 bne 40006f10 <_RTEMS_tasks_Initialize_user_tasks_body+0x38> 40006f80: 9a 10 00 13 mov %l3, %o5 40006f84: 81 c7 e0 08 ret 40006f88: 81 e8 00 00 restore 40007ae8 <_Rate_monotonic_Timeout>: void _Rate_monotonic_Timeout( Objects_Id id, void *ignored ) { 40007ae8: 9d e3 bf 90 save %sp, -112, %sp 40007aec: 11 10 00 7e sethi %hi(0x4001f800), %o0 40007af0: 92 10 00 18 mov %i0, %o1 40007af4: 90 12 22 1c or %o0, 0x21c, %o0 40007af8: 40 00 09 5f call 4000a074 <_Objects_Get> 40007afc: 94 07 bf f4 add %fp, -12, %o2 * 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 ) { 40007b00: c2 07 bf f4 ld [ %fp + -12 ], %g1 40007b04: 80 a0 60 00 cmp %g1, 0 40007b08: 12 80 00 20 bne 40007b88 <_Rate_monotonic_Timeout+0xa0> 40007b0c: b0 10 00 08 mov %o0, %i0 case OBJECTS_REMOTE: /* impossible */ case OBJECTS_ERROR: break; case OBJECTS_LOCAL: the_thread = the_period->owner; 40007b10: d0 02 20 50 ld [ %o0 + 0x50 ], %o0 if ( _States_Is_waiting_for_period( the_thread->current_state ) && 40007b14: 03 00 00 10 sethi %hi(0x4000), %g1 40007b18: c4 02 20 10 ld [ %o0 + 0x10 ], %g2 40007b1c: 80 88 80 01 btst %g2, %g1 40007b20: 22 80 00 0c be,a 40007b50 <_Rate_monotonic_Timeout+0x68> 40007b24: c2 06 20 38 ld [ %i0 + 0x38 ], %g1 40007b28: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 40007b2c: c2 06 20 08 ld [ %i0 + 8 ], %g1 40007b30: 80 a0 80 01 cmp %g2, %g1 40007b34: 32 80 00 07 bne,a 40007b50 <_Rate_monotonic_Timeout+0x68> 40007b38: c2 06 20 38 ld [ %i0 + 0x38 ], %g1 <== NOT EXECUTED RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); 40007b3c: 13 04 00 ff sethi %hi(0x1003fc00), %o1 40007b40: 40 00 0d 87 call 4000b15c <_Thread_Clear_state> 40007b44: 92 12 63 f8 or %o1, 0x3f8, %o1 ! 1003fff8 the_thread->Wait.id == the_period->Object.id ) { _Thread_Unblock( the_thread ); _Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length ); 40007b48: 10 80 00 08 b 40007b68 <_Rate_monotonic_Timeout+0x80> 40007b4c: d2 06 20 4c ld [ %i0 + 0x4c ], %o1 } else if ( the_period->state == RATE_MONOTONIC_OWNER_IS_BLOCKING ) { 40007b50: 80 a0 60 01 cmp %g1, 1 40007b54: 12 80 00 08 bne 40007b74 <_Rate_monotonic_Timeout+0x8c> 40007b58: 82 10 20 04 mov 4, %g1 the_period->state = RATE_MONOTONIC_EXPIRED_WHILE_BLOCKING; _Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length ); 40007b5c: d2 06 20 4c ld [ %i0 + 0x4c ], %o1 <== NOT EXECUTED the_thread->Wait.id == the_period->Object.id ) { _Thread_Unblock( the_thread ); _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; 40007b60: 82 10 20 03 mov 3, %g1 <== NOT EXECUTED 40007b64: c2 26 20 38 st %g1, [ %i0 + 0x38 ] <== NOT EXECUTED _Watchdog_Insert_ticks( &the_period->Timer, the_period->next_length ); 40007b68: 7f ff ff d8 call 40007ac8 <_Watchdog_Insert_ticks> 40007b6c: 90 06 20 10 add %i0, 0x10, %o0 40007b70: 30 80 00 02 b,a 40007b78 <_Rate_monotonic_Timeout+0x90> } else the_period->state = RATE_MONOTONIC_EXPIRED; 40007b74: c2 26 20 38 st %g1, [ %i0 + 0x38 ] */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; 40007b78: 05 10 00 7e sethi %hi(0x4001f800), %g2 40007b7c: c2 00 a3 b0 ld [ %g2 + 0x3b0 ], %g1 ! 4001fbb0 <_Thread_Dispatch_disable_level> 40007b80: 82 00 7f ff add %g1, -1, %g1 40007b84: c2 20 a3 b0 st %g1, [ %g2 + 0x3b0 ] 40007b88: 81 c7 e0 08 ret 40007b8c: 81 e8 00 00 restore 4000945c <_TOD_Set>: */ void _TOD_Set( const struct timespec *time ) { 4000945c: 9d e3 bf 98 save %sp, -104, %sp rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40009460: 03 10 00 9e sethi %hi(0x40027800), %g1 40009464: c4 00 61 f0 ld [ %g1 + 0x1f0 ], %g2 ! 400279f0 <_Thread_Dispatch_disable_level> 40009468: 84 00 a0 01 inc %g2 4000946c: c4 20 61 f0 st %g2, [ %g1 + 0x1f0 ] _Thread_Disable_dispatch(); _TOD_Deactivate(); if ( time->tv_sec < _TOD_Seconds_since_epoch ) 40009470: 03 10 00 9e sethi %hi(0x40027800), %g1 40009474: d2 06 00 00 ld [ %i0 ], %o1 40009478: c2 00 62 a8 ld [ %g1 + 0x2a8 ], %g1 4000947c: 80 a2 40 01 cmp %o1, %g1 40009480: 36 80 00 05 bge,a 40009494 <_TOD_Set+0x38> 40009484: 92 22 40 01 sub %o1, %g1, %o1 _Watchdog_Adjust_seconds( WATCHDOG_BACKWARD, 40009488: 92 20 40 09 sub %g1, %o1, %o1 4000948c: 10 80 00 03 b 40009498 <_TOD_Set+0x3c> 40009490: 90 10 20 01 mov 1, %o0 _TOD_Seconds_since_epoch - time->tv_sec ); else _Watchdog_Adjust_seconds( WATCHDOG_FORWARD, 40009494: 90 10 20 00 clr %o0 40009498: 7f ff ff e9 call 4000943c <_Watchdog_Adjust_seconds> 4000949c: 01 00 00 00 nop time->tv_sec - _TOD_Seconds_since_epoch ); /* POSIX format TOD (timespec) */ _TOD_Now = *time; 400094a0: c4 06 00 00 ld [ %i0 ], %g2 400094a4: 03 10 00 9e sethi %hi(0x40027800), %g1 400094a8: c4 20 62 a8 st %g2, [ %g1 + 0x2a8 ] ! 40027aa8 <_TOD_Now> 400094ac: c4 06 20 04 ld [ %i0 + 4 ], %g2 400094b0: 82 10 62 a8 or %g1, 0x2a8, %g1 400094b4: c4 20 60 04 st %g2, [ %g1 + 4 ] _TOD_Is_set = TRUE; 400094b8: 84 10 20 01 mov 1, %g2 400094bc: 03 10 00 9e sethi %hi(0x40027800), %g1 400094c0: c4 20 62 2c st %g2, [ %g1 + 0x22c ] ! 40027a2c <_TOD_Is_set> #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 400094c4: 05 10 00 9e sethi %hi(0x40027800), %g2 400094c8: c2 00 a1 f0 ld [ %g2 + 0x1f0 ], %g1 ! 400279f0 <_Thread_Dispatch_disable_level> 400094cc: 82 00 7f ff add %g1, -1, %g1 400094d0: c2 20 a1 f0 st %g1, [ %g2 + 0x1f0 ] 400094d4: c2 00 a1 f0 ld [ %g2 + 0x1f0 ], %g1 400094d8: 80 a0 60 00 cmp %g1, 0 400094dc: 12 80 00 04 bne 400094ec <_TOD_Set+0x90> 400094e0: 01 00 00 00 nop _Thread_Dispatch(); 400094e4: 40 00 07 e1 call 4000b468 <_Thread_Dispatch> <== NOT EXECUTED 400094e8: 81 e8 00 00 restore <== NOT EXECUTED 400094ec: 81 c7 e0 08 ret 400094f0: 81 e8 00 00 restore 4000987c <_Thread_Create_idle>: */ const char *_Thread_Idle_name = "IDLE"; void _Thread_Create_idle( void ) { 4000987c: 9d e3 bf 80 save %sp, -128, %sp * This routine allocates an internal thread. */ RTEMS_INLINE_ROUTINE Thread_Control *_Thread_Internal_allocate( void ) { return (Thread_Control *) _Objects_Allocate( &_Thread_Internal_information ); 40009880: 11 10 00 6b sethi %hi(0x4001ac00), %o0 40009884: 7f ff fa 22 call 4000810c <_Objects_Allocate> 40009888: 90 12 23 60 or %o0, 0x360, %o0 ! 4001af60 <_Thread_Internal_information> idle = (void *) _CPU_Thread_Idle_body; #else idle = (void *) _Thread_Idle_body; #endif if ( _CPU_Table.idle_task ) 4000988c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40009890: c4 00 61 f0 ld [ %g1 + 0x1f0 ], %g2 ! 4001adf0 <_CPU_Table+0xc> * The entire workspace is zeroed during its initialization. Thus, all * fields not explicitly assigned were explicitly zeroed by * _Workspace_Initialization. */ _Thread_Idle = _Thread_Internal_allocate(); 40009894: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40009898: d0 20 63 b8 st %o0, [ %g1 + 0x3b8 ] ! 4001afb8 <_Thread_Idle> idle = (void *) _CPU_Thread_Idle_body; #else idle = (void *) _Thread_Idle_body; #endif if ( _CPU_Table.idle_task ) 4000989c: 80 a0 a0 00 cmp %g2, 0 400098a0: 03 10 00 26 sethi %hi(0x40009800), %g1 400098a4: 02 80 00 03 be 400098b0 <_Thread_Create_idle+0x34> 400098a8: b4 10 63 2c or %g1, 0x32c, %i2 ! 40009b2c <_Thread_Idle_body> idle = _CPU_Table.idle_task; 400098ac: b4 10 00 02 mov %g2, %i2 <== NOT EXECUTED idle_task_stack_size = _CPU_Table.idle_task_stack_size; 400098b0: 03 10 00 6b sethi %hi(0x4001ac00), %g1 400098b4: d6 00 61 f8 ld [ %g1 + 0x1f8 ], %o3 ! 4001adf8 <_CPU_Table+0x14> if ( idle_task_stack_size < STACK_MINIMUM_SIZE ) 400098b8: 80 a2 ef ff cmp %o3, 0xfff 400098bc: 28 80 00 02 bleu,a 400098c4 <_Thread_Create_idle+0x48> 400098c0: 17 00 00 04 sethi %hi(0x1000), %o3 idle_task_stack_size = STACK_MINIMUM_SIZE; _Thread_Initialize( 400098c4: 03 10 00 67 sethi %hi(0x40019c00), %g1 400098c8: c2 00 63 78 ld [ %g1 + 0x378 ], %g1 ! 40019f78 <_Thread_Idle_name> 400098cc: 92 10 00 08 mov %o0, %o1 400098d0: c2 23 a0 6c st %g1, [ %sp + 0x6c ] 400098d4: 82 10 20 01 mov 1, %g1 400098d8: c0 23 a0 60 clr [ %sp + 0x60 ] 400098dc: c2 23 a0 5c st %g1, [ %sp + 0x5c ] 400098e0: c0 23 a0 64 clr [ %sp + 0x64 ] 400098e4: c0 23 a0 68 clr [ %sp + 0x68 ] 400098e8: 11 10 00 6b sethi %hi(0x4001ac00), %o0 400098ec: 94 10 20 00 clr %o2 400098f0: 90 12 23 60 or %o0, 0x360, %o0 400098f4: 98 10 20 00 clr %o4 400098f8: 40 00 00 8e call 40009b30 <_Thread_Initialize> 400098fc: 9a 10 20 ff mov 0xff, %o5 /* * WARNING!!! This is necessary to "kick" start the system and * MUST be done before _Thread_Start is invoked. */ _Thread_Heir = 40009900: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40009904: c4 00 63 b8 ld [ %g1 + 0x3b8 ], %g2 ! 4001afb8 <_Thread_Idle> 40009908: 03 10 00 6b sethi %hi(0x4001ac00), %g1 4000990c: c4 20 62 ac st %g2, [ %g1 + 0x2ac ] ! 4001aeac <_Thread_Executing> 40009910: 03 10 00 6b sethi %hi(0x4001ac00), %g1 _Thread_Executing = _Thread_Idle; _Thread_Start( 40009914: b0 10 00 02 mov %g2, %i0 /* * WARNING!!! This is necessary to "kick" start the system and * MUST be done before _Thread_Start is invoked. */ _Thread_Heir = 40009918: c4 20 62 84 st %g2, [ %g1 + 0x284 ] _Thread_Executing = _Thread_Idle; _Thread_Start( 4000991c: b2 10 20 00 clr %i1 40009920: b6 10 20 00 clr %i3 40009924: 40 00 03 d8 call 4000a884 <_Thread_Start> 40009928: 99 e8 20 00 restore %g0, 0, %o4 4000992c: 01 00 00 00 nop 40009930 <_Thread_Delay_ended>: void _Thread_Delay_ended( Objects_Id id, void *ignored ) { 40009930: 9d e3 bf 90 save %sp, -112, %sp uint32_t the_api; uint32_t the_class; Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { 40009934: 92 96 20 00 orcc %i0, 0, %o1 40009938: 12 80 00 0a bne 40009960 <_Thread_Delay_ended+0x30> 4000993c: 83 32 60 18 srl %o1, 0x18, %g1 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40009940: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40009944: c4 00 61 d0 ld [ %g1 + 0x1d0 ], %g2 ! 4001add0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40009948: 84 00 a0 01 inc %g2 <== NOT EXECUTED 4000994c: c4 20 61 d0 st %g2, [ %g1 + 0x1d0 ] <== NOT EXECUTED Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; tp = _Thread_Executing; 40009950: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40009954: d0 00 62 ac ld [ %g1 + 0x2ac ], %o0 ! 4001aeac <_Thread_Executing> <== NOT EXECUTED Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; 40009958: 10 80 00 19 b 400099bc <_Thread_Delay_ended+0x8c> <== NOT EXECUTED 4000995c: c0 27 bf f4 clr [ %fp + -12 ] <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API( Objects_Id id ) { return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS); 40009960: 84 08 60 07 and %g1, 7, %g2 tp = _Thread_Executing; goto done; } the_api = _Objects_Get_API( id ); if ( the_api && the_api > OBJECTS_APIS_LAST ) { 40009964: 80 a0 a0 04 cmp %g2, 4 40009968: 18 80 00 06 bgu 40009980 <_Thread_Delay_ended+0x50> 4000996c: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; goto done; } the_class = _Objects_Get_class( id ); if ( the_class != 1 ) { /* threads are always first class :) */ 40009970: 83 32 60 1b srl %o1, 0x1b, %g1 40009974: 80 a0 60 01 cmp %g1, 1 40009978: 02 80 00 05 be 4000998c <_Thread_Delay_ended+0x5c> 4000997c: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 40009980: 90 10 20 00 clr %o0 <== NOT EXECUTED 40009984: 10 80 00 0e b 400099bc <_Thread_Delay_ended+0x8c> <== NOT EXECUTED 40009988: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED goto done; } information = _Objects_Information_table[ the_api ][ the_class ]; 4000998c: 83 28 a0 02 sll %g2, 2, %g1 40009990: 05 10 00 6b sethi %hi(0x4001ac00), %g2 40009994: 84 10 a1 30 or %g2, 0x130, %g2 ! 4001ad30 <_Objects_Information_table> 40009998: c2 00 80 01 ld [ %g2 + %g1 ], %g1 4000999c: d0 00 60 04 ld [ %g1 + 4 ], %o0 if ( !information ) { 400099a0: 80 a2 20 00 cmp %o0, 0 400099a4: 12 80 00 04 bne 400099b4 <_Thread_Delay_ended+0x84> 400099a8: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 400099ac: 10 80 00 04 b 400099bc <_Thread_Delay_ended+0x8c> <== NOT EXECUTED 400099b0: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED goto done; } tp = (Thread_Control *) _Objects_Get( information, id, location ); 400099b4: 7f ff fb 1a call 4000861c <_Objects_Get> 400099b8: 94 07 bf f4 add %fp, -12, %o2 Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); switch ( location ) { 400099bc: c2 07 bf f4 ld [ %fp + -12 ], %g1 400099c0: 80 a0 60 00 cmp %g1, 0 400099c4: 12 80 00 08 bne 400099e4 <_Thread_Delay_ended+0xb4> 400099c8: 13 04 00 ff sethi %hi(0x1003fc00), %o1 RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); 400099cc: 7f ff ff 4e call 40009704 <_Thread_Clear_state> 400099d0: 92 12 63 f8 or %o1, 0x3f8, %o1 ! 1003fff8 */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; 400099d4: 05 10 00 6b sethi %hi(0x4001ac00), %g2 400099d8: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> 400099dc: 82 00 7f ff add %g1, -1, %g1 400099e0: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] 400099e4: 81 c7 e0 08 ret 400099e8: 81 e8 00 00 restore 4000ed1c <_Thread_Evaluate_mode>: boolean _Thread_Evaluate_mode( void ) { Thread_Control *executing; executing = _Thread_Executing; 4000ed1c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 4000ed20: c4 00 62 ac ld [ %g1 + 0x2ac ], %g2 ! 4001aeac <_Thread_Executing> if ( !_States_Is_ready( executing->current_state ) || 4000ed24: c2 00 a0 10 ld [ %g2 + 0x10 ], %g1 4000ed28: 80 a0 60 00 cmp %g1, 0 4000ed2c: 32 80 00 0b bne,a 4000ed58 <_Thread_Evaluate_mode+0x3c> 4000ed30: 84 10 20 01 mov 1, %g2 <== NOT EXECUTED 4000ed34: 03 10 00 6b sethi %hi(0x4001ac00), %g1 4000ed38: c2 00 62 84 ld [ %g1 + 0x284 ], %g1 ! 4001ae84 <_Thread_Heir> 4000ed3c: 80 a0 80 01 cmp %g2, %g1 4000ed40: 02 80 00 0b be 4000ed6c <_Thread_Evaluate_mode+0x50> 4000ed44: 01 00 00 00 nop 4000ed48: c2 00 a0 7c ld [ %g2 + 0x7c ], %g1 4000ed4c: 80 a0 60 00 cmp %g1, 0 4000ed50: 02 80 00 07 be 4000ed6c <_Thread_Evaluate_mode+0x50> 4000ed54: 84 10 20 01 mov 1, %g2 ( !_Thread_Is_heir( executing ) && executing->is_preemptible ) ) { _Context_Switch_necessary = TRUE; 4000ed58: 03 10 00 6b sethi %hi(0x4001ac00), %g1 4000ed5c: 90 10 20 01 mov 1, %o0 4000ed60: c4 20 62 bc st %g2, [ %g1 + 0x2bc ] 4000ed64: 81 c3 e0 08 retl 4000ed68: 01 00 00 00 nop return TRUE; } return FALSE; } 4000ed6c: 81 c3 e0 08 retl 4000ed70: 90 10 20 00 clr %o0 ! 0 4000ed74 <_Thread_Handler>: * * Output parameters: NONE */ void _Thread_Handler( void ) { 4000ed74: 9d e3 bf 98 save %sp, -104, %sp #endif #if defined(__USE__MAIN__) extern void _main(void); #endif executing = _Thread_Executing; 4000ed78: 03 10 00 6b sethi %hi(0x4001ac00), %g1 4000ed7c: f4 00 62 ac ld [ %g1 + 0x2ac ], %i2 ! 4001aeac <_Thread_Executing> /* * Some CPUs need to tinker with the call frame or registers when the * thread actually begins to execute for the first time. This is a * hook point where the port gets a shot at doing whatever it requires. */ _Context_Initialization_at_thread_begin(); 4000ed80: 3f 10 00 3b sethi %hi(0x4000ec00), %i7 4000ed84: be 17 e1 74 or %i7, 0x174, %i7 ! 4000ed74 <_Thread_Handler> * have to put level into a register for those cpu's that use * inline asm here */ level = executing->Start.isr_level; _ISR_Set_level(level); 4000ed88: d0 06 a0 c4 ld [ %i2 + 0xc4 ], %o0 4000ed8c: 7f ff cc 54 call 40001edc 4000ed90: 91 2a 20 08 sll %o0, 8, %o0 #if defined(__USE_INIT_FINI__) || defined(__USE__MAIN__) doneCons = doneConstructors; 4000ed94: 05 10 00 6a sethi %hi(0x4001a800), %g2 doneConstructors = 1; 4000ed98: 82 10 20 01 mov 1, %g1 level = executing->Start.isr_level; _ISR_Set_level(level); #if defined(__USE_INIT_FINI__) || defined(__USE__MAIN__) doneCons = doneConstructors; 4000ed9c: f2 08 a3 f0 ldub [ %g2 + 0x3f0 ], %i1 * 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 ); 4000eda0: 90 10 00 1a mov %i2, %o0 4000eda4: 7f ff ef 70 call 4000ab64 <_User_extensions_Thread_begin> 4000eda8: c2 28 a3 f0 stb %g1, [ %g2 + 0x3f0 ] #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 4000edac: 05 10 00 6b sethi %hi(0x4001ac00), %g2 4000edb0: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> 4000edb4: 82 00 7f ff add %g1, -1, %g1 4000edb8: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] 4000edbc: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 4000edc0: 80 a0 60 00 cmp %g1, 0 4000edc4: 12 80 00 05 bne 4000edd8 <_Thread_Handler+0x64> 4000edc8: 83 2e 60 18 sll %i1, 0x18, %g1 _Thread_Dispatch(); 4000edcc: 7f ff eb 08 call 400099ec <_Thread_Dispatch> 4000edd0: 01 00 00 00 nop /* * _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) */ 4000edd4: 83 2e 60 18 sll %i1, 0x18, %g1 4000edd8: 80 a0 60 00 cmp %g1, 0 4000eddc: 32 80 00 05 bne,a 4000edf0 <_Thread_Handler+0x7c> 4000ede0: c2 06 a0 ac ld [ %i2 + 0xac ], %g1 _init (); 4000ede4: 40 00 2a fd call 400199d8 <_init> 4000ede8: 01 00 00 00 nop #if defined(__USE__MAIN__) if (!doneCons && _main) __main (); #endif switch ( executing->Start.prototype ) { 4000edec: c2 06 a0 ac ld [ %i2 + 0xac ], %g1 4000edf0: 80 a0 60 01 cmp %g1, 1 4000edf4: 22 80 00 0d be,a 4000ee28 <_Thread_Handler+0xb4> 4000edf8: c2 06 a0 a8 ld [ %i2 + 0xa8 ], %g1 4000edfc: 2a 80 00 09 bcs,a 4000ee20 <_Thread_Handler+0xac> 4000ee00: c2 06 a0 a8 ld [ %i2 + 0xa8 ], %g1 4000ee04: 80 a0 60 02 cmp %g1, 2 <== NOT EXECUTED 4000ee08: 02 80 00 0d be 4000ee3c <_Thread_Handler+0xc8> <== NOT EXECUTED 4000ee0c: 80 a0 60 03 cmp %g1, 3 <== NOT EXECUTED 4000ee10: 12 80 00 14 bne 4000ee60 <_Thread_Handler+0xec> <== NOT EXECUTED 4000ee14: 90 10 00 1a mov %i2, %o0 <== NOT EXECUTED executing->Start.pointer_argument, executing->Start.numeric_argument ); break; case THREAD_START_BOTH_NUMERIC_FIRST: executing->Wait.return_argument = 4000ee18: 10 80 00 0c b 4000ee48 <_Thread_Handler+0xd4> <== NOT EXECUTED 4000ee1c: c2 06 a0 a8 ld [ %i2 + 0xa8 ], %g1 <== NOT EXECUTED __main (); #endif switch ( executing->Start.prototype ) { case THREAD_START_NUMERIC: executing->Wait.return_argument = 4000ee20: 10 80 00 03 b 4000ee2c <_Thread_Handler+0xb8> 4000ee24: d0 06 a0 b4 ld [ %i2 + 0xb4 ], %o0 (*(Thread_Entry_numeric) executing->Start.entry_point)( executing->Start.numeric_argument ); break; case THREAD_START_POINTER: executing->Wait.return_argument = 4000ee28: d0 06 a0 b0 ld [ %i2 + 0xb0 ], %o0 4000ee2c: 9f c0 40 00 call %g1 4000ee30: 01 00 00 00 nop executing->Start.pointer_argument, executing->Start.numeric_argument ); break; case THREAD_START_BOTH_NUMERIC_FIRST: executing->Wait.return_argument = 4000ee34: 10 80 00 0a b 4000ee5c <_Thread_Handler+0xe8> 4000ee38: d0 26 a0 28 st %o0, [ %i2 + 0x28 ] (*(Thread_Entry_pointer) executing->Start.entry_point)( executing->Start.pointer_argument ); break; case THREAD_START_BOTH_POINTER_FIRST: executing->Wait.return_argument = 4000ee3c: c2 06 a0 a8 ld [ %i2 + 0xa8 ], %g1 <== NOT EXECUTED 4000ee40: 10 80 00 04 b 4000ee50 <_Thread_Handler+0xdc> <== NOT EXECUTED 4000ee44: d0 1e a0 b0 ldd [ %i2 + 0xb0 ], %o0 <== NOT EXECUTED executing->Start.pointer_argument, executing->Start.numeric_argument ); break; case THREAD_START_BOTH_NUMERIC_FIRST: executing->Wait.return_argument = 4000ee48: d0 06 a0 b4 ld [ %i2 + 0xb4 ], %o0 <== NOT EXECUTED 4000ee4c: d2 06 a0 b0 ld [ %i2 + 0xb0 ], %o1 <== NOT EXECUTED 4000ee50: 9f c0 40 00 call %g1 <== NOT EXECUTED 4000ee54: 01 00 00 00 nop <== NOT EXECUTED 4000ee58: d0 26 a0 28 st %o0, [ %i2 + 0x28 ] <== NOT EXECUTED * 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 ); 4000ee5c: 90 10 00 1a mov %i2, %o0 4000ee60: 7f ff ef 64 call 4000abf0 <_User_extensions_Thread_exitted> 4000ee64: b0 10 20 00 clr %i0 _Internal_error_Occurred( 4000ee68: b2 10 20 01 mov 1, %i1 4000ee6c: 7f ff e4 7b call 40008058 <_Internal_error_Occurred> 4000ee70: 95 e8 20 06 restore %g0, 6, %o2 4000ee74: 01 00 00 00 nop 40009cec <_Thread_Handler_initialization>: void _Thread_Handler_initialization( uint32_t ticks_per_timeslice, uint32_t maximum_extensions, uint32_t maximum_proxies ) { 40009cec: 9d e3 bf 90 save %sp, -112, %sp /* * BOTH stacks hooks must be set or both must be NULL. * Do not allow mixture. */ if ( !( ( _CPU_Table.stack_allocate_hook == 0 ) 40009cf0: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40009cf4: 82 10 61 e4 or %g1, 0x1e4, %g1 ! 4001ade4 <_CPU_Table> 40009cf8: c4 00 60 20 ld [ %g1 + 0x20 ], %g2 40009cfc: c2 00 60 24 ld [ %g1 + 0x24 ], %g1 40009d00: 80 a0 00 02 cmp %g0, %g2 40009d04: 84 60 3f ff subx %g0, -1, %g2 40009d08: 80 a0 00 01 cmp %g0, %g1 40009d0c: 82 60 3f ff subx %g0, -1, %g1 40009d10: 80 a0 80 01 cmp %g2, %g1 40009d14: 02 80 00 07 be 40009d30 <_Thread_Handler_initialization+0x44> 40009d18: 03 10 00 6b sethi %hi(0x4001ac00), %g1 == ( _CPU_Table.stack_free_hook == 0 ) ) ) _Internal_error_Occurred( 40009d1c: 90 10 20 00 clr %o0 <== NOT EXECUTED 40009d20: 92 10 20 01 mov 1, %o1 <== NOT EXECUTED 40009d24: 7f ff f8 cd call 40008058 <_Internal_error_Occurred> <== NOT EXECUTED 40009d28: 94 10 20 0f mov 0xf, %o2 <== NOT EXECUTED INTERNAL_ERROR_CORE, TRUE, INTERNAL_ERROR_BAD_STACK_HOOK ); _Context_Switch_necessary = FALSE; 40009d2c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40009d30: c0 20 62 bc clr [ %g1 + 0x2bc ] ! 4001aebc <_Context_Switch_necessary> _Thread_Executing = NULL; 40009d34: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40009d38: c0 20 62 ac clr [ %g1 + 0x2ac ] ! 4001aeac <_Thread_Executing> _Thread_Heir = NULL; 40009d3c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40009d40: c0 20 62 84 clr [ %g1 + 0x284 ] ! 4001ae84 <_Thread_Heir> #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) _Thread_Allocated_fp = NULL; #endif _Thread_Do_post_task_switch_extension = 0; 40009d44: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40009d48: c0 20 62 9c clr [ %g1 + 0x29c ] ! 4001ae9c <_Thread_Do_post_task_switch_extension> _Thread_Maximum_extensions = maximum_extensions; 40009d4c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40009d50: f2 20 62 98 st %i1, [ %g1 + 0x298 ] ! 4001ae98 <_Thread_Maximum_extensions> _Thread_Ticks_per_timeslice = ticks_per_timeslice; 40009d54: 03 10 00 6b sethi %hi(0x4001ac00), %g1 _Thread_Ready_chain = (Chain_Control *) _Workspace_Allocate_or_fatal_error( 40009d58: 90 10 2c 00 mov 0xc00, %o0 40009d5c: 40 00 04 ac call 4000b00c <_Workspace_Allocate_or_fatal_error> 40009d60: f0 20 61 28 st %i0, [ %g1 + 0x128 ] 40009d64: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40009d68: 84 10 00 08 mov %o0, %g2 40009d6c: d0 20 61 24 st %o0, [ %g1 + 0x124 ] (PRIORITY_MAXIMUM + 1) * sizeof(Chain_Control) ); for ( index=0; index <= PRIORITY_MAXIMUM ; index++ ) 40009d70: 86 02 2c 00 add %o0, 0xc00, %g3 */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 40009d74: 82 00 a0 04 add %g2, 4, %g1 the_chain->permanent_null = NULL; 40009d78: c0 20 a0 04 clr [ %g2 + 4 ] the_chain->last = _Chain_Head(the_chain); 40009d7c: c4 20 a0 08 st %g2, [ %g2 + 8 ] */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 40009d80: c2 20 80 00 st %g1, [ %g2 ] the_chain->permanent_null = NULL; the_chain->last = _Chain_Head(the_chain); 40009d84: 84 00 a0 0c add %g2, 0xc, %g2 40009d88: 80 a0 80 03 cmp %g2, %g3 40009d8c: 12 bf ff fb bne 40009d78 <_Thread_Handler_initialization+0x8c> 40009d90: 82 00 a0 04 add %g2, 4, %g1 /* * Initialize this class of objects. */ _Objects_Initialize_information( 40009d94: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40009d98: c2 00 62 d8 ld [ %g1 + 0x2d8 ], %g1 ! 4001aed8 <_System_state_Is_multiprocessing> 40009d9c: 96 10 20 02 mov 2, %o3 40009da0: 80 a0 00 01 cmp %g0, %g1 40009da4: 82 10 20 08 mov 8, %g1 40009da8: 96 42 ff ff addx %o3, -1, %o3 40009dac: c2 23 a0 5c st %g1, [ %sp + 0x5c ] 40009db0: 11 10 00 6b sethi %hi(0x4001ac00), %o0 40009db4: 92 10 20 01 mov 1, %o1 40009db8: 90 12 23 60 or %o0, 0x360, %o0 40009dbc: 94 10 20 01 mov 1, %o2 40009dc0: 98 10 21 80 mov 0x180, %o4 40009dc4: 7f ff fa 3b call 400086b0 <_Objects_Initialize_information> 40009dc8: 9a 10 20 01 mov 1, %o5 FALSE, /* TRUE if this is a global object class */ NULL /* Proxy extraction support callout */ #endif ); } 40009dcc: 81 c7 e0 08 ret 40009dd0: 81 e8 00 00 restore 40009b30 <_Thread_Initialize>: Thread_CPU_budget_algorithms budget_algorithm, Thread_CPU_budget_algorithm_callout budget_callout, uint32_t isr_level, Objects_Name name ) { 40009b30: 9d e3 bf 98 save %sp, -104, %sp /* * Initialize the Ada self pointer */ the_thread->rtems_ada_self = NULL; 40009b34: c0 26 60 80 clr [ %i1 + 0x80 ] /* * Allocate and Initialize the stack for this thread. */ if ( !stack_area ) { 40009b38: 80 a6 a0 00 cmp %i2, 0 40009b3c: 12 80 00 10 bne 40009b7c <_Thread_Initialize+0x4c> 40009b40: e0 07 a0 60 ld [ %fp + 0x60 ], %l0 if ( !_Stack_Is_enough( stack_size ) ) 40009b44: 80 a6 ef ff cmp %i3, 0xfff 40009b48: 08 80 00 03 bleu 40009b54 <_Thread_Initialize+0x24> 40009b4c: 13 00 00 04 sethi %hi(0x1000), %o1 40009b50: 92 10 00 1b mov %i3, %o1 actual_stack_size = STACK_MINIMUM_SIZE; else actual_stack_size = stack_size; actual_stack_size = _Thread_Stack_Allocate( the_thread, actual_stack_size ); 40009b54: 40 00 03 13 call 4000a7a0 <_Thread_Stack_Allocate> 40009b58: 90 10 00 19 mov %i1, %o0 if ( !actual_stack_size || actual_stack_size < stack_size ) 40009b5c: 80 a2 20 00 cmp %o0, 0 40009b60: 02 80 00 1f be 40009bdc <_Thread_Initialize+0xac> 40009b64: 80 a2 00 1b cmp %o0, %i3 40009b68: 0a 80 00 1d bcs 40009bdc <_Thread_Initialize+0xac> 40009b6c: 82 10 20 01 mov 1, %g1 return FALSE; /* stack allocation failed */ stack = the_thread->Start.stack; 40009b70: f4 06 60 d8 ld [ %i1 + 0xd8 ], %i2 the_thread->Start.core_allocated_stack = TRUE; 40009b74: 10 80 00 04 b 40009b84 <_Thread_Initialize+0x54> 40009b78: c2 26 60 cc st %g1, [ %i1 + 0xcc ] } else { stack = stack_area; actual_stack_size = stack_size; the_thread->Start.core_allocated_stack = FALSE; 40009b7c: c0 26 60 cc clr [ %i1 + 0xcc ] <== NOT EXECUTED 40009b80: 90 10 00 1b mov %i3, %o0 <== NOT EXECUTED /* * Allocate the extensions area for this thread */ if ( _Thread_Maximum_extensions ) { 40009b84: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40009b88: d2 00 62 98 ld [ %g1 + 0x298 ], %o1 ! 4001ae98 <_Thread_Maximum_extensions> Stack_Control *the_stack, void *starting_address, size_t size ) { the_stack->area = starting_address; 40009b8c: f4 26 60 d4 st %i2, [ %i1 + 0xd4 ] the_stack->size = size; 40009b90: d0 26 60 d0 st %o0, [ %i1 + 0xd0 ] Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 40009b94: c0 26 60 50 clr [ %i1 + 0x50 ] the_watchdog->routine = routine; 40009b98: c0 26 60 64 clr [ %i1 + 0x64 ] the_watchdog->id = id; 40009b9c: c0 26 60 68 clr [ %i1 + 0x68 ] the_watchdog->user_data = user_data; 40009ba0: c0 26 60 6c clr [ %i1 + 0x6c ] /* * Clear the libc reent hook. */ the_thread->libc_reent = NULL; 40009ba4: c0 26 61 68 clr [ %i1 + 0x168 ] /* * Allocate the extensions area for this thread */ if ( _Thread_Maximum_extensions ) { 40009ba8: 80 a2 60 00 cmp %o1, 0 40009bac: 02 80 00 0e be 40009be4 <_Thread_Initialize+0xb4> 40009bb0: b6 10 20 00 clr %i3 RTEMS_INLINE_ROUTINE void *_Workspace_Allocate( size_t size ) { return _Heap_Allocate( &_Workspace_Area, size ); 40009bb4: 92 02 60 01 inc %o1 40009bb8: 11 10 00 6b sethi %hi(0x4001ac00), %o0 40009bbc: 93 2a 60 02 sll %o1, 2, %o1 40009bc0: 7f ff f7 fb call 40007bac <_Heap_Allocate> 40009bc4: 90 12 22 1c or %o0, 0x21c, %o0 extensions_area = _Workspace_Allocate( (_Thread_Maximum_extensions + 1) * sizeof( void * ) ); if ( !extensions_area ) { 40009bc8: b6 92 20 00 orcc %o0, 0, %i3 40009bcc: 12 80 00 07 bne 40009be8 <_Thread_Initialize+0xb8> 40009bd0: 80 a6 e0 00 cmp %i3, 0 #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) if ( fp_area ) (void) _Workspace_Free( fp_area ); #endif _Thread_Stack_Free( the_thread ); 40009bd4: 40 00 03 0a call 4000a7fc <_Thread_Stack_Free> <== NOT EXECUTED 40009bd8: 90 10 00 19 mov %i1, %o0 <== NOT EXECUTED 40009bdc: 81 c7 e0 08 ret 40009be0: 91 e8 20 00 restore %g0, 0, %o0 * create the extension long after tasks have been created * so they cannot rely on the thread create user extension * call. */ if ( the_thread->extensions ) { 40009be4: 80 a6 e0 00 cmp %i3, 0 40009be8: 02 80 00 0d be 40009c1c <_Thread_Initialize+0xec> 40009bec: f6 26 61 78 st %i3, [ %i1 + 0x178 ] int i; for ( i = 0; i < (_Thread_Maximum_extensions + 1); i++ ) 40009bf0: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40009bf4: c2 00 62 98 ld [ %g1 + 0x298 ], %g1 ! 4001ae98 <_Thread_Maximum_extensions> 40009bf8: 86 10 20 00 clr %g3 40009bfc: 10 80 00 05 b 40009c10 <_Thread_Initialize+0xe0> 40009c00: 88 00 60 01 add %g1, 1, %g4 the_thread->extensions[i] = NULL; 40009c04: 83 28 e0 02 sll %g3, 2, %g1 * call. */ if ( the_thread->extensions ) { int i; for ( i = 0; i < (_Thread_Maximum_extensions + 1); i++ ) 40009c08: 86 00 e0 01 inc %g3 the_thread->extensions[i] = NULL; 40009c0c: c0 20 80 01 clr [ %g2 + %g1 ] * call. */ if ( the_thread->extensions ) { int i; for ( i = 0; i < (_Thread_Maximum_extensions + 1); i++ ) 40009c10: 80 a0 c0 04 cmp %g3, %g4 40009c14: 32 bf ff fc bne,a 40009c04 <_Thread_Initialize+0xd4> 40009c18: c4 06 61 78 ld [ %i1 + 0x178 ], %g2 /* * General initialization */ the_thread->Start.is_preemptible = is_preemptible; 40009c1c: c2 07 a0 5c ld [ %fp + 0x5c ], %g1 the_thread->Start.budget_algorithm = budget_algorithm; 40009c20: e0 26 60 bc st %l0, [ %i1 + 0xbc ] /* * General initialization */ the_thread->Start.is_preemptible = is_preemptible; 40009c24: c2 26 60 b8 st %g1, [ %i1 + 0xb8 ] the_thread->Start.budget_algorithm = budget_algorithm; the_thread->Start.budget_callout = budget_callout; 40009c28: c2 07 a0 64 ld [ %fp + 0x64 ], %g1 switch ( budget_algorithm ) { 40009c2c: 80 a4 20 02 cmp %l0, 2 40009c30: 12 80 00 05 bne 40009c44 <_Thread_Initialize+0x114> 40009c34: c2 26 60 c0 st %g1, [ %i1 + 0xc0 ] case THREAD_CPU_BUDGET_ALGORITHM_NONE: case THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE: break; case THREAD_CPU_BUDGET_ALGORITHM_EXHAUST_TIMESLICE: the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice; 40009c38: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40009c3c: c2 00 61 28 ld [ %g1 + 0x128 ], %g1 ! 4001ad28 <_Thread_Ticks_per_timeslice> <== NOT EXECUTED 40009c40: c2 26 60 84 st %g1, [ %i1 + 0x84 ] <== NOT EXECUTED break; case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT: break; } the_thread->Start.isr_level = isr_level; 40009c44: c2 07 a0 68 ld [ %fp + 0x68 ], %g1 the_thread->current_state = STATES_DORMANT; the_thread->Wait.queue = NULL; 40009c48: c0 26 60 44 clr [ %i1 + 0x44 ] break; case THREAD_CPU_BUDGET_ALGORITHM_CALLOUT: break; } the_thread->Start.isr_level = isr_level; 40009c4c: c2 26 60 c4 st %g1, [ %i1 + 0xc4 ] the_thread->current_state = STATES_DORMANT; 40009c50: 82 10 20 01 mov 1, %g1 the_thread->Wait.queue = NULL; the_thread->resource_count = 0; 40009c54: c0 26 60 1c clr [ %i1 + 0x1c ] break; } the_thread->Start.isr_level = isr_level; the_thread->current_state = STATES_DORMANT; 40009c58: c2 26 60 10 st %g1, [ %i1 + 0x10 ] the_thread->Wait.queue = NULL; the_thread->resource_count = 0; the_thread->suspend_count = 0; 40009c5c: c0 26 60 70 clr [ %i1 + 0x70 ] the_thread->real_priority = priority; 40009c60: fa 26 60 18 st %i5, [ %i1 + 0x18 ] the_thread->Start.initial_priority = priority; 40009c64: fa 26 60 c8 st %i5, [ %i1 + 0xc8 ] _Thread_Set_priority( the_thread, priority ); 40009c68: 92 10 00 1d mov %i5, %o1 40009c6c: 40 00 02 2c call 4000a51c <_Thread_Set_priority> 40009c70: 90 10 00 19 mov %i1, %o0 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, the_object ); 40009c74: c4 06 60 08 ld [ %i1 + 8 ], %g2 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40009c78: c6 16 20 10 lduh [ %i0 + 0x10 ], %g3 /* * Initialize the CPU usage statistics */ #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS the_thread->cpu_time_used.tv_sec = 0; 40009c7c: c0 26 60 90 clr [ %i1 + 0x90 ] 40009c80: 03 00 00 3f sethi %hi(0xfc00), %g1 40009c84: 82 10 63 ff or %g1, 0x3ff, %g1 ! ffff 40009c88: 82 08 80 01 and %g2, %g1, %g1 40009c8c: 80 a0 40 03 cmp %g1, %g3 40009c90: 18 80 00 05 bgu 40009ca4 <_Thread_Initialize+0x174> 40009c94: c0 26 60 94 clr [ %i1 + 0x94 ] information->local_table[ index ] = the_object; 40009c98: c4 06 20 20 ld [ %i0 + 0x20 ], %g2 40009c9c: 83 28 60 02 sll %g1, 2, %g1 40009ca0: f2 20 80 01 st %i1, [ %g2 + %g1 ] if ( information->is_string ) /* _Objects_Copy_name_string( name, the_object->name ); */ the_object->name = name; else /* _Objects_Copy_name_raw( name, the_object->name, information->name_length ); */ the_object->name = name; 40009ca4: c2 07 a0 6c ld [ %fp + 0x6c ], %g1 /* * Invoke create extensions */ if ( !_User_extensions_Thread_create( the_thread ) ) { 40009ca8: 90 10 00 19 mov %i1, %o0 40009cac: c2 26 60 0c st %g1, [ %i1 + 0xc ] 40009cb0: 40 00 03 e1 call 4000ac34 <_User_extensions_Thread_create> 40009cb4: b0 10 20 01 mov 1, %i0 40009cb8: 80 a2 20 00 cmp %o0, 0 40009cbc: 12 80 00 0a bne 40009ce4 <_Thread_Initialize+0x1b4> 40009cc0: 80 a6 e0 00 cmp %i3, 0 if ( extensions_area ) 40009cc4: 02 80 00 05 be 40009cd8 <_Thread_Initialize+0x1a8> <== NOT EXECUTED 40009cc8: 11 10 00 6b sethi %hi(0x4001ac00), %o0 <== NOT EXECUTED RTEMS_INLINE_ROUTINE boolean _Workspace_Free( void *block ) { return _Heap_Free( &_Workspace_Area, block ); 40009ccc: 92 10 00 1b mov %i3, %o1 <== NOT EXECUTED 40009cd0: 7f ff f7 de call 40007c48 <_Heap_Free> <== NOT EXECUTED 40009cd4: 90 12 22 1c or %o0, 0x21c, %o0 <== NOT EXECUTED #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) if ( fp_area ) (void) _Workspace_Free( fp_area ); #endif _Thread_Stack_Free( the_thread ); 40009cd8: 90 10 00 19 mov %i1, %o0 <== NOT EXECUTED 40009cdc: 40 00 02 c8 call 4000a7fc <_Thread_Stack_Free> <== NOT EXECUTED 40009ce0: b0 10 20 00 clr %i0 <== NOT EXECUTED return FALSE; } return TRUE; } 40009ce4: 81 c7 e0 08 ret 40009ce8: 81 e8 00 00 restore 4000ee3c <_Thread_Reset>: void _Thread_Reset( Thread_Control *the_thread, void *pointer_argument, uint32_t numeric_argument ) { 4000ee3c: 9d e3 bf 98 save %sp, -104, %sp the_thread->resource_count = 0; the_thread->suspend_count = 0; the_thread->is_preemptible = the_thread->Start.is_preemptible; 4000ee40: c2 06 20 b8 ld [ %i0 + 0xb8 ], %g1 the_thread->budget_algorithm = the_thread->Start.budget_algorithm; 4000ee44: c4 06 20 bc ld [ %i0 + 0xbc ], %g2 the_thread->budget_callout = the_thread->Start.budget_callout; 4000ee48: c6 06 20 c0 ld [ %i0 + 0xc0 ], %g3 uint32_t numeric_argument ) { the_thread->resource_count = 0; the_thread->suspend_count = 0; the_thread->is_preemptible = the_thread->Start.is_preemptible; 4000ee4c: c2 26 20 7c st %g1, [ %i0 + 0x7c ] the_thread->budget_algorithm = the_thread->Start.budget_algorithm; the_thread->budget_callout = the_thread->Start.budget_callout; 4000ee50: c4 3e 20 88 std %g2, [ %i0 + 0x88 ] the_thread->Start.pointer_argument = pointer_argument; 4000ee54: f2 26 20 b0 st %i1, [ %i0 + 0xb0 ] the_thread->Start.numeric_argument = numeric_argument; 4000ee58: f4 26 20 b4 st %i2, [ %i0 + 0xb4 ] Thread_Control *the_thread, void *pointer_argument, uint32_t numeric_argument ) { the_thread->resource_count = 0; 4000ee5c: c0 26 20 1c clr [ %i0 + 0x1c ] the_thread->suspend_count = 0; 4000ee60: c0 26 20 70 clr [ %i0 + 0x70 ] the_thread->budget_callout = the_thread->Start.budget_callout; the_thread->Start.pointer_argument = pointer_argument; the_thread->Start.numeric_argument = numeric_argument; if ( !_Thread_queue_Extract_with_proxy( the_thread ) ) { 4000ee64: 7f ff f0 55 call 4000afb8 <_Thread_queue_Extract_with_proxy> 4000ee68: 90 10 00 18 mov %i0, %o0 4000ee6c: 80 a2 20 00 cmp %o0, 0 4000ee70: 32 80 00 09 bne,a 4000ee94 <_Thread_Reset+0x58> 4000ee74: f2 06 20 c8 ld [ %i0 + 0xc8 ], %i1 if ( _Watchdog_Is_active( &the_thread->Timer ) ) 4000ee78: c2 06 20 50 ld [ %i0 + 0x50 ], %g1 4000ee7c: 80 a0 60 02 cmp %g1, 2 4000ee80: 32 80 00 05 bne,a 4000ee94 <_Thread_Reset+0x58> 4000ee84: f2 06 20 c8 ld [ %i0 + 0xc8 ], %i1 (void) _Watchdog_Remove( &the_thread->Timer ); 4000ee88: 7f ff f3 8d call 4000bcbc <_Watchdog_Remove> <== NOT EXECUTED 4000ee8c: 90 06 20 48 add %i0, 0x48, %o0 <== NOT EXECUTED } if ( the_thread->current_priority != the_thread->Start.initial_priority ) { 4000ee90: f2 06 20 c8 ld [ %i0 + 0xc8 ], %i1 <== NOT EXECUTED 4000ee94: c2 06 20 14 ld [ %i0 + 0x14 ], %g1 4000ee98: 80 a0 40 19 cmp %g1, %i1 4000ee9c: 02 80 00 05 be 4000eeb0 <_Thread_Reset+0x74> 4000eea0: 01 00 00 00 nop the_thread->real_priority = the_thread->Start.initial_priority; 4000eea4: f2 26 20 18 st %i1, [ %i0 + 0x18 ] _Thread_Set_priority( the_thread, the_thread->Start.initial_priority ); 4000eea8: 7f ff f1 0a call 4000b2d0 <_Thread_Set_priority> 4000eeac: 81 e8 00 00 restore 4000eeb0: 81 c7 e0 08 ret 4000eeb4: 81 e8 00 00 restore 4000dfec <_Thread_Reset_timeslice>: * ready chain * select heir */ void _Thread_Reset_timeslice( void ) { 4000dfec: 9d e3 bf 98 save %sp, -104, %sp ISR_Level level; Thread_Control *executing; Chain_Control *ready; executing = _Thread_Executing; 4000dff0: 03 10 00 6b sethi %hi(0x4001ac00), %g1 4000dff4: e0 00 62 ac ld [ %g1 + 0x2ac ], %l0 ! 4001aeac <_Thread_Executing> ready = executing->ready; _ISR_Disable( level ); 4000dff8: 7f ff cf b5 call 40001ecc 4000dffc: e2 04 20 98 ld [ %l0 + 0x98 ], %l1 4000e000: b0 10 00 08 mov %o0, %i0 if ( _Chain_Has_only_one_node( ready ) ) { 4000e004: c4 04 40 00 ld [ %l1 ], %g2 4000e008: c2 04 60 08 ld [ %l1 + 8 ], %g1 4000e00c: 80 a0 80 01 cmp %g2, %g1 4000e010: 32 80 00 03 bne,a 4000e01c <_Thread_Reset_timeslice+0x30> 4000e014: c6 04 00 00 ld [ %l0 ], %g3 _ISR_Enable( level ); 4000e018: 30 80 00 18 b,a 4000e078 <_Thread_Reset_timeslice+0x8c> { Chain_Node *next; Chain_Node *previous; next = the_node->next; previous = the_node->previous; 4000e01c: c4 04 20 04 ld [ %l0 + 4 ], %g2 Chain_Node *the_node ) { Chain_Node *old_last_node; the_node->next = _Chain_Tail(the_chain); 4000e020: 82 04 60 04 add %l1, 4, %g1 Chain_Node *previous; next = the_node->next; previous = the_node->previous; next->previous = previous; previous->next = next; 4000e024: c6 20 80 00 st %g3, [ %g2 ] Chain_Node *the_node ) { Chain_Node *old_last_node; the_node->next = _Chain_Tail(the_chain); 4000e028: c2 24 00 00 st %g1, [ %l0 ] Chain_Node *next; Chain_Node *previous; next = the_node->next; previous = the_node->previous; next->previous = previous; 4000e02c: c4 20 e0 04 st %g2, [ %g3 + 4 ] ) { Chain_Node *old_last_node; the_node->next = _Chain_Tail(the_chain); old_last_node = the_chain->last; 4000e030: c2 04 60 08 ld [ %l1 + 8 ], %g1 the_chain->last = the_node; 4000e034: e0 24 60 08 st %l0, [ %l1 + 8 ] old_last_node->next = the_node; the_node->previous = old_last_node; 4000e038: c2 24 20 04 st %g1, [ %l0 + 4 ] Chain_Node *old_last_node; the_node->next = _Chain_Tail(the_chain); old_last_node = the_chain->last; the_chain->last = the_node; old_last_node->next = the_node; 4000e03c: e0 20 40 00 st %l0, [ %g1 ] return; } _Chain_Extract_unprotected( &executing->Object.Node ); _Chain_Append_unprotected( ready, &executing->Object.Node ); _ISR_Flash( level ); 4000e040: 7f ff cf a7 call 40001edc 4000e044: 01 00 00 00 nop 4000e048: 7f ff cf a1 call 40001ecc 4000e04c: 01 00 00 00 nop if ( _Thread_Is_heir( executing ) ) 4000e050: 05 10 00 6b sethi %hi(0x4001ac00), %g2 4000e054: c2 00 a2 84 ld [ %g2 + 0x284 ], %g1 ! 4001ae84 <_Thread_Heir> 4000e058: 80 a4 00 01 cmp %l0, %g1 4000e05c: 32 80 00 05 bne,a 4000e070 <_Thread_Reset_timeslice+0x84> 4000e060: 84 10 20 01 mov 1, %g2 <== NOT EXECUTED _Thread_Heir = (Thread_Control *) ready->first; 4000e064: c2 04 40 00 ld [ %l1 ], %g1 4000e068: c2 20 a2 84 st %g1, [ %g2 + 0x284 ] _Context_Switch_necessary = TRUE; 4000e06c: 84 10 20 01 mov 1, %g2 4000e070: 03 10 00 6b sethi %hi(0x4001ac00), %g1 4000e074: c4 20 62 bc st %g2, [ %g1 + 0x2bc ] ! 4001aebc <_Context_Switch_necessary> _ISR_Enable( level ); 4000e078: 7f ff cf 99 call 40001edc 4000e07c: 81 e8 00 00 restore 4000e080: 01 00 00 00 nop 4000bff0 <_Thread_Resume>: void _Thread_Resume( Thread_Control *the_thread, boolean force ) { 4000bff0: 9d e3 bf 98 save %sp, -104, %sp ISR_Level level; States_Control current_state; _ISR_Disable( level ); 4000bff4: 7f ff da ff call 40002bf0 4000bff8: 01 00 00 00 nop 4000bffc: a0 10 00 08 mov %o0, %l0 if ( force == TRUE ) 4000c000: 80 a6 60 01 cmp %i1, 1 4000c004: 32 80 00 04 bne,a 4000c014 <_Thread_Resume+0x24> 4000c008: c2 06 20 70 ld [ %i0 + 0x70 ], %g1 <== NOT EXECUTED the_thread->suspend_count = 0; 4000c00c: 10 80 00 04 b 4000c01c <_Thread_Resume+0x2c> 4000c010: c0 26 20 70 clr [ %i0 + 0x70 ] else the_thread->suspend_count--; 4000c014: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 4000c018: c2 26 20 70 st %g1, [ %i0 + 0x70 ] <== NOT EXECUTED if ( the_thread->suspend_count > 0 ) { 4000c01c: c2 06 20 70 ld [ %i0 + 0x70 ], %g1 4000c020: 80 a0 60 00 cmp %g1, 0 4000c024: 22 80 00 03 be,a 4000c030 <_Thread_Resume+0x40> 4000c028: c2 06 20 10 ld [ %i0 + 0x10 ], %g1 _ISR_Enable( level ); 4000c02c: 30 80 00 2e b,a 4000c0e4 <_Thread_Resume+0xf4> <== NOT EXECUTED return; } current_state = the_thread->current_state; if ( current_state & STATES_SUSPENDED ) { 4000c030: 80 88 60 02 btst 2, %g1 4000c034: 02 80 00 2c be 4000c0e4 <_Thread_Resume+0xf4> 4000c038: 82 08 7f fd and %g1, -3, %g1 current_state = the_thread->current_state = _States_Clear(STATES_SUSPENDED, current_state); if ( _States_Is_ready( current_state ) ) { 4000c03c: 80 a0 60 00 cmp %g1, 0 4000c040: 12 80 00 29 bne 4000c0e4 <_Thread_Resume+0xf4> 4000c044: c2 26 20 10 st %g1, [ %i0 + 0x10 ] RTEMS_INLINE_ROUTINE void _Priority_Add_to_bit_map ( Priority_Information *the_priority_map ) { *the_priority_map->minor |= the_priority_map->ready_minor; 4000c048: c8 06 20 9c ld [ %i0 + 0x9c ], %g4 4000c04c: c4 16 20 a2 lduh [ %i0 + 0xa2 ], %g2 4000c050: c2 11 00 00 lduh [ %g4 ], %g1 _Priority_Add_to_bit_map( &the_thread->Priority_map ); _Chain_Append_unprotected(the_thread->ready, &the_thread->Object.Node); 4000c054: c6 06 20 98 ld [ %i0 + 0x98 ], %g3 4000c058: 82 10 40 02 or %g1, %g2, %g1 4000c05c: c2 31 00 00 sth %g1, [ %g4 ] Chain_Node *the_node ) { Chain_Node *old_last_node; the_node->next = _Chain_Tail(the_chain); 4000c060: 82 00 e0 04 add %g3, 4, %g1 _Priority_Major_bit_map |= the_priority_map->ready_major; 4000c064: 09 10 00 9e sethi %hi(0x40027800), %g4 4000c068: c2 26 00 00 st %g1, [ %i0 ] 4000c06c: da 16 20 a0 lduh [ %i0 + 0xa0 ], %o5 old_last_node = the_chain->last; 4000c070: c2 00 e0 08 ld [ %g3 + 8 ], %g1 4000c074: c4 11 22 c0 lduh [ %g4 + 0x2c0 ], %g2 the_chain->last = the_node; 4000c078: f0 20 e0 08 st %i0, [ %g3 + 8 ] 4000c07c: 84 10 80 0d or %g2, %o5, %g2 old_last_node->next = the_node; the_node->previous = old_last_node; 4000c080: c2 26 20 04 st %g1, [ %i0 + 4 ] 4000c084: c4 31 22 c0 sth %g2, [ %g4 + 0x2c0 ] Chain_Node *old_last_node; the_node->next = _Chain_Tail(the_chain); old_last_node = the_chain->last; the_chain->last = the_node; old_last_node->next = the_node; 4000c088: f0 20 40 00 st %i0, [ %g1 ] _ISR_Flash( level ); 4000c08c: 7f ff da dd call 40002c00 4000c090: 90 10 00 10 mov %l0, %o0 4000c094: 7f ff da d7 call 40002bf0 4000c098: 01 00 00 00 nop if ( the_thread->current_priority < _Thread_Heir->current_priority ) { 4000c09c: 07 10 00 9e sethi %hi(0x40027800), %g3 4000c0a0: c2 00 e2 a4 ld [ %g3 + 0x2a4 ], %g1 ! 40027aa4 <_Thread_Heir> 4000c0a4: c4 06 20 14 ld [ %i0 + 0x14 ], %g2 4000c0a8: c2 00 60 14 ld [ %g1 + 0x14 ], %g1 4000c0ac: 80 a0 80 01 cmp %g2, %g1 4000c0b0: 1a 80 00 0d bcc 4000c0e4 <_Thread_Resume+0xf4> 4000c0b4: 03 10 00 9e sethi %hi(0x40027800), %g1 _Thread_Heir = the_thread; if ( _Thread_Executing->is_preemptible || 4000c0b8: c2 00 62 cc ld [ %g1 + 0x2cc ], %g1 ! 40027acc <_Thread_Executing> _Chain_Append_unprotected(the_thread->ready, &the_thread->Object.Node); _ISR_Flash( level ); if ( the_thread->current_priority < _Thread_Heir->current_priority ) { _Thread_Heir = the_thread; 4000c0bc: f0 20 e2 a4 st %i0, [ %g3 + 0x2a4 ] if ( _Thread_Executing->is_preemptible || 4000c0c0: c2 00 60 7c ld [ %g1 + 0x7c ], %g1 4000c0c4: 80 a0 60 00 cmp %g1, 0 4000c0c8: 32 80 00 05 bne,a 4000c0dc <_Thread_Resume+0xec> 4000c0cc: 84 10 20 01 mov 1, %g2 4000c0d0: 80 a0 a0 00 cmp %g2, 0 4000c0d4: 12 80 00 04 bne 4000c0e4 <_Thread_Resume+0xf4> 4000c0d8: 84 10 20 01 mov 1, %g2 the_thread->current_priority == 0 ) _Context_Switch_necessary = TRUE; 4000c0dc: 03 10 00 9e sethi %hi(0x40027800), %g1 4000c0e0: c4 20 62 dc st %g2, [ %g1 + 0x2dc ] ! 40027adc <_Context_Switch_necessary> } } } _ISR_Enable( level ); 4000c0e4: 7f ff da c7 call 40002c00 4000c0e8: 91 e8 00 10 restore %g0, %l0, %o0 4000c0ec: 01 00 00 00 nop 4000a7a0 <_Thread_Stack_Allocate>: size_t _Thread_Stack_Allocate( Thread_Control *the_thread, size_t stack_size ) { 4000a7a0: 9d e3 bf 98 save %sp, -104, %sp void *stack_addr = 0; size_t the_stack_size = stack_size; if ( !_Stack_Is_enough( the_stack_size ) ) 4000a7a4: 80 a6 6f ff cmp %i1, 0xfff 4000a7a8: 28 80 00 02 bleu,a 4000a7b0 <_Thread_Stack_Allocate+0x10> 4000a7ac: 33 00 00 04 sethi %hi(0x1000), %i1 <== NOT EXECUTED * Call ONLY the CPU table stack allocate hook, _or_ the * the RTEMS workspace allocate. This is so the stack free * routine can call the correct deallocation routine. */ if ( _CPU_Table.stack_allocate_hook ) { 4000a7b0: 03 10 00 6b sethi %hi(0x4001ac00), %g1 4000a7b4: c2 00 62 04 ld [ %g1 + 0x204 ], %g1 ! 4001ae04 <_CPU_Table+0x20> 4000a7b8: 80 a0 60 00 cmp %g1, 0 4000a7bc: 02 80 00 06 be 4000a7d4 <_Thread_Stack_Allocate+0x34> 4000a7c0: 92 06 60 10 add %i1, 0x10, %o1 stack_addr = (*_CPU_Table.stack_allocate_hook)( the_stack_size ); 4000a7c4: 9f c0 40 00 call %g1 <== NOT EXECUTED 4000a7c8: 90 10 00 19 mov %i1, %o0 <== NOT EXECUTED } if ( !stack_addr ) the_stack_size = 0; the_thread->Start.stack = stack_addr; 4000a7cc: 10 80 00 07 b 4000a7e8 <_Thread_Stack_Allocate+0x48> <== NOT EXECUTED 4000a7d0: d0 26 20 d8 st %o0, [ %i0 + 0xd8 ] <== NOT EXECUTED RTEMS_INLINE_ROUTINE void *_Workspace_Allocate( size_t size ) { return _Heap_Allocate( &_Workspace_Area, size ); 4000a7d4: 11 10 00 6b sethi %hi(0x4001ac00), %o0 4000a7d8: b2 10 00 09 mov %o1, %i1 4000a7dc: 7f ff f4 f4 call 40007bac <_Heap_Allocate> 4000a7e0: 90 12 22 1c or %o0, 0x21c, %o0 4000a7e4: d0 26 20 d8 st %o0, [ %i0 + 0xd8 ] the_stack_size = _Stack_Adjust_size( the_stack_size ); stack_addr = _Workspace_Allocate( the_stack_size ); } if ( !stack_addr ) 4000a7e8: 80 a0 00 08 cmp %g0, %o0 4000a7ec: b0 60 20 00 subx %g0, 0, %i0 the_stack_size = 0; the_thread->Start.stack = stack_addr; return the_stack_size; } 4000a7f0: b0 0e 40 18 and %i1, %i0, %i0 4000a7f4: 81 c7 e0 08 ret 4000a7f8: 81 e8 00 00 restore 4000a7fc <_Thread_Stack_Free>: */ void _Thread_Stack_Free( Thread_Control *the_thread ) { 4000a7fc: 9d e3 bf 98 save %sp, -104, %sp /* * If the API provided the stack space, then don't free it. */ if ( !the_thread->Start.core_allocated_stack ) 4000a800: c2 06 20 cc ld [ %i0 + 0xcc ], %g1 4000a804: 80 a0 60 00 cmp %g1, 0 4000a808: 02 80 00 08 be 4000a828 <_Thread_Stack_Free+0x2c> 4000a80c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 * Call ONLY the CPU table stack free hook, or the * the RTEMS workspace free. This is so the free * routine properly matches the allocation of the stack. */ if ( _CPU_Table.stack_free_hook ) 4000a810: c2 00 62 08 ld [ %g1 + 0x208 ], %g1 ! 4001ae08 <_CPU_Table+0x24> 4000a814: 80 a0 60 00 cmp %g1, 0 4000a818: 02 80 00 06 be 4000a830 <_Thread_Stack_Free+0x34> 4000a81c: d0 06 20 d4 ld [ %i0 + 0xd4 ], %o0 (*_CPU_Table.stack_free_hook)( the_thread->Start.Initial_stack.area ); 4000a820: 9f c0 40 00 call %g1 <== NOT EXECUTED 4000a824: 01 00 00 00 nop <== NOT EXECUTED 4000a828: 81 c7 e0 08 ret <== NOT EXECUTED 4000a82c: 81 e8 00 00 restore <== NOT EXECUTED RTEMS_INLINE_ROUTINE boolean _Workspace_Free( void *block ) { return _Heap_Free( &_Workspace_Area, block ); 4000a830: 31 10 00 6b sethi %hi(0x4001ac00), %i0 4000a834: b2 10 00 08 mov %o0, %i1 4000a838: 7f ff f5 04 call 40007c48 <_Heap_Free> 4000a83c: 91 ee 22 1c restore %i0, 0x21c, %o0 4000a840: 01 00 00 00 nop 40009dd4 <_Thread_queue_Dequeue>: Thread_queue_Control *the_thread_queue ) { Thread_Control *the_thread; switch ( the_thread_queue->discipline ) { 40009dd4: c2 02 20 34 ld [ %o0 + 0x34 ], %g1 40009dd8: 80 a0 60 00 cmp %g1, 0 40009ddc: 02 80 00 05 be 40009df0 <_Thread_queue_Dequeue+0x1c> 40009de0: 80 a0 60 01 cmp %g1, 1 40009de4: 12 80 00 09 bne 40009e08 <_Thread_queue_Dequeue+0x34> 40009de8: 01 00 00 00 nop 40009dec: 30 80 00 04 b,a 40009dfc <_Thread_queue_Dequeue+0x28> case THREAD_QUEUE_DISCIPLINE_FIFO: the_thread = _Thread_queue_Dequeue_fifo( the_thread_queue ); 40009df0: 82 13 c0 00 mov %o7, %g1 40009df4: 40 00 0f 88 call 4000dc14 <_Thread_queue_Dequeue_fifo> 40009df8: 9e 10 40 00 mov %g1, %o7 break; case THREAD_QUEUE_DISCIPLINE_PRIORITY: the_thread = _Thread_queue_Dequeue_priority( the_thread_queue ); 40009dfc: 82 13 c0 00 mov %o7, %g1 40009e00: 40 00 00 0a call 40009e28 <_Thread_queue_Dequeue_priority> 40009e04: 9e 10 40 00 mov %g1, %o7 the_thread = NULL; break; } return( the_thread ); } 40009e08: 81 c3 e0 08 retl <== NOT EXECUTED 40009e0c: 90 10 20 00 clr %o0 <== NOT EXECUTED 4000dc14 <_Thread_queue_Dequeue_fifo>: */ Thread_Control *_Thread_queue_Dequeue_fifo( Thread_queue_Control *the_thread_queue ) { 4000dc14: 9d e3 bf 98 save %sp, -104, %sp ISR_Level level; Thread_Control *the_thread; _ISR_Disable( level ); 4000dc18: 7f ff d0 ad call 40001ecc 4000dc1c: a0 10 00 18 mov %i0, %l0 4000dc20: 84 10 00 08 mov %o0, %g2 */ RTEMS_INLINE_ROUTINE boolean _Chain_Is_empty( Chain_Control *the_chain ) { return (the_chain->first == _Chain_Tail(the_chain)); 4000dc24: f0 06 00 00 ld [ %i0 ], %i0 if ( !_Chain_Is_empty( &the_thread_queue->Queues.Fifo ) ) { 4000dc28: 82 04 20 04 add %l0, 4, %g1 4000dc2c: 80 a6 00 01 cmp %i0, %g1 4000dc30: 22 80 00 16 be,a 4000dc88 <_Thread_queue_Dequeue_fifo+0x74> 4000dc34: c2 04 20 30 ld [ %l0 + 0x30 ], %g1 { Chain_Node *return_node; Chain_Node *new_first; return_node = the_chain->first; new_first = return_node->next; 4000dc38: c2 06 00 00 ld [ %i0 ], %g1 the_chain->first = new_first; 4000dc3c: c2 24 00 00 st %g1, [ %l0 ] the_thread = (Thread_Control *) _Chain_Get_first_unprotected( &the_thread_queue->Queues.Fifo ); the_thread->Wait.queue = NULL; if ( !_Watchdog_Is_active( &the_thread->Timer ) ) { 4000dc40: c4 06 20 50 ld [ %i0 + 0x50 ], %g2 new_first->previous = _Chain_Head(the_chain); 4000dc44: e0 20 60 04 st %l0, [ %g1 + 4 ] 4000dc48: 80 a0 a0 02 cmp %g2, 2 4000dc4c: 02 80 00 05 be 4000dc60 <_Thread_queue_Dequeue_fifo+0x4c> 4000dc50: c0 26 20 44 clr [ %i0 + 0x44 ] _ISR_Enable( level ); 4000dc54: 7f ff d0 a2 call 40001edc 4000dc58: 01 00 00 00 nop 4000dc5c: 30 80 00 07 b,a 4000dc78 <_Thread_queue_Dequeue_fifo+0x64> RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate( Watchdog_Control *the_watchdog ) { the_watchdog->state = WATCHDOG_REMOVE_IT; 4000dc60: 82 10 20 03 mov 3, %g1 ! 3 4000dc64: c2 26 20 50 st %g1, [ %i0 + 0x50 ] _Thread_Unblock( the_thread ); } else { _Watchdog_Deactivate( &the_thread->Timer ); _ISR_Enable( level ); 4000dc68: 7f ff d0 9d call 40001edc 4000dc6c: 01 00 00 00 nop (void) _Watchdog_Remove( &the_thread->Timer ); 4000dc70: 7f ff f4 94 call 4000aec0 <_Watchdog_Remove> 4000dc74: 90 06 20 48 add %i0, 0x48, %o0 _Thread_Unblock( the_thread ); 4000dc78: 7f ff ff e1 call 4000dbfc <_Thread_Unblock> 4000dc7c: 90 10 00 18 mov %i0, %o0 4000dc80: 81 c7 e0 08 ret 4000dc84: 81 e8 00 00 restore #endif return the_thread; } switch ( the_thread_queue->sync_state ) { 4000dc88: 80 a0 60 02 cmp %g1, 2 4000dc8c: 18 80 00 06 bgu 4000dca4 <_Thread_queue_Dequeue_fifo+0x90> 4000dc90: 80 a0 60 03 cmp %g1, 3 4000dc94: 80 a0 60 01 cmp %g1, 1 4000dc98: 1a 80 00 0a bcc 4000dcc0 <_Thread_queue_Dequeue_fifo+0xac> 4000dc9c: 82 10 20 03 mov 3, %g1 4000dca0: 30 80 00 03 b,a 4000dcac <_Thread_queue_Dequeue_fifo+0x98> 4000dca4: 12 bf ff f7 bne 4000dc80 <_Thread_queue_Dequeue_fifo+0x6c> <== NOT EXECUTED 4000dca8: b0 10 20 00 clr %i0 <== NOT EXECUTED case THREAD_QUEUE_SYNCHRONIZED: case THREAD_QUEUE_SATISFIED: _ISR_Enable( level ); 4000dcac: b0 10 20 00 clr %i0 4000dcb0: 7f ff d0 8b call 40001edc 4000dcb4: 90 10 00 02 mov %g2, %o0 4000dcb8: 81 c7 e0 08 ret 4000dcbc: 81 e8 00 00 restore return NULL; case THREAD_QUEUE_NOTHING_HAPPENED: case THREAD_QUEUE_TIMEOUT: the_thread_queue->sync_state = THREAD_QUEUE_SATISFIED; 4000dcc0: c2 24 20 30 st %g1, [ %l0 + 0x30 ] <== NOT EXECUTED _ISR_Enable( level ); 4000dcc4: 7f ff d0 86 call 40001edc <== NOT EXECUTED 4000dcc8: 01 00 00 00 nop <== NOT EXECUTED return _Thread_Executing; 4000dccc: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 4000dcd0: f0 00 62 ac ld [ %g1 + 0x2ac ], %i0 ! 4001aeac <_Thread_Executing> <== NOT EXECUTED } return NULL; /* this is only to prevent warnings */ } 4000dcd4: 81 c7 e0 08 ret <== NOT EXECUTED 4000dcd8: 81 e8 00 00 restore <== NOT EXECUTED 40009e28 <_Thread_queue_Dequeue_priority>: */ Thread_Control *_Thread_queue_Dequeue_priority( Thread_queue_Control *the_thread_queue ) { 40009e28: 9d e3 bf 98 save %sp, -104, %sp Chain_Node *new_second_node; Chain_Node *last_node; Chain_Node *next_node; Chain_Node *previous_node; _ISR_Disable( level ); 40009e2c: 7f ff e0 28 call 40001ecc 40009e30: 01 00 00 00 nop 40009e34: 98 10 00 08 mov %o0, %o4 40009e38: 86 10 20 00 clr %g3 40009e3c: 88 10 20 00 clr %g4 */ RTEMS_INLINE_ROUTINE boolean _Chain_Is_empty( Chain_Control *the_chain ) { return (the_chain->first == _Chain_Tail(the_chain)); 40009e40: d0 01 00 18 ld [ %g4 + %i0 ], %o0 for( index=0 ; index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ; index++ ) { if ( !_Chain_Is_empty( &the_thread_queue->Queues.Priority[ index ] ) ) { 40009e44: 85 28 e0 02 sll %g3, 2, %g2 40009e48: 83 28 e0 04 sll %g3, 4, %g1 40009e4c: 82 20 40 02 sub %g1, %g2, %g1 40009e50: 82 06 00 01 add %i0, %g1, %g1 40009e54: 82 00 60 04 add %g1, 4, %g1 40009e58: 80 a2 00 01 cmp %o0, %g1 40009e5c: 02 80 00 04 be 40009e6c <_Thread_queue_Dequeue_priority+0x44> 40009e60: 88 01 20 0c add %g4, 0xc, %g4 the_thread = (Thread_Control *) 40009e64: 10 80 00 1c b 40009ed4 <_Thread_queue_Dequeue_priority+0xac> 40009e68: b0 10 00 08 mov %o0, %i0 Chain_Node *previous_node; _ISR_Disable( level ); for( index=0 ; index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ; index++ ) { 40009e6c: 86 00 e0 01 inc %g3 Chain_Node *next_node; Chain_Node *previous_node; _ISR_Disable( level ); for( index=0 ; index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ; 40009e70: 80 a0 e0 04 cmp %g3, 4 40009e74: 32 bf ff f4 bne,a 40009e44 <_Thread_queue_Dequeue_priority+0x1c> 40009e78: d0 01 00 18 ld [ %g4 + %i0 ], %o0 the_thread_queue->Queues.Priority[ index ].first; goto dequeue; } } switch ( the_thread_queue->sync_state ) { 40009e7c: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 40009e80: 80 a0 60 02 cmp %g1, 2 40009e84: 18 80 00 06 bgu 40009e9c <_Thread_queue_Dequeue_priority+0x74> 40009e88: 80 a0 60 03 cmp %g1, 3 40009e8c: 80 a0 60 01 cmp %g1, 1 40009e90: 1a 80 00 0a bcc 40009eb8 <_Thread_queue_Dequeue_priority+0x90> 40009e94: 82 10 20 03 mov 3, %g1 40009e98: 30 80 00 03 b,a 40009ea4 <_Thread_queue_Dequeue_priority+0x7c> 40009e9c: 12 80 00 0e bne 40009ed4 <_Thread_queue_Dequeue_priority+0xac> <== NOT EXECUTED 40009ea0: b0 10 20 00 clr %i0 <== NOT EXECUTED case THREAD_QUEUE_SYNCHRONIZED: case THREAD_QUEUE_SATISFIED: _ISR_Enable( level ); 40009ea4: b0 10 20 00 clr %i0 40009ea8: 7f ff e0 0d call 40001edc 40009eac: 90 10 00 0c mov %o4, %o0 40009eb0: 81 c7 e0 08 ret 40009eb4: 81 e8 00 00 restore return NULL; case THREAD_QUEUE_NOTHING_HAPPENED: case THREAD_QUEUE_TIMEOUT: the_thread_queue->sync_state = THREAD_QUEUE_SATISFIED; 40009eb8: c2 26 20 30 st %g1, [ %i0 + 0x30 ] <== NOT EXECUTED _ISR_Enable( level ); 40009ebc: 7f ff e0 08 call 40001edc <== NOT EXECUTED 40009ec0: 90 10 00 0c mov %o4, %o0 <== NOT EXECUTED return _Thread_Executing; 40009ec4: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40009ec8: f0 00 62 ac ld [ %g1 + 0x2ac ], %i0 ! 4001aeac <_Thread_Executing> <== NOT EXECUTED 40009ecc: 81 c7 e0 08 ret <== NOT EXECUTED 40009ed0: 81 e8 00 00 restore <== NOT EXECUTED } dequeue: the_thread->Wait.queue = NULL; new_first_node = the_thread->Wait.Block2n.first; 40009ed4: c6 06 20 38 ld [ %i0 + 0x38 ], %g3 new_first_thread = (Thread_Control *) new_first_node; next_node = the_thread->Object.Node.next; previous_node = the_thread->Object.Node.previous; if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) { 40009ed8: 82 06 20 3c add %i0, 0x3c, %g1 _ISR_Enable( level ); return _Thread_Executing; } dequeue: the_thread->Wait.queue = NULL; 40009edc: c0 26 20 44 clr [ %i0 + 0x44 ] new_first_node = the_thread->Wait.Block2n.first; new_first_thread = (Thread_Control *) new_first_node; next_node = the_thread->Object.Node.next; previous_node = the_thread->Object.Node.previous; if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) { 40009ee0: 80 a0 c0 01 cmp %g3, %g1 dequeue: the_thread->Wait.queue = NULL; new_first_node = the_thread->Wait.Block2n.first; new_first_thread = (Thread_Control *) new_first_node; next_node = the_thread->Object.Node.next; 40009ee4: c4 06 00 00 ld [ %i0 ], %g2 previous_node = the_thread->Object.Node.previous; if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) { 40009ee8: 02 80 00 14 be 40009f38 <_Thread_queue_Dequeue_priority+0x110> 40009eec: c2 06 20 04 ld [ %i0 + 4 ], %g1 last_node = the_thread->Wait.Block2n.last; 40009ef0: da 06 20 40 ld [ %i0 + 0x40 ], %o5 new_second_node = new_first_node->next; 40009ef4: c8 00 c0 00 ld [ %g3 ], %g4 previous_node->next = new_first_node; next_node->previous = new_first_node; 40009ef8: c6 20 a0 04 st %g3, [ %g2 + 4 ] if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) { last_node = the_thread->Wait.Block2n.last; new_second_node = new_first_node->next; previous_node->next = new_first_node; 40009efc: c6 20 40 00 st %g3, [ %g1 ] next_node->previous = new_first_node; new_first_node->next = next_node; 40009f00: c4 20 c0 00 st %g2, [ %g3 ] new_first_node->previous = previous_node; 40009f04: c2 20 e0 04 st %g1, [ %g3 + 4 ] if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) { 40009f08: c4 06 20 38 ld [ %i0 + 0x38 ], %g2 40009f0c: c2 06 20 40 ld [ %i0 + 0x40 ], %g1 40009f10: 80 a0 80 01 cmp %g2, %g1 40009f14: 22 80 00 0c be,a 40009f44 <_Thread_queue_Dequeue_priority+0x11c> 40009f18: c2 06 20 50 ld [ %i0 + 0x50 ], %g1 /* > two threads on 2-n */ new_second_node->previous = 40009f1c: 82 00 e0 38 add %g3, 0x38, %g1 40009f20: c2 21 20 04 st %g1, [ %g4 + 4 ] _Chain_Head( &new_first_thread->Wait.Block2n ); new_first_thread->Wait.Block2n.first = new_second_node; 40009f24: c8 20 e0 38 st %g4, [ %g3 + 0x38 ] new_first_thread->Wait.Block2n.last = last_node; 40009f28: da 20 e0 40 st %o5, [ %g3 + 0x40 ] last_node->next = _Chain_Tail( &new_first_thread->Wait.Block2n ); 40009f2c: 82 00 e0 3c add %g3, 0x3c, %g1 40009f30: 10 80 00 04 b 40009f40 <_Thread_queue_Dequeue_priority+0x118> 40009f34: c2 23 40 00 st %g1, [ %o5 ] } } else { previous_node->next = next_node; next_node->previous = previous_node; 40009f38: c2 20 a0 04 st %g1, [ %g2 + 4 ] new_first_thread->Wait.Block2n.last = last_node; last_node->next = _Chain_Tail( &new_first_thread->Wait.Block2n ); } } else { previous_node->next = next_node; 40009f3c: c4 20 40 00 st %g2, [ %g1 ] next_node->previous = previous_node; } if ( !_Watchdog_Is_active( &the_thread->Timer ) ) { 40009f40: c2 06 20 50 ld [ %i0 + 0x50 ], %g1 40009f44: 80 a0 60 02 cmp %g1, 2 40009f48: 02 80 00 08 be 40009f68 <_Thread_queue_Dequeue_priority+0x140> 40009f4c: 82 10 20 03 mov 3, %g1 _ISR_Enable( level ); 40009f50: 7f ff df e3 call 40001edc 40009f54: 90 10 00 0c mov %o4, %o0 _Thread_Unblock( the_thread ); 40009f58: 7f ff ff ae call 40009e10 <_Thread_Unblock> 40009f5c: 90 10 00 18 mov %i0, %o0 40009f60: 81 c7 e0 08 ret 40009f64: 81 e8 00 00 restore RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate( Watchdog_Control *the_watchdog ) { the_watchdog->state = WATCHDOG_REMOVE_IT; 40009f68: c2 26 20 50 st %g1, [ %i0 + 0x50 ] } else { _Watchdog_Deactivate( &the_thread->Timer ); _ISR_Enable( level ); 40009f6c: 7f ff df dc call 40001edc 40009f70: 90 10 00 0c mov %o4, %o0 (void) _Watchdog_Remove( &the_thread->Timer ); 40009f74: 40 00 03 d3 call 4000aec0 <_Watchdog_Remove> 40009f78: 90 06 20 48 add %i0, 0x48, %o0 _Thread_Unblock( the_thread ); 40009f7c: 7f ff ff a5 call 40009e10 <_Thread_Unblock> 40009f80: 90 10 00 18 mov %i0, %o0 #if defined(RTEMS_MULTIPROCESSING) if ( !_Objects_Is_local_id( the_thread->Object.id ) ) _Thread_MP_Free_proxy( the_thread ); #endif return( the_thread ); } 40009f84: 81 c7 e0 08 ret 40009f88: 81 e8 00 00 restore 4000dcdc <_Thread_queue_Enqueue_fifo>: void _Thread_queue_Enqueue_fifo ( Thread_queue_Control *the_thread_queue, Thread_Control *the_thread ) { 4000dcdc: 9d e3 bf 98 save %sp, -104, %sp ISR_Level level; Thread_queue_States sync_state; _ISR_Disable( level ); 4000dce0: 7f ff d0 7b call 40001ecc 4000dce4: a0 10 00 18 mov %i0, %l0 void _Thread_queue_Enqueue_fifo ( Thread_queue_Control *the_thread_queue, Thread_Control *the_thread ) { 4000dce8: b0 10 00 19 mov %i1, %i0 ISR_Level level; Thread_queue_States sync_state; _ISR_Disable( level ); sync_state = the_thread_queue->sync_state; 4000dcec: c4 04 20 30 ld [ %l0 + 0x30 ], %g2 the_thread_queue->sync_state = THREAD_QUEUE_SYNCHRONIZED; switch ( sync_state ) { 4000dcf0: 80 a0 a0 02 cmp %g2, 2 4000dcf4: 02 80 00 10 be 4000dd34 <_Thread_queue_Enqueue_fifo+0x58> 4000dcf8: c0 24 20 30 clr [ %l0 + 0x30 ] 4000dcfc: 80 a0 a0 03 cmp %g2, 3 4000dd00: 02 80 00 12 be 4000dd48 <_Thread_queue_Enqueue_fifo+0x6c> 4000dd04: 80 a0 a0 01 cmp %g2, 1 4000dd08: 32 80 00 1e bne,a 4000dd80 <_Thread_queue_Enqueue_fifo+0xa4> 4000dd0c: 33 04 00 ff sethi %hi(0x1003fc00), %i1 <== NOT EXECUTED Chain_Node *the_node ) { Chain_Node *old_last_node; the_node->next = _Chain_Tail(the_chain); 4000dd10: 82 04 20 04 add %l0, 4, %g1 4000dd14: c2 26 40 00 st %g1, [ %i1 ] old_last_node = the_chain->last; 4000dd18: c2 04 20 08 ld [ %l0 + 8 ], %g1 the_chain->last = the_node; 4000dd1c: f2 24 20 08 st %i1, [ %l0 + 8 ] case THREAD_QUEUE_NOTHING_HAPPENED: _Chain_Append_unprotected( &the_thread_queue->Queues.Fifo, &the_thread->Object.Node ); the_thread->Wait.queue = the_thread_queue; 4000dd20: e0 26 60 44 st %l0, [ %i1 + 0x44 ] old_last_node->next = the_node; the_node->previous = old_last_node; 4000dd24: c2 26 60 04 st %g1, [ %i1 + 4 ] Chain_Node *old_last_node; the_node->next = _Chain_Tail(the_chain); old_last_node = the_chain->last; the_chain->last = the_node; old_last_node->next = the_node; 4000dd28: f2 20 40 00 st %i1, [ %g1 ] _ISR_Enable( level ); 4000dd2c: 7f ff d0 6c call 40001edc 4000dd30: 91 e8 00 08 restore %g0, %o0, %o0 return; case THREAD_QUEUE_TIMEOUT: the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status; 4000dd34: c2 06 60 44 ld [ %i1 + 0x44 ], %g1 <== NOT EXECUTED the_thread->Wait.queue = NULL; 4000dd38: c0 26 60 44 clr [ %i1 + 0x44 ] <== NOT EXECUTED the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); return; case THREAD_QUEUE_TIMEOUT: the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status; 4000dd3c: c2 00 60 3c ld [ %g1 + 0x3c ], %g1 <== NOT EXECUTED 4000dd40: c2 26 60 34 st %g1, [ %i1 + 0x34 ] <== NOT EXECUTED the_thread->Wait.queue = NULL; _ISR_Enable( level ); 4000dd44: 30 80 00 0d b,a 4000dd78 <_Thread_queue_Enqueue_fifo+0x9c> <== NOT EXECUTED break; case THREAD_QUEUE_SATISFIED: if ( _Watchdog_Is_active( &the_thread->Timer ) ) { 4000dd48: c2 06 60 50 ld [ %i1 + 0x50 ], %g1 <== NOT EXECUTED 4000dd4c: 80 a0 60 02 cmp %g1, 2 <== NOT EXECUTED 4000dd50: 12 80 00 0a bne 4000dd78 <_Thread_queue_Enqueue_fifo+0x9c> <== NOT EXECUTED 4000dd54: 01 00 00 00 nop <== NOT EXECUTED 4000dd58: c4 26 60 50 st %g2, [ %i1 + 0x50 ] <== NOT EXECUTED _Watchdog_Deactivate( &the_thread->Timer ); the_thread->Wait.queue = NULL; 4000dd5c: c0 26 60 44 clr [ %i1 + 0x44 ] <== NOT EXECUTED _ISR_Enable( level ); 4000dd60: 7f ff d0 5f call 40001edc <== NOT EXECUTED 4000dd64: 01 00 00 00 nop <== NOT EXECUTED (void) _Watchdog_Remove( &the_thread->Timer ); 4000dd68: 7f ff f4 56 call 4000aec0 <_Watchdog_Remove> <== NOT EXECUTED 4000dd6c: 90 06 60 48 add %i1, 0x48, %o0 <== NOT EXECUTED 4000dd70: 10 80 00 04 b 4000dd80 <_Thread_queue_Enqueue_fifo+0xa4> <== NOT EXECUTED 4000dd74: 33 04 00 ff sethi %hi(0x1003fc00), %i1 <== NOT EXECUTED } else _ISR_Enable( level ); 4000dd78: 7f ff d0 59 call 40001edc <== NOT EXECUTED 4000dd7c: 33 04 00 ff sethi %hi(0x1003fc00), %i1 <== NOT EXECUTED 4000dd80: b2 16 63 f8 or %i1, 0x3f8, %i1 ! 1003fff8 <== NOT EXECUTED 4000dd84: 7f ff ee 60 call 40009704 <_Thread_Clear_state> <== NOT EXECUTED 4000dd88: 81 e8 00 00 restore <== NOT EXECUTED 4000dd8c: 01 00 00 00 nop 4000a010 <_Thread_queue_Enqueue_priority>: void _Thread_queue_Enqueue_priority( Thread_queue_Control *the_thread_queue, Thread_Control *the_thread ) { 4000a010: 9d e3 bf 98 save %sp, -104, %sp States_Control block_state; Thread_queue_States sync_state; _Chain_Initialize_empty( &the_thread->Wait.Block2n ); priority = the_thread->current_priority; 4000a014: e4 06 60 14 ld [ %i1 + 0x14 ], %l2 */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 4000a018: 82 06 60 3c add %i1, 0x3c, %g1 the_chain->permanent_null = NULL; 4000a01c: c0 26 60 3c clr [ %i1 + 0x3c ] */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 4000a020: c2 26 60 38 st %g1, [ %i1 + 0x38 ] the_chain->permanent_null = NULL; the_chain->last = _Chain_Head(the_chain); 4000a024: 82 06 60 38 add %i1, 0x38, %g1 4000a028: c2 26 60 40 st %g1, [ %i1 + 0x40 ] header_index = _Thread_queue_Header_number( priority ); header = &the_thread_queue->Queues.Priority[ header_index ]; block_state = the_thread_queue->state; if ( _Thread_queue_Is_reverse_search( priority ) ) 4000a02c: 80 8c a0 20 btst 0x20, %l2 RTEMS_INLINE_ROUTINE uint32_t _Thread_queue_Header_number ( Priority_Control the_priority ) { return (the_priority / TASK_QUEUE_DATA_PRIORITIES_PER_HEADER); 4000a030: 85 34 a0 06 srl %l2, 6, %g2 4000a034: 12 80 00 34 bne 4000a104 <_Thread_queue_Enqueue_priority+0xf4> 4000a038: ec 06 20 38 ld [ %i0 + 0x38 ], %l6 goto restart_reverse_search; restart_forward_search: search_priority = PRIORITY_MINIMUM - 1; _ISR_Disable( level ); search_thread = (Thread_Control *) header->first; 4000a03c: 83 28 a0 04 sll %g2, 4, %g1 4000a040: 85 28 a0 02 sll %g2, 2, %g2 4000a044: aa 20 40 02 sub %g1, %g2, %l5 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 4000a048: 82 06 00 15 add %i0, %l5, %g1 4000a04c: a8 00 60 04 add %g1, 4, %l4 if ( _Thread_queue_Is_reverse_search( priority ) ) goto restart_reverse_search; restart_forward_search: search_priority = PRIORITY_MINIMUM - 1; _ISR_Disable( level ); 4000a050: 7f ff df 9f call 40001ecc 4000a054: 01 00 00 00 nop 4000a058: a2 10 00 08 mov %o0, %l1 search_thread = (Thread_Control *) header->first; 4000a05c: e0 06 00 15 ld [ %i0 + %l5 ], %l0 4000a060: 10 80 00 18 b 4000a0c0 <_Thread_queue_Enqueue_priority+0xb0> 4000a064: a6 10 3f ff mov -1, %l3 while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) { search_priority = search_thread->current_priority; if ( priority <= search_priority ) 4000a068: 80 a4 80 13 cmp %l2, %l3 4000a06c: 28 80 00 19 bleu,a 4000a0d0 <_Thread_queue_Enqueue_priority+0xc0> 4000a070: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 break; #if ( CPU_UNROLL_ENQUEUE_PRIORITY == TRUE ) search_thread = (Thread_Control *) search_thread->Object.Node.next; 4000a074: e0 04 00 00 ld [ %l0 ], %l0 if ( _Chain_Is_tail( header, (Chain_Node *)search_thread ) ) 4000a078: 80 a4 00 14 cmp %l0, %l4 4000a07c: 22 80 00 15 be,a 4000a0d0 <_Thread_queue_Enqueue_priority+0xc0> 4000a080: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 break; search_priority = search_thread->current_priority; 4000a084: e6 04 20 14 ld [ %l0 + 0x14 ], %l3 if ( priority <= search_priority ) 4000a088: 80 a4 80 13 cmp %l2, %l3 4000a08c: 28 80 00 11 bleu,a 4000a0d0 <_Thread_queue_Enqueue_priority+0xc0> 4000a090: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 break; #endif _ISR_Flash( level ); 4000a094: 7f ff df 92 call 40001edc 4000a098: 90 10 00 11 mov %l1, %o0 4000a09c: 7f ff df 8c call 40001ecc 4000a0a0: 01 00 00 00 nop if ( !_States_Are_set( search_thread->current_state, block_state) ) { 4000a0a4: c2 04 20 10 ld [ %l0 + 0x10 ], %g1 4000a0a8: 80 8d 80 01 btst %l6, %g1 4000a0ac: 32 80 00 05 bne,a 4000a0c0 <_Thread_queue_Enqueue_priority+0xb0> 4000a0b0: e0 04 00 00 ld [ %l0 ], %l0 _ISR_Enable( level ); 4000a0b4: 7f ff df 8a call 40001edc <== NOT EXECUTED 4000a0b8: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 4000a0bc: 30 bf ff e5 b,a 4000a050 <_Thread_queue_Enqueue_priority+0x40> <== NOT EXECUTED restart_forward_search: search_priority = PRIORITY_MINIMUM - 1; _ISR_Disable( level ); search_thread = (Thread_Control *) header->first; while ( !_Chain_Is_tail( header, (Chain_Node *)search_thread ) ) { 4000a0c0: 80 a4 00 14 cmp %l0, %l4 4000a0c4: 32 bf ff e9 bne,a 4000a068 <_Thread_queue_Enqueue_priority+0x58> 4000a0c8: e6 04 20 14 ld [ %l0 + 0x14 ], %l3 } search_thread = (Thread_Control *)search_thread->Object.Node.next; } if ( the_thread_queue->sync_state != THREAD_QUEUE_NOTHING_HAPPENED ) 4000a0cc: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 4000a0d0: 80 a0 60 01 cmp %g1, 1 4000a0d4: 32 80 00 47 bne,a 4000a1f0 <_Thread_queue_Enqueue_priority+0x1e0> 4000a0d8: c4 06 20 30 ld [ %i0 + 0x30 ], %g2 <== NOT EXECUTED goto synchronize; the_thread_queue->sync_state = THREAD_QUEUE_SYNCHRONIZED; if ( priority == search_priority ) 4000a0dc: 80 a4 80 13 cmp %l2, %l3 4000a0e0: 02 80 00 3c be 4000a1d0 <_Thread_queue_Enqueue_priority+0x1c0> 4000a0e4: c0 26 20 30 clr [ %i0 + 0x30 ] goto equal_priority; search_node = (Chain_Node *) search_thread; previous_node = search_node->previous; 4000a0e8: c2 04 20 04 ld [ %l0 + 4 ], %g1 the_node = (Chain_Node *) the_thread; the_node->next = search_node; 4000a0ec: e0 26 40 00 st %l0, [ %i1 ] the_node->previous = previous_node; 4000a0f0: c2 26 60 04 st %g1, [ %i1 + 4 ] previous_node->next = the_node; search_node->previous = the_node; the_thread->Wait.queue = the_thread_queue; 4000a0f4: f0 26 60 44 st %i0, [ %i1 + 0x44 ] previous_node = search_node->previous; the_node = (Chain_Node *) the_thread; the_node->next = search_node; the_node->previous = previous_node; previous_node->next = the_node; 4000a0f8: f2 20 40 00 st %i1, [ %g1 ] search_node->previous = the_node; 4000a0fc: f2 24 20 04 st %i1, [ %l0 + 4 ] the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); 4000a100: 30 80 00 32 b,a 4000a1c8 <_Thread_queue_Enqueue_priority+0x1b8> restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; _ISR_Disable( level ); search_thread = (Thread_Control *) header->last; 4000a104: 83 28 a0 04 sll %g2, 4, %g1 4000a108: 85 28 a0 02 sll %g2, 2, %g2 4000a10c: 82 20 40 02 sub %g1, %g2, %g1 4000a110: a6 00 40 18 add %g1, %i0, %l3 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Head( Chain_Control *the_chain ) { return (Chain_Node *) the_chain; 4000a114: aa 10 00 13 mov %l3, %l5 return; restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; _ISR_Disable( level ); 4000a118: 7f ff df 6d call 40001ecc 4000a11c: 01 00 00 00 nop 4000a120: a2 10 00 08 mov %o0, %l1 search_thread = (Thread_Control *) header->last; 4000a124: e0 05 60 08 ld [ %l5 + 8 ], %l0 4000a128: 10 80 00 18 b 4000a188 <_Thread_queue_Enqueue_priority+0x178> 4000a12c: a8 10 21 00 mov 0x100, %l4 while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) { search_priority = search_thread->current_priority; if ( priority >= search_priority ) 4000a130: 80 a4 80 14 cmp %l2, %l4 4000a134: 3a 80 00 19 bcc,a 4000a198 <_Thread_queue_Enqueue_priority+0x188> 4000a138: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 break; #if ( CPU_UNROLL_ENQUEUE_PRIORITY == TRUE ) search_thread = (Thread_Control *) search_thread->Object.Node.previous; 4000a13c: e0 04 20 04 ld [ %l0 + 4 ], %l0 if ( _Chain_Is_head( header, (Chain_Node *)search_thread ) ) 4000a140: 80 a4 00 13 cmp %l0, %l3 4000a144: 22 80 00 15 be,a 4000a198 <_Thread_queue_Enqueue_priority+0x188> 4000a148: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 break; search_priority = search_thread->current_priority; 4000a14c: e8 04 20 14 ld [ %l0 + 0x14 ], %l4 if ( priority >= search_priority ) 4000a150: 80 a4 80 14 cmp %l2, %l4 4000a154: 3a 80 00 11 bcc,a 4000a198 <_Thread_queue_Enqueue_priority+0x188> 4000a158: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 <== NOT EXECUTED break; #endif _ISR_Flash( level ); 4000a15c: 7f ff df 60 call 40001edc 4000a160: 90 10 00 11 mov %l1, %o0 4000a164: 7f ff df 5a call 40001ecc 4000a168: 01 00 00 00 nop if ( !_States_Are_set( search_thread->current_state, block_state) ) { 4000a16c: c2 04 20 10 ld [ %l0 + 0x10 ], %g1 4000a170: 80 8d 80 01 btst %l6, %g1 4000a174: 32 80 00 05 bne,a 4000a188 <_Thread_queue_Enqueue_priority+0x178> 4000a178: e0 04 20 04 ld [ %l0 + 4 ], %l0 _ISR_Enable( level ); 4000a17c: 7f ff df 58 call 40001edc <== NOT EXECUTED 4000a180: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 4000a184: 30 bf ff e5 b,a 4000a118 <_Thread_queue_Enqueue_priority+0x108> <== NOT EXECUTED restart_reverse_search: search_priority = PRIORITY_MAXIMUM + 1; _ISR_Disable( level ); search_thread = (Thread_Control *) header->last; while ( !_Chain_Is_head( header, (Chain_Node *)search_thread ) ) { 4000a188: 80 a4 00 13 cmp %l0, %l3 4000a18c: 32 bf ff e9 bne,a 4000a130 <_Thread_queue_Enqueue_priority+0x120> 4000a190: e8 04 20 14 ld [ %l0 + 0x14 ], %l4 } search_thread = (Thread_Control *) search_thread->Object.Node.previous; } if ( the_thread_queue->sync_state != THREAD_QUEUE_NOTHING_HAPPENED ) 4000a194: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 4000a198: 80 a0 60 01 cmp %g1, 1 4000a19c: 32 80 00 15 bne,a 4000a1f0 <_Thread_queue_Enqueue_priority+0x1e0> 4000a1a0: c4 06 20 30 ld [ %i0 + 0x30 ], %g2 <== NOT EXECUTED goto synchronize; the_thread_queue->sync_state = THREAD_QUEUE_SYNCHRONIZED; if ( priority == search_priority ) 4000a1a4: 80 a4 80 14 cmp %l2, %l4 4000a1a8: 02 80 00 0a be 4000a1d0 <_Thread_queue_Enqueue_priority+0x1c0> 4000a1ac: c0 26 20 30 clr [ %i0 + 0x30 ] goto equal_priority; search_node = (Chain_Node *) search_thread; next_node = search_node->next; 4000a1b0: c2 04 00 00 ld [ %l0 ], %g1 the_node = (Chain_Node *) the_thread; the_node->next = next_node; the_node->previous = search_node; 4000a1b4: e0 26 60 04 st %l0, [ %i1 + 4 ] search_node = (Chain_Node *) search_thread; next_node = search_node->next; the_node = (Chain_Node *) the_thread; the_node->next = next_node; 4000a1b8: c2 26 40 00 st %g1, [ %i1 ] the_node->previous = search_node; search_node->next = the_node; next_node->previous = the_node; the_thread->Wait.queue = the_thread_queue; 4000a1bc: f0 26 60 44 st %i0, [ %i1 + 0x44 ] next_node = search_node->next; the_node = (Chain_Node *) the_thread; the_node->next = next_node; the_node->previous = search_node; search_node->next = the_node; 4000a1c0: f2 24 00 00 st %i1, [ %l0 ] next_node->previous = the_node; 4000a1c4: f2 20 60 04 st %i1, [ %g1 + 4 ] the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); 4000a1c8: 7f ff df 45 call 40001edc 4000a1cc: 91 e8 00 11 restore %g0, %l1, %o0 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 4000a1d0: 82 04 20 3c add %l0, 0x3c, %g1 return; equal_priority: /* add at end of priority group */ search_node = _Chain_Tail( &search_thread->Wait.Block2n ); previous_node = search_node->previous; 4000a1d4: c4 00 60 04 ld [ %g1 + 4 ], %g2 the_node = (Chain_Node *) the_thread; the_node->next = search_node; 4000a1d8: c2 26 40 00 st %g1, [ %i1 ] the_node->previous = previous_node; 4000a1dc: c4 26 60 04 st %g2, [ %i1 + 4 ] previous_node->next = the_node; search_node->previous = the_node; the_thread->Wait.queue = the_thread_queue; 4000a1e0: f0 26 60 44 st %i0, [ %i1 + 0x44 ] previous_node = search_node->previous; the_node = (Chain_Node *) the_thread; the_node->next = search_node; the_node->previous = previous_node; previous_node->next = the_node; 4000a1e4: f2 20 80 00 st %i1, [ %g2 ] search_node->previous = the_node; 4000a1e8: f2 20 60 04 st %i1, [ %g1 + 4 ] the_thread->Wait.queue = the_thread_queue; _ISR_Enable( level ); 4000a1ec: 30 bf ff f7 b,a 4000a1c8 <_Thread_queue_Enqueue_priority+0x1b8> synchronize: sync_state = the_thread_queue->sync_state; the_thread_queue->sync_state = THREAD_QUEUE_SYNCHRONIZED; switch ( sync_state ) { 4000a1f0: 80 a0 a0 02 cmp %g2, 2 <== NOT EXECUTED 4000a1f4: 02 80 00 07 be 4000a210 <_Thread_queue_Enqueue_priority+0x200> <== NOT EXECUTED 4000a1f8: c0 26 20 30 clr [ %i0 + 0x30 ] <== NOT EXECUTED 4000a1fc: 80 a0 a0 03 cmp %g2, 3 <== NOT EXECUTED 4000a200: 12 80 00 17 bne 4000a25c <_Thread_queue_Enqueue_priority+0x24c> <== NOT EXECUTED 4000a204: b0 10 00 19 mov %i1, %i0 <== NOT EXECUTED the_thread->Wait.queue = NULL; _ISR_Enable( level ); break; case THREAD_QUEUE_SATISFIED: if ( _Watchdog_Is_active( &the_thread->Timer ) ) { 4000a208: 10 80 00 07 b 4000a224 <_Thread_queue_Enqueue_priority+0x214> <== NOT EXECUTED 4000a20c: c2 06 60 50 ld [ %i1 + 0x50 ], %g1 <== NOT EXECUTED * This should never happen. All of this was dealt with above. */ break; case THREAD_QUEUE_TIMEOUT: the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status; 4000a210: c2 06 60 44 ld [ %i1 + 0x44 ], %g1 <== NOT EXECUTED the_thread->Wait.queue = NULL; 4000a214: c0 26 60 44 clr [ %i1 + 0x44 ] <== NOT EXECUTED * This should never happen. All of this was dealt with above. */ break; case THREAD_QUEUE_TIMEOUT: the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status; 4000a218: c2 00 60 3c ld [ %g1 + 0x3c ], %g1 <== NOT EXECUTED 4000a21c: c2 26 60 34 st %g1, [ %i1 + 0x34 ] <== NOT EXECUTED the_thread->Wait.queue = NULL; _ISR_Enable( level ); 4000a220: 30 80 00 0c b,a 4000a250 <_Thread_queue_Enqueue_priority+0x240> <== NOT EXECUTED break; case THREAD_QUEUE_SATISFIED: if ( _Watchdog_Is_active( &the_thread->Timer ) ) { 4000a224: 80 a0 60 02 cmp %g1, 2 <== NOT EXECUTED 4000a228: 12 80 00 0a bne 4000a250 <_Thread_queue_Enqueue_priority+0x240> <== NOT EXECUTED 4000a22c: 01 00 00 00 nop <== NOT EXECUTED RTEMS_INLINE_ROUTINE void _Watchdog_Deactivate( Watchdog_Control *the_watchdog ) { the_watchdog->state = WATCHDOG_REMOVE_IT; 4000a230: c4 26 60 50 st %g2, [ %i1 + 0x50 ] <== NOT EXECUTED _Watchdog_Deactivate( &the_thread->Timer ); the_thread->Wait.queue = NULL; 4000a234: c0 26 60 44 clr [ %i1 + 0x44 ] <== NOT EXECUTED _ISR_Enable( level ); 4000a238: 7f ff df 29 call 40001edc <== NOT EXECUTED 4000a23c: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED (void) _Watchdog_Remove( &the_thread->Timer ); 4000a240: 40 00 03 20 call 4000aec0 <_Watchdog_Remove> <== NOT EXECUTED 4000a244: 90 06 60 48 add %i1, 0x48, %o0 <== NOT EXECUTED 4000a248: 10 80 00 05 b 4000a25c <_Thread_queue_Enqueue_priority+0x24c> <== NOT EXECUTED 4000a24c: b0 10 00 19 mov %i1, %i0 <== NOT EXECUTED } else _ISR_Enable( level ); 4000a250: 7f ff df 23 call 40001edc <== NOT EXECUTED 4000a254: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 4000a258: b0 10 00 19 mov %i1, %i0 <== NOT EXECUTED 4000a25c: 33 04 00 ff sethi %hi(0x1003fc00), %i1 <== NOT EXECUTED 4000a260: b2 16 63 f8 or %i1, 0x3f8, %i1 ! 1003fff8 <== NOT EXECUTED 4000a264: 7f ff fd 28 call 40009704 <_Thread_Clear_state> <== NOT EXECUTED 4000a268: 81 e8 00 00 restore <== NOT EXECUTED 4000a26c: 01 00 00 00 nop 40009f8c <_Thread_queue_Enqueue_with_handler>: void _Thread_queue_Enqueue_with_handler( Thread_queue_Control *the_thread_queue, Watchdog_Interval timeout, Thread_queue_Timeout_callout handler ) { 40009f8c: 9d e3 bf 98 save %sp, -104, %sp Thread_Control *the_thread; the_thread = _Thread_Executing; 40009f90: 03 10 00 6b sethi %hi(0x4001ac00), %g1 else #endif /* * Set the blocking state for this thread queue in the thread. */ _Thread_Set_state( the_thread, the_thread_queue->state ); 40009f94: d2 06 20 38 ld [ %i0 + 0x38 ], %o1 Thread_queue_Timeout_callout handler ) { Thread_Control *the_thread; the_thread = _Thread_Executing; 40009f98: e0 00 62 ac ld [ %g1 + 0x2ac ], %l0 void _Thread_queue_Enqueue_with_handler( Thread_queue_Control *the_thread_queue, Watchdog_Interval timeout, Thread_queue_Timeout_callout handler ) { 40009f9c: a2 10 00 18 mov %i0, %l1 else #endif /* * Set the blocking state for this thread queue in the thread. */ _Thread_Set_state( the_thread, the_thread_queue->state ); 40009fa0: 40 00 01 79 call 4000a584 <_Thread_Set_state> 40009fa4: 90 10 00 10 mov %l0, %o0 /* * If the thread wants to timeout, then schedule its timer. */ if ( timeout ) { 40009fa8: 80 a6 60 00 cmp %i1, 0 40009fac: 22 80 00 0d be,a 40009fe0 <_Thread_queue_Enqueue_with_handler+0x54> 40009fb0: c2 04 60 34 ld [ %l1 + 0x34 ], %g1 _Watchdog_Initialize( 40009fb4: c2 04 20 08 ld [ %l0 + 8 ], %g1 ) { the_watchdog->initial = units; _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 40009fb8: 11 10 00 6b sethi %hi(0x4001ac00), %o0 Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; 40009fbc: f4 24 20 64 st %i2, [ %l0 + 0x64 ] the_watchdog->id = id; 40009fc0: c2 24 20 68 st %g1, [ %l0 + 0x68 ] Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 40009fc4: f2 24 20 54 st %i1, [ %l0 + 0x54 ] Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 40009fc8: c0 24 20 50 clr [ %l0 + 0x50 ] the_watchdog->routine = routine; the_watchdog->id = id; the_watchdog->user_data = user_data; 40009fcc: c0 24 20 6c clr [ %l0 + 0x6c ] ) { the_watchdog->initial = units; _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 40009fd0: 90 12 22 cc or %o0, 0x2cc, %o0 40009fd4: 40 00 03 63 call 4000ad60 <_Watchdog_Insert> 40009fd8: 92 04 20 48 add %l0, 0x48, %o1 } /* * Now enqueue the thread per the discipline for this thread queue. */ switch( the_thread_queue->discipline ) { 40009fdc: c2 04 60 34 ld [ %l1 + 0x34 ], %g1 40009fe0: 80 a0 60 00 cmp %g1, 0 40009fe4: 02 80 00 05 be 40009ff8 <_Thread_queue_Enqueue_with_handler+0x6c> 40009fe8: 80 a0 60 01 cmp %g1, 1 40009fec: 12 80 00 07 bne 4000a008 <_Thread_queue_Enqueue_with_handler+0x7c> 40009ff0: 01 00 00 00 nop 40009ff4: 30 80 00 03 b,a 4000a000 <_Thread_queue_Enqueue_with_handler+0x74> case THREAD_QUEUE_DISCIPLINE_FIFO: _Thread_queue_Enqueue_fifo( the_thread_queue, the_thread ); 40009ff8: 40 00 0f 39 call 4000dcdc <_Thread_queue_Enqueue_fifo> 40009ffc: 93 e8 00 10 restore %g0, %l0, %o1 break; case THREAD_QUEUE_DISCIPLINE_PRIORITY: _Thread_queue_Enqueue_priority( the_thread_queue, the_thread ); 4000a000: 40 00 00 04 call 4000a010 <_Thread_queue_Enqueue_priority> 4000a004: 93 e8 00 10 restore %g0, %l0, %o1 4000a008: 81 c7 e0 08 ret <== NOT EXECUTED 4000a00c: 81 e8 00 00 restore <== NOT EXECUTED 4000dd90 <_Thread_queue_Extract>: void _Thread_queue_Extract( Thread_queue_Control *the_thread_queue, Thread_Control *the_thread ) { switch ( the_thread_queue->discipline ) { 4000dd90: c2 02 20 34 ld [ %o0 + 0x34 ], %g1 4000dd94: 80 a0 60 00 cmp %g1, 0 4000dd98: 02 80 00 05 be 4000ddac <_Thread_queue_Extract+0x1c> 4000dd9c: 80 a0 60 01 cmp %g1, 1 4000dda0: 12 80 00 09 bne 4000ddc4 <_Thread_queue_Extract+0x34> 4000dda4: 94 10 20 00 clr %o2 4000dda8: 30 80 00 04 b,a 4000ddb8 <_Thread_queue_Extract+0x28> case THREAD_QUEUE_DISCIPLINE_FIFO: _Thread_queue_Extract_fifo( the_thread_queue, the_thread ); 4000ddac: 82 13 c0 00 mov %o7, %g1 4000ddb0: 40 00 04 32 call 4000ee78 <_Thread_queue_Extract_fifo> 4000ddb4: 9e 10 40 00 mov %g1, %o7 break; case THREAD_QUEUE_DISCIPLINE_PRIORITY: _Thread_queue_Extract_priority( the_thread_queue, the_thread ); 4000ddb8: 82 13 c0 00 mov %o7, %g1 4000ddbc: 40 00 00 04 call 4000ddcc <_Thread_queue_Extract_priority_helper> 4000ddc0: 9e 10 40 00 mov %g1, %o7 4000ddc4: 81 c3 e0 08 retl <== NOT EXECUTED 4000ddc8: 01 00 00 00 nop 4000ee78 <_Thread_queue_Extract_fifo>: void _Thread_queue_Extract_fifo( Thread_queue_Control *the_thread_queue, Thread_Control *the_thread ) { 4000ee78: 9d e3 bf 98 save %sp, -104, %sp ISR_Level level; _ISR_Disable( level ); 4000ee7c: 7f ff cc 14 call 40001ecc 4000ee80: b0 10 00 19 mov %i1, %i0 if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) { 4000ee84: c4 06 60 10 ld [ %i1 + 0x10 ], %g2 4000ee88: 03 00 00 ef sethi %hi(0x3bc00), %g1 4000ee8c: 82 10 62 e0 or %g1, 0x2e0, %g1 ! 3bee0 4000ee90: 80 88 80 01 btst %g2, %g1 4000ee94: 32 80 00 04 bne,a 4000eea4 <_Thread_queue_Extract_fifo+0x2c> 4000ee98: c2 06 40 00 ld [ %i1 ], %g1 _ISR_Enable( level ); 4000ee9c: 7f ff cc 10 call 40001edc <== NOT EXECUTED 4000eea0: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED { Chain_Node *next; Chain_Node *previous; next = the_node->next; previous = the_node->previous; 4000eea4: c4 06 60 04 ld [ %i1 + 4 ], %g2 _Chain_Extract_unprotected( &the_thread->Object.Node ); the_thread->Wait.queue = NULL; if ( !_Watchdog_Is_active( &the_thread->Timer ) ) { 4000eea8: c6 06 60 50 ld [ %i1 + 0x50 ], %g3 next->previous = previous; previous->next = next; 4000eeac: c2 20 80 00 st %g1, [ %g2 ] Chain_Node *next; Chain_Node *previous; next = the_node->next; previous = the_node->previous; next->previous = previous; 4000eeb0: c4 20 60 04 st %g2, [ %g1 + 4 ] 4000eeb4: 80 a0 e0 02 cmp %g3, 2 4000eeb8: 02 80 00 06 be 4000eed0 <_Thread_queue_Extract_fifo+0x58> 4000eebc: c0 26 60 44 clr [ %i1 + 0x44 ] _ISR_Enable( level ); 4000eec0: 7f ff cc 07 call 40001edc 4000eec4: 33 04 00 ff sethi %hi(0x1003fc00), %i1 RTEMS_INLINE_ROUTINE void _Thread_Unblock ( Thread_Control *the_thread ) { _Thread_Clear_state( the_thread, STATES_BLOCKED ); 4000eec8: 10 80 00 0a b 4000eef0 <_Thread_queue_Extract_fifo+0x78> 4000eecc: b2 16 63 f8 or %i1, 0x3f8, %i1 ! 1003fff8 4000eed0: 82 10 20 03 mov 3, %g1 4000eed4: c2 26 60 50 st %g1, [ %i1 + 0x50 ] } else { _Watchdog_Deactivate( &the_thread->Timer ); _ISR_Enable( level ); 4000eed8: 7f ff cc 01 call 40001edc 4000eedc: 01 00 00 00 nop (void) _Watchdog_Remove( &the_thread->Timer ); 4000eee0: 7f ff ef f8 call 4000aec0 <_Watchdog_Remove> 4000eee4: 90 06 60 48 add %i1, 0x48, %o0 4000eee8: 33 04 00 ff sethi %hi(0x1003fc00), %i1 4000eeec: b2 16 63 f8 or %i1, 0x3f8, %i1 ! 1003fff8 4000eef0: 7f ff ea 05 call 40009704 <_Thread_Clear_state> 4000eef4: 81 e8 00 00 restore 4000eef8: 01 00 00 00 nop 4000ddcc <_Thread_queue_Extract_priority_helper>: void _Thread_queue_Extract_priority_helper( Thread_queue_Control *the_thread_queue, Thread_Control *the_thread, boolean requeuing ) { 4000ddcc: 9d e3 bf 98 save %sp, -104, %sp Chain_Node *new_first_node; Chain_Node *new_second_node; Chain_Node *last_node; the_node = (Chain_Node *) the_thread; _ISR_Disable( level ); 4000ddd0: 7f ff d0 3f call 40001ecc 4000ddd4: b0 10 00 19 mov %i1, %i0 if ( !_States_Is_waiting_on_thread_queue( the_thread->current_state ) ) { 4000ddd8: c4 06 60 10 ld [ %i1 + 0x10 ], %g2 4000dddc: 03 00 00 ef sethi %hi(0x3bc00), %g1 4000dde0: 82 10 62 e0 or %g1, 0x2e0, %g1 ! 3bee0 4000dde4: 80 88 80 01 btst %g2, %g1 4000dde8: 32 80 00 03 bne,a 4000ddf4 <_Thread_queue_Extract_priority_helper+0x28> 4000ddec: c6 06 60 38 ld [ %i1 + 0x38 ], %g3 _ISR_Enable( level ); 4000ddf0: 30 80 00 1d b,a 4000de64 <_Thread_queue_Extract_priority_helper+0x98> <== NOT EXECUTED */ next_node = the_node->next; previous_node = the_node->previous; if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) { 4000ddf4: 82 06 60 3c add %i1, 0x3c, %g1 /* * The thread was actually waiting on a thread queue so let's remove it. */ next_node = the_node->next; 4000ddf8: c4 06 40 00 ld [ %i1 ], %g2 previous_node = the_node->previous; if ( !_Chain_Is_empty( &the_thread->Wait.Block2n ) ) { 4000ddfc: 80 a0 c0 01 cmp %g3, %g1 4000de00: 02 80 00 14 be 4000de50 <_Thread_queue_Extract_priority_helper+0x84> 4000de04: c2 06 60 04 ld [ %i1 + 4 ], %g1 new_first_node = the_thread->Wait.Block2n.first; new_first_thread = (Thread_Control *) new_first_node; last_node = the_thread->Wait.Block2n.last; 4000de08: da 06 60 40 ld [ %i1 + 0x40 ], %o5 new_second_node = new_first_node->next; 4000de0c: c8 00 c0 00 ld [ %g3 ], %g4 previous_node->next = new_first_node; next_node->previous = new_first_node; 4000de10: c6 20 a0 04 st %g3, [ %g2 + 4 ] new_first_node = the_thread->Wait.Block2n.first; new_first_thread = (Thread_Control *) new_first_node; last_node = the_thread->Wait.Block2n.last; new_second_node = new_first_node->next; previous_node->next = new_first_node; 4000de14: c6 20 40 00 st %g3, [ %g1 ] next_node->previous = new_first_node; new_first_node->next = next_node; 4000de18: c4 20 c0 00 st %g2, [ %g3 ] new_first_node->previous = previous_node; 4000de1c: c2 20 e0 04 st %g1, [ %g3 + 4 ] if ( !_Chain_Has_only_one_node( &the_thread->Wait.Block2n ) ) { 4000de20: c4 06 60 38 ld [ %i1 + 0x38 ], %g2 4000de24: c2 06 60 40 ld [ %i1 + 0x40 ], %g1 4000de28: 80 a0 80 01 cmp %g2, %g1 4000de2c: 02 80 00 0c be 4000de5c <_Thread_queue_Extract_priority_helper+0x90> 4000de30: 80 a6 a0 00 cmp %i2, 0 /* > two threads on 2-n */ new_second_node->previous = 4000de34: 82 00 e0 38 add %g3, 0x38, %g1 <== NOT EXECUTED 4000de38: c2 21 20 04 st %g1, [ %g4 + 4 ] <== NOT EXECUTED _Chain_Head( &new_first_thread->Wait.Block2n ); new_first_thread->Wait.Block2n.first = new_second_node; 4000de3c: c8 20 e0 38 st %g4, [ %g3 + 0x38 ] <== NOT EXECUTED new_first_thread->Wait.Block2n.last = last_node; 4000de40: da 20 e0 40 st %o5, [ %g3 + 0x40 ] <== NOT EXECUTED last_node->next = _Chain_Tail( &new_first_thread->Wait.Block2n ); 4000de44: 82 00 e0 3c add %g3, 0x3c, %g1 <== NOT EXECUTED 4000de48: 10 80 00 05 b 4000de5c <_Thread_queue_Extract_priority_helper+0x90> <== NOT EXECUTED 4000de4c: c2 23 40 00 st %g1, [ %o5 ] <== NOT EXECUTED } } else { previous_node->next = next_node; next_node->previous = previous_node; 4000de50: c2 20 a0 04 st %g1, [ %g2 + 4 ] new_first_thread->Wait.Block2n.last = last_node; last_node->next = _Chain_Tail( &new_first_thread->Wait.Block2n ); } } else { previous_node->next = next_node; 4000de54: c4 20 40 00 st %g2, [ %g1 ] /* * If we are not supposed to touch timers or the thread's state, return. */ if ( requeuing ) { 4000de58: 80 a6 a0 00 cmp %i2, 0 4000de5c: 22 80 00 04 be,a 4000de6c <_Thread_queue_Extract_priority_helper+0xa0> 4000de60: c2 06 20 50 ld [ %i0 + 0x50 ], %g1 _ISR_Enable( level ); 4000de64: 7f ff d0 1e call 40001edc 4000de68: 91 e8 00 08 restore %g0, %o0, %o0 return; } if ( !_Watchdog_Is_active( &the_thread->Timer ) ) { 4000de6c: 80 a0 60 02 cmp %g1, 2 4000de70: 02 80 00 06 be 4000de88 <_Thread_queue_Extract_priority_helper+0xbc> 4000de74: 82 10 20 03 mov 3, %g1 _ISR_Enable( level ); 4000de78: 7f ff d0 19 call 40001edc 4000de7c: 33 04 00 ff sethi %hi(0x1003fc00), %i1 4000de80: 10 80 00 08 b 4000dea0 <_Thread_queue_Extract_priority_helper+0xd4> 4000de84: b2 16 63 f8 or %i1, 0x3f8, %i1 ! 1003fff8 4000de88: c2 26 20 50 st %g1, [ %i0 + 0x50 ] } else { _Watchdog_Deactivate( &the_thread->Timer ); _ISR_Enable( level ); 4000de8c: 7f ff d0 14 call 40001edc 4000de90: 33 04 00 ff sethi %hi(0x1003fc00), %i1 (void) _Watchdog_Remove( &the_thread->Timer ); 4000de94: 7f ff f4 0b call 4000aec0 <_Watchdog_Remove> 4000de98: 90 06 20 48 add %i0, 0x48, %o0 4000de9c: b2 16 63 f8 or %i1, 0x3f8, %i1 4000dea0: 7f ff ee 19 call 40009704 <_Thread_Clear_state> 4000dea4: 81 e8 00 00 restore 4000dea8: 01 00 00 00 nop 4000a270 <_Thread_queue_Extract_with_proxy>: */ boolean _Thread_queue_Extract_with_proxy( Thread_Control *the_thread ) { 4000a270: 9d e3 bf 98 save %sp, -104, %sp States_Control state; Objects_Information *the_information; Objects_Thread_queue_Extract_callout proxy_extract_callout; state = the_thread->current_state; 4000a274: c4 06 20 10 ld [ %i0 + 0x10 ], %g2 */ boolean _Thread_queue_Extract_with_proxy( Thread_Control *the_thread ) { 4000a278: a0 10 00 18 mov %i0, %l0 Objects_Information *the_information; Objects_Thread_queue_Extract_callout proxy_extract_callout; state = the_thread->current_state; if ( _States_Is_waiting_on_thread_queue( state ) ) { 4000a27c: 03 00 00 ef sethi %hi(0x3bc00), %g1 4000a280: 82 10 62 e0 or %g1, 0x2e0, %g1 ! 3bee0 4000a284: 80 88 80 01 btst %g2, %g1 4000a288: 02 80 00 1e be 4000a300 <_Thread_queue_Extract_with_proxy+0x90> 4000a28c: b0 10 20 00 clr %i0 if ( _States_Is_waiting_for_rpc_reply( state ) && 4000a290: 03 00 00 08 sethi %hi(0x2000), %g1 4000a294: 80 88 80 01 btst %g2, %g1 4000a298: 22 80 00 17 be,a 4000a2f4 <_Thread_queue_Extract_with_proxy+0x84> 4000a29c: d0 04 20 44 ld [ %l0 + 0x44 ], %o0 4000a2a0: 03 00 00 e7 sethi %hi(0x39c00), %g1 <== NOT EXECUTED 4000a2a4: 82 10 62 e0 or %g1, 0x2e0, %g1 ! 39ee0 <== NOT EXECUTED 4000a2a8: 80 88 80 01 btst %g2, %g1 <== NOT EXECUTED 4000a2ac: 22 80 00 12 be,a 4000a2f4 <_Thread_queue_Extract_with_proxy+0x84> <== NOT EXECUTED 4000a2b0: d0 04 20 44 ld [ %l0 + 0x44 ], %o0 <== NOT EXECUTED _States_Is_locally_blocked( state ) ) { the_information = _Objects_Get_information( the_thread->Wait.id ); 4000a2b4: c6 04 20 20 ld [ %l0 + 0x20 ], %g3 <== NOT EXECUTED proxy_extract_callout = 4000a2b8: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 4000a2bc: 85 30 e0 16 srl %g3, 0x16, %g2 <== NOT EXECUTED 4000a2c0: 82 10 61 30 or %g1, 0x130, %g1 <== NOT EXECUTED 4000a2c4: 84 08 a0 1c and %g2, 0x1c, %g2 <== NOT EXECUTED 4000a2c8: c2 00 40 02 ld [ %g1 + %g2 ], %g1 <== NOT EXECUTED 4000a2cc: 87 30 e0 1b srl %g3, 0x1b, %g3 <== NOT EXECUTED 4000a2d0: 87 28 e0 02 sll %g3, 2, %g3 <== NOT EXECUTED 4000a2d4: c2 00 40 03 ld [ %g1 + %g3 ], %g1 <== NOT EXECUTED 4000a2d8: c2 00 60 48 ld [ %g1 + 0x48 ], %g1 <== NOT EXECUTED (Objects_Thread_queue_Extract_callout) the_information->extract; if ( proxy_extract_callout ) 4000a2dc: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000a2e0: 22 80 00 05 be,a 4000a2f4 <_Thread_queue_Extract_with_proxy+0x84> <== NOT EXECUTED 4000a2e4: d0 04 20 44 ld [ %l0 + 0x44 ], %o0 <== NOT EXECUTED (*proxy_extract_callout)( the_thread ); 4000a2e8: 9f c0 40 00 call %g1 <== NOT EXECUTED 4000a2ec: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED } _Thread_queue_Extract( the_thread->Wait.queue, the_thread ); 4000a2f0: d0 04 20 44 ld [ %l0 + 0x44 ], %o0 <== NOT EXECUTED 4000a2f4: 92 10 00 10 mov %l0, %o1 4000a2f8: 40 00 0e a6 call 4000dd90 <_Thread_queue_Extract> 4000a2fc: b0 10 20 01 mov 1, %i0 return TRUE; } return FALSE; } 4000a300: 81 c7 e0 08 ret 4000a304: 81 e8 00 00 restore 4000c930 <_Thread_queue_First>: Thread_queue_Control *the_thread_queue ) { Thread_Control *the_thread; switch ( the_thread_queue->discipline ) { 4000c930: c2 02 20 34 ld [ %o0 + 0x34 ], %g1 4000c934: 80 a0 60 00 cmp %g1, 0 4000c938: 02 80 00 05 be 4000c94c <_Thread_queue_First+0x1c> 4000c93c: 80 a0 60 01 cmp %g1, 1 4000c940: 12 80 00 09 bne 4000c964 <_Thread_queue_First+0x34> 4000c944: 01 00 00 00 nop 4000c948: 30 80 00 04 b,a 4000c958 <_Thread_queue_First+0x28> case THREAD_QUEUE_DISCIPLINE_FIFO: the_thread = _Thread_queue_First_fifo( the_thread_queue ); 4000c94c: 82 13 c0 00 mov %o7, %g1 4000c950: 40 00 0f 51 call 40010694 <_Thread_queue_First_fifo> 4000c954: 9e 10 40 00 mov %g1, %o7 break; case THREAD_QUEUE_DISCIPLINE_PRIORITY: the_thread = _Thread_queue_First_priority( the_thread_queue ); 4000c958: 82 13 c0 00 mov %o7, %g1 4000c95c: 40 00 00 04 call 4000c96c <_Thread_queue_First_priority> 4000c960: 9e 10 40 00 mov %g1, %o7 the_thread = NULL; break; } return the_thread; } 4000c964: 81 c3 e0 08 retl <== NOT EXECUTED 4000c968: 90 10 20 00 clr %o0 <== NOT EXECUTED 4000a3b4 <_Thread_queue_Requeue>: void _Thread_queue_Requeue( Thread_queue_Control *the_thread_queue, Thread_Control *the_thread ) { 4000a3b4: 9d e3 bf 98 save %sp, -104, %sp /* just in case the thread really wasn't blocked here */ if ( !the_thread_queue ) { 4000a3b8: 80 a6 20 00 cmp %i0, 0 4000a3bc: 02 80 00 18 be 4000a41c <_Thread_queue_Requeue+0x68> 4000a3c0: 01 00 00 00 nop return; } switch ( the_thread_queue->discipline ) { 4000a3c4: e0 06 20 34 ld [ %i0 + 0x34 ], %l0 4000a3c8: 80 a4 20 01 cmp %l0, 1 4000a3cc: 12 80 00 14 bne 4000a41c <_Thread_queue_Requeue+0x68> 4000a3d0: 01 00 00 00 nop break; case THREAD_QUEUE_DISCIPLINE_PRIORITY: { Thread_queue_Control *tq = the_thread_queue; ISR_Level level; _ISR_Disable( level ); 4000a3d4: 7f ff de be call 40001ecc 4000a3d8: 01 00 00 00 nop 4000a3dc: a2 10 00 08 mov %o0, %l1 if ( _States_Is_waiting_on_thread_queue( the_thread->current_state ) ) { 4000a3e0: c4 06 60 10 ld [ %i1 + 0x10 ], %g2 4000a3e4: 03 00 00 ef sethi %hi(0x3bc00), %g1 4000a3e8: 82 10 62 e0 or %g1, 0x2e0, %g1 ! 3bee0 4000a3ec: 80 88 80 01 btst %g2, %g1 4000a3f0: 02 80 00 09 be 4000a414 <_Thread_queue_Requeue+0x60> 4000a3f4: 90 10 00 18 mov %i0, %o0 _Thread_queue_Enter_critical_section( tq ); _Thread_queue_Extract_priority_helper( tq, the_thread, TRUE ); 4000a3f8: 92 10 00 19 mov %i1, %o1 4000a3fc: 94 10 20 01 mov 1, %o2 4000a400: 40 00 0e 73 call 4000ddcc <_Thread_queue_Extract_priority_helper> 4000a404: e0 26 20 30 st %l0, [ %i0 + 0x30 ] _Thread_queue_Enqueue_priority( tq, the_thread ); 4000a408: 90 10 00 18 mov %i0, %o0 4000a40c: 7f ff ff 01 call 4000a010 <_Thread_queue_Enqueue_priority> 4000a410: 92 10 00 19 mov %i1, %o1 } _ISR_Enable( level ); 4000a414: 7f ff de b2 call 40001edc 4000a418: 91 e8 00 11 restore %g0, %l1, %o0 4000a41c: 81 c7 e0 08 ret <== NOT EXECUTED 4000a420: 81 e8 00 00 restore <== NOT EXECUTED 4000a424 <_Thread_queue_Timeout>: void _Thread_queue_Timeout( Objects_Id id, void *ignored ) { 4000a424: 9d e3 bf 90 save %sp, -112, %sp uint32_t the_api; uint32_t the_class; Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { 4000a428: 92 96 20 00 orcc %i0, 0, %o1 4000a42c: 12 80 00 0a bne 4000a454 <_Thread_queue_Timeout+0x30> 4000a430: 83 32 60 18 srl %o1, 0x18, %g1 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 4000a434: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 4000a438: c4 00 61 d0 ld [ %g1 + 0x1d0 ], %g2 ! 4001add0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 4000a43c: 84 00 a0 01 inc %g2 <== NOT EXECUTED 4000a440: c4 20 61 d0 st %g2, [ %g1 + 0x1d0 ] <== NOT EXECUTED Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; tp = _Thread_Executing; 4000a444: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 4000a448: d2 00 62 ac ld [ %g1 + 0x2ac ], %o1 ! 4001aeac <_Thread_Executing> <== NOT EXECUTED Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; 4000a44c: 10 80 00 18 b 4000a4ac <_Thread_queue_Timeout+0x88> <== NOT EXECUTED 4000a450: c0 27 bf f4 clr [ %fp + -12 ] <== NOT EXECUTED */ RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API( Objects_Id id ) { return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS); 4000a454: 84 08 60 07 and %g1, 7, %g2 tp = _Thread_Executing; goto done; } the_api = _Objects_Get_API( id ); if ( the_api && the_api > OBJECTS_APIS_LAST ) { 4000a458: 80 a0 a0 04 cmp %g2, 4 4000a45c: 18 80 00 0e bgu 4000a494 <_Thread_queue_Timeout+0x70> 4000a460: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; goto done; } the_class = _Objects_Get_class( id ); if ( the_class != 1 ) { /* threads are always first class :) */ 4000a464: 83 32 60 1b srl %o1, 0x1b, %g1 4000a468: 80 a0 60 01 cmp %g1, 1 4000a46c: 12 80 00 0a bne 4000a494 <_Thread_queue_Timeout+0x70> 4000a470: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; goto done; } information = _Objects_Information_table[ the_api ][ the_class ]; 4000a474: 83 28 a0 02 sll %g2, 2, %g1 4000a478: 05 10 00 6b sethi %hi(0x4001ac00), %g2 4000a47c: 84 10 a1 30 or %g2, 0x130, %g2 ! 4001ad30 <_Objects_Information_table> 4000a480: c2 00 80 01 ld [ %g2 + %g1 ], %g1 4000a484: d0 00 60 04 ld [ %g1 + 4 ], %o0 if ( !information ) { 4000a488: 80 a2 20 00 cmp %o0, 0 4000a48c: 12 80 00 05 bne 4000a4a0 <_Thread_queue_Timeout+0x7c> 4000a490: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 4000a494: 92 10 20 00 clr %o1 <== NOT EXECUTED 4000a498: 10 80 00 05 b 4000a4ac <_Thread_queue_Timeout+0x88> <== NOT EXECUTED 4000a49c: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED goto done; } tp = (Thread_Control *) _Objects_Get( information, id, location ); 4000a4a0: 7f ff f8 5f call 4000861c <_Objects_Get> 4000a4a4: 94 07 bf f4 add %fp, -12, %o2 4000a4a8: 92 10 00 08 mov %o0, %o1 Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); switch ( location ) { 4000a4ac: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000a4b0: 80 a0 60 00 cmp %g1, 0 4000a4b4: 12 80 00 18 bne 4000a514 <_Thread_queue_Timeout+0xf0> 4000a4b8: 01 00 00 00 nop */ static inline void _Thread_queue_Process_timeout( Thread_Control *the_thread ) { Thread_queue_Control *the_thread_queue = the_thread->Wait.queue; 4000a4bc: c4 02 60 44 ld [ %o1 + 0x44 ], %g2 * 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_QUEUE_SYNCHRONIZED && 4000a4c0: c6 00 a0 30 ld [ %g2 + 0x30 ], %g3 4000a4c4: 80 a0 e0 00 cmp %g3, 0 4000a4c8: 02 80 00 0b be 4000a4f4 <_Thread_queue_Timeout+0xd0> 4000a4cc: 03 10 00 6b sethi %hi(0x4001ac00), %g1 4000a4d0: c2 00 62 ac ld [ %g1 + 0x2ac ], %g1 ! 4001aeac <_Thread_Executing> <== NOT EXECUTED 4000a4d4: 80 a2 40 01 cmp %o1, %g1 <== NOT EXECUTED 4000a4d8: 32 80 00 08 bne,a 4000a4f8 <_Thread_queue_Timeout+0xd4> <== NOT EXECUTED 4000a4dc: c2 00 a0 3c ld [ %g2 + 0x3c ], %g1 <== NOT EXECUTED _Thread_Is_executing( the_thread ) ) { if ( the_thread_queue->sync_state != THREAD_QUEUE_SATISFIED ) 4000a4e0: 80 a0 e0 03 cmp %g3, 3 <== NOT EXECUTED 4000a4e4: 02 80 00 08 be 4000a504 <_Thread_queue_Timeout+0xe0> <== NOT EXECUTED 4000a4e8: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED the_thread_queue->sync_state = THREAD_QUEUE_TIMEOUT; 4000a4ec: 10 80 00 06 b 4000a504 <_Thread_queue_Timeout+0xe0> <== NOT EXECUTED 4000a4f0: c2 20 a0 30 st %g1, [ %g2 + 0x30 ] <== NOT EXECUTED } else { the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status; 4000a4f4: c2 00 a0 3c ld [ %g2 + 0x3c ], %g1 _Thread_queue_Extract( the_thread->Wait.queue, the_thread ); 4000a4f8: d0 02 60 44 ld [ %o1 + 0x44 ], %o0 4000a4fc: 40 00 0e 25 call 4000dd90 <_Thread_queue_Extract> 4000a500: c2 22 60 34 st %g1, [ %o1 + 0x34 ] */ RTEMS_INLINE_ROUTINE void _Thread_Unnest_dispatch( void ) { RTEMS_COMPILER_MEMORY_BARRIER(); _Thread_Dispatch_disable_level -= 1; 4000a504: 05 10 00 6b sethi %hi(0x4001ac00), %g2 4000a508: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> 4000a50c: 82 00 7f ff add %g1, -1, %g1 4000a510: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] 4000a514: 81 c7 e0 08 ret 4000a518: 81 e8 00 00 restore 40013888 <_Timer_Server_body>: */ Thread _Timer_Server_body( uint32_t ignored ) { 40013888: 9d e3 bf 98 save %sp, -104, %sp /* * Initialize the "last time" markers to indicate the timer that * the server was initiated. */ _Timer_Server_ticks_last_time = _Watchdog_Ticks_since_boot; 4001388c: 03 10 00 d2 sethi %hi(0x40034800), %g1 40013890: c8 00 62 34 ld [ %g1 + 0x234 ], %g4 ! 40034a34 <_Watchdog_Ticks_since_boot> _Timer_Server_seconds_last_time = _TOD_Seconds_since_epoch; 40013894: 03 10 00 d2 sethi %hi(0x40034800), %g1 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40013898: 07 10 00 d2 sethi %hi(0x40034800), %g3 4001389c: da 00 61 68 ld [ %g1 + 0x168 ], %o5 400138a0: c2 00 e0 b0 ld [ %g3 + 0xb0 ], %g1 /* * Initialize the "last time" markers to indicate the timer that * the server was initiated. */ _Timer_Server_ticks_last_time = _Watchdog_Ticks_since_boot; 400138a4: 05 10 00 d1 sethi %hi(0x40034400), %g2 400138a8: 82 00 60 01 inc %g1 400138ac: c8 20 a3 bc st %g4, [ %g2 + 0x3bc ] 400138b0: c2 20 e0 b0 st %g1, [ %g3 + 0xb0 ] _Timer_Server_seconds_last_time = _TOD_Seconds_since_epoch; 400138b4: 03 10 00 d1 sethi %hi(0x40034400), %g1 400138b8: da 20 63 b8 st %o5, [ %g1 + 0x3b8 ] ! 400347b8 <_Timer_Server_seconds_last_time> ) { the_watchdog->initial = units; _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 400138bc: 03 10 00 d2 sethi %hi(0x40034800), %g1 */ RTEMS_INLINE_ROUTINE boolean _Chain_Is_empty( Chain_Control *the_chain ) { return (the_chain->first == _Chain_Tail(the_chain)); 400138c0: 27 10 00 d1 sethi %hi(0x40034400), %l3 400138c4: ba 10 61 ac or %g1, 0x1ac, %i5 400138c8: 82 14 e3 ac or %l3, 0x3ac, %g1 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 400138cc: ae 00 60 04 add %g1, 4, %l7 Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 400138d0: 03 10 00 d1 sethi %hi(0x40034400), %g1 */ RTEMS_INLINE_ROUTINE boolean _Chain_Is_empty( Chain_Control *the_chain ) { return (the_chain->first == _Chain_Tail(the_chain)); 400138d4: 25 10 00 d1 sethi %hi(0x40034400), %l2 400138d8: a2 10 63 cc or %g1, 0x3cc, %l1 400138dc: 82 14 a3 c0 or %l2, 0x3c0, %g1 400138e0: a8 10 00 03 mov %g3, %l4 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 400138e4: ac 00 60 04 add %g1, 4, %l6 /* * Block until there is something to do. */ _Thread_Set_state( _Timer_Server, STATES_DELAYING ); 400138e8: 21 10 00 d4 sethi %hi(0x40035000), %l0 _Watchdog_Insert( &_Watchdog_Seconds_chain, the_watchdog ); 400138ec: 03 10 00 d2 sethi %hi(0x40034800), %g1 400138f0: aa 10 61 a0 or %g1, 0x1a0, %l5 ! 400349a0 <_Watchdog_Seconds_chain> 400138f4: d0 04 23 38 ld [ %l0 + 0x338 ], %o0 400138f8: 40 00 10 38 call 400179d8 <_Thread_Set_state> 400138fc: 92 10 20 08 mov 8, %o1 */ RTEMS_INLINE_ROUTINE boolean _Chain_Is_empty( Chain_Control *the_chain ) { return (the_chain->first == _Chain_Tail(the_chain)); 40013900: c2 04 e3 ac ld [ %l3 + 0x3ac ], %g1 _Timer_Server_reset_ticks_timer(); 40013904: 80 a0 40 17 cmp %g1, %l7 40013908: 22 80 00 09 be,a 4001392c <_Timer_Server_body+0xa4> 4001390c: c2 04 a3 c0 ld [ %l2 + 0x3c0 ], %g1 40013910: d2 04 23 38 ld [ %l0 + 0x338 ], %o1 Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 40013914: c2 00 60 10 ld [ %g1 + 0x10 ], %g1 _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 40013918: 90 10 00 1d mov %i5, %o0 Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 4001391c: c2 22 60 54 st %g1, [ %o1 + 0x54 ] _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 40013920: 40 00 12 e7 call 400184bc <_Watchdog_Insert> 40013924: 92 02 60 48 add %o1, 0x48, %o1 40013928: c2 04 a3 c0 ld [ %l2 + 0x3c0 ], %g1 _Timer_Server_reset_seconds_timer(); 4001392c: 80 a0 40 16 cmp %g1, %l6 40013930: 02 80 00 06 be 40013948 <_Timer_Server_body+0xc0> 40013934: 92 10 00 11 mov %l1, %o1 Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 40013938: c2 00 60 10 ld [ %g1 + 0x10 ], %g1 <== NOT EXECUTED 4001393c: c2 24 60 0c st %g1, [ %l1 + 0xc ] <== NOT EXECUTED _Watchdog_Insert( &_Watchdog_Seconds_chain, the_watchdog ); 40013940: 40 00 12 df call 400184bc <_Watchdog_Insert> <== NOT EXECUTED 40013944: 90 10 00 15 mov %l5, %o0 <== NOT EXECUTED _Thread_Enable_dispatch(); 40013948: 7f ff ff c3 call 40013854 <_Thread_Enable_dispatch> 4001394c: 01 00 00 00 nop * At this point, at least one of the timers this task relies * upon has fired. Stop them both while we process any outstanding * timers. Before we block, we will restart them. */ _Timer_Server_stop_ticks_timer(); 40013950: d0 04 23 38 ld [ %l0 + 0x338 ], %o0 40013954: 40 00 13 32 call 4001861c <_Watchdog_Remove> 40013958: 90 02 20 48 add %o0, 0x48, %o0 _Timer_Server_stop_seconds_timer(); 4001395c: 40 00 13 30 call 4001861c <_Watchdog_Remove> 40013960: 90 10 00 11 mov %l1, %o0 40013964: c2 05 20 b0 ld [ %l4 + 0xb0 ], %g1 40013968: 82 00 60 01 inc %g1 4001396c: c2 25 20 b0 st %g1, [ %l4 + 0xb0 ] * This ensures that the primary difference is that _ISR_Nest_level * is 0 for task-based timers and non-zero for the others. */ _Thread_Disable_dispatch(); _Timer_Server_process_ticks_chain(); 40013970: 7f ff ff a7 call 4001380c <_Timer_Server_process_ticks_chain> 40013974: 01 00 00 00 nop _Timer_Server_process_seconds_chain(); 40013978: 7f ff ff 8d call 400137ac <_Timer_Server_process_seconds_chain> 4001397c: 01 00 00 00 nop /* * Block until there is something to do. */ _Thread_Set_state( _Timer_Server, STATES_DELAYING ); 40013980: 10 bf ff de b 400138f8 <_Timer_Server_body+0x70> 40013984: d0 04 23 38 ld [ %l0 + 0x338 ], %o0 4001380c <_Timer_Server_process_ticks_chain>: void _Timer_Server_process_ticks_chain(void) { Watchdog_Interval snapshot; Watchdog_Interval ticks; snapshot = _Watchdog_Ticks_since_boot; 4001380c: 03 10 00 d2 sethi %hi(0x40034800), %g1 40013810: c4 00 62 34 ld [ %g1 + 0x234 ], %g2 ! 40034a34 <_Watchdog_Ticks_since_boot> if ( snapshot >= _Timer_Server_ticks_last_time ) 40013814: 03 10 00 d1 sethi %hi(0x40034400), %g1 40013818: c2 00 63 bc ld [ %g1 + 0x3bc ], %g1 ! 400347bc <_Timer_Server_ticks_last_time> 4001381c: 80 a0 80 01 cmp %g2, %g1 40013820: 1a 80 00 04 bcc 40013830 <_Timer_Server_process_ticks_chain+0x24> 40013824: 94 20 80 01 sub %g2, %g1, %o2 ticks = snapshot - _Timer_Server_ticks_last_time; else ticks = (0xFFFFFFFF - _Timer_Server_ticks_last_time) + snapshot; 40013828: 82 38 00 01 xnor %g0, %g1, %g1 <== NOT EXECUTED 4001382c: 94 00 40 02 add %g1, %g2, %o2 <== NOT EXECUTED _Timer_Server_ticks_last_time = snapshot; 40013830: 03 10 00 d1 sethi %hi(0x40034400), %g1 _Watchdog_Adjust( &_Timer_Ticks_chain, WATCHDOG_FORWARD, ticks ); 40013834: 11 10 00 d1 sethi %hi(0x40034400), %o0 if ( snapshot >= _Timer_Server_ticks_last_time ) ticks = snapshot - _Timer_Server_ticks_last_time; else ticks = (0xFFFFFFFF - _Timer_Server_ticks_last_time) + snapshot; _Timer_Server_ticks_last_time = snapshot; 40013838: c4 20 63 bc st %g2, [ %g1 + 0x3bc ] _Watchdog_Adjust( &_Timer_Ticks_chain, WATCHDOG_FORWARD, ticks ); 4001383c: 90 12 23 ac or %o0, 0x3ac, %o0 40013840: 92 10 20 00 clr %o1 40013844: 82 13 c0 00 mov %o7, %g1 40013848: 40 00 12 f5 call 4001841c <_Watchdog_Adjust> 4001384c: 9e 10 40 00 mov %g1, %o7 40013850: 01 00 00 00 nop 4000c7e4 <_Timespec_Divide>: const struct timespec *lhs, const struct timespec *rhs, uint32_t *ival_percentage, uint32_t *fval_percentage ) { 4000c7e4: 9d e3 bf 98 save %sp, -104, %sp * For math simplicity just convert the timespec to nanoseconds * in a 64-bit integer. */ left = lhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND; left += lhs->tv_nsec; right = rhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND; 4000c7e8: c2 06 40 00 ld [ %i1 ], %g1 /* * For math simplicity just convert the timespec to nanoseconds * in a 64-bit integer. */ left = lhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND; left += lhs->tv_nsec; 4000c7ec: de 06 20 04 ld [ %i0 + 4 ], %o7 right = rhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND; 4000c7f0: 96 10 00 01 mov %g1, %o3 4000c7f4: 95 38 60 1f sra %g1, 0x1f, %o2 4000c7f8: 83 30 60 1d srl %g1, 0x1d, %g1 4000c7fc: 9b 2a e0 03 sll %o3, 3, %o5 4000c800: 99 2a a0 03 sll %o2, 3, %o4 4000c804: 98 10 40 0c or %g1, %o4, %o4 4000c808: 83 33 60 1b srl %o5, 0x1b, %g1 4000c80c: 85 2b 20 05 sll %o4, 5, %g2 4000c810: 87 2b 60 05 sll %o5, 5, %g3 4000c814: 84 10 40 02 or %g1, %g2, %g2 4000c818: 86 a0 c0 0d subcc %g3, %o5, %g3 4000c81c: 83 30 e0 1a srl %g3, 0x1a, %g1 4000c820: 84 60 80 0c subx %g2, %o4, %g2 4000c824: 9b 28 e0 06 sll %g3, 6, %o5 4000c828: 99 28 a0 06 sll %g2, 6, %o4 4000c82c: 9a a3 40 03 subcc %o5, %g3, %o5 4000c830: 98 10 40 0c or %g1, %o4, %o4 4000c834: 98 63 00 02 subx %o4, %g2, %o4 4000c838: 9a 83 40 0b addcc %o5, %o3, %o5 4000c83c: 83 33 60 1e srl %o5, 0x1e, %g1 4000c840: 98 43 00 0a addx %o4, %o2, %o4 4000c844: 87 2b 60 02 sll %o5, 2, %g3 4000c848: 85 2b 20 02 sll %o4, 2, %g2 4000c84c: 9a 83 40 03 addcc %o5, %g3, %o5 4000c850: 84 10 40 02 or %g1, %g2, %g2 4000c854: 83 33 60 1e srl %o5, 0x1e, %g1 4000c858: 98 43 00 02 addx %o4, %g2, %o4 4000c85c: 87 2b 60 02 sll %o5, 2, %g3 4000c860: 85 2b 20 02 sll %o4, 2, %g2 4000c864: 9a 83 40 03 addcc %o5, %g3, %o5 4000c868: 84 10 40 02 or %g1, %g2, %g2 4000c86c: 83 33 60 1e srl %o5, 0x1e, %g1 4000c870: 98 43 00 02 addx %o4, %g2, %o4 4000c874: 85 2b 20 02 sll %o4, 2, %g2 4000c878: 84 10 40 02 or %g1, %g2, %g2 right += rhs->tv_nsec; 4000c87c: c2 06 60 04 ld [ %i1 + 4 ], %g1 * For math simplicity just convert the timespec to nanoseconds * in a 64-bit integer. */ left = lhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND; left += lhs->tv_nsec; right = rhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND; 4000c880: 87 2b 60 02 sll %o5, 2, %g3 4000c884: 9a 83 40 03 addcc %o5, %g3, %o5 right += rhs->tv_nsec; 4000c888: 95 38 60 1f sra %g1, 0x1f, %o2 * For math simplicity just convert the timespec to nanoseconds * in a 64-bit integer. */ left = lhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND; left += lhs->tv_nsec; right = rhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND; 4000c88c: 98 43 00 02 addx %o4, %g2, %o4 4000c890: 89 33 60 17 srl %o5, 0x17, %g4 4000c894: 85 2b 20 09 sll %o4, 9, %g2 4000c898: 87 2b 60 09 sll %o5, 9, %g3 4000c89c: 84 11 00 02 or %g4, %g2, %g2 right += rhs->tv_nsec; 4000c8a0: 96 80 c0 01 addcc %g3, %g1, %o3 4000c8a4: 94 40 80 0a addx %g2, %o2, %o2 if ( right == 0 ) { 4000c8a8: 80 92 80 0b orcc %o2, %o3, %g0 4000c8ac: 12 80 00 06 bne 4000c8c4 <_Timespec_Divide+0xe0> 4000c8b0: f0 06 00 00 ld [ %i0 ], %i0 *ival_percentage = 0; 4000c8b4: c0 26 80 00 clr [ %i2 ] <== NOT EXECUTED *fval_percentage = 0; 4000c8b8: c0 26 c0 00 clr [ %i3 ] <== NOT EXECUTED 4000c8bc: 81 c7 e0 08 ret <== NOT EXECUTED 4000c8c0: 81 e8 00 00 restore <== NOT EXECUTED /* * For math simplicity just convert the timespec to nanoseconds * in a 64-bit integer. */ left = lhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND; 4000c8c4: 83 36 20 1d srl %i0, 0x1d, %g1 4000c8c8: 9b 2e 20 03 sll %i0, 3, %o5 4000c8cc: 91 3e 20 1f sra %i0, 0x1f, %o0 4000c8d0: 99 2a 20 03 sll %o0, 3, %o4 4000c8d4: 98 10 40 0c or %g1, %o4, %o4 4000c8d8: 83 33 60 1b srl %o5, 0x1b, %g1 4000c8dc: 85 2b 20 05 sll %o4, 5, %g2 4000c8e0: 87 2b 60 05 sll %o5, 5, %g3 4000c8e4: 84 10 40 02 or %g1, %g2, %g2 4000c8e8: 86 a0 c0 0d subcc %g3, %o5, %g3 4000c8ec: 83 30 e0 1a srl %g3, 0x1a, %g1 4000c8f0: 84 60 80 0c subx %g2, %o4, %g2 4000c8f4: 9b 28 e0 06 sll %g3, 6, %o5 4000c8f8: 99 28 a0 06 sll %g2, 6, %o4 4000c8fc: 9a a3 40 03 subcc %o5, %g3, %o5 4000c900: 98 10 40 0c or %g1, %o4, %o4 4000c904: 98 63 00 02 subx %o4, %g2, %o4 4000c908: 9a 83 40 18 addcc %o5, %i0, %o5 4000c90c: 83 33 60 1e srl %o5, 0x1e, %g1 4000c910: 98 43 00 08 addx %o4, %o0, %o4 4000c914: 87 2b 60 02 sll %o5, 2, %g3 4000c918: 85 2b 20 02 sll %o4, 2, %g2 4000c91c: 9a 83 40 03 addcc %o5, %g3, %o5 4000c920: 84 10 40 02 or %g1, %g2, %g2 4000c924: 83 33 60 1e srl %o5, 0x1e, %g1 4000c928: 98 43 00 02 addx %o4, %g2, %o4 4000c92c: 87 2b 60 02 sll %o5, 2, %g3 4000c930: 85 2b 20 02 sll %o4, 2, %g2 4000c934: 9a 83 40 03 addcc %o5, %g3, %o5 4000c938: 84 10 40 02 or %g1, %g2, %g2 4000c93c: 83 33 60 1e srl %o5, 0x1e, %g1 4000c940: 98 43 00 02 addx %o4, %g2, %o4 4000c944: 87 2b 60 02 sll %o5, 2, %g3 4000c948: 85 2b 20 02 sll %o4, 2, %g2 4000c94c: 9a 83 40 03 addcc %o5, %g3, %o5 4000c950: 84 10 40 02 or %g1, %g2, %g2 4000c954: 83 33 60 17 srl %o5, 0x17, %g1 4000c958: 98 43 00 02 addx %o4, %g2, %o4 4000c95c: 93 2b 60 09 sll %o5, 9, %o1 4000c960: 91 2b 20 09 sll %o4, 9, %o0 * Put it back in the timespec result. * * TODO: Rounding on the last digit of the fval. */ answer = (left * 100000) / right; 4000c964: 92 82 40 0f addcc %o1, %o7, %o1 /* * For math simplicity just convert the timespec to nanoseconds * in a 64-bit integer. */ left = lhs->tv_sec * (uint64_t)TOD_NANOSECONDS_PER_SECOND; 4000c968: 90 10 40 08 or %g1, %o0, %o0 * Put it back in the timespec result. * * TODO: Rounding on the last digit of the fval. */ answer = (left * 100000) / right; 4000c96c: 83 32 60 1e srl %o1, 0x1e, %g1 4000c970: a1 3b e0 1f sra %o7, 0x1f, %l0 4000c974: 87 2a 60 02 sll %o1, 2, %g3 4000c978: 90 42 00 10 addx %o0, %l0, %o0 4000c97c: 85 2a 20 02 sll %o0, 2, %g2 4000c980: 84 10 40 02 or %g1, %g2, %g2 4000c984: 83 30 e0 1b srl %g3, 0x1b, %g1 4000c988: 99 28 a0 05 sll %g2, 5, %o4 4000c98c: 9b 28 e0 05 sll %g3, 5, %o5 4000c990: 98 10 40 0c or %g1, %o4, %o4 4000c994: 9a a3 40 03 subcc %o5, %g3, %o5 4000c998: 98 63 00 02 subx %o4, %g2, %o4 4000c99c: 9a 83 40 09 addcc %o5, %o1, %o5 4000c9a0: 83 33 60 1e srl %o5, 0x1e, %g1 4000c9a4: 98 43 00 08 addx %o4, %o0, %o4 4000c9a8: 87 2b 60 02 sll %o5, 2, %g3 4000c9ac: 85 2b 20 02 sll %o4, 2, %g2 4000c9b0: 9a 83 40 03 addcc %o5, %g3, %o5 4000c9b4: 84 10 40 02 or %g1, %g2, %g2 4000c9b8: 83 33 60 1e srl %o5, 0x1e, %g1 4000c9bc: 87 2b 60 02 sll %o5, 2, %g3 4000c9c0: 98 43 00 02 addx %o4, %g2, %o4 4000c9c4: 9a 83 40 03 addcc %o5, %g3, %o5 4000c9c8: 85 2b 20 02 sll %o4, 2, %g2 4000c9cc: 84 10 40 02 or %g1, %g2, %g2 4000c9d0: 83 33 60 1b srl %o5, 0x1b, %g1 4000c9d4: 98 43 00 02 addx %o4, %g2, %o4 4000c9d8: 93 2b 60 05 sll %o5, 5, %o1 4000c9dc: 91 2b 20 05 sll %o4, 5, %o0 4000c9e0: 40 00 35 10 call 40019e20 <__udivdi3> 4000c9e4: 90 10 40 08 or %g1, %o0, %o0 *ival_percentage = answer / 1000; 4000c9e8: 94 10 20 00 clr %o2 * Put it back in the timespec result. * * TODO: Rounding on the last digit of the fval. */ answer = (left * 100000) / right; 4000c9ec: a0 10 00 08 mov %o0, %l0 4000c9f0: a2 10 00 09 mov %o1, %l1 *ival_percentage = answer / 1000; 4000c9f4: 96 10 23 e8 mov 0x3e8, %o3 4000c9f8: 40 00 35 0a call 40019e20 <__udivdi3> 4000c9fc: 90 10 00 10 mov %l0, %o0 *fval_percentage = answer % 1000; 4000ca00: 90 10 00 10 mov %l0, %o0 * TODO: Rounding on the last digit of the fval. */ answer = (left * 100000) / right; *ival_percentage = answer / 1000; 4000ca04: d2 26 80 00 st %o1, [ %i2 ] *fval_percentage = answer % 1000; 4000ca08: 94 10 20 00 clr %o2 4000ca0c: 92 10 00 11 mov %l1, %o1 4000ca10: 40 00 35 e3 call 4001a19c <__umoddi3> 4000ca14: 96 10 23 e8 mov 0x3e8, %o3 4000ca18: d2 26 c0 00 st %o1, [ %i3 ] 4000ca1c: 81 c7 e0 08 ret 4000ca20: 81 e8 00 00 restore 4000aba8 <_User_extensions_Fatal>: void _User_extensions_Fatal ( Internal_errors_Source the_source, boolean is_internal, uint32_t the_error ) { 4000aba8: 9d e3 bf 98 save %sp, -104, %sp Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _User_extensions_List.last ; 4000abac: 03 10 00 6c sethi %hi(0x4001b000), %g1 4000abb0: 82 10 60 54 or %g1, 0x54, %g1 ! 4001b054 <_User_extensions_List> 4000abb4: e0 00 60 08 ld [ %g1 + 8 ], %l0 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Head( Chain_Control *the_chain ) { return (Chain_Node *) the_chain; 4000abb8: 10 80 00 09 b 4000abdc <_User_extensions_Fatal+0x34> 4000abbc: a2 10 00 01 mov %g1, %l1 !_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 ) 4000abc0: 80 a0 60 00 cmp %g1, 0 4000abc4: 02 80 00 05 be 4000abd8 <_User_extensions_Fatal+0x30> 4000abc8: 90 10 00 18 mov %i0, %o0 (*the_extension->Callouts.fatal)( the_source, is_internal, the_error ); 4000abcc: 92 10 00 19 mov %i1, %o1 <== NOT EXECUTED 4000abd0: 9f c0 40 00 call %g1 <== NOT EXECUTED 4000abd4: 94 10 00 1a mov %i2, %o2 <== NOT EXECUTED Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _User_extensions_List.last ; !_Chain_Is_head( &_User_extensions_List, the_node ) ; the_node = the_node->previous ) { 4000abd8: e0 04 20 04 ld [ %l0 + 4 ], %l0 { Chain_Node *the_node; User_extensions_Control *the_extension; for ( the_node = _User_extensions_List.last ; !_Chain_Is_head( &_User_extensions_List, the_node ) ; 4000abdc: 80 a4 00 11 cmp %l0, %l1 4000abe0: 32 bf ff f8 bne,a 4000abc0 <_User_extensions_Fatal+0x18> 4000abe4: c2 04 20 30 ld [ %l0 + 0x30 ], %g1 the_extension = (User_extensions_Control *) the_node; if ( the_extension->Callouts.fatal != NULL ) (*the_extension->Callouts.fatal)( the_source, is_internal, the_error ); } } 4000abe8: 81 c7 e0 08 ret 4000abec: 81 e8 00 00 restore 4000f464 <_User_extensions_Remove_set>: */ void _User_extensions_Remove_set ( User_extensions_Control *the_extension ) { 4000f464: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED _Chain_Extract( &the_extension->Node ); 4000f468: 40 00 13 1d call 400140dc <_Chain_Extract> <== NOT EXECUTED 4000f46c: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED /* * If a switch handler is present, remove it. */ if ( the_extension->Callouts.thread_switch != NULL ) 4000f470: c2 06 20 24 ld [ %i0 + 0x24 ], %g1 <== NOT EXECUTED 4000f474: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000f478: 02 80 00 04 be 4000f488 <_User_extensions_Remove_set+0x24> <== NOT EXECUTED 4000f47c: 01 00 00 00 nop <== NOT EXECUTED _Chain_Extract( &the_extension->Switch.Node ); 4000f480: 40 00 13 17 call 400140dc <_Chain_Extract> <== NOT EXECUTED 4000f484: 91 ee 20 08 restore %i0, 8, %o0 <== NOT EXECUTED 4000f488: 81 c7 e0 08 ret <== NOT EXECUTED 4000f48c: 81 e8 00 00 restore <== NOT EXECUTED 4000ac34 <_User_extensions_Thread_create>: */ boolean _User_extensions_Thread_create ( Thread_Control *the_thread ) { 4000ac34: 9d e3 bf 98 save %sp, -104, %sp Chain_Node *the_node; User_extensions_Control *the_extension; boolean status; for ( the_node = _User_extensions_List.first ; 4000ac38: 03 10 00 6c sethi %hi(0x4001b000), %g1 4000ac3c: e0 00 60 54 ld [ %g1 + 0x54 ], %l0 ! 4001b054 <_User_extensions_List> 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)( 4000ac40: 23 10 00 6b sethi %hi(0x4001ac00), %l1 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 4000ac44: 03 10 00 6c sethi %hi(0x4001b000), %g1 4000ac48: 10 80 00 0d b 4000ac7c <_User_extensions_Thread_create+0x48> 4000ac4c: a4 10 60 58 or %g1, 0x58, %l2 ! 4001b058 <_User_extensions_List+0x4> !_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 ) { 4000ac50: 80 a0 60 00 cmp %g1, 0 4000ac54: 02 80 00 09 be 4000ac78 <_User_extensions_Thread_create+0x44> 4000ac58: 92 10 00 18 mov %i0, %o1 status = (*the_extension->Callouts.thread_create)( 4000ac5c: 9f c0 40 00 call %g1 4000ac60: d0 04 62 ac ld [ %l1 + 0x2ac ], %o0 _Thread_Executing, the_thread ); if ( !status ) 4000ac64: 80 a2 20 00 cmp %o0, 0 4000ac68: 32 80 00 05 bne,a 4000ac7c <_User_extensions_Thread_create+0x48> 4000ac6c: e0 04 00 00 ld [ %l0 ], %l0 4000ac70: 81 c7 e0 08 ret <== NOT EXECUTED 4000ac74: 91 e8 20 00 restore %g0, 0, %o0 <== NOT EXECUTED User_extensions_Control *the_extension; boolean status; for ( the_node = _User_extensions_List.first ; !_Chain_Is_tail( &_User_extensions_List, the_node ) ; the_node = the_node->next ) { 4000ac78: e0 04 00 00 ld [ %l0 ], %l0 Chain_Node *the_node; User_extensions_Control *the_extension; boolean status; for ( the_node = _User_extensions_List.first ; !_Chain_Is_tail( &_User_extensions_List, the_node ) ; 4000ac7c: 80 a4 00 12 cmp %l0, %l2 4000ac80: 32 bf ff f4 bne,a 4000ac50 <_User_extensions_Thread_create+0x1c> 4000ac84: c2 04 20 14 ld [ %l0 + 0x14 ], %g1 return FALSE; } } return TRUE; } 4000ac88: 81 c7 e0 08 ret 4000ac8c: 91 e8 20 01 restore %g0, 1, %o0 4000ad60 <_Watchdog_Insert>: void _Watchdog_Insert( Chain_Control *header, Watchdog_Control *the_watchdog ) { 4000ad60: 9d e3 bf 98 save %sp, -104, %sp Watchdog_Control *after; uint32_t insert_isr_nest_level; Watchdog_Interval delta_interval; insert_isr_nest_level = _ISR_Nest_level; 4000ad64: 03 10 00 6b sethi %hi(0x4001ac00), %g1 void _Watchdog_Insert( Chain_Control *header, Watchdog_Control *the_watchdog ) { 4000ad68: aa 10 00 18 mov %i0, %l5 Watchdog_Control *after; uint32_t insert_isr_nest_level; Watchdog_Interval delta_interval; insert_isr_nest_level = _ISR_Nest_level; 4000ad6c: e6 00 62 94 ld [ %g1 + 0x294 ], %l3 _ISR_Disable( level ); 4000ad70: 7f ff dc 57 call 40001ecc 4000ad74: 01 00 00 00 nop 4000ad78: b0 10 00 08 mov %o0, %i0 /* * 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 ) { 4000ad7c: c2 06 60 08 ld [ %i1 + 8 ], %g1 4000ad80: 80 a0 60 00 cmp %g1, 0 4000ad84: 02 80 00 03 be 4000ad90 <_Watchdog_Insert+0x30> 4000ad88: 03 10 00 6b sethi %hi(0x4001ac00), %g1 _ISR_Enable( level ); 4000ad8c: 30 80 00 37 b,a 4000ae68 <_Watchdog_Insert+0x108> <== NOT EXECUTED return; } the_watchdog->state = WATCHDOG_BEING_INSERTED; _Watchdog_Sync_count++; 4000ad90: c4 00 63 50 ld [ %g1 + 0x350 ], %g2 ! 4001af50 <_Watchdog_Sync_count> if ( the_watchdog->state != WATCHDOG_INACTIVE ) { _ISR_Enable( level ); return; } the_watchdog->state = WATCHDOG_BEING_INSERTED; 4000ad94: 86 10 20 01 mov 1, %g3 _Watchdog_Sync_count++; 4000ad98: 84 00 a0 01 inc %g2 if ( the_watchdog->state != WATCHDOG_INACTIVE ) { _ISR_Enable( level ); return; } the_watchdog->state = WATCHDOG_BEING_INSERTED; 4000ad9c: c6 26 60 08 st %g3, [ %i1 + 8 ] _Watchdog_Sync_count++; 4000ada0: c4 20 63 50 st %g2, [ %g1 + 0x350 ] if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) { goto exit_insert; } if ( _Watchdog_Sync_level > insert_isr_nest_level ) { 4000ada4: 29 10 00 6b sethi %hi(0x4001ac00), %l4 the_watchdog->state = WATCHDOG_BEING_INSERTED; _Watchdog_Sync_count++; restart: delta_interval = the_watchdog->initial; 4000ada8: e4 06 60 0c ld [ %i1 + 0xc ], %l2 * cache *header!! * * Till Straumann, 7/2003 (gcc-3.2.2 -O4 on powerpc) * */ for ( after = (Watchdog_Control *) ((volatile Chain_Control *)header)->first ; 4000adac: e2 05 40 00 ld [ %l5 ], %l1 ; after = _Watchdog_Next( after ) ) { if ( delta_interval == 0 || !_Watchdog_Next( after ) ) 4000adb0: 80 a4 a0 00 cmp %l2, 0 4000adb4: 22 80 00 1c be,a 4000ae24 <_Watchdog_Insert+0xc4> 4000adb8: c4 04 60 04 ld [ %l1 + 4 ], %g2 RTEMS_INLINE_ROUTINE Watchdog_Control *_Watchdog_Next( Watchdog_Control *the_watchdog ) { return ( (Watchdog_Control *) the_watchdog->Node.next ); 4000adbc: c2 04 40 00 ld [ %l1 ], %g1 4000adc0: 80 a0 60 00 cmp %g1, 0 4000adc4: 22 80 00 18 be,a 4000ae24 <_Watchdog_Insert+0xc4> 4000adc8: c4 04 60 04 ld [ %l1 + 4 ], %g2 break; if ( delta_interval < after->delta_interval ) { 4000adcc: e0 04 60 10 ld [ %l1 + 0x10 ], %l0 4000add0: 80 a4 80 10 cmp %l2, %l0 4000add4: 1a 80 00 04 bcc 4000ade4 <_Watchdog_Insert+0x84> 4000add8: 82 24 00 12 sub %l0, %l2, %g1 after->delta_interval -= delta_interval; 4000addc: 10 80 00 11 b 4000ae20 <_Watchdog_Insert+0xc0> 4000ade0: c2 24 60 10 st %g1, [ %l1 + 0x10 ] * used around this flash point allowed interrupts to execute * which violated the design assumptions. The critical section * mechanism used here WAS redesigned to address this. */ _ISR_Flash( level ); 4000ade4: 7f ff dc 3e call 40001edc 4000ade8: 90 10 00 18 mov %i0, %o0 4000adec: 7f ff dc 38 call 40001ecc 4000adf0: 01 00 00 00 nop if ( the_watchdog->state != WATCHDOG_BEING_INSERTED ) { 4000adf4: c2 06 60 08 ld [ %i1 + 8 ], %g1 4000adf8: 80 a0 60 01 cmp %g1, 1 4000adfc: 12 80 00 15 bne 4000ae50 <_Watchdog_Insert+0xf0> 4000ae00: a4 24 80 10 sub %l2, %l0, %l2 goto exit_insert; } if ( _Watchdog_Sync_level > insert_isr_nest_level ) { 4000ae04: c2 05 22 a8 ld [ %l4 + 0x2a8 ], %g1 4000ae08: 80 a0 40 13 cmp %g1, %l3 4000ae0c: 28 bf ff e9 bleu,a 4000adb0 <_Watchdog_Insert+0x50> 4000ae10: e2 04 40 00 ld [ %l1 ], %l1 _Watchdog_Sync_level = insert_isr_nest_level; 4000ae14: e6 25 22 a8 st %l3, [ %l4 + 0x2a8 ] the_watchdog->state = WATCHDOG_BEING_INSERTED; _Watchdog_Sync_count++; restart: delta_interval = the_watchdog->initial; 4000ae18: 10 bf ff e5 b 4000adac <_Watchdog_Insert+0x4c> 4000ae1c: e4 06 60 0c ld [ %i1 + 0xc ], %l2 _Watchdog_Activate( the_watchdog ); the_watchdog->delta_interval = delta_interval; _Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node ); 4000ae20: c4 04 60 04 ld [ %l1 + 4 ], %g2 the_watchdog->start_time = _Watchdog_Ticks_since_boot; 4000ae24: 03 10 00 6b sethi %hi(0x4001ac00), %g1 ) { Chain_Node *before_node; the_node->previous = after_node; before_node = after_node->next; 4000ae28: c6 00 80 00 ld [ %g2 ], %g3 4000ae2c: c2 00 63 54 ld [ %g1 + 0x354 ], %g1 after_node->next = the_node; 4000ae30: f2 20 80 00 st %i1, [ %g2 ] Chain_Node *the_node ) { Chain_Node *before_node; the_node->previous = after_node; 4000ae34: c4 26 60 04 st %g2, [ %i1 + 4 ] 4000ae38: c2 26 60 14 st %g1, [ %i1 + 0x14 ] } } _Watchdog_Activate( the_watchdog ); the_watchdog->delta_interval = delta_interval; 4000ae3c: e4 26 60 10 st %l2, [ %i1 + 0x10 ] RTEMS_INLINE_ROUTINE void _Watchdog_Activate( Watchdog_Control *the_watchdog ) { the_watchdog->state = WATCHDOG_ACTIVE; 4000ae40: 82 10 20 02 mov 2, %g1 before_node = after_node->next; after_node->next = the_node; the_node->next = before_node; before_node->previous = the_node; 4000ae44: f2 20 e0 04 st %i1, [ %g3 + 4 ] Chain_Node *before_node; the_node->previous = after_node; before_node = after_node->next; after_node->next = the_node; the_node->next = before_node; 4000ae48: c6 26 40 00 st %g3, [ %i1 ] 4000ae4c: c2 26 60 08 st %g1, [ %i1 + 8 ] _Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node ); the_watchdog->start_time = _Watchdog_Ticks_since_boot; exit_insert: _Watchdog_Sync_level = insert_isr_nest_level; 4000ae50: 03 10 00 6b sethi %hi(0x4001ac00), %g1 _Watchdog_Sync_count--; 4000ae54: 05 10 00 6b sethi %hi(0x4001ac00), %g2 _Chain_Insert_unprotected( after->Node.previous, &the_watchdog->Node ); the_watchdog->start_time = _Watchdog_Ticks_since_boot; exit_insert: _Watchdog_Sync_level = insert_isr_nest_level; 4000ae58: e6 20 62 a8 st %l3, [ %g1 + 0x2a8 ] _Watchdog_Sync_count--; 4000ae5c: c2 00 a3 50 ld [ %g2 + 0x350 ], %g1 4000ae60: 82 00 7f ff add %g1, -1, %g1 4000ae64: c2 20 a3 50 st %g1, [ %g2 + 0x350 ] _ISR_Enable( level ); 4000ae68: 7f ff dc 1d call 40001edc 4000ae6c: 81 e8 00 00 restore 4000ae70: 01 00 00 00 nop 4000bda0 <_Watchdog_Insert_ticks_helper>: Watchdog_Interval ticks, Objects_Id id, Watchdog_Service_routine_entry TSR, void *arg ) { 4000bda0: 9d e3 bf 98 save %sp, -104, %sp ISR_Level level; (void) _Watchdog_Remove( timer ); 4000bda4: 40 00 16 f3 call 40011970 <_Watchdog_Remove> 4000bda8: 90 10 00 18 mov %i0, %o0 _ISR_Disable( level ); 4000bdac: 7f ff ea 92 call 400067f4 4000bdb0: 01 00 00 00 nop 4000bdb4: a0 10 00 08 mov %o0, %l0 /* * Check to see if the watchdog has just been inserted by a * higher priority interrupt. If so, abandon this insert. */ if ( timer->state != WATCHDOG_INACTIVE ) { 4000bdb8: c2 06 20 08 ld [ %i0 + 8 ], %g1 4000bdbc: 80 a0 60 00 cmp %g1, 0 4000bdc0: 22 80 00 06 be,a 4000bdd8 <_Watchdog_Insert_ticks_helper+0x38> 4000bdc4: f6 26 20 1c st %i3, [ %i0 + 0x1c ] _ISR_Enable( level ); 4000bdc8: 7f ff ea 8f call 40006804 <== NOT EXECUTED 4000bdcc: b0 10 20 00 clr %i0 <== NOT EXECUTED 4000bdd0: 81 c7 e0 08 ret <== NOT EXECUTED 4000bdd4: 81 e8 00 00 restore <== NOT EXECUTED void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; the_watchdog->id = id; 4000bdd8: f4 26 20 20 st %i2, [ %i0 + 0x20 ] the_watchdog->user_data = user_data; 4000bddc: f8 26 20 24 st %i4, [ %i0 + 0x24 ] Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 4000bde0: f2 26 20 0c st %i1, [ %i0 + 0xc ] Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 4000bde4: c0 26 20 08 clr [ %i0 + 8 ] ) { the_watchdog->initial = units; _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 4000bde8: 92 10 00 18 mov %i0, %o1 4000bdec: 11 10 00 97 sethi %hi(0x40025c00), %o0 4000bdf0: 40 00 16 88 call 40011810 <_Watchdog_Insert> 4000bdf4: 90 12 21 3c or %o0, 0x13c, %o0 ! 40025d3c <_Watchdog_Ticks_chain> * OK. Now we now the timer was not rescheduled by an interrupt * so we can atomically initialize it as in use. */ _Watchdog_Initialize( timer, TSR, id, arg ); _Watchdog_Insert_ticks( timer, ticks ); _ISR_Enable( level ); 4000bdf8: b0 10 20 01 mov 1, %i0 4000bdfc: 7f ff ea 82 call 40006804 4000be00: 90 10 00 10 mov %l0, %o0 return TRUE; } 4000be04: 81 c7 e0 08 ret 4000be08: 81 e8 00 00 restore 4000aec0 <_Watchdog_Remove>: */ Watchdog_States _Watchdog_Remove( Watchdog_Control *the_watchdog ) { 4000aec0: 9d e3 bf 98 save %sp, -104, %sp ISR_Level level; Watchdog_States previous_state; Watchdog_Control *next_watchdog; _ISR_Disable( level ); 4000aec4: 7f ff dc 02 call 40001ecc 4000aec8: 01 00 00 00 nop previous_state = the_watchdog->state; 4000aecc: e0 06 20 08 ld [ %i0 + 8 ], %l0 switch ( previous_state ) { 4000aed0: 80 a4 20 01 cmp %l0, 1 4000aed4: 22 80 00 1e be,a 4000af4c <_Watchdog_Remove+0x8c> 4000aed8: c0 26 20 08 clr [ %i0 + 8 ] <== NOT EXECUTED 4000aedc: 0a 80 00 1d bcs 4000af50 <_Watchdog_Remove+0x90> 4000aee0: 03 10 00 6b sethi %hi(0x4001ac00), %g1 4000aee4: 80 a4 20 03 cmp %l0, 3 4000aee8: 18 80 00 1a bgu 4000af50 <_Watchdog_Remove+0x90> 4000aeec: 01 00 00 00 nop 4000aef0: c6 06 00 00 ld [ %i0 ], %g3 break; case WATCHDOG_ACTIVE: case WATCHDOG_REMOVE_IT: the_watchdog->state = WATCHDOG_INACTIVE; 4000aef4: c0 26 20 08 clr [ %i0 + 8 ] next_watchdog = _Watchdog_Next( the_watchdog ); if ( _Watchdog_Next(next_watchdog) ) 4000aef8: c2 00 c0 00 ld [ %g3 ], %g1 4000aefc: 80 a0 60 00 cmp %g1, 0 4000af00: 02 80 00 07 be 4000af1c <_Watchdog_Remove+0x5c> 4000af04: 03 10 00 6b sethi %hi(0x4001ac00), %g1 next_watchdog->delta_interval += the_watchdog->delta_interval; 4000af08: c2 00 e0 10 ld [ %g3 + 0x10 ], %g1 4000af0c: c4 06 20 10 ld [ %i0 + 0x10 ], %g2 4000af10: 82 00 40 02 add %g1, %g2, %g1 4000af14: c2 20 e0 10 st %g1, [ %g3 + 0x10 ] if ( _Watchdog_Sync_count ) 4000af18: 03 10 00 6b sethi %hi(0x4001ac00), %g1 4000af1c: c2 00 63 50 ld [ %g1 + 0x350 ], %g1 ! 4001af50 <_Watchdog_Sync_count> 4000af20: 80 a0 60 00 cmp %g1, 0 4000af24: 22 80 00 07 be,a 4000af40 <_Watchdog_Remove+0x80> 4000af28: c4 06 00 00 ld [ %i0 ], %g2 _Watchdog_Sync_level = _ISR_Nest_level; 4000af2c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 4000af30: c4 00 62 94 ld [ %g1 + 0x294 ], %g2 ! 4001ae94 <_ISR_Nest_level> <== NOT EXECUTED 4000af34: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 4000af38: c4 20 62 a8 st %g2, [ %g1 + 0x2a8 ] ! 4001aea8 <_Watchdog_Sync_level> <== NOT EXECUTED ) { Chain_Node *next; Chain_Node *previous; next = the_node->next; 4000af3c: c4 06 00 00 ld [ %i0 ], %g2 <== NOT EXECUTED previous = the_node->previous; 4000af40: c2 06 20 04 ld [ %i0 + 4 ], %g1 next->previous = previous; previous->next = next; 4000af44: c4 20 40 00 st %g2, [ %g1 ] Chain_Node *next; Chain_Node *previous; next = the_node->next; previous = the_node->previous; next->previous = previous; 4000af48: c2 20 a0 04 st %g1, [ %g2 + 4 ] _Chain_Extract_unprotected( &the_watchdog->Node ); break; } the_watchdog->stop_time = _Watchdog_Ticks_since_boot; 4000af4c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 4000af50: c2 00 63 54 ld [ %g1 + 0x354 ], %g1 ! 4001af54 <_Watchdog_Ticks_since_boot> 4000af54: c2 26 20 18 st %g1, [ %i0 + 0x18 ] _ISR_Enable( level ); 4000af58: 7f ff db e1 call 40001edc 4000af5c: b0 10 00 10 mov %l0, %i0 return( previous_state ); } 4000af60: 81 c7 e0 08 ret 4000af64: 81 e8 00 00 restore 4000b00c <_Workspace_Allocate_or_fatal_error>: */ void *_Workspace_Allocate_or_fatal_error( size_t size ) { 4000b00c: 9d e3 bf 98 save %sp, -104, %sp RTEMS_INLINE_ROUTINE void *_Workspace_Allocate( size_t size ) { return _Heap_Allocate( &_Workspace_Area, size ); 4000b010: 11 10 00 6b sethi %hi(0x4001ac00), %o0 4000b014: 92 10 00 18 mov %i0, %o1 4000b018: 7f ff f2 e5 call 40007bac <_Heap_Allocate> 4000b01c: 90 12 22 1c or %o0, 0x21c, %o0 void *memory; memory = _Workspace_Allocate( size ); if ( memory == NULL ) 4000b020: b0 92 20 00 orcc %o0, 0, %i0 4000b024: 12 80 00 04 bne 4000b034 <_Workspace_Allocate_or_fatal_error+0x28> 4000b028: 92 10 20 01 mov 1, %o1 _Internal_error_Occurred( 4000b02c: 7f ff f4 0b call 40008058 <_Internal_error_Occurred> <== NOT EXECUTED 4000b030: 94 10 20 04 mov 4, %o2 <== NOT EXECUTED TRUE, INTERNAL_ERROR_WORKSPACE_ALLOCATION ); return memory; } 4000b034: 81 c7 e0 08 ret 4000b038: 81 e8 00 00 restore 4000b03c <_Workspace_Handler_initialization>: void _Workspace_Handler_initialization( void *starting_address, size_t size ) { 4000b03c: 9d e3 bf 98 save %sp, -104, %sp uint32_t *zero_out_array; uint32_t index; uint32_t memory_available; if ( !starting_address || !_Addresses_Is_aligned( starting_address ) ) 4000b040: 80 a6 20 00 cmp %i0, 0 4000b044: 02 80 00 04 be 4000b054 <_Workspace_Handler_initialization+0x18> 4000b048: 80 8e 20 07 btst 7, %i0 4000b04c: 02 80 00 07 be 4000b068 <_Workspace_Handler_initialization+0x2c> 4000b050: 03 10 00 6b sethi %hi(0x4001ac00), %g1 _Internal_error_Occurred( 4000b054: 90 10 20 00 clr %o0 <== NOT EXECUTED 4000b058: 92 10 20 01 mov 1, %o1 <== NOT EXECUTED 4000b05c: 7f ff f3 ff call 40008058 <_Internal_error_Occurred> <== NOT EXECUTED 4000b060: 94 10 20 02 mov 2, %o2 <== NOT EXECUTED INTERNAL_ERROR_CORE, TRUE, INTERNAL_ERROR_INVALID_WORKSPACE_ADDRESS ); if ( _CPU_Table.do_zero_of_workspace ) { 4000b064: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 4000b068: c2 00 61 f4 ld [ %g1 + 0x1f4 ], %g1 ! 4001adf4 <_CPU_Table+0x10> 4000b06c: 84 10 20 00 clr %g2 4000b070: 80 a0 60 00 cmp %g1, 0 4000b074: 12 80 00 06 bne 4000b08c <_Workspace_Handler_initialization+0x50> 4000b078: 87 36 60 02 srl %i1, 2, %g3 index < size / sizeof( uint32_t ) ; index++ ) zero_out_array[ index ] = 0; } memory_available = _Heap_Initialize( 4000b07c: 10 80 00 08 b 4000b09c <_Workspace_Handler_initialization+0x60> 4000b080: 92 10 00 18 mov %i0, %o1 ); if ( _CPU_Table.do_zero_of_workspace ) { for( zero_out_array = (uint32_t *) starting_address, index = 0 ; index < size / sizeof( uint32_t ) ; index++ ) 4000b084: 84 00 a0 01 inc %g2 <== NOT EXECUTED zero_out_array[ index ] = 0; 4000b088: c0 20 40 18 clr [ %g1 + %i0 ] <== NOT EXECUTED INTERNAL_ERROR_INVALID_WORKSPACE_ADDRESS ); if ( _CPU_Table.do_zero_of_workspace ) { for( zero_out_array = (uint32_t *) starting_address, index = 0 ; index < size / sizeof( uint32_t ) ; 4000b08c: 80 a0 80 03 cmp %g2, %g3 <== NOT EXECUTED 4000b090: 0a bf ff fd bcs 4000b084 <_Workspace_Handler_initialization+0x48> <== NOT EXECUTED 4000b094: 83 28 a0 02 sll %g2, 2, %g1 <== NOT EXECUTED index++ ) zero_out_array[ index ] = 0; } memory_available = _Heap_Initialize( 4000b098: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED 4000b09c: 94 10 00 19 mov %i1, %o2 4000b0a0: 11 10 00 6b sethi %hi(0x4001ac00), %o0 4000b0a4: 96 10 20 08 mov 8, %o3 4000b0a8: 7f ff f3 a2 call 40007f30 <_Heap_Initialize> 4000b0ac: 90 12 22 1c or %o0, 0x21c, %o0 starting_address, size, CPU_HEAP_ALIGNMENT ); if ( memory_available == 0 ) 4000b0b0: 80 a2 20 00 cmp %o0, 0 4000b0b4: 12 80 00 05 bne 4000b0c8 <_Workspace_Handler_initialization+0x8c> 4000b0b8: b0 10 20 00 clr %i0 _Internal_error_Occurred( 4000b0bc: b2 10 20 01 mov 1, %i1 <== NOT EXECUTED 4000b0c0: 7f ff f3 e6 call 40008058 <_Internal_error_Occurred> <== NOT EXECUTED 4000b0c4: 95 e8 20 03 restore %g0, 3, %o2 <== NOT EXECUTED 4000b0c8: 81 c7 e0 08 ret 4000b0cc: 81 e8 00 00 restore 40018528 <_exit>: #include #if !defined(RTEMS_UNIX) void _exit(int status) { 40018528: 9d e3 bf 98 save %sp, -104, %sp * We need to do the exit processing on the global reentrancy structure. * This has already been done on the per task reentrancy structure * associated with this task. */ libc_wrapup(); 4001852c: 7f ff ff e4 call 400184bc 40018530: 01 00 00 00 nop rtems_shutdown_executive(status); 40018534: 40 00 00 47 call 40018650 40018538: 90 10 00 18 mov %i0, %o0 4001853c: 30 80 00 00 b,a 4001853c <_exit+0x14> <== NOT EXECUTED 40021534 <_fcntl_r>: int fd, int cmd, int arg ) { return fcntl( fd, cmd, arg ); 40021534: 90 10 00 09 mov %o1, %o0 <== NOT EXECUTED 40021538: 92 10 00 0a mov %o2, %o1 <== NOT EXECUTED 4002153c: 94 10 00 0b mov %o3, %o2 <== NOT EXECUTED 40021540: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 40021544: 7f ff ff 78 call 40021324 <== NOT EXECUTED 40021548: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED 4002154c: 01 00 00 00 nop 40022e0c <_getpid_r>: pid_t _getpid_r( struct _reent *ptr ) { return getpid(); } 40022e0c: 81 c3 e0 08 retl <== NOT EXECUTED 40022e10: 90 10 20 01 mov 1, %o0 <== NOT EXECUTED 4000c654 <_gettimeofday>: int _gettimeofday( struct timeval *tp, struct timezone *tzp ) { return gettimeofday( tp, tzp ); 4000c654: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 4000c658: 7f ff ff e6 call 4000c5f0 <== NOT EXECUTED 4000c65c: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED 4000c660: 01 00 00 00 nop 40023088 <_kill_r>: struct _reent *ptr, pid_t pid, int sig ) { return kill( pid, sig ); 40023088: 90 10 00 09 mov %o1, %o0 <== NOT EXECUTED 4002308c: 92 10 00 0a mov %o2, %o1 <== NOT EXECUTED 40023090: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 40023094: 7f ff ff f8 call 40023074 <== NOT EXECUTED 40023098: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED 4002309c: 01 00 00 00 nop 40004ab8 <_link_r>: struct _reent *ptr, const char *existing, const char *new ) { return link( existing, new ); 40004ab8: 90 10 00 09 mov %o1, %o0 <== NOT EXECUTED 40004abc: 92 10 00 0a mov %o2, %o1 <== NOT EXECUTED 40004ac0: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 40004ac4: 7f ff ff 65 call 40004858 <== NOT EXECUTED 40004ac8: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED 40004acc: 01 00 00 00 nop 4000332c <_realloc_r>: struct _reent *ignored, void *ptr, size_t size ) { return realloc( ptr, size ); 4000332c: 90 10 00 09 mov %o1, %o0 <== NOT EXECUTED 40003330: 92 10 00 0a mov %o2, %o1 <== NOT EXECUTED 40003334: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 40003338: 7f ff ff b8 call 40003218 <== NOT EXECUTED 4000333c: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED 40003340: 01 00 00 00 nop 4000734c <_stat_r>: struct _reent *ptr, const char *path, struct stat *buf ) { return _STAT_NAME( path, buf ); 4000734c: 90 10 00 09 mov %o1, %o0 <== NOT EXECUTED 40007350: 92 10 00 0a mov %o2, %o1 <== NOT EXECUTED 40007354: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 40007358: 7f ff ff c4 call 40007268 <== NOT EXECUTED 4000735c: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED 40007360: 01 00 00 00 nop 40018a58 <_unlink_r>: int _unlink_r( struct _reent *ptr, const char *path ) { return unlink( path ); 40018a58: 90 10 00 09 mov %o1, %o0 <== NOT EXECUTED 40018a5c: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 40018a60: 7f ff ff a2 call 400188e8 <== NOT EXECUTED 40018a64: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED 40018a68: 01 00 00 00 nop 400061cc : int alphasort(d1, d2) const void *d1; const void *d2; { return(strcmp((*(struct dirent **)d1)->d_name, 400061cc: d0 02 00 00 ld [ %o0 ], %o0 <== NOT EXECUTED 400061d0: d2 02 40 00 ld [ %o1 ], %o1 <== NOT EXECUTED 400061d4: 90 02 20 0c add %o0, 0xc, %o0 <== NOT EXECUTED 400061d8: 92 02 60 0c add %o1, 0xc, %o1 <== NOT EXECUTED 400061dc: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 400061e0: 40 00 36 9a call 40013c48 <== NOT EXECUTED 400061e4: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED 400061e8: 01 00 00 00 nop 40016c2c : #include int chdir( const char *pathname ) { 40016c2c: 9d e3 bf 88 save %sp, -120, %sp /* * Get the node where we wish to go. */ result = rtems_filesystem_evaluate_path( 40016c30: 92 10 20 01 mov 1, %o1 40016c34: 90 10 00 18 mov %i0, %o0 40016c38: a0 07 bf e8 add %fp, -24, %l0 40016c3c: 96 10 20 01 mov 1, %o3 40016c40: 94 10 00 10 mov %l0, %o2 40016c44: 7f ff bb b6 call 40005b1c 40016c48: b0 10 3f ff mov -1, %i0 pathname, RTEMS_LIBIO_PERMS_SEARCH, &loc, TRUE ); if ( result != 0 ) 40016c4c: 80 a2 20 00 cmp %o0, 0 40016c50: 12 80 00 37 bne 40016d2c 40016c54: c4 07 bf f0 ld [ %fp + -16 ], %g2 /* * Verify you can change directory into this node. */ if ( !loc.ops->node_type_h ) { 40016c58: c2 00 a0 10 ld [ %g2 + 0x10 ], %g1 40016c5c: 80 a0 60 00 cmp %g1, 0 40016c60: 12 80 00 0c bne 40016c90 40016c64: 01 00 00 00 nop rtems_filesystem_freenode( &loc ); 40016c68: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 <== NOT EXECUTED 40016c6c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40016c70: 02 80 00 04 be 40016c80 <== NOT EXECUTED 40016c74: 01 00 00 00 nop <== NOT EXECUTED 40016c78: 9f c0 40 00 call %g1 <== NOT EXECUTED 40016c7c: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOTSUP ); 40016c80: 40 00 33 43 call 4002398c <__errno> <== NOT EXECUTED 40016c84: 01 00 00 00 nop <== NOT EXECUTED 40016c88: 10 80 00 14 b 40016cd8 <== NOT EXECUTED 40016c8c: 82 10 20 86 mov 0x86, %g1 ! 86 <== NOT EXECUTED } if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) { 40016c90: 9f c0 40 00 call %g1 40016c94: 90 10 00 10 mov %l0, %o0 40016c98: 80 a2 20 01 cmp %o0, 1 40016c9c: 02 80 00 12 be 40016ce4 40016ca0: 03 10 00 e6 sethi %hi(0x40039800), %g1 rtems_filesystem_freenode( &loc ); 40016ca4: c2 07 bf f0 ld [ %fp + -16 ], %g1 40016ca8: 80 a0 60 00 cmp %g1, 0 40016cac: 02 80 00 08 be 40016ccc 40016cb0: 01 00 00 00 nop 40016cb4: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 40016cb8: 80 a0 60 00 cmp %g1, 0 40016cbc: 02 80 00 04 be 40016ccc 40016cc0: 01 00 00 00 nop 40016cc4: 9f c0 40 00 call %g1 40016cc8: 90 10 00 10 mov %l0, %o0 rtems_set_errno_and_return_minus_one( ENOTDIR ); 40016ccc: 40 00 33 30 call 4002398c <__errno> 40016cd0: 01 00 00 00 nop 40016cd4: 82 10 20 14 mov 0x14, %g1 ! 14 40016cd8: c2 22 00 00 st %g1, [ %o0 ] 40016cdc: 81 c7 e0 08 ret 40016ce0: 91 e8 3f ff restore %g0, -1, %o0 } rtems_filesystem_freenode( &rtems_filesystem_current ); 40016ce4: d0 00 62 c0 ld [ %g1 + 0x2c0 ], %o0 40016ce8: c2 02 20 0c ld [ %o0 + 0xc ], %g1 40016cec: 80 a0 60 00 cmp %g1, 0 40016cf0: 22 80 00 09 be,a 40016d14 40016cf4: 03 10 00 e6 sethi %hi(0x40039800), %g1 <== NOT EXECUTED 40016cf8: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 ! 4003981c 40016cfc: 80 a0 60 00 cmp %g1, 0 40016d00: 22 80 00 05 be,a 40016d14 40016d04: 03 10 00 e6 sethi %hi(0x40039800), %g1 <== NOT EXECUTED 40016d08: 9f c0 40 00 call %g1 40016d0c: 90 02 20 04 add %o0, 4, %o0 rtems_filesystem_current = loc; 40016d10: 03 10 00 e6 sethi %hi(0x40039800), %g1 40016d14: d0 00 62 c0 ld [ %g1 + 0x2c0 ], %o0 ! 40039ac0 40016d18: 92 07 bf e8 add %fp, -24, %o1 40016d1c: 90 02 20 04 add %o0, 4, %o0 40016d20: 94 10 20 10 mov 0x10, %o2 40016d24: 40 00 39 ce call 4002545c 40016d28: b0 10 20 00 clr %i0 return 0; } 40016d2c: 81 c7 e0 08 ret 40016d30: 81 e8 00 00 restore 40016d34 : int chmod( const char *path, mode_t mode ) { 40016d34: 9d e3 bf 88 save %sp, -120, %sp int status; rtems_filesystem_location_info_t loc; int result; status = rtems_filesystem_evaluate_path( path, 0, &loc, TRUE ); 40016d38: 92 10 20 00 clr %o1 40016d3c: 90 10 00 18 mov %i0, %o0 40016d40: a0 07 bf e8 add %fp, -24, %l0 40016d44: 96 10 20 01 mov 1, %o3 40016d48: 94 10 00 10 mov %l0, %o2 40016d4c: 7f ff bb 74 call 40005b1c 40016d50: b0 10 3f ff mov -1, %i0 if ( status != 0 ) 40016d54: 80 a2 20 00 cmp %o0, 0 40016d58: 12 80 00 24 bne 40016de8 40016d5c: c2 07 bf ec ld [ %fp + -20 ], %g1 return -1; if ( !loc.handlers ){ 40016d60: 80 a0 60 00 cmp %g1, 0 40016d64: 32 80 00 10 bne,a 40016da4 40016d68: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 rtems_filesystem_freenode( &loc ); 40016d6c: c2 07 bf f0 ld [ %fp + -16 ], %g1 <== NOT EXECUTED 40016d70: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40016d74: 02 80 00 08 be 40016d94 <== NOT EXECUTED 40016d78: 01 00 00 00 nop <== NOT EXECUTED 40016d7c: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 <== NOT EXECUTED 40016d80: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40016d84: 02 80 00 04 be 40016d94 <== NOT EXECUTED 40016d88: 01 00 00 00 nop <== NOT EXECUTED 40016d8c: 9f c0 40 00 call %g1 <== NOT EXECUTED 40016d90: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( EBADF ); 40016d94: 40 00 32 fe call 4002398c <__errno> <== NOT EXECUTED 40016d98: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40016d9c: 10 80 00 12 b 40016de4 <== NOT EXECUTED 40016da0: 82 10 20 09 mov 9, %g1 <== NOT EXECUTED } if ( !loc.handlers->fchmod_h ){ 40016da4: 80 a0 60 00 cmp %g1, 0 40016da8: 12 80 00 12 bne 40016df0 40016dac: 93 2e 60 10 sll %i1, 0x10, %o1 rtems_filesystem_freenode( &loc ); 40016db0: c2 07 bf f0 ld [ %fp + -16 ], %g1 <== NOT EXECUTED 40016db4: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40016db8: 02 80 00 08 be 40016dd8 <== NOT EXECUTED 40016dbc: 01 00 00 00 nop <== NOT EXECUTED 40016dc0: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 <== NOT EXECUTED 40016dc4: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40016dc8: 02 80 00 04 be 40016dd8 <== NOT EXECUTED 40016dcc: 01 00 00 00 nop <== NOT EXECUTED 40016dd0: 9f c0 40 00 call %g1 <== NOT EXECUTED 40016dd4: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOTSUP ); 40016dd8: 40 00 32 ed call 4002398c <__errno> <== NOT EXECUTED 40016ddc: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40016de0: 82 10 20 86 mov 0x86, %g1 <== NOT EXECUTED 40016de4: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 40016de8: 81 c7 e0 08 ret 40016dec: 81 e8 00 00 restore } result = (*loc.handlers->fchmod_h)( &loc, mode ); 40016df0: 90 10 00 10 mov %l0, %o0 40016df4: 9f c0 40 00 call %g1 40016df8: 93 32 60 10 srl %o1, 0x10, %o1 rtems_filesystem_freenode( &loc ); 40016dfc: c2 07 bf f0 ld [ %fp + -16 ], %g1 40016e00: 80 a0 60 00 cmp %g1, 0 40016e04: 02 bf ff f9 be 40016de8 40016e08: b0 10 00 08 mov %o0, %i0 40016e0c: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 40016e10: 80 a0 60 00 cmp %g1, 0 40016e14: 02 80 00 04 be 40016e24 40016e18: 01 00 00 00 nop 40016e1c: 9f c0 40 00 call %g1 40016e20: 90 10 00 10 mov %l0, %o0 return result; } 40016e24: 81 c7 e0 08 ret 40016e28: 81 e8 00 00 restore 40016e2c : int chown( const char *path, uid_t owner, gid_t group ) { 40016e2c: 9d e3 bf 88 save %sp, -120, %sp rtems_filesystem_location_info_t loc; int result; if ( rtems_filesystem_evaluate_path( path, 0x00, &loc, TRUE ) ) 40016e30: 92 10 20 00 clr %o1 40016e34: 90 10 00 18 mov %i0, %o0 40016e38: a0 07 bf e8 add %fp, -24, %l0 40016e3c: 96 10 20 01 mov 1, %o3 40016e40: 94 10 00 10 mov %l0, %o2 40016e44: 7f ff bb 36 call 40005b1c 40016e48: b0 10 3f ff mov -1, %i0 40016e4c: 80 a2 20 00 cmp %o0, 0 40016e50: 12 80 00 10 bne 40016e90 40016e54: c2 07 bf f0 ld [ %fp + -16 ], %g1 return -1; if ( !loc.ops->chown_h ) { 40016e58: c4 00 60 18 ld [ %g1 + 0x18 ], %g2 40016e5c: 80 a0 a0 00 cmp %g2, 0 40016e60: 12 80 00 0e bne 40016e98 40016e64: 93 2e 60 10 sll %i1, 0x10, %o1 rtems_filesystem_freenode( &loc ); 40016e68: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 <== NOT EXECUTED 40016e6c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40016e70: 02 80 00 04 be 40016e80 <== NOT EXECUTED 40016e74: 01 00 00 00 nop <== NOT EXECUTED 40016e78: 9f c0 40 00 call %g1 <== NOT EXECUTED 40016e7c: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOTSUP ); 40016e80: 40 00 32 c3 call 4002398c <__errno> <== NOT EXECUTED 40016e84: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40016e88: 82 10 20 86 mov 0x86, %g1 <== NOT EXECUTED 40016e8c: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 40016e90: 81 c7 e0 08 ret 40016e94: 81 e8 00 00 restore } result = (*loc.ops->chown_h)( &loc, owner, group ); 40016e98: 95 2e a0 10 sll %i2, 0x10, %o2 40016e9c: 93 32 60 10 srl %o1, 0x10, %o1 40016ea0: 95 32 a0 10 srl %o2, 0x10, %o2 40016ea4: 9f c0 80 00 call %g2 40016ea8: 90 10 00 10 mov %l0, %o0 rtems_filesystem_freenode( &loc ); 40016eac: c2 07 bf f0 ld [ %fp + -16 ], %g1 40016eb0: 80 a0 60 00 cmp %g1, 0 40016eb4: 02 bf ff f7 be 40016e90 40016eb8: b0 10 00 08 mov %o0, %i0 40016ebc: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 40016ec0: 80 a0 60 00 cmp %g1, 0 40016ec4: 02 80 00 04 be 40016ed4 40016ec8: 01 00 00 00 nop 40016ecc: 9f c0 40 00 call %g1 40016ed0: 90 10 00 10 mov %l0, %o0 return result; } 40016ed4: 81 c7 e0 08 ret 40016ed8: 81 e8 00 00 restore 40016edc : #include int chroot( const char *pathname ) { 40016edc: 9d e3 bf 88 save %sp, -120, %sp 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) { 40016ee0: 23 10 00 e6 sethi %hi(0x40039800), %l1 40016ee4: e0 04 62 c0 ld [ %l1 + 0x2c0 ], %l0 ! 40039ac0 40016ee8: 03 10 00 f1 sethi %hi(0x4003c400), %g1 40016eec: 82 10 61 a4 or %g1, 0x1a4, %g1 ! 4003c5a4 40016ef0: 80 a4 00 01 cmp %l0, %g1 40016ef4: 12 80 00 0e bne 40016f2c 40016ef8: 01 00 00 00 nop rtems_libio_set_private_env(); /* try to set a new private env*/ 40016efc: 40 00 05 39 call 400183e0 40016f00: 01 00 00 00 nop if (rtems_current_user_env == &rtems_global_user_env) /* not ok */ 40016f04: c2 04 62 c0 ld [ %l1 + 0x2c0 ], %g1 40016f08: 80 a0 40 10 cmp %g1, %l0 40016f0c: 12 80 00 08 bne 40016f2c 40016f10: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( ENOTSUP ); 40016f14: 40 00 32 9e call 4002398c <__errno> <== NOT EXECUTED 40016f18: b0 10 3f ff mov -1, %i0 ! ffffffff <== NOT EXECUTED 40016f1c: 82 10 20 86 mov 0x86, %g1 <== NOT EXECUTED 40016f20: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 40016f24: 81 c7 e0 08 ret <== NOT EXECUTED 40016f28: 81 e8 00 00 restore <== NOT EXECUTED }; result = chdir(pathname); 40016f2c: 7f ff ff 40 call 40016c2c 40016f30: 90 10 00 18 mov %i0, %o0 if (result) { 40016f34: 80 a2 20 00 cmp %o0, 0 40016f38: 12 80 00 0a bne 40016f60 40016f3c: 11 10 00 d8 sethi %hi(0x40036000), %o0 rtems_set_errno_and_return_minus_one( errno ); }; /* clone the new root location */ if (rtems_filesystem_evaluate_path(".", 0, &loc, 0)) { 40016f40: 92 10 20 00 clr %o1 40016f44: 90 12 22 e0 or %o0, 0x2e0, %o0 40016f48: 94 07 bf e8 add %fp, -24, %o2 40016f4c: 7f ff ba f4 call 40005b1c 40016f50: 96 10 20 00 clr %o3 40016f54: 80 a2 20 00 cmp %o0, 0 40016f58: 02 80 00 0a be 40016f80 40016f5c: 03 10 00 e6 sethi %hi(0x40039800), %g1 /* our cwd has changed, though - but there is no easy way of return :-( */ rtems_set_errno_and_return_minus_one( errno ); 40016f60: 40 00 32 8b call 4002398c <__errno> <== NOT EXECUTED 40016f64: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40016f68: 40 00 32 89 call 4002398c <__errno> <== NOT EXECUTED 40016f6c: a0 10 00 08 mov %o0, %l0 <== NOT EXECUTED 40016f70: c2 02 00 00 ld [ %o0 ], %g1 <== NOT EXECUTED 40016f74: c2 24 00 00 st %g1, [ %l0 ] <== NOT EXECUTED 40016f78: 81 c7 e0 08 ret <== NOT EXECUTED 40016f7c: 81 e8 00 00 restore <== NOT EXECUTED } rtems_filesystem_freenode(&rtems_filesystem_root); 40016f80: d0 00 62 c0 ld [ %g1 + 0x2c0 ], %o0 40016f84: c2 02 20 1c ld [ %o0 + 0x1c ], %g1 40016f88: 80 a0 60 00 cmp %g1, 0 40016f8c: 22 80 00 09 be,a 40016fb0 40016f90: 03 10 00 e6 sethi %hi(0x40039800), %g1 <== NOT EXECUTED 40016f94: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 ! 4003981c 40016f98: 80 a0 60 00 cmp %g1, 0 40016f9c: 22 80 00 05 be,a 40016fb0 40016fa0: 03 10 00 e6 sethi %hi(0x40039800), %g1 <== NOT EXECUTED 40016fa4: 9f c0 40 00 call %g1 40016fa8: 90 02 20 14 add %o0, 0x14, %o0 rtems_filesystem_root = loc; 40016fac: 03 10 00 e6 sethi %hi(0x40039800), %g1 40016fb0: d0 00 62 c0 ld [ %g1 + 0x2c0 ], %o0 ! 40039ac0 40016fb4: 92 07 bf e8 add %fp, -24, %o1 40016fb8: 94 10 20 10 mov 0x10, %o2 40016fbc: 90 02 20 14 add %o0, 0x14, %o0 40016fc0: 40 00 39 27 call 4002545c 40016fc4: b0 10 20 00 clr %i0 return 0; } 40016fc8: 81 c7 e0 08 ret 40016fcc: 81 e8 00 00 restore 40006c14 : int clock_gettime( clockid_t clock_id, struct timespec *tp ) { 40006c14: 9d e3 bf 98 save %sp, -104, %sp if ( !tp ) 40006c18: 90 96 60 00 orcc %i1, 0, %o0 40006c1c: 12 80 00 08 bne 40006c3c 40006c20: 80 a6 20 02 cmp %i0, 2 rtems_set_errno_and_return_minus_one( EINVAL ); 40006c24: 40 00 27 5d call 40010998 <__errno> <== NOT EXECUTED 40006c28: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40006c2c: 82 10 20 16 mov 0x16, %g1 <== NOT EXECUTED 40006c30: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 40006c34: 81 c7 e0 08 ret <== NOT EXECUTED 40006c38: 81 e8 00 00 restore <== NOT EXECUTED switch ( clock_id ) { 40006c3c: 02 80 00 10 be 40006c7c 40006c40: 80 a6 20 02 cmp %i0, 2 40006c44: 18 80 00 06 bgu 40006c5c 40006c48: 80 a6 20 03 cmp %i0, 3 40006c4c: 80 a6 20 01 cmp %i0, 1 40006c50: 12 80 00 11 bne 40006c94 40006c54: 01 00 00 00 nop 40006c58: 30 80 00 06 b,a 40006c70 40006c5c: 02 80 00 0c be 40006c8c <== NOT EXECUTED 40006c60: 80 a6 20 04 cmp %i0, 4 <== NOT EXECUTED 40006c64: 12 80 00 0c bne 40006c94 <== NOT EXECUTED 40006c68: 01 00 00 00 nop <== NOT EXECUTED 40006c6c: 30 80 00 04 b,a 40006c7c <== NOT EXECUTED case CLOCK_REALTIME: _TOD_Get(tp); 40006c70: 40 00 0a b8 call 40009750 <_TOD_Get> 40006c74: b0 10 20 00 clr %i0 40006c78: 30 80 00 0b b,a 40006ca4 break; #endif #ifdef _POSIX_CPUTIME case CLOCK_PROCESS_CPUTIME: _TOD_Get_uptime(tp); 40006c7c: 40 00 0a ce call 400097b4 <_TOD_Get_uptime> <== NOT EXECUTED 40006c80: b0 10 20 00 clr %i0 <== NOT EXECUTED 40006c84: 81 c7 e0 08 ret <== NOT EXECUTED 40006c88: 81 e8 00 00 restore <== NOT EXECUTED break; #endif #ifdef _POSIX_THREAD_CPUTIME case CLOCK_THREAD_CPUTIME: return POSIX_NOT_IMPLEMENTED(); 40006c8c: 40 00 02 fb call 40007878 <== NOT EXECUTED 40006c90: 81 e8 00 00 restore <== NOT EXECUTED break; #endif default: rtems_set_errno_and_return_minus_one( EINVAL ); 40006c94: 40 00 27 41 call 40010998 <__errno> <== NOT EXECUTED 40006c98: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40006c9c: 82 10 20 16 mov 0x16, %g1 <== NOT EXECUTED 40006ca0: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED } return 0; } 40006ca4: 81 c7 e0 08 ret 40006ca8: 81 e8 00 00 restore 40006cac : int clock_settime( clockid_t clock_id, const struct timespec *tp ) { 40006cac: 9d e3 bf 98 save %sp, -104, %sp if ( !tp ) 40006cb0: 90 96 60 00 orcc %i1, 0, %o0 40006cb4: 02 80 00 0d be 40006ce8 40006cb8: 80 a6 20 02 cmp %i0, 2 rtems_set_errno_and_return_minus_one( EINVAL ); switch ( clock_id ) { 40006cbc: 02 80 00 22 be 40006d44 40006cc0: 80 a6 20 03 cmp %i0, 3 40006cc4: 02 80 00 20 be 40006d44 40006cc8: 80 a6 20 01 cmp %i0, 1 40006ccc: 12 80 00 20 bne 40006d4c 40006cd0: 03 08 76 b9 sethi %hi(0x21dae400), %g1 case CLOCK_REALTIME: if ( tp->tv_sec < TOD_SECONDS_1970_THROUGH_1988 ) 40006cd4: c4 02 00 00 ld [ %o0 ], %g2 40006cd8: 82 10 60 ff or %g1, 0xff, %g1 40006cdc: 80 a0 80 01 cmp %g2, %g1 40006ce0: 18 80 00 08 bgu 40006d00 40006ce4: 21 10 00 7a sethi %hi(0x4001e800), %l0 rtems_set_errno_and_return_minus_one( EINVAL ); 40006ce8: 40 00 27 2c call 40010998 <__errno> <== NOT EXECUTED 40006cec: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40006cf0: 82 10 20 16 mov 0x16, %g1 <== NOT EXECUTED 40006cf4: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 40006cf8: 81 c7 e0 08 ret <== NOT EXECUTED 40006cfc: 81 e8 00 00 restore <== NOT EXECUTED rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40006d00: c2 04 22 f0 ld [ %l0 + 0x2f0 ], %g1 40006d04: 82 00 60 01 inc %g1 40006d08: c2 24 22 f0 st %g1, [ %l0 + 0x2f0 ] _Thread_Disable_dispatch(); _TOD_Set( tp ); 40006d0c: 40 00 0a da call 40009874 <_TOD_Set> 40006d10: 01 00 00 00 nop #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40006d14: c2 04 22 f0 ld [ %l0 + 0x2f0 ], %g1 40006d18: b0 10 20 00 clr %i0 40006d1c: 82 00 7f ff add %g1, -1, %g1 40006d20: c2 24 22 f0 st %g1, [ %l0 + 0x2f0 ] 40006d24: c2 04 22 f0 ld [ %l0 + 0x2f0 ], %g1 40006d28: 80 a0 60 00 cmp %g1, 0 40006d2c: 12 80 00 0c bne 40006d5c 40006d30: 01 00 00 00 nop _Thread_Dispatch(); 40006d34: 40 00 12 69 call 4000b6d8 <_Thread_Dispatch> 40006d38: 01 00 00 00 nop 40006d3c: 81 c7 e0 08 ret 40006d40: 81 e8 00 00 restore break; #endif #ifdef _POSIX_THREAD_CPUTIME case CLOCK_THREAD_CPUTIME: return POSIX_NOT_IMPLEMENTED(); 40006d44: 40 00 02 cd call 40007878 <== NOT EXECUTED 40006d48: 81 e8 00 00 restore <== NOT EXECUTED break; #endif default: rtems_set_errno_and_return_minus_one( EINVAL ); 40006d4c: 40 00 27 13 call 40010998 <__errno> 40006d50: b0 10 3f ff mov -1, %i0 40006d54: 82 10 20 16 mov 0x16, %g1 40006d58: c2 22 00 00 st %g1, [ %o0 ] } return 0; } 40006d5c: 81 c7 e0 08 ret 40006d60: 81 e8 00 00 restore 40016fd0 : * close a directory. */ int closedir(dirp) register DIR *dirp; { 40016fd0: 9d e3 bf 98 save %sp, -104, %sp int fd; if ( !dirp ) 40016fd4: a0 96 20 00 orcc %i0, 0, %l0 40016fd8: 02 80 00 0b be 40017004 40016fdc: 82 10 3f ff mov -1, %g1 rtems_set_errno_and_return_minus_one( EBADF ); fd = dirp->dd_fd; dirp->dd_fd = -1; dirp->dd_loc = 0; (void)free((void *)dirp->dd_buf); 40016fe0: d0 04 20 0c ld [ %l0 + 0xc ], %o0 int fd; if ( !dirp ) rtems_set_errno_and_return_minus_one( EBADF ); fd = dirp->dd_fd; 40016fe4: f0 04 00 00 ld [ %l0 ], %i0 dirp->dd_fd = -1; dirp->dd_loc = 0; 40016fe8: c0 24 20 04 clr [ %l0 + 4 ] (void)free((void *)dirp->dd_buf); 40016fec: 7f ff bc 2b call 40006098 40016ff0: c2 24 00 00 st %g1, [ %l0 ] (void)free((void *)dirp); 40016ff4: 7f ff bc 29 call 40006098 40016ff8: 90 10 00 10 mov %l0, %o0 return(close(fd)); 40016ffc: 7f ff ba 69 call 400059a0 40017000: 81 e8 00 00 restore register DIR *dirp; { int fd; if ( !dirp ) rtems_set_errno_and_return_minus_one( EBADF ); 40017004: 40 00 32 62 call 4002398c <__errno> <== NOT EXECUTED 40017008: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 4001700c: 82 10 20 09 mov 9, %g1 <== NOT EXECUTED 40017010: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED dirp->dd_fd = -1; dirp->dd_loc = 0; (void)free((void *)dirp->dd_buf); (void)free((void *)dirp); return(close(fd)); } 40017014: 81 c7 e0 08 ret <== NOT EXECUTED 40017018: 81 e8 00 00 restore <== NOT EXECUTED 4000e2cc : */ int device_close( rtems_libio_t *iop ) { 4000e2cc: 9d e3 bf 88 save %sp, -120, %sp rtems_libio_open_close_args_t args; rtems_status_code status; IMFS_jnode_t *the_jnode; the_jnode = iop->file_info; 4000e2d0: c2 06 20 2c ld [ %i0 + 0x2c ], %g1 args.iop = iop; 4000e2d4: f0 27 bf ec st %i0, [ %fp + -20 ] args.flags = 0; 4000e2d8: c0 27 bf f0 clr [ %fp + -16 ] args.mode = 0; 4000e2dc: c0 27 bf f4 clr [ %fp + -12 ] status = rtems_io_close( 4000e2e0: d2 00 60 50 ld [ %g1 + 0x50 ], %o1 4000e2e4: d0 00 60 4c ld [ %g1 + 0x4c ], %o0 4000e2e8: 94 07 bf ec add %fp, -20, %o2 4000e2ec: 40 00 02 1e call 4000eb64 4000e2f0: b0 10 20 00 clr %i0 the_jnode->info.device.major, the_jnode->info.device.minor, (void *) &args ); if ( status ) { 4000e2f4: 80 a2 20 00 cmp %o0, 0 4000e2f8: 02 80 00 05 be 4000e30c 4000e2fc: 01 00 00 00 nop return rtems_deviceio_errno(status); 4000e300: 7f ff ff a3 call 4000e18c <== NOT EXECUTED 4000e304: 01 00 00 00 nop <== NOT EXECUTED 4000e308: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED } return 0; } 4000e30c: 81 c7 e0 08 ret 4000e310: 81 e8 00 00 restore 4000e1c0 : int device_ioctl( rtems_libio_t *iop, uint32_t command, void *buffer ) { 4000e1c0: 9d e3 bf 88 save %sp, -120, %sp <== NOT EXECUTED args.iop = iop; args.command = command; args.buffer = buffer; the_jnode = iop->file_info; 4000e1c4: c2 06 20 2c ld [ %i0 + 0x2c ], %g1 <== NOT EXECUTED rtems_libio_ioctl_args_t args; rtems_status_code status; IMFS_jnode_t *the_jnode; args.iop = iop; args.command = command; 4000e1c8: f2 27 bf ec st %i1, [ %fp + -20 ] <== NOT EXECUTED args.buffer = buffer; 4000e1cc: f4 27 bf f0 st %i2, [ %fp + -16 ] <== NOT EXECUTED { rtems_libio_ioctl_args_t args; rtems_status_code status; IMFS_jnode_t *the_jnode; args.iop = iop; 4000e1d0: f0 27 bf e8 st %i0, [ %fp + -24 ] <== NOT EXECUTED args.command = command; args.buffer = buffer; the_jnode = iop->file_info; status = rtems_io_control( 4000e1d4: d2 00 60 50 ld [ %g1 + 0x50 ], %o1 <== NOT EXECUTED 4000e1d8: d0 00 60 4c ld [ %g1 + 0x4c ], %o0 <== NOT EXECUTED 4000e1dc: 40 00 02 78 call 4000ebbc <== NOT EXECUTED 4000e1e0: 94 07 bf e8 add %fp, -24, %o2 <== NOT EXECUTED the_jnode->info.device.major, the_jnode->info.device.minor, (void *) &args ); if ( status ) 4000e1e4: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 4000e1e8: 22 80 00 06 be,a 4000e200 <== NOT EXECUTED 4000e1ec: d0 07 bf f4 ld [ %fp + -12 ], %o0 <== NOT EXECUTED return rtems_deviceio_errno(status); 4000e1f0: 7f ff ff e7 call 4000e18c <== NOT EXECUTED 4000e1f4: 01 00 00 00 nop <== NOT EXECUTED return args.ioctl_return; } 4000e1f8: 81 c7 e0 08 ret <== NOT EXECUTED 4000e1fc: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED 4000e200: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED 4000e204: 81 c7 e0 08 ret <== NOT EXECUTED 4000e208: 81 e8 00 00 restore <== NOT EXECUTED 4000e314 : rtems_libio_t *iop, const char *pathname, uint32_t flag, uint32_t mode ) { 4000e314: 9d e3 bf 88 save %sp, -120, %sp IMFS_jnode_t *the_jnode; the_jnode = iop->file_info; args.iop = iop; args.flags = iop->flags; 4000e318: c2 06 20 0c ld [ %i0 + 0xc ], %g1 { rtems_libio_open_close_args_t args; rtems_status_code status; IMFS_jnode_t *the_jnode; the_jnode = iop->file_info; 4000e31c: c4 06 20 2c ld [ %i0 + 0x2c ], %g2 args.iop = iop; 4000e320: f0 27 bf ec st %i0, [ %fp + -20 ] args.flags = iop->flags; 4000e324: c2 27 bf f0 st %g1, [ %fp + -16 ] args.mode = mode; 4000e328: f6 27 bf f4 st %i3, [ %fp + -12 ] status = rtems_io_open( 4000e32c: d2 00 a0 50 ld [ %g2 + 0x50 ], %o1 4000e330: d0 00 a0 4c ld [ %g2 + 0x4c ], %o0 4000e334: 94 07 bf ec add %fp, -20, %o2 4000e338: 40 00 02 37 call 4000ec14 4000e33c: b0 10 20 00 clr %i0 the_jnode->info.device.major, the_jnode->info.device.minor, (void *) &args ); if ( status ) 4000e340: 80 a2 20 00 cmp %o0, 0 4000e344: 02 80 00 05 be 4000e358 4000e348: 01 00 00 00 nop return rtems_deviceio_errno(status); 4000e34c: 7f ff ff 90 call 4000e18c <== NOT EXECUTED 4000e350: 01 00 00 00 nop <== NOT EXECUTED 4000e354: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED return 0; } 4000e358: 81 c7 e0 08 ret 4000e35c: 81 e8 00 00 restore 4000e26c : ssize_t device_read( rtems_libio_t *iop, void *buffer, size_t count ) { 4000e26c: 9d e3 bf 80 save %sp, -128, %sp <== NOT EXECUTED args.iop = iop; args.offset = iop->offset; args.buffer = buffer; args.count = count; args.flags = iop->flags; 4000e270: c4 06 20 0c ld [ %i0 + 0xc ], %g2 <== NOT EXECUTED IMFS_jnode_t *the_jnode; the_jnode = iop->file_info; args.iop = iop; args.offset = iop->offset; 4000e274: c2 06 20 08 ld [ %i0 + 8 ], %g1 <== NOT EXECUTED { rtems_libio_rw_args_t args; rtems_status_code status; IMFS_jnode_t *the_jnode; the_jnode = iop->file_info; 4000e278: c6 06 20 2c ld [ %i0 + 0x2c ], %g3 <== NOT EXECUTED args.iop = iop; args.offset = iop->offset; args.buffer = buffer; 4000e27c: f2 27 bf e8 st %i1, [ %fp + -24 ] <== NOT EXECUTED IMFS_jnode_t *the_jnode; the_jnode = iop->file_info; args.iop = iop; args.offset = iop->offset; 4000e280: c2 27 bf e4 st %g1, [ %fp + -28 ] <== NOT EXECUTED args.buffer = buffer; args.count = count; 4000e284: f4 27 bf ec st %i2, [ %fp + -20 ] <== NOT EXECUTED args.flags = iop->flags; 4000e288: c4 27 bf f0 st %g2, [ %fp + -16 ] <== NOT EXECUTED rtems_status_code status; IMFS_jnode_t *the_jnode; the_jnode = iop->file_info; args.iop = iop; 4000e28c: f0 27 bf e0 st %i0, [ %fp + -32 ] <== NOT EXECUTED args.offset = iop->offset; args.buffer = buffer; args.count = count; args.flags = iop->flags; args.bytes_moved = 0; 4000e290: c0 27 bf f4 clr [ %fp + -12 ] <== NOT EXECUTED status = rtems_io_read( 4000e294: d2 00 e0 50 ld [ %g3 + 0x50 ], %o1 <== NOT EXECUTED 4000e298: d0 00 e0 4c ld [ %g3 + 0x4c ], %o0 <== NOT EXECUTED 4000e29c: 40 00 02 74 call 4000ec6c <== NOT EXECUTED 4000e2a0: 94 07 bf e0 add %fp, -32, %o2 <== NOT EXECUTED the_jnode->info.device.major, the_jnode->info.device.minor, (void *) &args ); if ( status ) 4000e2a4: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 4000e2a8: 22 80 00 06 be,a 4000e2c0 <== NOT EXECUTED 4000e2ac: d0 07 bf f4 ld [ %fp + -12 ], %o0 <== NOT EXECUTED return rtems_deviceio_errno(status); 4000e2b0: 7f ff ff b7 call 4000e18c <== NOT EXECUTED 4000e2b4: 01 00 00 00 nop <== NOT EXECUTED return (ssize_t) args.bytes_moved; } 4000e2b8: 81 c7 e0 08 ret <== NOT EXECUTED 4000e2bc: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED 4000e2c0: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED 4000e2c4: 81 c7 e0 08 ret <== NOT EXECUTED 4000e2c8: 81 e8 00 00 restore <== NOT EXECUTED 4000e20c : ssize_t device_write( rtems_libio_t *iop, const void *buffer, size_t count ) { 4000e20c: 9d e3 bf 80 save %sp, -128, %sp args.iop = iop; args.offset = iop->offset; args.buffer = (void *) buffer; args.count = count; args.flags = iop->flags; 4000e210: c4 06 20 0c ld [ %i0 + 0xc ], %g2 IMFS_jnode_t *the_jnode; the_jnode = iop->file_info; args.iop = iop; args.offset = iop->offset; 4000e214: c2 06 20 08 ld [ %i0 + 8 ], %g1 { rtems_libio_rw_args_t args; rtems_status_code status; IMFS_jnode_t *the_jnode; the_jnode = iop->file_info; 4000e218: c6 06 20 2c ld [ %i0 + 0x2c ], %g3 args.iop = iop; args.offset = iop->offset; args.buffer = (void *) buffer; 4000e21c: f2 27 bf e8 st %i1, [ %fp + -24 ] IMFS_jnode_t *the_jnode; the_jnode = iop->file_info; args.iop = iop; args.offset = iop->offset; 4000e220: c2 27 bf e4 st %g1, [ %fp + -28 ] args.buffer = (void *) buffer; args.count = count; 4000e224: f4 27 bf ec st %i2, [ %fp + -20 ] args.flags = iop->flags; 4000e228: c4 27 bf f0 st %g2, [ %fp + -16 ] rtems_status_code status; IMFS_jnode_t *the_jnode; the_jnode = iop->file_info; args.iop = iop; 4000e22c: f0 27 bf e0 st %i0, [ %fp + -32 ] args.offset = iop->offset; args.buffer = (void *) buffer; args.count = count; args.flags = iop->flags; args.bytes_moved = 0; 4000e230: c0 27 bf f4 clr [ %fp + -12 ] status = rtems_io_write( 4000e234: d2 00 e0 50 ld [ %g3 + 0x50 ], %o1 4000e238: d0 00 e0 4c ld [ %g3 + 0x4c ], %o0 4000e23c: 40 00 02 a2 call 4000ecc4 4000e240: 94 07 bf e0 add %fp, -32, %o2 the_jnode->info.device.major, the_jnode->info.device.minor, (void *) &args ); if ( status ) 4000e244: 80 a2 20 00 cmp %o0, 0 4000e248: 22 80 00 06 be,a 4000e260 4000e24c: d0 07 bf f4 ld [ %fp + -12 ], %o0 return rtems_deviceio_errno(status); 4000e250: 7f ff ff cf call 4000e18c <== NOT EXECUTED 4000e254: 01 00 00 00 nop <== NOT EXECUTED return (ssize_t) args.bytes_moved; } 4000e258: 81 c7 e0 08 ret <== NOT EXECUTED 4000e25c: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED 4000e260: b0 10 00 08 mov %o0, %i0 4000e264: 81 c7 e0 08 ret 4000e268: 81 e8 00 00 restore 40004cc8 : /* * Drain output queue */ static void drainOutput (struct rtems_termios_tty *tty) { 40004cc8: 9d e3 bf 98 save %sp, -104, %sp rtems_interrupt_level level; rtems_status_code sc; if (tty->device.outputUsesInterrupts != TERMIOS_POLLED) { 40004ccc: c2 06 20 b4 ld [ %i0 + 0xb4 ], %g1 40004cd0: 80 a0 60 00 cmp %g1, 0 40004cd4: 02 80 00 1a be 40004d3c 40004cd8: 01 00 00 00 nop rtems_interrupt_disable (level); 40004cdc: 7f ff f4 7c call 40001ecc <== NOT EXECUTED 40004ce0: 01 00 00 00 nop <== NOT EXECUTED 40004ce4: 30 80 00 0f b,a 40004d20 <== NOT EXECUTED while (tty->rawOutBuf.Tail != tty->rawOutBuf.Head) { tty->rawOutBufState = rob_wait; 40004ce8: c2 26 20 94 st %g1, [ %i0 + 0x94 ] <== NOT EXECUTED rtems_interrupt_enable (level); 40004cec: 7f ff f4 7c call 40001edc <== NOT EXECUTED 40004cf0: 01 00 00 00 nop <== NOT EXECUTED sc = rtems_semaphore_obtain (tty->rawOutBuf.Semaphore, 40004cf4: d0 06 20 8c ld [ %i0 + 0x8c ], %o0 <== NOT EXECUTED 40004cf8: 92 10 20 00 clr %o1 <== NOT EXECUTED 40004cfc: 40 00 06 b1 call 400067c0 <== NOT EXECUTED 40004d00: 94 10 20 00 clr %o2 <== NOT EXECUTED RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) 40004d04: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40004d08: 02 80 00 04 be 40004d18 <== NOT EXECUTED 40004d0c: 01 00 00 00 nop <== NOT EXECUTED rtems_fatal_error_occurred (sc); 40004d10: 40 00 09 ab call 400073bc <== NOT EXECUTED 40004d14: 01 00 00 00 nop <== NOT EXECUTED rtems_interrupt_disable (level); 40004d18: 7f ff f4 6d call 40001ecc <== NOT EXECUTED 40004d1c: 01 00 00 00 nop <== 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) { 40004d20: c4 06 20 84 ld [ %i0 + 0x84 ], %g2 <== NOT EXECUTED 40004d24: c2 06 20 80 ld [ %i0 + 0x80 ], %g1 <== NOT EXECUTED 40004d28: 80 a0 80 01 cmp %g2, %g1 <== NOT EXECUTED 40004d2c: 12 bf ff ef bne 40004ce8 <== NOT EXECUTED 40004d30: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); rtems_interrupt_disable (level); } rtems_interrupt_enable (level); 40004d34: 7f ff f4 6a call 40001edc <== NOT EXECUTED 40004d38: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED 40004d3c: 81 c7 e0 08 ret 40004d40: 81 e8 00 00 restore 40003b9c : int dup2( int fildes, int fildes2 ) { 40003b9c: 9d e3 bf 48 save %sp, -184, %sp /* * If fildes is not valid, then fildes2 should not be closed. */ status = fstat( fildes, &buf ); 40003ba0: a0 07 bf a8 add %fp, -88, %l0 40003ba4: 90 10 00 18 mov %i0, %o0 40003ba8: 40 00 01 b1 call 4000426c 40003bac: 92 10 00 10 mov %l0, %o1 if ( status == -1 ) 40003bb0: 80 a2 3f ff cmp %o0, -1 40003bb4: 02 80 00 0e be 40003bec 40003bb8: 90 10 3f ff mov -1, %o0 /* * If fildes2 is not valid, then we should not do anything either. */ status = fstat( fildes2, &buf ); 40003bbc: 92 10 00 10 mov %l0, %o1 40003bc0: 40 00 01 ab call 4000426c 40003bc4: 90 10 00 19 mov %i1, %o0 if ( status == -1 ) 40003bc8: 80 a2 3f ff cmp %o0, -1 40003bcc: 02 80 00 07 be 40003be8 40003bd0: 90 10 00 18 mov %i0, %o0 /* * This fcntl handles everything else. */ return fcntl( fildes, F_DUPFD, fildes2 ); 40003bd4: 94 10 00 19 mov %i1, %o2 <== NOT EXECUTED 40003bd8: 40 00 00 96 call 40003e30 <== NOT EXECUTED 40003bdc: 92 10 20 00 clr %o1 <== NOT EXECUTED } 40003be0: 81 c7 e0 08 ret <== NOT EXECUTED 40003be4: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED /* * This fcntl handles everything else. */ return fcntl( fildes, F_DUPFD, fildes2 ); 40003be8: 90 10 3f ff mov -1, %o0 } 40003bec: b0 10 00 08 mov %o0, %i0 40003bf0: 81 c7 e0 08 ret 40003bf4: 81 e8 00 00 restore 4000473c : /* * Echo a typed character */ static void echo (unsigned char c, struct rtems_termios_tty *tty) { 4000473c: 9d e3 bf 90 save %sp, -112, %sp <== NOT EXECUTED if ((tty->termios.c_lflag & ECHOCTL) && iscntrl(c) && (c != '\t') && (c != '\n')) { 40004740: c2 06 60 3c ld [ %i1 + 0x3c ], %g1 <== NOT EXECUTED 40004744: 80 88 62 00 btst 0x200, %g1 <== NOT EXECUTED 40004748: 02 80 00 1a be 400047b0 <== NOT EXECUTED 4000474c: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40004750: 03 10 00 68 sethi %hi(0x4001a000), %g1 <== NOT EXECUTED 40004754: c2 00 63 68 ld [ %g1 + 0x368 ], %g1 ! 4001a368 <__ctype_ptr> <== NOT EXECUTED 40004758: 84 0e 20 ff and %i0, 0xff, %g2 <== NOT EXECUTED 4000475c: c2 08 40 02 ldub [ %g1 + %g2 ], %g1 <== NOT EXECUTED 40004760: 80 88 60 20 btst 0x20, %g1 <== NOT EXECUTED 40004764: 22 80 00 14 be,a 400047b4 <== NOT EXECUTED 40004768: 90 0a 20 ff and %o0, 0xff, %o0 <== NOT EXECUTED 4000476c: 80 a0 a0 09 cmp %g2, 9 <== NOT EXECUTED 40004770: 02 80 00 10 be 400047b0 <== NOT EXECUTED 40004774: 80 a0 a0 0a cmp %g2, 0xa <== NOT EXECUTED 40004778: 02 80 00 0e be 400047b0 <== NOT EXECUTED 4000477c: 82 1e 20 40 xor %i0, 0x40, %g1 <== NOT EXECUTED char echobuf[2]; echobuf[0] = '^'; echobuf[1] = c ^ 0x40; 40004780: c2 2f bf f7 stb %g1, [ %fp + -9 ] <== NOT EXECUTED echo (unsigned char c, struct rtems_termios_tty *tty) { if ((tty->termios.c_lflag & ECHOCTL) && iscntrl(c) && (c != '\t') && (c != '\n')) { char echobuf[2]; echobuf[0] = '^'; 40004784: 82 10 20 5e mov 0x5e, %g1 <== NOT EXECUTED echobuf[1] = c ^ 0x40; rtems_termios_puts (echobuf, 2, tty); 40004788: 90 07 bf f6 add %fp, -10, %o0 <== NOT EXECUTED echo (unsigned char c, struct rtems_termios_tty *tty) { if ((tty->termios.c_lflag & ECHOCTL) && iscntrl(c) && (c != '\t') && (c != '\n')) { char echobuf[2]; echobuf[0] = '^'; 4000478c: c2 2f bf f6 stb %g1, [ %fp + -10 ] <== NOT EXECUTED echobuf[1] = c ^ 0x40; rtems_termios_puts (echobuf, 2, tty); 40004790: 92 10 20 02 mov 2, %o1 <== NOT EXECUTED 40004794: 7f ff ff 3c call 40004484 <== NOT EXECUTED 40004798: 94 10 00 19 mov %i1, %o2 <== NOT EXECUTED tty->column += 2; 4000479c: c2 06 60 28 ld [ %i1 + 0x28 ], %g1 <== NOT EXECUTED 400047a0: 82 00 60 02 add %g1, 2, %g1 <== NOT EXECUTED 400047a4: c2 26 60 28 st %g1, [ %i1 + 0x28 ] <== NOT EXECUTED 400047a8: 81 c7 e0 08 ret <== NOT EXECUTED 400047ac: 81 e8 00 00 restore <== NOT EXECUTED } else { oproc (c, tty); 400047b0: 90 0a 20 ff and %o0, 0xff, %o0 <== NOT EXECUTED 400047b4: 7f ff ff 80 call 400045b4 <== NOT EXECUTED 400047b8: 92 10 00 19 mov %i1, %o1 <== NOT EXECUTED 400047bc: 81 c7 e0 08 ret <== NOT EXECUTED 400047c0: 81 e8 00 00 restore <== NOT EXECUTED 40017778 : group_fp = fopen("/etc/group", "r"); } void endgrent(void) { if (group_fp != NULL) 40017778: 03 10 00 ed sethi %hi(0x4003b400), %g1 <== NOT EXECUTED 4001777c: d0 00 61 84 ld [ %g1 + 0x184 ], %o0 ! 4003b584 <== NOT EXECUTED 40017780: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017784: 02 80 00 05 be 40017798 <== NOT EXECUTED 40017788: 01 00 00 00 nop <== NOT EXECUTED fclose(group_fp); 4001778c: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 40017790: 40 00 30 d5 call 40023ae4 <== NOT EXECUTED 40017794: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED 40017798: 81 c3 e0 08 retl <== NOT EXECUTED 4001779c: 01 00 00 00 nop 400177a0 : passwd_fp = fopen("/etc/passwd", "r"); } void endpwent(void) { if (passwd_fp != NULL) 400177a0: 03 10 00 ed sethi %hi(0x4003b400), %g1 <== NOT EXECUTED 400177a4: d0 00 60 9c ld [ %g1 + 0x9c ], %o0 ! 4003b49c <== NOT EXECUTED 400177a8: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400177ac: 02 80 00 05 be 400177c0 <== NOT EXECUTED 400177b0: 01 00 00 00 nop <== NOT EXECUTED fclose(passwd_fp); 400177b4: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 400177b8: 40 00 30 cb call 40023ae4 <== NOT EXECUTED 400177bc: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED 400177c0: 81 c3 e0 08 retl <== NOT EXECUTED 400177c4: 01 00 00 00 nop 400047c4 : * 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) { 400047c4: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED if (tty->ccount == 0) 400047c8: c2 06 20 20 ld [ %i0 + 0x20 ], %g1 <== NOT EXECUTED 400047cc: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400047d0: 02 80 00 0a be 400047f8 <== NOT EXECUTED 400047d4: a0 10 00 18 mov %i0, %l0 <== NOT EXECUTED return; if (lineFlag) { 400047d8: 80 a6 60 00 cmp %i1, 0 <== NOT EXECUTED 400047dc: 02 80 00 7d be 400049d0 <== NOT EXECUTED 400047e0: 03 10 00 63 sethi %hi(0x40018c00), %g1 <== NOT EXECUTED if (!(tty->termios.c_lflag & ECHO)) { 400047e4: c2 06 20 3c ld [ %i0 + 0x3c ], %g1 <== NOT EXECUTED 400047e8: 80 88 60 08 btst 8, %g1 <== NOT EXECUTED 400047ec: 32 80 00 05 bne,a 40004800 <== NOT EXECUTED 400047f0: 80 88 60 10 btst 0x10, %g1 <== NOT EXECUTED tty->ccount = 0; 400047f4: c0 26 20 20 clr [ %i0 + 0x20 ] <== NOT EXECUTED 400047f8: 81 c7 e0 08 ret <== NOT EXECUTED 400047fc: 81 e8 00 00 restore <== NOT EXECUTED return; } if (!(tty->termios.c_lflag & ECHOE)) { 40004800: 12 80 00 74 bne 400049d0 <== NOT EXECUTED 40004804: 03 10 00 63 sethi %hi(0x40018c00), %g1 <== NOT EXECUTED tty->ccount = 0; echo (tty->termios.c_cc[VKILL], tty); 40004808: d0 0e 20 44 ldub [ %i0 + 0x44 ], %o0 <== NOT EXECUTED if (!(tty->termios.c_lflag & ECHO)) { tty->ccount = 0; return; } if (!(tty->termios.c_lflag & ECHOE)) { tty->ccount = 0; 4000480c: c0 26 20 20 clr [ %i0 + 0x20 ] <== NOT EXECUTED echo (tty->termios.c_cc[VKILL], tty); 40004810: 7f ff ff cb call 4000473c <== NOT EXECUTED 40004814: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED if (tty->termios.c_lflag & ECHOK) 40004818: c2 06 20 3c ld [ %i0 + 0x3c ], %g1 <== NOT EXECUTED echo ('\n', tty); 4000481c: b2 10 00 18 mov %i0, %i1 <== NOT EXECUTED return; } if (!(tty->termios.c_lflag & ECHOE)) { tty->ccount = 0; echo (tty->termios.c_cc[VKILL], tty); if (tty->termios.c_lflag & ECHOK) 40004820: 80 88 60 20 btst 0x20, %g1 <== NOT EXECUTED 40004824: 12 80 00 11 bne 40004868 <== NOT EXECUTED 40004828: b0 10 20 0a mov 0xa, %i0 <== NOT EXECUTED 4000482c: 30 80 00 71 b,a 400049f0 <== NOT EXECUTED } } while (tty->ccount) { unsigned char c = tty->cbuf[--tty->ccount]; if (tty->termios.c_lflag & ECHO) { 40004830: c6 04 20 3c ld [ %l0 + 0x3c ], %g3 <== NOT EXECUTED echo ('\n', tty); return; } } while (tty->ccount) { unsigned char c = tty->cbuf[--tty->ccount]; 40004834: 82 01 3f ff add %g4, -1, %g1 <== NOT EXECUTED 40004838: c2 24 20 20 st %g1, [ %l0 + 0x20 ] <== NOT EXECUTED if (tty->termios.c_lflag & ECHO) { 4000483c: 80 88 e0 08 btst 8, %g3 <== NOT EXECUTED 40004840: 02 80 00 5f be 400049bc <== NOT EXECUTED 40004844: c4 08 80 01 ldub [ %g2 + %g1 ], %g2 <== NOT EXECUTED if (!lineFlag && !(tty->termios.c_lflag & ECHOE)) { 40004848: 80 a6 60 00 cmp %i1, 0 <== NOT EXECUTED 4000484c: 12 80 00 09 bne 40004870 <== NOT EXECUTED 40004850: 83 28 a0 18 sll %g2, 0x18, %g1 <== NOT EXECUTED 40004854: 80 88 e0 10 btst 0x10, %g3 <== NOT EXECUTED 40004858: 12 80 00 07 bne 40004874 <== NOT EXECUTED 4000485c: 83 38 60 18 sra %g1, 0x18, %g1 <== NOT EXECUTED echo (tty->termios.c_cc[VERASE], tty); 40004860: f0 0c 20 43 ldub [ %l0 + 0x43 ], %i0 <== NOT EXECUTED 40004864: b2 10 00 10 mov %l0, %i1 <== NOT EXECUTED 40004868: 7f ff ff b5 call 4000473c <== NOT EXECUTED 4000486c: 81 e8 00 00 restore <== NOT EXECUTED } else if (c == '\t') { 40004870: 83 38 60 18 sra %g1, 0x18, %g1 <== NOT EXECUTED 40004874: 80 a0 60 09 cmp %g1, 9 <== NOT EXECUTED 40004878: 32 80 00 2c bne,a 40004928 <== NOT EXECUTED 4000487c: c2 04 63 68 ld [ %l1 + 0x368 ], %g1 <== NOT EXECUTED int col = tty->read_start_column; 40004880: f0 04 20 2c ld [ %l0 + 0x2c ], %i0 <== NOT EXECUTED while (i != tty->ccount) { c = tty->cbuf[i++]; if (c == '\t') { col = (col | 7) + 1; } else if (iscntrl (c)) { 40004884: d8 04 63 68 ld [ %l1 + 0x368 ], %o4 <== NOT EXECUTED int i = 0; /* * Find the character before the tab */ while (i != tty->ccount) { 40004888: 9a 01 3f ff add %g4, -1, %o5 <== NOT EXECUTED c = tty->cbuf[i++]; if (c == '\t') { col = (col | 7) + 1; } else if (iscntrl (c)) { if (tty->termios.c_lflag & ECHOCTL) 4000488c: 88 08 e2 00 and %g3, 0x200, %g4 <== NOT EXECUTED while (i != tty->ccount) { c = tty->cbuf[i++]; if (c == '\t') { col = (col | 7) + 1; } else if (iscntrl (c)) { 40004890: 10 80 00 14 b 400048e0 <== NOT EXECUTED 40004894: 86 10 20 00 clr %g3 <== NOT EXECUTED /* * Find the character before the tab */ while (i != tty->ccount) { c = tty->cbuf[i++]; if (c == '\t') { 40004898: c4 48 40 03 ldsb [ %g1 + %g3 ], %g2 <== NOT EXECUTED 4000489c: c2 08 40 03 ldub [ %g1 + %g3 ], %g1 <== NOT EXECUTED 400048a0: 80 a0 a0 09 cmp %g2, 9 <== NOT EXECUTED 400048a4: 12 80 00 05 bne 400048b8 <== NOT EXECUTED 400048a8: 82 08 60 ff and %g1, 0xff, %g1 <== NOT EXECUTED col = (col | 7) + 1; 400048ac: 82 16 20 07 or %i0, 7, %g1 <== NOT EXECUTED 400048b0: 10 80 00 0b b 400048dc <== NOT EXECUTED 400048b4: b0 00 60 01 add %g1, 1, %i0 <== NOT EXECUTED } else if (iscntrl (c)) { 400048b8: c2 0b 00 01 ldub [ %o4 + %g1 ], %g1 <== NOT EXECUTED 400048bc: 80 88 60 20 btst 0x20, %g1 <== NOT EXECUTED 400048c0: 22 80 00 07 be,a 400048dc <== NOT EXECUTED 400048c4: b0 06 20 01 inc %i0 <== NOT EXECUTED if (tty->termios.c_lflag & ECHOCTL) 400048c8: 80 a1 20 00 cmp %g4, 0 <== NOT EXECUTED 400048cc: 32 80 00 04 bne,a 400048dc <== NOT EXECUTED 400048d0: b0 06 20 02 add %i0, 2, %i0 <== NOT EXECUTED /* * Find the character before the tab */ while (i != tty->ccount) { c = tty->cbuf[i++]; 400048d4: 10 80 00 03 b 400048e0 <== NOT EXECUTED 400048d8: 86 00 e0 01 inc %g3 <== NOT EXECUTED 400048dc: 86 00 e0 01 inc %g3 <== NOT EXECUTED int i = 0; /* * Find the character before the tab */ while (i != tty->ccount) { 400048e0: 80 a0 c0 0d cmp %g3, %o5 <== NOT EXECUTED 400048e4: 32 bf ff ed bne,a 40004898 <== NOT EXECUTED 400048e8: c2 04 20 1c ld [ %l0 + 0x1c ], %g1 <== NOT EXECUTED } /* * Back up over the tab */ while (tty->column > col) { 400048ec: 10 80 00 08 b 4000490c <== NOT EXECUTED 400048f0: c2 04 20 28 ld [ %l0 + 0x28 ], %g1 <== NOT EXECUTED rtems_termios_puts ("\b", 1, tty); 400048f4: 7f ff fe e4 call 40004484 <== NOT EXECUTED 400048f8: 01 00 00 00 nop <== NOT EXECUTED tty->column--; 400048fc: c2 04 20 28 ld [ %l0 + 0x28 ], %g1 <== NOT EXECUTED 40004900: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 40004904: c2 24 20 28 st %g1, [ %l0 + 0x28 ] <== NOT EXECUTED } /* * Back up over the tab */ while (tty->column > col) { 40004908: c2 04 20 28 ld [ %l0 + 0x28 ], %g1 <== NOT EXECUTED rtems_termios_puts ("\b", 1, tty); 4000490c: 90 10 00 13 mov %l3, %o0 <== NOT EXECUTED 40004910: 92 10 20 01 mov 1, %o1 <== NOT EXECUTED } /* * Back up over the tab */ while (tty->column > col) { 40004914: 80 a0 40 18 cmp %g1, %i0 <== NOT EXECUTED 40004918: 14 bf ff f7 bg 400048f4 <== NOT EXECUTED 4000491c: 94 10 00 10 mov %l0, %o2 <== NOT EXECUTED if (tty->column) tty->column--; } } } if (!lineFlag) 40004920: 10 80 00 28 b 400049c0 <== NOT EXECUTED 40004924: 80 a6 60 00 cmp %i1, 0 <== NOT EXECUTED rtems_termios_puts ("\b", 1, tty); tty->column--; } } else { if (iscntrl (c) && (tty->termios.c_lflag & ECHOCTL)) { 40004928: b0 08 a0 ff and %g2, 0xff, %i0 <== NOT EXECUTED 4000492c: c2 08 40 18 ldub [ %g1 + %i0 ], %g1 <== NOT EXECUTED 40004930: 80 88 60 20 btst 0x20, %g1 <== NOT EXECUTED 40004934: 02 80 00 10 be 40004974 <== NOT EXECUTED 40004938: c2 04 63 68 ld [ %l1 + 0x368 ], %g1 <== NOT EXECUTED 4000493c: 80 88 e2 00 btst 0x200, %g3 <== NOT EXECUTED 40004940: 22 80 00 0e be,a 40004978 <== NOT EXECUTED 40004944: c2 08 40 18 ldub [ %g1 + %i0 ], %g1 <== NOT EXECUTED rtems_termios_puts ("\b \b", 3, tty); 40004948: 90 10 00 12 mov %l2, %o0 <== NOT EXECUTED 4000494c: 92 10 20 03 mov 3, %o1 <== NOT EXECUTED 40004950: 7f ff fe cd call 40004484 <== NOT EXECUTED 40004954: 94 10 00 10 mov %l0, %o2 <== NOT EXECUTED if (tty->column) 40004958: c2 04 20 28 ld [ %l0 + 0x28 ], %g1 <== NOT EXECUTED 4000495c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40004960: 22 80 00 05 be,a 40004974 <== NOT EXECUTED 40004964: c2 04 63 68 ld [ %l1 + 0x368 ], %g1 <== NOT EXECUTED tty->column--; 40004968: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 4000496c: c2 24 20 28 st %g1, [ %l0 + 0x28 ] <== NOT EXECUTED } if (!iscntrl (c) || (tty->termios.c_lflag & ECHOCTL)) { 40004970: c2 04 63 68 ld [ %l1 + 0x368 ], %g1 <== NOT EXECUTED 40004974: c2 08 40 18 ldub [ %g1 + %i0 ], %g1 <== NOT EXECUTED 40004978: 80 88 60 20 btst 0x20, %g1 <== NOT EXECUTED 4000497c: 02 80 00 07 be 40004998 <== NOT EXECUTED 40004980: 90 10 00 12 mov %l2, %o0 <== NOT EXECUTED 40004984: c2 04 20 3c ld [ %l0 + 0x3c ], %g1 <== NOT EXECUTED 40004988: 80 88 62 00 btst 0x200, %g1 <== NOT EXECUTED 4000498c: 02 80 00 0d be 400049c0 <== NOT EXECUTED 40004990: 80 a6 60 00 cmp %i1, 0 <== NOT EXECUTED rtems_termios_puts ("\b \b", 3, tty); 40004994: 90 10 00 12 mov %l2, %o0 <== NOT EXECUTED 40004998: 92 10 20 03 mov 3, %o1 <== NOT EXECUTED 4000499c: 7f ff fe ba call 40004484 <== NOT EXECUTED 400049a0: 94 10 00 10 mov %l0, %o2 <== NOT EXECUTED if (tty->column) 400049a4: c2 04 20 28 ld [ %l0 + 0x28 ], %g1 <== NOT EXECUTED 400049a8: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400049ac: 02 80 00 05 be 400049c0 <== NOT EXECUTED 400049b0: 80 a6 60 00 cmp %i1, 0 <== NOT EXECUTED tty->column--; 400049b4: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 400049b8: c2 24 20 28 st %g1, [ %l0 + 0x28 ] <== NOT EXECUTED } } } if (!lineFlag) 400049bc: 80 a6 60 00 cmp %i1, 0 <== NOT EXECUTED 400049c0: 02 80 00 0c be 400049f0 <== NOT EXECUTED 400049c4: 01 00 00 00 nop <== NOT EXECUTED if (tty->termios.c_lflag & ECHOK) echo ('\n', tty); return; } } while (tty->ccount) { 400049c8: 10 80 00 07 b 400049e4 <== NOT EXECUTED 400049cc: c8 04 20 20 ld [ %l0 + 0x20 ], %g4 <== NOT EXECUTED 400049d0: 23 10 00 68 sethi %hi(0x4001a000), %l1 <== NOT EXECUTED rtems_termios_puts ("\b \b", 3, tty); if (tty->column) tty->column--; } if (!iscntrl (c) || (tty->termios.c_lflag & ECHOCTL)) { rtems_termios_puts ("\b \b", 3, tty); 400049d4: a4 10 62 a0 or %g1, 0x2a0, %l2 <== NOT EXECUTED /* * Back up over the tab */ while (tty->column > col) { rtems_termios_puts ("\b", 1, tty); 400049d8: 03 10 00 63 sethi %hi(0x40018c00), %g1 <== NOT EXECUTED 400049dc: a6 10 62 98 or %g1, 0x298, %l3 ! 40018e98 <== NOT EXECUTED if (tty->termios.c_lflag & ECHOK) echo ('\n', tty); return; } } while (tty->ccount) { 400049e0: c8 04 20 20 ld [ %l0 + 0x20 ], %g4 <== NOT EXECUTED 400049e4: 80 a1 20 00 cmp %g4, 0 <== NOT EXECUTED 400049e8: 32 bf ff 92 bne,a 40004830 <== NOT EXECUTED 400049ec: c4 04 20 1c ld [ %l0 + 0x1c ], %g2 <== NOT EXECUTED 400049f0: 81 c7 e0 08 ret <== NOT EXECUTED 400049f4: 81 e8 00 00 restore <== NOT EXECUTED 40021324 : int fcntl( int fd, int cmd, ... ) { 40021324: 9d e3 bf 90 save %sp, -112, %sp int fd2; int flags; int mask; int ret = 0; rtems_libio_check_fd( fd ); 40021328: 03 10 00 e4 sethi %hi(0x40039000), %g1 4002132c: da 00 62 ac ld [ %g1 + 0x2ac ], %o5 ! 400392ac ... ) { int ret; va_list ap; va_start( ap, cmd ); 40021330: 86 07 a0 4c add %fp, 0x4c, %g3 int fcntl( int fd, int cmd, ... ) { 40021334: f4 27 a0 4c st %i2, [ %fp + 0x4c ] 40021338: f6 27 a0 50 st %i3, [ %fp + 0x50 ] 4002133c: f8 27 a0 54 st %i4, [ %fp + 0x54 ] 40021340: fa 27 a0 58 st %i5, [ %fp + 0x58 ] int fd2; int flags; int mask; int ret = 0; rtems_libio_check_fd( fd ); 40021344: 80 a6 00 0d cmp %i0, %o5 40021348: 1a 80 00 0e bcc 40021380 4002134c: c6 27 bf f4 st %g3, [ %fp + -12 ] iop = rtems_libio_iop( fd ); 40021350: 03 10 00 ef sethi %hi(0x4003bc00), %g1 40021354: c8 00 61 44 ld [ %g1 + 0x144 ], %g4 ! 4003bd44 40021358: 85 2e 20 02 sll %i0, 2, %g2 4002135c: 83 2e 20 04 sll %i0, 4, %g1 40021360: 82 20 40 02 sub %g1, %g2, %g1 40021364: 82 00 40 18 add %g1, %i0, %g1 40021368: 83 28 60 02 sll %g1, 2, %g1 4002136c: b0 01 00 01 add %g4, %g1, %i0 rtems_libio_check_is_open(iop); 40021370: d0 06 20 0c ld [ %i0 + 0xc ], %o0 40021374: 80 8a 21 00 btst 0x100, %o0 40021378: 12 80 00 07 bne 40021394 4002137c: 80 a6 60 09 cmp %i1, 9 40021380: 40 00 09 83 call 4002398c <__errno> <== NOT EXECUTED 40021384: b8 10 3f ff mov -1, %i4 <== NOT EXECUTED 40021388: 82 10 20 09 mov 9, %g1 <== NOT EXECUTED 4002138c: 10 80 00 68 b 4002152c <== NOT EXECUTED 40021390: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED /* * This switch should contain all the cases from POSIX. */ switch ( cmd ) { 40021394: 18 80 00 50 bgu 400214d4 40021398: 83 2e 60 02 sll %i1, 2, %g1 4002139c: 05 10 00 84 sethi %hi(0x40021000), %g2 400213a0: 84 10 a2 fc or %g2, 0x2fc, %g2 ! 400212fc 400213a4: c2 00 80 01 ld [ %g2 + %g1 ], %g1 400213a8: 81 c0 40 00 jmp %g1 400213ac: 01 00 00 00 nop case F_DUPFD: /* dup */ fd2 = va_arg( ap, int ); 400213b0: d0 00 c0 00 ld [ %g3 ], %o0 if ( fd2 ) 400213b4: 80 a2 20 00 cmp %o0, 0 400213b8: 02 80 00 0b be 400213e4 400213bc: 80 a2 00 0d cmp %o0, %o5 diop = rtems_libio_iop( fd2 ); 400213c0: 1a 80 00 0e bcc 400213f8 <== NOT EXECUTED 400213c4: ba 10 20 00 clr %i5 <== NOT EXECUTED 400213c8: 85 2a 20 02 sll %o0, 2, %g2 <== NOT EXECUTED 400213cc: 83 2a 20 04 sll %o0, 4, %g1 <== NOT EXECUTED 400213d0: 82 20 40 02 sub %g1, %g2, %g1 <== NOT EXECUTED 400213d4: 82 00 40 08 add %g1, %o0, %g1 <== NOT EXECUTED 400213d8: 83 28 60 02 sll %g1, 2, %g1 <== NOT EXECUTED 400213dc: 10 80 00 07 b 400213f8 <== NOT EXECUTED 400213e0: ba 01 00 01 add %g4, %g1, %i5 <== NOT EXECUTED else { /* allocate a file control block */ diop = rtems_libio_allocate(); 400213e4: 7f ff 92 de call 40005f5c 400213e8: 01 00 00 00 nop if ( diop == 0 ) { 400213ec: ba 92 20 00 orcc %o0, 0, %i5 400213f0: 22 80 00 4f be,a 4002152c 400213f4: b8 10 3f ff mov -1, %i4 <== NOT EXECUTED ret = -1; break; } } diop->handlers = iop->handlers; 400213f8: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 diop->file_info = iop->file_info; 400213fc: c4 06 20 2c ld [ %i0 + 0x2c ], %g2 diop->flags = iop->flags; 40021400: c6 06 20 0c ld [ %i0 + 0xc ], %g3 ret = -1; break; } } diop->handlers = iop->handlers; 40021404: c2 27 60 30 st %g1, [ %i5 + 0x30 ] diop->file_info = iop->file_info; 40021408: c4 27 60 2c st %g2, [ %i5 + 0x2c ] diop->flags = iop->flags; 4002140c: c6 27 60 0c st %g3, [ %i5 + 0xc ] diop->pathinfo = iop->pathinfo; 40021410: 90 07 60 10 add %i5, 0x10, %o0 40021414: 92 06 20 10 add %i0, 0x10, %o1 40021418: 40 00 10 11 call 4002545c 4002141c: 94 10 20 10 mov 0x10, %o2 ret = (int) (diop - rtems_libio_iops); 40021420: 03 10 00 ef sethi %hi(0x4003bc00), %g1 40021424: c6 00 61 44 ld [ %g1 + 0x144 ], %g3 ! 4003bd44 40021428: 86 27 40 03 sub %i5, %g3, %g3 4002142c: 87 38 e0 02 sra %g3, 2, %g3 40021430: 83 28 e0 02 sll %g3, 2, %g1 40021434: 85 28 e0 06 sll %g3, 6, %g2 40021438: 84 20 80 01 sub %g2, %g1, %g2 4002143c: 83 28 a0 06 sll %g2, 6, %g1 40021440: 82 20 40 02 sub %g1, %g2, %g1 40021444: 85 28 60 0c sll %g1, 0xc, %g2 40021448: 82 00 40 02 add %g1, %g2, %g1 4002144c: 82 00 40 03 add %g1, %g3, %g1 40021450: 83 28 60 04 sll %g1, 4, %g1 40021454: 82 20 40 03 sub %g1, %g3, %g1 40021458: 83 28 60 02 sll %g1, 2, %g1 4002145c: 10 80 00 23 b 400214e8 40021460: b8 20 c0 01 sub %g3, %g1, %i4 break; case F_GETFD: /* get f_flags */ ret = ((iop->flags & LIBIO_FLAGS_CLOSE_ON_EXEC) != 0); 40021464: 83 32 20 0b srl %o0, 0xb, %g1 40021468: 10 80 00 23 b 400214f4 4002146c: b8 08 60 01 and %g1, 1, %i4 * 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 ) ) 40021470: c2 00 c0 00 ld [ %g3 ], %g1 40021474: 80 a0 60 00 cmp %g1, 0 40021478: 22 80 00 03 be,a 40021484 4002147c: 82 0a 37 ff and %o0, -2049, %g1 <== NOT EXECUTED 40021480: 82 12 28 00 or %o0, 0x800, %g1 iop->flags |= LIBIO_FLAGS_CLOSE_ON_EXEC; else iop->flags &= ~LIBIO_FLAGS_CLOSE_ON_EXEC; 40021484: c2 26 20 0c st %g1, [ %i0 + 0xc ] 40021488: 10 80 00 1b b 400214f4 4002148c: b8 10 20 00 clr %i4 break; case F_GETFL: /* more flags (cloexec) */ ret = rtems_libio_to_fcntl_flags( iop->flags ); 40021490: 7f ff 92 48 call 40005db0 40021494: 01 00 00 00 nop 40021498: 10 80 00 14 b 400214e8 4002149c: b8 10 00 08 mov %o0, %i4 break; case F_SETFL: flags = rtems_libio_fcntl_flags( va_arg( ap, int ) ); 400214a0: d0 00 c0 00 ld [ %g3 ], %o0 400214a4: 7f ff 92 e4 call 40006034 400214a8: b8 10 20 00 clr %i4 /* * XXX If we are turning on append, should we seek to the end? */ iop->flags = (iop->flags & ~mask) | (flags & mask); 400214ac: c2 06 20 0c ld [ %i0 + 0xc ], %g1 400214b0: 90 0a 22 01 and %o0, 0x201, %o0 400214b4: 82 08 7d fe and %g1, -514, %g1 400214b8: 90 12 00 01 or %o0, %g1, %o0 400214bc: 10 80 00 0e b 400214f4 400214c0: d0 26 20 0c st %o0, [ %i0 + 0xc ] errno = ENOTSUP; ret = -1; break; case F_GETOWN: /* for sockets. */ errno = ENOTSUP; 400214c4: 40 00 09 32 call 4002398c <__errno> 400214c8: 01 00 00 00 nop 400214cc: 10 80 00 05 b 400214e0 400214d0: 82 10 20 86 mov 0x86, %g1 ! 86 ret = -1; break; default: errno = EINVAL; 400214d4: 40 00 09 2e call 4002398c <__errno> 400214d8: 01 00 00 00 nop 400214dc: 82 10 20 16 mov 0x16, %g1 ! 16 400214e0: 10 80 00 12 b 40021528 400214e4: c2 22 00 00 st %g1, [ %o0 ] /* * If we got this far successfully, then we give the optional * filesystem specific handler a chance to process this. */ if (ret >= 0) { 400214e8: 80 a7 20 00 cmp %i4, 0 400214ec: 06 80 00 10 bl 4002152c 400214f0: 01 00 00 00 nop if (iop->handlers->fcntl_h) { 400214f4: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 400214f8: c2 00 60 30 ld [ %g1 + 0x30 ], %g1 400214fc: 80 a0 60 00 cmp %g1, 0 40021500: 02 80 00 0b be 4002152c 40021504: 90 10 00 19 mov %i1, %o0 int err = (*iop->handlers->fcntl_h)( cmd, iop ); 40021508: 9f c0 40 00 call %g1 4002150c: 92 10 00 18 mov %i0, %o1 if (err) { 40021510: ba 92 20 00 orcc %o0, 0, %i5 40021514: 02 80 00 06 be 4002152c 40021518: 01 00 00 00 nop errno = err; 4002151c: 40 00 09 1c call 4002398c <__errno> <== NOT EXECUTED 40021520: 01 00 00 00 nop <== NOT EXECUTED 40021524: fa 22 00 00 st %i5, [ %o0 ] <== NOT EXECUTED { int ret; va_list ap; va_start( ap, cmd ); ret = vfcntl(fd,cmd,ap); va_end(ap); 40021528: b8 10 3f ff mov -1, %i4 return ret; } 4002152c: 81 c7 e0 08 ret 40021530: 91 e8 00 1c restore %g0, %i4, %o0 40004130 : long fpathconf( int fd, int name ) { 40004130: 9d e3 bf 98 save %sp, -104, %sp long return_value; rtems_libio_t *iop; rtems_filesystem_limits_and_options_t *the_limits; rtems_libio_check_fd(fd); 40004134: 03 10 00 60 sethi %hi(0x40018000), %g1 40004138: c2 00 61 cc ld [ %g1 + 0x1cc ], %g1 ! 400181cc 4000413c: 80 a6 00 01 cmp %i0, %g1 40004140: 1a 80 00 0d bcc 40004174 40004144: 85 2e 20 02 sll %i0, 2, %g2 iop = rtems_libio_iop(fd); 40004148: 03 10 00 64 sethi %hi(0x40019000), %g1 4000414c: c6 00 63 f4 ld [ %g1 + 0x3f4 ], %g3 ! 400193f4 40004150: 83 2e 20 04 sll %i0, 4, %g1 40004154: 82 20 40 02 sub %g1, %g2, %g1 40004158: 82 00 40 18 add %g1, %i0, %g1 4000415c: 83 28 60 02 sll %g1, 2, %g1 40004160: 82 00 40 03 add %g1, %g3, %g1 rtems_libio_check_is_open(iop); 40004164: c6 00 60 0c ld [ %g1 + 0xc ], %g3 40004168: 80 88 e1 00 btst 0x100, %g3 4000416c: 12 80 00 06 bne 40004184 40004170: 80 88 e0 02 btst 2, %g3 40004174: 40 00 35 75 call 40011748 <__errno> 40004178: 01 00 00 00 nop 4000417c: 10 80 00 07 b 40004198 40004180: 82 10 20 09 mov 9, %g1 ! 9 rtems_libio_check_permissions(iop, LIBIO_FLAGS_READ); 40004184: 12 80 00 08 bne 400041a4 40004188: 80 a6 60 0b cmp %i1, 0xb 4000418c: 40 00 35 6f call 40011748 <__errno> <== NOT EXECUTED 40004190: 01 00 00 00 nop <== NOT EXECUTED 40004194: 82 10 20 16 mov 0x16, %g1 ! 16 <== NOT EXECUTED 40004198: c2 22 00 00 st %g1, [ %o0 ] 4000419c: 81 c7 e0 08 ret 400041a0: 91 e8 3f ff restore %g0, -1, %o0 * Now process the information request. */ the_limits = &iop->pathinfo.mt_entry->pathconf_limits_and_options; switch ( name ) { 400041a4: 18 80 00 2c bgu 40004254 400041a8: f0 00 60 1c ld [ %g1 + 0x1c ], %i0 400041ac: 83 2e 60 02 sll %i1, 2, %g1 400041b0: 05 10 00 10 sethi %hi(0x40004000), %g2 400041b4: 84 10 a1 00 or %g2, 0x100, %g2 ! 40004100 400041b8: c2 00 80 01 ld [ %g2 + %g1 ], %g1 400041bc: 81 c0 40 00 jmp %g1 400041c0: 01 00 00 00 nop case _PC_LINK_MAX: return_value = the_limits->link_max; 400041c4: f0 06 20 30 ld [ %i0 + 0x30 ], %i0 400041c8: 81 c7 e0 08 ret 400041cc: 81 e8 00 00 restore break; case _PC_MAX_CANON: return_value = the_limits->max_canon; 400041d0: f0 06 20 34 ld [ %i0 + 0x34 ], %i0 400041d4: 81 c7 e0 08 ret 400041d8: 81 e8 00 00 restore break; case _PC_MAX_INPUT: return_value = the_limits->max_input; 400041dc: f0 06 20 38 ld [ %i0 + 0x38 ], %i0 400041e0: 81 c7 e0 08 ret 400041e4: 81 e8 00 00 restore break; case _PC_NAME_MAX: return_value = the_limits->name_max; 400041e8: f0 06 20 3c ld [ %i0 + 0x3c ], %i0 400041ec: 81 c7 e0 08 ret 400041f0: 81 e8 00 00 restore break; case _PC_PATH_MAX: return_value = the_limits->path_max; 400041f4: f0 06 20 40 ld [ %i0 + 0x40 ], %i0 400041f8: 81 c7 e0 08 ret 400041fc: 81 e8 00 00 restore break; case _PC_PIPE_BUF: return_value = the_limits->pipe_buf; 40004200: f0 06 20 44 ld [ %i0 + 0x44 ], %i0 40004204: 81 c7 e0 08 ret 40004208: 81 e8 00 00 restore break; case _PC_CHOWN_RESTRICTED: return_value = the_limits->posix_chown_restrictions; 4000420c: f0 06 20 4c ld [ %i0 + 0x4c ], %i0 40004210: 81 c7 e0 08 ret 40004214: 81 e8 00 00 restore break; case _PC_NO_TRUNC: return_value = the_limits->posix_no_trunc; 40004218: f0 06 20 50 ld [ %i0 + 0x50 ], %i0 4000421c: 81 c7 e0 08 ret 40004220: 81 e8 00 00 restore break; case _PC_VDISABLE: return_value = the_limits->posix_vdisable; 40004224: f0 06 20 5c ld [ %i0 + 0x5c ], %i0 40004228: 81 c7 e0 08 ret 4000422c: 81 e8 00 00 restore break; case _PC_ASYNC_IO: return_value = the_limits->posix_async_io; 40004230: f0 06 20 48 ld [ %i0 + 0x48 ], %i0 40004234: 81 c7 e0 08 ret 40004238: 81 e8 00 00 restore break; case _PC_PRIO_IO: return_value = the_limits->posix_prio_io; 4000423c: f0 06 20 54 ld [ %i0 + 0x54 ], %i0 40004240: 81 c7 e0 08 ret 40004244: 81 e8 00 00 restore break; case _PC_SYNC_IO: return_value = the_limits->posix_sync_io; 40004248: f0 06 20 58 ld [ %i0 + 0x58 ], %i0 4000424c: 81 c7 e0 08 ret 40004250: 81 e8 00 00 restore break; default: rtems_set_errno_and_return_minus_one( EINVAL ); 40004254: 40 00 35 3d call 40011748 <__errno> 40004258: b0 10 3f ff mov -1, %i0 4000425c: 82 10 20 16 mov 0x16, %g1 40004260: c2 22 00 00 st %g1, [ %o0 ] break; } return return_value; } 40004264: 81 c7 e0 08 ret 40004268: 81 e8 00 00 restore 4000304c : } void free( void *ptr ) { 4000304c: 9d e3 bf 98 save %sp, -104, %sp MSBUMP(free_calls, 1); if ( !ptr ) 40003050: 80 a6 20 00 cmp %i0, 0 40003054: 02 80 00 1f be 400030d0 40003058: 03 10 00 6b sethi %hi(0x4001ac00), %g1 /* * Do not attempt to free memory if in a critical section or ISR. */ if (_System_state_Is_up(_System_state_Get())) { 4000305c: c2 00 63 b0 ld [ %g1 + 0x3b0 ], %g1 ! 4001afb0 <_System_state_Current> 40003060: 80 a0 60 03 cmp %g1, 3 40003064: 12 80 00 0e bne 4000309c 40003068: 03 10 00 6b sethi %hi(0x4001ac00), %g1 if ((_Thread_Dispatch_disable_level > 0) || (_ISR_Nest_level > 0)) { 4000306c: c2 00 61 d0 ld [ %g1 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> 40003070: 80 a0 60 00 cmp %g1, 0 40003074: 12 80 00 06 bne 4000308c 40003078: 03 10 00 6b sethi %hi(0x4001ac00), %g1 4000307c: c2 00 62 94 ld [ %g1 + 0x294 ], %g1 ! 4001ae94 <_ISR_Nest_level> 40003080: 80 a0 60 00 cmp %g1, 0 40003084: 02 80 00 07 be 400030a0 40003088: 37 10 00 6b sethi %hi(0x4001ac00), %i3 Chain_Append(&RTEMS_Malloc_GC_list, (Chain_Node *)ptr); 4000308c: b2 10 00 18 mov %i0, %i1 40003090: 31 10 00 6b sethi %hi(0x4001ac00), %i0 40003094: 40 00 11 89 call 400076b8 <_Chain_Append> 40003098: 91 ee 20 70 restore %i0, 0x70, %o0 MSBUMP(lifetime_freed, size); } } #endif if ( !_Protected_heap_Free( &RTEMS_Malloc_Heap, ptr ) ) { 4000309c: 37 10 00 6b sethi %hi(0x4001ac00), %i3 <== NOT EXECUTED 400030a0: 92 10 00 18 mov %i0, %o1 400030a4: 40 00 17 7a call 40008e8c <_Protected_heap_Free> 400030a8: 90 16 e0 14 or %i3, 0x14, %o0 400030ac: 80 a2 20 00 cmp %o0, 0 400030b0: 12 80 00 08 bne 400030d0 400030b4: 82 16 e0 14 or %i3, 0x14, %g1 printk( "Program heap: free of bad pointer %p -- range %p - %p \n", 400030b8: f6 00 60 1c ld [ %g1 + 0x1c ], %i3 <== NOT EXECUTED 400030bc: f4 00 60 18 ld [ %g1 + 0x18 ], %i2 <== NOT EXECUTED 400030c0: b2 10 00 18 mov %i0, %i1 <== NOT EXECUTED 400030c4: 31 10 00 63 sethi %hi(0x40018c00), %i0 <== NOT EXECUTED 400030c8: 40 00 03 60 call 40003e48 <== NOT EXECUTED 400030cc: 91 ee 22 28 restore %i0, 0x228, %o0 <== NOT EXECUTED 400030d0: 81 c7 e0 08 ret 400030d4: 81 e8 00 00 restore 400182bc : * NOTE: this must be called with * thread dispatching disabled! */ static void free_user_env(void *venv) { 400182bc: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED rtems_user_env_t *env = (rtems_user_env_t*) venv ; if (env != &rtems_global_user_env 400182c0: 03 10 00 f1 sethi %hi(0x4003c400), %g1 <== NOT EXECUTED 400182c4: 82 10 61 a4 or %g1, 0x1a4, %g1 ! 4003c5a4 <== NOT EXECUTED 400182c8: 80 a6 00 01 cmp %i0, %g1 <== NOT EXECUTED 400182cc: 02 80 00 18 be 4001832c <== NOT EXECUTED 400182d0: 01 00 00 00 nop <== NOT EXECUTED #ifdef HAVE_USERENV_REFCNT && --env->refcnt <= 0 #endif ) { rtems_filesystem_freenode( &env->current_directory); 400182d4: c2 06 20 0c ld [ %i0 + 0xc ], %g1 <== NOT EXECUTED 400182d8: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400182dc: 22 80 00 09 be,a 40018300 <== NOT EXECUTED 400182e0: c2 06 20 1c ld [ %i0 + 0x1c ], %g1 <== NOT EXECUTED 400182e4: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 <== NOT EXECUTED 400182e8: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400182ec: 22 80 00 05 be,a 40018300 <== NOT EXECUTED 400182f0: c2 06 20 1c ld [ %i0 + 0x1c ], %g1 <== NOT EXECUTED 400182f4: 9f c0 40 00 call %g1 <== NOT EXECUTED 400182f8: 90 06 20 04 add %i0, 4, %o0 <== NOT EXECUTED rtems_filesystem_freenode( &env->root_directory); 400182fc: c2 06 20 1c ld [ %i0 + 0x1c ], %g1 <== NOT EXECUTED 40018300: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40018304: 02 80 00 08 be 40018324 <== NOT EXECUTED 40018308: 01 00 00 00 nop <== NOT EXECUTED 4001830c: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 <== NOT EXECUTED 40018310: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40018314: 02 80 00 04 be 40018324 <== NOT EXECUTED 40018318: 01 00 00 00 nop <== NOT EXECUTED 4001831c: 9f c0 40 00 call %g1 <== NOT EXECUTED 40018320: 90 06 20 14 add %i0, 0x14, %o0 <== NOT EXECUTED free(env); 40018324: 7f ff b7 5d call 40006098 <== NOT EXECUTED 40018328: 81 e8 00 00 restore <== NOT EXECUTED 4001832c: 81 c7 e0 08 ret <== NOT EXECUTED 40018330: 81 e8 00 00 restore <== NOT EXECUTED 40018280 : int fstat( int fd, struct stat *sbuf ) { 40018280: 9d e3 bf 98 save %sp, -104, %sp /* * Check to see if we were passed a valid pointer. */ if ( !sbuf ) 40018284: 80 a6 60 00 cmp %i1, 0 40018288: 32 80 00 06 bne,a 400182a0 4001828c: 03 10 00 66 sethi %hi(0x40019800), %g1 rtems_set_errno_and_return_minus_one( EFAULT ); 40018290: 7f ff db 4b call 4000efbc <__errno> 40018294: 01 00 00 00 nop 40018298: 10 80 00 2a b 40018340 4001829c: 82 10 20 0e mov 0xe, %g1 ! e /* * Now process the stat() request. */ iop = rtems_libio_iop( fd ); 400182a0: c2 00 62 1c ld [ %g1 + 0x21c ], %g1 400182a4: 80 a6 00 01 cmp %i0, %g1 400182a8: 1a 80 00 23 bcc 40018334 400182ac: 03 10 00 6b sethi %hi(0x4001ac00), %g1 400182b0: c6 00 60 08 ld [ %g1 + 8 ], %g3 ! 4001ac08 400182b4: 85 2e 20 02 sll %i0, 2, %g2 400182b8: 83 2e 20 04 sll %i0, 4, %g1 400182bc: 82 20 40 02 sub %g1, %g2, %g1 400182c0: 82 00 40 18 add %g1, %i0, %g1 400182c4: 83 28 60 02 sll %g1, 2, %g1 400182c8: b0 00 40 03 add %g1, %g3, %i0 rtems_libio_check_fd( fd ); rtems_libio_check_is_open(iop); 400182cc: c2 06 20 0c ld [ %i0 + 0xc ], %g1 400182d0: 80 88 61 00 btst 0x100, %g1 400182d4: 02 80 00 18 be 40018334 400182d8: 01 00 00 00 nop if ( !iop->handlers ) 400182dc: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 400182e0: 80 a0 60 00 cmp %g1, 0 400182e4: 02 80 00 14 be 40018334 400182e8: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( EBADF ); if ( !iop->handlers->fstat_h ) 400182ec: c2 00 60 18 ld [ %g1 + 0x18 ], %g1 400182f0: 80 a0 60 00 cmp %g1, 0 400182f4: 12 80 00 06 bne 4001830c 400182f8: 92 10 20 00 clr %o1 rtems_set_errno_and_return_minus_one( ENOTSUP ); 400182fc: 7f ff db 30 call 4000efbc <__errno> <== NOT EXECUTED 40018300: 01 00 00 00 nop <== NOT EXECUTED 40018304: 10 80 00 0f b 40018340 <== NOT EXECUTED 40018308: 82 10 20 86 mov 0x86, %g1 ! 86 <== NOT EXECUTED /* * Zero out the stat structure so the various support * versions of stat don't have to. */ memset( sbuf, 0, sizeof(struct stat) ); 4001830c: 94 10 20 50 mov 0x50, %o2 40018310: 7f ff dd 2d call 4000f7c4 40018314: 90 10 00 19 mov %i1, %o0 return (*iop->handlers->fstat_h)( &iop->pathinfo, sbuf ); 40018318: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 4001831c: 90 06 20 10 add %i0, 0x10, %o0 40018320: c2 00 60 18 ld [ %g1 + 0x18 ], %g1 40018324: 9f c0 40 00 call %g1 40018328: 92 10 00 19 mov %i1, %o1 } 4001832c: 81 c7 e0 08 ret 40018330: 91 e8 00 08 restore %g0, %o0, %o0 /* * Now process the stat() request. */ iop = rtems_libio_iop( fd ); rtems_libio_check_fd( fd ); 40018334: 7f ff db 22 call 4000efbc <__errno> 40018338: 01 00 00 00 nop 4001833c: 82 10 20 09 mov 9, %g1 ! 9 40018340: c2 22 00 00 st %g1, [ %o0 ] 40018344: 90 10 3f ff mov -1, %o0 * versions of stat don't have to. */ memset( sbuf, 0, sizeof(struct stat) ); return (*iop->handlers->fstat_h)( &iop->pathinfo, sbuf ); } 40018348: b0 10 00 08 mov %o0, %i0 4001834c: 81 c7 e0 08 ret 40018350: 81 e8 00 00 restore 40004358 : #include int fsync( int fd ) { 40004358: 9d e3 bf 98 save %sp, -104, %sp rtems_libio_t *iop; rtems_libio_check_fd( fd ); 4000435c: 03 10 00 60 sethi %hi(0x40018000), %g1 40004360: c2 00 61 cc ld [ %g1 + 0x1cc ], %g1 ! 400181cc 40004364: 80 a6 00 01 cmp %i0, %g1 40004368: 1a 80 00 16 bcc 400043c0 4000436c: 85 2e 20 02 sll %i0, 2, %g2 iop = rtems_libio_iop( fd ); 40004370: 03 10 00 64 sethi %hi(0x40019000), %g1 40004374: c6 00 63 f4 ld [ %g1 + 0x3f4 ], %g3 ! 400193f4 40004378: 83 2e 20 04 sll %i0, 4, %g1 4000437c: 82 20 40 02 sub %g1, %g2, %g1 40004380: 82 00 40 18 add %g1, %i0, %g1 40004384: 83 28 60 02 sll %g1, 2, %g1 40004388: 90 00 40 03 add %g1, %g3, %o0 rtems_libio_check_is_open(iop); 4000438c: c6 02 20 0c ld [ %o0 + 0xc ], %g3 40004390: 80 88 e1 00 btst 0x100, %g3 40004394: 02 80 00 0b be 400043c0 40004398: 80 88 e0 04 btst 4, %g3 rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE ); 4000439c: 32 80 00 06 bne,a 400043b4 400043a0: c6 02 20 30 ld [ %o0 + 0x30 ], %g3 400043a4: 40 00 34 e9 call 40011748 <__errno> 400043a8: 01 00 00 00 nop 400043ac: 10 80 00 0f b 400043e8 400043b0: 82 10 20 16 mov 0x16, %g1 ! 16 /* * Now process the fsync(). */ if ( !iop->handlers ) 400043b4: 80 a0 e0 00 cmp %g3, 0 400043b8: 32 80 00 06 bne,a 400043d0 400043bc: c2 00 e0 28 ld [ %g3 + 0x28 ], %g1 rtems_set_errno_and_return_minus_one( EBADF ); 400043c0: 40 00 34 e2 call 40011748 <__errno> <== NOT EXECUTED 400043c4: 01 00 00 00 nop <== NOT EXECUTED 400043c8: 10 80 00 08 b 400043e8 <== NOT EXECUTED 400043cc: 82 10 20 09 mov 9, %g1 ! 9 <== NOT EXECUTED if ( !iop->handlers->fsync_h ) 400043d0: 80 a0 60 00 cmp %g1, 0 400043d4: 12 80 00 08 bne 400043f4 400043d8: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( ENOTSUP ); 400043dc: 40 00 34 db call 40011748 <__errno> 400043e0: 01 00 00 00 nop 400043e4: 82 10 20 86 mov 0x86, %g1 ! 86 400043e8: c2 22 00 00 st %g1, [ %o0 ] 400043ec: 10 80 00 04 b 400043fc 400043f0: 90 10 3f ff mov -1, %o0 return (*iop->handlers->fsync_h)( iop ); 400043f4: 9f c0 40 00 call %g1 400043f8: 01 00 00 00 nop } 400043fc: 81 c7 e0 08 ret 40004400: 91 e8 00 08 restore %g0, %o0, %o0 4000c4e0 : int ftruncate( int fd, off_t length ) { 4000c4e0: 9d e3 bf 88 save %sp, -120, %sp rtems_libio_t *iop; rtems_filesystem_location_info_t loc; rtems_libio_check_fd( fd ); 4000c4e4: 03 10 00 66 sethi %hi(0x40019800), %g1 4000c4e8: c2 00 62 1c ld [ %g1 + 0x21c ], %g1 ! 40019a1c 4000c4ec: 80 a6 00 01 cmp %i0, %g1 4000c4f0: 1a 80 00 0d bcc 4000c524 4000c4f4: 85 2e 20 02 sll %i0, 2, %g2 iop = rtems_libio_iop( fd ); 4000c4f8: 03 10 00 6b sethi %hi(0x4001ac00), %g1 4000c4fc: c6 00 60 08 ld [ %g1 + 8 ], %g3 ! 4001ac08 4000c500: 83 2e 20 04 sll %i0, 4, %g1 4000c504: 82 20 40 02 sub %g1, %g2, %g1 4000c508: 82 00 40 18 add %g1, %i0, %g1 4000c50c: 83 28 60 02 sll %g1, 2, %g1 4000c510: b0 00 40 03 add %g1, %g3, %i0 rtems_libio_check_is_open(iop); 4000c514: c2 06 20 0c ld [ %i0 + 0xc ], %g1 4000c518: 80 88 61 00 btst 0x100, %g1 4000c51c: 12 80 00 06 bne 4000c534 4000c520: a0 07 bf e8 add %fp, -24, %l0 4000c524: 40 00 0a a6 call 4000efbc <__errno> <== NOT EXECUTED 4000c528: 01 00 00 00 nop <== NOT EXECUTED 4000c52c: 10 80 00 22 b 4000c5b4 <== NOT EXECUTED 4000c530: 82 10 20 09 mov 9, %g1 ! 9 <== NOT EXECUTED /* * Make sure we are not working on a directory */ loc = iop->pathinfo; 4000c534: 92 06 20 10 add %i0, 0x10, %o1 4000c538: 90 10 00 10 mov %l0, %o0 4000c53c: 40 00 0c 75 call 4000f710 4000c540: 94 10 20 10 mov 0x10, %o2 if ( !loc.ops->node_type_h ) 4000c544: c2 07 bf f0 ld [ %fp + -16 ], %g1 4000c548: c2 00 60 10 ld [ %g1 + 0x10 ], %g1 4000c54c: 80 a0 60 00 cmp %g1, 0 4000c550: 02 80 00 16 be 4000c5a8 4000c554: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( ENOTSUP ); if ( (*loc.ops->node_type_h)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) 4000c558: 9f c0 40 00 call %g1 4000c55c: 90 10 00 10 mov %l0, %o0 4000c560: 80 a2 20 01 cmp %o0, 1 4000c564: 32 80 00 06 bne,a 4000c57c 4000c568: c2 06 20 0c ld [ %i0 + 0xc ], %g1 rtems_set_errno_and_return_minus_one( EISDIR ); 4000c56c: 40 00 0a 94 call 4000efbc <__errno> <== NOT EXECUTED 4000c570: 01 00 00 00 nop <== NOT EXECUTED 4000c574: 10 80 00 10 b 4000c5b4 <== NOT EXECUTED 4000c578: 82 10 20 15 mov 0x15, %g1 ! 15 <== NOT EXECUTED rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE ); 4000c57c: 80 88 60 04 btst 4, %g1 4000c580: 32 80 00 06 bne,a 4000c598 4000c584: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 4000c588: 40 00 0a 8d call 4000efbc <__errno> <== NOT EXECUTED 4000c58c: 01 00 00 00 nop <== NOT EXECUTED 4000c590: 10 80 00 09 b 4000c5b4 <== NOT EXECUTED 4000c594: 82 10 20 16 mov 0x16, %g1 ! 16 <== NOT EXECUTED if ( !iop->handlers->ftruncate_h ) 4000c598: c2 00 60 20 ld [ %g1 + 0x20 ], %g1 4000c59c: 80 a0 60 00 cmp %g1, 0 4000c5a0: 32 80 00 08 bne,a 4000c5c0 4000c5a4: 90 10 00 18 mov %i0, %o0 rtems_set_errno_and_return_minus_one( ENOTSUP ); 4000c5a8: 40 00 0a 85 call 4000efbc <__errno> <== NOT EXECUTED 4000c5ac: 01 00 00 00 nop <== NOT EXECUTED 4000c5b0: 82 10 20 86 mov 0x86, %g1 ! 86 <== NOT EXECUTED 4000c5b4: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 4000c5b8: 10 80 00 04 b 4000c5c8 <== NOT EXECUTED 4000c5bc: 90 10 3f ff mov -1, %o0 <== NOT EXECUTED return (*iop->handlers->ftruncate_h)( iop, length ); 4000c5c0: 9f c0 40 00 call %g1 4000c5c4: 92 10 00 19 mov %i1, %o1 } 4000c5c8: 81 c7 e0 08 ret 4000c5cc: 91 e8 00 08 restore %g0, %o0, %o0 4001733c : char * getcwd (pt, size) char *pt; size_t size; { 4001733c: 9d e3 bf 30 save %sp, -208, %sp <== NOT EXECUTED * If no buffer specified by the user, allocate one as necessary. * If a buffer is specified, the size has to be non-zero. The path * is built from the end of the buffer backwards. */ if (pt) 40017340: 80 a6 20 00 cmp %i0, 0 <== NOT EXECUTED 40017344: 02 80 00 0b be 40017370 <== NOT EXECUTED 40017348: 80 a6 60 00 cmp %i1, 0 <== NOT EXECUTED if (!size) { errno = EINVAL; return (char *) NULL; } ept = pt + size; 4001734c: b6 10 20 00 clr %i3 <== NOT EXECUTED */ if (pt) { ptsize = 0; if (!size) 40017350: 12 80 00 0f bne 4001738c <== NOT EXECUTED 40017354: b2 06 00 19 add %i0, %i1, %i1 <== NOT EXECUTED { errno = EINVAL; 40017358: 40 00 31 8d call 4002398c <__errno> <== NOT EXECUTED 4001735c: b0 10 20 00 clr %i0 <== NOT EXECUTED 40017360: 82 10 20 16 mov 0x16, %g1 <== NOT EXECUTED 40017364: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 40017368: 81 c7 e0 08 ret <== NOT EXECUTED 4001736c: 81 e8 00 00 restore <== NOT EXECUTED } ept = pt + size; } else { if (!(pt = (char *) malloc (ptsize = 1024 - 4))) 40017370: 7f ff bb 72 call 40006138 <== NOT EXECUTED 40017374: 90 10 23 fc mov 0x3fc, %o0 <== NOT EXECUTED 40017378: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 4001737c: 02 bf ff fb be 40017368 <== NOT EXECUTED 40017380: b6 10 23 fc mov 0x3fc, %i3 <== NOT EXECUTED 40017384: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED { return (char *) NULL; } ept = pt + ptsize; 40017388: b2 02 23 fc add %o0, 0x3fc, %i1 <== NOT EXECUTED } bpt = ept - 1; *bpt = '\0'; 4001738c: c0 2e 7f ff clrb [ %i1 + -1 ] <== NOT EXECUTED * Allocate bytes (1024 - malloc space) for the string of "../"'s. * Should always be enough (it's 340 levels). If it's not, allocate * as necessary. Special * case the first stat, it's ".", not "..". */ if (!(up = (char *) malloc (upsize = 1024 - 4))) 40017390: 90 10 23 fc mov 0x3fc, %o0 <== NOT EXECUTED 40017394: 7f ff bb 69 call 40006138 <== NOT EXECUTED 40017398: ac 06 7f ff add %i1, -1, %l6 <== NOT EXECUTED 4001739c: a4 92 20 00 orcc %o0, 0, %l2 <== NOT EXECUTED 400173a0: 02 80 00 d7 be 400176fc <== NOT EXECUTED 400173a4: 82 10 20 2e mov 0x2e, %g1 <== NOT EXECUTED goto err; } eup = up + MAXPATHLEN; bup = up; up[0] = '.'; up[1] = '\0'; 400173a8: c0 2c a0 01 clrb [ %l2 + 1 ] <== NOT EXECUTED { goto err; } eup = up + MAXPATHLEN; bup = up; up[0] = '.'; 400173ac: c2 2c 80 00 stb %g1, [ %l2 ] <== NOT EXECUTED up[1] = '\0'; /* Save root values, so know when to stop. */ if (stat ("/", &s)) 400173b0: a0 07 bf a8 add %fp, -88, %l0 <== NOT EXECUTED 400173b4: 11 10 00 d7 sethi %hi(0x40035c00), %o0 <== NOT EXECUTED 400173b8: 92 10 00 10 mov %l0, %o1 <== NOT EXECUTED 400173bc: 7f ff bf ab call 40007268 <== NOT EXECUTED 400173c0: 90 12 22 58 or %o0, 0x258, %o0 <== NOT EXECUTED 400173c4: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400173c8: 12 80 00 ce bne 40017700 <== NOT EXECUTED 400173cc: 80 a6 e0 00 cmp %i3, 0 <== NOT EXECUTED goto err; root_dev = s.st_dev; 400173d0: c4 1f bf a8 ldd [ %fp + -88 ], %g2 <== NOT EXECUTED if (!(up = (char *) malloc (upsize = 1024 - 4))) { goto err; } eup = up + MAXPATHLEN; 400173d4: 82 04 a4 00 add %l2, 0x400, %g1 <== NOT EXECUTED up[1] = '\0'; /* Save root values, so know when to stop. */ if (stat ("/", &s)) goto err; root_dev = s.st_dev; 400173d8: c4 3f bf 98 std %g2, [ %fp + -104 ] <== NOT EXECUTED root_ino = s.st_ino; 400173dc: c6 07 bf b0 ld [ %fp + -80 ], %g3 <== NOT EXECUTED if (!(up = (char *) malloc (upsize = 1024 - 4))) { goto err; } eup = up + MAXPATHLEN; 400173e0: c2 27 bf a4 st %g1, [ %fp + -92 ] <== NOT EXECUTED if (stat ("/", &s)) goto err; root_dev = s.st_dev; root_ino = s.st_ino; errno = 0; /* XXX readdir has no error return. */ 400173e4: 40 00 31 6a call 4002398c <__errno> <== NOT EXECUTED 400173e8: c6 27 bf a0 st %g3, [ %fp + -96 ] <== NOT EXECUTED 400173ec: 84 10 20 01 mov 1, %g2 <== NOT EXECUTED 400173f0: c0 22 00 00 clr [ %o0 ] <== NOT EXECUTED 400173f4: a6 10 00 12 mov %l2, %l3 <== NOT EXECUTED 400173f8: c4 27 bf 94 st %g2, [ %fp + -108 ] <== NOT EXECUTED 400173fc: b4 10 23 fc mov 0x3fc, %i2 <== NOT EXECUTED for (first = 1;; first = 0) { /* Stat the current level. */ if (_stat (up, &s)) 40017400: 90 10 00 12 mov %l2, %o0 <== NOT EXECUTED 40017404: 7f ff bf 99 call 40007268 <== NOT EXECUTED 40017408: 92 07 bf a8 add %fp, -88, %o1 <== NOT EXECUTED 4001740c: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017410: 12 80 00 bb bne 400176fc <== NOT EXECUTED 40017414: e8 1f bf a8 ldd [ %fp + -88 ], %l4 <== NOT EXECUTED /* Save current node values. */ ino = s.st_ino; dev = s.st_dev; /* Check for reaching root. */ if (root_dev == dev && root_ino == ino) 40017418: c6 07 bf 98 ld [ %fp + -104 ], %g3 <== NOT EXECUTED 4001741c: 80 a0 c0 14 cmp %g3, %l4 <== NOT EXECUTED 40017420: 12 80 00 14 bne 40017470 <== NOT EXECUTED 40017424: f8 07 bf b0 ld [ %fp + -80 ], %i4 <== NOT EXECUTED 40017428: c2 07 bf 9c ld [ %fp + -100 ], %g1 <== NOT EXECUTED 4001742c: 80 a0 40 15 cmp %g1, %l5 <== NOT EXECUTED 40017430: 12 80 00 11 bne 40017474 <== NOT EXECUTED 40017434: c6 07 bf a4 ld [ %fp + -92 ], %g3 <== NOT EXECUTED 40017438: c4 07 bf a0 ld [ %fp + -96 ], %g2 <== NOT EXECUTED 4001743c: 80 a0 80 1c cmp %g2, %i4 <== NOT EXECUTED 40017440: 12 80 00 0e bne 40017478 <== NOT EXECUTED 40017444: 82 04 e4 04 add %l3, 0x404, %g1 <== NOT EXECUTED { *--bpt = '/'; 40017448: 82 10 20 2f mov 0x2f, %g1 <== NOT EXECUTED 4001744c: 92 05 bf ff add %l6, -1, %o1 <== NOT EXECUTED 40017450: c2 2d bf ff stb %g1, [ %l6 + -1 ] <== NOT EXECUTED /* * It's unclear that it's a requirement to copy the * path to the beginning of the buffer, but it's always * been that way and stuff would probably break. */ (void) bcopy (bpt, pt, ept - bpt); 40017454: 94 26 40 09 sub %i1, %o1, %o2 <== NOT EXECUTED 40017458: 40 00 38 2e call 40025510 <== NOT EXECUTED 4001745c: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED free (up); 40017460: 7f ff bb 0e call 40006098 <== NOT EXECUTED 40017464: 90 10 00 12 mov %l2, %o0 <== NOT EXECUTED 40017468: 81 c7 e0 08 ret <== NOT EXECUTED 4001746c: 81 e8 00 00 restore <== NOT EXECUTED * Build pointer to the parent directory, allocating memory * as necessary. Max length is 3 for "../", the largest * possible component name, plus a trailing NULL. */ if (bup + 3 + MAXNAMLEN + 1 >= eup) 40017470: c6 07 bf a4 ld [ %fp + -92 ], %g3 <== NOT EXECUTED 40017474: 82 04 e4 04 add %l3, 0x404, %g1 <== NOT EXECUTED 40017478: 80 a0 40 03 cmp %g1, %g3 <== NOT EXECUTED 4001747c: 0a 80 00 0c bcs 400174ac <== NOT EXECUTED 40017480: 82 10 20 2e mov 0x2e, %g1 <== NOT EXECUTED { if (!(up = (char *) realloc (up, upsize *= 2))) 40017484: 90 10 00 12 mov %l2, %o0 <== NOT EXECUTED 40017488: b5 2e a0 01 sll %i2, 1, %i2 <== NOT EXECUTED 4001748c: 7f ff bb 76 call 40006264 <== NOT EXECUTED 40017490: 92 10 00 1a mov %i2, %o1 <== NOT EXECUTED 40017494: a4 92 20 00 orcc %o0, 0, %l2 <== NOT EXECUTED 40017498: 02 80 00 99 be 400176fc <== NOT EXECUTED 4001749c: 82 04 80 1a add %l2, %i2, %g1 <== NOT EXECUTED { goto err; } bup = up; eup = up + upsize; 400174a0: a6 10 00 12 mov %l2, %l3 <== NOT EXECUTED 400174a4: c2 27 bf a4 st %g1, [ %fp + -92 ] <== NOT EXECUTED } *bup++ = '.'; 400174a8: 82 10 20 2e mov 0x2e, %g1 <== NOT EXECUTED *bup++ = '.'; *bup = '\0'; 400174ac: c0 2c e0 02 clrb [ %l3 + 2 ] <== NOT EXECUTED } bup = up; eup = up + upsize; } *bup++ = '.'; *bup++ = '.'; 400174b0: c2 2c e0 01 stb %g1, [ %l3 + 1 ] <== NOT EXECUTED goto err; } bup = up; eup = up + upsize; } *bup++ = '.'; 400174b4: c2 2c c0 00 stb %g1, [ %l3 ] <== NOT EXECUTED *bup++ = '.'; *bup = '\0'; /* Open and stat parent directory. */ if (!(dir = _opendir (up)) || _fstat (__dirfd (dir), &s)) 400174b8: 40 00 03 5c call 40018228 <== NOT EXECUTED 400174bc: 90 10 00 12 mov %l2, %o0 <== NOT EXECUTED 400174c0: ba 92 20 00 orcc %o0, 0, %i5 <== NOT EXECUTED 400174c4: 02 80 00 8f be 40017700 <== NOT EXECUTED 400174c8: 80 a6 e0 00 cmp %i3, 0 <== NOT EXECUTED 400174cc: d0 07 40 00 ld [ %i5 ], %o0 <== NOT EXECUTED 400174d0: 40 00 28 20 call 40021550 <== NOT EXECUTED 400174d4: 92 07 bf a8 add %fp, -88, %o1 <== NOT EXECUTED 400174d8: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400174dc: 12 80 00 92 bne 40017724 <== NOT EXECUTED 400174e0: 82 10 20 2f mov 0x2f, %g1 <== NOT EXECUTED goto err; /* Add trailing slash for next directory. */ *bup++ = '/'; 400174e4: c2 2c e0 02 stb %g1, [ %l3 + 2 ] <== NOT EXECUTED * the inode number in the directory is for the entry in the * parent directory, not the inode number of the mounted file. */ save_errno = 0; if (s.st_dev == dev) 400174e8: c2 07 bf a8 ld [ %fp + -88 ], %g1 <== NOT EXECUTED 400174ec: 80 a0 40 14 cmp %g1, %l4 <== NOT EXECUTED 400174f0: 12 80 00 06 bne 40017508 <== NOT EXECUTED 400174f4: a6 04 e0 03 add %l3, 3, %l3 <== NOT EXECUTED 400174f8: c2 07 bf ac ld [ %fp + -84 ], %g1 <== NOT EXECUTED 400174fc: 80 a0 40 15 cmp %g1, %l5 <== NOT EXECUTED 40017500: 02 80 00 04 be 40017510 <== NOT EXECUTED 40017504: 01 00 00 00 nop <== NOT EXECUTED 40017508: 10 80 00 0c b 40017538 <== NOT EXECUTED 4001750c: ae 10 20 00 clr %l7 ! 0 <== NOT EXECUTED { for (;;) { if (!(dp = _readdir (dir))) 40017510: 40 00 03 fc call 40018500 <== NOT EXECUTED 40017514: 90 10 00 1d mov %i5, %o0 <== NOT EXECUTED 40017518: a2 92 20 00 orcc %o0, 0, %l1 <== NOT EXECUTED 4001751c: 02 80 00 6b be 400176c8 <== NOT EXECUTED 40017520: ae 10 20 00 clr %l7 <== NOT EXECUTED goto notfound; if (dp->d_ino == ino) 40017524: c2 04 40 00 ld [ %l1 ], %g1 <== NOT EXECUTED 40017528: 80 a0 40 1c cmp %g1, %i4 <== NOT EXECUTED 4001752c: 02 80 00 36 be 40017604 <== NOT EXECUTED 40017530: a0 04 60 0c add %l1, 0xc, %l0 <== NOT EXECUTED 40017534: 30 bf ff f7 b,a 40017510 <== NOT EXECUTED } } else for (;;) { if (!(dp = _readdir (dir))) 40017538: 40 00 03 f2 call 40018500 <== NOT EXECUTED 4001753c: 90 10 00 1d mov %i5, %o0 <== NOT EXECUTED 40017540: a2 92 20 00 orcc %o0, 0, %l1 <== NOT EXECUTED 40017544: 02 80 00 61 be 400176c8 <== NOT EXECUTED 40017548: 01 00 00 00 nop <== NOT EXECUTED goto notfound; if (ISDOT (dp)) 4001754c: c2 4c 60 0c ldsb [ %l1 + 0xc ], %g1 <== NOT EXECUTED 40017550: 80 a0 60 2e cmp %g1, 0x2e <== NOT EXECUTED 40017554: 12 80 00 0d bne 40017588 <== NOT EXECUTED 40017558: a0 04 60 0c add %l1, 0xc, %l0 <== NOT EXECUTED 4001755c: c2 4c 60 0d ldsb [ %l1 + 0xd ], %g1 <== NOT EXECUTED 40017560: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40017564: 02 bf ff f5 be 40017538 <== NOT EXECUTED 40017568: 05 00 3f ff sethi %hi(0xfffc00), %g2 <== NOT EXECUTED 4001756c: c2 04 60 0c ld [ %l1 + 0xc ], %g1 <== NOT EXECUTED 40017570: 07 00 0b 80 sethi %hi(0x2e0000), %g3 <== NOT EXECUTED 40017574: 84 10 a3 00 or %g2, 0x300, %g2 <== NOT EXECUTED 40017578: 82 08 40 02 and %g1, %g2, %g1 <== NOT EXECUTED 4001757c: 80 a0 40 03 cmp %g1, %g3 <== NOT EXECUTED 40017580: 02 bf ff ee be 40017538 <== NOT EXECUTED 40017584: 01 00 00 00 nop <== NOT EXECUTED continue; bcopy (dp->d_name, bup, strlen (dp->d_name) + 1); 40017588: 40 00 45 f8 call 40028d68 <== NOT EXECUTED 4001758c: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 40017590: 92 10 00 10 mov %l0, %o1 <== NOT EXECUTED 40017594: 94 02 20 01 add %o0, 1, %o2 <== NOT EXECUTED 40017598: 40 00 37 de call 40025510 <== NOT EXECUTED 4001759c: 90 10 00 13 mov %l3, %o0 <== NOT EXECUTED /* Save the first error for later. */ if (stat (up, &s)) 400175a0: 90 10 00 12 mov %l2, %o0 <== NOT EXECUTED 400175a4: 7f ff bf 31 call 40007268 <== NOT EXECUTED 400175a8: 92 07 bf a8 add %fp, -88, %o1 <== NOT EXECUTED 400175ac: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400175b0: 02 80 00 0c be 400175e0 <== NOT EXECUTED 400175b4: c2 07 bf a8 ld [ %fp + -88 ], %g1 <== NOT EXECUTED { if (!save_errno) 400175b8: 80 a5 e0 00 cmp %l7, 0 <== NOT EXECUTED 400175bc: 12 80 00 05 bne 400175d0 <== NOT EXECUTED 400175c0: 01 00 00 00 nop <== NOT EXECUTED save_errno = errno; 400175c4: 40 00 30 f2 call 4002398c <__errno> <== NOT EXECUTED 400175c8: 01 00 00 00 nop <== NOT EXECUTED 400175cc: ee 02 00 00 ld [ %o0 ], %l7 <== NOT EXECUTED errno = 0; 400175d0: 40 00 30 ef call 4002398c <__errno> <== NOT EXECUTED 400175d4: 01 00 00 00 nop <== NOT EXECUTED 400175d8: 10 bf ff d8 b 40017538 <== NOT EXECUTED 400175dc: c0 22 00 00 clr [ %o0 ] <== NOT EXECUTED continue; } if (s.st_dev == dev && s.st_ino == ino) 400175e0: 80 a0 40 14 cmp %g1, %l4 <== NOT EXECUTED 400175e4: 12 bf ff d5 bne 40017538 <== NOT EXECUTED 400175e8: c2 07 bf ac ld [ %fp + -84 ], %g1 <== NOT EXECUTED 400175ec: 80 a0 40 15 cmp %g1, %l5 <== NOT EXECUTED 400175f0: 12 bf ff d2 bne 40017538 <== NOT EXECUTED 400175f4: c2 07 bf b0 ld [ %fp + -80 ], %g1 <== NOT EXECUTED 400175f8: 80 a0 40 1c cmp %g1, %i4 <== NOT EXECUTED 400175fc: 12 bf ff cf bne 40017538 <== NOT EXECUTED 40017600: a0 04 60 0c add %l1, 0xc, %l0 <== NOT EXECUTED /* * Check for length of the current name, preceding slash, * leading slash. */ if (bpt - pt <= strlen (dp->d_name) + (first ? 1 : 2)) 40017604: 40 00 45 d9 call 40028d68 <== NOT EXECUTED 40017608: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 4001760c: c2 07 bf 94 ld [ %fp + -108 ], %g1 <== NOT EXECUTED 40017610: a2 25 80 18 sub %l6, %i0, %l1 <== NOT EXECUTED 40017614: 80 a0 00 01 cmp %g0, %g1 <== NOT EXECUTED 40017618: 82 60 3f ff subx %g0, -1, %g1 <== NOT EXECUTED 4001761c: 82 00 60 01 inc %g1 <== NOT EXECUTED 40017620: 82 00 40 08 add %g1, %o0, %g1 <== NOT EXECUTED 40017624: 80 a4 40 01 cmp %l1, %g1 <== NOT EXECUTED 40017628: 18 80 00 17 bgu 40017684 <== NOT EXECUTED 4001762c: c4 07 bf 94 ld [ %fp + -108 ], %g2 <== NOT EXECUTED { size_t len, off; if (!ptsize) 40017630: 80 a6 e0 00 cmp %i3, 0 <== NOT EXECUTED 40017634: 32 80 00 07 bne,a 40017650 <== NOT EXECUTED 40017638: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED { errno = ERANGE; 4001763c: 40 00 30 d4 call 4002398c <__errno> <== NOT EXECUTED 40017640: 01 00 00 00 nop <== NOT EXECUTED 40017644: 82 10 20 22 mov 0x22, %g1 ! 22 <== NOT EXECUTED 40017648: 10 80 00 37 b 40017724 <== NOT EXECUTED 4001764c: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED goto err; } off = bpt - pt; len = ept - bpt; if (!(pt = (char *) realloc (pt, ptsize *= 2))) 40017650: b7 2e e0 01 sll %i3, 1, %i3 <== NOT EXECUTED 40017654: 7f ff bb 04 call 40006264 <== NOT EXECUTED 40017658: 92 10 00 1b mov %i3, %o1 <== NOT EXECUTED 4001765c: b0 92 20 00 orcc %o0, 0, %i0 <== NOT EXECUTED 40017660: 02 80 00 31 be 40017724 <== NOT EXECUTED 40017664: 82 26 40 16 sub %i1, %l6, %g1 <== NOT EXECUTED { goto err; } bpt = pt + off; ept = pt + ptsize; (void) bcopy (bpt, ept - len, len); 40017668: 92 06 00 11 add %i0, %l1, %o1 <== NOT EXECUTED if (!(pt = (char *) realloc (pt, ptsize *= 2))) { goto err; } bpt = pt + off; ept = pt + ptsize; 4001766c: b2 06 00 1b add %i0, %i3, %i1 <== NOT EXECUTED (void) bcopy (bpt, ept - len, len); 40017670: 94 10 00 01 mov %g1, %o2 <== NOT EXECUTED 40017674: ac 26 40 01 sub %i1, %g1, %l6 <== NOT EXECUTED 40017678: 40 00 37 a6 call 40025510 <== NOT EXECUTED 4001767c: 90 10 00 16 mov %l6, %o0 <== NOT EXECUTED bpt = ept - len; } if (!first) 40017680: c4 07 bf 94 ld [ %fp + -108 ], %g2 <== NOT EXECUTED 40017684: 80 a0 a0 00 cmp %g2, 0 <== NOT EXECUTED 40017688: 12 80 00 04 bne 40017698 <== NOT EXECUTED 4001768c: 82 10 20 2f mov 0x2f, %g1 <== NOT EXECUTED *--bpt = '/'; 40017690: ac 05 bf ff add %l6, -1, %l6 <== NOT EXECUTED 40017694: c2 2d 80 00 stb %g1, [ %l6 ] <== NOT EXECUTED bpt -= strlen (dp->d_name); 40017698: 40 00 45 b4 call 40028d68 <== NOT EXECUTED 4001769c: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED bcopy (dp->d_name, bpt, strlen (dp->d_name)); 400176a0: 92 10 00 10 mov %l0, %o1 <== NOT EXECUTED 400176a4: 94 10 00 08 mov %o0, %o2 <== NOT EXECUTED (void) bcopy (bpt, ept - len, len); bpt = ept - len; } if (!first) *--bpt = '/'; bpt -= strlen (dp->d_name); 400176a8: ac 25 80 08 sub %l6, %o0, %l6 <== NOT EXECUTED bcopy (dp->d_name, bpt, strlen (dp->d_name)); (void) _closedir (dir); dir = 0; /* Truncate any file name. */ *bup = '\0'; 400176ac: c0 27 bf 94 clr [ %fp + -108 ] <== NOT EXECUTED bpt = ept - len; } if (!first) *--bpt = '/'; bpt -= strlen (dp->d_name); bcopy (dp->d_name, bpt, strlen (dp->d_name)); 400176b0: 40 00 37 98 call 40025510 <== NOT EXECUTED 400176b4: 90 10 00 16 mov %l6, %o0 <== NOT EXECUTED (void) _closedir (dir); 400176b8: 7f ff fe 46 call 40016fd0 <== NOT EXECUTED 400176bc: 90 10 00 1d mov %i5, %o0 <== NOT EXECUTED dir = 0; /* Truncate any file name. */ *bup = '\0'; 400176c0: 10 bf ff 50 b 40017400 <== NOT EXECUTED 400176c4: c0 2c c0 00 clrb [ %l3 ] <== NOT EXECUTED * If readdir set errno, use it, not any saved error; otherwise, * didn't find the current directory in its parent directory, set * errno to ENOENT. */ if (!errno) 400176c8: 40 00 30 b1 call 4002398c <__errno> <== NOT EXECUTED 400176cc: 01 00 00 00 nop <== NOT EXECUTED 400176d0: c2 02 00 00 ld [ %o0 ], %g1 <== NOT EXECUTED 400176d4: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400176d8: 12 80 00 13 bne 40017724 <== NOT EXECUTED 400176dc: 01 00 00 00 nop <== NOT EXECUTED errno = save_errno ? save_errno : ENOENT; 400176e0: 40 00 30 ab call 4002398c <__errno> <== NOT EXECUTED 400176e4: 01 00 00 00 nop <== NOT EXECUTED 400176e8: 80 a5 e0 00 cmp %l7, 0 <== NOT EXECUTED 400176ec: 22 80 00 02 be,a 400176f4 <== NOT EXECUTED 400176f0: ae 10 20 02 mov 2, %l7 <== NOT EXECUTED 400176f4: 10 80 00 0c b 40017724 <== NOT EXECUTED 400176f8: ee 22 00 00 st %l7, [ %o0 ] <== NOT EXECUTED /* FALLTHROUGH */ err: if(dir) (void) _closedir (dir); if (ptsize) 400176fc: 80 a6 e0 00 cmp %i3, 0 <== NOT EXECUTED 40017700: 02 80 00 05 be 40017714 <== NOT EXECUTED 40017704: 90 10 00 12 mov %l2, %o0 <== NOT EXECUTED free (pt); 40017708: 7f ff ba 64 call 40006098 <== NOT EXECUTED 4001770c: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED free (up); 40017710: 90 10 00 12 mov %l2, %o0 <== NOT EXECUTED 40017714: 7f ff ba 61 call 40006098 <== NOT EXECUTED 40017718: b0 10 20 00 clr %i0 <== NOT EXECUTED 4001771c: 81 c7 e0 08 ret <== NOT EXECUTED 40017720: 81 e8 00 00 restore <== NOT EXECUTED errno = save_errno ? save_errno : ENOENT; /* FALLTHROUGH */ err: if(dir) (void) _closedir (dir); 40017724: 7f ff fe 2b call 40016fd0 <== NOT EXECUTED 40017728: 90 10 00 1d mov %i5, %o0 <== NOT EXECUTED if (ptsize) 4001772c: 10 bf ff f5 b 40017700 <== NOT EXECUTED 40017730: 80 a6 e0 00 cmp %i3, 0 <== NOT EXECUTED 4002163c : int getdents( int dd_fd, char *dd_buf, int dd_len ) { 4002163c: 9d e3 bf 88 save %sp, -120, %sp /* * Get the file control block structure associated with the file descriptor */ iop = rtems_libio_iop( dd_fd ); 40021640: 03 10 00 e4 sethi %hi(0x40039000), %g1 40021644: c2 00 62 ac ld [ %g1 + 0x2ac ], %g1 ! 400392ac 40021648: 80 a6 00 01 cmp %i0, %g1 4002164c: 1a 80 00 0a bcc 40021674 40021650: a0 10 20 00 clr %l0 40021654: 03 10 00 ef sethi %hi(0x4003bc00), %g1 40021658: c6 00 61 44 ld [ %g1 + 0x144 ], %g3 ! 4003bd44 4002165c: 85 2e 20 02 sll %i0, 2, %g2 40021660: 83 2e 20 04 sll %i0, 4, %g1 40021664: 82 20 40 02 sub %g1, %g2, %g1 40021668: 82 00 40 18 add %g1, %i0, %g1 4002166c: 83 28 60 02 sll %g1, 2, %g1 40021670: a0 00 40 03 add %g1, %g3, %l0 /* * Make sure we are working on a directory */ loc = iop->pathinfo; 40021674: b0 07 bf e8 add %fp, -24, %i0 40021678: 92 04 20 10 add %l0, 0x10, %o1 4002167c: 90 10 00 18 mov %i0, %o0 40021680: 40 00 0f 77 call 4002545c 40021684: 94 10 20 10 mov 0x10, %o2 if ( !loc.ops->node_type_h ) 40021688: c2 07 bf f0 ld [ %fp + -16 ], %g1 4002168c: c2 00 60 10 ld [ %g1 + 0x10 ], %g1 40021690: 80 a0 60 00 cmp %g1, 0 40021694: 02 80 00 11 be 400216d8 40021698: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( ENOTSUP ); if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) 4002169c: 9f c0 40 00 call %g1 400216a0: 90 10 00 18 mov %i0, %o0 400216a4: 80 a2 20 01 cmp %o0, 1 400216a8: 22 80 00 08 be,a 400216c8 400216ac: c2 04 20 30 ld [ %l0 + 0x30 ], %g1 rtems_set_errno_and_return_minus_one( ENOTDIR ); 400216b0: 40 00 08 b7 call 4002398c <__errno> 400216b4: 01 00 00 00 nop 400216b8: 82 10 20 14 mov 0x14, %g1 ! 14 400216bc: c2 22 00 00 st %g1, [ %o0 ] 400216c0: 10 80 00 0d b 400216f4 400216c4: 90 10 3f ff mov -1, %o0 /* * Return the number of bytes that were actually transfered as a result * of the read attempt. */ if ( !iop->handlers->read_h ) 400216c8: c2 00 60 08 ld [ %g1 + 8 ], %g1 400216cc: 80 a0 60 00 cmp %g1, 0 400216d0: 32 80 00 06 bne,a 400216e8 400216d4: 90 10 00 10 mov %l0, %o0 rtems_set_errno_and_return_minus_one( ENOTSUP ); 400216d8: 40 00 08 ad call 4002398c <__errno> <== NOT EXECUTED 400216dc: 01 00 00 00 nop <== NOT EXECUTED 400216e0: 10 bf ff f7 b 400216bc <== NOT EXECUTED 400216e4: 82 10 20 86 mov 0x86, %g1 ! 86 <== NOT EXECUTED return (*iop->handlers->read_h)( iop, dd_buf, dd_len ); 400216e8: 92 10 00 19 mov %i1, %o1 400216ec: 9f c0 40 00 call %g1 400216f0: 94 10 00 1a mov %i2, %o2 } 400216f4: 81 c7 e0 08 ret 400216f8: 91 e8 00 08 restore %g0, %o0, %o0 40017754 : * 4.2.1 Get Real User, Effective User, Ral Group, and Effective Group IDs, * P1003.1b-1993, p. 84 */ gid_t getgid( void ) { 40017754: 03 10 00 e6 sethi %hi(0x40039800), %g1 <== NOT EXECUTED 40017758: c2 00 62 c0 ld [ %g1 + 0x2c0 ], %g1 ! 40039ac0 <== NOT EXECUTED return _POSIX_types_Gid; } 4001775c: 81 c3 e0 08 retl <== NOT EXECUTED 40017760: d0 10 60 2a lduh [ %g1 + 0x2a ], %o0 <== NOT EXECUTED 40017dbc : struct group *grp, char *buffer, size_t bufsize, struct group **result ) { 40017dbc: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED FILE *fp; int match; init_etc_passwd_group(); 40017dc0: 7f ff ff b7 call 40017c9c <== NOT EXECUTED 40017dc4: 01 00 00 00 nop <== NOT EXECUTED if ((fp = fopen("/etc/group", "r")) == NULL) { 40017dc8: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED 40017dcc: 13 10 00 e3 sethi %hi(0x40038c00), %o1 <== NOT EXECUTED 40017dd0: 90 12 21 90 or %o0, 0x190, %o0 <== NOT EXECUTED 40017dd4: 40 00 31 42 call 400242dc <== NOT EXECUTED 40017dd8: 92 12 61 38 or %o1, 0x138, %o1 <== NOT EXECUTED 40017ddc: a0 92 20 00 orcc %o0, 0, %l0 <== NOT EXECUTED 40017de0: 12 80 00 08 bne 40017e00 <== NOT EXECUTED 40017de4: 92 10 00 1a mov %i2, %o1 <== NOT EXECUTED errno = EINVAL; 40017de8: 40 00 2e e9 call 4002398c <__errno> <== NOT EXECUTED 40017dec: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40017df0: 82 10 20 16 mov 0x16, %g1 <== NOT EXECUTED 40017df4: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 40017df8: 81 c7 e0 08 ret <== NOT EXECUTED 40017dfc: 81 e8 00 00 restore <== NOT EXECUTED return -1; } for(;;) { if (!scangr(fp, grp, buffer, bufsize)) { 40017e00: 94 10 00 1b mov %i3, %o2 <== NOT EXECUTED 40017e04: 96 10 00 1c mov %i4, %o3 <== NOT EXECUTED 40017e08: 7f ff fe ea call 400179b0 <== NOT EXECUTED 40017e0c: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 40017e10: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017e14: 12 80 00 0a bne 40017e3c <== NOT EXECUTED 40017e18: 80 a6 20 00 cmp %i0, 0 <== NOT EXECUTED errno = EINVAL; 40017e1c: 40 00 2e dc call 4002398c <__errno> <== NOT EXECUTED 40017e20: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40017e24: 82 10 20 16 mov 0x16, %g1 <== NOT EXECUTED 40017e28: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED fclose(fp); 40017e2c: 40 00 2f 2e call 40023ae4 <== NOT EXECUTED 40017e30: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 40017e34: 81 c7 e0 08 ret <== NOT EXECUTED 40017e38: 81 e8 00 00 restore <== NOT EXECUTED return -1; } if (name) { 40017e3c: 22 80 00 07 be,a 40017e58 <== NOT EXECUTED 40017e40: c2 16 a0 08 lduh [ %i2 + 8 ], %g1 <== NOT EXECUTED match = (strcmp(grp->gr_name, name) == 0); 40017e44: d0 06 80 00 ld [ %i2 ], %o0 <== NOT EXECUTED 40017e48: 40 00 3d a7 call 400274e4 <== NOT EXECUTED 40017e4c: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED 40017e50: 10 80 00 04 b 40017e60 <== NOT EXECUTED 40017e54: 80 a0 00 08 cmp %g0, %o0 <== NOT EXECUTED } else { match = (grp->gr_gid == gid); 40017e58: 82 18 40 19 xor %g1, %i1, %g1 <== NOT EXECUTED 40017e5c: 80 a0 00 01 cmp %g0, %g1 <== NOT EXECUTED 40017e60: 82 60 3f ff subx %g0, -1, %g1 <== NOT EXECUTED } if (match) { 40017e64: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40017e68: 02 bf ff e6 be 40017e00 <== NOT EXECUTED 40017e6c: 92 10 00 1a mov %i2, %o1 <== NOT EXECUTED fclose(fp); 40017e70: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 40017e74: 40 00 2f 1c call 40023ae4 <== NOT EXECUTED 40017e78: b0 10 20 00 clr %i0 <== NOT EXECUTED *result = grp; 40017e7c: f4 27 40 00 st %i2, [ %i5 ] <== NOT EXECUTED } } fclose(fp); errno = EINVAL; return -1; } 40017e80: 81 c7 e0 08 ret <== NOT EXECUTED 40017e84: 81 e8 00 00 restore <== NOT EXECUTED 40017af0 : return NULL; return p; } struct group *getgrent() { 40017af0: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED if (group_fp == NULL) 40017af4: 03 10 00 ed sethi %hi(0x4003b400), %g1 <== NOT EXECUTED 40017af8: d0 00 61 84 ld [ %g1 + 0x184 ], %o0 ! 4003b584 <== NOT EXECUTED 40017afc: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017b00: 02 80 00 0b be 40017b2c <== NOT EXECUTED 40017b04: 15 10 00 ed sethi %hi(0x4003b400), %o2 <== NOT EXECUTED return NULL; if (!scangr(group_fp, &grent, grbuf, sizeof grbuf)) 40017b08: 21 10 00 ed sethi %hi(0x4003b400), %l0 <== NOT EXECUTED 40017b0c: 92 14 22 50 or %l0, 0x250, %o1 ! 4003b650 <== NOT EXECUTED 40017b10: 94 12 a1 88 or %o2, 0x188, %o2 <== NOT EXECUTED 40017b14: 96 10 20 c8 mov 0xc8, %o3 <== NOT EXECUTED 40017b18: 7f ff ff a6 call 400179b0 <== NOT EXECUTED 40017b1c: b0 14 22 50 or %l0, 0x250, %i0 <== NOT EXECUTED 40017b20: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017b24: 12 80 00 03 bne 40017b30 <== NOT EXECUTED 40017b28: 01 00 00 00 nop <== NOT EXECUTED 40017b2c: b0 10 20 00 clr %i0 ! 0 <== NOT EXECUTED return NULL; return &grent; } 40017b30: 81 c7 e0 08 ret <== NOT EXECUTED 40017b34: 81 e8 00 00 restore <== NOT EXECUTED 40017ec0 : } struct group *getgrgid( gid_t gid ) { 40017ec0: 9d e3 bf 90 save %sp, -112, %sp <== NOT EXECUTED struct group *p; if(getgrgid_r(gid, &grent, grbuf, sizeof grbuf, &p)) 40017ec4: 13 10 00 ed sethi %hi(0x4003b400), %o1 <== NOT EXECUTED 40017ec8: 91 2e 20 10 sll %i0, 0x10, %o0 <== NOT EXECUTED 40017ecc: 92 12 62 50 or %o1, 0x250, %o1 <== NOT EXECUTED 40017ed0: 91 32 20 10 srl %o0, 0x10, %o0 <== NOT EXECUTED 40017ed4: 15 10 00 ed sethi %hi(0x4003b400), %o2 <== NOT EXECUTED 40017ed8: 96 10 20 c8 mov 0xc8, %o3 <== NOT EXECUTED 40017edc: 94 12 a1 88 or %o2, 0x188, %o2 <== NOT EXECUTED 40017ee0: 98 07 bf f4 add %fp, -12, %o4 <== NOT EXECUTED 40017ee4: 7f ff ff e9 call 40017e88 <== NOT EXECUTED 40017ee8: b0 10 20 00 clr %i0 <== NOT EXECUTED 40017eec: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017ef0: 22 80 00 02 be,a 40017ef8 <== NOT EXECUTED 40017ef4: f0 07 bf f4 ld [ %fp + -12 ], %i0 <== NOT EXECUTED return NULL; return p; } 40017ef8: 81 c7 e0 08 ret <== NOT EXECUTED 40017efc: 81 e8 00 00 restore <== NOT EXECUTED 40017e88 : struct group *grp, char *buffer, size_t bufsize, struct group **result ) { 40017e88: 82 10 00 09 mov %o1, %g1 <== NOT EXECUTED 40017e8c: 84 10 00 0a mov %o2, %g2 <== NOT EXECUTED 40017e90: 86 10 00 0b mov %o3, %g3 <== NOT EXECUTED return getgr_r(NULL, gid, grp, buffer, bufsize, result); 40017e94: 93 2a 20 10 sll %o0, 0x10, %o1 <== NOT EXECUTED struct group *grp, char *buffer, size_t bufsize, struct group **result ) { 40017e98: 9a 10 00 0c mov %o4, %o5 <== NOT EXECUTED return getgr_r(NULL, gid, grp, buffer, bufsize, result); 40017e9c: 94 10 00 01 mov %g1, %o2 <== NOT EXECUTED 40017ea0: 93 32 60 10 srl %o1, 0x10, %o1 <== NOT EXECUTED 40017ea4: 96 10 00 02 mov %g2, %o3 <== NOT EXECUTED 40017ea8: 98 10 00 03 mov %g3, %o4 <== NOT EXECUTED 40017eac: 90 10 20 00 clr %o0 <== NOT EXECUTED 40017eb0: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 40017eb4: 7f ff ff c2 call 40017dbc <== NOT EXECUTED 40017eb8: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED 40017ebc: 01 00 00 00 nop 40017f2c : } struct group *getgrnam( const char *name ) { 40017f2c: 9d e3 bf 90 save %sp, -112, %sp <== NOT EXECUTED struct group *p; if(getgrnam_r(name, &grent, grbuf, sizeof grbuf, &p)) 40017f30: 13 10 00 ed sethi %hi(0x4003b400), %o1 <== NOT EXECUTED 40017f34: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40017f38: 92 12 62 50 or %o1, 0x250, %o1 <== NOT EXECUTED 40017f3c: 15 10 00 ed sethi %hi(0x4003b400), %o2 <== NOT EXECUTED 40017f40: 96 10 20 c8 mov 0xc8, %o3 <== NOT EXECUTED 40017f44: 94 12 a1 88 or %o2, 0x188, %o2 <== NOT EXECUTED 40017f48: 98 07 bf f4 add %fp, -12, %o4 <== NOT EXECUTED 40017f4c: 7f ff ff ed call 40017f00 <== NOT EXECUTED 40017f50: b0 10 20 00 clr %i0 <== NOT EXECUTED 40017f54: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017f58: 22 80 00 02 be,a 40017f60 <== NOT EXECUTED 40017f5c: f0 07 bf f4 ld [ %fp + -12 ], %i0 <== NOT EXECUTED return NULL; return p; } 40017f60: 81 c7 e0 08 ret <== NOT EXECUTED 40017f64: 81 e8 00 00 restore <== NOT EXECUTED 40017f00 : struct group *grp, char *buffer, size_t bufsize, struct group **result ) { 40017f00: 82 10 00 0a mov %o2, %g1 <== NOT EXECUTED 40017f04: 84 10 00 0b mov %o3, %g2 <== NOT EXECUTED 40017f08: 9a 10 00 0c mov %o4, %o5 <== NOT EXECUTED return getgr_r(name, 0, grp, buffer, bufsize, result); 40017f0c: 94 10 00 09 mov %o1, %o2 <== NOT EXECUTED 40017f10: 96 10 00 01 mov %g1, %o3 <== NOT EXECUTED 40017f14: 98 10 00 02 mov %g2, %o4 <== NOT EXECUTED 40017f18: 92 10 20 00 clr %o1 <== NOT EXECUTED 40017f1c: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 40017f20: 7f ff ff a7 call 40017dbc <== NOT EXECUTED 40017f24: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED 40017f28: 01 00 00 00 nop 40017fac : struct passwd *pwd, char *buffer, size_t bufsize, struct passwd **result ) { 40017fac: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED FILE *fp; int match; init_etc_passwd_group(); 40017fb0: 7f ff ff 3b call 40017c9c <== NOT EXECUTED 40017fb4: 01 00 00 00 nop <== NOT EXECUTED if ((fp = fopen("/etc/passwd", "r")) == NULL) { 40017fb8: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED 40017fbc: 13 10 00 e3 sethi %hi(0x40038c00), %o1 <== NOT EXECUTED 40017fc0: 90 12 21 18 or %o0, 0x118, %o0 <== NOT EXECUTED 40017fc4: 40 00 30 c6 call 400242dc <== NOT EXECUTED 40017fc8: 92 12 61 38 or %o1, 0x138, %o1 <== NOT EXECUTED 40017fcc: a0 92 20 00 orcc %o0, 0, %l0 <== NOT EXECUTED 40017fd0: 12 80 00 08 bne 40017ff0 <== NOT EXECUTED 40017fd4: 92 10 00 1a mov %i2, %o1 <== NOT EXECUTED errno = EINVAL; 40017fd8: 40 00 2e 6d call 4002398c <__errno> <== NOT EXECUTED 40017fdc: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40017fe0: 82 10 20 16 mov 0x16, %g1 <== NOT EXECUTED 40017fe4: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 40017fe8: 81 c7 e0 08 ret <== NOT EXECUTED 40017fec: 81 e8 00 00 restore <== NOT EXECUTED return -1; } for(;;) { if (!scanpw(fp, pwd, buffer, bufsize)) { 40017ff0: 94 10 00 1b mov %i3, %o2 <== NOT EXECUTED 40017ff4: 96 10 00 1c mov %i4, %o3 <== NOT EXECUTED 40017ff8: 7f ff fe d0 call 40017b38 <== NOT EXECUTED 40017ffc: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 40018000: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40018004: 12 80 00 0a bne 4001802c <== NOT EXECUTED 40018008: 80 a6 20 00 cmp %i0, 0 <== NOT EXECUTED errno = EINVAL; 4001800c: 40 00 2e 60 call 4002398c <__errno> <== NOT EXECUTED 40018010: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40018014: 82 10 20 16 mov 0x16, %g1 <== NOT EXECUTED 40018018: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED fclose(fp); 4001801c: 40 00 2e b2 call 40023ae4 <== NOT EXECUTED 40018020: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 40018024: 81 c7 e0 08 ret <== NOT EXECUTED 40018028: 81 e8 00 00 restore <== NOT EXECUTED return -1; } if (name) { 4001802c: 22 80 00 07 be,a 40018048 <== NOT EXECUTED 40018030: c2 16 a0 08 lduh [ %i2 + 8 ], %g1 <== NOT EXECUTED match = (strcmp(pwd->pw_name, name) == 0); 40018034: d0 06 80 00 ld [ %i2 ], %o0 <== NOT EXECUTED 40018038: 40 00 3d 2b call 400274e4 <== NOT EXECUTED 4001803c: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED 40018040: 10 80 00 04 b 40018050 <== NOT EXECUTED 40018044: 80 a0 00 08 cmp %g0, %o0 <== NOT EXECUTED } else { match = (pwd->pw_uid == uid); 40018048: 82 18 40 19 xor %g1, %i1, %g1 <== NOT EXECUTED 4001804c: 80 a0 00 01 cmp %g0, %g1 <== NOT EXECUTED 40018050: 82 60 3f ff subx %g0, -1, %g1 <== NOT EXECUTED } if (match) { 40018054: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40018058: 02 bf ff e6 be 40017ff0 <== NOT EXECUTED 4001805c: 92 10 00 1a mov %i2, %o1 <== NOT EXECUTED fclose(fp); 40018060: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 40018064: 40 00 2e a0 call 40023ae4 <== NOT EXECUTED 40018068: b0 10 20 00 clr %i0 <== NOT EXECUTED *result = pwd; 4001806c: f4 27 40 00 st %i2, [ %i5 ] <== NOT EXECUTED } } fclose(fp); errno = EINVAL; return -1; } 40018070: 81 c7 e0 08 ret <== NOT EXECUTED 40018074: 81 e8 00 00 restore <== NOT EXECUTED 40017c54 : return NULL; return p; } struct passwd *getpwent() { 40017c54: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED if (passwd_fp == NULL) 40017c58: 03 10 00 ed sethi %hi(0x4003b400), %g1 <== NOT EXECUTED 40017c5c: d0 00 60 9c ld [ %g1 + 0x9c ], %o0 ! 4003b49c <== NOT EXECUTED 40017c60: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017c64: 02 80 00 0b be 40017c90 <== NOT EXECUTED 40017c68: 15 10 00 ed sethi %hi(0x4003b400), %o2 <== NOT EXECUTED return NULL; if (!scanpw(passwd_fp, &pwent, pwbuf, sizeof pwbuf)) 40017c6c: 21 10 00 ed sethi %hi(0x4003b400), %l0 <== NOT EXECUTED 40017c70: 92 14 21 68 or %l0, 0x168, %o1 ! 4003b568 <== NOT EXECUTED 40017c74: 94 12 a0 a0 or %o2, 0xa0, %o2 <== NOT EXECUTED 40017c78: 96 10 20 c8 mov 0xc8, %o3 <== NOT EXECUTED 40017c7c: 7f ff ff af call 40017b38 <== NOT EXECUTED 40017c80: b0 14 21 68 or %l0, 0x168, %i0 <== NOT EXECUTED 40017c84: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017c88: 12 80 00 03 bne 40017c94 <== NOT EXECUTED 40017c8c: 01 00 00 00 nop <== NOT EXECUTED 40017c90: b0 10 20 00 clr %i0 ! 0 <== NOT EXECUTED return NULL; return &pwent; } 40017c94: 81 c7 e0 08 ret <== NOT EXECUTED 40017c98: 81 e8 00 00 restore <== NOT EXECUTED 4001811c : } struct passwd *getpwnam( const char *name ) { 4001811c: 9d e3 bf 90 save %sp, -112, %sp <== NOT EXECUTED struct passwd *p; if(getpwnam_r(name, &pwent, pwbuf, sizeof pwbuf, &p)) 40018120: 13 10 00 ed sethi %hi(0x4003b400), %o1 <== NOT EXECUTED 40018124: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40018128: 92 12 61 68 or %o1, 0x168, %o1 <== NOT EXECUTED 4001812c: 15 10 00 ed sethi %hi(0x4003b400), %o2 <== NOT EXECUTED 40018130: 96 10 20 c8 mov 0xc8, %o3 <== NOT EXECUTED 40018134: 94 12 a0 a0 or %o2, 0xa0, %o2 <== NOT EXECUTED 40018138: 98 07 bf f4 add %fp, -12, %o4 <== NOT EXECUTED 4001813c: 7f ff ff ed call 400180f0 <== NOT EXECUTED 40018140: b0 10 20 00 clr %i0 <== NOT EXECUTED 40018144: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40018148: 22 80 00 02 be,a 40018150 <== NOT EXECUTED 4001814c: f0 07 bf f4 ld [ %fp + -12 ], %i0 <== NOT EXECUTED return NULL; return p; } 40018150: 81 c7 e0 08 ret <== NOT EXECUTED 40018154: 81 e8 00 00 restore <== NOT EXECUTED 400180f0 : struct passwd *pwd, char *buffer, size_t bufsize, struct passwd **result ) { 400180f0: 82 10 00 0a mov %o2, %g1 <== NOT EXECUTED 400180f4: 84 10 00 0b mov %o3, %g2 <== NOT EXECUTED 400180f8: 9a 10 00 0c mov %o4, %o5 <== NOT EXECUTED return getpw_r(name, 0, pwd, buffer, bufsize, result); 400180fc: 94 10 00 09 mov %o1, %o2 <== NOT EXECUTED 40018100: 96 10 00 01 mov %g1, %o3 <== NOT EXECUTED 40018104: 98 10 00 02 mov %g2, %o4 <== NOT EXECUTED 40018108: 92 10 20 00 clr %o1 <== NOT EXECUTED 4001810c: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 40018110: 7f ff ff a7 call 40017fac <== NOT EXECUTED 40018114: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED 40018118: 01 00 00 00 nop 400180b0 : } struct passwd *getpwuid( uid_t uid ) { 400180b0: 9d e3 bf 90 save %sp, -112, %sp <== NOT EXECUTED struct passwd *p; if(getpwuid_r(uid, &pwent, pwbuf, sizeof pwbuf, &p)) 400180b4: 13 10 00 ed sethi %hi(0x4003b400), %o1 <== NOT EXECUTED 400180b8: 91 2e 20 10 sll %i0, 0x10, %o0 <== NOT EXECUTED 400180bc: 92 12 61 68 or %o1, 0x168, %o1 <== NOT EXECUTED 400180c0: 91 32 20 10 srl %o0, 0x10, %o0 <== NOT EXECUTED 400180c4: 15 10 00 ed sethi %hi(0x4003b400), %o2 <== NOT EXECUTED 400180c8: 96 10 20 c8 mov 0xc8, %o3 <== NOT EXECUTED 400180cc: 94 12 a0 a0 or %o2, 0xa0, %o2 <== NOT EXECUTED 400180d0: 98 07 bf f4 add %fp, -12, %o4 <== NOT EXECUTED 400180d4: 7f ff ff e9 call 40018078 <== NOT EXECUTED 400180d8: b0 10 20 00 clr %i0 <== NOT EXECUTED 400180dc: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400180e0: 22 80 00 02 be,a 400180e8 <== NOT EXECUTED 400180e4: f0 07 bf f4 ld [ %fp + -12 ], %i0 <== NOT EXECUTED return NULL; return p; } 400180e8: 81 c7 e0 08 ret <== NOT EXECUTED 400180ec: 81 e8 00 00 restore <== NOT EXECUTED 40018078 : struct passwd *pwd, char *buffer, size_t bufsize, struct passwd **result ) { 40018078: 82 10 00 09 mov %o1, %g1 <== NOT EXECUTED 4001807c: 84 10 00 0a mov %o2, %g2 <== NOT EXECUTED 40018080: 86 10 00 0b mov %o3, %g3 <== NOT EXECUTED return getpw_r(NULL, uid, pwd, buffer, bufsize, result); 40018084: 93 2a 20 10 sll %o0, 0x10, %o1 <== NOT EXECUTED struct passwd *pwd, char *buffer, size_t bufsize, struct passwd **result ) { 40018088: 9a 10 00 0c mov %o4, %o5 <== NOT EXECUTED return getpw_r(NULL, uid, pwd, buffer, bufsize, result); 4001808c: 94 10 00 01 mov %g1, %o2 <== NOT EXECUTED 40018090: 93 32 60 10 srl %o1, 0x10, %o1 <== NOT EXECUTED 40018094: 96 10 00 02 mov %g2, %o3 <== NOT EXECUTED 40018098: 98 10 00 03 mov %g3, %o4 <== NOT EXECUTED 4001809c: 90 10 20 00 clr %o0 <== NOT EXECUTED 400180a0: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 400180a4: 7f ff ff c2 call 40017fac <== NOT EXECUTED 400180a8: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED 400180ac: 01 00 00 00 nop 4000c5f0 : int gettimeofday( struct timeval *tp, void * __tz ) { 4000c5f0: 9d e3 bf 90 save %sp, -112, %sp /* struct timezone* tzp = (struct timezone*) __tz; */ if ( !tp ) { 4000c5f4: 80 a6 20 00 cmp %i0, 0 4000c5f8: 12 80 00 08 bne 4000c618 4000c5fc: 01 00 00 00 nop errno = EFAULT; 4000c600: 40 00 0a 6f call 4000efbc <__errno> <== NOT EXECUTED 4000c604: b0 10 3f ff mov -1, %i0 ! ffffffff <== NOT EXECUTED 4000c608: 82 10 20 0e mov 0xe, %g1 <== NOT EXECUTED 4000c60c: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 4000c610: 81 c7 e0 08 ret <== NOT EXECUTED 4000c614: 81 e8 00 00 restore <== NOT EXECUTED ) { ISR_Level level; struct timespec now; _ISR_Disable(level); 4000c618: 7f ff d6 2d call 40001ecc 4000c61c: 01 00 00 00 nop 4000c620: a0 10 00 08 mov %o0, %l0 _TOD_Get( &now ); 4000c624: 7f ff ed 18 call 40007a84 <_TOD_Get> 4000c628: 90 07 bf f0 add %fp, -16, %o0 _ISR_Enable(level); 4000c62c: 7f ff d6 2c call 40001edc 4000c630: 90 10 00 10 mov %l0, %o0 time->tv_sec = now.tv_sec; time->tv_usec = now.tv_nsec / TOD_NANOSECONDS_PER_MICROSECOND; 4000c634: d0 07 bf f4 ld [ %fp + -12 ], %o0 _ISR_Disable(level); _TOD_Get( &now ); _ISR_Enable(level); time->tv_sec = now.tv_sec; 4000c638: c2 07 bf f0 ld [ %fp + -16 ], %g1 time->tv_usec = now.tv_nsec / TOD_NANOSECONDS_PER_MICROSECOND; 4000c63c: 92 10 23 e8 mov 0x3e8, %o1 4000c640: 40 00 26 88 call 40016060 <.udiv> 4000c644: c2 26 00 00 st %g1, [ %i0 ] 4000c648: d0 26 20 04 st %o0, [ %i0 + 4 ] * with Eric Norum, this is how GNU/Linux, Solaris, and MacOS X * do it. This puts us in good company. */ return 0; } 4000c64c: 81 c7 e0 08 ret 4000c650: 91 e8 20 00 restore %g0, 0, %o0 40018158 : * 4.2.1 Get Real User, Effective User, Ral Group, and Effective Group IDs, * P1003.1b-1993, p. 84 */ uid_t getuid( void ) { 40018158: 03 10 00 e6 sethi %hi(0x40039800), %g1 <== NOT EXECUTED 4001815c: c2 00 62 c0 ld [ %g1 + 0x2c0 ], %g1 ! 40039ac0 <== NOT EXECUTED return _POSIX_types_Uid; } 40018160: 81 c3 e0 08 retl <== NOT EXECUTED 40018164: d0 10 60 28 lduh [ %g1 + 0x28 ], %o0 <== NOT EXECUTED 400210bc : */ int imfs_dir_rmnod( rtems_filesystem_location_info_t *pathloc /* IN */ ) { 400210bc: 9d e3 bf 90 save %sp, -112, %sp IMFS_jnode_t *the_jnode; the_jnode = (IMFS_jnode_t *) pathloc->node_access; 400210c0: e0 06 00 00 ld [ %i0 ], %l0 /* * You cannot remove a node that still has children */ if ( ! Chain_Is_empty( &the_jnode->info.directory.Entries ) ) 400210c4: c4 04 20 4c ld [ %l0 + 0x4c ], %g2 400210c8: 82 04 20 50 add %l0, 0x50, %g1 400210cc: 80 a0 80 01 cmp %g2, %g1 400210d0: 22 80 00 06 be,a 400210e8 400210d4: c2 06 20 0c ld [ %i0 + 0xc ], %g1 rtems_set_errno_and_return_minus_one( ENOTEMPTY ); 400210d8: 40 00 0a 2d call 4002398c <__errno> 400210dc: 01 00 00 00 nop 400210e0: 10 80 00 0d b 40021114 400210e4: 82 10 20 5a mov 0x5a, %g1 ! 5a /* * You cannot remove the file system root node. */ if ( pathloc->mt_entry->mt_fs_root.node_access == pathloc->node_access ) 400210e8: c2 00 60 18 ld [ %g1 + 0x18 ], %g1 400210ec: 80 a0 40 10 cmp %g1, %l0 400210f0: 02 80 00 06 be 40021108 400210f4: 01 00 00 00 nop /* * You cannot remove a mountpoint. */ if ( the_jnode->info.directory.mt_fs != NULL ) 400210f8: c2 04 20 58 ld [ %l0 + 0x58 ], %g1 400210fc: 80 a0 60 00 cmp %g1, 0 40021100: 22 80 00 08 be,a 40021120 40021104: c2 04 20 08 ld [ %l0 + 8 ], %g1 rtems_set_errno_and_return_minus_one( EBUSY ); 40021108: 40 00 0a 21 call 4002398c <__errno> 4002110c: 01 00 00 00 nop 40021110: 82 10 20 10 mov 0x10, %g1 ! 10 40021114: c2 22 00 00 st %g1, [ %o0 ] 40021118: 81 c7 e0 08 ret 4002111c: 91 e8 3f ff restore %g0, -1, %o0 /* * Take the node out of the parent's chain that contains this node */ if ( the_jnode->Parent != NULL ) { 40021120: 80 a0 60 00 cmp %g1, 0 40021124: 22 80 00 06 be,a 4002113c 40021128: c2 14 20 30 lduh [ %l0 + 0x30 ], %g1 Chain_Extract( (Chain_Node *) the_jnode ); 4002112c: 7f ff e2 bc call 40019c1c <_Chain_Extract> 40021130: 90 10 00 10 mov %l0, %o0 the_jnode->Parent = NULL; 40021134: c0 24 20 08 clr [ %l0 + 8 ] /* * Decrement the link counter and see if we can free the space. */ the_jnode->st_nlink--; 40021138: c2 14 20 30 lduh [ %l0 + 0x30 ], %g1 IMFS_update_ctime( the_jnode ); 4002113c: 92 10 20 00 clr %o1 /* * Decrement the link counter and see if we can free the space. */ the_jnode->st_nlink--; 40021140: 82 00 7f ff add %g1, -1, %g1 IMFS_update_ctime( the_jnode ); 40021144: 90 07 bf f0 add %fp, -16, %o0 40021148: 7f ff 92 c6 call 40005c60 4002114c: c2 34 20 30 sth %g1, [ %l0 + 0x30 ] 40021150: c2 07 bf f0 ld [ %fp + -16 ], %g1 /* * The file cannot be open and the link must be less than 1 to free. */ if ( !rtems_libio_is_file_open( the_jnode ) && (the_jnode->st_nlink < 1) ) { 40021154: 90 10 00 10 mov %l0, %o0 40021158: 7f ff 93 2c call 40005e08 4002115c: c2 24 20 44 st %g1, [ %l0 + 0x44 ] 40021160: 80 a2 20 00 cmp %o0, 0 40021164: 12 80 00 11 bne 400211a8 40021168: 01 00 00 00 nop 4002116c: c2 14 20 30 lduh [ %l0 + 0x30 ], %g1 40021170: 80 a0 60 00 cmp %g1, 0 40021174: 12 80 00 0d bne 400211a8 40021178: 03 10 00 e6 sethi %hi(0x40039800), %g1 /* * Is the rtems_filesystem_current is this node? */ if ( rtems_filesystem_current.node_access == pathloc->node_access ) 4002117c: c6 00 62 c0 ld [ %g1 + 0x2c0 ], %g3 ! 40039ac0 40021180: c4 06 00 00 ld [ %i0 ], %g2 40021184: c2 00 e0 04 ld [ %g3 + 4 ], %g1 40021188: 80 a0 40 02 cmp %g1, %g2 4002118c: 22 80 00 02 be,a 40021194 40021190: c0 20 e0 04 clr [ %g3 + 4 ] <== NOT EXECUTED /* * Free memory associated with a memory file. */ free( the_jnode ); 40021194: 90 10 00 10 mov %l0, %o0 40021198: 7f ff 93 c0 call 40006098 4002119c: b0 10 20 00 clr %i0 400211a0: 81 c7 e0 08 ret 400211a4: 81 e8 00 00 restore } return 0; } 400211a8: 81 c7 e0 08 ret 400211ac: 91 e8 20 00 restore %g0, 0, %o0 40017c9c : /* * Initialize useable but dummy databases */ void init_etc_passwd_group(void) { 40017c9c: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED FILE *fp; static char etc_passwd_initted = 0; if (etc_passwd_initted) 40017ca0: 05 10 00 ed sethi %hi(0x4003b400), %g2 <== NOT EXECUTED 40017ca4: c2 48 a0 98 ldsb [ %g2 + 0x98 ], %g1 ! 4003b498 <== NOT EXECUTED 40017ca8: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40017cac: 12 80 00 31 bne 40017d70 <== NOT EXECUTED 40017cb0: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED return; etc_passwd_initted = 1; mkdir("/etc", 0777); 40017cb4: 92 10 21 ff mov 0x1ff, %o1 <== NOT EXECUTED FILE *fp; static char etc_passwd_initted = 0; if (etc_passwd_initted) return; etc_passwd_initted = 1; 40017cb8: c2 28 a0 98 stb %g1, [ %g2 + 0x98 ] <== NOT EXECUTED mkdir("/etc", 0777); 40017cbc: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED 40017cc0: 40 00 01 2f call 4001817c <== NOT EXECUTED 40017cc4: 90 12 21 10 or %o0, 0x110, %o0 ! 40036910 <_CPU_Trap_slot_template+0xe70> <== NOT EXECUTED /* * Initialize /etc/passwd */ if ((fp = fopen("/etc/passwd", "r")) != NULL) { 40017cc8: 31 10 00 da sethi %hi(0x40036800), %i0 <== NOT EXECUTED 40017ccc: 13 10 00 e3 sethi %hi(0x40038c00), %o1 <== NOT EXECUTED 40017cd0: 90 16 21 18 or %i0, 0x118, %o0 <== NOT EXECUTED 40017cd4: 40 00 31 82 call 400242dc <== NOT EXECUTED 40017cd8: 92 12 61 38 or %o1, 0x138, %o1 <== NOT EXECUTED 40017cdc: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017ce0: 12 80 00 0d bne 40017d14 <== NOT EXECUTED 40017ce4: 01 00 00 00 nop <== NOT EXECUTED fclose(fp); } else if ((fp = fopen("/etc/passwd", "w")) != NULL) { 40017ce8: 90 16 21 18 or %i0, 0x118, %o0 <== NOT EXECUTED 40017cec: 13 10 00 d6 sethi %hi(0x40035800), %o1 <== NOT EXECUTED 40017cf0: 40 00 31 7b call 400242dc <== NOT EXECUTED 40017cf4: 92 12 62 b0 or %o1, 0x2b0, %o1 ! 40035ab0 <_CPU_Trap_slot_template+0x10> <== NOT EXECUTED 40017cf8: b0 92 20 00 orcc %o0, 0, %i0 <== NOT EXECUTED 40017cfc: 02 80 00 08 be 40017d1c <== NOT EXECUTED 40017d00: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED fprintf(fp, "root:*:0:0:root::/:/bin/sh\n" 40017d04: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED 40017d08: 40 00 31 ca call 40024430 <== NOT EXECUTED 40017d0c: 90 12 21 28 or %o0, 0x128, %o0 <== NOT EXECUTED "rtems:*:1:1:RTEMS Application::/:/bin/sh\n" "tty:!:2:2:tty owner::/:/bin/false\n" ); fclose(fp); 40017d10: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40017d14: 40 00 2f 74 call 40023ae4 <== NOT EXECUTED 40017d18: 01 00 00 00 nop <== NOT EXECUTED } /* * Initialize /etc/group */ if ((fp = fopen("/etc/group", "r")) != NULL) { 40017d1c: 31 10 00 da sethi %hi(0x40036800), %i0 <== NOT EXECUTED 40017d20: 13 10 00 e3 sethi %hi(0x40038c00), %o1 <== NOT EXECUTED 40017d24: 90 16 21 90 or %i0, 0x190, %o0 <== NOT EXECUTED 40017d28: 40 00 31 6d call 400242dc <== NOT EXECUTED 40017d2c: 92 12 61 38 or %o1, 0x138, %o1 <== NOT EXECUTED 40017d30: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017d34: 22 80 00 04 be,a 40017d44 <== NOT EXECUTED 40017d38: 90 16 21 90 or %i0, 0x190, %o0 <== NOT EXECUTED fclose(fp); 40017d3c: 10 80 00 0b b 40017d68 <== NOT EXECUTED 40017d40: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED } else if ((fp = fopen("/etc/group", "w")) != NULL) { 40017d44: 13 10 00 d6 sethi %hi(0x40035800), %o1 <== NOT EXECUTED 40017d48: 40 00 31 65 call 400242dc <== NOT EXECUTED 40017d4c: 92 12 62 b0 or %o1, 0x2b0, %o1 ! 40035ab0 <_CPU_Trap_slot_template+0x10> <== NOT EXECUTED 40017d50: b0 92 20 00 orcc %o0, 0, %i0 <== NOT EXECUTED 40017d54: 02 80 00 07 be 40017d70 <== NOT EXECUTED 40017d58: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED fprintf( fp, "root:x:0:root\n" 40017d5c: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED 40017d60: 40 00 31 b4 call 40024430 <== NOT EXECUTED 40017d64: 90 12 21 a0 or %o0, 0x1a0, %o0 <== NOT EXECUTED "rtems:x:1:rtems\n" "tty:x:2:tty\n" ); fclose(fp); 40017d68: 40 00 2f 5f call 40023ae4 <== NOT EXECUTED 40017d6c: 81 e8 00 00 restore <== NOT EXECUTED 40017d70: 81 c7 e0 08 ret <== NOT EXECUTED 40017d74: 81 e8 00 00 restore <== NOT EXECUTED 40016d20 : int ioctl( int fd, ioctl_command_t command, ... ) { 40016d20: 9d e3 bf 90 save %sp, -112, %sp va_list ap; rtems_status_code rc; rtems_libio_t *iop; void *buffer; rtems_libio_check_fd( fd ); 40016d24: 03 10 00 9d sethi %hi(0x40027400), %g1 40016d28: c2 00 62 8c ld [ %g1 + 0x28c ], %g1 ! 4002768c int ioctl( int fd, ioctl_command_t command, ... ) { 40016d2c: f6 27 a0 50 st %i3, [ %fp + 0x50 ] 40016d30: f8 27 a0 54 st %i4, [ %fp + 0x54 ] 40016d34: fa 27 a0 58 st %i5, [ %fp + 0x58 ] 40016d38: f4 27 a0 4c st %i2, [ %fp + 0x4c ] va_list ap; rtems_status_code rc; rtems_libio_t *iop; void *buffer; rtems_libio_check_fd( fd ); 40016d3c: 80 a6 00 01 cmp %i0, %g1 40016d40: 1a 80 00 14 bcc 40016d90 40016d44: 92 10 00 19 mov %i1, %o1 iop = rtems_libio_iop( fd ); 40016d48: 03 10 00 a6 sethi %hi(0x40029800), %g1 40016d4c: c6 00 62 98 ld [ %g1 + 0x298 ], %g3 ! 40029a98 40016d50: 85 2e 20 02 sll %i0, 2, %g2 40016d54: 83 2e 20 04 sll %i0, 4, %g1 40016d58: 82 20 40 02 sub %g1, %g2, %g1 40016d5c: 82 00 40 18 add %g1, %i0, %g1 40016d60: 83 28 60 02 sll %g1, 2, %g1 40016d64: 90 00 40 03 add %g1, %g3, %o0 rtems_libio_check_is_open(iop); 40016d68: c2 02 20 0c ld [ %o0 + 0xc ], %g1 40016d6c: 80 88 61 00 btst 0x100, %g1 40016d70: 02 80 00 08 be 40016d90 40016d74: 01 00 00 00 nop /* * Now process the ioctl(). */ if ( !iop->handlers ) 40016d78: c4 02 20 30 ld [ %o0 + 0x30 ], %g2 iop = rtems_libio_iop( fd ); rtems_libio_check_is_open(iop); va_start(ap, command); buffer = va_arg(ap, void *); 40016d7c: 82 07 a0 50 add %fp, 0x50, %g1 40016d80: c2 27 bf f4 st %g1, [ %fp + -12 ] /* * Now process the ioctl(). */ if ( !iop->handlers ) 40016d84: 80 a0 a0 00 cmp %g2, 0 40016d88: 12 80 00 06 bne 40016da0 40016d8c: 94 10 00 1a mov %i2, %o2 rtems_set_errno_and_return_minus_one( EBADF ); 40016d90: 40 00 02 56 call 400176e8 <__errno> <== NOT EXECUTED 40016d94: 01 00 00 00 nop <== NOT EXECUTED 40016d98: 10 80 00 09 b 40016dbc <== NOT EXECUTED 40016d9c: 82 10 20 09 mov 9, %g1 ! 9 <== NOT EXECUTED if ( !iop->handlers->ioctl_h ) 40016da0: c2 00 a0 10 ld [ %g2 + 0x10 ], %g1 40016da4: 80 a0 60 00 cmp %g1, 0 40016da8: 12 80 00 08 bne 40016dc8 40016dac: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( ENOTSUP ); 40016db0: 40 00 02 4e call 400176e8 <__errno> <== NOT EXECUTED 40016db4: 01 00 00 00 nop <== NOT EXECUTED 40016db8: 82 10 20 86 mov 0x86, %g1 ! 86 <== NOT EXECUTED 40016dbc: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 40016dc0: 10 80 00 04 b 40016dd0 <== NOT EXECUTED 40016dc4: 90 10 3f ff mov -1, %o0 <== NOT EXECUTED rc = (*iop->handlers->ioctl_h)( iop, command, buffer ); 40016dc8: 9f c0 40 00 call %g1 40016dcc: 01 00 00 00 nop return rc; } 40016dd0: 81 c7 e0 08 ret 40016dd4: 91 e8 00 08 restore %g0, %o0, %o0 400049f8 : /* * Process a single input character */ static int iproc (unsigned char c, struct rtems_termios_tty *tty) { 400049f8: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED if (tty->termios.c_iflag & ISTRIP) 400049fc: c4 06 60 30 ld [ %i1 + 0x30 ], %g2 <== NOT EXECUTED 40004a00: 80 88 a0 20 btst 0x20, %g2 <== NOT EXECUTED 40004a04: 02 80 00 03 be 40004a10 <== NOT EXECUTED 40004a08: a2 10 00 18 mov %i0, %l1 <== NOT EXECUTED c &= 0x7f; 40004a0c: a2 0e 20 7f and %i0, 0x7f, %l1 <== NOT EXECUTED if (tty->termios.c_iflag & IUCLC) 40004a10: 80 88 a2 00 btst 0x200, %g2 <== NOT EXECUTED 40004a14: 02 80 00 0b be 40004a40 <== NOT EXECUTED 40004a18: 82 0c 60 ff and %l1, 0xff, %g1 <== NOT EXECUTED c = tolower (c); 40004a1c: 03 10 00 68 sethi %hi(0x4001a000), %g1 <== NOT EXECUTED 40004a20: c2 00 63 68 ld [ %g1 + 0x368 ], %g1 ! 4001a368 <__ctype_ptr> <== NOT EXECUTED 40004a24: 90 0c 60 ff and %l1, 0xff, %o0 <== NOT EXECUTED 40004a28: c2 08 40 08 ldub [ %g1 + %o0 ], %g1 <== NOT EXECUTED 40004a2c: 80 88 60 01 btst 1, %g1 <== NOT EXECUTED 40004a30: 32 80 00 02 bne,a 40004a38 <== NOT EXECUTED 40004a34: 90 02 20 20 add %o0, 0x20, %o0 <== NOT EXECUTED 40004a38: a2 10 00 08 mov %o0, %l1 <== NOT EXECUTED if (c == '\r') { 40004a3c: 82 0c 60 ff and %l1, 0xff, %g1 <== NOT EXECUTED 40004a40: 80 a0 60 0d cmp %g1, 0xd <== NOT EXECUTED 40004a44: 12 80 00 09 bne 40004a68 <== NOT EXECUTED 40004a48: 80 a0 60 0a cmp %g1, 0xa <== NOT EXECUTED if (tty->termios.c_iflag & IGNCR) 40004a4c: 80 88 a0 80 btst 0x80, %g2 <== NOT EXECUTED 40004a50: 12 80 00 59 bne 40004bb4 <== NOT EXECUTED 40004a54: 80 88 a1 00 btst 0x100, %g2 <== NOT EXECUTED return 0; if (tty->termios.c_iflag & ICRNL) 40004a58: 32 80 00 0d bne,a 40004a8c <== NOT EXECUTED 40004a5c: a2 10 20 0a mov 0xa, %l1 <== NOT EXECUTED c = '\n'; } else if ((c == '\n') && (tty->termios.c_iflag & INLCR)) { c = '\r'; } if ((c != '\0') && (tty->termios.c_lflag & ICANON)) { 40004a60: 10 80 00 0c b 40004a90 <== NOT EXECUTED 40004a64: c4 06 60 3c ld [ %i1 + 0x3c ], %g2 <== NOT EXECUTED 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)) { 40004a68: 12 80 00 07 bne 40004a84 <== NOT EXECUTED 40004a6c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40004a70: 80 88 a0 40 btst 0x40, %g2 <== NOT EXECUTED 40004a74: 32 80 00 06 bne,a 40004a8c <== NOT EXECUTED 40004a78: a2 10 20 0d mov 0xd, %l1 <== NOT EXECUTED c = '\r'; } if ((c != '\0') && (tty->termios.c_lflag & ICANON)) { 40004a7c: 10 80 00 05 b 40004a90 <== NOT EXECUTED 40004a80: c4 06 60 3c ld [ %i1 + 0x3c ], %g2 <== NOT EXECUTED 40004a84: 02 80 00 3a be 40004b6c <== NOT EXECUTED 40004a88: 03 10 00 67 sethi %hi(0x40019c00), %g1 <== NOT EXECUTED 40004a8c: c4 06 60 3c ld [ %i1 + 0x3c ], %g2 <== NOT EXECUTED 40004a90: 80 88 a0 02 btst 2, %g2 <== NOT EXECUTED 40004a94: 02 80 00 36 be 40004b6c <== NOT EXECUTED 40004a98: 03 10 00 67 sethi %hi(0x40019c00), %g1 <== NOT EXECUTED if (c == tty->termios.c_cc[VERASE]) { 40004a9c: c2 0e 60 43 ldub [ %i1 + 0x43 ], %g1 <== NOT EXECUTED 40004aa0: a0 0c 60 ff and %l1, 0xff, %l0 <== NOT EXECUTED erase (tty, 0); 40004aa4: 90 10 00 19 mov %i1, %o0 <== NOT EXECUTED } else if ((c == '\n') && (tty->termios.c_iflag & INLCR)) { c = '\r'; } if ((c != '\0') && (tty->termios.c_lflag & ICANON)) { if (c == tty->termios.c_cc[VERASE]) { 40004aa8: 80 a4 00 01 cmp %l0, %g1 <== NOT EXECUTED 40004aac: 02 80 00 08 be 40004acc <== NOT EXECUTED 40004ab0: 92 10 20 00 clr %o1 <== NOT EXECUTED erase (tty, 0); return 0; } else if (c == tty->termios.c_cc[VKILL]) { 40004ab4: c2 0e 60 44 ldub [ %i1 + 0x44 ], %g1 <== NOT EXECUTED 40004ab8: 80 a4 00 01 cmp %l0, %g1 <== NOT EXECUTED 40004abc: 32 80 00 07 bne,a 40004ad8 <== NOT EXECUTED 40004ac0: c2 0e 60 45 ldub [ %i1 + 0x45 ], %g1 <== NOT EXECUTED erase (tty, 1); 40004ac4: 90 10 00 19 mov %i1, %o0 <== NOT EXECUTED 40004ac8: 92 10 20 01 mov 1, %o1 <== NOT EXECUTED 40004acc: 7f ff ff 3e call 400047c4 <== NOT EXECUTED 40004ad0: b0 10 20 00 clr %i0 <== NOT EXECUTED 40004ad4: 30 80 00 39 b,a 40004bb8 <== NOT EXECUTED return 0; } else if (c == tty->termios.c_cc[VEOF]) { 40004ad8: 80 a4 00 01 cmp %l0, %g1 <== NOT EXECUTED 40004adc: 02 80 00 37 be 40004bb8 <== NOT EXECUTED 40004ae0: b0 10 20 01 mov 1, %i0 <== NOT EXECUTED return 1; } else if (c == '\n') { 40004ae4: 80 a4 20 0a cmp %l0, 0xa <== NOT EXECUTED 40004ae8: 32 80 00 0d bne,a 40004b1c <== NOT EXECUTED 40004aec: c2 0e 60 4c ldub [ %i1 + 0x4c ], %g1 <== NOT EXECUTED if (tty->termios.c_lflag & (ECHO | ECHONL)) 40004af0: 80 88 a0 48 btst 0x48, %g2 <== NOT EXECUTED 40004af4: 22 80 00 06 be,a 40004b0c <== NOT EXECUTED 40004af8: c2 06 60 20 ld [ %i1 + 0x20 ], %g1 <== NOT EXECUTED echo (c, tty); 40004afc: 90 10 20 0a mov 0xa, %o0 <== NOT EXECUTED 40004b00: 7f ff ff 0f call 4000473c <== NOT EXECUTED 40004b04: 92 10 00 19 mov %i1, %o1 <== NOT EXECUTED tty->cbuf[tty->ccount++] = c; 40004b08: c2 06 60 20 ld [ %i1 + 0x20 ], %g1 <== NOT EXECUTED 40004b0c: c4 06 60 1c ld [ %i1 + 0x1c ], %g2 <== NOT EXECUTED 40004b10: 86 00 60 01 add %g1, 1, %g3 <== NOT EXECUTED 40004b14: 10 80 00 13 b 40004b60 <== NOT EXECUTED 40004b18: e0 28 80 01 stb %l0, [ %g2 + %g1 ] <== NOT EXECUTED return 1; } else if ((c == tty->termios.c_cc[VEOL]) 40004b1c: 80 a4 00 01 cmp %l0, %g1 <== NOT EXECUTED 40004b20: 02 80 00 07 be 40004b3c <== NOT EXECUTED 40004b24: 80 88 a0 08 btst 8, %g2 <== NOT EXECUTED 40004b28: c2 0e 60 51 ldub [ %i1 + 0x51 ], %g1 <== NOT EXECUTED 40004b2c: 80 a4 00 01 cmp %l0, %g1 <== NOT EXECUTED 40004b30: 12 80 00 0f bne 40004b6c <== NOT EXECUTED 40004b34: 03 10 00 67 sethi %hi(0x40019c00), %g1 <== NOT EXECUTED || (c == tty->termios.c_cc[VEOL2])) { if (tty->termios.c_lflag & ECHO) 40004b38: 80 88 a0 08 btst 8, %g2 <== NOT EXECUTED 40004b3c: 22 80 00 06 be,a 40004b54 <== NOT EXECUTED 40004b40: c2 06 60 20 ld [ %i1 + 0x20 ], %g1 <== NOT EXECUTED echo (c, tty); 40004b44: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 40004b48: 7f ff fe fd call 4000473c <== NOT EXECUTED 40004b4c: 92 10 00 19 mov %i1, %o1 <== NOT EXECUTED tty->cbuf[tty->ccount++] = c; 40004b50: c2 06 60 20 ld [ %i1 + 0x20 ], %g1 <== NOT EXECUTED 40004b54: c4 06 60 1c ld [ %i1 + 0x1c ], %g2 <== NOT EXECUTED 40004b58: 86 00 60 01 add %g1, 1, %g3 <== NOT EXECUTED 40004b5c: e2 28 80 01 stb %l1, [ %g2 + %g1 ] <== NOT EXECUTED 40004b60: c6 26 60 20 st %g3, [ %i1 + 0x20 ] <== NOT EXECUTED 40004b64: 81 c7 e0 08 ret <== NOT EXECUTED 40004b68: 91 e8 20 01 restore %g0, 1, %o0 <== NOT EXECUTED } /* * FIXME: Should do IMAXBEL handling somehow */ if (tty->ccount < (CBUFSIZE-1)) { 40004b6c: c4 06 60 20 ld [ %i1 + 0x20 ], %g2 <== NOT EXECUTED 40004b70: c2 00 63 24 ld [ %g1 + 0x324 ], %g1 <== NOT EXECUTED 40004b74: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 40004b78: 80 a0 80 01 cmp %g2, %g1 <== NOT EXECUTED 40004b7c: 16 80 00 0f bge 40004bb8 <== NOT EXECUTED 40004b80: b0 10 20 00 clr %i0 <== NOT EXECUTED if (tty->termios.c_lflag & ECHO) 40004b84: c2 06 60 3c ld [ %i1 + 0x3c ], %g1 <== NOT EXECUTED 40004b88: 80 88 60 08 btst 8, %g1 <== NOT EXECUTED 40004b8c: 22 80 00 06 be,a 40004ba4 <== NOT EXECUTED 40004b90: c2 06 60 20 ld [ %i1 + 0x20 ], %g1 <== NOT EXECUTED echo (c, tty); 40004b94: 90 0c 60 ff and %l1, 0xff, %o0 <== NOT EXECUTED 40004b98: 7f ff fe e9 call 4000473c <== NOT EXECUTED 40004b9c: 92 10 00 19 mov %i1, %o1 <== NOT EXECUTED tty->cbuf[tty->ccount++] = c; 40004ba0: c2 06 60 20 ld [ %i1 + 0x20 ], %g1 <== NOT EXECUTED 40004ba4: c4 06 60 1c ld [ %i1 + 0x1c ], %g2 <== NOT EXECUTED 40004ba8: 86 00 60 01 add %g1, 1, %g3 <== NOT EXECUTED 40004bac: e2 28 80 01 stb %l1, [ %g2 + %g1 ] <== NOT EXECUTED 40004bb0: c6 26 60 20 st %g3, [ %i1 + 0x20 ] <== NOT EXECUTED 40004bb4: b0 10 20 00 clr %i0 <== NOT EXECUTED } return 0; } 40004bb8: 81 c7 e0 08 ret <== NOT EXECUTED 40004bbc: 81 e8 00 00 restore <== NOT EXECUTED 400231ac : int killinfo( pid_t pid, int sig, const union sigval *value ) { 400231ac: 9d e3 bf 88 save %sp, -120, %sp /* * Only supported for the "calling process" (i.e. this node). */ if ( pid != getpid() ) 400231b0: 7f ff ff 15 call 40022e04 400231b4: 01 00 00 00 nop 400231b8: 80 a6 00 08 cmp %i0, %o0 400231bc: 02 80 00 06 be 400231d4 400231c0: 80 a6 60 00 cmp %i1, 0 rtems_set_errno_and_return_minus_one( ESRCH ); 400231c4: 7f ff d1 49 call 400176e8 <__errno> 400231c8: 01 00 00 00 nop 400231cc: 10 80 00 07 b 400231e8 400231d0: 82 10 20 03 mov 3, %g1 ! 3 /* * Validate the signal passed. */ if ( !sig ) 400231d4: 12 80 00 08 bne 400231f4 400231d8: 82 06 7f ff add %i1, -1, %g1 rtems_set_errno_and_return_minus_one( EINVAL ); 400231dc: 7f ff d1 43 call 400176e8 <__errno> 400231e0: 01 00 00 00 nop 400231e4: 82 10 20 16 mov 0x16, %g1 ! 16 400231e8: c2 22 00 00 st %g1, [ %o0 ] 400231ec: 10 80 00 bc b 400234dc 400231f0: 90 10 3f ff mov -1, %o0 if ( !is_valid_signo(sig) ) 400231f4: 80 a0 60 1f cmp %g1, 0x1f 400231f8: 18 bf ff f9 bgu 400231dc 400231fc: 83 2e 60 02 sll %i1, 2, %g1 /* * If the signal is being ignored, then we are out of here. */ if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) { 40023200: 85 2e 60 04 sll %i1, 4, %g2 40023204: 84 20 80 01 sub %g2, %g1, %g2 40023208: 03 10 00 a8 sethi %hi(0x4002a000), %g1 4002320c: 82 10 63 78 or %g1, 0x378, %g1 ! 4002a378 <_POSIX_signals_Vectors> 40023210: 84 00 80 01 add %g2, %g1, %g2 40023214: c2 00 a0 08 ld [ %g2 + 8 ], %g1 40023218: 80 a0 60 01 cmp %g1, 1 4002321c: 02 80 00 b0 be 400234dc 40023220: 90 10 20 00 clr %o0 * 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. */ switch ( sig ) { 40023224: 80 a6 60 0b cmp %i1, 0xb 40023228: 18 80 00 0d bgu 4002325c 4002322c: 84 10 20 01 mov 1, %g2 40023230: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED 40023234: 83 28 40 19 sll %g1, %i1, %g1 <== NOT EXECUTED 40023238: 80 88 69 10 btst 0x910, %g1 <== NOT EXECUTED 4002323c: 22 80 00 09 be,a 40023260 <== NOT EXECUTED 40023240: f2 27 bf ec st %i1, [ %fp + -20 ] <== NOT EXECUTED case SIGFPE: case SIGILL: case SIGSEGV: return pthread_kill( pthread_self(), sig ); 40023244: 40 00 01 4c call 40023774 <== NOT EXECUTED 40023248: 01 00 00 00 nop <== NOT EXECUTED 4002324c: 40 00 01 09 call 40023670 <== NOT EXECUTED 40023250: 92 10 00 19 mov %i1, %o1 <== NOT EXECUTED _Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node ); } _Thread_Enable_dispatch(); return 0; } 40023254: 81 c7 e0 08 ret <== NOT EXECUTED 40023258: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED /* * Build up a siginfo structure */ siginfo = &siginfo_struct; siginfo->si_signo = sig; 4002325c: f2 27 bf ec st %i1, [ %fp + -20 ] siginfo->si_code = SI_USER; 40023260: c4 27 bf f0 st %g2, [ %fp + -16 ] return pthread_kill( pthread_self(), sig ); default: break; } mask = signo_to_mask( sig ); 40023264: 82 06 7f ff add %i1, -1, %g1 */ siginfo = &siginfo_struct; siginfo->si_signo = sig; siginfo->si_code = SI_USER; if ( !value ) { 40023268: 80 a6 a0 00 cmp %i2, 0 4002326c: 12 80 00 04 bne 4002327c 40023270: b1 28 80 01 sll %g2, %g1, %i0 siginfo->si_value.sival_int = 0; 40023274: 10 80 00 04 b 40023284 40023278: c0 27 bf f4 clr [ %fp + -12 ] } else { siginfo->si_value = *value; 4002327c: c2 06 80 00 ld [ %i2 ], %g1 40023280: c2 27 bf f4 st %g1, [ %fp + -12 ] rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40023284: 05 10 00 a7 sethi %hi(0x40029c00), %g2 40023288: c2 00 a0 60 ld [ %g2 + 0x60 ], %g1 ! 40029c60 <_Thread_Dispatch_disable_level> 4002328c: 82 00 60 01 inc %g1 40023290: c2 20 a0 60 st %g1, [ %g2 + 0x60 ] /* * 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; 40023294: 03 10 00 a7 sethi %hi(0x40029c00), %g1 40023298: c4 00 61 3c ld [ %g1 + 0x13c ], %g2 ! 40029d3c <_Thread_Executing> api = the_thread->API_Extensions[ THREAD_API_POSIX ]; if ( _POSIX_signals_Is_interested( api, mask ) ) { 4002329c: c2 00 a1 70 ld [ %g2 + 0x170 ], %g1 400232a0: c2 00 60 c4 ld [ %g1 + 0xc4 ], %g1 400232a4: 80 ae 00 01 andncc %i0, %g1, %g0 400232a8: 12 80 00 65 bne 4002343c 400232ac: 03 10 00 a9 sethi %hi(0x4002a400), %g1 goto process_it; 400232b0: 88 10 61 04 or %g1, 0x104, %g4 ! 4002a504 <_POSIX_signals_Wait_queue> */ /* XXX violation of visibility -- need to define thread queue support */ for( index=0 ; index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ; 400232b4: 98 01 20 30 add %g4, 0x30, %o4 index++ ) { the_chain = &_POSIX_signals_Wait_queue.Queues.Priority[ index ]; for ( the_node = the_chain->first ; 400232b8: c2 01 00 00 ld [ %g4 ], %g1 !_Chain_Is_tail( the_chain, the_node ) ; 400232bc: 10 80 00 0b b 400232e8 400232c0: 9a 01 20 04 add %g4, 4, %o5 the_node = the_node->next ) { the_thread = (Thread_Control *)the_node; api = the_thread->API_Extensions[ THREAD_API_POSIX ]; if ((the_thread->Wait.option & mask) || (~api->signals_blocked & mask)) { 400232c4: c2 00 a0 30 ld [ %g2 + 0x30 ], %g1 400232c8: 80 8e 00 01 btst %i0, %g1 400232cc: 12 80 00 5c bne 4002343c 400232d0: c6 00 a1 70 ld [ %g2 + 0x170 ], %g3 400232d4: c2 00 e0 c4 ld [ %g3 + 0xc4 ], %g1 <== NOT EXECUTED 400232d8: 80 ae 00 01 andncc %i0, %g1, %g0 <== NOT EXECUTED 400232dc: 12 80 00 59 bne 40023440 <== NOT EXECUTED 400232e0: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED the_chain = &_POSIX_signals_Wait_queue.Queues.Priority[ index ]; for ( the_node = the_chain->first ; !_Chain_Is_tail( the_chain, the_node ) ; the_node = the_node->next ) { 400232e4: c2 00 80 00 ld [ %g2 ], %g1 <== NOT EXECUTED index++ ) { the_chain = &_POSIX_signals_Wait_queue.Queues.Priority[ index ]; for ( the_node = the_chain->first ; !_Chain_Is_tail( the_chain, the_node ) ; 400232e8: 80 a0 40 0d cmp %g1, %o5 400232ec: 12 bf ff f6 bne 400232c4 400232f0: 84 10 00 01 mov %g1, %g2 400232f4: 88 01 20 0c add %g4, 0xc, %g4 */ /* XXX violation of visibility -- need to define thread queue support */ for( index=0 ; index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ; 400232f8: 80 a1 00 0c cmp %g4, %o4 400232fc: 32 bf ff f0 bne,a 400232bc 40023300: c2 01 00 00 ld [ %g4 ], %g1 the_api++ ) { if ( the_api == OBJECTS_INTERNAL_THREADS ) continue; if ( !_Objects_Information_table[ the_api ] ) /* API not installed */ 40023304: 03 10 00 a6 sethi %hi(0x40029800), %g1 40023308: ae 10 63 c0 or %g1, 0x3c0, %l7 ! 40029bc0 <_Objects_Information_table> continue; maximum = the_info->maximum; object_table = the_info->local_table; assert( object_table ); /* always at least 1 entry */ 4002330c: 03 10 00 9d sethi %hi(0x40027400), %g1 */ /* XXX violation of visibility -- need to define thread queue support */ for( index=0 ; index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ; 40023310: a4 10 21 00 mov 0x100, %l2 continue; maximum = the_info->maximum; object_table = the_info->local_table; assert( object_table ); /* always at least 1 entry */ 40023314: ac 10 61 b0 or %g1, 0x1b0, %l6 */ /* XXX violation of visibility -- need to define thread queue support */ for( index=0 ; index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ; 40023318: a0 10 20 00 clr %l0 continue; maximum = the_info->maximum; object_table = the_info->local_table; assert( object_table ); /* always at least 1 entry */ 4002331c: 03 10 00 9d sethi %hi(0x40027400), %g1 */ /* XXX violation of visibility -- need to define thread queue support */ for( index=0 ; index < TASK_QUEUE_DATA_NUMBER_OF_PRIORITY_HEADERS ; 40023320: b4 10 20 02 mov 2, %i2 continue; maximum = the_info->maximum; object_table = the_info->local_table; assert( object_table ); /* always at least 1 entry */ 40023324: aa 10 61 f8 or %g1, 0x1f8, %l5 * Now we know both threads are blocked. * If the interested thread is interruptible, then just use it. */ /* XXX need a new states macro */ if ( interested_thread->current_state & STATES_INTERRUPTIBLE_BY_SIGNAL ) 40023328: 10 80 00 04 b 40023338 4002332c: 29 04 00 00 sethi %hi(0x10000000), %l4 for ( the_api = 2; the_api <= OBJECTS_APIS_LAST; the_api++ ) { if ( the_api == OBJECTS_INTERNAL_THREADS ) 40023330: 22 80 00 3d be,a 40023424 40023334: b4 06 a0 01 inc %i2 <== NOT EXECUTED continue; if ( !_Objects_Information_table[ the_api ] ) /* API not installed */ 40023338: 83 2e a0 02 sll %i2, 2, %g1 4002333c: c2 05 c0 01 ld [ %l7 + %g1 ], %g1 40023340: 80 a0 60 00 cmp %g1, 0 40023344: 22 80 00 38 be,a 40023424 40023348: b4 06 a0 01 inc %i2 continue; the_info = _Objects_Information_table[ the_api ][ 1 ]; 4002334c: c2 00 60 04 ld [ %g1 + 4 ], %g1 if ( !the_info ) /* manager not installed */ 40023350: 80 a0 60 00 cmp %g1, 0 40023354: 22 80 00 34 be,a 40023424 40023358: b4 06 a0 01 inc %i2 <== NOT EXECUTED continue; maximum = the_info->maximum; object_table = the_info->local_table; 4002335c: e2 00 60 20 ld [ %g1 + 0x20 ], %l1 assert( object_table ); /* always at least 1 entry */ 40023360: 80 a4 60 00 cmp %l1, 0 40023364: 12 80 00 06 bne 4002337c 40023368: e6 10 60 10 lduh [ %g1 + 0x10 ], %l3 4002336c: 90 10 00 16 mov %l6, %o0 <== NOT EXECUTED 40023370: 92 10 20 c1 mov 0xc1, %o1 <== NOT EXECUTED 40023374: 7f ff 8e a4 call 40006e04 <__assert> <== NOT EXECUTED 40023378: 94 10 00 15 mov %l5, %o2 <== NOT EXECUTED 4002337c: 10 80 00 26 b 40023414 40023380: 9a 10 20 01 mov 1, %o5 for ( index = 1 ; index <= maximum ; index++ ) { the_thread = (Thread_Control *) object_table[ index ]; 40023384: c4 00 40 11 ld [ %g1 + %l1 ], %g2 if ( !the_thread ) 40023388: 80 a0 a0 00 cmp %g2, 0 4002338c: 22 80 00 22 be,a 40023414 40023390: 9a 03 60 01 inc %o5 /* * If this thread is of lower priority than the interested thread, * go on to the next thread. */ if ( the_thread->current_priority > interested_priority ) 40023394: c8 00 a0 14 ld [ %g2 + 0x14 ], %g4 40023398: 80 a1 00 12 cmp %g4, %l2 4002339c: 38 80 00 1e bgu,a 40023414 400233a0: 9a 03 60 01 inc %o5 <== NOT EXECUTED /* * If this thread is not interested, then go on to the next thread. */ api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 400233a4: c2 00 a1 70 ld [ %g2 + 0x170 ], %g1 if ( !api || !_POSIX_signals_Is_interested( api, mask ) ) 400233a8: 80 a0 60 00 cmp %g1, 0 400233ac: 22 80 00 1a be,a 40023414 400233b0: 9a 03 60 01 inc %o5 <== NOT EXECUTED 400233b4: c2 00 60 c4 ld [ %g1 + 0xc4 ], %g1 400233b8: 80 ae 00 01 andncc %i0, %g1, %g0 400233bc: 22 80 00 16 be,a 40023414 400233c0: 9a 03 60 01 inc %o5 * Now we know the thread under connsideration is interested. * If the thread under consideration is of higher priority, then * it becomes the interested thread. */ if ( the_thread->current_priority < interested_priority ) { 400233c4: 80 a1 00 12 cmp %g4, %l2 400233c8: 2a 80 00 11 bcs,a 4002340c 400233cc: a0 10 00 02 mov %g2, %l0 * Now the thread and the interested thread have the same priority. * If the interested thread is ready, then we don't need to send it * to a blocked thread. */ if ( _States_Is_ready( interested_thread->current_state ) ) 400233d0: c6 04 20 10 ld [ %l0 + 0x10 ], %g3 <== NOT EXECUTED 400233d4: 80 a0 e0 00 cmp %g3, 0 <== NOT EXECUTED 400233d8: 22 80 00 0f be,a 40023414 <== NOT EXECUTED 400233dc: 9a 03 60 01 inc %o5 <== NOT EXECUTED * Now the interested thread is blocked. * If the thread we are considering is not, the it becomes the * interested thread. */ if ( _States_Is_ready( the_thread->current_state ) ) { 400233e0: c2 00 a0 10 ld [ %g2 + 0x10 ], %g1 <== NOT EXECUTED 400233e4: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400233e8: 22 80 00 09 be,a 4002340c <== NOT EXECUTED 400233ec: a0 10 00 02 mov %g2, %l0 <== NOT EXECUTED * Now we know both threads are blocked. * If the interested thread is interruptible, then just use it. */ /* XXX need a new states macro */ if ( interested_thread->current_state & STATES_INTERRUPTIBLE_BY_SIGNAL ) 400233f0: 80 88 c0 14 btst %g3, %l4 <== NOT EXECUTED 400233f4: 32 80 00 08 bne,a 40023414 <== NOT EXECUTED 400233f8: 9a 03 60 01 inc %o5 <== NOT EXECUTED * If the thread under consideration is interruptible by a signal, * then it becomes the interested thread. */ /* XXX need a new states macro */ if ( the_thread->current_state & STATES_INTERRUPTIBLE_BY_SIGNAL ) { 400233fc: 80 88 40 14 btst %g1, %l4 <== NOT EXECUTED 40023400: 22 80 00 05 be,a 40023414 <== NOT EXECUTED 40023404: 9a 03 60 01 inc %o5 <== NOT EXECUTED 40023408: a0 10 00 02 mov %g2, %l0 <== NOT EXECUTED 4002340c: a4 10 00 04 mov %g4, %l2 maximum = the_info->maximum; object_table = the_info->local_table; assert( object_table ); /* always at least 1 entry */ for ( index = 1 ; index <= maximum ; index++ ) { 40023410: 9a 03 60 01 inc %o5 40023414: 80 a3 40 13 cmp %o5, %l3 40023418: 08 bf ff db bleu 40023384 4002341c: 83 2b 60 02 sll %o5, 2, %g1 interested_thread = NULL; interested_priority = PRIORITY_MAXIMUM + 1; for ( the_api = 2; the_api <= OBJECTS_APIS_LAST; the_api++ ) { 40023420: b4 06 a0 01 inc %i2 interested_thread = NULL; interested_priority = PRIORITY_MAXIMUM + 1; for ( the_api = 2; the_api <= OBJECTS_APIS_LAST; 40023424: 80 a6 a0 04 cmp %i2, 4 40023428: 08 bf ff c2 bleu 40023330 4002342c: 80 a6 a0 01 cmp %i2, 1 interested_priority = the_thread->current_priority; } } } if ( interested_thread ) { 40023430: 80 a4 20 00 cmp %l0, 0 40023434: 02 80 00 0b be 40023460 40023438: 84 10 00 10 mov %l0, %g2 * evaluate the signals pending. */ process_it: the_thread->do_post_task_switch_extension = TRUE; 4002343c: 82 10 20 01 mov 1, %g1 /* * 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 ) ) { 40023440: 90 10 00 02 mov %g2, %o0 * evaluate the signals pending. */ process_it: the_thread->do_post_task_switch_extension = TRUE; 40023444: c2 20 a0 78 st %g1, [ %g2 + 0x78 ] /* * 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 ) ) { 40023448: 92 10 00 19 mov %i1, %o1 4002344c: 40 00 00 37 call 40023528 <_POSIX_signals_Unblock_thread> 40023450: 94 07 bf ec add %fp, -20, %o2 40023454: 80 a2 20 00 cmp %o0, 0 40023458: 12 80 00 1e bne 400234d0 4002345c: 01 00 00 00 nop /* * 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 ); 40023460: 40 00 00 22 call 400234e8 <_POSIX_signals_Set_process_signals> 40023464: 90 10 00 18 mov %i0, %o0 if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) { 40023468: 83 2e 60 02 sll %i1, 2, %g1 4002346c: 85 2e 60 04 sll %i1, 4, %g2 40023470: b2 20 80 01 sub %g2, %g1, %i1 40023474: 03 10 00 a8 sethi %hi(0x4002a000), %g1 40023478: 82 10 63 78 or %g1, 0x378, %g1 ! 4002a378 <_POSIX_signals_Vectors> 4002347c: c2 00 40 19 ld [ %g1 + %i1 ], %g1 40023480: 80 a0 60 02 cmp %g1, 2 40023484: 12 80 00 13 bne 400234d0 40023488: 11 10 00 a9 sethi %hi(0x4002a400), %o0 psiginfo = (POSIX_signals_Siginfo_node *) 4002348c: 7f ff a2 ae call 4000bf44 <_Chain_Get> 40023490: 90 12 20 f8 or %o0, 0xf8, %o0 ! 4002a4f8 <_POSIX_signals_Inactive_siginfo> _Chain_Get( &_POSIX_signals_Inactive_siginfo ); if ( !psiginfo ) { 40023494: b4 92 20 00 orcc %o0, 0, %i2 40023498: 12 80 00 06 bne 400234b0 4002349c: 92 07 bf ec add %fp, -20, %o1 rtems_set_errno_and_return_minus_one( EAGAIN ); 400234a0: 7f ff d0 92 call 400176e8 <__errno> <== NOT EXECUTED 400234a4: 01 00 00 00 nop <== NOT EXECUTED 400234a8: 10 bf ff 50 b 400231e8 <== NOT EXECUTED 400234ac: 82 10 20 0b mov 0xb, %g1 ! b <== NOT EXECUTED } psiginfo->Info = *siginfo; 400234b0: 90 06 a0 08 add %i2, 8, %o0 400234b4: 7f ff d6 7f call 40018eb0 400234b8: 94 10 20 0c mov 0xc, %o2 _Chain_Append( &_POSIX_signals_Siginfo[ sig ], &psiginfo->Node ); 400234bc: 11 10 00 a9 sethi %hi(0x4002a400), %o0 400234c0: 92 10 00 1a mov %i2, %o1 400234c4: 90 12 21 48 or %o0, 0x148, %o0 400234c8: 7f ff a2 93 call 4000bf14 <_Chain_Append> 400234cc: 90 06 40 08 add %i1, %o0, %o0 } _Thread_Enable_dispatch(); 400234d0: 7f ff ff 2a call 40023178 <_Thread_Enable_dispatch> 400234d4: 01 00 00 00 nop 400234d8: 90 10 20 00 clr %o0 ! 0 return 0; } 400234dc: b0 10 00 08 mov %o0, %i0 400234e0: 81 c7 e0 08 ret 400234e4: 81 e8 00 00 restore 400184bc : extern void _wrapup_reent(struct _reent *); extern void _reclaim_reent(struct _reent *); void libc_wrapup(void) { 400184bc: 9d e3 bf 98 save %sp, -104, %sp /* * In case RTEMS is already down, don't do this. It could be * dangerous. */ if (!_System_state_Is_up(_System_state_Get())) 400184c0: 03 10 00 6b sethi %hi(0x4001ac00), %g1 400184c4: c2 00 63 b0 ld [ %g1 + 0x3b0 ], %g1 ! 4001afb0 <_System_state_Current> 400184c8: 80 a0 60 03 cmp %g1, 3 400184cc: 12 80 00 15 bne 40018520 400184d0: 21 10 00 68 sethi %hi(0x4001a000), %l0 /* * This was already done if the user called exit() directly . _wrapup_reent(0); */ if (_REENT != &libc_global_reent) { 400184d4: c4 04 23 70 ld [ %l0 + 0x370 ], %g2 ! 4001a370 <_impure_ptr> 400184d8: 03 10 00 66 sethi %hi(0x40019800), %g1 400184dc: b0 10 63 20 or %g1, 0x320, %i0 ! 40019b20 400184e0: 80 a0 80 18 cmp %g2, %i0 400184e4: 02 80 00 06 be 400184fc 400184e8: c2 04 23 70 ld [ %l0 + 0x370 ], %g1 _wrapup_reent(&libc_global_reent); 400184ec: 40 00 00 a1 call 40018770 <_wrapup_reent> 400184f0: 90 10 00 18 mov %i0, %o0 /* Don't reclaim this one, just in case we do printfs * on the way out to ROM. */ _reclaim_reent(&libc_global_reent); #endif _REENT = &libc_global_reent; 400184f4: f0 24 23 70 st %i0, [ %l0 + 0x370 ] * * Should this be changed to do *all* file streams? * _fwalk (_REENT, fclose); */ fclose (stdin); 400184f8: c2 04 23 70 ld [ %l0 + 0x370 ], %g1 400184fc: 7f ff db 06 call 4000f114 40018500: d0 00 60 04 ld [ %g1 + 4 ], %o0 fclose (stdout); 40018504: c2 04 23 70 ld [ %l0 + 0x370 ], %g1 40018508: 7f ff db 03 call 4000f114 4001850c: d0 00 60 08 ld [ %g1 + 8 ], %o0 fclose (stderr); 40018510: c2 04 23 70 ld [ %l0 + 0x370 ], %g1 40018514: f0 00 60 0c ld [ %g1 + 0xc ], %i0 40018518: 7f ff da ff call 4000f114 4001851c: 81 e8 00 00 restore 40018520: 81 c7 e0 08 ret <== NOT EXECUTED 40018524: 81 e8 00 00 restore <== NOT EXECUTED 40004858 : int link( const char *existing, const char *new ) { 40004858: 9d e3 bf 70 save %sp, -144, %sp /* * Get the node we are linking to. */ result = rtems_filesystem_evaluate_path( existing, 0, &existing_loc, TRUE ); 4000485c: 92 10 20 00 clr %o1 40004860: 90 10 00 18 mov %i0, %o0 40004864: 94 07 bf e4 add %fp, -28, %o2 40004868: 96 10 20 01 mov 1, %o3 4000486c: 7f ff fe a8 call 4000430c 40004870: b0 10 3f ff mov -1, %i0 if ( result != 0 ) 40004874: 80 a2 20 00 cmp %o0, 0 40004878: 12 80 00 8e bne 40004ab0 4000487c: 01 00 00 00 nop /* * Get the parent of the node we are creating. */ rtems_filesystem_get_start_loc( new, &i, &parent_loc ); 40004880: c2 4e 40 00 ldsb [ %i1 ], %g1 40004884: 80 a0 60 2f cmp %g1, 0x2f 40004888: 02 80 00 06 be 400048a0 4000488c: 80 a0 60 5c cmp %g1, 0x5c 40004890: 02 80 00 04 be 400048a0 40004894: 80 a0 60 00 cmp %g1, 0 40004898: 12 80 00 0a bne 400048c0 4000489c: 03 10 00 68 sethi %hi(0x4001a000), %g1 400048a0: 03 10 00 68 sethi %hi(0x4001a000), %g1 400048a4: d2 00 60 b8 ld [ %g1 + 0xb8 ], %o1 ! 4001a0b8 400048a8: 90 07 bf d4 add %fp, -44, %o0 400048ac: 92 02 60 14 add %o1, 0x14, %o1 400048b0: 40 00 36 ef call 4001246c 400048b4: 94 10 20 10 mov 0x10, %o2 400048b8: 10 80 00 08 b 400048d8 400048bc: 84 10 20 01 mov 1, %g2 400048c0: d2 00 60 b8 ld [ %g1 + 0xb8 ], %o1 400048c4: 90 07 bf d4 add %fp, -44, %o0 400048c8: 92 02 60 04 add %o1, 4, %o1 400048cc: 40 00 36 e8 call 4001246c 400048d0: 94 10 20 10 mov 0x10, %o2 400048d4: 84 10 20 00 clr %g2 if ( !parent_loc.ops->evalformake_h ) { 400048d8: c2 07 bf dc ld [ %fp + -36 ], %g1 400048dc: c2 00 60 04 ld [ %g1 + 4 ], %g1 400048e0: 80 a0 60 00 cmp %g1, 0 400048e4: 12 80 00 0b bne 40004910 400048e8: 90 06 40 02 add %i1, %g2, %o0 rtems_filesystem_freenode( &existing_loc ); 400048ec: c2 07 bf ec ld [ %fp + -20 ], %g1 <== NOT EXECUTED 400048f0: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400048f4: 02 80 00 51 be 40004a38 <== NOT EXECUTED 400048f8: 01 00 00 00 nop <== NOT EXECUTED 400048fc: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 <== NOT EXECUTED 40004900: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40004904: 12 80 00 4b bne 40004a30 <== NOT EXECUTED 40004908: 90 07 bf e4 add %fp, -28, %o0 <== NOT EXECUTED 4000490c: 30 80 00 4b b,a 40004a38 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOTSUP ); } result = (*parent_loc.ops->evalformake_h)( &new[i], &parent_loc, &name_start ); 40004910: b0 07 bf d4 add %fp, -44, %i0 40004914: 94 07 bf f4 add %fp, -12, %o2 40004918: 9f c0 40 00 call %g1 4000491c: 92 10 00 18 mov %i0, %o1 if ( result != 0 ) { 40004920: b2 92 20 00 orcc %o0, 0, %i1 40004924: 02 80 00 11 be 40004968 40004928: c4 07 bf e0 ld [ %fp + -32 ], %g2 rtems_filesystem_freenode( &existing_loc ); 4000492c: c2 07 bf ec ld [ %fp + -20 ], %g1 40004930: 80 a0 60 00 cmp %g1, 0 40004934: 02 80 00 08 be 40004954 40004938: 01 00 00 00 nop 4000493c: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 40004940: 80 a0 60 00 cmp %g1, 0 40004944: 02 80 00 04 be 40004954 40004948: 01 00 00 00 nop 4000494c: 9f c0 40 00 call %g1 40004950: 90 07 bf e4 add %fp, -28, %o0 rtems_set_errno_and_return_minus_one( result ); 40004954: 40 00 34 e5 call 40011ce8 <__errno> 40004958: b0 10 3f ff mov -1, %i0 4000495c: f2 22 00 00 st %i1, [ %o0 ] 40004960: 81 c7 e0 08 ret 40004964: 81 e8 00 00 restore /* * Check to see if the caller is trying to link across file system * boundaries. */ if ( parent_loc.mt_entry != existing_loc.mt_entry ) { 40004968: c2 07 bf f0 ld [ %fp + -16 ], %g1 4000496c: 80 a0 80 01 cmp %g2, %g1 40004970: 02 80 00 1a be 400049d8 40004974: c2 07 bf dc ld [ %fp + -36 ], %g1 rtems_filesystem_freenode( &existing_loc ); 40004978: c2 07 bf ec ld [ %fp + -20 ], %g1 4000497c: 80 a0 60 00 cmp %g1, 0 40004980: 22 80 00 09 be,a 400049a4 40004984: c2 07 bf dc ld [ %fp + -36 ], %g1 <== NOT EXECUTED 40004988: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 4000498c: 80 a0 60 00 cmp %g1, 0 40004990: 22 80 00 05 be,a 400049a4 40004994: c2 07 bf dc ld [ %fp + -36 ], %g1 <== NOT EXECUTED 40004998: 9f c0 40 00 call %g1 4000499c: 90 07 bf e4 add %fp, -28, %o0 rtems_filesystem_freenode( &parent_loc ); 400049a0: c2 07 bf dc ld [ %fp + -36 ], %g1 400049a4: 80 a0 60 00 cmp %g1, 0 400049a8: 02 80 00 08 be 400049c8 400049ac: 01 00 00 00 nop 400049b0: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 400049b4: 80 a0 60 00 cmp %g1, 0 400049b8: 02 80 00 04 be 400049c8 400049bc: 01 00 00 00 nop 400049c0: 9f c0 40 00 call %g1 400049c4: 90 07 bf d4 add %fp, -44, %o0 rtems_set_errno_and_return_minus_one( EXDEV ); 400049c8: 40 00 34 c8 call 40011ce8 <__errno> 400049cc: b0 10 3f ff mov -1, %i0 400049d0: 10 80 00 1d b 40004a44 400049d4: 82 10 20 12 mov 0x12, %g1 } if ( !parent_loc.ops->link_h ) { 400049d8: c2 00 60 08 ld [ %g1 + 8 ], %g1 400049dc: 80 a0 60 00 cmp %g1, 0 400049e0: 12 80 00 1c bne 40004a50 400049e4: d4 07 bf f4 ld [ %fp + -12 ], %o2 rtems_filesystem_freenode( &existing_loc ); 400049e8: c2 07 bf ec ld [ %fp + -20 ], %g1 <== NOT EXECUTED 400049ec: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400049f0: 22 80 00 09 be,a 40004a14 <== NOT EXECUTED 400049f4: c2 07 bf dc ld [ %fp + -36 ], %g1 <== NOT EXECUTED 400049f8: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 <== NOT EXECUTED 400049fc: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40004a00: 22 80 00 05 be,a 40004a14 <== NOT EXECUTED 40004a04: c2 07 bf dc ld [ %fp + -36 ], %g1 <== NOT EXECUTED 40004a08: 9f c0 40 00 call %g1 <== NOT EXECUTED 40004a0c: 90 07 bf e4 add %fp, -28, %o0 <== NOT EXECUTED rtems_filesystem_freenode( &parent_loc ); 40004a10: c2 07 bf dc ld [ %fp + -36 ], %g1 <== NOT EXECUTED 40004a14: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40004a18: 02 80 00 08 be 40004a38 <== NOT EXECUTED 40004a1c: 01 00 00 00 nop <== NOT EXECUTED 40004a20: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 <== NOT EXECUTED 40004a24: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40004a28: 02 80 00 04 be 40004a38 <== NOT EXECUTED 40004a2c: 90 07 bf d4 add %fp, -44, %o0 <== NOT EXECUTED 40004a30: 9f c0 40 00 call %g1 <== NOT EXECUTED 40004a34: 01 00 00 00 nop <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOTSUP ); 40004a38: 40 00 34 ac call 40011ce8 <__errno> <== NOT EXECUTED 40004a3c: b0 10 3f ff mov -1, %i0 ! ffffffff <== NOT EXECUTED 40004a40: 82 10 20 86 mov 0x86, %g1 <== NOT EXECUTED 40004a44: c2 22 00 00 st %g1, [ %o0 ] 40004a48: 81 c7 e0 08 ret 40004a4c: 81 e8 00 00 restore } result = (*parent_loc.ops->link_h)( &existing_loc, &parent_loc, name_start ); 40004a50: 92 10 00 18 mov %i0, %o1 40004a54: b2 07 bf e4 add %fp, -28, %i1 40004a58: 9f c0 40 00 call %g1 40004a5c: 90 10 00 19 mov %i1, %o0 rtems_filesystem_freenode( &existing_loc ); 40004a60: c2 07 bf ec ld [ %fp + -20 ], %g1 40004a64: 80 a0 60 00 cmp %g1, 0 40004a68: 02 80 00 08 be 40004a88 40004a6c: b0 10 00 08 mov %o0, %i0 40004a70: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 40004a74: 80 a0 60 00 cmp %g1, 0 40004a78: 22 80 00 05 be,a 40004a8c 40004a7c: c2 07 bf dc ld [ %fp + -36 ], %g1 <== NOT EXECUTED 40004a80: 9f c0 40 00 call %g1 40004a84: 90 10 00 19 mov %i1, %o0 rtems_filesystem_freenode( &parent_loc ); 40004a88: c2 07 bf dc ld [ %fp + -36 ], %g1 40004a8c: 80 a0 60 00 cmp %g1, 0 40004a90: 02 80 00 08 be 40004ab0 40004a94: 01 00 00 00 nop 40004a98: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 40004a9c: 80 a0 60 00 cmp %g1, 0 40004aa0: 02 80 00 04 be 40004ab0 40004aa4: 01 00 00 00 nop 40004aa8: 9f c0 40 00 call %g1 40004aac: 90 07 bf d4 add %fp, -44, %o0 return result; } 40004ab0: 81 c7 e0 08 ret 40004ab4: 81 e8 00 00 restore 400183ac : off_t lseek( int fd, off_t offset, int whence ) { 400183ac: 9d e3 bf 98 save %sp, -104, %sp rtems_libio_t *iop; off_t old_offset; off_t status; rtems_libio_check_fd( fd ); 400183b0: 03 10 00 66 sethi %hi(0x40019800), %g1 400183b4: c2 00 62 1c ld [ %g1 + 0x21c ], %g1 ! 40019a1c off_t lseek( int fd, off_t offset, int whence ) { 400183b8: 92 10 00 19 mov %i1, %o1 rtems_libio_t *iop; off_t old_offset; off_t status; rtems_libio_check_fd( fd ); 400183bc: 80 a6 00 01 cmp %i0, %g1 400183c0: 1a 80 00 0e bcc 400183f8 400183c4: 94 10 00 1a mov %i2, %o2 iop = rtems_libio_iop( fd ); 400183c8: 03 10 00 6b sethi %hi(0x4001ac00), %g1 400183cc: c6 00 60 08 ld [ %g1 + 8 ], %g3 ! 4001ac08 400183d0: 85 2e 20 02 sll %i0, 2, %g2 400183d4: 83 2e 20 04 sll %i0, 4, %g1 400183d8: 82 20 40 02 sub %g1, %g2, %g1 400183dc: 82 00 40 18 add %g1, %i0, %g1 400183e0: 83 28 60 02 sll %g1, 2, %g1 400183e4: b0 00 40 03 add %g1, %g3, %i0 rtems_libio_check_is_open(iop); 400183e8: c2 06 20 0c ld [ %i0 + 0xc ], %g1 400183ec: 80 88 61 00 btst 0x100, %g1 400183f0: 32 80 00 06 bne,a 40018408 400183f4: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 400183f8: 7f ff da f1 call 4000efbc <__errno> <== NOT EXECUTED 400183fc: 01 00 00 00 nop <== NOT EXECUTED 40018400: 10 80 00 1c b 40018470 <== NOT EXECUTED 40018404: 82 10 20 09 mov 9, %g1 ! 9 <== NOT EXECUTED /* * Check as many errors as possible before touching iop->offset. */ if ( !iop->handlers->lseek_h ) 40018408: c2 00 60 14 ld [ %g1 + 0x14 ], %g1 4001840c: 80 a0 60 00 cmp %g1, 0 40018410: 12 80 00 06 bne 40018428 40018414: 80 a6 a0 01 cmp %i2, 1 rtems_set_errno_and_return_minus_one( ENOTSUP ); 40018418: 7f ff da e9 call 4000efbc <__errno> <== NOT EXECUTED 4001841c: 01 00 00 00 nop <== NOT EXECUTED 40018420: 10 80 00 14 b 40018470 <== NOT EXECUTED 40018424: 82 10 20 86 mov 0x86, %g1 ! 86 <== NOT EXECUTED /* * Now process the lseek(). */ old_offset = iop->offset; switch ( whence ) { 40018428: 02 80 00 09 be 4001844c 4001842c: f4 06 20 08 ld [ %i0 + 8 ], %i2 40018430: 80 a2 a0 02 cmp %o2, 2 40018434: 02 80 00 08 be 40018454 40018438: 80 a2 a0 00 cmp %o2, 0 4001843c: 12 80 00 0a bne 40018464 40018440: 01 00 00 00 nop case SEEK_SET: iop->offset = offset; 40018444: 10 80 00 0e b 4001847c 40018448: f2 26 20 08 st %i1, [ %i0 + 8 ] break; case SEEK_CUR: iop->offset += offset; 4001844c: 10 80 00 04 b 4001845c 40018450: 82 06 40 1a add %i1, %i2, %g1 break; case SEEK_END: iop->offset = iop->size + offset; 40018454: c2 06 20 04 ld [ %i0 + 4 ], %g1 40018458: 82 06 40 01 add %i1, %g1, %g1 4001845c: 10 80 00 08 b 4001847c 40018460: c2 26 20 08 st %g1, [ %i0 + 8 ] break; default: rtems_set_errno_and_return_minus_one( EINVAL ); 40018464: 7f ff da d6 call 4000efbc <__errno> 40018468: 01 00 00 00 nop 4001846c: 82 10 20 16 mov 0x16, %g1 ! 16 40018470: c2 22 00 00 st %g1, [ %o0 ] 40018474: 10 80 00 09 b 40018498 40018478: 90 10 3f ff mov -1, %o0 /* * At this time, handlers assume iop->offset has the desired * new offset. */ status = (*iop->handlers->lseek_h)( iop, offset, whence ); 4001847c: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 40018480: c2 00 60 14 ld [ %g1 + 0x14 ], %g1 40018484: 9f c0 40 00 call %g1 40018488: 90 10 00 18 mov %i0, %o0 if ( status == (off_t) -1 ) 4001848c: 80 a2 3f ff cmp %o0, -1 40018490: 22 80 00 02 be,a 40018498 40018494: f4 26 20 08 st %i2, [ %i0 + 8 ] /* * So if the operation failed, we have to restore iop->offset. */ return status; } 40018498: 81 c7 e0 08 ret 4001849c: 91 e8 00 08 restore %g0, %o0, %o0 400030ec : #ifdef RTEMS_NEWLIB void *malloc( size_t size ) { 400030ec: 9d e3 bf 98 save %sp, -104, %sp uint32_t sbrk_amount; Chain_Node *to_be_freed; MSBUMP(malloc_calls, 1); if ( !size ) 400030f0: a4 96 20 00 orcc %i0, 0, %l2 400030f4: 02 80 00 41 be 400031f8 400030f8: 03 10 00 6b sethi %hi(0x4001ac00), %g1 /* * Do not attempt to allocate memory if in a critical section or ISR. */ if (_System_state_Is_up(_System_state_Get())) { 400030fc: c2 00 63 b0 ld [ %g1 + 0x3b0 ], %g1 ! 4001afb0 <_System_state_Current> 40003100: 80 a0 60 03 cmp %g1, 3 40003104: 12 80 00 10 bne 40003144 40003108: 03 10 00 6b sethi %hi(0x4001ac00), %g1 if (_Thread_Dispatch_disable_level > 0) 4000310c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40003110: c2 00 61 d0 ld [ %g1 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> 40003114: 80 a0 60 00 cmp %g1, 0 40003118: 12 80 00 36 bne 400031f0 4000311c: b0 10 20 00 clr %i0 return (void *) 0; if (_ISR_Nest_level > 0) 40003120: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40003124: c2 00 62 94 ld [ %g1 + 0x294 ], %g1 ! 4001ae94 <_ISR_Nest_level> 40003128: 80 a0 60 00 cmp %g1, 0 4000312c: 02 80 00 06 be 40003144 40003130: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40003134: 30 80 00 32 b,a 400031fc <== NOT EXECUTED /* * If some free's have been deferred, then do them now. */ while ((to_be_freed = Chain_Get(&RTEMS_Malloc_GC_list)) != NULL) free(to_be_freed); 40003138: 7f ff ff c5 call 4000304c 4000313c: 01 00 00 00 nop 40003140: 30 80 00 02 b,a 40003148 } /* * If some free's have been deferred, then do them now. */ while ((to_be_freed = Chain_Get(&RTEMS_Malloc_GC_list)) != NULL) 40003144: a0 10 60 70 or %g1, 0x70, %l0 40003148: 40 00 11 68 call 400076e8 <_Chain_Get> 4000314c: 90 10 00 10 mov %l0, %o0 40003150: 80 a2 20 00 cmp %o0, 0 40003154: 12 bf ff f9 bne 40003138 40003158: 23 10 00 6b sethi %hi(0x4001ac00), %l1 */ #ifdef MALLOC_ARENA_CHECK size += sizeof(struct mallocNode) + SENTINELSIZE; #endif return_this = _Protected_heap_Allocate( &RTEMS_Malloc_Heap, size ); 4000315c: 92 10 00 12 mov %l2, %o1 40003160: 40 00 16 25 call 400089f4 <_Protected_heap_Allocate> 40003164: 90 14 60 14 or %l1, 0x14, %o0 if ( !return_this ) { 40003168: b0 92 20 00 orcc %o0, 0, %i0 4000316c: 12 80 00 21 bne 400031f0 40003170: 03 10 00 6b sethi %hi(0x4001ac00), %g1 * 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; 40003174: e0 00 60 6c ld [ %g1 + 0x6c ], %l0 ! 4001ac6c <== NOT EXECUTED if ( sbrk_amount == 0 ) 40003178: 80 a4 20 00 cmp %l0, 0 <== NOT EXECUTED 4000317c: 02 80 00 1d be 400031f0 <== NOT EXECUTED 40003180: 92 10 00 10 mov %l0, %o1 <== NOT EXECUTED return (void *) 0; the_size = ((size + sbrk_amount) / sbrk_amount * sbrk_amount); 40003184: 40 00 4b b7 call 40016060 <.udiv> <== NOT EXECUTED 40003188: 90 04 80 10 add %l2, %l0, %o0 <== NOT EXECUTED 4000318c: 40 00 4b 7b call 40015f78 <.umul> <== NOT EXECUTED 40003190: 92 10 00 10 mov %l0, %o1 <== NOT EXECUTED if ((starting_address = (void *)sbrk(the_size)) 40003194: 7f ff fa b3 call 40001c60 <== NOT EXECUTED 40003198: a0 10 00 08 mov %o0, %l0 <== NOT EXECUTED 4000319c: 80 a2 3f ff cmp %o0, -1 <== NOT EXECUTED 400031a0: 02 80 00 14 be 400031f0 <== NOT EXECUTED 400031a4: 92 10 00 08 mov %o0, %o1 <== NOT EXECUTED == (void*) -1) return (void *) 0; if ( !_Protected_heap_Extend( 400031a8: 94 10 00 10 mov %l0, %o2 <== NOT EXECUTED 400031ac: 40 00 16 a3 call 40008c38 <_Protected_heap_Extend> <== NOT EXECUTED 400031b0: 90 14 60 14 or %l1, 0x14, %o0 <== NOT EXECUTED 400031b4: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400031b8: 12 80 00 05 bne 400031cc <== NOT EXECUTED 400031bc: 90 14 60 14 or %l1, 0x14, %o0 <== NOT EXECUTED &RTEMS_Malloc_Heap, starting_address, the_size) ) { sbrk(-the_size); 400031c0: 7f ff fa a8 call 40001c60 <== NOT EXECUTED 400031c4: 90 20 00 10 neg %l0, %o0 <== NOT EXECUTED 400031c8: 30 80 00 06 b,a 400031e0 <== NOT EXECUTED return (void *) 0; } MSBUMP(space_available, the_size); return_this = _Protected_heap_Allocate( &RTEMS_Malloc_Heap, size ); 400031cc: 40 00 16 0a call 400089f4 <_Protected_heap_Allocate> <== NOT EXECUTED 400031d0: 92 10 00 12 mov %l2, %o1 <== NOT EXECUTED if ( !return_this ) { 400031d4: b0 92 20 00 orcc %o0, 0, %i0 <== NOT EXECUTED 400031d8: 12 80 00 09 bne 400031fc <== NOT EXECUTED 400031dc: 01 00 00 00 nop <== NOT EXECUTED errno = ENOMEM; 400031e0: 40 00 2f 77 call 4000efbc <__errno> <== NOT EXECUTED 400031e4: 01 00 00 00 nop <== NOT EXECUTED 400031e8: 82 10 20 0c mov 0xc, %g1 ! c <== NOT EXECUTED 400031ec: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 400031f0: 81 c7 e0 08 ret 400031f4: 81 e8 00 00 restore return (void *) 0; 400031f8: b0 10 20 00 clr %i0 mallocNodeHead.forw = mp; rtems_interrupt_enable(key); } #endif return return_this; } 400031fc: 81 c7 e0 08 ret 40003200: 81 e8 00 00 restore 40006068 : /* * Find amount of free heap remaining */ size_t malloc_free_space( void ) { 40006068: 9d e3 bf 88 save %sp, -120, %sp <== NOT EXECUTED Heap_Information info; _Protected_heap_Get_free_information( &RTEMS_Malloc_Heap, &info ); 4000606c: 11 10 00 ef sethi %hi(0x4003bc00), %o0 <== NOT EXECUTED 40006070: 92 07 bf ec add %fp, -20, %o1 <== NOT EXECUTED 40006074: 40 00 1a 09 call 4000c898 <_Protected_heap_Get_free_information> <== NOT EXECUTED 40006078: 90 12 21 50 or %o0, 0x150, %o0 <== NOT EXECUTED return (size_t) info.largest; } 4000607c: f0 07 bf f0 ld [ %fp + -16 ], %i0 <== NOT EXECUTED 40006080: 81 c7 e0 08 ret <== NOT EXECUTED 40006084: 81 e8 00 00 restore <== NOT EXECUTED 4001ad2c : return memfile_check_rmnod( the_jnode ); } int memfile_check_rmnod( IMFS_jnode_t *the_jnode ){ 4001ad2c: 9d e3 bf 98 save %sp, -104, %sp /* * The file cannot be open and the link must be less than 1 to free. */ if ( !rtems_libio_is_file_open( the_jnode ) && (the_jnode->st_nlink < 1) ) { 4001ad30: 7f ff ac 36 call 40005e08 4001ad34: 90 10 00 18 mov %i0, %o0 4001ad38: 80 a2 20 00 cmp %o0, 0 4001ad3c: 12 80 00 13 bne 4001ad88 4001ad40: 01 00 00 00 nop 4001ad44: c2 16 20 30 lduh [ %i0 + 0x30 ], %g1 4001ad48: 80 a0 60 00 cmp %g1, 0 4001ad4c: 12 80 00 0f bne 4001ad88 4001ad50: 03 10 00 e6 sethi %hi(0x40039800), %g1 /* * Is the rtems_filesystem_current is this node? */ if ( rtems_filesystem_current.node_access == the_jnode ) 4001ad54: c4 00 62 c0 ld [ %g1 + 0x2c0 ], %g2 ! 40039ac0 4001ad58: c2 00 a0 04 ld [ %g2 + 4 ], %g1 4001ad5c: 80 a0 40 18 cmp %g1, %i0 4001ad60: 22 80 00 02 be,a 4001ad68 4001ad64: c0 20 a0 04 clr [ %g2 + 4 ] <== NOT EXECUTED rtems_filesystem_current.node_access = NULL; /* * Free memory associated with a memory file. */ if (the_jnode->type != IMFS_LINEAR_FILE) 4001ad68: c2 06 20 48 ld [ %i0 + 0x48 ], %g1 4001ad6c: 80 a0 60 06 cmp %g1, 6 4001ad70: 02 80 00 04 be 4001ad80 4001ad74: 01 00 00 00 nop IMFS_memfile_remove( the_jnode ); 4001ad78: 7f ff ff 84 call 4001ab88 4001ad7c: 90 10 00 18 mov %i0, %o0 free( the_jnode ); 4001ad80: 7f ff ac c6 call 40006098 4001ad84: 90 10 00 18 mov %i0, %o0 } return 0; } 4001ad88: 81 c7 e0 08 ret 4001ad8c: 91 e8 20 00 restore %g0, 0, %o0 4001ab18 : void memfile_free_blocks_in_table( block_p **block_table, int entries ) { 4001ab18: 9d e3 bf 98 save %sp, -104, %sp /* * Perform internal consistency checks */ assert( block_table ); 4001ab1c: 80 a6 20 00 cmp %i0, 0 4001ab20: 32 80 00 08 bne,a 4001ab40 4001ab24: e2 06 00 00 ld [ %i0 ], %l1 4001ab28: 31 10 00 da sethi %hi(0x40036800), %i0 <== NOT EXECUTED 4001ab2c: 35 10 00 da sethi %hi(0x40036800), %i2 <== NOT EXECUTED 4001ab30: b0 16 22 10 or %i0, 0x210, %i0 <== NOT EXECUTED 4001ab34: b4 16 a2 98 or %i2, 0x298, %i2 <== NOT EXECUTED 4001ab38: 7f ff ab 8f call 40005974 <__assert> <== NOT EXECUTED 4001ab3c: 93 e8 21 b1 restore %g0, 0x1b1, %o1 <== NOT EXECUTED /* * Now go through all the slots in the table and free the memory. */ b = *block_table; 4001ab40: a0 10 20 00 clr %l0 4001ab44: 10 80 00 09 b 4001ab68 4001ab48: b4 10 20 00 clr %i2 for ( i=0 ; i 4001ab54: a0 04 20 01 inc %l0 memfile_free_block( b[i] ); 4001ab58: 7f ff ff 1e call 4001a7d0 4001ab5c: 01 00 00 00 nop b[i] = 0; 4001ab60: c0 26 80 11 clr [ %i2 + %l1 ] * Now go through all the slots in the table and free the memory. */ b = *block_table; for ( i=0 ; i 4001ab70: d0 06 80 11 ld [ %i2 + %l1 ], %o0 /* * Now that all the blocks in the block table are free, we can * free the block table itself. */ memfile_free_block( *block_table ); 4001ab74: 7f ff ff 17 call 4001a7d0 4001ab78: d0 06 00 00 ld [ %i0 ], %o0 *block_table = 0; 4001ab7c: c0 26 00 00 clr [ %i0 ] } 4001ab80: 81 c7 e0 08 ret 4001ab84: 81 e8 00 00 restore 4001b018 : int memfile_ftruncate( rtems_libio_t *iop, off_t length ) { 4001b018: 9d e3 bf 90 save %sp, -112, %sp IMFS_jnode_t *the_jnode; the_jnode = iop->file_info; 4001b01c: e0 06 20 2c ld [ %i0 + 0x2c ], %l0 * 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 ) 4001b020: c2 04 20 4c ld [ %l0 + 0x4c ], %g1 4001b024: 80 a6 40 01 cmp %i1, %g1 4001b028: 04 80 00 06 ble 4001b040 4001b02c: 92 10 00 19 mov %i1, %o1 return IMFS_memfile_extend( the_jnode, length ); 4001b030: 7f ff ff a6 call 4001aec8 <== NOT EXECUTED 4001b034: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED iop->size = the_jnode->info.file.size; IMFS_update_atime( the_jnode ); return 0; } 4001b038: 81 c7 e0 08 ret <== NOT EXECUTED 4001b03c: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED * 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; 4001b040: f2 24 20 4c st %i1, [ %l0 + 0x4c ] iop->size = the_jnode->info.file.size; 4001b044: f2 26 20 04 st %i1, [ %i0 + 4 ] IMFS_update_atime( the_jnode ); 4001b048: 90 07 bf f0 add %fp, -16, %o0 4001b04c: 7f ff ab 05 call 40005c60 4001b050: 92 10 20 00 clr %o1 4001b054: c2 07 bf f0 ld [ %fp + -16 ], %g1 4001b058: 90 10 20 00 clr %o0 4001b05c: c2 24 20 3c st %g1, [ %l0 + 0x3c ] return 0; } 4001b060: b0 10 00 08 mov %o0, %i0 4001b064: 81 c7 e0 08 ret 4001b068: 81 e8 00 00 restore 4001b06c : off_t memfile_lseek( rtems_libio_t *iop, off_t offset, int whence ) { 4001b06c: 9d e3 bf 98 save %sp, -104, %sp IMFS_jnode_t *the_jnode; the_jnode = iop->file_info; 4001b070: e0 06 20 2c ld [ %i0 + 0x2c ], %l0 if (the_jnode->type == IMFS_LINEAR_FILE) { 4001b074: c2 04 20 48 ld [ %l0 + 0x48 ], %g1 4001b078: 80 a0 60 06 cmp %g1, 6 4001b07c: 12 80 00 09 bne 4001b0a0 4001b080: d2 06 20 08 ld [ %i0 + 8 ], %o1 if (iop->offset > the_jnode->info.linearfile.size) 4001b084: d0 04 20 4c ld [ %l0 + 0x4c ], %o0 <== NOT EXECUTED 4001b088: 80 a2 40 08 cmp %o1, %o0 <== NOT EXECUTED 4001b08c: 34 80 00 11 bg,a 4001b0d0 <== NOT EXECUTED 4001b090: d0 26 20 08 st %o0, [ %i0 + 8 ] <== NOT EXECUTED 4001b094: f0 06 20 08 ld [ %i0 + 8 ], %i0 <== NOT EXECUTED 4001b098: 81 c7 e0 08 ret <== NOT EXECUTED 4001b09c: 81 e8 00 00 restore <== NOT EXECUTED iop->offset = the_jnode->info.linearfile.size; } else { /* Must be a block file (IMFS_MEMORY_FILE). */ if (IMFS_memfile_extend( the_jnode, iop->offset )) 4001b0a0: 7f ff ff 8a call 4001aec8 4001b0a4: 90 10 00 10 mov %l0, %o0 4001b0a8: 80 a2 20 00 cmp %o0, 0 4001b0ac: 22 80 00 08 be,a 4001b0cc 4001b0b0: c2 04 20 4c ld [ %l0 + 0x4c ], %g1 rtems_set_errno_and_return_minus_one( ENOSPC ); 4001b0b4: 40 00 22 36 call 4002398c <__errno> <== NOT EXECUTED 4001b0b8: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 4001b0bc: 82 10 20 1c mov 0x1c, %g1 <== NOT EXECUTED 4001b0c0: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 4001b0c4: 81 c7 e0 08 ret <== NOT EXECUTED 4001b0c8: 81 e8 00 00 restore <== NOT EXECUTED iop->size = the_jnode->info.file.size; 4001b0cc: c2 26 20 04 st %g1, [ %i0 + 4 ] } return iop->offset; 4001b0d0: f0 06 20 08 ld [ %i0 + 8 ], %i0 } 4001b0d4: 81 c7 e0 08 ret 4001b0d8: 81 e8 00 00 restore 4001b374 : rtems_libio_t *iop, const char *pathname, uint32_t flag, uint32_t mode ) { 4001b374: 9d e3 bf 98 save %sp, -104, %sp the_jnode = iop->file_info; /* * Perform 'copy on write' for linear files */ if ((iop->flags & (LIBIO_FLAGS_WRITE | LIBIO_FLAGS_APPEND)) 4001b378: c2 06 20 0c ld [ %i0 + 0xc ], %g1 rtems_libio_t *iop, const char *pathname, uint32_t flag, uint32_t mode ) { 4001b37c: a2 10 00 18 mov %i0, %l1 the_jnode = iop->file_info; /* * Perform 'copy on write' for linear files */ if ((iop->flags & (LIBIO_FLAGS_WRITE | LIBIO_FLAGS_APPEND)) 4001b380: 80 88 62 04 btst 0x204, %g1 4001b384: 02 80 00 17 be 4001b3e0 4001b388: e0 06 20 2c ld [ %i0 + 0x2c ], %l0 4001b38c: c2 04 20 48 ld [ %l0 + 0x48 ], %g1 4001b390: 80 a0 60 06 cmp %g1, 6 4001b394: 32 80 00 14 bne,a 4001b3e4 4001b398: c2 04 60 0c ld [ %l1 + 0xc ], %g1 && (the_jnode->type == IMFS_LINEAR_FILE)) { uint32_t count = the_jnode->info.linearfile.size; 4001b39c: d6 04 20 4c ld [ %l0 + 0x4c ], %o3 <== NOT EXECUTED const unsigned char *buffer = the_jnode->info.linearfile.direct; 4001b3a0: d4 04 20 50 ld [ %l0 + 0x50 ], %o2 <== NOT EXECUTED the_jnode->type = IMFS_MEMORY_FILE; 4001b3a4: 82 10 20 05 mov 5, %g1 <== NOT EXECUTED the_jnode->info.file.size = 0; the_jnode->info.file.indirect = 0; the_jnode->info.file.doubly_indirect = 0; 4001b3a8: c0 24 20 54 clr [ %l0 + 0x54 ] <== NOT EXECUTED && (the_jnode->type == IMFS_LINEAR_FILE)) { uint32_t count = the_jnode->info.linearfile.size; const unsigned char *buffer = the_jnode->info.linearfile.direct; the_jnode->type = IMFS_MEMORY_FILE; the_jnode->info.file.size = 0; 4001b3ac: c0 24 20 4c clr [ %l0 + 0x4c ] <== NOT EXECUTED the_jnode->info.file.indirect = 0; the_jnode->info.file.doubly_indirect = 0; the_jnode->info.file.triply_indirect = 0; 4001b3b0: c0 24 20 58 clr [ %l0 + 0x58 ] <== NOT EXECUTED uint32_t count = the_jnode->info.linearfile.size; const unsigned char *buffer = the_jnode->info.linearfile.direct; the_jnode->type = IMFS_MEMORY_FILE; the_jnode->info.file.size = 0; the_jnode->info.file.indirect = 0; 4001b3b4: c0 24 20 50 clr [ %l0 + 0x50 ] <== NOT EXECUTED the_jnode->info.file.doubly_indirect = 0; the_jnode->info.file.triply_indirect = 0; if ((count != 0) 4001b3b8: 80 a2 e0 00 cmp %o3, 0 <== NOT EXECUTED 4001b3bc: 02 80 00 09 be 4001b3e0 <== NOT EXECUTED 4001b3c0: c2 24 20 48 st %g1, [ %l0 + 0x48 ] <== NOT EXECUTED 4001b3c4: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 4001b3c8: 92 10 20 00 clr %o1 <== NOT EXECUTED 4001b3cc: 7f ff ff 44 call 4001b0dc <== NOT EXECUTED 4001b3d0: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 4001b3d4: 80 a2 3f ff cmp %o0, -1 <== NOT EXECUTED 4001b3d8: 02 80 00 0a be 4001b400 <== NOT EXECUTED 4001b3dc: 01 00 00 00 nop <== NOT EXECUTED && (IMFS_memfile_write(the_jnode, 0, buffer, count) == -1)) return -1; } if (iop->flags & LIBIO_FLAGS_APPEND) 4001b3e0: c2 04 60 0c ld [ %l1 + 0xc ], %g1 4001b3e4: 80 88 62 00 btst 0x200, %g1 4001b3e8: 02 80 00 04 be 4001b3f8 4001b3ec: c2 04 20 4c ld [ %l0 + 0x4c ], %g1 iop->offset = the_jnode->info.file.size; 4001b3f0: c2 24 60 08 st %g1, [ %l1 + 8 ] iop->size = the_jnode->info.file.size; 4001b3f4: c2 04 20 4c ld [ %l0 + 0x4c ], %g1 4001b3f8: b0 10 20 00 clr %i0 4001b3fc: c2 24 60 04 st %g1, [ %l1 + 4 ] return 0; } 4001b400: 81 c7 e0 08 ret 4001b404: 81 e8 00 00 restore 4001b684 : ssize_t memfile_read( rtems_libio_t *iop, void *buffer, size_t count ) { 4001b684: 82 10 00 09 mov %o1, %g1 IMFS_jnode_t *the_jnode; the_jnode = iop->file_info; return IMFS_memfile_read( the_jnode, iop->offset, buffer, count ); 4001b688: d2 02 20 08 ld [ %o0 + 8 ], %o1 4001b68c: d0 02 20 2c ld [ %o0 + 0x2c ], %o0 ssize_t memfile_read( rtems_libio_t *iop, void *buffer, size_t count ) { 4001b690: 96 10 00 0a mov %o2, %o3 IMFS_jnode_t *the_jnode; the_jnode = iop->file_info; return IMFS_memfile_read( the_jnode, iop->offset, buffer, count ); 4001b694: 94 10 00 01 mov %g1, %o2 4001b698: 82 13 c0 00 mov %o7, %g1 4001b69c: 7f ff ff 5b call 4001b408 4001b6a0: 9e 10 40 00 mov %g1, %o7 4001b6a4: 01 00 00 00 nop <== NOT EXECUTED 4001ad90 : */ int memfile_rmnod( rtems_filesystem_location_info_t *pathloc /* IN */ ) { 4001ad90: 9d e3 bf 90 save %sp, -112, %sp IMFS_jnode_t *the_jnode; the_jnode = (IMFS_jnode_t *) pathloc->node_access; 4001ad94: f0 06 00 00 ld [ %i0 ], %i0 /* * Take the node out of the parent's chain that contains this node */ if ( the_jnode->Parent != NULL ) { 4001ad98: c2 06 20 08 ld [ %i0 + 8 ], %g1 4001ad9c: 80 a0 60 00 cmp %g1, 0 4001ada0: 22 80 00 06 be,a 4001adb8 4001ada4: c2 16 20 30 lduh [ %i0 + 0x30 ], %g1 <== NOT EXECUTED Chain_Extract( (Chain_Node *) the_jnode ); 4001ada8: 7f ff fb 9d call 40019c1c <_Chain_Extract> 4001adac: 90 10 00 18 mov %i0, %o0 the_jnode->Parent = NULL; 4001adb0: c0 26 20 08 clr [ %i0 + 8 ] /* * Decrement the link counter and see if we can free the space. */ the_jnode->st_nlink--; 4001adb4: c2 16 20 30 lduh [ %i0 + 0x30 ], %g1 IMFS_update_ctime( the_jnode ); 4001adb8: 92 10 20 00 clr %o1 /* * Decrement the link counter and see if we can free the space. */ the_jnode->st_nlink--; 4001adbc: 82 00 7f ff add %g1, -1, %g1 IMFS_update_ctime( the_jnode ); 4001adc0: 90 07 bf f0 add %fp, -16, %o0 4001adc4: 7f ff ab a7 call 40005c60 4001adc8: c2 36 20 30 sth %g1, [ %i0 + 0x30 ] 4001adcc: c2 07 bf f0 ld [ %fp + -16 ], %g1 return memfile_check_rmnod( the_jnode ); 4001add0: 90 10 00 18 mov %i0, %o0 4001add4: 7f ff ff d6 call 4001ad2c 4001add8: c2 26 20 44 st %g1, [ %i0 + 0x44 ] } 4001addc: 81 c7 e0 08 ret 4001ade0: 91 e8 00 08 restore %g0, %o0, %o0 4000b628 : int miniIMFS_initialize( rtems_filesystem_mount_table_entry_t *temp_mt_entry ) { return IMFS_initialize_support( 4000b628: 13 10 00 67 sethi %hi(0x40019c00), %o1 4000b62c: 15 10 00 6a sethi %hi(0x4001a800), %o2 4000b630: 92 12 63 7c or %o1, 0x37c, %o1 4000b634: 94 12 a3 b8 or %o2, 0x3b8, %o2 4000b638: 96 10 00 0a mov %o2, %o3 4000b63c: 82 13 c0 00 mov %o7, %g1 4000b640: 40 00 02 6b call 4000bfec 4000b644: 9e 10 40 00 mov %g1, %o7 4000b648: 01 00 00 00 nop <== NOT EXECUTED 40003450 : int mknod( const char *pathname, mode_t mode, dev_t dev ) { 40003450: 9d e3 bf 80 save %sp, -128, %sp rtems_filesystem_location_info_t temp_loc; int i; const char *name_start; int result; if ( !(mode & (S_IFREG|S_IFCHR|S_IFBLK|S_IFIFO) ) ) 40003454: 03 00 00 3c sethi %hi(0xf000), %g1 40003458: b3 2e 60 10 sll %i1, 0x10, %i1 4000345c: b3 36 60 10 srl %i1, 0x10, %i1 40003460: 84 8e 40 01 andcc %i1, %g1, %g2 40003464: 32 80 00 06 bne,a 4000347c 40003468: 03 00 00 04 sethi %hi(0x1000), %g1 rtems_set_errno_and_return_minus_one( EINVAL ); 4000346c: 40 00 2e d4 call 4000efbc <__errno> <== NOT EXECUTED 40003470: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40003474: 10 80 00 35 b 40003548 <== NOT EXECUTED 40003478: 82 10 20 16 mov 0x16, %g1 <== NOT EXECUTED if ( S_ISFIFO(mode) ) 4000347c: 80 a0 80 01 cmp %g2, %g1 40003480: 02 80 00 2f be 4000353c 40003484: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( ENOTSUP ); rtems_filesystem_get_start_loc( pathname, &i, &temp_loc ); 40003488: c2 4e 00 00 ldsb [ %i0 ], %g1 4000348c: 80 a0 60 2f cmp %g1, 0x2f 40003490: 02 80 00 06 be 400034a8 40003494: 80 a0 60 5c cmp %g1, 0x5c 40003498: 02 80 00 04 be 400034a8 4000349c: 80 a0 60 00 cmp %g1, 0 400034a0: 12 80 00 0a bne 400034c8 400034a4: 03 10 00 68 sethi %hi(0x4001a000), %g1 400034a8: 03 10 00 68 sethi %hi(0x4001a000), %g1 400034ac: d2 00 60 40 ld [ %g1 + 0x40 ], %o1 ! 4001a040 400034b0: 90 07 bf e4 add %fp, -28, %o0 400034b4: 92 02 60 14 add %o1, 0x14, %o1 400034b8: 40 00 30 96 call 4000f710 400034bc: 94 10 20 10 mov 0x10, %o2 400034c0: 10 80 00 08 b 400034e0 400034c4: 84 10 20 01 mov 1, %g2 400034c8: d2 00 60 40 ld [ %g1 + 0x40 ], %o1 400034cc: 90 07 bf e4 add %fp, -28, %o0 400034d0: 92 02 60 04 add %o1, 4, %o1 400034d4: 40 00 30 8f call 4000f710 400034d8: 94 10 20 10 mov 0x10, %o2 400034dc: 84 10 20 00 clr %g2 if ( !temp_loc.ops->evalformake_h ) { 400034e0: c2 07 bf ec ld [ %fp + -20 ], %g1 400034e4: c2 00 60 04 ld [ %g1 + 4 ], %g1 400034e8: 80 a0 60 00 cmp %g1, 0 400034ec: 02 80 00 14 be 4000353c 400034f0: 90 06 00 02 add %i0, %g2, %o0 rtems_set_errno_and_return_minus_one( ENOTSUP ); } result = (*temp_loc.ops->evalformake_h)( 400034f4: a0 07 bf e4 add %fp, -28, %l0 400034f8: 94 07 bf f4 add %fp, -12, %o2 400034fc: 92 10 00 10 mov %l0, %o1 40003500: 9f c0 40 00 call %g1 40003504: b0 10 3f ff mov -1, %i0 &pathname[i], &temp_loc, &name_start ); if ( result != 0 ) 40003508: 80 a2 20 00 cmp %o0, 0 4000350c: 12 80 00 10 bne 4000354c 40003510: c2 07 bf ec ld [ %fp + -20 ], %g1 return -1; if ( !temp_loc.ops->mknod_h ) { 40003514: c4 00 60 14 ld [ %g1 + 0x14 ], %g2 40003518: 80 a0 a0 00 cmp %g2, 0 4000351c: 12 80 00 0e bne 40003554 40003520: d0 07 bf f4 ld [ %fp + -12 ], %o0 rtems_filesystem_freenode( &temp_loc ); 40003524: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 <== NOT EXECUTED 40003528: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000352c: 02 80 00 04 be 4000353c <== NOT EXECUTED 40003530: 01 00 00 00 nop <== NOT EXECUTED 40003534: 9f c0 40 00 call %g1 <== NOT EXECUTED 40003538: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOTSUP ); 4000353c: 40 00 2e a0 call 4000efbc <__errno> 40003540: b0 10 3f ff mov -1, %i0 40003544: 82 10 20 86 mov 0x86, %g1 40003548: c2 22 00 00 st %g1, [ %o0 ] 4000354c: 81 c7 e0 08 ret 40003550: 81 e8 00 00 restore } result = (*temp_loc.ops->mknod_h)( name_start, mode, dev, &temp_loc ); 40003554: 92 10 00 19 mov %i1, %o1 40003558: 94 10 00 1a mov %i2, %o2 4000355c: 96 10 00 1b mov %i3, %o3 40003560: 9f c0 80 00 call %g2 40003564: 98 10 00 10 mov %l0, %o4 rtems_filesystem_freenode( &temp_loc ); 40003568: c2 07 bf ec ld [ %fp + -20 ], %g1 4000356c: 80 a0 60 00 cmp %g1, 0 40003570: 02 bf ff f7 be 4000354c 40003574: b0 10 00 08 mov %o0, %i0 40003578: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 4000357c: 80 a0 60 00 cmp %g1, 0 40003580: 02 80 00 04 be 40003590 40003584: 01 00 00 00 nop 40003588: 9f c0 40 00 call %g1 4000358c: 90 10 00 10 mov %l0, %o0 return result; } 40003590: 81 c7 e0 08 ret 40003594: 81 e8 00 00 restore 4000c97c : rtems_filesystem_operations_table *fs_ops, rtems_filesystem_options_t options, char *device, char *mount_point ) { 4000c97c: 9d e3 bf 88 save %sp, -120, %sp /* * Is there a file system operations table? */ if ( fs_ops == NULL ) { 4000c980: 80 a6 60 00 cmp %i1, 0 4000c984: 02 80 00 05 be 4000c998 4000c988: a2 10 00 18 mov %i0, %l1 /* * Are the file system options valid? */ if ( options != RTEMS_FILESYSTEM_READ_ONLY && 4000c98c: 80 a6 a0 01 cmp %i2, 1 4000c990: 28 80 00 06 bleu,a 4000c9a8 4000c994: c2 06 60 24 ld [ %i1 + 0x24 ], %g1 options != RTEMS_FILESYSTEM_READ_WRITE ) { errno = EINVAL; 4000c998: 40 00 09 89 call 4000efbc <__errno> 4000c99c: 01 00 00 00 nop 4000c9a0: 10 80 00 17 b 4000c9fc 4000c9a4: 82 10 20 16 mov 0x16, %g1 ! 16 return -1; } /* Do they support being mounted at all ? */ if ( !fs_ops->fsmount_me_h ) { 4000c9a8: 80 a0 60 00 cmp %g1, 0 4000c9ac: 12 80 00 07 bne 4000c9c8 4000c9b0: 80 a6 e0 00 cmp %i3, 0 errno = ENOTSUP; 4000c9b4: 40 00 09 82 call 4000efbc <__errno> <== NOT EXECUTED 4000c9b8: b4 10 20 00 clr %i2 <== NOT EXECUTED 4000c9bc: 82 10 20 86 mov 0x86, %g1 <== NOT EXECUTED 4000c9c0: 10 80 00 77 b 4000cb9c <== NOT EXECUTED 4000c9c4: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED /* * Allocate a mount table entry */ size = sizeof(rtems_filesystem_mount_table_entry_t); if ( device ) 4000c9c8: 02 80 00 05 be 4000c9dc 4000c9cc: 90 10 20 64 mov 0x64, %o0 size += strlen( device ) + 1; 4000c9d0: 40 00 0e 59 call 40010334 <== NOT EXECUTED 4000c9d4: 90 10 00 1b mov %i3, %o0 <== NOT EXECUTED 4000c9d8: 90 02 20 65 add %o0, 0x65, %o0 <== NOT EXECUTED temp_mt_entry = malloc( size ); 4000c9dc: 7f ff d9 c4 call 400030ec 4000c9e0: 01 00 00 00 nop if ( !temp_mt_entry ) { 4000c9e4: a0 92 20 00 orcc %o0, 0, %l0 4000c9e8: 32 80 00 07 bne,a 4000ca04 4000c9ec: f4 24 20 28 st %i2, [ %l0 + 0x28 ] errno = ENOMEM; 4000c9f0: 40 00 09 73 call 4000efbc <__errno> <== NOT EXECUTED 4000c9f4: 01 00 00 00 nop <== NOT EXECUTED 4000c9f8: 82 10 20 0c mov 0xc, %g1 ! c <== NOT EXECUTED 4000c9fc: 10 80 00 78 b 4000cbdc 4000ca00: c2 22 00 00 st %g1, [ %o0 ] return -1; } temp_mt_entry->mt_fs_root.mt_entry = temp_mt_entry; 4000ca04: e0 24 20 24 st %l0, [ %l0 + 0x24 ] temp_mt_entry->options = options; if ( device ) { 4000ca08: 80 a6 e0 00 cmp %i3, 0 4000ca0c: 02 80 00 08 be 4000ca2c 4000ca10: b4 10 00 10 mov %l0, %i2 temp_mt_entry->dev = 4000ca14: 90 04 20 64 add %l0, 0x64, %o0 <== NOT EXECUTED (char *)temp_mt_entry + sizeof( rtems_filesystem_mount_table_entry_t ); strcpy( temp_mt_entry->dev, device ); 4000ca18: 92 10 00 1b mov %i3, %o1 <== NOT EXECUTED 4000ca1c: 40 00 0e 26 call 400102b4 <== NOT EXECUTED 4000ca20: d0 24 20 60 st %o0, [ %l0 + 0x60 ] <== NOT EXECUTED /* * The mount_point should be a directory with read/write/execute * permissions in the existing tree. */ if ( mount_point ) { 4000ca24: 10 80 00 04 b 4000ca34 <== NOT EXECUTED 4000ca28: 80 a7 20 00 cmp %i4, 0 <== NOT EXECUTED if ( device ) { temp_mt_entry->dev = (char *)temp_mt_entry + sizeof( rtems_filesystem_mount_table_entry_t ); strcpy( temp_mt_entry->dev, device ); } else temp_mt_entry->dev = 0; 4000ca2c: c0 24 20 60 clr [ %l0 + 0x60 ] /* * The mount_point should be a directory with read/write/execute * permissions in the existing tree. */ if ( mount_point ) { 4000ca30: 80 a7 20 00 cmp %i4, 0 4000ca34: 02 80 00 3b be 4000cb20 4000ca38: 90 10 00 1c mov %i4, %o0 if ( rtems_filesystem_evaluate_path( 4000ca3c: 92 10 20 07 mov 7, %o1 4000ca40: b8 07 bf e8 add %fp, -24, %i4 4000ca44: 96 10 20 01 mov 1, %o3 4000ca48: 7f ff d8 fb call 40002e34 4000ca4c: 94 10 00 1c mov %i4, %o2 4000ca50: 80 a2 3f ff cmp %o0, -1 4000ca54: 02 80 00 52 be 4000cb9c 4000ca58: c2 07 bf f0 ld [ %fp + -16 ], %g1 /* * Test for node_type_h */ if (!loc.ops->node_type_h) { 4000ca5c: c2 00 60 10 ld [ %g1 + 0x10 ], %g1 4000ca60: 80 a0 60 00 cmp %g1, 0 4000ca64: 12 80 00 06 bne 4000ca7c 4000ca68: 01 00 00 00 nop errno = ENOTSUP; 4000ca6c: 40 00 09 54 call 4000efbc <__errno> <== NOT EXECUTED 4000ca70: 01 00 00 00 nop <== NOT EXECUTED * This link to the parent is only done when we are dealing with system * below the base file system */ if ( !loc.ops->mount_h ){ errno = ENOTSUP; 4000ca74: 10 80 00 0a b 4000ca9c <== NOT EXECUTED 4000ca78: 82 10 20 86 mov 0x86, %g1 ! 86 <== NOT EXECUTED /* * Test to see if it is a directory */ if ( loc.ops->node_type_h( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ) { 4000ca7c: 9f c0 40 00 call %g1 4000ca80: 90 10 00 1c mov %i4, %o0 4000ca84: 80 a2 20 01 cmp %o0, 1 4000ca88: 02 80 00 07 be 4000caa4 4000ca8c: 03 10 00 6d sethi %hi(0x4001b400), %g1 errno = ENOTDIR; 4000ca90: 40 00 09 4b call 4000efbc <__errno> 4000ca94: 01 00 00 00 nop 4000ca98: 82 10 20 14 mov 0x14, %g1 ! 14 4000ca9c: 10 80 00 41 b 4000cba0 4000caa0: c2 22 00 00 st %g1, [ %o0 ] for ( the_node = rtems_filesystem_mount_table_control.first; !Chain_Is_tail( &rtems_filesystem_mount_table_control, the_node ); the_node = the_node->next ) { the_mount_entry = (rtems_filesystem_mount_table_entry_t *) the_node; if ( the_mount_entry->mt_fs_root.node_access == loc->node_access ) 4000caa4: c8 07 bf e8 ld [ %fp + -24 ], %g4 /* * For each mount table entry */ for ( the_node = rtems_filesystem_mount_table_control.first; 4000caa8: c4 00 60 58 ld [ %g1 + 0x58 ], %g2 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 4000caac: 03 10 00 6d sethi %hi(0x4001b400), %g1 4000cab0: 10 80 00 06 b 4000cac8 4000cab4: 86 10 60 5c or %g1, 0x5c, %g3 ! 4001b45c !Chain_Is_tail( &rtems_filesystem_mount_table_control, the_node ); the_node = the_node->next ) { the_mount_entry = (rtems_filesystem_mount_table_entry_t *) the_node; if ( the_mount_entry->mt_fs_root.node_access == loc->node_access ) 4000cab8: 80 a0 40 04 cmp %g1, %g4 4000cabc: 02 80 00 08 be 4000cadc 4000cac0: 01 00 00 00 nop * For each mount table entry */ for ( the_node = rtems_filesystem_mount_table_control.first; !Chain_Is_tail( &rtems_filesystem_mount_table_control, the_node ); the_node = the_node->next ) { 4000cac4: c4 00 80 00 ld [ %g2 ], %g2 /* * For each mount table entry */ for ( the_node = rtems_filesystem_mount_table_control.first; !Chain_Is_tail( &rtems_filesystem_mount_table_control, the_node ); 4000cac8: 80 a0 80 03 cmp %g2, %g3 4000cacc: 32 bf ff fb bne,a 4000cab8 4000cad0: c2 00 a0 18 ld [ %g2 + 0x18 ], %g1 * until the system is unmounted. It may be needed to correctly * traverse the tree. */ temp_mt_entry->mt_point_node.node_access = loc.node_access; temp_mt_entry->mt_point_node.handlers = loc.handlers; 4000cad4: 10 80 00 44 b 4000cbe4 4000cad8: c4 07 bf ec ld [ %fp + -20 ], %g2 /* * You can only mount one file system onto a single mount point. */ if ( Is_node_fs_root( &loc ) ){ errno = EBUSY; 4000cadc: 40 00 09 38 call 4000efbc <__errno> 4000cae0: b8 07 bf e8 add %fp, -24, %i4 4000cae4: 10 bf ff ee b 4000ca9c 4000cae8: 82 10 20 10 mov 0x10, %g1 * This link to the parent is only done when we are dealing with system * below the base file system */ if ( !loc.ops->mount_h ){ errno = ENOTSUP; 4000caec: 40 00 09 34 call 4000efbc <__errno> <== NOT EXECUTED 4000caf0: b8 07 bf e8 add %fp, -24, %i4 <== NOT EXECUTED 4000caf4: 10 bf ff ea b 4000ca9c <== NOT EXECUTED 4000caf8: 82 10 20 86 mov 0x86, %g1 <== NOT EXECUTED goto cleanup_and_bail; } if ( loc.ops->mount_h( temp_mt_entry ) ) { 4000cafc: 9f c0 c0 00 call %g3 4000cb00: 90 10 00 10 mov %l0, %o0 4000cb04: 80 a2 20 00 cmp %o0, 0 4000cb08: 02 80 00 04 be 4000cb18 4000cb0c: 90 07 bf e8 add %fp, -24, %o0 4000cb10: 10 80 00 24 b 4000cba0 <== NOT EXECUTED 4000cb14: b8 10 00 08 mov %o0, %i4 <== NOT EXECUTED 4000cb18: 10 80 00 0a b 4000cb40 4000cb1c: b8 10 00 08 mov %o0, %i4 * This is a mount of the base file system --> The * mt_point_node.node_access will be set to null to indicate that this * is the root of the entire file system. */ temp_mt_entry->mt_fs_root.node_access = NULL; 4000cb20: c0 24 20 18 clr [ %l0 + 0x18 ] temp_mt_entry->mt_fs_root.handlers = NULL; 4000cb24: c0 24 20 1c clr [ %l0 + 0x1c ] temp_mt_entry->mt_fs_root.ops = NULL; 4000cb28: c0 24 20 20 clr [ %l0 + 0x20 ] temp_mt_entry->mt_point_node.node_access = NULL; 4000cb2c: c0 24 20 08 clr [ %l0 + 8 ] temp_mt_entry->mt_point_node.handlers = NULL; 4000cb30: c0 24 20 0c clr [ %l0 + 0xc ] temp_mt_entry->mt_point_node.ops = NULL; 4000cb34: c0 24 20 10 clr [ %l0 + 0x10 ] temp_mt_entry->mt_point_node.mt_entry = NULL; 4000cb38: c0 24 20 14 clr [ %l0 + 0x14 ] 4000cb3c: b8 10 20 00 clr %i4 } if ( fs_ops->fsmount_me_h( temp_mt_entry ) ) { 4000cb40: c2 06 60 24 ld [ %i1 + 0x24 ], %g1 4000cb44: 9f c0 40 00 call %g1 4000cb48: 90 10 00 10 mov %l0, %o0 4000cb4c: 80 a2 20 00 cmp %o0, 0 4000cb50: 02 80 00 09 be 4000cb74 4000cb54: c2 07 bf f0 ld [ %fp + -16 ], %g1 /* try to undo the mount operation */ if ( loc.ops->unmount_h ) { 4000cb58: c2 00 60 28 ld [ %g1 + 0x28 ], %g1 <== NOT EXECUTED 4000cb5c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000cb60: 02 80 00 10 be 4000cba0 <== NOT EXECUTED 4000cb64: 01 00 00 00 nop <== NOT EXECUTED loc.ops->unmount_h( temp_mt_entry ); 4000cb68: 9f c0 40 00 call %g1 <== NOT EXECUTED 4000cb6c: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 4000cb70: 30 80 00 0c b,a 4000cba0 <== NOT EXECUTED /* * Add the mount table entry to the mount table chain */ Chain_Append( &rtems_filesystem_mount_table_control, &temp_mt_entry->Node ); 4000cb74: 11 10 00 6d sethi %hi(0x4001b400), %o0 4000cb78: 92 10 00 10 mov %l0, %o1 4000cb7c: 7f ff ea cf call 400076b8 <_Chain_Append> 4000cb80: 90 12 20 58 or %o0, 0x58, %o0 if ( mt_entry ) 4000cb84: 80 a4 60 00 cmp %l1, 0 4000cb88: 02 80 00 03 be 4000cb94 4000cb8c: b0 10 20 00 clr %i0 *mt_entry = temp_mt_entry; 4000cb90: e0 24 40 00 st %l0, [ %l1 ] 4000cb94: 81 c7 e0 08 ret 4000cb98: 81 e8 00 00 restore 4000cb9c: b8 10 20 00 clr %i4 <== NOT EXECUTED return 0; cleanup_and_bail: free( temp_mt_entry ); 4000cba0: 7f ff d9 2b call 4000304c 4000cba4: 90 10 00 1a mov %i2, %o0 if ( loc_to_free ) 4000cba8: 80 a7 20 00 cmp %i4, 0 4000cbac: 02 80 00 0c be 4000cbdc 4000cbb0: 01 00 00 00 nop rtems_filesystem_freenode( loc_to_free ); 4000cbb4: c2 07 20 08 ld [ %i4 + 8 ], %g1 4000cbb8: 80 a0 60 00 cmp %g1, 0 4000cbbc: 02 80 00 08 be 4000cbdc 4000cbc0: 01 00 00 00 nop 4000cbc4: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 4000cbc8: 80 a0 60 00 cmp %g1, 0 4000cbcc: 02 80 00 04 be 4000cbdc 4000cbd0: 01 00 00 00 nop 4000cbd4: 9f c0 40 00 call %g1 4000cbd8: 90 10 00 1c mov %i4, %o0 4000cbdc: 81 c7 e0 08 ret 4000cbe0: 91 e8 3f ff restore %g0, -1, %o0 * traverse the tree. */ temp_mt_entry->mt_point_node.node_access = loc.node_access; temp_mt_entry->mt_point_node.handlers = loc.handlers; temp_mt_entry->mt_point_node.ops = loc.ops; 4000cbe4: c2 07 bf f0 ld [ %fp + -16 ], %g1 * until the system is unmounted. It may be needed to correctly * traverse the tree. */ temp_mt_entry->mt_point_node.node_access = loc.node_access; temp_mt_entry->mt_point_node.handlers = loc.handlers; 4000cbe8: c4 24 20 0c st %g2, [ %l0 + 0xc ] temp_mt_entry->mt_point_node.ops = loc.ops; temp_mt_entry->mt_point_node.mt_entry = loc.mt_entry; 4000cbec: c4 07 bf f4 ld [ %fp + -12 ], %g2 /* * This link to the parent is only done when we are dealing with system * below the base file system */ if ( !loc.ops->mount_h ){ 4000cbf0: c6 00 60 20 ld [ %g1 + 0x20 ], %g3 * 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. */ temp_mt_entry->mt_point_node.node_access = loc.node_access; 4000cbf4: c8 24 20 08 st %g4, [ %l0 + 8 ] temp_mt_entry->mt_point_node.handlers = loc.handlers; temp_mt_entry->mt_point_node.ops = loc.ops; temp_mt_entry->mt_point_node.mt_entry = loc.mt_entry; 4000cbf8: c4 24 20 14 st %g2, [ %l0 + 0x14 ] /* * This link to the parent is only done when we are dealing with system * below the base file system */ if ( !loc.ops->mount_h ){ 4000cbfc: 80 a0 e0 00 cmp %g3, 0 4000cc00: 12 bf ff bf bne 4000cafc 4000cc04: c2 24 20 10 st %g1, [ %l0 + 0x10 ] 4000cc08: 30 bf ff b9 b,a 4000caec <== NOT EXECUTED 4000a6c8 : */ int mq_close( mqd_t mqdes ) { 4000a6c8: 9d e3 bf 90 save %sp, -112, %sp RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control_fd *_POSIX_Message_queue_Get_fd ( Objects_Id id, Objects_Locations *location ) { return (POSIX_Message_queue_Control_fd *) 4000a6cc: 21 10 00 98 sethi %hi(0x40026000), %l0 4000a6d0: 92 10 00 18 mov %i0, %o1 4000a6d4: 94 07 bf f4 add %fp, -12, %o2 4000a6d8: 40 00 12 6f call 4000f094 <_Objects_Get> 4000a6dc: 90 14 22 10 or %l0, 0x210, %o0 POSIX_Message_queue_Control *the_mq; POSIX_Message_queue_Control_fd *the_mq_fd; Objects_Locations location; the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location ); switch ( location ) { 4000a6e0: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000a6e4: 80 a0 60 01 cmp %g1, 1 4000a6e8: 02 80 00 0e be 4000a720 4000a6ec: b0 10 00 08 mov %o0, %i0 4000a6f0: 80 a0 60 01 cmp %g1, 1 4000a6f4: 2a 80 00 11 bcs,a 4000a738 4000a6f8: c4 02 20 10 ld [ %o0 + 0x10 ], %g2 4000a6fc: 80 a0 60 02 cmp %g1, 2 4000a700: 12 80 00 2f bne 4000a7bc 4000a704: 01 00 00 00 nop case OBJECTS_ERROR: rtems_set_errno_and_return_minus_one( EBADF ); 4000a708: 40 00 2e 9a call 40016170 <__errno> 4000a70c: 01 00 00 00 nop 4000a710: 82 10 20 09 mov 9, %g1 ! 9 4000a714: c2 22 00 00 st %g1, [ %o0 ] 4000a718: 10 80 00 2b b 4000a7c4 4000a71c: 90 10 3f ff mov -1, %o0 case OBJECTS_REMOTE: _Thread_Dispatch(); 4000a720: 40 00 17 12 call 40010368 <_Thread_Dispatch> <== NOT EXECUTED 4000a724: 01 00 00 00 nop <== NOT EXECUTED return POSIX_MP_NOT_IMPLEMENTED(); 4000a728: 40 00 07 53 call 4000c474 <== NOT EXECUTED 4000a72c: 01 00 00 00 nop <== NOT EXECUTED _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); } 4000a730: 81 c7 e0 08 ret <== NOT EXECUTED 4000a734: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED * being disassociated. This may result in the queue being really * deleted. */ the_mq = the_mq_fd->Queue; the_mq->open_count -= 1; 4000a738: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 _POSIX_Message_queue_Delete( the_mq ); 4000a73c: 90 10 00 02 mov %g2, %o0 * being disassociated. This may result in the queue being really * deleted. */ the_mq = the_mq_fd->Queue; the_mq->open_count -= 1; 4000a740: 82 00 7f ff add %g1, -1, %g1 _POSIX_Message_queue_Delete( the_mq ); 4000a744: 40 00 00 23 call 4000a7d0 <_POSIX_Message_queue_Delete> 4000a748: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 4000a74c: 90 14 22 10 or %l0, 0x210, %o0 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); 4000a750: c4 06 20 08 ld [ %i0 + 8 ], %g2 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 4000a754: c6 12 20 10 lduh [ %o0 + 0x10 ], %g3 4000a758: 03 00 00 3f sethi %hi(0xfc00), %g1 4000a75c: 82 10 63 ff or %g1, 0x3ff, %g1 ! ffff 4000a760: 82 08 80 01 and %g2, %g1, %g1 4000a764: 80 a0 40 03 cmp %g1, %g3 4000a768: 38 80 00 06 bgu,a 4000a780 4000a76c: c0 26 20 0c clr [ %i0 + 0xc ] <== NOT EXECUTED information->local_table[ index ] = the_object; 4000a770: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 4000a774: 83 28 60 02 sll %g1, 2, %g1 4000a778: c0 20 80 01 clr [ %g2 + %g1 ] uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); /* _Objects_Clear_name( the_object->name, information->name_length ); */ the_object->name = 0; 4000a77c: c0 26 20 0c clr [ %i0 + 0xc ] 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 ); 4000a780: 40 00 12 03 call 4000ef8c <_Objects_Free> 4000a784: 92 10 00 18 mov %i0, %o1 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 4000a788: 03 10 00 97 sethi %hi(0x40025c00), %g1 4000a78c: c4 00 60 40 ld [ %g1 + 0x40 ], %g2 ! 40025c40 <_Thread_Dispatch_disable_level> 4000a790: 90 10 20 00 clr %o0 4000a794: 84 00 bf ff add %g2, -1, %g2 4000a798: c4 20 60 40 st %g2, [ %g1 + 0x40 ] 4000a79c: c2 00 60 40 ld [ %g1 + 0x40 ], %g1 4000a7a0: 80 a0 60 00 cmp %g1, 0 4000a7a4: 32 80 00 09 bne,a 4000a7c8 4000a7a8: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED _Thread_Dispatch(); 4000a7ac: 40 00 16 ef call 40010368 <_Thread_Dispatch> 4000a7b0: 01 00 00 00 nop 4000a7b4: 10 80 00 04 b 4000a7c4 4000a7b8: 90 10 20 00 clr %o0 ! 0 _POSIX_Message_queue_Free_fd( the_mq_fd ); _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); 4000a7bc: 40 00 07 24 call 4000c44c <== NOT EXECUTED 4000a7c0: 01 00 00 00 nop <== NOT EXECUTED } 4000a7c4: b0 10 00 08 mov %o0, %i0 4000a7c8: 81 c7 e0 08 ret 4000a7cc: 81 e8 00 00 restore 4000a860 : int mq_getattr( mqd_t mqdes, struct mq_attr *mqstat ) { 4000a860: 9d e3 bf 90 save %sp, -112, %sp POSIX_Message_queue_Control *the_mq; POSIX_Message_queue_Control_fd *the_mq_fd; Objects_Locations location; CORE_message_queue_Attributes *the_mq_attr; if ( !mqstat ) 4000a864: 80 a6 60 00 cmp %i1, 0 4000a868: 12 80 00 06 bne 4000a880 4000a86c: 92 10 00 18 mov %i0, %o1 rtems_set_errno_and_return_minus_one( EINVAL ); 4000a870: 40 00 2e 40 call 40016170 <__errno> 4000a874: 01 00 00 00 nop 4000a878: 10 80 00 12 b 4000a8c0 4000a87c: 82 10 20 16 mov 0x16, %g1 ! 16 RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control_fd *_POSIX_Message_queue_Get_fd ( Objects_Id id, Objects_Locations *location ) { return (POSIX_Message_queue_Control_fd *) 4000a880: 11 10 00 98 sethi %hi(0x40026000), %o0 4000a884: 94 07 bf f4 add %fp, -12, %o2 4000a888: 40 00 12 03 call 4000f094 <_Objects_Get> 4000a88c: 90 12 22 10 or %o0, 0x210, %o0 the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location ); switch ( location ) { 4000a890: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000a894: 80 a0 60 01 cmp %g1, 1 4000a898: 02 80 00 0d be 4000a8cc 4000a89c: 01 00 00 00 nop 4000a8a0: 2a 80 00 11 bcs,a 4000a8e4 4000a8a4: c4 02 20 10 ld [ %o0 + 0x10 ], %g2 4000a8a8: 80 a0 60 02 cmp %g1, 2 4000a8ac: 12 80 00 23 bne 4000a938 4000a8b0: 01 00 00 00 nop case OBJECTS_ERROR: rtems_set_errno_and_return_minus_one( EBADF ); 4000a8b4: 40 00 2e 2f call 40016170 <__errno> 4000a8b8: 01 00 00 00 nop 4000a8bc: 82 10 20 09 mov 9, %g1 ! 9 4000a8c0: c2 22 00 00 st %g1, [ %o0 ] 4000a8c4: 10 80 00 1f b 4000a940 4000a8c8: 90 10 3f ff mov -1, %o0 case OBJECTS_REMOTE: _Thread_Dispatch(); 4000a8cc: 40 00 16 a7 call 40010368 <_Thread_Dispatch> <== NOT EXECUTED 4000a8d0: 01 00 00 00 nop <== NOT EXECUTED return POSIX_MP_NOT_IMPLEMENTED(); 4000a8d4: 40 00 06 e8 call 4000c474 <== NOT EXECUTED 4000a8d8: 01 00 00 00 nop <== NOT EXECUTED _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); } 4000a8dc: 81 c7 e0 08 ret <== NOT EXECUTED 4000a8e0: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED * Return the old values. */ the_mq_attr = &the_mq->Message_queue.Attributes; mqstat->mq_flags = the_mq_fd->oflag; 4000a8e4: c2 02 20 14 ld [ %o0 + 0x14 ], %g1 4000a8e8: c2 26 40 00 st %g1, [ %i1 ] mqstat->mq_msgsize = the_mq->Message_queue.maximum_message_size; 4000a8ec: c2 00 a0 6c ld [ %g2 + 0x6c ], %g1 4000a8f0: c2 26 60 08 st %g1, [ %i1 + 8 ] mqstat->mq_maxmsg = the_mq->Message_queue.maximum_pending_messages; 4000a8f4: c2 00 a0 64 ld [ %g2 + 0x64 ], %g1 4000a8f8: c2 26 60 04 st %g1, [ %i1 + 4 ] mqstat->mq_curmsgs = the_mq->Message_queue.number_of_pending_messages; 4000a8fc: c2 00 a0 68 ld [ %g2 + 0x68 ], %g1 4000a900: c2 26 60 0c st %g1, [ %i1 + 0xc ] #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 4000a904: 05 10 00 97 sethi %hi(0x40025c00), %g2 4000a908: c2 00 a0 40 ld [ %g2 + 0x40 ], %g1 ! 40025c40 <_Thread_Dispatch_disable_level> 4000a90c: 90 10 20 00 clr %o0 4000a910: 82 00 7f ff add %g1, -1, %g1 4000a914: c2 20 a0 40 st %g1, [ %g2 + 0x40 ] 4000a918: c2 00 a0 40 ld [ %g2 + 0x40 ], %g1 4000a91c: 80 a0 60 00 cmp %g1, 0 4000a920: 32 80 00 09 bne,a 4000a944 4000a924: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED _Thread_Dispatch(); 4000a928: 40 00 16 90 call 40010368 <_Thread_Dispatch> 4000a92c: 01 00 00 00 nop 4000a930: 10 80 00 04 b 4000a940 4000a934: 90 10 20 00 clr %o0 ! 0 _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); 4000a938: 40 00 06 c5 call 4000c44c <== NOT EXECUTED 4000a93c: 01 00 00 00 nop <== NOT EXECUTED } 4000a940: b0 10 00 08 mov %o0, %i0 4000a944: 81 c7 e0 08 ret 4000a948: 81 e8 00 00 restore 4000a9a4 : int mq_notify( mqd_t mqdes, const struct sigevent *notification ) { 4000a9a4: 9d e3 bf 90 save %sp, -112, %sp 4000a9a8: 11 10 00 98 sethi %hi(0x40026000), %o0 4000a9ac: 92 10 00 18 mov %i0, %o1 4000a9b0: 90 12 22 10 or %o0, 0x210, %o0 4000a9b4: 40 00 11 b8 call 4000f094 <_Objects_Get> 4000a9b8: 94 07 bf f4 add %fp, -12, %o2 POSIX_Message_queue_Control *the_mq; POSIX_Message_queue_Control_fd *the_mq_fd; Objects_Locations location; the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location ); switch ( location ) { 4000a9bc: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000a9c0: 80 a0 60 01 cmp %g1, 1 4000a9c4: 02 80 00 0c be 4000a9f4 4000a9c8: 92 10 00 19 mov %i1, %o1 4000a9cc: 80 a0 60 01 cmp %g1, 1 4000a9d0: 0a 80 00 0f bcs 4000aa0c 4000a9d4: 80 a6 60 00 cmp %i1, 0 4000a9d8: 80 a0 60 02 cmp %g1, 2 4000a9dc: 12 80 00 29 bne 4000aa80 4000a9e0: 01 00 00 00 nop case OBJECTS_ERROR: rtems_set_errno_and_return_minus_one( EBADF ); 4000a9e4: 40 00 2d e3 call 40016170 <__errno> 4000a9e8: 01 00 00 00 nop 4000a9ec: 10 80 00 13 b 4000aa38 4000a9f0: 82 10 20 09 mov 9, %g1 ! 9 case OBJECTS_REMOTE: _Thread_Dispatch(); 4000a9f4: 40 00 16 5d call 40010368 <_Thread_Dispatch> <== NOT EXECUTED 4000a9f8: 01 00 00 00 nop <== NOT EXECUTED return POSIX_MP_NOT_IMPLEMENTED(); 4000a9fc: 40 00 06 9e call 4000c474 <== NOT EXECUTED 4000aa00: 01 00 00 00 nop <== NOT EXECUTED _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); } 4000aa04: 81 c7 e0 08 ret <== NOT EXECUTED 4000aa08: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED return POSIX_MP_NOT_IMPLEMENTED(); rtems_set_errno_and_return_minus_one( EINVAL ); case OBJECTS_LOCAL: the_mq = the_mq_fd->Queue; if ( notification ) { 4000aa0c: 02 80 00 17 be 4000aa68 4000aa10: f0 02 20 10 ld [ %o0 + 0x10 ], %i0 if ( _CORE_message_queue_Is_notify_enabled( &the_mq->Message_queue ) ) { 4000aa14: c2 06 20 80 ld [ %i0 + 0x80 ], %g1 4000aa18: 80 a0 60 00 cmp %g1, 0 4000aa1c: 22 80 00 0a be,a 4000aa44 4000aa20: c0 26 20 80 clr [ %i0 + 0x80 ] _Thread_Enable_dispatch(); 4000aa24: 7f ff ff ca call 4000a94c <_Thread_Enable_dispatch> 4000aa28: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( EBUSY ); 4000aa2c: 40 00 2d d1 call 40016170 <__errno> 4000aa30: 01 00 00 00 nop 4000aa34: 82 10 20 10 mov 0x10, %g1 ! 10 4000aa38: c2 22 00 00 st %g1, [ %o0 ] 4000aa3c: 10 80 00 13 b 4000aa88 4000aa40: 90 10 3f ff mov -1, %o0 the_message_queue->notify_argument = the_argument; 4000aa44: c0 26 20 84 clr [ %i0 + 0x84 ] } _CORE_message_queue_Set_notify( &the_mq->Message_queue, NULL, NULL ); the_mq->notification = *notification; 4000aa48: 90 06 20 94 add %i0, 0x94, %o0 4000aa4c: 40 00 2f af call 40016908 4000aa50: 94 10 20 14 mov 0x14, %o2 CORE_message_queue_Control *the_message_queue, CORE_message_queue_Notify_Handler the_handler, void *the_argument ) { the_message_queue->notify_handler = the_handler; 4000aa54: 03 10 00 2a sethi %hi(0x4000a800), %g1 the_message_queue->notify_argument = the_argument; 4000aa58: f0 26 20 84 st %i0, [ %i0 + 0x84 ] CORE_message_queue_Control *the_message_queue, CORE_message_queue_Notify_Handler the_handler, void *the_argument ) { the_message_queue->notify_handler = the_handler; 4000aa5c: 82 10 61 80 or %g1, 0x180, %g1 4000aa60: 10 80 00 04 b 4000aa70 4000aa64: c2 26 20 80 st %g1, [ %i0 + 0x80 ] the_message_queue->notify_argument = the_argument; 4000aa68: c0 26 20 84 clr [ %i0 + 0x84 ] CORE_message_queue_Control *the_message_queue, CORE_message_queue_Notify_Handler the_handler, void *the_argument ) { the_message_queue->notify_handler = the_handler; 4000aa6c: c0 26 20 80 clr [ %i0 + 0x80 ] _CORE_message_queue_Set_notify( &the_mq->Message_queue, NULL, NULL ); } _Thread_Enable_dispatch(); 4000aa70: 7f ff ff b7 call 4000a94c <_Thread_Enable_dispatch> 4000aa74: 01 00 00 00 nop 4000aa78: 10 80 00 04 b 4000aa88 4000aa7c: 90 10 20 00 clr %o0 ! 0 return 0; } return POSIX_BOTTOM_REACHED(); 4000aa80: 40 00 06 73 call 4000c44c <== NOT EXECUTED 4000aa84: 01 00 00 00 nop <== NOT EXECUTED } 4000aa88: b0 10 00 08 mov %o0, %i0 4000aa8c: 81 c7 e0 08 ret 4000aa90: 81 e8 00 00 restore 4000ab14 : int oflag, ... /* mode_t mode, */ /* struct mq_attr attr */ ) { 4000ab14: 9d e3 bf 88 save %sp, -120, %sp rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 4000ab18: 05 10 00 97 sethi %hi(0x40025c00), %g2 4000ab1c: c2 00 a0 40 ld [ %g2 + 0x40 ], %g1 ! 40025c40 <_Thread_Dispatch_disable_level> 4000ab20: f4 27 a0 4c st %i2, [ %fp + 0x4c ] 4000ab24: f6 27 a0 50 st %i3, [ %fp + 0x50 ] 4000ab28: f8 27 a0 54 st %i4, [ %fp + 0x54 ] 4000ab2c: fa 27 a0 58 st %i5, [ %fp + 0x58 ] 4000ab30: 82 00 60 01 inc %g1 4000ab34: a0 10 00 18 mov %i0, %l0 4000ab38: c2 20 a0 40 st %g1, [ %g2 + 0x40 ] POSIX_Message_queue_Control_fd *the_mq_fd; Objects_Locations location; _Thread_Disable_dispatch(); if ( oflag & O_CREAT ) { 4000ab3c: b6 8e 62 00 andcc %i1, 0x200, %i3 4000ab40: 02 80 00 05 be 4000ab54 4000ab44: b4 10 20 00 clr %i2 va_start(arg, oflag); mode = (mode_t) va_arg( arg, unsigned int ); attr = (struct mq_attr *) va_arg( arg, struct mq_attr * ); 4000ab48: f4 07 a0 50 ld [ %fp + 0x50 ], %i2 4000ab4c: 82 07 a0 54 add %fp, 0x54, %g1 4000ab50: c2 27 bf f4 st %g1, [ %fp + -12 ] */ RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control_fd * _POSIX_Message_queue_Allocate_fd( void ) { return (POSIX_Message_queue_Control_fd *) 4000ab54: 39 10 00 98 sethi %hi(0x40026000), %i4 4000ab58: 40 00 10 0b call 4000eb84 <_Objects_Allocate> 4000ab5c: 90 17 22 10 or %i4, 0x210, %o0 ! 40026210 <_POSIX_Message_queue_Information_fds> va_end(arg); } the_mq_fd = _POSIX_Message_queue_Allocate_fd(); if ( !the_mq_fd ) { 4000ab60: b0 92 20 00 orcc %o0, 0, %i0 4000ab64: 32 80 00 08 bne,a 4000ab84 4000ab68: f2 26 20 14 st %i1, [ %i0 + 0x14 ] _Thread_Enable_dispatch(); 4000ab6c: 7f ff ff dd call 4000aae0 <_Thread_Enable_dispatch> 4000ab70: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( ENFILE ); 4000ab74: 40 00 2d 7f call 40016170 <__errno> 4000ab78: 01 00 00 00 nop 4000ab7c: 10 80 00 20 b 4000abfc 4000ab80: 82 10 20 17 mov 0x17, %g1 ! 17 } the_mq_fd->oflag = oflag; status = _POSIX_Message_queue_Name_to_id( name, &the_mq_id ); 4000ab84: 90 10 00 10 mov %l0, %o0 4000ab88: 40 00 23 84 call 40013998 <_POSIX_Message_queue_Name_to_id> 4000ab8c: 92 07 bf f0 add %fp, -16, %o1 * 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 ) { 4000ab90: ba 92 20 00 orcc %o0, 0, %i5 4000ab94: 02 80 00 10 be 4000abd4 4000ab98: 82 0e 6a 00 and %i1, 0xa00, %g1 /* * 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) ) ) { 4000ab9c: 80 a7 60 02 cmp %i5, 2 4000aba0: 12 80 00 04 bne 4000abb0 4000aba4: 80 a6 e0 00 cmp %i3, 0 4000aba8: 12 80 00 2c bne 4000ac58 4000abac: 90 10 00 10 mov %l0, %o0 _POSIX_Message_queue_Free_fd( the_mq_fd ); 4000abb0: 7f ff ff c5 call 4000aac4 <_POSIX_Message_queue_Free_fd> 4000abb4: 90 10 00 18 mov %i0, %o0 _Thread_Enable_dispatch(); 4000abb8: 7f ff ff ca call 4000aae0 <_Thread_Enable_dispatch> 4000abbc: b0 10 3f ff mov -1, %i0 rtems_set_errno_and_return_minus_one_cast( status, mqd_t ); 4000abc0: 40 00 2d 6c call 40016170 <__errno> 4000abc4: 01 00 00 00 nop 4000abc8: fa 22 00 00 st %i5, [ %o0 ] 4000abcc: 81 c7 e0 08 ret 4000abd0: 81 e8 00 00 restore /* * Check for existence with creation. */ if ( (oflag & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL) ) { 4000abd4: 80 a0 6a 00 cmp %g1, 0xa00 4000abd8: 12 80 00 0b bne 4000ac04 4000abdc: d2 07 bf f0 ld [ %fp + -16 ], %o1 _POSIX_Message_queue_Free_fd( the_mq_fd ); 4000abe0: 7f ff ff b9 call 4000aac4 <_POSIX_Message_queue_Free_fd> 4000abe4: 90 10 00 18 mov %i0, %o0 _Thread_Enable_dispatch(); 4000abe8: 7f ff ff be call 4000aae0 <_Thread_Enable_dispatch> 4000abec: 01 00 00 00 nop rtems_set_errno_and_return_minus_one_cast( EEXIST, mqd_t ); 4000abf0: 40 00 2d 60 call 40016170 <__errno> 4000abf4: 01 00 00 00 nop 4000abf8: 82 10 20 11 mov 0x11, %g1 ! 11 4000abfc: 10 80 00 22 b 4000ac84 4000ac00: c2 22 00 00 st %g1, [ %o0 ] RTEMS_INLINE_ROUTINE POSIX_Message_queue_Control *_POSIX_Message_queue_Get ( Objects_Id id, Objects_Locations *location ) { return (POSIX_Message_queue_Control *) 4000ac04: 94 07 bf e8 add %fp, -24, %o2 <== NOT EXECUTED 4000ac08: 11 10 00 98 sethi %hi(0x40026000), %o0 <== NOT EXECUTED 4000ac0c: 40 00 11 22 call 4000f094 <_Objects_Get> <== NOT EXECUTED 4000ac10: 90 12 20 58 or %o0, 0x58, %o0 ! 40026058 <_POSIX_Message_queue_Information> <== NOT EXECUTED * 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; 4000ac14: c4 02 20 1c ld [ %o0 + 0x1c ], %g2 <== NOT EXECUTED 4000ac18: 82 10 00 08 mov %o0, %g1 <== NOT EXECUTED the_mq_fd->Queue = the_mq; _Objects_Open( 4000ac1c: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED /* * 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 ); 4000ac20: c2 27 bf ec st %g1, [ %fp + -20 ] <== NOT EXECUTED the_mq->open_count += 1; 4000ac24: 84 00 a0 01 inc %g2 <== NOT EXECUTED the_mq_fd->Queue = the_mq; _Objects_Open( 4000ac28: 90 17 22 10 or %i4, 0x210, %o0 <== NOT EXECUTED 4000ac2c: 94 10 20 00 clr %o2 <== NOT EXECUTED * check the mode. */ the_mq = _POSIX_Message_queue_Get( the_mq_id, &location ); the_mq->open_count += 1; the_mq_fd->Queue = the_mq; 4000ac30: c2 26 20 10 st %g1, [ %i0 + 0x10 ] <== NOT EXECUTED _Objects_Open( 4000ac34: 7f ff ff 98 call 4000aa94 <_Objects_Open> <== NOT EXECUTED 4000ac38: c4 20 60 1c st %g2, [ %g1 + 0x1c ] <== NOT EXECUTED &_POSIX_Message_queue_Information_fds, &the_mq_fd->Object, NULL ); _Thread_Enable_dispatch(); 4000ac3c: 7f ff ff a9 call 4000aae0 <_Thread_Enable_dispatch> <== NOT EXECUTED 4000ac40: 01 00 00 00 nop <== NOT EXECUTED _Thread_Enable_dispatch(); 4000ac44: 7f ff ff a7 call 4000aae0 <_Thread_Enable_dispatch> <== NOT EXECUTED 4000ac48: 01 00 00 00 nop <== NOT EXECUTED return (mqd_t)the_mq_fd->Object.id; 4000ac4c: f0 06 20 08 ld [ %i0 + 8 ], %i0 <== NOT EXECUTED 4000ac50: 81 c7 e0 08 ret <== NOT EXECUTED 4000ac54: 81 e8 00 00 restore <== NOT EXECUTED /* * 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( 4000ac58: 94 10 00 1a mov %i2, %o2 4000ac5c: 92 10 20 01 mov 1, %o1 4000ac60: 40 00 22 e2 call 400137e8 <_POSIX_Message_queue_Create_support> 4000ac64: 96 07 bf ec add %fp, -20, %o3 /* * errno was set by Create_support, so don't set it again. */ if ( status == -1 ) { 4000ac68: 80 a2 3f ff cmp %o0, -1 4000ac6c: 12 80 00 08 bne 4000ac8c 4000ac70: c2 07 bf ec ld [ %fp + -20 ], %g1 _Thread_Enable_dispatch(); 4000ac74: 7f ff ff 9b call 4000aae0 <_Thread_Enable_dispatch> 4000ac78: 01 00 00 00 nop _POSIX_Message_queue_Free_fd( the_mq_fd ); 4000ac7c: 7f ff ff 92 call 4000aac4 <_POSIX_Message_queue_Free_fd> 4000ac80: 90 10 00 18 mov %i0, %o0 4000ac84: 81 c7 e0 08 ret 4000ac88: 91 e8 3f ff restore %g0, -1, %o0 return (mqd_t) -1; } the_mq_fd->Queue = the_mq; _Objects_Open( 4000ac8c: 92 10 00 18 mov %i0, %o1 4000ac90: 90 17 22 10 or %i4, 0x210, %o0 4000ac94: 94 10 20 00 clr %o2 4000ac98: 7f ff ff 7f call 4000aa94 <_Objects_Open> 4000ac9c: c2 26 20 10 st %g1, [ %i0 + 0x10 ] &_POSIX_Message_queue_Information_fds, &the_mq_fd->Object, NULL ); _Thread_Enable_dispatch(); 4000aca0: 7f ff ff 90 call 4000aae0 <_Thread_Enable_dispatch> 4000aca4: 01 00 00 00 nop return (mqd_t) the_mq_fd->Object.id; 4000aca8: f0 06 20 08 ld [ %i0 + 8 ], %i0 } 4000acac: 81 c7 e0 08 ret 4000acb0: 81 e8 00 00 restore 4000afcc : int mq_setattr( mqd_t mqdes, const struct mq_attr *mqstat, struct mq_attr *omqstat ) { 4000afcc: 9d e3 bf 90 save %sp, -112, %sp POSIX_Message_queue_Control_fd *the_mq_fd; CORE_message_queue_Control *the_core_mq; Objects_Locations location; if ( !mqstat ) 4000afd0: 80 a6 60 00 cmp %i1, 0 4000afd4: 12 80 00 06 bne 4000afec 4000afd8: 92 10 00 18 mov %i0, %o1 rtems_set_errno_and_return_minus_one( EINVAL ); 4000afdc: 40 00 2c 65 call 40016170 <__errno> 4000afe0: 01 00 00 00 nop 4000afe4: 10 80 00 12 b 4000b02c 4000afe8: 82 10 20 16 mov 0x16, %g1 ! 16 4000afec: 11 10 00 98 sethi %hi(0x40026000), %o0 4000aff0: 94 07 bf f4 add %fp, -12, %o2 4000aff4: 40 00 10 28 call 4000f094 <_Objects_Get> 4000aff8: 90 12 22 10 or %o0, 0x210, %o0 the_mq_fd = _POSIX_Message_queue_Get_fd( mqdes, &location ); switch ( location ) { 4000affc: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000b000: 80 a0 60 01 cmp %g1, 1 4000b004: 02 80 00 0d be 4000b038 4000b008: 01 00 00 00 nop 4000b00c: 0a 80 00 11 bcs 4000b050 4000b010: 80 a6 a0 00 cmp %i2, 0 4000b014: 80 a0 60 02 cmp %g1, 2 4000b018: 12 80 00 27 bne 4000b0b4 4000b01c: 01 00 00 00 nop case OBJECTS_ERROR: rtems_set_errno_and_return_minus_one( EBADF ); 4000b020: 40 00 2c 54 call 40016170 <__errno> 4000b024: 01 00 00 00 nop 4000b028: 82 10 20 09 mov 9, %g1 ! 9 4000b02c: c2 22 00 00 st %g1, [ %o0 ] 4000b030: 10 80 00 23 b 4000b0bc 4000b034: 90 10 3f ff mov -1, %o0 case OBJECTS_REMOTE: _Thread_Dispatch(); 4000b038: 40 00 14 cc call 40010368 <_Thread_Dispatch> <== NOT EXECUTED 4000b03c: 01 00 00 00 nop <== NOT EXECUTED return POSIX_MP_NOT_IMPLEMENTED(); 4000b040: 40 00 05 0d call 4000c474 <== NOT EXECUTED 4000b044: 01 00 00 00 nop <== NOT EXECUTED the_mq_fd->oflag = mqstat->mq_flags; _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); } 4000b048: 81 c7 e0 08 ret <== NOT EXECUTED 4000b04c: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED /* * Return the old values. */ if ( omqstat ) { 4000b050: 02 80 00 0a be 4000b078 4000b054: c4 02 20 10 ld [ %o0 + 0x10 ], %g2 omqstat->mq_flags = the_mq_fd->oflag; 4000b058: c2 02 20 14 ld [ %o0 + 0x14 ], %g1 4000b05c: c2 26 80 00 st %g1, [ %i2 ] omqstat->mq_msgsize = the_core_mq->maximum_message_size; 4000b060: c2 00 a0 6c ld [ %g2 + 0x6c ], %g1 4000b064: c2 26 a0 08 st %g1, [ %i2 + 8 ] omqstat->mq_maxmsg = the_core_mq->maximum_pending_messages; 4000b068: c2 00 a0 64 ld [ %g2 + 0x64 ], %g1 4000b06c: c2 26 a0 04 st %g1, [ %i2 + 4 ] omqstat->mq_curmsgs = the_core_mq->number_of_pending_messages; 4000b070: c2 00 a0 68 ld [ %g2 + 0x68 ], %g1 4000b074: c2 26 a0 0c st %g1, [ %i2 + 0xc ] } the_mq_fd->oflag = mqstat->mq_flags; 4000b078: c2 06 40 00 ld [ %i1 ], %g1 4000b07c: c2 22 20 14 st %g1, [ %o0 + 0x14 ] #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 4000b080: 05 10 00 97 sethi %hi(0x40025c00), %g2 4000b084: c2 00 a0 40 ld [ %g2 + 0x40 ], %g1 ! 40025c40 <_Thread_Dispatch_disable_level> 4000b088: 90 10 20 00 clr %o0 4000b08c: 82 00 7f ff add %g1, -1, %g1 4000b090: c2 20 a0 40 st %g1, [ %g2 + 0x40 ] 4000b094: c2 00 a0 40 ld [ %g2 + 0x40 ], %g1 4000b098: 80 a0 60 00 cmp %g1, 0 4000b09c: 32 80 00 09 bne,a 4000b0c0 4000b0a0: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED _Thread_Dispatch(); 4000b0a4: 40 00 14 b1 call 40010368 <_Thread_Dispatch> 4000b0a8: 01 00 00 00 nop 4000b0ac: 10 80 00 04 b 4000b0bc 4000b0b0: 90 10 20 00 clr %o0 ! 0 _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); 4000b0b4: 40 00 04 e6 call 4000c44c <== NOT EXECUTED 4000b0b8: 01 00 00 00 nop <== NOT EXECUTED } 4000b0bc: b0 10 00 08 mov %o0, %i0 4000b0c0: 81 c7 e0 08 ret 4000b0c4: 81 e8 00 00 restore 4000b0c8 : char *msg_ptr, size_t msg_len, unsigned int *msg_prio, const struct timespec *abstime ) { 4000b0c8: 9d e3 bf 90 save %sp, -112, %sp * So we check the abstime provided, and hold on to whether it * is valid or not. If it isn't correct and in the future, * then we do a polling operation and convert the UNSATISFIED * status into the appropriate error. */ switch ( _POSIX_Absolute_timeout_to_ticks( abstime, &ticks ) ) { 4000b0cc: 92 07 bf f4 add %fp, -12, %o1 4000b0d0: 40 00 00 88 call 4000b2f0 <_POSIX_Absolute_timeout_to_ticks> 4000b0d4: 90 10 00 1c mov %i4, %o0 char *msg_ptr, size_t msg_len, unsigned int *msg_prio, const struct timespec *abstime ) { 4000b0d8: 92 10 00 19 mov %i1, %o1 4000b0dc: 94 10 00 1a mov %i2, %o2 * So we check the abstime provided, and hold on to whether it * is valid or not. If it isn't correct and in the future, * then we do a polling operation and convert the UNSATISFIED * status into the appropriate error. */ switch ( _POSIX_Absolute_timeout_to_ticks( abstime, &ticks ) ) { 4000b0e0: 80 a2 20 02 cmp %o0, 2 4000b0e4: 08 80 00 07 bleu 4000b100 4000b0e8: 96 10 00 1b mov %i3, %o3 4000b0ec: 80 a2 20 03 cmp %o0, 3 4000b0f0: 22 80 00 05 be,a 4000b104 4000b0f4: b8 10 20 01 mov 1, %i4 case POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE: do_wait = TRUE; break; } return _POSIX_Message_queue_Receive_support( 4000b0f8: 10 80 00 04 b 4000b108 <== NOT EXECUTED 4000b0fc: da 07 bf f4 ld [ %fp + -12 ], %o5 <== NOT EXECUTED * So we check the abstime provided, and hold on to whether it * is valid or not. If it isn't correct and in the future, * then we do a polling operation and convert the UNSATISFIED * status into the appropriate error. */ switch ( _POSIX_Absolute_timeout_to_ticks( abstime, &ticks ) ) { 4000b100: b8 10 20 00 clr %i4 <== NOT EXECUTED case POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE: do_wait = TRUE; break; } return _POSIX_Message_queue_Receive_support( 4000b104: da 07 bf f4 ld [ %fp + -12 ], %o5 4000b108: 90 10 00 18 mov %i0, %o0 4000b10c: 7f ff fe fd call 4000ad00 <_POSIX_Message_queue_Receive_support> 4000b110: 98 10 00 1c mov %i4, %o4 msg_len, msg_prio, do_wait, ticks ); } 4000b114: 81 c7 e0 08 ret 4000b118: 91 e8 00 08 restore %g0, %o0, %o0 4000b11c : const char *msg_ptr, size_t msg_len, unsigned int msg_prio, const struct timespec *abstime ) { 4000b11c: 9d e3 bf 90 save %sp, -112, %sp * So we check the abstime provided, and hold on to whether it * is valid or not. If it isn't correct and in the future, * then we do a polling operation and convert the UNSATISFIED * status into the appropriate error. */ switch ( _POSIX_Absolute_timeout_to_ticks( abstime, &ticks ) ) { 4000b120: 92 07 bf f4 add %fp, -12, %o1 4000b124: 40 00 00 73 call 4000b2f0 <_POSIX_Absolute_timeout_to_ticks> 4000b128: 90 10 00 1c mov %i4, %o0 const char *msg_ptr, size_t msg_len, unsigned int msg_prio, const struct timespec *abstime ) { 4000b12c: 92 10 00 19 mov %i1, %o1 4000b130: 94 10 00 1a mov %i2, %o2 * So we check the abstime provided, and hold on to whether it * is valid or not. If it isn't correct and in the future, * then we do a polling operation and convert the UNSATISFIED * status into the appropriate error. */ switch ( _POSIX_Absolute_timeout_to_ticks( abstime, &ticks ) ) { 4000b134: 80 a2 20 02 cmp %o0, 2 4000b138: 08 80 00 07 bleu 4000b154 4000b13c: 96 10 00 1b mov %i3, %o3 4000b140: 80 a2 20 03 cmp %o0, 3 4000b144: 22 80 00 05 be,a 4000b158 4000b148: b8 10 20 01 mov 1, %i4 case POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE: do_wait = TRUE; break; } return _POSIX_Message_queue_Send_support( 4000b14c: 10 80 00 04 b 4000b15c <== NOT EXECUTED 4000b150: da 07 bf f4 ld [ %fp + -12 ], %o5 <== NOT EXECUTED * So we check the abstime provided, and hold on to whether it * is valid or not. If it isn't correct and in the future, * then we do a polling operation and convert the UNSATISFIED * status into the appropriate error. */ switch ( _POSIX_Absolute_timeout_to_ticks( abstime, &ticks ) ) { 4000b154: b8 10 20 00 clr %i4 <== NOT EXECUTED case POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE: do_wait = TRUE; break; } return _POSIX_Message_queue_Send_support( 4000b158: da 07 bf f4 ld [ %fp + -12 ], %o5 4000b15c: 90 10 00 18 mov %i0, %o0 4000b160: 7f ff ff 4e call 4000ae98 <_POSIX_Message_queue_Send_support> 4000b164: 98 10 00 1c mov %i4, %o4 msg_len, msg_prio, do_wait, ticks ); } 4000b168: 81 c7 e0 08 ret 4000b16c: 91 e8 00 08 restore %g0, %o0, %o0 40003624 : */ int newlib_free_buffers( FILE *fp ) { 40003624: 9d e3 bf 98 save %sp, -104, %sp switch ( fileno(fp) ) { 40003628: 40 00 2f 35 call 4000f2fc 4000362c: 90 10 00 18 mov %i0, %o0 40003630: 80 a2 20 02 cmp %o0, 2 40003634: 18 80 00 0e bgu 4000366c 40003638: 01 00 00 00 nop case 0: case 1: case 2: if (fp->_flags & __SMBF) { 4000363c: c2 16 20 0c lduh [ %i0 + 0xc ], %g1 40003640: 80 88 60 80 btst 0x80, %g1 40003644: 02 80 00 0c be 40003674 40003648: 01 00 00 00 nop free( fp->_bf._base ); 4000364c: 7f ff fe 80 call 4000304c 40003650: d0 06 20 10 ld [ %i0 + 0x10 ], %o0 fp->_flags &= ~__SMBF; 40003654: c2 16 20 0c lduh [ %i0 + 0xc ], %g1 fp->_bf._base = fp->_p = (unsigned char *) NULL; 40003658: c0 26 20 10 clr [ %i0 + 0x10 ] case 0: case 1: case 2: if (fp->_flags & __SMBF) { free( fp->_bf._base ); fp->_flags &= ~__SMBF; 4000365c: 82 08 7f 7f and %g1, -129, %g1 fp->_bf._base = fp->_p = (unsigned char *) NULL; 40003660: c0 26 00 00 clr [ %i0 ] case 0: case 1: case 2: if (fp->_flags & __SMBF) { free( fp->_bf._base ); fp->_flags &= ~__SMBF; 40003664: 10 80 00 04 b 40003674 40003668: c2 36 20 0c sth %g1, [ %i0 + 0xc ] fp->_bf._base = fp->_p = (unsigned char *) NULL; } break; default: fclose(fp); 4000366c: 40 00 2e aa call 4000f114 <== NOT EXECUTED 40003670: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED } return 0; } 40003674: 81 c7 e0 08 ret 40003678: 91 e8 20 00 restore %g0, 0, %o0 4000374c : rtems_device_driver null_initialize( rtems_device_major_number major, rtems_device_minor_number minor, void *pargp ) { 4000374c: 9d e3 bf 98 save %sp, -104, %sp rtems_device_driver status; if ( !initialized ) { 40003750: 05 10 00 7b sethi %hi(0x4001ec00), %g2 40003754: c2 48 a0 f0 ldsb [ %g2 + 0xf0 ], %g1 ! 4001ecf0 40003758: 80 a0 60 00 cmp %g1, 0 4000375c: 12 80 00 0f bne 40003798 40003760: 82 10 20 01 mov 1, %g1 initialized = 1; status = rtems_io_register_name( 40003764: 11 10 00 70 sethi %hi(0x4001c000), %o0 ) { rtems_device_driver status; if ( !initialized ) { initialized = 1; 40003768: c2 28 a0 f0 stb %g1, [ %g2 + 0xf0 ] status = rtems_io_register_name( 4000376c: 90 12 22 00 or %o0, 0x200, %o0 40003770: 92 10 00 18 mov %i0, %o1 40003774: 40 00 00 4e call 400038ac 40003778: 94 10 20 00 clr %o2 "/dev/null", major, (rtems_device_minor_number) 0 ); if (status != RTEMS_SUCCESSFUL) 4000377c: 80 a2 20 00 cmp %o0, 0 40003780: 02 80 00 05 be 40003794 40003784: 03 10 00 7b sethi %hi(0x4001ec00), %g1 rtems_fatal_error_occurred(status); 40003788: 40 00 12 96 call 400081e0 <== NOT EXECUTED 4000378c: 01 00 00 00 nop <== NOT EXECUTED NULL_major = major; 40003790: 03 10 00 7b sethi %hi(0x4001ec00), %g1 <== NOT EXECUTED 40003794: f0 20 62 a4 st %i0, [ %g1 + 0x2a4 ] ! 4001eea4 } return RTEMS_SUCCESSFUL; } 40003798: 81 c7 e0 08 ret 4000379c: 91 e8 20 00 restore %g0, 0, %o0 40003728 : void *pargp ) { rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *) pargp; if ( rw_args ) 40003728: 80 a2 a0 00 cmp %o2, 0 4000372c: 02 80 00 04 be 4000373c 40003730: 01 00 00 00 nop rw_args->bytes_moved = rw_args->count; 40003734: c2 02 a0 0c ld [ %o2 + 0xc ], %g1 <== NOT EXECUTED 40003738: c2 22 a0 14 st %g1, [ %o2 + 0x14 ] <== NOT EXECUTED return NULL_SUCCESSFUL; } 4000373c: 81 c3 e0 08 retl 40003740: 90 10 20 00 clr %o0 40003880 : int open( const char *pathname, int flags, ... ) { 40003880: 9d e3 bf 80 save %sp, -128, %sp 40003884: f6 27 a0 50 st %i3, [ %fp + 0x50 ] 40003888: f8 27 a0 54 st %i4, [ %fp + 0x54 ] 4000388c: fa 27 a0 58 st %i5, [ %fp + 0x58 ] 40003890: f4 27 a0 4c st %i2, [ %fp + 0x4c ] /* * Set the Evaluation flags */ eval_flags = 0; status = flags + 1; 40003894: 82 06 60 01 add %i1, 1, %g1 if ( ( status & _FREAD ) == _FREAD ) eval_flags |= RTEMS_LIBIO_PERMS_READ; if ( ( status & _FWRITE ) == _FWRITE ) 40003898: 80 88 60 02 btst 2, %g1 * Set the Evaluation flags */ eval_flags = 0; status = flags + 1; if ( ( status & _FREAD ) == _FREAD ) 4000389c: 82 08 60 01 and %g1, 1, %g1 eval_flags |= RTEMS_LIBIO_PERMS_READ; if ( ( status & _FWRITE ) == _FWRITE ) 400038a0: 02 80 00 03 be 400038ac 400038a4: a1 28 60 02 sll %g1, 2, %l0 eval_flags |= RTEMS_LIBIO_PERMS_WRITE; 400038a8: a0 14 20 02 or %l0, 2, %l0 va_start(ap, flags); mode = va_arg( ap, int ); 400038ac: 82 07 a0 50 add %fp, 0x50, %g1 * descriptors are obtained using socket(), not open(). */ /* allocate a file control block */ iop = rtems_libio_allocate(); if ( iop == 0 ) { 400038b0: b8 10 20 17 mov 0x17, %i4 * 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(); 400038b4: 40 00 23 dd call 4000c828 400038b8: c2 27 bf f4 st %g1, [ %fp + -12 ] if ( iop == 0 ) { 400038bc: ba 92 20 00 orcc %o0, 0, %i5 400038c0: 02 80 00 98 be 40003b20 400038c4: 92 10 00 10 mov %l0, %o1 /* * See if the file exists. */ status = rtems_filesystem_evaluate_path( 400038c8: 90 10 00 18 mov %i0, %o0 400038cc: a0 07 bf e4 add %fp, -28, %l0 400038d0: 96 10 20 01 mov 1, %o3 400038d4: 7f ff fd 58 call 40002e34 400038d8: 94 10 00 10 mov %l0, %o2 pathname, eval_flags, &loc, TRUE ); if ( status == -1 ) { 400038dc: 80 a2 3f ff cmp %o0, -1 400038e0: 12 80 00 28 bne 40003980 400038e4: 82 0e 6a 00 and %i1, 0xa00, %g1 if ( errno != ENOENT ) { 400038e8: 40 00 2d b5 call 4000efbc <__errno> 400038ec: 01 00 00 00 nop 400038f0: c2 02 00 00 ld [ %o0 ], %g1 400038f4: 80 a0 60 02 cmp %g1, 2 400038f8: 02 80 00 06 be 40003910 400038fc: 80 8e 62 00 btst 0x200, %i1 rc = errno; 40003900: 40 00 2d af call 4000efbc <__errno> 40003904: b6 10 20 00 clr %i3 40003908: 10 80 00 71 b 40003acc 4000390c: f8 02 00 00 ld [ %o0 ], %i4 goto done; } /* If the file does not exist and we are not trying to create it--> error */ if ( !(flags & O_CREAT) ) { 40003910: b8 10 20 02 mov 2, %i4 40003914: 02 80 00 71 be 40003ad8 40003918: b6 10 20 00 clr %i3 rc = ENOENT; goto done; } /* Create the node for the new regular file */ rc = mknod( pathname, S_IFREG | mode, 0LL ); 4000391c: 13 3f ff e0 sethi %hi(0xffff8000), %o1 40003920: 90 10 00 18 mov %i0, %o0 40003924: 92 16 80 09 or %i2, %o1, %o1 40003928: 94 10 20 00 clr %o2 4000392c: 93 2a 60 10 sll %o1, 0x10, %o1 40003930: 96 10 20 00 clr %o3 40003934: 7f ff fe c7 call 40003450 40003938: 93 32 60 10 srl %o1, 0x10, %o1 if ( rc ) { 4000393c: 80 a2 20 00 cmp %o0, 0 40003940: 02 80 00 06 be 40003958 40003944: 94 10 00 10 mov %l0, %o2 rc = errno; 40003948: 40 00 2d 9d call 4000efbc <__errno> <== NOT EXECUTED 4000394c: 01 00 00 00 nop <== NOT EXECUTED 40003950: 10 80 00 5f b 40003acc <== NOT EXECUTED 40003954: f8 02 00 00 ld [ %o0 ], %i4 <== NOT EXECUTED goto done; } /* Sanity check to see if the file name exists after the mknod() */ status = rtems_filesystem_evaluate_path( pathname, 0x0, &loc, TRUE ); 40003958: 90 10 00 18 mov %i0, %o0 4000395c: 92 10 20 00 clr %o1 40003960: 96 10 20 01 mov 1, %o3 40003964: 7f ff fd 34 call 40002e34 40003968: b8 10 20 0d mov 0xd, %i4 if ( status != 0 ) { /* The file did not exist */ 4000396c: 80 a2 20 00 cmp %o0, 0 40003970: 12 80 00 5a bne 40003ad8 40003974: b6 10 20 00 clr %i3 /* * Fill in the file control block based on the loc structure * returned by successful path evaluation. */ iop->handlers = loc.handlers; 40003978: 10 80 00 07 b 40003994 4000397c: c2 07 bf e8 ld [ %fp + -24 ], %g1 if ( status != 0 ) { /* The file did not exist */ rc = EACCES; goto done; } } else if ((flags & (O_EXCL|O_CREAT)) == (O_EXCL|O_CREAT)) { 40003980: b6 10 00 10 mov %l0, %i3 40003984: 80 a0 6a 00 cmp %g1, 0xa00 40003988: 02 80 00 54 be 40003ad8 4000398c: b8 10 20 11 mov 0x11, %i4 /* * Fill in the file control block based on the loc structure * returned by successful path evaluation. */ iop->handlers = loc.handlers; 40003990: c2 07 bf e8 ld [ %fp + -24 ], %g1 iop->file_info = loc.node_access; iop->flags |= rtems_libio_fcntl_flags( flags ); 40003994: e0 07 60 0c ld [ %i5 + 0xc ], %l0 /* * Fill in the file control block based on the loc structure * returned by successful path evaluation. */ iop->handlers = loc.handlers; 40003998: c2 27 60 30 st %g1, [ %i5 + 0x30 ] iop->file_info = loc.node_access; 4000399c: c2 07 bf e4 ld [ %fp + -28 ], %g1 iop->flags |= rtems_libio_fcntl_flags( flags ); 400039a0: 90 10 00 19 mov %i1, %o0 400039a4: 40 00 23 d7 call 4000c900 400039a8: c2 27 60 2c st %g1, [ %i5 + 0x2c ] 400039ac: 90 12 00 10 or %o0, %l0, %o0 iop->pathinfo = loc; 400039b0: 94 10 20 10 mov 0x10, %o2 * returned by successful path evaluation. */ iop->handlers = loc.handlers; iop->file_info = loc.node_access; iop->flags |= rtems_libio_fcntl_flags( flags ); 400039b4: d0 27 60 0c st %o0, [ %i5 + 0xc ] iop->pathinfo = loc; 400039b8: a0 07 bf e4 add %fp, -28, %l0 400039bc: 90 07 60 10 add %i5, 0x10, %o0 400039c0: 40 00 2f 54 call 4000f710 400039c4: 92 10 00 10 mov %l0, %o1 if ( !iop->handlers->open_h ) { 400039c8: c2 07 60 30 ld [ %i5 + 0x30 ], %g1 400039cc: b8 10 20 86 mov 0x86, %i4 400039d0: c2 00 40 00 ld [ %g1 ], %g1 400039d4: 80 a0 60 00 cmp %g1, 0 400039d8: 02 80 00 40 be 40003ad8 400039dc: b6 10 00 10 mov %l0, %i3 rc = ENOTSUP; goto done; } rc = (*iop->handlers->open_h)( iop, pathname, flags, mode ); 400039e0: 92 10 00 18 mov %i0, %o1 400039e4: 96 10 00 1a mov %i2, %o3 400039e8: 90 10 00 1d mov %i5, %o0 400039ec: 9f c0 40 00 call %g1 400039f0: 94 10 00 19 mov %i1, %o2 if ( rc ) 400039f4: b8 92 20 00 orcc %o0, 0, %i4 400039f8: 12 80 00 36 bne 40003ad0 400039fc: 80 a7 20 00 cmp %i4, 0 /* * Optionally truncate the file. */ if ( (flags & O_TRUNC) == O_TRUNC ) { 40003a00: 80 8e 64 00 btst 0x400, %i1 40003a04: 02 80 00 4c be 40003b34 40003a08: 03 10 00 6b sethi %hi(0x4001ac00), %g1 rc = ftruncate( iop - rtems_libio_iops, 0 ); 40003a0c: 21 10 00 6b sethi %hi(0x4001ac00), %l0 40003a10: c4 04 20 08 ld [ %l0 + 8 ], %g2 ! 4001ac08 40003a14: 92 10 20 00 clr %o1 40003a18: 84 27 40 02 sub %i5, %g2, %g2 40003a1c: 85 38 a0 02 sra %g2, 2, %g2 40003a20: 87 28 a0 02 sll %g2, 2, %g3 40003a24: 83 28 a0 06 sll %g2, 6, %g1 40003a28: 82 20 40 03 sub %g1, %g3, %g1 40003a2c: 91 28 60 06 sll %g1, 6, %o0 40003a30: 90 22 00 01 sub %o0, %g1, %o0 40003a34: 83 2a 20 0c sll %o0, 0xc, %g1 40003a38: 90 02 00 01 add %o0, %g1, %o0 40003a3c: 90 02 00 02 add %o0, %g2, %o0 40003a40: 91 2a 20 04 sll %o0, 4, %o0 40003a44: 90 22 00 02 sub %o0, %g2, %o0 40003a48: 91 2a 20 02 sll %o0, 2, %o0 40003a4c: 40 00 22 a5 call 4000c4e0 40003a50: 90 20 80 08 sub %g2, %o0, %o0 if ( rc ) { 40003a54: b8 92 20 00 orcc %o0, 0, %i4 40003a58: 02 80 00 37 be 40003b34 40003a5c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 if(errno) rc = errno; 40003a60: 40 00 2d 57 call 4000efbc <__errno> <== NOT EXECUTED 40003a64: 01 00 00 00 nop <== NOT EXECUTED 40003a68: c2 02 00 00 ld [ %o0 ], %g1 <== NOT EXECUTED 40003a6c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40003a70: 02 80 00 06 be 40003a88 <== NOT EXECUTED 40003a74: c4 04 20 08 ld [ %l0 + 8 ], %g2 <== NOT EXECUTED 40003a78: 40 00 2d 51 call 4000efbc <__errno> <== NOT EXECUTED 40003a7c: 01 00 00 00 nop <== NOT EXECUTED 40003a80: f8 02 00 00 ld [ %o0 ], %i4 <== NOT EXECUTED close( iop - rtems_libio_iops ); 40003a84: c4 04 20 08 ld [ %l0 + 8 ], %g2 <== NOT EXECUTED 40003a88: b6 10 20 00 clr %i3 <== NOT EXECUTED 40003a8c: 84 27 40 02 sub %i5, %g2, %g2 <== NOT EXECUTED 40003a90: 85 38 a0 02 sra %g2, 2, %g2 <== NOT EXECUTED 40003a94: 87 28 a0 02 sll %g2, 2, %g3 <== NOT EXECUTED 40003a98: 83 28 a0 06 sll %g2, 6, %g1 <== NOT EXECUTED 40003a9c: 82 20 40 03 sub %g1, %g3, %g1 <== NOT EXECUTED 40003aa0: 91 28 60 06 sll %g1, 6, %o0 <== NOT EXECUTED 40003aa4: 90 22 00 01 sub %o0, %g1, %o0 <== NOT EXECUTED 40003aa8: 83 2a 20 0c sll %o0, 0xc, %g1 <== NOT EXECUTED 40003aac: ba 10 20 00 clr %i5 <== NOT EXECUTED 40003ab0: 90 02 00 01 add %o0, %g1, %o0 <== NOT EXECUTED 40003ab4: 90 02 00 02 add %o0, %g2, %o0 <== NOT EXECUTED 40003ab8: 91 2a 20 04 sll %o0, 4, %o0 <== NOT EXECUTED 40003abc: 90 22 00 02 sub %o0, %g2, %o0 <== NOT EXECUTED 40003ac0: 91 2a 20 02 sll %o0, 2, %o0 <== NOT EXECUTED 40003ac4: 40 00 22 55 call 4000c418 <== NOT EXECUTED 40003ac8: 90 20 80 08 sub %g2, %o0, %o0 <== NOT EXECUTED */ done: va_end(ap); if ( rc ) { 40003acc: 80 a7 20 00 cmp %i4, 0 40003ad0: 02 80 00 19 be 40003b34 40003ad4: 03 10 00 6b sethi %hi(0x4001ac00), %g1 if ( iop ) 40003ad8: 80 a7 60 00 cmp %i5, 0 40003adc: 02 80 00 05 be 40003af0 40003ae0: 80 a6 e0 00 cmp %i3, 0 rtems_libio_free( iop ); 40003ae4: 40 00 23 3a call 4000c7cc 40003ae8: 90 10 00 1d mov %i5, %o0 if ( loc_to_free ) 40003aec: 80 a6 e0 00 cmp %i3, 0 40003af0: 02 80 00 0c be 40003b20 40003af4: 01 00 00 00 nop rtems_filesystem_freenode( loc_to_free ); 40003af8: c2 06 e0 08 ld [ %i3 + 8 ], %g1 40003afc: 80 a0 60 00 cmp %g1, 0 40003b00: 02 80 00 08 be 40003b20 40003b04: 01 00 00 00 nop 40003b08: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 40003b0c: 80 a0 60 00 cmp %g1, 0 40003b10: 02 80 00 04 be 40003b20 40003b14: 01 00 00 00 nop 40003b18: 9f c0 40 00 call %g1 40003b1c: 90 10 00 1b mov %i3, %o0 rtems_set_errno_and_return_minus_one( rc ); 40003b20: 40 00 2d 27 call 4000efbc <__errno> 40003b24: b0 10 3f ff mov -1, %i0 40003b28: f8 22 00 00 st %i4, [ %o0 ] 40003b2c: 81 c7 e0 08 ret 40003b30: 81 e8 00 00 restore } return iop - rtems_libio_iops; 40003b34: c6 00 60 08 ld [ %g1 + 8 ], %g3 40003b38: 86 27 40 03 sub %i5, %g3, %g3 40003b3c: 87 38 e0 02 sra %g3, 2, %g3 40003b40: 83 28 e0 02 sll %g3, 2, %g1 40003b44: 85 28 e0 06 sll %g3, 6, %g2 40003b48: 84 20 80 01 sub %g2, %g1, %g2 40003b4c: 83 28 a0 06 sll %g2, 6, %g1 40003b50: 82 20 40 02 sub %g1, %g2, %g1 40003b54: 85 28 60 0c sll %g1, 0xc, %g2 40003b58: 82 00 40 02 add %g1, %g2, %g1 40003b5c: 82 00 40 03 add %g1, %g3, %g1 40003b60: 83 28 60 04 sll %g1, 4, %g1 40003b64: 82 20 40 03 sub %g1, %g3, %g1 40003b68: 83 28 60 02 sll %g1, 2, %g1 40003b6c: b0 20 c0 01 sub %g3, %g1, %i0 } 40003b70: 81 c7 e0 08 ret 40003b74: 81 e8 00 00 restore 40003808 : /* * This is a replaceable stub */ void open_dev_console(void) { 40003808: 9d e3 bf 98 save %sp, -104, %sp int error_code = 'S' << 24 | 'T' << 16 | 'D' << 8; /* * Attempt to open /dev/console. */ if ((stdin_fd = open("/dev/console", O_RDONLY, 0)) == -1) { 4000380c: 31 10 00 62 sethi %hi(0x40018800), %i0 40003810: 92 10 20 00 clr %o1 40003814: 90 16 23 78 or %i0, 0x378, %o0 40003818: 40 00 00 1a call 40003880 4000381c: 94 10 20 00 clr %o2 40003820: 80 a2 3f ff cmp %o0, -1 40003824: 02 80 00 15 be 40003878 40003828: 90 16 23 78 or %i0, 0x378, %o0 /* * 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) 4000382c: 92 10 20 01 mov 1, %o1 40003830: 40 00 00 14 call 40003880 40003834: 94 10 20 00 clr %o2 40003838: 80 a2 3f ff cmp %o0, -1 4000383c: 32 80 00 06 bne,a 40003854 40003840: 90 16 23 78 or %i0, 0x378, %o0 rtems_fatal_error_occurred( error_code | '1' ); 40003844: 11 14 d5 11 sethi %hi(0x53544400), %o0 <== NOT EXECUTED 40003848: 40 00 0e dd call 400073bc <== NOT EXECUTED 4000384c: 90 12 20 31 or %o0, 0x31, %o0 ! 53544431 <== NOT EXECUTED if ((stderr_fd = open("/dev/console", O_WRONLY, 0)) == -1) 40003850: 90 16 23 78 or %i0, 0x378, %o0 <== NOT EXECUTED 40003854: 92 10 20 01 mov 1, %o1 40003858: 40 00 00 0a call 40003880 4000385c: 94 10 20 00 clr %o2 40003860: 80 a2 3f ff cmp %o0, -1 40003864: 12 80 00 05 bne 40003878 40003868: 31 14 d5 11 sethi %hi(0x53544400), %i0 rtems_fatal_error_occurred( error_code | '2' ); 4000386c: b0 16 20 32 or %i0, 0x32, %i0 ! 53544432 <== NOT EXECUTED 40003870: 40 00 0e d3 call 400073bc <== NOT EXECUTED 40003874: 81 e8 00 00 restore <== NOT EXECUTED 40003878: 81 c7 e0 08 ret 4000387c: 81 e8 00 00 restore 40018228 : * open a directory. */ DIR * opendir(name) const char *name; { 40018228: 9d e3 bf 98 save %sp, -104, %sp register DIR *dirp; register int fd; if ((fd = open(name, 0)) == -1) 4001822c: 92 10 20 00 clr %o1 40018230: 90 10 00 18 mov %i0, %o0 40018234: 7f ff ba 52 call 40006b7c 40018238: b0 10 20 00 clr %i0 4001823c: 80 a2 3f ff cmp %o0, -1 40018240: 02 80 00 18 be 400182a0 40018244: a0 10 00 08 mov %o0, %l0 return NULL; if (fcntl(fd, F_SETFD, 1) == -1 || 40018248: 92 10 20 02 mov 2, %o1 4001824c: 40 00 24 36 call 40021324 40018250: 94 10 20 01 mov 1, %o2 40018254: 80 a2 3f ff cmp %o0, -1 40018258: 02 80 00 10 be 40018298 4001825c: 90 10 00 10 mov %l0, %o0 40018260: 7f ff b7 b6 call 40006138 40018264: 90 10 20 18 mov 0x18, %o0 40018268: 80 a2 20 00 cmp %o0, 0 4001826c: 22 80 00 0b be,a 40018298 40018270: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 40018274: b0 10 00 08 mov %o0, %i0 * If CLSIZE is an exact multiple of DIRBLKSIZ, use a CLSIZE * buffer that it cluster boundary aligned. * Hopefully this can be a big win someday by allowing page trades * to user space to be done by getdirentries() */ dirp->dd_buf = malloc (512); 40018278: 7f ff b7 b0 call 40006138 4001827c: 90 10 22 00 mov 0x200, %o0 dirp->dd_len = 512; 40018280: 82 10 22 00 mov 0x200, %g1 * If CLSIZE is an exact multiple of DIRBLKSIZ, use a CLSIZE * buffer that it cluster boundary aligned. * Hopefully this can be a big win someday by allowing page trades * to user space to be done by getdirentries() */ dirp->dd_buf = malloc (512); 40018284: d0 26 20 0c st %o0, [ %i0 + 0xc ] dirp->dd_len = 512; if (dirp->dd_buf == NULL) { 40018288: 80 a2 20 00 cmp %o0, 0 4001828c: 12 80 00 07 bne 400182a8 40018290: c2 26 20 10 st %g1, [ %i0 + 0x10 ] close (fd); 40018294: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 40018298: 7f ff b5 c2 call 400059a0 <== NOT EXECUTED 4001829c: b0 10 20 00 clr %i0 <== NOT EXECUTED 400182a0: 81 c7 e0 08 ret <== NOT EXECUTED 400182a4: 81 e8 00 00 restore <== NOT EXECUTED return NULL; } dirp->dd_fd = fd; 400182a8: e0 26 00 00 st %l0, [ %i0 ] dirp->dd_loc = 0; 400182ac: c0 26 20 04 clr [ %i0 + 4 ] dirp->dd_seek = 0; 400182b0: c0 26 20 14 clr [ %i0 + 0x14 ] /* * Set up seek point for rewinddir. */ return dirp; } 400182b4: 81 c7 e0 08 ret 400182b8: 81 e8 00 00 restore 400045b4 : /* * Handle output processing */ static void oproc (unsigned char c, struct rtems_termios_tty *tty) { 400045b4: 9d e3 bf 98 save %sp, -104, %sp int i; if (tty->termios.c_oflag & OPOST) { 400045b8: c8 06 60 34 ld [ %i1 + 0x34 ], %g4 400045bc: 80 89 20 01 btst 1, %g4 400045c0: 02 80 00 59 be 40004724 400045c4: f0 2f a0 44 stb %i0, [ %fp + 0x44 ] switch (c) { 400045c8: 82 0e 20 ff and %i0, 0xff, %g1 400045cc: 80 a0 60 09 cmp %g1, 9 400045d0: 22 80 00 2b be,a 4000467c 400045d4: c6 06 60 28 ld [ %i1 + 0x28 ], %g3 400045d8: 18 80 00 07 bgu 400045f4 400045dc: 80 a0 60 0a cmp %g1, 0xa 400045e0: 80 a0 60 08 cmp %g1, 8 <== NOT EXECUTED 400045e4: 12 80 00 3c bne 400046d4 <== NOT EXECUTED 400045e8: 80 89 20 02 btst 2, %g4 <== NOT EXECUTED } tty->column += i; break; case '\b': if (tty->column > 0) 400045ec: 10 80 00 35 b 400046c0 <== NOT EXECUTED 400045f0: c2 06 60 28 ld [ %i1 + 0x28 ], %g1 <== NOT EXECUTED oproc (unsigned char c, struct rtems_termios_tty *tty) { int i; if (tty->termios.c_oflag & OPOST) { switch (c) { 400045f4: 02 80 00 06 be 4000460c 400045f8: 80 a0 60 0d cmp %g1, 0xd 400045fc: 32 80 00 36 bne,a 400046d4 40004600: 80 89 20 02 btst 2, %g4 tty->column = 0; } break; case '\r': if ((tty->termios.c_oflag & ONOCR) && (tty->column == 0)) 40004604: 10 80 00 10 b 40004644 <== NOT EXECUTED 40004608: 80 89 20 10 btst 0x10, %g4 <== NOT EXECUTED int i; if (tty->termios.c_oflag & OPOST) { switch (c) { case '\n': if (tty->termios.c_oflag & ONLRET) 4000460c: 80 89 20 20 btst 0x20, %g4 40004610: 32 80 00 02 bne,a 40004618 40004614: c0 26 60 28 clr [ %i1 + 0x28 ] <== NOT EXECUTED tty->column = 0; if (tty->termios.c_oflag & ONLCR) { 40004618: c2 06 60 34 ld [ %i1 + 0x34 ], %g1 4000461c: 80 88 60 04 btst 4, %g1 40004620: 02 80 00 42 be 40004728 40004624: 94 10 00 19 mov %i1, %o2 rtems_termios_puts ("\r", 1, tty); 40004628: 11 10 00 63 sethi %hi(0x40018c00), %o0 4000462c: 92 10 20 01 mov 1, %o1 40004630: 90 12 22 80 or %o0, 0x280, %o0 40004634: 7f ff ff 94 call 40004484 40004638: 94 10 00 19 mov %i1, %o2 c = '\n'; if (tty->termios.c_oflag & ONLRET) tty->column = 0; break; } tty->column = 0; 4000463c: 10 80 00 3a b 40004724 40004640: c0 26 60 28 clr [ %i1 + 0x28 ] tty->column = 0; } break; case '\r': if ((tty->termios.c_oflag & ONOCR) && (tty->column == 0)) 40004644: 02 80 00 06 be 4000465c <== NOT EXECUTED 40004648: 80 89 20 08 btst 8, %g4 <== NOT EXECUTED 4000464c: c2 06 60 28 ld [ %i1 + 0x28 ], %g1 <== NOT EXECUTED 40004650: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40004654: 02 80 00 17 be 400046b0 <== NOT EXECUTED 40004658: 80 89 20 08 btst 8, %g4 <== NOT EXECUTED return; if (tty->termios.c_oflag & OCRNL) { 4000465c: 22 80 00 32 be,a 40004724 <== NOT EXECUTED 40004660: c0 26 60 28 clr [ %i1 + 0x28 ] <== NOT EXECUTED c = '\n'; 40004664: 82 10 20 0a mov 0xa, %g1 <== NOT EXECUTED if (tty->termios.c_oflag & ONLRET) 40004668: 80 89 20 20 btst 0x20, %g4 <== NOT EXECUTED 4000466c: 02 80 00 2e be 40004724 <== NOT EXECUTED 40004670: c2 2f a0 44 stb %g1, [ %fp + 0x44 ] <== NOT EXECUTED tty->column = 0; break; } tty->column = 0; 40004674: 10 80 00 2c b 40004724 <== NOT EXECUTED 40004678: c0 26 60 28 clr [ %i1 + 0x28 ] <== NOT EXECUTED break; case '\t': i = 8 - (tty->column & 7); if ((tty->termios.c_oflag & TABDLY) == XTABS) { 4000467c: 05 00 00 06 sethi %hi(0x1800), %g2 40004680: 82 09 00 02 and %g4, %g2, %g1 40004684: 80 a0 40 02 cmp %g1, %g2 } tty->column = 0; break; case '\t': i = 8 - (tty->column & 7); 40004688: 84 08 e0 07 and %g3, 7, %g2 4000468c: 82 10 20 08 mov 8, %g1 40004690: 92 20 40 02 sub %g1, %g2, %o1 if ((tty->termios.c_oflag & TABDLY) == XTABS) { 40004694: 12 80 00 09 bne 400046b8 40004698: 84 02 40 03 add %o1, %g3, %g2 tty->column += i; 4000469c: c4 26 60 28 st %g2, [ %i1 + 0x28 ] rtems_termios_puts ( " ", i, tty); 400046a0: 94 10 00 19 mov %i1, %o2 400046a4: 11 10 00 63 sethi %hi(0x40018c00), %o0 400046a8: 7f ff ff 77 call 40004484 400046ac: 90 12 22 88 or %o0, 0x288, %o0 ! 40018e88 400046b0: 81 c7 e0 08 ret 400046b4: 81 e8 00 00 restore return; } tty->column += i; 400046b8: 10 80 00 1b b 40004724 <== NOT EXECUTED 400046bc: c4 26 60 28 st %g2, [ %i1 + 0x28 ] <== NOT EXECUTED break; case '\b': if (tty->column > 0) 400046c0: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400046c4: 04 80 00 18 ble 40004724 <== NOT EXECUTED 400046c8: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED default: if (tty->termios.c_oflag & OLCUC) c = toupper(c); if (!iscntrl(c)) tty->column++; 400046cc: 10 80 00 16 b 40004724 <== NOT EXECUTED 400046d0: c2 26 60 28 st %g1, [ %i1 + 0x28 ] <== NOT EXECUTED if (tty->column > 0) tty->column--; break; default: if (tty->termios.c_oflag & OLCUC) 400046d4: 02 80 00 0b be 40004700 400046d8: c4 0f a0 44 ldub [ %fp + 0x44 ], %g2 c = toupper(c); 400046dc: 03 10 00 68 sethi %hi(0x4001a000), %g1 <== NOT EXECUTED 400046e0: c2 00 63 68 ld [ %g1 + 0x368 ], %g1 ! 4001a368 <__ctype_ptr> <== NOT EXECUTED oproc (unsigned char c, struct rtems_termios_tty *tty) { int i; if (tty->termios.c_oflag & OPOST) { switch (c) { 400046e4: b0 0e 20 ff and %i0, 0xff, %i0 <== NOT EXECUTED tty->column--; break; default: if (tty->termios.c_oflag & OLCUC) c = toupper(c); 400046e8: c2 08 40 18 ldub [ %g1 + %i0 ], %g1 <== NOT EXECUTED 400046ec: 80 88 60 02 btst 2, %g1 <== NOT EXECUTED 400046f0: 32 80 00 02 bne,a 400046f8 <== NOT EXECUTED 400046f4: b0 06 3f e0 add %i0, -32, %i0 <== NOT EXECUTED 400046f8: f0 2f a0 44 stb %i0, [ %fp + 0x44 ] <== NOT EXECUTED if (!iscntrl(c)) 400046fc: c4 0f a0 44 ldub [ %fp + 0x44 ], %g2 <== NOT EXECUTED 40004700: 03 10 00 68 sethi %hi(0x4001a000), %g1 40004704: c2 00 63 68 ld [ %g1 + 0x368 ], %g1 ! 4001a368 <__ctype_ptr> 40004708: c2 08 40 02 ldub [ %g1 + %g2 ], %g1 4000470c: 80 88 60 20 btst 0x20, %g1 40004710: 12 80 00 06 bne 40004728 40004714: 94 10 00 19 mov %i1, %o2 tty->column++; 40004718: c2 06 60 28 ld [ %i1 + 0x28 ], %g1 4000471c: 82 00 60 01 inc %g1 40004720: c2 26 60 28 st %g1, [ %i1 + 0x28 ] break; } } rtems_termios_puts (&c, 1, tty); 40004724: 94 10 00 19 mov %i1, %o2 40004728: 90 07 a0 44 add %fp, 0x44, %o0 4000472c: 7f ff ff 56 call 40004484 40004730: 92 10 20 01 mov 1, %o1 40004734: 81 c7 e0 08 ret 40004738: 81 e8 00 00 restore 400065f8 : */ int pthread_barrier_destroy( pthread_barrier_t *barrier ) { 400065f8: 9d e3 bf 90 save %sp, -112, %sp POSIX_Barrier_Control *the_barrier = NULL; Objects_Locations location; if ( !barrier ) 400065fc: 80 a6 20 00 cmp %i0, 0 40006600: 02 80 00 2c be 400066b0 40006604: 94 07 bf f4 add %fp, -12, %o2 RTEMS_INLINE_ROUTINE POSIX_Barrier_Control *_POSIX_Barrier_Get ( pthread_barrier_t *barrier, Objects_Locations *location ) { return (POSIX_Barrier_Control *) _Objects_Get( 40006608: d2 06 00 00 ld [ %i0 ], %o1 4000660c: 31 10 00 72 sethi %hi(0x4001c800), %i0 40006610: 40 00 0c b4 call 400098e0 <_Objects_Get> 40006614: 90 16 21 c0 or %i0, 0x1c0, %o0 ! 4001c9c0 <_POSIX_Barrier_Information> return EINVAL; the_barrier = _POSIX_Barrier_Get( barrier, &location ); switch ( location ) { 40006618: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000661c: 80 a0 60 00 cmp %g1, 0 40006620: 02 80 00 07 be 4000663c 40006624: 88 10 00 08 mov %o0, %g4 40006628: 80 a0 60 02 cmp %g1, 2 4000662c: 18 80 00 1d bgu 400066a0 40006630: 90 10 20 16 mov 0x16, %o0 _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); } 40006634: 81 c7 e0 08 ret 40006638: 91 e8 00 08 restore %g0, %o0, %o0 case OBJECTS_REMOTE: case OBJECTS_ERROR: return EINVAL; case OBJECTS_LOCAL: if ( the_barrier->Barrier.number_of_waiting_threads != 0 ) { 4000663c: c2 02 20 58 ld [ %o0 + 0x58 ], %g1 40006640: 80 a0 60 00 cmp %g1, 0 40006644: 22 80 00 06 be,a 4000665c 40006648: 90 16 21 c0 or %i0, 0x1c0, %o0 _Thread_Enable_dispatch(); 4000664c: 7f ff ff de call 400065c4 <_Thread_Enable_dispatch> 40006650: 01 00 00 00 nop 40006654: 10 80 00 18 b 400066b4 40006658: 90 10 20 10 mov 0x10, %o0 ! 10 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); 4000665c: c2 01 20 08 ld [ %g4 + 8 ], %g1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40006660: c6 12 20 10 lduh [ %o0 + 0x10 ], %g3 40006664: 05 00 00 3f sethi %hi(0xfc00), %g2 40006668: 84 10 a3 ff or %g2, 0x3ff, %g2 ! ffff 4000666c: 82 08 40 02 and %g1, %g2, %g1 40006670: 80 a0 40 03 cmp %g1, %g3 40006674: 18 80 00 05 bgu 40006688 40006678: 92 10 00 04 mov %g4, %o1 information->local_table[ index ] = the_object; 4000667c: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 40006680: 83 28 60 02 sll %g1, 2, %g1 40006684: c0 20 80 01 clr [ %g2 + %g1 ] */ RTEMS_INLINE_ROUTINE void _POSIX_Barrier_Free ( POSIX_Barrier_Control *the_barrier ) { _Objects_Free( &_POSIX_Barrier_Information, &the_barrier->Object ); 40006688: 40 00 0c 54 call 400097d8 <_Objects_Free> 4000668c: c0 21 20 0c clr [ %g4 + 0xc ] _Objects_Close( &_POSIX_Barrier_Information, &the_barrier->Object ); _POSIX_Barrier_Free( the_barrier ); _Thread_Enable_dispatch(); 40006690: 7f ff ff cd call 400065c4 <_Thread_Enable_dispatch> 40006694: 01 00 00 00 nop 40006698: 10 80 00 07 b 400066b4 4000669c: 90 10 20 00 clr %o0 ! 0 return 0; } return POSIX_BOTTOM_REACHED(); 400066a0: 40 00 01 fc call 40006e90 <== NOT EXECUTED 400066a4: 01 00 00 00 nop <== NOT EXECUTED } 400066a8: 81 c7 e0 08 ret <== NOT EXECUTED 400066ac: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); 400066b0: 90 10 20 16 mov 0x16, %o0 } 400066b4: b0 10 00 08 mov %o0, %i0 400066b8: 81 c7 e0 08 ret 400066bc: 81 e8 00 00 restore 400066f4 : int pthread_barrier_init( pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count ) { 400066f4: 9d e3 bf 88 save %sp, -120, %sp const pthread_barrierattr_t *the_attr; /* * Error check parameters */ if ( !barrier ) 400066f8: 80 a6 20 00 cmp %i0, 0 400066fc: 02 80 00 36 be 400067d4 40006700: a0 10 00 19 mov %i1, %l0 return EINVAL; if ( count == 0 ) 40006704: 80 a6 a0 00 cmp %i2, 0 40006708: 02 80 00 33 be 400067d4 4000670c: 80 a6 60 00 cmp %i1, 0 return EINVAL; /* * If the user passed in NULL, use the default attributes */ if ( attr ) { 40006710: 32 80 00 06 bne,a 40006728 40006714: c2 04 00 00 ld [ %l0 ], %g1 the_attr = attr; } else { (void) pthread_barrierattr_init( &my_attr ); 40006718: a0 07 bf e8 add %fp, -24, %l0 4000671c: 7f ff ff 93 call 40006568 40006720: 90 10 00 10 mov %l0, %o0 } /* * Now start error checking the attributes that we are going to use */ if ( !the_attr->is_initialized ) 40006724: c2 04 00 00 ld [ %l0 ], %g1 40006728: 80 a0 60 00 cmp %g1, 0 4000672c: 02 80 00 2a be 400067d4 40006730: 01 00 00 00 nop return EINVAL; switch ( the_attr->process_shared ) { 40006734: c2 04 20 04 ld [ %l0 + 4 ], %g1 40006738: 80 a0 60 00 cmp %g1, 0 4000673c: 12 80 00 26 bne 400067d4 40006740: 05 10 00 71 sethi %hi(0x4001c400), %g2 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40006744: c2 00 a1 10 ld [ %g2 + 0x110 ], %g1 ! 4001c510 <_Thread_Dispatch_disable_level> /* * Convert from POSIX attributes to Core Barrier attributes */ the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE; the_attributes.maximum_count = count; 40006748: f4 27 bf f4 st %i2, [ %fp + -12 ] 4000674c: 82 00 60 01 inc %g1 } /* * Convert from POSIX attributes to Core Barrier attributes */ the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE; 40006750: c0 27 bf f0 clr [ %fp + -16 ] 40006754: c2 20 a1 10 st %g1, [ %g2 + 0x110 ] * This function allocates a barrier control block from * the inactive chain of free barrier control blocks. */ RTEMS_INLINE_ROUTINE POSIX_Barrier_Control *_POSIX_Barrier_Allocate( void ) { return (POSIX_Barrier_Control *) 40006758: 35 10 00 72 sethi %hi(0x4001c800), %i2 4000675c: 40 00 0b 1d call 400093d0 <_Objects_Allocate> 40006760: 90 16 a1 c0 or %i2, 0x1c0, %o0 ! 4001c9c0 <_POSIX_Barrier_Information> */ _Thread_Disable_dispatch(); /* prevents deletion */ the_barrier = _POSIX_Barrier_Allocate(); if ( !the_barrier ) { 40006764: a0 92 20 00 orcc %o0, 0, %l0 40006768: 12 80 00 06 bne 40006780 4000676c: 90 04 20 10 add %l0, 0x10, %o0 _Thread_Enable_dispatch(); 40006770: 7f ff ff d4 call 400066c0 <_Thread_Enable_dispatch> 40006774: b0 10 20 0b mov 0xb, %i0 40006778: 81 c7 e0 08 ret 4000677c: 81 e8 00 00 restore return EAGAIN; } _CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes ); 40006780: 40 00 08 6b call 4000892c <_CORE_barrier_Initialize> 40006784: 92 07 bf f0 add %fp, -16, %o1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40006788: 90 16 a1 c0 or %i2, 0x1c0, %o0 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, the_object ); 4000678c: c2 04 20 08 ld [ %l0 + 8 ], %g1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40006790: c6 12 20 10 lduh [ %o0 + 0x10 ], %g3 40006794: 05 00 00 3f sethi %hi(0xfc00), %g2 40006798: 84 10 a3 ff or %g2, 0x3ff, %g2 ! ffff 4000679c: 82 08 40 02 and %g1, %g2, %g1 400067a0: 80 a0 40 03 cmp %g1, %g3 400067a4: 38 80 00 06 bgu,a 400067bc 400067a8: c2 04 20 08 ld [ %l0 + 8 ], %g1 <== NOT EXECUTED information->local_table[ index ] = the_object; 400067ac: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 400067b0: 83 28 60 02 sll %g1, 2, %g1 400067b4: e0 20 80 01 st %l0, [ %g2 + %g1 ] ); /* * Exit the critical section and return the user an operational barrier */ *barrier = the_barrier->Object.id; 400067b8: c2 04 20 08 ld [ %l0 + 8 ], %g1 if ( information->is_string ) /* _Objects_Copy_name_string( name, the_object->name ); */ the_object->name = name; else /* _Objects_Copy_name_raw( name, the_object->name, information->name_length ); */ the_object->name = name; 400067bc: c0 24 20 0c clr [ %l0 + 0xc ] 400067c0: c2 26 00 00 st %g1, [ %i0 ] _Thread_Enable_dispatch(); 400067c4: 7f ff ff bf call 400066c0 <_Thread_Enable_dispatch> 400067c8: b0 10 20 00 clr %i0 400067cc: 81 c7 e0 08 ret 400067d0: 81 e8 00 00 restore return 0; } 400067d4: 81 c7 e0 08 ret 400067d8: 91 e8 20 16 restore %g0, 0x16, %o0 400067dc : */ int pthread_barrier_wait( pthread_barrier_t *barrier ) { 400067dc: 9d e3 bf 90 save %sp, -112, %sp POSIX_Barrier_Control *the_barrier = NULL; Objects_Locations location; if ( !barrier ) 400067e0: 80 a6 20 00 cmp %i0, 0 400067e4: 02 80 00 28 be 40006884 400067e8: 11 10 00 72 sethi %hi(0x4001c800), %o0 RTEMS_INLINE_ROUTINE POSIX_Barrier_Control *_POSIX_Barrier_Get ( pthread_barrier_t *barrier, Objects_Locations *location ) { return (POSIX_Barrier_Control *) _Objects_Get( 400067ec: d2 06 00 00 ld [ %i0 ], %o1 400067f0: 94 07 bf f4 add %fp, -12, %o2 400067f4: 40 00 0c 3b call 400098e0 <_Objects_Get> 400067f8: 90 12 21 c0 or %o0, 0x1c0, %o0 return EINVAL; the_barrier = _POSIX_Barrier_Get( barrier, &location ); switch ( location ) { 400067fc: c2 07 bf f4 ld [ %fp + -12 ], %g1 40006800: 80 a0 60 00 cmp %g1, 0 40006804: 22 80 00 07 be,a 40006820 40006808: d2 02 20 08 ld [ %o0 + 8 ], %o1 4000680c: 80 a0 60 02 cmp %g1, 2 40006810: 18 80 00 19 bgu 40006874 40006814: 90 10 20 16 mov 0x16, %o0 return _POSIX_Barrier_Translate_core_barrier_return_code( _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); } 40006818: 81 c7 e0 08 ret 4000681c: 91 e8 00 08 restore %g0, %o0, %o0 case OBJECTS_REMOTE: case OBJECTS_ERROR: return EINVAL; case OBJECTS_LOCAL: _CORE_barrier_Wait( 40006820: 94 10 20 01 mov 1, %o2 40006824: 90 02 20 10 add %o0, 0x10, %o0 40006828: 96 10 20 00 clr %o3 4000682c: 40 00 08 4c call 4000895c <_CORE_barrier_Wait> 40006830: 98 10 20 00 clr %o4 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40006834: 03 10 00 71 sethi %hi(0x4001c400), %g1 40006838: c4 00 61 10 ld [ %g1 + 0x110 ], %g2 ! 4001c510 <_Thread_Dispatch_disable_level> 4000683c: 84 00 bf ff add %g2, -1, %g2 40006840: c4 20 61 10 st %g2, [ %g1 + 0x110 ] 40006844: c2 00 61 10 ld [ %g1 + 0x110 ], %g1 40006848: 80 a0 60 00 cmp %g1, 0 4000684c: 12 80 00 05 bne 40006860 40006850: 03 10 00 71 sethi %hi(0x4001c400), %g1 _Thread_Dispatch(); 40006854: 40 00 10 d8 call 4000abb4 <_Thread_Dispatch> 40006858: 01 00 00 00 nop TRUE, 0, NULL ); _Thread_Enable_dispatch(); return _POSIX_Barrier_Translate_core_barrier_return_code( 4000685c: 03 10 00 71 sethi %hi(0x4001c400), %g1 40006860: c2 00 61 ec ld [ %g1 + 0x1ec ], %g1 ! 4001c5ec <_Thread_Executing> 40006864: 40 00 1e 5e call 4000e1dc <_POSIX_Barrier_Translate_core_barrier_return_code> 40006868: d0 00 60 34 ld [ %g1 + 0x34 ], %o0 _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); } 4000686c: 81 c7 e0 08 ret 40006870: 91 e8 00 08 restore %g0, %o0, %o0 _Thread_Enable_dispatch(); return _POSIX_Barrier_Translate_core_barrier_return_code( _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); 40006874: 40 00 01 87 call 40006e90 <== NOT EXECUTED 40006878: 01 00 00 00 nop <== NOT EXECUTED } 4000687c: 81 c7 e0 08 ret <== NOT EXECUTED 40006880: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED _Thread_Enable_dispatch(); return _POSIX_Barrier_Translate_core_barrier_return_code( _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); 40006884: 90 10 20 16 mov 0x16, %o0 } 40006888: b0 10 00 08 mov %o0, %i0 4000688c: 81 c7 e0 08 ret 40006890: 81 e8 00 00 restore 40005d74 : */ int pthread_cancel( pthread_t thread ) { 40005d74: 9d e3 bf 90 save %sp, -112, %sp /* * Don't even think about deleting a resource from an ISR. */ if ( _ISR_Is_in_progress() ) 40005d78: 03 10 00 5f sethi %hi(0x40017c00), %g1 40005d7c: c2 00 62 94 ld [ %g1 + 0x294 ], %g1 ! 40017e94 <_ISR_Nest_level> */ int pthread_cancel( pthread_t thread ) { 40005d80: 92 10 00 18 mov %i0, %o1 /* * Don't even think about deleting a resource from an ISR. */ if ( _ISR_Is_in_progress() ) 40005d84: 80 a0 60 00 cmp %g1, 0 40005d88: 12 80 00 2e bne 40005e40 40005d8c: 90 10 20 47 mov 0x47, %o0 RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Get ( pthread_t id, Objects_Locations *location ) { return (Thread_Control *) 40005d90: 11 10 00 60 sethi %hi(0x40018000), %o0 40005d94: 94 07 bf f4 add %fp, -12, %o2 40005d98: 40 00 0d 01 call 4000919c <_Objects_Get> 40005d9c: 90 12 20 b8 or %o0, 0xb8, %o0 return EPROTO; the_thread = _POSIX_Threads_Get( thread, &location ); switch ( location ) { 40005da0: c2 07 bf f4 ld [ %fp + -12 ], %g1 40005da4: 80 a0 60 01 cmp %g1, 1 40005da8: 02 80 00 08 be 40005dc8 40005dac: 01 00 00 00 nop 40005db0: 2a 80 00 0a bcs,a 40005dd8 40005db4: c6 02 21 70 ld [ %o0 + 0x170 ], %g3 40005db8: 80 a0 60 02 cmp %g1, 2 <== NOT EXECUTED 40005dbc: 02 80 00 21 be 40005e40 <== NOT EXECUTED 40005dc0: 90 10 20 16 mov 0x16, %o0 <== NOT EXECUTED 40005dc4: 30 80 00 1d b,a 40005e38 <== NOT EXECUTED case OBJECTS_ERROR: return EINVAL; case OBJECTS_REMOTE: return POSIX_MP_NOT_IMPLEMENTED(); 40005dc8: 40 00 02 9b call 40006834 <== NOT EXECUTED 40005dcc: 01 00 00 00 nop <== NOT EXECUTED _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); } 40005dd0: 81 c7 e0 08 ret <== NOT EXECUTED 40005dd4: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED case OBJECTS_REMOTE: return POSIX_MP_NOT_IMPLEMENTED(); case OBJECTS_LOCAL: thread_support = the_thread->API_Extensions[ THREAD_API_POSIX ]; thread_support->cancelation_requested = 1; 40005dd8: 82 10 20 01 mov 1, %g1 if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE && 40005ddc: c4 00 e0 cc ld [ %g3 + 0xcc ], %g2 40005de0: 80 a0 a0 00 cmp %g2, 0 40005de4: 12 80 00 08 bne 40005e04 40005de8: c2 20 e0 d4 st %g1, [ %g3 + 0xd4 ] 40005dec: c2 00 e0 d0 ld [ %g3 + 0xd0 ], %g1 40005df0: 80 a0 60 01 cmp %g1, 1 40005df4: 12 80 00 04 bne 40005e04 40005df8: 01 00 00 00 nop thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS ) { _POSIX_Threads_cancel_run( the_thread ); 40005dfc: 40 00 00 14 call 40005e4c <_POSIX_Threads_cancel_run> 40005e00: 01 00 00 00 nop #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40005e04: 03 10 00 5f sethi %hi(0x40017c00), %g1 40005e08: c4 00 61 d0 ld [ %g1 + 0x1d0 ], %g2 ! 40017dd0 <_Thread_Dispatch_disable_level> 40005e0c: 90 10 20 00 clr %o0 40005e10: 84 00 bf ff add %g2, -1, %g2 40005e14: c4 20 61 d0 st %g2, [ %g1 + 0x1d0 ] 40005e18: c2 00 61 d0 ld [ %g1 + 0x1d0 ], %g1 40005e1c: 80 a0 60 00 cmp %g1, 0 40005e20: 32 80 00 09 bne,a 40005e44 40005e24: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED _Thread_Dispatch(); 40005e28: 40 00 11 92 call 4000a470 <_Thread_Dispatch> 40005e2c: 01 00 00 00 nop 40005e30: 10 80 00 04 b 40005e40 40005e34: 90 10 20 00 clr %o0 ! 0 _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); 40005e38: 40 00 02 75 call 4000680c <== NOT EXECUTED 40005e3c: 01 00 00 00 nop <== NOT EXECUTED } 40005e40: b0 10 00 08 mov %o0, %i0 40005e44: 81 c7 e0 08 ret 40005e48: 81 e8 00 00 restore 40006fe8 : */ int pthread_cond_destroy( pthread_cond_t *cond ) { 40006fe8: 9d e3 bf 90 save %sp, -112, %sp ) { Objects_Id *id = (Objects_Id *)cond; int status; if ( !id ) { 40006fec: 80 a6 20 00 cmp %i0, 0 40006ff0: 32 80 00 05 bne,a 40007004 40006ff4: c2 06 00 00 ld [ %i0 ], %g1 *location = OBJECTS_ERROR; 40006ff8: 82 10 20 02 mov 2, %g1 40006ffc: 10 80 00 14 b 4000704c 40007000: c2 27 bf f4 st %g1, [ %fp + -12 ] return (POSIX_Condition_variables_Control *) 0; } if ( *id == PTHREAD_COND_INITIALIZER ) { 40007004: 80 a0 7f ff cmp %g1, -1 40007008: 32 80 00 0c bne,a 40007038 4000700c: d2 06 00 00 ld [ %i0 ], %o1 /* * Do an "auto-create" here. */ status = pthread_cond_init( (pthread_cond_t *)id, 0 ); 40007010: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40007014: 40 00 00 41 call 40007118 <== NOT EXECUTED 40007018: 92 10 20 00 clr %o1 <== NOT EXECUTED if ( status ) { 4000701c: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40007020: 22 80 00 06 be,a 40007038 <== NOT EXECUTED 40007024: d2 06 00 00 ld [ %i0 ], %o1 <== NOT EXECUTED *location = OBJECTS_ERROR; 40007028: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED 4000702c: b0 10 20 00 clr %i0 <== NOT EXECUTED 40007030: 10 80 00 07 b 4000704c <== NOT EXECUTED 40007034: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED /* * Now call Objects_Get() */ return (POSIX_Condition_variables_Control *) 40007038: 11 10 00 66 sethi %hi(0x40019800), %o0 4000703c: 94 07 bf f4 add %fp, -12, %o2 40007040: 40 00 0f 40 call 4000ad40 <_Objects_Get> 40007044: 90 12 20 2c or %o0, 0x2c, %o0 40007048: b0 10 00 08 mov %o0, %i0 POSIX_Condition_variables_Control *the_cond; Objects_Locations location; the_cond = _POSIX_Condition_variables_Get( cond, &location ); switch ( location ) { 4000704c: c2 07 bf f4 ld [ %fp + -12 ], %g1 40007050: 80 a0 60 00 cmp %g1, 0 40007054: 02 80 00 05 be 40007068 40007058: 80 a0 60 02 cmp %g1, 2 4000705c: 08 80 00 20 bleu 400070dc 40007060: 90 10 20 16 mov 0x16, %o0 40007064: 30 80 00 1c b,a 400070d4 <== NOT EXECUTED return EINVAL; case OBJECTS_LOCAL: if ( _Thread_queue_First( &the_cond->Wait_queue ) ) { 40007068: 40 00 16 32 call 4000c930 <_Thread_queue_First> 4000706c: 90 06 20 18 add %i0, 0x18, %o0 40007070: 80 a2 20 00 cmp %o0, 0 40007074: 02 80 00 06 be 4000708c 40007078: 03 10 00 66 sethi %hi(0x40019800), %g1 _Thread_Enable_dispatch(); 4000707c: 7f ff ff ce call 40006fb4 <_Thread_Enable_dispatch> 40007080: 01 00 00 00 nop 40007084: 10 80 00 16 b 400070dc 40007088: 90 10 20 10 mov 0x10, %o0 ! 10 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); 4000708c: c6 06 20 08 ld [ %i0 + 8 ], %g3 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40007090: 90 10 60 2c or %g1, 0x2c, %o0 40007094: c4 12 20 10 lduh [ %o0 + 0x10 ], %g2 40007098: 03 00 00 3f sethi %hi(0xfc00), %g1 4000709c: 82 10 63 ff or %g1, 0x3ff, %g1 ! ffff 400070a0: 82 08 c0 01 and %g3, %g1, %g1 400070a4: 80 a0 40 02 cmp %g1, %g2 400070a8: 18 80 00 05 bgu 400070bc 400070ac: 92 10 00 18 mov %i0, %o1 information->local_table[ index ] = the_object; 400070b0: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 400070b4: 83 28 60 02 sll %g1, 2, %g1 400070b8: c0 20 80 01 clr [ %g2 + %g1 ] RTEMS_INLINE_ROUTINE void _POSIX_Condition_variables_Free ( POSIX_Condition_variables_Control *the_condition_variable ) { _Objects_Free( 400070bc: 40 00 0e df call 4000ac38 <_Objects_Free> 400070c0: c0 26 20 0c clr [ %i0 + 0xc ] 0, /* Not used */ 0 /* Not used */ ); } #endif _Thread_Enable_dispatch(); 400070c4: 7f ff ff bc call 40006fb4 <_Thread_Enable_dispatch> 400070c8: 01 00 00 00 nop 400070cc: 10 80 00 04 b 400070dc 400070d0: 90 10 20 00 clr %o0 ! 0 return 0; } return POSIX_BOTTOM_REACHED(); 400070d4: 40 00 04 cb call 40008400 <== NOT EXECUTED 400070d8: 01 00 00 00 nop <== NOT EXECUTED } 400070dc: 81 c7 e0 08 ret 400070e0: 91 e8 00 08 restore %g0, %o0, %o0 40007118 : int pthread_cond_init( pthread_cond_t *cond, const pthread_condattr_t *attr ) { 40007118: 9d e3 bf 98 save %sp, -104, %sp POSIX_Condition_variables_Control *the_cond; const pthread_condattr_t *the_attr; if ( attr ) the_attr = attr; 4000711c: 03 10 00 5c sethi %hi(0x40017000), %g1 int pthread_cond_init( pthread_cond_t *cond, const pthread_condattr_t *attr ) { 40007120: a4 10 00 18 mov %i0, %l2 POSIX_Condition_variables_Control *the_cond; const pthread_condattr_t *the_attr; if ( attr ) the_attr = attr; 40007124: 80 a6 60 00 cmp %i1, 0 40007128: 02 80 00 03 be 40007134 4000712c: a0 10 63 f4 or %g1, 0x3f4, %l0 40007130: a0 10 00 19 mov %i1, %l0 /* * XXX: Be careful about attributes when global!!! */ if ( the_attr->process_shared == PTHREAD_PROCESS_SHARED ) 40007134: c2 04 20 04 ld [ %l0 + 4 ], %g1 40007138: 80 a0 60 01 cmp %g1, 1 4000713c: 32 80 00 04 bne,a 4000714c 40007140: c2 04 00 00 ld [ %l0 ], %g1 return POSIX_MP_NOT_IMPLEMENTED(); 40007144: 40 00 04 b9 call 40008428 <== NOT EXECUTED 40007148: 81 e8 00 00 restore <== NOT EXECUTED if ( !the_attr->is_initialized ) 4000714c: 80 a0 60 00 cmp %g1, 0 40007150: 02 80 00 0e be 40007188 40007154: b0 10 20 16 mov 0x16, %i0 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40007158: 05 10 00 64 sethi %hi(0x40019000), %g2 4000715c: c2 00 a2 e0 ld [ %g2 + 0x2e0 ], %g1 ! 400192e0 <_Thread_Dispatch_disable_level> 40007160: 82 00 60 01 inc %g1 40007164: c2 20 a2 e0 st %g1, [ %g2 + 0x2e0 ] */ RTEMS_INLINE_ROUTINE POSIX_Condition_variables_Control *_POSIX_Condition_variables_Allocate( void ) { return (POSIX_Condition_variables_Control *) 40007168: 23 10 00 66 sethi %hi(0x40019800), %l1 4000716c: 40 00 0d b1 call 4000a830 <_Objects_Allocate> 40007170: 90 14 60 2c or %l1, 0x2c, %o0 ! 4001982c <_POSIX_Condition_variables_Information> _Thread_Disable_dispatch(); the_cond = _POSIX_Condition_variables_Allocate(); if ( !the_cond ) { 40007174: b2 92 20 00 orcc %o0, 0, %i1 40007178: 32 80 00 06 bne,a 40007190 4000717c: c2 04 20 04 ld [ %l0 + 4 ], %g1 _Thread_Enable_dispatch(); 40007180: 7f ff ff d9 call 400070e4 <_Thread_Enable_dispatch> 40007184: b0 10 20 0c mov 0xc, %i0 40007188: 81 c7 e0 08 ret 4000718c: 81 e8 00 00 restore the_cond->process_shared = the_attr->process_shared; the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX; /* XXX some more initialization might need to go here */ _Thread_queue_Initialize( 40007190: 90 06 60 18 add %i1, 0x18, %o0 _Thread_Enable_dispatch(); return EAGAIN; } #endif the_cond->process_shared = the_attr->process_shared; 40007194: c2 26 60 10 st %g1, [ %i1 + 0x10 ] the_cond->Mutex = POSIX_CONDITION_VARIABLES_NO_MUTEX; 40007198: c0 26 60 14 clr [ %i1 + 0x14 ] /* XXX some more initialization might need to go here */ _Thread_queue_Initialize( 4000719c: 92 10 20 00 clr %o1 400071a0: 94 10 28 00 mov 0x800, %o2 400071a4: 40 00 16 0d call 4000c9d8 <_Thread_queue_Initialize> 400071a8: 96 10 20 74 mov 0x74, %o3 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 400071ac: 90 14 60 2c or %l1, 0x2c, %o0 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, the_object ); 400071b0: c4 06 60 08 ld [ %i1 + 8 ], %g2 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 400071b4: c6 12 20 10 lduh [ %o0 + 0x10 ], %g3 400071b8: 03 00 00 3f sethi %hi(0xfc00), %g1 400071bc: 82 10 63 ff or %g1, 0x3ff, %g1 ! ffff 400071c0: 82 08 80 01 and %g2, %g1, %g1 400071c4: 80 a0 40 03 cmp %g1, %g3 400071c8: 38 80 00 06 bgu,a 400071e0 400071cc: c2 06 60 08 ld [ %i1 + 8 ], %g1 <== NOT EXECUTED information->local_table[ index ] = the_object; 400071d0: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 400071d4: 83 28 60 02 sll %g1, 2, %g1 400071d8: f2 20 80 01 st %i1, [ %g2 + %g1 ] &_POSIX_Condition_variables_Information, &the_cond->Object, 0 ); *cond = the_cond->Object.id; 400071dc: c2 06 60 08 ld [ %i1 + 8 ], %g1 if ( information->is_string ) /* _Objects_Copy_name_string( name, the_object->name ); */ the_object->name = name; else /* _Objects_Copy_name_raw( name, the_object->name, information->name_length ); */ the_object->name = name; 400071e0: c0 26 60 0c clr [ %i1 + 0xc ] 400071e4: c2 24 80 00 st %g1, [ %l2 ] 0, /* Name not used */ 0 /* Not used */ ); #endif _Thread_Enable_dispatch(); 400071e8: 7f ff ff bf call 400070e4 <_Thread_Enable_dispatch> 400071ec: b0 10 20 00 clr %i0 return 0; } 400071f0: 81 c7 e0 08 ret 400071f4: 81 e8 00 00 restore 40006f2c : pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)( void * ), void *arg ) { 40006f2c: 9d e3 bf 68 save %sp, -152, %sp Thread_Control *the_thread; POSIX_API_Control *api; int schedpolicy = SCHED_RR; struct sched_param schedparam; the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes; 40006f30: 03 10 00 72 sethi %hi(0x4001c800), %g1 pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)( void * ), void *arg ) { 40006f34: ac 10 00 18 mov %i0, %l6 Thread_Control *the_thread; POSIX_API_Control *api; int schedpolicy = SCHED_RR; struct sched_param schedparam; the_attr = (attr) ? attr : &_POSIX_Threads_Default_attributes; 40006f38: 80 a6 60 00 cmp %i1, 0 40006f3c: 02 80 00 03 be 40006f48 40006f40: a2 10 63 00 or %g1, 0x300, %l1 40006f44: a2 10 00 19 mov %i1, %l1 if ( !the_attr->is_initialized ) 40006f48: c2 04 40 00 ld [ %l1 ], %g1 40006f4c: 80 a0 60 00 cmp %g1, 0 40006f50: 02 80 00 65 be 400070e4 40006f54: b0 10 20 16 mov 0x16, %i0 /* * Core Thread Initialize insures we get the minimum amount of * stack space if it is allowed to allocate it itself. */ if ( the_attr->stackaddr && !_Stack_Is_enough( the_attr->stacksize ) ) 40006f58: c2 04 60 04 ld [ %l1 + 4 ], %g1 40006f5c: 80 a0 60 00 cmp %g1, 0 40006f60: 22 80 00 07 be,a 40006f7c 40006f64: c2 04 60 10 ld [ %l1 + 0x10 ], %g1 40006f68: c2 04 60 08 ld [ %l1 + 8 ], %g1 40006f6c: 80 a0 6f ff cmp %g1, 0xfff 40006f70: 08 80 00 8b bleu 4000719c 40006f74: 01 00 00 00 nop * 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 ) { 40006f78: c2 04 60 10 ld [ %l1 + 0x10 ], %g1 <== NOT EXECUTED 40006f7c: 80 a0 60 01 cmp %g1, 1 40006f80: 02 80 00 06 be 40006f98 40006f84: 80 a0 60 02 cmp %g1, 2 40006f88: 12 80 00 57 bne 400070e4 40006f8c: b0 10 20 16 mov 0x16, %i0 schedpolicy = api->schedpolicy; schedparam = api->schedparam; break; case PTHREAD_EXPLICIT_SCHED: schedpolicy = the_attr->schedpolicy; 40006f90: 10 80 00 0a b 40006fb8 40006f94: e4 04 60 14 ld [ %l1 + 0x14 ], %l2 * attributes structure. */ switch ( the_attr->inheritsched ) { case PTHREAD_INHERIT_SCHED: api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; 40006f98: 03 10 00 7a sethi %hi(0x4001e800), %g1 40006f9c: c2 00 63 cc ld [ %g1 + 0x3cc ], %g1 ! 4001ebcc <_Thread_Executing> schedpolicy = api->schedpolicy; schedparam = api->schedparam; 40006fa0: 90 07 bf e0 add %fp, -32, %o0 * attributes structure. */ switch ( the_attr->inheritsched ) { case PTHREAD_INHERIT_SCHED: api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; 40006fa4: d2 00 61 70 ld [ %g1 + 0x170 ], %o1 schedpolicy = api->schedpolicy; schedparam = api->schedparam; 40006fa8: 94 10 20 18 mov 0x18, %o2 */ switch ( the_attr->inheritsched ) { case PTHREAD_INHERIT_SCHED: api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; schedpolicy = api->schedpolicy; 40006fac: e4 02 60 7c ld [ %o1 + 0x7c ], %l2 schedparam = api->schedparam; 40006fb0: 10 80 00 05 b 40006fc4 40006fb4: 92 02 60 80 add %o1, 0x80, %o1 break; case PTHREAD_EXPLICIT_SCHED: schedpolicy = the_attr->schedpolicy; schedparam = the_attr->schedparam; 40006fb8: 90 07 bf e0 add %fp, -32, %o0 40006fbc: 92 04 60 18 add %l1, 0x18, %o1 40006fc0: 94 10 20 18 mov 0x18, %o2 40006fc4: 40 00 28 62 call 4001114c 40006fc8: b0 10 20 86 mov 0x86, %i0 /* * Check the contentionscope since rtems only supports PROCESS wide * contention (i.e. no system wide contention). */ if ( the_attr->contentionscope != PTHREAD_SCOPE_PROCESS ) 40006fcc: c2 04 60 0c ld [ %l1 + 0xc ], %g1 40006fd0: 80 a0 60 00 cmp %g1, 0 40006fd4: 12 80 00 44 bne 400070e4 40006fd8: ea 07 bf e0 ld [ %fp + -32 ], %l5 /* * Interpret the scheduling parameters. */ if ( !_POSIX_Priority_Is_valid( schedparam.sched_priority ) ) 40006fdc: 82 05 7f ff add %l5, -1, %g1 40006fe0: 80 a0 60 fd cmp %g1, 0xfd 40006fe4: 18 80 00 6d bgu 40007198 40006fe8: 80 a4 a0 01 cmp %l2, 1 */ budget_callout = NULL; budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; switch ( schedpolicy ) { 40006fec: 02 80 00 10 be 4000702c 40006ff0: a0 10 20 00 clr %l0 40006ff4: 14 80 00 08 bg 40007014 40006ff8: 80 a4 a0 02 cmp %l2, 2 40006ffc: 80 a4 a0 00 cmp %l2, 0 40007000: a0 10 20 01 mov 1, %l0 40007004: 02 80 00 1a be 4000706c 40007008: a8 10 20 00 clr %l4 *thread = the_thread->Object.id; _Thread_Enable_dispatch(); return 0; 4000700c: 81 c7 e0 08 ret 40007010: 91 e8 20 16 restore %g0, 0x16, %o0 */ budget_callout = NULL; budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; switch ( schedpolicy ) { 40007014: 02 80 00 05 be 40007028 40007018: 80 a4 a0 03 cmp %l2, 3 4000701c: 12 80 00 32 bne 400070e4 40007020: b0 10 20 16 mov 0x16, %i0 40007024: 30 80 00 04 b,a 40007034 40007028: a0 10 20 02 mov 2, %l0 <== NOT EXECUTED 4000702c: 10 80 00 10 b 4000706c 40007030: a8 10 20 00 clr %l4 case SCHED_SPORADIC: budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT; budget_callout = _POSIX_Threads_Sporadic_budget_callout; if ( _Timespec_To_ticks( &schedparam.ss_replenish_period ) < 40007034: 40 00 16 1c call 4000c8a4 <_Timespec_To_ticks> 40007038: 90 07 bf e8 add %fp, -24, %o0 4000703c: a0 10 00 08 mov %o0, %l0 40007040: 40 00 16 19 call 4000c8a4 <_Timespec_To_ticks> 40007044: 90 07 bf f0 add %fp, -16, %o0 40007048: 80 a4 00 08 cmp %l0, %o0 4000704c: 0a 80 00 53 bcs 40007198 40007050: c2 07 bf e4 ld [ %fp + -28 ], %g1 _Timespec_To_ticks( &schedparam.ss_initial_budget ) ) return EINVAL; if ( !_POSIX_Priority_Is_valid( schedparam.ss_low_priority ) ) 40007054: 82 00 7f ff add %g1, -1, %g1 40007058: 80 a0 60 fd cmp %g1, 0xfd 4000705c: 18 80 00 4f bgu 40007198 40007060: 03 10 00 1d sethi %hi(0x40007400), %g1 40007064: a0 10 20 03 mov 3, %l0 40007068: a8 10 61 54 or %g1, 0x154, %l4 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 4000706c: 05 10 00 7a sethi %hi(0x4001e800), %g2 40007070: c2 00 a2 f0 ld [ %g2 + 0x2f0 ], %g1 ! 4001eaf0 <_Thread_Dispatch_disable_level> 40007074: 82 00 60 01 inc %g1 40007078: c2 20 a2 f0 st %g1, [ %g2 + 0x2f0 ] * _POSIX_Threads_Allocate */ RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Allocate( void ) { return (Thread_Control *) _Objects_Allocate( &_POSIX_Threads_Information ); 4000707c: 27 10 00 7b sethi %hi(0x4001ec00), %l3 40007080: 40 00 0b 9d call 40009ef4 <_Objects_Allocate> 40007084: 90 14 e1 d8 or %l3, 0x1d8, %o0 ! 4001edd8 <_POSIX_Threads_Information> * NOTE: Global threads are not currently supported. */ the_thread = _POSIX_Threads_Allocate(); if ( !the_thread ) { 40007088: b2 92 20 00 orcc %o0, 0, %i1 4000708c: 02 80 00 14 be 400070dc 40007090: 90 14 e1 d8 or %l3, 0x1d8, %o0 /* * Initialize the core thread for this task. */ status = _Thread_Initialize( 40007094: d4 04 60 04 ld [ %l1 + 4 ], %o2 40007098: d6 04 60 08 ld [ %l1 + 8 ], %o3 4000709c: e0 23 a0 60 st %l0, [ %sp + 0x60 ] 400070a0: e8 23 a0 64 st %l4, [ %sp + 0x64 ] 400070a4: c0 23 a0 68 clr [ %sp + 0x68 ] 400070a8: c0 23 a0 6c clr [ %sp + 0x6c ] 400070ac: 9a 10 20 ff mov 0xff, %o5 400070b0: a6 10 20 01 mov 1, %l3 400070b4: 9a 23 40 15 sub %o5, %l5, %o5 400070b8: e6 23 a0 5c st %l3, [ %sp + 0x5c ] 400070bc: 92 10 00 19 mov %i1, %o1 400070c0: 40 00 11 ed call 4000b874 <_Thread_Initialize> 400070c4: 98 10 20 00 clr %o4 budget_callout, 0, /* isr level */ NULL /* posix threads don't have a name */ ); if ( !status ) { 400070c8: 80 a2 20 00 cmp %o0, 0 400070cc: 32 80 00 08 bne,a 400070ec 400070d0: e0 06 61 70 ld [ %i1 + 0x170 ], %l0 _POSIX_Threads_Free( the_thread ); 400070d4: 7f ff ff 82 call 40006edc <_POSIX_Threads_Free> 400070d8: 90 10 00 19 mov %i1, %o0 _Thread_Enable_dispatch(); 400070dc: 7f ff ff 87 call 40006ef8 <_Thread_Enable_dispatch> 400070e0: b0 10 20 0b mov 0xb, %i0 400070e4: 81 c7 e0 08 ret 400070e8: 81 e8 00 00 restore */ api = the_thread->API_Extensions[ THREAD_API_POSIX ]; api->Attributes = *the_attr; 400070ec: 92 10 00 11 mov %l1, %o1 400070f0: 94 10 20 38 mov 0x38, %o2 400070f4: 40 00 28 16 call 4001114c 400070f8: 90 10 00 10 mov %l0, %o0 api->detachstate = the_attr->detachstate; 400070fc: c2 04 60 34 ld [ %l1 + 0x34 ], %g1 api->schedpolicy = schedpolicy; api->schedparam = schedparam; 40007100: 92 07 bf e0 add %fp, -32, %o1 api = the_thread->API_Extensions[ THREAD_API_POSIX ]; api->Attributes = *the_attr; api->detachstate = the_attr->detachstate; 40007104: c2 24 20 38 st %g1, [ %l0 + 0x38 ] api->schedpolicy = schedpolicy; api->schedparam = schedparam; 40007108: 94 10 20 18 mov 0x18, %o2 api = the_thread->API_Extensions[ THREAD_API_POSIX ]; api->Attributes = *the_attr; api->detachstate = the_attr->detachstate; api->schedpolicy = schedpolicy; 4000710c: e4 24 20 7c st %l2, [ %l0 + 0x7c ] api->schedparam = schedparam; 40007110: 40 00 28 0f call 4001114c 40007114: 90 04 20 80 add %l0, 0x80, %o0 /* * POSIX threads are allocated and started in one operation. */ status = _Thread_Start( 40007118: 94 10 00 1a mov %i2, %o2 * first run. * * NOTE: Since the thread starts with all unblocked, this is necessary. */ the_thread->do_post_task_switch_extension = TRUE; 4000711c: e6 26 60 78 st %l3, [ %i1 + 0x78 ] /* * POSIX threads are allocated and started in one operation. */ status = _Thread_Start( 40007120: 96 10 00 1b mov %i3, %o3 40007124: 90 10 00 19 mov %i1, %o0 40007128: 92 10 20 01 mov 1, %o1 4000712c: 40 00 15 27 call 4000c5c8 <_Thread_Start> 40007130: 98 10 20 00 clr %o4 start_routine, arg, 0 /* unused */ ); if ( schedpolicy == SCHED_SPORADIC ) { 40007134: 80 a4 a0 03 cmp %l2, 3 40007138: 12 80 00 09 bne 4000715c 4000713c: a2 10 00 08 mov %o0, %l1 _Watchdog_Insert_ticks( 40007140: 40 00 15 d9 call 4000c8a4 <_Timespec_To_ticks> 40007144: 90 04 20 88 add %l0, 0x88, %o0 40007148: 92 04 20 9c add %l0, 0x9c, %o1 Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 4000714c: d0 24 20 a8 st %o0, [ %l0 + 0xa8 ] _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 40007150: 11 10 00 7a sethi %hi(0x4001e800), %o0 40007154: 40 00 16 cd call 4000cc88 <_Watchdog_Insert> 40007158: 90 12 23 ec or %o0, 0x3ec, %o0 ! 4001ebec <_Watchdog_Ticks_chain> /* * _Thread_Start only fails if the thread was in the incorrect state */ if ( !status ) { 4000715c: 80 a4 60 00 cmp %l1, 0 40007160: 12 80 00 08 bne 40007180 40007164: 90 10 00 19 mov %i1, %o0 _POSIX_Threads_Free( the_thread ); 40007168: 7f ff ff 5d call 40006edc <_POSIX_Threads_Free> <== NOT EXECUTED 4000716c: b0 10 20 16 mov 0x16, %i0 <== NOT EXECUTED _Thread_Enable_dispatch(); 40007170: 7f ff ff 62 call 40006ef8 <_Thread_Enable_dispatch> <== NOT EXECUTED 40007174: 01 00 00 00 nop <== NOT EXECUTED 40007178: 81 c7 e0 08 ret <== NOT EXECUTED 4000717c: 81 e8 00 00 restore <== NOT EXECUTED /* * Return the id and indicate we successfully created the thread */ *thread = the_thread->Object.id; 40007180: c2 06 60 08 ld [ %i1 + 8 ], %g1 _Thread_Enable_dispatch(); 40007184: b0 10 20 00 clr %i0 40007188: 7f ff ff 5c call 40006ef8 <_Thread_Enable_dispatch> 4000718c: c2 25 80 00 st %g1, [ %l6 ] 40007190: 81 c7 e0 08 ret 40007194: 81 e8 00 00 restore return 0; 40007198: b0 10 20 16 mov 0x16, %i0 } 4000719c: 81 c7 e0 08 ret 400071a0: 81 e8 00 00 restore 400065e0 : #include int pthread_detach( pthread_t thread ) { 400065e0: 9d e3 bf 90 save %sp, -112, %sp RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Get ( pthread_t id, Objects_Locations *location ) { return (Thread_Control *) 400065e4: 11 10 00 5f sethi %hi(0x40017c00), %o0 400065e8: 92 10 00 18 mov %i0, %o1 400065ec: 90 12 22 88 or %o0, 0x288, %o0 400065f0: 40 00 0b ff call 400095ec <_Objects_Get> 400065f4: 94 07 bf f4 add %fp, -12, %o2 register Thread_Control *the_thread; POSIX_API_Control *api; Objects_Locations location; the_thread = _POSIX_Threads_Get( thread, &location ); switch ( location ) { 400065f8: c2 07 bf f4 ld [ %fp + -12 ], %g1 400065fc: 80 a0 60 00 cmp %g1, 0 40006600: 22 80 00 06 be,a 40006618 40006604: c2 02 21 70 ld [ %o0 + 0x170 ], %g1 40006608: 80 a0 60 02 cmp %g1, 2 4000660c: 08 80 00 13 bleu 40006658 40006610: 90 10 20 03 mov 3, %o0 40006614: 30 80 00 0f b,a 40006650 <== NOT EXECUTED case OBJECTS_REMOTE: return ESRCH; case OBJECTS_LOCAL: api = the_thread->API_Extensions[ THREAD_API_POSIX ]; api->detachstate = PTHREAD_CREATE_DETACHED; 40006618: c0 20 60 38 clr [ %g1 + 0x38 ] #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 4000661c: 05 10 00 5e sethi %hi(0x40017800), %g2 40006620: c2 00 a3 a0 ld [ %g2 + 0x3a0 ], %g1 ! 40017ba0 <_Thread_Dispatch_disable_level> 40006624: 90 10 20 00 clr %o0 40006628: 82 00 7f ff add %g1, -1, %g1 4000662c: c2 20 a3 a0 st %g1, [ %g2 + 0x3a0 ] 40006630: c2 00 a3 a0 ld [ %g2 + 0x3a0 ], %g1 40006634: 80 a0 60 00 cmp %g1, 0 40006638: 12 80 00 08 bne 40006658 4000663c: 01 00 00 00 nop _Thread_Dispatch(); 40006640: 40 00 10 a0 call 4000a8c0 <_Thread_Dispatch> 40006644: 01 00 00 00 nop 40006648: 10 80 00 04 b 40006658 4000664c: 90 10 20 00 clr %o0 ! 0 _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); 40006650: 40 00 01 82 call 40006c58 <== NOT EXECUTED 40006654: 01 00 00 00 nop <== NOT EXECUTED } 40006658: 81 c7 e0 08 ret 4000665c: 91 e8 00 08 restore %g0, %o0, %o0 4000e948 : #include void pthread_exit( void *value_ptr ) { 4000e948: 9d e3 bf 98 save %sp, -104, %sp Objects_Information *the_information; the_information = _Objects_Get_information( _Thread_Executing->Object.id ); 4000e94c: 25 10 00 6b sethi %hi(0x4001ac00), %l2 4000e950: c2 04 a2 ac ld [ %l2 + 0x2ac ], %g1 ! 4001aeac <_Thread_Executing> 4000e954: c6 00 60 08 ld [ %g1 + 8 ], %g3 if ( !_Objects_Is_class_valid( the_class ) ) return NULL; the_api = _Objects_Get_API( id ); return _Objects_Information_table[ the_api ][ the_class ]; 4000e958: 03 10 00 6b sethi %hi(0x4001ac00), %g1 4000e95c: 85 30 e0 16 srl %g3, 0x16, %g2 4000e960: 82 10 61 30 or %g1, 0x130, %g1 4000e964: 84 08 a0 1c and %g2, 0x1c, %g2 4000e968: c2 00 40 02 ld [ %g1 + %g2 ], %g1 4000e96c: 87 30 e0 1b srl %g3, 0x1b, %g3 4000e970: 87 28 e0 02 sll %g3, 2, %g3 4000e974: e2 00 40 03 ld [ %g1 + %g3 ], %l1 /* This should never happen if _Thread_Get() works right */ assert( the_information ); 4000e978: 80 a4 60 00 cmp %l1, 0 4000e97c: 12 80 00 09 bne 4000e9a0 4000e980: 21 10 00 6b sethi %hi(0x4001ac00), %l0 4000e984: 11 10 00 64 sethi %hi(0x40019000), %o0 <== NOT EXECUTED 4000e988: 15 10 00 64 sethi %hi(0x40019000), %o2 <== NOT EXECUTED 4000e98c: 90 12 22 c0 or %o0, 0x2c0, %o0 <== NOT EXECUTED 4000e990: 94 12 a3 08 or %o2, 0x308, %o2 <== NOT EXECUTED 4000e994: 7f ff d0 f0 call 40002d54 <__assert> <== NOT EXECUTED 4000e998: 92 10 20 25 mov 0x25, %o1 <== NOT EXECUTED rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 4000e99c: 21 10 00 6b sethi %hi(0x4001ac00), %l0 <== NOT EXECUTED 4000e9a0: c2 04 21 d0 ld [ %l0 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> 4000e9a4: 82 00 60 01 inc %g1 4000e9a8: c2 24 21 d0 st %g1, [ %l0 + 0x1d0 ] _Thread_Disable_dispatch(); _Thread_Executing->Wait.return_argument = value_ptr; 4000e9ac: d2 04 a2 ac ld [ %l2 + 0x2ac ], %o1 _Thread_Close( the_information, _Thread_Executing ); 4000e9b0: 90 10 00 11 mov %l1, %o0 4000e9b4: 7f ff eb 89 call 400097d8 <_Thread_Close> 4000e9b8: f0 22 60 28 st %i0, [ %o1 + 0x28 ] RTEMS_INLINE_ROUTINE void _POSIX_Threads_Free ( Thread_Control *the_pthread ) { _Objects_Free( &_POSIX_Threads_Information, &the_pthread->Object ); 4000e9bc: d2 04 a2 ac ld [ %l2 + 0x2ac ], %o1 4000e9c0: 11 10 00 6c sethi %hi(0x4001b000), %o0 4000e9c4: 7f ff e6 d4 call 40008514 <_Objects_Free> 4000e9c8: 90 12 20 b8 or %o0, 0xb8, %o0 ! 4001b0b8 <_POSIX_Threads_Information> #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 4000e9cc: c2 04 21 d0 ld [ %l0 + 0x1d0 ], %g1 4000e9d0: 82 00 7f ff add %g1, -1, %g1 4000e9d4: c2 24 21 d0 st %g1, [ %l0 + 0x1d0 ] 4000e9d8: c2 04 21 d0 ld [ %l0 + 0x1d0 ], %g1 4000e9dc: 80 a0 60 00 cmp %g1, 0 4000e9e0: 12 80 00 04 bne 4000e9f0 4000e9e4: 01 00 00 00 nop _Thread_Dispatch(); 4000e9e8: 7f ff ec 01 call 400099ec <_Thread_Dispatch> 4000e9ec: 81 e8 00 00 restore 4000e9f0: 81 c7 e0 08 ret <== NOT EXECUTED 4000e9f4: 81 e8 00 00 restore <== NOT EXECUTED 40008b68 : int pthread_getschedparam( pthread_t thread, int *policy, struct sched_param *param ) { 40008b68: 9d e3 bf 90 save %sp, -112, %sp Objects_Locations location; POSIX_API_Control *api; register Thread_Control *the_thread; if ( !policy || !param ) 40008b6c: 80 a6 60 00 cmp %i1, 0 40008b70: 02 80 00 05 be 40008b84 40008b74: 92 10 00 18 mov %i0, %o1 40008b78: 80 a6 a0 00 cmp %i2, 0 40008b7c: 32 80 00 04 bne,a 40008b8c 40008b80: 11 10 00 6c sethi %hi(0x4001b000), %o0 40008b84: 10 80 00 27 b 40008c20 40008b88: 90 10 20 16 mov 0x16, %o0 RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Get ( pthread_t id, Objects_Locations *location ) { return (Thread_Control *) 40008b8c: 94 07 bf f4 add %fp, -12, %o2 40008b90: 40 00 0c 13 call 4000bbdc <_Objects_Get> 40008b94: 90 12 23 a8 or %o0, 0x3a8, %o0 return EINVAL; the_thread = _POSIX_Threads_Get( thread, &location ); switch ( location ) { 40008b98: c2 07 bf f4 ld [ %fp + -12 ], %g1 40008b9c: 80 a0 60 00 cmp %g1, 0 40008ba0: 02 80 00 06 be 40008bb8 40008ba4: b0 10 00 08 mov %o0, %i0 40008ba8: 80 a0 60 02 cmp %g1, 2 40008bac: 08 80 00 1d bleu 40008c20 40008bb0: 90 10 20 03 mov 3, %o0 40008bb4: 30 80 00 19 b,a 40008c18 <== NOT EXECUTED case OBJECTS_ERROR: case OBJECTS_REMOTE: return ESRCH; case OBJECTS_LOCAL: api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 40008bb8: d2 02 21 70 ld [ %o0 + 0x170 ], %o1 if ( policy ) *policy = api->schedpolicy; if ( param ) { *param = api->schedparam; 40008bbc: 94 10 20 18 mov 0x18, %o2 case OBJECTS_REMOTE: return ESRCH; case OBJECTS_LOCAL: api = the_thread->API_Extensions[ THREAD_API_POSIX ]; if ( policy ) *policy = api->schedpolicy; 40008bc0: c2 02 60 7c ld [ %o1 + 0x7c ], %g1 if ( param ) { *param = api->schedparam; 40008bc4: 90 10 00 1a mov %i2, %o0 case OBJECTS_REMOTE: return ESRCH; case OBJECTS_LOCAL: api = the_thread->API_Extensions[ THREAD_API_POSIX ]; if ( policy ) *policy = api->schedpolicy; 40008bc8: c2 26 40 00 st %g1, [ %i1 ] if ( param ) { *param = api->schedparam; 40008bcc: 40 00 28 05 call 40012be0 40008bd0: 92 02 60 80 add %o1, 0x80, %o1 param->sched_priority = 40008bd4: c4 06 20 14 ld [ %i0 + 0x14 ], %g2 40008bd8: 82 10 20 ff mov 0xff, %g1 40008bdc: 82 20 40 02 sub %g1, %g2, %g1 40008be0: c2 26 80 00 st %g1, [ %i2 ] #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40008be4: 05 10 00 6c sethi %hi(0x4001b000), %g2 40008be8: c2 00 a0 c0 ld [ %g2 + 0xc0 ], %g1 ! 4001b0c0 <_Thread_Dispatch_disable_level> 40008bec: 90 10 20 00 clr %o0 40008bf0: 82 00 7f ff add %g1, -1, %g1 40008bf4: c2 20 a0 c0 st %g1, [ %g2 + 0xc0 ] 40008bf8: c2 00 a0 c0 ld [ %g2 + 0xc0 ], %g1 40008bfc: 80 a0 60 00 cmp %g1, 0 40008c00: 12 80 00 08 bne 40008c20 40008c04: 01 00 00 00 nop _Thread_Dispatch(); 40008c08: 40 00 10 aa call 4000ceb0 <_Thread_Dispatch> 40008c0c: 01 00 00 00 nop 40008c10: 10 80 00 04 b 40008c20 40008c14: 90 10 20 00 clr %o0 ! 0 } _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); 40008c18: 40 00 01 8c call 40009248 <== NOT EXECUTED 40008c1c: 01 00 00 00 nop <== NOT EXECUTED } 40008c20: 81 c7 e0 08 ret 40008c24: 91 e8 00 08 restore %g0, %o0, %o0 400065e8 : */ void *pthread_getspecific( pthread_key_t key ) { 400065e8: 9d e3 bf 90 save %sp, -112, %sp RTEMS_INLINE_ROUTINE POSIX_Keys_Control *_POSIX_Keys_Get ( Objects_Id id, Objects_Locations *location ) { return (POSIX_Keys_Control *) 400065ec: 11 10 00 60 sethi %hi(0x40018000), %o0 400065f0: 92 10 00 18 mov %i0, %o1 400065f4: 90 12 22 c0 or %o0, 0x2c0, %o0 400065f8: 40 00 0c a5 call 4000988c <_Objects_Get> 400065fc: 94 07 bf f4 add %fp, -12, %o2 uint32_t index; Objects_Locations location; void *key_data; the_key = _POSIX_Keys_Get( key, &location ); switch ( location ) { 40006600: c2 07 bf f4 ld [ %fp + -12 ], %g1 40006604: 80 a0 60 00 cmp %g1, 0 40006608: 22 80 00 06 be,a 40006620 4000660c: 03 10 00 5f sethi %hi(0x40017c00), %g1 40006610: 80 a0 60 02 cmp %g1, 2 40006614: 08 80 00 18 bleu 40006674 40006618: b0 10 20 00 clr %i0 4000661c: 30 80 00 18 b,a 4000667c <== NOT EXECUTED case OBJECTS_ERROR: case OBJECTS_REMOTE: /* should never happen */ return NULL; case OBJECTS_LOCAL: api = _Objects_Get_API( _Thread_Executing->Object.id ); 40006620: c2 00 62 9c ld [ %g1 + 0x29c ], %g1 40006624: c4 00 60 08 ld [ %g1 + 8 ], %g2 index = _Objects_Get_index( _Thread_Executing->Object.id ); key_data = (void *) the_key->Values[ api ][ index ]; 40006628: 83 30 a0 16 srl %g2, 0x16, %g1 4000662c: 82 08 60 1c and %g1, 0x1c, %g1 40006630: 82 00 40 08 add %g1, %o0, %g1 40006634: c6 00 60 18 ld [ %g1 + 0x18 ], %g3 40006638: 03 00 00 3f sethi %hi(0xfc00), %g1 4000663c: 82 10 63 ff or %g1, 0x3ff, %g1 ! ffff 40006640: 84 08 80 01 and %g2, %g1, %g2 40006644: 85 28 a0 02 sll %g2, 2, %g2 40006648: f0 00 c0 02 ld [ %g3 + %g2 ], %i0 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 4000664c: 05 10 00 5f sethi %hi(0x40017c00), %g2 40006650: c2 00 a1 c0 ld [ %g2 + 0x1c0 ], %g1 ! 40017dc0 <_Thread_Dispatch_disable_level> 40006654: 82 00 7f ff add %g1, -1, %g1 40006658: c2 20 a1 c0 st %g1, [ %g2 + 0x1c0 ] 4000665c: c2 00 a1 c0 ld [ %g2 + 0x1c0 ], %g1 40006660: 80 a0 60 00 cmp %g1, 0 40006664: 12 80 00 08 bne 40006684 40006668: 01 00 00 00 nop _Thread_Dispatch(); 4000666c: 40 00 11 3d call 4000ab60 <_Thread_Dispatch> 40006670: 01 00 00 00 nop 40006674: 81 c7 e0 08 ret 40006678: 81 e8 00 00 restore _Thread_Enable_dispatch(); return key_data; } (void) POSIX_BOTTOM_REACHED(); 4000667c: 40 00 02 1f call 40006ef8 <== NOT EXECUTED 40006680: b0 10 20 00 clr %i0 <== NOT EXECUTED return (void *)NULL; } 40006684: 81 c7 e0 08 ret <== NOT EXECUTED 40006688: 81 e8 00 00 restore <== NOT EXECUTED 4000807c : int pthread_join( pthread_t thread, void **value_ptr ) { 4000807c: 9d e3 bf 90 save %sp, -112, %sp 40008080: 11 10 00 69 sethi %hi(0x4001a400), %o0 40008084: 92 10 00 18 mov %i0, %o1 40008088: 90 12 21 38 or %o0, 0x138, %o0 4000808c: 40 00 0b d0 call 4000afcc <_Objects_Get> 40008090: 94 07 bf f4 add %fp, -12, %o2 POSIX_API_Control *api; Objects_Locations location; void *return_pointer; the_thread = _POSIX_Threads_Get( thread, &location ); switch ( location ) { 40008094: c2 07 bf f4 ld [ %fp + -12 ], %g1 40008098: 80 a0 60 00 cmp %g1, 0 4000809c: 22 80 00 06 be,a 400080b4 400080a0: c4 02 21 70 ld [ %o0 + 0x170 ], %g2 400080a4: 80 a0 60 02 cmp %g1, 2 400080a8: 08 80 00 25 bleu 4000813c 400080ac: 90 10 20 03 mov 3, %o0 400080b0: 30 80 00 21 b,a 40008134 <== NOT EXECUTED case OBJECTS_REMOTE: return ESRCH; case OBJECTS_LOCAL: api = the_thread->API_Extensions[ THREAD_API_POSIX ]; if ( api->detachstate == PTHREAD_CREATE_DETACHED ) { 400080b4: c2 00 a0 38 ld [ %g2 + 0x38 ], %g1 400080b8: 80 a0 60 00 cmp %g1, 0 400080bc: 12 80 00 06 bne 400080d4 400080c0: 03 10 00 68 sethi %hi(0x4001a000), %g1 _Thread_Enable_dispatch(); 400080c4: 7f ff ff e1 call 40008048 <_Thread_Enable_dispatch> 400080c8: 01 00 00 00 nop 400080cc: 10 80 00 1c b 4000813c 400080d0: 90 10 20 16 mov 0x16, %o0 ! 16 RTEMS_INLINE_ROUTINE boolean _Thread_Is_executing ( const Thread_Control *the_thread ) { return ( the_thread == _Thread_Executing ); 400080d4: c6 00 63 2c ld [ %g1 + 0x32c ], %g3 return EINVAL; } if ( _Thread_Is_executing( the_thread ) ) { 400080d8: 80 a2 00 03 cmp %o0, %g3 400080dc: 12 80 00 06 bne 400080f4 400080e0: 82 07 bf f0 add %fp, -16, %g1 _Thread_Enable_dispatch(); 400080e4: 7f ff ff d9 call 40008048 <_Thread_Enable_dispatch> 400080e8: 01 00 00 00 nop 400080ec: 10 80 00 14 b 4000813c 400080f0: 90 10 20 2d mov 0x2d, %o0 ! 2d _Thread_Executing->Wait.return_argument = &return_pointer; _Thread_queue_Enter_critical_section( &api->Join_List ); _Thread_queue_Enqueue( &api->Join_List, WATCHDOG_NO_TIMEOUT ); 400080f4: 90 00 a0 3c add %g2, 0x3c, %o0 /* * Put ourself on the threads join list */ _Thread_Executing->Wait.return_argument = &return_pointer; 400080f8: c2 20 e0 28 st %g1, [ %g3 + 0x28 ] _Thread_queue_Enter_critical_section( &api->Join_List ); _Thread_queue_Enqueue( &api->Join_List, WATCHDOG_NO_TIMEOUT ); 400080fc: 92 10 20 00 clr %o1 RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section ( Thread_queue_Control *the_thread_queue ) { the_thread_queue->sync_state = THREAD_QUEUE_NOTHING_HAPPENED; 40008100: 82 10 20 01 mov 1, %g1 40008104: 15 10 00 33 sethi %hi(0x4000cc00), %o2 40008108: 94 12 a0 d8 or %o2, 0xd8, %o2 ! 4000ccd8 <_Thread_queue_Timeout> 4000810c: 40 00 11 cd call 4000c840 <_Thread_queue_Enqueue_with_handler> 40008110: c2 20 a0 6c st %g1, [ %g2 + 0x6c ] _Thread_Enable_dispatch(); 40008114: 7f ff ff cd call 40008048 <_Thread_Enable_dispatch> 40008118: 01 00 00 00 nop if ( value_ptr ) 4000811c: 80 a6 60 00 cmp %i1, 0 40008120: 02 80 00 07 be 4000813c 40008124: 90 10 20 00 clr %o0 *value_ptr = return_pointer; 40008128: c2 07 bf f0 ld [ %fp + -16 ], %g1 4000812c: 10 80 00 04 b 4000813c 40008130: c2 26 40 00 st %g1, [ %i1 ] return 0; } return POSIX_BOTTOM_REACHED(); 40008134: 40 00 01 41 call 40008638 <== NOT EXECUTED 40008138: 01 00 00 00 nop <== NOT EXECUTED } 4000813c: 81 c7 e0 08 ret 40008140: 91 e8 00 08 restore %g0, %o0, %o0 40006380 : int pthread_key_create( pthread_key_t *key, void (*destructor)( void * ) ) { 40006380: 9d e3 bf 98 save %sp, -104, %sp rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40006384: 03 10 00 5f sethi %hi(0x40017c00), %g1 40006388: c4 00 61 c0 ld [ %g1 + 0x1c0 ], %g2 ! 40017dc0 <_Thread_Dispatch_disable_level> 4000638c: 84 00 a0 01 inc %g2 40006390: c4 20 61 c0 st %g2, [ %g1 + 0x1c0 ] * _POSIX_Keys_Allocate */ RTEMS_INLINE_ROUTINE POSIX_Keys_Control *_POSIX_Keys_Allocate( void ) { return (POSIX_Keys_Control *) _Objects_Allocate( &_POSIX_Keys_Information ); 40006394: 11 10 00 60 sethi %hi(0x40018000), %o0 40006398: 40 00 0b f9 call 4000937c <_Objects_Allocate> 4000639c: 90 12 22 c0 or %o0, 0x2c0, %o0 ! 400182c0 <_POSIX_Keys_Information> _Thread_Disable_dispatch(); the_key = _POSIX_Keys_Allocate(); if ( !the_key ) { 400063a0: a0 92 20 00 orcc %o0, 0, %l0 400063a4: 12 80 00 06 bne 400063bc 400063a8: 03 10 00 5f sethi %hi(0x40017c00), %g1 _Thread_Enable_dispatch(); 400063ac: 7f ff ff e8 call 4000634c <_Thread_Enable_dispatch> 400063b0: b0 10 20 0b mov 0xb, %i0 400063b4: 81 c7 e0 08 ret 400063b8: 81 e8 00 00 restore return EAGAIN; } the_key->destructor = destructor; 400063bc: f2 24 20 14 st %i1, [ %l0 + 0x14 ] for ( the_api = 1; the_api <= OBJECTS_APIS_LAST; the_api++ ) { if ( _Objects_Information_table[ the_api ] && 400063c0: aa 10 61 20 or %g1, 0x120, %l5 if ( !the_key ) { _Thread_Enable_dispatch(); return EAGAIN; } the_key->destructor = destructor; 400063c4: a2 10 00 10 mov %l0, %l1 RTEMS_INLINE_ROUTINE void *_Workspace_Allocate( size_t size ) { return _Heap_Allocate( &_Workspace_Area, size ); 400063c8: 03 10 00 5f sethi %hi(0x40017c00), %g1 400063cc: a6 10 20 01 mov 1, %l3 400063d0: a8 10 62 0c or %g1, 0x20c, %l4 for ( the_api = 1; the_api <= OBJECTS_APIS_LAST; the_api++ ) { if ( _Objects_Information_table[ the_api ] && 400063d4: a5 2c e0 02 sll %l3, 2, %l2 400063d8: c2 04 80 15 ld [ %l2 + %l5 ], %g1 400063dc: 80 a0 60 00 cmp %g1, 0 400063e0: 02 80 00 29 be 40006484 400063e4: 90 10 00 14 mov %l4, %o0 400063e8: c2 00 60 04 ld [ %g1 + 4 ], %g1 400063ec: 80 a0 60 00 cmp %g1, 0 400063f0: 22 80 00 26 be,a 40006488 400063f4: c0 24 60 1c clr [ %l1 + 0x1c ] <== NOT EXECUTED _Objects_Information_table[ the_api ][ 1 ] ) { bytes_to_allocate = sizeof( void * ) * 400063f8: c2 10 60 10 lduh [ %g1 + 0x10 ], %g1 400063fc: 82 00 60 01 inc %g1 40006400: b3 28 60 02 sll %g1, 2, %i1 40006404: 40 00 0a 86 call 40008e1c <_Heap_Allocate> 40006408: 92 10 00 19 mov %i1, %o1 (_Objects_Information_table[ the_api ][ 1 ]->maximum + 1); table = _Workspace_Allocate( bytes_to_allocate ); if ( !table ) { 4000640c: 82 92 20 00 orcc %o0, 0, %g1 40006410: 32 80 00 18 bne,a 40006470 40006414: c2 24 60 1c st %g1, [ %l1 + 0x1c ] 40006418: 82 04 a0 14 add %l2, 0x14, %g1 <== NOT EXECUTED 4000641c: b0 10 20 00 clr %i0 <== NOT EXECUTED 40006420: b2 04 00 01 add %l0, %g1, %i1 <== NOT EXECUTED RTEMS_INLINE_ROUTINE boolean _Workspace_Free( void *block ) { return _Heap_Free( &_Workspace_Area, block ); 40006424: 03 10 00 5f sethi %hi(0x40017c00), %g1 <== NOT EXECUTED 40006428: 10 80 00 05 b 4000643c <== NOT EXECUTED 4000642c: a2 10 62 0c or %g1, 0x20c, %l1 ! 40017e0c <_Workspace_Area> <== NOT EXECUTED 40006430: d2 06 60 04 ld [ %i1 + 4 ], %o1 <== NOT EXECUTED 40006434: 40 00 0a a1 call 40008eb8 <_Heap_Free> <== NOT EXECUTED 40006438: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 4000643c: b0 06 20 01 inc %i0 <== NOT EXECUTED for ( --the_api; the_api >= 1; 40006440: 80 a6 00 13 cmp %i0, %l3 <== NOT EXECUTED 40006444: 12 bf ff fb bne 40006430 <== NOT EXECUTED 40006448: b2 06 7f fc add %i1, -4, %i1 <== NOT EXECUTED RTEMS_INLINE_ROUTINE void _POSIX_Keys_Free ( POSIX_Keys_Control *the_key ) { _Objects_Free( &_POSIX_Keys_Information, &the_key->Object ); 4000644c: 92 10 00 10 mov %l0, %o1 <== NOT EXECUTED 40006450: 11 10 00 60 sethi %hi(0x40018000), %o0 <== NOT EXECUTED 40006454: 90 12 22 c0 or %o0, 0x2c0, %o0 ! 400182c0 <_POSIX_Keys_Information> <== NOT EXECUTED 40006458: 40 00 0c cb call 40009784 <_Objects_Free> <== NOT EXECUTED 4000645c: b0 10 20 0c mov 0xc, %i0 <== NOT EXECUTED the_api-- ) _Workspace_Free( the_key->Values[ the_api ] ); _POSIX_Keys_Free( the_key ); _Thread_Enable_dispatch(); 40006460: 7f ff ff bb call 4000634c <_Thread_Enable_dispatch> <== NOT EXECUTED 40006464: 01 00 00 00 nop <== NOT EXECUTED 40006468: 81 c7 e0 08 ret <== NOT EXECUTED 4000646c: 81 e8 00 00 restore <== NOT EXECUTED return ENOMEM; } the_key->Values[ the_api ] = table; memset( table, '\0', bytes_to_allocate ); 40006470: 94 10 00 19 mov %i1, %o2 40006474: 40 00 29 21 call 400108f8 40006478: 92 10 20 00 clr %o1 * for. [NOTE: Currently RTEMS Classic API tasks are always enabled.] */ for ( the_api = 1; the_api <= OBJECTS_APIS_LAST; the_api++ ) { 4000647c: 10 80 00 04 b 4000648c 40006480: a6 04 e0 01 inc %l3 } the_key->Values[ the_api ] = table; memset( table, '\0', bytes_to_allocate ); } else { the_key->Values[ the_api ] = NULL; 40006484: c0 24 60 1c clr [ %l1 + 0x1c ] * for. [NOTE: Currently RTEMS Classic API tasks are always enabled.] */ for ( the_api = 1; the_api <= OBJECTS_APIS_LAST; the_api++ ) { 40006488: a6 04 e0 01 inc %l3 * APIs are optional. Thus there may be no ITRON tasks to have keys * for. [NOTE: Currently RTEMS Classic API tasks are always enabled.] */ for ( the_api = 1; the_api <= OBJECTS_APIS_LAST; 4000648c: 80 a4 e0 05 cmp %l3, 5 40006490: 12 bf ff d1 bne 400063d4 40006494: a2 04 60 04 add %l1, 4, %l1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40006498: 03 10 00 60 sethi %hi(0x40018000), %g1 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, the_object ); 4000649c: c6 04 20 08 ld [ %l0 + 8 ], %g3 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 400064a0: 88 10 62 c0 or %g1, 0x2c0, %g4 400064a4: c4 11 20 10 lduh [ %g4 + 0x10 ], %g2 } } the_key->is_active = TRUE; 400064a8: 82 10 20 01 mov 1, %g1 400064ac: c2 24 20 10 st %g1, [ %l0 + 0x10 ] 400064b0: 03 00 00 3f sethi %hi(0xfc00), %g1 400064b4: 82 10 63 ff or %g1, 0x3ff, %g1 ! ffff 400064b8: 82 08 c0 01 and %g3, %g1, %g1 400064bc: 80 a0 40 02 cmp %g1, %g2 400064c0: 38 80 00 06 bgu,a 400064d8 400064c4: c2 04 20 08 ld [ %l0 + 8 ], %g1 <== NOT EXECUTED information->local_table[ index ] = the_object; 400064c8: c4 01 20 20 ld [ %g4 + 0x20 ], %g2 400064cc: 83 28 60 02 sll %g1, 2, %g1 400064d0: e0 20 80 01 st %l0, [ %g2 + %g1 ] _Objects_Open( &_POSIX_Keys_Information, &the_key->Object, 0 ); *key = the_key->Object.id; 400064d4: c2 04 20 08 ld [ %l0 + 8 ], %g1 if ( information->is_string ) /* _Objects_Copy_name_string( name, the_object->name ); */ the_object->name = name; else /* _Objects_Copy_name_raw( name, the_object->name, information->name_length ); */ the_object->name = name; 400064d8: c0 24 20 0c clr [ %l0 + 0xc ] 400064dc: c2 26 00 00 st %g1, [ %i0 ] _Thread_Enable_dispatch(); 400064e0: 7f ff ff 9b call 4000634c <_Thread_Enable_dispatch> 400064e4: b0 10 20 00 clr %i0 return 0; } 400064e8: 81 c7 e0 08 ret 400064ec: 81 e8 00 00 restore 400064f0 : */ int pthread_key_delete( pthread_key_t key ) { 400064f0: 9d e3 bf 90 save %sp, -112, %sp RTEMS_INLINE_ROUTINE POSIX_Keys_Control *_POSIX_Keys_Get ( Objects_Id id, Objects_Locations *location ) { return (POSIX_Keys_Control *) 400064f4: 92 10 00 18 mov %i0, %o1 400064f8: 94 07 bf f4 add %fp, -12, %o2 400064fc: 31 10 00 60 sethi %hi(0x40018000), %i0 40006500: 40 00 0c e3 call 4000988c <_Objects_Get> 40006504: 90 16 22 c0 or %i0, 0x2c0, %o0 ! 400182c0 <_POSIX_Keys_Information> register POSIX_Keys_Control *the_key; Objects_Locations location; uint32_t the_api; the_key = _POSIX_Keys_Get( key, &location ); switch ( location ) { 40006508: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000650c: 80 a0 60 00 cmp %g1, 0 40006510: 02 80 00 06 be 40006528 40006514: a0 10 00 08 mov %o0, %l0 40006518: 80 a0 60 02 cmp %g1, 2 4000651c: 08 80 00 31 bleu 400065e0 40006520: 90 10 20 16 mov 0x16, %o0 40006524: 30 80 00 2d b,a 400065d8 <== NOT EXECUTED Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40006528: 90 16 22 c0 or %i0, 0x2c0, %o0 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); 4000652c: c2 04 20 08 ld [ %l0 + 8 ], %g1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40006530: c6 12 20 10 lduh [ %o0 + 0x10 ], %g3 40006534: 05 00 00 3f sethi %hi(0xfc00), %g2 40006538: 84 10 a3 ff or %g2, 0x3ff, %g2 ! ffff 4000653c: 82 08 40 02 and %g1, %g2, %g1 40006540: 80 a0 40 03 cmp %g1, %g3 40006544: 38 80 00 06 bgu,a 4000655c 40006548: 03 10 00 5f sethi %hi(0x40017c00), %g1 <== NOT EXECUTED information->local_table[ index ] = the_object; 4000654c: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 40006550: 83 28 60 02 sll %g1, 2, %g1 40006554: c0 20 80 01 clr [ %g2 + %g1 ] 40006558: 03 10 00 5f sethi %hi(0x40017c00), %g1 uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); /* _Objects_Clear_name( the_object->name, information->name_length ); */ the_object->name = 0; 4000655c: c0 24 20 0c clr [ %l0 + 0xc ] case OBJECTS_REMOTE: /* should never happen */ return EINVAL; case OBJECTS_LOCAL: _Objects_Close( &_POSIX_Keys_Information, &the_key->Object ); the_key->is_active = FALSE; 40006560: c0 24 20 10 clr [ %l0 + 0x10 ] 40006564: a2 10 62 0c or %g1, 0x20c, %l1 40006568: b0 10 20 00 clr %i0 for ( the_api = 1; the_api <= OBJECTS_APIS_LAST; the_api++ ) if ( the_key->Values[ the_api ] ) 4000656c: 82 04 00 18 add %l0, %i0, %g1 40006570: d2 00 60 1c ld [ %g1 + 0x1c ], %o1 40006574: 80 a2 60 00 cmp %o1, 0 40006578: 02 80 00 04 be 40006588 4000657c: b0 06 20 04 add %i0, 4, %i0 40006580: 40 00 0a 4e call 40008eb8 <_Heap_Free> 40006584: 90 10 00 11 mov %l1, %o0 _Objects_Close( &_POSIX_Keys_Information, &the_key->Object ); the_key->is_active = FALSE; for ( the_api = 1; the_api <= OBJECTS_APIS_LAST; 40006588: 80 a6 20 10 cmp %i0, 0x10 4000658c: 12 bf ff f9 bne 40006570 40006590: 82 04 00 18 add %l0, %i0, %g1 RTEMS_INLINE_ROUTINE void _POSIX_Keys_Free ( POSIX_Keys_Control *the_key ) { _Objects_Free( &_POSIX_Keys_Information, &the_key->Object ); 40006594: 92 10 00 10 mov %l0, %o1 40006598: 11 10 00 60 sethi %hi(0x40018000), %o0 4000659c: 40 00 0c 7a call 40009784 <_Objects_Free> 400065a0: 90 12 22 c0 or %o0, 0x2c0, %o0 ! 400182c0 <_POSIX_Keys_Information> #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 400065a4: 05 10 00 5f sethi %hi(0x40017c00), %g2 400065a8: c2 00 a1 c0 ld [ %g2 + 0x1c0 ], %g1 ! 40017dc0 <_Thread_Dispatch_disable_level> 400065ac: 90 10 20 00 clr %o0 400065b0: 82 00 7f ff add %g1, -1, %g1 400065b4: c2 20 a1 c0 st %g1, [ %g2 + 0x1c0 ] 400065b8: c2 00 a1 c0 ld [ %g2 + 0x1c0 ], %g1 400065bc: 80 a0 60 00 cmp %g1, 0 400065c0: 12 80 00 08 bne 400065e0 400065c4: 01 00 00 00 nop _Thread_Dispatch(); 400065c8: 40 00 11 66 call 4000ab60 <_Thread_Dispatch> 400065cc: 01 00 00 00 nop 400065d0: 10 80 00 04 b 400065e0 400065d4: 90 10 20 00 clr %o0 ! 0 _POSIX_Keys_Free( the_key ); _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); 400065d8: 40 00 02 48 call 40006ef8 <== NOT EXECUTED 400065dc: 01 00 00 00 nop <== NOT EXECUTED } 400065e0: 81 c7 e0 08 ret 400065e4: 91 e8 00 08 restore %g0, %o0, %o0 40023670 : int pthread_kill( pthread_t thread, int sig ) { 40023670: 9d e3 bf 90 save %sp, -112, %sp POSIX_API_Control *api; Thread_Control *the_thread; Objects_Locations location; if ( !sig ) 40023674: 80 a6 60 00 cmp %i1, 0 40023678: 02 80 00 06 be 40023690 4002367c: 92 10 00 18 mov %i0, %o1 rtems_set_errno_and_return_minus_one( EINVAL ); if ( !is_valid_signo(sig) ) 40023680: a0 06 7f ff add %i1, -1, %l0 40023684: 80 a4 20 1f cmp %l0, 0x1f 40023688: 28 80 00 06 bleu,a 400236a0 4002368c: 11 10 00 a7 sethi %hi(0x40029c00), %o0 rtems_set_errno_and_return_minus_one( EINVAL ); 40023690: 7f ff d0 16 call 400176e8 <__errno> 40023694: 01 00 00 00 nop 40023698: 10 80 00 0f b 400236d4 4002369c: 82 10 20 16 mov 0x16, %g1 ! 16 RTEMS_INLINE_ROUTINE Thread_Control *_POSIX_Threads_Get ( pthread_t id, Objects_Locations *location ) { return (Thread_Control *) 400236a0: 94 07 bf f4 add %fp, -12, %o2 400236a4: 7f ff a5 f5 call 4000ce78 <_Objects_Get> 400236a8: 90 12 23 94 or %o0, 0x394, %o0 if ( _POSIX_signals_Vectors[ sig ].sa_flags == SA_SIGINFO ) rtems_set_errno_and_return_minus_one( ENOSYS ); */ the_thread = _POSIX_Threads_Get( thread, &location ); switch ( location ) { 400236ac: c2 07 bf f4 ld [ %fp + -12 ], %g1 400236b0: 80 a0 60 00 cmp %g1, 0 400236b4: 02 80 00 0b be 400236e0 400236b8: b0 10 00 08 mov %o0, %i0 400236bc: 80 a0 60 02 cmp %g1, 2 400236c0: 18 80 00 29 bgu 40023764 400236c4: 01 00 00 00 nop case OBJECTS_ERROR: case OBJECTS_REMOTE: rtems_set_errno_and_return_minus_one( ESRCH ); 400236c8: 7f ff d0 08 call 400176e8 <__errno> 400236cc: 01 00 00 00 nop 400236d0: 82 10 20 03 mov 3, %g1 ! 3 400236d4: c2 22 00 00 st %g1, [ %o0 ] 400236d8: 10 80 00 25 b 4002376c 400236dc: 90 10 3f ff mov -1, %o0 api = the_thread->API_Extensions[ THREAD_API_POSIX ]; if ( sig ) { if ( _POSIX_signals_Vectors[ sig ].sa_handler == SIG_IGN ) { 400236e0: 83 2e 60 02 sll %i1, 2, %g1 400236e4: 85 2e 60 04 sll %i1, 4, %g2 400236e8: 84 20 80 01 sub %g2, %g1, %g2 400236ec: 03 10 00 a8 sethi %hi(0x4002a000), %g1 400236f0: 82 10 63 78 or %g1, 0x378, %g1 ! 4002a378 <_POSIX_signals_Vectors> 400236f4: 84 00 80 01 add %g2, %g1, %g2 400236f8: c2 00 a0 08 ld [ %g2 + 8 ], %g1 400236fc: 80 a0 60 01 cmp %g1, 1 40023700: 02 80 00 15 be 40023754 40023704: c6 02 21 70 ld [ %o0 + 0x170 ], %g3 return 0; } /* XXX critical section */ api->signals_pending |= signo_to_mask( sig ); 40023708: c4 00 e0 c8 ld [ %g3 + 0xc8 ], %g2 (void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL ); 4002370c: 92 10 00 19 mov %i1, %o1 return 0; } /* XXX critical section */ api->signals_pending |= signo_to_mask( sig ); 40023710: b2 10 20 01 mov 1, %i1 40023714: 83 2e 40 10 sll %i1, %l0, %g1 40023718: 84 10 80 01 or %g2, %g1, %g2 (void) _POSIX_signals_Unblock_thread( the_thread, sig, NULL ); 4002371c: 94 10 20 00 clr %o2 40023720: 7f ff ff 82 call 40023528 <_POSIX_signals_Unblock_thread> 40023724: c4 20 e0 c8 st %g2, [ %g3 + 0xc8 ] the_thread->do_post_task_switch_extension = TRUE; if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) ) 40023728: 03 10 00 a7 sethi %hi(0x40029c00), %g1 4002372c: c2 00 61 24 ld [ %g1 + 0x124 ], %g1 ! 40029d24 <_ISR_Nest_level> 40023730: 80 a0 60 00 cmp %g1, 0 40023734: 02 80 00 08 be 40023754 40023738: f2 26 20 78 st %i1, [ %i0 + 0x78 ] 4002373c: 03 10 00 a7 sethi %hi(0x40029c00), %g1 40023740: c2 00 61 3c ld [ %g1 + 0x13c ], %g1 ! 40029d3c <_Thread_Executing> 40023744: 80 a6 00 01 cmp %i0, %g1 40023748: 12 80 00 03 bne 40023754 4002374c: 03 10 00 a7 sethi %hi(0x40029c00), %g1 _ISR_Signals_to_thread_executing = TRUE; 40023750: f2 20 61 e8 st %i1, [ %g1 + 0x1e8 ] ! 40029de8 <_ISR_Signals_to_thread_executing> <== NOT EXECUTED } _Thread_Enable_dispatch(); 40023754: 7f ff ff ba call 4002363c <_Thread_Enable_dispatch> 40023758: 01 00 00 00 nop 4002375c: 10 80 00 04 b 4002376c 40023760: 90 10 20 00 clr %o0 ! 0 return 0; } return POSIX_BOTTOM_REACHED(); 40023764: 40 00 00 12 call 400237ac <== NOT EXECUTED 40023768: 01 00 00 00 nop <== NOT EXECUTED } 4002376c: 81 c7 e0 08 ret 40023770: 91 e8 00 08 restore %g0, %o0, %o0 40007edc : */ int pthread_mutex_destroy( pthread_mutex_t *mutex ) { 40007edc: 9d e3 bf 90 save %sp, -112, %sp Objects_Locations *location ) { Objects_Id *id = (Objects_Id *)mutex; ___POSIX_Mutex_Get_support( id, location ); 40007ee0: 80 a6 20 00 cmp %i0, 0 40007ee4: 02 80 00 0d be 40007f18 40007ee8: 82 10 20 02 mov 2, %g1 40007eec: c2 06 00 00 ld [ %i0 ], %g1 40007ef0: 80 a0 7f ff cmp %g1, -1 40007ef4: 32 80 00 0c bne,a 40007f24 40007ef8: d2 06 00 00 ld [ %i0 ], %o1 40007efc: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40007f00: 40 00 00 7e call 400080f8 <== NOT EXECUTED 40007f04: 92 10 20 00 clr %o1 <== NOT EXECUTED 40007f08: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40007f0c: 22 80 00 06 be,a 40007f24 <== NOT EXECUTED 40007f10: d2 06 00 00 ld [ %i0 ], %o1 <== NOT EXECUTED 40007f14: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED 40007f18: a0 10 20 00 clr %l0 <== NOT EXECUTED 40007f1c: 10 80 00 07 b 40007f38 <== NOT EXECUTED 40007f20: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED return (POSIX_Mutex_Control *) 40007f24: 11 10 00 6d sethi %hi(0x4001b400), %o0 40007f28: 94 07 bf f4 add %fp, -12, %o2 40007f2c: 40 00 0f 2c call 4000bbdc <_Objects_Get> 40007f30: 90 12 21 24 or %o0, 0x124, %o0 40007f34: a0 10 00 08 mov %o0, %l0 register POSIX_Mutex_Control *the_mutex; Objects_Locations location; the_mutex = _POSIX_Mutex_Get( mutex, &location ); switch ( location ) { 40007f38: c2 07 bf f4 ld [ %fp + -12 ], %g1 40007f3c: 80 a0 60 00 cmp %g1, 0 40007f40: 22 80 00 06 be,a 40007f58 40007f44: c2 04 20 64 ld [ %l0 + 0x64 ], %g1 40007f48: 80 a0 60 02 cmp %g1, 2 40007f4c: 08 80 00 23 bleu 40007fd8 40007f50: 90 10 20 16 mov 0x16, %o0 40007f54: 30 80 00 1f b,a 40007fd0 <== NOT EXECUTED /* * XXX: There is an error for the mutex being locked * or being in use by a condition variable. */ if ( _CORE_mutex_Is_locked( &the_mutex->Mutex ) ) { 40007f58: 80 a0 60 00 cmp %g1, 0 40007f5c: 12 80 00 06 bne 40007f74 40007f60: 03 10 00 6d sethi %hi(0x4001b400), %g1 _Thread_Enable_dispatch(); 40007f64: 7f ff ff d1 call 40007ea8 <_Thread_Enable_dispatch> 40007f68: 01 00 00 00 nop 40007f6c: 10 80 00 1b b 40007fd8 40007f70: 90 10 20 10 mov 0x10, %o0 ! 10 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); 40007f74: c6 04 20 08 ld [ %l0 + 8 ], %g3 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40007f78: b0 10 61 24 or %g1, 0x124, %i0 40007f7c: c4 16 20 10 lduh [ %i0 + 0x10 ], %g2 40007f80: 03 00 00 3f sethi %hi(0xfc00), %g1 40007f84: 82 10 63 ff or %g1, 0x3ff, %g1 ! ffff 40007f88: 82 08 c0 01 and %g3, %g1, %g1 40007f8c: 80 a0 40 02 cmp %g1, %g2 40007f90: 18 80 00 05 bgu 40007fa4 40007f94: 94 10 20 16 mov 0x16, %o2 information->local_table[ index ] = the_object; 40007f98: c4 06 20 20 ld [ %i0 + 0x20 ], %g2 40007f9c: 83 28 60 02 sll %g1, 2, %g1 40007fa0: c0 20 80 01 clr [ %g2 + %g1 ] return EBUSY; } _Objects_Close( &_POSIX_Mutex_Information, &the_mutex->Object ); _CORE_mutex_Flush( 40007fa4: 90 04 20 14 add %l0, 0x14, %o0 40007fa8: 92 10 20 00 clr %o1 40007fac: 40 00 0b 21 call 4000ac30 <_CORE_mutex_Flush> 40007fb0: c0 24 20 0c clr [ %l0 + 0xc ] RTEMS_INLINE_ROUTINE void _POSIX_Mutex_Free ( POSIX_Mutex_Control *the_mutex ) { _Objects_Free( &_POSIX_Mutex_Information, &the_mutex->Object ); 40007fb4: 90 10 00 18 mov %i0, %o0 40007fb8: 40 00 0e c7 call 4000bad4 <_Objects_Free> 40007fbc: 92 10 00 10 mov %l0, %o1 0, /* Not used */ 0 /* Not used */ ); } #endif _Thread_Enable_dispatch(); 40007fc0: 7f ff ff ba call 40007ea8 <_Thread_Enable_dispatch> 40007fc4: 01 00 00 00 nop 40007fc8: 10 80 00 04 b 40007fd8 40007fcc: 90 10 20 00 clr %o0 ! 0 return 0; } return POSIX_BOTTOM_REACHED(); 40007fd0: 40 00 04 9e call 40009248 <== NOT EXECUTED 40007fd4: 01 00 00 00 nop <== NOT EXECUTED } 40007fd8: 81 c7 e0 08 ret 40007fdc: 91 e8 00 08 restore %g0, %o0, %o0 40007fe0 : int pthread_mutex_getprioceiling( pthread_mutex_t *mutex, int *prioceiling ) { 40007fe0: 9d e3 bf 90 save %sp, -112, %sp register POSIX_Mutex_Control *the_mutex; Objects_Locations location; if ( !prioceiling ) 40007fe4: 80 a6 60 00 cmp %i1, 0 40007fe8: 02 80 00 33 be 400080b4 40007fec: 80 a6 20 00 cmp %i0, 0 Objects_Locations *location ) { Objects_Id *id = (Objects_Id *)mutex; ___POSIX_Mutex_Get_support( id, location ); 40007ff0: 02 80 00 0d be 40008024 40007ff4: 82 10 20 02 mov 2, %g1 40007ff8: c2 06 00 00 ld [ %i0 ], %g1 40007ffc: 80 a0 7f ff cmp %g1, -1 40008000: 32 80 00 0c bne,a 40008030 40008004: d2 06 00 00 ld [ %i0 ], %o1 40008008: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 4000800c: 40 00 00 3b call 400080f8 <== NOT EXECUTED 40008010: 92 10 20 00 clr %o1 <== NOT EXECUTED 40008014: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40008018: 22 80 00 06 be,a 40008030 <== NOT EXECUTED 4000801c: d2 06 00 00 ld [ %i0 ], %o1 <== NOT EXECUTED 40008020: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED 40008024: 90 10 20 00 clr %o0 <== NOT EXECUTED 40008028: 10 80 00 06 b 40008040 <== NOT EXECUTED 4000802c: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED return (POSIX_Mutex_Control *) 40008030: 11 10 00 6d sethi %hi(0x4001b400), %o0 40008034: 94 07 bf f4 add %fp, -12, %o2 40008038: 40 00 0e e9 call 4000bbdc <_Objects_Get> 4000803c: 90 12 21 24 or %o0, 0x124, %o0 return EINVAL; the_mutex = _POSIX_Mutex_Get( mutex, &location ); switch ( location ) { 40008040: c2 07 bf f4 ld [ %fp + -12 ], %g1 40008044: 80 a0 60 00 cmp %g1, 0 40008048: 22 80 00 07 be,a 40008064 4000804c: c4 02 20 60 ld [ %o0 + 0x60 ], %g2 40008050: 80 a0 60 02 cmp %g1, 2 40008054: 18 80 00 14 bgu 400080a4 40008058: 90 10 20 16 mov 0x16, %o0 ); _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); } 4000805c: 81 c7 e0 08 ret 40008060: 91 e8 00 08 restore %g0, %o0, %o0 return POSIX_MP_NOT_IMPLEMENTED(); /* XXX feels questionable */ #endif case OBJECTS_ERROR: return EINVAL; case OBJECTS_LOCAL: *prioceiling = _POSIX_Priority_From_core( 40008064: 82 10 20 ff mov 0xff, %g1 40008068: 82 20 40 02 sub %g1, %g2, %g1 4000806c: c2 26 40 00 st %g1, [ %i1 ] #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40008070: 05 10 00 6c sethi %hi(0x4001b000), %g2 40008074: c2 00 a0 c0 ld [ %g2 + 0xc0 ], %g1 ! 4001b0c0 <_Thread_Dispatch_disable_level> 40008078: 90 10 20 00 clr %o0 4000807c: 82 00 7f ff add %g1, -1, %g1 40008080: c2 20 a0 c0 st %g1, [ %g2 + 0xc0 ] 40008084: c2 00 a0 c0 ld [ %g2 + 0xc0 ], %g1 40008088: 80 a0 60 00 cmp %g1, 0 4000808c: 32 80 00 0c bne,a 400080bc 40008090: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED _Thread_Dispatch(); 40008094: 40 00 13 87 call 4000ceb0 <_Thread_Dispatch> 40008098: 01 00 00 00 nop 4000809c: 10 80 00 07 b 400080b8 400080a0: 90 10 20 00 clr %o0 ! 0 the_mutex->Mutex.Attributes.priority_ceiling ); _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); 400080a4: 40 00 04 69 call 40009248 <== NOT EXECUTED 400080a8: 01 00 00 00 nop <== NOT EXECUTED } 400080ac: 81 c7 e0 08 ret <== NOT EXECUTED 400080b0: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED the_mutex->Mutex.Attributes.priority_ceiling ); _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); 400080b4: 90 10 20 16 mov 0x16, %o0 } 400080b8: b0 10 00 08 mov %o0, %i0 400080bc: 81 c7 e0 08 ret 400080c0: 81 e8 00 00 restore 400080f8 : int pthread_mutex_init( pthread_mutex_t *mutex, const pthread_mutexattr_t *attr ) { 400080f8: 9d e3 bf 98 save %sp, -104, %sp #if 0 register POSIX_Mutex_Control *mutex_in_use; Objects_Locations location; #endif if ( attr ) the_attr = attr; 400080fc: 03 10 00 64 sethi %hi(0x40019000), %g1 40008100: 80 a6 60 00 cmp %i1, 0 40008104: 02 80 00 03 be 40008110 40008108: a0 10 61 7c or %g1, 0x17c, %l0 4000810c: a0 10 00 19 mov %i1, %l0 else the_attr = &_POSIX_Mutex_Default_attributes; /* Check for NULL mutex */ if ( !mutex ) 40008110: 80 a6 20 00 cmp %i0, 0 40008114: 22 80 00 2e be,a 400081cc 40008118: b0 10 20 16 mov 0x16, %i0 return EBUSY; } } #endif if ( !the_attr->is_initialized ) 4000811c: c2 04 00 00 ld [ %l0 ], %g1 40008120: 80 a0 60 00 cmp %g1, 0 40008124: 22 80 00 2a be,a 400081cc 40008128: b0 10 20 16 mov 0x16, %i0 /* * XXX: Be careful about attributes when global!!! */ assert( the_attr->process_shared == PTHREAD_PROCESS_PRIVATE ); 4000812c: c2 04 20 04 ld [ %l0 + 4 ], %g1 40008130: 80 a0 60 00 cmp %g1, 0 40008134: 22 80 00 09 be,a 40008158 40008138: c2 04 20 0c ld [ %l0 + 0xc ], %g1 4000813c: 11 10 00 64 sethi %hi(0x40019000), %o0 <== NOT EXECUTED 40008140: 15 10 00 64 sethi %hi(0x40019000), %o2 <== NOT EXECUTED 40008144: 90 12 21 90 or %o0, 0x190, %o0 <== NOT EXECUTED 40008148: 94 12 a1 d8 or %o2, 0x1d8, %o2 <== NOT EXECUTED 4000814c: 7f ff f2 cd call 40004c80 <__assert> <== NOT EXECUTED 40008150: 92 10 20 64 mov 0x64, %o1 <== NOT EXECUTED /* * Determine the discipline of the mutex */ switch ( the_attr->protocol ) { 40008154: c2 04 20 0c ld [ %l0 + 0xc ], %g1 <== NOT EXECUTED 40008158: 80 a0 60 01 cmp %g1, 1 4000815c: 02 80 00 08 be 4000817c 40008160: 80 a0 60 02 cmp %g1, 2 40008164: 02 80 00 08 be 40008184 40008168: 80 a0 60 00 cmp %g1, 0 4000816c: 02 80 00 07 be 40008188 40008170: a2 10 20 00 clr %l1 0 /* Not used */ ); #endif _Thread_Enable_dispatch(); return 0; 40008174: 81 c7 e0 08 ret 40008178: 91 e8 20 16 restore %g0, 0x16, %o0 /* * Determine the discipline of the mutex */ switch ( the_attr->protocol ) { 4000817c: 10 80 00 03 b 40008188 40008180: a2 10 20 02 mov 2, %l1 40008184: a2 10 20 03 mov 3, %l1 break; default: return EINVAL; } if ( !_POSIX_Priority_Is_valid( the_attr->prio_ceiling ) ) 40008188: c2 04 20 08 ld [ %l0 + 8 ], %g1 4000818c: 82 00 7f ff add %g1, -1, %g1 40008190: 80 a0 60 fd cmp %g1, 0xfd 40008194: 38 80 00 0e bgu,a 400081cc 40008198: b0 10 20 16 mov 0x16, %i0 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 4000819c: 03 10 00 6c sethi %hi(0x4001b000), %g1 400081a0: c4 00 60 c0 ld [ %g1 + 0xc0 ], %g2 ! 4001b0c0 <_Thread_Dispatch_disable_level> 400081a4: 84 00 a0 01 inc %g2 400081a8: c4 20 60 c0 st %g2, [ %g1 + 0xc0 ] * _POSIX_Mutex_Allocate */ RTEMS_INLINE_ROUTINE POSIX_Mutex_Control *_POSIX_Mutex_Allocate( void ) { return (POSIX_Mutex_Control *) _Objects_Allocate( &_POSIX_Mutex_Information ); 400081ac: 11 10 00 6d sethi %hi(0x4001b400), %o0 400081b0: 40 00 0d 47 call 4000b6cc <_Objects_Allocate> 400081b4: 90 12 21 24 or %o0, 0x124, %o0 ! 4001b524 <_POSIX_Mutex_Information> _Thread_Disable_dispatch(); the_mutex = _POSIX_Mutex_Allocate(); if ( !the_mutex ) { 400081b8: b2 92 20 00 orcc %o0, 0, %i1 400081bc: 32 80 00 06 bne,a 400081d4 400081c0: c2 04 20 04 ld [ %l0 + 4 ], %g1 _Thread_Enable_dispatch(); 400081c4: 7f ff ff c0 call 400080c4 <_Thread_Enable_dispatch> 400081c8: b0 10 20 0b mov 0xb, %i0 400081cc: 81 c7 e0 08 ret 400081d0: 81 e8 00 00 restore _Thread_Enable_dispatch(); return EAGAIN; } #endif the_mutex->process_shared = the_attr->process_shared; 400081d4: c2 26 60 10 st %g1, [ %i1 + 0x10 ] the_mutex_attr = &the_mutex->Mutex.Attributes; if ( the_attr->recursive ) 400081d8: c2 04 20 10 ld [ %l0 + 0x10 ], %g1 400081dc: 80 a0 60 00 cmp %g1, 0 400081e0: 02 80 00 04 be 400081f0 400081e4: 82 10 20 01 mov 1, %g1 the_mutex_attr->lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES; 400081e8: 10 80 00 03 b 400081f4 <== NOT EXECUTED 400081ec: c0 26 60 54 clr [ %i1 + 0x54 ] <== NOT EXECUTED else the_mutex_attr->lock_nesting_behavior = CORE_MUTEX_NESTING_IS_ERROR; 400081f0: c2 26 60 54 st %g1, [ %i1 + 0x54 ] the_mutex_attr->only_owner_release = TRUE; the_mutex_attr->priority_ceiling = 400081f4: c4 04 20 08 ld [ %l0 + 8 ], %g2 if ( the_attr->recursive ) the_mutex_attr->lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES; else the_mutex_attr->lock_nesting_behavior = CORE_MUTEX_NESTING_IS_ERROR; the_mutex_attr->only_owner_release = TRUE; 400081f8: 82 10 20 01 mov 1, %g1 400081fc: c2 26 60 58 st %g1, [ %i1 + 0x58 ] the_mutex_attr->priority_ceiling = 40008200: 82 10 20 ff mov 0xff, %g1 40008204: 82 20 40 02 sub %g1, %g2, %g1 _POSIX_Priority_To_core( the_attr->prio_ceiling ); the_mutex_attr->discipline = the_discipline; 40008208: e2 26 60 5c st %l1, [ %i1 + 0x5c ] if ( the_attr->recursive ) the_mutex_attr->lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES; else the_mutex_attr->lock_nesting_behavior = CORE_MUTEX_NESTING_IS_ERROR; the_mutex_attr->only_owner_release = TRUE; the_mutex_attr->priority_ceiling = 4000820c: c2 26 60 60 st %g1, [ %i1 + 0x60 ] /* * Must be initialized to unlocked. */ _CORE_mutex_Initialize( 40008210: 90 06 60 14 add %i1, 0x14, %o0 40008214: 92 06 60 54 add %i1, 0x54, %o1 40008218: 40 00 0a 8a call 4000ac40 <_CORE_mutex_Initialize> 4000821c: 94 10 20 01 mov 1, %o2 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40008220: 03 10 00 6d sethi %hi(0x4001b400), %g1 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, the_object ); 40008224: c6 06 60 08 ld [ %i1 + 8 ], %g3 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40008228: 88 10 61 24 or %g1, 0x124, %g4 4000822c: c4 11 20 10 lduh [ %g4 + 0x10 ], %g2 40008230: 03 00 00 3f sethi %hi(0xfc00), %g1 40008234: 82 10 63 ff or %g1, 0x3ff, %g1 ! ffff 40008238: 82 08 c0 01 and %g3, %g1, %g1 4000823c: 80 a0 40 02 cmp %g1, %g2 40008240: 38 80 00 06 bgu,a 40008258 40008244: c2 06 60 08 ld [ %i1 + 8 ], %g1 <== NOT EXECUTED information->local_table[ index ] = the_object; 40008248: c4 01 20 20 ld [ %g4 + 0x20 ], %g2 4000824c: 83 28 60 02 sll %g1, 2, %g1 40008250: f2 20 80 01 st %i1, [ %g2 + %g1 ] CORE_MUTEX_UNLOCKED ); _Objects_Open( &_POSIX_Mutex_Information, &the_mutex->Object, 0 ); *mutex = the_mutex->Object.id; 40008254: c2 06 60 08 ld [ %i1 + 8 ], %g1 if ( information->is_string ) /* _Objects_Copy_name_string( name, the_object->name ); */ the_object->name = name; else /* _Objects_Copy_name_raw( name, the_object->name, information->name_length ); */ the_object->name = name; 40008258: c0 26 60 0c clr [ %i1 + 0xc ] 4000825c: c2 26 00 00 st %g1, [ %i0 ] 0, /* Name not used */ 0 /* Not used */ ); #endif _Thread_Enable_dispatch(); 40008260: 7f ff ff 99 call 400080c4 <_Thread_Enable_dispatch> 40008264: b0 10 20 00 clr %i0 40008268: 81 c7 e0 08 ret 4000826c: 81 e8 00 00 restore return 0; } 40008270: 81 c7 e0 08 ret <== NOT EXECUTED 40008274: 81 e8 00 00 restore <== NOT EXECUTED 40008530 : int pthread_mutex_setprioceiling( pthread_mutex_t *mutex, int prioceiling, int *old_ceiling ) { 40008530: 9d e3 bf 90 save %sp, -112, %sp register POSIX_Mutex_Control *the_mutex; Objects_Locations location; Priority_Control the_priority; int status; if ( !old_ceiling ) 40008534: 80 a6 a0 00 cmp %i2, 0 40008538: 02 80 00 3f be 40008634 4000853c: 82 06 7f ff add %i1, -1, %g1 return EINVAL; if ( !_POSIX_Priority_Is_valid( prioceiling ) ) 40008540: 80 a0 60 fd cmp %g1, 0xfd 40008544: 18 80 00 3d bgu 40008638 40008548: a0 10 20 16 mov 0x16, %l0 /* * Must acquire the mutex before we can change it's ceiling */ status = pthread_mutex_lock( mutex ); 4000854c: 7f ff ff 4b call 40008278 40008550: 90 10 00 18 mov %i0, %o0 if ( status ) 40008554: a0 92 20 00 orcc %o0, 0, %l0 40008558: 12 80 00 38 bne 40008638 4000855c: 80 a6 20 00 cmp %i0, 0 Objects_Locations *location ) { Objects_Id *id = (Objects_Id *)mutex; ___POSIX_Mutex_Get_support( id, location ); 40008560: 02 80 00 0d be 40008594 40008564: 82 10 20 02 mov 2, %g1 40008568: c2 06 00 00 ld [ %i0 ], %g1 4000856c: 80 a0 7f ff cmp %g1, -1 40008570: 32 80 00 0c bne,a 400085a0 40008574: d2 06 00 00 ld [ %i0 ], %o1 40008578: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 4000857c: 7f ff fe df call 400080f8 <== NOT EXECUTED 40008580: 92 10 20 00 clr %o1 <== NOT EXECUTED 40008584: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40008588: 22 80 00 06 be,a 400085a0 <== NOT EXECUTED 4000858c: d2 06 00 00 ld [ %i0 ], %o1 <== NOT EXECUTED 40008590: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED 40008594: 90 10 20 00 clr %o0 <== NOT EXECUTED 40008598: 10 80 00 06 b 400085b0 <== NOT EXECUTED 4000859c: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED return (POSIX_Mutex_Control *) 400085a0: 11 10 00 6d sethi %hi(0x4001b400), %o0 400085a4: 94 07 bf f4 add %fp, -12, %o2 400085a8: 40 00 0d 8d call 4000bbdc <_Objects_Get> 400085ac: 90 12 21 24 or %o0, 0x124, %o0 return status; the_mutex = _POSIX_Mutex_Get( mutex, &location ); switch ( location ) { 400085b0: c2 07 bf f4 ld [ %fp + -12 ], %g1 400085b4: 80 a0 60 00 cmp %g1, 0 400085b8: 22 80 00 07 be,a 400085d4 400085bc: c6 02 20 60 ld [ %o0 + 0x60 ], %g3 400085c0: 80 a0 60 02 cmp %g1, 2 <== NOT EXECUTED 400085c4: 18 80 00 18 bgu 40008624 <== NOT EXECUTED 400085c8: 01 00 00 00 nop <== NOT EXECUTED #endif ); _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); 400085cc: 10 80 00 1b b 40008638 <== NOT EXECUTED 400085d0: a0 10 20 16 mov 0x16, %l0 ! 16 <== NOT EXECUTED case OBJECTS_LOCAL: *old_ceiling = _POSIX_Priority_From_core( the_mutex->Mutex.Attributes.priority_ceiling ); the_mutex->Mutex.Attributes.priority_ceiling = the_priority; _CORE_mutex_Surrender( 400085d4: d2 02 20 08 ld [ %o0 + 8 ], %o1 return EINVAL; #endif case OBJECTS_ERROR: return EINVAL; /* impossible to get here */ case OBJECTS_LOCAL: *old_ceiling = _POSIX_Priority_From_core( 400085d8: 82 10 20 ff mov 0xff, %g1 the_mutex->Mutex.Attributes.priority_ceiling ); the_mutex->Mutex.Attributes.priority_ceiling = the_priority; 400085dc: 84 20 40 19 sub %g1, %i1, %g2 return EINVAL; #endif case OBJECTS_ERROR: return EINVAL; /* impossible to get here */ case OBJECTS_LOCAL: *old_ceiling = _POSIX_Priority_From_core( 400085e0: 82 20 40 03 sub %g1, %g3, %g1 the_mutex->Mutex.Attributes.priority_ceiling ); the_mutex->Mutex.Attributes.priority_ceiling = the_priority; 400085e4: c4 22 20 60 st %g2, [ %o0 + 0x60 ] return EINVAL; #endif case OBJECTS_ERROR: return EINVAL; /* impossible to get here */ case OBJECTS_LOCAL: *old_ceiling = _POSIX_Priority_From_core( 400085e8: c2 26 80 00 st %g1, [ %i2 ] the_mutex->Mutex.Attributes.priority_ceiling ); the_mutex->Mutex.Attributes.priority_ceiling = the_priority; _CORE_mutex_Surrender( 400085ec: 94 10 20 00 clr %o2 400085f0: 40 00 09 e4 call 4000ad80 <_CORE_mutex_Surrender> 400085f4: 90 02 20 14 add %o0, 0x14, %o0 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 400085f8: 05 10 00 6c sethi %hi(0x4001b000), %g2 400085fc: c2 00 a0 c0 ld [ %g2 + 0xc0 ], %g1 ! 4001b0c0 <_Thread_Dispatch_disable_level> 40008600: 82 00 7f ff add %g1, -1, %g1 40008604: c2 20 a0 c0 st %g1, [ %g2 + 0xc0 ] 40008608: c2 00 a0 c0 ld [ %g2 + 0xc0 ], %g1 4000860c: 80 a0 60 00 cmp %g1, 0 40008610: 12 80 00 0b bne 4000863c 40008614: b0 10 00 10 mov %l0, %i0 _Thread_Dispatch(); 40008618: 40 00 12 26 call 4000ceb0 <_Thread_Dispatch> 4000861c: 01 00 00 00 nop 40008620: 30 80 00 07 b,a 4000863c #endif ); _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); 40008624: 40 00 03 09 call 40009248 <== NOT EXECUTED 40008628: 01 00 00 00 nop <== NOT EXECUTED 4000862c: 10 80 00 03 b 40008638 <== NOT EXECUTED 40008630: a0 10 00 08 mov %o0, %l0 <== NOT EXECUTED 40008634: a0 10 20 16 mov 0x16, %l0 } 40008638: b0 10 00 10 mov %l0, %i0 4000863c: 81 c7 e0 08 ret 40008640: 81 e8 00 00 restore 40008644 : int pthread_mutex_timedlock( pthread_mutex_t *mutex, const struct timespec *abstime ) { 40008644: 9d e3 bf 90 save %sp, -112, %sp * So we check the abstime provided, and hold on to whether it * is valid or not. If it isn't correct and in the future, * then we do a polling operation and convert the UNSATISFIED * status into the appropriate error. */ status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks ); 40008648: 90 10 00 19 mov %i1, %o0 4000864c: 40 00 00 4b call 40008778 <_POSIX_Absolute_timeout_to_ticks> 40008650: 92 07 bf f4 add %fp, -12, %o1 switch ( status ) { 40008654: 80 a2 20 02 cmp %o0, 2 40008658: 28 80 00 07 bleu,a 40008674 4000865c: b2 10 20 00 clr %i1 <== NOT EXECUTED 40008660: 80 a2 20 03 cmp %o0, 3 40008664: 22 80 00 04 be,a 40008674 40008668: b2 10 20 01 mov 1, %i1 case POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE: do_wait = TRUE; break; } lock_status = _POSIX_Mutex_Lock_support( 4000866c: 10 80 00 03 b 40008678 <== NOT EXECUTED 40008670: d4 07 bf f4 ld [ %fp + -12 ], %o2 <== NOT EXECUTED 40008674: d4 07 bf f4 ld [ %fp + -12 ], %o2 40008678: 90 10 00 18 mov %i0, %o0 4000867c: 7f ff ff 05 call 40008290 <_POSIX_Mutex_Lock_support> 40008680: 92 10 00 19 mov %i1, %o1 break; } } return lock_status; } 40008684: 81 c7 e0 08 ret 40008688: 91 e8 00 08 restore %g0, %o0, %o0 400086a4 : */ int pthread_mutex_unlock( pthread_mutex_t *mutex ) { 400086a4: 9d e3 bf 90 save %sp, -112, %sp Objects_Locations *location ) { Objects_Id *id = (Objects_Id *)mutex; ___POSIX_Mutex_Get_support( id, location ); 400086a8: 80 a6 20 00 cmp %i0, 0 400086ac: 02 80 00 0d be 400086e0 400086b0: 82 10 20 02 mov 2, %g1 400086b4: c2 06 00 00 ld [ %i0 ], %g1 400086b8: 80 a0 7f ff cmp %g1, -1 400086bc: 32 80 00 0c bne,a 400086ec 400086c0: d2 06 00 00 ld [ %i0 ], %o1 400086c4: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 400086c8: 7f ff fe 8c call 400080f8 <== NOT EXECUTED 400086cc: 92 10 20 00 clr %o1 <== NOT EXECUTED 400086d0: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400086d4: 22 80 00 06 be,a 400086ec <== NOT EXECUTED 400086d8: d2 06 00 00 ld [ %i0 ], %o1 <== NOT EXECUTED 400086dc: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED 400086e0: 90 10 20 00 clr %o0 <== NOT EXECUTED 400086e4: 10 80 00 06 b 400086fc <== NOT EXECUTED 400086e8: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED return (POSIX_Mutex_Control *) 400086ec: 11 10 00 6d sethi %hi(0x4001b400), %o0 400086f0: 94 07 bf f4 add %fp, -12, %o2 400086f4: 40 00 0d 3a call 4000bbdc <_Objects_Get> 400086f8: 90 12 21 24 or %o0, 0x124, %o0 register POSIX_Mutex_Control *the_mutex; Objects_Locations location; CORE_mutex_Status status; the_mutex = _POSIX_Mutex_Get( mutex, &location ); switch ( location ) { 400086fc: c2 07 bf f4 ld [ %fp + -12 ], %g1 40008700: 80 a0 60 00 cmp %g1, 0 40008704: 22 80 00 06 be,a 4000871c 40008708: d2 02 20 08 ld [ %o0 + 8 ], %o1 4000870c: 80 a0 60 02 cmp %g1, 2 40008710: 08 80 00 17 bleu 4000876c 40008714: 90 10 20 16 mov 0x16, %o0 40008718: 30 80 00 13 b,a 40008764 <== NOT EXECUTED ); #endif case OBJECTS_ERROR: return EINVAL; case OBJECTS_LOCAL: status = _CORE_mutex_Surrender( 4000871c: 94 10 20 00 clr %o2 40008720: 40 00 09 98 call 4000ad80 <_CORE_mutex_Surrender> 40008724: 90 02 20 14 add %o0, 0x14, %o0 40008728: b0 10 00 08 mov %o0, %i0 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 4000872c: 03 10 00 6c sethi %hi(0x4001b000), %g1 40008730: c4 00 60 c0 ld [ %g1 + 0xc0 ], %g2 ! 4001b0c0 <_Thread_Dispatch_disable_level> 40008734: 84 00 bf ff add %g2, -1, %g2 40008738: c4 20 60 c0 st %g2, [ %g1 + 0xc0 ] 4000873c: c2 00 60 c0 ld [ %g1 + 0xc0 ], %g1 40008740: 80 a0 60 00 cmp %g1, 0 40008744: 12 80 00 04 bne 40008754 40008748: 01 00 00 00 nop _Thread_Dispatch(); 4000874c: 40 00 11 d9 call 4000ceb0 <_Thread_Dispatch> 40008750: 01 00 00 00 nop #else NULL #endif ); _Thread_Enable_dispatch(); return _POSIX_Mutex_From_core_mutex_status( status ); 40008754: 40 00 1f 19 call 400103b8 <_POSIX_Mutex_From_core_mutex_status> 40008758: 90 10 00 18 mov %i0, %o0 break; } return POSIX_BOTTOM_REACHED(); } 4000875c: 81 c7 e0 08 ret 40008760: 91 e8 00 08 restore %g0, %o0, %o0 ); _Thread_Enable_dispatch(); return _POSIX_Mutex_From_core_mutex_status( status ); break; } return POSIX_BOTTOM_REACHED(); 40008764: 40 00 02 b9 call 40009248 <== NOT EXECUTED 40008768: 01 00 00 00 nop <== NOT EXECUTED } 4000876c: b0 10 00 08 mov %o0, %i0 40008770: 81 c7 e0 08 ret 40008774: 81 e8 00 00 restore 40006bf4 : */ int pthread_rwlock_destroy( pthread_rwlock_t *rwlock ) { 40006bf4: 9d e3 bf 90 save %sp, -112, %sp POSIX_RWLock_Control *the_rwlock = NULL; Objects_Locations location; if ( !rwlock ) 40006bf8: 80 a6 20 00 cmp %i0, 0 40006bfc: 02 80 00 2d be 40006cb0 40006c00: 21 10 00 76 sethi %hi(0x4001d800), %l0 RTEMS_INLINE_ROUTINE POSIX_RWLock_Control *_POSIX_RWLock_Get ( pthread_rwlock_t *RWLock, Objects_Locations *location ) { return (POSIX_RWLock_Control *) _Objects_Get( 40006c04: d2 06 00 00 ld [ %i0 ], %o1 40006c08: 94 07 bf f4 add %fp, -12, %o2 40006c0c: 40 00 0e f6 call 4000a7e4 <_Objects_Get> 40006c10: 90 14 23 6c or %l0, 0x36c, %o0 return EINVAL; the_rwlock = _POSIX_RWLock_Get( rwlock, &location ); switch ( location ) { 40006c14: c2 07 bf f4 ld [ %fp + -12 ], %g1 40006c18: 80 a0 60 00 cmp %g1, 0 40006c1c: 02 80 00 07 be 40006c38 40006c20: b0 10 00 08 mov %o0, %i0 40006c24: 80 a0 60 02 cmp %g1, 2 40006c28: 18 80 00 1e bgu 40006ca0 40006c2c: 90 10 20 16 mov 0x16, %o0 _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); } 40006c30: 81 c7 e0 08 ret 40006c34: 91 e8 00 08 restore %g0, %o0, %o0 case OBJECTS_LOCAL: /* * If there is at least one thread waiting, then do not delete it. */ if ( _Thread_queue_First( &the_rwlock->RWLock.Wait_queue ) != NULL ) { 40006c38: 40 00 16 2e call 4000c4f0 <_Thread_queue_First> 40006c3c: 90 02 20 10 add %o0, 0x10, %o0 40006c40: 80 a2 20 00 cmp %o0, 0 40006c44: 22 80 00 06 be,a 40006c5c 40006c48: 90 14 23 6c or %l0, 0x36c, %o0 _Thread_Enable_dispatch(); 40006c4c: 7f ff ff dd call 40006bc0 <_Thread_Enable_dispatch> 40006c50: 01 00 00 00 nop 40006c54: 10 80 00 18 b 40006cb4 40006c58: 90 10 20 10 mov 0x10, %o0 ! 10 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); 40006c5c: c2 06 20 08 ld [ %i0 + 8 ], %g1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40006c60: c6 12 20 10 lduh [ %o0 + 0x10 ], %g3 40006c64: 05 00 00 3f sethi %hi(0xfc00), %g2 40006c68: 84 10 a3 ff or %g2, 0x3ff, %g2 ! ffff 40006c6c: 82 08 40 02 and %g1, %g2, %g1 40006c70: 80 a0 40 03 cmp %g1, %g3 40006c74: 18 80 00 05 bgu 40006c88 40006c78: 92 10 00 18 mov %i0, %o1 information->local_table[ index ] = the_object; 40006c7c: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 40006c80: 83 28 60 02 sll %g1, 2, %g1 40006c84: c0 20 80 01 clr [ %g2 + %g1 ] */ RTEMS_INLINE_ROUTINE void _POSIX_RWLock_Free ( POSIX_RWLock_Control *the_RWLock ) { _Objects_Free( &_POSIX_RWLock_Information, &the_RWLock->Object ); 40006c88: 40 00 0e 95 call 4000a6dc <_Objects_Free> 40006c8c: c0 26 20 0c clr [ %i0 + 0xc ] _Objects_Close( &_POSIX_RWLock_Information, &the_rwlock->Object ); _POSIX_RWLock_Free( the_rwlock ); _Thread_Enable_dispatch(); 40006c90: 7f ff ff cc call 40006bc0 <_Thread_Enable_dispatch> 40006c94: 01 00 00 00 nop 40006c98: 10 80 00 07 b 40006cb4 40006c9c: 90 10 20 00 clr %o0 ! 0 return 0; } return POSIX_BOTTOM_REACHED(); 40006ca0: 40 00 03 73 call 40007a6c <== NOT EXECUTED 40006ca4: 01 00 00 00 nop <== NOT EXECUTED } 40006ca8: 81 c7 e0 08 ret <== NOT EXECUTED 40006cac: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); 40006cb0: 90 10 20 16 mov 0x16, %o0 } 40006cb4: b0 10 00 08 mov %o0, %i0 40006cb8: 81 c7 e0 08 ret 40006cbc: 81 e8 00 00 restore 40006cf4 : int pthread_rwlock_init( pthread_rwlock_t *rwlock, const pthread_rwlockattr_t *attr ) { 40006cf4: 9d e3 bf 88 save %sp, -120, %sp const pthread_rwlockattr_t *the_attr; /* * Error check parameters */ if ( !rwlock ) 40006cf8: 80 a6 20 00 cmp %i0, 0 40006cfc: 02 80 00 32 be 40006dc4 40006d00: a0 10 00 19 mov %i1, %l0 return EINVAL; /* * If the user passed in NULL, use the default attributes */ if ( attr ) { 40006d04: 80 a6 60 00 cmp %i1, 0 40006d08: 32 80 00 06 bne,a 40006d20 40006d0c: c2 04 00 00 ld [ %l0 ], %g1 the_attr = attr; } else { (void) pthread_rwlockattr_init( &default_attr ); 40006d10: a0 07 bf ec add %fp, -20, %l0 <== NOT EXECUTED 40006d14: 40 00 03 2c call 400079c4 <== NOT EXECUTED 40006d18: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED } /* * Now start error checking the attributes that we are going to use */ if ( !the_attr->is_initialized ) 40006d1c: c2 04 00 00 ld [ %l0 ], %g1 <== NOT EXECUTED 40006d20: 80 a0 60 00 cmp %g1, 0 40006d24: 02 80 00 28 be 40006dc4 40006d28: 01 00 00 00 nop return EINVAL; switch ( the_attr->process_shared ) { 40006d2c: c2 04 20 04 ld [ %l0 + 4 ], %g1 40006d30: 80 a0 60 00 cmp %g1, 0 40006d34: 12 80 00 24 bne 40006dc4 40006d38: 05 10 00 76 sethi %hi(0x4001d800), %g2 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40006d3c: c2 00 a0 d0 ld [ %g2 + 0xd0 ], %g1 ! 4001d8d0 <_Thread_Dispatch_disable_level> 40006d40: 82 00 60 01 inc %g1 40006d44: c2 20 a0 d0 st %g1, [ %g2 + 0xd0 ] * This function allocates a RWLock control block from * the inactive chain of free RWLock control blocks. */ RTEMS_INLINE_ROUTINE POSIX_RWLock_Control *_POSIX_RWLock_Allocate( void ) { return (POSIX_RWLock_Control *) 40006d48: 33 10 00 76 sethi %hi(0x4001d800), %i1 40006d4c: 40 00 0d 62 call 4000a2d4 <_Objects_Allocate> 40006d50: 90 16 63 6c or %i1, 0x36c, %o0 ! 4001db6c <_POSIX_RWLock_Information> */ _Thread_Disable_dispatch(); /* prevents deletion */ the_rwlock = _POSIX_RWLock_Allocate(); if ( !the_rwlock ) { 40006d54: a0 92 20 00 orcc %o0, 0, %l0 40006d58: 12 80 00 06 bne 40006d70 40006d5c: 90 04 20 10 add %l0, 0x10, %o0 _Thread_Enable_dispatch(); 40006d60: 7f ff ff d8 call 40006cc0 <_Thread_Enable_dispatch> 40006d64: b0 10 20 0b mov 0xb, %i0 40006d68: 81 c7 e0 08 ret 40006d6c: 81 e8 00 00 restore return EAGAIN; } _CORE_RWLock_Initialize( &the_rwlock->RWLock, &the_attributes ); 40006d70: 40 00 0a 95 call 400097c4 <_CORE_RWLock_Initialize> 40006d74: 92 07 bf f4 add %fp, -12, %o1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40006d78: 90 16 63 6c or %i1, 0x36c, %o0 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, the_object ); 40006d7c: c2 04 20 08 ld [ %l0 + 8 ], %g1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40006d80: c6 12 20 10 lduh [ %o0 + 0x10 ], %g3 40006d84: 05 00 00 3f sethi %hi(0xfc00), %g2 40006d88: 84 10 a3 ff or %g2, 0x3ff, %g2 ! ffff 40006d8c: 82 08 40 02 and %g1, %g2, %g1 40006d90: 80 a0 40 03 cmp %g1, %g3 40006d94: 38 80 00 06 bgu,a 40006dac 40006d98: c2 04 20 08 ld [ %l0 + 8 ], %g1 <== NOT EXECUTED information->local_table[ index ] = the_object; 40006d9c: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 40006da0: 83 28 60 02 sll %g1, 2, %g1 40006da4: e0 20 80 01 st %l0, [ %g2 + %g1 ] &_POSIX_RWLock_Information, &the_rwlock->Object, 0 ); *rwlock = the_rwlock->Object.id; 40006da8: c2 04 20 08 ld [ %l0 + 8 ], %g1 if ( information->is_string ) /* _Objects_Copy_name_string( name, the_object->name ); */ the_object->name = name; else /* _Objects_Copy_name_raw( name, the_object->name, information->name_length ); */ the_object->name = name; 40006dac: c0 24 20 0c clr [ %l0 + 0xc ] 40006db0: c2 26 00 00 st %g1, [ %i0 ] _Thread_Enable_dispatch(); 40006db4: 7f ff ff c3 call 40006cc0 <_Thread_Enable_dispatch> 40006db8: b0 10 20 00 clr %i0 40006dbc: 81 c7 e0 08 ret 40006dc0: 81 e8 00 00 restore return 0; } 40006dc4: 81 c7 e0 08 ret 40006dc8: 91 e8 20 16 restore %g0, 0x16, %o0 40006dcc : */ int pthread_rwlock_rdlock( pthread_rwlock_t *rwlock ) { 40006dcc: 9d e3 bf 90 save %sp, -112, %sp POSIX_RWLock_Control *the_rwlock; Objects_Locations location; if ( !rwlock ) 40006dd0: 80 a6 20 00 cmp %i0, 0 40006dd4: 02 80 00 28 be 40006e74 40006dd8: 11 10 00 76 sethi %hi(0x4001d800), %o0 RTEMS_INLINE_ROUTINE POSIX_RWLock_Control *_POSIX_RWLock_Get ( pthread_rwlock_t *RWLock, Objects_Locations *location ) { return (POSIX_RWLock_Control *) _Objects_Get( 40006ddc: d2 06 00 00 ld [ %i0 ], %o1 40006de0: 94 07 bf f4 add %fp, -12, %o2 40006de4: 40 00 0e 80 call 4000a7e4 <_Objects_Get> 40006de8: 90 12 23 6c or %o0, 0x36c, %o0 return EINVAL; the_rwlock = _POSIX_RWLock_Get( rwlock, &location ); switch ( location ) { 40006dec: c2 07 bf f4 ld [ %fp + -12 ], %g1 40006df0: 80 a0 60 00 cmp %g1, 0 40006df4: 22 80 00 07 be,a 40006e10 40006df8: d2 06 00 00 ld [ %i0 ], %o1 40006dfc: 80 a0 60 02 cmp %g1, 2 40006e00: 18 80 00 19 bgu 40006e64 40006e04: 90 10 20 16 mov 0x16, %o0 (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); } 40006e08: 81 c7 e0 08 ret 40006e0c: 91 e8 00 08 restore %g0, %o0, %o0 case OBJECTS_ERROR: return EINVAL; case OBJECTS_LOCAL: _CORE_RWLock_Obtain_for_reading( 40006e10: 90 02 20 10 add %o0, 0x10, %o0 40006e14: 94 10 20 01 mov 1, %o2 40006e18: 96 10 20 00 clr %o3 40006e1c: 40 00 0a 75 call 400097f0 <_CORE_RWLock_Obtain_for_reading> 40006e20: 98 10 20 00 clr %o4 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40006e24: 03 10 00 76 sethi %hi(0x4001d800), %g1 40006e28: c4 00 60 d0 ld [ %g1 + 0xd0 ], %g2 ! 4001d8d0 <_Thread_Dispatch_disable_level> 40006e2c: 84 00 bf ff add %g2, -1, %g2 40006e30: c4 20 60 d0 st %g2, [ %g1 + 0xd0 ] 40006e34: c2 00 60 d0 ld [ %g1 + 0xd0 ], %g1 40006e38: 80 a0 60 00 cmp %g1, 0 40006e3c: 12 80 00 05 bne 40006e50 40006e40: 03 10 00 76 sethi %hi(0x4001d800), %g1 _Thread_Dispatch(); 40006e44: 40 00 13 1d call 4000bab8 <_Thread_Dispatch> 40006e48: 01 00 00 00 nop 0, NULL ); _Thread_Enable_dispatch(); return _POSIX_RWLock_Translate_core_RWLock_return_code( 40006e4c: 03 10 00 76 sethi %hi(0x4001d800), %g1 40006e50: c2 00 61 ac ld [ %g1 + 0x1ac ], %g1 ! 4001d9ac <_Thread_Executing> 40006e54: 40 00 00 9a call 400070bc <_POSIX_RWLock_Translate_core_RWLock_return_code> 40006e58: d0 00 60 34 ld [ %g1 + 0x34 ], %o0 (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); } 40006e5c: 81 c7 e0 08 ret 40006e60: 91 e8 00 08 restore %g0, %o0, %o0 return _POSIX_RWLock_Translate_core_RWLock_return_code( (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); 40006e64: 40 00 03 02 call 40007a6c <== NOT EXECUTED 40006e68: 01 00 00 00 nop <== NOT EXECUTED } 40006e6c: 81 c7 e0 08 ret <== NOT EXECUTED 40006e70: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED return _POSIX_RWLock_Translate_core_RWLock_return_code( (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); 40006e74: 90 10 20 16 mov 0x16, %o0 } 40006e78: b0 10 00 08 mov %o0, %i0 40006e7c: 81 c7 e0 08 ret 40006e80: 81 e8 00 00 restore 40006e84 : int pthread_rwlock_timedrdlock( pthread_rwlock_t *rwlock, const struct timespec *abstime ) { 40006e84: 9d e3 bf 90 save %sp, -112, %sp Objects_Locations location; Watchdog_Interval ticks; boolean do_wait; POSIX_Absolute_timeout_conversion_results_t status; if ( !rwlock ) 40006e88: 80 a6 20 00 cmp %i0, 0 40006e8c: 02 80 00 41 be 40006f90 40006e90: 90 10 00 19 mov %i1, %o0 * So we check the abstime provided, and hold on to whether it * is valid or not. If it isn't correct and in the future, * then we do a polling operation and convert the UNSATISFIED * status into the appropriate error. */ status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks ); 40006e94: 40 00 20 fc call 4000f284 <_POSIX_Absolute_timeout_to_ticks> 40006e98: 92 07 bf f0 add %fp, -16, %o1 switch (status) { 40006e9c: 80 a2 20 02 cmp %o0, 2 40006ea0: 08 80 00 07 bleu 40006ebc 40006ea4: b2 10 00 08 mov %o0, %i1 40006ea8: 80 a2 20 03 cmp %o0, 3 40006eac: 22 80 00 05 be,a 40006ec0 40006eb0: a0 10 20 01 mov 1, %l0 40006eb4: 10 80 00 04 b 40006ec4 <== NOT EXECUTED 40006eb8: d2 06 00 00 ld [ %i0 ], %o1 <== NOT EXECUTED 40006ebc: a0 10 20 00 clr %l0 40006ec0: d2 06 00 00 ld [ %i0 ], %o1 40006ec4: 11 10 00 76 sethi %hi(0x4001d800), %o0 40006ec8: 94 07 bf f4 add %fp, -12, %o2 40006ecc: 40 00 0e 46 call 4000a7e4 <_Objects_Get> 40006ed0: 90 12 23 6c or %o0, 0x36c, %o0 do_wait = TRUE; break; } the_rwlock = _POSIX_RWLock_Get( rwlock, &location ); switch ( location ) { 40006ed4: c2 07 bf f4 ld [ %fp + -12 ], %g1 40006ed8: 80 a0 60 00 cmp %g1, 0 40006edc: 22 80 00 07 be,a 40006ef8 40006ee0: d2 06 00 00 ld [ %i0 ], %o1 40006ee4: 80 a0 60 02 cmp %g1, 2 40006ee8: 18 80 00 26 bgu 40006f80 40006eec: 90 10 20 16 mov 0x16, %o0 (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); } 40006ef0: 81 c7 e0 08 ret 40006ef4: 91 e8 00 08 restore %g0, %o0, %o0 case OBJECTS_ERROR: return EINVAL; case OBJECTS_LOCAL: _CORE_RWLock_Obtain_for_reading( 40006ef8: d6 07 bf f0 ld [ %fp + -16 ], %o3 40006efc: 90 02 20 10 add %o0, 0x10, %o0 40006f00: 94 10 00 10 mov %l0, %o2 40006f04: 40 00 0a 3b call 400097f0 <_CORE_RWLock_Obtain_for_reading> 40006f08: 98 10 20 00 clr %o4 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40006f0c: 03 10 00 76 sethi %hi(0x4001d800), %g1 40006f10: c4 00 60 d0 ld [ %g1 + 0xd0 ], %g2 ! 4001d8d0 <_Thread_Dispatch_disable_level> 40006f14: 84 00 bf ff add %g2, -1, %g2 40006f18: c4 20 60 d0 st %g2, [ %g1 + 0xd0 ] 40006f1c: c2 00 60 d0 ld [ %g1 + 0xd0 ], %g1 40006f20: 80 a0 60 00 cmp %g1, 0 40006f24: 12 80 00 05 bne 40006f38 40006f28: 80 a4 20 00 cmp %l0, 0 _Thread_Dispatch(); 40006f2c: 40 00 12 e3 call 4000bab8 <_Thread_Dispatch> 40006f30: 01 00 00 00 nop ticks, NULL ); _Thread_Enable_dispatch(); if ( !do_wait && 40006f34: 80 a4 20 00 cmp %l0, 0 40006f38: 12 80 00 0c bne 40006f68 40006f3c: 03 10 00 76 sethi %hi(0x4001d800), %g1 40006f40: c2 00 61 ac ld [ %g1 + 0x1ac ], %g1 ! 4001d9ac <_Thread_Executing> <== NOT EXECUTED 40006f44: c2 00 60 34 ld [ %g1 + 0x34 ], %g1 <== NOT EXECUTED 40006f48: 80 a0 60 02 cmp %g1, 2 <== NOT EXECUTED 40006f4c: 12 80 00 07 bne 40006f68 <== NOT EXECUTED 40006f50: 80 a6 60 00 cmp %i1, 0 <== NOT EXECUTED (_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) { switch (status) { 40006f54: 02 80 00 10 be 40006f94 <== NOT EXECUTED 40006f58: 90 10 20 16 mov 0x16, %o0 <== NOT EXECUTED 40006f5c: 80 a6 60 02 cmp %i1, 2 <== NOT EXECUTED 40006f60: 08 80 00 0d bleu 40006f94 <== NOT EXECUTED 40006f64: 90 10 20 74 mov 0x74, %o0 <== NOT EXECUTED case POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE: break; } } return _POSIX_RWLock_Translate_core_RWLock_return_code( 40006f68: 03 10 00 76 sethi %hi(0x4001d800), %g1 40006f6c: c2 00 61 ac ld [ %g1 + 0x1ac ], %g1 ! 4001d9ac <_Thread_Executing> 40006f70: 40 00 00 53 call 400070bc <_POSIX_RWLock_Translate_core_RWLock_return_code> 40006f74: d0 00 60 34 ld [ %g1 + 0x34 ], %o0 (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); } 40006f78: 81 c7 e0 08 ret 40006f7c: 91 e8 00 08 restore %g0, %o0, %o0 return _POSIX_RWLock_Translate_core_RWLock_return_code( (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); 40006f80: 40 00 02 bb call 40007a6c <== NOT EXECUTED 40006f84: 01 00 00 00 nop <== NOT EXECUTED } 40006f88: 81 c7 e0 08 ret <== NOT EXECUTED 40006f8c: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED return _POSIX_RWLock_Translate_core_RWLock_return_code( (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); 40006f90: 90 10 20 16 mov 0x16, %o0 } 40006f94: b0 10 00 08 mov %o0, %i0 40006f98: 81 c7 e0 08 ret 40006f9c: 81 e8 00 00 restore 40006fa0 : int pthread_rwlock_timedwrlock( pthread_rwlock_t *rwlock, const struct timespec *abstime ) { 40006fa0: 9d e3 bf 90 save %sp, -112, %sp Objects_Locations location; Watchdog_Interval ticks; boolean do_wait; POSIX_Absolute_timeout_conversion_results_t status; if ( !rwlock ) 40006fa4: 80 a6 20 00 cmp %i0, 0 40006fa8: 02 80 00 41 be 400070ac 40006fac: 90 10 00 19 mov %i1, %o0 * So we check the abstime provided, and hold on to whether it * is valid or not. If it isn't correct and in the future, * then we do a polling operation and convert the UNSATISFIED * status into the appropriate error. */ status = _POSIX_Absolute_timeout_to_ticks( abstime, &ticks ); 40006fb0: 40 00 20 b5 call 4000f284 <_POSIX_Absolute_timeout_to_ticks> 40006fb4: 92 07 bf f0 add %fp, -16, %o1 switch (status) { 40006fb8: 80 a2 20 02 cmp %o0, 2 40006fbc: 08 80 00 07 bleu 40006fd8 40006fc0: b2 10 00 08 mov %o0, %i1 40006fc4: 80 a2 20 03 cmp %o0, 3 40006fc8: 22 80 00 05 be,a 40006fdc 40006fcc: a0 10 20 01 mov 1, %l0 40006fd0: 10 80 00 04 b 40006fe0 <== NOT EXECUTED 40006fd4: d2 06 00 00 ld [ %i0 ], %o1 <== NOT EXECUTED 40006fd8: a0 10 20 00 clr %l0 40006fdc: d2 06 00 00 ld [ %i0 ], %o1 40006fe0: 11 10 00 76 sethi %hi(0x4001d800), %o0 40006fe4: 94 07 bf f4 add %fp, -12, %o2 40006fe8: 40 00 0d ff call 4000a7e4 <_Objects_Get> 40006fec: 90 12 23 6c or %o0, 0x36c, %o0 do_wait = TRUE; break; } the_rwlock = _POSIX_RWLock_Get( rwlock, &location ); switch ( location ) { 40006ff0: c2 07 bf f4 ld [ %fp + -12 ], %g1 40006ff4: 80 a0 60 00 cmp %g1, 0 40006ff8: 22 80 00 07 be,a 40007014 40006ffc: d2 06 00 00 ld [ %i0 ], %o1 40007000: 80 a0 60 02 cmp %g1, 2 40007004: 18 80 00 26 bgu 4000709c 40007008: 90 10 20 16 mov 0x16, %o0 (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); } 4000700c: 81 c7 e0 08 ret 40007010: 91 e8 00 08 restore %g0, %o0, %o0 case OBJECTS_ERROR: return EINVAL; case OBJECTS_LOCAL: _CORE_RWLock_Obtain_for_writing( 40007014: d6 07 bf f0 ld [ %fp + -16 ], %o3 40007018: 90 02 20 10 add %o0, 0x10, %o0 4000701c: 94 10 00 10 mov %l0, %o2 40007020: 40 00 0a 28 call 400098c0 <_CORE_RWLock_Obtain_for_writing> 40007024: 98 10 20 00 clr %o4 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40007028: 03 10 00 76 sethi %hi(0x4001d800), %g1 4000702c: c4 00 60 d0 ld [ %g1 + 0xd0 ], %g2 ! 4001d8d0 <_Thread_Dispatch_disable_level> 40007030: 84 00 bf ff add %g2, -1, %g2 40007034: c4 20 60 d0 st %g2, [ %g1 + 0xd0 ] 40007038: c2 00 60 d0 ld [ %g1 + 0xd0 ], %g1 4000703c: 80 a0 60 00 cmp %g1, 0 40007040: 12 80 00 05 bne 40007054 40007044: 80 a4 20 00 cmp %l0, 0 _Thread_Dispatch(); 40007048: 40 00 12 9c call 4000bab8 <_Thread_Dispatch> 4000704c: 01 00 00 00 nop ticks, NULL ); _Thread_Enable_dispatch(); if ( !do_wait && 40007050: 80 a4 20 00 cmp %l0, 0 40007054: 12 80 00 0c bne 40007084 40007058: 03 10 00 76 sethi %hi(0x4001d800), %g1 4000705c: c2 00 61 ac ld [ %g1 + 0x1ac ], %g1 ! 4001d9ac <_Thread_Executing> <== NOT EXECUTED 40007060: c2 00 60 34 ld [ %g1 + 0x34 ], %g1 <== NOT EXECUTED 40007064: 80 a0 60 02 cmp %g1, 2 <== NOT EXECUTED 40007068: 12 80 00 07 bne 40007084 <== NOT EXECUTED 4000706c: 80 a6 60 00 cmp %i1, 0 <== NOT EXECUTED (_Thread_Executing->Wait.return_code == CORE_RWLOCK_UNAVAILABLE) ) { switch (status) { 40007070: 02 80 00 10 be 400070b0 <== NOT EXECUTED 40007074: 90 10 20 16 mov 0x16, %o0 <== NOT EXECUTED 40007078: 80 a6 60 02 cmp %i1, 2 <== NOT EXECUTED 4000707c: 08 80 00 0d bleu 400070b0 <== NOT EXECUTED 40007080: 90 10 20 74 mov 0x74, %o0 <== NOT EXECUTED case POSIX_ABSOLUTE_TIMEOUT_IS_IN_FUTURE: break; } } return _POSIX_RWLock_Translate_core_RWLock_return_code( 40007084: 03 10 00 76 sethi %hi(0x4001d800), %g1 40007088: c2 00 61 ac ld [ %g1 + 0x1ac ], %g1 ! 4001d9ac <_Thread_Executing> 4000708c: 40 00 00 0c call 400070bc <_POSIX_RWLock_Translate_core_RWLock_return_code> 40007090: d0 00 60 34 ld [ %g1 + 0x34 ], %o0 (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); } 40007094: 81 c7 e0 08 ret 40007098: 91 e8 00 08 restore %g0, %o0, %o0 return _POSIX_RWLock_Translate_core_RWLock_return_code( (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); 4000709c: 40 00 02 74 call 40007a6c <== NOT EXECUTED 400070a0: 01 00 00 00 nop <== NOT EXECUTED } 400070a4: 81 c7 e0 08 ret <== NOT EXECUTED 400070a8: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED return _POSIX_RWLock_Translate_core_RWLock_return_code( (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); 400070ac: 90 10 20 16 mov 0x16, %o0 } 400070b0: b0 10 00 08 mov %o0, %i0 400070b4: 81 c7 e0 08 ret 400070b8: 81 e8 00 00 restore 400070e4 : */ int pthread_rwlock_tryrdlock( pthread_rwlock_t *rwlock ) { 400070e4: 9d e3 bf 90 save %sp, -112, %sp POSIX_RWLock_Control *the_rwlock; Objects_Locations location; if ( !rwlock ) 400070e8: 80 a6 20 00 cmp %i0, 0 400070ec: 02 80 00 28 be 4000718c 400070f0: 11 10 00 76 sethi %hi(0x4001d800), %o0 400070f4: d2 06 00 00 ld [ %i0 ], %o1 400070f8: 94 07 bf f4 add %fp, -12, %o2 400070fc: 40 00 0d ba call 4000a7e4 <_Objects_Get> 40007100: 90 12 23 6c or %o0, 0x36c, %o0 return EINVAL; the_rwlock = _POSIX_RWLock_Get( rwlock, &location ); switch ( location ) { 40007104: c2 07 bf f4 ld [ %fp + -12 ], %g1 40007108: 80 a0 60 00 cmp %g1, 0 4000710c: 22 80 00 07 be,a 40007128 40007110: d2 06 00 00 ld [ %i0 ], %o1 40007114: 80 a0 60 02 cmp %g1, 2 40007118: 18 80 00 19 bgu 4000717c 4000711c: 90 10 20 16 mov 0x16, %o0 (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); } 40007120: 81 c7 e0 08 ret 40007124: 91 e8 00 08 restore %g0, %o0, %o0 case OBJECTS_ERROR: return EINVAL; case OBJECTS_LOCAL: _CORE_RWLock_Obtain_for_reading( 40007128: 90 02 20 10 add %o0, 0x10, %o0 4000712c: 94 10 20 00 clr %o2 40007130: 96 10 20 00 clr %o3 40007134: 40 00 09 af call 400097f0 <_CORE_RWLock_Obtain_for_reading> 40007138: 98 10 20 00 clr %o4 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 4000713c: 03 10 00 76 sethi %hi(0x4001d800), %g1 40007140: c4 00 60 d0 ld [ %g1 + 0xd0 ], %g2 ! 4001d8d0 <_Thread_Dispatch_disable_level> 40007144: 84 00 bf ff add %g2, -1, %g2 40007148: c4 20 60 d0 st %g2, [ %g1 + 0xd0 ] 4000714c: c2 00 60 d0 ld [ %g1 + 0xd0 ], %g1 40007150: 80 a0 60 00 cmp %g1, 0 40007154: 12 80 00 05 bne 40007168 40007158: 03 10 00 76 sethi %hi(0x4001d800), %g1 _Thread_Dispatch(); 4000715c: 40 00 12 57 call 4000bab8 <_Thread_Dispatch> 40007160: 01 00 00 00 nop NULL ); _Thread_Enable_dispatch(); return _POSIX_RWLock_Translate_core_RWLock_return_code( 40007164: 03 10 00 76 sethi %hi(0x4001d800), %g1 40007168: c2 00 61 ac ld [ %g1 + 0x1ac ], %g1 ! 4001d9ac <_Thread_Executing> 4000716c: 7f ff ff d4 call 400070bc <_POSIX_RWLock_Translate_core_RWLock_return_code> 40007170: d0 00 60 34 ld [ %g1 + 0x34 ], %o0 (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); } 40007174: 81 c7 e0 08 ret 40007178: 91 e8 00 08 restore %g0, %o0, %o0 return _POSIX_RWLock_Translate_core_RWLock_return_code( (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); 4000717c: 40 00 02 3c call 40007a6c <== NOT EXECUTED 40007180: 01 00 00 00 nop <== NOT EXECUTED } 40007184: 81 c7 e0 08 ret <== NOT EXECUTED 40007188: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED return _POSIX_RWLock_Translate_core_RWLock_return_code( (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); 4000718c: 90 10 20 16 mov 0x16, %o0 } 40007190: b0 10 00 08 mov %o0, %i0 40007194: 81 c7 e0 08 ret 40007198: 81 e8 00 00 restore 4000719c : */ int pthread_rwlock_trywrlock( pthread_rwlock_t *rwlock ) { 4000719c: 9d e3 bf 90 save %sp, -112, %sp POSIX_RWLock_Control *the_rwlock; Objects_Locations location; if ( !rwlock ) 400071a0: 80 a6 20 00 cmp %i0, 0 400071a4: 02 80 00 28 be 40007244 400071a8: 11 10 00 76 sethi %hi(0x4001d800), %o0 400071ac: d2 06 00 00 ld [ %i0 ], %o1 400071b0: 94 07 bf f4 add %fp, -12, %o2 400071b4: 40 00 0d 8c call 4000a7e4 <_Objects_Get> 400071b8: 90 12 23 6c or %o0, 0x36c, %o0 return EINVAL; the_rwlock = _POSIX_RWLock_Get( rwlock, &location ); switch ( location ) { 400071bc: c2 07 bf f4 ld [ %fp + -12 ], %g1 400071c0: 80 a0 60 00 cmp %g1, 0 400071c4: 22 80 00 07 be,a 400071e0 400071c8: d2 06 00 00 ld [ %i0 ], %o1 400071cc: 80 a0 60 02 cmp %g1, 2 400071d0: 18 80 00 19 bgu 40007234 400071d4: 90 10 20 16 mov 0x16, %o0 (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); } 400071d8: 81 c7 e0 08 ret 400071dc: 91 e8 00 08 restore %g0, %o0, %o0 case OBJECTS_ERROR: return EINVAL; case OBJECTS_LOCAL: _CORE_RWLock_Obtain_for_writing( 400071e0: 90 02 20 10 add %o0, 0x10, %o0 400071e4: 94 10 20 00 clr %o2 400071e8: 96 10 20 00 clr %o3 400071ec: 40 00 09 b5 call 400098c0 <_CORE_RWLock_Obtain_for_writing> 400071f0: 98 10 20 00 clr %o4 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 400071f4: 03 10 00 76 sethi %hi(0x4001d800), %g1 400071f8: c4 00 60 d0 ld [ %g1 + 0xd0 ], %g2 ! 4001d8d0 <_Thread_Dispatch_disable_level> 400071fc: 84 00 bf ff add %g2, -1, %g2 40007200: c4 20 60 d0 st %g2, [ %g1 + 0xd0 ] 40007204: c2 00 60 d0 ld [ %g1 + 0xd0 ], %g1 40007208: 80 a0 60 00 cmp %g1, 0 4000720c: 12 80 00 05 bne 40007220 40007210: 03 10 00 76 sethi %hi(0x4001d800), %g1 _Thread_Dispatch(); 40007214: 40 00 12 29 call 4000bab8 <_Thread_Dispatch> 40007218: 01 00 00 00 nop 0, NULL ); _Thread_Enable_dispatch(); return _POSIX_RWLock_Translate_core_RWLock_return_code( 4000721c: 03 10 00 76 sethi %hi(0x4001d800), %g1 40007220: c2 00 61 ac ld [ %g1 + 0x1ac ], %g1 ! 4001d9ac <_Thread_Executing> 40007224: 7f ff ff a6 call 400070bc <_POSIX_RWLock_Translate_core_RWLock_return_code> 40007228: d0 00 60 34 ld [ %g1 + 0x34 ], %o0 (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); } 4000722c: 81 c7 e0 08 ret 40007230: 91 e8 00 08 restore %g0, %o0, %o0 return _POSIX_RWLock_Translate_core_RWLock_return_code( (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); 40007234: 40 00 02 0e call 40007a6c <== NOT EXECUTED 40007238: 01 00 00 00 nop <== NOT EXECUTED } 4000723c: 81 c7 e0 08 ret <== NOT EXECUTED 40007240: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED return _POSIX_RWLock_Translate_core_RWLock_return_code( (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); 40007244: 90 10 20 16 mov 0x16, %o0 } 40007248: b0 10 00 08 mov %o0, %i0 4000724c: 81 c7 e0 08 ret 40007250: 81 e8 00 00 restore 40007254 : */ int pthread_rwlock_unlock( pthread_rwlock_t *rwlock ) { 40007254: 9d e3 bf 90 save %sp, -112, %sp POSIX_RWLock_Control *the_rwlock; Objects_Locations location; CORE_RWLock_Status status; if ( !rwlock ) 40007258: 80 a6 20 00 cmp %i0, 0 4000725c: 02 80 00 23 be 400072e8 40007260: 11 10 00 76 sethi %hi(0x4001d800), %o0 40007264: d2 06 00 00 ld [ %i0 ], %o1 40007268: 94 07 bf f4 add %fp, -12, %o2 4000726c: 40 00 0d 5e call 4000a7e4 <_Objects_Get> 40007270: 90 12 23 6c or %o0, 0x36c, %o0 return EINVAL; the_rwlock = _POSIX_RWLock_Get( rwlock, &location ); switch ( location ) { 40007274: c2 07 bf f4 ld [ %fp + -12 ], %g1 40007278: 80 a0 60 00 cmp %g1, 0 4000727c: 02 80 00 06 be 40007294 40007280: 80 a0 60 02 cmp %g1, 2 40007284: 18 80 00 15 bgu 400072d8 40007288: 90 10 20 16 mov 0x16, %o0 _Thread_Enable_dispatch(); return _POSIX_RWLock_Translate_core_RWLock_return_code( status ); } return POSIX_BOTTOM_REACHED(); } 4000728c: 81 c7 e0 08 ret 40007290: 91 e8 00 08 restore %g0, %o0, %o0 case OBJECTS_REMOTE: case OBJECTS_ERROR: return EINVAL; case OBJECTS_LOCAL: status = _CORE_RWLock_Release( &the_rwlock->RWLock ); 40007294: 40 00 09 ad call 40009948 <_CORE_RWLock_Release> 40007298: 90 02 20 10 add %o0, 0x10, %o0 4000729c: b0 10 00 08 mov %o0, %i0 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 400072a0: 03 10 00 76 sethi %hi(0x4001d800), %g1 400072a4: c4 00 60 d0 ld [ %g1 + 0xd0 ], %g2 ! 4001d8d0 <_Thread_Dispatch_disable_level> 400072a8: 84 00 bf ff add %g2, -1, %g2 400072ac: c4 20 60 d0 st %g2, [ %g1 + 0xd0 ] 400072b0: c2 00 60 d0 ld [ %g1 + 0xd0 ], %g1 400072b4: 80 a0 60 00 cmp %g1, 0 400072b8: 12 80 00 04 bne 400072c8 400072bc: 01 00 00 00 nop _Thread_Dispatch(); 400072c0: 40 00 11 fe call 4000bab8 <_Thread_Dispatch> 400072c4: 01 00 00 00 nop _Thread_Enable_dispatch(); return _POSIX_RWLock_Translate_core_RWLock_return_code( status ); 400072c8: 7f ff ff 7d call 400070bc <_POSIX_RWLock_Translate_core_RWLock_return_code> 400072cc: 90 10 00 18 mov %i0, %o0 } return POSIX_BOTTOM_REACHED(); } 400072d0: 81 c7 e0 08 ret 400072d4: 91 e8 00 08 restore %g0, %o0, %o0 status = _CORE_RWLock_Release( &the_rwlock->RWLock ); _Thread_Enable_dispatch(); return _POSIX_RWLock_Translate_core_RWLock_return_code( status ); } return POSIX_BOTTOM_REACHED(); 400072d8: 40 00 01 e5 call 40007a6c <== NOT EXECUTED 400072dc: 01 00 00 00 nop <== NOT EXECUTED } 400072e0: 81 c7 e0 08 ret <== NOT EXECUTED 400072e4: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED status = _CORE_RWLock_Release( &the_rwlock->RWLock ); _Thread_Enable_dispatch(); return _POSIX_RWLock_Translate_core_RWLock_return_code( status ); } return POSIX_BOTTOM_REACHED(); 400072e8: 90 10 20 16 mov 0x16, %o0 } 400072ec: b0 10 00 08 mov %o0, %i0 400072f0: 81 c7 e0 08 ret 400072f4: 81 e8 00 00 restore 400072f8 : */ int pthread_rwlock_wrlock( pthread_rwlock_t *rwlock ) { 400072f8: 9d e3 bf 90 save %sp, -112, %sp POSIX_RWLock_Control *the_rwlock; Objects_Locations location; if ( !rwlock ) 400072fc: 80 a6 20 00 cmp %i0, 0 40007300: 02 80 00 28 be 400073a0 40007304: 11 10 00 76 sethi %hi(0x4001d800), %o0 40007308: d2 06 00 00 ld [ %i0 ], %o1 4000730c: 94 07 bf f4 add %fp, -12, %o2 40007310: 40 00 0d 35 call 4000a7e4 <_Objects_Get> 40007314: 90 12 23 6c or %o0, 0x36c, %o0 return EINVAL; the_rwlock = _POSIX_RWLock_Get( rwlock, &location ); switch ( location ) { 40007318: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000731c: 80 a0 60 00 cmp %g1, 0 40007320: 22 80 00 07 be,a 4000733c 40007324: d2 06 00 00 ld [ %i0 ], %o1 40007328: 80 a0 60 02 cmp %g1, 2 4000732c: 18 80 00 19 bgu 40007390 40007330: 90 10 20 16 mov 0x16, %o0 (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); } 40007334: 81 c7 e0 08 ret 40007338: 91 e8 00 08 restore %g0, %o0, %o0 case OBJECTS_ERROR: return EINVAL; case OBJECTS_LOCAL: _CORE_RWLock_Obtain_for_writing( 4000733c: 90 02 20 10 add %o0, 0x10, %o0 40007340: 94 10 20 01 mov 1, %o2 40007344: 96 10 20 00 clr %o3 40007348: 40 00 09 5e call 400098c0 <_CORE_RWLock_Obtain_for_writing> 4000734c: 98 10 20 00 clr %o4 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40007350: 03 10 00 76 sethi %hi(0x4001d800), %g1 40007354: c4 00 60 d0 ld [ %g1 + 0xd0 ], %g2 ! 4001d8d0 <_Thread_Dispatch_disable_level> 40007358: 84 00 bf ff add %g2, -1, %g2 4000735c: c4 20 60 d0 st %g2, [ %g1 + 0xd0 ] 40007360: c2 00 60 d0 ld [ %g1 + 0xd0 ], %g1 40007364: 80 a0 60 00 cmp %g1, 0 40007368: 12 80 00 05 bne 4000737c 4000736c: 03 10 00 76 sethi %hi(0x4001d800), %g1 _Thread_Dispatch(); 40007370: 40 00 11 d2 call 4000bab8 <_Thread_Dispatch> 40007374: 01 00 00 00 nop 0, NULL ); _Thread_Enable_dispatch(); return _POSIX_RWLock_Translate_core_RWLock_return_code( 40007378: 03 10 00 76 sethi %hi(0x4001d800), %g1 4000737c: c2 00 61 ac ld [ %g1 + 0x1ac ], %g1 ! 4001d9ac <_Thread_Executing> 40007380: 7f ff ff 4f call 400070bc <_POSIX_RWLock_Translate_core_RWLock_return_code> 40007384: d0 00 60 34 ld [ %g1 + 0x34 ], %o0 (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); } 40007388: 81 c7 e0 08 ret 4000738c: 91 e8 00 08 restore %g0, %o0, %o0 return _POSIX_RWLock_Translate_core_RWLock_return_code( (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); 40007390: 40 00 01 b7 call 40007a6c <== NOT EXECUTED 40007394: 01 00 00 00 nop <== NOT EXECUTED } 40007398: 81 c7 e0 08 ret <== NOT EXECUTED 4000739c: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED return _POSIX_RWLock_Translate_core_RWLock_return_code( (CORE_RWLock_Status) _Thread_Executing->Wait.return_code ); } return POSIX_BOTTOM_REACHED(); 400073a0: 90 10 20 16 mov 0x16, %o0 } 400073a4: b0 10 00 08 mov %o0, %i0 400073a8: 81 c7 e0 08 ret 400073ac: 81 e8 00 00 restore 400065a8 : int pthread_setcancelstate( int state, int *oldstate ) { 400065a8: 9d e3 bf 98 save %sp, -104, %sp * 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() ) 400065ac: 03 10 00 5f sethi %hi(0x40017c00), %g1 400065b0: c2 00 62 94 ld [ %g1 + 0x294 ], %g1 ! 40017e94 <_ISR_Nest_level> int pthread_setcancelstate( int state, int *oldstate ) { 400065b4: 88 10 00 18 mov %i0, %g4 * 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() ) 400065b8: 80 a0 60 00 cmp %g1, 0 400065bc: 12 80 00 28 bne 4000665c 400065c0: b0 10 20 47 mov 0x47, %i0 return EPROTO; if ( !oldstate ) 400065c4: 80 a6 60 00 cmp %i1, 0 400065c8: 02 80 00 27 be 40006664 400065cc: 80 a1 20 01 cmp %g4, 1 return EINVAL; if ( state != PTHREAD_CANCEL_ENABLE && state != PTHREAD_CANCEL_DISABLE ) 400065d0: 38 80 00 23 bgu,a 4000665c 400065d4: b0 10 20 16 mov 0x16, %i0 <== NOT EXECUTED rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 400065d8: 07 10 00 5f sethi %hi(0x40017c00), %g3 return EINVAL; thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; 400065dc: 1b 10 00 5f sethi %hi(0x40017c00), %o5 400065e0: c2 00 e1 d0 ld [ %g3 + 0x1d0 ], %g1 400065e4: c4 03 62 ac ld [ %o5 + 0x2ac ], %g2 400065e8: 82 00 60 01 inc %g1 400065ec: c4 00 a1 70 ld [ %g2 + 0x170 ], %g2 400065f0: c2 20 e1 d0 st %g1, [ %g3 + 0x1d0 ] _Thread_Disable_dispatch(); *oldstate = thread_support->cancelability_state; 400065f4: c2 00 a0 cc ld [ %g2 + 0xcc ], %g1 thread_support->cancelability_state = state; if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE && 400065f8: 80 a1 20 00 cmp %g4, 0 return EINVAL; thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; _Thread_Disable_dispatch(); *oldstate = thread_support->cancelability_state; 400065fc: c2 26 40 00 st %g1, [ %i1 ] thread_support->cancelability_state = state; if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE && 40006600: 12 80 00 0c bne 40006630 40006604: c8 20 a0 cc st %g4, [ %g2 + 0xcc ] 40006608: c2 00 a0 d0 ld [ %g2 + 0xd0 ], %g1 4000660c: 80 a0 60 01 cmp %g1, 1 40006610: 12 80 00 08 bne 40006630 40006614: 01 00 00 00 nop 40006618: c2 00 a0 d4 ld [ %g2 + 0xd4 ], %g1 <== NOT EXECUTED 4000661c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40006620: 02 80 00 04 be 40006630 <== NOT EXECUTED 40006624: 01 00 00 00 nop <== NOT EXECUTED thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS && thread_support->cancelation_requested ) _POSIX_Threads_cancel_run( _Thread_Executing ); 40006628: 7f ff fe 09 call 40005e4c <_POSIX_Threads_cancel_run> <== NOT EXECUTED 4000662c: d0 03 62 ac ld [ %o5 + 0x2ac ], %o0 <== NOT EXECUTED #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40006630: 03 10 00 5f sethi %hi(0x40017c00), %g1 40006634: c4 00 61 d0 ld [ %g1 + 0x1d0 ], %g2 ! 40017dd0 <_Thread_Dispatch_disable_level> 40006638: b0 10 20 00 clr %i0 4000663c: 84 00 bf ff add %g2, -1, %g2 40006640: c4 20 61 d0 st %g2, [ %g1 + 0x1d0 ] 40006644: c2 00 61 d0 ld [ %g1 + 0x1d0 ], %g1 40006648: 80 a0 60 00 cmp %g1, 0 4000664c: 12 80 00 07 bne 40006668 40006650: 01 00 00 00 nop _Thread_Dispatch(); 40006654: 40 00 0f 87 call 4000a470 <_Thread_Dispatch> 40006658: 01 00 00 00 nop 4000665c: 81 c7 e0 08 ret 40006660: 81 e8 00 00 restore 40006664: b0 10 20 16 mov 0x16, %i0 <== NOT EXECUTED _Thread_Enable_dispatch(); return 0; } 40006668: 81 c7 e0 08 ret <== NOT EXECUTED 4000666c: 81 e8 00 00 restore <== NOT EXECUTED 40006670 : int pthread_setcanceltype( int type, int *oldtype ) { 40006670: 9d e3 bf 98 save %sp, -104, %sp * 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() ) 40006674: 03 10 00 5f sethi %hi(0x40017c00), %g1 40006678: c2 00 62 94 ld [ %g1 + 0x294 ], %g1 ! 40017e94 <_ISR_Nest_level> int pthread_setcanceltype( int type, int *oldtype ) { 4000667c: 88 10 00 18 mov %i0, %g4 * 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() ) 40006680: 80 a0 60 00 cmp %g1, 0 40006684: 12 80 00 28 bne 40006724 40006688: b0 10 20 47 mov 0x47, %i0 return EPROTO; if ( !oldtype ) 4000668c: 80 a6 60 00 cmp %i1, 0 40006690: 02 80 00 27 be 4000672c 40006694: 80 a1 20 01 cmp %g4, 1 return EINVAL; if ( type != PTHREAD_CANCEL_DEFERRED && type != PTHREAD_CANCEL_ASYNCHRONOUS ) 40006698: 38 80 00 23 bgu,a 40006724 4000669c: b0 10 20 16 mov 0x16, %i0 <== NOT EXECUTED rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 400066a0: 07 10 00 5f sethi %hi(0x40017c00), %g3 return EINVAL; thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; 400066a4: 1b 10 00 5f sethi %hi(0x40017c00), %o5 400066a8: c2 00 e1 d0 ld [ %g3 + 0x1d0 ], %g1 400066ac: c4 03 62 ac ld [ %o5 + 0x2ac ], %g2 400066b0: 82 00 60 01 inc %g1 400066b4: c4 00 a1 70 ld [ %g2 + 0x170 ], %g2 400066b8: c2 20 e1 d0 st %g1, [ %g3 + 0x1d0 ] _Thread_Disable_dispatch(); *oldtype = thread_support->cancelability_type; 400066bc: c2 00 a0 d0 ld [ %g2 + 0xd0 ], %g1 400066c0: c2 26 40 00 st %g1, [ %i1 ] thread_support->cancelability_type = type; if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE && 400066c4: c2 00 a0 cc ld [ %g2 + 0xcc ], %g1 400066c8: 80 a0 60 00 cmp %g1, 0 400066cc: 12 80 00 0b bne 400066f8 400066d0: c8 20 a0 d0 st %g4, [ %g2 + 0xd0 ] 400066d4: 80 a1 20 01 cmp %g4, 1 400066d8: 12 80 00 08 bne 400066f8 400066dc: 01 00 00 00 nop 400066e0: c2 00 a0 d4 ld [ %g2 + 0xd4 ], %g1 400066e4: 80 a0 60 00 cmp %g1, 0 400066e8: 02 80 00 04 be 400066f8 400066ec: 01 00 00 00 nop thread_support->cancelability_type == PTHREAD_CANCEL_ASYNCHRONOUS && thread_support->cancelation_requested ) _POSIX_Threads_cancel_run( _Thread_Executing ); 400066f0: 7f ff fd d7 call 40005e4c <_POSIX_Threads_cancel_run> <== NOT EXECUTED 400066f4: d0 03 62 ac ld [ %o5 + 0x2ac ], %o0 <== NOT EXECUTED #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 400066f8: 03 10 00 5f sethi %hi(0x40017c00), %g1 400066fc: c4 00 61 d0 ld [ %g1 + 0x1d0 ], %g2 ! 40017dd0 <_Thread_Dispatch_disable_level> 40006700: b0 10 20 00 clr %i0 40006704: 84 00 bf ff add %g2, -1, %g2 40006708: c4 20 61 d0 st %g2, [ %g1 + 0x1d0 ] 4000670c: c2 00 61 d0 ld [ %g1 + 0x1d0 ], %g1 40006710: 80 a0 60 00 cmp %g1, 0 40006714: 12 80 00 07 bne 40006730 40006718: 01 00 00 00 nop _Thread_Dispatch(); 4000671c: 40 00 0f 55 call 4000a470 <_Thread_Dispatch> 40006720: 01 00 00 00 nop 40006724: 81 c7 e0 08 ret 40006728: 81 e8 00 00 restore 4000672c: b0 10 20 16 mov 0x16, %i0 <== NOT EXECUTED _Thread_Enable_dispatch(); return 0; } 40006730: 81 c7 e0 08 ret <== NOT EXECUTED 40006734: 81 e8 00 00 restore <== NOT EXECUTED 40009028 : int pthread_setschedparam( pthread_t thread, int policy, struct sched_param *param ) { 40009028: 9d e3 bf 90 save %sp, -112, %sp /* * Check all the parameters */ if ( !param ) 4000902c: 80 a6 a0 00 cmp %i2, 0 40009030: 02 80 00 70 be 400091f0 40009034: 90 10 20 16 mov 0x16, %o0 return EINVAL; if ( !_POSIX_Priority_Is_valid( param->sched_priority ) ) 40009038: c2 06 80 00 ld [ %i2 ], %g1 4000903c: 82 00 7f ff add %g1, -1, %g1 40009040: 80 a0 60 fd cmp %g1, 0xfd 40009044: 18 80 00 6b bgu 400091f0 40009048: 80 a6 60 01 cmp %i1, 1 return EINVAL; budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; budget_callout = NULL; switch ( policy ) { 4000904c: 02 80 00 10 be 4000908c 40009050: a2 10 20 00 clr %l1 40009054: 14 80 00 08 bg 40009074 40009058: 80 a6 60 02 cmp %i1, 2 4000905c: 80 a6 60 00 cmp %i1, 0 40009060: a2 10 20 01 mov 1, %l1 40009064: 02 80 00 1b be 400090d0 40009068: a4 10 20 00 clr %l2 _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); } 4000906c: 81 c7 e0 08 ret 40009070: 91 e8 00 08 restore %g0, %o0, %o0 return EINVAL; budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_NONE; budget_callout = NULL; switch ( policy ) { 40009074: 02 80 00 05 be 40009088 40009078: 80 a6 60 03 cmp %i1, 3 4000907c: 32 80 00 5d bne,a 400091f0 40009080: 90 10 20 16 mov 0x16, %o0 <== NOT EXECUTED 40009084: 30 80 00 04 b,a 40009094 40009088: a2 10 20 02 mov 2, %l1 4000908c: 10 80 00 11 b 400090d0 40009090: a4 10 20 00 clr %l2 case SCHED_SPORADIC: budget_algorithm = THREAD_CPU_BUDGET_ALGORITHM_CALLOUT; budget_callout = _POSIX_Threads_Sporadic_budget_callout; if ( _Timespec_To_ticks( ¶m->ss_replenish_period ) < 40009094: 40 00 13 e0 call 4000e014 <_Timespec_To_ticks> 40009098: 90 06 a0 08 add %i2, 8, %o0 4000909c: a0 10 00 08 mov %o0, %l0 400090a0: 40 00 13 dd call 4000e014 <_Timespec_To_ticks> 400090a4: 90 06 a0 10 add %i2, 0x10, %o0 400090a8: 80 a4 00 08 cmp %l0, %o0 400090ac: 2a 80 00 51 bcs,a 400091f0 400090b0: 90 10 20 16 mov 0x16, %o0 <== NOT EXECUTED _Timespec_To_ticks( ¶m->ss_initial_budget ) ) return EINVAL; if ( !_POSIX_Priority_Is_valid( param->ss_low_priority ) ) 400090b4: c2 06 a0 04 ld [ %i2 + 4 ], %g1 400090b8: 82 00 7f ff add %g1, -1, %g1 400090bc: 80 a0 60 fd cmp %g1, 0xfd 400090c0: 18 80 00 4b bgu 400091ec 400090c4: 03 10 00 23 sethi %hi(0x40008c00), %g1 400090c8: a2 10 20 03 mov 3, %l1 400090cc: a4 10 63 18 or %g1, 0x318, %l2 400090d0: 92 10 00 18 mov %i0, %o1 400090d4: 11 10 00 6c sethi %hi(0x4001b000), %o0 400090d8: 94 07 bf f4 add %fp, -12, %o2 400090dc: 40 00 0a c0 call 4000bbdc <_Objects_Get> 400090e0: 90 12 23 a8 or %o0, 0x3a8, %o0 /* * Actually change the scheduling policy and parameters */ the_thread = _POSIX_Threads_Get( thread, &location ); switch ( location ) { 400090e4: c2 07 bf f4 ld [ %fp + -12 ], %g1 400090e8: 80 a0 60 00 cmp %g1, 0 400090ec: 02 80 00 06 be 40009104 400090f0: b0 10 00 08 mov %o0, %i0 400090f4: 80 a0 60 02 cmp %g1, 2 400090f8: 08 80 00 3e bleu 400091f0 400090fc: 90 10 20 03 mov 3, %o0 40009100: 30 80 00 37 b,a 400091dc <== NOT EXECUTED case OBJECTS_ERROR: case OBJECTS_REMOTE: return ESRCH; case OBJECTS_LOCAL: api = the_thread->API_Extensions[ THREAD_API_POSIX ]; 40009104: e0 02 21 70 ld [ %o0 + 0x170 ], %l0 if ( api->schedpolicy == SCHED_SPORADIC ) 40009108: c2 04 20 7c ld [ %l0 + 0x7c ], %g1 4000910c: 80 a0 60 03 cmp %g1, 3 40009110: 32 80 00 05 bne,a 40009124 40009114: f2 24 20 7c st %i1, [ %l0 + 0x7c ] (void) _Watchdog_Remove( &api->Sporadic_timer ); 40009118: 40 00 15 10 call 4000e558 <_Watchdog_Remove> 4000911c: 90 04 20 9c add %l0, 0x9c, %o0 api->schedpolicy = policy; 40009120: f2 24 20 7c st %i1, [ %l0 + 0x7c ] api->schedparam = *param; 40009124: 92 10 00 1a mov %i2, %o1 40009128: 90 04 20 80 add %l0, 0x80, %o0 4000912c: 40 00 26 ad call 40012be0 40009130: 94 10 20 18 mov 0x18, %o2 the_thread->budget_algorithm = budget_algorithm; the_thread->budget_callout = budget_callout; switch ( api->schedpolicy ) { 40009134: c2 04 20 7c ld [ %l0 + 0x7c ], %g1 if ( api->schedpolicy == SCHED_SPORADIC ) (void) _Watchdog_Remove( &api->Sporadic_timer ); api->schedpolicy = policy; api->schedparam = *param; the_thread->budget_algorithm = budget_algorithm; 40009138: e2 26 20 88 st %l1, [ %i0 + 0x88 ] the_thread->budget_callout = budget_callout; switch ( api->schedpolicy ) { 4000913c: 80 a0 60 00 cmp %g1, 0 40009140: 06 80 00 1a bl 400091a8 40009144: e4 26 20 8c st %l2, [ %i0 + 0x8c ] 40009148: 80 a0 60 02 cmp %g1, 2 4000914c: 24 80 00 07 ble,a 40009168 40009150: c4 04 20 80 ld [ %l0 + 0x80 ], %g2 40009154: 80 a0 60 03 cmp %g1, 3 40009158: 12 80 00 14 bne 400091a8 4000915c: 01 00 00 00 nop TRUE ); break; case SCHED_SPORADIC: api->ss_high_priority = api->schedparam.sched_priority; 40009160: 10 80 00 0c b 40009190 40009164: c2 04 20 80 ld [ %l0 + 0x80 ], %g1 switch ( api->schedpolicy ) { case SCHED_OTHER: case SCHED_FIFO: case SCHED_RR: the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice; 40009168: 03 10 00 6c sethi %hi(0x4001b000), %g1 4000916c: c2 00 60 18 ld [ %g1 + 0x18 ], %g1 ! 4001b018 <_Thread_Ticks_per_timeslice> the_thread->real_priority = _POSIX_Priority_To_core( api->schedparam.sched_priority ); _Thread_Change_priority( 40009170: 90 10 00 18 mov %i0, %o0 switch ( api->schedpolicy ) { case SCHED_OTHER: case SCHED_FIFO: case SCHED_RR: the_thread->cpu_time_budget = _Thread_Ticks_per_timeslice; 40009174: c2 26 20 84 st %g1, [ %i0 + 0x84 ] 40009178: 92 10 20 ff mov 0xff, %o1 the_thread->real_priority = _POSIX_Priority_To_core( api->schedparam.sched_priority ); _Thread_Change_priority( 4000917c: 94 10 20 01 mov 1, %o2 40009180: 92 22 40 02 sub %o1, %g2, %o1 40009184: 40 00 0e 1f call 4000ca00 <_Thread_Change_priority> 40009188: d2 26 20 18 st %o1, [ %i0 + 0x18 ] 4000918c: 30 80 00 07 b,a 400091a8 ); break; case SCHED_SPORADIC: api->ss_high_priority = api->schedparam.sched_priority; _Watchdog_Remove( &api->Sporadic_timer ); 40009190: 90 04 20 9c add %l0, 0x9c, %o0 40009194: 40 00 14 f1 call 4000e558 <_Watchdog_Remove> 40009198: c2 24 20 98 st %g1, [ %l0 + 0x98 ] _POSIX_Threads_Sporadic_budget_TSR( 0, the_thread ); 4000919c: 92 10 00 18 mov %i0, %o1 400091a0: 7f ff ff 72 call 40008f68 <_POSIX_Threads_Sporadic_budget_TSR> 400091a4: 90 10 20 00 clr %o0 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 400091a8: 03 10 00 6c sethi %hi(0x4001b000), %g1 400091ac: c4 00 60 c0 ld [ %g1 + 0xc0 ], %g2 ! 4001b0c0 <_Thread_Dispatch_disable_level> 400091b0: 90 10 20 00 clr %o0 400091b4: 84 00 bf ff add %g2, -1, %g2 400091b8: c4 20 60 c0 st %g2, [ %g1 + 0xc0 ] 400091bc: c2 00 60 c0 ld [ %g1 + 0xc0 ], %g1 400091c0: 80 a0 60 00 cmp %g1, 0 400091c4: 32 80 00 0c bne,a 400091f4 400091c8: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED _Thread_Dispatch(); 400091cc: 40 00 0f 39 call 4000ceb0 <_Thread_Dispatch> 400091d0: 01 00 00 00 nop 400091d4: 10 80 00 07 b 400091f0 400091d8: 90 10 20 00 clr %o0 ! 0 } _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); 400091dc: 40 00 00 1b call 40009248 <== NOT EXECUTED 400091e0: 01 00 00 00 nop <== NOT EXECUTED } 400091e4: 81 c7 e0 08 ret <== NOT EXECUTED 400091e8: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED } _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); 400091ec: 90 10 20 16 mov 0x16, %o0 } 400091f0: b0 10 00 08 mov %o0, %i0 400091f4: 81 c7 e0 08 ret 400091f8: 81 e8 00 00 restore 4000668c : int pthread_setspecific( pthread_key_t key, const void *value ) { 4000668c: 9d e3 bf 90 save %sp, -112, %sp 40006690: 11 10 00 60 sethi %hi(0x40018000), %o0 40006694: 92 10 00 18 mov %i0, %o1 40006698: 90 12 22 c0 or %o0, 0x2c0, %o0 4000669c: 40 00 0c 7c call 4000988c <_Objects_Get> 400066a0: 94 07 bf f4 add %fp, -12, %o2 uint32_t api; uint32_t index; Objects_Locations location; the_key = _POSIX_Keys_Get( key, &location ); switch ( location ) { 400066a4: c2 07 bf f4 ld [ %fp + -12 ], %g1 400066a8: 80 a0 60 00 cmp %g1, 0 400066ac: 22 80 00 06 be,a 400066c4 400066b0: 03 10 00 5f sethi %hi(0x40017c00), %g1 400066b4: 80 a0 60 02 cmp %g1, 2 400066b8: 08 80 00 1d bleu 4000672c 400066bc: 90 10 20 16 mov 0x16, %o0 400066c0: 30 80 00 19 b,a 40006724 <== NOT EXECUTED case OBJECTS_ERROR: case OBJECTS_REMOTE: /* should never happen */ return EINVAL; case OBJECTS_LOCAL: api = _Objects_Get_API( _Thread_Executing->Object.id ); 400066c4: c2 00 62 9c ld [ %g1 + 0x29c ], %g1 400066c8: c4 00 60 08 ld [ %g1 + 8 ], %g2 index = _Objects_Get_index( _Thread_Executing->Object.id ); the_key->Values[ api ][ index ] = (void *) value; 400066cc: 83 30 a0 16 srl %g2, 0x16, %g1 400066d0: 82 08 60 1c and %g1, 0x1c, %g1 400066d4: 82 00 40 08 add %g1, %o0, %g1 400066d8: c6 00 60 18 ld [ %g1 + 0x18 ], %g3 400066dc: 03 00 00 3f sethi %hi(0xfc00), %g1 400066e0: 82 10 63 ff or %g1, 0x3ff, %g1 ! ffff 400066e4: 84 08 80 01 and %g2, %g1, %g2 400066e8: 85 28 a0 02 sll %g2, 2, %g2 400066ec: f2 20 c0 02 st %i1, [ %g3 + %g2 ] #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 400066f0: 05 10 00 5f sethi %hi(0x40017c00), %g2 400066f4: c2 00 a1 c0 ld [ %g2 + 0x1c0 ], %g1 ! 40017dc0 <_Thread_Dispatch_disable_level> 400066f8: 90 10 20 00 clr %o0 400066fc: 82 00 7f ff add %g1, -1, %g1 40006700: c2 20 a1 c0 st %g1, [ %g2 + 0x1c0 ] 40006704: c2 00 a1 c0 ld [ %g2 + 0x1c0 ], %g1 40006708: 80 a0 60 00 cmp %g1, 0 4000670c: 12 80 00 08 bne 4000672c 40006710: 01 00 00 00 nop _Thread_Dispatch(); 40006714: 40 00 11 13 call 4000ab60 <_Thread_Dispatch> 40006718: 01 00 00 00 nop 4000671c: 10 80 00 04 b 4000672c 40006720: 90 10 20 00 clr %o0 ! 0 _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); 40006724: 40 00 01 f5 call 40006ef8 <== NOT EXECUTED 40006728: 01 00 00 00 nop <== NOT EXECUTED } 4000672c: 81 c7 e0 08 ret 40006730: 91 e8 00 08 restore %g0, %o0, %o0 40006338 : */ int pthread_spin_destroy( pthread_spinlock_t *spinlock ) { 40006338: 9d e3 bf 90 save %sp, -112, %sp POSIX_Spinlock_Control *the_spinlock = NULL; Objects_Locations location; if ( !spinlock ) 4000633c: 80 a6 20 00 cmp %i0, 0 40006340: 02 80 00 2c be 400063f0 40006344: 94 07 bf f4 add %fp, -12, %o2 RTEMS_INLINE_ROUTINE POSIX_Spinlock_Control *_POSIX_Spinlock_Get ( pthread_spinlock_t *spinlock, Objects_Locations *location ) { return (POSIX_Spinlock_Control *) _Objects_Get( 40006348: d2 06 00 00 ld [ %i0 ], %o1 4000634c: 31 10 00 55 sethi %hi(0x40015400), %i0 40006350: 40 00 0b da call 400092b8 <_Objects_Get> 40006354: 90 16 20 d4 or %i0, 0xd4, %o0 ! 400154d4 <_POSIX_Spinlock_Information> return EINVAL; the_spinlock = _POSIX_Spinlock_Get( spinlock, &location ); switch ( location ) { 40006358: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000635c: 80 a0 60 00 cmp %g1, 0 40006360: 02 80 00 07 be 4000637c 40006364: 88 10 00 08 mov %o0, %g4 40006368: 80 a0 60 02 cmp %g1, 2 4000636c: 18 80 00 1d bgu 400063e0 40006370: 90 10 20 16 mov 0x16, %o0 _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); } 40006374: 81 c7 e0 08 ret 40006378: 91 e8 00 08 restore %g0, %o0, %o0 RTEMS_INLINE_ROUTINE boolean _CORE_spinlock_Is_busy( CORE_spinlock_Control *the_spinlock ) { return (the_spinlock->users != 0); 4000637c: c2 02 20 18 ld [ %o0 + 0x18 ], %g1 case OBJECTS_REMOTE: case OBJECTS_ERROR: return EINVAL; case OBJECTS_LOCAL: if ( _CORE_spinlock_Is_busy( &the_spinlock->Spinlock ) ) { 40006380: 80 a0 60 00 cmp %g1, 0 40006384: 22 80 00 06 be,a 4000639c 40006388: 90 16 20 d4 or %i0, 0xd4, %o0 _Thread_Enable_dispatch(); 4000638c: 7f ff ff de call 40006304 <_Thread_Enable_dispatch> 40006390: 01 00 00 00 nop 40006394: 10 80 00 18 b 400063f4 40006398: 90 10 20 10 mov 0x10, %o0 ! 10 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); 4000639c: c2 01 20 08 ld [ %g4 + 8 ], %g1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 400063a0: c6 12 20 10 lduh [ %o0 + 0x10 ], %g3 400063a4: 05 00 00 3f sethi %hi(0xfc00), %g2 400063a8: 84 10 a3 ff or %g2, 0x3ff, %g2 ! ffff 400063ac: 82 08 40 02 and %g1, %g2, %g1 400063b0: 80 a0 40 03 cmp %g1, %g3 400063b4: 18 80 00 05 bgu 400063c8 400063b8: 92 10 00 04 mov %g4, %o1 information->local_table[ index ] = the_object; 400063bc: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 400063c0: 83 28 60 02 sll %g1, 2, %g1 400063c4: c0 20 80 01 clr [ %g2 + %g1 ] */ RTEMS_INLINE_ROUTINE void _POSIX_Spinlock_Free ( POSIX_Spinlock_Control *the_spinlock ) { _Objects_Free( &_POSIX_Spinlock_Information, &the_spinlock->Object ); 400063c8: 40 00 0b 7a call 400091b0 <_Objects_Free> 400063cc: c0 21 20 0c clr [ %g4 + 0xc ] _Objects_Close( &_POSIX_Spinlock_Information, &the_spinlock->Object ); _POSIX_Spinlock_Free( the_spinlock ); _Thread_Enable_dispatch(); 400063d0: 7f ff ff cd call 40006304 <_Thread_Enable_dispatch> 400063d4: 01 00 00 00 nop 400063d8: 10 80 00 07 b 400063f4 400063dc: 90 10 20 00 clr %o0 ! 0 return 0; } return POSIX_BOTTOM_REACHED(); 400063e0: 40 00 00 db call 4000674c <== NOT EXECUTED 400063e4: 01 00 00 00 nop <== NOT EXECUTED } 400063e8: 81 c7 e0 08 ret <== NOT EXECUTED 400063ec: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); 400063f0: 90 10 20 16 mov 0x16, %o0 } 400063f4: b0 10 00 08 mov %o0, %i0 400063f8: 81 c7 e0 08 ret 400063fc: 81 e8 00 00 restore 40006434 : int pthread_spin_init( pthread_spinlock_t *spinlock, int pshared ) { 40006434: 9d e3 bf 90 save %sp, -112, %sp POSIX_Spinlock_Control *the_spinlock; CORE_spinlock_Attributes attributes; if ( !spinlock ) 40006438: 80 a6 20 00 cmp %i0, 0 4000643c: 02 80 00 26 be 400064d4 40006440: 80 a6 60 00 cmp %i1, 0 return EINVAL; switch ( pshared ) { 40006444: 12 80 00 24 bne 400064d4 40006448: 05 10 00 54 sethi %hi(0x40015000), %g2 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 4000644c: c2 00 a1 a0 ld [ %g2 + 0x1a0 ], %g1 ! 400151a0 <_Thread_Dispatch_disable_level> 40006450: 82 00 60 01 inc %g1 40006454: c2 20 a1 a0 st %g1, [ %g2 + 0x1a0 ] * This function allocates a spinlock control block from * the inactive chain of free spinlock control blocks. */ RTEMS_INLINE_ROUTINE POSIX_Spinlock_Control *_POSIX_Spinlock_Allocate( void ) { return (POSIX_Spinlock_Control *) 40006458: 21 10 00 55 sethi %hi(0x40015400), %l0 4000645c: 40 00 0a 53 call 40008da8 <_Objects_Allocate> 40006460: 90 14 20 d4 or %l0, 0xd4, %o0 ! 400154d4 <_POSIX_Spinlock_Information> _Thread_Disable_dispatch(); /* prevents deletion */ the_spinlock = _POSIX_Spinlock_Allocate(); if ( !the_spinlock ) { 40006464: b2 92 20 00 orcc %o0, 0, %i1 40006468: 12 80 00 06 bne 40006480 4000646c: 90 06 60 10 add %i1, 0x10, %o0 _Thread_Enable_dispatch(); 40006470: 7f ff ff e4 call 40006400 <_Thread_Enable_dispatch> 40006474: b0 10 20 0b mov 0xb, %i0 40006478: 81 c7 e0 08 ret 4000647c: 81 e8 00 00 restore return EAGAIN; } _CORE_spinlock_Initialize( &the_spinlock->Spinlock, &attributes ); 40006480: 40 00 08 31 call 40008544 <_CORE_spinlock_Initialize> 40006484: 92 07 bf f4 add %fp, -12, %o1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40006488: 90 14 20 d4 or %l0, 0xd4, %o0 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, the_object ); 4000648c: c2 06 60 08 ld [ %i1 + 8 ], %g1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40006490: c6 12 20 10 lduh [ %o0 + 0x10 ], %g3 40006494: 05 00 00 3f sethi %hi(0xfc00), %g2 40006498: 84 10 a3 ff or %g2, 0x3ff, %g2 ! ffff 4000649c: 82 08 40 02 and %g1, %g2, %g1 400064a0: 80 a0 40 03 cmp %g1, %g3 400064a4: 38 80 00 06 bgu,a 400064bc 400064a8: c2 06 60 08 ld [ %i1 + 8 ], %g1 <== NOT EXECUTED information->local_table[ index ] = the_object; 400064ac: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 400064b0: 83 28 60 02 sll %g1, 2, %g1 400064b4: f2 20 80 01 st %i1, [ %g2 + %g1 ] &_POSIX_Spinlock_Information, &the_spinlock->Object, 0 ); *spinlock = the_spinlock->Object.id; 400064b8: c2 06 60 08 ld [ %i1 + 8 ], %g1 if ( information->is_string ) /* _Objects_Copy_name_string( name, the_object->name ); */ the_object->name = name; else /* _Objects_Copy_name_raw( name, the_object->name, information->name_length ); */ the_object->name = name; 400064bc: c0 26 60 0c clr [ %i1 + 0xc ] 400064c0: c2 26 00 00 st %g1, [ %i0 ] _Thread_Enable_dispatch(); 400064c4: 7f ff ff cf call 40006400 <_Thread_Enable_dispatch> 400064c8: b0 10 20 00 clr %i0 400064cc: 81 c7 e0 08 ret 400064d0: 81 e8 00 00 restore return 0; } 400064d4: 81 c7 e0 08 ret 400064d8: 91 e8 20 16 restore %g0, 0x16, %o0 400064dc : */ int pthread_spin_lock( pthread_spinlock_t *spinlock ) { 400064dc: 9d e3 bf 90 save %sp, -112, %sp POSIX_Spinlock_Control *the_spinlock = NULL; Objects_Locations location; CORE_spinlock_Status status; if ( !spinlock ) 400064e0: 80 a6 20 00 cmp %i0, 0 400064e4: 02 80 00 25 be 40006578 400064e8: 11 10 00 55 sethi %hi(0x40015400), %o0 RTEMS_INLINE_ROUTINE POSIX_Spinlock_Control *_POSIX_Spinlock_Get ( pthread_spinlock_t *spinlock, Objects_Locations *location ) { return (POSIX_Spinlock_Control *) _Objects_Get( 400064ec: d2 06 00 00 ld [ %i0 ], %o1 400064f0: 94 07 bf f4 add %fp, -12, %o2 400064f4: 40 00 0b 71 call 400092b8 <_Objects_Get> 400064f8: 90 12 20 d4 or %o0, 0xd4, %o0 return EINVAL; the_spinlock = _POSIX_Spinlock_Get( spinlock, &location ); switch ( location ) { 400064fc: c2 07 bf f4 ld [ %fp + -12 ], %g1 40006500: 80 a0 60 00 cmp %g1, 0 40006504: 02 80 00 07 be 40006520 40006508: 92 10 20 01 mov 1, %o1 4000650c: 80 a0 60 02 cmp %g1, 2 40006510: 18 80 00 16 bgu 40006568 40006514: 90 10 20 16 mov 0x16, %o0 status = _CORE_spinlock_Wait( &the_spinlock->Spinlock, TRUE, 0 ); _Thread_Enable_dispatch(); return _POSIX_Spinlock_Translate_core_spinlock_return_code( status ); } return POSIX_BOTTOM_REACHED(); } 40006518: 81 c7 e0 08 ret 4000651c: 91 e8 00 08 restore %g0, %o0, %o0 case OBJECTS_REMOTE: case OBJECTS_ERROR: return EINVAL; case OBJECTS_LOCAL: status = _CORE_spinlock_Wait( &the_spinlock->Spinlock, TRUE, 0 ); 40006520: 94 10 20 00 clr %o2 40006524: 40 00 08 2d call 400085d8 <_CORE_spinlock_Wait> 40006528: 90 02 20 10 add %o0, 0x10, %o0 4000652c: b0 10 00 08 mov %o0, %i0 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40006530: 03 10 00 54 sethi %hi(0x40015000), %g1 40006534: c4 00 61 a0 ld [ %g1 + 0x1a0 ], %g2 ! 400151a0 <_Thread_Dispatch_disable_level> 40006538: 84 00 bf ff add %g2, -1, %g2 4000653c: c4 20 61 a0 st %g2, [ %g1 + 0x1a0 ] 40006540: c2 00 61 a0 ld [ %g1 + 0x1a0 ], %g1 40006544: 80 a0 60 00 cmp %g1, 0 40006548: 12 80 00 04 bne 40006558 4000654c: 01 00 00 00 nop _Thread_Dispatch(); 40006550: 40 00 10 0f call 4000a58c <_Thread_Dispatch> 40006554: 01 00 00 00 nop _Thread_Enable_dispatch(); return _POSIX_Spinlock_Translate_core_spinlock_return_code( status ); 40006558: 40 00 00 0c call 40006588 <_POSIX_Spinlock_Translate_core_spinlock_return_code> 4000655c: 90 10 00 18 mov %i0, %o0 } return POSIX_BOTTOM_REACHED(); } 40006560: 81 c7 e0 08 ret 40006564: 91 e8 00 08 restore %g0, %o0, %o0 case OBJECTS_LOCAL: status = _CORE_spinlock_Wait( &the_spinlock->Spinlock, TRUE, 0 ); _Thread_Enable_dispatch(); return _POSIX_Spinlock_Translate_core_spinlock_return_code( status ); } return POSIX_BOTTOM_REACHED(); 40006568: 40 00 00 79 call 4000674c <== NOT EXECUTED 4000656c: 01 00 00 00 nop <== NOT EXECUTED } 40006570: 81 c7 e0 08 ret <== NOT EXECUTED 40006574: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED case OBJECTS_LOCAL: status = _CORE_spinlock_Wait( &the_spinlock->Spinlock, TRUE, 0 ); _Thread_Enable_dispatch(); return _POSIX_Spinlock_Translate_core_spinlock_return_code( status ); } return POSIX_BOTTOM_REACHED(); 40006578: 90 10 20 16 mov 0x16, %o0 } 4000657c: b0 10 00 08 mov %o0, %i0 40006580: 81 c7 e0 08 ret 40006584: 81 e8 00 00 restore 400065b0 : */ int pthread_spin_trylock( pthread_spinlock_t *spinlock ) { 400065b0: 9d e3 bf 90 save %sp, -112, %sp POSIX_Spinlock_Control *the_spinlock = NULL; Objects_Locations location; CORE_spinlock_Status status; if ( !spinlock ) 400065b4: 80 a6 20 00 cmp %i0, 0 400065b8: 02 80 00 25 be 4000664c 400065bc: 11 10 00 55 sethi %hi(0x40015400), %o0 400065c0: d2 06 00 00 ld [ %i0 ], %o1 400065c4: 94 07 bf f4 add %fp, -12, %o2 400065c8: 40 00 0b 3c call 400092b8 <_Objects_Get> 400065cc: 90 12 20 d4 or %o0, 0xd4, %o0 return EINVAL; the_spinlock = _POSIX_Spinlock_Get( spinlock, &location ); switch ( location ) { 400065d0: c2 07 bf f4 ld [ %fp + -12 ], %g1 400065d4: 80 a0 60 00 cmp %g1, 0 400065d8: 02 80 00 07 be 400065f4 400065dc: 92 10 20 00 clr %o1 400065e0: 80 a0 60 02 cmp %g1, 2 400065e4: 18 80 00 16 bgu 4000663c 400065e8: 90 10 20 16 mov 0x16, %o0 status = _CORE_spinlock_Wait( &the_spinlock->Spinlock, FALSE, 0 ); _Thread_Enable_dispatch(); return _POSIX_Spinlock_Translate_core_spinlock_return_code( status ); } return POSIX_BOTTOM_REACHED(); } 400065ec: 81 c7 e0 08 ret 400065f0: 91 e8 00 08 restore %g0, %o0, %o0 case OBJECTS_REMOTE: case OBJECTS_ERROR: return EINVAL; case OBJECTS_LOCAL: status = _CORE_spinlock_Wait( &the_spinlock->Spinlock, FALSE, 0 ); 400065f4: 94 10 20 00 clr %o2 400065f8: 40 00 07 f8 call 400085d8 <_CORE_spinlock_Wait> 400065fc: 90 02 20 10 add %o0, 0x10, %o0 40006600: b0 10 00 08 mov %o0, %i0 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40006604: 03 10 00 54 sethi %hi(0x40015000), %g1 40006608: c4 00 61 a0 ld [ %g1 + 0x1a0 ], %g2 ! 400151a0 <_Thread_Dispatch_disable_level> 4000660c: 84 00 bf ff add %g2, -1, %g2 40006610: c4 20 61 a0 st %g2, [ %g1 + 0x1a0 ] 40006614: c2 00 61 a0 ld [ %g1 + 0x1a0 ], %g1 40006618: 80 a0 60 00 cmp %g1, 0 4000661c: 12 80 00 04 bne 4000662c 40006620: 01 00 00 00 nop _Thread_Dispatch(); 40006624: 40 00 0f da call 4000a58c <_Thread_Dispatch> 40006628: 01 00 00 00 nop _Thread_Enable_dispatch(); return _POSIX_Spinlock_Translate_core_spinlock_return_code( status ); 4000662c: 7f ff ff d7 call 40006588 <_POSIX_Spinlock_Translate_core_spinlock_return_code> 40006630: 90 10 00 18 mov %i0, %o0 } return POSIX_BOTTOM_REACHED(); } 40006634: 81 c7 e0 08 ret 40006638: 91 e8 00 08 restore %g0, %o0, %o0 case OBJECTS_LOCAL: status = _CORE_spinlock_Wait( &the_spinlock->Spinlock, FALSE, 0 ); _Thread_Enable_dispatch(); return _POSIX_Spinlock_Translate_core_spinlock_return_code( status ); } return POSIX_BOTTOM_REACHED(); 4000663c: 40 00 00 44 call 4000674c <== NOT EXECUTED 40006640: 01 00 00 00 nop <== NOT EXECUTED } 40006644: 81 c7 e0 08 ret <== NOT EXECUTED 40006648: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED case OBJECTS_LOCAL: status = _CORE_spinlock_Wait( &the_spinlock->Spinlock, FALSE, 0 ); _Thread_Enable_dispatch(); return _POSIX_Spinlock_Translate_core_spinlock_return_code( status ); } return POSIX_BOTTOM_REACHED(); 4000664c: 90 10 20 16 mov 0x16, %o0 } 40006650: b0 10 00 08 mov %o0, %i0 40006654: 81 c7 e0 08 ret 40006658: 81 e8 00 00 restore 4000665c : */ int pthread_spin_unlock( pthread_spinlock_t *spinlock ) { 4000665c: 9d e3 bf 90 save %sp, -112, %sp POSIX_Spinlock_Control *the_spinlock = NULL; Objects_Locations location; CORE_spinlock_Status status; if ( !spinlock ) 40006660: 80 a6 20 00 cmp %i0, 0 40006664: 02 80 00 23 be 400066f0 40006668: 11 10 00 55 sethi %hi(0x40015400), %o0 4000666c: d2 06 00 00 ld [ %i0 ], %o1 40006670: 94 07 bf f4 add %fp, -12, %o2 40006674: 40 00 0b 11 call 400092b8 <_Objects_Get> 40006678: 90 12 20 d4 or %o0, 0xd4, %o0 return EINVAL; the_spinlock = _POSIX_Spinlock_Get( spinlock, &location ); switch ( location ) { 4000667c: c2 07 bf f4 ld [ %fp + -12 ], %g1 40006680: 80 a0 60 00 cmp %g1, 0 40006684: 02 80 00 06 be 4000669c 40006688: 80 a0 60 02 cmp %g1, 2 4000668c: 18 80 00 15 bgu 400066e0 40006690: 90 10 20 16 mov 0x16, %o0 status = _CORE_spinlock_Release( &the_spinlock->Spinlock ); _Thread_Enable_dispatch(); return _POSIX_Spinlock_Translate_core_spinlock_return_code( status ); } return POSIX_BOTTOM_REACHED(); } 40006694: 81 c7 e0 08 ret 40006698: 91 e8 00 08 restore %g0, %o0, %o0 case OBJECTS_REMOTE: case OBJECTS_ERROR: return EINVAL; case OBJECTS_LOCAL: status = _CORE_spinlock_Release( &the_spinlock->Spinlock ); 4000669c: 40 00 07 b1 call 40008560 <_CORE_spinlock_Release> 400066a0: 90 02 20 10 add %o0, 0x10, %o0 400066a4: b0 10 00 08 mov %o0, %i0 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 400066a8: 03 10 00 54 sethi %hi(0x40015000), %g1 400066ac: c4 00 61 a0 ld [ %g1 + 0x1a0 ], %g2 ! 400151a0 <_Thread_Dispatch_disable_level> 400066b0: 84 00 bf ff add %g2, -1, %g2 400066b4: c4 20 61 a0 st %g2, [ %g1 + 0x1a0 ] 400066b8: c2 00 61 a0 ld [ %g1 + 0x1a0 ], %g1 400066bc: 80 a0 60 00 cmp %g1, 0 400066c0: 12 80 00 04 bne 400066d0 400066c4: 01 00 00 00 nop _Thread_Dispatch(); 400066c8: 40 00 0f b1 call 4000a58c <_Thread_Dispatch> 400066cc: 01 00 00 00 nop _Thread_Enable_dispatch(); return _POSIX_Spinlock_Translate_core_spinlock_return_code( status ); 400066d0: 7f ff ff ae call 40006588 <_POSIX_Spinlock_Translate_core_spinlock_return_code> 400066d4: 90 10 00 18 mov %i0, %o0 } return POSIX_BOTTOM_REACHED(); } 400066d8: 81 c7 e0 08 ret 400066dc: 91 e8 00 08 restore %g0, %o0, %o0 case OBJECTS_LOCAL: status = _CORE_spinlock_Release( &the_spinlock->Spinlock ); _Thread_Enable_dispatch(); return _POSIX_Spinlock_Translate_core_spinlock_return_code( status ); } return POSIX_BOTTOM_REACHED(); 400066e0: 40 00 00 1b call 4000674c <== NOT EXECUTED 400066e4: 01 00 00 00 nop <== NOT EXECUTED } 400066e8: 81 c7 e0 08 ret <== NOT EXECUTED 400066ec: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED case OBJECTS_LOCAL: status = _CORE_spinlock_Release( &the_spinlock->Spinlock ); _Thread_Enable_dispatch(); return _POSIX_Spinlock_Translate_core_spinlock_return_code( status ); } return POSIX_BOTTOM_REACHED(); 400066f0: 90 10 20 16 mov 0x16, %o0 } 400066f4: b0 10 00 08 mov %o0, %i0 400066f8: 81 c7 e0 08 ret 400066fc: 81 e8 00 00 restore 4000675c : * * 18.2.2 Setting Cancelability State, P1003.1c/Draft 10, p. 183 */ void pthread_testcancel( void ) { 4000675c: 9d e3 bf 98 save %sp, -104, %sp * 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() ) 40006760: 03 10 00 5f sethi %hi(0x40017c00), %g1 40006764: c2 00 62 94 ld [ %g1 + 0x294 ], %g1 ! 40017e94 <_ISR_Nest_level> 40006768: 80 a0 60 00 cmp %g1, 0 4000676c: 12 80 00 1c bne 400067dc 40006770: 07 10 00 5f sethi %hi(0x40017c00), %g3 return; thread_support = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ]; 40006774: 09 10 00 5f sethi %hi(0x40017c00), %g4 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40006778: c2 00 e1 d0 ld [ %g3 + 0x1d0 ], %g1 4000677c: c4 01 22 ac ld [ %g4 + 0x2ac ], %g2 40006780: 82 00 60 01 inc %g1 40006784: c4 00 a1 70 ld [ %g2 + 0x170 ], %g2 40006788: c2 20 e1 d0 st %g1, [ %g3 + 0x1d0 ] _Thread_Disable_dispatch(); if ( thread_support->cancelability_state == PTHREAD_CANCEL_ENABLE && 4000678c: c2 00 a0 cc ld [ %g2 + 0xcc ], %g1 40006790: 80 a0 60 00 cmp %g1, 0 40006794: 12 80 00 08 bne 400067b4 40006798: 01 00 00 00 nop 4000679c: c2 00 a0 d4 ld [ %g2 + 0xd4 ], %g1 400067a0: 80 a0 60 00 cmp %g1, 0 400067a4: 02 80 00 04 be 400067b4 400067a8: 01 00 00 00 nop thread_support->cancelation_requested ) _POSIX_Threads_cancel_run( _Thread_Executing ); 400067ac: 7f ff fd a8 call 40005e4c <_POSIX_Threads_cancel_run> 400067b0: d0 01 22 ac ld [ %g4 + 0x2ac ], %o0 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 400067b4: 03 10 00 5f sethi %hi(0x40017c00), %g1 400067b8: c4 00 61 d0 ld [ %g1 + 0x1d0 ], %g2 ! 40017dd0 <_Thread_Dispatch_disable_level> 400067bc: 84 00 bf ff add %g2, -1, %g2 400067c0: c4 20 61 d0 st %g2, [ %g1 + 0x1d0 ] 400067c4: c2 00 61 d0 ld [ %g1 + 0x1d0 ], %g1 400067c8: 80 a0 60 00 cmp %g1, 0 400067cc: 12 80 00 04 bne 400067dc 400067d0: 01 00 00 00 nop _Thread_Dispatch(); 400067d4: 40 00 0f 27 call 4000a470 <_Thread_Dispatch> 400067d8: 81 e8 00 00 restore 400067dc: 81 c7 e0 08 ret <== NOT EXECUTED 400067e0: 81 e8 00 00 restore <== NOT EXECUTED 40018540 : ssize_t read( int fd, void *buffer, size_t count ) { 40018540: 9d e3 bf 98 save %sp, -104, %sp ssize_t rc; rtems_libio_t *iop; rtems_libio_check_fd( fd ); 40018544: 03 10 00 66 sethi %hi(0x40019800), %g1 40018548: c2 00 62 1c ld [ %g1 + 0x21c ], %g1 ! 40019a1c ssize_t read( int fd, void *buffer, size_t count ) { 4001854c: 92 10 00 19 mov %i1, %o1 ssize_t rc; rtems_libio_t *iop; rtems_libio_check_fd( fd ); 40018550: 80 a6 00 01 cmp %i0, %g1 40018554: 1a 80 00 0e bcc 4001858c 40018558: 94 10 00 1a mov %i2, %o2 iop = rtems_libio_iop( fd ); 4001855c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40018560: c6 00 60 08 ld [ %g1 + 8 ], %g3 ! 4001ac08 40018564: 85 2e 20 02 sll %i0, 2, %g2 40018568: 83 2e 20 04 sll %i0, 4, %g1 4001856c: 82 20 40 02 sub %g1, %g2, %g1 40018570: 82 00 40 18 add %g1, %i0, %g1 40018574: 83 28 60 02 sll %g1, 2, %g1 40018578: b0 00 40 03 add %g1, %g3, %i0 rtems_libio_check_is_open(iop); 4001857c: c2 06 20 0c ld [ %i0 + 0xc ], %g1 40018580: 80 88 61 00 btst 0x100, %g1 40018584: 12 80 00 06 bne 4001859c 40018588: 80 a6 60 00 cmp %i1, 0 4001858c: 7f ff da 8c call 4000efbc <__errno> <== NOT EXECUTED 40018590: 01 00 00 00 nop <== NOT EXECUTED 40018594: 10 80 00 14 b 400185e4 <== NOT EXECUTED 40018598: 82 10 20 09 mov 9, %g1 ! 9 <== NOT EXECUTED rtems_libio_check_buffer( buffer ); 4001859c: 02 80 00 07 be 400185b8 400185a0: 80 a6 a0 00 cmp %i2, 0 rtems_libio_check_count( count ); 400185a4: 02 80 00 1b be 40018610 400185a8: 90 10 20 00 clr %o0 rtems_libio_check_permissions( iop, LIBIO_FLAGS_READ ); 400185ac: 80 88 60 02 btst 2, %g1 400185b0: 32 80 00 06 bne,a 400185c8 400185b4: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 400185b8: 7f ff da 81 call 4000efbc <__errno> <== NOT EXECUTED 400185bc: 01 00 00 00 nop <== NOT EXECUTED 400185c0: 10 80 00 09 b 400185e4 <== NOT EXECUTED 400185c4: 82 10 20 16 mov 0x16, %g1 ! 16 <== NOT EXECUTED /* * Now process the read(). */ if ( !iop->handlers->read_h ) 400185c8: c2 00 60 08 ld [ %g1 + 8 ], %g1 400185cc: 80 a0 60 00 cmp %g1, 0 400185d0: 12 80 00 08 bne 400185f0 400185d4: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( ENOTSUP ); 400185d8: 7f ff da 79 call 4000efbc <__errno> <== NOT EXECUTED 400185dc: 01 00 00 00 nop <== NOT EXECUTED 400185e0: 82 10 20 86 mov 0x86, %g1 ! 86 <== NOT EXECUTED 400185e4: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 400185e8: 10 80 00 0a b 40018610 <== NOT EXECUTED 400185ec: 90 10 3f ff mov -1, %o0 <== NOT EXECUTED rc = (*iop->handlers->read_h)( iop, buffer, count ); 400185f0: 9f c0 40 00 call %g1 400185f4: 90 10 00 18 mov %i0, %o0 if ( rc > 0 ) 400185f8: 80 a2 20 00 cmp %o0, 0 400185fc: 04 80 00 05 ble 40018610 40018600: 01 00 00 00 nop iop->offset += rc; 40018604: c2 06 20 08 ld [ %i0 + 8 ], %g1 40018608: 82 00 40 08 add %g1, %o0, %g1 4001860c: c2 26 20 08 st %g1, [ %i0 + 8 ] return rc; } 40018610: 81 c7 e0 08 ret 40018614: 91 e8 00 08 restore %g0, %o0, %o0 40018500 : /* * get next entry in a directory. */ struct dirent * readdir(dirp) register DIR *dirp; { 40018500: 9d e3 bf 98 save %sp, -104, %sp register struct dirent *dp; if ( !dirp ) 40018504: a0 96 20 00 orcc %i0, 0, %l0 40018508: 02 80 00 2a be 400185b0 4001850c: b0 10 20 00 clr %i0 return NULL; for (;;) { if (dirp->dd_loc == 0) { 40018510: c2 04 20 04 ld [ %l0 + 4 ], %g1 40018514: 80 a0 60 00 cmp %g1, 0 40018518: 32 80 00 0a bne,a 40018540 4001851c: c6 04 20 04 ld [ %l0 + 4 ], %g3 dirp->dd_size = getdents (dirp->dd_fd, 40018520: d0 04 00 00 ld [ %l0 ], %o0 40018524: d2 04 20 0c ld [ %l0 + 0xc ], %o1 40018528: 40 00 24 45 call 4002163c 4001852c: d4 04 20 10 ld [ %l0 + 0x10 ], %o2 dirp->dd_buf, dirp->dd_len); if (dirp->dd_size <= 0) 40018530: 80 a2 20 00 cmp %o0, 0 40018534: 04 80 00 1e ble 400185ac 40018538: d0 24 20 08 st %o0, [ %l0 + 8 ] return NULL; } if (dirp->dd_loc >= dirp->dd_size) { 4001853c: c6 04 20 04 ld [ %l0 + 4 ], %g3 40018540: c2 04 20 08 ld [ %l0 + 8 ], %g1 40018544: 80 a0 c0 01 cmp %g3, %g1 40018548: 26 80 00 04 bl,a 40018558 4001854c: da 04 20 0c ld [ %l0 + 0xc ], %o5 dirp->dd_loc = 0; 40018550: 10 bf ff f0 b 40018510 40018554: c0 24 20 04 clr [ %l0 + 4 ] continue; } dp = (struct dirent *)(dirp->dd_buf + dirp->dd_loc); 40018558: b0 00 c0 0d add %g3, %o5, %i0 if ((intptr_t)dp & 03) /* bogus pointer check */ 4001855c: 80 8e 20 03 btst 3, %i0 40018560: 32 80 00 14 bne,a 400185b0 40018564: b0 10 20 00 clr %i0 <== NOT EXECUTED return NULL; if (dp->d_reclen <= 0 || 40018568: c4 16 20 08 lduh [ %i0 + 8 ], %g2 4001856c: 80 a0 a0 00 cmp %g2, 0 40018570: 02 80 00 0f be 400185ac 40018574: 88 00 80 03 add %g2, %g3, %g4 40018578: c2 04 20 10 ld [ %l0 + 0x10 ], %g1 4001857c: 82 00 60 01 inc %g1 40018580: 82 20 40 03 sub %g1, %g3, %g1 40018584: 80 a0 80 01 cmp %g2, %g1 40018588: 34 80 00 0a bg,a 400185b0 4001858c: b0 10 20 00 clr %i0 <== NOT EXECUTED dp->d_reclen > dirp->dd_len + 1 - dirp->dd_loc) return NULL; dirp->dd_loc += dp->d_reclen; 40018590: c8 24 20 04 st %g4, [ %l0 + 4 ] if (dp->d_ino == 0) 40018594: c2 00 c0 0d ld [ %g3 + %o5 ], %g1 40018598: 80 a0 60 00 cmp %g1, 0 4001859c: 12 80 00 05 bne 400185b0 400185a0: 01 00 00 00 nop if ( !dirp ) return NULL; for (;;) { if (dirp->dd_loc == 0) { 400185a4: 10 bf ff dc b 40018514 <== NOT EXECUTED 400185a8: c2 04 20 04 ld [ %l0 + 4 ], %g1 <== NOT EXECUTED return NULL; if (dp->d_reclen <= 0 || dp->d_reclen > dirp->dd_len + 1 - dirp->dd_loc) return NULL; dirp->dd_loc += dp->d_reclen; if (dp->d_ino == 0) 400185ac: b0 10 20 00 clr %i0 continue; return (dp); } } 400185b0: 81 c7 e0 08 ret 400185b4: 81 e8 00 00 restore 40006844 : ssize_t readlink( const char *pathname, char *buf, size_t bufsize ) { 40006844: 9d e3 bf 88 save %sp, -120, %sp rtems_filesystem_location_info_t loc; int result; if (!buf) 40006848: 80 a6 60 00 cmp %i1, 0 4000684c: 12 80 00 06 bne 40006864 40006850: 90 10 00 18 mov %i0, %o0 rtems_set_errno_and_return_minus_one( EFAULT ); 40006854: 40 00 32 49 call 40013178 <__errno> <== NOT EXECUTED 40006858: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 4000685c: 10 80 00 30 b 4000691c <== NOT EXECUTED 40006860: 82 10 20 0e mov 0xe, %g1 <== NOT EXECUTED result = rtems_filesystem_evaluate_path( pathname, 0, &loc, FALSE ); 40006864: a0 07 bf e8 add %fp, -24, %l0 40006868: 92 10 20 00 clr %o1 4000686c: 94 10 00 10 mov %l0, %o2 40006870: 96 10 20 00 clr %o3 40006874: 7f ff fa 29 call 40005118 40006878: b0 10 3f ff mov -1, %i0 if ( result != 0 ) 4000687c: 80 a2 20 00 cmp %o0, 0 40006880: 12 80 00 28 bne 40006920 40006884: c4 07 bf f0 ld [ %fp + -16 ], %g2 return -1; if ( !loc.ops->node_type_h ){ 40006888: c2 00 a0 10 ld [ %g2 + 0x10 ], %g1 4000688c: 80 a0 60 00 cmp %g1, 0 40006890: 12 80 00 04 bne 400068a0 40006894: 01 00 00 00 nop rtems_filesystem_freenode( &loc ); 40006898: 10 80 00 19 b 400068fc <== NOT EXECUTED 4000689c: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOTSUP ); } if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_SYM_LINK ){ 400068a0: 9f c0 40 00 call %g1 400068a4: 90 10 00 10 mov %l0, %o0 400068a8: 80 a2 20 04 cmp %o0, 4 400068ac: 02 80 00 0f be 400068e8 400068b0: c2 07 bf f0 ld [ %fp + -16 ], %g1 rtems_filesystem_freenode( &loc ); 400068b4: 80 a0 60 00 cmp %g1, 0 400068b8: 02 80 00 08 be 400068d8 400068bc: 01 00 00 00 nop 400068c0: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 400068c4: 80 a0 60 00 cmp %g1, 0 400068c8: 02 80 00 04 be 400068d8 400068cc: 01 00 00 00 nop 400068d0: 9f c0 40 00 call %g1 400068d4: 90 10 00 10 mov %l0, %o0 rtems_set_errno_and_return_minus_one( EINVAL ); 400068d8: 40 00 32 28 call 40013178 <__errno> 400068dc: b0 10 3f ff mov -1, %i0 400068e0: 10 80 00 0f b 4000691c 400068e4: 82 10 20 16 mov 0x16, %g1 } if ( !loc.ops->readlink_h ){ 400068e8: c4 00 60 3c ld [ %g1 + 0x3c ], %g2 400068ec: 80 a0 a0 00 cmp %g2, 0 400068f0: 12 80 00 0e bne 40006928 400068f4: 92 10 00 19 mov %i1, %o1 rtems_filesystem_freenode( &loc ); 400068f8: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 <== NOT EXECUTED 400068fc: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40006900: 02 80 00 04 be 40006910 <== NOT EXECUTED 40006904: 01 00 00 00 nop <== NOT EXECUTED 40006908: 9f c0 40 00 call %g1 <== NOT EXECUTED 4000690c: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOTSUP ); 40006910: 40 00 32 1a call 40013178 <__errno> <== NOT EXECUTED 40006914: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40006918: 82 10 20 86 mov 0x86, %g1 <== NOT EXECUTED 4000691c: c2 22 00 00 st %g1, [ %o0 ] 40006920: 81 c7 e0 08 ret 40006924: 81 e8 00 00 restore } result = (*loc.ops->readlink_h)( &loc, buf, bufsize ); 40006928: 94 10 00 1a mov %i2, %o2 4000692c: 9f c0 80 00 call %g2 40006930: 90 10 00 10 mov %l0, %o0 rtems_filesystem_freenode( &loc ); 40006934: c2 07 bf f0 ld [ %fp + -16 ], %g1 40006938: 80 a0 60 00 cmp %g1, 0 4000693c: 02 bf ff f9 be 40006920 40006940: b0 10 00 08 mov %o0, %i0 40006944: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 40006948: 80 a0 60 00 cmp %g1, 0 4000694c: 02 80 00 04 be 4000695c 40006950: 01 00 00 00 nop 40006954: 9f c0 40 00 call %g1 40006958: 90 10 00 10 mov %l0, %o0 return result; } 4000695c: 81 c7 e0 08 ret 40006960: 81 e8 00 00 restore 40003218 : void *realloc( void *ptr, size_t size ) { 40003218: 9d e3 bf 90 save %sp, -112, %sp <== NOT EXECUTED /* * Do not attempt to allocate memory if in a critical section or ISR. */ if (_System_state_Is_up(_System_state_Get())) { 4000321c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40003220: c2 00 63 b0 ld [ %g1 + 0x3b0 ], %g1 ! 4001afb0 <_System_state_Current> <== NOT EXECUTED 40003224: 80 a0 60 03 cmp %g1, 3 <== NOT EXECUTED 40003228: 12 80 00 0c bne 40003258 <== NOT EXECUTED 4000322c: 80 a6 20 00 cmp %i0, 0 <== NOT EXECUTED if (_Thread_Dispatch_disable_level > 0) 40003230: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40003234: c2 00 61 d0 ld [ %g1 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40003238: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000323c: 32 80 00 12 bne,a 40003284 <== NOT EXECUTED 40003240: b0 10 20 00 clr %i0 <== NOT EXECUTED return (void *) 0; if (_ISR_Nest_level > 0) 40003244: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40003248: c2 00 62 94 ld [ %g1 + 0x294 ], %g1 ! 4001ae94 <_ISR_Nest_level> <== NOT EXECUTED 4000324c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40003250: 12 80 00 34 bne 40003320 <== NOT EXECUTED 40003254: 80 a6 20 00 cmp %i0, 0 <== NOT EXECUTED } /* * Continue with realloc(). */ if ( !ptr ) 40003258: 12 80 00 06 bne 40003270 <== NOT EXECUTED 4000325c: 80 a6 60 00 cmp %i1, 0 <== NOT EXECUTED return malloc( size ); 40003260: 7f ff ff a3 call 400030ec <== NOT EXECUTED 40003264: 90 10 00 19 mov %i1, %o0 <== NOT EXECUTED 40003268: 81 c7 e0 08 ret <== NOT EXECUTED 4000326c: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED if ( !size ) { 40003270: 12 80 00 07 bne 4000328c <== NOT EXECUTED 40003274: 23 10 00 6b sethi %hi(0x4001ac00), %l1 <== NOT EXECUTED free( ptr ); 40003278: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 4000327c: 7f ff ff 74 call 4000304c <== NOT EXECUTED 40003280: b0 10 20 00 clr %i0 <== NOT EXECUTED 40003284: 81 c7 e0 08 ret <== NOT EXECUTED 40003288: 81 e8 00 00 restore <== NOT EXECUTED memcpy(np,ptr,size); free(ptr); return np; } #endif if ( _Protected_heap_Resize_block( &RTEMS_Malloc_Heap, ptr, size ) ) { 4000328c: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED 40003290: 90 14 60 14 or %l1, 0x14, %o0 <== NOT EXECUTED 40003294: 40 00 18 21 call 40009318 <_Protected_heap_Resize_block> <== NOT EXECUTED 40003298: 94 10 00 19 mov %i1, %o2 <== NOT EXECUTED 4000329c: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400032a0: 12 80 00 21 bne 40003324 <== NOT EXECUTED 400032a4: 01 00 00 00 nop <== NOT EXECUTED return ptr; } new_area = malloc( size ); 400032a8: 7f ff ff 91 call 400030ec <== NOT EXECUTED 400032ac: 90 10 00 19 mov %i1, %o0 <== NOT EXECUTED * 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. */ if ( !new_area ) { 400032b0: a0 92 20 00 orcc %o0, 0, %l0 <== NOT EXECUTED 400032b4: 02 80 00 1b be 40003320 <== NOT EXECUTED 400032b8: 90 14 60 14 or %l1, 0x14, %o0 <== NOT EXECUTED return (void *) 0; } if ( !_Protected_heap_Get_block_size(&RTEMS_Malloc_Heap, ptr, &old_size) ) { 400032bc: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED 400032c0: 40 00 17 84 call 400090d0 <_Protected_heap_Get_block_size> <== NOT EXECUTED 400032c4: 94 07 bf f4 add %fp, -12, %o2 <== NOT EXECUTED 400032c8: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400032cc: 12 80 00 08 bne 400032ec <== NOT EXECUTED 400032d0: c2 07 bf f4 ld [ %fp + -12 ], %g1 <== NOT EXECUTED errno = EINVAL; 400032d4: 40 00 2f 3a call 4000efbc <__errno> <== NOT EXECUTED 400032d8: b0 10 20 00 clr %i0 <== NOT EXECUTED 400032dc: 82 10 20 16 mov 0x16, %g1 <== NOT EXECUTED 400032e0: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 400032e4: 81 c7 e0 08 ret <== NOT EXECUTED 400032e8: 81 e8 00 00 restore <== NOT EXECUTED return (void *) 0; } memcpy( new_area, ptr, (size < old_size) ? size : old_size ); 400032ec: 80 a6 40 01 cmp %i1, %g1 <== NOT EXECUTED 400032f0: 08 80 00 03 bleu 400032fc <== NOT EXECUTED 400032f4: 90 10 00 19 mov %i1, %o0 <== NOT EXECUTED 400032f8: 90 10 00 01 mov %g1, %o0 <== NOT EXECUTED 400032fc: 94 10 00 08 mov %o0, %o2 <== NOT EXECUTED 40003300: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED 40003304: 40 00 31 03 call 4000f710 <== NOT EXECUTED 40003308: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED free( ptr ); 4000330c: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40003310: 7f ff ff 4f call 4000304c <== NOT EXECUTED 40003314: b0 10 00 10 mov %l0, %i0 <== NOT EXECUTED 40003318: 81 c7 e0 08 ret <== NOT EXECUTED 4000331c: 81 e8 00 00 restore <== NOT EXECUTED return new_area; 40003320: b0 10 20 00 clr %i0 <== NOT EXECUTED } 40003324: 81 c7 e0 08 ret <== NOT EXECUTED 40003328: 81 e8 00 00 restore <== NOT EXECUTED 400185b8 : #include int rmdir( const char *pathname ) { 400185b8: 9d e3 bf 88 save %sp, -120, %sp /* * Get the node where we wish to go. */ result = rtems_filesystem_evaluate_path( pathname, 0, &loc, FALSE ); 400185bc: 92 10 20 00 clr %o1 400185c0: 90 10 00 18 mov %i0, %o0 400185c4: a0 07 bf e8 add %fp, -24, %l0 400185c8: 96 10 20 00 clr %o3 400185cc: 7f ff b5 54 call 40005b1c 400185d0: 94 10 00 10 mov %l0, %o2 if ( result != 0 ) 400185d4: 80 a2 20 00 cmp %o0, 0 400185d8: 32 80 00 11 bne,a 4001861c 400185dc: b0 10 3f ff mov -1, %i0 return -1; result = rtems_filesystem_evaluate_parent(RTEMS_LIBIO_PERMS_WRITE, &loc ); 400185e0: 90 10 20 02 mov 2, %o0 400185e4: 7f ff b5 21 call 40005a68 400185e8: 92 10 00 10 mov %l0, %o1 if (result != 0) { 400185ec: 80 a2 20 00 cmp %o0, 0 400185f0: 02 80 00 0d be 40018624 400185f4: c2 07 bf f0 ld [ %fp + -16 ], %g1 rtems_filesystem_freenode( &loc ); 400185f8: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400185fc: 02 80 00 08 be 4001861c <== NOT EXECUTED 40018600: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40018604: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 <== NOT EXECUTED 40018608: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4001860c: 02 80 00 04 be 4001861c <== NOT EXECUTED 40018610: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 40018614: 9f c0 40 00 call %g1 <== NOT EXECUTED 40018618: 01 00 00 00 nop <== NOT EXECUTED 4001861c: 81 c7 e0 08 ret 40018620: 81 e8 00 00 restore /* * Verify you can remove this node as a directory. */ if ( !loc.ops->node_type_h ){ 40018624: c4 00 60 10 ld [ %g1 + 0x10 ], %g2 40018628: 80 a0 a0 00 cmp %g2, 0 4001862c: 22 80 00 1e be,a 400186a4 40018630: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 <== NOT EXECUTED rtems_filesystem_freenode( &loc ); rtems_set_errno_and_return_minus_one( ENOTSUP ); } if ( (*loc.ops->node_type_h)( &loc ) != RTEMS_FILESYSTEM_DIRECTORY ){ 40018634: 9f c0 80 00 call %g2 40018638: 90 10 00 10 mov %l0, %o0 4001863c: 80 a2 20 01 cmp %o0, 1 40018640: 02 80 00 10 be 40018680 40018644: c2 07 bf ec ld [ %fp + -20 ], %g1 rtems_filesystem_freenode( &loc ); 40018648: c2 07 bf f0 ld [ %fp + -16 ], %g1 4001864c: 80 a0 60 00 cmp %g1, 0 40018650: 02 80 00 08 be 40018670 40018654: 01 00 00 00 nop 40018658: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 4001865c: 80 a0 60 00 cmp %g1, 0 40018660: 02 80 00 04 be 40018670 40018664: 01 00 00 00 nop 40018668: 9f c0 40 00 call %g1 4001866c: 90 10 00 10 mov %l0, %o0 rtems_set_errno_and_return_minus_one( ENOTDIR ); 40018670: 40 00 2c c7 call 4002398c <__errno> 40018674: b0 10 3f ff mov -1, %i0 40018678: 10 80 00 13 b 400186c4 4001867c: 82 10 20 14 mov 0x14, %g1 /* * Use the filesystems rmnod to remove the node. */ if ( !loc.handlers->rmnod_h ){ 40018680: c2 00 60 34 ld [ %g1 + 0x34 ], %g1 40018684: 80 a0 60 00 cmp %g1, 0 40018688: 12 80 00 12 bne 400186d0 4001868c: 01 00 00 00 nop rtems_filesystem_freenode( &loc ); 40018690: c2 07 bf f0 ld [ %fp + -16 ], %g1 <== NOT EXECUTED 40018694: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40018698: 02 80 00 08 be 400186b8 <== NOT EXECUTED 4001869c: 01 00 00 00 nop <== NOT EXECUTED 400186a0: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 <== NOT EXECUTED 400186a4: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400186a8: 02 80 00 04 be 400186b8 <== NOT EXECUTED 400186ac: 01 00 00 00 nop <== NOT EXECUTED 400186b0: 9f c0 40 00 call %g1 <== NOT EXECUTED 400186b4: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOTSUP ); 400186b8: 40 00 2c b5 call 4002398c <__errno> <== NOT EXECUTED 400186bc: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 400186c0: 82 10 20 86 mov 0x86, %g1 <== NOT EXECUTED 400186c4: c2 22 00 00 st %g1, [ %o0 ] 400186c8: 81 c7 e0 08 ret 400186cc: 81 e8 00 00 restore } result = (*loc.handlers->rmnod_h)( &loc ); 400186d0: 9f c0 40 00 call %g1 400186d4: 90 10 00 10 mov %l0, %o0 rtems_filesystem_freenode( &loc ); 400186d8: c2 07 bf f0 ld [ %fp + -16 ], %g1 400186dc: 80 a0 60 00 cmp %g1, 0 400186e0: 02 bf ff cf be 4001861c 400186e4: b0 10 00 08 mov %o0, %i0 400186e8: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 400186ec: 80 a0 60 00 cmp %g1, 0 400186f0: 02 80 00 06 be 40018708 400186f4: 01 00 00 00 nop 400186f8: 9f c0 40 00 call %g1 400186fc: 90 10 00 10 mov %l0, %o0 40018700: 81 c7 e0 08 ret 40018704: 81 e8 00 00 restore return result; } 40018708: 81 c7 e0 08 ret <== NOT EXECUTED 4001870c: 81 e8 00 00 restore <== NOT EXECUTED 40016c8c : sprintf(bad_buffer, "< %" PRId32 "[0x%" PRIx32 " ] >", bad_value, bad_value); #else static char bad_buffer[32] = ""; #endif return bad_buffer; } 40016c8c: 11 10 00 a2 sethi %hi(0x40028800), %o0 <== NOT EXECUTED 40016c90: 81 c3 e0 08 retl <== NOT EXECUTED 40016c94: 90 12 22 d0 or %o0, 0x2d0, %o0 ! 40028ad0 <== NOT EXECUTED 400127b4 : const char *rtems_assoc_name_by_local( const rtems_assoc_t *ap, uint32_t local_value ) { 400127b4: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED const rtems_assoc_t *nap; nap = rtems_assoc_ptr_by_local(ap, local_value); 400127b8: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 400127bc: 40 00 00 09 call 400127e0 <== NOT EXECUTED 400127c0: 92 10 00 19 mov %i1, %o1 <== NOT EXECUTED if (nap) 400127c4: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400127c8: 32 80 00 04 bne,a 400127d8 <== NOT EXECUTED 400127cc: f0 02 00 00 ld [ %o0 ], %i0 <== NOT EXECUTED return nap->name; return rtems_assoc_name_bad(local_value); 400127d0: 40 00 11 2f call 40016c8c <== NOT EXECUTED 400127d4: 91 e8 00 19 restore %g0, %i1, %o0 <== NOT EXECUTED } 400127d8: 81 c7 e0 08 ret <== NOT EXECUTED 400127dc: 81 e8 00 00 restore <== NOT EXECUTED 4000eefc : const rtems_assoc_t *rtems_assoc_ptr_by_local( const rtems_assoc_t *ap, uint32_t local_value ) { 4000eefc: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED const rtems_assoc_t *default_ap = 0; if (rtems_assoc_is_default(ap)) 4000ef00: d0 06 00 00 ld [ %i0 ], %o0 <== NOT EXECUTED 4000ef04: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 4000ef08: 02 80 00 0e be 4000ef40 <== NOT EXECUTED 4000ef0c: 84 10 20 00 clr %g2 <== NOT EXECUTED 4000ef10: 13 10 00 64 sethi %hi(0x40019000), %o1 <== NOT EXECUTED 4000ef14: 40 00 04 b8 call 400101f4 <== NOT EXECUTED 4000ef18: 92 12 62 00 or %o1, 0x200, %o1 ! 40019200 <_POSIX_Threads_Default_attributes+0x118> <== NOT EXECUTED 4000ef1c: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 4000ef20: 02 80 00 07 be 4000ef3c <== NOT EXECUTED 4000ef24: 84 10 00 18 mov %i0, %g2 <== NOT EXECUTED default_ap = ap++; 4000ef28: 10 80 00 06 b 4000ef40 <== NOT EXECUTED 4000ef2c: 84 10 20 00 clr %g2 <== NOT EXECUTED for ( ; ap->name; ap++) if (ap->local_value == local_value) 4000ef30: 80 a0 40 19 cmp %g1, %i1 <== NOT EXECUTED 4000ef34: 02 80 00 08 be 4000ef54 <== NOT EXECUTED 4000ef38: 01 00 00 00 nop <== NOT EXECUTED const rtems_assoc_t *default_ap = 0; if (rtems_assoc_is_default(ap)) default_ap = ap++; for ( ; ap->name; ap++) 4000ef3c: b0 06 20 0c add %i0, 0xc, %i0 <== NOT EXECUTED 4000ef40: c2 06 00 00 ld [ %i0 ], %g1 <== NOT EXECUTED 4000ef44: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000ef48: 32 bf ff fa bne,a 4000ef30 <== NOT EXECUTED 4000ef4c: c2 06 20 04 ld [ %i0 + 4 ], %g1 <== NOT EXECUTED 4000ef50: b0 10 00 02 mov %g2, %i0 <== NOT EXECUTED if (ap->local_value == local_value) return ap; return default_ap; } 4000ef54: 81 c7 e0 08 ret <== NOT EXECUTED 4000ef58: 81 e8 00 00 restore <== NOT EXECUTED 4000e64c : uint32_t rtems_assoc_remote_by_local( const rtems_assoc_t *ap, uint32_t local_value ) { 4000e64c: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED const rtems_assoc_t *nap; nap = rtems_assoc_ptr_by_local(ap, local_value); 4000e650: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 4000e654: 92 10 00 19 mov %i1, %o1 <== NOT EXECUTED 4000e658: 40 00 02 29 call 4000eefc <== NOT EXECUTED 4000e65c: b0 10 20 00 clr %i0 <== NOT EXECUTED if (nap) 4000e660: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 4000e664: 32 80 00 02 bne,a 4000e66c <== NOT EXECUTED 4000e668: f0 02 20 08 ld [ %o0 + 8 ], %i0 <== NOT EXECUTED return nap->remote_value; return 0; } 4000e66c: 81 c7 e0 08 ret <== NOT EXECUTED 4000e670: 81 e8 00 00 restore <== NOT EXECUTED 40006ba8 : rtems_name name, rtems_attribute attribute_set, uint32_t maximum_waiters, rtems_id *id ) { 40006ba8: 9d e3 bf 90 save %sp, -112, %sp Barrier_Control *the_barrier; CORE_barrier_Attributes the_attributes; if ( !rtems_is_name_valid( name ) ) 40006bac: a2 96 20 00 orcc %i0, 0, %l1 40006bb0: 02 80 00 1b be 40006c1c 40006bb4: b0 10 20 03 mov 3, %i0 return RTEMS_INVALID_NAME; if ( !id ) 40006bb8: 80 a6 e0 00 cmp %i3, 0 40006bbc: 02 80 00 18 be 40006c1c 40006bc0: b0 10 20 09 mov 9, %i0 return RTEMS_INVALID_ADDRESS; /* Initialize core barrier attributes */ if ( _Attributes_Is_barrier_automatic( attribute_set ) ) { 40006bc4: 80 8e 60 10 btst 0x10, %i1 40006bc8: 02 80 00 06 be 40006be0 40006bcc: 80 a6 a0 00 cmp %i2, 0 the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE; if ( maximum_waiters == 0 ) 40006bd0: 02 80 00 13 be 40006c1c 40006bd4: b0 10 20 0a mov 0xa, %i0 if ( !id ) return RTEMS_INVALID_ADDRESS; /* Initialize core barrier attributes */ if ( _Attributes_Is_barrier_automatic( attribute_set ) ) { the_attributes.discipline = CORE_BARRIER_AUTOMATIC_RELEASE; 40006bd8: 10 80 00 04 b 40006be8 40006bdc: c0 27 bf f0 clr [ %fp + -16 ] if ( maximum_waiters == 0 ) return RTEMS_INVALID_NUMBER; } else the_attributes.discipline = CORE_BARRIER_MANUAL_RELEASE; 40006be0: 82 10 20 01 mov 1, %g1 40006be4: c2 27 bf f0 st %g1, [ %fp + -16 ] rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40006be8: 05 10 00 7d sethi %hi(0x4001f400), %g2 40006bec: c2 00 a0 00 ld [ %g2 ], %g1 the_attributes.maximum_count = maximum_waiters; 40006bf0: f4 27 bf f4 st %i2, [ %fp + -12 ] 40006bf4: 82 00 60 01 inc %g1 40006bf8: c2 20 a0 00 st %g1, [ %g2 ] * This function allocates a barrier control block from * the inactive chain of free barrier control blocks. */ RTEMS_INLINE_ROUTINE Barrier_Control *_Barrier_Allocate( void ) { return (Barrier_Control *) _Objects_Allocate( &_Barrier_Information ); 40006bfc: 21 10 00 7c sethi %hi(0x4001f000), %l0 40006c00: 40 00 09 fc call 400093f0 <_Objects_Allocate> 40006c04: 90 14 22 68 or %l0, 0x268, %o0 ! 4001f268 <_Barrier_Information> _Thread_Disable_dispatch(); /* prevents deletion */ the_barrier = _Barrier_Allocate(); if ( !the_barrier ) { 40006c08: b4 92 20 00 orcc %o0, 0, %i2 40006c0c: 12 80 00 06 bne 40006c24 40006c10: 90 06 a0 14 add %i2, 0x14, %o0 _Thread_Enable_dispatch(); 40006c14: 7f ff ff d8 call 40006b74 <_Thread_Enable_dispatch> 40006c18: b0 10 20 05 mov 5, %i0 40006c1c: 81 c7 e0 08 ret 40006c20: 81 e8 00 00 restore return RTEMS_TOO_MANY; } the_barrier->attribute_set = attribute_set; 40006c24: f2 26 a0 10 st %i1, [ %i2 + 0x10 ] _CORE_barrier_Initialize( &the_barrier->Barrier, &the_attributes ); 40006c28: 40 00 07 3e call 40008920 <_CORE_barrier_Initialize> 40006c2c: 92 07 bf f0 add %fp, -16, %o1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40006c30: 90 14 22 68 or %l0, 0x268, %o0 Objects_Name name ) { uint32_t index; index = _Objects_Get_index( the_object->id ); 40006c34: c6 06 a0 08 ld [ %i2 + 8 ], %g3 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40006c38: c4 12 20 10 lduh [ %o0 + 0x10 ], %g2 40006c3c: 03 00 00 3f sethi %hi(0xfc00), %g1 40006c40: 82 10 63 ff or %g1, 0x3ff, %g1 ! ffff 40006c44: 82 08 c0 01 and %g3, %g1, %g1 40006c48: 80 a0 40 02 cmp %g1, %g2 40006c4c: 38 80 00 06 bgu,a 40006c64 40006c50: e2 26 a0 0c st %l1, [ %i2 + 0xc ] <== NOT EXECUTED information->local_table[ index ] = the_object; 40006c54: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 40006c58: 83 28 60 02 sll %g1, 2, %g1 40006c5c: f4 20 80 01 st %i2, [ %g2 + %g1 ] if ( information->is_string ) /* _Objects_Copy_name_string( name, the_object->name ); */ the_object->name = name; else /* _Objects_Copy_name_raw( name, the_object->name, information->name_length ); */ the_object->name = name; 40006c60: e2 26 a0 0c st %l1, [ %i2 + 0xc ] &_Barrier_Information, &the_barrier->Object, (Objects_Name) name ); *id = the_barrier->Object.id; 40006c64: c6 26 c0 00 st %g3, [ %i3 ] _Thread_Enable_dispatch(); 40006c68: 7f ff ff c3 call 40006b74 <_Thread_Enable_dispatch> 40006c6c: b0 10 20 00 clr %i0 return RTEMS_SUCCESSFUL; } 40006c70: 81 c7 e0 08 ret 40006c74: 81 e8 00 00 restore 40006c78 : */ rtems_status_code rtems_barrier_delete( rtems_id id ) { 40006c78: 9d e3 bf 90 save %sp, -112, %sp RTEMS_INLINE_ROUTINE Barrier_Control *_Barrier_Get ( Objects_Id id, Objects_Locations *location ) { return (Barrier_Control *) 40006c7c: 21 10 00 7c sethi %hi(0x4001f000), %l0 40006c80: 92 10 00 18 mov %i0, %o1 40006c84: 94 07 bf f4 add %fp, -12, %o2 40006c88: 40 00 0b 1e call 40009900 <_Objects_Get> 40006c8c: 90 14 22 68 or %l0, 0x268, %o0 Barrier_Control *the_barrier; Objects_Locations location; the_barrier = _Barrier_Get( id, &location ); switch ( location ) { 40006c90: c2 07 bf f4 ld [ %fp + -12 ], %g1 40006c94: 80 a0 60 00 cmp %g1, 0 40006c98: 02 80 00 07 be 40006cb4 40006c9c: b0 10 00 08 mov %o0, %i0 40006ca0: 80 a0 60 02 cmp %g1, 2 40006ca4: 08 80 00 22 bleu 40006d2c 40006ca8: b0 10 20 04 mov 4, %i0 40006cac: 81 c7 e0 08 ret <== NOT EXECUTED 40006cb0: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED case OBJECTS_REMOTE: case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: _CORE_barrier_Flush( 40006cb4: 90 02 20 14 add %o0, 0x14, %o0 40006cb8: 92 10 20 00 clr %o1 40006cbc: 40 00 12 4c call 4000b5ec <_Thread_queue_Flush> 40006cc0: 94 10 20 02 mov 2, %o2 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40006cc4: 90 14 22 68 or %l0, 0x268, %o0 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); 40006cc8: c2 06 20 08 ld [ %i0 + 8 ], %g1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40006ccc: c6 12 20 10 lduh [ %o0 + 0x10 ], %g3 40006cd0: 05 00 00 3f sethi %hi(0xfc00), %g2 40006cd4: 84 10 a3 ff or %g2, 0x3ff, %g2 ! ffff 40006cd8: 82 08 40 02 and %g1, %g2, %g1 40006cdc: 80 a0 40 03 cmp %g1, %g3 40006ce0: 38 80 00 06 bgu,a 40006cf8 40006ce4: c0 26 20 0c clr [ %i0 + 0xc ] <== NOT EXECUTED information->local_table[ index ] = the_object; 40006ce8: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 40006cec: 83 28 60 02 sll %g1, 2, %g1 40006cf0: c0 20 80 01 clr [ %g2 + %g1 ] uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); /* _Objects_Clear_name( the_object->name, information->name_length ); */ the_object->name = 0; 40006cf4: c0 26 20 0c clr [ %i0 + 0xc ] */ RTEMS_INLINE_ROUTINE void _Barrier_Free ( Barrier_Control *the_barrier ) { _Objects_Free( &_Barrier_Information, &the_barrier->Object ); 40006cf8: 40 00 0a c0 call 400097f8 <_Objects_Free> 40006cfc: 92 10 00 18 mov %i0, %o1 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40006d00: 03 10 00 7d sethi %hi(0x4001f400), %g1 40006d04: c4 00 60 00 ld [ %g1 ], %g2 40006d08: b0 10 20 00 clr %i0 40006d0c: 84 00 bf ff add %g2, -1, %g2 40006d10: c4 20 60 00 st %g2, [ %g1 ] 40006d14: c2 00 60 00 ld [ %g1 ], %g1 40006d18: 80 a0 60 00 cmp %g1, 0 40006d1c: 12 80 00 04 bne 40006d2c 40006d20: 01 00 00 00 nop _Thread_Dispatch(); 40006d24: 40 00 0f eb call 4000acd0 <_Thread_Dispatch> 40006d28: 01 00 00 00 nop _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40006d2c: 81 c7 e0 08 ret 40006d30: 81 e8 00 00 restore 40006d6c : rtems_status_code rtems_barrier_release( rtems_id id, uint32_t *released ) { 40006d6c: 9d e3 bf 90 save %sp, -112, %sp 40006d70: a0 10 00 18 mov %i0, %l0 Barrier_Control *the_barrier; Objects_Locations location; if ( !released ) 40006d74: 80 a6 60 00 cmp %i1, 0 40006d78: 02 80 00 1f be 40006df4 40006d7c: b0 10 20 09 mov 9, %i0 RTEMS_INLINE_ROUTINE Barrier_Control *_Barrier_Get ( Objects_Id id, Objects_Locations *location ) { return (Barrier_Control *) 40006d80: 11 10 00 7c sethi %hi(0x4001f000), %o0 40006d84: 92 10 00 10 mov %l0, %o1 40006d88: 90 12 22 68 or %o0, 0x268, %o0 40006d8c: 40 00 0a dd call 40009900 <_Objects_Get> 40006d90: 94 07 bf f4 add %fp, -12, %o2 return RTEMS_INVALID_ADDRESS; the_barrier = _Barrier_Get( id, &location ); switch ( location ) { 40006d94: c2 07 bf f4 ld [ %fp + -12 ], %g1 40006d98: 80 a0 60 00 cmp %g1, 0 40006d9c: 02 80 00 07 be 40006db8 40006da0: 92 10 00 10 mov %l0, %o1 40006da4: 80 a0 60 02 cmp %g1, 2 40006da8: 08 80 00 13 bleu 40006df4 40006dac: b0 10 20 04 mov 4, %i0 40006db0: 81 c7 e0 08 ret <== NOT EXECUTED 40006db4: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED case OBJECTS_REMOTE: case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: *released = _CORE_barrier_Release( &the_barrier->Barrier, id, NULL ); 40006db8: 94 10 20 00 clr %o2 40006dbc: 40 00 06 e5 call 40008950 <_CORE_barrier_Release> 40006dc0: 90 02 20 14 add %o0, 0x14, %o0 40006dc4: d0 26 40 00 st %o0, [ %i1 ] #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40006dc8: 03 10 00 7d sethi %hi(0x4001f400), %g1 40006dcc: c4 00 60 00 ld [ %g1 ], %g2 40006dd0: b0 10 20 00 clr %i0 40006dd4: 84 00 bf ff add %g2, -1, %g2 40006dd8: c4 20 60 00 st %g2, [ %g1 ] 40006ddc: c2 00 60 00 ld [ %g1 ], %g1 40006de0: 80 a0 60 00 cmp %g1, 0 40006de4: 12 80 00 04 bne 40006df4 40006de8: 01 00 00 00 nop _Thread_Dispatch(); 40006dec: 40 00 0f b9 call 4000acd0 <_Thread_Dispatch> 40006df0: 01 00 00 00 nop return RTEMS_SUCCESSFUL; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40006df4: 81 c7 e0 08 ret 40006df8: 81 e8 00 00 restore 40006dfc : rtems_status_code rtems_barrier_wait( rtems_id id, rtems_interval timeout ) { 40006dfc: 9d e3 bf 90 save %sp, -112, %sp 40006e00: 11 10 00 7c sethi %hi(0x4001f000), %o0 40006e04: 92 10 00 18 mov %i0, %o1 40006e08: 90 12 22 68 or %o0, 0x268, %o0 40006e0c: 40 00 0a bd call 40009900 <_Objects_Get> 40006e10: 94 07 bf f4 add %fp, -12, %o2 Barrier_Control *the_barrier; Objects_Locations location; the_barrier = _Barrier_Get( id, &location ); switch ( location ) { 40006e14: c2 07 bf f4 ld [ %fp + -12 ], %g1 40006e18: 80 a0 60 00 cmp %g1, 0 40006e1c: 02 80 00 07 be 40006e38 40006e20: 96 10 00 19 mov %i1, %o3 40006e24: 80 a0 60 02 cmp %g1, 2 40006e28: 08 80 00 17 bleu 40006e84 40006e2c: 90 10 20 04 mov 4, %o0 40006e30: 10 80 00 15 b 40006e84 <== NOT EXECUTED 40006e34: 90 10 20 19 mov 0x19, %o0 <== NOT EXECUTED case OBJECTS_REMOTE: case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: _CORE_barrier_Wait( 40006e38: 90 02 20 14 add %o0, 0x14, %o0 40006e3c: 92 10 00 18 mov %i0, %o1 40006e40: 94 10 20 01 mov 1, %o2 40006e44: 40 00 06 ce call 4000897c <_CORE_barrier_Wait> 40006e48: 98 10 20 00 clr %o4 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40006e4c: 03 10 00 7d sethi %hi(0x4001f400), %g1 40006e50: c4 00 60 00 ld [ %g1 ], %g2 40006e54: 84 00 bf ff add %g2, -1, %g2 40006e58: c4 20 60 00 st %g2, [ %g1 ] 40006e5c: c2 00 60 00 ld [ %g1 ], %g1 40006e60: 80 a0 60 00 cmp %g1, 0 40006e64: 12 80 00 05 bne 40006e78 40006e68: 03 10 00 7d sethi %hi(0x4001f400), %g1 _Thread_Dispatch(); 40006e6c: 40 00 0f 99 call 4000acd0 <_Thread_Dispatch> 40006e70: 01 00 00 00 nop TRUE, timeout, NULL ); _Thread_Enable_dispatch(); return _Barrier_Translate_core_barrier_return_code( 40006e74: 03 10 00 7d sethi %hi(0x4001f400), %g1 40006e78: c2 00 60 dc ld [ %g1 + 0xdc ], %g1 ! 4001f4dc <_Thread_Executing> 40006e7c: 40 00 1d e9 call 4000e620 <_Barrier_Translate_core_barrier_return_code> 40006e80: d0 00 60 34 ld [ %g1 + 0x34 ], %o0 _Thread_Executing->Wait.return_code ); } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40006e84: 81 c7 e0 08 ret 40006e88: 91 e8 00 08 restore %g0, %o0, %o0 40005cd0 : rtems_status_code rtems_clock_get( rtems_clock_get_options option, void *time_buffer ) { 40005cd0: 9d e3 bf 68 save %sp, -152, %sp 40005cd4: 82 10 00 18 mov %i0, %g1 if ( !time_buffer ) 40005cd8: 80 a6 60 00 cmp %i1, 0 40005cdc: 02 80 00 47 be 40005df8 40005ce0: b0 10 20 09 mov 9, %i0 return RTEMS_INVALID_ADDRESS; switch ( option ) { 40005ce4: 80 a0 60 04 cmp %g1, 4 40005ce8: 18 80 00 44 bgu 40005df8 40005cec: b0 10 20 19 mov 0x19, %i0 40005cf0: 83 28 60 02 sll %g1, 2, %g1 40005cf4: 05 10 00 17 sethi %hi(0x40005c00), %g2 40005cf8: 84 10 a0 7c or %g2, 0x7c, %g2 ! 40005c7c 40005cfc: c2 00 80 01 ld [ %g2 + %g1 ], %g1 40005d00: 81 c0 40 00 jmp %g1 40005d04: 01 00 00 00 nop case RTEMS_CLOCK_GET_TOD: { struct tm time; struct timeval now; rtems_time_of_day *tmbuf = (rtems_time_of_day *)time_buffer; if ( !_TOD_Is_set ) 40005d08: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40005d0c: c2 00 62 0c ld [ %g1 + 0x20c ], %g1 ! 4001ae0c <_TOD_Is_set> 40005d10: 80 a0 60 00 cmp %g1, 0 40005d14: 22 80 00 39 be,a 40005df8 40005d18: b0 10 20 0b mov 0xb, %i0 return RTEMS_NOT_DEFINED; /* Obtain the current time */ _TOD_Get_timeval( &now ); 40005d1c: a0 07 bf f0 add %fp, -16, %l0 40005d20: 7f ff ff dc call 40005c90 <_TOD_Get_timeval> 40005d24: 90 10 00 10 mov %l0, %o0 /* Split it into a closer format */ gmtime_r( &now.tv_sec, &time ); 40005d28: 92 07 bf cc add %fp, -52, %o1 40005d2c: 40 00 26 74 call 4000f6fc 40005d30: 90 10 00 10 mov %l0, %o0 tmbuf->month = time.tm_mon + 1; tmbuf->day = time.tm_mday; tmbuf->hour = time.tm_hour; tmbuf->minute = time.tm_min; tmbuf->second = time.tm_sec; tmbuf->ticks = now.tv_usec / _TOD_Microseconds_per_tick; 40005d34: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40005d38: d2 00 63 ac ld [ %g1 + 0x3ac ], %o1 ! 4001afac <_TOD_Microseconds_per_tick> gmtime_r( &now.tv_sec, &time ); /* Now adjust it to the RTEMS format */ tmbuf->year = time.tm_year + 1900; tmbuf->month = time.tm_mon + 1; tmbuf->day = time.tm_mday; 40005d3c: c2 07 bf d8 ld [ %fp + -40 ], %g1 tmbuf->hour = time.tm_hour; tmbuf->minute = time.tm_min; tmbuf->second = time.tm_sec; tmbuf->ticks = now.tv_usec / _TOD_Microseconds_per_tick; 40005d40: d0 07 bf f4 ld [ %fp + -12 ], %o0 gmtime_r( &now.tv_sec, &time ); /* Now adjust it to the RTEMS format */ tmbuf->year = time.tm_year + 1900; tmbuf->month = time.tm_mon + 1; tmbuf->day = time.tm_mday; 40005d44: c2 26 60 08 st %g1, [ %i1 + 8 ] tmbuf->hour = time.tm_hour; 40005d48: c2 07 bf d4 ld [ %fp + -44 ], %g1 40005d4c: c2 26 60 0c st %g1, [ %i1 + 0xc ] tmbuf->minute = time.tm_min; 40005d50: c2 07 bf d0 ld [ %fp + -48 ], %g1 40005d54: c2 26 60 10 st %g1, [ %i1 + 0x10 ] tmbuf->second = time.tm_sec; 40005d58: c2 07 bf cc ld [ %fp + -52 ], %g1 40005d5c: c2 26 60 14 st %g1, [ %i1 + 0x14 ] /* Split it into a closer format */ gmtime_r( &now.tv_sec, &time ); /* Now adjust it to the RTEMS format */ tmbuf->year = time.tm_year + 1900; 40005d60: c2 07 bf e0 ld [ %fp + -32 ], %g1 40005d64: 82 00 67 6c add %g1, 0x76c, %g1 40005d68: c2 26 40 00 st %g1, [ %i1 ] tmbuf->month = time.tm_mon + 1; 40005d6c: c2 07 bf dc ld [ %fp + -36 ], %g1 40005d70: 82 00 60 01 inc %g1 tmbuf->day = time.tm_mday; tmbuf->hour = time.tm_hour; tmbuf->minute = time.tm_min; tmbuf->second = time.tm_sec; tmbuf->ticks = now.tv_usec / _TOD_Microseconds_per_tick; 40005d74: 40 00 40 bb call 40016060 <.udiv> 40005d78: c2 26 60 04 st %g1, [ %i1 + 4 ] 40005d7c: 10 80 00 1c b 40005dec 40005d80: d0 26 60 18 st %o0, [ %i1 + 0x18 ] return RTEMS_SUCCESSFUL; } case RTEMS_CLOCK_GET_SECONDS_SINCE_EPOCH: { rtems_interval *interval = (rtems_interval *)time_buffer; if ( !_TOD_Is_set ) 40005d84: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40005d88: c2 00 62 0c ld [ %g1 + 0x20c ], %g1 ! 4001ae0c <_TOD_Is_set> 40005d8c: 80 a0 60 00 cmp %g1, 0 40005d90: 02 80 00 19 be 40005df4 40005d94: 03 10 00 6b sethi %hi(0x4001ac00), %g1 return RTEMS_NOT_DEFINED; *interval = _TOD_Seconds_since_epoch; 40005d98: 10 80 00 04 b 40005da8 40005d9c: c2 00 62 88 ld [ %g1 + 0x288 ], %g1 ! 4001ae88 <_TOD_Now> } case RTEMS_CLOCK_GET_TICKS_SINCE_BOOT: { rtems_interval *interval = (rtems_interval *)time_buffer; *interval = _Watchdog_Ticks_since_boot; 40005da0: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40005da4: c2 00 63 54 ld [ %g1 + 0x354 ], %g1 ! 4001af54 <_Watchdog_Ticks_since_boot> 40005da8: c2 26 40 00 st %g1, [ %i1 ] 40005dac: 81 c7 e0 08 ret 40005db0: 91 e8 20 00 restore %g0, 0, %o0 } case RTEMS_CLOCK_GET_TICKS_PER_SECOND: { rtems_interval *interval = (rtems_interval *)time_buffer; *interval = TOD_MICROSECONDS_PER_SECOND / _TOD_Microseconds_per_tick; 40005db4: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40005db8: d2 00 63 ac ld [ %g1 + 0x3ac ], %o1 ! 4001afac <_TOD_Microseconds_per_tick> 40005dbc: 11 00 03 d0 sethi %hi(0xf4000), %o0 40005dc0: 40 00 40 a8 call 40016060 <.udiv> 40005dc4: 90 12 22 40 or %o0, 0x240, %o0 ! f4240 40005dc8: 10 80 00 09 b 40005dec 40005dcc: d0 26 40 00 st %o0, [ %i1 ] } case RTEMS_CLOCK_GET_TIME_VALUE: { struct timeval *time = (struct timeval *)time_buffer; if ( !_TOD_Is_set ) 40005dd0: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 40005dd4: c2 00 62 0c ld [ %g1 + 0x20c ], %g1 ! 4001ae0c <_TOD_Is_set> <== NOT EXECUTED 40005dd8: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40005ddc: 22 80 00 07 be,a 40005df8 <== NOT EXECUTED 40005de0: b0 10 20 0b mov 0xb, %i0 <== NOT EXECUTED return RTEMS_NOT_DEFINED; _TOD_Get_timeval( time ); 40005de4: 7f ff ff ab call 40005c90 <_TOD_Get_timeval> <== NOT EXECUTED 40005de8: 90 10 00 19 mov %i1, %o0 <== NOT EXECUTED 40005dec: 81 c7 e0 08 ret 40005df0: 91 e8 20 00 restore %g0, 0, %o0 return RTEMS_SUCCESSFUL; 40005df4: b0 10 20 0b mov 0xb, %i0 <== NOT EXECUTED } } return RTEMS_INTERNAL_ERROR; /* should never get here */ } 40005df8: 81 c7 e0 08 ret 40005dfc: 81 e8 00 00 restore 40005e20 : * * NOTE: This routine only works for leap-years through 2099. */ rtems_status_code rtems_clock_tick( void ) { 40005e20: 9d e3 bf 98 save %sp, -104, %sp _TOD_Tickle_ticks(); 40005e24: 40 00 07 40 call 40007b24 <_TOD_Tickle_ticks> 40005e28: 01 00 00 00 nop */ RTEMS_INLINE_ROUTINE void _Watchdog_Tickle_ticks( void ) { _Watchdog_Tickle( &_Watchdog_Ticks_chain ); 40005e2c: 11 10 00 6b sethi %hi(0x4001ac00), %o0 40005e30: 40 00 14 4e call 4000af68 <_Watchdog_Tickle> 40005e34: 90 12 22 cc or %o0, 0x2cc, %o0 ! 4001aecc <_Watchdog_Ticks_chain> _Watchdog_Tickle_ticks(); _Thread_Tickle_timeslice(); 40005e38: 40 00 12 a5 call 4000a8cc <_Thread_Tickle_timeslice> 40005e3c: 01 00 00 00 nop * otherwise. */ RTEMS_INLINE_ROUTINE boolean _Thread_Is_context_switch_necessary( void ) { return ( _Context_Switch_necessary ); 40005e40: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40005e44: c2 00 62 bc ld [ %g1 + 0x2bc ], %g1 ! 4001aebc <_Context_Switch_necessary> if ( _Thread_Is_context_switch_necessary() && 40005e48: 80 a0 60 00 cmp %g1, 0 40005e4c: 02 80 00 08 be 40005e6c 40005e50: 03 10 00 6b sethi %hi(0x4001ac00), %g1 * otherwise. */ RTEMS_INLINE_ROUTINE boolean _Thread_Is_dispatching_enabled( void ) { return ( _Thread_Dispatch_disable_level == 0 ); 40005e54: c2 00 61 d0 ld [ %g1 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> 40005e58: 80 a0 60 00 cmp %g1, 0 40005e5c: 12 80 00 04 bne 40005e6c 40005e60: 01 00 00 00 nop _Thread_Is_dispatching_enabled() ) _Thread_Dispatch(); 40005e64: 40 00 0e e2 call 400099ec <_Thread_Dispatch> <== NOT EXECUTED 40005e68: 01 00 00 00 nop <== NOT EXECUTED return RTEMS_SUCCESSFUL; } 40005e6c: 81 c7 e0 08 ret 40005e70: 91 e8 20 00 restore %g0, 0, %o0 4000393c : void rtems_cpu_usage_report_with_plugin( void *context, rtems_printk_plugin_t print ) { 4000393c: 9d e3 bf 68 save %sp, -152, %sp struct timespec uptime, total, ran; #else uint32_t total_units = 0; #endif if ( !print ) 40003940: 80 a6 60 00 cmp %i1, 0 40003944: 02 80 00 62 be 40003acc 40003948: a0 07 bf e0 add %fp, -32, %l0 * 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. */ #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS _TOD_Get_uptime( &uptime ); 4000394c: 40 00 16 94 call 4000939c <_TOD_Get_uptime> 40003950: 90 10 00 10 mov %l0, %o0 _Timespec_Subtract( &CPU_usage_Uptime_at_last_reset, &uptime, &total ); 40003954: 92 10 00 10 mov %l0, %o1 40003958: a2 07 bf d8 add %fp, -40, %l1 4000395c: 11 10 00 a0 sethi %hi(0x40028000), %o0 40003960: 94 10 00 11 mov %l1, %o2 40003964: 40 00 24 30 call 4000ca24 <_Timespec_Subtract> 40003968: 90 12 20 84 or %o0, 0x84, %o0 } } } #endif (*print)( context, "CPU Usage by thread\n" 4000396c: 90 10 00 18 mov %i0, %o0 40003970: 13 10 00 73 sethi %hi(0x4001cc00), %o1 40003974: 9f c6 40 00 call %i1 40003978: 92 12 61 50 or %o1, 0x150, %o1 ! 4001cd50 4000397c: 03 10 00 9e sethi %hi(0x40027800), %g1 the_thread = (Thread_Control *)information->local_table[ i ]; if ( !the_thread ) continue; rtems_object_get_name( the_thread->Object.id, sizeof(name), name ); 40003980: ac 07 bf eb add %fp, -21, %l6 } } } #endif (*print)( context, "CPU Usage by thread\n" 40003984: a6 10 61 54 or %g1, 0x154, %l3 /* * 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 ) { 40003988: 37 10 00 9e sethi %hi(0x40027800), %i3 struct timespec used; _Timespec_Subtract( 4000398c: 03 10 00 9e sethi %hi(0x40027800), %g1 &_Thread_Time_of_last_context_switch, &uptime, &used ); _Timespec_Add_to( &ran, &used ); }; _Timespec_Divide( &ran, &total, &ival, &fval ); 40003990: aa 07 bf d0 add %fp, -48, %l5 * since the last context switch. */ ran = the_thread->cpu_time_used; if ( _Thread_Executing->Object.id == the_thread->Object.id ) { struct timespec used; _Timespec_Subtract( 40003994: b4 10 62 d4 or %g1, 0x2d4, %i2 &_Thread_Time_of_last_context_switch, &uptime, &used ); _Timespec_Add_to( &ran, &used ); }; _Timespec_Divide( &ran, &total, &ival, &fval ); 40003998: b8 07 bf f4 add %fp, -12, %i4 4000399c: ba 07 bf f0 add %fp, -16, %i5 * since the last context switch. */ ran = the_thread->cpu_time_used; if ( _Thread_Executing->Object.id == the_thread->Object.id ) { struct timespec used; _Timespec_Subtract( 400039a0: a8 07 bf c8 add %fp, -56, %l4 " ID NAME TICKS PERCENT\n" #endif ); for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; 400039a4: ae 04 e0 10 add %l3, 0x10, %l7 api_index++ ) { if ( !_Objects_Information_table[ api_index ] ) 400039a8: c2 04 c0 00 ld [ %l3 ], %g1 400039ac: 80 a0 60 00 cmp %g1, 0 400039b0: 22 80 00 3b be,a 40003a9c 400039b4: a6 04 e0 04 add %l3, 4, %l3 continue; information = _Objects_Information_table[ api_index ][ 1 ]; 400039b8: e2 00 60 04 ld [ %g1 + 4 ], %l1 if ( information ) { 400039bc: 80 a4 60 00 cmp %l1, 0 400039c0: 12 80 00 30 bne 40003a80 400039c4: a4 10 20 01 mov 1, %l2 for ( i=1 ; i <= information->maximum ; i++ ) { 400039c8: 10 80 00 35 b 40003a9c <== NOT EXECUTED 400039cc: a6 04 e0 04 add %l3, 4, %l3 <== NOT EXECUTED the_thread = (Thread_Control *)information->local_table[ i ]; 400039d0: c2 04 60 20 ld [ %l1 + 0x20 ], %g1 400039d4: e0 00 40 02 ld [ %g1 + %g2 ], %l0 if ( !the_thread ) 400039d8: 80 a4 20 00 cmp %l0, 0 400039dc: 02 80 00 29 be 40003a80 400039e0: a4 04 a0 01 inc %l2 continue; rtems_object_get_name( the_thread->Object.id, sizeof(name), name ); 400039e4: 40 00 0f a4 call 40007874 400039e8: d0 04 20 08 ld [ %l0 + 8 ], %o0 (*print)( context, "0x%08" PRIx32 " %4s ", the_thread->Object.id, name ); 400039ec: d4 04 20 08 ld [ %l0 + 8 ], %o2 400039f0: 90 10 00 18 mov %i0, %o0 400039f4: 13 10 00 73 sethi %hi(0x4001cc00), %o1 400039f8: 96 10 00 16 mov %l6, %o3 400039fc: 9f c6 40 00 call %i1 40003a00: 92 12 61 90 or %o1, 0x190, %o1 #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS /* * If this is the currently executing thread, account for time * since the last context switch. */ ran = the_thread->cpu_time_used; 40003a04: c4 1c 20 90 ldd [ %l0 + 0x90 ], %g2 if ( _Thread_Executing->Object.id == the_thread->Object.id ) { 40003a08: c2 06 e2 cc ld [ %i3 + 0x2cc ], %g1 #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS /* * If this is the currently executing thread, account for time * since the last context switch. */ ran = the_thread->cpu_time_used; 40003a0c: c4 3f bf d0 std %g2, [ %fp + -48 ] if ( _Thread_Executing->Object.id == the_thread->Object.id ) { 40003a10: c4 00 60 08 ld [ %g1 + 8 ], %g2 40003a14: c2 04 20 08 ld [ %l0 + 8 ], %g1 40003a18: 80 a0 80 01 cmp %g2, %g1 40003a1c: 12 80 00 0a bne 40003a44 40003a20: 94 10 00 1c mov %i4, %o2 struct timespec used; _Timespec_Subtract( 40003a24: 90 10 00 1a mov %i2, %o0 40003a28: 92 07 bf e0 add %fp, -32, %o1 40003a2c: 40 00 23 fe call 4000ca24 <_Timespec_Subtract> 40003a30: 94 10 00 14 mov %l4, %o2 &_Thread_Time_of_last_context_switch, &uptime, &used ); _Timespec_Add_to( &ran, &used ); 40003a34: 90 10 00 15 mov %l5, %o0 40003a38: 40 00 23 53 call 4000c784 <_Timespec_Add_to> 40003a3c: 92 10 00 14 mov %l4, %o1 }; _Timespec_Divide( &ran, &total, &ival, &fval ); 40003a40: 94 10 00 1c mov %i4, %o2 40003a44: 96 10 00 1d mov %i5, %o3 40003a48: 90 10 00 15 mov %l5, %o0 40003a4c: 40 00 23 66 call 4000c7e4 <_Timespec_Divide> 40003a50: 92 07 bf d8 add %fp, -40, %o1 /* * Print the information */ (*print)( context, 40003a54: d0 07 bf d4 ld [ %fp + -44 ], %o0 40003a58: 40 00 57 9a call 400198c0 <.udiv> 40003a5c: 92 10 23 e8 mov 0x3e8, %o1 40003a60: d4 07 bf d0 ld [ %fp + -48 ], %o2 40003a64: d8 07 bf f4 ld [ %fp + -12 ], %o4 40003a68: da 07 bf f0 ld [ %fp + -16 ], %o5 40003a6c: 96 10 00 08 mov %o0, %o3 40003a70: 13 10 00 73 sethi %hi(0x4001cc00), %o1 40003a74: 90 10 00 18 mov %i0, %o0 40003a78: 9f c6 40 00 call %i1 40003a7c: 92 12 61 a8 or %o1, 0x1a8, %o1 api_index++ ) { if ( !_Objects_Information_table[ api_index ] ) continue; information = _Objects_Information_table[ api_index ][ 1 ]; if ( information ) { for ( i=1 ; i <= information->maximum ; i++ ) { 40003a80: c2 14 60 10 lduh [ %l1 + 0x10 ], %g1 the_thread = (Thread_Control *)information->local_table[ i ]; if ( !the_thread ) continue; rtems_object_get_name( the_thread->Object.id, sizeof(name), name ); 40003a84: 94 10 00 16 mov %l6, %o2 40003a88: 92 10 20 05 mov 5, %o1 api_index++ ) { if ( !_Objects_Information_table[ api_index ] ) continue; information = _Objects_Information_table[ api_index ][ 1 ]; if ( information ) { for ( i=1 ; i <= information->maximum ; i++ ) { 40003a8c: 80 a4 80 01 cmp %l2, %g1 40003a90: 08 bf ff d0 bleu 400039d0 40003a94: 85 2c a0 02 sll %l2, 2, %g2 40003a98: a6 04 e0 04 add %l3, 4, %l3 " ID NAME TICKS PERCENT\n" #endif ); for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; 40003a9c: 80 a4 c0 17 cmp %l3, %l7 40003aa0: 32 bf ff c3 bne,a 400039ac 40003aa4: c2 04 c0 00 ld [ %l3 ], %g1 } } } #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS (*print)( context, "Time since last CPU Usage reset %" PRId32 40003aa8: d0 07 bf dc ld [ %fp + -36 ], %o0 40003aac: 40 00 57 85 call 400198c0 <.udiv> 40003ab0: 92 10 23 e8 mov 0x3e8, %o1 40003ab4: d4 07 bf d8 ld [ %fp + -40 ], %o2 40003ab8: 96 10 00 08 mov %o0, %o3 40003abc: 13 10 00 73 sethi %hi(0x4001cc00), %o1 40003ac0: 90 10 00 18 mov %i0, %o0 40003ac4: 9f c6 40 00 call %i1 40003ac8: 92 12 61 c0 or %o1, 0x1c0, %o1 40003acc: 81 c7 e0 08 ret 40003ad0: 81 e8 00 00 restore 4000e18c : { 0, 0, 0 }, }; static int rtems_deviceio_errno(rtems_status_code code) { 4000e18c: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED int rc; if ((rc = rtems_assoc_remote_by_local(errno_assoc, (uint32_t ) code))) 4000e190: 11 10 00 68 sethi %hi(0x4001a000), %o0 <== NOT EXECUTED 4000e194: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED 4000e198: 40 00 01 2d call 4000e64c <== NOT EXECUTED 4000e19c: 90 12 22 b4 or %o0, 0x2b4, %o0 <== NOT EXECUTED 4000e1a0: b0 92 20 00 orcc %o0, 0, %i0 <== NOT EXECUTED 4000e1a4: 02 80 00 05 be 4000e1b8 <== NOT EXECUTED 4000e1a8: 01 00 00 00 nop <== NOT EXECUTED { errno = rc; 4000e1ac: 40 00 03 84 call 4000efbc <__errno> <== NOT EXECUTED 4000e1b0: 01 00 00 00 nop <== NOT EXECUTED 4000e1b4: f0 22 00 00 st %i0, [ %o0 ] <== NOT EXECUTED return -1; } return -1; } 4000e1b8: 81 c7 e0 08 ret <== NOT EXECUTED 4000e1bc: 91 e8 3f ff restore %g0, -1, %o0 <== NOT EXECUTED 40007030 : int rtems_error( int error_flag, const char *printf_format, ... ) { 40007030: 9d e3 bf 90 save %sp, -112, %sp <== NOT EXECUTED va_list arglist; int chars_written; va_start(arglist, printf_format); 40007034: 94 07 a0 4c add %fp, 0x4c, %o2 <== NOT EXECUTED int rtems_error( int error_flag, const char *printf_format, ... ) { 40007038: f4 27 a0 4c st %i2, [ %fp + 0x4c ] <== NOT EXECUTED 4000703c: f6 27 a0 50 st %i3, [ %fp + 0x50 ] <== NOT EXECUTED 40007040: f8 27 a0 54 st %i4, [ %fp + 0x54 ] <== NOT EXECUTED 40007044: fa 27 a0 58 st %i5, [ %fp + 0x58 ] <== NOT EXECUTED va_list arglist; int chars_written; va_start(arglist, printf_format); chars_written = rtems_verror(error_flag, printf_format, arglist); 40007048: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 4000704c: 92 10 00 19 mov %i1, %o1 <== NOT EXECUTED 40007050: 7f ff ff 7f call 40006e4c <== NOT EXECUTED 40007054: d4 27 bf f4 st %o2, [ %fp + -12 ] <== NOT EXECUTED va_end(arglist); return chars_written; } 40007058: 81 c7 e0 08 ret <== NOT EXECUTED 4000705c: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED 40006084 : rtems_status_code rtems_event_send( Objects_Id id, rtems_event_set event_in ) { 40006084: 9d e3 bf 90 save %sp, -112, %sp uint32_t the_api; uint32_t the_class; Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { 40006088: 92 96 20 00 orcc %i0, 0, %o1 4000608c: 12 80 00 0a bne 400060b4 40006090: 83 32 60 18 srl %o1, 0x18, %g1 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40006094: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40006098: c4 00 61 d0 ld [ %g1 + 0x1d0 ], %g2 ! 4001add0 <_Thread_Dispatch_disable_level> 4000609c: 84 00 a0 01 inc %g2 400060a0: c4 20 61 d0 st %g2, [ %g1 + 0x1d0 ] Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; tp = _Thread_Executing; 400060a4: 03 10 00 6b sethi %hi(0x4001ac00), %g1 400060a8: f0 00 62 ac ld [ %g1 + 0x2ac ], %i0 ! 4001aeac <_Thread_Executing> Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; 400060ac: 10 80 00 18 b 4000610c 400060b0: c0 27 bf f4 clr [ %fp + -12 ] */ RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API( Objects_Id id ) { return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS); 400060b4: 84 08 60 07 and %g1, 7, %g2 tp = _Thread_Executing; goto done; } the_api = _Objects_Get_API( id ); if ( the_api && the_api > OBJECTS_APIS_LAST ) { 400060b8: 80 a0 a0 04 cmp %g2, 4 400060bc: 18 80 00 0e bgu 400060f4 400060c0: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; goto done; } the_class = _Objects_Get_class( id ); if ( the_class != 1 ) { /* threads are always first class :) */ 400060c4: 83 32 60 1b srl %o1, 0x1b, %g1 400060c8: 80 a0 60 01 cmp %g1, 1 400060cc: 12 80 00 0a bne 400060f4 400060d0: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; goto done; } information = _Objects_Information_table[ the_api ][ the_class ]; 400060d4: 83 28 a0 02 sll %g2, 2, %g1 400060d8: 05 10 00 6b sethi %hi(0x4001ac00), %g2 400060dc: 84 10 a1 30 or %g2, 0x130, %g2 ! 4001ad30 <_Objects_Information_table> 400060e0: c2 00 80 01 ld [ %g2 + %g1 ], %g1 400060e4: d0 00 60 04 ld [ %g1 + 4 ], %o0 if ( !information ) { 400060e8: 80 a2 20 00 cmp %o0, 0 400060ec: 12 80 00 05 bne 40006100 400060f0: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 400060f4: b0 10 20 00 clr %i0 400060f8: 10 80 00 05 b 4000610c 400060fc: c2 27 bf f4 st %g1, [ %fp + -12 ] goto done; } tp = (Thread_Control *) _Objects_Get( information, id, location ); 40006100: 40 00 09 47 call 4000861c <_Objects_Get> 40006104: 94 07 bf f4 add %fp, -12, %o2 40006108: b0 10 00 08 mov %o0, %i0 register Thread_Control *the_thread; Objects_Locations location; RTEMS_API_Control *api; the_thread = _Thread_Get( id, &location ); switch ( location ) { 4000610c: c2 07 bf f4 ld [ %fp + -12 ], %g1 40006110: 80 a0 60 00 cmp %g1, 0 40006114: 02 80 00 06 be 4000612c 40006118: 80 a0 60 02 cmp %g1, 2 4000611c: 08 80 00 18 bleu 4000617c 40006120: b0 10 20 04 mov 4, %i0 40006124: 81 c7 e0 08 ret <== NOT EXECUTED 40006128: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED rtems_event_set *the_event_set ) { ISR_Level level; _ISR_Disable( level ); 4000612c: 7f ff ef 68 call 40001ecc 40006130: e0 06 21 6c ld [ %i0 + 0x16c ], %l0 *the_event_set |= the_new_events; 40006134: c2 04 20 40 ld [ %l0 + 0x40 ], %g1 40006138: 82 10 40 19 or %g1, %i1, %g1 4000613c: c2 24 20 40 st %g1, [ %l0 + 0x40 ] _ISR_Enable( level ); 40006140: 7f ff ef 67 call 40001edc 40006144: 01 00 00 00 nop case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: api = the_thread->API_Extensions[ THREAD_API_RTEMS ]; _Event_sets_Post( event_in, &api->pending_events ); _Event_Surrender( the_thread ); 40006148: 40 00 00 15 call 4000619c <_Event_Surrender> 4000614c: 90 10 00 18 mov %i0, %o0 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40006150: 05 10 00 6b sethi %hi(0x4001ac00), %g2 40006154: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> 40006158: b0 10 20 00 clr %i0 4000615c: 82 00 7f ff add %g1, -1, %g1 40006160: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] 40006164: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 40006168: 80 a0 60 00 cmp %g1, 0 4000616c: 12 80 00 04 bne 4000617c 40006170: 01 00 00 00 nop _Thread_Dispatch(); 40006174: 40 00 0e 1e call 400099ec <_Thread_Dispatch> 40006178: 01 00 00 00 nop _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 4000617c: 81 c7 e0 08 ret 40006180: 81 e8 00 00 restore 4000ba94 : rtems_status_code rtems_extension_create( rtems_name name, rtems_extensions_table *extension_table, Objects_Id *id ) { 4000ba94: 9d e3 bf 98 save %sp, -104, %sp Extension_Control *the_extension; if ( !rtems_is_name_valid( name ) ) 4000ba98: a4 96 20 00 orcc %i0, 0, %l2 4000ba9c: 02 80 00 0e be 4000bad4 4000baa0: b0 10 20 03 mov 3, %i0 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 4000baa4: 05 10 00 a7 sethi %hi(0x40029c00), %g2 4000baa8: c2 00 a0 60 ld [ %g2 + 0x60 ], %g1 ! 40029c60 <_Thread_Dispatch_disable_level> 4000baac: 82 00 60 01 inc %g1 4000bab0: c2 20 a0 60 st %g1, [ %g2 + 0x60 ] * the inactive chain of free extension control blocks. */ RTEMS_INLINE_ROUTINE Extension_Control *_Extension_Allocate( void ) { return (Extension_Control *) _Objects_Allocate( &_Extension_Information ); 4000bab4: 23 10 00 a7 sethi %hi(0x40029c00), %l1 4000bab8: 40 00 03 ac call 4000c968 <_Objects_Allocate> 4000babc: 90 14 62 fc or %l1, 0x2fc, %o0 ! 40029efc <_Extension_Information> _Thread_Disable_dispatch(); /* to prevent deletion */ the_extension = _Extension_Allocate(); if ( !the_extension ) { 4000bac0: a0 92 20 00 orcc %o0, 0, %l0 4000bac4: 12 80 00 06 bne 4000badc 4000bac8: 90 04 20 10 add %l0, 0x10, %o0 _Thread_Enable_dispatch(); 4000bacc: 7f ff ff e5 call 4000ba60 <_Thread_Enable_dispatch> <== NOT EXECUTED 4000bad0: b0 10 20 05 mov 5, %i0 <== NOT EXECUTED 4000bad4: 81 c7 e0 08 ret <== NOT EXECUTED 4000bad8: 81 e8 00 00 restore <== NOT EXECUTED return RTEMS_TOO_MANY; } _User_extensions_Add_set( &the_extension->Extension, extension_table ); 4000badc: 40 00 0e 28 call 4000f37c <_User_extensions_Add_set> 4000bae0: 92 10 00 19 mov %i1, %o1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 4000bae4: 90 14 62 fc or %l1, 0x2fc, %o0 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, the_object ); 4000bae8: c2 04 20 08 ld [ %l0 + 8 ], %g1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 4000baec: c6 12 20 10 lduh [ %o0 + 0x10 ], %g3 4000baf0: 05 00 00 3f sethi %hi(0xfc00), %g2 4000baf4: 84 10 a3 ff or %g2, 0x3ff, %g2 ! ffff 4000baf8: 82 08 40 02 and %g1, %g2, %g1 4000bafc: 80 a0 40 03 cmp %g1, %g3 4000bb00: 38 80 00 06 bgu,a 4000bb18 4000bb04: c2 04 20 08 ld [ %l0 + 8 ], %g1 <== NOT EXECUTED information->local_table[ index ] = the_object; 4000bb08: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 4000bb0c: 83 28 60 02 sll %g1, 2, %g1 4000bb10: e0 20 80 01 st %l0, [ %g2 + %g1 ] &_Extension_Information, &the_extension->Object, (Objects_Name) name ); *id = the_extension->Object.id; 4000bb14: c2 04 20 08 ld [ %l0 + 8 ], %g1 if ( information->is_string ) /* _Objects_Copy_name_string( name, the_object->name ); */ the_object->name = name; else /* _Objects_Copy_name_raw( name, the_object->name, information->name_length ); */ the_object->name = name; 4000bb18: e4 24 20 0c st %l2, [ %l0 + 0xc ] 4000bb1c: c2 26 80 00 st %g1, [ %i2 ] _Thread_Enable_dispatch(); 4000bb20: 7f ff ff d0 call 4000ba60 <_Thread_Enable_dispatch> 4000bb24: b0 10 20 00 clr %i0 return RTEMS_SUCCESSFUL; } 4000bb28: 81 c7 e0 08 ret 4000bb2c: 81 e8 00 00 restore 4000bb30 : */ rtems_status_code rtems_extension_delete( Objects_Id id ) { 4000bb30: 9d e3 bf 90 save %sp, -112, %sp <== NOT EXECUTED RTEMS_INLINE_ROUTINE Extension_Control *_Extension_Get ( Objects_Id id, Objects_Locations *location ) { return (Extension_Control *) 4000bb34: 21 10 00 a7 sethi %hi(0x40029c00), %l0 <== NOT EXECUTED 4000bb38: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED 4000bb3c: 94 07 bf f4 add %fp, -12, %o2 <== NOT EXECUTED 4000bb40: 40 00 04 ce call 4000ce78 <_Objects_Get> <== NOT EXECUTED 4000bb44: 90 14 22 fc or %l0, 0x2fc, %o0 <== NOT EXECUTED Extension_Control *the_extension; Objects_Locations location; the_extension = _Extension_Get( id, &location ); switch ( location ) { 4000bb48: c2 07 bf f4 ld [ %fp + -12 ], %g1 <== NOT EXECUTED 4000bb4c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000bb50: 02 80 00 07 be 4000bb6c <== NOT EXECUTED 4000bb54: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED 4000bb58: 80 a0 60 02 cmp %g1, 2 <== NOT EXECUTED 4000bb5c: 08 80 00 20 bleu 4000bbdc <== NOT EXECUTED 4000bb60: b0 10 20 04 mov 4, %i0 <== NOT EXECUTED 4000bb64: 81 c7 e0 08 ret <== NOT EXECUTED 4000bb68: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED case OBJECTS_ERROR: case OBJECTS_REMOTE: /* should never return this */ return RTEMS_INVALID_ID; case OBJECTS_LOCAL: _User_extensions_Remove_set( &the_extension->Extension ); 4000bb6c: 40 00 0e 3e call 4000f464 <_User_extensions_Remove_set> <== NOT EXECUTED 4000bb70: 90 02 20 10 add %o0, 0x10, %o0 <== NOT EXECUTED Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 4000bb74: 90 14 22 fc or %l0, 0x2fc, %o0 <== NOT EXECUTED ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); 4000bb78: c2 06 20 08 ld [ %i0 + 8 ], %g1 <== NOT EXECUTED Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 4000bb7c: c6 12 20 10 lduh [ %o0 + 0x10 ], %g3 <== NOT EXECUTED 4000bb80: 05 00 00 3f sethi %hi(0xfc00), %g2 <== NOT EXECUTED 4000bb84: 84 10 a3 ff or %g2, 0x3ff, %g2 ! ffff <== NOT EXECUTED 4000bb88: 82 08 40 02 and %g1, %g2, %g1 <== NOT EXECUTED 4000bb8c: 80 a0 40 03 cmp %g1, %g3 <== NOT EXECUTED 4000bb90: 38 80 00 06 bgu,a 4000bba8 <== NOT EXECUTED 4000bb94: c0 26 20 0c clr [ %i0 + 0xc ] <== NOT EXECUTED information->local_table[ index ] = the_object; 4000bb98: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 <== NOT EXECUTED 4000bb9c: 83 28 60 02 sll %g1, 2, %g1 <== NOT EXECUTED 4000bba0: c0 20 80 01 clr [ %g2 + %g1 ] <== NOT EXECUTED uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); /* _Objects_Clear_name( the_object->name, information->name_length ); */ the_object->name = 0; 4000bba4: c0 26 20 0c clr [ %i0 + 0xc ] <== NOT EXECUTED RTEMS_INLINE_ROUTINE void _Extension_Free ( Extension_Control *the_extension ) { _Objects_Free( &_Extension_Information, &the_extension->Object ); 4000bba8: 40 00 04 72 call 4000cd70 <_Objects_Free> <== NOT EXECUTED 4000bbac: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 4000bbb0: 03 10 00 a7 sethi %hi(0x40029c00), %g1 <== NOT EXECUTED 4000bbb4: c4 00 60 60 ld [ %g1 + 0x60 ], %g2 ! 40029c60 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 4000bbb8: b0 10 20 00 clr %i0 <== NOT EXECUTED 4000bbbc: 84 00 bf ff add %g2, -1, %g2 <== NOT EXECUTED 4000bbc0: c4 20 60 60 st %g2, [ %g1 + 0x60 ] <== NOT EXECUTED 4000bbc4: c2 00 60 60 ld [ %g1 + 0x60 ], %g1 <== NOT EXECUTED 4000bbc8: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000bbcc: 12 80 00 04 bne 4000bbdc <== NOT EXECUTED 4000bbd0: 01 00 00 00 nop <== NOT EXECUTED _Thread_Dispatch(); 4000bbd4: 40 00 09 9d call 4000e248 <_Thread_Dispatch> <== NOT EXECUTED 4000bbd8: 01 00 00 00 nop <== NOT EXECUTED _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 4000bbdc: 81 c7 e0 08 ret <== NOT EXECUTED 4000bbe0: 81 e8 00 00 restore <== NOT EXECUTED 40002d80 : int rtems_filesystem_evaluate_parent( int flags, rtems_filesystem_location_info_t *pathloc ) { 40002d80: 9d e3 bf 88 save %sp, -120, %sp rtems_filesystem_location_info_t parent; int result; if ( !pathloc ) 40002d84: 80 a6 60 00 cmp %i1, 0 40002d88: 32 80 00 06 bne,a 40002da0 40002d8c: c2 06 60 08 ld [ %i1 + 8 ], %g1 rtems_set_errno_and_return_minus_one( EIO ); /* should never happen */ 40002d90: 40 00 30 8b call 4000efbc <__errno> <== NOT EXECUTED 40002d94: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40002d98: 10 80 00 09 b 40002dbc <== NOT EXECUTED 40002d9c: 82 10 20 05 mov 5, %g1 <== NOT EXECUTED if ( !pathloc->ops->evalpath_h ) 40002da0: c2 00 40 00 ld [ %g1 ], %g1 40002da4: 80 a0 60 00 cmp %g1, 0 40002da8: 12 80 00 08 bne 40002dc8 40002dac: a0 07 bf e8 add %fp, -24, %l0 rtems_set_errno_and_return_minus_one( ENOTSUP ); 40002db0: 40 00 30 83 call 4000efbc <__errno> <== NOT EXECUTED 40002db4: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40002db8: 82 10 20 86 mov 0x86, %g1 <== NOT EXECUTED 40002dbc: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 40002dc0: 81 c7 e0 08 ret <== NOT EXECUTED 40002dc4: 81 e8 00 00 restore <== NOT EXECUTED parent = *pathloc; 40002dc8: 92 10 00 19 mov %i1, %o1 40002dcc: 94 10 20 10 mov 0x10, %o2 40002dd0: 40 00 32 50 call 4000f710 40002dd4: 90 10 00 10 mov %l0, %o0 result = (*pathloc->ops->evalpath_h)( "..", flags, &parent ); 40002dd8: c2 06 60 08 ld [ %i1 + 8 ], %g1 40002ddc: 92 10 00 18 mov %i0, %o1 40002de0: c2 00 40 00 ld [ %g1 ], %g1 40002de4: 11 10 00 63 sethi %hi(0x40018c00), %o0 40002de8: 94 10 00 10 mov %l0, %o2 40002dec: 9f c0 40 00 call %g1 40002df0: 90 12 22 20 or %o0, 0x220, %o0 if (result != 0){ 40002df4: b0 92 20 00 orcc %o0, 0, %i0 40002df8: 02 80 00 04 be 40002e08 40002dfc: c2 07 bf f0 ld [ %fp + -16 ], %g1 40002e00: 81 c7 e0 08 ret <== NOT EXECUTED 40002e04: 91 e8 3f ff restore %g0, -1, %o0 <== NOT EXECUTED return -1; } rtems_filesystem_freenode( &parent ); 40002e08: 80 a0 60 00 cmp %g1, 0 40002e0c: 02 80 00 08 be 40002e2c 40002e10: 01 00 00 00 nop 40002e14: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 40002e18: 80 a0 60 00 cmp %g1, 0 40002e1c: 02 80 00 04 be 40002e2c 40002e20: 01 00 00 00 nop 40002e24: 9f c0 40 00 call %g1 40002e28: 90 10 00 10 mov %l0, %o0 return result; } 40002e2c: 81 c7 e0 08 ret 40002e30: 81 e8 00 00 restore 40002e34 : const char *pathname, int flags, rtems_filesystem_location_info_t *pathloc, int follow_link ) { 40002e34: 9d e3 bf 98 save %sp, -104, %sp /* * Verify Input parameters. */ if ( !pathname ) 40002e38: 80 a6 20 00 cmp %i0, 0 40002e3c: 12 80 00 06 bne 40002e54 40002e40: 80 a6 a0 00 cmp %i2, 0 rtems_set_errno_and_return_minus_one( EFAULT ); 40002e44: 40 00 30 5e call 4000efbc <__errno> 40002e48: b0 10 3f ff mov -1, %i0 40002e4c: 10 80 00 43 b 40002f58 40002e50: 82 10 20 0e mov 0xe, %g1 if ( !pathloc ) 40002e54: 32 80 00 06 bne,a 40002e6c 40002e58: c2 4e 00 00 ldsb [ %i0 ], %g1 rtems_set_errno_and_return_minus_one( EIO ); /* should never happen */ 40002e5c: 40 00 30 58 call 4000efbc <__errno> <== NOT EXECUTED 40002e60: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40002e64: 10 80 00 3d b 40002f58 <== NOT EXECUTED 40002e68: 82 10 20 05 mov 5, %g1 <== NOT EXECUTED /* * Evaluate the path using the optable evalpath. */ rtems_filesystem_get_start_loc( pathname, &i, pathloc ); 40002e6c: 80 a0 60 2f cmp %g1, 0x2f 40002e70: 02 80 00 06 be 40002e88 40002e74: 80 a0 60 5c cmp %g1, 0x5c 40002e78: 02 80 00 04 be 40002e88 40002e7c: 80 a0 60 00 cmp %g1, 0 40002e80: 12 80 00 0a bne 40002ea8 40002e84: 03 10 00 68 sethi %hi(0x4001a000), %g1 40002e88: 03 10 00 68 sethi %hi(0x4001a000), %g1 40002e8c: d2 00 60 40 ld [ %g1 + 0x40 ], %o1 ! 4001a040 40002e90: 90 10 00 1a mov %i2, %o0 40002e94: 92 02 60 14 add %o1, 0x14, %o1 40002e98: 40 00 32 1e call 4000f710 40002e9c: 94 10 20 10 mov 0x10, %o2 40002ea0: 10 80 00 08 b 40002ec0 40002ea4: 84 10 20 01 mov 1, %g2 40002ea8: d2 00 60 40 ld [ %g1 + 0x40 ], %o1 40002eac: 90 10 00 1a mov %i2, %o0 40002eb0: 92 02 60 04 add %o1, 4, %o1 40002eb4: 40 00 32 17 call 4000f710 40002eb8: 94 10 20 10 mov 0x10, %o2 40002ebc: 84 10 20 00 clr %g2 if ( !pathloc->ops->evalpath_h ) 40002ec0: c2 06 a0 08 ld [ %i2 + 8 ], %g1 40002ec4: c2 00 40 00 ld [ %g1 ], %g1 40002ec8: 80 a0 60 00 cmp %g1, 0 40002ecc: 02 80 00 20 be 40002f4c 40002ed0: 90 06 00 02 add %i0, %g2, %o0 rtems_set_errno_and_return_minus_one( ENOTSUP ); result = (*pathloc->ops->evalpath_h)( &pathname[i], flags, pathloc ); 40002ed4: 92 10 00 19 mov %i1, %o1 40002ed8: 9f c0 40 00 call %g1 40002edc: 94 10 00 1a mov %i2, %o2 /* * Get the Node type and determine if you need to follow the link or * not. */ if ( (result == 0) && follow_link ) { 40002ee0: b0 92 20 00 orcc %o0, 0, %i0 40002ee4: 12 80 00 1e bne 40002f5c 40002ee8: 80 a6 e0 00 cmp %i3, 0 40002eec: 02 80 00 21 be 40002f70 40002ef0: 01 00 00 00 nop if ( !pathloc->ops->node_type_h ){ 40002ef4: c2 06 a0 08 ld [ %i2 + 8 ], %g1 40002ef8: c4 00 60 10 ld [ %g1 + 0x10 ], %g2 40002efc: 80 a0 a0 00 cmp %g2, 0 40002f00: 22 80 00 0e be,a 40002f38 40002f04: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 <== NOT EXECUTED rtems_filesystem_freenode( pathloc ); rtems_set_errno_and_return_minus_one( ENOTSUP ); } type = (*pathloc->ops->node_type_h)( pathloc ); 40002f08: 9f c0 80 00 call %g2 40002f0c: 90 10 00 1a mov %i2, %o0 if ( ( type == RTEMS_FILESYSTEM_HARD_LINK ) || 40002f10: 90 02 3f fd add %o0, -3, %o0 40002f14: 80 a2 20 01 cmp %o0, 1 40002f18: 18 80 00 16 bgu 40002f70 40002f1c: 01 00 00 00 nop ( type == RTEMS_FILESYSTEM_SYM_LINK ) ) { if ( !pathloc->ops->eval_link_h ){ 40002f20: c2 06 a0 08 ld [ %i2 + 8 ], %g1 40002f24: c4 00 60 34 ld [ %g1 + 0x34 ], %g2 40002f28: 80 a0 a0 00 cmp %g2, 0 40002f2c: 12 80 00 0e bne 40002f64 40002f30: 90 10 00 1a mov %i2, %o0 rtems_filesystem_freenode( pathloc ); 40002f34: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 <== NOT EXECUTED 40002f38: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40002f3c: 02 80 00 04 be 40002f4c <== NOT EXECUTED 40002f40: 01 00 00 00 nop <== NOT EXECUTED 40002f44: 9f c0 40 00 call %g1 <== NOT EXECUTED 40002f48: 90 10 00 1a mov %i2, %o0 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOTSUP ); 40002f4c: 40 00 30 1c call 4000efbc <__errno> <== NOT EXECUTED 40002f50: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40002f54: 82 10 20 86 mov 0x86, %g1 <== NOT EXECUTED 40002f58: c2 22 00 00 st %g1, [ %o0 ] 40002f5c: 81 c7 e0 08 ret 40002f60: 81 e8 00 00 restore * pathloc will be passed up (and eventually released). * Hence, the (valid) originial node that we submit to * eval_link_h() should be released by the handler. */ result = (*pathloc->ops->eval_link_h)( pathloc, flags ); 40002f64: 9f c0 80 00 call %g2 40002f68: 92 10 00 19 mov %i1, %o1 40002f6c: b0 10 00 08 mov %o0, %i0 } } return result; } 40002f70: 81 c7 e0 08 ret 40002f74: 81 e8 00 00 restore 4000c308 : * configuration is a single instantiation of the IMFS or miniIMFS with * a single "/dev" directory in it. */ void rtems_filesystem_initialize( void ) { 4000c308: 9d e3 bf 80 save %sp, -128, %sp /* * Set the default umask to "022". */ rtems_filesystem_umask = 022; 4000c30c: 25 10 00 68 sethi %hi(0x4001a000), %l2 4000c310: c4 04 a0 40 ld [ %l2 + 0x40 ], %g2 ! 4001a040 4000c314: 82 10 20 12 mov 0x12, %g1 init_fs_mount_table(); 4000c318: 40 00 01 91 call 4000c95c 4000c31c: c2 30 a0 24 sth %g1, [ %g2 + 0x24 ] /* * mount the first filesystem. */ if ( rtems_filesystem_mount_table_size == 0 ) 4000c320: 03 10 00 66 sethi %hi(0x40019800), %g1 4000c324: c2 00 62 38 ld [ %g1 + 0x238 ], %g1 ! 40019a38 4000c328: 80 a0 60 00 cmp %g1, 0 4000c32c: 12 80 00 06 bne 4000c344 4000c330: 03 10 00 66 sethi %hi(0x40019800), %g1 rtems_fatal_error_occurred( 0xABCD0001 ); 4000c334: 11 2a f3 40 sethi %hi(0xabcd0000), %o0 <== NOT EXECUTED 4000c338: 7f ff ec 21 call 400073bc <== NOT EXECUTED 4000c33c: 90 12 20 01 or %o0, 1, %o0 ! abcd0001 <== NOT EXECUTED mt = &rtems_filesystem_mount_table[0]; 4000c340: 03 10 00 66 sethi %hi(0x40019800), %g1 <== NOT EXECUTED 4000c344: c2 00 62 34 ld [ %g1 + 0x234 ], %g1 ! 40019a34 status = mount( 4000c348: 90 07 bf f4 add %fp, -12, %o0 4000c34c: d8 00 60 0c ld [ %g1 + 0xc ], %o4 4000c350: d2 00 40 00 ld [ %g1 ], %o1 4000c354: d4 00 60 04 ld [ %g1 + 4 ], %o2 4000c358: 40 00 01 89 call 4000c97c 4000c35c: d6 00 60 08 ld [ %g1 + 8 ], %o3 &entry, mt->fs_ops, mt->fsoptions, mt->device, mt->mount_point ); if ( status == -1 ) 4000c360: 80 a2 3f ff cmp %o0, -1 4000c364: 32 80 00 06 bne,a 4000c37c 4000c368: d0 04 a0 40 ld [ %l2 + 0x40 ], %o0 rtems_fatal_error_occurred( 0xABCD0002 ); 4000c36c: 11 2a f3 40 sethi %hi(0xabcd0000), %o0 <== NOT EXECUTED 4000c370: 7f ff ec 13 call 400073bc <== NOT EXECUTED 4000c374: 90 12 20 02 or %o0, 2, %o0 ! abcd0002 <== NOT EXECUTED rtems_filesystem_link_counts = 0; 4000c378: d0 04 a0 40 ld [ %l2 + 0x40 ], %o0 <== NOT EXECUTED * set_private_env() - but then: that's * gonna hit performance. * * Till Straumann, 10/25/2002 */ rtems_filesystem_root = entry->mt_fs_root; 4000c37c: d2 07 bf f4 ld [ %fp + -12 ], %o1 &entry, mt->fs_ops, mt->fsoptions, mt->device, mt->mount_point ); if ( status == -1 ) rtems_fatal_error_occurred( 0xABCD0002 ); rtems_filesystem_link_counts = 0; 4000c380: c0 32 20 26 clrh [ %o0 + 0x26 ] * set_private_env() - but then: that's * gonna hit performance. * * Till Straumann, 10/25/2002 */ rtems_filesystem_root = entry->mt_fs_root; 4000c384: 92 02 60 18 add %o1, 0x18, %o1 4000c388: 94 10 20 10 mov 0x10, %o2 4000c38c: 40 00 0c e1 call 4000f710 4000c390: 90 02 20 14 add %o0, 0x14, %o0 /* Clone the root pathloc */ rtems_filesystem_evaluate_path("/", 0, &loc, 0); 4000c394: a0 07 bf e4 add %fp, -28, %l0 4000c398: 96 10 20 00 clr %o3 4000c39c: 23 10 00 64 sethi %hi(0x40019000), %l1 4000c3a0: 92 10 20 00 clr %o1 4000c3a4: 94 10 00 10 mov %l0, %o2 4000c3a8: 7f ff da a3 call 40002e34 4000c3ac: 90 14 60 98 or %l1, 0x98, %o0 rtems_filesystem_root = loc; 4000c3b0: d0 04 a0 40 ld [ %l2 + 0x40 ], %o0 4000c3b4: 92 10 00 10 mov %l0, %o1 4000c3b8: 94 10 20 10 mov 0x10, %o2 4000c3bc: 40 00 0c d5 call 4000f710 4000c3c0: 90 02 20 14 add %o0, 0x14, %o0 /* One more clone for the current node */ rtems_filesystem_evaluate_path("/", 0, &loc, 0); 4000c3c4: 96 10 20 00 clr %o3 4000c3c8: 92 10 20 00 clr %o1 4000c3cc: 94 10 00 10 mov %l0, %o2 4000c3d0: 7f ff da 99 call 40002e34 4000c3d4: 90 14 60 98 or %l1, 0x98, %o0 rtems_filesystem_current = loc; 4000c3d8: d0 04 a0 40 ld [ %l2 + 0x40 ], %o0 4000c3dc: 92 10 00 10 mov %l0, %o1 4000c3e0: 94 10 20 10 mov 0x10, %o2 4000c3e4: 40 00 0c cb call 4000f710 4000c3e8: 90 02 20 04 add %o0, 4, %o0 * * 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); 4000c3ec: 92 10 21 ff mov 0x1ff, %o1 4000c3f0: 11 10 00 64 sethi %hi(0x40019000), %o0 4000c3f4: 40 00 01 50 call 4000c934 4000c3f8: 90 12 20 a0 or %o0, 0xa0, %o0 ! 400190a0 <_CPU_Trap_slot_template+0x80> if ( status != 0 ) 4000c3fc: 80 a2 20 00 cmp %o0, 0 4000c400: 02 80 00 04 be 4000c410 4000c404: 11 2a f3 40 sethi %hi(0xabcd0000), %o0 rtems_fatal_error_occurred( 0xABCD0003 ); 4000c408: 7f ff eb ed call 400073bc <== NOT EXECUTED 4000c40c: 90 12 20 03 or %o0, 3, %o0 ! abcd0003 <== NOT EXECUTED 4000c410: 81 c7 e0 08 ret 4000c414: 81 e8 00 00 restore 40007c80 : ); rtems_boolean rtems_filesystem_nodes_equal( const rtems_filesystem_location_info_t *loc1, const rtems_filesystem_location_info_t *loc2 ){ 40007c80: c2 02 00 00 ld [ %o0 ], %g1 <== NOT EXECUTED 40007c84: c4 02 40 00 ld [ %o1 ], %g2 <== NOT EXECUTED 40007c88: 82 18 40 02 xor %g1, %g2, %g1 <== NOT EXECUTED return ( loc1->node_access == loc2->node_access ); } 40007c8c: 80 a0 00 01 cmp %g0, %g1 <== NOT EXECUTED 40007c90: 81 c3 e0 08 retl <== NOT EXECUTED 40007c94: 90 60 3f ff subx %g0, -1, %o0 <== NOT EXECUTED 400073d8 : #include const char *rtems_get_version_string(void) { return _RTEMS_version; } 400073d8: 11 10 00 66 sethi %hi(0x40019800), %o0 <== NOT EXECUTED 400073dc: 81 c3 e0 08 retl <== NOT EXECUTED 400073e0: 90 12 21 b0 or %o0, 0x1b0, %o0 ! 400199b0 <_RTEMS_version> <== NOT EXECUTED 40007178 : rtems_interrupt_level rtems_initialize_executive_early( rtems_configuration_table *configuration_table, rtems_cpu_table *cpu_table ) { 40007178: 9d e3 bf 80 save %sp, -128, %sp * Dispatching and interrupts are disabled until the end of the * initialization sequence. This prevents an inadvertent context * switch before the executive is initialized. */ _ISR_Disable( bsp_level ); 4000717c: 7f ff eb 54 call 40001ecc 40007180: 01 00 00 00 nop 40007184: a4 10 00 08 mov %o0, %l2 if ( configuration_table == NULL ) 40007188: 80 a6 20 00 cmp %i0, 0 4000718c: 12 80 00 07 bne 400071a8 40007190: 03 10 00 6b sethi %hi(0x4001ac00), %g1 _Internal_error_Occurred( 40007194: 90 10 20 00 clr %o0 <== NOT EXECUTED 40007198: 92 10 20 01 mov 1, %o1 <== NOT EXECUTED 4000719c: 40 00 03 af call 40008058 <_Internal_error_Occurred> <== NOT EXECUTED 400071a0: 94 10 20 00 clr %o2 <== NOT EXECUTED RTEMS_INLINE_ROUTINE void _System_state_Handler_initialization ( boolean is_multiprocessing ) { _System_state_Current = SYSTEM_STATE_BEFORE_INITIALIZATION; 400071a4: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 400071a8: c0 20 63 b0 clr [ %g1 + 0x3b0 ] ! 4001afb0 <_System_state_Current> _System_state_Is_multiprocessing = is_multiprocessing; 400071ac: 03 10 00 6b sethi %hi(0x4001ac00), %g1 /* * Grab our own copy of the user's CPU table. */ _CPU_Table = *cpu_table; 400071b0: 94 10 20 28 mov 0x28, %o2 400071b4: 92 10 00 19 mov %i1, %o1 400071b8: c0 20 62 d8 clr [ %g1 + 0x2d8 ] 400071bc: 11 10 00 6b sethi %hi(0x4001ac00), %o0 400071c0: 40 00 21 54 call 4000f710 400071c4: 90 12 21 e4 or %o0, 0x1e4, %o0 ! 4001ade4 <_CPU_Table> /* * Provided just for user convenience. */ _Configuration_Table = configuration_table; 400071c8: 03 10 00 6b sethi %hi(0x4001ac00), %g1 INTERNAL_ERROR_CORE, TRUE, INTERNAL_ERROR_NO_CPU_TABLE ); _CPU_Initialize( cpu_table, _Thread_Dispatch ); 400071cc: 90 10 00 19 mov %i1, %o0 400071d0: 13 10 00 26 sethi %hi(0x40009800), %o1 400071d4: 92 12 61 ec or %o1, 0x1ec, %o1 ! 400099ec <_Thread_Dispatch> 400071d8: 40 00 10 c3 call 4000b4e4 <_CPU_Initialize> 400071dc: f0 20 62 90 st %i0, [ %g1 + 0x290 ] /* * Do this as early as possible to insure no debugging output * is even attempted to be printed. */ _Debug_Manager_initialization(); 400071e0: 40 00 19 41 call 4000d6e4 <_Debug_Manager_initialization> 400071e4: 01 00 00 00 nop _API_extensions_Initialization(); 400071e8: 40 00 00 f2 call 400075b0 <_API_extensions_Initialization> 400071ec: 01 00 00 00 nop _Thread_Dispatch_initialization(); _Workspace_Handler_initialization( 400071f0: d2 06 20 04 ld [ %i0 + 4 ], %o1 400071f4: d0 06 00 00 ld [ %i0 ], %o0 * This routine initializes the thread dispatching subsystem. */ RTEMS_INLINE_ROUTINE void _Thread_Dispatch_initialization( void ) { _Thread_Dispatch_disable_level = 1; 400071f8: 84 10 20 01 mov 1, %g2 400071fc: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40007200: c4 20 61 d0 st %g2, [ %g1 + 0x1d0 ] ! 4001add0 <_Thread_Dispatch_disable_level> 40007204: 40 00 0f 8e call 4000b03c <_Workspace_Handler_initialization> 40007208: 23 10 00 6b sethi %hi(0x4001ac00), %l1 (void *)configuration_table->work_space_start, configuration_table->work_space_size ); _User_extensions_Handler_initialization( 4000720c: d0 06 20 20 ld [ %i0 + 0x20 ], %o0 40007210: 40 00 0e 2e call 4000aac8 <_User_extensions_Handler_initialization> 40007214: d2 06 20 24 ld [ %i0 + 0x24 ], %o1 configuration_table->number_of_initial_extensions, configuration_table->User_extension_table ); _ISR_Handler_initialization(); 40007218: 40 00 03 a0 call 40008098 <_ISR_Handler_initialization> 4000721c: a0 07 bf e8 add %fp, -24, %l0 _Objects_Handler_initialization( 40007220: 90 10 20 01 mov 1, %o0 40007224: 92 10 20 01 mov 1, %o1 40007228: 40 00 05 96 call 40008880 <_Objects_Handler_initialization> 4000722c: 94 10 20 00 clr %o2 multiprocessing_table->node, multiprocessing_table->maximum_nodes, multiprocessing_table->maximum_global_objects ); _Objects_Information_table[OBJECTS_INTERNAL_API] = _Internal_Objects; 40007230: 05 10 00 6b sethi %hi(0x4001ac00), %g2 /* * Initialize the internal allocator Mutex */ _API_Mutex_Initialization( 1 ); 40007234: c0 23 a0 5c clr [ %sp + 0x5c ] multiprocessing_table->node, multiprocessing_table->maximum_nodes, multiprocessing_table->maximum_global_objects ); _Objects_Information_table[OBJECTS_INTERNAL_API] = _Internal_Objects; 40007238: 03 10 00 6b sethi %hi(0x4001ac00), %g1 4000723c: 82 10 62 10 or %g1, 0x210, %g1 ! 4001ae10 <_Internal_Objects> /* * Initialize the internal allocator Mutex */ _API_Mutex_Initialization( 1 ); 40007240: 96 10 20 01 mov 1, %o3 multiprocessing_table->node, multiprocessing_table->maximum_nodes, multiprocessing_table->maximum_global_objects ); _Objects_Information_table[OBJECTS_INTERNAL_API] = _Internal_Objects; 40007244: c2 20 a1 34 st %g1, [ %g2 + 0x134 ] /* * Initialize the internal allocator Mutex */ _API_Mutex_Initialization( 1 ); 40007248: 98 10 20 74 mov 0x74, %o4 4000724c: 9a 10 20 00 clr %o5 40007250: 90 14 62 dc or %l1, 0x2dc, %o0 40007254: 92 10 20 01 mov 1, %o1 40007258: 40 00 05 16 call 400086b0 <_Objects_Initialize_information> 4000725c: 94 10 20 02 mov 2, %o2 _API_Mutex_Allocate( _RTEMS_Allocator_Mutex ); 40007260: 94 10 20 10 mov 0x10, %o2 40007264: 13 10 00 64 sethi %hi(0x40019000), %o1 40007268: 90 10 00 10 mov %l0, %o0 4000726c: 40 00 21 29 call 4000f710 40007270: 92 12 60 08 or %o1, 8, %o1 40007274: 40 00 03 a6 call 4000810c <_Objects_Allocate> 40007278: 90 14 62 dc or %l1, 0x2dc, %o0 4000727c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40007280: 84 10 00 08 mov %o0, %g2 40007284: 92 10 00 10 mov %l0, %o1 40007288: c4 20 62 a4 st %g2, [ %g1 + 0x2a4 ] 4000728c: 90 02 20 10 add %o0, 0x10, %o0 40007290: 40 00 01 2a call 40007738 <_CORE_mutex_Initialize> 40007294: 94 10 20 01 mov 1, %o2 RTEMS_INLINE_ROUTINE void _Priority_Handler_initialization( void ) { size_t index; _Priority_Major_bit_map = 0; 40007298: 03 10 00 6b sethi %hi(0x4001ac00), %g1 4000729c: 84 10 20 00 clr %g2 400072a0: c0 30 62 a0 clrh [ %g1 + 0x2a0 ] for ( index=0 ; index <16 ; index++ ) _Priority_Bit_map[ index ] = 0; 400072a4: 03 10 00 6b sethi %hi(0x4001ac00), %g1 400072a8: 82 10 63 30 or %g1, 0x330, %g1 ! 4001af30 <_Priority_Bit_map> 400072ac: c0 30 80 01 clrh [ %g2 + %g1 ] 400072b0: 84 00 a0 02 add %g2, 2, %g2 RTEMS_INLINE_ROUTINE void _Priority_Handler_initialization( void ) { size_t index; _Priority_Major_bit_map = 0; for ( index=0 ; index <16 ; index++ ) 400072b4: 80 a0 a0 20 cmp %g2, 0x20 400072b8: 32 bf ff fe bne,a 400072b0 400072bc: c0 30 80 01 clrh [ %g2 + %g1 ] _Priority_Handler_initialization(); _Watchdog_Handler_initialization(); 400072c0: 40 00 0e ed call 4000ae74 <_Watchdog_Handler_initialization> 400072c4: 01 00 00 00 nop _TOD_Handler_initialization( configuration_table->microseconds_per_tick ); 400072c8: 40 00 02 08 call 40007ae8 <_TOD_Handler_initialization> 400072cc: d0 06 20 0c ld [ %i0 + 0xc ], %o0 _Thread_Handler_initialization( 400072d0: d2 06 20 08 ld [ %i0 + 8 ], %o1 400072d4: d0 06 20 10 ld [ %i0 + 0x10 ], %o0 400072d8: 40 00 0a 85 call 40009cec <_Thread_Handler_initialization> 400072dc: 94 10 20 00 clr %o2 ); #endif /* MANAGERS */ _RTEMS_API_Initialize( configuration_table ); 400072e0: 40 00 00 95 call 40007534 <_RTEMS_API_Initialize> 400072e4: 90 10 00 18 mov %i0, %o0 _Extension_Manager_initialization( configuration_table->maximum_extensions ); 400072e8: 40 00 00 28 call 40007388 <_Extension_Manager_initialization> 400072ec: d0 06 20 08 ld [ %i0 + 8 ], %o0 _IO_Manager_initialization( 400072f0: d2 06 20 18 ld [ %i0 + 0x18 ], %o1 400072f4: d4 06 20 14 ld [ %i0 + 0x14 ], %o2 400072f8: 40 00 00 49 call 4000741c <_IO_Manager_initialization> 400072fc: d0 06 20 1c ld [ %i0 + 0x1c ], %o0 configuration_table->number_of_device_drivers, configuration_table->maximum_drivers ); #ifdef RTEMS_POSIX_API _POSIX_API_Initialize( configuration_table ); 40007300: 40 00 00 68 call 400074a0 <_POSIX_API_Initialize> 40007304: 90 10 00 18 mov %i0, %o0 RTEMS_INLINE_ROUTINE void _System_state_Set ( System_state_Codes state ) { _System_state_Current = state; 40007308: 84 10 20 01 mov 1, %g2 4000730c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 * * At this point all API extensions are in place. After the call to * _Thread_Create_idle() _Thread_Executing and _Thread_Heir will be set. */ _Thread_Create_idle(); 40007310: 40 00 09 5b call 4000987c <_Thread_Create_idle> 40007314: c4 20 63 b0 st %g2, [ %g1 + 0x3b0 ] ! 4001afb0 <_System_state_Current> /* * Scheduling can properly occur now as long as we avoid dispatching. */ if ( cpu_table->pretasking_hook ) 40007318: d0 06 40 00 ld [ %i1 ], %o0 4000731c: 80 a2 20 00 cmp %o0, 0 40007320: 02 80 00 04 be 40007330 40007324: 01 00 00 00 nop (*cpu_table->pretasking_hook)(); 40007328: 9f c2 00 00 call %o0 4000732c: 01 00 00 00 nop /* * Run the API and BSPs predriver hook. */ _API_extensions_Run_predriver(); 40007330: 40 00 00 bf call 4000762c <_API_extensions_Run_predriver> 40007334: 01 00 00 00 nop if ( _CPU_Table.predriver_hook ) 40007338: 03 10 00 6b sethi %hi(0x4001ac00), %g1 4000733c: a0 10 61 e4 or %g1, 0x1e4, %l0 ! 4001ade4 <_CPU_Table> 40007340: c2 04 20 04 ld [ %l0 + 4 ], %g1 40007344: 80 a0 60 00 cmp %g1, 0 40007348: 02 80 00 04 be 40007358 4000734c: 01 00 00 00 nop (*_CPU_Table.predriver_hook)(); 40007350: 9f c0 40 00 call %g1 40007354: 01 00 00 00 nop * Initialize all the device drivers and initialize the MPCI layer. * * NOTE: The MPCI may be build upon a device driver. */ _IO_Initialize_all_drivers(); 40007358: 40 00 00 23 call 400073e4 <_IO_Initialize_all_drivers> 4000735c: 01 00 00 00 nop * Run the APIs and BSPs postdriver hooks. * * The API extensions are supposed to create user initialization tasks. */ _API_extensions_Run_postdriver(); 40007360: 40 00 00 9b call 400075cc <_API_extensions_Run_postdriver> 40007364: 01 00 00 00 nop if ( _CPU_Table.postdriver_hook ) 40007368: c2 04 20 08 ld [ %l0 + 8 ], %g1 4000736c: 80 a0 60 00 cmp %g1, 0 40007370: 02 80 00 04 be 40007380 40007374: 01 00 00 00 nop (*_CPU_Table.postdriver_hook)(); 40007378: 9f c0 40 00 call %g1 4000737c: 01 00 00 00 nop return bsp_level; } 40007380: 81 c7 e0 08 ret 40007384: 91 e8 00 12 restore %g0, %l2, %o0 40002c18 : rtems_status_code rtems_io_lookup_name( const char *name, rtems_driver_name_t *device_info ) { 40002c18: 9d e3 bf 88 save %sp, -120, %sp <== NOT EXECUTED IMFS_jnode_t *the_jnode; rtems_filesystem_location_info_t loc; int result; rtems_filesystem_node_types_t node_type; result = rtems_filesystem_evaluate_path( name, 0x00, &loc, TRUE ); 40002c1c: 92 10 20 00 clr %o1 <== NOT EXECUTED 40002c20: a4 07 bf e8 add %fp, -24, %l2 <== NOT EXECUTED 40002c24: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40002c28: 94 10 00 12 mov %l2, %o2 <== NOT EXECUTED 40002c2c: 40 00 00 82 call 40002e34 <== NOT EXECUTED 40002c30: 96 10 20 01 mov 1, %o3 <== NOT EXECUTED the_jnode = loc.node_access; if ( !loc.ops->node_type_h ) { 40002c34: c4 07 bf f0 ld [ %fp + -16 ], %g2 <== NOT EXECUTED IMFS_jnode_t *the_jnode; rtems_filesystem_location_info_t loc; int result; rtems_filesystem_node_types_t node_type; result = rtems_filesystem_evaluate_path( name, 0x00, &loc, TRUE ); 40002c38: a0 10 00 08 mov %o0, %l0 <== NOT EXECUTED the_jnode = loc.node_access; if ( !loc.ops->node_type_h ) { 40002c3c: c2 00 a0 10 ld [ %g2 + 0x10 ], %g1 <== NOT EXECUTED 40002c40: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40002c44: 12 80 00 0e bne 40002c7c <== NOT EXECUTED 40002c48: e2 07 bf e8 ld [ %fp + -24 ], %l1 <== NOT EXECUTED rtems_filesystem_freenode( &loc ); 40002c4c: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 <== NOT EXECUTED 40002c50: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40002c54: 02 80 00 04 be 40002c64 <== NOT EXECUTED 40002c58: 01 00 00 00 nop <== NOT EXECUTED 40002c5c: 9f c0 40 00 call %g1 <== NOT EXECUTED 40002c60: 90 10 00 12 mov %l2, %o0 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOTSUP ); 40002c64: 40 00 30 d6 call 4000efbc <__errno> <== NOT EXECUTED 40002c68: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40002c6c: 82 10 20 86 mov 0x86, %g1 <== NOT EXECUTED 40002c70: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 40002c74: 81 c7 e0 08 ret <== NOT EXECUTED 40002c78: 81 e8 00 00 restore <== NOT EXECUTED } node_type = (*loc.ops->node_type_h)( &loc ); 40002c7c: 9f c0 40 00 call %g1 <== NOT EXECUTED 40002c80: 90 10 00 12 mov %l2, %o0 <== NOT EXECUTED if ( (result != 0) || node_type != RTEMS_FILESYSTEM_DEVICE ) { 40002c84: 80 a4 20 00 cmp %l0, 0 <== NOT EXECUTED 40002c88: 12 80 00 05 bne 40002c9c <== NOT EXECUTED 40002c8c: c2 07 bf f0 ld [ %fp + -16 ], %g1 <== NOT EXECUTED 40002c90: 80 a2 20 02 cmp %o0, 2 <== NOT EXECUTED 40002c94: 22 80 00 0d be,a 40002cc8 <== NOT EXECUTED 40002c98: f0 26 40 00 st %i0, [ %i1 ] <== NOT EXECUTED rtems_filesystem_freenode( &loc ); 40002c9c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40002ca0: 02 80 00 1c be 40002d10 <== NOT EXECUTED 40002ca4: 01 00 00 00 nop <== NOT EXECUTED 40002ca8: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 <== NOT EXECUTED 40002cac: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40002cb0: 02 80 00 18 be 40002d10 <== NOT EXECUTED 40002cb4: 01 00 00 00 nop <== NOT EXECUTED 40002cb8: 9f c0 40 00 call %g1 <== NOT EXECUTED 40002cbc: 90 10 00 12 mov %l2, %o0 <== NOT EXECUTED device_info->device_name = (char *) name; device_info->device_name_length = strlen( name ); device_info->major = the_jnode->info.device.major; device_info->minor = the_jnode->info.device.minor; rtems_filesystem_freenode( &loc ); 40002cc0: 81 c7 e0 08 ret <== NOT EXECUTED 40002cc4: 91 e8 20 0d restore %g0, 0xd, %o0 <== NOT EXECUTED rtems_filesystem_freenode( &loc ); return RTEMS_UNSATISFIED; } device_info->device_name = (char *) name; device_info->device_name_length = strlen( name ); 40002cc8: 40 00 35 9b call 40010334 <== NOT EXECUTED 40002ccc: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40002cd0: d0 26 60 04 st %o0, [ %i1 + 4 ] <== NOT EXECUTED device_info->major = the_jnode->info.device.major; 40002cd4: c2 04 60 4c ld [ %l1 + 0x4c ], %g1 <== NOT EXECUTED device_info->minor = the_jnode->info.device.minor; rtems_filesystem_freenode( &loc ); 40002cd8: c4 07 bf f0 ld [ %fp + -16 ], %g2 <== NOT EXECUTED return RTEMS_UNSATISFIED; } device_info->device_name = (char *) name; device_info->device_name_length = strlen( name ); device_info->major = the_jnode->info.device.major; 40002cdc: c2 26 60 08 st %g1, [ %i1 + 8 ] <== NOT EXECUTED device_info->minor = the_jnode->info.device.minor; 40002ce0: c2 04 60 50 ld [ %l1 + 0x50 ], %g1 <== NOT EXECUTED rtems_filesystem_freenode( &loc ); 40002ce4: 80 a0 a0 00 cmp %g2, 0 <== NOT EXECUTED 40002ce8: 02 80 00 0c be 40002d18 <== NOT EXECUTED 40002cec: c2 26 60 0c st %g1, [ %i1 + 0xc ] <== NOT EXECUTED 40002cf0: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 <== NOT EXECUTED 40002cf4: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40002cf8: 02 80 00 08 be 40002d18 <== NOT EXECUTED 40002cfc: 90 10 00 12 mov %l2, %o0 <== NOT EXECUTED 40002d00: 9f c0 40 00 call %g1 <== NOT EXECUTED 40002d04: b0 10 20 00 clr %i0 <== NOT EXECUTED 40002d08: 81 c7 e0 08 ret <== NOT EXECUTED 40002d0c: 81 e8 00 00 restore <== NOT EXECUTED 40002d10: 81 c7 e0 08 ret <== NOT EXECUTED 40002d14: 91 e8 20 0d restore %g0, 0xd, %o0 <== NOT EXECUTED 40002d18: b0 10 20 00 clr %i0 <== NOT EXECUTED #endif return RTEMS_SUCCESSFUL; } 40002d1c: 81 c7 e0 08 ret <== NOT EXECUTED 40002d20: 81 e8 00 00 restore <== NOT EXECUTED 40008478 : rtems_status_code rtems_io_register_driver( rtems_device_major_number major, rtems_driver_address_table *driver_table, rtems_device_major_number *registered_major ) { 40008478: 9d e3 bf 98 save %sp, -104, %sp /* * Validate the pointer data and contents passed in */ if ( !driver_table ) 4000847c: 92 96 60 00 orcc %i1, 0, %o1 40008480: 02 80 00 40 be 40008580 40008484: 80 a6 a0 00 cmp %i2, 0 return RTEMS_INVALID_ADDRESS; if ( !registered_major ) 40008488: 02 80 00 41 be 4000858c 4000848c: 82 10 20 09 mov 9, %g1 return RTEMS_INVALID_ADDRESS; if ( !driver_table->initialization_entry && !driver_table->open_entry ) 40008490: c2 02 40 00 ld [ %o1 ], %g1 40008494: 80 a0 60 00 cmp %g1, 0 40008498: 12 80 00 07 bne 400084b4 4000849c: 03 10 00 7c sethi %hi(0x4001f000), %g1 400084a0: c2 02 60 04 ld [ %o1 + 4 ], %g1 400084a4: 80 a0 60 00 cmp %g1, 0 400084a8: 22 80 00 39 be,a 4000858c 400084ac: 82 10 20 09 mov 9, %g1 *registered_major = 0; /* * The requested major number is higher than what is configured. */ if ( major >= _IO_Number_of_drivers ) 400084b0: 03 10 00 7c sethi %hi(0x4001f000), %g1 <== NOT EXECUTED return RTEMS_INVALID_ADDRESS; if ( !driver_table->initialization_entry && !driver_table->open_entry ) return RTEMS_INVALID_ADDRESS; *registered_major = 0; 400084b4: c0 26 80 00 clr [ %i2 ] /* * The requested major number is higher than what is configured. */ if ( major >= _IO_Number_of_drivers ) 400084b8: c8 00 63 1c ld [ %g1 + 0x31c ], %g4 400084bc: 80 a6 00 04 cmp %i0, %g4 400084c0: 1a 80 00 33 bcc 4000858c 400084c4: 82 10 20 0a mov 0xa, %g1 /* * Test for initialise/open being present to indicate the driver slot is * in use. */ if ( major == 0 ) { 400084c8: 80 a6 20 00 cmp %i0, 0 400084cc: 12 80 00 18 bne 4000852c 400084d0: 03 10 00 7c sethi %hi(0x4001f000), %g1 boolean found = FALSE; for ( major = _IO_Number_of_drivers - 1 ; major ; major-- ) { 400084d4: c6 00 63 20 ld [ %g1 + 0x320 ], %g3 ! 4001f320 <_IO_Driver_address_table> 400084d8: 85 29 20 03 sll %g4, 3, %g2 400084dc: 83 29 20 05 sll %g4, 5, %g1 400084e0: b0 01 3f ff add %g4, -1, %i0 400084e4: 82 20 40 02 sub %g1, %g2, %g1 400084e8: 82 00 7f e8 add %g1, -24, %g1 400084ec: 10 80 00 0b b 40008518 400084f0: 84 00 40 03 add %g1, %g3, %g2 if ( !_IO_Driver_address_table[major].initialization_entry && 400084f4: 80 a0 60 00 cmp %g1, 0 400084f8: 32 80 00 07 bne,a 40008514 400084fc: b0 06 3f ff add %i0, -1, %i0 40008500: c2 00 a0 04 ld [ %g2 + 4 ], %g1 40008504: 80 a0 60 00 cmp %g1, 0 40008508: 02 80 00 09 be 4000852c 4000850c: 03 10 00 7c sethi %hi(0x4001f000), %g1 * in use. */ if ( major == 0 ) { boolean found = FALSE; for ( major = _IO_Number_of_drivers - 1 ; major ; major-- ) { 40008510: b0 06 3f ff add %i0, -1, %i0 <== NOT EXECUTED 40008514: 84 00 bf e8 add %g2, -24, %g2 40008518: 80 a6 20 00 cmp %i0, 0 4000851c: 32 bf ff f6 bne,a 400084f4 40008520: c2 00 80 00 ld [ %g2 ], %g1 40008524: 10 80 00 1a b 4000858c 40008528: 82 10 20 05 mov 5, %g1 if ( !found ) return RTEMS_TOO_MANY; } if ( _IO_Driver_address_table[major].initialization_entry || 4000852c: c6 00 63 20 ld [ %g1 + 0x320 ], %g3 40008530: 85 2e 20 03 sll %i0, 3, %g2 40008534: 83 2e 20 05 sll %i0, 5, %g1 40008538: 82 20 40 02 sub %g1, %g2, %g1 4000853c: c4 00 40 03 ld [ %g1 + %g3 ], %g2 40008540: 80 a0 a0 00 cmp %g2, 0 40008544: 12 80 00 11 bne 40008588 40008548: 90 00 40 03 add %g1, %g3, %o0 4000854c: c2 02 20 04 ld [ %o0 + 4 ], %g1 40008550: 80 a0 60 00 cmp %g1, 0 40008554: 32 80 00 0e bne,a 4000858c 40008558: 82 10 20 0c mov 0xc, %g1 <== NOT EXECUTED _IO_Driver_address_table[major].open_entry ) return RTEMS_RESOURCE_IN_USE; _IO_Driver_address_table[major] = *driver_table; 4000855c: 40 00 20 2e call 40010614 40008560: 94 10 20 18 mov 0x18, %o2 *registered_major = major; rtems_io_initialize( major, 0, NULL ); 40008564: 90 10 00 18 mov %i0, %o0 _IO_Driver_address_table[major].open_entry ) return RTEMS_RESOURCE_IN_USE; _IO_Driver_address_table[major] = *driver_table; *registered_major = major; 40008568: f0 26 80 00 st %i0, [ %i2 ] rtems_io_initialize( major, 0, NULL ); 4000856c: 92 10 20 00 clr %o1 40008570: 7f ff ff 52 call 400082b8 40008574: 94 10 20 00 clr %o2 40008578: 10 80 00 05 b 4000858c 4000857c: 82 10 20 00 clr %g1 return RTEMS_SUCCESSFUL; 40008580: 10 80 00 03 b 4000858c 40008584: 82 10 20 09 mov 9, %g1 40008588: 82 10 20 0c mov 0xc, %g1 } 4000858c: 81 c7 e0 08 ret 40008590: 91 e8 00 01 restore %g0, %g1, %o0 40009adc : #include #include void rtems_iterate_over_all_threads(rtems_per_thread_routine routine) { 40009adc: 9d e3 bf 98 save %sp, -104, %sp uint32_t i; uint32_t api_index; Thread_Control *the_thread; Objects_Information *information; if ( !routine ) 40009ae0: 80 a6 20 00 cmp %i0, 0 40009ae4: 02 80 00 1d be 40009b58 40009ae8: 03 10 00 9e sethi %hi(0x40027800), %g1 return; 40009aec: a4 10 61 54 or %g1, 0x154, %l2 ! 40027954 <_Objects_Information_table+0x4> for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; 40009af0: a6 04 a0 10 add %l2, 0x10, %l3 api_index++ ) { if ( !_Objects_Information_table[ api_index ] ) 40009af4: c2 04 80 00 ld [ %l2 ], %g1 40009af8: 80 a0 60 00 cmp %g1, 0 40009afc: 22 80 00 14 be,a 40009b4c 40009b00: a4 04 a0 04 add %l2, 4, %l2 continue; information = _Objects_Information_table[ api_index ][ 1 ]; 40009b04: e0 00 60 04 ld [ %g1 + 4 ], %l0 if ( information ) { 40009b08: 80 a4 20 00 cmp %l0, 0 40009b0c: 12 80 00 0b bne 40009b38 40009b10: a2 10 20 01 mov 1, %l1 for ( i=1 ; i <= information->maximum ; i++ ) { 40009b14: 10 80 00 0e b 40009b4c <== NOT EXECUTED 40009b18: a4 04 a0 04 add %l2, 4, %l2 <== NOT EXECUTED the_thread = (Thread_Control *)information->local_table[ i ]; 40009b1c: c2 04 20 20 ld [ %l0 + 0x20 ], %g1 40009b20: d0 00 40 08 ld [ %g1 + %o0 ], %o0 if ( !the_thread ) 40009b24: 80 a2 20 00 cmp %o0, 0 40009b28: 02 80 00 04 be 40009b38 40009b2c: a2 04 60 01 inc %l1 continue; (*routine)(the_thread); 40009b30: 9f c6 00 00 call %i0 40009b34: 01 00 00 00 nop api_index++ ) { if ( !_Objects_Information_table[ api_index ] ) continue; information = _Objects_Information_table[ api_index ][ 1 ]; if ( information ) { for ( i=1 ; i <= information->maximum ; i++ ) { 40009b38: c2 14 20 10 lduh [ %l0 + 0x10 ], %g1 40009b3c: 80 a4 40 01 cmp %l1, %g1 40009b40: 08 bf ff f7 bleu 40009b1c 40009b44: 91 2c 60 02 sll %l1, 2, %o0 40009b48: a4 04 a0 04 add %l2, 4, %l2 if ( !routine ) return; for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; 40009b4c: 80 a4 80 13 cmp %l2, %l3 40009b50: 32 bf ff ea bne,a 40009af8 40009b54: c2 04 80 00 ld [ %l2 ], %g1 40009b58: 81 c7 e0 08 ret 40009b5c: 81 e8 00 00 restore 4000c828 : * This routine searches the IOP Table for an unused entry. If it * finds one, it returns it. Otherwise, it returns NULL. */ rtems_libio_t *rtems_libio_allocate( void ) { 4000c828: 9d e3 bf 90 save %sp, -112, %sp rtems_libio_t *iop, *next; rtems_status_code rc; rtems_id sema; rtems_semaphore_obtain( rtems_libio_semaphore, RTEMS_WAIT, RTEMS_NO_TIMEOUT ); 4000c82c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 4000c830: d0 00 60 10 ld [ %g1 + 0x10 ], %o0 ! 4001ac10 4000c834: 92 10 20 00 clr %o1 4000c838: 7f ff e7 e2 call 400067c0 4000c83c: 94 10 20 00 clr %o2 if (rtems_libio_iop_freelist) { 4000c840: 23 10 00 6b sethi %hi(0x4001ac00), %l1 4000c844: c4 04 60 0c ld [ %l1 + 0xc ], %g2 ! 4001ac0c 4000c848: 80 a0 a0 00 cmp %g2, 0 4000c84c: 02 80 00 28 be 4000c8ec 4000c850: b0 10 20 00 clr %i0 rc = rtems_semaphore_create( 4000c854: 03 10 00 6b sethi %hi(0x4001ac00), %g1 4000c858: c6 00 60 08 ld [ %g1 + 8 ], %g3 ! 4001ac08 4000c85c: 92 10 20 01 mov 1, %o1 4000c860: 86 20 80 03 sub %g2, %g3, %g3 4000c864: 87 38 e0 02 sra %g3, 2, %g3 4000c868: 83 28 e0 02 sll %g3, 2, %g1 4000c86c: 85 28 e0 06 sll %g3, 6, %g2 4000c870: 84 20 80 01 sub %g2, %g1, %g2 4000c874: 83 28 a0 06 sll %g2, 6, %g1 4000c878: 82 20 40 02 sub %g1, %g2, %g1 4000c87c: 85 28 60 0c sll %g1, 0xc, %g2 4000c880: 82 00 40 02 add %g1, %g2, %g1 4000c884: 82 00 40 03 add %g1, %g3, %g1 4000c888: 83 28 60 04 sll %g1, 4, %g1 4000c88c: 82 20 40 03 sub %g1, %g3, %g1 4000c890: 83 28 60 02 sll %g1, 2, %g1 4000c894: 86 20 c0 01 sub %g3, %g1, %g3 4000c898: 94 10 20 54 mov 0x54, %o2 4000c89c: 96 10 20 00 clr %o3 4000c8a0: 11 13 10 92 sethi %hi(0x4c424800), %o0 4000c8a4: 98 07 bf f4 add %fp, -12, %o4 4000c8a8: 90 12 21 00 or %o0, 0x100, %o0 4000c8ac: 7f ff e6 eb call 40006458 4000c8b0: 90 10 c0 08 or %g3, %o0, %o0 1, RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY, RTEMS_NO_PRIORITY, &sema ); if (rc != RTEMS_SUCCESSFUL) 4000c8b4: 80 a2 20 00 cmp %o0, 0 4000c8b8: 32 80 00 0d bne,a 4000c8ec 4000c8bc: b0 10 20 00 clr %i0 <== NOT EXECUTED goto failed; iop = rtems_libio_iop_freelist; 4000c8c0: f0 04 60 0c ld [ %l1 + 0xc ], %i0 next = iop->data1; (void) memset( iop, 0, sizeof(rtems_libio_t) ); 4000c8c4: 92 10 20 00 clr %o1 &sema ); if (rc != RTEMS_SUCCESSFUL) goto failed; iop = rtems_libio_iop_freelist; next = iop->data1; 4000c8c8: e0 06 20 28 ld [ %i0 + 0x28 ], %l0 (void) memset( iop, 0, sizeof(rtems_libio_t) ); 4000c8cc: 90 10 00 18 mov %i0, %o0 4000c8d0: 40 00 0b bd call 4000f7c4 4000c8d4: 94 10 20 34 mov 0x34, %o2 iop->flags = LIBIO_FLAGS_OPEN; iop->sem = sema; 4000c8d8: c2 07 bf f4 ld [ %fp + -12 ], %g1 rtems_libio_iop_freelist = next; 4000c8dc: e0 24 60 0c st %l0, [ %l1 + 0xc ] goto failed; iop = rtems_libio_iop_freelist; next = iop->data1; (void) memset( iop, 0, sizeof(rtems_libio_t) ); iop->flags = LIBIO_FLAGS_OPEN; iop->sem = sema; 4000c8e0: c2 26 20 20 st %g1, [ %i0 + 0x20 ] if (rc != RTEMS_SUCCESSFUL) goto failed; iop = rtems_libio_iop_freelist; next = iop->data1; (void) memset( iop, 0, sizeof(rtems_libio_t) ); iop->flags = LIBIO_FLAGS_OPEN; 4000c8e4: 82 10 21 00 mov 0x100, %g1 4000c8e8: c2 26 20 0c st %g1, [ %i0 + 0xc ] failed: iop = 0; done: rtems_semaphore_release( rtems_libio_semaphore ); 4000c8ec: 03 10 00 6b sethi %hi(0x4001ac00), %g1 4000c8f0: 7f ff e8 7b call 40006adc 4000c8f4: d0 00 60 10 ld [ %g1 + 0x10 ], %o0 ! 4001ac10 return iop; } 4000c8f8: 81 c7 e0 08 ret 4000c8fc: 81 e8 00 00 restore 40002f78 : * * Called by BSP startup code to initialize the libio subsystem. */ void rtems_libio_init( void ) { 40002f78: 9d e3 bf 98 save %sp, -104, %sp rtems_status_code rc; int i; rtems_libio_t *iop; if (rtems_libio_number_iops > 0) 40002f7c: 23 10 00 66 sethi %hi(0x40019800), %l1 40002f80: d0 04 62 1c ld [ %l1 + 0x21c ], %o0 ! 40019a1c 40002f84: 80 a2 20 00 cmp %o0, 0 40002f88: 22 80 00 1e be,a 40003000 40002f8c: 11 13 10 92 sethi %hi(0x4c424800), %o0 <== NOT EXECUTED { rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops, 40002f90: 92 10 20 34 mov 0x34, %o1 40002f94: 40 00 00 ec call 40003344 40002f98: 21 10 00 6b sethi %hi(0x4001ac00), %l0 sizeof(rtems_libio_t)); if (rtems_libio_iops == NULL) 40002f9c: 80 a2 20 00 cmp %o0, 0 40002fa0: 12 80 00 04 bne 40002fb0 40002fa4: d0 24 20 08 st %o0, [ %l0 + 8 ] rtems_fatal_error_occurred(RTEMS_NO_MEMORY); 40002fa8: 40 00 11 05 call 400073bc <== NOT EXECUTED 40002fac: 90 10 20 1a mov 0x1a, %o0 <== NOT EXECUTED iop = rtems_libio_iop_freelist = rtems_libio_iops; 40002fb0: c8 04 20 08 ld [ %l0 + 8 ], %g4 for (i = 0 ; i < (rtems_libio_number_iops - 1) ; i++, iop++) 40002fb4: c6 04 62 1c ld [ %l1 + 0x21c ], %g3 rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops, sizeof(rtems_libio_t)); if (rtems_libio_iops == NULL) rtems_fatal_error_occurred(RTEMS_NO_MEMORY); iop = rtems_libio_iop_freelist = rtems_libio_iops; 40002fb8: 03 10 00 6b sethi %hi(0x4001ac00), %g1 for (i = 0 ; i < (rtems_libio_number_iops - 1) ; i++, iop++) 40002fbc: 84 10 20 00 clr %g2 rtems_libio_iops = (rtems_libio_t *) calloc(rtems_libio_number_iops, sizeof(rtems_libio_t)); if (rtems_libio_iops == NULL) rtems_fatal_error_occurred(RTEMS_NO_MEMORY); iop = rtems_libio_iop_freelist = rtems_libio_iops; 40002fc0: c8 20 60 0c st %g4, [ %g1 + 0xc ] for (i = 0 ; i < (rtems_libio_number_iops - 1) ; i++, iop++) 40002fc4: 10 80 00 03 b 40002fd0 40002fc8: 82 10 00 04 mov %g4, %g1 iop->data1 = iop + 1; 40002fcc: c2 20 7f f4 st %g1, [ %g1 + -12 ] 40002fd0: 84 00 a0 01 inc %g2 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 < (rtems_libio_number_iops - 1) ; i++, iop++) 40002fd4: 80 a0 80 03 cmp %g2, %g3 40002fd8: 12 bf ff fd bne 40002fcc 40002fdc: 82 00 60 34 add %g1, 0x34, %g1 iop->data1 = iop + 1; iop->data1 = NULL; 40002fe0: 85 28 e0 02 sll %g3, 2, %g2 40002fe4: 83 28 e0 04 sll %g3, 4, %g1 40002fe8: 82 20 40 02 sub %g1, %g2, %g1 40002fec: 82 00 40 03 add %g1, %g3, %g1 40002ff0: 83 28 60 02 sll %g1, 2, %g1 40002ff4: 82 00 40 04 add %g1, %g4, %g1 40002ff8: c0 20 7f f4 clr [ %g1 + -12 ] /* * Create the binary semaphore used to provide mutual exclusion * on the IOP Table. */ rc = rtems_semaphore_create( 40002ffc: 11 13 10 92 sethi %hi(0x4c424800), %o0 40003000: 92 10 20 01 mov 1, %o1 40003004: 90 12 21 4f or %o0, 0x14f, %o0 40003008: 94 10 20 54 mov 0x54, %o2 4000300c: 96 10 20 00 clr %o3 40003010: 19 10 00 6b sethi %hi(0x4001ac00), %o4 40003014: 40 00 0d 11 call 40006458 40003018: 98 13 20 10 or %o4, 0x10, %o4 ! 4001ac10 1, RTEMS_BINARY_SEMAPHORE | RTEMS_INHERIT_PRIORITY | RTEMS_PRIORITY, RTEMS_NO_PRIORITY, &rtems_libio_semaphore ); if ( rc != RTEMS_SUCCESSFUL ) 4000301c: 80 a2 20 00 cmp %o0, 0 40003020: 02 80 00 04 be 40003030 40003024: 01 00 00 00 nop rtems_fatal_error_occurred( rc ); 40003028: 40 00 10 e5 call 400073bc <== NOT EXECUTED 4000302c: 01 00 00 00 nop <== NOT EXECUTED /* * Initialize the base file system infrastructure. */ rtems_filesystem_initialize(); 40003030: 40 00 24 b6 call 4000c308 40003034: 81 e8 00 00 restore 40003038: 01 00 00 00 nop 400183e0 : rtems_filesystem_freenode( &env->root_directory); free(env); } } rtems_status_code rtems_libio_set_private_env(void) { 400183e0: 9d e3 bf 80 save %sp, -128, %sp rtems_status_code sc; rtems_id task_id; rtems_filesystem_location_info_t loc; sc=rtems_task_ident(RTEMS_SELF,0,&task_id); 400183e4: 90 10 20 00 clr %o0 400183e8: 92 10 20 00 clr %o1 400183ec: 40 00 03 ae call 400192a4 400183f0: 94 07 bf f4 add %fp, -12, %o2 if (sc != RTEMS_SUCCESSFUL) return sc; 400183f4: b0 92 20 00 orcc %o0, 0, %i0 400183f8: 12 80 00 19 bne 4001845c 400183fc: 25 10 00 e6 sethi %hi(0x40039800), %l2 /* Only for the first time a malloc is necesary */ if (rtems_current_user_env==&rtems_global_user_env) { 40018400: c4 04 a2 c0 ld [ %l2 + 0x2c0 ], %g2 ! 40039ac0 40018404: 03 10 00 f1 sethi %hi(0x4003c400), %g1 40018408: 82 10 61 a4 or %g1, 0x1a4, %g1 ! 4003c5a4 4001840c: 80 a0 80 01 cmp %g2, %g1 40018410: 12 80 00 15 bne 40018464 40018414: a2 14 a2 c0 or %l2, 0x2c0, %l1 rtems_user_env_t *tmp = malloc(sizeof(rtems_user_env_t)); 40018418: 7f ff b7 48 call 40006138 4001841c: 90 10 20 40 mov 0x40, %o0 if (!tmp) 40018420: a0 92 20 00 orcc %o0, 0, %l0 40018424: 12 80 00 04 bne 40018434 40018428: 92 10 00 11 mov %l1, %o1 4001842c: 81 c7 e0 08 ret <== NOT EXECUTED 40018430: 91 e8 20 1a restore %g0, 0x1a, %o0 <== NOT EXECUTED #ifdef HAVE_USERENV_REFCNT tmp->refcnt = 1; #endif sc = rtems_task_variable_add(RTEMS_SELF,(void*)&rtems_current_user_env,(void(*)(void *))free_user_env); 40018434: 90 10 20 00 clr %o0 40018438: 15 10 00 60 sethi %hi(0x40018000), %o2 4001843c: 40 00 04 b2 call 40019704 40018440: 94 12 a2 bc or %o2, 0x2bc, %o2 ! 400182bc if (sc != RTEMS_SUCCESSFUL) { 40018444: a2 92 20 00 orcc %o0, 0, %l1 40018448: 22 80 00 07 be,a 40018464 4001844c: e0 24 a2 c0 st %l0, [ %l2 + 0x2c0 ] /* don't use free_user_env because the pathlocs are * not initialized yet */ free(tmp); 40018450: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 40018454: 7f ff b7 11 call 40006098 <== NOT EXECUTED 40018458: b0 10 00 11 mov %l1, %i0 <== NOT EXECUTED 4001845c: 81 c7 e0 08 ret <== NOT EXECUTED 40018460: 81 e8 00 00 restore <== NOT EXECUTED return sc; } rtems_current_user_env = tmp; }; *rtems_current_user_env = rtems_global_user_env; /* get the global values*/ 40018464: 23 10 00 e6 sethi %hi(0x40039800), %l1 40018468: d0 04 62 c0 ld [ %l1 + 0x2c0 ], %o0 ! 40039ac0 4001846c: 94 10 20 40 mov 0x40, %o2 40018470: 13 10 00 f1 sethi %hi(0x4003c400), %o1 40018474: 40 00 33 fa call 4002545c 40018478: 92 12 61 a4 or %o1, 0x1a4, %o1 ! 4003c5a4 rtems_current_user_env->task_id=task_id; /* mark the local values*/ /* get a clean root */ rtems_filesystem_root = THE_ROOT_FS_LOC; 4001847c: 03 10 00 ef sethi %hi(0x4003bc00), %g1 } rtems_current_user_env = tmp; }; *rtems_current_user_env = rtems_global_user_env; /* get the global values*/ rtems_current_user_env->task_id=task_id; /* mark the local values*/ 40018480: d0 04 62 c0 ld [ %l1 + 0x2c0 ], %o0 /* get a clean root */ rtems_filesystem_root = THE_ROOT_FS_LOC; 40018484: d2 00 61 b8 ld [ %g1 + 0x1b8 ], %o1 } rtems_current_user_env = tmp; }; *rtems_current_user_env = rtems_global_user_env; /* get the global values*/ rtems_current_user_env->task_id=task_id; /* mark the local values*/ 40018488: c2 07 bf f4 ld [ %fp + -12 ], %g1 /* get a clean root */ rtems_filesystem_root = THE_ROOT_FS_LOC; 4001848c: 92 02 60 18 add %o1, 0x18, %o1 } rtems_current_user_env = tmp; }; *rtems_current_user_env = rtems_global_user_env; /* get the global values*/ rtems_current_user_env->task_id=task_id; /* mark the local values*/ 40018490: c2 22 00 00 st %g1, [ %o0 ] /* get a clean root */ rtems_filesystem_root = THE_ROOT_FS_LOC; 40018494: 94 10 20 10 mov 0x10, %o2 40018498: 40 00 33 f1 call 4002545c 4001849c: 90 02 20 14 add %o0, 0x14, %o0 * code we must _not_ free the original locs because * what we are trying to do here is forking off * clones. */ rtems_filesystem_evaluate_path("/", 0, &loc, 0); 400184a0: a0 07 bf e4 add %fp, -28, %l0 400184a4: 96 10 20 00 clr %o3 400184a8: 25 10 00 d7 sethi %hi(0x40035c00), %l2 400184ac: 92 10 20 00 clr %o1 400184b0: 94 10 00 10 mov %l0, %o2 400184b4: 7f ff b5 9a call 40005b1c 400184b8: 90 14 a2 58 or %l2, 0x258, %o0 rtems_filesystem_root = loc; 400184bc: d0 04 62 c0 ld [ %l1 + 0x2c0 ], %o0 400184c0: 92 10 00 10 mov %l0, %o1 400184c4: 94 10 20 10 mov 0x10, %o2 400184c8: 40 00 33 e5 call 4002545c 400184cc: 90 02 20 14 add %o0, 0x14, %o0 rtems_filesystem_evaluate_path("/", 0, &loc, 0); 400184d0: 92 10 20 00 clr %o1 400184d4: 94 10 00 10 mov %l0, %o2 400184d8: 90 14 a2 58 or %l2, 0x258, %o0 400184dc: 7f ff b5 90 call 40005b1c 400184e0: 96 10 20 00 clr %o3 rtems_filesystem_current = loc; 400184e4: d0 04 62 c0 ld [ %l1 + 0x2c0 ], %o0 400184e8: 92 10 00 10 mov %l0, %o1 400184ec: 90 02 20 04 add %o0, 4, %o0 400184f0: 40 00 33 db call 4002545c 400184f4: 94 10 20 10 mov 0x10, %o2 return RTEMS_SUCCESSFUL; } 400184f8: 81 c7 e0 08 ret 400184fc: 81 e8 00 00 restore 40018334 : * b) mutex access to rtems_filesystem_current, rtems_filesytem_root * while changing any of those (chdir(), chroot()). */ #ifndef HAVE_USERENV_REFCNT rtems_status_code rtems_libio_share_private_env(rtems_id task_id) { 40018334: 9d e3 bf 90 save %sp, -112, %sp <== NOT EXECUTED rtems_status_code sc; rtems_user_env_t * shared_user_env; rtems_id current_task_id; sc=rtems_task_ident(RTEMS_SELF,0,¤t_task_id); 40018338: 90 10 20 00 clr %o0 <== NOT EXECUTED 4001833c: 92 10 20 00 clr %o1 <== NOT EXECUTED 40018340: 40 00 03 d9 call 400192a4 <== NOT EXECUTED 40018344: 94 07 bf f0 add %fp, -16, %o2 <== NOT EXECUTED if (sc != RTEMS_SUCCESSFUL) return sc; 40018348: 86 92 20 00 orcc %o0, 0, %g3 <== NOT EXECUTED 4001834c: 12 80 00 23 bne 400183d8 <== NOT EXECUTED 40018350: 25 10 00 e6 sethi %hi(0x40039800), %l2 <== NOT EXECUTED if (rtems_current_user_env->task_id==current_task_id) { 40018354: e0 04 a2 c0 ld [ %l2 + 0x2c0 ], %l0 ! 40039ac0 <== NOT EXECUTED 40018358: c2 07 bf f0 ld [ %fp + -16 ], %g1 <== NOT EXECUTED 4001835c: c4 04 00 00 ld [ %l0 ], %g2 <== NOT EXECUTED 40018360: 80 a0 80 01 cmp %g2, %g1 <== NOT EXECUTED 40018364: 12 80 00 09 bne 40018388 <== NOT EXECUTED 40018368: a2 14 a2 c0 or %l2, 0x2c0, %l1 <== NOT EXECUTED /* kill the current user env & task_var*/ rtems_user_env_t *tmp = rtems_current_user_env; sc = rtems_task_variable_delete(RTEMS_SELF,(void*)&rtems_current_user_env); 4001836c: 40 00 05 42 call 40019874 <== NOT EXECUTED 40018370: 92 10 00 11 mov %l1, %o1 <== NOT EXECUTED if (sc != RTEMS_SUCCESSFUL) return sc; 40018374: 86 92 20 00 orcc %o0, 0, %g3 <== NOT EXECUTED 40018378: 12 80 00 18 bne 400183d8 <== NOT EXECUTED 4001837c: 01 00 00 00 nop <== NOT EXECUTED free_user_env(tmp); 40018380: 7f ff ff cf call 400182bc <== NOT EXECUTED 40018384: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED }; /* AT THIS POINT, rtems_current_user_env is DANGLING */ sc = rtems_task_variable_get(task_id,(void*)&rtems_current_user_env, 40018388: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 4001838c: 92 10 00 11 mov %l1, %o1 <== NOT EXECUTED 40018390: 40 00 05 a5 call 40019a24 <== NOT EXECUTED 40018394: 94 07 bf f4 add %fp, -12, %o2 <== NOT EXECUTED (void*)&shared_user_env ); if (sc != RTEMS_SUCCESSFUL) 40018398: 86 92 20 00 orcc %o0, 0, %g3 <== NOT EXECUTED 4001839c: 12 80 00 0c bne 400183cc <== NOT EXECUTED 400183a0: 03 10 00 f1 sethi %hi(0x4003c400), %g1 <== NOT EXECUTED goto bailout; sc = rtems_task_variable_add(RTEMS_SELF,(void*)&rtems_current_user_env,free_user_env); 400183a4: 92 10 00 11 mov %l1, %o1 <== NOT EXECUTED 400183a8: 15 10 00 60 sethi %hi(0x40018000), %o2 <== NOT EXECUTED 400183ac: 40 00 04 d6 call 40019704 <== NOT EXECUTED 400183b0: 94 12 a2 bc or %o2, 0x2bc, %o2 ! 400182bc <== NOT EXECUTED if (sc != RTEMS_SUCCESSFUL) 400183b4: 86 92 20 00 orcc %o0, 0, %g3 <== NOT EXECUTED 400183b8: 12 80 00 05 bne 400183cc <== NOT EXECUTED 400183bc: 03 10 00 f1 sethi %hi(0x4003c400), %g1 <== NOT EXECUTED goto bailout; /* the current_user_env is the same pointer that remote env */ rtems_current_user_env = shared_user_env; 400183c0: c2 07 bf f4 ld [ %fp + -12 ], %g1 <== NOT EXECUTED 400183c4: 10 80 00 05 b 400183d8 <== NOT EXECUTED 400183c8: c2 24 a2 c0 st %g1, [ %l2 + 0x2c0 ] <== NOT EXECUTED return RTEMS_SUCCESSFUL; bailout: /* fallback to the global env */ rtems_current_user_env = &rtems_global_user_env; 400183cc: 05 10 00 e6 sethi %hi(0x40039800), %g2 <== NOT EXECUTED 400183d0: 82 10 61 a4 or %g1, 0x1a4, %g1 <== NOT EXECUTED 400183d4: c2 20 a2 c0 st %g1, [ %g2 + 0x2c0 ] <== NOT EXECUTED return sc; } 400183d8: 81 c7 e0 08 ret <== NOT EXECUTED 400183dc: 91 e8 00 03 restore %g0, %g3, %o0 <== NOT EXECUTED 4000c67c : */ uint32_t rtems_libio_to_fcntl_flags( uint32_t flags ) { 4000c67c: 84 10 00 08 mov %o0, %g2 uint32_t fcntl_flags = 0; if ( (flags & LIBIO_FLAGS_READ_WRITE) == LIBIO_FLAGS_READ_WRITE ) { 4000c680: 82 08 a0 06 and %g2, 6, %g1 4000c684: 80 a0 60 06 cmp %g1, 6 4000c688: 02 80 00 07 be 4000c6a4 4000c68c: 90 10 20 02 mov 2, %o0 fcntl_flags |= O_RDWR; } else if ( (flags & LIBIO_FLAGS_READ) == LIBIO_FLAGS_READ) { 4000c690: 80 88 a0 02 btst 2, %g2 4000c694: 12 80 00 04 bne 4000c6a4 4000c698: 90 10 20 00 clr %o0 4000c69c: 83 30 a0 02 srl %g2, 2, %g1 <== NOT EXECUTED 4000c6a0: 90 08 60 01 and %g1, 1, %o0 <== NOT EXECUTED fcntl_flags |= O_RDONLY; } else if ( (flags & LIBIO_FLAGS_WRITE) == LIBIO_FLAGS_WRITE) { fcntl_flags |= O_WRONLY; } if ( (flags & LIBIO_FLAGS_NO_DELAY) == LIBIO_FLAGS_NO_DELAY ) { 4000c6a4: 80 88 a0 01 btst 1, %g2 4000c6a8: 02 80 00 04 be 4000c6b8 4000c6ac: 80 88 a2 00 btst 0x200, %g2 fcntl_flags |= O_NONBLOCK; 4000c6b0: 03 00 00 10 sethi %hi(0x4000), %g1 4000c6b4: 90 12 00 01 or %o0, %g1, %o0 } if ( (flags & LIBIO_FLAGS_APPEND) == LIBIO_FLAGS_APPEND ) { 4000c6b8: 32 80 00 02 bne,a 4000c6c0 4000c6bc: 90 12 20 08 or %o0, 8, %o0 fcntl_flags |= O_APPEND; } if ( (flags & LIBIO_FLAGS_CREATE) == LIBIO_FLAGS_CREATE ) { 4000c6c0: 80 88 a4 00 btst 0x400, %g2 4000c6c4: 32 80 00 02 bne,a 4000c6cc 4000c6c8: 90 12 22 00 or %o0, 0x200, %o0 fcntl_flags |= O_CREAT; } return fcntl_flags; } 4000c6cc: 81 c3 e0 08 retl 4000c6d0: 01 00 00 00 nop 4000f624 : Objects_Id id, void *buffer, size_t size, uint32_t *count ) { 4000f624: 9d e3 bf 90 save %sp, -112, %sp register Message_queue_Control *the_message_queue; Objects_Locations location; CORE_message_queue_Status core_status; if ( !buffer ) 4000f628: 80 a6 60 00 cmp %i1, 0 4000f62c: 02 80 00 26 be 4000f6c4 4000f630: 80 a6 e0 00 cmp %i3, 0 return RTEMS_INVALID_ADDRESS; if ( !count ) 4000f634: 02 80 00 24 be 4000f6c4 4000f638: 11 10 00 d4 sethi %hi(0x40035000), %o0 RTEMS_INLINE_ROUTINE Message_queue_Control *_Message_queue_Get ( Objects_Id id, Objects_Locations *location ) { return (Message_queue_Control *) 4000f63c: 92 10 00 18 mov %i0, %o1 4000f640: 90 12 22 a0 or %o0, 0x2a0, %o0 4000f644: 40 00 18 b0 call 40015904 <_Objects_Get> 4000f648: 94 07 bf f4 add %fp, -12, %o2 return RTEMS_INVALID_ADDRESS; the_message_queue = _Message_queue_Get( id, &location ); switch ( location ) { 4000f64c: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000f650: 80 a0 60 00 cmp %g1, 0 4000f654: 02 80 00 07 be 4000f670 4000f658: 9a 10 00 1b mov %i3, %o5 4000f65c: 80 a0 60 02 cmp %g1, 2 4000f660: 08 80 00 1a bleu 4000f6c8 4000f664: 90 10 20 04 mov 4, %o0 4000f668: 10 80 00 18 b 4000f6c8 <== NOT EXECUTED 4000f66c: 90 10 20 19 mov 0x19, %o0 <== NOT EXECUTED case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: core_status = _CORE_message_queue_Broadcast( 4000f670: 92 10 00 19 mov %i1, %o1 4000f674: 94 10 00 1a mov %i2, %o2 4000f678: 96 10 00 18 mov %i0, %o3 4000f67c: 98 10 20 00 clr %o4 4000f680: 40 00 13 3e call 40014378 <_CORE_message_queue_Broadcast> 4000f684: 90 02 20 14 add %o0, 0x14, %o0 4000f688: b6 10 00 08 mov %o0, %i3 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 4000f68c: 03 10 00 d2 sethi %hi(0x40034800), %g1 4000f690: c4 00 60 b0 ld [ %g1 + 0xb0 ], %g2 ! 400348b0 <_Thread_Dispatch_disable_level> 4000f694: 84 00 bf ff add %g2, -1, %g2 4000f698: c4 20 60 b0 st %g2, [ %g1 + 0xb0 ] 4000f69c: c2 00 60 b0 ld [ %g1 + 0xb0 ], %g1 4000f6a0: 80 a0 60 00 cmp %g1, 0 4000f6a4: 12 80 00 04 bne 4000f6b4 4000f6a8: 01 00 00 00 nop _Thread_Dispatch(); 4000f6ac: 40 00 1d 8a call 40016cd4 <_Thread_Dispatch> 4000f6b0: 01 00 00 00 nop #endif count ); _Thread_Enable_dispatch(); return 4000f6b4: 40 00 01 2e call 4000fb6c <_Message_queue_Translate_core_message_queue_return_code> 4000f6b8: 90 10 00 1b mov %i3, %o0 _Message_queue_Translate_core_message_queue_return_code( core_status ); } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 4000f6bc: 81 c7 e0 08 ret 4000f6c0: 91 e8 00 08 restore %g0, %o0, %o0 #endif count ); _Thread_Enable_dispatch(); return 4000f6c4: 90 10 20 09 mov 9, %o0 <== NOT EXECUTED _Message_queue_Translate_core_message_queue_return_code( core_status ); } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 4000f6c8: b0 10 00 08 mov %o0, %i0 4000f6cc: 81 c7 e0 08 ret 4000f6d0: 81 e8 00 00 restore 4000f708 : uint32_t count, uint32_t max_message_size, rtems_attribute attribute_set, Objects_Id *id ) { 4000f708: 9d e3 bf 90 save %sp, -112, %sp CORE_message_queue_Attributes the_msgq_attributes; #if defined(RTEMS_MULTIPROCESSING) boolean is_global; #endif if ( !rtems_is_name_valid( name ) ) 4000f70c: a2 96 20 00 orcc %i0, 0, %l1 4000f710: 02 80 00 17 be 4000f76c 4000f714: b0 10 20 03 mov 3, %i0 return RTEMS_INVALID_NAME; if ( !id ) 4000f718: 80 a7 20 00 cmp %i4, 0 4000f71c: 02 80 00 14 be 4000f76c 4000f720: b0 10 20 09 mov 9, %i0 if ( (is_global = _Attributes_Is_global( attribute_set ) ) && !_System_state_Is_multiprocessing ) return RTEMS_MP_NOT_CONFIGURED; #endif if ( count == 0 ) 4000f724: 80 a6 60 00 cmp %i1, 0 4000f728: 02 80 00 11 be 4000f76c 4000f72c: b0 10 20 0a mov 0xa, %i0 return RTEMS_INVALID_NUMBER; if ( max_message_size == 0 ) 4000f730: 80 a6 a0 00 cmp %i2, 0 4000f734: 02 80 00 0e be 4000f76c 4000f738: b0 10 20 08 mov 8, %i0 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 4000f73c: 05 10 00 d2 sethi %hi(0x40034800), %g2 4000f740: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> 4000f744: 82 00 60 01 inc %g1 4000f748: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] #endif #endif _Thread_Disable_dispatch(); /* protects object pointer */ the_message_queue = _Message_queue_Allocate( count, max_message_size ); 4000f74c: 90 10 00 19 mov %i1, %o0 4000f750: 40 00 2c f2 call 4001ab18 <_Message_queue_Allocate> 4000f754: 92 10 00 1a mov %i2, %o1 if ( !the_message_queue ) { 4000f758: a0 92 20 00 orcc %o0, 0, %l0 4000f75c: 12 80 00 06 bne 4000f774 4000f760: 80 8e e0 04 btst 4, %i3 _Thread_Enable_dispatch(); 4000f764: 7f ff ff dc call 4000f6d4 <_Thread_Enable_dispatch> 4000f768: b0 10 20 05 mov 5, %i0 4000f76c: 81 c7 e0 08 ret 4000f770: 81 e8 00 00 restore } #endif the_message_queue->attribute_set = attribute_set; if (_Attributes_Is_priority( attribute_set ) ) 4000f774: 02 80 00 05 be 4000f788 4000f778: f6 24 20 10 st %i3, [ %l0 + 0x10 ] the_msgq_attributes.discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_PRIORITY; 4000f77c: 82 10 20 01 mov 1, %g1 4000f780: 10 80 00 03 b 4000f78c 4000f784: c2 27 bf f4 st %g1, [ %fp + -12 ] else the_msgq_attributes.discipline = CORE_MESSAGE_QUEUE_DISCIPLINES_FIFO; 4000f788: c0 27 bf f4 clr [ %fp + -12 ] if ( ! _CORE_message_queue_Initialize( 4000f78c: 94 10 00 19 mov %i1, %o2 4000f790: 96 10 00 1a mov %i2, %o3 4000f794: 90 04 20 14 add %l0, 0x14, %o0 4000f798: 40 00 13 44 call 400144a8 <_CORE_message_queue_Initialize> 4000f79c: 92 07 bf f4 add %fp, -12, %o1 4000f7a0: 80 a2 20 00 cmp %o0, 0 4000f7a4: 12 80 00 0a bne 4000f7cc 4000f7a8: 11 10 00 d4 sethi %hi(0x40035000), %o0 RTEMS_INLINE_ROUTINE void _Message_queue_Free ( Message_queue_Control *the_message_queue ) { _Objects_Free( &_Message_queue_Information, &the_message_queue->Object ); 4000f7ac: 90 12 22 a0 or %o0, 0x2a0, %o0 ! 400352a0 <_Message_queue_Information> <== NOT EXECUTED 4000f7b0: 92 10 00 10 mov %l0, %o1 <== NOT EXECUTED 4000f7b4: 40 00 17 fe call 400157ac <_Objects_Free> <== NOT EXECUTED 4000f7b8: b0 10 20 0d mov 0xd, %i0 <== NOT EXECUTED _Objects_MP_Close( &_Message_queue_Information, the_message_queue->Object.id); #endif _Message_queue_Free( the_message_queue ); _Thread_Enable_dispatch(); 4000f7bc: 7f ff ff c6 call 4000f6d4 <_Thread_Enable_dispatch> <== NOT EXECUTED 4000f7c0: 01 00 00 00 nop <== NOT EXECUTED 4000f7c4: 81 c7 e0 08 ret <== NOT EXECUTED 4000f7c8: 81 e8 00 00 restore <== NOT EXECUTED Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 4000f7cc: 90 12 22 a0 or %o0, 0x2a0, %o0 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, the_object ); 4000f7d0: c2 04 20 08 ld [ %l0 + 8 ], %g1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 4000f7d4: c6 12 20 10 lduh [ %o0 + 0x10 ], %g3 4000f7d8: 05 00 00 3f sethi %hi(0xfc00), %g2 4000f7dc: 84 10 a3 ff or %g2, 0x3ff, %g2 ! ffff 4000f7e0: 82 08 40 02 and %g1, %g2, %g1 4000f7e4: 80 a0 40 03 cmp %g1, %g3 4000f7e8: 38 80 00 06 bgu,a 4000f800 4000f7ec: c2 04 20 08 ld [ %l0 + 8 ], %g1 <== NOT EXECUTED information->local_table[ index ] = the_object; 4000f7f0: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 4000f7f4: 83 28 60 02 sll %g1, 2, %g1 4000f7f8: e0 20 80 01 st %l0, [ %g2 + %g1 ] &_Message_queue_Information, &the_message_queue->Object, (Objects_Name) name ); *id = the_message_queue->Object.id; 4000f7fc: c2 04 20 08 ld [ %l0 + 8 ], %g1 if ( information->is_string ) /* _Objects_Copy_name_string( name, the_object->name ); */ the_object->name = name; else /* _Objects_Copy_name_raw( name, the_object->name, information->name_length ); */ the_object->name = name; 4000f800: e2 24 20 0c st %l1, [ %l0 + 0xc ] 4000f804: c2 27 00 00 st %g1, [ %i4 ] name, 0 ); #endif _Thread_Enable_dispatch(); 4000f808: 7f ff ff b3 call 4000f6d4 <_Thread_Enable_dispatch> 4000f80c: b0 10 20 00 clr %i0 return RTEMS_SUCCESSFUL; } 4000f810: 81 c7 e0 08 ret 4000f814: 81 e8 00 00 restore 40013a50 : */ rtems_status_code rtems_message_queue_delete( Objects_Id id ) { 40013a50: 9d e3 bf 90 save %sp, -112, %sp RTEMS_INLINE_ROUTINE Message_queue_Control *_Message_queue_Get ( Objects_Id id, Objects_Locations *location ) { return (Message_queue_Control *) 40013a54: 21 10 00 a9 sethi %hi(0x4002a400), %l0 40013a58: 92 10 00 18 mov %i0, %o1 40013a5c: 94 07 bf f4 add %fp, -12, %o2 40013a60: 7f ff e5 06 call 4000ce78 <_Objects_Get> 40013a64: 90 14 22 cc or %l0, 0x2cc, %o0 register Message_queue_Control *the_message_queue; Objects_Locations location; the_message_queue = _Message_queue_Get( id, &location ); switch ( location ) { 40013a68: c2 07 bf f4 ld [ %fp + -12 ], %g1 40013a6c: 80 a0 60 00 cmp %g1, 0 40013a70: 02 80 00 07 be 40013a8c 40013a74: b0 10 00 08 mov %o0, %i0 40013a78: 80 a0 60 02 cmp %g1, 2 40013a7c: 08 80 00 22 bleu 40013b04 40013a80: b0 10 20 04 mov 4, %i0 40013a84: 81 c7 e0 08 ret <== NOT EXECUTED 40013a88: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40013a8c: a0 14 22 cc or %l0, 0x2cc, %l0 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); 40013a90: c2 02 20 08 ld [ %o0 + 8 ], %g1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40013a94: c6 14 20 10 lduh [ %l0 + 0x10 ], %g3 40013a98: 05 00 00 3f sethi %hi(0xfc00), %g2 40013a9c: 84 10 a3 ff or %g2, 0x3ff, %g2 ! ffff 40013aa0: 82 08 40 02 and %g1, %g2, %g1 40013aa4: 80 a0 40 03 cmp %g1, %g3 40013aa8: 18 80 00 05 bgu 40013abc 40013aac: 94 10 20 05 mov 5, %o2 information->local_table[ index ] = the_object; 40013ab0: c4 04 20 20 ld [ %l0 + 0x20 ], %g2 40013ab4: 83 28 60 02 sll %g1, 2, %g1 40013ab8: c0 20 80 01 clr [ %g2 + %g1 ] case OBJECTS_LOCAL: _Objects_Close( &_Message_queue_Information, &the_message_queue->Object ); _CORE_message_queue_Close( 40013abc: 90 06 20 14 add %i0, 0x14, %o0 uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); /* _Objects_Clear_name( the_object->name, information->name_length ); */ the_object->name = 0; 40013ac0: c0 26 20 0c clr [ %i0 + 0xc ] 40013ac4: 40 00 01 9e call 4001413c <_CORE_message_queue_Close> 40013ac8: 92 10 20 00 clr %o1 RTEMS_INLINE_ROUTINE void _Message_queue_Free ( Message_queue_Control *the_message_queue ) { _Objects_Free( &_Message_queue_Information, &the_message_queue->Object ); 40013acc: 90 10 00 10 mov %l0, %o0 40013ad0: 7f ff e4 a8 call 4000cd70 <_Objects_Free> 40013ad4: 92 10 00 18 mov %i0, %o1 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40013ad8: 03 10 00 a7 sethi %hi(0x40029c00), %g1 40013adc: c4 00 60 60 ld [ %g1 + 0x60 ], %g2 ! 40029c60 <_Thread_Dispatch_disable_level> 40013ae0: b0 10 20 00 clr %i0 40013ae4: 84 00 bf ff add %g2, -1, %g2 40013ae8: c4 20 60 60 st %g2, [ %g1 + 0x60 ] 40013aec: c2 00 60 60 ld [ %g1 + 0x60 ], %g1 40013af0: 80 a0 60 00 cmp %g1, 0 40013af4: 12 80 00 04 bne 40013b04 40013af8: 01 00 00 00 nop _Thread_Dispatch(); 40013afc: 7f ff e9 d3 call 4000e248 <_Thread_Dispatch> 40013b00: 01 00 00 00 nop _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40013b04: 81 c7 e0 08 ret 40013b08: 81 e8 00 00 restore 4000f8d4 : rtems_status_code rtems_message_queue_flush( Objects_Id id, uint32_t *count ) { 4000f8d4: 9d e3 bf 90 save %sp, -112, %sp 4000f8d8: 92 10 00 18 mov %i0, %o1 register Message_queue_Control *the_message_queue; Objects_Locations location; if ( !count ) 4000f8dc: 80 a6 60 00 cmp %i1, 0 4000f8e0: 02 80 00 1c be 4000f950 4000f8e4: b0 10 20 09 mov 9, %i0 RTEMS_INLINE_ROUTINE Message_queue_Control *_Message_queue_Get ( Objects_Id id, Objects_Locations *location ) { return (Message_queue_Control *) 4000f8e8: 11 10 00 d4 sethi %hi(0x40035000), %o0 4000f8ec: 94 07 bf f4 add %fp, -12, %o2 4000f8f0: 40 00 18 05 call 40015904 <_Objects_Get> 4000f8f4: 90 12 22 a0 or %o0, 0x2a0, %o0 return RTEMS_INVALID_ADDRESS; the_message_queue = _Message_queue_Get( id, &location ); switch ( location ) { 4000f8f8: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000f8fc: 80 a0 60 00 cmp %g1, 0 4000f900: 02 80 00 06 be 4000f918 4000f904: 80 a0 60 02 cmp %g1, 2 4000f908: 08 80 00 12 bleu 4000f950 4000f90c: b0 10 20 04 mov 4, %i0 4000f910: 81 c7 e0 08 ret <== NOT EXECUTED 4000f914: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: *count = _CORE_message_queue_Flush( &the_message_queue->message_queue ); 4000f918: 40 00 12 c5 call 4001442c <_CORE_message_queue_Flush> 4000f91c: 90 02 20 14 add %o0, 0x14, %o0 4000f920: d0 26 40 00 st %o0, [ %i1 ] #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 4000f924: 03 10 00 d2 sethi %hi(0x40034800), %g1 4000f928: c4 00 60 b0 ld [ %g1 + 0xb0 ], %g2 ! 400348b0 <_Thread_Dispatch_disable_level> 4000f92c: b0 10 20 00 clr %i0 4000f930: 84 00 bf ff add %g2, -1, %g2 4000f934: c4 20 60 b0 st %g2, [ %g1 + 0xb0 ] 4000f938: c2 00 60 b0 ld [ %g1 + 0xb0 ], %g1 4000f93c: 80 a0 60 00 cmp %g1, 0 4000f940: 12 80 00 04 bne 4000f950 4000f944: 01 00 00 00 nop _Thread_Dispatch(); 4000f948: 40 00 1c e3 call 40016cd4 <_Thread_Dispatch> 4000f94c: 01 00 00 00 nop _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 4000f950: 81 c7 e0 08 ret 4000f954: 81 e8 00 00 restore 4000f958 : rtems_status_code rtems_message_queue_get_number_pending( Objects_Id id, uint32_t *count ) { 4000f958: 9d e3 bf 90 save %sp, -112, %sp 4000f95c: 92 10 00 18 mov %i0, %o1 register Message_queue_Control *the_message_queue; Objects_Locations location; if ( !count ) 4000f960: 80 a6 60 00 cmp %i1, 0 4000f964: 02 80 00 1b be 4000f9d0 4000f968: b0 10 20 09 mov 9, %i0 4000f96c: 11 10 00 d4 sethi %hi(0x40035000), %o0 4000f970: 94 07 bf f4 add %fp, -12, %o2 4000f974: 40 00 17 e4 call 40015904 <_Objects_Get> 4000f978: 90 12 22 a0 or %o0, 0x2a0, %o0 return RTEMS_INVALID_ADDRESS; the_message_queue = _Message_queue_Get( id, &location ); switch ( location ) { 4000f97c: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000f980: 80 a0 60 00 cmp %g1, 0 4000f984: 22 80 00 07 be,a 4000f9a0 4000f988: c2 02 20 5c ld [ %o0 + 0x5c ], %g1 4000f98c: 80 a0 60 02 cmp %g1, 2 4000f990: 08 80 00 10 bleu 4000f9d0 4000f994: b0 10 20 04 mov 4, %i0 4000f998: 81 c7 e0 08 ret <== NOT EXECUTED 4000f99c: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: *count = the_message_queue->message_queue.number_of_pending_messages; 4000f9a0: c2 26 40 00 st %g1, [ %i1 ] #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 4000f9a4: 05 10 00 d2 sethi %hi(0x40034800), %g2 4000f9a8: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> 4000f9ac: b0 10 20 00 clr %i0 4000f9b0: 82 00 7f ff add %g1, -1, %g1 4000f9b4: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] 4000f9b8: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 4000f9bc: 80 a0 60 00 cmp %g1, 0 4000f9c0: 12 80 00 04 bne 4000f9d0 4000f9c4: 01 00 00 00 nop _Thread_Dispatch(); 4000f9c8: 40 00 1c c3 call 40016cd4 <_Thread_Dispatch> 4000f9cc: 01 00 00 00 nop _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 4000f9d0: 81 c7 e0 08 ret 4000f9d4: 81 e8 00 00 restore 40013b40 : void *buffer, size_t *size, uint32_t option_set, rtems_interval timeout ) { 40013b40: 9d e3 bf 90 save %sp, -112, %sp register Message_queue_Control *the_message_queue; Objects_Locations location; boolean wait; if ( !buffer ) 40013b44: 80 a6 60 00 cmp %i1, 0 40013b48: 02 80 00 28 be 40013be8 40013b4c: 92 10 00 18 mov %i0, %o1 return RTEMS_INVALID_ADDRESS; if ( !size ) 40013b50: 80 a6 a0 00 cmp %i2, 0 40013b54: 02 80 00 25 be 40013be8 40013b58: 11 10 00 a9 sethi %hi(0x4002a400), %o0 RTEMS_INLINE_ROUTINE Message_queue_Control *_Message_queue_Get ( Objects_Id id, Objects_Locations *location ) { return (Message_queue_Control *) 40013b5c: 94 07 bf f4 add %fp, -12, %o2 40013b60: 7f ff e4 c6 call 4000ce78 <_Objects_Get> 40013b64: 90 12 22 cc or %o0, 0x2cc, %o0 return RTEMS_INVALID_ADDRESS; the_message_queue = _Message_queue_Get( id, &location ); switch ( location ) { 40013b68: c2 07 bf f4 ld [ %fp + -12 ], %g1 40013b6c: 80 a0 60 00 cmp %g1, 0 40013b70: 22 80 00 07 be,a 40013b8c 40013b74: d2 02 20 08 ld [ %o0 + 8 ], %o1 40013b78: 80 a0 60 02 cmp %g1, 2 40013b7c: 08 80 00 1c bleu 40013bec 40013b80: 90 10 20 04 mov 4, %o0 40013b84: 10 80 00 1a b 40013bec <== NOT EXECUTED 40013b88: 90 10 20 19 mov 0x19, %o0 <== NOT EXECUTED 40013b8c: 98 0e e0 01 and %i3, 1, %o4 if ( _Options_Is_no_wait( option_set ) ) wait = FALSE; else wait = TRUE; _CORE_message_queue_Seize( 40013b90: 94 10 00 19 mov %i1, %o2 40013b94: 96 10 00 1a mov %i2, %o3 40013b98: 98 1b 20 01 xor %o4, 1, %o4 40013b9c: 9a 10 00 1c mov %i4, %o5 40013ba0: 40 00 01 94 call 400141f0 <_CORE_message_queue_Seize> 40013ba4: 90 02 20 14 add %o0, 0x14, %o0 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40013ba8: 05 10 00 a7 sethi %hi(0x40029c00), %g2 40013bac: c2 00 a0 60 ld [ %g2 + 0x60 ], %g1 ! 40029c60 <_Thread_Dispatch_disable_level> 40013bb0: 82 00 7f ff add %g1, -1, %g1 40013bb4: c2 20 a0 60 st %g1, [ %g2 + 0x60 ] 40013bb8: c2 00 a0 60 ld [ %g2 + 0x60 ], %g1 40013bbc: 80 a0 60 00 cmp %g1, 0 40013bc0: 12 80 00 05 bne 40013bd4 40013bc4: 03 10 00 a7 sethi %hi(0x40029c00), %g1 _Thread_Dispatch(); 40013bc8: 7f ff e9 a0 call 4000e248 <_Thread_Dispatch> 40013bcc: 01 00 00 00 nop size, wait, timeout ); _Thread_Enable_dispatch(); return _Message_queue_Translate_core_message_queue_return_code( 40013bd0: 03 10 00 a7 sethi %hi(0x40029c00), %g1 40013bd4: c2 00 61 3c ld [ %g1 + 0x13c ], %g1 ! 40029d3c <_Thread_Executing> 40013bd8: 40 00 00 32 call 40013ca0 <_Message_queue_Translate_core_message_queue_return_code> 40013bdc: d0 00 60 34 ld [ %g1 + 0x34 ], %o0 ); } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40013be0: 81 c7 e0 08 ret 40013be4: 91 e8 00 08 restore %g0, %o0, %o0 size, wait, timeout ); _Thread_Enable_dispatch(); return _Message_queue_Translate_core_message_queue_return_code( 40013be8: 90 10 20 09 mov 9, %o0 <== NOT EXECUTED ); } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40013bec: b0 10 00 08 mov %o0, %i0 40013bf0: 81 c7 e0 08 ret 40013bf4: 81 e8 00 00 restore 40013bf8 : rtems_status_code rtems_message_queue_send( Objects_Id id, void *buffer, size_t size ) { 40013bf8: 9d e3 bf 88 save %sp, -120, %sp register Message_queue_Control *the_message_queue; Objects_Locations location; CORE_message_queue_Status status; if ( !buffer ) 40013bfc: 80 a6 60 00 cmp %i1, 0 40013c00: 02 80 00 26 be 40013c98 40013c04: 90 10 20 09 mov 9, %o0 40013c08: 11 10 00 a9 sethi %hi(0x4002a400), %o0 40013c0c: 92 10 00 18 mov %i0, %o1 40013c10: 90 12 22 cc or %o0, 0x2cc, %o0 40013c14: 7f ff e4 99 call 4000ce78 <_Objects_Get> 40013c18: 94 07 bf f4 add %fp, -12, %o2 return RTEMS_INVALID_ADDRESS; the_message_queue = _Message_queue_Get( id, &location ); switch ( location ) 40013c1c: c2 07 bf f4 ld [ %fp + -12 ], %g1 40013c20: 80 a0 60 00 cmp %g1, 0 40013c24: 22 80 00 07 be,a 40013c40 40013c28: 94 10 00 1a mov %i2, %o2 40013c2c: 80 a0 60 02 cmp %g1, 2 40013c30: 08 80 00 1a bleu 40013c98 40013c34: 90 10 20 04 mov 4, %o0 40013c38: 10 80 00 18 b 40013c98 <== NOT EXECUTED 40013c3c: 90 10 20 19 mov 0x19, %o0 <== NOT EXECUTED CORE_message_queue_API_mp_support_callout api_message_queue_mp_support, boolean wait, Watchdog_Interval timeout ) { return _CORE_message_queue_Submit( 40013c40: c0 23 a0 5c clr [ %sp + 0x5c ] 40013c44: c0 23 a0 60 clr [ %sp + 0x60 ] 40013c48: 92 10 00 19 mov %i1, %o1 40013c4c: 96 10 00 18 mov %i0, %o3 40013c50: 98 10 20 00 clr %o4 40013c54: 90 02 20 14 add %o0, 0x14, %o0 40013c58: 1b 1f ff ff sethi %hi(0x7ffffc00), %o5 40013c5c: 40 00 01 b2 call 40014324 <_CORE_message_queue_Submit> 40013c60: 9a 13 63 ff or %o5, 0x3ff, %o5 ! 7fffffff 40013c64: b4 10 00 08 mov %o0, %i2 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40013c68: 05 10 00 a7 sethi %hi(0x40029c00), %g2 40013c6c: c2 00 a0 60 ld [ %g2 + 0x60 ], %g1 ! 40029c60 <_Thread_Dispatch_disable_level> 40013c70: 82 00 7f ff add %g1, -1, %g1 40013c74: c2 20 a0 60 st %g1, [ %g2 + 0x60 ] 40013c78: c2 00 a0 60 ld [ %g2 + 0x60 ], %g1 40013c7c: 80 a0 60 00 cmp %g1, 0 40013c80: 12 80 00 04 bne 40013c90 40013c84: 01 00 00 00 nop _Thread_Dispatch(); 40013c88: 7f ff e9 70 call 4000e248 <_Thread_Dispatch> 40013c8c: 01 00 00 00 nop /* * Since this API does not allow for blocking sends, we can directly * return the returned status. */ return _Message_queue_Translate_core_message_queue_return_code(status); 40013c90: 40 00 00 04 call 40013ca0 <_Message_queue_Translate_core_message_queue_return_code> 40013c94: 90 10 00 1a mov %i2, %o0 } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40013c98: 81 c7 e0 08 ret 40013c9c: 91 e8 00 08 restore %g0, %o0, %o0 4000916c : rtems_status_code rtems_message_queue_urgent( Objects_Id id, void *buffer, size_t size ) { 4000916c: 9d e3 bf 88 save %sp, -120, %sp register Message_queue_Control *the_message_queue; Objects_Locations location; CORE_message_queue_Status status; if ( !buffer ) 40009170: 80 a6 60 00 cmp %i1, 0 40009174: 02 80 00 25 be 40009208 40009178: 90 10 20 09 mov 9, %o0 4000917c: 11 10 00 8d sethi %hi(0x40023400), %o0 40009180: 92 10 00 18 mov %i0, %o1 40009184: 90 12 22 b8 or %o0, 0x2b8, %o0 40009188: 40 00 0a 05 call 4000b99c <_Objects_Get> 4000918c: 94 07 bf f4 add %fp, -12, %o2 return RTEMS_INVALID_ADDRESS; the_message_queue = _Message_queue_Get( id, &location ); switch ( location ) 40009190: c2 07 bf f4 ld [ %fp + -12 ], %g1 40009194: 80 a0 60 00 cmp %g1, 0 40009198: 22 80 00 07 be,a 400091b4 4000919c: 94 10 00 1a mov %i2, %o2 400091a0: 80 a0 60 02 cmp %g1, 2 <== NOT EXECUTED 400091a4: 08 80 00 19 bleu 40009208 <== NOT EXECUTED 400091a8: 90 10 20 04 mov 4, %o0 <== NOT EXECUTED 400091ac: 10 80 00 17 b 40009208 <== NOT EXECUTED 400091b0: 90 10 20 19 mov 0x19, %o0 <== NOT EXECUTED CORE_message_queue_API_mp_support_callout api_message_queue_mp_support, boolean wait, Watchdog_Interval timeout ) { return _CORE_message_queue_Submit( 400091b4: c0 23 a0 5c clr [ %sp + 0x5c ] 400091b8: c0 23 a0 60 clr [ %sp + 0x60 ] 400091bc: 92 10 00 19 mov %i1, %o1 400091c0: 96 10 00 18 mov %i0, %o3 400091c4: 98 10 20 00 clr %o4 400091c8: 1b 20 00 00 sethi %hi(0x80000000), %o5 400091cc: 40 00 05 ef call 4000a988 <_CORE_message_queue_Submit> 400091d0: 90 02 20 14 add %o0, 0x14, %o0 400091d4: b4 10 00 08 mov %o0, %i2 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 400091d8: 03 10 00 8b sethi %hi(0x40022c00), %g1 400091dc: c4 00 60 d0 ld [ %g1 + 0xd0 ], %g2 ! 40022cd0 <_Thread_Dispatch_disable_level> 400091e0: 84 00 bf ff add %g2, -1, %g2 400091e4: c4 20 60 d0 st %g2, [ %g1 + 0xd0 ] 400091e8: c2 00 60 d0 ld [ %g1 + 0xd0 ], %g1 400091ec: 80 a0 60 00 cmp %g1, 0 400091f0: 12 80 00 04 bne 40009200 400091f4: 01 00 00 00 nop _Thread_Dispatch(); 400091f8: 40 00 0e dd call 4000cd6c <_Thread_Dispatch> 400091fc: 01 00 00 00 nop /* * Since this API does not allow for blocking sends, we can directly * return the returned status. */ return _Message_queue_Translate_core_message_queue_return_code(status); 40009200: 7f ff ff d1 call 40009144 <_Message_queue_Translate_core_message_queue_return_code> 40009204: 90 10 00 1a mov %i2, %o0 } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40009208: 81 c7 e0 08 ret 4000920c: 91 e8 00 08 restore %g0, %o0, %o0 40006ffc : void rtems_panic( const char *printf_format, ... ) { 40006ffc: 9d e3 bf 90 save %sp, -112, %sp <== NOT EXECUTED va_list arglist; va_start(arglist, printf_format); (void) rtems_verror(RTEMS_ERROR_PANIC, printf_format, arglist); 40007000: 11 08 00 00 sethi %hi(0x20000000), %o0 <== NOT EXECUTED ... ) { va_list arglist; va_start(arglist, printf_format); 40007004: 94 07 a0 48 add %fp, 0x48, %o2 <== NOT EXECUTED void rtems_panic( const char *printf_format, ... ) { 40007008: f2 27 a0 48 st %i1, [ %fp + 0x48 ] <== NOT EXECUTED 4000700c: f4 27 a0 4c st %i2, [ %fp + 0x4c ] <== NOT EXECUTED 40007010: f6 27 a0 50 st %i3, [ %fp + 0x50 ] <== NOT EXECUTED 40007014: f8 27 a0 54 st %i4, [ %fp + 0x54 ] <== NOT EXECUTED 40007018: fa 27 a0 58 st %i5, [ %fp + 0x58 ] <== NOT EXECUTED va_list arglist; va_start(arglist, printf_format); (void) rtems_verror(RTEMS_ERROR_PANIC, printf_format, arglist); 4000701c: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED 40007020: 7f ff ff 8b call 40006e4c <== NOT EXECUTED 40007024: d4 27 bf f4 st %o2, [ %fp + -12 ] <== NOT EXECUTED va_end(arglist); } 40007028: 81 c7 e0 08 ret <== NOT EXECUTED 4000702c: 81 e8 00 00 restore <== NOT EXECUTED 4000fbc8 : uint32_t length, uint32_t buffer_size, rtems_attribute attribute_set, Objects_Id *id ) { 4000fbc8: 9d e3 bf 98 save %sp, -104, %sp register Partition_Control *the_partition; if ( !rtems_is_name_valid( name ) ) 4000fbcc: a6 96 20 00 orcc %i0, 0, %l3 4000fbd0: 02 80 00 1e be 4000fc48 4000fbd4: b0 10 20 03 mov 3, %i0 return RTEMS_INVALID_NAME; if ( !starting_address ) 4000fbd8: 80 a6 60 00 cmp %i1, 0 4000fbdc: 02 80 00 3d be 4000fcd0 4000fbe0: 80 a7 60 00 cmp %i5, 0 return RTEMS_INVALID_ADDRESS; if ( !id ) 4000fbe4: 02 80 00 3b be 4000fcd0 4000fbe8: 80 a6 a0 00 cmp %i2, 0 return RTEMS_INVALID_ADDRESS; if ( length == 0 || buffer_size == 0 || length < buffer_size || 4000fbec: 22 80 00 17 be,a 4000fc48 4000fbf0: b0 10 20 08 mov 8, %i0 4000fbf4: 80 a6 e0 00 cmp %i3, 0 4000fbf8: 22 80 00 14 be,a 4000fc48 4000fbfc: b0 10 20 08 mov 8, %i0 4000fc00: 80 a6 80 1b cmp %i2, %i3 4000fc04: 0a 80 00 35 bcs 4000fcd8 4000fc08: 80 8e e0 07 btst 7, %i3 4000fc0c: 12 80 00 33 bne 4000fcd8 4000fc10: 80 8e 60 07 btst 7, %i1 !_Partition_Is_buffer_size_aligned( buffer_size ) ) return RTEMS_INVALID_SIZE; if ( !_Addresses_Is_aligned( starting_address ) ) 4000fc14: 12 80 00 2f bne 4000fcd0 4000fc18: 05 10 00 d2 sethi %hi(0x40034800), %g2 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 4000fc1c: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> 4000fc20: 82 00 60 01 inc %g1 4000fc24: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] * the inactive chain of free partition control blocks. */ RTEMS_INLINE_ROUTINE Partition_Control *_Partition_Allocate ( void ) { return (Partition_Control *) _Objects_Allocate( &_Partition_Information ); 4000fc28: 25 10 00 d1 sethi %hi(0x40034400), %l2 4000fc2c: 40 00 15 de call 400153a4 <_Objects_Allocate> 4000fc30: 90 14 a2 30 or %l2, 0x230, %o0 ! 40034630 <_Partition_Information> _Thread_Disable_dispatch(); /* prevents deletion */ the_partition = _Partition_Allocate(); if ( !the_partition ) { 4000fc34: a2 92 20 00 orcc %o0, 0, %l1 4000fc38: 12 80 00 06 bne 4000fc50 4000fc3c: 92 10 00 1b mov %i3, %o1 _Thread_Enable_dispatch(); 4000fc40: 7f ff ff d5 call 4000fb94 <_Thread_Enable_dispatch> 4000fc44: b0 10 20 05 mov 5, %i0 4000fc48: 81 c7 e0 08 ret 4000fc4c: 81 e8 00 00 restore #endif the_partition->starting_address = starting_address; the_partition->length = length; the_partition->buffer_size = buffer_size; the_partition->attribute_set = attribute_set; 4000fc50: f8 24 60 1c st %i4, [ %l1 + 0x1c ] _Thread_Enable_dispatch(); return RTEMS_TOO_MANY; } #endif the_partition->starting_address = starting_address; 4000fc54: f2 24 60 10 st %i1, [ %l1 + 0x10 ] the_partition->length = length; 4000fc58: f4 24 60 14 st %i2, [ %l1 + 0x14 ] the_partition->buffer_size = buffer_size; 4000fc5c: f6 24 60 18 st %i3, [ %l1 + 0x18 ] the_partition->attribute_set = attribute_set; the_partition->number_of_used_blocks = 0; 4000fc60: c0 24 60 20 clr [ %l1 + 0x20 ] _Chain_Initialize( &the_partition->Memory, starting_address, 4000fc64: 40 00 55 a0 call 400252e4 <.udiv> 4000fc68: 90 10 00 1a mov %i2, %o0 4000fc6c: a0 04 60 24 add %l1, 0x24, %l0 4000fc70: 94 10 00 08 mov %o0, %o2 4000fc74: 92 10 00 19 mov %i1, %o1 4000fc78: 90 10 00 10 mov %l0, %o0 4000fc7c: 40 00 11 b1 call 40014340 <_Chain_Initialize> 4000fc80: 96 10 00 1b mov %i3, %o3 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 4000fc84: 90 14 a2 30 or %l2, 0x230, %o0 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, the_object ); 4000fc88: c4 04 60 08 ld [ %l1 + 8 ], %g2 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 4000fc8c: c6 12 20 10 lduh [ %o0 + 0x10 ], %g3 4000fc90: 03 00 00 3f sethi %hi(0xfc00), %g1 4000fc94: 82 10 63 ff or %g1, 0x3ff, %g1 ! ffff 4000fc98: 82 08 80 01 and %g2, %g1, %g1 4000fc9c: 80 a0 40 03 cmp %g1, %g3 4000fca0: 38 80 00 06 bgu,a 4000fcb8 4000fca4: c2 04 60 08 ld [ %l1 + 8 ], %g1 <== NOT EXECUTED information->local_table[ index ] = the_object; 4000fca8: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 4000fcac: 83 28 60 02 sll %g1, 2, %g1 4000fcb0: e2 20 80 01 st %l1, [ %g2 + %g1 ] &_Partition_Information, &the_partition->Object, (Objects_Name) name ); *id = the_partition->Object.id; 4000fcb4: c2 04 60 08 ld [ %l1 + 8 ], %g1 if ( information->is_string ) /* _Objects_Copy_name_string( name, the_object->name ); */ the_object->name = name; else /* _Objects_Copy_name_raw( name, the_object->name, information->name_length ); */ the_object->name = name; 4000fcb8: e6 24 60 0c st %l3, [ %l1 + 0xc ] 4000fcbc: c2 27 40 00 st %g1, [ %i5 ] name, 0 /* Not used */ ); #endif _Thread_Enable_dispatch(); 4000fcc0: 7f ff ff b5 call 4000fb94 <_Thread_Enable_dispatch> 4000fcc4: b0 10 20 00 clr %i0 4000fcc8: 81 c7 e0 08 ret 4000fccc: 81 e8 00 00 restore return RTEMS_SUCCESSFUL; 4000fcd0: 81 c7 e0 08 ret 4000fcd4: 91 e8 20 09 restore %g0, 9, %o0 4000fcd8: b0 10 20 08 mov 8, %i0 } 4000fcdc: 81 c7 e0 08 ret 4000fce0: 81 e8 00 00 restore 4000fd18 : */ rtems_status_code rtems_partition_delete( Objects_Id id ) { 4000fd18: 9d e3 bf 90 save %sp, -112, %sp RTEMS_INLINE_ROUTINE Partition_Control *_Partition_Get ( Objects_Id id, Objects_Locations *location ) { return (Partition_Control *) 4000fd1c: 92 10 00 18 mov %i0, %o1 4000fd20: 94 07 bf f4 add %fp, -12, %o2 4000fd24: 31 10 00 d1 sethi %hi(0x40034400), %i0 4000fd28: 40 00 16 f7 call 40015904 <_Objects_Get> 4000fd2c: 90 16 22 30 or %i0, 0x230, %o0 ! 40034630 <_Partition_Information> register Partition_Control *the_partition; Objects_Locations location; the_partition = _Partition_Get( id, &location ); switch ( location ) { 4000fd30: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000fd34: 80 a0 60 00 cmp %g1, 0 4000fd38: 02 80 00 07 be 4000fd54 4000fd3c: 88 10 00 08 mov %o0, %g4 4000fd40: 80 a0 60 02 cmp %g1, 2 4000fd44: 08 80 00 18 bleu 4000fda4 4000fd48: b0 10 20 04 mov 4, %i0 4000fd4c: 81 c7 e0 08 ret <== NOT EXECUTED 4000fd50: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: if ( the_partition->number_of_used_blocks == 0 ) { 4000fd54: c2 02 20 20 ld [ %o0 + 0x20 ], %g1 4000fd58: 80 a0 60 00 cmp %g1, 0 4000fd5c: 12 80 00 14 bne 4000fdac 4000fd60: 90 16 22 30 or %i0, 0x230, %o0 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); 4000fd64: c2 01 20 08 ld [ %g4 + 8 ], %g1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 4000fd68: c6 12 20 10 lduh [ %o0 + 0x10 ], %g3 4000fd6c: 05 00 00 3f sethi %hi(0xfc00), %g2 4000fd70: 84 10 a3 ff or %g2, 0x3ff, %g2 ! ffff 4000fd74: 82 08 40 02 and %g1, %g2, %g1 4000fd78: 80 a0 40 03 cmp %g1, %g3 4000fd7c: 18 80 00 05 bgu 4000fd90 4000fd80: 92 10 00 04 mov %g4, %o1 information->local_table[ index ] = the_object; 4000fd84: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 4000fd88: 83 28 60 02 sll %g1, 2, %g1 4000fd8c: c0 20 80 01 clr [ %g2 + %g1 ] uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); /* _Objects_Clear_name( the_object->name, information->name_length ); */ the_object->name = 0; 4000fd90: c0 21 20 0c clr [ %g4 + 0xc ] RTEMS_INLINE_ROUTINE void _Partition_Free ( Partition_Control *the_partition ) { _Objects_Free( &_Partition_Information, &the_partition->Object ); 4000fd94: 40 00 16 86 call 400157ac <_Objects_Free> 4000fd98: b0 10 20 00 clr %i0 0 /* Not used */ ); } #endif _Thread_Enable_dispatch(); 4000fd9c: 7f ff ff d2 call 4000fce4 <_Thread_Enable_dispatch> 4000fda0: 01 00 00 00 nop 4000fda4: 81 c7 e0 08 ret 4000fda8: 81 e8 00 00 restore return RTEMS_SUCCESSFUL; } _Thread_Enable_dispatch(); 4000fdac: 7f ff ff ce call 4000fce4 <_Thread_Enable_dispatch> 4000fdb0: b0 10 20 0c mov 0xc, %i0 return RTEMS_RESOURCE_IN_USE; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 4000fdb4: 81 c7 e0 08 ret 4000fdb8: 81 e8 00 00 restore 4000fdf0 : rtems_status_code rtems_partition_get_buffer( Objects_Id id, void **buffer ) { 4000fdf0: 9d e3 bf 90 save %sp, -112, %sp 4000fdf4: 92 10 00 18 mov %i0, %o1 register Partition_Control *the_partition; Objects_Locations location; void *the_buffer; if ( !buffer ) 4000fdf8: 80 a6 60 00 cmp %i1, 0 4000fdfc: 02 80 00 1a be 4000fe64 4000fe00: b0 10 20 09 mov 9, %i0 RTEMS_INLINE_ROUTINE Partition_Control *_Partition_Get ( Objects_Id id, Objects_Locations *location ) { return (Partition_Control *) 4000fe04: 11 10 00 d1 sethi %hi(0x40034400), %o0 4000fe08: 94 07 bf f4 add %fp, -12, %o2 4000fe0c: 40 00 16 be call 40015904 <_Objects_Get> 4000fe10: 90 12 22 30 or %o0, 0x230, %o0 return RTEMS_INVALID_ADDRESS; the_partition = _Partition_Get( id, &location ); switch ( location ) { 4000fe14: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000fe18: 80 a0 60 00 cmp %g1, 0 4000fe1c: 02 80 00 07 be 4000fe38 4000fe20: b0 10 00 08 mov %o0, %i0 4000fe24: 80 a0 60 02 cmp %g1, 2 4000fe28: 08 80 00 0f bleu 4000fe64 4000fe2c: b0 10 20 04 mov 4, %i0 4000fe30: 81 c7 e0 08 ret <== NOT EXECUTED 4000fe34: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED RTEMS_INLINE_ROUTINE void *_Partition_Allocate_buffer ( Partition_Control *the_partition ) { return _Chain_Get( &the_partition->Memory ); 4000fe38: 40 00 11 32 call 40014300 <_Chain_Get> 4000fe3c: 90 02 20 24 add %o0, 0x24, %o0 case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: the_buffer = _Partition_Allocate_buffer( the_partition ); if ( the_buffer ) { 4000fe40: a0 92 20 00 orcc %o0, 0, %l0 4000fe44: 02 80 00 0a be 4000fe6c 4000fe48: 01 00 00 00 nop the_partition->number_of_used_blocks += 1; 4000fe4c: c2 06 20 20 ld [ %i0 + 0x20 ], %g1 4000fe50: 82 00 60 01 inc %g1 4000fe54: c2 26 20 20 st %g1, [ %i0 + 0x20 ] _Thread_Enable_dispatch(); 4000fe58: 7f ff ff d9 call 4000fdbc <_Thread_Enable_dispatch> 4000fe5c: b0 10 20 00 clr %i0 *buffer = the_buffer; 4000fe60: e0 26 40 00 st %l0, [ %i1 ] 4000fe64: 81 c7 e0 08 ret 4000fe68: 81 e8 00 00 restore return RTEMS_SUCCESSFUL; } _Thread_Enable_dispatch(); 4000fe6c: 7f ff ff d4 call 4000fdbc <_Thread_Enable_dispatch> 4000fe70: b0 10 20 0d mov 0xd, %i0 return RTEMS_UNSATISFIED; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 4000fe74: 81 c7 e0 08 ret 4000fe78: 81 e8 00 00 restore 4000fee4 : rtems_status_code rtems_partition_return_buffer( Objects_Id id, void *buffer ) { 4000fee4: 9d e3 bf 90 save %sp, -112, %sp RTEMS_INLINE_ROUTINE Partition_Control *_Partition_Get ( Objects_Id id, Objects_Locations *location ) { return (Partition_Control *) 4000fee8: 11 10 00 d1 sethi %hi(0x40034400), %o0 4000feec: 92 10 00 18 mov %i0, %o1 4000fef0: 90 12 22 30 or %o0, 0x230, %o0 4000fef4: 40 00 16 84 call 40015904 <_Objects_Get> 4000fef8: 94 07 bf f4 add %fp, -12, %o2 register Partition_Control *the_partition; Objects_Locations location; the_partition = _Partition_Get( id, &location ); switch ( location ) { 4000fefc: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000ff00: 80 a0 60 00 cmp %g1, 0 4000ff04: 02 80 00 07 be 4000ff20 4000ff08: b0 10 00 08 mov %o0, %i0 4000ff0c: 80 a0 60 02 cmp %g1, 2 4000ff10: 08 80 00 1a bleu 4000ff78 4000ff14: b0 10 20 04 mov 4, %i0 4000ff18: 81 c7 e0 08 ret <== NOT EXECUTED 4000ff1c: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED ) { void *starting; void *ending; starting = the_partition->starting_address; 4000ff20: c4 02 20 10 ld [ %o0 + 0x10 ], %g2 ending = _Addresses_Add_offset( starting, the_partition->length ); return ( 4000ff24: 80 a6 40 02 cmp %i1, %g2 4000ff28: 0a 80 00 16 bcs 4000ff80 4000ff2c: 01 00 00 00 nop 4000ff30: c2 02 20 14 ld [ %o0 + 0x14 ], %g1 4000ff34: 82 00 80 01 add %g2, %g1, %g1 4000ff38: 80 a6 40 01 cmp %i1, %g1 4000ff3c: 18 80 00 11 bgu 4000ff80 4000ff40: 01 00 00 00 nop 4000ff44: d2 02 20 18 ld [ %o0 + 0x18 ], %o1 4000ff48: 40 00 55 93 call 40025594 <.urem> 4000ff4c: 90 26 40 02 sub %i1, %g2, %o0 4000ff50: 80 a2 20 00 cmp %o0, 0 4000ff54: 12 80 00 0b bne 4000ff80 4000ff58: 90 06 20 24 add %i0, 0x24, %o0 RTEMS_INLINE_ROUTINE void _Partition_Free_buffer ( Partition_Control *the_partition, Chain_Node *the_buffer ) { _Chain_Append( &the_partition->Memory, the_buffer ); 4000ff5c: 40 00 10 dd call 400142d0 <_Chain_Append> 4000ff60: 92 10 00 19 mov %i1, %o1 return RTEMS_INVALID_ID; case OBJECTS_LOCAL: if ( _Partition_Is_buffer_valid( buffer, the_partition ) ) { _Partition_Free_buffer( the_partition, buffer ); the_partition->number_of_used_blocks -= 1; 4000ff64: c2 06 20 20 ld [ %i0 + 0x20 ], %g1 4000ff68: 82 00 7f ff add %g1, -1, %g1 4000ff6c: c2 26 20 20 st %g1, [ %i0 + 0x20 ] _Thread_Enable_dispatch(); 4000ff70: 7f ff ff d0 call 4000feb0 <_Thread_Enable_dispatch> 4000ff74: b0 10 20 00 clr %i0 4000ff78: 81 c7 e0 08 ret 4000ff7c: 81 e8 00 00 restore return RTEMS_SUCCESSFUL; } _Thread_Enable_dispatch(); 4000ff80: 7f ff ff cc call 4000feb0 <_Thread_Enable_dispatch> 4000ff84: b0 10 20 09 mov 9, %i0 return RTEMS_INVALID_ADDRESS; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 4000ff88: 81 c7 e0 08 ret 4000ff8c: 81 e8 00 00 restore 4000ed8c : void *internal_start, void *external_start, uint32_t length, Objects_Id *id ) { 4000ed8c: 9d e3 bf 98 save %sp, -104, %sp register Dual_ported_memory_Control *the_port; if ( !rtems_is_name_valid( name) ) 4000ed90: a2 96 20 00 orcc %i0, 0, %l1 4000ed94: 02 80 00 15 be 4000ede8 4000ed98: b0 10 20 03 mov 3, %i0 return RTEMS_INVALID_NAME; if ( !id ) 4000ed9c: 80 a7 20 00 cmp %i4, 0 4000eda0: 02 80 00 29 be 4000ee44 4000eda4: 80 8e 60 07 btst 7, %i1 return RTEMS_INVALID_ADDRESS; if ( !_Addresses_Is_aligned( internal_start ) || 4000eda8: 12 80 00 27 bne 4000ee44 4000edac: 80 8e a0 07 btst 7, %i2 4000edb0: 32 80 00 0e bne,a 4000ede8 4000edb4: b0 10 20 09 mov 9, %i0 <== NOT EXECUTED rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 4000edb8: 05 10 00 d2 sethi %hi(0x40034800), %g2 4000edbc: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> 4000edc0: 82 00 60 01 inc %g1 4000edc4: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] */ RTEMS_INLINE_ROUTINE Dual_ported_memory_Control *_Dual_ported_memory_Allocate ( void ) { return (Dual_ported_memory_Control *) 4000edc8: 21 10 00 d1 sethi %hi(0x40034400), %l0 4000edcc: 40 00 19 76 call 400153a4 <_Objects_Allocate> 4000edd0: 90 14 21 e4 or %l0, 0x1e4, %o0 ! 400345e4 <_Dual_ported_memory_Information> _Thread_Disable_dispatch(); /* to prevent deletion */ the_port = _Dual_ported_memory_Allocate(); if ( !the_port ) { 4000edd4: 80 a2 20 00 cmp %o0, 0 4000edd8: 12 80 00 06 bne 4000edf0 4000eddc: 88 14 21 e4 or %l0, 0x1e4, %g4 _Thread_Enable_dispatch(); 4000ede0: 7f ff ff de call 4000ed58 <_Thread_Enable_dispatch> 4000ede4: b0 10 20 05 mov 5, %i0 4000ede8: 81 c7 e0 08 ret 4000edec: 81 e8 00 00 restore ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, the_object ); 4000edf0: c4 02 20 08 ld [ %o0 + 8 ], %g2 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 4000edf4: c6 11 20 10 lduh [ %g4 + 0x10 ], %g3 return RTEMS_TOO_MANY; } the_port->internal_base = internal_start; the_port->external_base = external_start; the_port->length = length - 1; 4000edf8: 82 06 ff ff add %i3, -1, %g1 if ( !the_port ) { _Thread_Enable_dispatch(); return RTEMS_TOO_MANY; } the_port->internal_base = internal_start; 4000edfc: f2 22 20 10 st %i1, [ %o0 + 0x10 ] the_port->external_base = external_start; the_port->length = length - 1; 4000ee00: c2 22 20 18 st %g1, [ %o0 + 0x18 ] 4000ee04: 03 00 00 3f sethi %hi(0xfc00), %g1 4000ee08: 82 10 63 ff or %g1, 0x3ff, %g1 ! ffff 4000ee0c: 82 08 80 01 and %g2, %g1, %g1 4000ee10: 80 a0 40 03 cmp %g1, %g3 4000ee14: 18 80 00 05 bgu 4000ee28 4000ee18: f4 22 20 14 st %i2, [ %o0 + 0x14 ] information->local_table[ index ] = the_object; 4000ee1c: c4 01 20 20 ld [ %g4 + 0x20 ], %g2 4000ee20: 83 28 60 02 sll %g1, 2, %g1 4000ee24: d0 20 80 01 st %o0, [ %g2 + %g1 ] &_Dual_ported_memory_Information, &the_port->Object, (Objects_Name) name ); *id = the_port->Object.id; 4000ee28: c2 02 20 08 ld [ %o0 + 8 ], %g1 if ( information->is_string ) /* _Objects_Copy_name_string( name, the_object->name ); */ the_object->name = name; else /* _Objects_Copy_name_raw( name, the_object->name, information->name_length ); */ the_object->name = name; 4000ee2c: e2 22 20 0c st %l1, [ %o0 + 0xc ] 4000ee30: c2 27 00 00 st %g1, [ %i4 ] _Thread_Enable_dispatch(); 4000ee34: 7f ff ff c9 call 4000ed58 <_Thread_Enable_dispatch> 4000ee38: b0 10 20 00 clr %i0 4000ee3c: 81 c7 e0 08 ret 4000ee40: 81 e8 00 00 restore return RTEMS_SUCCESSFUL; 4000ee44: b0 10 20 09 mov 9, %i0 } 4000ee48: 81 c7 e0 08 ret 4000ee4c: 81 e8 00 00 restore 40007294 : rtems_status_code rtems_rate_monotonic_create( rtems_name name, Objects_Id *id ) { 40007294: 9d e3 bf 98 save %sp, -104, %sp Rate_monotonic_Control *the_period; if ( !rtems_is_name_valid( name ) ) 40007298: a4 96 20 00 orcc %i0, 0, %l2 4000729c: 02 80 00 11 be 400072e0 400072a0: b0 10 20 03 mov 3, %i0 return RTEMS_INVALID_NAME; if ( !id ) 400072a4: 80 a6 60 00 cmp %i1, 0 400072a8: 02 80 00 0e be 400072e0 400072ac: b0 10 20 09 mov 9, %i0 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 400072b0: 05 10 00 7e sethi %hi(0x4001f800), %g2 400072b4: c2 00 a3 b0 ld [ %g2 + 0x3b0 ], %g1 ! 4001fbb0 <_Thread_Dispatch_disable_level> 400072b8: 82 00 60 01 inc %g1 400072bc: c2 20 a3 b0 st %g1, [ %g2 + 0x3b0 ] * the inactive chain of free period control blocks. */ RTEMS_INLINE_ROUTINE Rate_monotonic_Control *_Rate_monotonic_Allocate( void ) { return (Rate_monotonic_Control *) 400072c0: 23 10 00 7e sethi %hi(0x4001f800), %l1 400072c4: 40 00 09 df call 40009a40 <_Objects_Allocate> 400072c8: 90 14 62 1c or %l1, 0x21c, %o0 ! 4001fa1c <_Rate_monotonic_Information> _Thread_Disable_dispatch(); /* to prevent deletion */ the_period = _Rate_monotonic_Allocate(); if ( !the_period ) { 400072cc: a0 92 20 00 orcc %o0, 0, %l0 400072d0: 12 80 00 06 bne 400072e8 400072d4: 03 10 00 7f sethi %hi(0x4001fc00), %g1 _Thread_Enable_dispatch(); 400072d8: 7f ff ff e2 call 40007260 <_Thread_Enable_dispatch> 400072dc: b0 10 20 05 mov 5, %i0 400072e0: 81 c7 e0 08 ret 400072e4: 81 e8 00 00 restore return RTEMS_TOO_MANY; } the_period->owner = _Thread_Executing; 400072e8: c2 00 60 8c ld [ %g1 + 0x8c ], %g1 the_period->state = RATE_MONOTONIC_INACTIVE; 400072ec: c0 24 20 38 clr [ %l0 + 0x38 ] if ( !the_period ) { _Thread_Enable_dispatch(); return RTEMS_TOO_MANY; } the_period->owner = _Thread_Executing; 400072f0: c2 24 20 50 st %g1, [ %l0 + 0x50 ] Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 400072f4: c0 24 20 18 clr [ %l0 + 0x18 ] the_watchdog->routine = routine; 400072f8: c0 24 20 2c clr [ %l0 + 0x2c ] the_watchdog->id = id; 400072fc: c0 24 20 30 clr [ %l0 + 0x30 ] the_watchdog->user_data = user_data; 40007300: c0 24 20 34 clr [ %l0 + 0x34 ] the_period->state = RATE_MONOTONIC_INACTIVE; _Watchdog_Initialize( &the_period->Timer, NULL, 0, NULL ); _Rate_monotonic_Reset_statistics( the_period ); 40007304: 90 04 20 54 add %l0, 0x54, %o0 40007308: 92 10 20 00 clr %o1 4000730c: 40 00 28 30 call 400113cc 40007310: 94 10 20 38 mov 0x38, %o2 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40007314: 90 14 62 1c or %l1, 0x21c, %o0 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, the_object ); 40007318: c4 04 20 08 ld [ %l0 + 8 ], %g2 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 4000731c: c6 12 20 10 lduh [ %o0 + 0x10 ], %g3 40007320: 03 1f ff ff sethi %hi(0x7ffffc00), %g1 40007324: 82 10 63 ff or %g1, 0x3ff, %g1 ! 7fffffff 40007328: c2 24 20 78 st %g1, [ %l0 + 0x78 ] 4000732c: c2 24 20 5c st %g1, [ %l0 + 0x5c ] 40007330: c2 24 20 60 st %g1, [ %l0 + 0x60 ] 40007334: c2 24 20 74 st %g1, [ %l0 + 0x74 ] 40007338: 03 00 00 3f sethi %hi(0xfc00), %g1 4000733c: 82 10 63 ff or %g1, 0x3ff, %g1 ! ffff 40007340: 82 08 80 01 and %g2, %g1, %g1 40007344: 80 a0 40 03 cmp %g1, %g3 40007348: 38 80 00 06 bgu,a 40007360 4000734c: c2 04 20 08 ld [ %l0 + 8 ], %g1 <== NOT EXECUTED information->local_table[ index ] = the_object; 40007350: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 40007354: 83 28 60 02 sll %g1, 2, %g1 40007358: e0 20 80 01 st %l0, [ %g2 + %g1 ] &_Rate_monotonic_Information, &the_period->Object, (Objects_Name) name ); *id = the_period->Object.id; 4000735c: c2 04 20 08 ld [ %l0 + 8 ], %g1 if ( information->is_string ) /* _Objects_Copy_name_string( name, the_object->name ); */ the_object->name = name; else /* _Objects_Copy_name_raw( name, the_object->name, information->name_length ); */ the_object->name = name; 40007360: e4 24 20 0c st %l2, [ %l0 + 0xc ] 40007364: c2 26 40 00 st %g1, [ %i1 ] _Thread_Enable_dispatch(); 40007368: 7f ff ff be call 40007260 <_Thread_Enable_dispatch> 4000736c: b0 10 20 00 clr %i0 return RTEMS_SUCCESSFUL; } 40007370: 81 c7 e0 08 ret 40007374: 81 e8 00 00 restore 40010160 : */ rtems_status_code rtems_rate_monotonic_delete( Objects_Id id ) { 40010160: 9d e3 bf 90 save %sp, -112, %sp RTEMS_INLINE_ROUTINE Rate_monotonic_Control *_Rate_monotonic_Get ( Objects_Id id, Objects_Locations *location ) { return (Rate_monotonic_Control *) 40010164: 21 10 00 d1 sethi %hi(0x40034400), %l0 40010168: 92 10 00 18 mov %i0, %o1 4001016c: 94 07 bf f4 add %fp, -12, %o2 40010170: 40 00 15 e5 call 40015904 <_Objects_Get> 40010174: 90 14 22 7c or %l0, 0x27c, %o0 Rate_monotonic_Control *the_period; Objects_Locations location; the_period = _Rate_monotonic_Get( id, &location ); switch ( location ) { 40010178: c2 07 bf f4 ld [ %fp + -12 ], %g1 4001017c: 80 a0 60 00 cmp %g1, 0 40010180: 02 80 00 08 be 400101a0 40010184: b0 10 00 08 mov %o0, %i0 40010188: 82 18 60 02 xor %g1, 2, %g1 4001018c: 80 a0 00 01 cmp %g0, %g1 40010190: 82 60 20 00 subx %g0, 0, %g1 40010194: b0 08 60 15 and %g1, 0x15, %i0 40010198: 81 c7 e0 08 ret 4001019c: 91 ee 20 04 restore %i0, 4, %o0 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 400101a0: a0 14 22 7c or %l0, 0x27c, %l0 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); 400101a4: c2 02 20 08 ld [ %o0 + 8 ], %g1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 400101a8: c6 14 20 10 lduh [ %l0 + 0x10 ], %g3 400101ac: 05 00 00 3f sethi %hi(0xfc00), %g2 400101b0: 84 10 a3 ff or %g2, 0x3ff, %g2 ! ffff 400101b4: 82 08 40 02 and %g1, %g2, %g1 400101b8: 80 a0 40 03 cmp %g1, %g3 400101bc: 38 80 00 06 bgu,a 400101d4 400101c0: c0 26 20 0c clr [ %i0 + 0xc ] <== NOT EXECUTED information->local_table[ index ] = the_object; 400101c4: c4 04 20 20 ld [ %l0 + 0x20 ], %g2 400101c8: 83 28 60 02 sll %g1, 2, %g1 400101cc: c0 20 80 01 clr [ %g2 + %g1 ] uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); /* _Objects_Clear_name( the_object->name, information->name_length ); */ the_object->name = 0; 400101d0: c0 26 20 0c clr [ %i0 + 0xc ] case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: _Objects_Close( &_Rate_monotonic_Information, &the_period->Object ); (void) _Watchdog_Remove( &the_period->Timer ); 400101d4: 40 00 21 12 call 4001861c <_Watchdog_Remove> 400101d8: 90 06 20 10 add %i0, 0x10, %o0 RTEMS_INLINE_ROUTINE void _Rate_monotonic_Free ( Rate_monotonic_Control *the_period ) { _Objects_Free( &_Rate_monotonic_Information, &the_period->Object ); 400101dc: 90 10 00 10 mov %l0, %o0 the_period->state = RATE_MONOTONIC_INACTIVE; 400101e0: c0 26 20 38 clr [ %i0 + 0x38 ] 400101e4: 40 00 15 72 call 400157ac <_Objects_Free> 400101e8: 92 10 00 18 mov %i0, %o1 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 400101ec: 03 10 00 d2 sethi %hi(0x40034800), %g1 400101f0: c4 00 60 b0 ld [ %g1 + 0xb0 ], %g2 ! 400348b0 <_Thread_Dispatch_disable_level> 400101f4: b0 10 20 00 clr %i0 400101f8: 84 00 bf ff add %g2, -1, %g2 400101fc: c4 20 60 b0 st %g2, [ %g1 + 0xb0 ] 40010200: c2 00 60 b0 ld [ %g1 + 0xb0 ], %g1 40010204: 80 a0 60 00 cmp %g1, 0 40010208: 12 80 00 04 bne 40010218 4001020c: 01 00 00 00 nop _Thread_Dispatch(); 40010210: 40 00 1a b1 call 40016cd4 <_Thread_Dispatch> 40010214: 01 00 00 00 nop _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40010218: 81 c7 e0 08 ret 4001021c: 81 e8 00 00 restore 4000f084 : rtems_status_code rtems_rate_monotonic_get_status( Objects_Id id, rtems_rate_monotonic_period_status *status ) { 4000f084: 9d e3 bf 88 save %sp, -120, %sp 4000f088: 92 10 00 18 mov %i0, %o1 Objects_Locations location; Rate_monotonic_Control *the_period; if ( !status ) 4000f08c: 80 a6 60 00 cmp %i1, 0 4000f090: 02 80 00 36 be 4000f168 4000f094: b0 10 20 09 mov 9, %i0 4000f098: 11 10 00 7e sethi %hi(0x4001f800), %o0 4000f09c: 94 07 bf f4 add %fp, -12, %o2 4000f0a0: 7f ff eb f5 call 4000a074 <_Objects_Get> 4000f0a4: 90 12 22 1c or %o0, 0x21c, %o0 return RTEMS_INVALID_ADDRESS; the_period = _Rate_monotonic_Get( id, &location ); switch ( location ) { 4000f0a8: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000f0ac: 80 a0 60 00 cmp %g1, 0 4000f0b0: 02 80 00 08 be 4000f0d0 4000f0b4: b0 10 00 08 mov %o0, %i0 4000f0b8: 82 18 60 02 xor %g1, 2, %g1 <== NOT EXECUTED 4000f0bc: 80 a0 00 01 cmp %g0, %g1 <== NOT EXECUTED 4000f0c0: 82 60 20 00 subx %g0, 0, %g1 <== NOT EXECUTED 4000f0c4: b0 08 60 15 and %g1, 0x15, %i0 <== NOT EXECUTED 4000f0c8: 81 c7 e0 08 ret <== NOT EXECUTED 4000f0cc: 91 ee 20 04 restore %i0, 4, %o0 <== NOT EXECUTED case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: status->owner = ((the_period->owner) ? the_period->owner->Object.id : 0); 4000f0d0: c2 02 20 50 ld [ %o0 + 0x50 ], %g1 4000f0d4: 80 a0 60 00 cmp %g1, 0 4000f0d8: 02 80 00 03 be 4000f0e4 4000f0dc: 84 10 20 00 clr %g2 4000f0e0: c4 00 60 08 ld [ %g1 + 8 ], %g2 status->state = the_period->state; 4000f0e4: c2 06 20 38 ld [ %i0 + 0x38 ], %g1 case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: status->owner = ((the_period->owner) ? the_period->owner->Object.id : 0); 4000f0e8: c4 26 40 00 st %g2, [ %i1 ] status->state = the_period->state; if ( status->state == RATE_MONOTONIC_INACTIVE ) { 4000f0ec: 80 a0 60 00 cmp %g1, 0 4000f0f0: 12 80 00 07 bne 4000f10c 4000f0f4: c2 26 60 04 st %g1, [ %i1 + 4 ] #else status->ticks_since_last_period = 0; #endif #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS status->executed_since_last_period.tv_sec = 0; status->executed_since_last_period.tv_nsec = 0; 4000f0f8: c0 26 60 14 clr [ %i1 + 0x14 ] <== NOT EXECUTED status->owner = ((the_period->owner) ? the_period->owner->Object.id : 0); status->state = the_period->state; if ( status->state == RATE_MONOTONIC_INACTIVE ) { #ifdef RTEMS_ENABLE_NANOSECOND_RATE_MONOTONIC_STATISTICS status->since_last_period.tv_sec = 0; 4000f0fc: c0 26 60 08 clr [ %i1 + 8 ] <== NOT EXECUTED status->since_last_period.tv_nsec = 0; 4000f100: c0 26 60 0c clr [ %i1 + 0xc ] <== NOT EXECUTED #else status->ticks_since_last_period = 0; #endif #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS status->executed_since_last_period.tv_sec = 0; 4000f104: 10 80 00 0e b 4000f13c <== NOT EXECUTED 4000f108: c0 26 60 10 clr [ %i1 + 0x10 ] <== NOT EXECUTED * This lets them share one single invocation of _TOD_Get_uptime(). */ #if defined(RTEMS_ENABLE_NANOSECOND_RATE_MONOTONIC_STATISTICS) || \ defined(RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS) struct timespec uptime; _TOD_Get_uptime( &uptime ); 4000f10c: a0 07 bf ec add %fp, -20, %l0 4000f110: 7f ff e8 aa call 400093b8 <_TOD_Get_uptime> 4000f114: 90 10 00 10 mov %l0, %o0 #endif #ifdef RTEMS_ENABLE_NANOSECOND_RATE_MONOTONIC_STATISTICS _Timespec_Subtract( 4000f118: 90 06 20 44 add %i0, 0x44, %o0 4000f11c: 92 10 00 10 mov %l0, %o1 4000f120: 7f ff f5 4b call 4000c64c <_Timespec_Subtract> 4000f124: 94 06 60 08 add %i1, 8, %o2 status->ticks_since_last_period = _Watchdog_Ticks_since_boot - the_period->time_at_period; #endif #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS _Timespec_Subtract( 4000f128: 11 10 00 7f sethi %hi(0x4001fc00), %o0 4000f12c: 92 10 00 10 mov %l0, %o1 4000f130: 94 06 60 10 add %i1, 0x10, %o2 4000f134: 7f ff f5 46 call 4000c64c <_Timespec_Subtract> 4000f138: 90 12 20 94 or %o0, 0x94, %o0 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 4000f13c: 03 10 00 7e sethi %hi(0x4001f800), %g1 4000f140: c4 00 63 b0 ld [ %g1 + 0x3b0 ], %g2 ! 4001fbb0 <_Thread_Dispatch_disable_level> 4000f144: b0 10 20 00 clr %i0 4000f148: 84 00 bf ff add %g2, -1, %g2 4000f14c: c4 20 63 b0 st %g2, [ %g1 + 0x3b0 ] 4000f150: c2 00 63 b0 ld [ %g1 + 0x3b0 ], %g1 4000f154: 80 a0 60 00 cmp %g1, 0 4000f158: 12 80 00 04 bne 4000f168 4000f15c: 01 00 00 00 nop _Thread_Dispatch(); 4000f160: 7f ff f0 b9 call 4000b444 <_Thread_Dispatch> 4000f164: 01 00 00 00 nop _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 4000f168: 81 c7 e0 08 ret 4000f16c: 81 e8 00 00 restore 40007580 : rtems_status_code rtems_rate_monotonic_period( Objects_Id id, rtems_interval length ) { 40007580: 9d e3 bf 80 save %sp, -128, %sp RTEMS_INLINE_ROUTINE Rate_monotonic_Control *_Rate_monotonic_Get ( Objects_Id id, Objects_Locations *location ) { return (Rate_monotonic_Control *) 40007584: 11 10 00 7e sethi %hi(0x4001f800), %o0 40007588: 92 10 00 18 mov %i0, %o1 4000758c: 90 12 22 1c or %o0, 0x21c, %o0 40007590: 40 00 0a b9 call 4000a074 <_Objects_Get> 40007594: 94 07 bf f4 add %fp, -12, %o2 rtems_status_code return_value; rtems_rate_monotonic_period_states local_state; ISR_Level level; the_period = _Rate_monotonic_Get( id, &location ); switch ( location ) { 40007598: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000759c: 80 a0 60 00 cmp %g1, 0 400075a0: 02 80 00 07 be 400075bc 400075a4: a2 10 00 08 mov %o0, %l1 400075a8: 80 a0 60 02 cmp %g1, 2 400075ac: 02 80 00 0c be 400075dc 400075b0: b0 10 20 04 mov 4, %i0 the_period->state = RATE_MONOTONIC_ACTIVE; the_period->next_length = length; _Watchdog_Insert_ticks( &the_period->Timer, length ); _Thread_Enable_dispatch(); return RTEMS_TIMEOUT; 400075b4: 81 c7 e0 08 ret <== NOT EXECUTED 400075b8: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: if ( !_Thread_Is_executing( the_period->owner ) ) { 400075bc: 27 10 00 7f sethi %hi(0x4001fc00), %l3 400075c0: c4 02 20 50 ld [ %o0 + 0x50 ], %g2 400075c4: c2 04 e0 8c ld [ %l3 + 0x8c ], %g1 400075c8: 80 a0 80 01 cmp %g2, %g1 400075cc: 02 80 00 06 be 400075e4 400075d0: 80 a6 60 00 cmp %i1, 0 _Thread_Enable_dispatch(); 400075d4: 7f ff ff 7f call 400073d0 <_Thread_Enable_dispatch> 400075d8: b0 10 20 17 mov 0x17, %i0 400075dc: 81 c7 e0 08 ret 400075e0: 81 e8 00 00 restore return RTEMS_NOT_OWNER_OF_RESOURCE; } if ( length == RTEMS_PERIOD_STATUS ) { 400075e4: 12 80 00 11 bne 40007628 400075e8: 01 00 00 00 nop switch ( the_period->state ) { 400075ec: d0 02 20 38 ld [ %o0 + 0x38 ], %o0 400075f0: 80 a2 20 02 cmp %o0, 2 400075f4: 02 80 00 09 be 40007618 400075f8: b0 10 20 00 clr %i0 400075fc: 80 a2 20 04 cmp %o0, 4 40007600: 02 80 00 06 be 40007618 40007604: b0 10 20 06 mov 6, %i0 40007608: 80 a2 20 00 cmp %o0, 0 4000760c: 02 80 00 03 be 40007618 40007610: b0 10 20 0b mov 0xb, %i0 40007614: b0 10 20 19 mov 0x19, %i0 <== NOT EXECUTED break; default: /* unreached -- only to remove warnings */ return_value = RTEMS_INTERNAL_ERROR; break; } _Thread_Enable_dispatch(); 40007618: 7f ff ff 6e call 400073d0 <_Thread_Enable_dispatch> 4000761c: 01 00 00 00 nop 40007620: 81 c7 e0 08 ret 40007624: 81 e8 00 00 restore return( return_value ); } _ISR_Disable( level ); 40007628: 7f ff ed 0b call 40002a54 4000762c: 01 00 00 00 nop 40007630: a0 10 00 08 mov %o0, %l0 switch ( the_period->state ) { 40007634: e4 04 60 38 ld [ %l1 + 0x38 ], %l2 40007638: 80 a4 a0 02 cmp %l2, 2 4000763c: 02 80 00 29 be 400076e0 40007640: 80 a4 a0 04 cmp %l2, 4 40007644: 02 80 00 43 be 40007750 40007648: 80 a4 a0 00 cmp %l2, 0 4000764c: 32 bf ff e4 bne,a 400075dc 40007650: b0 10 20 19 mov 0x19, %i0 <== NOT EXECUTED /* * No need to update statistics -- there are not a period active */ _ISR_Enable( level ); 40007654: 7f ff ed 04 call 40002a64 40007658: a0 07 bf ec add %fp, -20, %l0 #if defined(RTEMS_ENABLE_NANOSECOND_RATE_MONOTONIC_STATISTICS) || \ defined(RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS) _TOD_Get_uptime( &uptime ); 4000765c: 40 00 07 57 call 400093b8 <_TOD_Get_uptime> 40007660: 90 10 00 10 mov %l0, %o0 #ifdef RTEMS_ENABLE_NANOSECOND_RATE_MONOTONIC_STATISTICS /* * Since the statistics didn't update the starting time, * we do it here. */ the_period->time_at_period = uptime; 40007664: c2 07 bf ec ld [ %fp + -20 ], %g1 #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS { struct timespec ran; the_period->owner_executed_at_period = 40007668: c4 04 e0 8c ld [ %l3 + 0x8c ], %g2 #ifdef RTEMS_ENABLE_NANOSECOND_RATE_MONOTONIC_STATISTICS /* * Since the statistics didn't update the starting time, * we do it here. */ the_period->time_at_period = uptime; 4000766c: c2 24 60 44 st %g1, [ %l1 + 0x44 ] 40007670: c2 07 bf f0 ld [ %fp + -16 ], %g1 the_period->owner_executed_at_period = _Thread_Executing->cpu_time_used; /* How much time time since last context switch */ _Timespec_Subtract( 40007674: 92 10 00 10 mov %l0, %o1 #ifdef RTEMS_ENABLE_NANOSECOND_RATE_MONOTONIC_STATISTICS /* * Since the statistics didn't update the starting time, * we do it here. */ the_period->time_at_period = uptime; 40007678: c2 24 60 48 st %g1, [ %l1 + 0x48 ] #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS { struct timespec ran; the_period->owner_executed_at_period = 4000767c: c2 00 a0 90 ld [ %g2 + 0x90 ], %g1 _Thread_Executing->cpu_time_used; /* How much time time since last context switch */ _Timespec_Subtract( 40007680: a0 07 bf e4 add %fp, -28, %l0 #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS { struct timespec ran; the_period->owner_executed_at_period = 40007684: c2 24 60 3c st %g1, [ %l1 + 0x3c ] 40007688: c2 00 a0 94 ld [ %g2 + 0x94 ], %g1 _Thread_Executing->cpu_time_used; /* How much time time since last context switch */ _Timespec_Subtract( 4000768c: 94 10 00 10 mov %l0, %o2 #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS { struct timespec ran; the_period->owner_executed_at_period = 40007690: c2 24 60 40 st %g1, [ %l1 + 0x40 ] _Thread_Executing->cpu_time_used; /* How much time time since last context switch */ _Timespec_Subtract( 40007694: 11 10 00 7f sethi %hi(0x4001fc00), %o0 40007698: 40 00 13 ed call 4000c64c <_Timespec_Subtract> 4000769c: 90 12 20 94 or %o0, 0x94, %o0 ! 4001fc94 <_Thread_Time_of_last_context_switch> /* The thread had executed before the last context switch also. * * the_period->owner_executed_at_period += ran */ _Timespec_Add_to( &the_period->owner_executed_at_period, &ran ); 400076a0: 92 10 00 10 mov %l0, %o1 400076a4: 40 00 13 89 call 4000c4c8 <_Timespec_Add_to> 400076a8: 90 04 60 3c add %l1, 0x3c, %o0 #else the_period->owner_ticks_executed_at_period = _Thread_Executing->ticks_executed; #endif the_period->state = RATE_MONOTONIC_ACTIVE; 400076ac: 82 10 20 02 mov 2, %g1 400076b0: c2 24 60 38 st %g1, [ %l1 + 0x38 ] Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; 400076b4: 03 10 00 1e sethi %hi(0x40007800), %g1 400076b8: 82 10 62 e8 or %g1, 0x2e8, %g1 ! 40007ae8 <_Rate_monotonic_Timeout> NULL ); the_period->next_length = length; _Watchdog_Insert_ticks( &the_period->Timer, length ); 400076bc: 90 04 60 10 add %l1, 0x10, %o0 400076c0: 92 10 00 19 mov %i1, %o1 the_watchdog->id = id; 400076c4: f0 24 60 30 st %i0, [ %l1 + 0x30 ] Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 400076c8: c0 24 60 18 clr [ %l1 + 0x18 ] the_watchdog->routine = routine; the_watchdog->id = id; the_watchdog->user_data = user_data; 400076cc: c0 24 60 34 clr [ %l1 + 0x34 ] _Rate_monotonic_Timeout, id, NULL ); the_period->next_length = length; 400076d0: f2 24 60 4c st %i1, [ %l1 + 0x4c ] _Watchdog_Insert_ticks( &the_period->Timer, length ); 400076d4: 7f ff ff 37 call 400073b0 <_Watchdog_Insert_ticks> 400076d8: c2 24 60 2c st %g1, [ %l1 + 0x2c ] 400076dc: 30 80 00 19 b,a 40007740 case RATE_MONOTONIC_ACTIVE: /* * Update statistics from the concluding period */ _Rate_monotonic_Update_statistics( the_period ); 400076e0: 7f ff ff 49 call 40007404 <_Rate_monotonic_Update_statistics> 400076e4: 90 10 00 11 mov %l1, %o0 * 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; 400076e8: 82 10 20 01 mov 1, %g1 the_period->next_length = length; 400076ec: f2 24 60 4c st %i1, [ %l1 + 0x4c ] * 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; 400076f0: c2 24 60 38 st %g1, [ %l1 + 0x38 ] the_period->next_length = length; _ISR_Enable( level ); 400076f4: 7f ff ec dc call 40002a64 400076f8: 90 10 00 10 mov %l0, %o0 _Thread_Executing->Wait.id = the_period->Object.id; 400076fc: c2 04 e0 8c ld [ %l3 + 0x8c ], %g1 40007700: c4 04 60 08 ld [ %l1 + 8 ], %g2 _Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); 40007704: 90 10 00 01 mov %g1, %o0 the_period->state = RATE_MONOTONIC_OWNER_IS_BLOCKING; the_period->next_length = length; _ISR_Enable( level ); _Thread_Executing->Wait.id = the_period->Object.id; 40007708: c4 20 60 20 st %g2, [ %g1 + 0x20 ] _Thread_Set_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); 4000770c: 40 00 12 4a call 4000c034 <_Thread_Set_state> 40007710: 13 00 00 10 sethi %hi(0x4000), %o1 /* * Did the watchdog timer expire while we were actually blocking * on it? */ _ISR_Disable( level ); 40007714: 7f ff ec d0 call 40002a54 40007718: 01 00 00 00 nop local_state = the_period->state; 4000771c: e0 04 60 38 ld [ %l1 + 0x38 ], %l0 the_period->state = RATE_MONOTONIC_ACTIVE; 40007720: e4 24 60 38 st %l2, [ %l1 + 0x38 ] _ISR_Enable( level ); 40007724: 7f ff ec d0 call 40002a64 40007728: 01 00 00 00 nop /* * 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 ) 4000772c: 80 a4 20 03 cmp %l0, 3 40007730: 12 80 00 04 bne 40007740 40007734: d0 04 e0 8c ld [ %l3 + 0x8c ], %o0 _Thread_Clear_state( _Thread_Executing, STATES_WAITING_FOR_PERIOD ); 40007738: 40 00 0e 89 call 4000b15c <_Thread_Clear_state> <== NOT EXECUTED 4000773c: 13 00 00 10 sethi %hi(0x4000), %o1 <== NOT EXECUTED _Thread_Enable_dispatch(); 40007740: 7f ff ff 24 call 400073d0 <_Thread_Enable_dispatch> 40007744: b0 10 20 00 clr %i0 40007748: 81 c7 e0 08 ret 4000774c: 81 e8 00 00 restore case RATE_MONOTONIC_EXPIRED: /* * Update statistics from the concluding period */ _Rate_monotonic_Update_statistics( the_period ); 40007750: 7f ff ff 2d call 40007404 <_Rate_monotonic_Update_statistics> 40007754: 90 10 00 11 mov %l1, %o0 _ISR_Enable( level ); 40007758: 7f ff ec c3 call 40002a64 4000775c: 90 10 00 10 mov %l0, %o0 the_period->state = RATE_MONOTONIC_ACTIVE; 40007760: 82 10 20 02 mov 2, %g1 the_period->next_length = length; _Watchdog_Insert_ticks( &the_period->Timer, length ); 40007764: 90 04 60 10 add %l1, 0x10, %o0 40007768: 92 10 00 19 mov %i1, %o1 */ _Rate_monotonic_Update_statistics( the_period ); _ISR_Enable( level ); the_period->state = RATE_MONOTONIC_ACTIVE; 4000776c: c2 24 60 38 st %g1, [ %l1 + 0x38 ] the_period->next_length = length; 40007770: f2 24 60 4c st %i1, [ %l1 + 0x4c ] _Watchdog_Insert_ticks( &the_period->Timer, length ); 40007774: 7f ff ff 0f call 400073b0 <_Watchdog_Insert_ticks> 40007778: b0 10 20 06 mov 6, %i0 _Thread_Enable_dispatch(); 4000777c: 7f ff ff 15 call 400073d0 <_Thread_Enable_dispatch> 40007780: 01 00 00 00 nop 40007784: 81 c7 e0 08 ret 40007788: 81 e8 00 00 restore break; } } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 4000778c: 81 c7 e0 08 ret <== NOT EXECUTED 40007790: 81 e8 00 00 restore <== NOT EXECUTED 40007794 : */ void rtems_rate_monotonic_report_statistics_with_plugin( void *context, rtems_printk_plugin_t print ) { 40007794: 9d e3 bf 30 save %sp, -208, %sp rtems_id id; rtems_rate_monotonic_period_statistics the_stats; rtems_rate_monotonic_period_status the_status; char name[5]; if ( !print ) 40007798: 80 a6 60 00 cmp %i1, 0 4000779c: 02 80 00 7f be 40007998 400077a0: 90 10 00 18 mov %i0, %o0 return; (*print)( context, "Period information by period\n" ); 400077a4: 13 10 00 73 sethi %hi(0x4001cc00), %o1 400077a8: 9f c6 40 00 call %i1 400077ac: 92 12 63 b8 or %o1, 0x3b8, %o1 ! 4001cfb8 #if defined(RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS) (*print)( context, "--- CPU times are in seconds ---\n" ); 400077b0: 90 10 00 18 mov %i0, %o0 400077b4: 13 10 00 73 sethi %hi(0x4001cc00), %o1 400077b8: 9f c6 40 00 call %i1 400077bc: 92 12 63 d8 or %o1, 0x3d8, %o1 ! 4001cfd8 #endif #if defined(RTEMS_ENABLE_NANOSECOND_RATE_MONOTONIC_STATISTICS) (*print)( context, "--- Wall times are in seconds ---\n" ); 400077c0: 90 10 00 18 mov %i0, %o0 400077c4: 13 10 00 74 sethi %hi(0x4001d000), %o1 400077c8: 9f c6 40 00 call %i1 400077cc: 92 12 60 00 mov %o1, %o1 ! 4001d000 Be sure to test the various cases. (*print)( context,"\ 1234567890123456789012345678901234567890123456789012345678901234567890123456789\ \n"); */ (*print)( context, " ID OWNER COUNT MISSED " 400077d0: 90 10 00 18 mov %i0, %o0 400077d4: 13 10 00 74 sethi %hi(0x4001d000), %o1 400077d8: 9f c6 40 00 call %i1 400077dc: 92 12 60 28 or %o1, 0x28, %o1 ! 4001d028 #ifdef RTEMS_ENABLE_NANOSECOND_RATE_MONOTONIC_STATISTICS " " #endif " WALL TIME\n" ); (*print)( context, " " 400077e0: 90 10 00 18 mov %i0, %o0 400077e4: 13 10 00 74 sethi %hi(0x4001d000), %o1 400077e8: 9f c6 40 00 call %i1 400077ec: 92 12 60 78 or %o1, 0x78, %o1 ! 4001d078 /* * 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 ; 400077f0: 03 10 00 7e sethi %hi(0x4001f800), %g1 400077f4: 82 10 62 1c or %g1, 0x21c, %g1 ! 4001fa1c <_Rate_monotonic_Information> 400077f8: e4 00 60 08 ld [ %g1 + 8 ], %l2 _Timespec_Divide_by_integer( &the_stats.total_cpu_time, the_stats.count, &cpu_average ); (*print)( context, 400077fc: 03 10 00 74 sethi %hi(0x4001d000), %g1 40007800: b4 10 60 e0 or %g1, 0xe0, %i2 ! 4001d0e0 _Timespec_Divide_by_integer( &the_stats.total_wall_time, the_stats.count, &wall_average ); (*print)( context, 40007804: 03 10 00 74 sethi %hi(0x4001d000), %g1 * 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 ); 40007808: ba 07 bf 98 add %fp, -104, %i5 _Timespec_Divide_by_integer( &the_stats.total_wall_time, the_stats.count, &wall_average ); (*print)( context, 4000780c: b6 10 61 00 or %g1, 0x100, %i3 status = rtems_rate_monotonic_get_statistics( id, &the_stats ); if ( status != RTEMS_SUCCESSFUL ) continue; /* If the above passed, so should this but check it anyway */ status = rtems_rate_monotonic_get_status( id, &the_status ); 40007810: ae 07 bf d0 add %fp, -48, %l7 /* * If the count is zero, don't print statistics */ if (the_stats.count == 0) { (*print)( context, "\n" ); 40007814: 03 10 00 73 sethi %hi(0x4001cc00), %g1 /* * Print part of report line that is not dependent on granularity */ (*print)( context, 40007818: a8 07 bf f3 add %fp, -13, %l4 /* * If the count is zero, don't print statistics */ if (the_stats.count == 0) { (*print)( context, "\n" ); 4000781c: b8 10 63 f8 or %g1, 0x3f8, %i4 */ { #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS struct timespec cpu_average; _Timespec_Divide_by_integer( 40007820: ac 07 bf b0 add %fp, -80, %l6 40007824: a6 07 bf e8 add %fp, -24, %l3 * print Wall time part of statistics */ { #ifdef RTEMS_ENABLE_NANOSECOND_RATE_MONOTONIC_STATISTICS struct timespec wall_average; _Timespec_Divide_by_integer( 40007828: 10 80 00 56 b 40007980 4000782c: aa 07 bf c8 add %fp, -56, %l5 * 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 ); 40007830: 40 00 1d f1 call 4000eff4 40007834: 92 10 00 1d mov %i5, %o1 if ( status != RTEMS_SUCCESSFUL ) 40007838: 80 a2 20 00 cmp %o0, 0 4000783c: 32 80 00 51 bne,a 40007980 40007840: a4 04 a0 01 inc %l2 continue; /* If the above passed, so should this but check it anyway */ status = rtems_rate_monotonic_get_status( id, &the_status ); 40007844: 92 10 00 17 mov %l7, %o1 40007848: 40 00 1e 0f call 4000f084 4000784c: 90 10 00 12 mov %l2, %o0 if ( status != RTEMS_SUCCESSFUL ) 40007850: 80 a2 20 00 cmp %o0, 0 40007854: 32 80 00 4b bne,a 40007980 40007858: a4 04 a0 01 inc %l2 <== NOT EXECUTED continue; name[ 0 ] = '\0'; if ( the_status.owner ) { 4000785c: d0 07 bf d0 ld [ %fp + -48 ], %o0 40007860: 80 a2 20 00 cmp %o0, 0 40007864: 02 80 00 05 be 40007878 40007868: c0 2f bf f3 clrb [ %fp + -13 ] rtems_object_get_name( the_status.owner, sizeof(name), name ); 4000786c: 94 10 00 14 mov %l4, %o2 40007870: 40 00 00 c8 call 40007b90 40007874: 92 10 20 05 mov 5, %o1 /* * Print part of report line that is not dependent on granularity */ (*print)( context, 40007878: d8 1f bf 98 ldd [ %fp + -104 ], %o4 4000787c: 94 10 00 12 mov %l2, %o2 40007880: 96 10 00 14 mov %l4, %o3 40007884: 13 10 00 74 sethi %hi(0x4001d000), %o1 40007888: 90 10 00 18 mov %i0, %o0 4000788c: 9f c6 40 00 call %i1 40007890: 92 12 60 c8 or %o1, 0xc8, %o1 /* * If the count is zero, don't print statistics */ if (the_stats.count == 0) { 40007894: c2 07 bf 98 ld [ %fp + -104 ], %g1 */ { #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS struct timespec cpu_average; _Timespec_Divide_by_integer( 40007898: 94 10 00 13 mov %l3, %o2 4000789c: 90 10 00 16 mov %l6, %o0 /* * If the count is zero, don't print statistics */ if (the_stats.count == 0) { 400078a0: 80 a0 60 00 cmp %g1, 0 400078a4: 12 80 00 06 bne 400078bc 400078a8: 92 10 00 1c mov %i4, %o1 (*print)( context, "\n" ); 400078ac: 9f c6 40 00 call %i1 400078b0: 90 10 00 18 mov %i0, %o0 * Cycle through all possible ids and try to report on each one. If it * is a period that is inactive, we just get an error back. No big deal. */ for ( id=_Rate_monotonic_Information.minimum_id ; id <= _Rate_monotonic_Information.maximum_id ; id++ ) { 400078b4: 10 80 00 33 b 40007980 400078b8: a4 04 a0 01 inc %l2 */ { #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS struct timespec cpu_average; _Timespec_Divide_by_integer( 400078bc: 40 00 13 1b call 4000c528 <_Timespec_Divide_by_integer> 400078c0: 92 10 00 01 mov %g1, %o1 &the_stats.total_cpu_time, the_stats.count, &cpu_average ); (*print)( context, 400078c4: d0 07 bf a4 ld [ %fp + -92 ], %o0 400078c8: 40 00 47 a5 call 4001975c <.div> 400078cc: 92 10 23 e8 mov 0x3e8, %o1 400078d0: a2 10 00 08 mov %o0, %l1 400078d4: d0 07 bf ac ld [ %fp + -84 ], %o0 400078d8: 40 00 47 a1 call 4001975c <.div> 400078dc: 92 10 23 e8 mov 0x3e8, %o1 400078e0: c2 07 bf e8 ld [ %fp + -24 ], %g1 400078e4: a0 10 00 08 mov %o0, %l0 400078e8: d0 07 bf ec ld [ %fp + -20 ], %o0 400078ec: c2 23 a0 5c st %g1, [ %sp + 0x5c ] 400078f0: 40 00 47 9b call 4001975c <.div> 400078f4: 92 10 23 e8 mov 0x3e8, %o1 400078f8: d8 07 bf a8 ld [ %fp + -88 ], %o4 400078fc: d4 07 bf a0 ld [ %fp + -96 ], %o2 40007900: 96 10 00 11 mov %l1, %o3 40007904: 9a 10 00 10 mov %l0, %o5 40007908: d0 23 a0 60 st %o0, [ %sp + 0x60 ] 4000790c: 92 10 00 1a mov %i2, %o1 40007910: 9f c6 40 00 call %i1 40007914: 90 10 00 18 mov %i0, %o0 * print Wall time part of statistics */ { #ifdef RTEMS_ENABLE_NANOSECOND_RATE_MONOTONIC_STATISTICS struct timespec wall_average; _Timespec_Divide_by_integer( 40007918: d2 07 bf 98 ld [ %fp + -104 ], %o1 4000791c: 94 10 00 13 mov %l3, %o2 40007920: 40 00 13 02 call 4000c528 <_Timespec_Divide_by_integer> 40007924: 90 10 00 15 mov %l5, %o0 &the_stats.total_wall_time, the_stats.count, &wall_average ); (*print)( context, 40007928: d0 07 bf bc ld [ %fp + -68 ], %o0 4000792c: 40 00 47 8c call 4001975c <.div> 40007930: 92 10 23 e8 mov 0x3e8, %o1 40007934: a2 10 00 08 mov %o0, %l1 40007938: d0 07 bf c4 ld [ %fp + -60 ], %o0 4000793c: 40 00 47 88 call 4001975c <.div> 40007940: 92 10 23 e8 mov 0x3e8, %o1 40007944: c2 07 bf e8 ld [ %fp + -24 ], %g1 40007948: a0 10 00 08 mov %o0, %l0 4000794c: d0 07 bf ec ld [ %fp + -20 ], %o0 40007950: 92 10 23 e8 mov 0x3e8, %o1 40007954: 40 00 47 82 call 4001975c <.div> 40007958: c2 23 a0 5c st %g1, [ %sp + 0x5c ] 4000795c: d4 07 bf b8 ld [ %fp + -72 ], %o2 40007960: d8 07 bf c0 ld [ %fp + -64 ], %o4 40007964: d0 23 a0 60 st %o0, [ %sp + 0x60 ] 40007968: 96 10 00 11 mov %l1, %o3 4000796c: 9a 10 00 10 mov %l0, %o5 40007970: 90 10 00 18 mov %i0, %o0 40007974: 9f c6 40 00 call %i1 40007978: 92 10 00 1b mov %i3, %o1 * Cycle through all possible ids and try to report on each one. If it * is a period that is inactive, we just get an error back. No big deal. */ for ( id=_Rate_monotonic_Information.minimum_id ; id <= _Rate_monotonic_Information.maximum_id ; id++ ) { 4000797c: a4 04 a0 01 inc %l2 /* * Cycle through all possible ids and try to report on each one. If it * is a period that is inactive, we just get an error back. No big deal. */ for ( id=_Rate_monotonic_Information.minimum_id ; id <= _Rate_monotonic_Information.maximum_id ; 40007980: 05 10 00 7e sethi %hi(0x4001f800), %g2 40007984: 84 10 a2 1c or %g2, 0x21c, %g2 ! 4001fa1c <_Rate_monotonic_Information> 40007988: c2 00 a0 0c ld [ %g2 + 0xc ], %g1 4000798c: 80 a4 80 01 cmp %l2, %g1 40007990: 08 bf ff a8 bleu 40007830 40007994: 90 10 00 12 mov %l2, %o0 40007998: 81 c7 e0 08 ret 4000799c: 81 e8 00 00 restore 400079bc : /* * rtems_rate_monotonic_reset_all_statistics */ void rtems_rate_monotonic_reset_all_statistics( void ) { 400079bc: 9d e3 bf 98 save %sp, -104, %sp rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 400079c0: 03 10 00 7e sethi %hi(0x4001f800), %g1 400079c4: c4 00 63 b0 ld [ %g1 + 0x3b0 ], %g2 ! 4001fbb0 <_Thread_Dispatch_disable_level> 400079c8: 84 00 a0 01 inc %g2 400079cc: c4 20 63 b0 st %g2, [ %g1 + 0x3b0 ] /* * 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 ; 400079d0: 03 10 00 7e sethi %hi(0x4001f800), %g1 400079d4: 82 10 62 1c or %g1, 0x21c, %g1 ! 4001fa1c <_Rate_monotonic_Information> 400079d8: e0 00 60 08 ld [ %g1 + 8 ], %l0 id <= _Rate_monotonic_Information.maximum_id ; 400079dc: 10 80 00 04 b 400079ec 400079e0: a2 10 00 01 mov %g1, %l1 id++ ) { status = rtems_rate_monotonic_reset_statistics( id ); 400079e4: 40 00 00 12 call 40007a2c 400079e8: a0 04 20 01 inc %l0 /* * 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 ; id <= _Rate_monotonic_Information.maximum_id ; 400079ec: c2 04 60 0c ld [ %l1 + 0xc ], %g1 400079f0: 80 a4 00 01 cmp %l0, %g1 400079f4: 08 bf ff fc bleu 400079e4 400079f8: 90 10 00 10 mov %l0, %o0 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 400079fc: 03 10 00 7e sethi %hi(0x4001f800), %g1 40007a00: c4 00 63 b0 ld [ %g1 + 0x3b0 ], %g2 ! 4001fbb0 <_Thread_Dispatch_disable_level> 40007a04: 84 00 bf ff add %g2, -1, %g2 40007a08: c4 20 63 b0 st %g2, [ %g1 + 0x3b0 ] 40007a0c: c2 00 63 b0 ld [ %g1 + 0x3b0 ], %g1 40007a10: 80 a0 60 00 cmp %g1, 0 40007a14: 12 80 00 04 bne 40007a24 40007a18: 01 00 00 00 nop _Thread_Dispatch(); 40007a1c: 40 00 0e 8a call 4000b444 <_Thread_Dispatch> 40007a20: 81 e8 00 00 restore 40007a24: 81 c7 e0 08 ret <== NOT EXECUTED 40007a28: 81 e8 00 00 restore <== NOT EXECUTED 40010738 : uint32_t length, uint32_t page_size, rtems_attribute attribute_set, Objects_Id *id ) { 40010738: 9d e3 bf 98 save %sp, -104, %sp Region_Control *the_region; if ( !rtems_is_name_valid( name ) ) 4001073c: a4 96 20 00 orcc %i0, 0, %l2 40010740: 02 80 00 87 be 4001095c 40010744: b0 10 20 03 mov 3, %i0 return RTEMS_INVALID_NAME; if ( !starting_address ) 40010748: 80 a6 60 00 cmp %i1, 0 4001074c: 02 80 00 c7 be 40010a68 40010750: 80 a7 60 00 cmp %i5, 0 return RTEMS_INVALID_ADDRESS; if ( !id ) 40010754: 02 80 00 c5 be 40010a68 40010758: 80 8e 60 07 btst 7, %i1 return RTEMS_INVALID_ADDRESS; if ( !_Addresses_Is_aligned( starting_address ) ) 4001075c: 32 80 00 80 bne,a 4001095c 40010760: b0 10 20 09 mov 9, %i0 return RTEMS_INVALID_ADDRESS; _RTEMS_Lock_allocator(); /* to prevent deletion */ 40010764: 7f ff e8 53 call 4000a8b0 40010768: 01 00 00 00 nop 4001076c: a2 10 00 08 mov %o0, %l1 40010770: 03 10 00 d2 sethi %hi(0x40034800), %g1 40010774: c2 00 60 b0 ld [ %g1 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> 40010778: 80 a0 60 00 cmp %g1, 0 4001077c: 02 80 00 0b be 400107a8 40010780: 03 10 00 d2 sethi %hi(0x40034800), %g1 40010784: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED 40010788: c2 00 62 90 ld [ %g1 + 0x290 ], %g1 ! 40034a90 <_System_state_Current> <== NOT EXECUTED 4001078c: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 40010790: 08 80 00 05 bleu 400107a4 <== NOT EXECUTED 40010794: 90 10 20 00 clr %o0 <== NOT EXECUTED 40010798: 92 10 20 00 clr %o1 <== NOT EXECUTED 4001079c: 40 00 12 d5 call 400152f0 <_Internal_error_Occurred> <== NOT EXECUTED 400107a0: 94 10 20 12 mov 0x12, %o2 <== NOT EXECUTED 400107a4: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED 400107a8: e0 00 61 84 ld [ %g1 + 0x184 ], %l0 ! 40034984 <_RTEMS_Allocator_Mutex> Thread_Control *executing; ISR_Level level = *level_p; /* disabled when you get here */ executing = _Thread_Executing; 400107ac: 03 10 00 d2 sethi %hi(0x40034800), %g1 400107b0: c4 00 61 8c ld [ %g1 + 0x18c ], %g2 ! 4003498c <_Thread_Executing> executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; 400107b4: c0 20 a0 34 clr [ %g2 + 0x34 ] if ( !_CORE_mutex_Is_locked( the_mutex ) ) { 400107b8: c2 04 20 60 ld [ %l0 + 0x60 ], %g1 400107bc: 80 a0 60 00 cmp %g1, 0 400107c0: 22 80 00 30 be,a 40010880 400107c4: c2 04 20 6c ld [ %l0 + 0x6c ], %g1 <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_LOCKED; 400107c8: c0 24 20 60 clr [ %l0 + 0x60 ] the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 400107cc: c2 00 a0 08 ld [ %g2 + 8 ], %g1 */ RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_inherit_priority( CORE_mutex_Attributes *the_attribute ) { return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT; 400107d0: c6 04 20 58 ld [ %l0 + 0x58 ], %g3 executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; the_mutex->nest_count = 1; 400107d4: 88 10 20 01 mov 1, %g4 executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 400107d8: c2 24 20 70 st %g1, [ %l0 + 0x70 ] executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; 400107dc: c4 24 20 6c st %g2, [ %l0 + 0x6c ] the_mutex->holder_id = executing->Object.id; the_mutex->nest_count = 1; if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || 400107e0: 80 a0 e0 02 cmp %g3, 2 400107e4: 02 80 00 05 be 400107f8 400107e8: c8 24 20 64 st %g4, [ %l0 + 0x64 ] 400107ec: 80 a0 e0 03 cmp %g3, 3 <== NOT EXECUTED 400107f0: 12 80 00 07 bne 4001080c <== NOT EXECUTED 400107f4: 01 00 00 00 nop <== NOT EXECUTED _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) executing->resource_count++; 400107f8: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) { 400107fc: 80 a0 e0 03 cmp %g3, 3 the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; the_mutex->nest_count = 1; if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) executing->resource_count++; 40010800: 82 00 60 01 inc %g1 if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) { 40010804: 02 80 00 03 be 40010810 40010808: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] _ISR_Enable( level ); 4001080c: 30 80 00 2b b,a 400108b8 */ { Priority_Control ceiling; Priority_Control current; ceiling = the_mutex->Attributes.priority_ceiling; 40010810: c6 04 20 5c ld [ %l0 + 0x5c ], %g3 <== NOT EXECUTED current = executing->current_priority; 40010814: c2 00 a0 14 ld [ %g2 + 0x14 ], %g1 <== NOT EXECUTED if ( current == ceiling ) { 40010818: 80 a0 40 03 cmp %g1, %g3 <== NOT EXECUTED 4001081c: 12 80 00 03 bne 40010828 <== NOT EXECUTED 40010820: 01 00 00 00 nop <== NOT EXECUTED _ISR_Enable( level ); 40010824: 30 80 00 25 b,a 400108b8 <== NOT EXECUTED return 0; } if ( current > ceiling ) { 40010828: 08 80 00 0f bleu 40010864 <== NOT EXECUTED 4001082c: 82 10 20 06 mov 6, %g1 <== NOT EXECUTED rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40010830: 05 10 00 d2 sethi %hi(0x40034800), %g2 <== NOT EXECUTED 40010834: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40010838: 82 00 60 01 inc %g1 <== NOT EXECUTED 4001083c: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] <== NOT EXECUTED _Thread_Disable_dispatch(); _ISR_Enable( level ); 40010840: 7f ff e8 20 call 4000a8c0 <== NOT EXECUTED 40010844: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED _Thread_Change_priority( 40010848: d2 04 20 5c ld [ %l0 + 0x5c ], %o1 <== NOT EXECUTED 4001084c: d0 04 20 6c ld [ %l0 + 0x6c ], %o0 <== NOT EXECUTED 40010850: 40 00 17 f5 call 40016824 <_Thread_Change_priority> <== NOT EXECUTED 40010854: 94 10 20 00 clr %o2 <== NOT EXECUTED the_mutex->holder, the_mutex->Attributes.priority_ceiling, FALSE ); _Thread_Enable_dispatch(); 40010858: 7f ff ff ab call 40010704 <_Thread_Enable_dispatch> <== NOT EXECUTED 4001085c: 23 10 00 d1 sethi %hi(0x40034400), %l1 <== NOT EXECUTED 40010860: 30 80 00 2f b,a 4001091c <== NOT EXECUTED return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; 40010864: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_UNLOCKED; 40010868: c8 24 20 60 st %g4, [ %l0 + 0x60 ] <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ 4001086c: c0 24 20 64 clr [ %l0 + 0x64 ] <== NOT EXECUTED executing->resource_count--; /* undo locking above */ 40010870: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 <== NOT EXECUTED 40010874: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 40010878: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] <== NOT EXECUTED _ISR_Enable( level ); 4001087c: 30 80 00 0f b,a 400108b8 <== NOT EXECUTED /* * At this point, we know the mutex was not available. If this thread * is the thread that has locked the mutex, let's see if we are allowed * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { 40010880: 80 a0 40 02 cmp %g1, %g2 <== NOT EXECUTED 40010884: 12 80 00 13 bne 400108d0 <== NOT EXECUTED 40010888: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED switch ( the_mutex->Attributes.lock_nesting_behavior ) { 4001088c: c2 04 20 50 ld [ %l0 + 0x50 ], %g1 <== NOT EXECUTED 40010890: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40010894: 22 80 00 07 be,a 400108b0 <== NOT EXECUTED 40010898: c2 04 20 64 ld [ %l0 + 0x64 ], %g1 <== NOT EXECUTED 4001089c: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 400108a0: 32 80 00 0c bne,a 400108d0 <== NOT EXECUTED 400108a4: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; _ISR_Enable( level ); return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 400108a8: 10 80 00 08 b 400108c8 <== NOT EXECUTED 400108ac: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { switch ( the_mutex->Attributes.lock_nesting_behavior ) { case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; 400108b0: 82 00 60 01 inc %g1 <== NOT EXECUTED 400108b4: c2 24 20 64 st %g1, [ %l0 + 0x64 ] <== NOT EXECUTED _ISR_Enable( level ); 400108b8: 7f ff e8 02 call 4000a8c0 400108bc: 90 10 00 11 mov %l1, %o0 * the inactive chain of free region control blocks. */ RTEMS_INLINE_ROUTINE Region_Control *_Region_Allocate( void ) { return (Region_Control *) _Objects_Allocate( &_Region_Information ); 400108c0: 10 80 00 17 b 4001091c 400108c4: 23 10 00 d1 sethi %hi(0x40034400), %l1 return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 400108c8: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED _ISR_Enable( level ); 400108cc: 30 bf ff fb b,a 400108b8 <== NOT EXECUTED 400108d0: c6 04 20 08 ld [ %l0 + 8 ], %g3 <== NOT EXECUTED 400108d4: c8 00 61 8c ld [ %g1 + 0x18c ], %g4 <== NOT EXECUTED 400108d8: 05 10 00 d2 sethi %hi(0x40034800), %g2 <== NOT EXECUTED 400108dc: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 400108e0: c6 21 20 20 st %g3, [ %g4 + 0x20 ] <== NOT EXECUTED 400108e4: 82 00 60 01 inc %g1 <== NOT EXECUTED 400108e8: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] <== NOT EXECUTED RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section ( Thread_queue_Control *the_thread_queue ) { the_thread_queue->sync_state = THREAD_QUEUE_NOTHING_HAPPENED; 400108ec: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED 400108f0: c2 24 20 40 st %g1, [ %l0 + 0x40 ] <== NOT EXECUTED 400108f4: 82 04 20 10 add %l0, 0x10, %g1 <== NOT EXECUTED 400108f8: c2 21 20 44 st %g1, [ %g4 + 0x44 ] <== NOT EXECUTED 400108fc: 7f ff e7 f1 call 4000a8c0 <== NOT EXECUTED 40010900: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 40010904: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED 40010908: d0 00 61 84 ld [ %g1 + 0x184 ], %o0 ! 40034984 <_RTEMS_Allocator_Mutex> <== NOT EXECUTED 4001090c: 92 10 20 00 clr %o1 <== NOT EXECUTED 40010910: 40 00 0f e6 call 400148a8 <_CORE_mutex_Seize_interrupt_blocking> <== NOT EXECUTED 40010914: 90 02 20 10 add %o0, 0x10, %o0 <== NOT EXECUTED 40010918: 23 10 00 d1 sethi %hi(0x40034400), %l1 <== NOT EXECUTED 4001091c: 40 00 12 a2 call 400153a4 <_Objects_Allocate> 40010920: 90 14 62 c8 or %l1, 0x2c8, %o0 ! 400346c8 <_Region_Information> the_region = _Region_Allocate(); if ( !the_region ) { 40010924: a0 92 20 00 orcc %o0, 0, %l0 40010928: 12 80 00 0f bne 40010964 4001092c: 05 10 00 d2 sethi %hi(0x40034800), %g2 40010930: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> 40010934: 82 00 60 01 inc %g1 40010938: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] _RTEMS_Unlock_allocator(); 4001093c: 03 10 00 d2 sethi %hi(0x40034800), %g1 40010940: d0 00 61 84 ld [ %g1 + 0x184 ], %o0 ! 40034984 <_RTEMS_Allocator_Mutex> 40010944: 94 10 20 00 clr %o2 40010948: d2 02 20 08 ld [ %o0 + 8 ], %o1 4001094c: 40 00 0f f9 call 40014930 <_CORE_mutex_Surrender> 40010950: 90 02 20 10 add %o0, 0x10, %o0 40010954: 7f ff ff 6c call 40010704 <_Thread_Enable_dispatch> 40010958: b0 10 20 05 mov 5, %i0 4001095c: 81 c7 e0 08 ret 40010960: 81 e8 00 00 restore return RTEMS_TOO_MANY; } the_region->maximum_segment_size = 40010964: 90 04 20 68 add %l0, 0x68, %o0 40010968: 92 10 00 19 mov %i1, %o1 4001096c: 94 10 00 1a mov %i2, %o2 40010970: 40 00 12 16 call 400151c8 <_Heap_Initialize> 40010974: 96 10 00 1b mov %i3, %o3 _Heap_Initialize(&the_region->Memory, starting_address, length, page_size); if ( !the_region->maximum_segment_size ) { 40010978: 80 a2 20 00 cmp %o0, 0 4001097c: 12 80 00 13 bne 400109c8 40010980: d0 24 20 5c st %o0, [ %l0 + 0x5c ] RTEMS_INLINE_ROUTINE void _Region_Free ( Region_Control *the_region ) { _Objects_Free( &_Region_Information, &the_region->Object ); 40010984: 90 14 62 c8 or %l1, 0x2c8, %o0 40010988: 40 00 13 89 call 400157ac <_Objects_Free> 4001098c: 92 10 00 10 mov %l0, %o1 40010990: 05 10 00 d2 sethi %hi(0x40034800), %g2 40010994: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> 40010998: 82 00 60 01 inc %g1 4001099c: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] _Region_Free( the_region ); _RTEMS_Unlock_allocator(); 400109a0: 03 10 00 d2 sethi %hi(0x40034800), %g1 400109a4: d0 00 61 84 ld [ %g1 + 0x184 ], %o0 ! 40034984 <_RTEMS_Allocator_Mutex> 400109a8: 94 10 20 00 clr %o2 400109ac: d2 02 20 08 ld [ %o0 + 8 ], %o1 400109b0: 40 00 0f e0 call 40014930 <_CORE_mutex_Surrender> 400109b4: 90 02 20 10 add %o0, 0x10, %o0 400109b8: 7f ff ff 53 call 40010704 <_Thread_Enable_dispatch> 400109bc: b0 10 20 08 mov 8, %i0 400109c0: 81 c7 e0 08 ret 400109c4: 81 e8 00 00 restore the_region->length = length; the_region->page_size = page_size; the_region->attribute_set = attribute_set; the_region->number_of_used_blocks = 0; _Thread_queue_Initialize( 400109c8: 90 04 20 10 add %l0, 0x10, %o0 _Region_Free( the_region ); _RTEMS_Unlock_allocator(); return RTEMS_INVALID_SIZE; } the_region->starting_address = starting_address; 400109cc: f2 24 20 50 st %i1, [ %l0 + 0x50 ] the_region->length = length; 400109d0: f4 24 20 54 st %i2, [ %l0 + 0x54 ] the_region->page_size = page_size; 400109d4: f6 24 20 58 st %i3, [ %l0 + 0x58 ] the_region->attribute_set = attribute_set; 400109d8: f8 24 20 60 st %i4, [ %l0 + 0x60 ] the_region->number_of_used_blocks = 0; 400109dc: c0 24 20 64 clr [ %l0 + 0x64 ] _Thread_queue_Initialize( 400109e0: 93 37 20 02 srl %i4, 2, %o1 400109e4: 94 10 20 40 mov 0x40, %o2 400109e8: 92 0a 60 01 and %o1, 1, %o1 400109ec: 40 00 1b 09 call 40017610 <_Thread_queue_Initialize> 400109f0: 96 10 20 06 mov 6, %o3 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 400109f4: 90 14 62 c8 or %l1, 0x2c8, %o0 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, the_object ); 400109f8: c4 04 20 08 ld [ %l0 + 8 ], %g2 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 400109fc: c6 12 20 10 lduh [ %o0 + 0x10 ], %g3 40010a00: 03 00 00 3f sethi %hi(0xfc00), %g1 40010a04: 82 10 63 ff or %g1, 0x3ff, %g1 ! ffff 40010a08: 82 08 80 01 and %g2, %g1, %g1 40010a0c: 80 a0 40 03 cmp %g1, %g3 40010a10: 38 80 00 06 bgu,a 40010a28 40010a14: c2 04 20 08 ld [ %l0 + 8 ], %g1 <== NOT EXECUTED information->local_table[ index ] = the_object; 40010a18: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 40010a1c: 83 28 60 02 sll %g1, 2, %g1 40010a20: e0 20 80 01 st %l0, [ %g2 + %g1 ] &_Region_Information, &the_region->Object, (Objects_Name) name ); *id = the_region->Object.id; 40010a24: c2 04 20 08 ld [ %l0 + 8 ], %g1 40010a28: 05 10 00 d2 sethi %hi(0x40034800), %g2 40010a2c: c2 27 40 00 st %g1, [ %i5 ] 40010a30: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 if ( information->is_string ) /* _Objects_Copy_name_string( name, the_object->name ); */ the_object->name = name; else /* _Objects_Copy_name_raw( name, the_object->name, information->name_length ); */ the_object->name = name; 40010a34: e4 24 20 0c st %l2, [ %l0 + 0xc ] 40010a38: 82 00 60 01 inc %g1 40010a3c: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] _RTEMS_Unlock_allocator(); 40010a40: 03 10 00 d2 sethi %hi(0x40034800), %g1 40010a44: d0 00 61 84 ld [ %g1 + 0x184 ], %o0 ! 40034984 <_RTEMS_Allocator_Mutex> 40010a48: 94 10 20 00 clr %o2 40010a4c: d2 02 20 08 ld [ %o0 + 8 ], %o1 40010a50: 40 00 0f b8 call 40014930 <_CORE_mutex_Surrender> 40010a54: 90 02 20 10 add %o0, 0x10, %o0 40010a58: 7f ff ff 2b call 40010704 <_Thread_Enable_dispatch> 40010a5c: b0 10 20 00 clr %i0 40010a60: 81 c7 e0 08 ret 40010a64: 81 e8 00 00 restore return RTEMS_SUCCESSFUL; 40010a68: b0 10 20 09 mov 9, %i0 <== NOT EXECUTED } 40010a6c: 81 c7 e0 08 ret <== NOT EXECUTED 40010a70: 81 e8 00 00 restore <== NOT EXECUTED 40010aa8 : */ rtems_status_code rtems_region_delete( Objects_Id id ) { 40010aa8: 9d e3 bf 90 save %sp, -112, %sp register Region_Control *the_region; Objects_Locations location; _RTEMS_Lock_allocator(); 40010aac: 7f ff e7 81 call 4000a8b0 40010ab0: 01 00 00 00 nop 40010ab4: a2 10 00 08 mov %o0, %l1 40010ab8: 03 10 00 d2 sethi %hi(0x40034800), %g1 40010abc: c2 00 60 b0 ld [ %g1 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> 40010ac0: 80 a0 60 00 cmp %g1, 0 40010ac4: 02 80 00 0b be 40010af0 40010ac8: 03 10 00 d2 sethi %hi(0x40034800), %g1 40010acc: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED 40010ad0: c2 00 62 90 ld [ %g1 + 0x290 ], %g1 ! 40034a90 <_System_state_Current> <== NOT EXECUTED 40010ad4: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 40010ad8: 08 80 00 05 bleu 40010aec <== NOT EXECUTED 40010adc: 90 10 20 00 clr %o0 <== NOT EXECUTED 40010ae0: 92 10 20 00 clr %o1 <== NOT EXECUTED 40010ae4: 40 00 12 03 call 400152f0 <_Internal_error_Occurred> <== NOT EXECUTED 40010ae8: 94 10 20 12 mov 0x12, %o2 <== NOT EXECUTED 40010aec: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED 40010af0: e0 00 61 84 ld [ %g1 + 0x184 ], %l0 ! 40034984 <_RTEMS_Allocator_Mutex> Thread_Control *executing; ISR_Level level = *level_p; /* disabled when you get here */ executing = _Thread_Executing; 40010af4: 03 10 00 d2 sethi %hi(0x40034800), %g1 40010af8: c4 00 61 8c ld [ %g1 + 0x18c ], %g2 ! 4003498c <_Thread_Executing> executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; 40010afc: c0 20 a0 34 clr [ %g2 + 0x34 ] if ( !_CORE_mutex_Is_locked( the_mutex ) ) { 40010b00: c2 04 20 60 ld [ %l0 + 0x60 ], %g1 40010b04: 80 a0 60 00 cmp %g1, 0 40010b08: 22 80 00 33 be,a 40010bd4 40010b0c: c2 04 20 6c ld [ %l0 + 0x6c ], %g1 <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_LOCKED; 40010b10: c0 24 20 60 clr [ %l0 + 0x60 ] the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 40010b14: c2 00 a0 08 ld [ %g2 + 8 ], %g1 */ RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_inherit_priority( CORE_mutex_Attributes *the_attribute ) { return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT; 40010b18: c6 04 20 58 ld [ %l0 + 0x58 ], %g3 executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 40010b1c: c2 24 20 70 st %g1, [ %l0 + 0x70 ] executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; 40010b20: c4 24 20 6c st %g2, [ %l0 + 0x6c ] the_mutex->holder_id = executing->Object.id; the_mutex->nest_count = 1; 40010b24: 82 10 20 01 mov 1, %g1 if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || 40010b28: 80 a0 e0 02 cmp %g3, 2 40010b2c: 02 80 00 05 be 40010b40 40010b30: c2 24 20 64 st %g1, [ %l0 + 0x64 ] 40010b34: 80 a0 e0 03 cmp %g3, 3 <== NOT EXECUTED 40010b38: 32 80 00 06 bne,a 40010b50 <== NOT EXECUTED 40010b3c: c2 04 20 58 ld [ %l0 + 0x58 ], %g1 <== NOT EXECUTED _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) executing->resource_count++; 40010b40: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 40010b44: 82 00 60 01 inc %g1 40010b48: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) { 40010b4c: c2 04 20 58 ld [ %l0 + 0x58 ], %g1 40010b50: 80 a0 60 03 cmp %g1, 3 40010b54: 22 80 00 03 be,a 40010b60 40010b58: c6 04 20 5c ld [ %l0 + 0x5c ], %g3 <== NOT EXECUTED _ISR_Enable( level ); 40010b5c: 30 80 00 2c b,a 40010c0c { Priority_Control ceiling; Priority_Control current; ceiling = the_mutex->Attributes.priority_ceiling; current = executing->current_priority; 40010b60: c2 00 a0 14 ld [ %g2 + 0x14 ], %g1 <== NOT EXECUTED if ( current == ceiling ) { 40010b64: 80 a0 40 03 cmp %g1, %g3 <== NOT EXECUTED 40010b68: 12 80 00 03 bne 40010b74 <== NOT EXECUTED 40010b6c: 01 00 00 00 nop <== NOT EXECUTED _ISR_Enable( level ); 40010b70: 30 80 00 27 b,a 40010c0c <== NOT EXECUTED return 0; } if ( current > ceiling ) { 40010b74: 08 80 00 10 bleu 40010bb4 <== NOT EXECUTED 40010b78: 82 10 20 06 mov 6, %g1 <== NOT EXECUTED rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40010b7c: 05 10 00 d2 sethi %hi(0x40034800), %g2 <== NOT EXECUTED 40010b80: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40010b84: 82 00 60 01 inc %g1 <== NOT EXECUTED 40010b88: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] <== NOT EXECUTED _Thread_Disable_dispatch(); _ISR_Enable( level ); 40010b8c: 7f ff e7 4d call 4000a8c0 <== NOT EXECUTED 40010b90: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED _Thread_Change_priority( 40010b94: d2 04 20 5c ld [ %l0 + 0x5c ], %o1 <== NOT EXECUTED 40010b98: d0 04 20 6c ld [ %l0 + 0x6c ], %o0 <== NOT EXECUTED 40010b9c: 40 00 17 22 call 40016824 <_Thread_Change_priority> <== NOT EXECUTED 40010ba0: 94 10 20 00 clr %o2 <== NOT EXECUTED the_mutex->holder, the_mutex->Attributes.priority_ceiling, FALSE ); _Thread_Enable_dispatch(); 40010ba4: 7f ff ff b4 call 40010a74 <_Thread_Enable_dispatch> <== NOT EXECUTED 40010ba8: 01 00 00 00 nop <== NOT EXECUTED RTEMS_INLINE_ROUTINE Region_Control *_Region_Get ( Objects_Id id, Objects_Locations *location ) { return (Region_Control *) 40010bac: 10 80 00 32 b 40010c74 <== NOT EXECUTED 40010bb0: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; 40010bb4: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_UNLOCKED; 40010bb8: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ 40010bbc: c0 24 20 64 clr [ %l0 + 0x64 ] <== NOT EXECUTED _Thread_Enable_dispatch(); return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; the_mutex->lock = CORE_MUTEX_UNLOCKED; 40010bc0: c2 24 20 60 st %g1, [ %l0 + 0x60 ] <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ executing->resource_count--; /* undo locking above */ 40010bc4: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 <== NOT EXECUTED 40010bc8: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 40010bcc: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] <== NOT EXECUTED _ISR_Enable( level ); 40010bd0: 30 80 00 0f b,a 40010c0c <== NOT EXECUTED /* * At this point, we know the mutex was not available. If this thread * is the thread that has locked the mutex, let's see if we are allowed * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { 40010bd4: 80 a0 40 02 cmp %g1, %g2 <== NOT EXECUTED 40010bd8: 32 80 00 13 bne,a 40010c24 <== NOT EXECUTED 40010bdc: 21 10 00 d2 sethi %hi(0x40034800), %l0 <== NOT EXECUTED switch ( the_mutex->Attributes.lock_nesting_behavior ) { 40010be0: c2 04 20 50 ld [ %l0 + 0x50 ], %g1 ! 40034850 <_Thread_BSP_context+0x28> <== NOT EXECUTED 40010be4: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40010be8: 22 80 00 07 be,a 40010c04 <== NOT EXECUTED 40010bec: c2 04 20 64 ld [ %l0 + 0x64 ], %g1 <== NOT EXECUTED 40010bf0: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 40010bf4: 12 80 00 0c bne 40010c24 <== NOT EXECUTED 40010bf8: 21 10 00 d2 sethi %hi(0x40034800), %l0 <== NOT EXECUTED case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; _ISR_Enable( level ); return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 40010bfc: 10 80 00 08 b 40010c1c <== NOT EXECUTED 40010c00: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { switch ( the_mutex->Attributes.lock_nesting_behavior ) { case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; 40010c04: 82 00 60 01 inc %g1 <== NOT EXECUTED 40010c08: c2 24 20 64 st %g1, [ %l0 + 0x64 ] <== NOT EXECUTED _ISR_Enable( level ); 40010c0c: 7f ff e7 2d call 4000a8c0 40010c10: 90 10 00 11 mov %l1, %o0 40010c14: 10 80 00 18 b 40010c74 40010c18: 92 10 00 18 mov %i0, %o1 return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 40010c1c: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED _ISR_Enable( level ); 40010c20: 30 bf ff fb b,a 40010c0c <== NOT EXECUTED 40010c24: c6 04 21 84 ld [ %l0 + 0x184 ], %g3 <== NOT EXECUTED 40010c28: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED 40010c2c: da 00 e0 08 ld [ %g3 + 8 ], %o5 <== NOT EXECUTED 40010c30: c8 00 61 8c ld [ %g1 + 0x18c ], %g4 <== NOT EXECUTED 40010c34: 05 10 00 d2 sethi %hi(0x40034800), %g2 <== NOT EXECUTED 40010c38: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40010c3c: da 21 20 20 st %o5, [ %g4 + 0x20 ] <== NOT EXECUTED 40010c40: 82 00 60 01 inc %g1 <== NOT EXECUTED 40010c44: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] <== NOT EXECUTED 40010c48: 82 00 e0 10 add %g3, 0x10, %g1 <== NOT EXECUTED 40010c4c: c2 21 20 44 st %g1, [ %g4 + 0x44 ] <== NOT EXECUTED 40010c50: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED 40010c54: c2 20 e0 40 st %g1, [ %g3 + 0x40 ] <== NOT EXECUTED 40010c58: 7f ff e7 1a call 4000a8c0 <== NOT EXECUTED 40010c5c: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 40010c60: d0 04 21 84 ld [ %l0 + 0x184 ], %o0 <== NOT EXECUTED 40010c64: 92 10 20 00 clr %o1 <== NOT EXECUTED 40010c68: 40 00 0f 10 call 400148a8 <_CORE_mutex_Seize_interrupt_blocking> <== NOT EXECUTED 40010c6c: 90 02 20 10 add %o0, 0x10, %o0 <== NOT EXECUTED 40010c70: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED 40010c74: 21 10 00 d1 sethi %hi(0x40034400), %l0 40010c78: 94 07 bf f4 add %fp, -12, %o2 40010c7c: 40 00 13 0e call 400158b4 <_Objects_Get_no_protection> 40010c80: 90 14 22 c8 or %l0, 0x2c8, %o0 the_region = _Region_Get( id, &location ); switch ( location ) { 40010c84: c2 07 bf f4 ld [ %fp + -12 ], %g1 40010c88: 80 a0 60 01 cmp %g1, 1 40010c8c: 02 80 00 0a be 40010cb4 40010c90: 92 10 00 08 mov %o0, %o1 40010c94: 80 a0 60 01 cmp %g1, 1 40010c98: 2a 80 00 22 bcs,a 40010d20 40010c9c: c2 02 20 64 ld [ %o0 + 0x64 ], %g1 40010ca0: 80 a0 60 02 cmp %g1, 2 40010ca4: 12 80 00 10 bne 40010ce4 40010ca8: b0 10 20 19 mov 0x19, %i0 40010cac: 10 80 00 10 b 40010cec 40010cb0: 05 10 00 d2 sethi %hi(0x40034800), %g2 case OBJECTS_REMOTE: /* this error cannot be returned */ _RTEMS_Unlock_allocator(); 40010cb4: 05 10 00 d2 sethi %hi(0x40034800), %g2 <== NOT EXECUTED 40010cb8: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40010cbc: 82 00 60 01 inc %g1 <== NOT EXECUTED 40010cc0: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] <== NOT EXECUTED 40010cc4: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED 40010cc8: d0 00 61 84 ld [ %g1 + 0x184 ], %o0 ! 40034984 <_RTEMS_Allocator_Mutex> <== NOT EXECUTED 40010ccc: 94 10 20 00 clr %o2 <== NOT EXECUTED 40010cd0: d2 02 20 08 ld [ %o0 + 8 ], %o1 <== NOT EXECUTED 40010cd4: 40 00 0f 17 call 40014930 <_CORE_mutex_Surrender> <== NOT EXECUTED 40010cd8: 90 02 20 10 add %o0, 0x10, %o0 <== NOT EXECUTED 40010cdc: 7f ff ff 66 call 40010a74 <_Thread_Enable_dispatch> <== NOT EXECUTED 40010ce0: b0 10 20 19 mov 0x19, %i0 <== NOT EXECUTED 40010ce4: 81 c7 e0 08 ret <== NOT EXECUTED 40010ce8: 81 e8 00 00 restore <== NOT EXECUTED 40010cec: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 40010cf0: 82 00 60 01 inc %g1 40010cf4: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] return RTEMS_INTERNAL_ERROR; case OBJECTS_ERROR: _RTEMS_Unlock_allocator(); 40010cf8: 03 10 00 d2 sethi %hi(0x40034800), %g1 40010cfc: d0 00 61 84 ld [ %g1 + 0x184 ], %o0 ! 40034984 <_RTEMS_Allocator_Mutex> 40010d00: 94 10 20 00 clr %o2 40010d04: d2 02 20 08 ld [ %o0 + 8 ], %o1 40010d08: 40 00 0f 0a call 40014930 <_CORE_mutex_Surrender> 40010d0c: 90 02 20 10 add %o0, 0x10, %o0 40010d10: 7f ff ff 59 call 40010a74 <_Thread_Enable_dispatch> 40010d14: b0 10 20 04 mov 4, %i0 40010d18: 81 c7 e0 08 ret 40010d1c: 81 e8 00 00 restore return RTEMS_INVALID_ID; case OBJECTS_LOCAL: _Region_Debug_Walk( the_region, 5 ); if ( the_region->number_of_used_blocks == 0 ) { 40010d20: 80 a0 60 00 cmp %g1, 0 40010d24: 12 80 00 1d bne 40010d98 40010d28: 05 10 00 d2 sethi %hi(0x40034800), %g2 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40010d2c: 90 14 22 c8 or %l0, 0x2c8, %o0 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); 40010d30: c2 02 60 08 ld [ %o1 + 8 ], %g1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40010d34: c6 12 20 10 lduh [ %o0 + 0x10 ], %g3 40010d38: 05 00 00 3f sethi %hi(0xfc00), %g2 40010d3c: 84 10 a3 ff or %g2, 0x3ff, %g2 ! ffff 40010d40: 82 08 40 02 and %g1, %g2, %g1 40010d44: 80 a0 40 03 cmp %g1, %g3 40010d48: 18 80 00 04 bgu 40010d58 40010d4c: 83 28 60 02 sll %g1, 2, %g1 information->local_table[ index ] = the_object; 40010d50: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 40010d54: c0 20 80 01 clr [ %g2 + %g1 ] RTEMS_INLINE_ROUTINE void _Region_Free ( Region_Control *the_region ) { _Objects_Free( &_Region_Information, &the_region->Object ); 40010d58: 40 00 12 95 call 400157ac <_Objects_Free> 40010d5c: c0 22 60 0c clr [ %o1 + 0xc ] 40010d60: 05 10 00 d2 sethi %hi(0x40034800), %g2 40010d64: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> 40010d68: 82 00 60 01 inc %g1 40010d6c: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] _Objects_Close( &_Region_Information, &the_region->Object ); _Region_Free( the_region ); _RTEMS_Unlock_allocator(); 40010d70: 03 10 00 d2 sethi %hi(0x40034800), %g1 40010d74: d0 00 61 84 ld [ %g1 + 0x184 ], %o0 ! 40034984 <_RTEMS_Allocator_Mutex> 40010d78: 94 10 20 00 clr %o2 40010d7c: d2 02 20 08 ld [ %o0 + 8 ], %o1 40010d80: 40 00 0e ec call 40014930 <_CORE_mutex_Surrender> 40010d84: 90 02 20 10 add %o0, 0x10, %o0 40010d88: 7f ff ff 3b call 40010a74 <_Thread_Enable_dispatch> 40010d8c: b0 10 20 00 clr %i0 40010d90: 81 c7 e0 08 ret 40010d94: 81 e8 00 00 restore 40010d98: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 40010d9c: 82 00 60 01 inc %g1 40010da0: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] return RTEMS_SUCCESSFUL; } _RTEMS_Unlock_allocator(); 40010da4: 03 10 00 d2 sethi %hi(0x40034800), %g1 40010da8: d0 00 61 84 ld [ %g1 + 0x184 ], %o0 ! 40034984 <_RTEMS_Allocator_Mutex> 40010dac: 94 10 20 00 clr %o2 40010db0: d2 02 20 08 ld [ %o0 + 8 ], %o1 40010db4: 40 00 0e df call 40014930 <_CORE_mutex_Surrender> 40010db8: 90 02 20 10 add %o0, 0x10, %o0 40010dbc: 7f ff ff 2e call 40010a74 <_Thread_Enable_dispatch> 40010dc0: b0 10 20 0c mov 0xc, %i0 return RTEMS_RESOURCE_IN_USE; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40010dc4: 81 c7 e0 08 ret 40010dc8: 81 e8 00 00 restore 40010e00 : rtems_status_code rtems_region_extend( Objects_Id id, void *starting_address, uint32_t length ) { 40010e00: 9d e3 bf 90 save %sp, -112, %sp 40010e04: a4 10 00 18 mov %i0, %l2 Objects_Locations location; uint32_t amount_extended; Heap_Extend_status heap_status; rtems_status_code status; if ( !starting_address ) 40010e08: 80 a6 60 00 cmp %i1, 0 40010e0c: 02 80 00 90 be 4001104c 40010e10: b0 10 20 09 mov 9, %i0 return RTEMS_INVALID_ADDRESS; status = RTEMS_SUCCESSFUL; _RTEMS_Lock_allocator(); /* to prevent deletion */ 40010e14: 7f ff e6 a7 call 4000a8b0 40010e18: 01 00 00 00 nop 40010e1c: a2 10 00 08 mov %o0, %l1 40010e20: 03 10 00 d2 sethi %hi(0x40034800), %g1 40010e24: c2 00 60 b0 ld [ %g1 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> 40010e28: 80 a0 60 00 cmp %g1, 0 40010e2c: 02 80 00 0b be 40010e58 40010e30: 03 10 00 d2 sethi %hi(0x40034800), %g1 40010e34: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED 40010e38: c2 00 62 90 ld [ %g1 + 0x290 ], %g1 ! 40034a90 <_System_state_Current> <== NOT EXECUTED 40010e3c: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 40010e40: 08 80 00 05 bleu 40010e54 <== NOT EXECUTED 40010e44: 90 10 20 00 clr %o0 <== NOT EXECUTED 40010e48: 92 10 20 00 clr %o1 <== NOT EXECUTED 40010e4c: 40 00 11 29 call 400152f0 <_Internal_error_Occurred> <== NOT EXECUTED 40010e50: 94 10 20 12 mov 0x12, %o2 <== NOT EXECUTED 40010e54: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED 40010e58: e0 00 61 84 ld [ %g1 + 0x184 ], %l0 ! 40034984 <_RTEMS_Allocator_Mutex> Thread_Control *executing; ISR_Level level = *level_p; /* disabled when you get here */ executing = _Thread_Executing; 40010e5c: 03 10 00 d2 sethi %hi(0x40034800), %g1 40010e60: c4 00 61 8c ld [ %g1 + 0x18c ], %g2 ! 4003498c <_Thread_Executing> executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; 40010e64: c0 20 a0 34 clr [ %g2 + 0x34 ] if ( !_CORE_mutex_Is_locked( the_mutex ) ) { 40010e68: c2 04 20 60 ld [ %l0 + 0x60 ], %g1 40010e6c: 80 a0 60 00 cmp %g1, 0 40010e70: 22 80 00 33 be,a 40010f3c 40010e74: c2 04 20 6c ld [ %l0 + 0x6c ], %g1 <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_LOCKED; 40010e78: c0 24 20 60 clr [ %l0 + 0x60 ] the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 40010e7c: c2 00 a0 08 ld [ %g2 + 8 ], %g1 */ RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_inherit_priority( CORE_mutex_Attributes *the_attribute ) { return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT; 40010e80: c6 04 20 58 ld [ %l0 + 0x58 ], %g3 executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 40010e84: c2 24 20 70 st %g1, [ %l0 + 0x70 ] executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; 40010e88: c4 24 20 6c st %g2, [ %l0 + 0x6c ] the_mutex->holder_id = executing->Object.id; the_mutex->nest_count = 1; 40010e8c: 82 10 20 01 mov 1, %g1 if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || 40010e90: 80 a0 e0 02 cmp %g3, 2 40010e94: 02 80 00 05 be 40010ea8 40010e98: c2 24 20 64 st %g1, [ %l0 + 0x64 ] 40010e9c: 80 a0 e0 03 cmp %g3, 3 <== NOT EXECUTED 40010ea0: 32 80 00 06 bne,a 40010eb8 <== NOT EXECUTED 40010ea4: c2 04 20 58 ld [ %l0 + 0x58 ], %g1 <== NOT EXECUTED _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) executing->resource_count++; 40010ea8: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 40010eac: 82 00 60 01 inc %g1 40010eb0: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) { 40010eb4: c2 04 20 58 ld [ %l0 + 0x58 ], %g1 40010eb8: 80 a0 60 03 cmp %g1, 3 40010ebc: 22 80 00 03 be,a 40010ec8 40010ec0: c6 04 20 5c ld [ %l0 + 0x5c ], %g3 <== NOT EXECUTED _ISR_Enable( level ); 40010ec4: 30 80 00 2c b,a 40010f74 { Priority_Control ceiling; Priority_Control current; ceiling = the_mutex->Attributes.priority_ceiling; current = executing->current_priority; 40010ec8: c2 00 a0 14 ld [ %g2 + 0x14 ], %g1 <== NOT EXECUTED if ( current == ceiling ) { 40010ecc: 80 a0 40 03 cmp %g1, %g3 <== NOT EXECUTED 40010ed0: 12 80 00 03 bne 40010edc <== NOT EXECUTED 40010ed4: 01 00 00 00 nop <== NOT EXECUTED _ISR_Enable( level ); 40010ed8: 30 80 00 27 b,a 40010f74 <== NOT EXECUTED return 0; } if ( current > ceiling ) { 40010edc: 08 80 00 10 bleu 40010f1c <== NOT EXECUTED 40010ee0: 82 10 20 06 mov 6, %g1 <== NOT EXECUTED rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40010ee4: 05 10 00 d2 sethi %hi(0x40034800), %g2 <== NOT EXECUTED 40010ee8: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40010eec: 82 00 60 01 inc %g1 <== NOT EXECUTED 40010ef0: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] <== NOT EXECUTED _Thread_Disable_dispatch(); _ISR_Enable( level ); 40010ef4: 7f ff e6 73 call 4000a8c0 <== NOT EXECUTED 40010ef8: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED _Thread_Change_priority( 40010efc: d2 04 20 5c ld [ %l0 + 0x5c ], %o1 <== NOT EXECUTED 40010f00: d0 04 20 6c ld [ %l0 + 0x6c ], %o0 <== NOT EXECUTED 40010f04: 40 00 16 48 call 40016824 <_Thread_Change_priority> <== NOT EXECUTED 40010f08: 94 10 20 00 clr %o2 <== NOT EXECUTED the_mutex->holder, the_mutex->Attributes.priority_ceiling, FALSE ); _Thread_Enable_dispatch(); 40010f0c: 7f ff ff b0 call 40010dcc <_Thread_Enable_dispatch> <== NOT EXECUTED 40010f10: 01 00 00 00 nop <== NOT EXECUTED RTEMS_INLINE_ROUTINE Region_Control *_Region_Get ( Objects_Id id, Objects_Locations *location ) { return (Region_Control *) 40010f14: 10 80 00 32 b 40010fdc <== NOT EXECUTED 40010f18: 92 10 00 12 mov %l2, %o1 <== NOT EXECUTED return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; 40010f1c: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_UNLOCKED; 40010f20: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ 40010f24: c0 24 20 64 clr [ %l0 + 0x64 ] <== NOT EXECUTED _Thread_Enable_dispatch(); return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; the_mutex->lock = CORE_MUTEX_UNLOCKED; 40010f28: c2 24 20 60 st %g1, [ %l0 + 0x60 ] <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ executing->resource_count--; /* undo locking above */ 40010f2c: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 <== NOT EXECUTED 40010f30: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 40010f34: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] <== NOT EXECUTED _ISR_Enable( level ); 40010f38: 30 80 00 0f b,a 40010f74 <== NOT EXECUTED /* * At this point, we know the mutex was not available. If this thread * is the thread that has locked the mutex, let's see if we are allowed * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { 40010f3c: 80 a0 40 02 cmp %g1, %g2 <== NOT EXECUTED 40010f40: 32 80 00 13 bne,a 40010f8c <== NOT EXECUTED 40010f44: 21 10 00 d2 sethi %hi(0x40034800), %l0 <== NOT EXECUTED switch ( the_mutex->Attributes.lock_nesting_behavior ) { 40010f48: c2 04 20 50 ld [ %l0 + 0x50 ], %g1 ! 40034850 <_Thread_BSP_context+0x28> <== NOT EXECUTED 40010f4c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40010f50: 22 80 00 07 be,a 40010f6c <== NOT EXECUTED 40010f54: c2 04 20 64 ld [ %l0 + 0x64 ], %g1 <== NOT EXECUTED 40010f58: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 40010f5c: 12 80 00 0c bne 40010f8c <== NOT EXECUTED 40010f60: 21 10 00 d2 sethi %hi(0x40034800), %l0 <== NOT EXECUTED case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; _ISR_Enable( level ); return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 40010f64: 10 80 00 08 b 40010f84 <== NOT EXECUTED 40010f68: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { switch ( the_mutex->Attributes.lock_nesting_behavior ) { case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; 40010f6c: 82 00 60 01 inc %g1 <== NOT EXECUTED 40010f70: c2 24 20 64 st %g1, [ %l0 + 0x64 ] <== NOT EXECUTED _ISR_Enable( level ); 40010f74: 7f ff e6 53 call 4000a8c0 40010f78: 90 10 00 11 mov %l1, %o0 40010f7c: 10 80 00 18 b 40010fdc 40010f80: 92 10 00 12 mov %l2, %o1 return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 40010f84: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED _ISR_Enable( level ); 40010f88: 30 bf ff fb b,a 40010f74 <== NOT EXECUTED 40010f8c: c6 04 21 84 ld [ %l0 + 0x184 ], %g3 <== NOT EXECUTED 40010f90: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED 40010f94: da 00 e0 08 ld [ %g3 + 8 ], %o5 <== NOT EXECUTED 40010f98: c8 00 61 8c ld [ %g1 + 0x18c ], %g4 <== NOT EXECUTED 40010f9c: 05 10 00 d2 sethi %hi(0x40034800), %g2 <== NOT EXECUTED 40010fa0: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40010fa4: da 21 20 20 st %o5, [ %g4 + 0x20 ] <== NOT EXECUTED 40010fa8: 82 00 60 01 inc %g1 <== NOT EXECUTED 40010fac: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] <== NOT EXECUTED 40010fb0: 82 00 e0 10 add %g3, 0x10, %g1 <== NOT EXECUTED 40010fb4: c2 21 20 44 st %g1, [ %g4 + 0x44 ] <== NOT EXECUTED 40010fb8: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED 40010fbc: c2 20 e0 40 st %g1, [ %g3 + 0x40 ] <== NOT EXECUTED 40010fc0: 7f ff e6 40 call 4000a8c0 <== NOT EXECUTED 40010fc4: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 40010fc8: d0 04 21 84 ld [ %l0 + 0x184 ], %o0 <== NOT EXECUTED 40010fcc: 92 10 20 00 clr %o1 <== NOT EXECUTED 40010fd0: 40 00 0e 36 call 400148a8 <_CORE_mutex_Seize_interrupt_blocking> <== NOT EXECUTED 40010fd4: 90 02 20 10 add %o0, 0x10, %o0 <== NOT EXECUTED 40010fd8: 92 10 00 12 mov %l2, %o1 <== NOT EXECUTED 40010fdc: 11 10 00 d1 sethi %hi(0x40034400), %o0 40010fe0: 94 07 bf f4 add %fp, -12, %o2 40010fe4: 40 00 12 34 call 400158b4 <_Objects_Get_no_protection> 40010fe8: 90 12 22 c8 or %o0, 0x2c8, %o0 the_region = _Region_Get( id, &location ); switch ( location ) { 40010fec: c2 07 bf f4 ld [ %fp + -12 ], %g1 40010ff0: 80 a0 60 01 cmp %g1, 1 40010ff4: 02 80 00 0a be 4001101c 40010ff8: a0 10 00 08 mov %o0, %l0 40010ffc: 80 a0 60 01 cmp %g1, 1 40011000: 0a 80 00 22 bcs 40011088 40011004: 92 10 00 19 mov %i1, %o1 40011008: 80 a0 60 02 cmp %g1, 2 4001100c: 12 80 00 10 bne 4001104c 40011010: b0 10 20 19 mov 0x19, %i0 40011014: 10 80 00 10 b 40011054 40011018: 05 10 00 d2 sethi %hi(0x40034800), %g2 case OBJECTS_REMOTE: /* this error cannot be returned */ _RTEMS_Unlock_allocator(); 4001101c: 05 10 00 d2 sethi %hi(0x40034800), %g2 <== NOT EXECUTED 40011020: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40011024: 82 00 60 01 inc %g1 <== NOT EXECUTED 40011028: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] <== NOT EXECUTED 4001102c: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED 40011030: d0 00 61 84 ld [ %g1 + 0x184 ], %o0 ! 40034984 <_RTEMS_Allocator_Mutex> <== NOT EXECUTED 40011034: 94 10 20 00 clr %o2 <== NOT EXECUTED 40011038: d2 02 20 08 ld [ %o0 + 8 ], %o1 <== NOT EXECUTED 4001103c: 40 00 0e 3d call 40014930 <_CORE_mutex_Surrender> <== NOT EXECUTED 40011040: 90 02 20 10 add %o0, 0x10, %o0 <== NOT EXECUTED 40011044: 7f ff ff 62 call 40010dcc <_Thread_Enable_dispatch> <== NOT EXECUTED 40011048: b0 10 20 19 mov 0x19, %i0 <== NOT EXECUTED 4001104c: 81 c7 e0 08 ret <== NOT EXECUTED 40011050: 81 e8 00 00 restore <== NOT EXECUTED 40011054: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 40011058: 82 00 60 01 inc %g1 4001105c: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] return RTEMS_INTERNAL_ERROR; case OBJECTS_ERROR: _RTEMS_Unlock_allocator(); 40011060: 03 10 00 d2 sethi %hi(0x40034800), %g1 40011064: d0 00 61 84 ld [ %g1 + 0x184 ], %o0 ! 40034984 <_RTEMS_Allocator_Mutex> 40011068: 94 10 20 00 clr %o2 4001106c: d2 02 20 08 ld [ %o0 + 8 ], %o1 40011070: 40 00 0e 30 call 40014930 <_CORE_mutex_Surrender> 40011074: 90 02 20 10 add %o0, 0x10, %o0 40011078: 7f ff ff 55 call 40010dcc <_Thread_Enable_dispatch> 4001107c: b0 10 20 04 mov 4, %i0 40011080: 81 c7 e0 08 ret 40011084: 81 e8 00 00 restore return RTEMS_INVALID_ID; case OBJECTS_LOCAL: heap_status = _Heap_Extend( 40011088: 94 10 00 1a mov %i2, %o2 4001108c: 90 02 20 68 add %o0, 0x68, %o0 40011090: 96 07 bf f0 add %fp, -16, %o3 40011094: 40 00 0f 62 call 40014e1c <_Heap_Extend> 40011098: b0 10 20 09 mov 9, %i0 starting_address, length, &amount_extended ); switch ( heap_status ) { 4001109c: 80 a2 20 01 cmp %o0, 1 400110a0: 02 80 00 12 be 400110e8 400110a4: 05 10 00 d2 sethi %hi(0x40034800), %g2 400110a8: 0a 80 00 08 bcs 400110c8 400110ac: c6 07 bf f0 ld [ %fp + -16 ], %g3 400110b0: 82 1a 20 02 xor %o0, 2, %g1 400110b4: 80 a0 00 01 cmp %g0, %g1 400110b8: 82 60 20 00 subx %g0, 0, %g1 400110bc: b0 08 7f e8 and %g1, -24, %i0 400110c0: 10 80 00 0a b 400110e8 400110c4: b0 06 20 18 add %i0, 0x18, %i0 case HEAP_EXTEND_SUCCESSFUL: the_region->length += amount_extended; 400110c8: c4 04 20 54 ld [ %l0 + 0x54 ], %g2 the_region->maximum_segment_size += amount_extended; 400110cc: c2 04 20 5c ld [ %l0 + 0x5c ], %g1 &amount_extended ); switch ( heap_status ) { case HEAP_EXTEND_SUCCESSFUL: the_region->length += amount_extended; 400110d0: 84 00 80 03 add %g2, %g3, %g2 the_region->maximum_segment_size += amount_extended; 400110d4: 82 00 40 03 add %g1, %g3, %g1 &amount_extended ); switch ( heap_status ) { case HEAP_EXTEND_SUCCESSFUL: the_region->length += amount_extended; 400110d8: c4 24 20 54 st %g2, [ %l0 + 0x54 ] the_region->maximum_segment_size += amount_extended; 400110dc: c2 24 20 5c st %g1, [ %l0 + 0x5c ] 400110e0: b0 10 20 00 clr %i0 400110e4: 05 10 00 d2 sethi %hi(0x40034800), %g2 400110e8: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> 400110ec: 82 00 60 01 inc %g1 400110f0: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] break; case HEAP_EXTEND_NOT_IMPLEMENTED: status = RTEMS_NOT_IMPLEMENTED; break; } _RTEMS_Unlock_allocator(); 400110f4: 03 10 00 d2 sethi %hi(0x40034800), %g1 400110f8: d0 00 61 84 ld [ %g1 + 0x184 ], %o0 ! 40034984 <_RTEMS_Allocator_Mutex> 400110fc: 94 10 20 00 clr %o2 40011100: d2 02 20 08 ld [ %o0 + 8 ], %o1 40011104: 40 00 0e 0b call 40014930 <_CORE_mutex_Surrender> 40011108: 90 02 20 10 add %o0, 0x10, %o0 4001110c: 7f ff ff 30 call 40010dcc <_Thread_Enable_dispatch> 40011110: 01 00 00 00 nop return( status ); } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40011114: 81 c7 e0 08 ret 40011118: 81 e8 00 00 restore 40011150 : uint32_t size, rtems_option option_set, rtems_interval timeout, void **segment ) { 40011150: 9d e3 bf 90 save %sp, -112, %sp 40011154: a4 10 00 18 mov %i0, %l2 register Region_Control *the_region; Objects_Locations location; Thread_Control *executing; void *the_segment; if ( !segment ) 40011158: 80 a7 20 00 cmp %i4, 0 4001115c: 02 80 00 96 be 400113b4 40011160: b0 10 20 09 mov 9, %i0 return RTEMS_INVALID_ADDRESS; *segment = NULL; 40011164: c0 27 00 00 clr [ %i4 ] if ( size == 0 ) 40011168: 80 a6 60 00 cmp %i1, 0 4001116c: 02 80 00 92 be 400113b4 40011170: b0 10 20 08 mov 8, %i0 return RTEMS_INVALID_SIZE; _RTEMS_Lock_allocator(); 40011174: 7f ff e5 cf call 4000a8b0 40011178: 01 00 00 00 nop 4001117c: a2 10 00 08 mov %o0, %l1 40011180: 03 10 00 d2 sethi %hi(0x40034800), %g1 40011184: c2 00 60 b0 ld [ %g1 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> 40011188: 80 a0 60 00 cmp %g1, 0 4001118c: 02 80 00 0b be 400111b8 40011190: 03 10 00 d2 sethi %hi(0x40034800), %g1 40011194: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED 40011198: c2 00 62 90 ld [ %g1 + 0x290 ], %g1 ! 40034a90 <_System_state_Current> <== NOT EXECUTED 4001119c: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 400111a0: 08 80 00 05 bleu 400111b4 <== NOT EXECUTED 400111a4: 90 10 20 00 clr %o0 <== NOT EXECUTED 400111a8: 92 10 20 00 clr %o1 <== NOT EXECUTED 400111ac: 40 00 10 51 call 400152f0 <_Internal_error_Occurred> <== NOT EXECUTED 400111b0: 94 10 20 12 mov 0x12, %o2 <== NOT EXECUTED 400111b4: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED 400111b8: e0 00 61 84 ld [ %g1 + 0x184 ], %l0 ! 40034984 <_RTEMS_Allocator_Mutex> Thread_Control *executing; ISR_Level level = *level_p; /* disabled when you get here */ executing = _Thread_Executing; 400111bc: 03 10 00 d2 sethi %hi(0x40034800), %g1 400111c0: c4 00 61 8c ld [ %g1 + 0x18c ], %g2 ! 4003498c <_Thread_Executing> executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; 400111c4: c0 20 a0 34 clr [ %g2 + 0x34 ] if ( !_CORE_mutex_Is_locked( the_mutex ) ) { 400111c8: c2 04 20 60 ld [ %l0 + 0x60 ], %g1 400111cc: 80 a0 60 00 cmp %g1, 0 400111d0: 22 80 00 33 be,a 4001129c 400111d4: c2 04 20 6c ld [ %l0 + 0x6c ], %g1 <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_LOCKED; 400111d8: c0 24 20 60 clr [ %l0 + 0x60 ] the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 400111dc: c2 00 a0 08 ld [ %g2 + 8 ], %g1 */ RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_inherit_priority( CORE_mutex_Attributes *the_attribute ) { return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT; 400111e0: c6 04 20 58 ld [ %l0 + 0x58 ], %g3 executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 400111e4: c2 24 20 70 st %g1, [ %l0 + 0x70 ] executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; 400111e8: c4 24 20 6c st %g2, [ %l0 + 0x6c ] the_mutex->holder_id = executing->Object.id; the_mutex->nest_count = 1; 400111ec: 82 10 20 01 mov 1, %g1 if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || 400111f0: 80 a0 e0 02 cmp %g3, 2 400111f4: 02 80 00 05 be 40011208 400111f8: c2 24 20 64 st %g1, [ %l0 + 0x64 ] 400111fc: 80 a0 e0 03 cmp %g3, 3 <== NOT EXECUTED 40011200: 32 80 00 06 bne,a 40011218 <== NOT EXECUTED 40011204: c2 04 20 58 ld [ %l0 + 0x58 ], %g1 <== NOT EXECUTED _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) executing->resource_count++; 40011208: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 4001120c: 82 00 60 01 inc %g1 40011210: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) { 40011214: c2 04 20 58 ld [ %l0 + 0x58 ], %g1 40011218: 80 a0 60 03 cmp %g1, 3 4001121c: 22 80 00 03 be,a 40011228 40011220: c6 04 20 5c ld [ %l0 + 0x5c ], %g3 <== NOT EXECUTED _ISR_Enable( level ); 40011224: 30 80 00 2c b,a 400112d4 { Priority_Control ceiling; Priority_Control current; ceiling = the_mutex->Attributes.priority_ceiling; current = executing->current_priority; 40011228: c2 00 a0 14 ld [ %g2 + 0x14 ], %g1 <== NOT EXECUTED if ( current == ceiling ) { 4001122c: 80 a0 40 03 cmp %g1, %g3 <== NOT EXECUTED 40011230: 12 80 00 03 bne 4001123c <== NOT EXECUTED 40011234: 01 00 00 00 nop <== NOT EXECUTED _ISR_Enable( level ); 40011238: 30 80 00 27 b,a 400112d4 <== NOT EXECUTED return 0; } if ( current > ceiling ) { 4001123c: 28 80 00 10 bleu,a 4001127c <== NOT EXECUTED 40011240: 82 10 20 06 mov 6, %g1 <== NOT EXECUTED rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40011244: 05 10 00 d2 sethi %hi(0x40034800), %g2 <== NOT EXECUTED 40011248: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 4001124c: 82 00 60 01 inc %g1 <== NOT EXECUTED 40011250: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] <== NOT EXECUTED _Thread_Disable_dispatch(); _ISR_Enable( level ); 40011254: 7f ff e5 9b call 4000a8c0 <== NOT EXECUTED 40011258: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED _Thread_Change_priority( 4001125c: d2 04 20 5c ld [ %l0 + 0x5c ], %o1 <== NOT EXECUTED 40011260: d0 04 20 6c ld [ %l0 + 0x6c ], %o0 <== NOT EXECUTED 40011264: 40 00 15 70 call 40016824 <_Thread_Change_priority> <== NOT EXECUTED 40011268: 94 10 20 00 clr %o2 <== NOT EXECUTED the_mutex->holder, the_mutex->Attributes.priority_ceiling, FALSE ); _Thread_Enable_dispatch(); 4001126c: 7f ff ff ac call 4001111c <_Thread_Enable_dispatch> <== NOT EXECUTED 40011270: 01 00 00 00 nop <== NOT EXECUTED executing = _Thread_Executing; 40011274: 10 80 00 32 b 4001133c <== NOT EXECUTED 40011278: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; 4001127c: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_UNLOCKED; 40011280: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ 40011284: c0 24 20 64 clr [ %l0 + 0x64 ] <== NOT EXECUTED _Thread_Enable_dispatch(); return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; the_mutex->lock = CORE_MUTEX_UNLOCKED; 40011288: c2 24 20 60 st %g1, [ %l0 + 0x60 ] <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ executing->resource_count--; /* undo locking above */ 4001128c: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 <== NOT EXECUTED 40011290: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 40011294: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] <== NOT EXECUTED _ISR_Enable( level ); 40011298: 30 80 00 0f b,a 400112d4 <== NOT EXECUTED /* * At this point, we know the mutex was not available. If this thread * is the thread that has locked the mutex, let's see if we are allowed * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { 4001129c: 80 a0 40 02 cmp %g1, %g2 <== NOT EXECUTED 400112a0: 32 80 00 13 bne,a 400112ec <== NOT EXECUTED 400112a4: 21 10 00 d2 sethi %hi(0x40034800), %l0 <== NOT EXECUTED switch ( the_mutex->Attributes.lock_nesting_behavior ) { 400112a8: c2 04 20 50 ld [ %l0 + 0x50 ], %g1 ! 40034850 <_Thread_BSP_context+0x28> <== NOT EXECUTED 400112ac: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400112b0: 22 80 00 07 be,a 400112cc <== NOT EXECUTED 400112b4: c2 04 20 64 ld [ %l0 + 0x64 ], %g1 <== NOT EXECUTED 400112b8: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 400112bc: 12 80 00 0c bne 400112ec <== NOT EXECUTED 400112c0: 21 10 00 d2 sethi %hi(0x40034800), %l0 <== NOT EXECUTED case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; _ISR_Enable( level ); return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 400112c4: 10 80 00 08 b 400112e4 <== NOT EXECUTED 400112c8: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { switch ( the_mutex->Attributes.lock_nesting_behavior ) { case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; 400112cc: 82 00 60 01 inc %g1 <== NOT EXECUTED 400112d0: c2 24 20 64 st %g1, [ %l0 + 0x64 ] <== NOT EXECUTED _ISR_Enable( level ); 400112d4: 7f ff e5 7b call 4000a8c0 400112d8: 90 10 00 11 mov %l1, %o0 400112dc: 10 80 00 18 b 4001133c 400112e0: 03 10 00 d2 sethi %hi(0x40034800), %g1 return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 400112e4: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED _ISR_Enable( level ); 400112e8: 30 bf ff fb b,a 400112d4 <== NOT EXECUTED *segment = NULL; if ( size == 0 ) return RTEMS_INVALID_SIZE; _RTEMS_Lock_allocator(); 400112ec: c6 04 21 84 ld [ %l0 + 0x184 ], %g3 <== NOT EXECUTED 400112f0: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED 400112f4: da 00 e0 08 ld [ %g3 + 8 ], %o5 <== NOT EXECUTED 400112f8: c8 00 61 8c ld [ %g1 + 0x18c ], %g4 <== NOT EXECUTED 400112fc: 05 10 00 d2 sethi %hi(0x40034800), %g2 <== NOT EXECUTED 40011300: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40011304: da 21 20 20 st %o5, [ %g4 + 0x20 ] <== NOT EXECUTED 40011308: 82 00 60 01 inc %g1 <== NOT EXECUTED 4001130c: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] <== NOT EXECUTED 40011310: 82 00 e0 10 add %g3, 0x10, %g1 <== NOT EXECUTED 40011314: c2 21 20 44 st %g1, [ %g4 + 0x44 ] <== NOT EXECUTED 40011318: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED 4001131c: c2 20 e0 40 st %g1, [ %g3 + 0x40 ] <== NOT EXECUTED 40011320: 7f ff e5 68 call 4000a8c0 <== NOT EXECUTED 40011324: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 40011328: d0 04 21 84 ld [ %l0 + 0x184 ], %o0 <== NOT EXECUTED 4001132c: 92 10 20 00 clr %o1 <== NOT EXECUTED 40011330: 40 00 0d 5e call 400148a8 <_CORE_mutex_Seize_interrupt_blocking> <== NOT EXECUTED 40011334: 90 02 20 10 add %o0, 0x10, %o0 <== NOT EXECUTED executing = _Thread_Executing; 40011338: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED 4001133c: 11 10 00 d1 sethi %hi(0x40034400), %o0 40011340: f0 00 61 8c ld [ %g1 + 0x18c ], %i0 40011344: 90 12 22 c8 or %o0, 0x2c8, %o0 40011348: 92 10 00 12 mov %l2, %o1 4001134c: 40 00 11 5a call 400158b4 <_Objects_Get_no_protection> 40011350: 94 07 bf f4 add %fp, -12, %o2 the_region = _Region_Get( id, &location ); switch ( location ) { 40011354: c2 07 bf f4 ld [ %fp + -12 ], %g1 40011358: 80 a0 60 01 cmp %g1, 1 4001135c: 02 80 00 0a be 40011384 40011360: a0 10 00 08 mov %o0, %l0 40011364: 80 a0 60 01 cmp %g1, 1 40011368: 2a 80 00 22 bcs,a 400113f0 4001136c: c2 02 20 5c ld [ %o0 + 0x5c ], %g1 40011370: 80 a0 60 02 cmp %g1, 2 40011374: 12 80 00 10 bne 400113b4 40011378: b0 10 20 19 mov 0x19, %i0 4001137c: 10 80 00 10 b 400113bc 40011380: 05 10 00 d2 sethi %hi(0x40034800), %g2 case OBJECTS_REMOTE: /* this error cannot be returned */ _RTEMS_Unlock_allocator(); 40011384: 05 10 00 d2 sethi %hi(0x40034800), %g2 <== NOT EXECUTED 40011388: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 4001138c: 82 00 60 01 inc %g1 <== NOT EXECUTED 40011390: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] <== NOT EXECUTED 40011394: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED 40011398: d0 00 61 84 ld [ %g1 + 0x184 ], %o0 ! 40034984 <_RTEMS_Allocator_Mutex> <== NOT EXECUTED 4001139c: 94 10 20 00 clr %o2 <== NOT EXECUTED 400113a0: d2 02 20 08 ld [ %o0 + 8 ], %o1 <== NOT EXECUTED 400113a4: 40 00 0d 63 call 40014930 <_CORE_mutex_Surrender> <== NOT EXECUTED 400113a8: 90 02 20 10 add %o0, 0x10, %o0 <== NOT EXECUTED 400113ac: 7f ff ff 5c call 4001111c <_Thread_Enable_dispatch> <== NOT EXECUTED 400113b0: b0 10 20 19 mov 0x19, %i0 <== NOT EXECUTED 400113b4: 81 c7 e0 08 ret <== NOT EXECUTED 400113b8: 81 e8 00 00 restore <== NOT EXECUTED 400113bc: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 400113c0: 82 00 60 01 inc %g1 400113c4: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] return RTEMS_INTERNAL_ERROR; case OBJECTS_ERROR: _RTEMS_Unlock_allocator(); 400113c8: 03 10 00 d2 sethi %hi(0x40034800), %g1 400113cc: d0 00 61 84 ld [ %g1 + 0x184 ], %o0 ! 40034984 <_RTEMS_Allocator_Mutex> 400113d0: 94 10 20 00 clr %o2 400113d4: d2 02 20 08 ld [ %o0 + 8 ], %o1 400113d8: 40 00 0d 56 call 40014930 <_CORE_mutex_Surrender> 400113dc: 90 02 20 10 add %o0, 0x10, %o0 400113e0: 7f ff ff 4f call 4001111c <_Thread_Enable_dispatch> 400113e4: b0 10 20 04 mov 4, %i0 400113e8: 81 c7 e0 08 ret 400113ec: 81 e8 00 00 restore return RTEMS_INVALID_ID; case OBJECTS_LOCAL: if ( size > the_region->maximum_segment_size ) { 400113f0: 80 a6 40 01 cmp %i1, %g1 400113f4: 08 80 00 0f bleu 40011430 400113f8: 05 10 00 d2 sethi %hi(0x40034800), %g2 400113fc: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> 40011400: 82 00 60 01 inc %g1 40011404: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] _RTEMS_Unlock_allocator(); 40011408: 03 10 00 d2 sethi %hi(0x40034800), %g1 4001140c: d0 00 61 84 ld [ %g1 + 0x184 ], %o0 ! 40034984 <_RTEMS_Allocator_Mutex> 40011410: 94 10 20 00 clr %o2 40011414: d2 02 20 08 ld [ %o0 + 8 ], %o1 40011418: 40 00 0d 46 call 40014930 <_CORE_mutex_Surrender> 4001141c: 90 02 20 10 add %o0, 0x10, %o0 40011420: 7f ff ff 3f call 4001111c <_Thread_Enable_dispatch> 40011424: b0 10 20 08 mov 8, %i0 40011428: 81 c7 e0 08 ret 4001142c: 81 e8 00 00 restore RTEMS_INLINE_ROUTINE void *_Region_Allocate_segment ( Region_Control *the_region, uint32_t size ) { return _Heap_Allocate( &the_region->Memory, size ); 40011430: 90 02 20 68 add %o0, 0x68, %o0 40011434: 40 00 0e 53 call 40014d80 <_Heap_Allocate> 40011438: 92 10 00 19 mov %i1, %o1 the_segment = _Region_Allocate_segment( the_region, size ); _Region_Debug_Walk( the_region, 2 ); if ( the_segment ) { 4001143c: a2 92 20 00 orcc %o0, 0, %l1 40011440: 02 80 00 13 be 4001148c 40011444: 07 10 00 d2 sethi %hi(0x40034800), %g3 the_region->number_of_used_blocks += 1; 40011448: c2 04 20 64 ld [ %l0 + 0x64 ], %g1 4001144c: c4 00 e0 b0 ld [ %g3 + 0xb0 ], %g2 40011450: 82 00 60 01 inc %g1 40011454: c2 24 20 64 st %g1, [ %l0 + 0x64 ] 40011458: 84 00 a0 01 inc %g2 4001145c: c4 20 e0 b0 st %g2, [ %g3 + 0xb0 ] _RTEMS_Unlock_allocator(); 40011460: 03 10 00 d2 sethi %hi(0x40034800), %g1 40011464: d0 00 61 84 ld [ %g1 + 0x184 ], %o0 ! 40034984 <_RTEMS_Allocator_Mutex> 40011468: 94 10 20 00 clr %o2 4001146c: d2 02 20 08 ld [ %o0 + 8 ], %o1 40011470: 40 00 0d 30 call 40014930 <_CORE_mutex_Surrender> 40011474: 90 02 20 10 add %o0, 0x10, %o0 40011478: 7f ff ff 29 call 4001111c <_Thread_Enable_dispatch> 4001147c: b0 10 20 00 clr %i0 *segment = the_segment; 40011480: e2 27 00 00 st %l1, [ %i4 ] 40011484: 81 c7 e0 08 ret 40011488: 81 e8 00 00 restore return RTEMS_SUCCESSFUL; } if ( _Options_Is_no_wait( option_set ) ) { 4001148c: 80 8e a0 01 btst 1, %i2 40011490: 05 10 00 d2 sethi %hi(0x40034800), %g2 40011494: 02 80 00 0e be 400114cc 40011498: 07 10 00 d2 sethi %hi(0x40034800), %g3 4001149c: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 400114a0: 82 00 60 01 inc %g1 400114a4: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] _RTEMS_Unlock_allocator(); 400114a8: d0 00 e1 84 ld [ %g3 + 0x184 ], %o0 400114ac: 94 10 20 00 clr %o2 400114b0: d2 02 20 08 ld [ %o0 + 8 ], %o1 400114b4: 40 00 0d 1f call 40014930 <_CORE_mutex_Surrender> 400114b8: 90 02 20 10 add %o0, 0x10, %o0 400114bc: 7f ff ff 18 call 4001111c <_Thread_Enable_dispatch> 400114c0: b0 10 20 0d mov 0xd, %i0 400114c4: 81 c7 e0 08 ret 400114c8: 81 e8 00 00 restore 400114cc: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 400114d0: 82 00 60 01 inc %g1 400114d4: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] 400114d8: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 400114dc: 82 00 60 01 inc %g1 400114e0: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] * Switch from using the memory allocation mutex to using a * dispatching disabled critical section. We have to do this * because this thread is going to block. */ _Thread_Disable_dispatch(); _RTEMS_Unlock_allocator(); 400114e4: d0 00 e1 84 ld [ %g3 + 0x184 ], %o0 400114e8: 94 10 20 00 clr %o2 400114ec: d2 02 20 08 ld [ %o0 + 8 ], %o1 400114f0: 40 00 0d 10 call 40014930 <_CORE_mutex_Surrender> 400114f4: 90 02 20 10 add %o0, 0x10, %o0 400114f8: 7f ff ff 09 call 4001111c <_Thread_Enable_dispatch> 400114fc: 01 00 00 00 nop executing->Wait.queue = &the_region->Wait_queue; 40011500: 82 04 20 10 add %l0, 0x10, %g1 executing->Wait.count = size; executing->Wait.return_argument = segment; _Thread_queue_Enter_critical_section( &the_region->Wait_queue ); _Thread_queue_Enqueue( &the_region->Wait_queue, timeout ); 40011504: 92 10 00 1b mov %i3, %o1 40011508: 90 10 00 01 mov %g1, %o0 * because this thread is going to block. */ _Thread_Disable_dispatch(); _RTEMS_Unlock_allocator(); executing->Wait.queue = &the_region->Wait_queue; 4001150c: c2 26 20 44 st %g1, [ %i0 + 0x44 ] executing->Wait.count = size; executing->Wait.return_argument = segment; _Thread_queue_Enter_critical_section( &the_region->Wait_queue ); _Thread_queue_Enqueue( &the_region->Wait_queue, timeout ); 40011510: 15 10 00 5d sethi %hi(0x40017400), %o2 40011514: 82 10 20 01 mov 1, %g1 40011518: 94 12 a3 0c or %o2, 0x30c, %o2 */ _Thread_Disable_dispatch(); _RTEMS_Unlock_allocator(); executing->Wait.queue = &the_region->Wait_queue; executing->Wait.id = id; 4001151c: e4 26 20 20 st %l2, [ %i0 + 0x20 ] executing->Wait.count = size; 40011520: f2 26 20 24 st %i1, [ %i0 + 0x24 ] executing->Wait.return_argument = segment; 40011524: f8 26 20 28 st %i4, [ %i0 + 0x28 ] _Thread_queue_Enter_critical_section( &the_region->Wait_queue ); _Thread_queue_Enqueue( &the_region->Wait_queue, timeout ); 40011528: 40 00 17 53 call 40017274 <_Thread_queue_Enqueue_with_handler> 4001152c: c2 24 20 40 st %g1, [ %l0 + 0x40 ] _Thread_Enable_dispatch(); 40011530: 7f ff fe fb call 4001111c <_Thread_Enable_dispatch> 40011534: 01 00 00 00 nop return (rtems_status_code) executing->Wait.return_code; 40011538: f0 06 20 34 ld [ %i0 + 0x34 ], %i0 } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 4001153c: 81 c7 e0 08 ret 40011540: 81 e8 00 00 restore 400115b0 : rtems_status_code rtems_region_return_segment( Objects_Id id, void *segment ) { 400115b0: 9d e3 bf 90 save %sp, -112, %sp #ifdef RTEMS_REGION_FREE_SHRED_PATTERN uint32_t size; #endif int status; _RTEMS_Lock_allocator(); 400115b4: 7f ff e4 bf call 4000a8b0 400115b8: 01 00 00 00 nop 400115bc: a2 10 00 08 mov %o0, %l1 400115c0: 03 10 00 d2 sethi %hi(0x40034800), %g1 400115c4: c2 00 60 b0 ld [ %g1 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> 400115c8: 80 a0 60 00 cmp %g1, 0 400115cc: 02 80 00 0b be 400115f8 400115d0: 03 10 00 d2 sethi %hi(0x40034800), %g1 400115d4: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED 400115d8: c2 00 62 90 ld [ %g1 + 0x290 ], %g1 ! 40034a90 <_System_state_Current> <== NOT EXECUTED 400115dc: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 400115e0: 08 80 00 05 bleu 400115f4 <== NOT EXECUTED 400115e4: 90 10 20 00 clr %o0 <== NOT EXECUTED 400115e8: 92 10 20 00 clr %o1 <== NOT EXECUTED 400115ec: 40 00 0f 41 call 400152f0 <_Internal_error_Occurred> <== NOT EXECUTED 400115f0: 94 10 20 12 mov 0x12, %o2 <== NOT EXECUTED 400115f4: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED 400115f8: e0 00 61 84 ld [ %g1 + 0x184 ], %l0 ! 40034984 <_RTEMS_Allocator_Mutex> Thread_Control *executing; ISR_Level level = *level_p; /* disabled when you get here */ executing = _Thread_Executing; 400115fc: 03 10 00 d2 sethi %hi(0x40034800), %g1 40011600: c4 00 61 8c ld [ %g1 + 0x18c ], %g2 ! 4003498c <_Thread_Executing> executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; 40011604: c0 20 a0 34 clr [ %g2 + 0x34 ] if ( !_CORE_mutex_Is_locked( the_mutex ) ) { 40011608: c2 04 20 60 ld [ %l0 + 0x60 ], %g1 4001160c: 80 a0 60 00 cmp %g1, 0 40011610: 22 80 00 33 be,a 400116dc 40011614: c2 04 20 6c ld [ %l0 + 0x6c ], %g1 <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_LOCKED; 40011618: c0 24 20 60 clr [ %l0 + 0x60 ] the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 4001161c: c2 00 a0 08 ld [ %g2 + 8 ], %g1 */ RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_inherit_priority( CORE_mutex_Attributes *the_attribute ) { return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT; 40011620: c6 04 20 58 ld [ %l0 + 0x58 ], %g3 executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 40011624: c2 24 20 70 st %g1, [ %l0 + 0x70 ] executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; 40011628: c4 24 20 6c st %g2, [ %l0 + 0x6c ] the_mutex->holder_id = executing->Object.id; the_mutex->nest_count = 1; 4001162c: 82 10 20 01 mov 1, %g1 if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || 40011630: 80 a0 e0 02 cmp %g3, 2 40011634: 02 80 00 05 be 40011648 40011638: c2 24 20 64 st %g1, [ %l0 + 0x64 ] 4001163c: 80 a0 e0 03 cmp %g3, 3 <== NOT EXECUTED 40011640: 32 80 00 06 bne,a 40011658 <== NOT EXECUTED 40011644: c2 04 20 58 ld [ %l0 + 0x58 ], %g1 <== NOT EXECUTED _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) executing->resource_count++; 40011648: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 4001164c: 82 00 60 01 inc %g1 40011650: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) { 40011654: c2 04 20 58 ld [ %l0 + 0x58 ], %g1 40011658: 80 a0 60 03 cmp %g1, 3 4001165c: 22 80 00 03 be,a 40011668 40011660: c6 04 20 5c ld [ %l0 + 0x5c ], %g3 <== NOT EXECUTED _ISR_Enable( level ); 40011664: 30 80 00 2c b,a 40011714 { Priority_Control ceiling; Priority_Control current; ceiling = the_mutex->Attributes.priority_ceiling; current = executing->current_priority; 40011668: c2 00 a0 14 ld [ %g2 + 0x14 ], %g1 <== NOT EXECUTED if ( current == ceiling ) { 4001166c: 80 a0 40 03 cmp %g1, %g3 <== NOT EXECUTED 40011670: 12 80 00 03 bne 4001167c <== NOT EXECUTED 40011674: 01 00 00 00 nop <== NOT EXECUTED _ISR_Enable( level ); 40011678: 30 80 00 27 b,a 40011714 <== NOT EXECUTED return 0; } if ( current > ceiling ) { 4001167c: 08 80 00 10 bleu 400116bc <== NOT EXECUTED 40011680: 82 10 20 06 mov 6, %g1 <== NOT EXECUTED rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40011684: 05 10 00 d2 sethi %hi(0x40034800), %g2 <== NOT EXECUTED 40011688: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 4001168c: 82 00 60 01 inc %g1 <== NOT EXECUTED 40011690: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] <== NOT EXECUTED _Thread_Disable_dispatch(); _ISR_Enable( level ); 40011694: 7f ff e4 8b call 4000a8c0 <== NOT EXECUTED 40011698: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED _Thread_Change_priority( 4001169c: d2 04 20 5c ld [ %l0 + 0x5c ], %o1 <== NOT EXECUTED 400116a0: d0 04 20 6c ld [ %l0 + 0x6c ], %o0 <== NOT EXECUTED 400116a4: 40 00 14 60 call 40016824 <_Thread_Change_priority> <== NOT EXECUTED 400116a8: 94 10 20 00 clr %o2 <== NOT EXECUTED the_mutex->holder, the_mutex->Attributes.priority_ceiling, FALSE ); _Thread_Enable_dispatch(); 400116ac: 7f ff ff b4 call 4001157c <_Thread_Enable_dispatch> <== NOT EXECUTED 400116b0: 01 00 00 00 nop <== NOT EXECUTED RTEMS_INLINE_ROUTINE Region_Control *_Region_Get ( Objects_Id id, Objects_Locations *location ) { return (Region_Control *) 400116b4: 10 80 00 32 b 4001177c <== NOT EXECUTED 400116b8: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; 400116bc: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_UNLOCKED; 400116c0: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ 400116c4: c0 24 20 64 clr [ %l0 + 0x64 ] <== NOT EXECUTED _Thread_Enable_dispatch(); return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; the_mutex->lock = CORE_MUTEX_UNLOCKED; 400116c8: c2 24 20 60 st %g1, [ %l0 + 0x60 ] <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ executing->resource_count--; /* undo locking above */ 400116cc: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 <== NOT EXECUTED 400116d0: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 400116d4: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] <== NOT EXECUTED _ISR_Enable( level ); 400116d8: 30 80 00 0f b,a 40011714 <== NOT EXECUTED /* * At this point, we know the mutex was not available. If this thread * is the thread that has locked the mutex, let's see if we are allowed * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { 400116dc: 80 a0 40 02 cmp %g1, %g2 <== NOT EXECUTED 400116e0: 32 80 00 13 bne,a 4001172c <== NOT EXECUTED 400116e4: 21 10 00 d2 sethi %hi(0x40034800), %l0 <== NOT EXECUTED switch ( the_mutex->Attributes.lock_nesting_behavior ) { 400116e8: c2 04 20 50 ld [ %l0 + 0x50 ], %g1 ! 40034850 <_Thread_BSP_context+0x28> <== NOT EXECUTED 400116ec: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400116f0: 22 80 00 07 be,a 4001170c <== NOT EXECUTED 400116f4: c2 04 20 64 ld [ %l0 + 0x64 ], %g1 <== NOT EXECUTED 400116f8: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 400116fc: 12 80 00 0c bne 4001172c <== NOT EXECUTED 40011700: 21 10 00 d2 sethi %hi(0x40034800), %l0 <== NOT EXECUTED case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; _ISR_Enable( level ); return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 40011704: 10 80 00 08 b 40011724 <== NOT EXECUTED 40011708: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { switch ( the_mutex->Attributes.lock_nesting_behavior ) { case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; 4001170c: 82 00 60 01 inc %g1 <== NOT EXECUTED 40011710: c2 24 20 64 st %g1, [ %l0 + 0x64 ] <== NOT EXECUTED _ISR_Enable( level ); 40011714: 7f ff e4 6b call 4000a8c0 40011718: 90 10 00 11 mov %l1, %o0 4001171c: 10 80 00 18 b 4001177c 40011720: 92 10 00 18 mov %i0, %o1 return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 40011724: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED _ISR_Enable( level ); 40011728: 30 bf ff fb b,a 40011714 <== NOT EXECUTED 4001172c: c6 04 21 84 ld [ %l0 + 0x184 ], %g3 <== NOT EXECUTED 40011730: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED 40011734: da 00 e0 08 ld [ %g3 + 8 ], %o5 <== NOT EXECUTED 40011738: c8 00 61 8c ld [ %g1 + 0x18c ], %g4 <== NOT EXECUTED 4001173c: 05 10 00 d2 sethi %hi(0x40034800), %g2 <== NOT EXECUTED 40011740: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40011744: da 21 20 20 st %o5, [ %g4 + 0x20 ] <== NOT EXECUTED 40011748: 82 00 60 01 inc %g1 <== NOT EXECUTED 4001174c: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] <== NOT EXECUTED 40011750: 82 00 e0 10 add %g3, 0x10, %g1 <== NOT EXECUTED 40011754: c2 21 20 44 st %g1, [ %g4 + 0x44 ] <== NOT EXECUTED 40011758: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED 4001175c: c2 20 e0 40 st %g1, [ %g3 + 0x40 ] <== NOT EXECUTED 40011760: 7f ff e4 58 call 4000a8c0 <== NOT EXECUTED 40011764: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 40011768: d0 04 21 84 ld [ %l0 + 0x184 ], %o0 <== NOT EXECUTED 4001176c: 92 10 20 00 clr %o1 <== NOT EXECUTED 40011770: 40 00 0c 4e call 400148a8 <_CORE_mutex_Seize_interrupt_blocking> <== NOT EXECUTED 40011774: 90 02 20 10 add %o0, 0x10, %o0 <== NOT EXECUTED 40011778: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED 4001177c: 11 10 00 d1 sethi %hi(0x40034400), %o0 40011780: 94 07 bf f4 add %fp, -12, %o2 40011784: 40 00 10 4c call 400158b4 <_Objects_Get_no_protection> 40011788: 90 12 22 c8 or %o0, 0x2c8, %o0 the_region = _Region_Get( id, &location ); switch ( location ) { 4001178c: c2 07 bf f4 ld [ %fp + -12 ], %g1 40011790: 80 a0 60 01 cmp %g1, 1 40011794: 02 80 00 0a be 400117bc 40011798: a0 10 00 08 mov %o0, %l0 4001179c: 80 a0 60 01 cmp %g1, 1 400117a0: 0a 80 00 22 bcs 40011828 400117a4: 92 10 00 19 mov %i1, %o1 400117a8: 80 a0 60 02 cmp %g1, 2 400117ac: 12 80 00 10 bne 400117ec 400117b0: b0 10 20 19 mov 0x19, %i0 400117b4: 10 80 00 10 b 400117f4 400117b8: 05 10 00 d2 sethi %hi(0x40034800), %g2 case OBJECTS_REMOTE: /* this error cannot be returned */ _RTEMS_Unlock_allocator(); 400117bc: 05 10 00 d2 sethi %hi(0x40034800), %g2 <== NOT EXECUTED 400117c0: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 400117c4: 82 00 60 01 inc %g1 <== NOT EXECUTED 400117c8: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] <== NOT EXECUTED 400117cc: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED 400117d0: d0 00 61 84 ld [ %g1 + 0x184 ], %o0 ! 40034984 <_RTEMS_Allocator_Mutex> <== NOT EXECUTED 400117d4: 94 10 20 00 clr %o2 <== NOT EXECUTED 400117d8: d2 02 20 08 ld [ %o0 + 8 ], %o1 <== NOT EXECUTED 400117dc: 40 00 0c 55 call 40014930 <_CORE_mutex_Surrender> <== NOT EXECUTED 400117e0: 90 02 20 10 add %o0, 0x10, %o0 <== NOT EXECUTED 400117e4: 7f ff ff 66 call 4001157c <_Thread_Enable_dispatch> <== NOT EXECUTED 400117e8: b0 10 20 19 mov 0x19, %i0 <== NOT EXECUTED 400117ec: 81 c7 e0 08 ret <== NOT EXECUTED 400117f0: 81 e8 00 00 restore <== NOT EXECUTED 400117f4: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 400117f8: 82 00 60 01 inc %g1 400117fc: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] return RTEMS_INTERNAL_ERROR; case OBJECTS_ERROR: _RTEMS_Unlock_allocator(); 40011800: 03 10 00 d2 sethi %hi(0x40034800), %g1 40011804: d0 00 61 84 ld [ %g1 + 0x184 ], %o0 ! 40034984 <_RTEMS_Allocator_Mutex> 40011808: 94 10 20 00 clr %o2 4001180c: d2 02 20 08 ld [ %o0 + 8 ], %o1 40011810: 40 00 0c 48 call 40014930 <_CORE_mutex_Surrender> 40011814: 90 02 20 10 add %o0, 0x10, %o0 40011818: 7f ff ff 59 call 4001157c <_Thread_Enable_dispatch> 4001181c: b0 10 20 04 mov 4, %i0 40011820: 81 c7 e0 08 ret 40011824: 81 e8 00 00 restore RTEMS_INLINE_ROUTINE boolean _Region_Free_segment ( Region_Control *the_region, void *the_segment ) { return _Heap_Free( &the_region->Memory, the_segment ); 40011828: 40 00 0d ae call 40014ee0 <_Heap_Free> 4001182c: 90 02 20 68 add %o0, 0x68, %o0 status = _Region_Free_segment( the_region, segment ); _Region_Debug_Walk( the_region, 4 ); if ( !status ) { 40011830: 80 a2 20 00 cmp %o0, 0 40011834: 12 80 00 0f bne 40011870 40011838: 05 10 00 d2 sethi %hi(0x40034800), %g2 4001183c: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> 40011840: 82 00 60 01 inc %g1 40011844: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] _RTEMS_Unlock_allocator(); 40011848: 03 10 00 d2 sethi %hi(0x40034800), %g1 4001184c: d0 00 61 84 ld [ %g1 + 0x184 ], %o0 ! 40034984 <_RTEMS_Allocator_Mutex> 40011850: 94 10 20 00 clr %o2 40011854: d2 02 20 08 ld [ %o0 + 8 ], %o1 40011858: 40 00 0c 36 call 40014930 <_CORE_mutex_Surrender> 4001185c: 90 02 20 10 add %o0, 0x10, %o0 40011860: 7f ff ff 47 call 4001157c <_Thread_Enable_dispatch> 40011864: b0 10 20 09 mov 9, %i0 40011868: 81 c7 e0 08 ret 4001186c: 81 e8 00 00 restore return RTEMS_INVALID_ADDRESS; } the_region->number_of_used_blocks -= 1; 40011870: c2 04 20 64 ld [ %l0 + 0x64 ], %g1 _Region_Process_queue(the_region); /* unlocks allocator internally */ 40011874: 90 10 00 10 mov %l0, %o0 if ( !status ) { _RTEMS_Unlock_allocator(); return RTEMS_INVALID_ADDRESS; } the_region->number_of_used_blocks -= 1; 40011878: 82 00 7f ff add %g1, -1, %g1 _Region_Process_queue(the_region); /* unlocks allocator internally */ 4001187c: b0 10 20 00 clr %i0 40011880: 40 00 24 e0 call 4001ac00 <_Region_Process_queue> 40011884: c2 24 20 64 st %g1, [ %l0 + 0x64 ] return RTEMS_SUCCESSFUL; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40011888: 81 c7 e0 08 ret 4001188c: 81 e8 00 00 restore 40006458 : uint32_t count, rtems_attribute attribute_set, rtems_task_priority priority_ceiling, rtems_id *id ) { 40006458: 9d e3 bf 80 save %sp, -128, %sp register Semaphore_Control *the_semaphore; CORE_mutex_Attributes the_mutex_attributes; CORE_semaphore_Attributes the_semaphore_attributes; if ( !rtems_is_name_valid( name ) ) 4000645c: a8 96 20 00 orcc %i0, 0, %l4 40006460: 02 80 00 2c be 40006510 40006464: b0 10 20 03 mov 3, %i0 return RTEMS_INVALID_NAME; if ( !id ) 40006468: 80 a7 20 00 cmp %i4, 0 4000646c: 02 80 00 29 be 40006510 40006470: b0 10 20 09 mov 9, %i0 return RTEMS_NOT_DEFINED; } else #endif if ( _Attributes_Is_inherit_priority( attribute_set ) || 40006474: a4 8e a0 40 andcc %i2, 0x40, %l2 40006478: 12 80 00 06 bne 40006490 4000647c: 82 0e a0 30 and %i2, 0x30, %g1 40006480: 80 8e a0 80 btst 0x80, %i2 40006484: 02 80 00 10 be 400064c4 40006488: a6 0e a0 30 and %i2, 0x30, %l3 RTEMS_INLINE_ROUTINE boolean _Attributes_Is_binary_semaphore( rtems_attribute attribute_set ) { return ((attribute_set & RTEMS_SEMAPHORE_CLASS) == RTEMS_BINARY_SEMAPHORE); 4000648c: 82 0e a0 30 and %i2, 0x30, %g1 _Attributes_Is_priority_ceiling( attribute_set ) ) { if ( ! ( (_Attributes_Is_binary_semaphore( attribute_set ) || 40006490: 80 a0 60 10 cmp %g1, 0x10 40006494: 02 80 00 05 be 400064a8 40006498: 80 8e a0 04 btst 4, %i2 4000649c: 80 a0 60 20 cmp %g1, 0x20 400064a0: 12 80 00 71 bne 40006664 400064a4: 80 8e a0 04 btst 4, %i2 400064a8: 02 80 00 6f be 40006664 400064ac: 80 a4 a0 00 cmp %l2, 0 _Attributes_Is_priority( attribute_set ) ) ) return RTEMS_NOT_DEFINED; } if ( _Attributes_Is_inherit_priority( attribute_set ) && 400064b0: 02 80 00 04 be 400064c0 400064b4: 80 8e a0 80 btst 0x80, %i2 400064b8: 32 80 00 16 bne,a 40006510 400064bc: b0 10 20 0b mov 0xb, %i0 RTEMS_INLINE_ROUTINE boolean _Attributes_Is_counting_semaphore( rtems_attribute attribute_set ) { return ((attribute_set & RTEMS_SEMAPHORE_CLASS) == RTEMS_COUNTING_SEMAPHORE); 400064c0: a6 0e a0 30 and %i2, 0x30, %l3 400064c4: 80 a0 00 13 cmp %g0, %l3 400064c8: a2 60 3f ff subx %g0, -1, %l1 _Attributes_Is_priority_ceiling( attribute_set ) ) return RTEMS_NOT_DEFINED; if ( !_Attributes_Is_counting_semaphore( attribute_set ) && ( count > 1 ) ) 400064cc: 80 a4 60 00 cmp %l1, 0 400064d0: 12 80 00 04 bne 400064e0 400064d4: 80 a6 60 01 cmp %i1, 1 400064d8: 18 80 00 0e bgu 40006510 400064dc: b0 10 20 0a mov 0xa, %i0 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 400064e0: 03 10 00 6b sethi %hi(0x4001ac00), %g1 400064e4: c4 00 61 d0 ld [ %g1 + 0x1d0 ], %g2 ! 4001add0 <_Thread_Dispatch_disable_level> 400064e8: 84 00 a0 01 inc %g2 400064ec: c4 20 61 d0 st %g2, [ %g1 + 0x1d0 ] * the inactive chain of free semaphore control blocks. */ RTEMS_INLINE_ROUTINE Semaphore_Control *_Semaphore_Allocate( void ) { return (Semaphore_Control *) _Objects_Allocate( &_Semaphore_Information ); 400064f0: 11 10 00 6b sethi %hi(0x4001ac00), %o0 400064f4: 40 00 07 06 call 4000810c <_Objects_Allocate> 400064f8: 90 12 20 88 or %o0, 0x88, %o0 ! 4001ac88 <_Semaphore_Information> _Thread_Disable_dispatch(); /* prevents deletion */ the_semaphore = _Semaphore_Allocate(); if ( !the_semaphore ) { 400064fc: a0 92 20 00 orcc %o0, 0, %l0 40006500: 12 80 00 06 bne 40006518 40006504: 80 a4 60 00 cmp %l1, 0 _Thread_Enable_dispatch(); 40006508: 7f ff ff c7 call 40006424 <_Thread_Enable_dispatch> 4000650c: b0 10 20 05 mov 5, %i0 40006510: 81 c7 e0 08 ret 40006514: 81 e8 00 00 restore * If it is not a counting semaphore, then it is either a * simple binary semaphore or a more powerful mutex style binary * semaphore. */ if ( !_Attributes_Is_counting_semaphore( attribute_set ) ) { 40006518: 12 80 00 32 bne 400065e0 4000651c: f4 24 20 10 st %i2, [ %l0 + 0x10 ] CORE_mutex_Status mutex_status; if ( _Attributes_Is_inherit_priority( attribute_set ) ) 40006520: 80 a4 a0 00 cmp %l2, 0 40006524: 12 80 00 06 bne 4000653c 40006528: 82 10 20 02 mov 2, %g1 the_mutex_attributes.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT; else if ( _Attributes_Is_priority_ceiling( attribute_set ) ) 4000652c: 80 8e a0 80 btst 0x80, %i2 40006530: 02 80 00 05 be 40006544 40006534: 80 8e a0 04 btst 4, %i2 the_mutex_attributes.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING; 40006538: 82 10 20 03 mov 3, %g1 <== NOT EXECUTED 4000653c: 10 80 00 05 b 40006550 40006540: c2 27 bf e8 st %g1, [ %fp + -24 ] else if ( _Attributes_Is_priority( attribute_set ) ) 40006544: 12 bf ff fe bne 4000653c 40006548: 82 10 20 01 mov 1, %g1 the_mutex_attributes.discipline = CORE_MUTEX_DISCIPLINES_PRIORITY; else the_mutex_attributes.discipline = CORE_MUTEX_DISCIPLINES_FIFO; 4000654c: c0 27 bf e8 clr [ %fp + -24 ] if ( _Attributes_Is_binary_semaphore( attribute_set ) ) { 40006550: 80 a4 e0 10 cmp %l3, 0x10 40006554: 12 80 00 0f bne 40006590 40006558: 82 10 20 02 mov 2, %g1 the_mutex_attributes.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES; switch ( the_mutex_attributes.discipline ) { 4000655c: c2 07 bf e8 ld [ %fp + -24 ], %g1 40006560: 80 a0 60 01 cmp %g1, 1 40006564: 08 80 00 07 bleu 40006580 40006568: c0 27 bf e0 clr [ %fp + -32 ] 4000656c: 80 a0 60 03 cmp %g1, 3 40006570: 38 80 00 0b bgu,a 4000659c 40006574: 82 1e 60 01 xor %i1, 1, %g1 <== NOT EXECUTED case CORE_MUTEX_DISCIPLINES_PRIORITY: the_mutex_attributes.only_owner_release = FALSE; break; case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING: case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT: the_mutex_attributes.only_owner_release = TRUE; 40006578: 10 80 00 04 b 40006588 4000657c: 82 10 20 01 mov 1, %g1 the_mutex_attributes.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES; switch ( the_mutex_attributes.discipline ) { case CORE_MUTEX_DISCIPLINES_FIFO: case CORE_MUTEX_DISCIPLINES_PRIORITY: the_mutex_attributes.only_owner_release = FALSE; 40006580: 10 80 00 06 b 40006598 40006584: c0 27 bf e4 clr [ %fp + -28 ] break; case CORE_MUTEX_DISCIPLINES_PRIORITY_CEILING: case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT: the_mutex_attributes.only_owner_release = TRUE; 40006588: 10 80 00 04 b 40006598 4000658c: c2 27 bf e4 st %g1, [ %fp + -28 ] break; } } else { the_mutex_attributes.lock_nesting_behavior = CORE_MUTEX_NESTING_BLOCKS; the_mutex_attributes.only_owner_release = FALSE; 40006590: c0 27 bf e4 clr [ %fp + -28 ] case CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT: the_mutex_attributes.only_owner_release = TRUE; break; } } else { the_mutex_attributes.lock_nesting_behavior = CORE_MUTEX_NESTING_BLOCKS; 40006594: c2 27 bf e0 st %g1, [ %fp + -32 ] the_mutex_attributes.only_owner_release = FALSE; } the_mutex_attributes.priority_ceiling = priority_ceiling; mutex_status = _CORE_mutex_Initialize( 40006598: 82 1e 60 01 xor %i1, 1, %g1 4000659c: 80 a0 00 01 cmp %g0, %g1 } else { the_mutex_attributes.lock_nesting_behavior = CORE_MUTEX_NESTING_BLOCKS; the_mutex_attributes.only_owner_release = FALSE; } the_mutex_attributes.priority_ceiling = priority_ceiling; 400065a0: f6 27 bf ec st %i3, [ %fp + -20 ] mutex_status = _CORE_mutex_Initialize( 400065a4: 94 60 3f ff subx %g0, -1, %o2 400065a8: 90 04 20 14 add %l0, 0x14, %o0 400065ac: 40 00 04 63 call 40007738 <_CORE_mutex_Initialize> 400065b0: 92 07 bf e0 add %fp, -32, %o1 &the_semaphore->Core_control.mutex, &the_mutex_attributes, (count == 1) ? CORE_MUTEX_UNLOCKED : CORE_MUTEX_LOCKED ); if ( mutex_status == CORE_MUTEX_STATUS_CEILING_VIOLATED ) { 400065b4: 80 a2 20 06 cmp %o0, 6 400065b8: 12 80 00 17 bne 40006614 400065bc: 92 10 00 10 mov %l0, %o1 RTEMS_INLINE_ROUTINE void _Semaphore_Free ( Semaphore_Control *the_semaphore ) { _Objects_Free( &_Semaphore_Information, &the_semaphore->Object ); 400065c0: 11 10 00 6b sethi %hi(0x4001ac00), %o0 <== NOT EXECUTED 400065c4: 90 12 20 88 or %o0, 0x88, %o0 ! 4001ac88 <_Semaphore_Information> <== NOT EXECUTED 400065c8: 40 00 07 d3 call 40008514 <_Objects_Free> <== NOT EXECUTED 400065cc: b0 10 20 13 mov 0x13, %i0 <== NOT EXECUTED _Semaphore_Free( the_semaphore ); _Thread_Enable_dispatch(); 400065d0: 7f ff ff 95 call 40006424 <_Thread_Enable_dispatch> <== NOT EXECUTED 400065d4: 01 00 00 00 nop <== NOT EXECUTED 400065d8: 81 c7 e0 08 ret <== NOT EXECUTED 400065dc: 81 e8 00 00 restore <== NOT EXECUTED return RTEMS_INVALID_PRIORITY; } } else { if ( _Attributes_Is_priority( attribute_set ) ) 400065e0: 80 8e a0 04 btst 4, %i2 400065e4: 22 80 00 04 be,a 400065f4 400065e8: c0 27 bf f4 clr [ %fp + -12 ] the_semaphore_attributes.discipline = CORE_SEMAPHORE_DISCIPLINES_PRIORITY; 400065ec: 82 10 20 01 mov 1, %g1 400065f0: c2 27 bf f4 st %g1, [ %fp + -12 ] /* * This effectively disables limit checking. */ the_semaphore_attributes.maximum_count = 0xFFFFFFFF; 400065f4: 82 10 3f ff mov -1, %g1 /* * The following are just to make Purify happy. */ the_mutex_attributes.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES; 400065f8: c0 27 bf e0 clr [ %fp + -32 ] the_mutex_attributes.priority_ceiling = PRIORITY_MINIMUM; 400065fc: c0 27 bf ec clr [ %fp + -20 ] _CORE_semaphore_Initialize( 40006600: 94 10 00 19 mov %i1, %o2 /* * This effectively disables limit checking. */ the_semaphore_attributes.maximum_count = 0xFFFFFFFF; 40006604: c2 27 bf f0 st %g1, [ %fp + -16 ] */ the_mutex_attributes.lock_nesting_behavior = CORE_MUTEX_NESTING_ACQUIRES; the_mutex_attributes.priority_ceiling = PRIORITY_MINIMUM; _CORE_semaphore_Initialize( 40006608: 90 04 20 14 add %l0, 0x14, %o0 4000660c: 40 00 04 fa call 400079f4 <_CORE_semaphore_Initialize> 40006610: 92 07 bf f0 add %fp, -16, %o1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40006614: 03 10 00 6b sethi %hi(0x4001ac00), %g1 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, the_object ); 40006618: c6 04 20 08 ld [ %l0 + 8 ], %g3 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 4000661c: 88 10 60 88 or %g1, 0x88, %g4 40006620: c4 11 20 10 lduh [ %g4 + 0x10 ], %g2 40006624: 03 00 00 3f sethi %hi(0xfc00), %g1 40006628: 82 10 63 ff or %g1, 0x3ff, %g1 ! ffff 4000662c: 82 08 c0 01 and %g3, %g1, %g1 40006630: 80 a0 40 02 cmp %g1, %g2 40006634: 38 80 00 06 bgu,a 4000664c 40006638: c2 04 20 08 ld [ %l0 + 8 ], %g1 <== NOT EXECUTED information->local_table[ index ] = the_object; 4000663c: c4 01 20 20 ld [ %g4 + 0x20 ], %g2 40006640: 83 28 60 02 sll %g1, 2, %g1 40006644: e0 20 80 01 st %l0, [ %g2 + %g1 ] &_Semaphore_Information, &the_semaphore->Object, (Objects_Name) name ); *id = the_semaphore->Object.id; 40006648: c2 04 20 08 ld [ %l0 + 8 ], %g1 if ( information->is_string ) /* _Objects_Copy_name_string( name, the_object->name ); */ the_object->name = name; else /* _Objects_Copy_name_raw( name, the_object->name, information->name_length ); */ the_object->name = name; 4000664c: e8 24 20 0c st %l4, [ %l0 + 0xc ] 40006650: c2 27 00 00 st %g1, [ %i4 ] the_semaphore->Object.id, name, 0 /* Not used */ ); #endif _Thread_Enable_dispatch(); 40006654: 7f ff ff 74 call 40006424 <_Thread_Enable_dispatch> 40006658: b0 10 20 00 clr %i0 4000665c: 81 c7 e0 08 ret 40006660: 81 e8 00 00 restore return RTEMS_SUCCESSFUL; 40006664: b0 10 20 0b mov 0xb, %i0 } 40006668: 81 c7 e0 08 ret 4000666c: 81 e8 00 00 restore 400066a4 : #endif rtems_status_code rtems_semaphore_delete( rtems_id id ) { 400066a4: 9d e3 bf 90 save %sp, -112, %sp RTEMS_INLINE_ROUTINE Semaphore_Control *_Semaphore_Get ( Objects_Id id, Objects_Locations *location ) { return (Semaphore_Control *) 400066a8: 11 10 00 6b sethi %hi(0x4001ac00), %o0 400066ac: 92 10 00 18 mov %i0, %o1 400066b0: 90 12 20 88 or %o0, 0x88, %o0 400066b4: 40 00 07 da call 4000861c <_Objects_Get> 400066b8: 94 07 bf f4 add %fp, -12, %o2 register Semaphore_Control *the_semaphore; Objects_Locations location; the_semaphore = _Semaphore_Get( id, &location ); switch ( location ) { 400066bc: c2 07 bf f4 ld [ %fp + -12 ], %g1 400066c0: 80 a0 60 00 cmp %g1, 0 400066c4: 02 80 00 07 be 400066e0 400066c8: b0 10 00 08 mov %o0, %i0 400066cc: 80 a0 60 02 cmp %g1, 2 400066d0: 08 80 00 10 bleu 40006710 400066d4: b0 10 20 04 mov 4, %i0 400066d8: 81 c7 e0 08 ret <== NOT EXECUTED 400066dc: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED 400066e0: c2 02 20 10 ld [ %o0 + 0x10 ], %g1 case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) { 400066e4: 84 88 60 30 andcc %g1, 0x30, %g2 400066e8: 22 80 00 12 be,a 40006730 400066ec: 90 02 20 14 add %o0, 0x14, %o0 if ( _CORE_mutex_Is_locked( &the_semaphore->Core_control.mutex ) && 400066f0: c2 02 20 64 ld [ %o0 + 0x64 ], %g1 400066f4: 80 a0 60 00 cmp %g1, 0 400066f8: 12 80 00 08 bne 40006718 400066fc: 80 a0 a0 20 cmp %g2, 0x20 40006700: 02 80 00 07 be 4000671c 40006704: 90 06 20 14 add %i0, 0x14, %o0 !_Attributes_Is_simple_binary_semaphore( the_semaphore->attribute_set ) ) { _Thread_Enable_dispatch(); 40006708: 7f ff ff da call 40006670 <_Thread_Enable_dispatch> 4000670c: b0 10 20 0c mov 0xc, %i0 40006710: 81 c7 e0 08 ret 40006714: 81 e8 00 00 restore return RTEMS_RESOURCE_IN_USE; } _CORE_mutex_Flush( 40006718: 90 06 20 14 add %i0, 0x14, %o0 4000671c: 92 10 20 00 clr %o1 40006720: 40 00 04 02 call 40007728 <_CORE_mutex_Flush> 40006724: 94 10 20 04 mov 4, %o2 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40006728: 10 80 00 06 b 40006740 4000672c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 &the_semaphore->Core_control.mutex, SEMAPHORE_MP_OBJECT_WAS_DELETED, CORE_MUTEX_WAS_DELETED ); } else { _CORE_semaphore_Flush( 40006730: 92 10 20 00 clr %o1 40006734: 40 00 04 ac call 400079e4 <_CORE_semaphore_Flush> 40006738: 94 10 20 02 mov 2, %o2 4000673c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); 40006740: c6 06 20 08 ld [ %i0 + 8 ], %g3 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 40006744: 90 10 60 88 or %g1, 0x88, %o0 40006748: c4 12 20 10 lduh [ %o0 + 0x10 ], %g2 4000674c: 03 00 00 3f sethi %hi(0xfc00), %g1 40006750: 82 10 63 ff or %g1, 0x3ff, %g1 ! ffff 40006754: 82 08 c0 01 and %g3, %g1, %g1 40006758: 80 a0 40 02 cmp %g1, %g2 4000675c: 18 80 00 05 bgu 40006770 40006760: 92 10 00 18 mov %i0, %o1 information->local_table[ index ] = the_object; 40006764: c4 02 20 20 ld [ %o0 + 0x20 ], %g2 40006768: 83 28 60 02 sll %g1, 2, %g1 4000676c: c0 20 80 01 clr [ %g2 + %g1 ] uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); /* _Objects_Clear_name( the_object->name, information->name_length ); */ the_object->name = 0; 40006770: c0 26 20 0c clr [ %i0 + 0xc ] RTEMS_INLINE_ROUTINE void _Semaphore_Free ( Semaphore_Control *the_semaphore ) { _Objects_Free( &_Semaphore_Information, &the_semaphore->Object ); 40006774: 40 00 07 68 call 40008514 <_Objects_Free> 40006778: b0 10 20 00 clr %i0 0, /* Not used */ 0 /* Not used */ ); } #endif _Thread_Enable_dispatch(); 4000677c: 7f ff ff bd call 40006670 <_Thread_Enable_dispatch> 40006780: 01 00 00 00 nop return RTEMS_SUCCESSFUL; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40006784: 81 c7 e0 08 ret 40006788: 81 e8 00 00 restore 40006be8 : #endif rtems_status_code rtems_semaphore_flush( rtems_id id ) { 40006be8: 9d e3 bf 90 save %sp, -112, %sp RTEMS_INLINE_ROUTINE Semaphore_Control *_Semaphore_Get ( Objects_Id id, Objects_Locations *location ) { return (Semaphore_Control *) 40006bec: 11 10 00 73 sethi %hi(0x4001cc00), %o0 40006bf0: 92 10 00 18 mov %i0, %o1 40006bf4: 90 12 22 60 or %o0, 0x260, %o0 40006bf8: 40 00 08 57 call 40008d54 <_Objects_Get> 40006bfc: 94 07 bf f4 add %fp, -12, %o2 register Semaphore_Control *the_semaphore; Objects_Locations location; the_semaphore = _Semaphore_Get( id, &location ); switch ( location ) { 40006c00: c2 07 bf f4 ld [ %fp + -12 ], %g1 40006c04: 80 a0 60 00 cmp %g1, 0 40006c08: 22 80 00 07 be,a 40006c24 40006c0c: c2 02 20 10 ld [ %o0 + 0x10 ], %g1 40006c10: 80 a0 60 02 cmp %g1, 2 <== NOT EXECUTED 40006c14: 08 80 00 19 bleu 40006c78 <== NOT EXECUTED 40006c18: b0 10 20 04 mov 4, %i0 <== NOT EXECUTED 40006c1c: 81 c7 e0 08 ret <== NOT EXECUTED 40006c20: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) { 40006c24: 80 88 60 30 btst 0x30, %g1 40006c28: 02 80 00 06 be 40006c40 40006c2c: 90 02 20 14 add %o0, 0x14, %o0 _CORE_mutex_Flush( 40006c30: 92 10 20 00 clr %o1 40006c34: 40 00 04 8b call 40007e60 <_CORE_mutex_Flush> 40006c38: 94 10 20 01 mov 1, %o2 40006c3c: 30 80 00 04 b,a 40006c4c &the_semaphore->Core_control.mutex, SEND_OBJECT_WAS_DELETED, CORE_MUTEX_STATUS_UNSATISFIED_NOWAIT ); } else { _CORE_semaphore_Flush( 40006c40: 92 10 20 00 clr %o1 <== NOT EXECUTED 40006c44: 40 00 05 36 call 4000811c <_CORE_semaphore_Flush> <== NOT EXECUTED 40006c48: 94 10 20 01 mov 1, %o2 <== NOT EXECUTED #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40006c4c: 03 10 00 73 sethi %hi(0x4001cc00), %g1 40006c50: c4 00 63 b0 ld [ %g1 + 0x3b0 ], %g2 ! 4001cfb0 <_Thread_Dispatch_disable_level> 40006c54: b0 10 20 00 clr %i0 40006c58: 84 00 bf ff add %g2, -1, %g2 40006c5c: c4 20 63 b0 st %g2, [ %g1 + 0x3b0 ] 40006c60: c2 00 63 b0 ld [ %g1 + 0x3b0 ], %g1 40006c64: 80 a0 60 00 cmp %g1, 0 40006c68: 12 80 00 04 bne 40006c78 40006c6c: 01 00 00 00 nop _Thread_Dispatch(); 40006c70: 40 00 0c ee call 4000a028 <_Thread_Dispatch> 40006c74: 01 00 00 00 nop _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40006c78: 81 c7 e0 08 ret 40006c7c: 81 e8 00 00 restore 400067c0 : rtems_status_code rtems_semaphore_obtain( rtems_id id, uint32_t option_set, rtems_interval timeout ) { 400067c0: 9d e3 bf 90 save %sp, -112, %sp Objects_Id id, Objects_Locations *location, ISR_Level *level ) { return (Semaphore_Control *) 400067c4: 11 10 00 6b sethi %hi(0x4001ac00), %o0 400067c8: 92 10 00 18 mov %i0, %o1 400067cc: 90 12 20 88 or %o0, 0x88, %o0 400067d0: 94 07 bf f4 add %fp, -12, %o2 400067d4: 40 00 07 74 call 400085a4 <_Objects_Get_isr_disable> 400067d8: 96 07 bf f0 add %fp, -16, %o3 register Semaphore_Control *the_semaphore; Objects_Locations location; ISR_Level level; the_semaphore = _Semaphore_Get_interrupt_disable( id, &location, &level ); switch ( location ) { 400067dc: c2 07 bf f4 ld [ %fp + -12 ], %g1 400067e0: 80 a0 60 00 cmp %g1, 0 400067e4: 02 80 00 07 be 40006800 400067e8: a0 10 00 08 mov %o0, %l0 400067ec: 80 a0 60 02 cmp %g1, 2 400067f0: 08 80 00 ab bleu 40006a9c 400067f4: 90 10 20 04 mov 4, %o0 400067f8: 10 80 00 a9 b 40006a9c <== NOT EXECUTED 400067fc: 90 10 20 19 mov 0x19, %o0 <== NOT EXECUTED case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) { 40006800: c2 02 20 10 ld [ %o0 + 0x10 ], %g1 40006804: 80 88 60 30 btst 0x30, %g1 40006808: 02 80 00 7c be 400069f8 4000680c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 _CORE_mutex_Seize( 40006810: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40006814: c2 00 61 d0 ld [ %g1 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> 40006818: 80 a0 60 00 cmp %g1, 0 4000681c: 02 80 00 0e be 40006854 40006820: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40006824: 80 8e 60 01 btst 1, %i1 40006828: 12 80 00 0c bne 40006858 4000682c: c4 00 62 ac ld [ %g1 + 0x2ac ], %g2 40006830: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40006834: c2 00 63 b0 ld [ %g1 + 0x3b0 ], %g1 ! 4001afb0 <_System_state_Current> 40006838: 80 a0 60 01 cmp %g1, 1 4000683c: 08 80 00 05 bleu 40006850 40006840: 90 10 20 00 clr %o0 40006844: 92 10 20 00 clr %o1 <== NOT EXECUTED 40006848: 40 00 06 04 call 40008058 <_Internal_error_Occurred> <== NOT EXECUTED 4000684c: 94 10 20 12 mov 0x12, %o2 <== NOT EXECUTED Thread_Control *executing; ISR_Level level = *level_p; /* disabled when you get here */ executing = _Thread_Executing; 40006850: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40006854: c4 00 62 ac ld [ %g1 + 0x2ac ], %g2 ! 4001aeac <_Thread_Executing> CORE_mutex_Control *the_mutex, ISR_Level *level_p ) { Thread_Control *executing; ISR_Level level = *level_p; 40006858: d0 07 bf f0 ld [ %fp + -16 ], %o0 /* disabled when you get here */ executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; 4000685c: c0 20 a0 34 clr [ %g2 + 0x34 ] if ( !_CORE_mutex_Is_locked( the_mutex ) ) { 40006860: c2 04 20 64 ld [ %l0 + 0x64 ], %g1 40006864: 80 a0 60 00 cmp %g1, 0 40006868: 22 80 00 33 be,a 40006934 4000686c: c2 04 20 70 ld [ %l0 + 0x70 ], %g1 the_mutex->lock = CORE_MUTEX_LOCKED; 40006870: c0 24 20 64 clr [ %l0 + 0x64 ] the_mutex->holder = executing; 40006874: c4 24 20 70 st %g2, [ %l0 + 0x70 ] the_mutex->holder_id = executing->Object.id; 40006878: c2 00 a0 08 ld [ %g2 + 8 ], %g1 */ RTEMS_INLINE_ROUTINE boolean _CORE_mutex_Is_inherit_priority( CORE_mutex_Attributes *the_attribute ) { return the_attribute->discipline == CORE_MUTEX_DISCIPLINES_PRIORITY_INHERIT; 4000687c: c6 04 20 5c ld [ %l0 + 0x5c ], %g3 executing = _Thread_Executing; executing->Wait.return_code = CORE_MUTEX_STATUS_SUCCESSFUL; if ( !_CORE_mutex_Is_locked( the_mutex ) ) { the_mutex->lock = CORE_MUTEX_LOCKED; the_mutex->holder = executing; the_mutex->holder_id = executing->Object.id; 40006880: c2 24 20 74 st %g1, [ %l0 + 0x74 ] the_mutex->nest_count = 1; 40006884: 82 10 20 01 mov 1, %g1 if ( _CORE_mutex_Is_inherit_priority( &the_mutex->Attributes ) || 40006888: 80 a0 e0 02 cmp %g3, 2 4000688c: 02 80 00 05 be 400068a0 40006890: c2 24 20 68 st %g1, [ %l0 + 0x68 ] 40006894: 80 a0 e0 03 cmp %g3, 3 <== NOT EXECUTED 40006898: 32 80 00 06 bne,a 400068b0 <== NOT EXECUTED 4000689c: c2 04 20 5c ld [ %l0 + 0x5c ], %g1 <== NOT EXECUTED _CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) executing->resource_count++; 400068a0: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 400068a4: 82 00 60 01 inc %g1 400068a8: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] if ( !_CORE_mutex_Is_priority_ceiling( &the_mutex->Attributes ) ) { 400068ac: c2 04 20 5c ld [ %l0 + 0x5c ], %g1 400068b0: 80 a0 60 03 cmp %g1, 3 400068b4: 22 80 00 03 be,a 400068c0 400068b8: c6 04 20 60 ld [ %l0 + 0x60 ], %g3 <== NOT EXECUTED _ISR_Enable( level ); 400068bc: 30 80 00 2e b,a 40006974 { Priority_Control ceiling; Priority_Control current; ceiling = the_mutex->Attributes.priority_ceiling; current = executing->current_priority; 400068c0: c2 00 a0 14 ld [ %g2 + 0x14 ], %g1 <== NOT EXECUTED if ( current == ceiling ) { 400068c4: 80 a0 40 03 cmp %g1, %g3 <== NOT EXECUTED 400068c8: 12 80 00 03 bne 400068d4 <== NOT EXECUTED 400068cc: 01 00 00 00 nop <== NOT EXECUTED _ISR_Enable( level ); 400068d0: 30 80 00 29 b,a 40006974 <== NOT EXECUTED return 0; } if ( current > ceiling ) { 400068d4: 28 80 00 10 bleu,a 40006914 <== NOT EXECUTED 400068d8: 82 10 20 06 mov 6, %g1 <== NOT EXECUTED rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 400068dc: 05 10 00 6b sethi %hi(0x4001ac00), %g2 <== NOT EXECUTED 400068e0: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 ! 4001add0 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 400068e4: 82 00 60 01 inc %g1 <== NOT EXECUTED 400068e8: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] <== NOT EXECUTED _Thread_Disable_dispatch(); _ISR_Enable( level ); 400068ec: 7f ff ed 7c call 40001edc <== NOT EXECUTED 400068f0: 01 00 00 00 nop <== NOT EXECUTED _Thread_Change_priority( 400068f4: d2 04 20 60 ld [ %l0 + 0x60 ], %o1 <== NOT EXECUTED 400068f8: d0 04 20 70 ld [ %l0 + 0x70 ], %o0 <== NOT EXECUTED 400068fc: 40 00 0b 10 call 4000953c <_Thread_Change_priority> <== NOT EXECUTED 40006900: 94 10 20 00 clr %o2 <== NOT EXECUTED the_mutex->holder, the_mutex->Attributes.priority_ceiling, FALSE ); _Thread_Enable_dispatch(); 40006904: 7f ff ff a2 call 4000678c <_Thread_Enable_dispatch> <== NOT EXECUTED 40006908: 01 00 00 00 nop <== NOT EXECUTED id, ((_Options_Is_no_wait( option_set )) ? FALSE : TRUE), timeout, level ); return _Semaphore_Translate_core_mutex_return_code( 4000690c: 10 80 00 36 b 400069e4 <== NOT EXECUTED 40006910: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; 40006914: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED the_mutex->lock = CORE_MUTEX_UNLOCKED; 40006918: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ 4000691c: c0 24 20 68 clr [ %l0 + 0x68 ] <== NOT EXECUTED _Thread_Enable_dispatch(); return 0; } /* if ( current < ceiling ) */ { executing->Wait.return_code = CORE_MUTEX_STATUS_CEILING_VIOLATED; the_mutex->lock = CORE_MUTEX_UNLOCKED; 40006920: c2 24 20 64 st %g1, [ %l0 + 0x64 ] <== NOT EXECUTED the_mutex->nest_count = 0; /* undo locking above */ executing->resource_count--; /* undo locking above */ 40006924: c2 00 a0 1c ld [ %g2 + 0x1c ], %g1 <== NOT EXECUTED 40006928: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 4000692c: c2 20 a0 1c st %g1, [ %g2 + 0x1c ] <== NOT EXECUTED _ISR_Enable( level ); 40006930: 30 80 00 11 b,a 40006974 <== NOT EXECUTED /* * At this point, we know the mutex was not available. If this thread * is the thread that has locked the mutex, let's see if we are allowed * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { 40006934: 80 a0 40 02 cmp %g1, %g2 40006938: 12 80 00 13 bne 40006984 4000693c: 80 8e 60 01 btst 1, %i1 switch ( the_mutex->Attributes.lock_nesting_behavior ) { 40006940: c2 04 20 54 ld [ %l0 + 0x54 ], %g1 40006944: 80 a0 60 00 cmp %g1, 0 40006948: 22 80 00 07 be,a 40006964 4000694c: c2 04 20 68 ld [ %l0 + 0x68 ], %g1 40006950: 80 a0 60 01 cmp %g1, 1 40006954: 12 80 00 0c bne 40006984 40006958: 80 8e 60 01 btst 1, %i1 case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; _ISR_Enable( level ); return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 4000695c: 10 80 00 05 b 40006970 <== NOT EXECUTED 40006960: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED * to nest access. */ if ( _Thread_Is_executing( the_mutex->holder ) ) { switch ( the_mutex->Attributes.lock_nesting_behavior ) { case CORE_MUTEX_NESTING_ACQUIRES: the_mutex->nest_count++; 40006964: 82 00 60 01 inc %g1 40006968: c2 24 20 68 st %g1, [ %l0 + 0x68 ] _ISR_Enable( level ); 4000696c: 30 80 00 02 b,a 40006974 return 0; case CORE_MUTEX_NESTING_IS_ERROR: executing->Wait.return_code = CORE_MUTEX_STATUS_NESTING_NOT_ALLOWED; 40006970: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] <== NOT EXECUTED _ISR_Enable( level ); 40006974: 7f ff ed 5a call 40001edc 40006978: 01 00 00 00 nop 4000697c: 10 80 00 1a b 400069e4 40006980: 03 10 00 6b sethi %hi(0x4001ac00), %g1 case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) { _CORE_mutex_Seize( 40006984: 02 80 00 08 be 400069a4 40006988: 23 10 00 6b sethi %hi(0x4001ac00), %l1 4000698c: 7f ff ed 54 call 40001edc 40006990: d0 07 bf f0 ld [ %fp + -16 ], %o0 40006994: c4 04 62 ac ld [ %l1 + 0x2ac ], %g2 40006998: 82 10 20 01 mov 1, %g1 4000699c: 10 80 00 11 b 400069e0 400069a0: c2 20 a0 34 st %g1, [ %g2 + 0x34 ] 400069a4: c6 04 62 ac ld [ %l1 + 0x2ac ], %g3 RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section ( Thread_queue_Control *the_thread_queue ) { the_thread_queue->sync_state = THREAD_QUEUE_NOTHING_HAPPENED; 400069a8: 82 10 20 01 mov 1, %g1 400069ac: 05 10 00 6b sethi %hi(0x4001ac00), %g2 400069b0: c2 24 20 44 st %g1, [ %l0 + 0x44 ] 400069b4: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 400069b8: f0 20 e0 20 st %i0, [ %g3 + 0x20 ] 400069bc: 82 00 60 01 inc %g1 400069c0: a0 04 20 14 add %l0, 0x14, %l0 400069c4: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] 400069c8: e0 20 e0 44 st %l0, [ %g3 + 0x44 ] 400069cc: 7f ff ed 44 call 40001edc 400069d0: d0 07 bf f0 ld [ %fp + -16 ], %o0 400069d4: 90 10 00 10 mov %l0, %o0 400069d8: 40 00 03 86 call 400077f0 <_CORE_mutex_Seize_interrupt_blocking> 400069dc: 92 10 00 1a mov %i2, %o1 id, ((_Options_Is_no_wait( option_set )) ? FALSE : TRUE), timeout, level ); return _Semaphore_Translate_core_mutex_return_code( 400069e0: 03 10 00 6b sethi %hi(0x4001ac00), %g1 400069e4: c2 00 62 ac ld [ %g1 + 0x2ac ], %g1 ! 4001aeac <_Thread_Executing> 400069e8: 40 00 00 62 call 40006b70 <_Semaphore_Translate_core_mutex_return_code> 400069ec: d0 00 60 34 ld [ %g1 + 0x34 ], %o0 return _Semaphore_Translate_core_semaphore_return_code( _Thread_Executing->Wait.return_code ); } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 400069f0: 81 c7 e0 08 ret 400069f4: 91 e8 00 08 restore %g0, %o0, %o0 Thread_Control *executing; ISR_Level level = *level_p; /* disabled when you get here */ executing = _Thread_Executing; 400069f8: e2 00 62 ac ld [ %g1 + 0x2ac ], %l1 Watchdog_Interval timeout, ISR_Level *level_p ) { Thread_Control *executing; ISR_Level level = *level_p; 400069fc: d0 07 bf f0 ld [ %fp + -16 ], %o0 /* disabled when you get here */ executing = _Thread_Executing; executing->Wait.return_code = CORE_SEMAPHORE_STATUS_SUCCESSFUL; 40006a00: c0 24 60 34 clr [ %l1 + 0x34 ] if ( the_semaphore->count != 0 ) { 40006a04: c2 04 20 5c ld [ %l0 + 0x5c ], %g1 40006a08: 80 a0 60 00 cmp %g1, 0 40006a0c: 02 80 00 08 be 40006a2c 40006a10: 80 8e 60 01 btst 1, %i1 the_semaphore->count -= 1; 40006a14: 82 00 7f ff add %g1, -1, %g1 40006a18: c2 24 20 5c st %g1, [ %l0 + 0x5c ] _ISR_Enable( level ); 40006a1c: 7f ff ed 30 call 40001edc 40006a20: 01 00 00 00 nop id, ((_Options_Is_no_wait( option_set )) ? FALSE : TRUE), timeout, &level ); return _Semaphore_Translate_core_semaphore_return_code( 40006a24: 10 80 00 1b b 40006a90 40006a28: 03 10 00 6b sethi %hi(0x4001ac00), %g1 return; } if ( !wait ) { 40006a2c: 02 80 00 07 be 40006a48 40006a30: 05 10 00 6b sethi %hi(0x4001ac00), %g2 _ISR_Enable( level ); 40006a34: 7f ff ed 2a call 40001edc 40006a38: 01 00 00 00 nop executing->Wait.return_code = CORE_SEMAPHORE_STATUS_UNSATISFIED_NOWAIT; 40006a3c: 82 10 20 01 mov 1, %g1 ! 1 40006a40: 10 80 00 13 b 40006a8c 40006a44: c2 24 60 34 st %g1, [ %l1 + 0x34 ] 40006a48: c2 00 a1 d0 ld [ %g2 + 0x1d0 ], %g1 40006a4c: 82 00 60 01 inc %g1 40006a50: c2 20 a1 d0 st %g1, [ %g2 + 0x1d0 ] 40006a54: 82 10 20 01 mov 1, %g1 40006a58: c2 24 20 44 st %g1, [ %l0 + 0x44 ] } _Thread_Disable_dispatch(); _Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue ); executing->Wait.queue = &the_semaphore->Wait_queue; executing->Wait.id = id; 40006a5c: f0 24 60 20 st %i0, [ %l1 + 0x20 ] return; } _Thread_Disable_dispatch(); _Thread_queue_Enter_critical_section( &the_semaphore->Wait_queue ); executing->Wait.queue = &the_semaphore->Wait_queue; 40006a60: a0 04 20 14 add %l0, 0x14, %l0 40006a64: e0 24 60 44 st %l0, [ %l1 + 0x44 ] executing->Wait.id = id; _ISR_Enable( level ); 40006a68: 7f ff ed 1d call 40001edc 40006a6c: 01 00 00 00 nop _Thread_queue_Enqueue( &the_semaphore->Wait_queue, timeout ); 40006a70: 90 10 00 10 mov %l0, %o0 40006a74: 92 10 00 1a mov %i2, %o1 40006a78: 15 10 00 29 sethi %hi(0x4000a400), %o2 40006a7c: 40 00 0d 44 call 40009f8c <_Thread_queue_Enqueue_with_handler> 40006a80: 94 12 a0 24 or %o2, 0x24, %o2 ! 4000a424 <_Thread_queue_Timeout> _Thread_Enable_dispatch(); 40006a84: 7f ff ff 42 call 4000678c <_Thread_Enable_dispatch> 40006a88: 01 00 00 00 nop 40006a8c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40006a90: c2 00 62 ac ld [ %g1 + 0x2ac ], %g1 ! 4001aeac <_Thread_Executing> 40006a94: 40 00 00 41 call 40006b98 <_Semaphore_Translate_core_semaphore_return_code> 40006a98: d0 00 60 34 ld [ %g1 + 0x34 ], %o0 _Thread_Executing->Wait.return_code ); } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40006a9c: b0 10 00 08 mov %o0, %i0 40006aa0: 81 c7 e0 08 ret 40006aa4: 81 e8 00 00 restore 40006adc : #endif rtems_status_code rtems_semaphore_release( rtems_id id ) { 40006adc: 9d e3 bf 90 save %sp, -112, %sp RTEMS_INLINE_ROUTINE Semaphore_Control *_Semaphore_Get ( Objects_Id id, Objects_Locations *location ) { return (Semaphore_Control *) 40006ae0: 11 10 00 6b sethi %hi(0x4001ac00), %o0 40006ae4: 92 10 00 18 mov %i0, %o1 40006ae8: 90 12 20 88 or %o0, 0x88, %o0 40006aec: 40 00 06 cc call 4000861c <_Objects_Get> 40006af0: 94 07 bf f4 add %fp, -12, %o2 Objects_Locations location; CORE_mutex_Status mutex_status; CORE_semaphore_Status semaphore_status; the_semaphore = _Semaphore_Get( id, &location ); switch ( location ) { 40006af4: c2 07 bf f4 ld [ %fp + -12 ], %g1 40006af8: 80 a0 60 00 cmp %g1, 0 40006afc: 22 80 00 07 be,a 40006b18 40006b00: c2 02 20 10 ld [ %o0 + 0x10 ], %g1 40006b04: 80 a0 60 02 cmp %g1, 2 40006b08: 08 80 00 17 bleu 40006b64 40006b0c: 90 10 20 04 mov 4, %o0 40006b10: 10 80 00 15 b 40006b64 <== NOT EXECUTED 40006b14: 90 10 20 19 mov 0x19, %o0 <== NOT EXECUTED case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: if ( !_Attributes_Is_counting_semaphore(the_semaphore->attribute_set) ) { 40006b18: 80 88 60 30 btst 0x30, %g1 40006b1c: 02 80 00 0b be 40006b48 40006b20: 90 02 20 14 add %o0, 0x14, %o0 mutex_status = _CORE_mutex_Surrender( 40006b24: 92 10 00 18 mov %i0, %o1 40006b28: 40 00 03 54 call 40007878 <_CORE_mutex_Surrender> 40006b2c: 94 10 20 00 clr %o2 &the_semaphore->Core_control.mutex, id, MUTEX_MP_SUPPORT ); _Thread_Enable_dispatch(); 40006b30: 7f ff ff de call 40006aa8 <_Thread_Enable_dispatch> 40006b34: a0 10 00 08 mov %o0, %l0 return _Semaphore_Translate_core_mutex_return_code( mutex_status ); 40006b38: 40 00 00 0e call 40006b70 <_Semaphore_Translate_core_mutex_return_code> 40006b3c: 90 10 00 10 mov %l0, %o0 _Semaphore_Translate_core_semaphore_return_code( semaphore_status ); } } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40006b40: 81 c7 e0 08 ret 40006b44: 91 e8 00 08 restore %g0, %o0, %o0 MUTEX_MP_SUPPORT ); _Thread_Enable_dispatch(); return _Semaphore_Translate_core_mutex_return_code( mutex_status ); } else { semaphore_status = _CORE_semaphore_Surrender( 40006b48: 92 10 00 18 mov %i0, %o1 40006b4c: 40 00 03 b9 call 40007a30 <_CORE_semaphore_Surrender> 40006b50: 94 10 20 00 clr %o2 &the_semaphore->Core_control.semaphore, id, MUTEX_MP_SUPPORT ); _Thread_Enable_dispatch(); 40006b54: 7f ff ff d5 call 40006aa8 <_Thread_Enable_dispatch> 40006b58: a0 10 00 08 mov %o0, %l0 return 40006b5c: 40 00 00 0f call 40006b98 <_Semaphore_Translate_core_semaphore_return_code> 40006b60: 90 10 00 10 mov %l0, %o0 _Semaphore_Translate_core_semaphore_return_code( semaphore_status ); } } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40006b64: b0 10 00 08 mov %o0, %i0 40006b68: 81 c7 e0 08 ret 40006b6c: 81 e8 00 00 restore 40018650 : */ void rtems_shutdown_executive( uint32_t result ) { 40018650: 9d e3 bf 98 save %sp, -104, %sp if ( _System_state_Current != SYSTEM_STATE_SHUTDOWN ) { 40018654: 33 10 00 6b sethi %hi(0x4001ac00), %i1 40018658: c2 06 63 b0 ld [ %i1 + 0x3b0 ], %g1 ! 4001afb0 <_System_state_Current> 4001865c: 80 a0 60 04 cmp %g1, 4 40018660: 02 80 00 0c be 40018690 40018664: 11 10 00 66 sethi %hi(0x40019800), %o0 #if defined(__USE_INIT_FINI__) extern void _fini( void ); atexit( _fini ); 40018668: 7f ff da 4d call 4000ef9c 4001866c: 90 12 21 f4 or %o0, 0x1f4, %o0 ! 400199f4 <_fini> * routine which initialized the system. */ RTEMS_INLINE_ROUTINE void _Thread_Stop_multitasking( void ) { _Context_Switch( &_Thread_Executing->Registers, &_Thread_BSP_context ); 40018670: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40018674: f0 00 62 ac ld [ %g1 + 0x2ac ], %i0 ! 4001aeac <_Thread_Executing> 40018678: 82 10 20 04 mov 4, %g1 4001867c: b0 06 20 e0 add %i0, 0xe0, %i0 40018680: c2 26 63 b0 st %g1, [ %i1 + 0x3b0 ] 40018684: 33 10 00 6b sethi %hi(0x4001ac00), %i1 40018688: 7f ff ca 92 call 4000b0d0 <_CPU_Context_switch> 4001868c: 93 ee 61 48 restore %i1, 0x148, %o1 40018690: 81 c7 e0 08 ret <== NOT EXECUTED 40018694: 81 e8 00 00 restore <== NOT EXECUTED 400120b8 : rtems_status_code rtems_signal_send( Objects_Id id, rtems_signal_set signal_set ) { 400120b8: 9d e3 bf 90 save %sp, -112, %sp 400120bc: 92 10 00 18 mov %i0, %o1 register Thread_Control *the_thread; Objects_Locations location; RTEMS_API_Control *api; ASR_Information *asr; if ( !signal_set ) 400120c0: 80 a6 60 00 cmp %i1, 0 400120c4: 02 80 00 47 be 400121e0 400120c8: b0 10 20 0a mov 0xa, %i0 uint32_t the_api; uint32_t the_class; Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { 400120cc: 80 a2 60 00 cmp %o1, 0 400120d0: 12 80 00 0a bne 400120f8 400120d4: 83 32 60 18 srl %o1, 0x18, %g1 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 400120d8: 03 10 00 d2 sethi %hi(0x40034800), %g1 400120dc: c4 00 60 b0 ld [ %g1 + 0xb0 ], %g2 ! 400348b0 <_Thread_Dispatch_disable_level> 400120e0: 84 00 a0 01 inc %g2 400120e4: c4 20 60 b0 st %g2, [ %g1 + 0xb0 ] Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; tp = _Thread_Executing; 400120e8: 03 10 00 d2 sethi %hi(0x40034800), %g1 400120ec: f0 00 61 8c ld [ %g1 + 0x18c ], %i0 ! 4003498c <_Thread_Executing> Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; 400120f0: 10 80 00 18 b 40012150 400120f4: c0 27 bf f4 clr [ %fp + -12 ] */ RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API( Objects_Id id ) { return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS); 400120f8: 84 08 60 07 and %g1, 7, %g2 tp = _Thread_Executing; goto done; } the_api = _Objects_Get_API( id ); if ( the_api && the_api > OBJECTS_APIS_LAST ) { 400120fc: 80 a0 a0 04 cmp %g2, 4 40012100: 18 80 00 0e bgu 40012138 40012104: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; goto done; } the_class = _Objects_Get_class( id ); if ( the_class != 1 ) { /* threads are always first class :) */ 40012108: 83 32 60 1b srl %o1, 0x1b, %g1 4001210c: 80 a0 60 01 cmp %g1, 1 40012110: 12 80 00 0a bne 40012138 40012114: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; goto done; } information = _Objects_Information_table[ the_api ][ the_class ]; 40012118: 83 28 a0 02 sll %g2, 2, %g1 4001211c: 05 10 00 d2 sethi %hi(0x40034800), %g2 40012120: 84 10 a0 10 or %g2, 0x10, %g2 ! 40034810 <_Objects_Information_table> 40012124: c2 00 80 01 ld [ %g2 + %g1 ], %g1 40012128: d0 00 60 04 ld [ %g1 + 4 ], %o0 if ( !information ) { 4001212c: 80 a2 20 00 cmp %o0, 0 40012130: 12 80 00 05 bne 40012144 40012134: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 40012138: b0 10 20 00 clr %i0 4001213c: 10 80 00 05 b 40012150 40012140: c2 27 bf f4 st %g1, [ %fp + -12 ] goto done; } tp = (Thread_Control *) _Objects_Get( information, id, location ); 40012144: 40 00 0d f0 call 40015904 <_Objects_Get> 40012148: 94 07 bf f4 add %fp, -12, %o2 4001214c: b0 10 00 08 mov %o0, %i0 return RTEMS_INVALID_NUMBER; the_thread = _Thread_Get( id, &location ); switch ( location ) { 40012150: c2 07 bf f4 ld [ %fp + -12 ], %g1 40012154: 80 a0 60 00 cmp %g1, 0 40012158: 22 80 00 07 be,a 40012174 4001215c: d2 06 21 6c ld [ %i0 + 0x16c ], %o1 40012160: 80 a0 60 02 cmp %g1, 2 40012164: 08 80 00 1f bleu 400121e0 40012168: b0 10 20 04 mov 4, %i0 4001216c: 81 c7 e0 08 ret <== NOT EXECUTED 40012170: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED case OBJECTS_LOCAL: api = the_thread->API_Extensions[ THREAD_API_RTEMS ]; asr = &api->Signal; if ( ! _ASR_Is_null_handler( asr->handler ) ) { 40012174: c2 02 60 4c ld [ %o1 + 0x4c ], %g1 40012178: 80 a0 60 00 cmp %g1, 0 4001217c: 02 80 00 1b be 400121e8 40012180: 01 00 00 00 nop if ( asr->is_enabled ) { 40012184: c2 02 60 48 ld [ %o1 + 0x48 ], %g1 40012188: 80 a0 60 00 cmp %g1, 0 4001218c: 02 80 00 11 be 400121d0 40012190: 90 10 00 19 mov %i1, %o0 _ASR_Post_signals( signal_set, &asr->signals_posted ); 40012194: 7f ff ff b3 call 40012060 <_ASR_Post_signals> 40012198: 92 02 60 54 add %o1, 0x54, %o1 the_thread->do_post_task_switch_extension = TRUE; if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) ) 4001219c: 03 10 00 d2 sethi %hi(0x40034800), %g1 400121a0: c2 00 61 74 ld [ %g1 + 0x174 ], %g1 ! 40034974 <_ISR_Nest_level> if ( ! _ASR_Is_null_handler( asr->handler ) ) { if ( asr->is_enabled ) { _ASR_Post_signals( signal_set, &asr->signals_posted ); the_thread->do_post_task_switch_extension = TRUE; 400121a4: 84 10 20 01 mov 1, %g2 if ( _ISR_Is_in_progress() && _Thread_Is_executing( the_thread ) ) 400121a8: 80 a0 60 00 cmp %g1, 0 400121ac: 02 80 00 0b be 400121d8 400121b0: c4 26 20 78 st %g2, [ %i0 + 0x78 ] 400121b4: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED 400121b8: c2 00 61 8c ld [ %g1 + 0x18c ], %g1 ! 4003498c <_Thread_Executing> <== NOT EXECUTED 400121bc: 80 a6 00 01 cmp %i0, %g1 <== NOT EXECUTED 400121c0: 12 80 00 06 bne 400121d8 <== NOT EXECUTED 400121c4: 03 10 00 d2 sethi %hi(0x40034800), %g1 <== NOT EXECUTED _ISR_Signals_to_thread_executing = TRUE; 400121c8: 10 80 00 04 b 400121d8 <== NOT EXECUTED 400121cc: c4 20 62 38 st %g2, [ %g1 + 0x238 ] ! 40034a38 <_ISR_Signals_to_thread_executing> <== NOT EXECUTED } else { _ASR_Post_signals( signal_set, &asr->signals_pending ); 400121d0: 7f ff ff a4 call 40012060 <_ASR_Post_signals> 400121d4: 92 02 60 58 add %o1, 0x58, %o1 } _Thread_Enable_dispatch(); 400121d8: 7f ff ff ab call 40012084 <_Thread_Enable_dispatch> 400121dc: b0 10 20 00 clr %i0 400121e0: 81 c7 e0 08 ret 400121e4: 81 e8 00 00 restore return RTEMS_SUCCESSFUL; } _Thread_Enable_dispatch(); 400121e8: 7f ff ff a7 call 40012084 <_Thread_Enable_dispatch> 400121ec: b0 10 20 0b mov 0xb, %i0 return RTEMS_NOT_DEFINED; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 400121f0: 81 c7 e0 08 ret 400121f4: 81 e8 00 00 restore 40003744 : /* * Check if blown */ boolean rtems_stack_checker_is_blown( void ) { 40003744: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED Stack_Control *the_stack = &_Thread_Executing->Start.Initial_stack; 40003748: 03 10 00 7d sethi %hi(0x4001f400), %g1 <== NOT EXECUTED 4000374c: f0 00 60 ac ld [ %g1 + 0xac ], %i0 ! 4001f4ac <_Thread_Executing> <== NOT EXECUTED /* * Check for an out of bounds stack pointer */ sp_ok = Stack_check_Frame_pointer_in_range( the_stack ); 40003750: 7f ff ff d7 call 400036ac <== NOT EXECUTED 40003754: 90 06 20 d0 add %i0, 0xd0, %o0 <== NOT EXECUTED /* * The stack checker must be initialized before the pattern is there * to check. */ if ( Stack_check_Initialized ) { 40003758: 03 10 00 7c sethi %hi(0x4001f000), %g1 <== NOT EXECUTED 4000375c: c2 00 60 28 ld [ %g1 + 0x28 ], %g1 ! 4001f028 <== NOT EXECUTED /* * Check for an out of bounds stack pointer */ sp_ok = Stack_check_Frame_pointer_in_range( the_stack ); 40003760: a0 10 00 08 mov %o0, %l0 <== NOT EXECUTED /* * The stack checker must be initialized before the pattern is there * to check. */ if ( Stack_check_Initialized ) { 40003764: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40003768: 02 80 00 0a be 40003790 <== NOT EXECUTED 4000376c: 92 10 20 01 mov 1, %o1 <== NOT EXECUTED pattern_ok = (!memcmp( 40003770: d0 06 20 d4 ld [ %i0 + 0xd4 ], %o0 <== NOT EXECUTED 40003774: 13 10 00 7c sethi %hi(0x4001f000), %o1 <== NOT EXECUTED 40003778: 90 02 20 08 add %o0, 8, %o0 <== NOT EXECUTED 4000377c: 92 12 61 e4 or %o1, 0x1e4, %o1 <== NOT EXECUTED 40003780: 40 00 35 67 call 40010d1c <== NOT EXECUTED 40003784: 94 10 20 10 mov 0x10, %o2 <== NOT EXECUTED 40003788: 80 a0 00 08 cmp %g0, %o0 <== NOT EXECUTED 4000378c: 92 60 3f ff subx %g0, -1, %o1 <== NOT EXECUTED } /* * The Stack Pointer and the Pattern Area are OK so return FALSE. */ if ( sp_ok && pattern_ok ) 40003790: 80 a4 20 00 cmp %l0, 0 <== NOT EXECUTED 40003794: 02 80 00 06 be 400037ac <== NOT EXECUTED 40003798: 03 10 00 7d sethi %hi(0x4001f400), %g1 <== NOT EXECUTED 4000379c: 80 a2 60 00 cmp %o1, 0 <== NOT EXECUTED 400037a0: 12 80 00 06 bne 400037b8 <== NOT EXECUTED 400037a4: b0 10 20 00 clr %i0 <== NOT EXECUTED return FALSE; /* * Let's report as much as we can. */ Stack_check_report_blown_task( _Thread_Executing, pattern_ok ); 400037a8: 03 10 00 7d sethi %hi(0x4001f400), %g1 <== NOT EXECUTED 400037ac: d0 00 60 ac ld [ %g1 + 0xac ], %o0 ! 4001f4ac <_Thread_Executing> <== NOT EXECUTED 400037b0: 7f ff ff cb call 400036dc <== NOT EXECUTED 400037b4: b0 10 20 01 mov 1, %i0 <== NOT EXECUTED return TRUE; } 400037b8: 81 c7 e0 08 ret <== NOT EXECUTED 400037bc: 81 e8 00 00 restore <== NOT EXECUTED 40003690 : } void rtems_stack_checker_report_usage( void ) { rtems_stack_checker_report_usage_with_plugin( NULL, printk_plugin ); 40003690: 13 10 00 13 sethi %hi(0x40004c00), %o1 <== NOT EXECUTED 40003694: 90 10 20 00 clr %o0 <== NOT EXECUTED 40003698: 92 12 62 00 or %o1, 0x200, %o1 <== NOT EXECUTED 4000369c: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 400036a0: 7f ff ff e2 call 40003628 <== NOT EXECUTED 400036a4: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED 400036a8: 01 00 00 00 nop 40003628 : void rtems_stack_checker_report_usage_with_plugin( void *context, rtems_printk_plugin_t print ) { 40003628: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED if (Stack_check_Initialized == 0) 4000362c: 03 10 00 7c sethi %hi(0x4001f000), %g1 <== NOT EXECUTED 40003630: c2 00 60 28 ld [ %g1 + 0x28 ], %g1 ! 4001f028 <== NOT EXECUTED 40003634: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40003638: 02 80 00 14 be 40003688 <== NOT EXECUTED 4000363c: 23 10 00 7c sethi %hi(0x4001f000), %l1 <== NOT EXECUTED return; print_context = context; print_handler = print; 40003640: 21 10 00 7c sethi %hi(0x4001f000), %l0 <== NOT EXECUTED ) { if (Stack_check_Initialized == 0) return; print_context = context; 40003644: f0 24 60 2c st %i0, [ %l1 + 0x2c ] <== NOT EXECUTED print_handler = print; 40003648: f2 24 20 30 st %i1, [ %l0 + 0x30 ] <== NOT EXECUTED (*print)( context, "Stack usage by thread\n"); 4000364c: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40003650: 13 10 00 70 sethi %hi(0x4001c000), %o1 <== NOT EXECUTED 40003654: 9f c6 40 00 call %i1 <== NOT EXECUTED 40003658: 92 12 63 e0 or %o1, 0x3e0, %o1 ! 4001c3e0 <== NOT EXECUTED (*print)( context, 4000365c: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40003660: 13 10 00 70 sethi %hi(0x4001c000), %o1 <== NOT EXECUTED 40003664: 9f c6 40 00 call %i1 <== NOT EXECUTED 40003668: 92 12 63 f8 or %o1, 0x3f8, %o1 ! 4001c3f8 <== NOT EXECUTED " ID NAME LOW HIGH AVAILABLE USED\n" ); /* iterate over all threads and dump the usage */ rtems_iterate_over_all_threads( Stack_check_Dump_threads_usage ); 4000366c: 11 10 00 0d sethi %hi(0x40003400), %o0 <== NOT EXECUTED 40003670: 40 00 17 6c call 40009420 <== NOT EXECUTED 40003674: 90 12 21 20 or %o0, 0x120, %o0 ! 40003520 <== NOT EXECUTED /* dump interrupt stack info if any */ Stack_check_Dump_threads_usage((Thread_Control *) -1); 40003678: 7f ff ff aa call 40003520 <== NOT EXECUTED 4000367c: 90 10 3f ff mov -1, %o0 <== NOT EXECUTED print_context = NULL; 40003680: c0 24 60 2c clr [ %l1 + 0x2c ] <== NOT EXECUTED print_handler = NULL; 40003684: c0 24 20 30 clr [ %l0 + 0x30 ] <== NOT EXECUTED 40003688: 81 c7 e0 08 ret <== NOT EXECUTED 4000368c: 81 e8 00 00 restore <== NOT EXECUTED 400037c0 : */ void rtems_stack_checker_switch_extension( Thread_Control *running, Thread_Control *heir ) { 400037c0: 9d e3 bf 98 save %sp, -104, %sp Stack_Control *the_stack = &running->Start.Initial_stack; void *pattern; boolean sp_ok; boolean pattern_ok = TRUE; pattern = (void *) Stack_check_Get_pattern_area(the_stack)->pattern; 400037c4: e0 06 20 d4 ld [ %i0 + 0xd4 ], %l0 /* * Check for an out of bounds stack pointer or an overwrite */ sp_ok = Stack_check_Frame_pointer_in_range( the_stack ); 400037c8: 7f ff ff b9 call 400036ac 400037cc: 90 06 20 d0 add %i0, 0xd0, %o0 Stack_Control *the_stack = &running->Start.Initial_stack; void *pattern; boolean sp_ok; boolean pattern_ok = TRUE; pattern = (void *) Stack_check_Get_pattern_area(the_stack)->pattern; 400037d0: a0 04 20 08 add %l0, 8, %l0 /* * Check for an out of bounds stack pointer or an overwrite */ sp_ok = Stack_check_Frame_pointer_in_range( the_stack ); 400037d4: a2 10 00 08 mov %o0, %l1 pattern_ok = (!memcmp( pattern, 400037d8: 13 10 00 7c sethi %hi(0x4001f000), %o1 400037dc: 90 10 00 10 mov %l0, %o0 400037e0: 92 12 61 e4 or %o1, 0x1e4, %o1 400037e4: 40 00 35 4e call 40010d1c 400037e8: 94 10 20 10 mov 0x10, %o2 400037ec: 80 a0 00 08 cmp %g0, %o0 400037f0: b2 60 3f ff subx %g0, -1, %i1 (void *) Stack_check_Pattern.pattern, PATTERN_SIZE_BYTES)); if ( !sp_ok || !pattern_ok ) { 400037f4: 80 a4 60 00 cmp %l1, 0 400037f8: 02 80 00 04 be 40003808 400037fc: 80 a6 60 00 cmp %i1, 0 40003800: 12 80 00 04 bne 40003810 40003804: 01 00 00 00 nop Stack_check_report_blown_task( running, pattern_ok ); 40003808: 7f ff ff b5 call 400036dc <== NOT EXECUTED 4000380c: 81 e8 00 00 restore <== NOT EXECUTED 40003810: 81 c7 e0 08 ret 40003814: 81 e8 00 00 restore 40006e30 : const char * rtems_status_text( rtems_status_code status ) { 40006e30: 92 10 00 08 mov %o0, %o1 <== NOT EXECUTED return rtems_assoc_name_by_local(rtems_status_assoc, status); 40006e34: 11 10 00 9e sethi %hi(0x40027800), %o0 <== NOT EXECUTED 40006e38: 90 12 21 44 or %o0, 0x144, %o0 ! 40027944 <== NOT EXECUTED 40006e3c: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 40006e40: 40 00 2e 5d call 400127b4 <== NOT EXECUTED 40006e44: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED 40006e48: 01 00 00 00 nop 40006d80 : */ rtems_status_code rtems_task_delete( Objects_Id id ) { 40006d80: 9d e3 bf 90 save %sp, -112, %sp uint32_t the_api; uint32_t the_class; Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { 40006d84: 92 96 20 00 orcc %i0, 0, %o1 40006d88: 12 80 00 0a bne 40006db0 40006d8c: 83 32 60 18 srl %o1, 0x18, %g1 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40006d90: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40006d94: c4 00 61 d0 ld [ %g1 + 0x1d0 ], %g2 ! 4001add0 <_Thread_Dispatch_disable_level> 40006d98: 84 00 a0 01 inc %g2 40006d9c: c4 20 61 d0 st %g2, [ %g1 + 0x1d0 ] Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; tp = _Thread_Executing; 40006da0: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40006da4: f0 00 62 ac ld [ %g1 + 0x2ac ], %i0 ! 4001aeac <_Thread_Executing> Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; 40006da8: 10 80 00 18 b 40006e08 40006dac: c0 27 bf f4 clr [ %fp + -12 ] */ RTEMS_INLINE_ROUTINE Objects_APIs _Objects_Get_API( Objects_Id id ) { return (Objects_APIs) ((id >> OBJECTS_API_START_BIT) & OBJECTS_API_VALID_BITS); 40006db0: 84 08 60 07 and %g1, 7, %g2 tp = _Thread_Executing; goto done; } the_api = _Objects_Get_API( id ); if ( the_api && the_api > OBJECTS_APIS_LAST ) { 40006db4: 80 a0 a0 04 cmp %g2, 4 40006db8: 18 80 00 0e bgu 40006df0 40006dbc: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; goto done; } the_class = _Objects_Get_class( id ); if ( the_class != 1 ) { /* threads are always first class :) */ 40006dc0: 83 32 60 1b srl %o1, 0x1b, %g1 40006dc4: 80 a0 60 01 cmp %g1, 1 40006dc8: 12 80 00 0a bne 40006df0 40006dcc: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; goto done; } information = _Objects_Information_table[ the_api ][ the_class ]; 40006dd0: 83 28 a0 02 sll %g2, 2, %g1 40006dd4: 05 10 00 6b sethi %hi(0x4001ac00), %g2 40006dd8: 84 10 a1 30 or %g2, 0x130, %g2 ! 4001ad30 <_Objects_Information_table> 40006ddc: c2 00 80 01 ld [ %g2 + %g1 ], %g1 40006de0: d0 00 60 04 ld [ %g1 + 4 ], %o0 if ( !information ) { 40006de4: 80 a2 20 00 cmp %o0, 0 40006de8: 12 80 00 05 bne 40006dfc 40006dec: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 40006df0: b0 10 20 00 clr %i0 40006df4: 10 80 00 05 b 40006e08 40006df8: c2 27 bf f4 st %g1, [ %fp + -12 ] goto done; } tp = (Thread_Control *) _Objects_Get( information, id, location ); 40006dfc: 40 00 06 08 call 4000861c <_Objects_Get> 40006e00: 94 07 bf f4 add %fp, -12, %o2 40006e04: b0 10 00 08 mov %o0, %i0 register Thread_Control *the_thread; Objects_Locations location; Objects_Information *the_information; the_thread = _Thread_Get( id, &location ); switch ( location ) { 40006e08: c2 07 bf f4 ld [ %fp + -12 ], %g1 40006e0c: 80 a0 60 00 cmp %g1, 0 40006e10: 02 80 00 06 be 40006e28 40006e14: 80 a0 60 02 cmp %g1, 2 40006e18: 08 80 00 0b bleu 40006e44 40006e1c: b0 10 20 04 mov 4, %i0 40006e20: 81 c7 e0 08 ret <== NOT EXECUTED 40006e24: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: the_information = _Objects_Get_information( the_thread->Object.id ); 40006e28: 7f ff ff c0 call 40006d28 <_Objects_Get_information> 40006e2c: d0 06 20 08 ld [ %i0 + 8 ], %o0 if ( !the_information ) { 40006e30: 80 a2 20 00 cmp %o0, 0 40006e34: 12 80 00 06 bne 40006e4c 40006e38: 01 00 00 00 nop _Thread_Enable_dispatch(); 40006e3c: 7f ff ff c4 call 40006d4c <_Thread_Enable_dispatch> <== NOT EXECUTED 40006e40: b0 10 20 04 mov 4, %i0 ! 4 <== NOT EXECUTED 40006e44: 81 c7 e0 08 ret 40006e48: 81 e8 00 00 restore return RTEMS_INVALID_ID; /* This should never happen if _Thread_Get() works right */ } _Thread_Close( the_information, the_thread ); 40006e4c: 40 00 0a 63 call 400097d8 <_Thread_Close> 40006e50: 92 10 00 18 mov %i0, %o1 40006e54: 7f ff ff b5 call 40006d28 <_Objects_Get_information> 40006e58: d0 06 20 08 ld [ %i0 + 8 ], %o0 40006e5c: 92 10 00 18 mov %i0, %o1 40006e60: 40 00 05 ad call 40008514 <_Objects_Free> 40006e64: b0 10 20 00 clr %i0 0 /* Not used */ ); } #endif _Thread_Enable_dispatch(); 40006e68: 7f ff ff b9 call 40006d4c <_Thread_Enable_dispatch> 40006e6c: 01 00 00 00 nop return RTEMS_SUCCESSFUL; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40006e70: 81 c7 e0 08 ret 40006e74: 81 e8 00 00 restore 4000868c : rtems_status_code rtems_task_get_note( Objects_Id id, uint32_t notepad, uint32_t *note ) { 4000868c: 9d e3 bf 90 save %sp, -112, %sp 40008690: 92 10 00 18 mov %i0, %o1 register Thread_Control *the_thread; Objects_Locations location; RTEMS_API_Control *api; if ( !note ) 40008694: 80 a6 a0 00 cmp %i2, 0 40008698: 02 80 00 43 be 400087a4 4000869c: b0 10 20 09 mov 9, %i0 /* * NOTE: There is no check for < RTEMS_NOTEPAD_FIRST because that would * be checking an unsigned number for being negative. */ if ( notepad > RTEMS_NOTEPAD_LAST ) 400086a0: 80 a6 60 0f cmp %i1, 0xf 400086a4: 18 80 00 40 bgu 400087a4 400086a8: b0 10 20 0a mov 0xa, %i0 /* * Optimize the most likely case to avoid the Thread_Dispatch. */ if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) || 400086ac: 80 a2 60 00 cmp %o1, 0 400086b0: 02 80 00 08 be 400086d0 400086b4: 03 10 00 82 sethi %hi(0x40020800), %g1 400086b8: c2 00 60 4c ld [ %g1 + 0x4c ], %g1 ! 4002084c <_Thread_Executing> 400086bc: c2 00 60 08 ld [ %g1 + 8 ], %g1 400086c0: 80 a2 40 01 cmp %o1, %g1 400086c4: 12 80 00 0a bne 400086ec 400086c8: 83 32 60 18 srl %o1, 0x18, %g1 _Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) { api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ]; *note = api->Notepads[ notepad ]; 400086cc: 03 10 00 82 sethi %hi(0x40020800), %g1 <== NOT EXECUTED 400086d0: c2 00 60 4c ld [ %g1 + 0x4c ], %g1 ! 4002084c <_Thread_Executing> 400086d4: 85 2e 60 02 sll %i1, 2, %g2 400086d8: c2 00 61 6c ld [ %g1 + 0x16c ], %g1 400086dc: c2 00 40 02 ld [ %g1 + %g2 ], %g1 400086e0: c2 26 80 00 st %g1, [ %i2 ] 400086e4: 81 c7 e0 08 ret 400086e8: 91 e8 20 00 restore %g0, 0, %o0 400086ec: 84 08 60 07 and %g1, 7, %g2 tp = _Thread_Executing; goto done; } the_api = _Objects_Get_API( id ); if ( the_api && the_api > OBJECTS_APIS_LAST ) { 400086f0: 80 a0 a0 04 cmp %g2, 4 400086f4: 18 80 00 06 bgu 4000870c 400086f8: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; goto done; } the_class = _Objects_Get_class( id ); if ( the_class != 1 ) { /* threads are always first class :) */ 400086fc: 83 32 60 1b srl %o1, 0x1b, %g1 40008700: 80 a0 60 01 cmp %g1, 1 40008704: 02 80 00 05 be 40008718 40008708: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 4000870c: 90 10 20 00 clr %o0 40008710: 10 80 00 0e b 40008748 40008714: c2 27 bf f4 st %g1, [ %fp + -12 ] goto done; } information = _Objects_Information_table[ the_api ][ the_class ]; 40008718: 83 28 a0 02 sll %g2, 2, %g1 4000871c: 05 10 00 81 sethi %hi(0x40020400), %g2 40008720: 84 10 a2 d0 or %g2, 0x2d0, %g2 ! 400206d0 <_Objects_Information_table> 40008724: c2 00 80 01 ld [ %g2 + %g1 ], %g1 40008728: d0 00 60 04 ld [ %g1 + 4 ], %o0 if ( !information ) { 4000872c: 80 a2 20 00 cmp %o0, 0 40008730: 12 80 00 04 bne 40008740 40008734: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 40008738: 10 80 00 04 b 40008748 <== NOT EXECUTED 4000873c: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED goto done; } tp = (Thread_Control *) _Objects_Get( information, id, location ); 40008740: 40 00 07 52 call 4000a488 <_Objects_Get> 40008744: 94 07 bf f4 add %fp, -12, %o2 return RTEMS_SUCCESSFUL; } the_thread = _Thread_Get( id, &location ); switch ( location ) { 40008748: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000874c: 80 a0 60 00 cmp %g1, 0 40008750: 22 80 00 07 be,a 4000876c 40008754: c4 02 21 6c ld [ %o0 + 0x16c ], %g2 40008758: 80 a0 60 02 cmp %g1, 2 4000875c: 08 80 00 12 bleu 400087a4 40008760: b0 10 20 04 mov 4, %i0 40008764: 81 c7 e0 08 ret <== NOT EXECUTED 40008768: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: api = the_thread->API_Extensions[ THREAD_API_RTEMS ]; *note = api->Notepads[ notepad ]; 4000876c: 83 2e 60 02 sll %i1, 2, %g1 40008770: c2 00 80 01 ld [ %g2 + %g1 ], %g1 40008774: c2 26 80 00 st %g1, [ %i2 ] #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40008778: 05 10 00 81 sethi %hi(0x40020400), %g2 4000877c: c2 00 a3 70 ld [ %g2 + 0x370 ], %g1 ! 40020770 <_Thread_Dispatch_disable_level> 40008780: b0 10 20 00 clr %i0 40008784: 82 00 7f ff add %g1, -1, %g1 40008788: c2 20 a3 70 st %g1, [ %g2 + 0x370 ] 4000878c: c2 00 a3 70 ld [ %g2 + 0x370 ], %g1 40008790: 80 a0 60 00 cmp %g1, 0 40008794: 12 80 00 04 bne 400087a4 40008798: 01 00 00 00 nop _Thread_Dispatch(); 4000879c: 40 00 0b f0 call 4000b75c <_Thread_Dispatch> 400087a0: 01 00 00 00 nop _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 400087a4: 81 c7 e0 08 ret 400087a8: 81 e8 00 00 restore 4000750c : */ rtems_status_code rtems_task_is_suspended( Objects_Id id ) { 4000750c: 9d e3 bf 90 save %sp, -112, %sp uint32_t the_api; uint32_t the_class; Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { 40007510: 92 96 20 00 orcc %i0, 0, %o1 40007514: 12 80 00 0a bne 4000753c 40007518: 83 32 60 18 srl %o1, 0x18, %g1 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 4000751c: 03 10 00 79 sethi %hi(0x4001e400), %g1 <== NOT EXECUTED 40007520: c4 00 61 80 ld [ %g1 + 0x180 ], %g2 ! 4001e580 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40007524: 84 00 a0 01 inc %g2 <== NOT EXECUTED 40007528: c4 20 61 80 st %g2, [ %g1 + 0x180 ] <== NOT EXECUTED Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; tp = _Thread_Executing; 4000752c: 03 10 00 79 sethi %hi(0x4001e400), %g1 <== NOT EXECUTED 40007530: d0 00 62 5c ld [ %g1 + 0x25c ], %o0 ! 4001e65c <_Thread_Executing> <== NOT EXECUTED Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; 40007534: 10 80 00 19 b 40007598 <== NOT EXECUTED 40007538: c0 27 bf f4 clr [ %fp + -12 ] <== NOT EXECUTED 4000753c: 84 08 60 07 and %g1, 7, %g2 tp = _Thread_Executing; goto done; } the_api = _Objects_Get_API( id ); if ( the_api && the_api > OBJECTS_APIS_LAST ) { 40007540: 80 a0 a0 04 cmp %g2, 4 40007544: 18 80 00 06 bgu 4000755c 40007548: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; goto done; } the_class = _Objects_Get_class( id ); if ( the_class != 1 ) { /* threads are always first class :) */ 4000754c: 83 32 60 1b srl %o1, 0x1b, %g1 40007550: 80 a0 60 01 cmp %g1, 1 40007554: 02 80 00 05 be 40007568 40007558: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 4000755c: 90 10 20 00 clr %o0 <== NOT EXECUTED 40007560: 10 80 00 0e b 40007598 <== NOT EXECUTED 40007564: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED goto done; } information = _Objects_Information_table[ the_api ][ the_class ]; 40007568: 83 28 a0 02 sll %g2, 2, %g1 4000756c: 05 10 00 79 sethi %hi(0x4001e400), %g2 40007570: 84 10 a0 e0 or %g2, 0xe0, %g2 ! 4001e4e0 <_Objects_Information_table> 40007574: c2 00 80 01 ld [ %g2 + %g1 ], %g1 40007578: d0 00 60 04 ld [ %g1 + 4 ], %o0 if ( !information ) { 4000757c: 80 a2 20 00 cmp %o0, 0 40007580: 12 80 00 04 bne 40007590 40007584: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 40007588: 10 80 00 04 b 40007598 <== NOT EXECUTED 4000758c: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED goto done; } tp = (Thread_Control *) _Objects_Get( information, id, location ); 40007590: 40 00 06 58 call 40008ef0 <_Objects_Get> 40007594: 94 07 bf f4 add %fp, -12, %o2 register Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); switch ( location ) { 40007598: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000759c: 80 a0 60 00 cmp %g1, 0 400075a0: 22 80 00 07 be,a 400075bc 400075a4: c2 02 20 10 ld [ %o0 + 0x10 ], %g1 400075a8: 80 a0 60 02 cmp %g1, 2 <== NOT EXECUTED 400075ac: 08 80 00 09 bleu 400075d0 <== NOT EXECUTED 400075b0: b0 10 20 04 mov 4, %i0 <== NOT EXECUTED 400075b4: 81 c7 e0 08 ret <== NOT EXECUTED 400075b8: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: if ( !_States_Is_suspended( the_thread->current_state ) ) { 400075bc: 80 88 60 02 btst 2, %g1 400075c0: 12 80 00 06 bne 400075d8 400075c4: 01 00 00 00 nop _Thread_Enable_dispatch(); 400075c8: 7f ff ff c4 call 400074d8 <_Thread_Enable_dispatch> 400075cc: b0 10 20 00 clr %i0 ! 0 400075d0: 81 c7 e0 08 ret 400075d4: 81 e8 00 00 restore return RTEMS_SUCCESSFUL; } _Thread_Enable_dispatch(); 400075d8: 7f ff ff c0 call 400074d8 <_Thread_Enable_dispatch> 400075dc: b0 10 20 0f mov 0xf, %i0 return RTEMS_ALREADY_SUSPENDED; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 400075e0: 81 c7 e0 08 ret 400075e4: 81 e8 00 00 restore 40007b60 : rtems_status_code rtems_task_restart( Objects_Id id, uint32_t argument ) { 40007b60: 9d e3 bf 90 save %sp, -112, %sp uint32_t the_api; uint32_t the_class; Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { 40007b64: 92 96 20 00 orcc %i0, 0, %o1 40007b68: 12 80 00 0a bne 40007b90 40007b6c: 83 32 60 18 srl %o1, 0x18, %g1 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40007b70: 03 10 00 7a sethi %hi(0x4001e800), %g1 40007b74: c4 00 62 90 ld [ %g1 + 0x290 ], %g2 ! 4001ea90 <_Thread_Dispatch_disable_level> 40007b78: 84 00 a0 01 inc %g2 40007b7c: c4 20 62 90 st %g2, [ %g1 + 0x290 ] Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; tp = _Thread_Executing; 40007b80: 03 10 00 7a sethi %hi(0x4001e800), %g1 40007b84: d0 00 63 6c ld [ %g1 + 0x36c ], %o0 ! 4001eb6c <_Thread_Executing> Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; 40007b88: 10 80 00 19 b 40007bec 40007b8c: c0 27 bf f4 clr [ %fp + -12 ] 40007b90: 84 08 60 07 and %g1, 7, %g2 tp = _Thread_Executing; goto done; } the_api = _Objects_Get_API( id ); if ( the_api && the_api > OBJECTS_APIS_LAST ) { 40007b94: 80 a0 a0 04 cmp %g2, 4 40007b98: 18 80 00 06 bgu 40007bb0 40007b9c: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; goto done; } the_class = _Objects_Get_class( id ); if ( the_class != 1 ) { /* threads are always first class :) */ 40007ba0: 83 32 60 1b srl %o1, 0x1b, %g1 40007ba4: 80 a0 60 01 cmp %g1, 1 40007ba8: 02 80 00 05 be 40007bbc 40007bac: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 40007bb0: 90 10 20 00 clr %o0 40007bb4: 10 80 00 0e b 40007bec 40007bb8: c2 27 bf f4 st %g1, [ %fp + -12 ] goto done; } information = _Objects_Information_table[ the_api ][ the_class ]; 40007bbc: 83 28 a0 02 sll %g2, 2, %g1 40007bc0: 05 10 00 7a sethi %hi(0x4001e800), %g2 40007bc4: 84 10 a1 f0 or %g2, 0x1f0, %g2 ! 4001e9f0 <_Objects_Information_table> 40007bc8: c2 00 80 01 ld [ %g2 + %g1 ], %g1 40007bcc: d0 00 60 04 ld [ %g1 + 4 ], %o0 if ( !information ) { 40007bd0: 80 a2 20 00 cmp %o0, 0 40007bd4: 12 80 00 04 bne 40007be4 40007bd8: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 40007bdc: 10 80 00 04 b 40007bec <== NOT EXECUTED 40007be0: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED goto done; } tp = (Thread_Control *) _Objects_Get( information, id, location ); 40007be4: 40 00 06 1f call 40009460 <_Objects_Get> 40007be8: 94 07 bf f4 add %fp, -12, %o2 register Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); switch ( location ) { 40007bec: c2 07 bf f4 ld [ %fp + -12 ], %g1 40007bf0: 80 a0 60 00 cmp %g1, 0 40007bf4: 22 80 00 07 be,a 40007c10 40007bf8: 94 10 00 19 mov %i1, %o2 40007bfc: 80 a0 60 02 cmp %g1, 2 40007c00: 08 80 00 0b bleu 40007c2c 40007c04: b0 10 20 04 mov 4, %i0 40007c08: 81 c7 e0 08 ret <== NOT EXECUTED 40007c0c: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: if ( _Thread_Restart( the_thread, NULL, argument ) ) { 40007c10: 40 00 0d 95 call 4000b264 <_Thread_Restart> 40007c14: 92 10 20 00 clr %o1 40007c18: 80 a2 20 00 cmp %o0, 0 40007c1c: 02 80 00 06 be 40007c34 40007c20: 01 00 00 00 nop _Thread_Enable_dispatch(); 40007c24: 7f ff ff c2 call 40007b2c <_Thread_Enable_dispatch> 40007c28: b0 10 20 00 clr %i0 ! 0 40007c2c: 81 c7 e0 08 ret 40007c30: 81 e8 00 00 restore return RTEMS_SUCCESSFUL; } _Thread_Enable_dispatch(); 40007c34: 7f ff ff be call 40007b2c <_Thread_Enable_dispatch> 40007c38: b0 10 20 0e mov 0xe, %i0 return RTEMS_INCORRECT_STATE; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40007c3c: 81 c7 e0 08 ret 40007c40: 81 e8 00 00 restore 4000852c : */ rtems_status_code rtems_task_resume( Objects_Id id ) { 4000852c: 9d e3 bf 90 save %sp, -112, %sp uint32_t the_api; uint32_t the_class; Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { 40008530: 92 96 20 00 orcc %i0, 0, %o1 40008534: 12 80 00 0a bne 4000855c 40008538: 83 32 60 18 srl %o1, 0x18, %g1 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 4000853c: 03 10 00 9e sethi %hi(0x40027800), %g1 40008540: c4 00 61 f0 ld [ %g1 + 0x1f0 ], %g2 ! 400279f0 <_Thread_Dispatch_disable_level> 40008544: 84 00 a0 01 inc %g2 40008548: c4 20 61 f0 st %g2, [ %g1 + 0x1f0 ] Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; tp = _Thread_Executing; 4000854c: 03 10 00 9e sethi %hi(0x40027800), %g1 40008550: d0 00 62 cc ld [ %g1 + 0x2cc ], %o0 ! 40027acc <_Thread_Executing> Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; 40008554: 10 80 00 19 b 400085b8 40008558: c0 27 bf f4 clr [ %fp + -12 ] 4000855c: 84 08 60 07 and %g1, 7, %g2 tp = _Thread_Executing; goto done; } the_api = _Objects_Get_API( id ); if ( the_api && the_api > OBJECTS_APIS_LAST ) { 40008560: 80 a0 a0 04 cmp %g2, 4 40008564: 18 80 00 06 bgu 4000857c 40008568: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; goto done; } the_class = _Objects_Get_class( id ); if ( the_class != 1 ) { /* threads are always first class :) */ 4000856c: 83 32 60 1b srl %o1, 0x1b, %g1 40008570: 80 a0 60 01 cmp %g1, 1 40008574: 02 80 00 05 be 40008588 40008578: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 4000857c: 90 10 20 00 clr %o0 40008580: 10 80 00 0e b 400085b8 40008584: c2 27 bf f4 st %g1, [ %fp + -12 ] goto done; } information = _Objects_Information_table[ the_api ][ the_class ]; 40008588: 83 28 a0 02 sll %g2, 2, %g1 4000858c: 05 10 00 9e sethi %hi(0x40027800), %g2 40008590: 84 10 a1 50 or %g2, 0x150, %g2 ! 40027950 <_Objects_Information_table> 40008594: c2 00 80 01 ld [ %g2 + %g1 ], %g1 40008598: d0 00 60 04 ld [ %g1 + 4 ], %o0 if ( !information ) { 4000859c: 80 a2 20 00 cmp %o0, 0 400085a0: 12 80 00 04 bne 400085b0 400085a4: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 400085a8: 10 80 00 04 b 400085b8 <== NOT EXECUTED 400085ac: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED goto done; } tp = (Thread_Control *) _Objects_Get( information, id, location ); 400085b0: 40 00 06 f9 call 4000a194 <_Objects_Get> 400085b4: 94 07 bf f4 add %fp, -12, %o2 register Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); switch ( location ) { 400085b8: c2 07 bf f4 ld [ %fp + -12 ], %g1 400085bc: 80 a0 60 00 cmp %g1, 0 400085c0: 22 80 00 07 be,a 400085dc 400085c4: c2 02 20 10 ld [ %o0 + 0x10 ], %g1 400085c8: 80 a0 60 02 cmp %g1, 2 400085cc: 08 80 00 0b bleu 400085f8 400085d0: b0 10 20 04 mov 4, %i0 400085d4: 81 c7 e0 08 ret <== NOT EXECUTED 400085d8: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: if ( _States_Is_suspended( the_thread->current_state ) ) { 400085dc: 80 88 60 02 btst 2, %g1 400085e0: 02 80 00 08 be 40008600 400085e4: 92 10 20 01 mov 1, %o1 _Thread_Resume( the_thread, TRUE ); 400085e8: 40 00 0e 82 call 4000bff0 <_Thread_Resume> 400085ec: b0 10 20 00 clr %i0 _Thread_Enable_dispatch(); 400085f0: 7f ff ff c2 call 400084f8 <_Thread_Enable_dispatch> 400085f4: 01 00 00 00 nop 400085f8: 81 c7 e0 08 ret 400085fc: 81 e8 00 00 restore return RTEMS_SUCCESSFUL; } _Thread_Enable_dispatch(); 40008600: 7f ff ff be call 400084f8 <_Thread_Enable_dispatch> 40008604: b0 10 20 0e mov 0xe, %i0 return RTEMS_INCORRECT_STATE; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40008608: 81 c7 e0 08 ret 4000860c: 81 e8 00 00 restore 40008978 : rtems_status_code rtems_task_set_note( Objects_Id id, uint32_t notepad, uint32_t note ) { 40008978: 9d e3 bf 90 save %sp, -112, %sp 4000897c: 92 10 00 18 mov %i0, %o1 /* * NOTE: There is no check for < RTEMS_NOTEPAD_FIRST because that would * be checking an unsigned number for being negative. */ if ( notepad > RTEMS_NOTEPAD_LAST ) 40008980: 80 a6 60 0f cmp %i1, 0xf 40008984: 18 80 00 3e bgu 40008a7c 40008988: b0 10 20 0a mov 0xa, %i0 /* * Optimize the most likely case to avoid the Thread_Dispatch. */ if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) || 4000898c: 80 a2 60 00 cmp %o1, 0 40008990: 02 80 00 08 be 400089b0 40008994: 03 10 00 82 sethi %hi(0x40020800), %g1 40008998: c2 00 60 4c ld [ %g1 + 0x4c ], %g1 ! 4002084c <_Thread_Executing> 4000899c: c2 00 60 08 ld [ %g1 + 8 ], %g1 400089a0: 80 a2 40 01 cmp %o1, %g1 400089a4: 12 80 00 09 bne 400089c8 400089a8: 83 32 60 18 srl %o1, 0x18, %g1 _Objects_Are_ids_equal( id, _Thread_Executing->Object.id ) ) { api = _Thread_Executing->API_Extensions[ THREAD_API_RTEMS ]; api->Notepads[ notepad ] = note; 400089ac: 03 10 00 82 sethi %hi(0x40020800), %g1 <== NOT EXECUTED 400089b0: c2 00 60 4c ld [ %g1 + 0x4c ], %g1 ! 4002084c <_Thread_Executing> <== NOT EXECUTED 400089b4: 85 2e 60 02 sll %i1, 2, %g2 <== NOT EXECUTED 400089b8: c2 00 61 6c ld [ %g1 + 0x16c ], %g1 <== NOT EXECUTED 400089bc: f4 20 40 02 st %i2, [ %g1 + %g2 ] <== NOT EXECUTED 400089c0: 81 c7 e0 08 ret <== NOT EXECUTED 400089c4: 91 e8 20 00 restore %g0, 0, %o0 <== NOT EXECUTED 400089c8: 84 08 60 07 and %g1, 7, %g2 tp = _Thread_Executing; goto done; } the_api = _Objects_Get_API( id ); if ( the_api && the_api > OBJECTS_APIS_LAST ) { 400089cc: 80 a0 a0 04 cmp %g2, 4 400089d0: 18 80 00 06 bgu 400089e8 400089d4: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; goto done; } the_class = _Objects_Get_class( id ); if ( the_class != 1 ) { /* threads are always first class :) */ 400089d8: 83 32 60 1b srl %o1, 0x1b, %g1 400089dc: 80 a0 60 01 cmp %g1, 1 400089e0: 02 80 00 05 be 400089f4 400089e4: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 400089e8: 90 10 20 00 clr %o0 400089ec: 10 80 00 0e b 40008a24 400089f0: c2 27 bf f4 st %g1, [ %fp + -12 ] goto done; } information = _Objects_Information_table[ the_api ][ the_class ]; 400089f4: 83 28 a0 02 sll %g2, 2, %g1 400089f8: 05 10 00 81 sethi %hi(0x40020400), %g2 400089fc: 84 10 a2 d0 or %g2, 0x2d0, %g2 ! 400206d0 <_Objects_Information_table> 40008a00: c2 00 80 01 ld [ %g2 + %g1 ], %g1 40008a04: d0 00 60 04 ld [ %g1 + 4 ], %o0 if ( !information ) { 40008a08: 80 a2 20 00 cmp %o0, 0 40008a0c: 12 80 00 04 bne 40008a1c 40008a10: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 40008a14: 10 80 00 04 b 40008a24 <== NOT EXECUTED 40008a18: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED goto done; } tp = (Thread_Control *) _Objects_Get( information, id, location ); 40008a1c: 40 00 06 9b call 4000a488 <_Objects_Get> 40008a20: 94 07 bf f4 add %fp, -12, %o2 return RTEMS_SUCCESSFUL; } the_thread = _Thread_Get( id, &location ); switch ( location ) { 40008a24: c2 07 bf f4 ld [ %fp + -12 ], %g1 40008a28: 80 a0 60 00 cmp %g1, 0 40008a2c: 22 80 00 07 be,a 40008a48 40008a30: c4 02 21 6c ld [ %o0 + 0x16c ], %g2 40008a34: 80 a0 60 02 cmp %g1, 2 40008a38: 08 80 00 11 bleu 40008a7c 40008a3c: b0 10 20 04 mov 4, %i0 40008a40: 81 c7 e0 08 ret <== NOT EXECUTED 40008a44: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: api = the_thread->API_Extensions[ THREAD_API_RTEMS ]; api->Notepads[ notepad ] = note; 40008a48: 83 2e 60 02 sll %i1, 2, %g1 40008a4c: f4 20 80 01 st %i2, [ %g2 + %g1 ] #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40008a50: 05 10 00 81 sethi %hi(0x40020400), %g2 40008a54: c2 00 a3 70 ld [ %g2 + 0x370 ], %g1 ! 40020770 <_Thread_Dispatch_disable_level> 40008a58: b0 10 20 00 clr %i0 40008a5c: 82 00 7f ff add %g1, -1, %g1 40008a60: c2 20 a3 70 st %g1, [ %g2 + 0x370 ] 40008a64: c2 00 a3 70 ld [ %g2 + 0x370 ], %g1 40008a68: 80 a0 60 00 cmp %g1, 0 40008a6c: 12 80 00 04 bne 40008a7c 40008a70: 01 00 00 00 nop _Thread_Dispatch(); 40008a74: 40 00 0b 3a call 4000b75c <_Thread_Dispatch> 40008a78: 01 00 00 00 nop _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40008a7c: 81 c7 e0 08 ret 40008a80: 81 e8 00 00 restore 4000b4d8 : rtems_status_code rtems_task_set_priority( Objects_Id id, rtems_task_priority new_priority, rtems_task_priority *old_priority ) { 4000b4d8: 9d e3 bf 90 save %sp, -112, %sp register Thread_Control *the_thread; Objects_Locations location; if ( new_priority != RTEMS_CURRENT_PRIORITY && 4000b4dc: 80 a6 60 00 cmp %i1, 0 4000b4e0: 02 80 00 06 be 4000b4f8 4000b4e4: 92 10 00 18 mov %i0, %o1 4000b4e8: 82 06 7f ff add %i1, -1, %g1 4000b4ec: 80 a0 60 fe cmp %g1, 0xfe 4000b4f0: 18 80 00 49 bgu 4000b614 4000b4f4: b0 10 20 13 mov 0x13, %i0 !_RTEMS_tasks_Priority_is_valid( new_priority ) ) return RTEMS_INVALID_PRIORITY; if ( !old_priority ) 4000b4f8: 80 a6 a0 00 cmp %i2, 0 4000b4fc: 02 80 00 46 be 4000b614 4000b500: b0 10 20 09 mov 9, %i0 uint32_t the_api; uint32_t the_class; Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { 4000b504: 80 a2 60 00 cmp %o1, 0 4000b508: 12 80 00 0a bne 4000b530 4000b50c: 83 32 60 18 srl %o1, 0x18, %g1 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 4000b510: 03 10 00 a7 sethi %hi(0x40029c00), %g1 4000b514: c4 00 60 60 ld [ %g1 + 0x60 ], %g2 ! 40029c60 <_Thread_Dispatch_disable_level> 4000b518: 84 00 a0 01 inc %g2 4000b51c: c4 20 60 60 st %g2, [ %g1 + 0x60 ] Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; tp = _Thread_Executing; 4000b520: 03 10 00 a7 sethi %hi(0x40029c00), %g1 4000b524: d0 00 61 3c ld [ %g1 + 0x13c ], %o0 ! 40029d3c <_Thread_Executing> Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; 4000b528: 10 80 00 19 b 4000b58c 4000b52c: c0 27 bf f4 clr [ %fp + -12 ] 4000b530: 84 08 60 07 and %g1, 7, %g2 tp = _Thread_Executing; goto done; } the_api = _Objects_Get_API( id ); if ( the_api && the_api > OBJECTS_APIS_LAST ) { 4000b534: 80 a0 a0 04 cmp %g2, 4 4000b538: 18 80 00 06 bgu 4000b550 4000b53c: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; goto done; } the_class = _Objects_Get_class( id ); if ( the_class != 1 ) { /* threads are always first class :) */ 4000b540: 83 32 60 1b srl %o1, 0x1b, %g1 4000b544: 80 a0 60 01 cmp %g1, 1 4000b548: 02 80 00 05 be 4000b55c 4000b54c: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 4000b550: 90 10 20 00 clr %o0 4000b554: 10 80 00 0e b 4000b58c 4000b558: c2 27 bf f4 st %g1, [ %fp + -12 ] goto done; } information = _Objects_Information_table[ the_api ][ the_class ]; 4000b55c: 83 28 a0 02 sll %g2, 2, %g1 4000b560: 05 10 00 a6 sethi %hi(0x40029800), %g2 4000b564: 84 10 a3 c0 or %g2, 0x3c0, %g2 ! 40029bc0 <_Objects_Information_table> 4000b568: c2 00 80 01 ld [ %g2 + %g1 ], %g1 4000b56c: d0 00 60 04 ld [ %g1 + 4 ], %o0 if ( !information ) { 4000b570: 80 a2 20 00 cmp %o0, 0 4000b574: 12 80 00 04 bne 4000b584 4000b578: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 4000b57c: 10 80 00 04 b 4000b58c <== NOT EXECUTED 4000b580: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED goto done; } tp = (Thread_Control *) _Objects_Get( information, id, location ); 4000b584: 40 00 06 3d call 4000ce78 <_Objects_Get> 4000b588: 94 07 bf f4 add %fp, -12, %o2 return RTEMS_INVALID_ADDRESS; the_thread = _Thread_Get( id, &location ); switch ( location ) { 4000b58c: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000b590: 80 a0 60 00 cmp %g1, 0 4000b594: 22 80 00 07 be,a 4000b5b0 4000b598: c2 02 20 14 ld [ %o0 + 0x14 ], %g1 4000b59c: 80 a0 60 02 cmp %g1, 2 4000b5a0: 08 80 00 1d bleu 4000b614 4000b5a4: b0 10 20 04 mov 4, %i0 4000b5a8: 81 c7 e0 08 ret <== NOT EXECUTED 4000b5ac: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED return RTEMS_INVALID_ID; case OBJECTS_LOCAL: /* XXX convert from core priority */ *old_priority = the_thread->current_priority; if ( new_priority != RTEMS_CURRENT_PRIORITY ) { 4000b5b0: 80 a6 60 00 cmp %i1, 0 4000b5b4: 02 80 00 0d be 4000b5e8 4000b5b8: c2 26 80 00 st %g1, [ %i2 ] the_thread->real_priority = new_priority; if ( the_thread->resource_count == 0 || 4000b5bc: c2 02 20 1c ld [ %o0 + 0x1c ], %g1 4000b5c0: 80 a0 60 00 cmp %g1, 0 4000b5c4: 02 80 00 06 be 4000b5dc 4000b5c8: f2 22 20 18 st %i1, [ %o0 + 0x18 ] 4000b5cc: c2 02 20 14 ld [ %o0 + 0x14 ], %g1 4000b5d0: 80 a0 40 19 cmp %g1, %i1 4000b5d4: 08 80 00 05 bleu 4000b5e8 4000b5d8: 01 00 00 00 nop the_thread->current_priority > new_priority ) _Thread_Change_priority( the_thread, new_priority, FALSE ); 4000b5dc: 92 10 00 19 mov %i1, %o1 4000b5e0: 40 00 09 ee call 4000dd98 <_Thread_Change_priority> 4000b5e4: 94 10 20 00 clr %o2 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 4000b5e8: 03 10 00 a7 sethi %hi(0x40029c00), %g1 4000b5ec: c4 00 60 60 ld [ %g1 + 0x60 ], %g2 ! 40029c60 <_Thread_Dispatch_disable_level> 4000b5f0: b0 10 20 00 clr %i0 4000b5f4: 84 00 bf ff add %g2, -1, %g2 4000b5f8: c4 20 60 60 st %g2, [ %g1 + 0x60 ] 4000b5fc: c2 00 60 60 ld [ %g1 + 0x60 ], %g1 4000b600: 80 a0 60 00 cmp %g1, 0 4000b604: 12 80 00 04 bne 4000b614 4000b608: 01 00 00 00 nop _Thread_Dispatch(); 4000b60c: 40 00 0b 0f call 4000e248 <_Thread_Dispatch> 4000b610: 01 00 00 00 nop _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 4000b614: 81 c7 e0 08 ret 4000b618: 81 e8 00 00 restore 40006fc0 : rtems_status_code rtems_task_start( rtems_id id, rtems_task_entry entry_point, rtems_task_argument argument ) { 40006fc0: 9d e3 bf 90 save %sp, -112, %sp 40006fc4: 92 10 00 18 mov %i0, %o1 register Thread_Control *the_thread; Objects_Locations location; if ( entry_point == NULL ) 40006fc8: 80 a6 60 00 cmp %i1, 0 40006fcc: 02 80 00 36 be 400070a4 40006fd0: b0 10 20 09 mov 9, %i0 uint32_t the_api; uint32_t the_class; Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { 40006fd4: 80 a2 60 00 cmp %o1, 0 40006fd8: 12 80 00 0a bne 40007000 40006fdc: 83 32 60 18 srl %o1, 0x18, %g1 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40006fe0: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40006fe4: c4 00 61 d0 ld [ %g1 + 0x1d0 ], %g2 ! 4001add0 <_Thread_Dispatch_disable_level> 40006fe8: 84 00 a0 01 inc %g2 40006fec: c4 20 61 d0 st %g2, [ %g1 + 0x1d0 ] Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; tp = _Thread_Executing; 40006ff0: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40006ff4: d0 00 62 ac ld [ %g1 + 0x2ac ], %o0 ! 4001aeac <_Thread_Executing> Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; 40006ff8: 10 80 00 19 b 4000705c 40006ffc: c0 27 bf f4 clr [ %fp + -12 ] 40007000: 84 08 60 07 and %g1, 7, %g2 tp = _Thread_Executing; goto done; } the_api = _Objects_Get_API( id ); if ( the_api && the_api > OBJECTS_APIS_LAST ) { 40007004: 80 a0 a0 04 cmp %g2, 4 40007008: 18 80 00 06 bgu 40007020 4000700c: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; goto done; } the_class = _Objects_Get_class( id ); if ( the_class != 1 ) { /* threads are always first class :) */ 40007010: 83 32 60 1b srl %o1, 0x1b, %g1 40007014: 80 a0 60 01 cmp %g1, 1 40007018: 02 80 00 05 be 4000702c 4000701c: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 40007020: 90 10 20 00 clr %o0 40007024: 10 80 00 0e b 4000705c 40007028: c2 27 bf f4 st %g1, [ %fp + -12 ] goto done; } information = _Objects_Information_table[ the_api ][ the_class ]; 4000702c: 83 28 a0 02 sll %g2, 2, %g1 40007030: 05 10 00 6b sethi %hi(0x4001ac00), %g2 40007034: 84 10 a1 30 or %g2, 0x130, %g2 ! 4001ad30 <_Objects_Information_table> 40007038: c2 00 80 01 ld [ %g2 + %g1 ], %g1 4000703c: d0 00 60 04 ld [ %g1 + 4 ], %o0 if ( !information ) { 40007040: 80 a2 20 00 cmp %o0, 0 40007044: 12 80 00 04 bne 40007054 40007048: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 4000704c: 10 80 00 04 b 4000705c <== NOT EXECUTED 40007050: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED goto done; } tp = (Thread_Control *) _Objects_Get( information, id, location ); 40007054: 40 00 05 72 call 4000861c <_Objects_Get> 40007058: 94 07 bf f4 add %fp, -12, %o2 return RTEMS_INVALID_ADDRESS; the_thread = _Thread_Get( id, &location ); switch ( location ) { 4000705c: c2 07 bf f4 ld [ %fp + -12 ], %g1 40007060: 80 a0 60 00 cmp %g1, 0 40007064: 22 80 00 07 be,a 40007080 40007068: 94 10 00 19 mov %i1, %o2 4000706c: 80 a0 60 02 cmp %g1, 2 40007070: 08 80 00 0d bleu 400070a4 40007074: b0 10 20 04 mov 4, %i0 40007078: 81 c7 e0 08 ret <== NOT EXECUTED 4000707c: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: if ( _Thread_Start( 40007080: 98 10 00 1a mov %i2, %o4 40007084: 92 10 20 00 clr %o1 40007088: 40 00 0d ff call 4000a884 <_Thread_Start> 4000708c: 96 10 20 00 clr %o3 40007090: 80 a2 20 00 cmp %o0, 0 40007094: 02 80 00 06 be 400070ac 40007098: 01 00 00 00 nop the_thread, THREAD_START_NUMERIC, entry_point, NULL, argument ) ) { _Thread_Enable_dispatch(); 4000709c: 7f ff ff bc call 40006f8c <_Thread_Enable_dispatch> 400070a0: b0 10 20 00 clr %i0 ! 0 400070a4: 81 c7 e0 08 ret 400070a8: 81 e8 00 00 restore return RTEMS_SUCCESSFUL; } _Thread_Enable_dispatch(); 400070ac: 7f ff ff b8 call 40006f8c <_Thread_Enable_dispatch> 400070b0: b0 10 20 0e mov 0xe, %i0 return RTEMS_INCORRECT_STATE; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 400070b4: 81 c7 e0 08 ret 400070b8: 81 e8 00 00 restore 40008774 : */ rtems_status_code rtems_task_suspend( Objects_Id id ) { 40008774: 9d e3 bf 90 save %sp, -112, %sp uint32_t the_api; uint32_t the_class; Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { 40008778: 92 96 20 00 orcc %i0, 0, %o1 4000877c: 12 80 00 0a bne 400087a4 40008780: 83 32 60 18 srl %o1, 0x18, %g1 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40008784: 03 10 00 9e sethi %hi(0x40027800), %g1 40008788: c4 00 61 f0 ld [ %g1 + 0x1f0 ], %g2 ! 400279f0 <_Thread_Dispatch_disable_level> 4000878c: 84 00 a0 01 inc %g2 40008790: c4 20 61 f0 st %g2, [ %g1 + 0x1f0 ] Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; tp = _Thread_Executing; 40008794: 03 10 00 9e sethi %hi(0x40027800), %g1 40008798: d0 00 62 cc ld [ %g1 + 0x2cc ], %o0 ! 40027acc <_Thread_Executing> Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; 4000879c: 10 80 00 19 b 40008800 400087a0: c0 27 bf f4 clr [ %fp + -12 ] 400087a4: 84 08 60 07 and %g1, 7, %g2 tp = _Thread_Executing; goto done; } the_api = _Objects_Get_API( id ); if ( the_api && the_api > OBJECTS_APIS_LAST ) { 400087a8: 80 a0 a0 04 cmp %g2, 4 400087ac: 18 80 00 06 bgu 400087c4 400087b0: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; goto done; } the_class = _Objects_Get_class( id ); if ( the_class != 1 ) { /* threads are always first class :) */ 400087b4: 83 32 60 1b srl %o1, 0x1b, %g1 400087b8: 80 a0 60 01 cmp %g1, 1 400087bc: 02 80 00 05 be 400087d0 400087c0: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 400087c4: 90 10 20 00 clr %o0 400087c8: 10 80 00 0e b 40008800 400087cc: c2 27 bf f4 st %g1, [ %fp + -12 ] goto done; } information = _Objects_Information_table[ the_api ][ the_class ]; 400087d0: 83 28 a0 02 sll %g2, 2, %g1 400087d4: 05 10 00 9e sethi %hi(0x40027800), %g2 400087d8: 84 10 a1 50 or %g2, 0x150, %g2 ! 40027950 <_Objects_Information_table> 400087dc: c2 00 80 01 ld [ %g2 + %g1 ], %g1 400087e0: d0 00 60 04 ld [ %g1 + 4 ], %o0 if ( !information ) { 400087e4: 80 a2 20 00 cmp %o0, 0 400087e8: 12 80 00 04 bne 400087f8 400087ec: 82 10 20 02 mov 2, %g1 *location = OBJECTS_ERROR; 400087f0: 10 80 00 04 b 40008800 <== NOT EXECUTED 400087f4: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED goto done; } tp = (Thread_Control *) _Objects_Get( information, id, location ); 400087f8: 40 00 06 67 call 4000a194 <_Objects_Get> 400087fc: 94 07 bf f4 add %fp, -12, %o2 register Thread_Control *the_thread; Objects_Locations location; the_thread = _Thread_Get( id, &location ); switch ( location ) { 40008800: c2 07 bf f4 ld [ %fp + -12 ], %g1 40008804: 80 a0 60 00 cmp %g1, 0 40008808: 22 80 00 07 be,a 40008824 4000880c: c2 02 20 10 ld [ %o0 + 0x10 ], %g1 40008810: 80 a0 60 02 cmp %g1, 2 40008814: 08 80 00 0b bleu 40008840 40008818: b0 10 20 04 mov 4, %i0 4000881c: 81 c7 e0 08 ret <== NOT EXECUTED 40008820: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: if ( !_States_Is_suspended( the_thread->current_state ) ) { 40008824: 80 88 60 02 btst 2, %g1 40008828: 12 80 00 08 bne 40008848 4000882c: 01 00 00 00 nop _Thread_Suspend( the_thread ); 40008830: 40 00 0f 1c call 4000c4a0 <_Thread_Suspend> 40008834: b0 10 20 00 clr %i0 ! 0 _Thread_Enable_dispatch(); 40008838: 7f ff ff c2 call 40008740 <_Thread_Enable_dispatch> 4000883c: 01 00 00 00 nop 40008840: 81 c7 e0 08 ret 40008844: 81 e8 00 00 restore return RTEMS_SUCCESSFUL; } _Thread_Enable_dispatch(); 40008848: 7f ff ff be call 40008740 <_Thread_Enable_dispatch> 4000884c: b0 10 20 0f mov 0xf, %i0 return RTEMS_ALREADY_SUSPENDED; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40008850: 81 c7 e0 08 ret 40008854: 81 e8 00 00 restore 40019704 : rtems_status_code rtems_task_variable_add( rtems_id tid, void **ptr, void (*dtor)(void *) ) { 40019704: 9d e3 bf 90 save %sp, -112, %sp 40019708: 92 10 00 18 mov %i0, %o1 Thread_Control *the_thread; Objects_Locations location; rtems_task_variable_t *tvp, *new; if ( !ptr ) 4001970c: 80 a6 60 00 cmp %i1, 0 40019710: 02 80 00 32 be 400197d8 40019714: b0 10 20 09 mov 9, %i0 uint32_t the_api; uint32_t the_class; Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { 40019718: 80 a2 60 00 cmp %o1, 0 4001971c: 12 80 00 0a bne 40019744 40019720: 83 32 60 18 srl %o1, 0x18, %g1 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40019724: 03 10 00 ef sethi %hi(0x4003bc00), %g1 40019728: c4 00 63 20 ld [ %g1 + 0x320 ], %g2 ! 4003bf20 <_Thread_Dispatch_disable_level> 4001972c: 84 00 a0 01 inc %g2 40019730: c4 20 63 20 st %g2, [ %g1 + 0x320 ] Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; tp = _Thread_Executing; 40019734: 03 10 00 ef sethi %hi(0x4003bc00), %g1 40019738: f0 00 63 fc ld [ %g1 + 0x3fc ], %i0 ! 4003bffc <_Thread_Executing> Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; 4001973c: 10 80 00 18 b 4001979c 40019740: c0 27 bf f4 clr [ %fp + -12 ] 40019744: 84 08 60 07 and %g1, 7, %g2 <== NOT EXECUTED tp = _Thread_Executing; goto done; } the_api = _Objects_Get_API( id ); if ( the_api && the_api > OBJECTS_APIS_LAST ) { 40019748: 80 a0 a0 04 cmp %g2, 4 <== NOT EXECUTED 4001974c: 18 80 00 0e bgu 40019784 <== NOT EXECUTED 40019750: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED *location = OBJECTS_ERROR; goto done; } the_class = _Objects_Get_class( id ); if ( the_class != 1 ) { /* threads are always first class :) */ 40019754: 83 32 60 1b srl %o1, 0x1b, %g1 <== NOT EXECUTED 40019758: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 4001975c: 12 80 00 0a bne 40019784 <== NOT EXECUTED 40019760: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED *location = OBJECTS_ERROR; goto done; } information = _Objects_Information_table[ the_api ][ the_class ]; 40019764: 83 28 a0 02 sll %g2, 2, %g1 <== NOT EXECUTED 40019768: 05 10 00 ef sethi %hi(0x4003bc00), %g2 <== NOT EXECUTED 4001976c: 84 10 a2 80 or %g2, 0x280, %g2 ! 4003be80 <_Objects_Information_table> <== NOT EXECUTED 40019770: c2 00 80 01 ld [ %g2 + %g1 ], %g1 <== NOT EXECUTED 40019774: d0 00 60 04 ld [ %g1 + 4 ], %o0 <== NOT EXECUTED if ( !information ) { 40019778: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 4001977c: 12 80 00 05 bne 40019790 <== NOT EXECUTED 40019780: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED *location = OBJECTS_ERROR; 40019784: b0 10 20 00 clr %i0 <== NOT EXECUTED 40019788: 10 80 00 05 b 4001979c <== NOT EXECUTED 4001978c: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED goto done; } tp = (Thread_Control *) _Objects_Get( information, id, location ); 40019790: 7f ff c9 42 call 4000bc98 <_Objects_Get> <== NOT EXECUTED 40019794: 94 07 bf f4 add %fp, -12, %o2 <== NOT EXECUTED 40019798: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED return RTEMS_INVALID_ADDRESS; the_thread = _Thread_Get (tid, &location); switch (location) { 4001979c: c2 07 bf f4 ld [ %fp + -12 ], %g1 400197a0: 80 a0 60 00 cmp %g1, 0 400197a4: 22 80 00 0f be,a 400197e0 400197a8: c4 06 21 7c ld [ %i0 + 0x17c ], %g2 400197ac: 80 a0 60 02 cmp %g1, 2 <== NOT EXECUTED 400197b0: 08 80 00 0a bleu 400197d8 <== NOT EXECUTED 400197b4: b0 10 20 04 mov 4, %i0 <== NOT EXECUTED 400197b8: 81 c7 e0 08 ret <== NOT EXECUTED 400197bc: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED * Figure out if the variable is already in this task's list. */ tvp = the_thread->task_variables; while (tvp) { if (tvp->ptr == ptr) { 400197c0: 80 a0 40 19 cmp %g1, %i1 <== NOT EXECUTED 400197c4: 32 80 00 07 bne,a 400197e0 <== NOT EXECUTED 400197c8: c4 00 80 00 ld [ %g2 ], %g2 <== NOT EXECUTED tvp->dtor = dtor; 400197cc: f4 20 a0 10 st %i2, [ %g2 + 0x10 ] <== NOT EXECUTED _Thread_Enable_dispatch(); 400197d0: 7f ff ff c0 call 400196d0 <_Thread_Enable_dispatch> <== NOT EXECUTED 400197d4: b0 10 20 00 clr %i0 <== NOT EXECUTED 400197d8: 81 c7 e0 08 ret <== NOT EXECUTED 400197dc: 81 e8 00 00 restore <== NOT EXECUTED /* * Figure out if the variable is already in this task's list. */ tvp = the_thread->task_variables; while (tvp) { 400197e0: 80 a0 a0 00 cmp %g2, 0 400197e4: 32 bf ff f7 bne,a 400197c0 400197e8: c2 00 a0 04 ld [ %g2 + 4 ], %g1 <== NOT EXECUTED 400197ec: 11 10 00 ef sethi %hi(0x4003bc00), %o0 400197f0: 92 10 20 14 mov 0x14, %o1 400197f4: 7f ff c6 8d call 4000b228 <_Heap_Allocate> 400197f8: 90 12 23 6c or %o0, 0x36c, %o0 * Now allocate memory for this task variable. */ new = (rtems_task_variable_t *) _Workspace_Allocate(sizeof(rtems_task_variable_t)); if (new == NULL) { 400197fc: 80 a2 20 00 cmp %o0, 0 40019800: 32 80 00 06 bne,a 40019818 40019804: c4 06 21 7c ld [ %i0 + 0x17c ], %g2 _Thread_Enable_dispatch(); 40019808: 7f ff ff b2 call 400196d0 <_Thread_Enable_dispatch> <== NOT EXECUTED 4001980c: b0 10 20 1a mov 0x1a, %i0 <== NOT EXECUTED 40019810: 81 c7 e0 08 ret <== NOT EXECUTED 40019814: 81 e8 00 00 restore <== NOT EXECUTED return RTEMS_NO_MEMORY; } new->gval = *ptr; 40019818: c2 06 40 00 ld [ %i1 ], %g1 new->ptr = ptr; new->dtor = dtor; new->next = (struct rtems_task_variable_tt *)the_thread->task_variables; the_thread->task_variables = new; 4001981c: d0 26 21 7c st %o0, [ %i0 + 0x17c ] _Workspace_Allocate(sizeof(rtems_task_variable_t)); if (new == NULL) { _Thread_Enable_dispatch(); return RTEMS_NO_MEMORY; } new->gval = *ptr; 40019820: c2 22 20 08 st %g1, [ %o0 + 8 ] new->ptr = ptr; 40019824: f2 22 20 04 st %i1, [ %o0 + 4 ] new->dtor = dtor; 40019828: f4 22 20 10 st %i2, [ %o0 + 0x10 ] new->next = (struct rtems_task_variable_tt *)the_thread->task_variables; 4001982c: c4 22 00 00 st %g2, [ %o0 ] the_thread->task_variables = new; _Thread_Enable_dispatch(); 40019830: 7f ff ff a8 call 400196d0 <_Thread_Enable_dispatch> 40019834: b0 10 20 00 clr %i0 return RTEMS_SUCCESSFUL; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40019838: 81 c7 e0 08 ret 4001983c: 81 e8 00 00 restore 40019874 : rtems_status_code rtems_task_variable_delete( rtems_id tid, void **ptr ) { 40019874: 9d e3 bf 90 save %sp, -112, %sp 40019878: 92 10 00 18 mov %i0, %o1 Thread_Control *the_thread; Objects_Locations location; rtems_task_variable_t *tvp, *prev; if ( !ptr ) 4001987c: 80 a6 60 00 cmp %i1, 0 40019880: 02 80 00 52 be 400199c8 40019884: b0 10 20 09 mov 9, %i0 uint32_t the_api; uint32_t the_class; Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { 40019888: 80 a2 60 00 cmp %o1, 0 4001988c: 12 80 00 0a bne 400198b4 40019890: 83 32 60 18 srl %o1, 0x18, %g1 rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40019894: 03 10 00 ef sethi %hi(0x4003bc00), %g1 40019898: c4 00 63 20 ld [ %g1 + 0x320 ], %g2 ! 4003bf20 <_Thread_Dispatch_disable_level> 4001989c: 84 00 a0 01 inc %g2 400198a0: c4 20 63 20 st %g2, [ %g1 + 0x320 ] Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; tp = _Thread_Executing; 400198a4: 03 10 00 ef sethi %hi(0x4003bc00), %g1 400198a8: d0 00 63 fc ld [ %g1 + 0x3fc ], %o0 ! 4003bffc <_Thread_Executing> Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; 400198ac: 10 80 00 19 b 40019910 400198b0: c0 27 bf f4 clr [ %fp + -12 ] 400198b4: 84 08 60 07 and %g1, 7, %g2 <== NOT EXECUTED tp = _Thread_Executing; goto done; } the_api = _Objects_Get_API( id ); if ( the_api && the_api > OBJECTS_APIS_LAST ) { 400198b8: 80 a0 a0 04 cmp %g2, 4 <== NOT EXECUTED 400198bc: 18 80 00 06 bgu 400198d4 <== NOT EXECUTED 400198c0: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED *location = OBJECTS_ERROR; goto done; } the_class = _Objects_Get_class( id ); if ( the_class != 1 ) { /* threads are always first class :) */ 400198c4: 83 32 60 1b srl %o1, 0x1b, %g1 <== NOT EXECUTED 400198c8: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 400198cc: 02 80 00 05 be 400198e0 <== NOT EXECUTED 400198d0: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED *location = OBJECTS_ERROR; 400198d4: 90 10 20 00 clr %o0 <== NOT EXECUTED 400198d8: 10 80 00 0e b 40019910 <== NOT EXECUTED 400198dc: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED goto done; } information = _Objects_Information_table[ the_api ][ the_class ]; 400198e0: 83 28 a0 02 sll %g2, 2, %g1 <== NOT EXECUTED 400198e4: 05 10 00 ef sethi %hi(0x4003bc00), %g2 <== NOT EXECUTED 400198e8: 84 10 a2 80 or %g2, 0x280, %g2 ! 4003be80 <_Objects_Information_table> <== NOT EXECUTED 400198ec: c2 00 80 01 ld [ %g2 + %g1 ], %g1 <== NOT EXECUTED 400198f0: d0 00 60 04 ld [ %g1 + 4 ], %o0 <== NOT EXECUTED if ( !information ) { 400198f4: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400198f8: 12 80 00 04 bne 40019908 <== NOT EXECUTED 400198fc: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED *location = OBJECTS_ERROR; 40019900: 10 80 00 04 b 40019910 <== NOT EXECUTED 40019904: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED goto done; } tp = (Thread_Control *) _Objects_Get( information, id, location ); 40019908: 7f ff c8 e4 call 4000bc98 <_Objects_Get> <== NOT EXECUTED 4001990c: 94 07 bf f4 add %fp, -12, %o2 <== NOT EXECUTED return RTEMS_INVALID_ADDRESS; prev = NULL; the_thread = _Thread_Get (tid, &location); switch (location) { 40019910: c2 07 bf f4 ld [ %fp + -12 ], %g1 40019914: 80 a0 60 00 cmp %g1, 0 40019918: 22 80 00 07 be,a 40019934 4001991c: f0 02 21 7c ld [ %o0 + 0x17c ], %i0 40019920: 80 a0 60 02 cmp %g1, 2 <== NOT EXECUTED 40019924: 08 80 00 29 bleu 400199c8 <== NOT EXECUTED 40019928: b0 10 20 04 mov 4, %i0 <== NOT EXECUTED 4001992c: 81 c7 e0 08 ret <== NOT EXECUTED 40019930: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED default: return RTEMS_INTERNAL_ERROR; case OBJECTS_LOCAL: tvp = the_thread->task_variables; 40019934: 10 80 00 28 b 400199d4 40019938: 84 10 20 00 clr %g2 while (tvp) { if (tvp->ptr == ptr) { 4001993c: 80 a0 40 19 cmp %g1, %i1 40019940: 32 80 00 24 bne,a 400199d0 40019944: 84 10 00 18 mov %i0, %g2 <== NOT EXECUTED if (prev) 40019948: 80 a0 a0 00 cmp %g2, 0 4001994c: 02 80 00 04 be 4001995c 40019950: c2 06 00 00 ld [ %i0 ], %g1 prev->next = tvp->next; 40019954: 10 80 00 03 b 40019960 <== NOT EXECUTED 40019958: c2 20 80 00 st %g1, [ %g2 ] <== NOT EXECUTED else the_thread->task_variables = (rtems_task_variable_t *)tvp->next; 4001995c: c2 22 21 7c st %g1, [ %o0 + 0x17c ] if (_Thread_Is_executing(the_thread)) { 40019960: 03 10 00 ef sethi %hi(0x4003bc00), %g1 40019964: c2 00 63 fc ld [ %g1 + 0x3fc ], %g1 ! 4003bffc <_Thread_Executing> 40019968: 80 a2 00 01 cmp %o0, %g1 4001996c: 12 80 00 0c bne 4001999c 40019970: c4 06 20 10 ld [ %i0 + 0x10 ], %g2 if (tvp->dtor) 40019974: 80 a0 a0 00 cmp %g2, 0 40019978: 22 80 00 06 be,a 40019990 4001997c: c4 06 20 04 ld [ %i0 + 4 ], %g2 (*tvp->dtor)(*tvp->ptr); 40019980: c2 06 20 04 ld [ %i0 + 4 ], %g1 <== NOT EXECUTED 40019984: 9f c0 80 00 call %g2 <== NOT EXECUTED 40019988: d0 00 40 00 ld [ %g1 ], %o0 <== NOT EXECUTED *tvp->ptr = tvp->gval; 4001998c: c4 06 20 04 ld [ %i0 + 4 ], %g2 <== NOT EXECUTED 40019990: c2 06 20 08 ld [ %i0 + 8 ], %g1 40019994: 10 80 00 07 b 400199b0 40019998: c2 20 80 00 st %g1, [ %g2 ] } else { if (tvp->dtor) 4001999c: 80 a0 a0 00 cmp %g2, 0 <== NOT EXECUTED 400199a0: 02 80 00 05 be 400199b4 <== NOT EXECUTED 400199a4: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED (*tvp->dtor)(tvp->tval); 400199a8: 9f c0 80 00 call %g2 <== NOT EXECUTED 400199ac: d0 06 20 0c ld [ %i0 + 0xc ], %o0 <== NOT EXECUTED RTEMS_INLINE_ROUTINE boolean _Workspace_Free( void *block ) { return _Heap_Free( &_Workspace_Area, block ); 400199b0: 92 10 00 18 mov %i0, %o1 400199b4: 11 10 00 ef sethi %hi(0x4003bc00), %o0 400199b8: 7f ff c6 43 call 4000b2c4 <_Heap_Free> 400199bc: 90 12 23 6c or %o0, 0x36c, %o0 ! 4003bf6c <_Workspace_Area> } _Workspace_Free(tvp); _Thread_Enable_dispatch(); 400199c0: 7f ff ff a0 call 40019840 <_Thread_Enable_dispatch> 400199c4: b0 10 20 00 clr %i0 400199c8: 81 c7 e0 08 ret 400199cc: 81 e8 00 00 restore return RTEMS_SUCCESSFUL; } prev = tvp; tvp = (rtems_task_variable_t *)tvp->next; 400199d0: f0 06 00 00 ld [ %i0 ], %i0 <== NOT EXECUTED default: return RTEMS_INTERNAL_ERROR; case OBJECTS_LOCAL: tvp = the_thread->task_variables; while (tvp) { 400199d4: 80 a6 20 00 cmp %i0, 0 400199d8: 32 bf ff d9 bne,a 4001993c 400199dc: c2 06 20 04 ld [ %i0 + 4 ], %g1 return RTEMS_SUCCESSFUL; } prev = tvp; tvp = (rtems_task_variable_t *)tvp->next; } _Thread_Enable_dispatch(); 400199e0: 7f ff ff 98 call 40019840 <_Thread_Enable_dispatch> <== NOT EXECUTED 400199e4: b0 10 20 09 mov 9, %i0 <== NOT EXECUTED return RTEMS_INVALID_ADDRESS; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 400199e8: 81 c7 e0 08 ret <== NOT EXECUTED 400199ec: 81 e8 00 00 restore <== NOT EXECUTED 40019a24 : rtems_status_code rtems_task_variable_get( rtems_id tid, void **ptr, void **result ) { 40019a24: 9d e3 bf 90 save %sp, -112, %sp <== NOT EXECUTED Thread_Control *the_thread; Objects_Locations location; rtems_task_variable_t *tvp; if ( !ptr ) 40019a28: 80 a6 60 00 cmp %i1, 0 <== NOT EXECUTED 40019a2c: 02 80 00 3f be 40019b28 <== NOT EXECUTED 40019a30: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED return RTEMS_INVALID_ADDRESS; if ( !result ) 40019a34: 80 a6 a0 00 cmp %i2, 0 <== NOT EXECUTED 40019a38: 02 80 00 3c be 40019b28 <== NOT EXECUTED 40019a3c: 80 a6 20 00 cmp %i0, 0 <== NOT EXECUTED uint32_t the_api; uint32_t the_class; Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { 40019a40: 12 80 00 0a bne 40019a68 <== NOT EXECUTED 40019a44: 83 36 20 18 srl %i0, 0x18, %g1 <== NOT EXECUTED rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40019a48: 03 10 00 ef sethi %hi(0x4003bc00), %g1 <== NOT EXECUTED 40019a4c: c4 00 63 20 ld [ %g1 + 0x320 ], %g2 ! 4003bf20 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40019a50: 84 00 a0 01 inc %g2 <== NOT EXECUTED 40019a54: c4 20 63 20 st %g2, [ %g1 + 0x320 ] <== NOT EXECUTED Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; tp = _Thread_Executing; 40019a58: 03 10 00 ef sethi %hi(0x4003bc00), %g1 <== NOT EXECUTED 40019a5c: d0 00 63 fc ld [ %g1 + 0x3fc ], %o0 ! 4003bffc <_Thread_Executing> <== NOT EXECUTED Objects_Information *information; Thread_Control *tp = (Thread_Control *) 0; if ( _Objects_Are_ids_equal( id, OBJECTS_ID_OF_SELF ) ) { _Thread_Disable_dispatch(); *location = OBJECTS_LOCAL; 40019a60: 10 80 00 19 b 40019ac4 <== NOT EXECUTED 40019a64: c0 27 bf f4 clr [ %fp + -12 ] <== NOT EXECUTED 40019a68: 84 08 60 07 and %g1, 7, %g2 <== NOT EXECUTED tp = _Thread_Executing; goto done; } the_api = _Objects_Get_API( id ); if ( the_api && the_api > OBJECTS_APIS_LAST ) { 40019a6c: 80 a0 a0 04 cmp %g2, 4 <== NOT EXECUTED 40019a70: 18 80 00 06 bgu 40019a88 <== NOT EXECUTED 40019a74: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED *location = OBJECTS_ERROR; goto done; } the_class = _Objects_Get_class( id ); if ( the_class != 1 ) { /* threads are always first class :) */ 40019a78: 83 36 20 1b srl %i0, 0x1b, %g1 <== NOT EXECUTED 40019a7c: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 40019a80: 02 80 00 05 be 40019a94 <== NOT EXECUTED 40019a84: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED *location = OBJECTS_ERROR; 40019a88: 90 10 20 00 clr %o0 <== NOT EXECUTED 40019a8c: 10 80 00 0e b 40019ac4 <== NOT EXECUTED 40019a90: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED goto done; } information = _Objects_Information_table[ the_api ][ the_class ]; 40019a94: 83 28 a0 02 sll %g2, 2, %g1 <== NOT EXECUTED 40019a98: 05 10 00 ef sethi %hi(0x4003bc00), %g2 <== NOT EXECUTED 40019a9c: 84 10 a2 80 or %g2, 0x280, %g2 ! 4003be80 <_Objects_Information_table> <== NOT EXECUTED 40019aa0: c2 00 80 01 ld [ %g2 + %g1 ], %g1 <== NOT EXECUTED 40019aa4: d0 00 60 04 ld [ %g1 + 4 ], %o0 <== NOT EXECUTED if ( !information ) { 40019aa8: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40019aac: 12 80 00 04 bne 40019abc <== NOT EXECUTED 40019ab0: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED *location = OBJECTS_ERROR; 40019ab4: 10 80 00 04 b 40019ac4 <== NOT EXECUTED 40019ab8: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED goto done; } tp = (Thread_Control *) _Objects_Get( information, id, location ); 40019abc: 7f ff c8 77 call 4000bc98 <_Objects_Get> <== NOT EXECUTED 40019ac0: 94 07 bf f4 add %fp, -12, %o2 <== NOT EXECUTED return RTEMS_INVALID_ADDRESS; the_thread = _Thread_Get (tid, &location); switch (location) { 40019ac4: c2 07 bf f4 ld [ %fp + -12 ], %g1 <== NOT EXECUTED 40019ac8: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40019acc: 22 80 00 10 be,a 40019b0c <== NOT EXECUTED 40019ad0: d0 02 21 7c ld [ %o0 + 0x17c ], %o0 <== NOT EXECUTED 40019ad4: 80 a0 60 02 cmp %g1, 2 <== NOT EXECUTED 40019ad8: 08 80 00 0b bleu 40019b04 <== NOT EXECUTED 40019adc: b0 10 20 04 mov 4, %i0 <== NOT EXECUTED 40019ae0: 81 c7 e0 08 ret <== NOT EXECUTED 40019ae4: 91 e8 20 19 restore %g0, 0x19, %o0 <== NOT EXECUTED * Figure out if the variable is in this task's list. */ tvp = the_thread->task_variables; while (tvp) { if (tvp->ptr == ptr) { 40019ae8: 80 a0 40 19 cmp %g1, %i1 <== NOT EXECUTED 40019aec: 32 80 00 08 bne,a 40019b0c <== NOT EXECUTED 40019af0: d0 02 00 00 ld [ %o0 ], %o0 <== NOT EXECUTED /* * Should this return the current (i.e not the * saved) value if `tid' is the current task? */ *result = tvp->tval; 40019af4: c2 02 20 0c ld [ %o0 + 0xc ], %g1 <== NOT EXECUTED _Thread_Enable_dispatch(); 40019af8: b0 10 20 00 clr %i0 <== NOT EXECUTED 40019afc: 7f ff ff bd call 400199f0 <_Thread_Enable_dispatch> <== NOT EXECUTED 40019b00: c2 26 80 00 st %g1, [ %i2 ] <== NOT EXECUTED 40019b04: 81 c7 e0 08 ret <== NOT EXECUTED 40019b08: 81 e8 00 00 restore <== NOT EXECUTED /* * Figure out if the variable is in this task's list. */ tvp = the_thread->task_variables; while (tvp) { 40019b0c: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40019b10: 32 bf ff f6 bne,a 40019ae8 <== NOT EXECUTED 40019b14: c2 02 20 04 ld [ %o0 + 4 ], %g1 <== NOT EXECUTED _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } tvp = (rtems_task_variable_t *)tvp->next; } _Thread_Enable_dispatch(); 40019b18: 7f ff ff b6 call 400199f0 <_Thread_Enable_dispatch> <== NOT EXECUTED 40019b1c: b0 10 20 09 mov 9, %i0 <== NOT EXECUTED 40019b20: 81 c7 e0 08 ret <== NOT EXECUTED 40019b24: 81 e8 00 00 restore <== NOT EXECUTED return RTEMS_INVALID_ADDRESS; 40019b28: b0 10 20 09 mov 9, %i0 <== NOT EXECUTED } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40019b2c: 81 c7 e0 08 ret <== NOT EXECUTED 40019b30: 81 e8 00 00 restore <== NOT EXECUTED 40003ec4 : int cbufsize, int raw_input, int raw_output ) { rtems_termios_cbufsize = cbufsize; 40003ec4: 03 10 00 67 sethi %hi(0x40019c00), %g1 <== NOT EXECUTED 40003ec8: d0 20 63 24 st %o0, [ %g1 + 0x324 ] ! 40019f24 <== NOT EXECUTED rtems_termios_raw_input_size = raw_input; 40003ecc: 03 10 00 67 sethi %hi(0x40019c00), %g1 <== NOT EXECUTED rtems_termios_raw_output_size = raw_output; return RTEMS_SUCCESSFUL; } 40003ed0: 90 10 20 00 clr %o0 <== NOT EXECUTED int raw_input, int raw_output ) { rtems_termios_cbufsize = cbufsize; rtems_termios_raw_input_size = raw_input; 40003ed4: d2 20 63 28 st %o1, [ %g1 + 0x328 ] <== NOT EXECUTED rtems_termios_raw_output_size = raw_output; 40003ed8: 03 10 00 67 sethi %hi(0x40019c00), %g1 <== NOT EXECUTED return RTEMS_SUCCESSFUL; } 40003edc: 81 c3 e0 08 retl <== NOT EXECUTED 40003ee0: d4 20 63 2c st %o2, [ %g1 + 0x32c ] ! 40019f2c <== NOT EXECUTED 40005538 : } } rtems_status_code rtems_termios_close (void *arg) { 40005538: 9d e3 bf 98 save %sp, -104, %sp rtems_libio_open_close_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; rtems_status_code sc; sc = rtems_semaphore_obtain (rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 4000553c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40005540: d0 00 60 7c ld [ %g1 + 0x7c ], %o0 ! 4001ac7c rtems_status_code rtems_termios_close (void *arg) { rtems_libio_open_close_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 40005544: c2 06 00 00 ld [ %i0 ], %g1 rtems_status_code sc; sc = rtems_semaphore_obtain (rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 40005548: 92 10 20 00 clr %o1 rtems_status_code rtems_termios_close (void *arg) { rtems_libio_open_close_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 4000554c: e0 00 60 28 ld [ %g1 + 0x28 ], %l0 rtems_status_code sc; sc = rtems_semaphore_obtain (rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 40005550: 40 00 04 9c call 400067c0 40005554: 94 10 20 00 clr %o2 if (sc != RTEMS_SUCCESSFUL) 40005558: 80 a2 20 00 cmp %o0, 0 4000555c: 22 80 00 05 be,a 40005570 40005560: c2 04 20 08 ld [ %l0 + 8 ], %g1 rtems_fatal_error_occurred (sc); 40005564: 40 00 07 96 call 400073bc <== NOT EXECUTED 40005568: 01 00 00 00 nop <== NOT EXECUTED if (--tty->refcount == 0) { 4000556c: c2 04 20 08 ld [ %l0 + 8 ], %g1 <== NOT EXECUTED 40005570: 82 00 7f ff add %g1, -1, %g1 40005574: 80 a0 60 00 cmp %g1, 0 40005578: 12 80 00 5b bne 400056e4 4000557c: c2 24 20 08 st %g1, [ %l0 + 8 ] if (rtems_termios_linesw[tty->t_line].l_close != NULL) { 40005580: c4 04 20 cc ld [ %l0 + 0xcc ], %g2 40005584: 03 10 00 6a sethi %hi(0x4001a800), %g1 40005588: 82 10 62 78 or %g1, 0x278, %g1 ! 4001aa78 4000558c: 85 28 a0 05 sll %g2, 5, %g2 40005590: 84 00 80 01 add %g2, %g1, %g2 40005594: c2 00 a0 04 ld [ %g2 + 4 ], %g1 40005598: 80 a0 60 00 cmp %g1, 0 4000559c: 02 80 00 06 be 400055b4 400055a0: 01 00 00 00 nop /* * call discipline-specific close */ sc = rtems_termios_linesw[tty->t_line].l_close(tty); 400055a4: 9f c0 40 00 call %g1 <== NOT EXECUTED 400055a8: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED * default: just flush output buffer */ drainOutput (tty); } if (tty->device.outputUsesInterrupts 400055ac: 10 80 00 05 b 400055c0 <== NOT EXECUTED 400055b0: c2 04 20 b4 ld [ %l0 + 0xb4 ], %g1 <== NOT EXECUTED } else { /* * default: just flush output buffer */ drainOutput (tty); 400055b4: 7f ff fd c5 call 40004cc8 400055b8: 90 10 00 10 mov %l0, %o0 } if (tty->device.outputUsesInterrupts 400055bc: c2 04 20 b4 ld [ %l0 + 0xb4 ], %g1 400055c0: 80 a0 60 02 cmp %g1, 2 400055c4: 32 80 00 13 bne,a 40005610 400055c8: c2 04 20 9c ld [ %l0 + 0x9c ], %g1 == TERMIOS_TASK_DRIVEN) { /* * send "terminate" to I/O tasks */ sc = rtems_event_send( 400055cc: d0 04 20 c4 ld [ %l0 + 0xc4 ], %o0 <== NOT EXECUTED 400055d0: 40 00 02 ad call 40006084 <== NOT EXECUTED 400055d4: 92 10 20 01 mov 1, %o1 <== NOT EXECUTED tty->rxTaskId, TERMIOS_RX_TERMINATE_EVENT); if (sc != RTEMS_SUCCESSFUL) 400055d8: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400055dc: 22 80 00 05 be,a 400055f0 <== NOT EXECUTED 400055e0: d0 04 20 c8 ld [ %l0 + 0xc8 ], %o0 <== NOT EXECUTED rtems_fatal_error_occurred (sc); 400055e4: 40 00 07 76 call 400073bc <== NOT EXECUTED 400055e8: 01 00 00 00 nop <== NOT EXECUTED sc = rtems_event_send( 400055ec: d0 04 20 c8 ld [ %l0 + 0xc8 ], %o0 <== NOT EXECUTED 400055f0: 40 00 02 a5 call 40006084 <== NOT EXECUTED 400055f4: 92 10 20 01 mov 1, %o1 <== NOT EXECUTED tty->txTaskId, TERMIOS_TX_TERMINATE_EVENT); if (sc != RTEMS_SUCCESSFUL) 400055f8: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400055fc: 22 80 00 05 be,a 40005610 <== NOT EXECUTED 40005600: c2 04 20 9c ld [ %l0 + 0x9c ], %g1 <== NOT EXECUTED rtems_fatal_error_occurred (sc); 40005604: 40 00 07 6e call 400073bc <== NOT EXECUTED 40005608: 01 00 00 00 nop <== NOT EXECUTED } if (tty->device.lastClose) 4000560c: c2 04 20 9c ld [ %l0 + 0x9c ], %g1 <== NOT EXECUTED 40005610: 80 a0 60 00 cmp %g1, 0 40005614: 22 80 00 07 be,a 40005630 40005618: c2 04 00 00 ld [ %l0 ], %g1 (*tty->device.lastClose)(tty->major, tty->minor, arg); 4000561c: d0 04 20 0c ld [ %l0 + 0xc ], %o0 <== NOT EXECUTED 40005620: d2 04 20 10 ld [ %l0 + 0x10 ], %o1 <== NOT EXECUTED 40005624: 9f c0 40 00 call %g1 <== NOT EXECUTED 40005628: 94 10 00 18 mov %i0, %o2 <== NOT EXECUTED if (tty->forw == NULL) { 4000562c: c2 04 00 00 ld [ %l0 ], %g1 <== NOT EXECUTED 40005630: 80 a0 60 00 cmp %g1, 0 40005634: 12 80 00 08 bne 40005654 40005638: c4 04 20 04 ld [ %l0 + 4 ], %g2 rtems_termios_ttyTail = tty->back; 4000563c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 if ( rtems_termios_ttyTail != NULL ) { 40005640: 80 a0 a0 00 cmp %g2, 0 40005644: 02 80 00 05 be 40005658 40005648: c4 20 60 80 st %g2, [ %g1 + 0x80 ] rtems_termios_ttyTail->forw = NULL; 4000564c: 10 80 00 03 b 40005658 <== NOT EXECUTED 40005650: c0 20 80 00 clr [ %g2 ] <== NOT EXECUTED } } else { tty->forw->back = tty->back; 40005654: c4 20 60 04 st %g2, [ %g1 + 4 ] <== NOT EXECUTED } if (tty->back == NULL) { 40005658: c2 04 20 04 ld [ %l0 + 4 ], %g1 4000565c: 80 a0 60 00 cmp %g1, 0 40005660: 12 80 00 08 bne 40005680 40005664: c4 04 00 00 ld [ %l0 ], %g2 rtems_termios_ttyHead = tty->forw; 40005668: 03 10 00 6b sethi %hi(0x4001ac00), %g1 if ( rtems_termios_ttyHead != NULL ) { 4000566c: 80 a0 a0 00 cmp %g2, 0 40005670: 02 80 00 05 be 40005684 40005674: c4 20 60 84 st %g2, [ %g1 + 0x84 ] rtems_termios_ttyHead->back = NULL; 40005678: 10 80 00 03 b 40005684 <== NOT EXECUTED 4000567c: c0 20 a0 04 clr [ %g2 + 4 ] <== NOT EXECUTED } } else { tty->back->forw = tty->forw; 40005680: c4 20 40 00 st %g2, [ %g1 ] <== NOT EXECUTED } rtems_semaphore_delete (tty->isem); 40005684: 40 00 04 08 call 400066a4 40005688: d0 04 20 14 ld [ %l0 + 0x14 ], %o0 rtems_semaphore_delete (tty->osem); 4000568c: 40 00 04 06 call 400066a4 40005690: d0 04 20 18 ld [ %l0 + 0x18 ], %o0 rtems_semaphore_delete (tty->rawOutBuf.Semaphore); 40005694: 40 00 04 04 call 400066a4 40005698: d0 04 20 8c ld [ %l0 + 0x8c ], %o0 if ((tty->device.pollRead == NULL) || 4000569c: c2 04 20 a0 ld [ %l0 + 0xa0 ], %g1 400056a0: 80 a0 60 00 cmp %g1, 0 400056a4: 02 80 00 06 be 400056bc 400056a8: 01 00 00 00 nop 400056ac: c2 04 20 b4 ld [ %l0 + 0xb4 ], %g1 400056b0: 80 a0 60 02 cmp %g1, 2 400056b4: 12 80 00 04 bne 400056c4 400056b8: 01 00 00 00 nop (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)) rtems_semaphore_delete (tty->rawInBuf.Semaphore); 400056bc: 40 00 03 fa call 400066a4 <== NOT EXECUTED 400056c0: d0 04 20 68 ld [ %l0 + 0x68 ], %o0 <== NOT EXECUTED free (tty->rawInBuf.theBuf); 400056c4: 7f ff f6 62 call 4000304c 400056c8: d0 04 20 58 ld [ %l0 + 0x58 ], %o0 free (tty->rawOutBuf.theBuf); 400056cc: 7f ff f6 60 call 4000304c 400056d0: d0 04 20 7c ld [ %l0 + 0x7c ], %o0 free (tty->cbuf); 400056d4: 7f ff f6 5e call 4000304c 400056d8: d0 04 20 1c ld [ %l0 + 0x1c ], %o0 free (tty); 400056dc: 7f ff f6 5c call 4000304c 400056e0: 90 10 00 10 mov %l0, %o0 } rtems_semaphore_release (rtems_termios_ttyMutex); 400056e4: 03 10 00 6b sethi %hi(0x4001ac00), %g1 400056e8: d0 00 60 7c ld [ %g1 + 0x7c ], %o0 ! 4001ac7c 400056ec: 40 00 04 fc call 40006adc 400056f0: b0 10 20 00 clr %i0 return RTEMS_SUCCESSFUL; } 400056f4: 81 c7 e0 08 ret 400056f8: 81 e8 00 00 restore 400040e8 : * for each transmitted character. * It returns number of characters left to transmit */ int rtems_termios_dequeue_characters (void *ttyp, int len) { 400040e8: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED rtems_status_code sc; /* * sum up character count already sent */ tty->t_dqlen += len; 400040ec: c2 06 20 90 ld [ %i0 + 0x90 ], %g1 <== NOT EXECUTED if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { 400040f0: c4 06 20 b4 ld [ %i0 + 0xb4 ], %g2 <== NOT EXECUTED rtems_status_code sc; /* * sum up character count already sent */ tty->t_dqlen += len; 400040f4: 82 00 40 19 add %g1, %i1, %g1 <== NOT EXECUTED 400040f8: c2 26 20 90 st %g1, [ %i0 + 0x90 ] <== NOT EXECUTED if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { 400040fc: 80 a0 a0 02 cmp %g2, 2 <== NOT EXECUTED 40004100: 12 80 00 0b bne 4000412c <== NOT EXECUTED 40004104: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED /* * send wake up to transmitter task */ sc = rtems_event_send(tty->txTaskId, 40004108: d0 06 20 c8 ld [ %i0 + 0xc8 ], %o0 <== NOT EXECUTED 4000410c: 40 00 07 de call 40006084 <== NOT EXECUTED 40004110: 92 10 20 02 mov 2, %o1 <== NOT EXECUTED TERMIOS_TX_START_EVENT); if (sc != RTEMS_SUCCESSFUL) 40004114: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40004118: 02 80 00 12 be 40004160 <== NOT EXECUTED 4000411c: b0 10 20 00 clr %i0 <== NOT EXECUTED rtems_fatal_error_occurred (sc); 40004120: 40 00 0c a7 call 400073bc <== NOT EXECUTED 40004124: 01 00 00 00 nop <== NOT EXECUTED 40004128: 30 80 00 0e b,a 40004160 <== NOT EXECUTED return 0; /* nothing to output in IRQ... */ } else if (tty->t_line == PPPDISC ) { 4000412c: c2 06 20 cc ld [ %i0 + 0xcc ], %g1 <== NOT EXECUTED 40004130: 80 a0 60 05 cmp %g1, 5 <== NOT EXECUTED 40004134: 12 80 00 09 bne 40004158 <== NOT EXECUTED 40004138: 03 10 00 6a sethi %hi(0x4001a800), %g1 <== NOT EXECUTED /* * call any line discipline start function */ if (rtems_termios_linesw[tty->t_line].l_start != NULL) { 4000413c: c2 00 63 2c ld [ %g1 + 0x32c ], %g1 ! 4001ab2c <== NOT EXECUTED 40004140: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40004144: 02 80 00 07 be 40004160 <== NOT EXECUTED 40004148: b0 10 20 00 clr %i0 <== NOT EXECUTED rtems_termios_linesw[tty->t_line].l_start(tty); 4000414c: 9f c0 40 00 call %g1 <== NOT EXECUTED 40004150: 01 00 00 00 nop <== NOT EXECUTED 40004154: 30 80 00 03 b,a 40004160 <== NOT EXECUTED } return 0; /* nothing to output in IRQ... */ } else { return rtems_termios_refill_transmitter(tty); 40004158: 7f ff ff 69 call 40003efc <== NOT EXECUTED 4000415c: 81 e8 00 00 restore <== NOT EXECUTED } } 40004160: 81 c7 e0 08 ret <== NOT EXECUTED 40004164: 81 e8 00 00 restore <== NOT EXECUTED 40004168 : * 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) { 40004168: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED char c; int dropped = 0; boolean flow_rcv = FALSE; /* TRUE, if flow control char received */ rtems_interrupt_level level; if (rtems_termios_linesw[tty->t_line].l_rint != NULL) { 4000416c: c2 06 20 cc ld [ %i0 + 0xcc ], %g1 <== NOT EXECUTED 40004170: 05 10 00 6a sethi %hi(0x4001a800), %g2 <== NOT EXECUTED 40004174: 83 28 60 05 sll %g1, 5, %g1 <== NOT EXECUTED 40004178: 84 10 a2 78 or %g2, 0x278, %g2 <== NOT EXECUTED 4000417c: 82 00 40 02 add %g1, %g2, %g1 <== NOT EXECUTED 40004180: c2 00 60 10 ld [ %g1 + 0x10 ], %g1 <== NOT EXECUTED 40004184: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40004188: 12 80 00 10 bne 400041c8 <== NOT EXECUTED 4000418c: a0 10 00 02 mov %g2, %l0 <== NOT EXECUTED 40004190: a6 10 20 00 clr %l3 <== NOT EXECUTED 40004194: ac 10 20 00 clr %l6 <== 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); 40004198: aa 06 20 30 add %i0, 0x30, %l5 <== NOT EXECUTED 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, 4000419c: 10 80 00 ac b 4000444c <== NOT EXECUTED 400041a0: a8 06 20 4a add %i0, 0x4a, %l4 <== NOT EXECUTED boolean flow_rcv = FALSE; /* TRUE, if flow control char received */ rtems_interrupt_level level; if (rtems_termios_linesw[tty->t_line].l_rint != NULL) { while (len--) { c = *buf++; 400041a4: d0 0e 40 00 ldub [ %i1 ], %o0 <== NOT EXECUTED rtems_termios_linesw[tty->t_line].l_rint(c,tty); 400041a8: 83 28 60 05 sll %g1, 5, %g1 <== NOT EXECUTED 400041ac: 82 00 40 10 add %g1, %l0, %g1 <== NOT EXECUTED 400041b0: c2 00 60 10 ld [ %g1 + 0x10 ], %g1 <== NOT EXECUTED 400041b4: 91 2a 20 18 sll %o0, 0x18, %o0 <== NOT EXECUTED boolean flow_rcv = FALSE; /* TRUE, if flow control char received */ rtems_interrupt_level level; if (rtems_termios_linesw[tty->t_line].l_rint != NULL) { while (len--) { c = *buf++; 400041b8: b2 06 60 01 inc %i1 <== NOT EXECUTED rtems_termios_linesw[tty->t_line].l_rint(c,tty); 400041bc: 91 3a 20 18 sra %o0, 0x18, %o0 <== NOT EXECUTED 400041c0: 9f c0 40 00 call %g1 <== NOT EXECUTED 400041c4: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED int dropped = 0; boolean 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--) { 400041c8: b4 06 bf ff add %i2, -1, %i2 <== NOT EXECUTED 400041cc: 80 a6 bf ff cmp %i2, -1 <== NOT EXECUTED 400041d0: 32 bf ff f5 bne,a 400041a4 <== NOT EXECUTED 400041d4: c2 06 20 cc ld [ %i0 + 0xcc ], %g1 <== NOT EXECUTED } /* * check to see if rcv wakeup callback was set */ if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) { 400041d8: c2 06 20 e4 ld [ %i0 + 0xe4 ], %g1 <== NOT EXECUTED 400041dc: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400041e0: 12 80 00 a6 bne 40004478 <== NOT EXECUTED 400041e4: a6 10 20 00 clr %l3 <== NOT EXECUTED 400041e8: c2 06 20 dc ld [ %i0 + 0xdc ], %g1 <== NOT EXECUTED 400041ec: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400041f0: 22 80 00 a3 be,a 4000447c <== NOT EXECUTED 400041f4: b0 10 00 13 mov %l3, %i0 <== NOT EXECUTED (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg); 400041f8: d2 06 20 e0 ld [ %i0 + 0xe0 ], %o1 <== NOT EXECUTED 400041fc: 9f c0 40 00 call %g1 <== NOT EXECUTED 40004200: 90 06 20 30 add %i0, 0x30, %o0 <== NOT EXECUTED tty->tty_rcvwakeup = 1; 40004204: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED 40004208: a6 10 20 00 clr %l3 <== NOT EXECUTED 4000420c: 10 80 00 9b b 40004478 <== NOT EXECUTED 40004210: c2 26 20 e4 st %g1, [ %i0 + 0xe4 ] <== NOT EXECUTED while (len--) { c = *buf++; /* FIXME: implement IXANY: any character restarts output */ /* if incoming XON/XOFF controls outgoing stream: */ if (tty->flow_ctrl & FL_MDXON) { 40004214: c2 06 20 b8 ld [ %i0 + 0xb8 ], %g1 <== NOT EXECUTED 40004218: 80 88 62 00 btst 0x200, %g1 <== NOT EXECUTED 4000421c: 02 80 00 1b be 40004288 <== NOT EXECUTED 40004220: e4 0e 40 00 ldub [ %i1 ], %l2 <== NOT EXECUTED /* if received char is V_STOP and V_START (both are equal value) */ if (c == tty->termios.c_cc[VSTOP]) { 40004224: c4 0e 20 4a ldub [ %i0 + 0x4a ], %g2 <== NOT EXECUTED 40004228: 83 2c a0 18 sll %l2, 0x18, %g1 <== NOT EXECUTED 4000422c: 87 38 60 18 sra %g1, 0x18, %g3 <== NOT EXECUTED 40004230: 80 a0 c0 02 cmp %g3, %g2 <== NOT EXECUTED 40004234: 12 80 00 0e bne 4000426c <== NOT EXECUTED 40004238: c2 0e 20 49 ldub [ %i0 + 0x49 ], %g1 <== NOT EXECUTED if (c == tty->termios.c_cc[VSTART]) { 4000423c: 82 08 60 ff and %g1, 0xff, %g1 <== NOT EXECUTED 40004240: 80 a0 c0 01 cmp %g3, %g1 <== NOT EXECUTED 40004244: 12 80 00 05 bne 40004258 <== NOT EXECUTED 40004248: 01 00 00 00 nop <== NOT EXECUTED /* received VSTOP and VSTART==VSTOP? */ /* then toggle "stop output" status */ tty->flow_ctrl = tty->flow_ctrl ^ FL_ORCVXOF; 4000424c: c2 06 20 b8 ld [ %i0 + 0xb8 ], %g1 <== NOT EXECUTED 40004250: 10 80 00 04 b 40004260 <== NOT EXECUTED 40004254: 82 18 60 10 xor %g1, 0x10, %g1 <== NOT EXECUTED } else { /* VSTOP received (other code than VSTART) */ /* stop output */ tty->flow_ctrl |= FL_ORCVXOF; 40004258: c2 06 20 b8 ld [ %i0 + 0xb8 ], %g1 <== NOT EXECUTED 4000425c: 82 10 60 10 or %g1, 0x10, %g1 <== NOT EXECUTED 40004260: c2 26 20 b8 st %g1, [ %i0 + 0xb8 ] <== NOT EXECUTED } } } tty->rawInBufDropped += dropped; rtems_semaphore_release (tty->rawInBuf.Semaphore); return dropped; 40004264: 10 80 00 0c b 40004294 <== NOT EXECUTED 40004268: ac 10 20 01 mov 1, %l6 <== NOT EXECUTED /* stop output */ tty->flow_ctrl |= FL_ORCVXOF; } flow_rcv = TRUE; } else if (c == tty->termios.c_cc[VSTART]) { 4000426c: 82 08 60 ff and %g1, 0xff, %g1 <== NOT EXECUTED 40004270: 80 a0 c0 01 cmp %g3, %g1 <== NOT EXECUTED 40004274: 12 80 00 06 bne 4000428c <== NOT EXECUTED 40004278: 80 a5 a0 00 cmp %l6, 0 <== NOT EXECUTED /* VSTART received */ /* restart output */ tty->flow_ctrl &= ~FL_ORCVXOF; 4000427c: c2 06 20 b8 ld [ %i0 + 0xb8 ], %g1 <== NOT EXECUTED 40004280: 10 bf ff f8 b 40004260 <== NOT EXECUTED 40004284: 82 08 7f ef and %g1, -17, %g1 <== NOT EXECUTED flow_rcv = TRUE; } } if (flow_rcv) { 40004288: 80 a5 a0 00 cmp %l6, 0 <== NOT EXECUTED 4000428c: 02 80 00 1c be 400042fc <== NOT EXECUTED 40004290: 01 00 00 00 nop <== NOT EXECUTED /* restart output according to FL_ORCVXOF flag */ if ((tty->flow_ctrl & (FL_ORCVXOF | FL_OSTOP)) == FL_OSTOP) { 40004294: c2 06 20 b8 ld [ %i0 + 0xb8 ], %g1 <== NOT EXECUTED 40004298: 82 08 60 30 and %g1, 0x30, %g1 <== NOT EXECUTED 4000429c: 80 a0 60 20 cmp %g1, 0x20 <== NOT EXECUTED 400042a0: 32 80 00 6b bne,a 4000444c <== NOT EXECUTED 400042a4: b2 06 60 01 inc %i1 <== NOT EXECUTED /* disable interrupts */ rtems_interrupt_disable(level); 400042a8: 7f ff f7 09 call 40001ecc <== NOT EXECUTED 400042ac: 01 00 00 00 nop <== NOT EXECUTED 400042b0: a0 10 00 08 mov %o0, %l0 <== NOT EXECUTED tty->flow_ctrl &= ~FL_OSTOP; 400042b4: c2 06 20 b8 ld [ %i0 + 0xb8 ], %g1 <== NOT EXECUTED /* check for chars in output buffer (or rob_state?) */ if (tty->rawOutBufState != rob_idle) { 400042b8: c4 06 20 94 ld [ %i0 + 0x94 ], %g2 <== 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; 400042bc: 82 08 7f df and %g1, -33, %g1 <== NOT EXECUTED 400042c0: c2 26 20 b8 st %g1, [ %i0 + 0xb8 ] <== NOT EXECUTED /* check for chars in output buffer (or rob_state?) */ if (tty->rawOutBufState != rob_idle) { 400042c4: 80 a0 a0 00 cmp %g2, 0 <== NOT EXECUTED 400042c8: 02 80 00 09 be 400042ec <== NOT EXECUTED 400042cc: 01 00 00 00 nop <== NOT EXECUTED /* if chars available, call write function... */ (*tty->device.write)(tty->minor, 400042d0: d2 06 20 84 ld [ %i0 + 0x84 ], %o1 <== NOT EXECUTED 400042d4: c2 06 20 7c ld [ %i0 + 0x7c ], %g1 <== NOT EXECUTED 400042d8: c4 06 20 a4 ld [ %i0 + 0xa4 ], %g2 <== NOT EXECUTED 400042dc: d0 06 20 10 ld [ %i0 + 0x10 ], %o0 <== NOT EXECUTED 400042e0: 92 02 40 01 add %o1, %g1, %o1 <== NOT EXECUTED 400042e4: 9f c0 80 00 call %g2 <== NOT EXECUTED 400042e8: 94 10 20 01 mov 1, %o2 <== NOT EXECUTED &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail], 1); } /* reenable interrupts */ rtems_interrupt_enable(level); 400042ec: 7f ff f6 fc call 40001edc <== NOT EXECUTED 400042f0: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED } return 0; } while (len--) { c = *buf++; 400042f4: 10 80 00 56 b 4000444c <== NOT EXECUTED 400042f8: b2 06 60 01 inc %i1 <== NOT EXECUTED /* reenable interrupts */ rtems_interrupt_enable(level); } } else { newTail = (tty->rawInBuf.Tail + 1) % tty->rawInBuf.Size; 400042fc: d0 06 20 60 ld [ %i0 + 0x60 ], %o0 <== NOT EXECUTED 40004300: d2 06 20 64 ld [ %i0 + 0x64 ], %o1 <== NOT EXECUTED 40004304: 40 00 48 03 call 40016310 <.urem> <== NOT EXECUTED 40004308: 90 02 20 01 inc %o0 <== NOT EXECUTED /* if chars_in_buffer > highwater */ rtems_interrupt_disable(level); 4000430c: 7f ff f6 f0 call 40001ecc <== NOT EXECUTED 40004310: a0 10 00 08 mov %o0, %l0 <== NOT EXECUTED 40004314: a2 10 00 08 mov %o0, %l1 <== NOT EXECUTED if ((((newTail - tty->rawInBuf.Head + tty->rawInBuf.Size) 40004318: c2 06 20 5c ld [ %i0 + 0x5c ], %g1 <== NOT EXECUTED 4000431c: d0 06 20 64 ld [ %i0 + 0x64 ], %o0 <== NOT EXECUTED 40004320: d2 06 20 64 ld [ %i0 + 0x64 ], %o1 <== NOT EXECUTED 40004324: 90 22 00 01 sub %o0, %g1, %o0 <== NOT EXECUTED 40004328: 40 00 47 fa call 40016310 <.urem> <== NOT EXECUTED 4000432c: 90 02 00 10 add %o0, %l0, %o0 <== NOT EXECUTED 40004330: c2 06 20 c0 ld [ %i0 + 0xc0 ], %g1 <== NOT EXECUTED 40004334: 80 a2 00 01 cmp %o0, %g1 <== NOT EXECUTED 40004338: 08 80 00 2d bleu 400043ec <== NOT EXECUTED 4000433c: 01 00 00 00 nop <== NOT EXECUTED 40004340: c2 06 20 b8 ld [ %i0 + 0xb8 ], %g1 <== NOT EXECUTED 40004344: 80 88 60 01 btst 1, %g1 <== NOT EXECUTED 40004348: 12 80 00 29 bne 400043ec <== NOT EXECUTED 4000434c: 01 00 00 00 nop <== NOT EXECUTED % tty->rawInBuf.Size) > tty->highwater) && !(tty->flow_ctrl & FL_IREQXOF)) { /* incoming data stream should be stopped */ tty->flow_ctrl |= FL_IREQXOF; 40004350: c2 06 20 b8 ld [ %i0 + 0xb8 ], %g1 <== NOT EXECUTED 40004354: 82 10 60 01 or %g1, 1, %g1 <== NOT EXECUTED 40004358: c2 26 20 b8 st %g1, [ %i0 + 0xb8 ] <== NOT EXECUTED if ((tty->flow_ctrl & (FL_MDXOF | FL_ISNTXOF)) 4000435c: c2 06 20 b8 ld [ %i0 + 0xb8 ], %g1 <== NOT EXECUTED 40004360: 82 08 64 02 and %g1, 0x402, %g1 <== NOT EXECUTED 40004364: 80 a0 64 00 cmp %g1, 0x400 <== NOT EXECUTED 40004368: 12 80 00 13 bne 400043b4 <== NOT EXECUTED 4000436c: 01 00 00 00 nop <== NOT EXECUTED == (FL_MDXOF ) ){ if ((tty->flow_ctrl & FL_OSTOP) || 40004370: c2 06 20 b8 ld [ %i0 + 0xb8 ], %g1 <== NOT EXECUTED 40004374: 80 88 60 20 btst 0x20, %g1 <== NOT EXECUTED 40004378: 12 80 00 06 bne 40004390 <== NOT EXECUTED 4000437c: 01 00 00 00 nop <== NOT EXECUTED 40004380: c2 06 20 94 ld [ %i0 + 0x94 ], %g1 <== NOT EXECUTED 40004384: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40004388: 12 80 00 19 bne 400043ec <== NOT EXECUTED 4000438c: 01 00 00 00 nop <== 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; 40004390: c2 06 20 b8 ld [ %i0 + 0xb8 ], %g1 <== NOT EXECUTED (*tty->device.write)(tty->minor, 40004394: c4 06 20 a4 ld [ %i0 + 0xa4 ], %g2 <== NOT EXECUTED 40004398: d0 06 20 10 ld [ %i0 + 0x10 ], %o0 <== 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; 4000439c: 82 10 60 02 or %g1, 2, %g1 <== NOT EXECUTED (*tty->device.write)(tty->minor, 400043a0: 92 10 00 14 mov %l4, %o1 <== 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; 400043a4: c2 26 20 b8 st %g1, [ %i0 + 0xb8 ] <== NOT EXECUTED (*tty->device.write)(tty->minor, 400043a8: 9f c0 80 00 call %g2 <== NOT EXECUTED 400043ac: 94 10 20 01 mov 1, %o2 <== NOT EXECUTED 400043b0: 30 80 00 0f b,a 400043ec <== NOT EXECUTED (void *)&(tty->termios.c_cc[VSTOP]), 1); } } else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) 400043b4: c2 06 20 b8 ld [ %i0 + 0xb8 ], %g1 <== NOT EXECUTED 400043b8: 82 08 61 04 and %g1, 0x104, %g1 <== NOT EXECUTED 400043bc: 80 a0 61 00 cmp %g1, 0x100 <== NOT EXECUTED 400043c0: 12 80 00 0b bne 400043ec <== NOT EXECUTED 400043c4: 01 00 00 00 nop <== NOT EXECUTED == (FL_MDRTS ) ) { tty->flow_ctrl |= FL_IRTSOFF; 400043c8: c2 06 20 b8 ld [ %i0 + 0xb8 ], %g1 <== NOT EXECUTED /* deactivate RTS line */ if (tty->device.stopRemoteTx != NULL) { 400043cc: c4 06 20 ac ld [ %i0 + 0xac ], %g2 <== NOT EXECUTED 1); } } else if ((tty->flow_ctrl & (FL_MDRTS | FL_IRTSOFF)) == (FL_MDRTS ) ) { tty->flow_ctrl |= FL_IRTSOFF; 400043d0: 82 10 60 04 or %g1, 4, %g1 <== NOT EXECUTED 400043d4: c2 26 20 b8 st %g1, [ %i0 + 0xb8 ] <== NOT EXECUTED /* deactivate RTS line */ if (tty->device.stopRemoteTx != NULL) { 400043d8: 80 a0 a0 00 cmp %g2, 0 <== NOT EXECUTED 400043dc: 02 80 00 04 be 400043ec <== NOT EXECUTED 400043e0: 01 00 00 00 nop <== NOT EXECUTED tty->device.stopRemoteTx(tty->minor); 400043e4: 9f c0 80 00 call %g2 <== NOT EXECUTED 400043e8: d0 06 20 10 ld [ %i0 + 0x10 ], %o0 <== NOT EXECUTED } } } /* reenable interrupts */ rtems_interrupt_enable(level); 400043ec: 7f ff f6 bc call 40001edc <== NOT EXECUTED 400043f0: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED if (newTail == tty->rawInBuf.Head) { 400043f4: c2 06 20 5c ld [ %i0 + 0x5c ], %g1 <== NOT EXECUTED 400043f8: 80 a4 00 01 cmp %l0, %g1 <== NOT EXECUTED 400043fc: 32 80 00 04 bne,a 4000440c <== NOT EXECUTED 40004400: c2 06 20 58 ld [ %i0 + 0x58 ], %g1 <== NOT EXECUTED dropped++; 40004404: 10 80 00 11 b 40004448 <== NOT EXECUTED 40004408: a6 04 e0 01 inc %l3 <== NOT EXECUTED } else { tty->rawInBuf.theBuf[newTail] = c; 4000440c: e4 28 40 10 stb %l2, [ %g1 + %l0 ] <== NOT EXECUTED tty->rawInBuf.Tail = newTail; /* * check to see if rcv wakeup callback was set */ if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) { 40004410: c2 06 20 e4 ld [ %i0 + 0xe4 ], %g1 <== NOT EXECUTED if (newTail == tty->rawInBuf.Head) { dropped++; } else { tty->rawInBuf.theBuf[newTail] = c; tty->rawInBuf.Tail = newTail; 40004414: e0 26 20 60 st %l0, [ %i0 + 0x60 ] <== NOT EXECUTED /* * check to see if rcv wakeup callback was set */ if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL )) { 40004418: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000441c: 32 80 00 0c bne,a 4000444c <== NOT EXECUTED 40004420: b2 06 60 01 inc %i1 <== NOT EXECUTED 40004424: c2 06 20 dc ld [ %i0 + 0xdc ], %g1 <== NOT EXECUTED 40004428: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000442c: 22 80 00 08 be,a 4000444c <== NOT EXECUTED 40004430: b2 06 60 01 inc %i1 <== NOT EXECUTED (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg); 40004434: d2 06 20 e0 ld [ %i0 + 0xe0 ], %o1 <== NOT EXECUTED 40004438: 9f c0 40 00 call %g1 <== NOT EXECUTED 4000443c: 90 10 00 15 mov %l5, %o0 <== NOT EXECUTED tty->tty_rcvwakeup = 1; 40004440: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED 40004444: c2 26 20 e4 st %g1, [ %i0 + 0xe4 ] <== NOT EXECUTED } return 0; } while (len--) { c = *buf++; 40004448: b2 06 60 01 inc %i1 <== NOT EXECUTED tty->tty_rcvwakeup = 1; } return 0; } while (len--) { 4000444c: b4 06 bf ff add %i2, -1, %i2 <== NOT EXECUTED 40004450: 80 a6 bf ff cmp %i2, -1 <== NOT EXECUTED 40004454: 12 bf ff 70 bne 40004214 <== NOT EXECUTED 40004458: 01 00 00 00 nop <== NOT EXECUTED tty->tty_rcvwakeup = 1; } } } } tty->rawInBufDropped += dropped; 4000445c: c2 06 20 78 ld [ %i0 + 0x78 ], %g1 <== NOT EXECUTED rtems_semaphore_release (tty->rawInBuf.Semaphore); 40004460: d0 06 20 68 ld [ %i0 + 0x68 ], %o0 <== NOT EXECUTED tty->tty_rcvwakeup = 1; } } } } tty->rawInBufDropped += dropped; 40004464: 82 00 40 13 add %g1, %l3, %g1 <== NOT EXECUTED rtems_semaphore_release (tty->rawInBuf.Semaphore); 40004468: 40 00 09 9d call 40006adc <== NOT EXECUTED 4000446c: c2 26 20 78 st %g1, [ %i0 + 0x78 ] <== NOT EXECUTED return dropped; } 40004470: 81 c7 e0 08 ret <== NOT EXECUTED 40004474: 91 e8 00 13 restore %g0, %l3, %o0 <== NOT EXECUTED 40004478: b0 10 00 13 mov %l3, %i0 <== NOT EXECUTED 4000447c: 81 c7 e0 08 ret <== NOT EXECUTED 40004480: 81 e8 00 00 restore <== NOT EXECUTED 40003e78 : struct rtems_termios_tty *rtems_termios_ttyTail; rtems_id rtems_termios_ttyMutex; void rtems_termios_initialize (void) { 40003e78: 9d e3 bf 98 save %sp, -104, %sp rtems_status_code sc; /* * Create the mutex semaphore for the tty list */ if (!rtems_termios_ttyMutex) { 40003e7c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40003e80: c4 00 60 7c ld [ %g1 + 0x7c ], %g2 ! 4001ac7c 40003e84: 80 a0 a0 00 cmp %g2, 0 40003e88: 12 80 00 0d bne 40003ebc 40003e8c: 98 10 60 7c or %g1, 0x7c, %o4 sc = rtems_semaphore_create ( 40003e90: 11 15 14 9b sethi %hi(0x54526c00), %o0 40003e94: 92 10 20 01 mov 1, %o1 40003e98: 90 12 21 69 or %o0, 0x169, %o0 40003e9c: 94 10 20 54 mov 0x54, %o2 40003ea0: 40 00 09 6e call 40006458 40003ea4: 96 10 20 00 clr %o3 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) 40003ea8: 80 a2 20 00 cmp %o0, 0 40003eac: 02 80 00 04 be 40003ebc 40003eb0: 01 00 00 00 nop rtems_fatal_error_occurred (sc); 40003eb4: 40 00 0d 42 call 400073bc <== NOT EXECUTED 40003eb8: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED 40003ebc: 81 c7 e0 08 ret 40003ec0: 81 e8 00 00 restore 40005130 : } } rtems_status_code rtems_termios_ioctl (void *arg) { 40005130: 9d e3 bf 90 save %sp, -112, %sp <== NOT EXECUTED rtems_libio_ioctl_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 40005134: c2 06 00 00 ld [ %i0 ], %g1 <== NOT EXECUTED struct ttywakeup *wakeup = (struct ttywakeup *)args->buffer; rtems_status_code sc; args->ioctl_return = 0; 40005138: c0 26 20 0c clr [ %i0 + 0xc ] <== NOT EXECUTED rtems_status_code rtems_termios_ioctl (void *arg) { rtems_libio_ioctl_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 4000513c: e2 00 60 28 ld [ %g1 + 0x28 ], %l1 <== NOT EXECUTED struct ttywakeup *wakeup = (struct ttywakeup *)args->buffer; 40005140: e0 06 20 08 ld [ %i0 + 8 ], %l0 <== NOT EXECUTED rtems_status_code sc; args->ioctl_return = 0; sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 40005144: d0 04 60 18 ld [ %l1 + 0x18 ], %o0 <== NOT EXECUTED } } rtems_status_code rtems_termios_ioctl (void *arg) { 40005148: a4 10 00 18 mov %i0, %l2 <== NOT EXECUTED struct rtems_termios_tty *tty = args->iop->data1; struct ttywakeup *wakeup = (struct ttywakeup *)args->buffer; rtems_status_code sc; args->ioctl_return = 0; sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 4000514c: 92 10 20 00 clr %o1 <== NOT EXECUTED 40005150: 40 00 05 9c call 400067c0 <== NOT EXECUTED 40005154: 94 10 20 00 clr %o2 <== NOT EXECUTED if (sc != RTEMS_SUCCESSFUL) { 40005158: b0 92 20 00 orcc %o0, 0, %i0 <== NOT EXECUTED 4000515c: 22 80 00 05 be,a 40005170 <== NOT EXECUTED 40005160: c4 04 a0 04 ld [ %l2 + 4 ], %g2 <== NOT EXECUTED args->ioctl_return = sc; 40005164: f0 24 a0 0c st %i0, [ %l2 + 0xc ] <== NOT EXECUTED 40005168: 81 c7 e0 08 ret <== NOT EXECUTED 4000516c: 81 e8 00 00 restore <== NOT EXECUTED return sc; } switch (args->command) { 40005170: 80 a0 a0 04 cmp %g2, 4 <== NOT EXECUTED 40005174: 22 80 00 c0 be,a 40005474 <== NOT EXECUTED 40005178: c2 04 00 00 ld [ %l0 ], %g1 <== NOT EXECUTED 4000517c: 18 80 00 0b bgu 400051a8 <== NOT EXECUTED 40005180: 03 10 01 19 sethi %hi(0x40046400), %g1 <== NOT EXECUTED 40005184: 80 a0 a0 02 cmp %g2, 2 <== NOT EXECUTED 40005188: 22 80 00 2d be,a 4000523c <== NOT EXECUTED 4000518c: d2 04 a0 08 ld [ %l2 + 8 ], %o1 <== NOT EXECUTED 40005190: 18 80 00 b2 bgu 40005458 <== NOT EXECUTED 40005194: 80 a0 a0 01 cmp %g2, 1 <== NOT EXECUTED 40005198: 32 80 00 18 bne,a 400051f8 <== NOT EXECUTED 4000519c: c4 04 60 cc ld [ %l1 + 0xcc ], %g2 <== NOT EXECUTED sc = RTEMS_INVALID_NUMBER; } break; case RTEMS_IO_GET_ATTRIBUTES: *(struct termios *)args->buffer = tty->termios; 400051a0: 10 80 00 23 b 4000522c <== NOT EXECUTED 400051a4: d0 04 a0 08 ld [ %l2 + 8 ], %o0 <== 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) { 400051a8: 82 10 62 7f or %g1, 0x27f, %g1 <== NOT EXECUTED 400051ac: 80 a0 80 01 cmp %g2, %g1 <== NOT EXECUTED 400051b0: 02 80 00 d0 be 400054f0 <== NOT EXECUTED 400051b4: 01 00 00 00 nop <== NOT EXECUTED 400051b8: 38 80 00 07 bgu,a 400051d4 <== NOT EXECUTED 400051bc: 03 10 01 1d sethi %hi(0x40047400), %g1 <== NOT EXECUTED 400051c0: 80 a0 a0 05 cmp %g2, 5 <== NOT EXECUTED 400051c4: 32 80 00 0d bne,a 400051f8 <== NOT EXECUTED 400051c8: c4 04 60 cc ld [ %l1 + 0xcc ], %g2 <== NOT EXECUTED case RTEMS_IO_TCDRAIN: drainOutput (tty); break; case RTEMS_IO_SNDWAKEUP: tty->tty_snd = *wakeup; 400051cc: 10 80 00 a6 b 40005464 <== NOT EXECUTED 400051d0: c2 04 00 00 ld [ %l0 ], %g1 <== 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) { 400051d4: 82 10 60 1a or %g1, 0x1a, %g1 <== NOT EXECUTED 400051d8: 80 a0 80 01 cmp %g2, %g1 <== NOT EXECUTED 400051dc: 02 80 00 c1 be 400054e0 <== NOT EXECUTED 400051e0: 03 20 01 1d sethi %hi(0x80047400), %g1 <== NOT EXECUTED 400051e4: 82 10 60 1b or %g1, 0x1b, %g1 ! 8004741b <== NOT EXECUTED 400051e8: 80 a0 80 01 cmp %g2, %g1 <== NOT EXECUTED 400051ec: 22 80 00 a6 be,a 40005484 <== NOT EXECUTED 400051f0: c2 04 60 cc ld [ %l1 + 0xcc ], %g1 <== NOT EXECUTED default: if (rtems_termios_linesw[tty->t_line].l_ioctl != NULL) { 400051f4: c4 04 60 cc ld [ %l1 + 0xcc ], %g2 <== NOT EXECUTED 400051f8: 03 10 00 6a sethi %hi(0x4001a800), %g1 <== NOT EXECUTED 400051fc: 82 10 62 78 or %g1, 0x278, %g1 ! 4001aa78 <== NOT EXECUTED 40005200: 85 28 a0 05 sll %g2, 5, %g2 <== NOT EXECUTED 40005204: 84 00 80 01 add %g2, %g1, %g2 <== NOT EXECUTED 40005208: c2 00 a0 18 ld [ %g2 + 0x18 ], %g1 <== NOT EXECUTED 4000520c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40005210: 02 80 00 c5 be 40005524 <== NOT EXECUTED 40005214: b0 10 20 0a mov 0xa, %i0 <== NOT EXECUTED sc = rtems_termios_linesw[tty->t_line].l_ioctl(tty,args); 40005218: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 4000521c: 9f c0 40 00 call %g1 <== NOT EXECUTED 40005220: 92 10 00 12 mov %l2, %o1 <== NOT EXECUTED tty->t_sc = NULL; /* ensure that no more valid data */ /* * open new line discipline */ if (rtems_termios_linesw[tty->t_line].l_open != NULL) { sc = rtems_termios_linesw[tty->t_line].l_open(tty); 40005224: 10 80 00 c0 b 40005524 <== NOT EXECUTED 40005228: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED sc = RTEMS_INVALID_NUMBER; } break; case RTEMS_IO_GET_ATTRIBUTES: *(struct termios *)args->buffer = tty->termios; 4000522c: 92 04 60 30 add %l1, 0x30, %o1 <== NOT EXECUTED 40005230: 40 00 29 38 call 4000f710 <== NOT EXECUTED 40005234: 94 10 20 24 mov 0x24, %o2 <== NOT EXECUTED 40005238: 30 80 00 bb b,a 40005524 <== NOT EXECUTED break; case RTEMS_IO_SET_ATTRIBUTES: tty->termios = *(struct termios *)args->buffer; 4000523c: 90 04 60 30 add %l1, 0x30, %o0 <== NOT EXECUTED 40005240: 40 00 29 34 call 4000f710 <== NOT EXECUTED 40005244: 94 10 20 24 mov 0x24, %o2 <== NOT EXECUTED /* * check for flow control options to be switched off */ /* check for outgoing XON/XOFF flow control switched off */ if (( tty->flow_ctrl & FL_MDXON) && 40005248: c2 04 60 b8 ld [ %l1 + 0xb8 ], %g1 <== NOT EXECUTED 4000524c: 80 88 62 00 btst 0x200, %g1 <== NOT EXECUTED 40005250: 02 80 00 20 be 400052d0 <== NOT EXECUTED 40005254: 01 00 00 00 nop <== NOT EXECUTED 40005258: c2 04 60 30 ld [ %l1 + 0x30 ], %g1 <== NOT EXECUTED 4000525c: 80 88 64 00 btst 0x400, %g1 <== NOT EXECUTED 40005260: 12 80 00 1c bne 400052d0 <== NOT EXECUTED 40005264: 01 00 00 00 nop <== NOT EXECUTED !(tty->termios.c_iflag & IXON)) { /* clear related flags in flow_ctrl */ tty->flow_ctrl &= ~(FL_MDXON | FL_ORCVXOF); 40005268: c2 04 60 b8 ld [ %l1 + 0xb8 ], %g1 <== NOT EXECUTED 4000526c: 82 08 7d ef and %g1, -529, %g1 <== NOT EXECUTED 40005270: c2 24 60 b8 st %g1, [ %l1 + 0xb8 ] <== NOT EXECUTED /* has output been stopped due to received XOFF? */ if (tty->flow_ctrl & FL_OSTOP) { 40005274: c2 04 60 b8 ld [ %l1 + 0xb8 ], %g1 <== NOT EXECUTED 40005278: 80 88 60 20 btst 0x20, %g1 <== NOT EXECUTED 4000527c: 02 80 00 15 be 400052d0 <== NOT EXECUTED 40005280: 01 00 00 00 nop <== NOT EXECUTED /* disable interrupts */ rtems_interrupt_disable(level); 40005284: 7f ff f3 12 call 40001ecc <== NOT EXECUTED 40005288: 01 00 00 00 nop <== NOT EXECUTED 4000528c: a0 10 00 08 mov %o0, %l0 <== NOT EXECUTED tty->flow_ctrl &= ~FL_OSTOP; 40005290: c2 04 60 b8 ld [ %l1 + 0xb8 ], %g1 <== NOT EXECUTED /* check for chars in output buffer (or rob_state?) */ if (tty->rawOutBufState != rob_idle) { 40005294: c4 04 60 94 ld [ %l1 + 0x94 ], %g2 <== 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; 40005298: 82 08 7f df and %g1, -33, %g1 <== NOT EXECUTED 4000529c: c2 24 60 b8 st %g1, [ %l1 + 0xb8 ] <== NOT EXECUTED /* check for chars in output buffer (or rob_state?) */ if (tty->rawOutBufState != rob_idle) { 400052a0: 80 a0 a0 00 cmp %g2, 0 <== NOT EXECUTED 400052a4: 02 80 00 09 be 400052c8 <== NOT EXECUTED 400052a8: 01 00 00 00 nop <== NOT EXECUTED /* if chars available, call write function... */ (*tty->device.write)(tty->minor, 400052ac: d2 04 60 84 ld [ %l1 + 0x84 ], %o1 <== NOT EXECUTED 400052b0: c2 04 60 7c ld [ %l1 + 0x7c ], %g1 <== NOT EXECUTED 400052b4: c4 04 60 a4 ld [ %l1 + 0xa4 ], %g2 <== NOT EXECUTED 400052b8: d0 04 60 10 ld [ %l1 + 0x10 ], %o0 <== NOT EXECUTED 400052bc: 92 02 40 01 add %o1, %g1, %o1 <== NOT EXECUTED 400052c0: 9f c0 80 00 call %g2 <== NOT EXECUTED 400052c4: 94 10 20 01 mov 1, %o2 <== NOT EXECUTED &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1); } /* reenable interrupts */ rtems_interrupt_enable(level); 400052c8: 7f ff f3 05 call 40001edc <== NOT EXECUTED 400052cc: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED } } /* check for incoming XON/XOFF flow control switched off */ if (( tty->flow_ctrl & FL_MDXOF) && 400052d0: c2 04 60 b8 ld [ %l1 + 0xb8 ], %g1 <== NOT EXECUTED 400052d4: 80 88 64 00 btst 0x400, %g1 <== NOT EXECUTED 400052d8: 02 80 00 0c be 40005308 <== NOT EXECUTED 400052dc: 03 00 00 04 sethi %hi(0x1000), %g1 <== NOT EXECUTED 400052e0: c4 04 60 30 ld [ %l1 + 0x30 ], %g2 <== NOT EXECUTED 400052e4: 80 88 80 01 btst %g2, %g1 <== NOT EXECUTED 400052e8: 12 80 00 08 bne 40005308 <== NOT EXECUTED 400052ec: 01 00 00 00 nop <== NOT EXECUTED !(tty->termios.c_iflag & IXOFF)) { /* clear related flags in flow_ctrl */ tty->flow_ctrl &= ~(FL_MDXOF); 400052f0: c2 04 60 b8 ld [ %l1 + 0xb8 ], %g1 <== NOT EXECUTED 400052f4: 82 08 7b ff and %g1, -1025, %g1 <== NOT EXECUTED 400052f8: c2 24 60 b8 st %g1, [ %l1 + 0xb8 ] <== NOT EXECUTED /* FIXME: what happens, if we had sent XOFF but not yet XON? */ tty->flow_ctrl &= ~(FL_ISNTXOF); 400052fc: c2 04 60 b8 ld [ %l1 + 0xb8 ], %g1 <== NOT EXECUTED 40005300: 82 08 7f fd and %g1, -3, %g1 <== NOT EXECUTED 40005304: c2 24 60 b8 st %g1, [ %l1 + 0xb8 ] <== NOT EXECUTED } /* check for incoming RTS/CTS flow control switched off */ if (( tty->flow_ctrl & FL_MDRTS) && 40005308: c2 04 60 b8 ld [ %l1 + 0xb8 ], %g1 <== NOT EXECUTED 4000530c: 80 88 61 00 btst 0x100, %g1 <== NOT EXECUTED 40005310: 02 80 00 16 be 40005368 <== NOT EXECUTED 40005314: c2 04 60 38 ld [ %l1 + 0x38 ], %g1 <== NOT EXECUTED 40005318: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000531c: 06 80 00 14 bl 4000536c <== NOT EXECUTED 40005320: 01 00 00 00 nop <== NOT EXECUTED !(tty->termios.c_cflag & CRTSCTS)) { /* clear related flags in flow_ctrl */ tty->flow_ctrl &= ~(FL_MDRTS); 40005324: c2 04 60 b8 ld [ %l1 + 0xb8 ], %g1 <== NOT EXECUTED 40005328: 82 08 7e ff and %g1, -257, %g1 <== NOT EXECUTED 4000532c: c2 24 60 b8 st %g1, [ %l1 + 0xb8 ] <== NOT EXECUTED /* restart remote Tx, if it was stopped */ if ((tty->flow_ctrl & FL_IRTSOFF) && 40005330: c2 04 60 b8 ld [ %l1 + 0xb8 ], %g1 <== NOT EXECUTED 40005334: 80 88 60 04 btst 4, %g1 <== NOT EXECUTED 40005338: 02 80 00 08 be 40005358 <== NOT EXECUTED 4000533c: 01 00 00 00 nop <== NOT EXECUTED 40005340: c2 04 60 b0 ld [ %l1 + 0xb0 ], %g1 <== NOT EXECUTED 40005344: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40005348: 02 80 00 04 be 40005358 <== NOT EXECUTED 4000534c: 01 00 00 00 nop <== NOT EXECUTED (tty->device.startRemoteTx != NULL)) { tty->device.startRemoteTx(tty->minor); 40005350: 9f c0 40 00 call %g1 <== NOT EXECUTED 40005354: d0 04 60 10 ld [ %l1 + 0x10 ], %o0 <== NOT EXECUTED } tty->flow_ctrl &= ~(FL_IRTSOFF); 40005358: c2 04 60 b8 ld [ %l1 + 0xb8 ], %g1 <== NOT EXECUTED 4000535c: 82 08 7f fb and %g1, -5, %g1 <== NOT EXECUTED 40005360: c2 24 60 b8 st %g1, [ %l1 + 0xb8 ] <== 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) { 40005364: c2 04 60 38 ld [ %l1 + 0x38 ], %g1 <== NOT EXECUTED 40005368: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000536c: 36 80 00 06 bge,a 40005384 <== NOT EXECUTED 40005370: c4 04 60 30 ld [ %l1 + 0x30 ], %g2 <== NOT EXECUTED tty->flow_ctrl |= FL_MDRTS; 40005374: c2 04 60 b8 ld [ %l1 + 0xb8 ], %g1 <== NOT EXECUTED 40005378: 82 10 61 00 or %g1, 0x100, %g1 <== NOT EXECUTED 4000537c: c2 24 60 b8 st %g1, [ %l1 + 0xb8 ] <== NOT EXECUTED } /* check for incoming XON/XOF flow control switched on */ if (tty->termios.c_iflag & IXOFF) { 40005380: c4 04 60 30 ld [ %l1 + 0x30 ], %g2 <== NOT EXECUTED 40005384: 03 00 00 04 sethi %hi(0x1000), %g1 <== NOT EXECUTED 40005388: 80 88 80 01 btst %g2, %g1 <== NOT EXECUTED 4000538c: 22 80 00 06 be,a 400053a4 <== NOT EXECUTED 40005390: c2 04 60 30 ld [ %l1 + 0x30 ], %g1 <== NOT EXECUTED tty->flow_ctrl |= FL_MDXOF; 40005394: c2 04 60 b8 ld [ %l1 + 0xb8 ], %g1 <== NOT EXECUTED 40005398: 82 10 64 00 or %g1, 0x400, %g1 <== NOT EXECUTED 4000539c: c2 24 60 b8 st %g1, [ %l1 + 0xb8 ] <== NOT EXECUTED } /* check for outgoing XON/XOF flow control switched on */ if (tty->termios.c_iflag & IXON) { 400053a0: c2 04 60 30 ld [ %l1 + 0x30 ], %g1 <== NOT EXECUTED 400053a4: 80 88 64 00 btst 0x400, %g1 <== NOT EXECUTED 400053a8: 22 80 00 06 be,a 400053c0 <== NOT EXECUTED 400053ac: c2 04 60 3c ld [ %l1 + 0x3c ], %g1 <== NOT EXECUTED tty->flow_ctrl |= FL_MDXON; 400053b0: c2 04 60 b8 ld [ %l1 + 0xb8 ], %g1 <== NOT EXECUTED 400053b4: 82 10 62 00 or %g1, 0x200, %g1 <== NOT EXECUTED 400053b8: c2 24 60 b8 st %g1, [ %l1 + 0xb8 ] <== NOT EXECUTED 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) { 400053bc: c2 04 60 3c ld [ %l1 + 0x3c ], %g1 <== NOT EXECUTED 400053c0: 80 88 60 02 btst 2, %g1 <== NOT EXECUTED 400053c4: 32 80 00 19 bne,a 40005428 <== NOT EXECUTED 400053c8: c0 24 60 6c clr [ %l1 + 0x6c ] <== NOT EXECUTED tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT; tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT; } else { rtems_interval ticksPerSecond; rtems_clock_get (RTEMS_CLOCK_GET_TICKS_PER_SECOND, &ticksPerSecond); 400053cc: 92 07 bf f4 add %fp, -12, %o1 <== NOT EXECUTED 400053d0: 40 00 02 40 call 40005cd0 <== NOT EXECUTED 400053d4: 90 10 20 03 mov 3, %o0 <== NOT EXECUTED tty->vtimeTicks = tty->termios.c_cc[VTIME] * ticksPerSecond / 10; 400053d8: d2 07 bf f4 ld [ %fp + -12 ], %o1 <== NOT EXECUTED 400053dc: e0 0c 60 46 ldub [ %l1 + 0x46 ], %l0 <== NOT EXECUTED 400053e0: 40 00 42 e6 call 40015f78 <.umul> <== NOT EXECUTED 400053e4: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 400053e8: 40 00 43 1e call 40016060 <.udiv> <== NOT EXECUTED 400053ec: 92 10 20 0a mov 0xa, %o1 <== NOT EXECUTED 400053f0: d0 24 60 54 st %o0, [ %l1 + 0x54 ] <== NOT EXECUTED if (tty->termios.c_cc[VTIME]) { 400053f4: 80 a4 20 00 cmp %l0, 0 <== NOT EXECUTED 400053f8: 02 80 00 08 be 40005418 <== NOT EXECUTED 400053fc: c2 0c 60 47 ldub [ %l1 + 0x47 ], %g1 <== NOT EXECUTED tty->rawInBufSemaphoreOptions = RTEMS_WAIT; 40005400: c0 24 60 6c clr [ %l1 + 0x6c ] <== NOT EXECUTED tty->rawInBufSemaphoreTimeout = tty->vtimeTicks; if (tty->termios.c_cc[VMIN]) 40005404: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40005408: 12 80 00 09 bne 4000542c <== NOT EXECUTED 4000540c: d0 24 60 70 st %o0, [ %l1 + 0x70 ] <== NOT EXECUTED tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT; else tty->rawInBufSemaphoreFirstTimeout = tty->vtimeTicks; 40005410: 10 80 00 0a b 40005438 <== NOT EXECUTED 40005414: d0 24 60 74 st %o0, [ %l1 + 0x74 ] <== NOT EXECUTED } else { if (tty->termios.c_cc[VMIN]) { 40005418: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000541c: 02 80 00 06 be 40005434 <== NOT EXECUTED 40005420: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED tty->rawInBufSemaphoreOptions = RTEMS_WAIT; 40005424: c0 24 60 6c clr [ %l1 + 0x6c ] <== NOT EXECUTED tty->rawInBufSemaphoreTimeout = RTEMS_NO_TIMEOUT; 40005428: c0 24 60 70 clr [ %l1 + 0x70 ] <== NOT EXECUTED tty->rawInBufSemaphoreFirstTimeout = RTEMS_NO_TIMEOUT; 4000542c: 10 80 00 03 b 40005438 <== NOT EXECUTED 40005430: c0 24 60 74 clr [ %l1 + 0x74 ] <== NOT EXECUTED } else { tty->rawInBufSemaphoreOptions = RTEMS_NO_WAIT; 40005434: c2 24 60 6c st %g1, [ %l1 + 0x6c ] <== NOT EXECUTED } } } if (tty->device.setAttributes) 40005438: c2 04 60 a8 ld [ %l1 + 0xa8 ], %g1 <== NOT EXECUTED 4000543c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40005440: 02 80 00 39 be 40005524 <== NOT EXECUTED 40005444: 01 00 00 00 nop <== NOT EXECUTED (*tty->device.setAttributes)(tty->minor, &tty->termios); 40005448: d0 04 60 10 ld [ %l1 + 0x10 ], %o0 <== NOT EXECUTED 4000544c: 9f c0 40 00 call %g1 <== NOT EXECUTED 40005450: 92 04 60 30 add %l1, 0x30, %o1 <== NOT EXECUTED 40005454: 30 80 00 34 b,a 40005524 <== NOT EXECUTED break; case RTEMS_IO_TCDRAIN: drainOutput (tty); 40005458: 7f ff fe 1c call 40004cc8 <== NOT EXECUTED 4000545c: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 40005460: 30 80 00 31 b,a 40005524 <== NOT EXECUTED break; case RTEMS_IO_SNDWAKEUP: tty->tty_snd = *wakeup; 40005464: c2 24 60 d4 st %g1, [ %l1 + 0xd4 ] <== NOT EXECUTED 40005468: c2 04 20 04 ld [ %l0 + 4 ], %g1 <== NOT EXECUTED 4000546c: 10 80 00 2e b 40005524 <== NOT EXECUTED 40005470: c2 24 60 d8 st %g1, [ %l1 + 0xd8 ] <== NOT EXECUTED break; case RTEMS_IO_RCVWAKEUP: tty->tty_rcv = *wakeup; 40005474: c2 24 60 dc st %g1, [ %l1 + 0xdc ] <== NOT EXECUTED 40005478: c2 04 20 04 ld [ %l0 + 4 ], %g1 <== NOT EXECUTED 4000547c: 10 80 00 2a b 40005524 <== NOT EXECUTED 40005480: c2 24 60 e0 st %g1, [ %l1 + 0xe0 ] <== NOT EXECUTED #if 1 /* FIXME */ case TIOCSETD: /* * close old line discipline */ if (rtems_termios_linesw[tty->t_line].l_close != NULL) { 40005484: 05 10 00 6a sethi %hi(0x4001a800), %g2 <== NOT EXECUTED 40005488: 83 28 60 05 sll %g1, 5, %g1 <== NOT EXECUTED 4000548c: a0 10 a2 78 or %g2, 0x278, %l0 <== NOT EXECUTED 40005490: 82 00 40 10 add %g1, %l0, %g1 <== NOT EXECUTED 40005494: c2 00 60 04 ld [ %g1 + 4 ], %g1 <== NOT EXECUTED 40005498: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000549c: 22 80 00 06 be,a 400054b4 <== NOT EXECUTED 400054a0: c2 04 a0 08 ld [ %l2 + 8 ], %g1 <== NOT EXECUTED sc = rtems_termios_linesw[tty->t_line].l_close(tty); 400054a4: 9f c0 40 00 call %g1 <== NOT EXECUTED 400054a8: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 400054ac: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED } tty->t_line=*(int*)(args->buffer); 400054b0: c2 04 a0 08 ld [ %l2 + 8 ], %g1 <== NOT EXECUTED tty->t_sc = NULL; /* ensure that no more valid data */ 400054b4: c0 24 60 d0 clr [ %l1 + 0xd0 ] <== NOT EXECUTED * 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); 400054b8: c4 00 40 00 ld [ %g1 ], %g2 <== NOT EXECUTED tty->t_sc = NULL; /* ensure that no more valid data */ /* * open new line discipline */ if (rtems_termios_linesw[tty->t_line].l_open != NULL) { 400054bc: 83 28 a0 05 sll %g2, 5, %g1 <== NOT EXECUTED 400054c0: c2 04 00 01 ld [ %l0 + %g1 ], %g1 <== NOT EXECUTED 400054c4: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400054c8: 02 80 00 17 be 40005524 <== NOT EXECUTED 400054cc: c4 24 60 cc st %g2, [ %l1 + 0xcc ] <== NOT EXECUTED sc = rtems_termios_linesw[tty->t_line].l_open(tty); 400054d0: 9f c0 40 00 call %g1 <== NOT EXECUTED 400054d4: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 400054d8: 10 80 00 13 b 40005524 <== NOT EXECUTED 400054dc: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED } break; case TIOCGETD: *(int*)(args->buffer)=tty->t_line; 400054e0: c4 04 a0 08 ld [ %l2 + 8 ], %g2 <== NOT EXECUTED 400054e4: c2 04 60 cc ld [ %l1 + 0xcc ], %g1 <== NOT EXECUTED 400054e8: 10 80 00 0f b 40005524 <== NOT EXECUTED 400054ec: c2 20 80 00 st %g1, [ %g2 ] <== NOT EXECUTED break; #endif case FIONREAD: { int rawnc = tty->rawInBuf.Tail - tty->rawInBuf.Head; 400054f0: c4 04 60 60 ld [ %l1 + 0x60 ], %g2 <== NOT EXECUTED 400054f4: c2 04 60 5c ld [ %l1 + 0x5c ], %g1 <== NOT EXECUTED if ( rawnc < 0 ) 400054f8: 88 a0 80 01 subcc %g2, %g1, %g4 <== NOT EXECUTED 400054fc: 3c 80 00 05 bpos,a 40005510 <== NOT EXECUTED 40005500: c2 04 60 20 ld [ %l1 + 0x20 ], %g1 <== NOT EXECUTED rawnc += tty->rawInBuf.Size; 40005504: c2 04 60 64 ld [ %l1 + 0x64 ], %g1 <== NOT EXECUTED 40005508: 88 01 00 01 add %g4, %g1, %g4 <== NOT EXECUTED /* Half guess that this is the right operation */ *(int *)args->buffer = tty->ccount - tty->cindex + rawnc; 4000550c: c2 04 60 20 ld [ %l1 + 0x20 ], %g1 <== NOT EXECUTED 40005510: c4 04 60 24 ld [ %l1 + 0x24 ], %g2 <== NOT EXECUTED 40005514: c6 04 a0 08 ld [ %l2 + 8 ], %g3 <== NOT EXECUTED 40005518: 82 20 40 02 sub %g1, %g2, %g1 <== NOT EXECUTED 4000551c: 82 00 40 04 add %g1, %g4, %g1 <== NOT EXECUTED 40005520: c2 20 c0 00 st %g1, [ %g3 ] <== NOT EXECUTED } break; } rtems_semaphore_release (tty->osem); 40005524: 40 00 05 6e call 40006adc <== NOT EXECUTED 40005528: d0 04 60 18 ld [ %l1 + 0x18 ], %o0 <== NOT EXECUTED args->ioctl_return = sc; 4000552c: f0 24 a0 0c st %i0, [ %l2 + 0xc ] <== NOT EXECUTED return sc; } 40005530: 81 c7 e0 08 ret <== NOT EXECUTED 40005534: 81 e8 00 00 restore <== NOT EXECUTED 400056fc : rtems_device_major_number major, rtems_device_minor_number minor, void *arg, const rtems_termios_callbacks *callbacks ) { 400056fc: 9d e3 bf 98 save %sp, -104, %sp struct rtems_termios_tty *tty; /* * See if the device has already been opened */ sc = rtems_semaphore_obtain (rtems_termios_ttyMutex, 40005700: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40005704: d0 00 60 7c ld [ %g1 + 0x7c ], %o0 ! 4001ac7c 40005708: 92 10 20 00 clr %o1 4000570c: 40 00 04 2d call 400067c0 40005710: 94 10 20 00 clr %o2 RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) 40005714: a6 92 20 00 orcc %o0, 0, %l3 40005718: 12 80 01 1c bne 40005b88 4000571c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 return sc; for (tty = rtems_termios_ttyHead ; tty != NULL ; tty = tty->forw) { 40005720: 10 80 00 0a b 40005748 40005724: e0 00 60 84 ld [ %g1 + 0x84 ], %l0 ! 4001ac84 if ((tty->major == major) && (tty->minor == minor)) 40005728: 80 a0 40 18 cmp %g1, %i0 4000572c: 32 80 00 07 bne,a 40005748 40005730: e0 04 00 00 ld [ %l0 ], %l0 <== NOT EXECUTED 40005734: c2 04 20 10 ld [ %l0 + 0x10 ], %g1 40005738: 80 a0 40 19 cmp %g1, %i1 4000573c: 22 80 00 ea be,a 40005ae4 40005740: c2 04 20 08 ld [ %l0 + 8 ], %g1 */ sc = rtems_semaphore_obtain (rtems_termios_ttyMutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) return sc; for (tty = rtems_termios_ttyHead ; tty != NULL ; tty = tty->forw) { 40005744: e0 04 00 00 ld [ %l0 ], %l0 <== NOT EXECUTED 40005748: 80 a4 20 00 cmp %l0, 0 4000574c: 32 bf ff f7 bne,a 40005728 40005750: c2 04 20 0c ld [ %l0 + 0xc ], %g1 static char c = 'a'; /* * Create a new device */ tty = calloc (1, sizeof (struct rtems_termios_tty)); 40005754: 90 10 20 01 mov 1, %o0 40005758: 7f ff f6 fb call 40003344 4000575c: 92 10 20 e8 mov 0xe8, %o1 if (tty == NULL) { 40005760: a2 92 20 00 orcc %o0, 0, %l1 40005764: 02 80 00 0f be 400057a0 40005768: 03 10 00 6b sethi %hi(0x4001ac00), %g1 return RTEMS_NO_MEMORY; } /* * allocate raw input buffer */ tty->rawInBuf.Size = RAW_INPUT_BUFFER_SIZE; 4000576c: 03 10 00 67 sethi %hi(0x40019c00), %g1 40005770: c2 00 63 28 ld [ %g1 + 0x328 ], %g1 ! 40019f28 static char c = 'a'; /* * Create a new device */ tty = calloc (1, sizeof (struct rtems_termios_tty)); 40005774: a0 10 00 11 mov %l1, %l0 return RTEMS_NO_MEMORY; } /* * allocate raw input buffer */ tty->rawInBuf.Size = RAW_INPUT_BUFFER_SIZE; 40005778: c2 24 60 64 st %g1, [ %l1 + 0x64 ] tty->rawInBuf.theBuf = malloc (tty->rawInBuf.Size); 4000577c: d0 04 60 64 ld [ %l1 + 0x64 ], %o0 40005780: 7f ff f6 5b call 400030ec 40005784: 01 00 00 00 nop if (tty->rawInBuf.theBuf == NULL) { 40005788: 80 a2 20 00 cmp %o0, 0 4000578c: 12 80 00 08 bne 400057ac 40005790: d0 24 60 58 st %o0, [ %l1 + 0x58 ] free(tty); 40005794: 7f ff f6 2e call 4000304c <== NOT EXECUTED 40005798: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED rtems_semaphore_release (rtems_termios_ttyMutex); 4000579c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED 400057a0: d0 00 60 7c ld [ %g1 + 0x7c ], %o0 ! 4001ac7c <== NOT EXECUTED 400057a4: 10 80 00 f7 b 40005b80 <== NOT EXECUTED 400057a8: a6 10 20 1a mov 0x1a, %l3 <== NOT EXECUTED return RTEMS_NO_MEMORY; } /* * allocate raw output buffer */ tty->rawOutBuf.Size = RAW_OUTPUT_BUFFER_SIZE; 400057ac: 03 10 00 67 sethi %hi(0x40019c00), %g1 400057b0: c2 00 63 2c ld [ %g1 + 0x32c ], %g1 ! 40019f2c 400057b4: c2 24 60 88 st %g1, [ %l1 + 0x88 ] tty->rawOutBuf.theBuf = malloc (tty->rawOutBuf.Size); 400057b8: d0 04 60 88 ld [ %l1 + 0x88 ], %o0 400057bc: 7f ff f6 4c call 400030ec 400057c0: 01 00 00 00 nop if (tty->rawOutBuf.theBuf == NULL) { 400057c4: 80 a2 20 00 cmp %o0, 0 400057c8: 12 80 00 05 bne 400057dc 400057cc: d0 24 60 7c st %o0, [ %l1 + 0x7c ] free((void *)(tty->rawInBuf.theBuf)); 400057d0: d0 04 60 58 ld [ %l1 + 0x58 ], %o0 <== NOT EXECUTED free(tty); rtems_semaphore_release (rtems_termios_ttyMutex); 400057d4: 10 80 00 0c b 40005804 <== NOT EXECUTED 400057d8: a6 10 20 1a mov 0x1a, %l3 <== NOT EXECUTED return RTEMS_NO_MEMORY; } /* * allocate cooked buffer */ tty->cbuf = malloc (CBUFSIZE); 400057dc: 03 10 00 67 sethi %hi(0x40019c00), %g1 400057e0: 7f ff f6 43 call 400030ec 400057e4: d0 00 63 24 ld [ %g1 + 0x324 ], %o0 ! 40019f24 if (tty->cbuf == NULL) { 400057e8: 80 a2 20 00 cmp %o0, 0 400057ec: 12 80 00 0c bne 4000581c 400057f0: d0 24 60 1c st %o0, [ %l1 + 0x1c ] free((void *)(tty->rawOutBuf.theBuf)); 400057f4: d0 04 60 7c ld [ %l1 + 0x7c ], %o0 <== NOT EXECUTED 400057f8: 7f ff f6 15 call 4000304c <== NOT EXECUTED 400057fc: a6 10 20 1a mov 0x1a, %l3 <== NOT EXECUTED free((void *)(tty->rawInBuf.theBuf)); 40005800: d0 04 60 58 ld [ %l1 + 0x58 ], %o0 <== NOT EXECUTED 40005804: 7f ff f6 12 call 4000304c <== NOT EXECUTED 40005808: 01 00 00 00 nop <== NOT EXECUTED free(tty); 4000580c: 7f ff f6 10 call 4000304c <== NOT EXECUTED 40005810: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED (rtems_task_argument)tty); if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); } } rtems_semaphore_release (rtems_termios_ttyMutex); 40005814: 10 80 00 da b 40005b7c <== NOT EXECUTED 40005818: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED tty->tty_rcvwakeup = 0; /* * link tty */ tty->forw = rtems_termios_ttyHead; 4000581c: 07 10 00 6b sethi %hi(0x4001ac00), %g3 40005820: c2 00 e0 84 ld [ %g3 + 0x84 ], %g1 ! 4001ac84 return RTEMS_NO_MEMORY; } /* * Initialize wakeup callbacks */ tty->tty_snd.sw_pfn = NULL; 40005824: c0 24 60 d4 clr [ %l1 + 0xd4 ] tty->tty_snd.sw_arg = NULL; 40005828: c0 24 60 d8 clr [ %l1 + 0xd8 ] tty->tty_rcv.sw_pfn = NULL; 4000582c: c0 24 60 dc clr [ %l1 + 0xdc ] tty->tty_rcv.sw_arg = NULL; 40005830: c0 24 60 e0 clr [ %l1 + 0xe0 ] tty->tty_rcvwakeup = 0; 40005834: c0 24 60 e4 clr [ %l1 + 0xe4 ] /* * link tty */ tty->forw = rtems_termios_ttyHead; 40005838: c2 24 40 00 st %g1, [ %l1 ] tty->back = NULL; if (rtems_termios_ttyHead != NULL) 4000583c: 80 a0 60 00 cmp %g1, 0 40005840: 02 80 00 03 be 4000584c 40005844: c0 24 60 04 clr [ %l1 + 4 ] rtems_termios_ttyHead->back = tty; 40005848: e2 20 60 04 st %l1, [ %g1 + 4 ] <== NOT EXECUTED rtems_termios_ttyHead = tty; if (rtems_termios_ttyTail == NULL) 4000584c: 05 10 00 6b sethi %hi(0x4001ac00), %g2 40005850: c2 00 a0 80 ld [ %g2 + 0x80 ], %g1 ! 4001ac80 40005854: 80 a0 60 00 cmp %g1, 0 40005858: 12 80 00 03 bne 40005864 4000585c: e0 20 e0 84 st %l0, [ %g3 + 0x84 ] rtems_termios_ttyTail = tty; 40005860: e0 20 a0 80 st %l0, [ %g2 + 0x80 ] tty->major = major; /* * Set up mutex semaphores */ sc = rtems_semaphore_create ( 40005864: 25 10 00 67 sethi %hi(0x40019c00), %l2 40005868: c2 4c a3 30 ldsb [ %l2 + 0x330 ], %g1 ! 40019f30 4000586c: 11 15 14 9a sethi %hi(0x54526800), %o0 rtems_termios_ttyHead->back = tty; rtems_termios_ttyHead = tty; if (rtems_termios_ttyTail == NULL) rtems_termios_ttyTail = tty; tty->minor = minor; 40005870: f2 24 20 10 st %i1, [ %l0 + 0x10 ] tty->major = major; 40005874: f0 24 20 0c st %i0, [ %l0 + 0xc ] /* * Set up mutex semaphores */ sc = rtems_semaphore_create ( 40005878: 90 12 21 00 or %o0, 0x100, %o0 4000587c: 92 10 20 01 mov 1, %o1 40005880: 90 10 40 08 or %g1, %o0, %o0 40005884: 94 10 20 54 mov 0x54, %o2 40005888: 96 10 20 00 clr %o3 4000588c: 40 00 02 f3 call 40006458 40005890: 98 04 20 14 add %l0, 0x14, %o4 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) 40005894: 80 a2 20 00 cmp %o0, 0 40005898: 02 80 00 05 be 400058ac 4000589c: c2 4c a3 30 ldsb [ %l2 + 0x330 ], %g1 rtems_fatal_error_occurred (sc); 400058a0: 40 00 06 c7 call 400073bc <== NOT EXECUTED 400058a4: 01 00 00 00 nop <== NOT EXECUTED sc = rtems_semaphore_create ( 400058a8: c2 4c a3 30 ldsb [ %l2 + 0x330 ], %g1 <== NOT EXECUTED 400058ac: 11 15 14 9b sethi %hi(0x54526c00), %o0 400058b0: 92 10 20 01 mov 1, %o1 400058b4: 90 12 23 00 or %o0, 0x300, %o0 400058b8: 94 10 20 54 mov 0x54, %o2 400058bc: 90 10 40 08 or %g1, %o0, %o0 400058c0: 96 10 20 00 clr %o3 400058c4: 40 00 02 e5 call 40006458 400058c8: 98 04 20 18 add %l0, 0x18, %o4 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) 400058cc: 80 a2 20 00 cmp %o0, 0 400058d0: 02 80 00 05 be 400058e4 400058d4: c2 4c a3 30 ldsb [ %l2 + 0x330 ], %g1 rtems_fatal_error_occurred (sc); 400058d8: 40 00 06 b9 call 400073bc <== NOT EXECUTED 400058dc: 01 00 00 00 nop <== NOT EXECUTED sc = rtems_semaphore_create ( 400058e0: c2 4c a3 30 ldsb [ %l2 + 0x330 ], %g1 <== NOT EXECUTED 400058e4: 11 15 14 9e sethi %hi(0x54527800), %o0 400058e8: 92 10 20 00 clr %o1 400058ec: 90 10 40 08 or %g1, %o0, %o0 400058f0: 94 10 20 20 mov 0x20, %o2 400058f4: 96 10 20 00 clr %o3 400058f8: 40 00 02 d8 call 40006458 400058fc: 98 04 20 8c add %l0, 0x8c, %o4 rtems_build_name ('T', 'R', 'x', c), 0, RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_FIFO, RTEMS_NO_PRIORITY, &tty->rawOutBuf.Semaphore); if (sc != RTEMS_SUCCESSFUL) 40005900: 80 a2 20 00 cmp %o0, 0 40005904: 22 80 00 05 be,a 40005918 40005908: c0 24 20 94 clr [ %l0 + 0x94 ] rtems_fatal_error_occurred (sc); 4000590c: 40 00 06 ac call 400073bc <== NOT EXECUTED 40005910: 01 00 00 00 nop <== NOT EXECUTED tty->rawOutBufState = rob_idle; 40005914: c0 24 20 94 clr [ %l0 + 0x94 ] <== NOT EXECUTED /* * Set callbacks */ tty->device = *callbacks; 40005918: 92 10 00 1b mov %i3, %o1 4000591c: 90 04 20 98 add %l0, 0x98, %o0 40005920: 40 00 27 7c call 4000f710 40005924: 94 10 20 20 mov 0x20, %o2 /* * Create I/O tasks */ if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { 40005928: c2 04 20 b4 ld [ %l0 + 0xb4 ], %g1 4000592c: 80 a0 60 02 cmp %g1, 2 40005930: 32 80 00 1f bne,a 400059ac 40005934: c2 04 60 a0 ld [ %l1 + 0xa0 ], %g1 sc = rtems_task_create ( 40005938: c2 4c a3 30 ldsb [ %l2 + 0x330 ], %g1 <== NOT EXECUTED 4000593c: 11 15 1e 15 sethi %hi(0x54785400), %o0 <== NOT EXECUTED 40005940: 92 10 20 0a mov 0xa, %o1 <== NOT EXECUTED 40005944: 90 10 40 08 or %g1, %o0, %o0 <== NOT EXECUTED 40005948: 94 10 24 00 mov 0x400, %o2 <== NOT EXECUTED 4000594c: 96 10 25 00 mov 0x500, %o3 <== NOT EXECUTED 40005950: 98 10 20 00 clr %o4 <== NOT EXECUTED 40005954: 40 00 04 a8 call 40006bf4 <== NOT EXECUTED 40005958: 9a 04 20 c8 add %l0, 0xc8, %o5 <== NOT EXECUTED TERMIOS_TXTASK_STACKSIZE, RTEMS_NO_PREEMPT | RTEMS_NO_TIMESLICE | RTEMS_NO_ASR, RTEMS_NO_FLOATING_POINT | RTEMS_LOCAL, &tty->txTaskId); if (sc != RTEMS_SUCCESSFUL) 4000595c: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40005960: 02 80 00 05 be 40005974 <== NOT EXECUTED 40005964: c2 4c a3 30 ldsb [ %l2 + 0x330 ], %g1 <== NOT EXECUTED rtems_fatal_error_occurred (sc); 40005968: 40 00 06 95 call 400073bc <== NOT EXECUTED 4000596c: 01 00 00 00 nop <== NOT EXECUTED sc = rtems_task_create ( 40005970: c2 4c a3 30 ldsb [ %l2 + 0x330 ], %g1 <== NOT EXECUTED 40005974: 11 14 9e 15 sethi %hi(0x52785400), %o0 <== NOT EXECUTED 40005978: 92 10 20 09 mov 9, %o1 <== NOT EXECUTED 4000597c: 90 10 40 08 or %g1, %o0, %o0 <== NOT EXECUTED 40005980: 94 10 24 00 mov 0x400, %o2 <== NOT EXECUTED 40005984: 96 10 25 00 mov 0x500, %o3 <== NOT EXECUTED 40005988: 98 10 20 00 clr %o4 <== NOT EXECUTED 4000598c: 40 00 04 9a call 40006bf4 <== NOT EXECUTED 40005990: 9a 04 20 c4 add %l0, 0xc4, %o5 <== NOT EXECUTED TERMIOS_RXTASK_STACKSIZE, RTEMS_NO_PREEMPT | RTEMS_NO_TIMESLICE | RTEMS_NO_ASR, RTEMS_NO_FLOATING_POINT | RTEMS_LOCAL, &tty->rxTaskId); if (sc != RTEMS_SUCCESSFUL) 40005994: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40005998: 22 80 00 05 be,a 400059ac <== NOT EXECUTED 4000599c: c2 04 60 a0 ld [ %l1 + 0xa0 ], %g1 <== NOT EXECUTED rtems_fatal_error_occurred (sc); 400059a0: 40 00 06 87 call 400073bc <== NOT EXECUTED 400059a4: 01 00 00 00 nop <== NOT EXECUTED } if ((tty->device.pollRead == NULL) || 400059a8: c2 04 60 a0 ld [ %l1 + 0xa0 ], %g1 <== NOT EXECUTED 400059ac: 80 a0 60 00 cmp %g1, 0 400059b0: 02 80 00 06 be 400059c8 400059b4: 03 10 00 67 sethi %hi(0x40019c00), %g1 400059b8: c2 04 60 b4 ld [ %l1 + 0xb4 ], %g1 400059bc: 80 a0 60 02 cmp %g1, 2 400059c0: 12 80 00 10 bne 40005a00 400059c4: 03 10 00 67 sethi %hi(0x40019c00), %g1 (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN)){ sc = rtems_semaphore_create ( 400059c8: c2 48 63 30 ldsb [ %g1 + 0x330 ], %g1 ! 40019f30 <== NOT EXECUTED 400059cc: 11 15 14 9c sethi %hi(0x54527000), %o0 <== NOT EXECUTED 400059d0: 92 10 20 00 clr %o1 <== NOT EXECUTED 400059d4: 90 12 22 00 or %o0, 0x200, %o0 <== NOT EXECUTED 400059d8: 94 10 20 24 mov 0x24, %o2 <== NOT EXECUTED 400059dc: 90 10 40 08 or %g1, %o0, %o0 <== NOT EXECUTED 400059e0: 96 10 20 00 clr %o3 <== NOT EXECUTED 400059e4: 40 00 02 9d call 40006458 <== NOT EXECUTED 400059e8: 98 04 60 68 add %l1, 0x68, %o4 <== NOT EXECUTED rtems_build_name ('T', 'R', 'r', c), 0, RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_PRIORITY, RTEMS_NO_PRIORITY, &tty->rawInBuf.Semaphore); if (sc != RTEMS_SUCCESSFUL) 400059ec: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400059f0: 02 80 00 04 be 40005a00 <== NOT EXECUTED 400059f4: 01 00 00 00 nop <== NOT EXECUTED rtems_fatal_error_occurred (sc); 400059f8: 40 00 06 71 call 400073bc <== NOT EXECUTED 400059fc: 01 00 00 00 nop <== NOT EXECUTED 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; 40005a00: c0 24 60 b8 clr [ %l1 + 0xb8 ] /* * set low/highwater mark for XON/XOFF support */ tty->lowwater = tty->rawInBuf.Size * 1/2; 40005a04: c2 04 60 64 ld [ %l1 + 0x64 ], %g1 tty->highwater = tty->rawInBuf.Size * 3/4; /* * Bump name characer */ if (c++ == 'z') 40005a08: 09 10 00 67 sethi %hi(0x40019c00), %g4 40005a0c: c4 09 23 30 ldub [ %g4 + 0x330 ], %g2 ! 40019f30 /* 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; 40005a10: 83 30 60 01 srl %g1, 1, %g1 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'; 40005a14: c0 2c 60 4c clrb [ %l1 + 0x4c ] /* 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; 40005a18: c2 24 60 bc st %g1, [ %l1 + 0xbc ] 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'; tty->termios.c_cc[VEOL2] = '\000'; 40005a1c: c0 2c 60 51 clrb [ %l1 + 0x51 ] 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; 40005a20: c6 04 60 64 ld [ %l1 + 0x64 ], %g3 /* * Bump name characer */ if (c++ == 'z') 40005a24: 84 00 a0 01 inc %g2 } /* * Set default parameters */ tty->termios.c_iflag = BRKINT | ICRNL | IXON | IMAXBEL; 40005a28: 03 00 00 09 sethi %hi(0x2400), %g1 tty->lowwater = tty->rawInBuf.Size * 1/2; tty->highwater = tty->rawInBuf.Size * 3/4; /* * Bump name characer */ if (c++ == 'z') 40005a2c: c4 29 23 30 stb %g2, [ %g4 + 0x330 ] } /* * Set default parameters */ tty->termios.c_iflag = BRKINT | ICRNL | IXON | IMAXBEL; 40005a30: 82 10 61 02 or %g1, 0x102, %g1 40005a34: c2 24 60 30 st %g1, [ %l1 + 0x30 ] tty->termios.c_oflag = OPOST | ONLCR | XTABS; 40005a38: 03 00 00 06 sethi %hi(0x1800), %g1 40005a3c: 82 10 60 05 or %g1, 5, %g1 ! 1805 40005a40: c2 24 60 34 st %g1, [ %l1 + 0x34 ] tty->termios.c_cflag = B9600 | CS8 | CREAD | CLOCAL; 40005a44: 82 10 28 bd mov 0x8bd, %g1 40005a48: c2 24 60 38 st %g1, [ %l1 + 0x38 ] tty->termios.c_lflag = ISIG | ICANON | IEXTEN | ECHO | ECHOK | ECHOE | ECHOCTL; 40005a4c: 03 00 00 20 sethi %hi(0x8000), %g1 40005a50: 82 10 62 3b or %g1, 0x23b, %g1 ! 823b 40005a54: c2 24 60 3c st %g1, [ %l1 + 0x3c ] tty->termios.c_cc[VINTR] = '\003'; 40005a58: 82 10 20 03 mov 3, %g1 40005a5c: c2 2c 60 41 stb %g1, [ %l1 + 0x41 ] tty->termios.c_cc[VQUIT] = '\034'; 40005a60: 82 10 20 1c mov 0x1c, %g1 40005a64: c2 2c 60 42 stb %g1, [ %l1 + 0x42 ] tty->termios.c_cc[VERASE] = '\177'; 40005a68: 82 10 20 7f mov 0x7f, %g1 40005a6c: c2 2c 60 43 stb %g1, [ %l1 + 0x43 ] tty->termios.c_cc[VKILL] = '\025'; 40005a70: 82 10 20 15 mov 0x15, %g1 40005a74: c2 2c 60 44 stb %g1, [ %l1 + 0x44 ] tty->termios.c_cc[VEOF] = '\004'; 40005a78: 82 10 20 04 mov 4, %g1 40005a7c: c2 2c 60 45 stb %g1, [ %l1 + 0x45 ] tty->termios.c_cc[VEOL] = '\000'; tty->termios.c_cc[VEOL2] = '\000'; tty->termios.c_cc[VSTART] = '\021'; 40005a80: 82 10 20 11 mov 0x11, %g1 40005a84: c2 2c 60 49 stb %g1, [ %l1 + 0x49 ] tty->termios.c_cc[VSTOP] = '\023'; 40005a88: 82 10 20 13 mov 0x13, %g1 40005a8c: c2 2c 60 4a stb %g1, [ %l1 + 0x4a ] tty->termios.c_cc[VSUSP] = '\032'; 40005a90: 82 10 20 1a mov 0x1a, %g1 40005a94: c2 2c 60 4b stb %g1, [ %l1 + 0x4b ] tty->termios.c_cc[VREPRINT] = '\022'; 40005a98: 82 10 20 12 mov 0x12, %g1 40005a9c: c2 2c 60 4d stb %g1, [ %l1 + 0x4d ] tty->termios.c_cc[VDISCARD] = '\017'; 40005aa0: 82 10 20 0f mov 0xf, %g1 40005aa4: c2 2c 60 4e stb %g1, [ %l1 + 0x4e ] tty->termios.c_cc[VWERASE] = '\027'; 40005aa8: 82 10 20 17 mov 0x17, %g1 40005aac: c2 2c 60 4f stb %g1, [ %l1 + 0x4f ] tty->termios.c_cc[VLNEXT] = '\026'; 40005ab0: 82 10 20 16 mov 0x16, %g1 40005ab4: c2 2c 60 50 stb %g1, [ %l1 + 0x50 ] 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; 40005ab8: 83 28 e0 01 sll %g3, 1, %g1 40005abc: 82 00 40 03 add %g1, %g3, %g1 40005ac0: 83 30 60 02 srl %g1, 2, %g1 /* * Bump name characer */ if (c++ == 'z') 40005ac4: 85 28 a0 18 sll %g2, 0x18, %g2 40005ac8: 85 38 a0 18 sra %g2, 0x18, %g2 40005acc: 80 a0 a0 7b cmp %g2, 0x7b 40005ad0: 12 80 00 04 bne 40005ae0 40005ad4: c2 24 60 c0 st %g1, [ %l1 + 0xc0 ] c = 'a'; 40005ad8: 82 10 20 61 mov 0x61, %g1 <== NOT EXECUTED 40005adc: c2 29 23 30 stb %g1, [ %g4 + 0x330 ] <== NOT EXECUTED } args->iop->data1 = tty; if (!tty->refcount++) { 40005ae0: c2 04 20 08 ld [ %l0 + 8 ], %g1 */ if (c++ == 'z') c = 'a'; } args->iop->data1 = tty; 40005ae4: c4 06 80 00 ld [ %i2 ], %g2 if (!tty->refcount++) { 40005ae8: 82 00 60 01 inc %g1 */ if (c++ == 'z') c = 'a'; } args->iop->data1 = tty; 40005aec: e0 20 a0 28 st %l0, [ %g2 + 0x28 ] if (!tty->refcount++) { 40005af0: 80 a0 60 01 cmp %g1, 1 40005af4: 12 80 00 21 bne 40005b78 40005af8: c2 24 20 08 st %g1, [ %l0 + 8 ] if (tty->device.firstOpen) 40005afc: c2 04 20 98 ld [ %l0 + 0x98 ], %g1 40005b00: 80 a0 60 00 cmp %g1, 0 40005b04: 02 80 00 05 be 40005b18 40005b08: 90 10 00 18 mov %i0, %o0 (*tty->device.firstOpen)(major, minor, arg); 40005b0c: 92 10 00 19 mov %i1, %o1 <== NOT EXECUTED 40005b10: 9f c0 40 00 call %g1 <== NOT EXECUTED 40005b14: 94 10 00 1a mov %i2, %o2 <== NOT EXECUTED /* * start I/O tasks, if needed */ if (tty->device.outputUsesInterrupts == TERMIOS_TASK_DRIVEN) { 40005b18: c2 04 20 b4 ld [ %l0 + 0xb4 ], %g1 40005b1c: 80 a0 60 02 cmp %g1, 2 40005b20: 12 80 00 17 bne 40005b7c 40005b24: 03 10 00 6b sethi %hi(0x4001ac00), %g1 sc = rtems_task_start(tty->rxTaskId, 40005b28: d0 04 20 c4 ld [ %l0 + 0xc4 ], %o0 <== NOT EXECUTED 40005b2c: 13 10 00 16 sethi %hi(0x40005800), %o1 <== NOT EXECUTED 40005b30: 94 10 00 10 mov %l0, %o2 <== NOT EXECUTED 40005b34: 40 00 05 23 call 40006fc0 <== NOT EXECUTED 40005b38: 92 12 63 90 or %o1, 0x390, %o1 <== NOT EXECUTED rtems_termios_rxdaemon, (rtems_task_argument)tty); if (sc != RTEMS_SUCCESSFUL) 40005b3c: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40005b40: 22 80 00 05 be,a 40005b54 <== NOT EXECUTED 40005b44: d0 04 20 c8 ld [ %l0 + 0xc8 ], %o0 <== NOT EXECUTED rtems_fatal_error_occurred (sc); 40005b48: 40 00 06 1d call 400073bc <== NOT EXECUTED 40005b4c: 01 00 00 00 nop <== NOT EXECUTED sc = rtems_task_start(tty->txTaskId, 40005b50: d0 04 20 c8 ld [ %l0 + 0xc8 ], %o0 <== NOT EXECUTED 40005b54: 94 10 00 10 mov %l0, %o2 <== NOT EXECUTED 40005b58: 13 10 00 17 sethi %hi(0x40005c00), %o1 <== NOT EXECUTED 40005b5c: 40 00 05 19 call 40006fc0 <== NOT EXECUTED 40005b60: 92 12 60 00 mov %o1, %o1 ! 40005c00 <== NOT EXECUTED rtems_termios_txdaemon, (rtems_task_argument)tty); if (sc != RTEMS_SUCCESSFUL) 40005b64: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40005b68: 02 80 00 05 be 40005b7c <== NOT EXECUTED 40005b6c: 03 10 00 6b sethi %hi(0x4001ac00), %g1 <== NOT EXECUTED rtems_fatal_error_occurred (sc); 40005b70: 40 00 06 13 call 400073bc <== NOT EXECUTED 40005b74: 01 00 00 00 nop <== NOT EXECUTED } } rtems_semaphore_release (rtems_termios_ttyMutex); 40005b78: 03 10 00 6b sethi %hi(0x4001ac00), %g1 40005b7c: d0 00 60 7c ld [ %g1 + 0x7c ], %o0 ! 4001ac7c 40005b80: 40 00 03 d7 call 40006adc 40005b84: 01 00 00 00 nop return RTEMS_SUCCESSFUL; } 40005b88: 81 c7 e0 08 ret 40005b8c: 91 e8 00 13 restore %g0, %l3, %o0 40004484 : * Send characters to device-specific code */ void rtems_termios_puts ( const void *_buf, int len, struct rtems_termios_tty *tty) { 40004484: 9d e3 bf 98 save %sp, -104, %sp const unsigned char *buf = _buf; unsigned int newHead; rtems_interrupt_level level; rtems_status_code sc; if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) { 40004488: c2 06 a0 b4 ld [ %i2 + 0xb4 ], %g1 4000448c: 80 a0 60 00 cmp %g1, 0 40004490: 12 80 00 08 bne 400044b0 40004494: 92 10 00 18 mov %i0, %o1 (*tty->device.write)(tty->minor, (void *)buf, len); 40004498: d0 06 a0 10 ld [ %i2 + 0x10 ], %o0 4000449c: c2 06 a0 a4 ld [ %i2 + 0xa4 ], %g1 400044a0: 9f c0 40 00 call %g1 400044a4: 94 10 00 19 mov %i1, %o2 400044a8: 81 c7 e0 08 ret 400044ac: 81 e8 00 00 restore return; } newHead = tty->rawOutBuf.Head; 400044b0: e2 06 a0 80 ld [ %i2 + 0x80 ], %l1 <== NOT EXECUTED while (len) { 400044b4: 10 80 00 3c b 400045a4 <== NOT EXECUTED 400044b8: 80 a6 60 00 cmp %i1, 0 <== NOT EXECUTED * len -= ncopy * * To minimize latency, the memcpy should be done * with interrupts enabled. */ newHead = (newHead + 1) % tty->rawOutBuf.Size; 400044bc: d2 06 a0 88 ld [ %i2 + 0x88 ], %o1 <== NOT EXECUTED 400044c0: 40 00 47 94 call 40016310 <.urem> <== NOT EXECUTED 400044c4: 90 04 60 01 add %l1, 1, %o0 <== NOT EXECUTED rtems_interrupt_disable (level); 400044c8: 7f ff f6 81 call 40001ecc <== NOT EXECUTED 400044cc: a2 10 00 08 mov %o0, %l1 <== NOT EXECUTED 400044d0: a0 10 00 08 mov %o0, %l0 <== NOT EXECUTED 400044d4: 30 80 00 10 b,a 40004514 <== NOT EXECUTED while (newHead == tty->rawOutBuf.Tail) { tty->rawOutBufState = rob_wait; 400044d8: c2 26 a0 94 st %g1, [ %i2 + 0x94 ] <== NOT EXECUTED rtems_interrupt_enable (level); 400044dc: 7f ff f6 80 call 40001edc <== NOT EXECUTED 400044e0: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED sc = rtems_semaphore_obtain (tty->rawOutBuf.Semaphore, 400044e4: d0 06 a0 8c ld [ %i2 + 0x8c ], %o0 <== NOT EXECUTED 400044e8: 92 10 20 00 clr %o1 <== NOT EXECUTED 400044ec: 40 00 08 b5 call 400067c0 <== NOT EXECUTED 400044f0: 94 10 20 00 clr %o2 <== NOT EXECUTED RTEMS_WAIT, RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) 400044f4: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400044f8: 02 80 00 04 be 40004508 <== NOT EXECUTED 400044fc: 01 00 00 00 nop <== NOT EXECUTED rtems_fatal_error_occurred (sc); 40004500: 40 00 0b af call 400073bc <== NOT EXECUTED 40004504: 01 00 00 00 nop <== NOT EXECUTED rtems_interrupt_disable (level); 40004508: 7f ff f6 71 call 40001ecc <== NOT EXECUTED 4000450c: 01 00 00 00 nop <== NOT EXECUTED 40004510: a0 10 00 08 mov %o0, %l0 <== NOT EXECUTED * 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) { 40004514: c2 06 a0 84 ld [ %i2 + 0x84 ], %g1 <== NOT EXECUTED 40004518: 80 a4 40 01 cmp %l1, %g1 <== NOT EXECUTED 4000451c: 02 bf ff ef be 400044d8 <== NOT EXECUTED 40004520: 82 10 20 02 mov 2, %g1 <== NOT EXECUTED RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); rtems_interrupt_disable (level); } tty->rawOutBuf.theBuf[tty->rawOutBuf.Head] = *buf++; 40004524: c6 06 a0 80 ld [ %i2 + 0x80 ], %g3 <== NOT EXECUTED 40004528: c4 0e 00 00 ldub [ %i0 ], %g2 <== NOT EXECUTED 4000452c: c2 06 a0 7c ld [ %i2 + 0x7c ], %g1 <== NOT EXECUTED 40004530: c4 28 40 03 stb %g2, [ %g1 + %g3 ] <== NOT EXECUTED tty->rawOutBuf.Head = newHead; if (tty->rawOutBufState == rob_idle) { 40004534: c2 06 a0 94 ld [ %i2 + 0x94 ], %g1 <== NOT EXECUTED if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); rtems_interrupt_disable (level); } tty->rawOutBuf.theBuf[tty->rawOutBuf.Head] = *buf++; tty->rawOutBuf.Head = newHead; 40004538: e2 26 a0 80 st %l1, [ %i2 + 0x80 ] <== NOT EXECUTED if (tty->rawOutBufState == rob_idle) { 4000453c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40004540: 32 80 00 15 bne,a 40004594 <== NOT EXECUTED 40004544: b0 06 20 01 inc %i0 <== NOT EXECUTED /* check, whether XOFF has been received */ if (!(tty->flow_ctrl & FL_ORCVXOF)) { 40004548: c2 06 a0 b8 ld [ %i2 + 0xb8 ], %g1 <== NOT EXECUTED 4000454c: 80 88 60 10 btst 0x10, %g1 <== NOT EXECUTED 40004550: 12 80 00 0b bne 4000457c <== NOT EXECUTED 40004554: 01 00 00 00 nop <== NOT EXECUTED (*tty->device.write)(tty->minor, 40004558: d2 06 a0 84 ld [ %i2 + 0x84 ], %o1 <== NOT EXECUTED 4000455c: c2 06 a0 7c ld [ %i2 + 0x7c ], %g1 <== NOT EXECUTED 40004560: c4 06 a0 a4 ld [ %i2 + 0xa4 ], %g2 <== NOT EXECUTED 40004564: d0 06 a0 10 ld [ %i2 + 0x10 ], %o0 <== NOT EXECUTED 40004568: 92 02 40 01 add %o1, %g1, %o1 <== NOT EXECUTED 4000456c: 9f c0 80 00 call %g2 <== NOT EXECUTED 40004570: 94 10 20 01 mov 1, %o2 <== NOT EXECUTED } else { /* remember that output has been stopped due to flow ctrl*/ tty->flow_ctrl |= FL_OSTOP; } tty->rawOutBufState = rob_busy; 40004574: 10 80 00 06 b 4000458c <== NOT EXECUTED 40004578: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED (*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; 4000457c: c2 06 a0 b8 ld [ %i2 + 0xb8 ], %g1 <== NOT EXECUTED 40004580: 82 10 60 20 or %g1, 0x20, %g1 <== NOT EXECUTED 40004584: c2 26 a0 b8 st %g1, [ %i2 + 0xb8 ] <== NOT EXECUTED } tty->rawOutBufState = rob_busy; 40004588: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED 4000458c: c2 26 a0 94 st %g1, [ %i2 + 0x94 ] <== NOT EXECUTED RTEMS_NO_TIMEOUT); if (sc != RTEMS_SUCCESSFUL) rtems_fatal_error_occurred (sc); rtems_interrupt_disable (level); } tty->rawOutBuf.theBuf[tty->rawOutBuf.Head] = *buf++; 40004590: b0 06 20 01 inc %i0 <== NOT EXECUTED /* remember that output has been stopped due to flow ctrl*/ tty->flow_ctrl |= FL_OSTOP; } tty->rawOutBufState = rob_busy; } rtems_interrupt_enable (level); 40004594: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 40004598: 7f ff f6 51 call 40001edc <== NOT EXECUTED 4000459c: b2 06 7f ff add %i1, -1, %i1 <== NOT EXECUTED if (tty->device.outputUsesInterrupts == TERMIOS_POLLED) { (*tty->device.write)(tty->minor, (void *)buf, len); return; } newHead = tty->rawOutBuf.Head; while (len) { 400045a0: 80 a6 60 00 cmp %i1, 0 <== NOT EXECUTED 400045a4: 12 bf ff c6 bne 400044bc <== NOT EXECUTED 400045a8: 01 00 00 00 nop <== NOT EXECUTED 400045ac: 81 c7 e0 08 ret <== NOT EXECUTED 400045b0: 81 e8 00 00 restore <== NOT EXECUTED 40004d44 : return RTEMS_SUCCESSFUL; } rtems_status_code rtems_termios_read (void *arg) { 40004d44: 9d e3 bf 90 save %sp, -112, %sp <== NOT EXECUTED rtems_libio_rw_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 40004d48: c2 06 00 00 ld [ %i0 ], %g1 <== NOT EXECUTED uint32_t count = args->count; 40004d4c: e4 06 20 0c ld [ %i0 + 0xc ], %l2 <== NOT EXECUTED rtems_status_code rtems_termios_read (void *arg) { rtems_libio_rw_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 40004d50: e0 00 60 28 ld [ %g1 + 0x28 ], %l0 <== NOT EXECUTED uint32_t count = args->count; char *buffer = args->buffer; 40004d54: e6 06 20 08 ld [ %i0 + 8 ], %l3 <== NOT EXECUTED rtems_status_code sc; sc = rtems_semaphore_obtain (tty->isem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 40004d58: d0 04 20 14 ld [ %l0 + 0x14 ], %o0 <== NOT EXECUTED return RTEMS_SUCCESSFUL; } rtems_status_code rtems_termios_read (void *arg) { 40004d5c: a8 10 00 18 mov %i0, %l4 <== NOT EXECUTED struct rtems_termios_tty *tty = args->iop->data1; uint32_t count = args->count; char *buffer = args->buffer; rtems_status_code sc; sc = rtems_semaphore_obtain (tty->isem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 40004d60: 92 10 20 00 clr %o1 <== NOT EXECUTED 40004d64: 40 00 06 97 call 400067c0 <== NOT EXECUTED 40004d68: 94 10 20 00 clr %o2 <== NOT EXECUTED if (sc != RTEMS_SUCCESSFUL) 40004d6c: b0 92 20 00 orcc %o0, 0, %i0 <== NOT EXECUTED 40004d70: 12 80 00 10 bne 40004db0 <== NOT EXECUTED 40004d74: 03 10 00 6a sethi %hi(0x4001a800), %g1 <== NOT EXECUTED return sc; if (rtems_termios_linesw[tty->t_line].l_read != NULL) { 40004d78: c4 04 20 cc ld [ %l0 + 0xcc ], %g2 <== NOT EXECUTED 40004d7c: 82 10 62 78 or %g1, 0x278, %g1 <== NOT EXECUTED 40004d80: 85 28 a0 05 sll %g2, 5, %g2 <== NOT EXECUTED 40004d84: 84 00 80 01 add %g2, %g1, %g2 <== NOT EXECUTED 40004d88: c2 00 a0 08 ld [ %g2 + 8 ], %g1 <== NOT EXECUTED 40004d8c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40004d90: 02 80 00 0a be 40004db8 <== NOT EXECUTED 40004d94: 92 10 00 14 mov %l4, %o1 <== NOT EXECUTED sc = rtems_termios_linesw[tty->t_line].l_read(tty,args); 40004d98: 9f c0 40 00 call %g1 <== NOT EXECUTED 40004d9c: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 40004da0: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED tty->tty_rcvwakeup = 0; rtems_semaphore_release (tty->isem); 40004da4: d0 04 20 14 ld [ %l0 + 0x14 ], %o0 <== NOT EXECUTED 40004da8: 40 00 07 4d call 40006adc <== NOT EXECUTED 40004dac: c0 24 20 e4 clr [ %l0 + 0xe4 ] <== NOT EXECUTED 40004db0: 81 c7 e0 08 ret <== NOT EXECUTED 40004db4: 81 e8 00 00 restore <== NOT EXECUTED return sc; } if (tty->cindex == tty->ccount) { 40004db8: c4 04 20 24 ld [ %l0 + 0x24 ], %g2 <== NOT EXECUTED 40004dbc: c2 04 20 20 ld [ %l0 + 0x20 ], %g1 <== NOT EXECUTED 40004dc0: 80 a0 80 01 cmp %g2, %g1 <== NOT EXECUTED 40004dc4: 12 80 00 cc bne 400050f4 <== NOT EXECUTED 40004dc8: 80 a4 a0 00 cmp %l2, 0 <== NOT EXECUTED tty->cindex = tty->ccount = 0; tty->read_start_column = tty->column; 40004dcc: c2 04 20 28 ld [ %l0 + 0x28 ], %g1 <== NOT EXECUTED if (tty->device.pollRead != NULL 40004dd0: c4 04 20 a0 ld [ %l0 + 0xa0 ], %g2 <== NOT EXECUTED rtems_semaphore_release (tty->isem); return sc; } if (tty->cindex == tty->ccount) { tty->cindex = tty->ccount = 0; tty->read_start_column = tty->column; 40004dd4: c2 24 20 2c st %g1, [ %l0 + 0x2c ] <== NOT EXECUTED tty->tty_rcvwakeup = 0; rtems_semaphore_release (tty->isem); return sc; } if (tty->cindex == tty->ccount) { tty->cindex = tty->ccount = 0; 40004dd8: c0 24 20 20 clr [ %l0 + 0x20 ] <== NOT EXECUTED tty->read_start_column = tty->column; if (tty->device.pollRead != NULL 40004ddc: 80 a0 a0 00 cmp %g2, 0 <== NOT EXECUTED 40004de0: 02 80 00 5a be 40004f48 <== NOT EXECUTED 40004de4: c0 24 20 24 clr [ %l0 + 0x24 ] <== NOT EXECUTED 40004de8: c2 04 20 b4 ld [ %l0 + 0xb4 ], %g1 <== NOT EXECUTED 40004dec: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40004df0: 32 80 00 57 bne,a 40004f4c <== NOT EXECUTED 40004df4: e2 04 20 74 ld [ %l0 + 0x74 ], %l1 <== NOT EXECUTED static rtems_status_code fillBufferPoll (struct rtems_termios_tty *tty) { int n; if (tty->termios.c_lflag & ICANON) { 40004df8: c2 04 20 3c ld [ %l0 + 0x3c ], %g1 <== NOT EXECUTED 40004dfc: 80 88 60 02 btst 2, %g1 <== NOT EXECUTED 40004e00: 22 80 00 13 be,a 40004e4c <== NOT EXECUTED 40004e04: c2 0c 20 47 ldub [ %l0 + 0x47 ], %g1 <== NOT EXECUTED for (;;) { n = (*tty->device.pollRead)(tty->minor); 40004e08: c2 04 20 a0 ld [ %l0 + 0xa0 ], %g1 <== NOT EXECUTED 40004e0c: 9f c0 40 00 call %g1 <== NOT EXECUTED 40004e10: d0 04 20 10 ld [ %l0 + 0x10 ], %o0 <== NOT EXECUTED if (n < 0) { 40004e14: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40004e18: 16 80 00 06 bge 40004e30 <== NOT EXECUTED 40004e1c: 90 0a 20 ff and %o0, 0xff, %o0 <== NOT EXECUTED rtems_task_wake_after (1); 40004e20: 40 00 08 a7 call 400070bc <== NOT EXECUTED 40004e24: 90 10 20 01 mov 1, %o0 <== NOT EXECUTED { int n; if (tty->termios.c_lflag & ICANON) { for (;;) { n = (*tty->device.pollRead)(tty->minor); 40004e28: 10 bf ff f9 b 40004e0c <== NOT EXECUTED 40004e2c: c2 04 20 a0 ld [ %l0 + 0xa0 ], %g1 <== NOT EXECUTED if (n < 0) { rtems_task_wake_after (1); } else { if (siproc (n, tty)) 40004e30: 7f ff ff 64 call 40004bc0 <== NOT EXECUTED 40004e34: 92 10 00 10 mov %l0, %o1 <== NOT EXECUTED 40004e38: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40004e3c: 22 bf ff f4 be,a 40004e0c <== NOT EXECUTED 40004e40: c2 04 20 a0 ld [ %l0 + 0xa0 ], %g1 <== NOT EXECUTED else sc = fillBufferQueue (tty); if (sc != RTEMS_SUCCESSFUL) tty->cindex = tty->ccount = 0; } while (count && (tty->cindex < tty->ccount)) { 40004e44: 10 80 00 ac b 400050f4 <== NOT EXECUTED 40004e48: 80 a4 a0 00 cmp %l2, 0 <== NOT EXECUTED } } } else { rtems_interval then, now; if (!tty->termios.c_cc[VMIN] && tty->termios.c_cc[VTIME]) 40004e4c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40004e50: 12 80 00 0a bne 40004e78 <== NOT EXECUTED 40004e54: aa 07 bf f4 add %fp, -12, %l5 <== NOT EXECUTED 40004e58: c2 0c 20 46 ldub [ %l0 + 0x46 ], %g1 <== NOT EXECUTED 40004e5c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40004e60: 02 80 00 07 be 40004e7c <== NOT EXECUTED 40004e64: a2 07 bf f0 add %fp, -16, %l1 <== NOT EXECUTED rtems_clock_get (RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &then); 40004e68: 90 10 20 02 mov 2, %o0 <== NOT EXECUTED 40004e6c: 40 00 03 99 call 40005cd0 <== NOT EXECUTED 40004e70: 92 07 bf f4 add %fp, -12, %o1 <== NOT EXECUTED else { siproc (n, tty); if (tty->ccount >= tty->termios.c_cc[VMIN]) break; if (tty->termios.c_cc[VMIN] && tty->termios.c_cc[VTIME]) rtems_clock_get (RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &then); 40004e74: aa 07 bf f4 add %fp, -12, %l5 <== NOT EXECUTED } } else { if (!tty->termios.c_cc[VTIME]) break; rtems_clock_get (RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &now); 40004e78: a2 07 bf f0 add %fp, -16, %l1 <== NOT EXECUTED else { rtems_interval then, now; if (!tty->termios.c_cc[VMIN] && tty->termios.c_cc[VTIME]) rtems_clock_get (RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &then); for (;;) { n = (*tty->device.pollRead)(tty->minor); 40004e7c: c2 04 20 a0 ld [ %l0 + 0xa0 ], %g1 <== NOT EXECUTED 40004e80: 9f c0 40 00 call %g1 <== NOT EXECUTED 40004e84: d0 04 20 10 ld [ %l0 + 0x10 ], %o0 <== NOT EXECUTED if (n < 0) { 40004e88: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40004e8c: 36 80 00 1d bge,a 40004f00 <== NOT EXECUTED 40004e90: 90 0a 20 ff and %o0, 0xff, %o0 <== NOT EXECUTED if (tty->termios.c_cc[VMIN]) { 40004e94: c2 0c 20 47 ldub [ %l0 + 0x47 ], %g1 <== NOT EXECUTED 40004e98: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40004e9c: 02 80 00 0a be 40004ec4 <== NOT EXECUTED 40004ea0: c4 0c 20 46 ldub [ %l0 + 0x46 ], %g2 <== NOT EXECUTED if (tty->termios.c_cc[VTIME] && tty->ccount) { 40004ea4: 80 a0 a0 00 cmp %g2, 0 <== NOT EXECUTED 40004ea8: 02 80 00 12 be 40004ef0 <== NOT EXECUTED 40004eac: 01 00 00 00 nop <== NOT EXECUTED 40004eb0: c2 04 20 20 ld [ %l0 + 0x20 ], %g1 <== NOT EXECUTED 40004eb4: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40004eb8: 02 80 00 0e be 40004ef0 <== NOT EXECUTED 40004ebc: 90 10 20 02 mov 2, %o0 <== NOT EXECUTED 40004ec0: 30 80 00 04 b,a 40004ed0 <== NOT EXECUTED break; } } } else { if (!tty->termios.c_cc[VTIME]) 40004ec4: 80 a0 a0 00 cmp %g2, 0 <== NOT EXECUTED 40004ec8: 02 80 00 8a be 400050f0 <== NOT EXECUTED 40004ecc: 90 10 20 02 mov 2, %o0 <== NOT EXECUTED break; rtems_clock_get (RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &now); 40004ed0: 40 00 03 80 call 40005cd0 <== NOT EXECUTED 40004ed4: 92 10 00 11 mov %l1, %o1 <== NOT EXECUTED if ((now - then) > tty->vtimeTicks) { 40004ed8: c2 04 20 54 ld [ %l0 + 0x54 ], %g1 <== NOT EXECUTED 40004edc: c4 1f bf f0 ldd [ %fp + -16 ], %g2 <== NOT EXECUTED 40004ee0: 84 20 80 03 sub %g2, %g3, %g2 <== NOT EXECUTED 40004ee4: 80 a0 80 01 cmp %g2, %g1 <== NOT EXECUTED 40004ee8: 18 80 00 83 bgu 400050f4 <== NOT EXECUTED 40004eec: 80 a4 a0 00 cmp %l2, 0 <== NOT EXECUTED break; } } rtems_task_wake_after (1); 40004ef0: 40 00 08 73 call 400070bc <== NOT EXECUTED 40004ef4: 90 10 20 01 mov 1, %o0 <== NOT EXECUTED else { rtems_interval then, now; if (!tty->termios.c_cc[VMIN] && tty->termios.c_cc[VTIME]) rtems_clock_get (RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &then); for (;;) { n = (*tty->device.pollRead)(tty->minor); 40004ef8: 10 bf ff e2 b 40004e80 <== NOT EXECUTED 40004efc: c2 04 20 a0 ld [ %l0 + 0xa0 ], %g1 <== NOT EXECUTED } } rtems_task_wake_after (1); } else { siproc (n, tty); 40004f00: 7f ff ff 30 call 40004bc0 <== NOT EXECUTED 40004f04: 92 10 00 10 mov %l0, %o1 <== NOT EXECUTED if (tty->ccount >= tty->termios.c_cc[VMIN]) 40004f08: c4 0c 20 47 ldub [ %l0 + 0x47 ], %g2 <== NOT EXECUTED 40004f0c: c2 04 20 20 ld [ %l0 + 0x20 ], %g1 <== NOT EXECUTED 40004f10: 80 a0 40 02 cmp %g1, %g2 <== NOT EXECUTED 40004f14: 16 80 00 77 bge 400050f0 <== NOT EXECUTED 40004f18: 80 a0 a0 00 cmp %g2, 0 <== NOT EXECUTED break; if (tty->termios.c_cc[VMIN] && tty->termios.c_cc[VTIME]) 40004f1c: 22 bf ff d9 be,a 40004e80 <== NOT EXECUTED 40004f20: c2 04 20 a0 ld [ %l0 + 0xa0 ], %g1 <== NOT EXECUTED 40004f24: c2 0c 20 46 ldub [ %l0 + 0x46 ], %g1 <== NOT EXECUTED 40004f28: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40004f2c: 22 bf ff d5 be,a 40004e80 <== NOT EXECUTED 40004f30: c2 04 20 a0 ld [ %l0 + 0xa0 ], %g1 <== NOT EXECUTED rtems_clock_get (RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &then); 40004f34: 92 10 00 15 mov %l5, %o1 <== NOT EXECUTED 40004f38: 40 00 03 66 call 40005cd0 <== NOT EXECUTED 40004f3c: 90 10 20 02 mov 2, %o0 <== NOT EXECUTED else { rtems_interval then, now; if (!tty->termios.c_cc[VMIN] && tty->termios.c_cc[VTIME]) rtems_clock_get (RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &then); for (;;) { n = (*tty->device.pollRead)(tty->minor); 40004f40: 10 bf ff d0 b 40004e80 <== NOT EXECUTED 40004f44: c2 04 20 a0 ld [ %l0 + 0xa0 ], %g1 <== NOT EXECUTED * Fill the input buffer from the raw input queue */ static rtems_status_code fillBufferQueue (struct rtems_termios_tty *tty) { rtems_interval timeout = tty->rawInBufSemaphoreFirstTimeout; 40004f48: e2 04 20 74 ld [ %l0 + 0x74 ], %l1 <== NOT EXECUTED 40004f4c: ac 10 20 01 mov 1, %l6 <== NOT EXECUTED while ( wait ) { /* * Process characters read from raw queue */ while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) && 40004f50: 2f 10 00 67 sethi %hi(0x40019c00), %l7 <== NOT EXECUTED 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)(tty->minor, 40004f54: 10 80 00 4c b 40005084 <== NOT EXECUTED 40004f58: aa 04 20 49 add %l0, 0x49, %l5 <== 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; 40004f5c: d0 04 20 5c ld [ %l0 + 0x5c ], %o0 <== NOT EXECUTED 40004f60: d2 04 20 64 ld [ %l0 + 0x64 ], %o1 <== NOT EXECUTED 40004f64: 40 00 44 eb call 40016310 <.urem> <== NOT EXECUTED 40004f68: 90 02 20 01 inc %o0 <== NOT EXECUTED c = tty->rawInBuf.theBuf[newHead]; 40004f6c: c2 04 20 58 ld [ %l0 + 0x58 ], %g1 <== 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; 40004f70: 84 10 00 08 mov %o0, %g2 <== NOT EXECUTED c = tty->rawInBuf.theBuf[newHead]; 40004f74: e2 08 40 08 ldub [ %g1 + %o0 ], %l1 <== NOT EXECUTED tty->rawInBuf.Head = newHead; 40004f78: d0 24 20 5c st %o0, [ %l0 + 0x5c ] <== NOT EXECUTED if(((tty->rawInBuf.Tail-newHead+tty->rawInBuf.Size) 40004f7c: c2 04 20 60 ld [ %l0 + 0x60 ], %g1 <== NOT EXECUTED 40004f80: d0 04 20 64 ld [ %l0 + 0x64 ], %o0 <== NOT EXECUTED 40004f84: d2 04 20 64 ld [ %l0 + 0x64 ], %o1 <== NOT EXECUTED 40004f88: 90 02 00 01 add %o0, %g1, %o0 <== NOT EXECUTED 40004f8c: 40 00 44 e1 call 40016310 <.urem> <== NOT EXECUTED 40004f90: 90 22 00 02 sub %o0, %g2, %o0 <== NOT EXECUTED 40004f94: c2 04 20 bc ld [ %l0 + 0xbc ], %g1 <== NOT EXECUTED 40004f98: 80 a2 00 01 cmp %o0, %g1 <== NOT EXECUTED 40004f9c: 3a 80 00 27 bcc,a 40005038 <== NOT EXECUTED 40004fa0: c2 04 20 3c ld [ %l0 + 0x3c ], %g1 <== NOT EXECUTED % tty->rawInBuf.Size) < tty->lowwater) { tty->flow_ctrl &= ~FL_IREQXOF; 40004fa4: c2 04 20 b8 ld [ %l0 + 0xb8 ], %g1 <== NOT EXECUTED 40004fa8: 82 08 7f fe and %g1, -2, %g1 <== NOT EXECUTED 40004fac: c2 24 20 b8 st %g1, [ %l0 + 0xb8 ] <== NOT EXECUTED /* if tx stopped and XON should be sent... */ if (((tty->flow_ctrl & (FL_MDXON | FL_ISNTXOF)) 40004fb0: c2 04 20 b8 ld [ %l0 + 0xb8 ], %g1 <== NOT EXECUTED 40004fb4: 82 08 62 02 and %g1, 0x202, %g1 <== NOT EXECUTED 40004fb8: 80 a0 62 02 cmp %g1, 0x202 <== NOT EXECUTED 40004fbc: 12 80 00 11 bne 40005000 <== NOT EXECUTED 40004fc0: 01 00 00 00 nop <== NOT EXECUTED 40004fc4: c2 04 20 94 ld [ %l0 + 0x94 ], %g1 <== NOT EXECUTED 40004fc8: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40004fcc: 22 80 00 07 be,a 40004fe8 <== NOT EXECUTED 40004fd0: c2 04 20 a4 ld [ %l0 + 0xa4 ], %g1 <== NOT EXECUTED 40004fd4: c2 04 20 b8 ld [ %l0 + 0xb8 ], %g1 <== NOT EXECUTED 40004fd8: 80 88 60 20 btst 0x20, %g1 <== NOT EXECUTED 40004fdc: 02 80 00 09 be 40005000 <== NOT EXECUTED 40004fe0: 01 00 00 00 nop <== NOT EXECUTED == (FL_MDXON | FL_ISNTXOF)) && ((tty->rawOutBufState == rob_idle) || (tty->flow_ctrl & FL_OSTOP))) { /* XON should be sent now... */ (*tty->device.write)(tty->minor, 40004fe4: c2 04 20 a4 ld [ %l0 + 0xa4 ], %g1 <== NOT EXECUTED 40004fe8: d0 04 20 10 ld [ %l0 + 0x10 ], %o0 <== NOT EXECUTED 40004fec: 92 10 00 15 mov %l5, %o1 <== NOT EXECUTED 40004ff0: 9f c0 40 00 call %g1 <== NOT EXECUTED 40004ff4: 94 10 20 01 mov 1, %o2 <== NOT EXECUTED } } } /* continue processing new character */ if (tty->termios.c_lflag & ICANON) { 40004ff8: 10 80 00 10 b 40005038 <== NOT EXECUTED 40004ffc: c2 04 20 3c ld [ %l0 + 0x3c ], %g1 <== NOT EXECUTED /* XON should be sent now... */ (*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1); } else if (tty->flow_ctrl & FL_MDRTS) { 40005000: c2 04 20 b8 ld [ %l0 + 0xb8 ], %g1 <== NOT EXECUTED 40005004: 80 88 61 00 btst 0x100, %g1 <== NOT EXECUTED 40005008: 22 80 00 0c be,a 40005038 <== NOT EXECUTED 4000500c: c2 04 20 3c ld [ %l0 + 0x3c ], %g1 <== NOT EXECUTED tty->flow_ctrl &= ~FL_IRTSOFF; 40005010: c2 04 20 b8 ld [ %l0 + 0xb8 ], %g1 <== NOT EXECUTED /* activate RTS line */ if (tty->device.startRemoteTx != NULL) { 40005014: c4 04 20 b0 ld [ %l0 + 0xb0 ], %g2 <== NOT EXECUTED (*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1); } else if (tty->flow_ctrl & FL_MDRTS) { tty->flow_ctrl &= ~FL_IRTSOFF; 40005018: 82 08 7f fb and %g1, -5, %g1 <== NOT EXECUTED 4000501c: c2 24 20 b8 st %g1, [ %l0 + 0xb8 ] <== NOT EXECUTED /* activate RTS line */ if (tty->device.startRemoteTx != NULL) { 40005020: 80 a0 a0 00 cmp %g2, 0 <== NOT EXECUTED 40005024: 22 80 00 05 be,a 40005038 <== NOT EXECUTED 40005028: c2 04 20 3c ld [ %l0 + 0x3c ], %g1 <== NOT EXECUTED tty->device.startRemoteTx(tty->minor); 4000502c: 9f c0 80 00 call %g2 <== NOT EXECUTED 40005030: d0 04 20 10 ld [ %l0 + 0x10 ], %o0 <== NOT EXECUTED } } } /* continue processing new character */ if (tty->termios.c_lflag & ICANON) { 40005034: c2 04 20 3c ld [ %l0 + 0x3c ], %g1 <== NOT EXECUTED 40005038: 80 88 60 02 btst 2, %g1 <== NOT EXECUTED 4000503c: 02 80 00 09 be 40005060 <== NOT EXECUTED 40005040: 90 0c 60 ff and %l1, 0xff, %o0 <== NOT EXECUTED if (siproc (c, tty)) 40005044: 7f ff fe df call 40004bc0 <== NOT EXECUTED 40005048: 92 10 00 10 mov %l0, %o1 <== NOT EXECUTED 4000504c: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40005050: 32 80 00 0c bne,a 40005080 <== NOT EXECUTED 40005054: ac 10 20 00 clr %l6 <== NOT EXECUTED else { siproc (c, tty); if (tty->ccount >= tty->termios.c_cc[VMIN]) wait = 0; } timeout = tty->rawInBufSemaphoreTimeout; 40005058: 10 80 00 0b b 40005084 <== NOT EXECUTED 4000505c: e2 04 20 70 ld [ %l0 + 0x70 ], %l1 <== NOT EXECUTED if (tty->termios.c_lflag & ICANON) { if (siproc (c, tty)) wait = 0; } else { siproc (c, tty); 40005060: 7f ff fe d8 call 40004bc0 <== NOT EXECUTED 40005064: 92 10 00 10 mov %l0, %o1 <== NOT EXECUTED if (tty->ccount >= tty->termios.c_cc[VMIN]) 40005068: c4 0c 20 47 ldub [ %l0 + 0x47 ], %g2 <== NOT EXECUTED 4000506c: c2 04 20 20 ld [ %l0 + 0x20 ], %g1 <== NOT EXECUTED 40005070: 80 a0 40 02 cmp %g1, %g2 <== NOT EXECUTED 40005074: 26 80 00 04 bl,a 40005084 <== NOT EXECUTED 40005078: e2 04 20 70 ld [ %l0 + 0x70 ], %l1 <== NOT EXECUTED 4000507c: ac 10 20 00 clr %l6 <== NOT EXECUTED wait = 0; } timeout = tty->rawInBufSemaphoreTimeout; 40005080: e2 04 20 70 ld [ %l0 + 0x70 ], %l1 <== NOT EXECUTED while ( wait ) { /* * Process characters read from raw queue */ while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) && 40005084: c4 04 20 5c ld [ %l0 + 0x5c ], %g2 <== NOT EXECUTED 40005088: c2 04 20 60 ld [ %l0 + 0x60 ], %g1 <== NOT EXECUTED 4000508c: 80 a0 80 01 cmp %g2, %g1 <== NOT EXECUTED 40005090: 02 80 00 07 be 400050ac <== NOT EXECUTED 40005094: c2 05 e3 24 ld [ %l7 + 0x324 ], %g1 <== NOT EXECUTED 40005098: c4 04 20 20 ld [ %l0 + 0x20 ], %g2 <== NOT EXECUTED 4000509c: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 400050a0: 80 a0 80 01 cmp %g2, %g1 <== NOT EXECUTED 400050a4: 06 bf ff ae bl 40004f5c <== NOT EXECUTED 400050a8: 01 00 00 00 nop <== NOT EXECUTED } /* * Wait for characters */ if ( wait ) { 400050ac: 80 a5 a0 00 cmp %l6, 0 <== NOT EXECUTED 400050b0: 02 80 00 11 be 400050f4 <== NOT EXECUTED 400050b4: 80 a4 a0 00 cmp %l2, 0 <== NOT EXECUTED sc = rtems_semaphore_obtain (tty->rawInBuf.Semaphore, 400050b8: d0 04 20 68 ld [ %l0 + 0x68 ], %o0 <== NOT EXECUTED 400050bc: d2 04 20 6c ld [ %l0 + 0x6c ], %o1 <== NOT EXECUTED 400050c0: 40 00 05 c0 call 400067c0 <== NOT EXECUTED 400050c4: 94 10 00 11 mov %l1, %o2 <== NOT EXECUTED tty->rawInBufSemaphoreOptions, timeout); if (sc != RTEMS_SUCCESSFUL) 400050c8: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400050cc: 02 bf ff ee be 40005084 <== NOT EXECUTED 400050d0: 80 a4 a0 00 cmp %l2, 0 <== NOT EXECUTED 400050d4: 30 80 00 08 b,a 400050f4 <== NOT EXECUTED sc = fillBufferQueue (tty); if (sc != RTEMS_SUCCESSFUL) tty->cindex = tty->ccount = 0; } while (count && (tty->cindex < tty->ccount)) { *buffer++ = tty->cbuf[tty->cindex++]; 400050d8: c2 04 20 1c ld [ %l0 + 0x1c ], %g1 <== NOT EXECUTED count--; 400050dc: a4 04 bf ff add %l2, -1, %l2 <== NOT EXECUTED sc = fillBufferQueue (tty); if (sc != RTEMS_SUCCESSFUL) tty->cindex = tty->ccount = 0; } while (count && (tty->cindex < tty->ccount)) { *buffer++ = tty->cbuf[tty->cindex++]; 400050e0: c2 08 40 02 ldub [ %g1 + %g2 ], %g1 <== NOT EXECUTED 400050e4: c2 2c c0 00 stb %g1, [ %l3 ] <== NOT EXECUTED 400050e8: c6 24 20 24 st %g3, [ %l0 + 0x24 ] <== NOT EXECUTED 400050ec: a6 04 e0 01 inc %l3 <== NOT EXECUTED else sc = fillBufferQueue (tty); if (sc != RTEMS_SUCCESSFUL) tty->cindex = tty->ccount = 0; } while (count && (tty->cindex < tty->ccount)) { 400050f0: 80 a4 a0 00 cmp %l2, 0 <== NOT EXECUTED 400050f4: 22 80 00 08 be,a 40005114 <== NOT EXECUTED 400050f8: c2 05 20 0c ld [ %l4 + 0xc ], %g1 <== NOT EXECUTED 400050fc: c4 04 20 24 ld [ %l0 + 0x24 ], %g2 <== NOT EXECUTED 40005100: c2 04 20 20 ld [ %l0 + 0x20 ], %g1 <== NOT EXECUTED 40005104: 80 a0 80 01 cmp %g2, %g1 <== NOT EXECUTED 40005108: 06 bf ff f4 bl 400050d8 <== NOT EXECUTED 4000510c: 86 00 a0 01 add %g2, 1, %g3 <== NOT EXECUTED *buffer++ = tty->cbuf[tty->cindex++]; count--; } args->bytes_moved = args->count - count; 40005110: c2 05 20 0c ld [ %l4 + 0xc ], %g1 <== NOT EXECUTED tty->tty_rcvwakeup = 0; 40005114: c0 24 20 e4 clr [ %l0 + 0xe4 ] <== NOT EXECUTED } while (count && (tty->cindex < tty->ccount)) { *buffer++ = tty->cbuf[tty->cindex++]; count--; } args->bytes_moved = args->count - count; 40005118: 82 20 40 12 sub %g1, %l2, %g1 <== NOT EXECUTED 4000511c: c2 25 20 14 st %g1, [ %l4 + 0x14 ] <== NOT EXECUTED tty->tty_rcvwakeup = 0; rtems_semaphore_release (tty->isem); 40005120: 40 00 06 6f call 40006adc <== NOT EXECUTED 40005124: d0 04 20 14 ld [ %l0 + 0x14 ], %o0 <== NOT EXECUTED return sc; } 40005128: 81 c7 e0 08 ret <== NOT EXECUTED 4000512c: 81 e8 00 00 restore <== NOT EXECUTED 40003efc : * 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) { 40003efc: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED int nToSend; rtems_interrupt_level level; int len; /* check for XOF/XON to send */ if ((tty->flow_ctrl & (FL_MDXOF | FL_IREQXOF | FL_ISNTXOF)) 40003f00: c2 06 20 b8 ld [ %i0 + 0xb8 ], %g1 <== NOT EXECUTED 40003f04: 82 08 64 03 and %g1, 0x403, %g1 <== NOT EXECUTED 40003f08: 80 a0 64 01 cmp %g1, 0x401 <== NOT EXECUTED 40003f0c: 12 80 00 0f bne 40003f48 <== NOT EXECUTED 40003f10: 92 06 20 4a add %i0, 0x4a, %o1 <== NOT EXECUTED == (FL_MDXOF | FL_IREQXOF)) { /* XOFF should be sent now... */ (*tty->device.write)(tty->minor, 40003f14: c2 06 20 a4 ld [ %i0 + 0xa4 ], %g1 <== NOT EXECUTED 40003f18: d0 06 20 10 ld [ %i0 + 0x10 ], %o0 <== NOT EXECUTED 40003f1c: 9f c0 40 00 call %g1 <== NOT EXECUTED 40003f20: 94 10 20 01 mov 1, %o2 <== NOT EXECUTED (void *)&(tty->termios.c_cc[VSTOP]), 1); rtems_interrupt_disable(level); 40003f24: 7f ff f7 ea call 40001ecc <== NOT EXECUTED 40003f28: 01 00 00 00 nop <== NOT EXECUTED tty->t_dqlen--; 40003f2c: c2 06 20 90 ld [ %i0 + 0x90 ], %g1 <== NOT EXECUTED tty->flow_ctrl |= FL_ISNTXOF; 40003f30: c4 06 20 b8 ld [ %i0 + 0xb8 ], %g2 <== NOT EXECUTED /* XOFF should be sent now... */ (*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTOP]), 1); rtems_interrupt_disable(level); tty->t_dqlen--; 40003f34: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED tty->flow_ctrl |= FL_ISNTXOF; 40003f38: 84 10 a0 02 or %g2, 2, %g2 <== NOT EXECUTED /* XOFF should be sent now... */ (*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTOP]), 1); rtems_interrupt_disable(level); tty->t_dqlen--; 40003f3c: c2 26 20 90 st %g1, [ %i0 + 0x90 ] <== NOT EXECUTED tty->flow_ctrl |= FL_ISNTXOF; 40003f40: c4 26 20 b8 st %g2, [ %i0 + 0xb8 ] <== NOT EXECUTED rtems_interrupt_enable(level); 40003f44: 30 80 00 12 b,a 40003f8c <== NOT EXECUTED nToSend = 1; } else if ((tty->flow_ctrl & (FL_IREQXOF | FL_ISNTXOF)) 40003f48: c2 06 20 b8 ld [ %i0 + 0xb8 ], %g1 <== NOT EXECUTED 40003f4c: 82 08 60 03 and %g1, 3, %g1 <== NOT EXECUTED 40003f50: 80 a0 60 02 cmp %g1, 2 <== NOT EXECUTED 40003f54: 12 80 00 12 bne 40003f9c <== NOT EXECUTED 40003f58: 92 06 20 49 add %i0, 0x49, %o1 <== 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, 40003f5c: c2 06 20 a4 ld [ %i0 + 0xa4 ], %g1 <== NOT EXECUTED 40003f60: d0 06 20 10 ld [ %i0 + 0x10 ], %o0 <== NOT EXECUTED 40003f64: 9f c0 40 00 call %g1 <== NOT EXECUTED 40003f68: 94 10 20 01 mov 1, %o2 <== NOT EXECUTED (void *)&(tty->termios.c_cc[VSTART]), 1); rtems_interrupt_disable(level); 40003f6c: 7f ff f7 d8 call 40001ecc <== NOT EXECUTED 40003f70: 01 00 00 00 nop <== NOT EXECUTED tty->t_dqlen--; 40003f74: c2 06 20 90 ld [ %i0 + 0x90 ], %g1 <== NOT EXECUTED tty->flow_ctrl &= ~FL_ISNTXOF; 40003f78: c4 06 20 b8 ld [ %i0 + 0xb8 ], %g2 <== NOT EXECUTED */ (*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1); rtems_interrupt_disable(level); tty->t_dqlen--; 40003f7c: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED tty->flow_ctrl &= ~FL_ISNTXOF; 40003f80: 84 08 bf fd and %g2, -3, %g2 <== NOT EXECUTED */ (*tty->device.write)(tty->minor, (void *)&(tty->termios.c_cc[VSTART]), 1); rtems_interrupt_disable(level); tty->t_dqlen--; 40003f84: c2 26 20 90 st %g1, [ %i0 + 0x90 ] <== NOT EXECUTED tty->flow_ctrl &= ~FL_ISNTXOF; 40003f88: c4 26 20 b8 st %g2, [ %i0 + 0xb8 ] <== NOT EXECUTED rtems_interrupt_enable(level); 40003f8c: 7f ff f7 d4 call 40001edc <== NOT EXECUTED 40003f90: a2 10 20 01 mov 1, %l1 <== NOT EXECUTED nToSend); } tty->rawOutBuf.Tail = newTail; /*apm*/ } return nToSend; } 40003f94: 81 c7 e0 08 ret <== NOT EXECUTED 40003f98: 91 e8 00 11 restore %g0, %l1, %o0 <== NOT EXECUTED rtems_interrupt_enable(level); nToSend = 1; } else { if ( tty->rawOutBuf.Head == tty->rawOutBuf.Tail ) { 40003f9c: c4 06 20 80 ld [ %i0 + 0x80 ], %g2 <== NOT EXECUTED 40003fa0: c2 06 20 84 ld [ %i0 + 0x84 ], %g1 <== NOT EXECUTED 40003fa4: 80 a0 80 01 cmp %g2, %g1 <== NOT EXECUTED 40003fa8: 12 80 00 0a bne 40003fd0 <== NOT EXECUTED 40003fac: 01 00 00 00 nop <== NOT EXECUTED /* * buffer was empty */ if (tty->rawOutBufState == rob_wait) { 40003fb0: c2 06 20 94 ld [ %i0 + 0x94 ], %g1 <== NOT EXECUTED 40003fb4: 80 a0 60 02 cmp %g1, 2 <== NOT EXECUTED 40003fb8: 12 80 00 49 bne 400040dc <== NOT EXECUTED 40003fbc: a2 10 20 00 clr %l1 <== NOT EXECUTED /* * this should never happen... */ rtems_semaphore_release (tty->rawOutBuf.Semaphore); 40003fc0: 40 00 0a c7 call 40006adc <== NOT EXECUTED 40003fc4: d0 06 20 8c ld [ %i0 + 0x8c ], %o0 <== NOT EXECUTED nToSend); } tty->rawOutBuf.Tail = newTail; /*apm*/ } return nToSend; } 40003fc8: 81 c7 e0 08 ret <== NOT EXECUTED 40003fcc: 91 e8 00 11 restore %g0, %l1, %o0 <== NOT EXECUTED rtems_semaphore_release (tty->rawOutBuf.Semaphore); } return 0; } rtems_interrupt_disable(level); 40003fd0: 7f ff f7 bf call 40001ecc <== NOT EXECUTED 40003fd4: 01 00 00 00 nop <== NOT EXECUTED len = tty->t_dqlen; 40003fd8: e0 06 20 90 ld [ %i0 + 0x90 ], %l0 <== NOT EXECUTED tty->t_dqlen = 0; 40003fdc: c0 26 20 90 clr [ %i0 + 0x90 ] <== NOT EXECUTED rtems_interrupt_enable(level); 40003fe0: 7f ff f7 bf call 40001edc <== NOT EXECUTED 40003fe4: 01 00 00 00 nop <== NOT EXECUTED newTail = (tty->rawOutBuf.Tail + len) % tty->rawOutBuf.Size; 40003fe8: d0 06 20 84 ld [ %i0 + 0x84 ], %o0 <== NOT EXECUTED 40003fec: d2 06 20 88 ld [ %i0 + 0x88 ], %o1 <== NOT EXECUTED 40003ff0: 40 00 48 c8 call 40016310 <.urem> <== NOT EXECUTED 40003ff4: 90 04 00 08 add %l0, %o0, %o0 <== NOT EXECUTED tty->rawOutBuf.Tail = newTail; if (tty->rawOutBufState == rob_wait) { 40003ff8: c2 06 20 94 ld [ %i0 + 0x94 ], %g1 <== NOT EXECUTED len = tty->t_dqlen; tty->t_dqlen = 0; rtems_interrupt_enable(level); newTail = (tty->rawOutBuf.Tail + len) % tty->rawOutBuf.Size; tty->rawOutBuf.Tail = newTail; 40003ffc: d0 26 20 84 st %o0, [ %i0 + 0x84 ] <== NOT EXECUTED if (tty->rawOutBufState == rob_wait) { 40004000: 80 a0 60 02 cmp %g1, 2 <== NOT EXECUTED 40004004: 12 80 00 04 bne 40004014 <== NOT EXECUTED 40004008: a0 10 00 08 mov %o0, %l0 <== NOT EXECUTED /* * wake up any pending writer task */ rtems_semaphore_release (tty->rawOutBuf.Semaphore); 4000400c: 40 00 0a b4 call 40006adc <== NOT EXECUTED 40004010: d0 06 20 8c ld [ %i0 + 0x8c ], %o0 <== NOT EXECUTED } if (newTail == tty->rawOutBuf.Head) { 40004014: c2 06 20 80 ld [ %i0 + 0x80 ], %g1 <== NOT EXECUTED 40004018: 80 a4 00 01 cmp %l0, %g1 <== NOT EXECUTED 4000401c: 12 80 00 0b bne 40004048 <== NOT EXECUTED 40004020: 01 00 00 00 nop <== NOT EXECUTED nToSend = 0; /* * check to see if snd wakeup callback was set */ if ( tty->tty_snd.sw_pfn != NULL) { 40004024: c2 06 20 d4 ld [ %i0 + 0xd4 ], %g1 <== NOT EXECUTED } if (newTail == tty->rawOutBuf.Head) { /* * Buffer has become empty */ tty->rawOutBufState = rob_idle; 40004028: c0 26 20 94 clr [ %i0 + 0x94 ] <== NOT EXECUTED nToSend = 0; /* * check to see if snd wakeup callback was set */ if ( tty->tty_snd.sw_pfn != NULL) { 4000402c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40004030: 02 80 00 2a be 400040d8 <== NOT EXECUTED 40004034: a2 10 20 00 clr %l1 <== NOT EXECUTED (*tty->tty_snd.sw_pfn)(&tty->termios, tty->tty_snd.sw_arg); 40004038: d2 06 20 d8 ld [ %i0 + 0xd8 ], %o1 <== NOT EXECUTED 4000403c: 9f c0 40 00 call %g1 <== NOT EXECUTED 40004040: 90 06 20 30 add %i0, 0x30, %o0 <== NOT EXECUTED 40004044: 30 80 00 25 b,a 400040d8 <== NOT EXECUTED } } /* check, whether output should stop due to received XOFF */ else if ((tty->flow_ctrl & (FL_MDXON | FL_ORCVXOF)) 40004048: c2 06 20 b8 ld [ %i0 + 0xb8 ], %g1 <== NOT EXECUTED 4000404c: 82 08 62 10 and %g1, 0x210, %g1 <== NOT EXECUTED 40004050: 80 a0 62 10 cmp %g1, 0x210 <== NOT EXECUTED 40004054: 12 80 00 0c bne 40004084 <== NOT EXECUTED 40004058: 01 00 00 00 nop <== NOT EXECUTED == (FL_MDXON | FL_ORCVXOF)) { /* Buffer not empty, but output stops due to XOFF */ /* set flag, that output has been stopped */ rtems_interrupt_disable(level); 4000405c: 7f ff f7 9c call 40001ecc <== NOT EXECUTED 40004060: 01 00 00 00 nop <== NOT EXECUTED tty->flow_ctrl |= FL_OSTOP; 40004064: c2 06 20 b8 ld [ %i0 + 0xb8 ], %g1 <== NOT EXECUTED tty->rawOutBufState = rob_busy; /*apm*/ 40004068: 84 10 20 01 mov 1, %g2 <== 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; 4000406c: 82 10 60 20 or %g1, 0x20, %g1 <== NOT EXECUTED tty->rawOutBufState = rob_busy; /*apm*/ 40004070: c4 26 20 94 st %g2, [ %i0 + 0x94 ] <== 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; 40004074: c2 26 20 b8 st %g1, [ %i0 + 0xb8 ] <== NOT EXECUTED tty->rawOutBufState = rob_busy; /*apm*/ rtems_interrupt_enable(level); 40004078: 7f ff f7 99 call 40001edc <== NOT EXECUTED 4000407c: a2 10 20 00 clr %l1 <== NOT EXECUTED 40004080: 30 80 00 16 b,a 400040d8 <== NOT EXECUTED } else { /* * Buffer not empty, start tranmitter */ if (newTail > tty->rawOutBuf.Head) 40004084: c2 06 20 80 ld [ %i0 + 0x80 ], %g1 <== NOT EXECUTED 40004088: 80 a4 00 01 cmp %l0, %g1 <== NOT EXECUTED 4000408c: 08 80 00 05 bleu 400040a0 <== NOT EXECUTED 40004090: 01 00 00 00 nop <== NOT EXECUTED nToSend = tty->rawOutBuf.Size - newTail; 40004094: c2 06 20 88 ld [ %i0 + 0x88 ], %g1 <== NOT EXECUTED else nToSend = tty->rawOutBuf.Head - newTail; 40004098: 10 80 00 04 b 400040a8 <== NOT EXECUTED 4000409c: a2 20 40 10 sub %g1, %l0, %l1 <== NOT EXECUTED 400040a0: c2 06 20 80 ld [ %i0 + 0x80 ], %g1 <== NOT EXECUTED 400040a4: a2 20 40 10 sub %g1, %l0, %l1 <== NOT EXECUTED /* 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)) { 400040a8: c2 06 20 b8 ld [ %i0 + 0xb8 ], %g1 <== NOT EXECUTED 400040ac: 80 88 66 00 btst 0x600, %g1 <== NOT EXECUTED 400040b0: 32 80 00 02 bne,a 400040b8 <== NOT EXECUTED 400040b4: a2 10 20 01 mov 1, %l1 <== NOT EXECUTED nToSend = 1; } tty->rawOutBufState = rob_busy; /*apm*/ (*tty->device.write)(tty->minor, 400040b8: d2 06 20 7c ld [ %i0 + 0x7c ], %o1 <== NOT EXECUTED 400040bc: c4 06 20 a4 ld [ %i0 + 0xa4 ], %g2 <== NOT EXECUTED 400040c0: d0 06 20 10 ld [ %i0 + 0x10 ], %o0 <== NOT EXECUTED /* 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*/ 400040c4: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED (*tty->device.write)(tty->minor, 400040c8: 92 04 00 09 add %l0, %o1, %o1 <== NOT EXECUTED /* 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*/ 400040cc: c2 26 20 94 st %g1, [ %i0 + 0x94 ] <== NOT EXECUTED (*tty->device.write)(tty->minor, 400040d0: 9f c0 80 00 call %g2 <== NOT EXECUTED 400040d4: 94 10 00 11 mov %l1, %o2 <== NOT EXECUTED &tty->rawOutBuf.theBuf[newTail], nToSend); } tty->rawOutBuf.Tail = newTail; /*apm*/ 400040d8: e0 26 20 84 st %l0, [ %i0 + 0x84 ] <== NOT EXECUTED } return nToSend; } 400040dc: b0 10 00 11 mov %l1, %i0 <== NOT EXECUTED 400040e0: 81 c7 e0 08 ret <== NOT EXECUTED 400040e4: 81 e8 00 00 restore <== NOT EXECUTED 40005b90 : /* * this task actually processes any receive events */ static rtems_task rtems_termios_rxdaemon(rtems_task_argument argument) { 40005b90: 9d e3 bf 90 save %sp, -112, %sp <== NOT EXECUTED char c_buf; while (1) { /* * wait for rtems event */ rtems_event_receive((TERMIOS_RX_PROC_EVENT | 40005b94: a2 07 bf f0 add %fp, -16, %l1 <== NOT EXECUTED if (c != EOF) { /* * pollRead did call enqueue on its own */ c_buf = c; rtems_termios_enqueue_raw_characters ( 40005b98: a0 07 bf f7 add %fp, -9, %l0 <== NOT EXECUTED char c_buf; while (1) { /* * wait for rtems event */ rtems_event_receive((TERMIOS_RX_PROC_EVENT | 40005b9c: 96 10 00 11 mov %l1, %o3 <== NOT EXECUTED 40005ba0: 92 10 20 02 mov 2, %o1 <== NOT EXECUTED 40005ba4: 94 10 20 00 clr %o2 <== NOT EXECUTED 40005ba8: 40 00 00 b3 call 40005e74 <== NOT EXECUTED 40005bac: 90 10 20 03 mov 3, %o0 <== NOT EXECUTED TERMIOS_RX_TERMINATE_EVENT), RTEMS_EVENT_ANY | RTEMS_WAIT, RTEMS_NO_TIMEOUT, &the_event); if ((the_event & TERMIOS_RX_TERMINATE_EVENT) != 0) { 40005bb0: c2 07 bf f0 ld [ %fp + -16 ], %g1 <== NOT EXECUTED 40005bb4: 80 88 60 01 btst 1, %g1 <== NOT EXECUTED 40005bb8: 22 80 00 07 be,a 40005bd4 <== NOT EXECUTED 40005bbc: c2 06 20 a0 ld [ %i0 + 0xa0 ], %g1 <== NOT EXECUTED tty->rxTaskId = 0; 40005bc0: c0 26 20 c4 clr [ %i0 + 0xc4 ] <== NOT EXECUTED rtems_task_delete(RTEMS_SELF); 40005bc4: 40 00 04 6f call 40006d80 <== NOT EXECUTED 40005bc8: 90 10 20 00 clr %o0 <== NOT EXECUTED char c_buf; while (1) { /* * wait for rtems event */ rtems_event_receive((TERMIOS_RX_PROC_EVENT | 40005bcc: 10 bf ff f5 b 40005ba0 <== NOT EXECUTED 40005bd0: 96 10 00 11 mov %l1, %o3 <== NOT EXECUTED } else { /* * do something */ c = tty->device.pollRead(tty->minor); 40005bd4: 9f c0 40 00 call %g1 <== NOT EXECUTED 40005bd8: d0 06 20 10 ld [ %i0 + 0x10 ], %o0 <== NOT EXECUTED if (c != EOF) { 40005bdc: 80 a2 3f ff cmp %o0, -1 <== NOT EXECUTED 40005be0: 02 bf ff ef be 40005b9c <== NOT EXECUTED 40005be4: 92 10 00 10 mov %l0, %o1 <== NOT EXECUTED /* * pollRead did call enqueue on its own */ c_buf = c; 40005be8: d0 2f bf f7 stb %o0, [ %fp + -9 ] <== NOT EXECUTED rtems_termios_enqueue_raw_characters ( 40005bec: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40005bf0: 7f ff f9 5e call 40004168 <== NOT EXECUTED 40005bf4: 94 10 20 01 mov 1, %o2 <== NOT EXECUTED char c_buf; while (1) { /* * wait for rtems event */ rtems_event_receive((TERMIOS_RX_PROC_EVENT | 40005bf8: 10 bf ff ea b 40005ba0 <== NOT EXECUTED 40005bfc: 96 10 00 11 mov %l1, %o3 <== NOT EXECUTED 40003ee4 : void rtems_termios_rxirq_occured(struct rtems_termios_tty *tty) { /* * send event to rx daemon task */ rtems_event_send(tty->rxTaskId,TERMIOS_RX_PROC_EVENT); 40003ee4: d0 02 20 c4 ld [ %o0 + 0xc4 ], %o0 <== NOT EXECUTED 40003ee8: 92 10 20 02 mov 2, %o1 <== NOT EXECUTED 40003eec: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 40003ef0: 40 00 08 65 call 40006084 <== NOT EXECUTED 40003ef4: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED 40003ef8: 01 00 00 00 nop 40005c00 : /* * this task actually processes any transmit events */ static rtems_task rtems_termios_txdaemon(rtems_task_argument argument) { 40005c00: 9d e3 bf 90 save %sp, -112, %sp <== NOT EXECUTED } else { /* * call any line discipline start function */ if (rtems_termios_linesw[tty->t_line].l_start != NULL) { 40005c04: 03 10 00 6a sethi %hi(0x4001a800), %g1 <== NOT EXECUTED while (1) { /* * wait for rtems event */ rtems_event_receive((TERMIOS_TX_START_EVENT | 40005c08: a0 07 bf f4 add %fp, -12, %l0 <== NOT EXECUTED } else { /* * call any line discipline start function */ if (rtems_termios_linesw[tty->t_line].l_start != NULL) { 40005c0c: a2 10 62 78 or %g1, 0x278, %l1 <== NOT EXECUTED while (1) { /* * wait for rtems event */ rtems_event_receive((TERMIOS_TX_START_EVENT | 40005c10: 92 10 20 02 mov 2, %o1 <== NOT EXECUTED 40005c14: 94 10 20 00 clr %o2 <== NOT EXECUTED 40005c18: 96 10 00 10 mov %l0, %o3 <== NOT EXECUTED 40005c1c: 40 00 00 96 call 40005e74 <== NOT EXECUTED 40005c20: 90 10 20 03 mov 3, %o0 <== NOT EXECUTED TERMIOS_TX_TERMINATE_EVENT), RTEMS_EVENT_ANY | RTEMS_WAIT, RTEMS_NO_TIMEOUT, &the_event); if ((the_event & TERMIOS_TX_TERMINATE_EVENT) != 0) { 40005c24: c2 07 bf f4 ld [ %fp + -12 ], %g1 <== NOT EXECUTED 40005c28: 80 88 60 01 btst 1, %g1 <== NOT EXECUTED 40005c2c: 02 80 00 07 be 40005c48 <== NOT EXECUTED 40005c30: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED tty->txTaskId = 0; 40005c34: c0 26 20 c8 clr [ %i0 + 0xc8 ] <== NOT EXECUTED rtems_task_delete(RTEMS_SELF); 40005c38: 40 00 04 52 call 40006d80 <== NOT EXECUTED 40005c3c: 90 10 20 00 clr %o0 <== NOT EXECUTED while (1) { /* * wait for rtems event */ rtems_event_receive((TERMIOS_TX_START_EVENT | 40005c40: 10 bf ff f5 b 40005c14 <== NOT EXECUTED 40005c44: 92 10 20 02 mov 2, %o1 <== NOT EXECUTED } else { /* * call any line discipline start function */ if (rtems_termios_linesw[tty->t_line].l_start != NULL) { 40005c48: c2 06 20 cc ld [ %i0 + 0xcc ], %g1 <== NOT EXECUTED 40005c4c: 83 28 60 05 sll %g1, 5, %g1 <== NOT EXECUTED 40005c50: 82 00 40 11 add %g1, %l1, %g1 <== NOT EXECUTED 40005c54: c2 00 60 14 ld [ %g1 + 0x14 ], %g1 <== NOT EXECUTED 40005c58: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40005c5c: 02 80 00 04 be 40005c6c <== NOT EXECUTED 40005c60: 01 00 00 00 nop <== NOT EXECUTED rtems_termios_linesw[tty->t_line].l_start(tty); 40005c64: 9f c0 40 00 call %g1 <== NOT EXECUTED 40005c68: 01 00 00 00 nop <== NOT EXECUTED } /* * try to push further characters to device */ rtems_termios_refill_transmitter(tty); 40005c6c: 7f ff f8 a4 call 40003efc <== NOT EXECUTED 40005c70: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED while (1) { /* * wait for rtems event */ rtems_event_receive((TERMIOS_TX_START_EVENT | 40005c74: 10 bf ff e8 b 40005c14 <== NOT EXECUTED 40005c78: 92 10 20 02 mov 2, %o1 <== NOT EXECUTED 40004c0c : rtems_termios_puts (&c, 1, tty); } rtems_status_code rtems_termios_write (void *arg) { 40004c0c: 9d e3 bf 98 save %sp, -104, %sp rtems_libio_rw_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 40004c10: c2 06 00 00 ld [ %i0 ], %g1 rtems_status_code sc; sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 40004c14: 92 10 20 00 clr %o1 rtems_status_code rtems_termios_write (void *arg) { rtems_libio_rw_args_t *args = arg; struct rtems_termios_tty *tty = args->iop->data1; 40004c18: e4 00 60 28 ld [ %g1 + 0x28 ], %l2 rtems_status_code sc; sc = rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); 40004c1c: 94 10 20 00 clr %o2 40004c20: 40 00 06 e8 call 400067c0 40004c24: d0 04 a0 18 ld [ %l2 + 0x18 ], %o0 if (sc != RTEMS_SUCCESSFUL) 40004c28: a6 92 20 00 orcc %o0, 0, %l3 40004c2c: 12 80 00 25 bne 40004cc0 40004c30: 03 10 00 6a sethi %hi(0x4001a800), %g1 return sc; if (rtems_termios_linesw[tty->t_line].l_write != NULL) { 40004c34: c4 04 a0 cc ld [ %l2 + 0xcc ], %g2 40004c38: 82 10 62 78 or %g1, 0x278, %g1 40004c3c: 85 28 a0 05 sll %g2, 5, %g2 40004c40: 84 00 80 01 add %g2, %g1, %g2 40004c44: c2 00 a0 0c ld [ %g2 + 0xc ], %g1 40004c48: 80 a0 60 00 cmp %g1, 0 40004c4c: 02 80 00 06 be 40004c64 40004c50: 92 10 00 18 mov %i0, %o1 sc = rtems_termios_linesw[tty->t_line].l_write(tty,args); 40004c54: 9f c0 40 00 call %g1 <== NOT EXECUTED 40004c58: 90 10 00 12 mov %l2, %o0 <== NOT EXECUTED 40004c5c: 10 80 00 17 b 40004cb8 <== NOT EXECUTED 40004c60: a6 10 00 08 mov %o0, %l3 <== NOT EXECUTED rtems_semaphore_release (tty->osem); return sc; } if (tty->termios.c_oflag & OPOST) { 40004c64: c2 04 a0 34 ld [ %l2 + 0x34 ], %g1 40004c68: d2 06 20 0c ld [ %i0 + 0xc ], %o1 40004c6c: 80 88 60 01 btst 1, %g1 40004c70: 02 80 00 0e be 40004ca8 40004c74: d0 06 20 08 ld [ %i0 + 8 ], %o0 uint32_t count = args->count; 40004c78: a2 10 00 09 mov %o1, %l1 char *buffer = args->buffer; 40004c7c: 10 80 00 05 b 40004c90 40004c80: a0 10 00 08 mov %o0, %l0 while (count--) oproc (*buffer++, tty); 40004c84: 92 10 00 12 mov %l2, %o1 40004c88: 7f ff fe 4b call 400045b4 40004c8c: a0 04 20 01 inc %l0 return sc; } if (tty->termios.c_oflag & OPOST) { uint32_t count = args->count; char *buffer = args->buffer; while (count--) 40004c90: a2 04 7f ff add %l1, -1, %l1 40004c94: 80 a4 7f ff cmp %l1, -1 40004c98: 32 bf ff fb bne,a 40004c84 40004c9c: d0 0c 00 00 ldub [ %l0 ], %o0 oproc (*buffer++, tty); args->bytes_moved = args->count; } else { rtems_termios_puts (args->buffer, args->count, tty); args->bytes_moved = args->count; 40004ca0: 10 80 00 05 b 40004cb4 40004ca4: c2 06 20 0c ld [ %i0 + 0xc ], %g1 while (count--) oproc (*buffer++, tty); args->bytes_moved = args->count; } else { rtems_termios_puts (args->buffer, args->count, tty); 40004ca8: 7f ff fd f7 call 40004484 <== NOT EXECUTED 40004cac: 94 10 00 12 mov %l2, %o2 <== NOT EXECUTED args->bytes_moved = args->count; 40004cb0: c2 06 20 0c ld [ %i0 + 0xc ], %g1 <== NOT EXECUTED 40004cb4: c2 26 20 14 st %g1, [ %i0 + 0x14 ] } rtems_semaphore_release (tty->osem); 40004cb8: 40 00 07 89 call 40006adc 40004cbc: d0 04 a0 18 ld [ %l2 + 0x18 ], %o0 return sc; } 40004cc0: 81 c7 e0 08 ret 40004cc4: 91 e8 00 13 restore %g0, %l3, %o0 400130a8 : */ rtems_status_code rtems_timer_delete( Objects_Id id ) { 400130a8: 9d e3 bf 90 save %sp, -112, %sp RTEMS_INLINE_ROUTINE Timer_Control *_Timer_Get ( Objects_Id id, Objects_Locations *location ) { return (Timer_Control *) 400130ac: 21 10 00 d4 sethi %hi(0x40035000), %l0 400130b0: 92 10 00 18 mov %i0, %o1 400130b4: 94 07 bf f4 add %fp, -12, %o2 400130b8: 40 00 0a 13 call 40015904 <_Objects_Get> 400130bc: 90 14 22 ec or %l0, 0x2ec, %o0 Timer_Control *the_timer; Objects_Locations location; the_timer = _Timer_Get( id, &location ); switch ( location ) { 400130c0: c2 07 bf f4 ld [ %fp + -12 ], %g1 400130c4: 80 a0 60 00 cmp %g1, 0 400130c8: 02 80 00 08 be 400130e8 400130cc: b0 10 00 08 mov %o0, %i0 400130d0: 82 18 60 02 xor %g1, 2, %g1 400130d4: 80 a0 00 01 cmp %g0, %g1 400130d8: 82 60 20 00 subx %g0, 0, %g1 400130dc: b0 08 60 15 and %g1, 0x15, %i0 400130e0: 81 c7 e0 08 ret 400130e4: 91 ee 20 04 restore %i0, 4, %o0 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 400130e8: a0 14 22 ec or %l0, 0x2ec, %l0 ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); 400130ec: c2 02 20 08 ld [ %o0 + 8 ], %g1 Objects_Information *information, uint16_t index, Objects_Control *the_object ) { if ( index <= information->maximum ) 400130f0: c6 14 20 10 lduh [ %l0 + 0x10 ], %g3 400130f4: 05 00 00 3f sethi %hi(0xfc00), %g2 400130f8: 84 10 a3 ff or %g2, 0x3ff, %g2 ! ffff 400130fc: 82 08 40 02 and %g1, %g2, %g1 40013100: 80 a0 40 03 cmp %g1, %g3 40013104: 38 80 00 06 bgu,a 4001311c 40013108: c0 26 20 0c clr [ %i0 + 0xc ] <== NOT EXECUTED information->local_table[ index ] = the_object; 4001310c: c4 04 20 20 ld [ %l0 + 0x20 ], %g2 40013110: 83 28 60 02 sll %g1, 2, %g1 40013114: c0 20 80 01 clr [ %g2 + %g1 ] uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); /* _Objects_Clear_name( the_object->name, information->name_length ); */ the_object->name = 0; 40013118: c0 26 20 0c clr [ %i0 + 0xc ] case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: _Objects_Close( &_Timer_Information, &the_timer->Object ); (void) _Watchdog_Remove( &the_timer->Ticker ); 4001311c: 40 00 15 40 call 4001861c <_Watchdog_Remove> 40013120: 90 06 20 10 add %i0, 0x10, %o0 RTEMS_INLINE_ROUTINE void _Timer_Free ( Timer_Control *the_timer ) { _Objects_Free( &_Timer_Information, &the_timer->Object ); 40013124: 90 10 00 10 mov %l0, %o0 40013128: 40 00 09 a1 call 400157ac <_Objects_Free> 4001312c: 92 10 00 18 mov %i0, %o1 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40013130: 03 10 00 d2 sethi %hi(0x40034800), %g1 40013134: c4 00 60 b0 ld [ %g1 + 0xb0 ], %g2 ! 400348b0 <_Thread_Dispatch_disable_level> 40013138: b0 10 20 00 clr %i0 4001313c: 84 00 bf ff add %g2, -1, %g2 40013140: c4 20 60 b0 st %g2, [ %g1 + 0xb0 ] 40013144: c2 00 60 b0 ld [ %g1 + 0xb0 ], %g1 40013148: 80 a0 60 00 cmp %g1, 0 4001314c: 12 80 00 04 bne 4001315c 40013150: 01 00 00 00 nop _Thread_Dispatch(); 40013154: 40 00 0e e0 call 40016cd4 <_Thread_Dispatch> 40013158: 01 00 00 00 nop _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 4001315c: 81 c7 e0 08 ret 40013160: 81 e8 00 00 restore 40013198 : Objects_Id id, rtems_interval ticks, rtems_timer_service_routine_entry routine, void *user_data ) { 40013198: 9d e3 bf 90 save %sp, -112, %sp 4001319c: a4 10 00 18 mov %i0, %l2 Timer_Control *the_timer; Objects_Locations location; ISR_Level level; if ( ticks == 0 ) 400131a0: 80 a6 60 00 cmp %i1, 0 400131a4: 02 80 00 21 be 40013228 400131a8: b0 10 20 0a mov 0xa, %i0 return RTEMS_INVALID_NUMBER; if ( !routine ) 400131ac: 80 a6 a0 00 cmp %i2, 0 400131b0: 02 80 00 1e be 40013228 400131b4: b0 10 20 09 mov 9, %i0 RTEMS_INLINE_ROUTINE Timer_Control *_Timer_Get ( Objects_Id id, Objects_Locations *location ) { return (Timer_Control *) 400131b8: 11 10 00 d4 sethi %hi(0x40035000), %o0 400131bc: 92 10 00 12 mov %l2, %o1 400131c0: 90 12 22 ec or %o0, 0x2ec, %o0 400131c4: 40 00 09 d0 call 40015904 <_Objects_Get> 400131c8: 94 07 bf f4 add %fp, -12, %o2 return RTEMS_INVALID_ADDRESS; the_timer = _Timer_Get( id, &location ); switch ( location ) { 400131cc: c2 07 bf f4 ld [ %fp + -12 ], %g1 400131d0: 80 a0 60 00 cmp %g1, 0 400131d4: 02 80 00 08 be 400131f4 400131d8: a0 10 00 08 mov %o0, %l0 400131dc: 82 18 60 02 xor %g1, 2, %g1 400131e0: 80 a0 00 01 cmp %g0, %g1 400131e4: 82 60 20 00 subx %g0, 0, %g1 400131e8: b0 08 60 15 and %g1, 0x15, %i0 400131ec: 81 c7 e0 08 ret 400131f0: 91 ee 20 04 restore %i0, 4, %o0 case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: (void) _Watchdog_Remove( &the_timer->Ticker ); 400131f4: a2 02 20 10 add %o0, 0x10, %l1 400131f8: 40 00 15 09 call 4001861c <_Watchdog_Remove> 400131fc: 90 10 00 11 mov %l1, %o0 _ISR_Disable( level ); 40013200: 7f ff dd ac call 4000a8b0 40013204: 01 00 00 00 nop /* * Check to see if the watchdog has just been inserted by a * higher priority interrupt. If so, abandon this insert. */ if ( the_timer->Ticker.state != WATCHDOG_INACTIVE ) { 40013208: c2 04 20 18 ld [ %l0 + 0x18 ], %g1 4001320c: 80 a0 60 00 cmp %g1, 0 40013210: 22 80 00 08 be,a 40013230 40013214: f4 24 20 2c st %i2, [ %l0 + 0x2c ] _ISR_Enable( level ); 40013218: 7f ff dd aa call 4000a8c0 <== NOT EXECUTED 4001321c: b0 10 20 00 clr %i0 <== NOT EXECUTED _Thread_Enable_dispatch(); 40013220: 7f ff ff d1 call 40013164 <_Thread_Enable_dispatch> <== NOT EXECUTED 40013224: 01 00 00 00 nop <== NOT EXECUTED 40013228: 81 c7 e0 08 ret 4001322c: 81 e8 00 00 restore 40013230: e4 24 20 30 st %l2, [ %l0 + 0x30 ] the_watchdog->user_data = user_data; 40013234: f6 24 20 34 st %i3, [ %l0 + 0x34 ] /* * OK. Now we now the timer was not rescheduled by an interrupt * so we can atomically initialize it as in use. */ the_timer->the_class = TIMER_INTERVAL; 40013238: c0 24 20 38 clr [ %l0 + 0x38 ] Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 4001323c: c0 24 20 18 clr [ %l0 + 0x18 ] _Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data ); _ISR_Enable( level ); 40013240: 7f ff dd a0 call 4000a8c0 40013244: b0 10 20 00 clr %i0 ) { the_watchdog->initial = units; _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 40013248: 92 10 00 11 mov %l1, %o1 4001324c: 11 10 00 d2 sethi %hi(0x40034800), %o0 40013250: 90 12 21 ac or %o0, 0x1ac, %o0 ! 400349ac <_Watchdog_Ticks_chain> 40013254: 40 00 14 9a call 400184bc <_Watchdog_Insert> 40013258: f2 24 20 1c st %i1, [ %l0 + 0x1c ] _Watchdog_Insert_ticks( &the_timer->Ticker, ticks ); _Thread_Enable_dispatch(); 4001325c: 7f ff ff c2 call 40013164 <_Thread_Enable_dispatch> 40013260: 01 00 00 00 nop return RTEMS_SUCCESSFUL; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40013264: 81 c7 e0 08 ret 40013268: 81 e8 00 00 restore 40008f00 : rtems_status_code rtems_timer_get_information( Objects_Id id, rtems_timer_information *the_info ) { 40008f00: 9d e3 bf 90 save %sp, -112, %sp 40008f04: 92 10 00 18 mov %i0, %o1 Timer_Control *the_timer; Objects_Locations location; if ( !the_info ) 40008f08: 80 a6 60 00 cmp %i1, 0 40008f0c: 02 80 00 22 be 40008f94 40008f10: b0 10 20 09 mov 9, %i0 RTEMS_INLINE_ROUTINE Timer_Control *_Timer_Get ( Objects_Id id, Objects_Locations *location ) { return (Timer_Control *) 40008f14: 11 10 00 83 sethi %hi(0x40020c00), %o0 40008f18: 94 07 bf f4 add %fp, -12, %o2 40008f1c: 40 00 07 66 call 4000acb4 <_Objects_Get> 40008f20: 90 12 20 08 or %o0, 8, %o0 return RTEMS_INVALID_ADDRESS; the_timer = _Timer_Get( id, &location ); switch ( location ) { 40008f24: c2 07 bf f4 ld [ %fp + -12 ], %g1 40008f28: 80 a0 60 00 cmp %g1, 0 40008f2c: 22 80 00 08 be,a 40008f4c 40008f30: c2 02 20 1c ld [ %o0 + 0x1c ], %g1 40008f34: 82 18 60 02 xor %g1, 2, %g1 <== NOT EXECUTED 40008f38: 80 a0 00 01 cmp %g0, %g1 <== NOT EXECUTED 40008f3c: 82 60 20 00 subx %g0, 0, %g1 <== NOT EXECUTED 40008f40: b0 08 60 15 and %g1, 0x15, %i0 <== NOT EXECUTED 40008f44: 81 c7 e0 08 ret <== NOT EXECUTED 40008f48: 91 ee 20 04 restore %i0, 4, %o0 <== NOT EXECUTED case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: the_info->the_class = the_timer->the_class; 40008f4c: c4 02 20 38 ld [ %o0 + 0x38 ], %g2 the_info->initial = the_timer->Ticker.initial; 40008f50: c2 26 60 04 st %g1, [ %i1 + 4 ] the_info->start_time = the_timer->Ticker.start_time; 40008f54: c2 02 20 24 ld [ %o0 + 0x24 ], %g1 case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: the_info->the_class = the_timer->the_class; 40008f58: c4 26 40 00 st %g2, [ %i1 ] the_info->initial = the_timer->Ticker.initial; the_info->start_time = the_timer->Ticker.start_time; 40008f5c: c2 26 60 08 st %g1, [ %i1 + 8 ] the_info->stop_time = the_timer->Ticker.stop_time; 40008f60: c2 02 20 28 ld [ %o0 + 0x28 ], %g1 40008f64: c2 26 60 0c st %g1, [ %i1 + 0xc ] #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40008f68: 05 10 00 83 sethi %hi(0x40020c00), %g2 40008f6c: c2 00 a1 f0 ld [ %g2 + 0x1f0 ], %g1 ! 40020df0 <_Thread_Dispatch_disable_level> 40008f70: b0 10 20 00 clr %i0 40008f74: 82 00 7f ff add %g1, -1, %g1 40008f78: c2 20 a1 f0 st %g1, [ %g2 + 0x1f0 ] 40008f7c: c2 00 a1 f0 ld [ %g2 + 0x1f0 ], %g1 40008f80: 80 a0 60 00 cmp %g1, 0 40008f84: 12 80 00 04 bne 40008f94 40008f88: 01 00 00 00 nop _Thread_Dispatch(); 40008f8c: 40 00 0c 3e call 4000c084 <_Thread_Dispatch> 40008f90: 01 00 00 00 nop _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 40008f94: 81 c7 e0 08 ret 40008f98: 81 e8 00 00 restore 40013988 : rtems_status_code rtems_timer_initiate_server( uint32_t priority, uint32_t stack_size, rtems_attribute attribute_set ) { 40013988: 9d e3 bf 90 save %sp, -112, %sp /* * Make sure the requested priority is valid. */ _priority = priority; if ( priority == RTEMS_TIMER_SERVER_DEFAULT_PRIORITY ) 4001398c: 92 10 20 00 clr %o1 40013990: 80 a6 3f ff cmp %i0, -1 40013994: 02 80 00 07 be 400139b0 40013998: 94 10 00 19 mov %i1, %o2 _priority = 0; else if ( !_RTEMS_tasks_Priority_is_valid( priority ) ) 4001399c: 82 06 3f ff add %i0, -1, %g1 400139a0: 80 a0 60 fe cmp %g1, 0xfe 400139a4: 18 80 00 48 bgu 40013ac4 400139a8: a0 10 20 13 mov 0x13, %l0 400139ac: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED 400139b0: 05 10 00 d2 sethi %hi(0x40034800), %g2 400139b4: c2 00 a0 b0 ld [ %g2 + 0xb0 ], %g1 ! 400348b0 <_Thread_Dispatch_disable_level> 400139b8: 82 00 60 01 inc %g1 400139bc: c2 20 a0 b0 st %g1, [ %g2 + 0xb0 ] * Just to make sure the test versus create/start operation are atomic. */ _Thread_Disable_dispatch(); if ( _Timer_Server ) { 400139c0: 03 10 00 d4 sethi %hi(0x40035000), %g1 400139c4: c2 00 63 38 ld [ %g1 + 0x338 ], %g1 ! 40035338 <_Timer_Server> 400139c8: 80 a0 60 00 cmp %g1, 0 400139cc: 02 80 00 06 be 400139e4 400139d0: 19 00 00 20 sethi %hi(0x8000), %o4 _Thread_Enable_dispatch(); 400139d4: 7f ff ff a0 call 40013854 <_Thread_Enable_dispatch> <== NOT EXECUTED 400139d8: a0 10 20 0e mov 0xe, %l0 <== NOT EXECUTED _Watchdog_Initialize( &_Timer_Server->Timer, _Thread_Delay_ended, id, NULL ); _Watchdog_Initialize( &_Timer_Seconds_timer, _Thread_Delay_ended, id, NULL ); _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; } 400139dc: 81 c7 e0 08 ret <== NOT EXECUTED 400139e0: 91 e8 00 10 restore %g0, %l0, %o0 <== NOT EXECUTED * Server should run at the same priority as the priority Ada task. * Otherwise, the priority ceiling for the mutex used to protect the * GNAT run-time is violated. */ status = rtems_task_create( 400139e4: 11 15 12 53 sethi %hi(0x54494c00), %o0 400139e8: 98 16 80 0c or %i2, %o4, %o4 400139ec: 90 12 21 45 or %o0, 0x145, %o0 400139f0: 96 10 21 00 mov 0x100, %o3 400139f4: 7f ff fa 0e call 4001222c 400139f8: 9a 07 bf f4 add %fp, -12, %o5 /* user may want floating point but we need */ /* system task specified for 0 priority */ attribute_set | RTEMS_SYSTEM_TASK, &id /* get the id back */ ); if (status) { 400139fc: a0 92 20 00 orcc %o0, 0, %l0 40013a00: 12 80 00 2f bne 40013abc 40013a04: d0 07 bf f4 ld [ %fp + -12 ], %o0 _Thread_Enable_dispatch(); return status; } status = rtems_task_start( 40013a08: 13 10 00 4e sethi %hi(0x40013800), %o1 40013a0c: 94 10 20 00 clr %o2 40013a10: 7f ff fc 62 call 40012b98 40013a14: 92 12 60 88 or %o1, 0x88, %o1 id, /* the id from create */ (rtems_task_entry) _Timer_Server_body, /* the timer server entry point */ 0 /* there is no argument */ ); if (status) { 40013a18: a0 92 20 00 orcc %o0, 0, %l0 40013a1c: 12 80 00 28 bne 40013abc 40013a20: 03 10 00 d1 sethi %hi(0x40034400), %g1 * * NOTE: Setting the pointer to the Timer Server TCB to a value other than * NULL indicates that task-based timer support is initialized. */ _Timer_Server = (Thread_Control *)_Objects_Get_local_object( 40013a24: c8 07 bf f4 ld [ %fp + -12 ], %g4 RTEMS_INLINE_ROUTINE Objects_Control *_Objects_Get_local_object( Objects_Information *information, uint16_t index ) { if ( index > information->maximum ) 40013a28: 9a 10 63 60 or %g1, 0x360, %o5 40013a2c: c4 13 60 10 lduh [ %o5 + 0x10 ], %g2 40013a30: 03 00 00 3f sethi %hi(0xfc00), %g1 40013a34: 82 10 63 ff or %g1, 0x3ff, %g1 ! ffff 40013a38: 82 09 00 01 and %g4, %g1, %g1 40013a3c: 80 a0 40 02 cmp %g1, %g2 40013a40: 18 80 00 05 bgu 40013a54 40013a44: 86 10 20 00 clr %g3 return NULL; return information->local_table[ index ]; 40013a48: c4 03 60 20 ld [ %o5 + 0x20 ], %g2 40013a4c: 83 28 60 02 sll %g1, 2, %g1 40013a50: c6 00 80 01 ld [ %g2 + %g1 ], %g3 40013a54: 03 10 00 d4 sethi %hi(0x40035000), %g1 40013a58: c6 20 63 38 st %g3, [ %g1 + 0x338 ] ! 40035338 <_Timer_Server> */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 40013a5c: 03 10 00 d1 sethi %hi(0x40034400), %g1 40013a60: 82 10 63 b0 or %g1, 0x3b0, %g1 ! 400347b0 <_Timer_Ticks_chain+0x4> */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 40013a64: c2 20 7f fc st %g1, [ %g1 + -4 ] 40013a68: 82 00 7f fc add %g1, -4, %g1 ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; the_watchdog->id = id; the_watchdog->user_data = user_data; 40013a6c: c0 20 e0 6c clr [ %g3 + 0x6c ] Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 40013a70: c0 20 e0 50 clr [ %g3 + 0x50 ] the_watchdog->routine = routine; the_watchdog->id = id; 40013a74: c8 20 e0 68 st %g4, [ %g3 + 0x68 ] Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; 40013a78: 05 10 00 5b sethi %hi(0x40016c00), %g2 the_chain->permanent_null = NULL; the_chain->last = _Chain_Head(the_chain); 40013a7c: c2 20 60 08 st %g1, [ %g1 + 8 ] 40013a80: 84 10 a0 18 or %g2, 0x18, %g2 RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); the_chain->permanent_null = NULL; 40013a84: c0 20 60 04 clr [ %g1 + 4 ] 40013a88: c4 20 e0 64 st %g2, [ %g3 + 0x64 ] */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 40013a8c: 03 10 00 d1 sethi %hi(0x40034400), %g1 40013a90: 82 10 63 c4 or %g1, 0x3c4, %g1 ! 400347c4 <_Timer_Seconds_chain+0x4> */ RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); 40013a94: c2 20 7f fc st %g1, [ %g1 + -4 ] 40013a98: 82 00 7f fc add %g1, -4, %g1 the_chain->permanent_null = NULL; the_chain->last = _Chain_Head(the_chain); 40013a9c: c2 20 60 08 st %g1, [ %g1 + 8 ] RTEMS_INLINE_ROUTINE void _Chain_Initialize_empty( Chain_Control *the_chain ) { the_chain->first = _Chain_Tail(the_chain); the_chain->permanent_null = NULL; 40013aa0: c0 20 60 04 clr [ %g1 + 4 ] Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 40013aa4: 03 10 00 d1 sethi %hi(0x40034400), %g1 40013aa8: 82 10 63 cc or %g1, 0x3cc, %g1 ! 400347cc <_Timer_Seconds_timer> the_watchdog->routine = routine; 40013aac: c4 20 60 1c st %g2, [ %g1 + 0x1c ] the_watchdog->id = id; 40013ab0: c8 20 60 20 st %g4, [ %g1 + 0x20 ] the_watchdog->user_data = user_data; 40013ab4: c0 20 60 24 clr [ %g1 + 0x24 ] Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 40013ab8: c0 20 60 08 clr [ %g1 + 8 ] */ _Watchdog_Initialize( &_Timer_Server->Timer, _Thread_Delay_ended, id, NULL ); _Watchdog_Initialize( &_Timer_Seconds_timer, _Thread_Delay_ended, id, NULL ); _Thread_Enable_dispatch(); 40013abc: 7f ff ff 66 call 40013854 <_Thread_Enable_dispatch> 40013ac0: 01 00 00 00 nop return RTEMS_SUCCESSFUL; } 40013ac4: b0 10 00 10 mov %l0, %i0 40013ac8: 81 c7 e0 08 ret 40013acc: 81 e8 00 00 restore 40013518 : Objects_Id id, rtems_interval ticks, rtems_timer_service_routine_entry routine, void *user_data ) { 40013518: 9d e3 bf 90 save %sp, -112, %sp Timer_Control *the_timer; Objects_Locations location; ISR_Level level; if ( !_Timer_Server ) 4001351c: 25 10 00 d4 sethi %hi(0x40035000), %l2 40013520: c2 04 a3 38 ld [ %l2 + 0x338 ], %g1 ! 40035338 <_Timer_Server> Objects_Id id, rtems_interval ticks, rtems_timer_service_routine_entry routine, void *user_data ) { 40013524: a6 10 00 18 mov %i0, %l3 Timer_Control *the_timer; Objects_Locations location; ISR_Level level; if ( !_Timer_Server ) 40013528: 80 a0 60 00 cmp %g1, 0 4001352c: 02 80 00 24 be 400135bc 40013530: b0 10 20 0e mov 0xe, %i0 return RTEMS_INCORRECT_STATE; if ( !routine ) 40013534: 80 a6 a0 00 cmp %i2, 0 40013538: 02 80 00 21 be 400135bc 4001353c: b0 10 20 09 mov 9, %i0 return RTEMS_INVALID_ADDRESS; if ( ticks == 0 ) 40013540: 80 a6 60 00 cmp %i1, 0 40013544: 02 80 00 1e be 400135bc 40013548: b0 10 20 0a mov 0xa, %i0 4001354c: 11 10 00 d4 sethi %hi(0x40035000), %o0 40013550: 92 10 00 13 mov %l3, %o1 40013554: 90 12 22 ec or %o0, 0x2ec, %o0 40013558: 40 00 08 eb call 40015904 <_Objects_Get> 4001355c: 94 07 bf f4 add %fp, -12, %o2 return RTEMS_INVALID_NUMBER; the_timer = _Timer_Get( id, &location ); switch ( location ) { 40013560: c2 07 bf f4 ld [ %fp + -12 ], %g1 40013564: 80 a0 60 00 cmp %g1, 0 40013568: 02 80 00 08 be 40013588 4001356c: a0 10 00 08 mov %o0, %l0 40013570: 82 18 60 02 xor %g1, 2, %g1 40013574: 80 a0 00 01 cmp %g0, %g1 40013578: 82 60 20 00 subx %g0, 0, %g1 4001357c: b0 08 60 15 and %g1, 0x15, %i0 40013580: 81 c7 e0 08 ret 40013584: 91 ee 20 04 restore %i0, 4, %o0 case OBJECTS_ERROR: return RTEMS_INVALID_ID; case OBJECTS_LOCAL: (void) _Watchdog_Remove( &the_timer->Ticker ); 40013588: a2 02 20 10 add %o0, 0x10, %l1 4001358c: 40 00 14 24 call 4001861c <_Watchdog_Remove> 40013590: 90 10 00 11 mov %l1, %o0 _ISR_Disable( level ); 40013594: 7f ff dc c7 call 4000a8b0 40013598: 01 00 00 00 nop /* * Check to see if the watchdog has just been inserted by a * higher priority interrupt. If so, abandon this insert. */ if ( the_timer->Ticker.state != WATCHDOG_INACTIVE ) { 4001359c: c2 04 20 18 ld [ %l0 + 0x18 ], %g1 400135a0: 80 a0 60 00 cmp %g1, 0 400135a4: 02 80 00 08 be 400135c4 400135a8: 82 10 20 01 mov 1, %g1 _ISR_Enable( level ); 400135ac: 7f ff dc c5 call 4000a8c0 <== NOT EXECUTED 400135b0: b0 10 20 00 clr %i0 <== NOT EXECUTED _Thread_Enable_dispatch(); 400135b4: 7f ff ff cc call 400134e4 <_Thread_Enable_dispatch> <== NOT EXECUTED 400135b8: 01 00 00 00 nop <== NOT EXECUTED 400135bc: 81 c7 e0 08 ret 400135c0: 81 e8 00 00 restore * so we can atomically initialize it as in use. */ the_timer->the_class = TIMER_INTERVAL_ON_TASK; _Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data ); the_timer->Ticker.initial = ticks; 400135c4: f2 24 20 1c st %i1, [ %l0 + 0x1c ] Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; 400135c8: f4 24 20 2c st %i2, [ %l0 + 0x2c ] the_watchdog->id = id; 400135cc: e6 24 20 30 st %l3, [ %l0 + 0x30 ] the_watchdog->user_data = user_data; 400135d0: f6 24 20 34 st %i3, [ %l0 + 0x34 ] Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 400135d4: c0 24 20 18 clr [ %l0 + 0x18 ] /* * OK. Now we now the timer was not rescheduled by an interrupt * so we can atomically initialize it as in use. */ the_timer->the_class = TIMER_INTERVAL_ON_TASK; 400135d8: c2 24 20 38 st %g1, [ %l0 + 0x38 ] _Watchdog_Initialize( &the_timer->Ticker, routine, id, user_data ); the_timer->Ticker.initial = ticks; _ISR_Enable( level ); 400135dc: 7f ff dc b9 call 4000a8c0 400135e0: 21 10 00 d1 sethi %hi(0x40034400), %l0 _Timer_Server_stop_ticks_timer(); 400135e4: d0 04 a3 38 ld [ %l2 + 0x338 ], %o0 400135e8: 40 00 14 0d call 4001861c <_Watchdog_Remove> 400135ec: 90 02 20 48 add %o0, 0x48, %o0 _Timer_Server_process_ticks_chain(); 400135f0: 40 00 00 87 call 4001380c <_Timer_Server_process_ticks_chain> 400135f4: 01 00 00 00 nop _Watchdog_Insert( &_Timer_Ticks_chain, &the_timer->Ticker ); 400135f8: 90 14 23 ac or %l0, 0x3ac, %o0 400135fc: 40 00 13 b0 call 400184bc <_Watchdog_Insert> 40013600: 92 10 00 11 mov %l1, %o1 */ RTEMS_INLINE_ROUTINE boolean _Chain_Is_empty( Chain_Control *the_chain ) { return (the_chain->first == _Chain_Tail(the_chain)); 40013604: c4 04 23 ac ld [ %l0 + 0x3ac ], %g2 40013608: a0 14 23 ac or %l0, 0x3ac, %l0 */ RTEMS_INLINE_ROUTINE Chain_Node *_Chain_Tail( Chain_Control *the_chain ) { return (Chain_Node *) &the_chain->permanent_null; 4001360c: a0 04 20 04 add %l0, 4, %l0 _Timer_Server_reset_ticks_timer(); 40013610: 80 a0 80 10 cmp %g2, %l0 40013614: 02 80 00 08 be 40013634 40013618: c2 04 a3 38 ld [ %l2 + 0x338 ], %g1 Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 4001361c: c4 00 a0 10 ld [ %g2 + 0x10 ], %g2 _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 40013620: 11 10 00 d2 sethi %hi(0x40034800), %o0 40013624: 92 00 60 48 add %g1, 0x48, %o1 Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 40013628: c4 20 60 54 st %g2, [ %g1 + 0x54 ] _Watchdog_Insert( &_Watchdog_Ticks_chain, the_watchdog ); 4001362c: 40 00 13 a4 call 400184bc <_Watchdog_Insert> 40013630: 90 12 21 ac or %o0, 0x1ac, %o0 _Thread_Enable_dispatch(); 40013634: 7f ff ff ac call 400134e4 <_Thread_Enable_dispatch> 40013638: b0 10 20 00 clr %i0 return RTEMS_SUCCESSFUL; } return RTEMS_INTERNAL_ERROR; /* unreached - only to remove warnings */ } 4001363c: 81 c7 e0 08 ret 40013640: 81 e8 00 00 restore 40006e4c : static int rtems_verror( uint32_t error_flag, const char *printf_format, va_list arglist ) { 40006e4c: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED int local_errno = 0; int chars_written = 0; rtems_status_code status; if (error_flag & RTEMS_ERROR_PANIC) 40006e50: 03 08 00 00 sethi %hi(0x20000000), %g1 <== NOT EXECUTED 40006e54: a8 8e 00 01 andcc %i0, %g1, %l4 <== NOT EXECUTED 40006e58: 02 80 00 10 be 40006e98 <== NOT EXECUTED 40006e5c: a6 10 00 18 mov %i0, %l3 <== NOT EXECUTED { if (rtems_panic_in_progress++) 40006e60: 07 10 00 a6 sethi %hi(0x40029800), %g3 <== NOT EXECUTED 40006e64: c2 00 e2 94 ld [ %g3 + 0x294 ], %g1 ! 40029a94 <== NOT EXECUTED 40006e68: 82 00 60 01 inc %g1 <== NOT EXECUTED 40006e6c: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 40006e70: 02 80 00 06 be 40006e88 <== NOT EXECUTED 40006e74: c2 20 e2 94 st %g1, [ %g3 + 0x294 ] <== NOT EXECUTED rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40006e78: 05 10 00 a7 sethi %hi(0x40029c00), %g2 <== NOT EXECUTED 40006e7c: c2 00 a0 60 ld [ %g2 + 0x60 ], %g1 ! 40029c60 <_Thread_Dispatch_disable_level> <== NOT EXECUTED 40006e80: 82 00 60 01 inc %g1 <== NOT EXECUTED 40006e84: c2 20 a0 60 st %g1, [ %g2 + 0x60 ] <== NOT EXECUTED _Thread_Disable_dispatch(); /* disable task switches */ /* don't aggravate things */ if (rtems_panic_in_progress > 2) 40006e88: c2 00 e2 94 ld [ %g3 + 0x294 ], %g1 <== NOT EXECUTED 40006e8c: 80 a0 60 02 cmp %g1, 2 <== NOT EXECUTED 40006e90: 34 80 00 59 bg,a 40006ff4 <== NOT EXECUTED 40006e94: b0 10 20 00 clr %i0 <== NOT EXECUTED return 0; } (void) fflush(stdout); /* in case stdout/stderr same */ 40006e98: 03 10 00 a2 sethi %hi(0x40028800), %g1 <== NOT EXECUTED 40006e9c: c2 00 62 f8 ld [ %g1 + 0x2f8 ], %g1 ! 40028af8 <_impure_ptr> <== NOT EXECUTED status = error_flag & ~RTEMS_ERROR_MASK; if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */ 40006ea0: a4 10 20 00 clr %l2 <== NOT EXECUTED /* don't aggravate things */ if (rtems_panic_in_progress > 2) return 0; } (void) fflush(stdout); /* in case stdout/stderr same */ 40006ea4: 40 00 42 6e call 4001785c <== NOT EXECUTED 40006ea8: d0 00 60 08 ld [ %g1 + 8 ], %o0 <== NOT EXECUTED status = error_flag & ~RTEMS_ERROR_MASK; 40006eac: 03 1c 00 00 sethi %hi(0x70000000), %g1 <== NOT EXECUTED 40006eb0: a0 2c c0 01 andn %l3, %g1, %l0 <== NOT EXECUTED if (error_flag & RTEMS_ERROR_ERRNO) /* include errno? */ 40006eb4: 03 10 00 00 sethi %hi(0x40000000), %g1 <== NOT EXECUTED 40006eb8: 80 8c c0 01 btst %l3, %g1 <== NOT EXECUTED 40006ebc: 02 80 00 05 be 40006ed0 <== NOT EXECUTED 40006ec0: 23 10 00 a2 sethi %hi(0x40028800), %l1 <== NOT EXECUTED local_errno = errno; 40006ec4: 40 00 42 09 call 400176e8 <__errno> <== NOT EXECUTED 40006ec8: 01 00 00 00 nop <== NOT EXECUTED 40006ecc: e4 02 00 00 ld [ %o0 ], %l2 <== NOT EXECUTED #if defined(RTEMS_MULTIPROCESSING) if (_System_state_Is_multiprocessing) fprintf(stderr, "[%" PRIu32 "] ", _Configuration_MP_table->node); #endif chars_written += vfprintf(stderr, printf_format, arglist); 40006ed0: c2 04 62 f8 ld [ %l1 + 0x2f8 ], %g1 <== NOT EXECUTED 40006ed4: 92 10 00 19 mov %i1, %o1 <== NOT EXECUTED 40006ed8: d0 00 60 0c ld [ %g1 + 0xc ], %o0 <== NOT EXECUTED 40006edc: 40 00 5a f0 call 4001da9c <== NOT EXECUTED 40006ee0: 94 10 00 1a mov %i2, %o2 <== NOT EXECUTED if (status) 40006ee4: 80 a4 20 00 cmp %l0, 0 <== NOT EXECUTED 40006ee8: 02 80 00 0c be 40006f18 <== NOT EXECUTED 40006eec: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED chars_written += fprintf(stderr, " (status: %s)", rtems_status_text(status)); 40006ef0: c2 04 62 f8 ld [ %l1 + 0x2f8 ], %g1 <== NOT EXECUTED 40006ef4: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 40006ef8: 7f ff ff ce call 40006e30 <== NOT EXECUTED 40006efc: e0 00 60 0c ld [ %g1 + 0xc ], %l0 <== NOT EXECUTED 40006f00: 13 10 00 92 sethi %hi(0x40024800), %o1 <== NOT EXECUTED 40006f04: 94 10 00 08 mov %o0, %o2 <== NOT EXECUTED 40006f08: 92 12 63 c0 or %o1, 0x3c0, %o1 <== NOT EXECUTED 40006f0c: 40 00 44 15 call 40017f60 <== NOT EXECUTED 40006f10: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 40006f14: b0 06 00 08 add %i0, %o0, %i0 <== NOT EXECUTED if (local_errno) 40006f18: 80 a4 a0 00 cmp %l2, 0 <== NOT EXECUTED 40006f1c: 22 80 00 1c be,a 40006f8c <== NOT EXECUTED 40006f20: 23 10 00 a2 sethi %hi(0x40028800), %l1 <== NOT EXECUTED { if ((local_errno > 0) && *strerror(local_errno)) 40006f24: 80 a4 a0 00 cmp %l2, 0 <== NOT EXECUTED 40006f28: 04 80 00 11 ble 40006f6c <== NOT EXECUTED 40006f2c: 03 10 00 a2 sethi %hi(0x40028800), %g1 <== NOT EXECUTED 40006f30: 40 00 4f f0 call 4001aef0 <== NOT EXECUTED 40006f34: 90 10 00 12 mov %l2, %o0 <== NOT EXECUTED 40006f38: c2 4a 00 00 ldsb [ %o0 ], %g1 <== NOT EXECUTED 40006f3c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40006f40: 02 80 00 0b be 40006f6c <== NOT EXECUTED 40006f44: 03 10 00 a2 sethi %hi(0x40028800), %g1 <== NOT EXECUTED chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno)); 40006f48: c2 04 62 f8 ld [ %l1 + 0x2f8 ], %g1 <== NOT EXECUTED 40006f4c: 90 10 00 12 mov %l2, %o0 <== NOT EXECUTED 40006f50: 40 00 4f e8 call 4001aef0 <== NOT EXECUTED 40006f54: e0 00 60 0c ld [ %g1 + 0xc ], %l0 <== NOT EXECUTED 40006f58: 13 10 00 92 sethi %hi(0x40024800), %o1 <== NOT EXECUTED 40006f5c: 94 10 00 08 mov %o0, %o2 <== NOT EXECUTED 40006f60: 92 12 63 d0 or %o1, 0x3d0, %o1 <== NOT EXECUTED 40006f64: 10 80 00 07 b 40006f80 <== NOT EXECUTED 40006f68: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED else chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno); 40006f6c: c2 00 62 f8 ld [ %g1 + 0x2f8 ], %g1 <== NOT EXECUTED 40006f70: 13 10 00 92 sethi %hi(0x40024800), %o1 <== NOT EXECUTED 40006f74: d0 00 60 0c ld [ %g1 + 0xc ], %o0 <== NOT EXECUTED 40006f78: 92 12 63 e0 or %o1, 0x3e0, %o1 <== NOT EXECUTED 40006f7c: 94 10 00 12 mov %l2, %o2 <== NOT EXECUTED 40006f80: 40 00 43 f8 call 40017f60 <== NOT EXECUTED 40006f84: 23 10 00 a2 sethi %hi(0x40028800), %l1 <== NOT EXECUTED 40006f88: b0 06 00 08 add %i0, %o0, %i0 <== NOT EXECUTED } chars_written += fprintf(stderr, "\n"); 40006f8c: c2 04 62 f8 ld [ %l1 + 0x2f8 ], %g1 <== NOT EXECUTED 40006f90: 13 10 00 94 sethi %hi(0x40025000), %o1 <== NOT EXECUTED 40006f94: d0 00 60 0c ld [ %g1 + 0xc ], %o0 <== NOT EXECUTED 40006f98: 40 00 43 f2 call 40017f60 <== NOT EXECUTED 40006f9c: 92 12 62 68 or %o1, 0x268, %o1 <== NOT EXECUTED (void) fflush(stderr); 40006fa0: c2 04 62 f8 ld [ %l1 + 0x2f8 ], %g1 <== NOT EXECUTED chars_written += fprintf(stderr, " (errno: %s)", strerror(local_errno)); else chars_written += fprintf(stderr, " (unknown errno=%d)", local_errno); } chars_written += fprintf(stderr, "\n"); 40006fa4: a0 10 00 08 mov %o0, %l0 <== NOT EXECUTED (void) fflush(stderr); 40006fa8: d0 00 60 0c ld [ %g1 + 0xc ], %o0 <== NOT EXECUTED 40006fac: 40 00 42 2c call 4001785c <== NOT EXECUTED 40006fb0: b0 04 00 18 add %l0, %i0, %i0 <== NOT EXECUTED if (error_flag & (RTEMS_ERROR_PANIC | RTEMS_ERROR_ABORT)) 40006fb4: 03 0c 00 00 sethi %hi(0x30000000), %g1 <== NOT EXECUTED 40006fb8: 80 8c c0 01 btst %l3, %g1 <== NOT EXECUTED 40006fbc: 02 80 00 0e be 40006ff4 <== NOT EXECUTED 40006fc0: 80 a5 20 00 cmp %l4, 0 <== NOT EXECUTED { if (error_flag & RTEMS_ERROR_PANIC) 40006fc4: 02 80 00 07 be 40006fe0 <== NOT EXECUTED 40006fc8: 90 10 20 00 clr %o0 <== NOT EXECUTED { rtems_error(0, "fatal error, exiting"); 40006fcc: 13 10 00 92 sethi %hi(0x40024800), %o1 <== NOT EXECUTED 40006fd0: 40 00 00 18 call 40007030 <== NOT EXECUTED 40006fd4: 92 12 63 f8 or %o1, 0x3f8, %o1 ! 40024bf8 <== NOT EXECUTED _exit(local_errno); 40006fd8: 40 00 02 43 call 400078e4 <_exit> <== NOT EXECUTED 40006fdc: 90 10 00 12 mov %l2, %o0 <== NOT EXECUTED } else { rtems_error(0, "fatal error, aborting"); 40006fe0: 13 10 00 93 sethi %hi(0x40024c00), %o1 <== NOT EXECUTED 40006fe4: 40 00 00 13 call 40007030 <== NOT EXECUTED 40006fe8: 92 12 60 10 or %o1, 0x10, %o1 ! 40024c10 <== NOT EXECUTED abort(); 40006fec: 40 00 41 b1 call 400176b0 <== NOT EXECUTED 40006ff0: 01 00 00 00 nop <== NOT EXECUTED } } return chars_written; } 40006ff4: 81 c7 e0 08 ret <== NOT EXECUTED 40006ff8: 81 e8 00 00 restore <== NOT EXECUTED 400177c8 : /* * Extract an integer value from the database */ static int scanInt(FILE *fp, int *val) { 400177c8: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED 400177cc: 03 1f ff ff sethi %hi(0x7ffffc00), %g1 <== NOT EXECUTED 400177d0: a2 10 20 00 clr %l1 <== NOT EXECUTED 400177d4: a6 10 63 ff or %g1, 0x3ff, %l3 <== NOT EXECUTED 400177d8: a4 10 20 00 clr %l2 <== NOT EXECUTED unsigned int limit = INT_MAX; int sign = 0; int d; for (;;) { c = getc(fp); 400177dc: 2b 10 00 ea sethi %hi(0x4003a800), %l5 <== NOT EXECUTED limit++; continue; } sign = 1; } if (!isdigit(c)) 400177e0: 29 10 00 ea sethi %hi(0x4003a800), %l4 <== NOT EXECUTED unsigned int limit = INT_MAX; int sign = 0; int d; for (;;) { c = getc(fp); 400177e4: c2 06 20 04 ld [ %i0 + 4 ], %g1 <== NOT EXECUTED 400177e8: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 400177ec: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400177f0: 16 80 00 07 bge 4001780c <== NOT EXECUTED 400177f4: c2 26 20 04 st %g1, [ %i0 + 4 ] <== NOT EXECUTED 400177f8: d0 05 63 70 ld [ %l5 + 0x370 ], %o0 <== NOT EXECUTED 400177fc: 40 00 3d b0 call 40026ebc <__srget_r> <== NOT EXECUTED 40017800: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED 40017804: 10 80 00 06 b 4001781c <== NOT EXECUTED 40017808: a0 10 00 08 mov %o0, %l0 <== NOT EXECUTED 4001780c: c2 06 00 00 ld [ %i0 ], %g1 <== NOT EXECUTED 40017810: 84 00 60 01 add %g1, 1, %g2 <== NOT EXECUTED 40017814: e0 08 40 00 ldub [ %g1 ], %l0 <== NOT EXECUTED 40017818: c4 26 00 00 st %g2, [ %i0 ] <== NOT EXECUTED if (c == ':') 4001781c: 80 a4 20 3a cmp %l0, 0x3a <== NOT EXECUTED 40017820: 02 80 00 20 be 400178a0 <== NOT EXECUTED 40017824: 80 a4 a0 00 cmp %l2, 0 <== NOT EXECUTED break; if (sign == 0) { 40017828: 12 80 00 08 bne 40017848 <== NOT EXECUTED 4001782c: c2 05 23 68 ld [ %l4 + 0x368 ], %g1 <== NOT EXECUTED if (c == '-') { 40017830: 80 a4 20 2d cmp %l0, 0x2d <== NOT EXECUTED 40017834: 12 80 00 05 bne 40017848 <== NOT EXECUTED 40017838: a4 10 20 01 mov 1, %l2 <== NOT EXECUTED sign = -1; limit++; 4001783c: a6 04 e0 01 inc %l3 <== NOT EXECUTED 40017840: 10 bf ff e9 b 400177e4 <== NOT EXECUTED 40017844: a4 10 3f ff mov -1, %l2 <== NOT EXECUTED continue; } sign = 1; } if (!isdigit(c)) 40017848: c2 08 40 10 ldub [ %g1 + %l0 ], %g1 <== NOT EXECUTED 4001784c: 80 88 60 04 btst 4, %g1 <== NOT EXECUTED 40017850: 02 80 00 1c be 400178c0 <== NOT EXECUTED 40017854: 90 10 00 13 mov %l3, %o0 <== NOT EXECUTED return 0; d = c - '0'; if ((i > (limit / 10)) 40017858: 40 00 6d 2a call 40032d00 <.udiv> <== NOT EXECUTED 4001785c: 92 10 20 0a mov 0xa, %o1 <== NOT EXECUTED 40017860: 80 a4 40 08 cmp %l1, %o0 <== NOT EXECUTED 40017864: 18 80 00 17 bgu 400178c0 <== NOT EXECUTED 40017868: 01 00 00 00 nop <== NOT EXECUTED 4001786c: 12 80 00 08 bne 4001788c <== NOT EXECUTED 40017870: a0 04 3f d0 add %l0, -48, %l0 <== NOT EXECUTED 40017874: 90 10 00 13 mov %l3, %o0 <== NOT EXECUTED 40017878: 40 00 6d ce call 40032fb0 <.urem> <== NOT EXECUTED 4001787c: 92 10 20 0a mov 0xa, %o1 <== NOT EXECUTED 40017880: 80 a4 00 08 cmp %l0, %o0 <== NOT EXECUTED 40017884: 18 80 00 0f bgu 400178c0 <== NOT EXECUTED 40017888: 01 00 00 00 nop <== NOT EXECUTED || ((i == (limit / 10)) && (d > (limit % 10)))) return 0; i = i * 10 + d; 4001788c: 85 2c 60 03 sll %l1, 3, %g2 <== NOT EXECUTED 40017890: 83 2c 60 01 sll %l1, 1, %g1 <== NOT EXECUTED 40017894: 82 00 40 02 add %g1, %g2, %g1 <== NOT EXECUTED 40017898: 10 bf ff d3 b 400177e4 <== NOT EXECUTED 4001789c: a2 04 00 01 add %l0, %g1, %l1 <== NOT EXECUTED } if (sign == 0) 400178a0: 02 80 00 08 be 400178c0 <== NOT EXECUTED 400178a4: 90 10 00 12 mov %l2, %o0 <== NOT EXECUTED return 0; *val = i * sign; 400178a8: 92 10 00 11 mov %l1, %o1 <== NOT EXECUTED 400178ac: 7f ff ad d3 call 40002ff8 <.umul> <== NOT EXECUTED 400178b0: b0 10 20 01 mov 1, %i0 <== NOT EXECUTED 400178b4: d0 26 40 00 st %o0, [ %i1 ] <== NOT EXECUTED 400178b8: 81 c7 e0 08 ret <== NOT EXECUTED 400178bc: 81 e8 00 00 restore <== NOT EXECUTED return 1; } 400178c0: 81 c7 e0 08 ret <== NOT EXECUTED 400178c4: 91 e8 20 00 restore %g0, 0, %o0 <== NOT EXECUTED 400178c8 : /* * Extract a string value from the database */ static int scanString(FILE *fp, char **name, char **bufp, size_t *nleft, int nlFlag) { 400178c8: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED int c; *name = *bufp; 400178cc: c2 06 80 00 ld [ %i2 ], %g1 <== NOT EXECUTED 400178d0: c2 26 40 00 st %g1, [ %i1 ] <== NOT EXECUTED for (;;) { c = getc(fp); 400178d4: 33 10 00 ea sethi %hi(0x4003a800), %i1 <== NOT EXECUTED 400178d8: c2 06 20 04 ld [ %i0 + 4 ], %g1 <== NOT EXECUTED 400178dc: 82 00 7f ff add %g1, -1, %g1 <== NOT EXECUTED 400178e0: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400178e4: 16 80 00 07 bge 40017900 <== NOT EXECUTED 400178e8: c2 26 20 04 st %g1, [ %i0 + 4 ] <== NOT EXECUTED 400178ec: d0 06 63 70 ld [ %i1 + 0x370 ], %o0 <== NOT EXECUTED 400178f0: 40 00 3d 73 call 40026ebc <__srget_r> <== NOT EXECUTED 400178f4: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED if (c == ':') { 400178f8: 10 80 00 07 b 40017914 <== NOT EXECUTED 400178fc: 80 a2 20 3a cmp %o0, 0x3a <== NOT EXECUTED { int c; *name = *bufp; for (;;) { c = getc(fp); 40017900: c2 06 00 00 ld [ %i0 ], %g1 <== NOT EXECUTED 40017904: 84 00 60 01 add %g1, 1, %g2 <== NOT EXECUTED 40017908: d0 08 40 00 ldub [ %g1 ], %o0 <== NOT EXECUTED 4001790c: c4 26 00 00 st %g2, [ %i0 ] <== NOT EXECUTED if (c == ':') { 40017910: 80 a2 20 3a cmp %o0, 0x3a <== NOT EXECUTED 40017914: 12 80 00 07 bne 40017930 <== NOT EXECUTED 40017918: 80 a2 20 0a cmp %o0, 0xa <== NOT EXECUTED if (nlFlag) 4001791c: 80 a7 20 00 cmp %i4, 0 <== NOT EXECUTED 40017920: 22 80 00 1a be,a 40017988 <== NOT EXECUTED 40017924: c2 06 80 00 ld [ %i2 ], %g1 <== NOT EXECUTED --(*nleft); } **bufp = '\0'; ++(*bufp); --(*nleft); return 1; 40017928: 81 c7 e0 08 ret <== NOT EXECUTED 4001792c: 91 e8 20 00 restore %g0, 0, %o0 <== NOT EXECUTED if (c == ':') { if (nlFlag) return 0; break; } if (c == '\n') { 40017930: 12 80 00 07 bne 4001794c <== NOT EXECUTED 40017934: 80 a2 3f ff cmp %o0, -1 <== NOT EXECUTED if (!nlFlag) 40017938: 80 a7 20 00 cmp %i4, 0 <== NOT EXECUTED 4001793c: 32 80 00 13 bne,a 40017988 <== NOT EXECUTED 40017940: c2 06 80 00 ld [ %i2 ], %g1 <== NOT EXECUTED --(*nleft); } **bufp = '\0'; ++(*bufp); --(*nleft); return 1; 40017944: 81 c7 e0 08 ret <== NOT EXECUTED 40017948: 91 e8 20 00 restore %g0, 0, %o0 <== NOT EXECUTED if (c == '\n') { if (!nlFlag) return 0; break; } if (c == EOF) 4001794c: 22 80 00 17 be,a 400179a8 <== NOT EXECUTED 40017950: b0 10 20 00 clr %i0 <== NOT EXECUTED return 0; if (*nleft < 2) 40017954: c2 06 c0 00 ld [ %i3 ], %g1 <== NOT EXECUTED 40017958: 80 a0 60 01 cmp %g1, 1 <== NOT EXECUTED 4001795c: 28 80 00 13 bleu,a 400179a8 <== NOT EXECUTED 40017960: b0 10 20 00 clr %i0 <== NOT EXECUTED return 0; **bufp = c; 40017964: c2 06 80 00 ld [ %i2 ], %g1 <== NOT EXECUTED 40017968: d0 28 40 00 stb %o0, [ %g1 ] <== NOT EXECUTED ++(*bufp); 4001796c: c2 06 80 00 ld [ %i2 ], %g1 <== NOT EXECUTED --(*nleft); 40017970: c4 06 c0 00 ld [ %i3 ], %g2 <== NOT EXECUTED if (c == EOF) return 0; if (*nleft < 2) return 0; **bufp = c; ++(*bufp); 40017974: 82 00 60 01 inc %g1 <== NOT EXECUTED --(*nleft); 40017978: 84 00 bf ff add %g2, -1, %g2 <== NOT EXECUTED if (c == EOF) return 0; if (*nleft < 2) return 0; **bufp = c; ++(*bufp); 4001797c: c2 26 80 00 st %g1, [ %i2 ] <== NOT EXECUTED --(*nleft); 40017980: 10 bf ff d6 b 400178d8 <== NOT EXECUTED 40017984: c4 26 c0 00 st %g2, [ %i3 ] <== NOT EXECUTED } **bufp = '\0'; 40017988: c0 28 40 00 clrb [ %g1 ] <== NOT EXECUTED ++(*bufp); 4001798c: c2 06 80 00 ld [ %i2 ], %g1 <== NOT EXECUTED --(*nleft); 40017990: c4 06 c0 00 ld [ %i3 ], %g2 <== NOT EXECUTED **bufp = c; ++(*bufp); --(*nleft); } **bufp = '\0'; ++(*bufp); 40017994: 82 00 60 01 inc %g1 <== NOT EXECUTED --(*nleft); 40017998: 84 00 bf ff add %g2, -1, %g2 <== NOT EXECUTED **bufp = c; ++(*bufp); --(*nleft); } **bufp = '\0'; ++(*bufp); 4001799c: c2 26 80 00 st %g1, [ %i2 ] <== NOT EXECUTED --(*nleft); 400179a0: c4 26 c0 00 st %g2, [ %i3 ] <== NOT EXECUTED 400179a4: b0 10 20 01 mov 1, %i0 <== NOT EXECUTED return 1; } 400179a8: 81 c7 e0 08 ret <== NOT EXECUTED 400179ac: 81 e8 00 00 restore <== NOT EXECUTED 400061ec : scandir(dirname, namelist, select, dcomp) const char *dirname; struct dirent ***namelist; int (*select)(struct dirent *); int (*dcomp)(const struct dirent **, const struct dirent **); { 400061ec: 9d e3 bf 48 save %sp, -184, %sp struct stat stb; long arraysz; DIR *dirp = NULL; int i; if ((dirp = opendir(dirname)) == NULL) 400061f0: 7f ff fd c4 call 40005900 400061f4: 90 10 00 18 mov %i0, %o0 400061f8: a8 92 20 00 orcc %o0, 0, %l4 400061fc: 02 80 00 69 be 400063a0 40006200: 92 10 3f ff mov -1, %o1 return(-1); if (fstat(dirp->dd_fd, &stb) < 0) 40006204: d0 05 00 00 ld [ %l4 ], %o0 40006208: a0 07 bf a8 add %fp, -88, %l0 4000620c: 40 00 22 55 call 4000eb60 40006210: 92 10 00 10 mov %l0, %o1 40006214: 80 a2 20 00 cmp %o0, 0 40006218: 06 80 00 50 bl 40006358 4000621c: d0 07 bf c8 ld [ %fp + -56 ], %o0 /* * estimate the array size by taking the size of the directory file * and dividing it by a multiple of the minimum size entry. */ arraysz = (stb.st_size / 24); 40006220: 40 00 40 d3 call 4001656c <.div> 40006224: 92 10 20 18 mov 0x18, %o1 names = (struct dirent **)malloc(arraysz * sizeof(struct dirent *)); if (names == NULL) 40006228: b0 10 20 00 clr %i0 /* * estimate the array size by taking the size of the directory file * and dividing it by a multiple of the minimum size entry. */ arraysz = (stb.st_size / 24); 4000622c: a6 10 00 08 mov %o0, %l3 names = (struct dirent **)malloc(arraysz * sizeof(struct dirent *)); 40006230: 7f ff fb 19 call 40004e94 40006234: 91 2a 20 02 sll %o0, 2, %o0 if (names == NULL) 40006238: a2 92 20 00 orcc %o0, 0, %l1 4000623c: 02 80 00 49 be 40006360 40006240: aa 10 00 10 mov %l0, %l5 40006244: 30 80 00 31 b,a 40006308 goto cleanup_and_bail; while ((d = readdir(dirp)) != NULL) { if (select != NULL && !(*select)(d)) 40006248: 22 80 00 08 be,a 40006268 4000624c: d0 14 20 0a lduh [ %l0 + 0xa ], %o0 <== NOT EXECUTED 40006250: 9f c6 80 00 call %i2 40006254: 01 00 00 00 nop 40006258: 80 a2 20 00 cmp %o0, 0 4000625c: 02 80 00 2b be 40006308 40006260: 01 00 00 00 nop continue; /* just selected names */ /* * Make a minimum size copy of the data */ p = (struct dirent *)malloc(DIRSIZ(d)); 40006264: d0 14 20 0a lduh [ %l0 + 0xa ], %o0 40006268: 90 02 20 04 add %o0, 4, %o0 4000626c: 90 0a 3f fc and %o0, -4, %o0 40006270: 7f ff fb 09 call 40004e94 40006274: 90 02 20 0c add %o0, 0xc, %o0 if (p == NULL) goto cleanup_and_bail; p->d_ino = d->d_ino; p->d_reclen = d->d_reclen; p->d_namlen = d->d_namlen; strncpy(p->d_name, d->d_name, p->d_namlen + 1); 40006278: 92 04 20 0c add %l0, 0xc, %o1 if (select != NULL && !(*select)(d)) continue; /* just selected names */ /* * Make a minimum size copy of the data */ p = (struct dirent *)malloc(DIRSIZ(d)); 4000627c: a4 10 00 08 mov %o0, %l2 if (p == NULL) 40006280: 80 a4 a0 00 cmp %l2, 0 40006284: 02 80 00 37 be 40006360 40006288: 90 02 20 0c add %o0, 0xc, %o0 goto cleanup_and_bail; p->d_ino = d->d_ino; p->d_reclen = d->d_reclen; p->d_namlen = d->d_namlen; 4000628c: c6 14 20 0a lduh [ %l0 + 0xa ], %g3 * Make a minimum size copy of the data */ p = (struct dirent *)malloc(DIRSIZ(d)); if (p == NULL) goto cleanup_and_bail; p->d_ino = d->d_ino; 40006290: c2 04 00 00 ld [ %l0 ], %g1 p->d_reclen = d->d_reclen; 40006294: c4 14 20 08 lduh [ %l0 + 8 ], %g2 p->d_namlen = d->d_namlen; strncpy(p->d_name, d->d_name, p->d_namlen + 1); 40006298: 95 28 e0 10 sll %g3, 0x10, %o2 * Make a minimum size copy of the data */ p = (struct dirent *)malloc(DIRSIZ(d)); if (p == NULL) goto cleanup_and_bail; p->d_ino = d->d_ino; 4000629c: c2 24 80 00 st %g1, [ %l2 ] p->d_reclen = d->d_reclen; 400062a0: c4 34 a0 08 sth %g2, [ %l2 + 8 ] p->d_namlen = d->d_namlen; 400062a4: c6 34 a0 0a sth %g3, [ %l2 + 0xa ] strncpy(p->d_name, d->d_name, p->d_namlen + 1); 400062a8: 95 32 a0 10 srl %o2, 0x10, %o2 400062ac: 40 00 36 d7 call 40013e08 400062b0: 94 02 a0 01 inc %o2 /* * Check to make sure the array has space left and * realloc the maximum size. */ if (++nitems >= arraysz) { 400062b4: b0 06 20 01 inc %i0 400062b8: 80 a6 00 13 cmp %i0, %l3 400062bc: 0a 80 00 11 bcs 40006300 400062c0: 83 2e 20 02 sll %i0, 2, %g1 if (fstat(dirp->dd_fd, &stb) < 0) 400062c4: d0 05 00 00 ld [ %l4 ], %o0 <== NOT EXECUTED 400062c8: 40 00 22 26 call 4000eb60 <== NOT EXECUTED 400062cc: 92 10 00 15 mov %l5, %o1 <== NOT EXECUTED 400062d0: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400062d4: 06 80 00 23 bl 40006360 <== NOT EXECUTED 400062d8: 92 10 20 0c mov 0xc, %o1 <== NOT EXECUTED goto cleanup_and_bail; /* just might have grown */ arraysz = stb.st_size / 12; 400062dc: 40 00 40 a4 call 4001656c <.div> <== NOT EXECUTED 400062e0: d0 07 bf c8 ld [ %fp + -56 ], %o0 <== NOT EXECUTED 400062e4: a6 10 00 08 mov %o0, %l3 <== NOT EXECUTED names = (struct dirent **)realloc((char *)names, 400062e8: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 400062ec: 7f ff fb 35 call 40004fc0 <== NOT EXECUTED 400062f0: 93 2c e0 02 sll %l3, 2, %o1 <== NOT EXECUTED arraysz * sizeof(struct dirent *)); if (names == NULL) 400062f4: a2 92 20 00 orcc %o0, 0, %l1 <== NOT EXECUTED 400062f8: 02 80 00 1a be 40006360 <== NOT EXECUTED 400062fc: 83 2e 20 02 sll %i0, 2, %g1 <== NOT EXECUTED goto cleanup_and_bail; } names[nitems-1] = p; 40006300: 82 00 40 11 add %g1, %l1, %g1 40006304: e4 20 7f fc st %l2, [ %g1 + -4 ] arraysz = (stb.st_size / 24); names = (struct dirent **)malloc(arraysz * sizeof(struct dirent *)); if (names == NULL) goto cleanup_and_bail; while ((d = readdir(dirp)) != NULL) { 40006308: 7f ff ff 21 call 40005f8c 4000630c: 90 10 00 14 mov %l4, %o0 40006310: a0 92 20 00 orcc %o0, 0, %l0 40006314: 12 bf ff cd bne 40006248 40006318: 80 a6 a0 00 cmp %i2, 0 if (names == NULL) goto cleanup_and_bail; } names[nitems-1] = p; } closedir(dirp); 4000631c: 7f ff f8 14 call 4000436c 40006320: 90 10 00 14 mov %l4, %o0 if (nitems && dcomp != NULL){ 40006324: 80 a6 20 00 cmp %i0, 0 40006328: 22 80 00 0a be,a 40006350 4000632c: e2 26 40 00 st %l1, [ %i1 ] <== NOT EXECUTED 40006330: 80 a6 e0 00 cmp %i3, 0 40006334: 02 80 00 06 be 4000634c 40006338: 96 10 00 1b mov %i3, %o3 qsort(names, nitems, sizeof(struct dirent *), dcomp); 4000633c: 90 10 00 11 mov %l1, %o0 40006340: 92 10 00 18 mov %i0, %o1 40006344: 40 00 33 82 call 4001314c 40006348: 94 10 20 04 mov 4, %o2 } *namelist = names; 4000634c: e2 26 40 00 st %l1, [ %i1 ] return(nitems); 40006350: 10 80 00 14 b 400063a0 40006354: 92 10 00 18 mov %i0, %o1 40006358: a2 10 20 00 clr %l1 <== NOT EXECUTED 4000635c: b0 10 20 00 clr %i0 <== NOT EXECUTED cleanup_and_bail: if ( dirp ) closedir( dirp ); 40006360: 7f ff f8 03 call 4000436c 40006364: 90 10 00 14 mov %l4, %o0 if ( names ) { 40006368: 80 a4 60 00 cmp %l1, 0 4000636c: 12 80 00 07 bne 40006388 40006370: a0 10 20 00 clr %l0 for (i=0; i < nitems; i++ ) free( names[i] ); free( names ); 40006374: 10 80 00 0b b 400063a0 40006378: 92 10 3f ff mov -1, %o1 if ( dirp ) closedir( dirp ); if ( names ) { for (i=0; i < nitems; i++ ) free( names[i] ); 4000637c: d0 00 40 11 ld [ %g1 + %l1 ], %o0 <== NOT EXECUTED 40006380: 7f ff fa 9d call 40004df4 <== NOT EXECUTED 40006384: a0 04 20 01 inc %l0 <== NOT EXECUTED if ( dirp ) closedir( dirp ); if ( names ) { for (i=0; i < nitems; i++ ) 40006388: 80 a4 00 18 cmp %l0, %i0 <== NOT EXECUTED 4000638c: 12 bf ff fc bne 4000637c <== NOT EXECUTED 40006390: 83 2c 20 02 sll %l0, 2, %g1 <== NOT EXECUTED free( names[i] ); free( names ); 40006394: 7f ff fa 98 call 40004df4 <== NOT EXECUTED 40006398: 90 10 00 11 mov %l1, %o0 <== NOT EXECUTED 4000639c: 92 10 3f ff mov -1, %o1 <== NOT EXECUTED } return(-1); } 400063a0: 81 c7 e0 08 ret 400063a4: 91 e8 00 09 restore %g0, %o1, %o0 400179b0 : FILE *fp, struct group *grp, char *buffer, size_t bufsize ) { 400179b0: 9d e3 bf 90 save %sp, -112, %sp <== NOT EXECUTED int grgid; char *grmem, *cp; int memcount; if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0) 400179b4: 98 10 20 00 clr %o4 <== NOT EXECUTED FILE *fp, struct group *grp, char *buffer, size_t bufsize ) { 400179b8: f4 27 a0 4c st %i2, [ %fp + 0x4c ] <== NOT EXECUTED 400179bc: f6 27 a0 50 st %i3, [ %fp + 0x50 ] <== NOT EXECUTED int grgid; char *grmem, *cp; int memcount; if (!scanString(fp, &grp->gr_name, &buffer, &bufsize, 0) 400179c0: b4 07 a0 50 add %fp, 0x50, %i2 <== NOT EXECUTED 400179c4: b6 07 a0 4c add %fp, 0x4c, %i3 <== NOT EXECUTED 400179c8: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 400179cc: 92 10 00 19 mov %i1, %o1 <== NOT EXECUTED 400179d0: 94 10 00 1b mov %i3, %o2 <== NOT EXECUTED 400179d4: 7f ff ff bd call 400178c8 <== NOT EXECUTED 400179d8: 96 10 00 1a mov %i2, %o3 <== NOT EXECUTED 400179dc: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400179e0: 02 80 00 42 be 40017ae8 <== NOT EXECUTED 400179e4: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 400179e8: 92 06 60 04 add %i1, 4, %o1 <== NOT EXECUTED 400179ec: 94 10 00 1b mov %i3, %o2 <== NOT EXECUTED 400179f0: 96 10 00 1a mov %i2, %o3 <== NOT EXECUTED 400179f4: 7f ff ff b5 call 400178c8 <== NOT EXECUTED 400179f8: 98 10 20 00 clr %o4 <== NOT EXECUTED 400179fc: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017a00: 02 80 00 3a be 40017ae8 <== NOT EXECUTED 40017a04: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40017a08: 7f ff ff 70 call 400177c8 <== NOT EXECUTED 40017a0c: 92 07 bf f4 add %fp, -12, %o1 <== NOT EXECUTED 40017a10: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017a14: 02 80 00 35 be 40017ae8 <== NOT EXECUTED 40017a18: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40017a1c: 94 10 00 1b mov %i3, %o2 <== NOT EXECUTED 40017a20: 96 10 00 1a mov %i2, %o3 <== NOT EXECUTED 40017a24: 92 07 bf f0 add %fp, -16, %o1 <== NOT EXECUTED 40017a28: 7f ff ff a8 call 400178c8 <== NOT EXECUTED 40017a2c: 98 10 20 01 mov 1, %o4 <== NOT EXECUTED 40017a30: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017a34: 02 80 00 2d be 40017ae8 <== NOT EXECUTED 40017a38: c2 07 bf f4 ld [ %fp + -12 ], %g1 <== NOT EXECUTED grp->gr_gid = grgid; /* * Determine number of members */ for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 40017a3c: c4 07 bf f0 ld [ %fp + -16 ], %g2 <== NOT EXECUTED 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; 40017a40: c2 36 60 08 sth %g1, [ %i1 + 8 ] <== NOT EXECUTED /* * Determine number of members */ for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 40017a44: 10 80 00 05 b 40017a58 <== NOT EXECUTED 40017a48: 86 10 20 01 mov 1, %g3 <== NOT EXECUTED if(*cp == ',') memcount++; 40017a4c: 82 18 60 2c xor %g1, 0x2c, %g1 <== NOT EXECUTED 40017a50: 80 a0 00 01 cmp %g0, %g1 <== NOT EXECUTED 40017a54: 86 60 ff ff subx %g3, -1, %g3 <== NOT EXECUTED grp->gr_gid = grgid; /* * Determine number of members */ for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 40017a58: c2 48 80 00 ldsb [ %g2 ], %g1 <== NOT EXECUTED 40017a5c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40017a60: 12 bf ff fb bne 40017a4c <== NOT EXECUTED 40017a64: 84 00 a0 01 inc %g2 <== NOT EXECUTED } /* * Hack to produce (hopefully) a suitably-aligned array of pointers */ if (bufsize < (((memcount+1)*sizeof(char *)) + 15)) 40017a68: c4 07 a0 50 ld [ %fp + 0x50 ], %g2 <== NOT EXECUTED 40017a6c: 83 28 e0 02 sll %g3, 2, %g1 <== NOT EXECUTED 40017a70: 82 00 60 13 add %g1, 0x13, %g1 <== NOT EXECUTED 40017a74: 80 a0 80 01 cmp %g2, %g1 <== NOT EXECUTED 40017a78: 0a 80 00 1c bcs 40017ae8 <== NOT EXECUTED 40017a7c: c2 07 a0 4c ld [ %fp + 0x4c ], %g1 <== NOT EXECUTED grp->gr_mem = (char **)(((uintptr_t)buffer + 15) & ~15); /* * Fill in pointer array */ grp->gr_mem[0] = grmem; 40017a80: c4 07 bf f0 ld [ %fp + -16 ], %g2 <== NOT EXECUTED /* * 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); 40017a84: 82 00 60 0f add %g1, 0xf, %g1 <== NOT EXECUTED 40017a88: 82 08 7f f0 and %g1, -16, %g1 <== NOT EXECUTED /* * Fill in pointer array */ grp->gr_mem[0] = grmem; 40017a8c: c4 20 40 00 st %g2, [ %g1 ] <== NOT EXECUTED /* * 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); 40017a90: c2 26 60 0c st %g1, [ %i1 + 0xc ] <== NOT EXECUTED /* * Fill in pointer array */ grp->gr_mem[0] = grmem; 40017a94: c2 07 bf f0 ld [ %fp + -16 ], %g1 <== NOT EXECUTED 40017a98: 88 10 20 01 mov 1, %g4 <== NOT EXECUTED 40017a9c: 10 80 00 0a b 40017ac4 <== NOT EXECUTED 40017aa0: 86 00 60 01 add %g1, 1, %g3 <== NOT EXECUTED for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { if(*cp == ',') { 40017aa4: 32 80 00 08 bne,a 40017ac4 <== NOT EXECUTED 40017aa8: 86 00 e0 01 inc %g3 <== NOT EXECUTED *cp = '\0'; 40017aac: c0 28 ff ff clrb [ %g3 + -1 ] <== NOT EXECUTED grp->gr_mem[memcount++] = cp + 1; 40017ab0: c4 06 60 0c ld [ %i1 + 0xc ], %g2 <== NOT EXECUTED 40017ab4: 83 29 20 02 sll %g4, 2, %g1 <== NOT EXECUTED 40017ab8: 88 01 20 01 inc %g4 <== NOT EXECUTED 40017abc: c6 20 80 01 st %g3, [ %g2 + %g1 ] <== NOT EXECUTED 40017ac0: 86 00 e0 01 inc %g3 <== NOT EXECUTED /* * Fill in pointer array */ grp->gr_mem[0] = grmem; for (cp = grmem, memcount = 1 ; *cp != 0 ; cp++) { 40017ac4: c2 48 ff ff ldsb [ %g3 + -1 ], %g1 <== NOT EXECUTED 40017ac8: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40017acc: 32 bf ff f6 bne,a 40017aa4 <== NOT EXECUTED 40017ad0: 80 a0 60 2c cmp %g1, 0x2c <== NOT EXECUTED if(*cp == ',') { *cp = '\0'; grp->gr_mem[memcount++] = cp + 1; } } grp->gr_mem[memcount] = NULL; 40017ad4: c4 06 60 0c ld [ %i1 + 0xc ], %g2 <== NOT EXECUTED 40017ad8: 83 29 20 02 sll %g4, 2, %g1 <== NOT EXECUTED 40017adc: c0 20 80 01 clr [ %g2 + %g1 ] <== NOT EXECUTED 40017ae0: 81 c7 e0 08 ret <== NOT EXECUTED 40017ae4: 91 e8 20 01 restore %g0, 1, %o0 <== NOT EXECUTED return 1; } 40017ae8: 81 c7 e0 08 ret <== NOT EXECUTED 40017aec: 91 e8 20 00 restore %g0, 0, %o0 <== NOT EXECUTED 40017b38 : FILE *fp, struct passwd *pwd, char *buffer, size_t bufsize ) { 40017b38: 9d e3 bf 90 save %sp, -112, %sp <== NOT EXECUTED int pwuid, pwgid; if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0) 40017b3c: 98 10 20 00 clr %o4 <== NOT EXECUTED FILE *fp, struct passwd *pwd, char *buffer, size_t bufsize ) { 40017b40: f4 27 a0 4c st %i2, [ %fp + 0x4c ] <== NOT EXECUTED 40017b44: f6 27 a0 50 st %i3, [ %fp + 0x50 ] <== NOT EXECUTED int pwuid, pwgid; if (!scanString(fp, &pwd->pw_name, &buffer, &bufsize, 0) 40017b48: b4 07 a0 50 add %fp, 0x50, %i2 <== NOT EXECUTED 40017b4c: b6 07 a0 4c add %fp, 0x4c, %i3 <== NOT EXECUTED 40017b50: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40017b54: 92 10 00 19 mov %i1, %o1 <== NOT EXECUTED 40017b58: 94 10 00 1b mov %i3, %o2 <== NOT EXECUTED 40017b5c: 7f ff ff 5b call 400178c8 <== NOT EXECUTED 40017b60: 96 10 00 1a mov %i2, %o3 <== NOT EXECUTED 40017b64: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017b68: 02 80 00 39 be 40017c4c <== NOT EXECUTED 40017b6c: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40017b70: 92 06 60 04 add %i1, 4, %o1 <== NOT EXECUTED 40017b74: 94 10 00 1b mov %i3, %o2 <== NOT EXECUTED 40017b78: 96 10 00 1a mov %i2, %o3 <== NOT EXECUTED 40017b7c: 7f ff ff 53 call 400178c8 <== NOT EXECUTED 40017b80: 98 10 20 00 clr %o4 <== NOT EXECUTED 40017b84: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017b88: 02 80 00 31 be 40017c4c <== NOT EXECUTED 40017b8c: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40017b90: 7f ff ff 0e call 400177c8 <== NOT EXECUTED 40017b94: 92 07 bf f4 add %fp, -12, %o1 <== NOT EXECUTED 40017b98: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017b9c: 02 80 00 2c be 40017c4c <== NOT EXECUTED 40017ba0: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40017ba4: 7f ff ff 09 call 400177c8 <== NOT EXECUTED 40017ba8: 92 07 bf f0 add %fp, -16, %o1 <== NOT EXECUTED 40017bac: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017bb0: 02 80 00 27 be 40017c4c <== NOT EXECUTED 40017bb4: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40017bb8: 92 06 60 0c add %i1, 0xc, %o1 <== NOT EXECUTED 40017bbc: 94 10 00 1b mov %i3, %o2 <== NOT EXECUTED 40017bc0: 96 10 00 1a mov %i2, %o3 <== NOT EXECUTED 40017bc4: 7f ff ff 41 call 400178c8 <== NOT EXECUTED 40017bc8: 98 10 20 00 clr %o4 <== NOT EXECUTED 40017bcc: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017bd0: 02 80 00 1f be 40017c4c <== NOT EXECUTED 40017bd4: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40017bd8: 92 06 60 10 add %i1, 0x10, %o1 <== NOT EXECUTED 40017bdc: 94 10 00 1b mov %i3, %o2 <== NOT EXECUTED 40017be0: 96 10 00 1a mov %i2, %o3 <== NOT EXECUTED 40017be4: 7f ff ff 39 call 400178c8 <== NOT EXECUTED 40017be8: 98 10 20 00 clr %o4 <== NOT EXECUTED 40017bec: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017bf0: 02 80 00 17 be 40017c4c <== NOT EXECUTED 40017bf4: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40017bf8: 92 06 60 14 add %i1, 0x14, %o1 <== NOT EXECUTED 40017bfc: 94 10 00 1b mov %i3, %o2 <== NOT EXECUTED 40017c00: 96 10 00 1a mov %i2, %o3 <== NOT EXECUTED 40017c04: 7f ff ff 31 call 400178c8 <== NOT EXECUTED 40017c08: 98 10 20 00 clr %o4 <== NOT EXECUTED 40017c0c: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017c10: 02 80 00 0f be 40017c4c <== NOT EXECUTED 40017c14: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40017c18: 94 10 00 1b mov %i3, %o2 <== NOT EXECUTED 40017c1c: 96 10 00 1a mov %i2, %o3 <== NOT EXECUTED 40017c20: 92 06 60 18 add %i1, 0x18, %o1 <== NOT EXECUTED 40017c24: 7f ff ff 29 call 400178c8 <== NOT EXECUTED 40017c28: 98 10 20 01 mov 1, %o4 <== NOT EXECUTED 40017c2c: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017c30: 02 80 00 07 be 40017c4c <== NOT EXECUTED 40017c34: c2 07 bf f4 ld [ %fp + -12 ], %g1 <== NOT EXECUTED || !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; 40017c38: c2 36 60 08 sth %g1, [ %i1 + 8 ] <== NOT EXECUTED pwd->pw_gid = pwgid; 40017c3c: c2 07 bf f0 ld [ %fp + -16 ], %g1 <== NOT EXECUTED 40017c40: c2 36 60 0a sth %g1, [ %i1 + 0xa ] <== NOT EXECUTED 40017c44: 81 c7 e0 08 ret <== NOT EXECUTED 40017c48: 91 e8 20 01 restore %g0, 1, %o0 <== NOT EXECUTED return 1; } 40017c4c: 81 c7 e0 08 ret <== NOT EXECUTED 40017c50: 91 e8 20 00 restore %g0, 0, %o0 <== NOT EXECUTED 40007750 : */ int sched_get_priority_max( int policy ) { 40007750: 9d e3 bf 98 save %sp, -104, %sp switch ( policy ) { 40007754: 80 a6 20 03 cmp %i0, 3 40007758: 08 80 00 06 bleu 40007770 4000775c: b0 10 20 fe mov 0xfe, %i0 case SCHED_RR: case SCHED_SPORADIC: break; default: rtems_set_errno_and_return_minus_one( EINVAL ); 40007760: 40 00 24 8e call 40010998 <__errno> <== NOT EXECUTED 40007764: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40007768: 82 10 20 16 mov 0x16, %g1 <== NOT EXECUTED 4000776c: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED } return POSIX_SCHEDULER_MAXIMUM_PRIORITY; } 40007770: 81 c7 e0 08 ret 40007774: 81 e8 00 00 restore 400077b0 : int sched_getparam( pid_t pid, const struct sched_param *param ) { 400077b0: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOSYS ); 400077b4: 40 00 24 79 call 40010998 <__errno> <== NOT EXECUTED 400077b8: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 400077bc: 82 10 20 58 mov 0x58, %g1 <== NOT EXECUTED 400077c0: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED } 400077c4: 81 c7 e0 08 ret <== NOT EXECUTED 400077c8: 81 e8 00 00 restore <== NOT EXECUTED 40007778 : */ int sched_getscheduler( pid_t pid ) { 40007778: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOSYS ); 4000777c: 40 00 24 87 call 40010998 <__errno> <== NOT EXECUTED 40007780: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40007784: 82 10 20 58 mov 0x58, %g1 <== NOT EXECUTED 40007788: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED } 4000778c: 81 c7 e0 08 ret <== NOT EXECUTED 40007790: 81 e8 00 00 restore <== NOT EXECUTED 400077e8 : int sched_rr_get_interval( pid_t pid, struct timespec *interval ) { 400077e8: 9d e3 bf 98 save %sp, -104, %sp /* * Only supported for the "calling process" (i.e. this node). */ if ( pid && pid != getpid() ) 400077ec: 80 a6 20 00 cmp %i0, 0 400077f0: 02 80 00 0b be 4000781c 400077f4: 80 a6 60 00 cmp %i1, 0 400077f8: 7f ff f1 7c call 40003de8 400077fc: 01 00 00 00 nop 40007800: 80 a6 00 08 cmp %i0, %o0 40007804: 02 80 00 06 be 4000781c 40007808: 80 a6 60 00 cmp %i1, 0 rtems_set_errno_and_return_minus_one( ESRCH ); 4000780c: 40 00 24 63 call 40010998 <__errno> <== NOT EXECUTED 40007810: 01 00 00 00 nop <== NOT EXECUTED 40007814: 10 80 00 07 b 40007830 <== NOT EXECUTED 40007818: 82 10 20 03 mov 3, %g1 ! 3 <== NOT EXECUTED if ( !interval ) 4000781c: 12 80 00 08 bne 4000783c 40007820: 03 10 00 7a sethi %hi(0x4001e800), %g1 rtems_set_errno_and_return_minus_one( EINVAL ); 40007824: 40 00 24 5d call 40010998 <__errno> <== NOT EXECUTED 40007828: 01 00 00 00 nop <== NOT EXECUTED 4000782c: 82 10 20 16 mov 0x16, %g1 ! 16 <== NOT EXECUTED 40007830: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 40007834: 81 c7 e0 08 ret <== NOT EXECUTED 40007838: 91 e8 3f ff restore %g0, -1, %o0 <== NOT EXECUTED _Timespec_From_ticks( _Thread_Ticks_per_timeslice, interval ); 4000783c: d0 00 62 48 ld [ %g1 + 0x248 ], %o0 40007840: 92 10 00 19 mov %i1, %o1 40007844: 40 00 13 de call 4000c7bc <_Timespec_From_ticks> 40007848: b0 10 20 00 clr %i0 return 0; } 4000784c: 81 c7 e0 08 ret 40007850: 81 e8 00 00 restore 400077cc : int sched_setparam( pid_t pid, const struct sched_param *param ) { 400077cc: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOSYS ); 400077d0: 40 00 24 72 call 40010998 <__errno> <== NOT EXECUTED 400077d4: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 400077d8: 82 10 20 58 mov 0x58, %g1 <== NOT EXECUTED 400077dc: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED } 400077e0: 81 c7 e0 08 ret <== NOT EXECUTED 400077e4: 81 e8 00 00 restore <== NOT EXECUTED 40007794 : int sched_setscheduler( pid_t pid, int policy, const struct sched_param *param ) { 40007794: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOSYS ); 40007798: 40 00 24 80 call 40010998 <__errno> <== NOT EXECUTED 4000779c: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 400077a0: 82 10 20 58 mov 0x58, %g1 <== NOT EXECUTED 400077a4: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED } 400077a8: 81 c7 e0 08 ret <== NOT EXECUTED 400077ac: 81 e8 00 00 restore <== NOT EXECUTED 4000766c : */ int sem_close( sem_t *sem ) { 4000766c: 9d e3 bf 90 save %sp, -112, %sp RTEMS_INLINE_ROUTINE POSIX_Semaphore_Control *_POSIX_Semaphore_Get ( sem_t *id, Objects_Locations *location ) { return (POSIX_Semaphore_Control *) 40007670: d2 06 00 00 ld [ %i0 ], %o1 40007674: 11 10 00 81 sethi %hi(0x40020400), %o0 40007678: 94 07 bf f4 add %fp, -12, %o2 4000767c: 40 00 0b b8 call 4000a55c <_Objects_Get> 40007680: 90 12 21 b0 or %o0, 0x1b0, %o0 register POSIX_Semaphore_Control *the_semaphore; Objects_Locations location; the_semaphore = _POSIX_Semaphore_Get( sem, &location ); switch ( location ) { 40007684: c2 07 bf f4 ld [ %fp + -12 ], %g1 40007688: 80 a0 60 01 cmp %g1, 1 4000768c: 02 80 00 0d be 400076c0 40007690: 01 00 00 00 nop 40007694: 2a 80 00 11 bcs,a 400076d8 40007698: c2 02 20 1c ld [ %o0 + 0x1c ], %g1 4000769c: 80 a0 60 02 cmp %g1, 2 400076a0: 12 80 00 1e bne 40007718 400076a4: 01 00 00 00 nop case OBJECTS_ERROR: rtems_set_errno_and_return_minus_one( EINVAL ); 400076a8: 40 00 28 13 call 400116f4 <__errno> 400076ac: 01 00 00 00 nop 400076b0: 82 10 20 16 mov 0x16, %g1 ! 16 400076b4: c2 22 00 00 st %g1, [ %o0 ] 400076b8: 10 80 00 1a b 40007720 400076bc: 90 10 3f ff mov -1, %o0 case OBJECTS_REMOTE: _Thread_Dispatch(); 400076c0: 40 00 10 5c call 4000b830 <_Thread_Dispatch> <== NOT EXECUTED 400076c4: 01 00 00 00 nop <== NOT EXECUTED return POSIX_MP_NOT_IMPLEMENTED(); 400076c8: 40 00 01 78 call 40007ca8 <== NOT EXECUTED 400076cc: 01 00 00 00 nop <== NOT EXECUTED _POSIX_Semaphore_Delete( the_semaphore ); _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); } 400076d0: 81 c7 e0 08 ret <== NOT EXECUTED 400076d4: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED case OBJECTS_REMOTE: _Thread_Dispatch(); return POSIX_MP_NOT_IMPLEMENTED(); rtems_set_errno_and_return_minus_one( EINVAL ); case OBJECTS_LOCAL: the_semaphore->open_count -= 1; 400076d8: 82 00 7f ff add %g1, -1, %g1 _POSIX_Semaphore_Delete( the_semaphore ); 400076dc: 40 00 1f b5 call 4000f5b0 <_POSIX_Semaphore_Delete> 400076e0: c2 22 20 1c st %g1, [ %o0 + 0x1c ] #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 400076e4: 05 10 00 80 sethi %hi(0x40020000), %g2 400076e8: c2 00 a2 30 ld [ %g2 + 0x230 ], %g1 ! 40020230 <_Thread_Dispatch_disable_level> 400076ec: 90 10 20 00 clr %o0 400076f0: 82 00 7f ff add %g1, -1, %g1 400076f4: c2 20 a2 30 st %g1, [ %g2 + 0x230 ] 400076f8: c2 00 a2 30 ld [ %g2 + 0x230 ], %g1 400076fc: 80 a0 60 00 cmp %g1, 0 40007700: 32 80 00 09 bne,a 40007724 40007704: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED _Thread_Dispatch(); 40007708: 40 00 10 4a call 4000b830 <_Thread_Dispatch> 4000770c: 01 00 00 00 nop 40007710: 10 80 00 04 b 40007720 40007714: 90 10 20 00 clr %o0 ! 0 _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); 40007718: 40 00 01 5a call 40007c80 <== NOT EXECUTED 4000771c: 01 00 00 00 nop <== NOT EXECUTED } 40007720: b0 10 00 08 mov %o0, %i0 40007724: 81 c7 e0 08 ret 40007728: 81 e8 00 00 restore 40007760 : */ int sem_destroy( sem_t *sem ) { 40007760: 9d e3 bf 90 save %sp, -112, %sp 40007764: d2 06 00 00 ld [ %i0 ], %o1 40007768: 11 10 00 81 sethi %hi(0x40020400), %o0 4000776c: 94 07 bf f4 add %fp, -12, %o2 40007770: 40 00 0b 7b call 4000a55c <_Objects_Get> 40007774: 90 12 21 b0 or %o0, 0x1b0, %o0 register POSIX_Semaphore_Control *the_semaphore; Objects_Locations location; the_semaphore = _POSIX_Semaphore_Get( sem, &location ); switch ( location ) { 40007778: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000777c: 80 a0 60 01 cmp %g1, 1 40007780: 02 80 00 08 be 400077a0 40007784: 01 00 00 00 nop 40007788: 2a 80 00 0c bcs,a 400077b8 4000778c: c2 02 20 14 ld [ %o0 + 0x14 ], %g1 40007790: 80 a0 60 02 cmp %g1, 2 40007794: 12 80 00 1a bne 400077fc 40007798: 01 00 00 00 nop 4000779c: 30 80 00 0c b,a 400077cc case OBJECTS_ERROR: rtems_set_errno_and_return_minus_one( EINVAL ); case OBJECTS_REMOTE: _Thread_Dispatch(); 400077a0: 40 00 10 24 call 4000b830 <_Thread_Dispatch> <== NOT EXECUTED 400077a4: 01 00 00 00 nop <== NOT EXECUTED return POSIX_MP_NOT_IMPLEMENTED(); 400077a8: 40 00 01 40 call 40007ca8 <== NOT EXECUTED 400077ac: 01 00 00 00 nop <== NOT EXECUTED _POSIX_Semaphore_Delete( the_semaphore ); _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); } 400077b0: 81 c7 e0 08 ret <== NOT EXECUTED 400077b4: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED case OBJECTS_LOCAL: /* * Undefined operation on a named semaphore. */ if ( the_semaphore->named == TRUE ) { 400077b8: 80 a0 60 01 cmp %g1, 1 400077bc: 12 80 00 0a bne 400077e4 400077c0: 01 00 00 00 nop _Thread_Enable_dispatch(); 400077c4: 7f ff ff da call 4000772c <_Thread_Enable_dispatch> <== NOT EXECUTED 400077c8: 01 00 00 00 nop <== NOT EXECUTED rtems_set_errno_and_return_minus_one( EINVAL ); 400077cc: 40 00 27 ca call 400116f4 <__errno> 400077d0: 01 00 00 00 nop 400077d4: 82 10 20 16 mov 0x16, %g1 ! 16 400077d8: c2 22 00 00 st %g1, [ %o0 ] 400077dc: 10 80 00 0a b 40007804 400077e0: 90 10 3f ff mov -1, %o0 } _POSIX_Semaphore_Delete( the_semaphore ); 400077e4: 40 00 1f 73 call 4000f5b0 <_POSIX_Semaphore_Delete> 400077e8: 01 00 00 00 nop _Thread_Enable_dispatch(); 400077ec: 7f ff ff d0 call 4000772c <_Thread_Enable_dispatch> 400077f0: 01 00 00 00 nop 400077f4: 10 80 00 04 b 40007804 400077f8: 90 10 20 00 clr %o0 ! 0 return 0; } return POSIX_BOTTOM_REACHED(); 400077fc: 40 00 01 21 call 40007c80 <== NOT EXECUTED 40007800: 01 00 00 00 nop <== NOT EXECUTED } 40007804: b0 10 00 08 mov %o0, %i0 40007808: 81 c7 e0 08 ret 4000780c: 81 e8 00 00 restore 40007810 : int sem_getvalue( sem_t *sem, int *sval ) { 40007810: 9d e3 bf 90 save %sp, -112, %sp 40007814: d2 06 00 00 ld [ %i0 ], %o1 40007818: 11 10 00 81 sethi %hi(0x40020400), %o0 4000781c: 94 07 bf f4 add %fp, -12, %o2 40007820: 40 00 0b 4f call 4000a55c <_Objects_Get> 40007824: 90 12 21 b0 or %o0, 0x1b0, %o0 register POSIX_Semaphore_Control *the_semaphore; Objects_Locations location; the_semaphore = _POSIX_Semaphore_Get( sem, &location ); switch ( location ) { 40007828: c2 07 bf f4 ld [ %fp + -12 ], %g1 4000782c: 80 a0 60 01 cmp %g1, 1 40007830: 02 80 00 0d be 40007864 40007834: 01 00 00 00 nop 40007838: 2a 80 00 11 bcs,a 4000787c 4000783c: c2 02 20 68 ld [ %o0 + 0x68 ], %g1 40007840: 80 a0 60 02 cmp %g1, 2 40007844: 12 80 00 1c bne 400078b4 40007848: 01 00 00 00 nop case OBJECTS_ERROR: rtems_set_errno_and_return_minus_one( EINVAL ); 4000784c: 40 00 27 aa call 400116f4 <__errno> 40007850: 01 00 00 00 nop 40007854: 82 10 20 16 mov 0x16, %g1 ! 16 40007858: c2 22 00 00 st %g1, [ %o0 ] 4000785c: 10 80 00 18 b 400078bc 40007860: 90 10 3f ff mov -1, %o0 case OBJECTS_REMOTE: _Thread_Dispatch(); 40007864: 40 00 0f f3 call 4000b830 <_Thread_Dispatch> <== NOT EXECUTED 40007868: 01 00 00 00 nop <== NOT EXECUTED return POSIX_MP_NOT_IMPLEMENTED(); 4000786c: 40 00 01 0f call 40007ca8 <== NOT EXECUTED 40007870: 01 00 00 00 nop <== NOT EXECUTED *sval = _CORE_semaphore_Get_count( &the_semaphore->Semaphore ); _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); } 40007874: 81 c7 e0 08 ret <== NOT EXECUTED 40007878: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED case OBJECTS_REMOTE: _Thread_Dispatch(); return POSIX_MP_NOT_IMPLEMENTED(); rtems_set_errno_and_return_minus_one( EINVAL ); case OBJECTS_LOCAL: *sval = _CORE_semaphore_Get_count( &the_semaphore->Semaphore ); 4000787c: c2 26 40 00 st %g1, [ %i1 ] #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40007880: 05 10 00 80 sethi %hi(0x40020000), %g2 40007884: c2 00 a2 30 ld [ %g2 + 0x230 ], %g1 ! 40020230 <_Thread_Dispatch_disable_level> 40007888: 90 10 20 00 clr %o0 4000788c: 82 00 7f ff add %g1, -1, %g1 40007890: c2 20 a2 30 st %g1, [ %g2 + 0x230 ] 40007894: c2 00 a2 30 ld [ %g2 + 0x230 ], %g1 40007898: 80 a0 60 00 cmp %g1, 0 4000789c: 32 80 00 09 bne,a 400078c0 400078a0: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED _Thread_Dispatch(); 400078a4: 40 00 0f e3 call 4000b830 <_Thread_Dispatch> 400078a8: 01 00 00 00 nop 400078ac: 10 80 00 04 b 400078bc 400078b0: 90 10 20 00 clr %o0 ! 0 _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); 400078b4: 40 00 00 f3 call 40007c80 <== NOT EXECUTED 400078b8: 01 00 00 00 nop <== NOT EXECUTED } 400078bc: b0 10 00 08 mov %o0, %i0 400078c0: 81 c7 e0 08 ret 400078c4: 81 e8 00 00 restore 400078c8 : int sem_init( sem_t *sem, int pshared, unsigned int value ) { 400078c8: 9d e3 bf 90 save %sp, -112, %sp 400078cc: 92 10 00 19 mov %i1, %o1 int status; POSIX_Semaphore_Control *the_semaphore; if ( !sem ) 400078d0: 80 a6 20 00 cmp %i0, 0 400078d4: 12 80 00 08 bne 400078f4 400078d8: 94 10 00 1a mov %i2, %o2 rtems_set_errno_and_return_minus_one( EINVAL ); 400078dc: 40 00 27 86 call 400116f4 <__errno> <== NOT EXECUTED 400078e0: 01 00 00 00 nop <== NOT EXECUTED 400078e4: 82 10 20 16 mov 0x16, %g1 ! 16 <== NOT EXECUTED 400078e8: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 400078ec: 10 80 00 0a b 40007914 <== NOT EXECUTED 400078f0: 90 10 3f ff mov -1, %o0 <== NOT EXECUTED status = _POSIX_Semaphore_Create_support( 400078f4: 90 10 20 00 clr %o0 400078f8: 40 00 1e e2 call 4000f480 <_POSIX_Semaphore_Create_support> 400078fc: 96 07 bf f4 add %fp, -12, %o3 pshared, value, &the_semaphore ); if ( status != -1 ) 40007900: 80 a2 3f ff cmp %o0, -1 40007904: 02 80 00 04 be 40007914 40007908: c2 07 bf f4 ld [ %fp + -12 ], %g1 *sem = the_semaphore->Object.id; 4000790c: c2 00 60 08 ld [ %g1 + 8 ], %g1 40007910: c2 26 00 00 st %g1, [ %i0 ] return status; } 40007914: 81 c7 e0 08 ret 40007918: 91 e8 00 08 restore %g0, %o0, %o0 40007a6c : */ int sem_post( sem_t *sem ) { 40007a6c: 9d e3 bf 90 save %sp, -112, %sp 40007a70: d2 06 00 00 ld [ %i0 ], %o1 40007a74: 11 10 00 81 sethi %hi(0x40020400), %o0 40007a78: 94 07 bf f4 add %fp, -12, %o2 40007a7c: 40 00 0a b8 call 4000a55c <_Objects_Get> 40007a80: 90 12 21 b0 or %o0, 0x1b0, %o0 register POSIX_Semaphore_Control *the_semaphore; Objects_Locations location; the_semaphore = _POSIX_Semaphore_Get( sem, &location ); switch ( location ) { 40007a84: c2 07 bf f4 ld [ %fp + -12 ], %g1 40007a88: 80 a0 60 01 cmp %g1, 1 40007a8c: 02 80 00 0d be 40007ac0 40007a90: 01 00 00 00 nop 40007a94: 2a 80 00 11 bcs,a 40007ad8 40007a98: d2 02 20 08 ld [ %o0 + 8 ], %o1 40007a9c: 80 a0 60 02 cmp %g1, 2 40007aa0: 12 80 00 1e bne 40007b18 40007aa4: 01 00 00 00 nop case OBJECTS_ERROR: rtems_set_errno_and_return_minus_one( EINVAL ); 40007aa8: 40 00 27 13 call 400116f4 <__errno> 40007aac: 01 00 00 00 nop 40007ab0: 82 10 20 16 mov 0x16, %g1 ! 16 40007ab4: c2 22 00 00 st %g1, [ %o0 ] 40007ab8: 10 80 00 1a b 40007b20 40007abc: 90 10 3f ff mov -1, %o0 case OBJECTS_REMOTE: _Thread_Dispatch(); 40007ac0: 40 00 0f 5c call 4000b830 <_Thread_Dispatch> <== NOT EXECUTED 40007ac4: 01 00 00 00 nop <== NOT EXECUTED return POSIX_MP_NOT_IMPLEMENTED(); 40007ac8: 40 00 00 78 call 40007ca8 <== NOT EXECUTED 40007acc: 01 00 00 00 nop <== NOT EXECUTED ); _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); } 40007ad0: 81 c7 e0 08 ret <== NOT EXECUTED 40007ad4: 91 e8 00 08 restore %g0, %o0, %o0 <== NOT EXECUTED case OBJECTS_REMOTE: _Thread_Dispatch(); return POSIX_MP_NOT_IMPLEMENTED(); rtems_set_errno_and_return_minus_one( EINVAL ); case OBJECTS_LOCAL: _CORE_semaphore_Surrender( 40007ad8: 94 10 20 00 clr %o2 40007adc: 40 00 07 a5 call 40009970 <_CORE_semaphore_Surrender> 40007ae0: 90 02 20 20 add %o0, 0x20, %o0 #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 40007ae4: 03 10 00 80 sethi %hi(0x40020000), %g1 40007ae8: c4 00 62 30 ld [ %g1 + 0x230 ], %g2 ! 40020230 <_Thread_Dispatch_disable_level> 40007aec: 90 10 20 00 clr %o0 40007af0: 84 00 bf ff add %g2, -1, %g2 40007af4: c4 20 62 30 st %g2, [ %g1 + 0x230 ] 40007af8: c2 00 62 30 ld [ %g1 + 0x230 ], %g1 40007afc: 80 a0 60 00 cmp %g1, 0 40007b00: 32 80 00 09 bne,a 40007b24 40007b04: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED _Thread_Dispatch(); 40007b08: 40 00 0f 4a call 4000b830 <_Thread_Dispatch> 40007b0c: 01 00 00 00 nop 40007b10: 10 80 00 04 b 40007b20 40007b14: 90 10 20 00 clr %o0 ! 0 #endif ); _Thread_Enable_dispatch(); return 0; } return POSIX_BOTTOM_REACHED(); 40007b18: 40 00 00 5a call 40007c80 <== NOT EXECUTED 40007b1c: 01 00 00 00 nop <== NOT EXECUTED } 40007b20: b0 10 00 08 mov %o0, %i0 40007b24: 81 c7 e0 08 ret 40007b28: 81 e8 00 00 restore 40017764 : int setgid( gid_t gid ) { _POSIX_types_Gid = gid; 40017764: 03 10 00 e6 sethi %hi(0x40039800), %g1 <== NOT EXECUTED 40017768: c2 00 62 c0 ld [ %g1 + 0x2c0 ], %g1 ! 40039ac0 <== NOT EXECUTED 4001776c: d0 30 60 2a sth %o0, [ %g1 + 0x2a ] <== NOT EXECUTED return 0; } 40017770: 81 c3 e0 08 retl <== NOT EXECUTED 40017774: 90 10 20 00 clr %o0 <== NOT EXECUTED 40017d78 : return NULL; return &grent; } void setgrent(void) { 40017d78: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED init_etc_passwd_group(); 40017d7c: 7f ff ff c8 call 40017c9c <== NOT EXECUTED 40017d80: 21 10 00 ed sethi %hi(0x4003b400), %l0 <== NOT EXECUTED if (group_fp != NULL) 40017d84: d0 04 21 84 ld [ %l0 + 0x184 ], %o0 ! 4003b584 <== NOT EXECUTED 40017d88: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017d8c: 22 80 00 05 be,a 40017da0 <== NOT EXECUTED 40017d90: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED fclose(group_fp); 40017d94: 40 00 2f 54 call 40023ae4 <== NOT EXECUTED 40017d98: 01 00 00 00 nop <== NOT EXECUTED group_fp = fopen("/etc/group", "r"); 40017d9c: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED 40017da0: 13 10 00 e3 sethi %hi(0x40038c00), %o1 <== NOT EXECUTED 40017da4: 90 12 21 90 or %o0, 0x190, %o0 <== NOT EXECUTED 40017da8: 40 00 31 4d call 400242dc <== NOT EXECUTED 40017dac: 92 12 61 38 or %o1, 0x138, %o1 <== NOT EXECUTED 40017db0: d0 24 21 84 st %o0, [ %l0 + 0x184 ] <== NOT EXECUTED } 40017db4: 81 c7 e0 08 ret <== NOT EXECUTED 40017db8: 81 e8 00 00 restore <== NOT EXECUTED 40017f68 : return NULL; return &pwent; } void setpwent(void) { 40017f68: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED init_etc_passwd_group(); 40017f6c: 7f ff ff 4c call 40017c9c <== NOT EXECUTED 40017f70: 21 10 00 ed sethi %hi(0x4003b400), %l0 <== NOT EXECUTED if (passwd_fp != NULL) 40017f74: d0 04 20 9c ld [ %l0 + 0x9c ], %o0 ! 4003b49c <== NOT EXECUTED 40017f78: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40017f7c: 22 80 00 05 be,a 40017f90 <== NOT EXECUTED 40017f80: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED fclose(passwd_fp); 40017f84: 40 00 2e d8 call 40023ae4 <== NOT EXECUTED 40017f88: 01 00 00 00 nop <== NOT EXECUTED passwd_fp = fopen("/etc/passwd", "r"); 40017f8c: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED 40017f90: 13 10 00 e3 sethi %hi(0x40038c00), %o1 <== NOT EXECUTED 40017f94: 90 12 21 18 or %o0, 0x118, %o0 <== NOT EXECUTED 40017f98: 40 00 30 d1 call 400242dc <== NOT EXECUTED 40017f9c: 92 12 61 38 or %o1, 0x138, %o1 <== NOT EXECUTED 40017fa0: d0 24 20 9c st %o0, [ %l0 + 0x9c ] <== NOT EXECUTED } 40017fa4: 81 c7 e0 08 ret <== NOT EXECUTED 40017fa8: 81 e8 00 00 restore <== NOT EXECUTED 40018168 : int setuid( uid_t uid ) { _POSIX_types_Uid = uid; 40018168: 03 10 00 e6 sethi %hi(0x40039800), %g1 <== NOT EXECUTED 4001816c: c2 00 62 c0 ld [ %g1 + 0x2c0 ], %g1 ! 40039ac0 <== NOT EXECUTED 40018170: d0 30 60 28 sth %o0, [ %g1 + 0x28 ] <== NOT EXECUTED return 0; } 40018174: 81 c3 e0 08 retl <== NOT EXECUTED 40018178: 90 10 20 00 clr %o0 <== NOT EXECUTED 40006d18 : int sigaction( int sig, const struct sigaction *act, struct sigaction *oact ) { 40006d18: 9d e3 bf 98 save %sp, -104, %sp ISR_Level level; if ( oact ) 40006d1c: 90 96 a0 00 orcc %i2, 0, %o0 40006d20: 02 80 00 09 be 40006d44 40006d24: 85 2e 20 02 sll %i0, 2, %g2 *oact = _POSIX_signals_Vectors[ sig ]; 40006d28: 83 2e 20 04 sll %i0, 4, %g1 <== NOT EXECUTED 40006d2c: 82 20 40 02 sub %g1, %g2, %g1 <== NOT EXECUTED 40006d30: 13 10 00 78 sethi %hi(0x4001e000), %o1 <== NOT EXECUTED 40006d34: 94 10 20 0c mov 0xc, %o2 <== NOT EXECUTED 40006d38: 92 12 63 c4 or %o1, 0x3c4, %o1 <== NOT EXECUTED 40006d3c: 40 00 27 1d call 400109b0 <== NOT EXECUTED 40006d40: 92 00 40 09 add %g1, %o1, %o1 <== NOT EXECUTED if ( !sig ) 40006d44: 80 a6 20 00 cmp %i0, 0 40006d48: 02 80 00 08 be 40006d68 40006d4c: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( EINVAL ); if ( !is_valid_signo(sig) ) 40006d50: a0 06 3f ff add %i0, -1, %l0 40006d54: 80 a4 20 1f cmp %l0, 0x1f 40006d58: 18 80 00 04 bgu 40006d68 40006d5c: 80 a6 20 09 cmp %i0, 9 * * NOTE: Solaris documentation claims to "silently enforce" this which * contradicts the POSIX specification. */ if ( sig == SIGKILL ) 40006d60: 12 80 00 08 bne 40006d80 40006d64: 80 a6 60 00 cmp %i1, 0 rtems_set_errno_and_return_minus_one( EINVAL ); 40006d68: 40 00 25 2c call 40010218 <__errno> 40006d6c: 01 00 00 00 nop 40006d70: 82 10 20 16 mov 0x16, %g1 ! 16 40006d74: c2 22 00 00 st %g1, [ %o0 ] 40006d78: 10 80 00 1f b 40006df4 40006d7c: 82 10 3f ff mov -1, %g1 /* * Evaluate the new action structure and set the global signal vector * appropriately. */ if ( act ) { 40006d80: 02 80 00 1d be 40006df4 40006d84: 82 10 20 00 clr %g1 /* * Unless the user is installing the default signal actions, then * we can just copy the provided sigaction structure into the vectors. */ _ISR_Disable( level ); 40006d88: 7f ff ed c6 call 400024a0 40006d8c: 01 00 00 00 nop 40006d90: a4 10 00 08 mov %o0, %l2 if ( act->sa_handler == SIG_DFL ) { 40006d94: c2 06 60 08 ld [ %i1 + 8 ], %g1 40006d98: b5 2e 20 04 sll %i0, 4, %i2 40006d9c: 80 a0 60 00 cmp %g1, 0 40006da0: b1 2e 20 02 sll %i0, 2, %i0 40006da4: 03 10 00 78 sethi %hi(0x4001e000), %g1 40006da8: 12 80 00 08 bne 40006dc8 40006dac: a2 10 63 c4 or %g1, 0x3c4, %l1 ! 4001e3c4 <_POSIX_signals_Vectors> _POSIX_signals_Vectors[ sig ] = _POSIX_signals_Default_vectors[ sig ]; 40006db0: 82 26 80 18 sub %i2, %i0, %g1 <== NOT EXECUTED 40006db4: 13 10 00 74 sethi %hi(0x4001d000), %o1 <== NOT EXECUTED 40006db8: 90 00 40 11 add %g1, %l1, %o0 <== NOT EXECUTED 40006dbc: 92 12 60 6c or %o1, 0x6c, %o1 <== NOT EXECUTED 40006dc0: 10 80 00 08 b 40006de0 <== NOT EXECUTED 40006dc4: 92 00 40 09 add %g1, %o1, %o1 <== NOT EXECUTED } else { _POSIX_signals_Clear_process_signals( signo_to_mask(sig) ); 40006dc8: 90 10 20 01 mov 1, %o0 40006dcc: 40 00 1d 11 call 4000e210 <_POSIX_signals_Clear_process_signals> 40006dd0: 91 2a 00 10 sll %o0, %l0, %o0 _POSIX_signals_Vectors[ sig ] = *act; 40006dd4: 90 26 80 18 sub %i2, %i0, %o0 40006dd8: 92 10 00 19 mov %i1, %o1 40006ddc: 90 02 00 11 add %o0, %l1, %o0 40006de0: 40 00 26 f4 call 400109b0 40006de4: 94 10 20 0c mov 0xc, %o2 } _ISR_Enable( level ); 40006de8: 7f ff ed b2 call 400024b0 40006dec: 90 10 00 12 mov %l2, %o0 40006df0: 82 10 20 00 clr %g1 * + If we are now ignoring a signal that was previously pending, * we clear the pending signal indicator. */ return 0; } 40006df4: 81 c7 e0 08 ret 40006df8: 91 e8 00 01 restore %g0, %g1, %o0 40007174 : int sigtimedwait( const sigset_t *set, siginfo_t *info, const struct timespec *timeout ) { 40007174: 9d e3 bf 88 save %sp, -120, %sp * NOTE: This is very specifically a RELATIVE not ABSOLUTE time * in the Open Group specification. */ interval = 0; if ( timeout ) { 40007178: 80 a6 a0 00 cmp %i2, 0 4000717c: 02 80 00 12 be 400071c4 40007180: a6 10 20 00 clr %l3 if ( !_Timespec_Is_valid( timeout ) ) 40007184: 40 00 13 ce call 4000c0bc <_Timespec_Is_valid> 40007188: 90 10 00 1a mov %i2, %o0 4000718c: 80 a2 20 00 cmp %o0, 0 40007190: 02 80 00 07 be 400071ac 40007194: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( EINVAL ); interval = _Timespec_To_ticks( timeout ); 40007198: 40 00 13 ee call 4000c150 <_Timespec_To_ticks> 4000719c: 90 10 00 1a mov %i2, %o0 if ( !interval ) 400071a0: a6 92 20 00 orcc %o0, 0, %l3 400071a4: 12 80 00 09 bne 400071c8 400071a8: 80 a6 60 00 cmp %i1, 0 rtems_set_errno_and_return_minus_one( EINVAL ); 400071ac: 40 00 25 d4 call 400108fc <__errno> 400071b0: b0 10 3f ff mov -1, %i0 400071b4: 82 10 20 16 mov 0x16, %g1 400071b8: c2 22 00 00 st %g1, [ %o0 ] 400071bc: 81 c7 e0 08 ret 400071c0: 81 e8 00 00 restore /* * Initialize local variables. */ the_info = ( info ) ? info : &signal_information; 400071c4: 80 a6 60 00 cmp %i1, 0 400071c8: 02 80 00 03 be 400071d4 400071cc: a4 07 bf ec add %fp, -20, %l2 400071d0: a4 10 00 19 mov %i1, %l2 the_thread = _Thread_Executing; 400071d4: 29 10 00 79 sethi %hi(0x4001e400), %l4 400071d8: f4 05 22 6c ld [ %l4 + 0x26c ], %i2 ! 4001e66c <_Thread_Executing> * What if they are already pending? */ /* API signals pending? */ _ISR_Disable( level ); 400071dc: 7f ff ed 72 call 400027a4 400071e0: f2 06 a1 70 ld [ %i2 + 0x170 ], %i1 400071e4: a0 10 00 08 mov %o0, %l0 if ( *set & api->signals_pending ) { 400071e8: c4 06 00 00 ld [ %i0 ], %g2 400071ec: c2 06 60 c8 ld [ %i1 + 0xc8 ], %g1 400071f0: 80 88 80 01 btst %g2, %g1 400071f4: 22 80 00 10 be,a 40007234 400071f8: 03 10 00 7b sethi %hi(0x4001ec00), %g1 /* XXX real info later */ the_info->si_signo = _POSIX_signals_Get_highest( api->signals_pending ); 400071fc: 7f ff ff c4 call 4000710c <_POSIX_signals_Get_highest> 40007200: 90 10 00 01 mov %g1, %o0 _POSIX_signals_Clear_signals( 40007204: 94 10 00 12 mov %l2, %o2 /* API signals pending? */ _ISR_Disable( level ); if ( *set & api->signals_pending ) { /* XXX real info later */ the_info->si_signo = _POSIX_signals_Get_highest( api->signals_pending ); 40007208: 92 10 00 08 mov %o0, %o1 _POSIX_signals_Clear_signals( 4000720c: 96 10 20 00 clr %o3 40007210: 90 10 00 19 mov %i1, %o0 /* API signals pending? */ _ISR_Disable( level ); if ( *set & api->signals_pending ) { /* XXX real info later */ the_info->si_signo = _POSIX_signals_Get_highest( api->signals_pending ); 40007214: d2 24 80 00 st %o1, [ %l2 ] _POSIX_signals_Clear_signals( 40007218: 40 00 1d e3 call 4000e9a4 <_POSIX_signals_Clear_signals> 4000721c: 98 10 20 00 clr %o4 the_info->si_signo, the_info, FALSE, FALSE ); _ISR_Enable( level ); 40007220: 7f ff ed 65 call 400027b4 40007224: 90 10 00 10 mov %l0, %o0 the_info->si_code = SI_USER; the_info->si_value.sival_int = 0; return the_info->si_signo; 40007228: f0 04 80 00 ld [ %l2 ], %i0 FALSE ); _ISR_Enable( level ); the_info->si_code = SI_USER; the_info->si_value.sival_int = 0; 4000722c: 10 80 00 13 b 40007278 40007230: c0 24 a0 08 clr [ %l2 + 8 ] return the_info->si_signo; } /* Process pending signals? */ if ( *set & _POSIX_signals_Pending ) { 40007234: c2 00 61 f0 ld [ %g1 + 0x1f0 ], %g1 40007238: 80 88 80 01 btst %g2, %g1 4000723c: 02 80 00 13 be 40007288 40007240: 23 10 00 79 sethi %hi(0x4001e400), %l1 signo = _POSIX_signals_Get_highest( _POSIX_signals_Pending ); 40007244: 7f ff ff b2 call 4000710c <_POSIX_signals_Get_highest> 40007248: 90 10 00 01 mov %g1, %o0 _POSIX_signals_Clear_signals( api, signo, the_info, TRUE, FALSE ); 4000724c: 94 10 00 12 mov %l2, %o2 } /* Process pending signals? */ if ( *set & _POSIX_signals_Pending ) { signo = _POSIX_signals_Get_highest( _POSIX_signals_Pending ); 40007250: b0 10 00 08 mov %o0, %i0 _POSIX_signals_Clear_signals( api, signo, the_info, TRUE, FALSE ); 40007254: 96 10 20 01 mov 1, %o3 40007258: 90 10 00 19 mov %i1, %o0 4000725c: 92 10 00 18 mov %i0, %o1 40007260: 40 00 1d d1 call 4000e9a4 <_POSIX_signals_Clear_signals> 40007264: 98 10 20 00 clr %o4 _ISR_Enable( level ); 40007268: 7f ff ed 53 call 400027b4 4000726c: 90 10 00 10 mov %l0, %o0 the_info->si_signo = signo; the_info->si_code = SI_USER; the_info->si_value.sival_int = 0; 40007270: c0 24 a0 08 clr [ %l2 + 8 ] if ( *set & _POSIX_signals_Pending ) { signo = _POSIX_signals_Get_highest( _POSIX_signals_Pending ); _POSIX_signals_Clear_signals( api, signo, the_info, TRUE, FALSE ); _ISR_Enable( level ); the_info->si_signo = signo; 40007274: f0 24 80 00 st %i0, [ %l2 ] the_info->si_code = SI_USER; 40007278: 82 10 20 01 mov 1, %g1 4000727c: c2 24 a0 04 st %g1, [ %l2 + 4 ] 40007280: 81 c7 e0 08 ret 40007284: 81 e8 00 00 restore rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 40007288: c2 04 61 90 ld [ %l1 + 0x190 ], %g1 the_info->si_value.sival_int = 0; return signo; } the_info->si_signo = -1; 4000728c: 84 10 3f ff mov -1, %g2 40007290: 82 00 60 01 inc %g1 40007294: c4 24 80 00 st %g2, [ %l2 ] 40007298: c2 24 61 90 st %g1, [ %l1 + 0x190 ] _Thread_Disable_dispatch(); the_thread->Wait.queue = &_POSIX_signals_Wait_queue; the_thread->Wait.return_code = EINTR; 4000729c: 82 10 20 04 mov 4, %g1 400072a0: c2 26 a0 34 st %g1, [ %i2 + 0x34 ] the_thread->Wait.option = *set; 400072a4: c2 06 00 00 ld [ %i0 ], %g1 the_thread->Wait.return_argument = the_info; 400072a8: e4 26 a0 28 st %l2, [ %i2 + 0x28 ] the_info->si_signo = -1; _Thread_Disable_dispatch(); the_thread->Wait.queue = &_POSIX_signals_Wait_queue; the_thread->Wait.return_code = EINTR; the_thread->Wait.option = *set; 400072ac: c2 26 a0 30 st %g1, [ %i2 + 0x30 ] } the_info->si_signo = -1; _Thread_Disable_dispatch(); the_thread->Wait.queue = &_POSIX_signals_Wait_queue; 400072b0: 21 10 00 7b sethi %hi(0x4001ec00), %l0 RTEMS_INLINE_ROUTINE void _Thread_queue_Enter_critical_section ( Thread_queue_Control *the_thread_queue ) { the_thread_queue->sync_state = THREAD_QUEUE_NOTHING_HAPPENED; 400072b4: 82 10 20 01 mov 1, %g1 400072b8: a0 14 21 b0 or %l0, 0x1b0, %l0 400072bc: e0 26 a0 44 st %l0, [ %i2 + 0x44 ] 400072c0: c2 24 20 30 st %g1, [ %l0 + 0x30 ] 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 ); 400072c4: 7f ff ed 3c call 400027b4 400072c8: 01 00 00 00 nop _Thread_queue_Enqueue( &_POSIX_signals_Wait_queue, interval ); 400072cc: 90 10 00 10 mov %l0, %o0 400072d0: 92 10 00 13 mov %l3, %o1 400072d4: 15 10 00 2e sethi %hi(0x4000b800), %o2 400072d8: 40 00 10 be call 4000b5d0 <_Thread_queue_Enqueue_with_handler> 400072dc: 94 12 a2 68 or %o2, 0x268, %o2 ! 4000ba68 <_Thread_queue_Timeout> #if ( CPU_INLINE_ENABLE_DISPATCH == TRUE ) RTEMS_INLINE_ROUTINE void _Thread_Enable_dispatch() { RTEMS_COMPILER_MEMORY_BARRIER(); if ( (--_Thread_Dispatch_disable_level) == 0 ) 400072e0: c2 04 61 90 ld [ %l1 + 0x190 ], %g1 400072e4: 82 00 7f ff add %g1, -1, %g1 400072e8: c2 24 61 90 st %g1, [ %l1 + 0x190 ] 400072ec: c2 04 61 90 ld [ %l1 + 0x190 ], %g1 400072f0: 80 a0 60 00 cmp %g1, 0 400072f4: 32 80 00 05 bne,a 40007308 400072f8: d2 04 80 00 ld [ %l2 ], %o1 <== NOT EXECUTED _Thread_Dispatch(); 400072fc: 40 00 0f 4d call 4000b030 <_Thread_Dispatch> 40007300: 01 00 00 00 nop /* * 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 ); 40007304: d2 04 80 00 ld [ %l2 ], %o1 40007308: 94 10 00 12 mov %l2, %o2 4000730c: 96 10 20 00 clr %o3 40007310: 98 10 20 00 clr %o4 40007314: 40 00 1d a4 call 4000e9a4 <_POSIX_signals_Clear_signals> 40007318: 90 10 00 19 mov %i1, %o0 errno = _Thread_Executing->Wait.return_code; 4000731c: 40 00 25 78 call 400108fc <__errno> 40007320: 01 00 00 00 nop 40007324: c2 05 22 6c ld [ %l4 + 0x26c ], %g1 40007328: c2 00 60 34 ld [ %g1 + 0x34 ], %g1 4000732c: c2 22 00 00 st %g1, [ %o0 ] return the_info->si_signo; 40007330: f0 04 80 00 ld [ %l2 ], %i0 } 40007334: 81 c7 e0 08 ret 40007338: 81 e8 00 00 restore 40008f28 : int sigwait( const sigset_t *set, int *sig ) { 40008f28: 9d e3 bf 98 save %sp, -104, %sp int status; status = sigtimedwait( set, NULL, NULL ); 40008f2c: 92 10 20 00 clr %o1 40008f30: 90 10 00 18 mov %i0, %o0 40008f34: 7f ff ff 86 call 40008d4c 40008f38: 94 10 20 00 clr %o2 if ( status != -1 ) { 40008f3c: 80 a2 3f ff cmp %o0, -1 40008f40: 02 80 00 07 be 40008f5c 40008f44: 80 a6 60 00 cmp %i1, 0 if ( sig ) 40008f48: 02 80 00 03 be 40008f54 40008f4c: b0 10 20 00 clr %i0 *sig = status; 40008f50: d0 26 40 00 st %o0, [ %i1 ] 40008f54: 81 c7 e0 08 ret 40008f58: 81 e8 00 00 restore return 0; } return errno; 40008f5c: 40 00 25 af call 40012618 <__errno> <== NOT EXECUTED 40008f60: 01 00 00 00 nop <== NOT EXECUTED 40008f64: f0 02 00 00 ld [ %o0 ], %i0 <== NOT EXECUTED } 40008f68: 81 c7 e0 08 ret <== NOT EXECUTED 40008f6c: 81 e8 00 00 restore <== NOT EXECUTED 40004bc0 : /* * Process input character, with semaphore. */ static int siproc (unsigned char c, struct rtems_termios_tty *tty) { 40004bc0: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED int i; /* * Obtain output semaphore if character will be echoed */ if (tty->termios.c_lflag & (ECHO|ECHOE|ECHOK|ECHONL|ECHOPRT|ECHOCTL|ECHOKE)) { 40004bc4: c2 06 60 3c ld [ %i1 + 0x3c ], %g1 <== NOT EXECUTED 40004bc8: 80 88 6e 78 btst 0xe78, %g1 <== NOT EXECUTED 40004bcc: 12 80 00 04 bne 40004bdc <== NOT EXECUTED 40004bd0: b0 0e 20 ff and %i0, 0xff, %i0 <== NOT EXECUTED rtems_semaphore_obtain (tty->osem, RTEMS_WAIT, RTEMS_NO_TIMEOUT); i = iproc (c, tty); rtems_semaphore_release (tty->osem); } else { i = iproc (c, tty); 40004bd4: 7f ff ff 89 call 400049f8 <== NOT EXECUTED 40004bd8: 81 e8 00 00 restore <== 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); 40004bdc: d0 06 60 18 ld [ %i1 + 0x18 ], %o0 <== NOT EXECUTED 40004be0: 94 10 20 00 clr %o2 <== NOT EXECUTED 40004be4: 40 00 06 f7 call 400067c0 <== NOT EXECUTED 40004be8: 92 10 20 00 clr %o1 <== NOT EXECUTED i = iproc (c, tty); 40004bec: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40004bf0: 7f ff ff 82 call 400049f8 <== NOT EXECUTED 40004bf4: 92 10 00 19 mov %i1, %o1 <== NOT EXECUTED 40004bf8: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED rtems_semaphore_release (tty->osem); 40004bfc: 40 00 07 b8 call 40006adc <== NOT EXECUTED 40004c00: d0 06 60 18 ld [ %i1 + 0x18 ], %o0 <== NOT EXECUTED } else { i = iproc (c, tty); } return i; } 40004c04: 81 c7 e0 08 ret <== NOT EXECUTED 40004c08: 81 e8 00 00 restore <== NOT EXECUTED 40007268 : int _STAT_NAME( const char *path, struct stat *buf ) { 40007268: 9d e3 bf 88 save %sp, -120, %sp /* * Check to see if we were passed a valid pointer. */ if ( !buf ) 4000726c: 80 a6 60 00 cmp %i1, 0 40007270: 12 80 00 06 bne 40007288 40007274: 90 10 00 18 mov %i0, %o0 rtems_set_errno_and_return_minus_one( EFAULT ); 40007278: 40 00 71 c5 call 4002398c <__errno> 4000727c: b0 10 3f ff mov -1, %i0 40007280: 10 80 00 1c b 400072f0 40007284: 82 10 20 0e mov 0xe, %g1 status = rtems_filesystem_evaluate_path( path, 0, &loc, _STAT_FOLLOW_LINKS ); 40007288: a0 07 bf e8 add %fp, -24, %l0 4000728c: 92 10 20 00 clr %o1 40007290: 94 10 00 10 mov %l0, %o2 40007294: 96 10 20 01 mov 1, %o3 40007298: 7f ff fa 21 call 40005b1c 4000729c: b0 10 3f ff mov -1, %i0 if ( status != 0 ) 400072a0: 80 a2 20 00 cmp %o0, 0 400072a4: 12 80 00 14 bne 400072f4 400072a8: c2 07 bf ec ld [ %fp + -20 ], %g1 return -1; if ( !loc.handlers->fstat_h ){ 400072ac: c2 00 60 18 ld [ %g1 + 0x18 ], %g1 400072b0: 80 a0 60 00 cmp %g1, 0 400072b4: 12 80 00 12 bne 400072fc 400072b8: 92 10 20 00 clr %o1 rtems_filesystem_freenode( &loc ); 400072bc: c2 07 bf f0 ld [ %fp + -16 ], %g1 <== NOT EXECUTED 400072c0: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400072c4: 02 80 00 08 be 400072e4 <== NOT EXECUTED 400072c8: 01 00 00 00 nop <== NOT EXECUTED 400072cc: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 <== NOT EXECUTED 400072d0: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400072d4: 02 80 00 04 be 400072e4 <== NOT EXECUTED 400072d8: 01 00 00 00 nop <== NOT EXECUTED 400072dc: 9f c0 40 00 call %g1 <== NOT EXECUTED 400072e0: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOTSUP ); 400072e4: 40 00 71 aa call 4002398c <__errno> <== NOT EXECUTED 400072e8: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 400072ec: 82 10 20 86 mov 0x86, %g1 <== NOT EXECUTED 400072f0: c2 22 00 00 st %g1, [ %o0 ] 400072f4: 81 c7 e0 08 ret 400072f8: 81 e8 00 00 restore /* * Zero out the stat structure so the various support * versions of stat don't have to. */ memset( buf, 0, sizeof(struct stat) ); 400072fc: 94 10 20 50 mov 0x50, %o2 40007300: 40 00 78 c7 call 4002561c 40007304: 90 10 00 19 mov %i1, %o0 status = (*loc.handlers->fstat_h)( &loc, buf ); 40007308: c2 07 bf ec ld [ %fp + -20 ], %g1 4000730c: 92 10 00 19 mov %i1, %o1 40007310: c2 00 60 18 ld [ %g1 + 0x18 ], %g1 40007314: 9f c0 40 00 call %g1 40007318: 90 10 00 10 mov %l0, %o0 rtems_filesystem_freenode( &loc ); 4000731c: c2 07 bf f0 ld [ %fp + -16 ], %g1 40007320: 80 a0 60 00 cmp %g1, 0 40007324: 02 bf ff f4 be 400072f4 40007328: b0 10 00 08 mov %o0, %i0 4000732c: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 40007330: 80 a0 60 00 cmp %g1, 0 40007334: 02 80 00 04 be 40007344 40007338: 01 00 00 00 nop 4000733c: 9f c0 40 00 call %g1 40007340: 90 10 00 10 mov %l0, %o0 return status; } 40007344: 81 c7 e0 08 ret 40007348: 81 e8 00 00 restore 40005d74 : int symlink( const char *actualpath, const char *sympath ) { 40005d74: 9d e3 bf 80 save %sp, -128, %sp rtems_filesystem_location_info_t loc; int i; const char *name_start; int result; rtems_filesystem_get_start_loc( sympath, &i, &loc ); 40005d78: c2 4e 40 00 ldsb [ %i1 ], %g1 40005d7c: 80 a0 60 2f cmp %g1, 0x2f 40005d80: 02 80 00 07 be 40005d9c 40005d84: a0 10 00 18 mov %i0, %l0 40005d88: 80 a0 60 5c cmp %g1, 0x5c 40005d8c: 02 80 00 04 be 40005d9c 40005d90: 80 a0 60 00 cmp %g1, 0 40005d94: 32 80 00 0a bne,a 40005dbc 40005d98: 03 10 00 68 sethi %hi(0x4001a000), %g1 40005d9c: 03 10 00 68 sethi %hi(0x4001a000), %g1 40005da0: d2 00 60 b8 ld [ %g1 + 0xb8 ], %o1 ! 4001a0b8 40005da4: 90 07 bf e4 add %fp, -28, %o0 40005da8: 92 02 60 14 add %o1, 0x14, %o1 40005dac: 40 00 31 b0 call 4001246c 40005db0: 94 10 20 10 mov 0x10, %o2 40005db4: 10 80 00 08 b 40005dd4 40005db8: 82 10 20 01 mov 1, %g1 40005dbc: d2 00 60 b8 ld [ %g1 + 0xb8 ], %o1 40005dc0: 90 07 bf e4 add %fp, -28, %o0 40005dc4: 92 02 60 04 add %o1, 4, %o1 40005dc8: 40 00 31 a9 call 4001246c 40005dcc: 94 10 20 10 mov 0x10, %o2 40005dd0: 82 10 20 00 clr %g1 result = (*loc.ops->evalformake_h)( &sympath[i], &loc, &name_start ); 40005dd4: 90 06 40 01 add %i1, %g1, %o0 40005dd8: c2 07 bf ec ld [ %fp + -20 ], %g1 40005ddc: b2 07 bf e4 add %fp, -28, %i1 40005de0: c2 00 60 04 ld [ %g1 + 4 ], %g1 40005de4: 94 07 bf f4 add %fp, -12, %o2 40005de8: 92 10 00 19 mov %i1, %o1 40005dec: 9f c0 40 00 call %g1 40005df0: b0 10 3f ff mov -1, %i0 if ( result != 0 ) 40005df4: 80 a2 20 00 cmp %o0, 0 40005df8: 12 80 00 10 bne 40005e38 40005dfc: c2 07 bf ec ld [ %fp + -20 ], %g1 return -1; if ( !loc.ops->symlink_h ) { 40005e00: c4 00 60 38 ld [ %g1 + 0x38 ], %g2 40005e04: 80 a0 a0 00 cmp %g2, 0 40005e08: 12 80 00 0e bne 40005e40 40005e0c: d4 07 bf f4 ld [ %fp + -12 ], %o2 rtems_filesystem_freenode( &loc ); 40005e10: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 <== NOT EXECUTED 40005e14: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40005e18: 02 80 00 04 be 40005e28 <== NOT EXECUTED 40005e1c: 01 00 00 00 nop <== NOT EXECUTED 40005e20: 9f c0 40 00 call %g1 <== NOT EXECUTED 40005e24: 90 10 00 19 mov %i1, %o0 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOTSUP ); 40005e28: 40 00 2f b0 call 40011ce8 <__errno> <== NOT EXECUTED 40005e2c: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 40005e30: 82 10 20 86 mov 0x86, %g1 <== NOT EXECUTED 40005e34: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 40005e38: 81 c7 e0 08 ret 40005e3c: 81 e8 00 00 restore } result = (*loc.ops->symlink_h)( &loc, actualpath, name_start); 40005e40: 92 10 00 10 mov %l0, %o1 40005e44: 9f c0 80 00 call %g2 40005e48: 90 10 00 19 mov %i1, %o0 rtems_filesystem_freenode( &loc ); 40005e4c: c2 07 bf ec ld [ %fp + -20 ], %g1 40005e50: 80 a0 60 00 cmp %g1, 0 40005e54: 02 bf ff f9 be 40005e38 40005e58: b0 10 00 08 mov %o0, %i0 40005e5c: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 40005e60: 80 a0 60 00 cmp %g1, 0 40005e64: 02 80 00 04 be 40005e74 40005e68: 01 00 00 00 nop 40005e6c: 9f c0 40 00 call %g1 40005e70: 90 10 00 19 mov %i1, %o0 return result; } 40005e74: 81 c7 e0 08 ret 40005e78: 81 e8 00 00 restore 40013144 : int tcgetattr( int fd, struct termios *tp ) { 40013144: 94 10 00 09 mov %o1, %o2 <== NOT EXECUTED return ioctl( fd, RTEMS_IO_GET_ATTRIBUTES, tp ); 40013148: 92 10 20 01 mov 1, %o1 <== NOT EXECUTED 4001314c: 82 13 c0 00 mov %o7, %g1 <== NOT EXECUTED 40013150: 40 00 0e f4 call 40016d20 <== NOT EXECUTED 40013154: 9e 10 40 00 mov %g1, %o7 <== NOT EXECUTED 40013158: 01 00 00 00 nop 4001315c : int tcsetattr( int fd, int opt, struct termios *tp ) { 4001315c: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED switch (opt) { 40013160: 80 a6 60 00 cmp %i1, 0 <== NOT EXECUTED 40013164: 02 80 00 10 be 400131a4 <== NOT EXECUTED 40013168: 80 a6 60 01 cmp %i1, 1 <== NOT EXECUTED 4001316c: 02 80 00 08 be 4001318c <== NOT EXECUTED 40013170: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED default: rtems_set_errno_and_return_minus_one( ENOTSUP ); 40013174: 40 00 11 5d call 400176e8 <__errno> <== NOT EXECUTED 40013178: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 4001317c: 82 10 20 86 mov 0x86, %g1 <== NOT EXECUTED 40013180: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 40013184: 81 c7 e0 08 ret <== NOT EXECUTED 40013188: 81 e8 00 00 restore <== NOT EXECUTED case TCSADRAIN: if (ioctl( fd, RTEMS_IO_TCDRAIN, NULL ) < 0) 4001318c: 92 10 20 03 mov 3, %o1 <== NOT EXECUTED 40013190: 40 00 0e e4 call 40016d20 <== NOT EXECUTED 40013194: 94 10 20 00 clr %o2 <== NOT EXECUTED 40013198: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 4001319c: 26 80 00 04 bl,a 400131ac <== NOT EXECUTED 400131a0: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED return -1; /* * Fall through to.... */ case TCSANOW: return ioctl( fd, RTEMS_IO_SET_ATTRIBUTES, tp ); 400131a4: 40 00 0e df call 40016d20 <== NOT EXECUTED 400131a8: 93 e8 20 02 restore %g0, 2, %o1 <== NOT EXECUTED } } 400131ac: 81 c7 e0 08 ret <== NOT EXECUTED 400131b0: 81 e8 00 00 restore <== NOT EXECUTED 400064d4 : #include long telldir( DIR *dirp ) { 400064d4: 9d e3 bf 98 save %sp, -104, %sp rtems_libio_t *iop; if ( !dirp ) 400064d8: 80 a6 20 00 cmp %i0, 0 400064dc: 32 80 00 08 bne,a 400064fc 400064e0: f0 06 00 00 ld [ %i0 ], %i0 rtems_set_errno_and_return_minus_one( EBADF ); 400064e4: 40 00 2f 05 call 400120f8 <__errno> <== NOT EXECUTED 400064e8: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 400064ec: 82 10 20 09 mov 9, %g1 <== NOT EXECUTED 400064f0: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 400064f4: 81 c7 e0 08 ret 400064f8: 81 e8 00 00 restore /* * Get the file control block structure associated with the * file descriptor */ iop = rtems_libio_iop( dirp->dd_fd ); 400064fc: 03 10 00 64 sethi %hi(0x40019000), %g1 40006500: c2 00 63 ec ld [ %g1 + 0x3ec ], %g1 ! 400193ec 40006504: 80 a6 00 01 cmp %i0, %g1 40006508: 1a 80 00 0b bcc 40006534 4000650c: 03 10 00 69 sethi %hi(0x4001a400), %g1 40006510: c6 00 62 f4 ld [ %g1 + 0x2f4 ], %g3 ! 4001a6f4 40006514: 85 2e 20 02 sll %i0, 2, %g2 40006518: 83 2e 20 04 sll %i0, 4, %g1 4000651c: 82 20 40 02 sub %g1, %g2, %g1 40006520: 82 00 40 18 add %g1, %i0, %g1 40006524: 83 28 60 02 sll %g1, 2, %g1 if (iop == NULL) 40006528: 82 80 40 03 addcc %g1, %g3, %g1 4000652c: 32 bf ff f2 bne,a 400064f4 40006530: f0 00 60 08 ld [ %g1 + 8 ], %i0 assert(0); 40006534: 11 10 00 62 sethi %hi(0x40018800), %o0 <== NOT EXECUTED 40006538: 92 10 20 2c mov 0x2c, %o1 <== NOT EXECUTED 4000653c: 90 12 21 28 or %o0, 0x128, %o0 <== NOT EXECUTED 40006540: 15 10 00 61 sethi %hi(0x40018400), %o2 <== NOT EXECUTED 40006544: 7f ff f7 3d call 40004238 <__assert> <== NOT EXECUTED 40006548: 94 12 a2 50 or %o2, 0x250, %o2 ! 40018650 <== NOT EXECUTED 4000654c: 82 10 20 00 clr %g1 <== NOT EXECUTED return (long)( iop->offset ); 40006550: f0 00 60 08 ld [ %g1 + 8 ], %i0 <== NOT EXECUTED } 40006554: 81 c7 e0 08 ret <== NOT EXECUTED 40006558: 81 e8 00 00 restore <== NOT EXECUTED 4000c03c : int timer_create( clockid_t clock_id, struct sigevent *evp, timer_t *timerid ) { 4000c03c: 9d e3 bf 98 save %sp, -104, %sp POSIX_Timer_Control *ptimer; if ( clock_id != CLOCK_REALTIME ) 4000c040: 80 a6 20 01 cmp %i0, 1 4000c044: 12 80 00 11 bne 4000c088 4000c048: 80 a6 60 00 cmp %i1, 0 /* * The data of the structure evp are checked in order to verify if they * are coherent. */ if (evp != NULL) { 4000c04c: 02 80 00 13 be 4000c098 4000c050: 05 10 00 97 sethi %hi(0x40025c00), %g2 /* The structure has data */ if ( ( evp->sigev_notify != SIGEV_NONE ) && 4000c054: c2 06 40 00 ld [ %i1 ], %g1 4000c058: 82 00 7f ff add %g1, -1, %g1 4000c05c: 80 a0 60 01 cmp %g1, 1 4000c060: 18 80 00 0a bgu 4000c088 4000c064: 01 00 00 00 nop ( 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 ) 4000c068: c2 06 60 04 ld [ %i1 + 4 ], %g1 4000c06c: 80 a0 60 00 cmp %g1, 0 4000c070: 02 80 00 06 be 4000c088 4000c074: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( EINVAL ); if ( !is_valid_signo(evp->sigev_signo) ) 4000c078: 82 00 7f ff add %g1, -1, %g1 4000c07c: 80 a0 60 1f cmp %g1, 0x1f 4000c080: 08 80 00 06 bleu 4000c098 4000c084: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( EINVAL ); 4000c088: 40 00 28 3a call 40016170 <__errno> <== NOT EXECUTED 4000c08c: 01 00 00 00 nop <== NOT EXECUTED 4000c090: 10 80 00 10 b 4000c0d0 <== NOT EXECUTED 4000c094: 82 10 20 16 mov 0x16, %g1 ! 16 <== NOT EXECUTED rtems_fatal_error_occurred( 99 ); } } #endif _Thread_Dispatch_disable_level += 1; 4000c098: c2 00 a0 40 ld [ %g2 + 0x40 ], %g1 4000c09c: 82 00 60 01 inc %g1 4000c0a0: c2 20 a0 40 st %g1, [ %g2 + 0x40 ] * 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 ); 4000c0a4: 21 10 00 98 sethi %hi(0x40026000), %l0 4000c0a8: 40 00 0a b7 call 4000eb84 <_Objects_Allocate> 4000c0ac: 90 14 20 0c or %l0, 0xc, %o0 ! 4002600c <_POSIX_Timer_Information> /* * Allocate a timer */ ptimer = _POSIX_Timer_Allocate(); if ( !ptimer ) { 4000c0b0: b0 92 20 00 orcc %o0, 0, %i0 4000c0b4: 12 80 00 0a bne 4000c0dc 4000c0b8: 82 10 20 02 mov 2, %g1 _Thread_Enable_dispatch(); 4000c0bc: 7f ff fe d1 call 4000bc00 <_Thread_Enable_dispatch> <== NOT EXECUTED 4000c0c0: 01 00 00 00 nop <== NOT EXECUTED rtems_set_errno_and_return_minus_one( EAGAIN ); 4000c0c4: 40 00 28 2b call 40016170 <__errno> <== NOT EXECUTED 4000c0c8: 01 00 00 00 nop <== NOT EXECUTED 4000c0cc: 82 10 20 0b mov 0xb, %g1 ! b <== NOT EXECUTED 4000c0d0: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 4000c0d4: 81 c7 e0 08 ret <== NOT EXECUTED 4000c0d8: 91 e8 3f ff restore %g0, -1, %o0 <== NOT EXECUTED } /* The data of the created timer are stored to use them later */ ptimer->state = POSIX_TIMER_STATE_CREATE_NEW; 4000c0dc: c2 2e 20 3c stb %g1, [ %i0 + 0x3c ] ptimer->thread_id = _Thread_Executing->Object.id; 4000c0e0: 03 10 00 97 sethi %hi(0x40025c00), %g1 4000c0e4: c2 00 61 1c ld [ %g1 + 0x11c ], %g1 ! 40025d1c <_Thread_Executing> if ( evp != NULL ) { 4000c0e8: 80 a6 60 00 cmp %i1, 0 } /* The data of the created timer are stored to use them later */ ptimer->state = POSIX_TIMER_STATE_CREATE_NEW; ptimer->thread_id = _Thread_Executing->Object.id; 4000c0ec: c2 00 60 08 ld [ %g1 + 8 ], %g1 if ( evp != NULL ) { 4000c0f0: 02 80 00 08 be 4000c110 4000c0f4: c2 26 20 38 st %g1, [ %i0 + 0x38 ] ptimer->inf.sigev_notify = evp->sigev_notify; ptimer->inf.sigev_signo = evp->sigev_signo; ptimer->inf.sigev_value = evp->sigev_value; 4000c0f8: c2 06 60 08 ld [ %i1 + 8 ], %g1 ptimer->state = POSIX_TIMER_STATE_CREATE_NEW; ptimer->thread_id = _Thread_Executing->Object.id; if ( evp != NULL ) { ptimer->inf.sigev_notify = evp->sigev_notify; 4000c0fc: c4 06 40 00 ld [ %i1 ], %g2 ptimer->inf.sigev_signo = evp->sigev_signo; 4000c100: c6 06 60 04 ld [ %i1 + 4 ], %g3 ptimer->state = POSIX_TIMER_STATE_CREATE_NEW; ptimer->thread_id = _Thread_Executing->Object.id; if ( evp != NULL ) { ptimer->inf.sigev_notify = evp->sigev_notify; 4000c104: c4 26 20 40 st %g2, [ %i0 + 0x40 ] ptimer->inf.sigev_signo = evp->sigev_signo; 4000c108: c6 26 20 44 st %g3, [ %i0 + 0x44 ] ptimer->inf.sigev_value = evp->sigev_value; 4000c10c: c2 26 20 48 st %g1, [ %i0 + 0x48 ] ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, the_object ); 4000c110: c2 06 20 08 ld [ %i0 + 8 ], %g1 4000c114: 94 10 00 18 mov %i0, %o2 4000c118: 90 14 20 0c or %l0, 0xc, %o0 } ptimer->overrun = 0; 4000c11c: c0 26 20 68 clr [ %i0 + 0x68 ] ptimer->timer_data.it_value.tv_sec = 0; 4000c120: c0 26 20 5c clr [ %i0 + 0x5c ] ptimer->timer_data.it_value.tv_nsec = 0; 4000c124: c0 26 20 60 clr [ %i0 + 0x60 ] ptimer->timer_data.it_interval.tv_sec = 0; 4000c128: c0 26 20 54 clr [ %i0 + 0x54 ] ptimer->timer_data.it_interval.tv_nsec = 0; 4000c12c: c0 26 20 58 clr [ %i0 + 0x58 ] Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 4000c130: c0 26 20 18 clr [ %i0 + 0x18 ] the_watchdog->routine = routine; 4000c134: c0 26 20 2c clr [ %i0 + 0x2c ] the_watchdog->id = id; 4000c138: c0 26 20 30 clr [ %i0 + 0x30 ] the_watchdog->user_data = user_data; 4000c13c: c0 26 20 34 clr [ %i0 + 0x34 ] 4000c140: 13 00 00 3f sethi %hi(0xfc00), %o1 4000c144: 92 12 63 ff or %o1, 0x3ff, %o1 ! ffff 4000c148: 7f ff fe 9c call 4000bbb8 <_Objects_Set_local_object> 4000c14c: 92 08 40 09 and %g1, %o1, %o1 _Watchdog_Initialize( &ptimer->Timer, NULL, 0, NULL ); _Objects_Open(&_POSIX_Timer_Information, &ptimer->Object, (Objects_Name) 0); *timerid = ptimer->Object.id; 4000c150: c2 06 20 08 ld [ %i0 + 8 ], %g1 if ( information->is_string ) /* _Objects_Copy_name_string( name, the_object->name ); */ the_object->name = name; else /* _Objects_Copy_name_raw( name, the_object->name, information->name_length ); */ the_object->name = name; 4000c154: c0 26 20 0c clr [ %i0 + 0xc ] 4000c158: c2 26 80 00 st %g1, [ %i2 ] _Thread_Enable_dispatch(); 4000c15c: 7f ff fe a9 call 4000bc00 <_Thread_Enable_dispatch> 4000c160: b0 10 20 00 clr %i0 return 0; } 4000c164: 81 c7 e0 08 ret 4000c168: 81 e8 00 00 restore 4000bd08 : */ int timer_delete( timer_t timerid ) { 4000bd08: 9d e3 bf 90 save %sp, -112, %sp <== NOT EXECUTED * because rtems_timer_delete stops the timer before deleting it. */ POSIX_Timer_Control *ptimer; Objects_Locations location; ptimer = _POSIX_Timer_Get( timerid, &location ); 4000bd0c: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 4000bd10: 7f ff ff b4 call 4000bbe0 <_POSIX_Timer_Get> <== NOT EXECUTED 4000bd14: 92 07 bf f4 add %fp, -12, %o1 <== NOT EXECUTED switch ( location ) { 4000bd18: c2 07 bf f4 ld [ %fp + -12 ], %g1 <== NOT EXECUTED 4000bd1c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000bd20: 02 80 00 0b be 4000bd4c <== NOT EXECUTED 4000bd24: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED 4000bd28: 80 a0 60 02 cmp %g1, 2 <== NOT EXECUTED 4000bd2c: 18 80 00 06 bgu 4000bd44 <== NOT EXECUTED 4000bd30: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED _Thread_Dispatch(); rtems_set_errno_and_return_minus_one( EINVAL ); #endif case OBJECTS_ERROR: rtems_set_errno_and_return_minus_one( EINVAL ); 4000bd34: 40 00 29 0f call 40016170 <__errno> <== NOT EXECUTED 4000bd38: 01 00 00 00 nop <== NOT EXECUTED 4000bd3c: 82 10 20 16 mov 0x16, %g1 ! 16 <== NOT EXECUTED 4000bd40: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 4000bd44: 81 c7 e0 08 ret <== NOT EXECUTED 4000bd48: 81 e8 00 00 restore <== NOT EXECUTED ) { uint32_t index; index = _Objects_Get_index( the_object->id ); _Objects_Set_local_object( information, index, NULL ); 4000bd4c: c2 02 20 08 ld [ %o0 + 8 ], %g1 <== NOT EXECUTED 4000bd50: 94 10 20 00 clr %o2 <== NOT EXECUTED 4000bd54: 21 10 00 98 sethi %hi(0x40026000), %l0 <== NOT EXECUTED 4000bd58: 13 00 00 3f sethi %hi(0xfc00), %o1 <== NOT EXECUTED 4000bd5c: 90 14 20 0c or %l0, 0xc, %o0 <== NOT EXECUTED 4000bd60: 92 12 63 ff or %o1, 0x3ff, %o1 <== NOT EXECUTED 4000bd64: 7f ff ff 95 call 4000bbb8 <_Objects_Set_local_object> <== NOT EXECUTED 4000bd68: 92 08 40 09 and %g1, %o1, %o1 <== NOT EXECUTED case OBJECTS_LOCAL: _Objects_Close( &_POSIX_Timer_Information, &ptimer->Object ); ptimer->state = POSIX_TIMER_STATE_FREE; 4000bd6c: 82 10 20 01 mov 1, %g1 <== NOT EXECUTED /* _Objects_Clear_name( the_object->name, information->name_length ); */ the_object->name = 0; 4000bd70: c0 26 20 0c clr [ %i0 + 0xc ] <== NOT EXECUTED 4000bd74: c2 2e 20 3c stb %g1, [ %i0 + 0x3c ] <== NOT EXECUTED (void) _Watchdog_Remove( &ptimer->Timer ); 4000bd78: 40 00 16 fe call 40011970 <_Watchdog_Remove> <== NOT EXECUTED 4000bd7c: 90 06 20 10 add %i0, 0x10, %o0 <== NOT EXECUTED RTEMS_INLINE_ROUTINE void _POSIX_Timer_Free ( POSIX_Timer_Control *the_timer ) { _Objects_Free( &_POSIX_Timer_Information, &the_timer->Object ); 4000bd80: 92 10 00 18 mov %i0, %o1 <== NOT EXECUTED 4000bd84: 90 14 20 0c or %l0, 0xc, %o0 <== NOT EXECUTED 4000bd88: 40 00 0c 81 call 4000ef8c <_Objects_Free> <== NOT EXECUTED 4000bd8c: b0 10 20 00 clr %i0 <== NOT EXECUTED _POSIX_Timer_Free( ptimer ); _Thread_Enable_dispatch(); 4000bd90: 7f ff ff 9c call 4000bc00 <_Thread_Enable_dispatch> <== NOT EXECUTED 4000bd94: 01 00 00 00 nop <== NOT EXECUTED return 0; } return -1; /* unreached - only to remove warnings */ } 4000bd98: 81 c7 e0 08 ret <== NOT EXECUTED 4000bd9c: 81 e8 00 00 restore <== NOT EXECUTED 4000bc34 : */ int timer_getoverrun( timer_t timerid ) { 4000bc34: 9d e3 bf 90 save %sp, -112, %sp <== NOT EXECUTED int overrun; POSIX_Timer_Control *ptimer; Objects_Locations location; ptimer = _POSIX_Timer_Get( timerid, &location ); 4000bc38: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 4000bc3c: 7f ff ff e9 call 4000bbe0 <_POSIX_Timer_Get> <== NOT EXECUTED 4000bc40: 92 07 bf f4 add %fp, -12, %o1 <== NOT EXECUTED switch ( location ) { 4000bc44: c2 07 bf f4 ld [ %fp + -12 ], %g1 <== NOT EXECUTED 4000bc48: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000bc4c: 22 80 00 0b be,a 4000bc78 <== NOT EXECUTED 4000bc50: f0 02 20 68 ld [ %o0 + 0x68 ], %i0 <== NOT EXECUTED 4000bc54: 80 a0 60 02 cmp %g1, 2 <== NOT EXECUTED 4000bc58: 18 80 00 06 bgu 4000bc70 <== NOT EXECUTED 4000bc5c: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED _Thread_Dispatch(); rtems_set_errno_and_return_minus_one( EINVAL ); #endif case OBJECTS_ERROR: rtems_set_errno_and_return_minus_one( EINVAL ); 4000bc60: 40 00 29 44 call 40016170 <__errno> <== NOT EXECUTED 4000bc64: 01 00 00 00 nop <== NOT EXECUTED 4000bc68: 82 10 20 16 mov 0x16, %g1 ! 16 <== NOT EXECUTED 4000bc6c: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 4000bc70: 81 c7 e0 08 ret <== NOT EXECUTED 4000bc74: 81 e8 00 00 restore <== NOT EXECUTED case OBJECTS_LOCAL: overrun = ptimer->overrun; ptimer->overrun = 0; _Thread_Enable_dispatch(); 4000bc78: 7f ff ff e2 call 4000bc00 <_Thread_Enable_dispatch> <== NOT EXECUTED 4000bc7c: c0 22 20 68 clr [ %o0 + 0x68 ] <== NOT EXECUTED return overrun; } return -1; /* unreached - only to remove warnings */ } 4000bc80: 81 c7 e0 08 ret <== NOT EXECUTED 4000bc84: 81 e8 00 00 restore <== NOT EXECUTED 4000bc88 : int timer_gettime( timer_t timerid, struct itimerspec *value ) { 4000bc88: 9d e3 bf 88 save %sp, -120, %sp <== NOT EXECUTED POSIX_Timer_Control *ptimer; Objects_Locations location; struct timespec current_time; /* Reads the current time */ _TOD_Get( ¤t_time ); 4000bc8c: a0 07 bf ec add %fp, -20, %l0 <== NOT EXECUTED 4000bc90: 40 00 0a 02 call 4000e498 <_TOD_Get> <== NOT EXECUTED 4000bc94: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED ptimer = _POSIX_Timer_Get( timerid, &location ); 4000bc98: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 4000bc9c: 7f ff ff d1 call 4000bbe0 <_POSIX_Timer_Get> <== NOT EXECUTED 4000bca0: 92 07 bf f4 add %fp, -12, %o1 <== NOT EXECUTED switch ( location ) { 4000bca4: c2 07 bf f4 ld [ %fp + -12 ], %g1 <== NOT EXECUTED 4000bca8: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000bcac: 02 80 00 0b be 4000bcd8 <== NOT EXECUTED 4000bcb0: b0 10 00 08 mov %o0, %i0 <== NOT EXECUTED 4000bcb4: 80 a0 60 02 cmp %g1, 2 <== NOT EXECUTED 4000bcb8: 18 80 00 06 bgu 4000bcd0 <== NOT EXECUTED 4000bcbc: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED _Thread_Dispatch(); rtems_set_errno_and_return_minus_one( EINVAL ); #endif case OBJECTS_ERROR: rtems_set_errno_and_return_minus_one( EINVAL ); 4000bcc0: 40 00 29 2c call 40016170 <__errno> <== NOT EXECUTED 4000bcc4: 01 00 00 00 nop <== NOT EXECUTED 4000bcc8: 82 10 20 16 mov 0x16, %g1 ! 16 <== NOT EXECUTED 4000bccc: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 4000bcd0: 81 c7 e0 08 ret <== NOT EXECUTED 4000bcd4: 81 e8 00 00 restore <== NOT EXECUTED case OBJECTS_LOCAL: /* Calculates the time left before the timer finishes */ _Timespec_Subtract( 4000bcd8: 92 10 00 10 mov %l0, %o1 <== NOT EXECUTED 4000bcdc: 90 02 20 5c add %o0, 0x5c, %o0 <== NOT EXECUTED 4000bce0: 40 00 15 e7 call 4001147c <_Timespec_Subtract> <== NOT EXECUTED 4000bce4: 94 06 60 08 add %i1, 8, %o2 <== NOT EXECUTED &ptimer->timer_data.it_value, ¤t_time, &value->it_value ); value->it_interval = ptimer->timer_data.it_interval; 4000bce8: c2 06 20 54 ld [ %i0 + 0x54 ], %g1 <== NOT EXECUTED 4000bcec: c2 26 40 00 st %g1, [ %i1 ] <== NOT EXECUTED 4000bcf0: c2 06 20 58 ld [ %i0 + 0x58 ], %g1 <== NOT EXECUTED _Thread_Enable_dispatch(); 4000bcf4: b0 10 20 00 clr %i0 <== NOT EXECUTED 4000bcf8: 7f ff ff c2 call 4000bc00 <_Thread_Enable_dispatch> <== NOT EXECUTED 4000bcfc: c2 26 60 04 st %g1, [ %i1 + 4 ] <== NOT EXECUTED return 0; } return -1; /* unreached - only to remove warnings */ } 4000bd00: 81 c7 e0 08 ret <== NOT EXECUTED 4000bd04: 81 e8 00 00 restore <== NOT EXECUTED 4000be0c : timer_t timerid, int flags, const struct itimerspec *value, struct itimerspec *ovalue ) { 4000be0c: 9d e3 bf 90 save %sp, -112, %sp POSIX_Timer_Control *ptimer; Objects_Locations location; boolean activated; if ( value == NULL ) { 4000be10: 80 a6 a0 00 cmp %i2, 0 4000be14: 02 80 00 0c be 4000be44 4000be18: 90 10 00 18 mov %i0, %o0 rtems_set_errno_and_return_minus_one( EINVAL ); } /* First, it verifies if the structure "value" is correct */ if ( ( value->it_value.tv_nsec > TOD_NANOSECONDS_PER_SECOND ) || 4000be1c: c4 06 a0 0c ld [ %i2 + 0xc ], %g2 4000be20: 03 0e e6 b2 sethi %hi(0x3b9ac800), %g1 4000be24: 82 10 62 00 or %g1, 0x200, %g1 ! 3b9aca00 4000be28: 80 a0 80 01 cmp %g2, %g1 4000be2c: 18 80 00 06 bgu 4000be44 4000be30: 80 a6 60 04 cmp %i1, 4 rtems_set_errno_and_return_minus_one( EINVAL ); } /* XXX check for seconds in the past */ if ( flags != TIMER_ABSTIME && flags != POSIX_TIMER_RELATIVE ) { 4000be34: 02 80 00 0a be 4000be5c 4000be38: 80 a6 60 00 cmp %i1, 0 4000be3c: 02 80 00 08 be 4000be5c 4000be40: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( EINVAL ); 4000be44: 40 00 28 cb call 40016170 <__errno> <== NOT EXECUTED 4000be48: b0 10 3f ff mov -1, %i0 ! ffffffff <== NOT EXECUTED 4000be4c: 82 10 20 16 mov 0x16, %g1 <== NOT EXECUTED 4000be50: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 4000be54: 81 c7 e0 08 ret <== NOT EXECUTED 4000be58: 81 e8 00 00 restore <== NOT EXECUTED /* If the function reaches this point, then it will be necessary to do * something with the structure of times of the timer: to stop, start * or start it again */ ptimer = _POSIX_Timer_Get( timerid, &location ); 4000be5c: 7f ff ff 61 call 4000bbe0 <_POSIX_Timer_Get> 4000be60: 92 07 bf f4 add %fp, -12, %o1 switch ( location ) { 4000be64: c2 07 bf f4 ld [ %fp + -12 ], %g1 /* If the function reaches this point, then it will be necessary to do * something with the structure of times of the timer: to stop, start * or start it again */ ptimer = _POSIX_Timer_Get( timerid, &location ); 4000be68: a0 10 00 08 mov %o0, %l0 switch ( location ) { 4000be6c: 80 a0 60 00 cmp %g1, 0 4000be70: 12 bf ff f9 bne 4000be54 4000be74: b0 10 3f ff mov -1, %i0 case OBJECTS_ERROR: return -1; case OBJECTS_LOCAL: /* First, it verifies if the timer must be stopped */ if ( value->it_value.tv_sec == 0 && value->it_value.tv_nsec == 0 ) { 4000be78: c2 06 a0 08 ld [ %i2 + 8 ], %g1 4000be7c: 80 a0 60 00 cmp %g1, 0 4000be80: 12 80 00 15 bne 4000bed4 4000be84: 80 a6 60 00 cmp %i1, 0 4000be88: c2 06 a0 0c ld [ %i2 + 0xc ], %g1 <== NOT EXECUTED 4000be8c: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000be90: 12 80 00 11 bne 4000bed4 <== NOT EXECUTED 4000be94: 80 a6 60 00 cmp %i1, 0 <== NOT EXECUTED /* Stop the timer */ (void) _Watchdog_Remove( &ptimer->Timer ); 4000be98: 40 00 16 b6 call 40011970 <_Watchdog_Remove> <== NOT EXECUTED 4000be9c: 90 02 20 10 add %o0, 0x10, %o0 <== NOT EXECUTED /* The old data of the timer are returned */ if ( ovalue ) 4000bea0: 80 a6 e0 00 cmp %i3, 0 <== NOT EXECUTED 4000bea4: 02 80 00 05 be 4000beb8 <== NOT EXECUTED 4000bea8: 90 10 00 1b mov %i3, %o0 <== NOT EXECUTED *ovalue = ptimer->timer_data; 4000beac: 92 04 20 54 add %l0, 0x54, %o1 <== NOT EXECUTED 4000beb0: 40 00 2a 96 call 40016908 <== NOT EXECUTED 4000beb4: 94 10 20 10 mov 0x10, %o2 <== NOT EXECUTED /* The new data are set */ ptimer->timer_data = *value; 4000beb8: 92 10 00 1a mov %i2, %o1 <== NOT EXECUTED 4000bebc: 94 10 20 10 mov 0x10, %o2 <== NOT EXECUTED 4000bec0: 40 00 2a 92 call 40016908 <== NOT EXECUTED 4000bec4: 90 04 20 54 add %l0, 0x54, %o0 <== NOT EXECUTED /* Indicates that the timer is created and stopped */ ptimer->state = POSIX_TIMER_STATE_CREATE_STOP; 4000bec8: 82 10 20 04 mov 4, %g1 <== NOT EXECUTED 4000becc: 10 80 00 31 b 4000bf90 <== NOT EXECUTED 4000bed0: c2 2c 20 3c stb %g1, [ %l0 + 0x3c ] <== NOT EXECUTED _Thread_Enable_dispatch(); return 0; } /* absolute or relative? */ switch (flags) { 4000bed4: 02 80 00 15 be 4000bf28 4000bed8: 80 a6 60 04 cmp %i1, 4 4000bedc: 12 80 00 31 bne 4000bfa0 <== NOT EXECUTED 4000bee0: 11 10 00 97 sethi %hi(0x40025c00), %o0 <== NOT EXECUTED case TIMER_ABSTIME: /* The fire time is absolute: use "rtems_time_fire_when" */ /* First, it converts from struct itimerspec to rtems_time_of_day */ _Watchdog_Initialize( 4000bee4: c2 04 20 08 ld [ %l0 + 8 ], %g1 <== NOT EXECUTED Watchdog_Service_routine_entry routine, Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; 4000bee8: c0 24 20 18 clr [ %l0 + 0x18 ] <== NOT EXECUTED the_watchdog->routine = routine; the_watchdog->id = id; 4000beec: c2 24 20 30 st %g1, [ %l0 + 0x30 ] <== NOT EXECUTED Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 4000bef0: 03 10 00 97 sethi %hi(0x40025c00), %g1 <== NOT EXECUTED 4000bef4: c4 00 60 f8 ld [ %g1 + 0xf8 ], %g2 ! 40025cf8 <_TOD_Now> <== NOT EXECUTED 4000bef8: c2 06 a0 08 ld [ %i2 + 8 ], %g1 <== NOT EXECUTED ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; the_watchdog->id = id; the_watchdog->user_data = user_data; 4000befc: e0 24 20 34 st %l0, [ %l0 + 0x34 ] <== NOT EXECUTED Watchdog_Control *the_watchdog, Watchdog_Interval units ) { the_watchdog->initial = units; 4000bf00: 82 20 40 02 sub %g1, %g2, %g1 <== NOT EXECUTED 4000bf04: c2 24 20 1c st %g1, [ %l0 + 0x1c ] <== NOT EXECUTED Objects_Id id, void *user_data ) { the_watchdog->state = WATCHDOG_INACTIVE; the_watchdog->routine = routine; 4000bf08: 03 10 00 2f sethi %hi(0x4000bc00), %g1 <== NOT EXECUTED 4000bf0c: 82 10 63 c0 or %g1, 0x3c0, %g1 ! 4000bfc0 <_POSIX_Timer_TSR> <== NOT EXECUTED 4000bf10: c2 24 20 2c st %g1, [ %l0 + 0x2c ] <== NOT EXECUTED ) { the_watchdog->initial = units; _Watchdog_Insert( &_Watchdog_Seconds_chain, the_watchdog ); 4000bf14: 90 12 21 30 or %o0, 0x130, %o0 <== NOT EXECUTED 4000bf18: 40 00 16 3e call 40011810 <_Watchdog_Insert> <== NOT EXECUTED 4000bf1c: 92 04 20 10 add %l0, 0x10, %o1 <== NOT EXECUTED return 0; } /* The timer has been started and is running */ /* return the old ones in "ovalue" */ if ( ovalue ) 4000bf20: 10 80 00 0f b 4000bf5c <== NOT EXECUTED 4000bf24: 80 a6 e0 00 cmp %i3, 0 <== NOT EXECUTED break; /* The fire time is relative: use "rtems_time_fire_after" */ case POSIX_TIMER_RELATIVE: /* First, convert from seconds and nanoseconds to ticks */ ptimer->ticks = _Timespec_To_ticks( &value->it_value ); 4000bf28: 40 00 15 69 call 400114cc <_Timespec_To_ticks> 4000bf2c: 90 06 a0 08 add %i2, 8, %o0 activated = _Watchdog_Insert_ticks_helper( 4000bf30: d4 04 20 08 ld [ %l0 + 8 ], %o2 break; /* The fire time is relative: use "rtems_time_fire_after" */ case POSIX_TIMER_RELATIVE: /* First, convert from seconds and nanoseconds to ticks */ ptimer->ticks = _Timespec_To_ticks( &value->it_value ); 4000bf34: 92 10 00 08 mov %o0, %o1 4000bf38: d0 24 20 64 st %o0, [ %l0 + 0x64 ] activated = _Watchdog_Insert_ticks_helper( 4000bf3c: 17 10 00 2f sethi %hi(0x4000bc00), %o3 4000bf40: 90 04 20 10 add %l0, 0x10, %o0 4000bf44: 96 12 e3 c0 or %o3, 0x3c0, %o3 4000bf48: 7f ff ff 96 call 4000bda0 <_Watchdog_Insert_ticks_helper> 4000bf4c: 98 10 00 10 mov %l0, %o4 ptimer->ticks, ptimer->Object.id, _POSIX_Timer_TSR, ptimer ); if ( !activated ) { 4000bf50: 80 a2 20 00 cmp %o0, 0 4000bf54: 02 80 00 0f be 4000bf90 4000bf58: 80 a6 e0 00 cmp %i3, 0 return 0; } /* The timer has been started and is running */ /* return the old ones in "ovalue" */ if ( ovalue ) 4000bf5c: 02 80 00 05 be 4000bf70 4000bf60: 90 10 00 1b mov %i3, %o0 *ovalue = ptimer->timer_data; 4000bf64: 92 04 20 54 add %l0, 0x54, %o1 <== NOT EXECUTED 4000bf68: 40 00 2a 68 call 40016908 <== NOT EXECUTED 4000bf6c: 94 10 20 10 mov 0x10, %o2 <== NOT EXECUTED ptimer->timer_data = *value; 4000bf70: 92 10 00 1a mov %i2, %o1 4000bf74: 94 10 20 10 mov 0x10, %o2 4000bf78: 40 00 2a 64 call 40016908 4000bf7c: 90 04 20 54 add %l0, 0x54, %o0 /* Indicate that the time is running */ ptimer->state = POSIX_TIMER_STATE_CREATE_RUN; 4000bf80: 82 10 20 03 mov 3, %g1 _TOD_Get( &ptimer->time ); 4000bf84: 90 04 20 6c add %l0, 0x6c, %o0 4000bf88: 40 00 09 44 call 4000e498 <_TOD_Get> 4000bf8c: c2 2c 20 3c stb %g1, [ %l0 + 0x3c ] _Thread_Enable_dispatch(); 4000bf90: 7f ff ff 1c call 4000bc00 <_Thread_Enable_dispatch> 4000bf94: b0 10 20 00 clr %i0 4000bf98: 81 c7 e0 08 ret 4000bf9c: 81 e8 00 00 restore return 0; } _Thread_Enable_dispatch(); 4000bfa0: 7f ff ff 18 call 4000bc00 <_Thread_Enable_dispatch> <== NOT EXECUTED 4000bfa4: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( EINVAL ); 4000bfa8: 40 00 28 72 call 40016170 <__errno> <== NOT EXECUTED 4000bfac: 01 00 00 00 nop <== NOT EXECUTED 4000bfb0: 82 10 20 16 mov 0x16, %g1 ! 16 <== NOT EXECUTED 4000bfb4: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED } return -1; /* unreached - only to remove warnings */ } 4000bfb8: 81 c7 e0 08 ret <== NOT EXECUTED 4000bfbc: 81 e8 00 00 restore <== NOT EXECUTED 4001889c : */ char *ttyname( int fd ) { 4001889c: 9d e3 bf 98 save %sp, -104, %sp <== NOT EXECUTED if ( !ttyname_r( fd, ttyname_buf, sizeof(ttyname_buf) ) ) 400188a0: 21 10 00 e7 sethi %hi(0x40039c00), %l0 <== NOT EXECUTED 400188a4: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 400188a8: 94 10 24 06 mov 0x406, %o2 <== NOT EXECUTED 400188ac: 92 14 20 30 or %l0, 0x30, %o1 <== NOT EXECUTED 400188b0: 7f ff ff ba call 40018798 <== NOT EXECUTED 400188b4: b0 14 20 30 or %l0, 0x30, %i0 <== NOT EXECUTED 400188b8: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400188bc: 32 80 00 02 bne,a 400188c4 <== NOT EXECUTED 400188c0: b0 10 20 00 clr %i0 <== NOT EXECUTED return ttyname_buf; return NULL; } 400188c4: 81 c7 e0 08 ret <== NOT EXECUTED 400188c8: 81 e8 00 00 restore <== NOT EXECUTED 40018798 : int ttyname_r( int fd, char *name, int namesize ) { 40018798: 9d e3 be d0 save %sp, -304, %sp <== NOT EXECUTED DIR *dp; struct stat dsb; char *rval; /* Must be a terminal. */ if (tcgetattr (fd, &tty) < 0) 4001879c: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 400187a0: 7f ff ff e2 call 40018728 <== NOT EXECUTED 400187a4: 92 07 bf d4 add %fp, -44, %o1 <== NOT EXECUTED 400187a8: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400187ac: 06 80 00 14 bl 400187fc <== NOT EXECUTED 400187b0: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED rtems_set_errno_and_return_minus_one(EBADF); /* Must be a character device. */ if (fstat (fd, &sb) || !S_ISCHR (sb.st_mode)) 400187b4: 40 00 23 67 call 40021550 <== NOT EXECUTED 400187b8: 92 07 bf 80 add %fp, -128, %o1 <== NOT EXECUTED 400187bc: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 400187c0: 12 80 00 0f bne 400187fc <== NOT EXECUTED 400187c4: c2 17 bf 8c lduh [ %fp + -116 ], %g1 <== NOT EXECUTED 400187c8: 05 00 00 3c sethi %hi(0xf000), %g2 <== NOT EXECUTED 400187cc: 82 08 40 02 and %g1, %g2, %g1 <== NOT EXECUTED 400187d0: 05 00 00 08 sethi %hi(0x2000), %g2 <== NOT EXECUTED 400187d4: 80 a0 40 02 cmp %g1, %g2 <== NOT EXECUTED 400187d8: 12 80 00 09 bne 400187fc <== NOT EXECUTED 400187dc: 11 10 00 da sethi %hi(0x40036800), %o0 <== NOT EXECUTED for (rval = NULL; (dirp = readdir (dp)) != NULL ;) { if (dirp->d_ino != sb.st_ino) continue; strcpy (name + sizeof (_PATH_DEV) - 1, dirp->d_name); 400187e0: a0 06 60 05 add %i1, 5, %l0 <== NOT EXECUTED /* Must be a character device. */ if (fstat (fd, &sb) || !S_ISCHR (sb.st_mode)) rtems_set_errno_and_return_minus_one(EBADF); if ((dp = opendir (_PATH_DEV)) == NULL) 400187e4: 90 12 21 d0 or %o0, 0x1d0, %o0 <== NOT EXECUTED 400187e8: 7f ff fe 90 call 40018228 <== NOT EXECUTED 400187ec: a2 07 bf 30 add %fp, -208, %l1 <== NOT EXECUTED 400187f0: b0 92 20 00 orcc %o0, 0, %i0 <== NOT EXECUTED 400187f4: 12 80 00 20 bne 40018874 <== NOT EXECUTED 400187f8: 01 00 00 00 nop <== NOT EXECUTED rtems_set_errno_and_return_minus_one(EBADF); 400187fc: 40 00 2c 64 call 4002398c <__errno> <== NOT EXECUTED 40018800: b0 10 3f ff mov -1, %i0 ! ffffffff <== NOT EXECUTED 40018804: 82 10 20 09 mov 9, %g1 <== NOT EXECUTED 40018808: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 4001880c: 81 c7 e0 08 ret <== NOT EXECUTED 40018810: 81 e8 00 00 restore <== NOT EXECUTED for (rval = NULL; (dirp = readdir (dp)) != NULL ;) { if (dirp->d_ino != sb.st_ino) 40018814: c2 07 bf 88 ld [ %fp + -120 ], %g1 <== NOT EXECUTED 40018818: 80 a0 80 01 cmp %g2, %g1 <== NOT EXECUTED 4001881c: 12 80 00 16 bne 40018874 <== NOT EXECUTED 40018820: 92 02 20 0c add %o0, 0xc, %o1 <== NOT EXECUTED continue; strcpy (name + sizeof (_PATH_DEV) - 1, dirp->d_name); 40018824: 40 00 3b 60 call 400275a4 <== NOT EXECUTED 40018828: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED if (stat (name, &dsb) || sb.st_dev != dsb.st_dev || 4001882c: 90 10 00 19 mov %i1, %o0 <== NOT EXECUTED 40018830: 7f ff ba 8e call 40007268 <== NOT EXECUTED 40018834: 92 10 00 11 mov %l1, %o1 <== NOT EXECUTED 40018838: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 4001883c: 12 80 00 0e bne 40018874 <== NOT EXECUTED 40018840: c4 07 bf 80 ld [ %fp + -128 ], %g2 <== NOT EXECUTED 40018844: c2 07 bf 30 ld [ %fp + -208 ], %g1 <== NOT EXECUTED 40018848: 80 a0 80 01 cmp %g2, %g1 <== NOT EXECUTED 4001884c: 12 80 00 0a bne 40018874 <== NOT EXECUTED 40018850: c4 07 bf 84 ld [ %fp + -124 ], %g2 <== NOT EXECUTED 40018854: c2 07 bf 34 ld [ %fp + -204 ], %g1 <== NOT EXECUTED 40018858: 80 a0 80 01 cmp %g2, %g1 <== NOT EXECUTED 4001885c: 12 80 00 06 bne 40018874 <== NOT EXECUTED 40018860: c4 07 bf 88 ld [ %fp + -120 ], %g2 <== NOT EXECUTED 40018864: c2 07 bf 38 ld [ %fp + -200 ], %g1 <== NOT EXECUTED 40018868: 80 a0 80 01 cmp %g2, %g1 <== NOT EXECUTED 4001886c: 02 80 00 08 be 4001888c <== NOT EXECUTED 40018870: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED rtems_set_errno_and_return_minus_one(EBADF); if ((dp = opendir (_PATH_DEV)) == NULL) rtems_set_errno_and_return_minus_one(EBADF); for (rval = NULL; (dirp = readdir (dp)) != NULL ;) 40018874: 7f ff ff 23 call 40018500 <== NOT EXECUTED 40018878: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 4001887c: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40018880: 32 bf ff e5 bne,a 40018814 <== NOT EXECUTED 40018884: c4 02 00 00 ld [ %o0 ], %g2 <== NOT EXECUTED sb.st_ino != dsb.st_ino) continue; rval = name; break; } (void) closedir (dp); 40018888: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 4001888c: 7f ff f9 d1 call 40016fd0 <== NOT EXECUTED 40018890: b0 10 20 00 clr %i0 <== NOT EXECUTED return 0; } 40018894: 81 c7 e0 08 ret <== NOT EXECUTED 40018898: 81 e8 00 00 restore <== NOT EXECUTED 400188e8 : #include int unlink( const char *path ) { 400188e8: 9d e3 bf 88 save %sp, -120, %sp /* * Get the node to be unlinked. */ result = rtems_filesystem_evaluate_path( path, 0, &loc, FALSE ); 400188ec: 92 10 20 00 clr %o1 400188f0: 90 10 00 18 mov %i0, %o0 400188f4: a0 07 bf e8 add %fp, -24, %l0 400188f8: 96 10 20 00 clr %o3 400188fc: 7f ff b4 88 call 40005b1c 40018900: 94 10 00 10 mov %l0, %o2 if ( result != 0 ) 40018904: 80 a2 20 00 cmp %o0, 0 40018908: 32 80 00 17 bne,a 40018964 4001890c: b0 10 3f ff mov -1, %i0 return -1; result = rtems_filesystem_evaluate_parent(RTEMS_LIBIO_PERMS_WRITE, &loc ); 40018910: 90 10 20 02 mov 2, %o0 40018914: 7f ff b4 55 call 40005a68 40018918: 92 10 00 10 mov %l0, %o1 if (result != 0 && errno != ENOTSUP) { 4001891c: 80 a2 20 00 cmp %o0, 0 40018920: 02 80 00 13 be 4001896c 40018924: c2 07 bf f0 ld [ %fp + -16 ], %g1 40018928: 40 00 2c 19 call 4002398c <__errno> <== NOT EXECUTED 4001892c: 01 00 00 00 nop <== NOT EXECUTED 40018930: c2 02 00 00 ld [ %o0 ], %g1 <== NOT EXECUTED 40018934: 80 a0 60 86 cmp %g1, 0x86 <== NOT EXECUTED 40018938: 02 80 00 0d be 4001896c <== NOT EXECUTED 4001893c: c2 07 bf f0 ld [ %fp + -16 ], %g1 <== NOT EXECUTED rtems_filesystem_freenode( &loc ); 40018940: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40018944: 02 80 00 08 be 40018964 <== NOT EXECUTED 40018948: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 4001894c: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 <== NOT EXECUTED 40018950: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40018954: 02 80 00 04 be 40018964 <== NOT EXECUTED 40018958: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 4001895c: 9f c0 40 00 call %g1 <== NOT EXECUTED 40018960: 01 00 00 00 nop <== NOT EXECUTED 40018964: 81 c7 e0 08 ret 40018968: 81 e8 00 00 restore return -1; } if ( !loc.ops->node_type_h ) { 4001896c: c4 00 60 10 ld [ %g1 + 0x10 ], %g2 40018970: 80 a0 a0 00 cmp %g2, 0 40018974: 12 80 00 07 bne 40018990 40018978: a0 07 bf e8 add %fp, -24, %l0 rtems_filesystem_freenode( &loc ); 4001897c: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 <== NOT EXECUTED 40018980: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 40018984: 12 80 00 1d bne 400189f8 <== NOT EXECUTED 40018988: 90 07 bf e8 add %fp, -24, %o0 <== NOT EXECUTED 4001898c: 30 80 00 1d b,a 40018a00 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOTSUP ); } if ( (*loc.ops->node_type_h)( &loc ) == RTEMS_FILESYSTEM_DIRECTORY ) { 40018990: 9f c0 80 00 call %g2 40018994: 90 10 00 10 mov %l0, %o0 40018998: 80 a2 20 01 cmp %o0, 1 4001899c: 12 80 00 0f bne 400189d8 400189a0: c2 07 bf f0 ld [ %fp + -16 ], %g1 rtems_filesystem_freenode( &loc ); 400189a4: 80 a0 60 00 cmp %g1, 0 400189a8: 02 80 00 08 be 400189c8 400189ac: 01 00 00 00 nop 400189b0: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 400189b4: 80 a0 60 00 cmp %g1, 0 400189b8: 02 80 00 04 be 400189c8 400189bc: 01 00 00 00 nop 400189c0: 9f c0 40 00 call %g1 400189c4: 90 10 00 10 mov %l0, %o0 rtems_set_errno_and_return_minus_one( EISDIR ); 400189c8: 40 00 2b f1 call 4002398c <__errno> 400189cc: b0 10 3f ff mov -1, %i0 400189d0: 10 80 00 0f b 40018a0c 400189d4: 82 10 20 15 mov 0x15, %g1 } if ( !loc.ops->unlink_h ) { 400189d8: c4 00 60 0c ld [ %g1 + 0xc ], %g2 400189dc: 80 a0 a0 00 cmp %g2, 0 400189e0: 12 80 00 0e bne 40018a18 400189e4: 01 00 00 00 nop rtems_filesystem_freenode( &loc ); 400189e8: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 <== NOT EXECUTED 400189ec: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 400189f0: 02 80 00 04 be 40018a00 <== NOT EXECUTED 400189f4: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 400189f8: 9f c0 40 00 call %g1 <== NOT EXECUTED 400189fc: 01 00 00 00 nop <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOTSUP ); 40018a00: 40 00 2b e3 call 4002398c <__errno> <== NOT EXECUTED 40018a04: b0 10 3f ff mov -1, %i0 ! ffffffff <== NOT EXECUTED 40018a08: 82 10 20 86 mov 0x86, %g1 <== NOT EXECUTED 40018a0c: c2 22 00 00 st %g1, [ %o0 ] 40018a10: 81 c7 e0 08 ret 40018a14: 81 e8 00 00 restore } result = (*loc.ops->unlink_h)( &loc ); 40018a18: 9f c0 80 00 call %g2 40018a1c: 90 10 00 10 mov %l0, %o0 rtems_filesystem_freenode( &loc ); 40018a20: c2 07 bf f0 ld [ %fp + -16 ], %g1 40018a24: 80 a0 60 00 cmp %g1, 0 40018a28: 02 bf ff cf be 40018964 40018a2c: b0 10 00 08 mov %o0, %i0 40018a30: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 40018a34: 80 a0 60 00 cmp %g1, 0 40018a38: 02 80 00 06 be 40018a50 40018a3c: 01 00 00 00 nop 40018a40: 9f c0 40 00 call %g1 40018a44: 90 10 00 10 mov %l0, %o0 40018a48: 81 c7 e0 08 ret 40018a4c: 81 e8 00 00 restore return result; } 40018a50: 81 c7 e0 08 ret <== NOT EXECUTED 40018a54: 81 e8 00 00 restore <== NOT EXECUTED 40007cd8 : */ int unmount( const char *path ) { 40007cd8: 9d e3 bf 88 save %sp, -120, %sp * 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, 0x0, &loc, TRUE ) ) 40007cdc: 92 10 20 00 clr %o1 40007ce0: a2 07 bf e8 add %fp, -24, %l1 40007ce4: 90 10 00 18 mov %i0, %o0 40007ce8: 94 10 00 11 mov %l1, %o2 40007cec: 7f ff f1 88 call 4000430c 40007cf0: 96 10 20 01 mov 1, %o3 40007cf4: 80 a2 20 00 cmp %o0, 0 40007cf8: 12 80 00 6a bne 40007ea0 40007cfc: e0 07 bf f4 ld [ %fp + -12 ], %l0 /* * Verify this is the root node for the file system to be unmounted. */ if ( !rtems_filesystem_nodes_equal( fs_root_loc, &loc) ){ 40007d00: c2 07 bf e8 ld [ %fp + -24 ], %g1 40007d04: c4 04 20 18 ld [ %l0 + 0x18 ], %g2 40007d08: 80 a0 80 01 cmp %g2, %g1 40007d0c: 02 80 00 0f be 40007d48 40007d10: c6 07 bf f0 ld [ %fp + -16 ], %g3 rtems_filesystem_freenode( &loc ); 40007d14: 80 a0 e0 00 cmp %g3, 0 40007d18: 02 80 00 08 be 40007d38 40007d1c: 01 00 00 00 nop 40007d20: c2 00 e0 1c ld [ %g3 + 0x1c ], %g1 40007d24: 80 a0 60 00 cmp %g1, 0 40007d28: 02 80 00 04 be 40007d38 40007d2c: 01 00 00 00 nop 40007d30: 9f c0 40 00 call %g1 40007d34: 90 10 00 11 mov %l1, %o0 rtems_set_errno_and_return_minus_one( EACCES ); 40007d38: 40 00 27 ec call 40011ce8 <__errno> 40007d3c: 01 00 00 00 nop 40007d40: 10 80 00 21 b 40007dc4 40007d44: 82 10 20 0d mov 0xd, %g1 ! d /* * Free the loc node and just use the nodes from the mt_entry . */ rtems_filesystem_freenode( &loc ); 40007d48: 80 a0 e0 00 cmp %g3, 0 40007d4c: 22 80 00 09 be,a 40007d70 40007d50: c2 04 20 10 ld [ %l0 + 0x10 ], %g1 <== NOT EXECUTED 40007d54: c2 00 e0 1c ld [ %g3 + 0x1c ], %g1 40007d58: 80 a0 60 00 cmp %g1, 0 40007d5c: 22 80 00 05 be,a 40007d70 40007d60: c2 04 20 10 ld [ %l0 + 0x10 ], %g1 <== NOT EXECUTED 40007d64: 9f c0 40 00 call %g1 40007d68: 90 10 00 11 mov %l1, %o0 /* * Verify Unmount is supported by both filesystems. */ if ( !fs_mount_loc->ops->unmount_h ) 40007d6c: c2 04 20 10 ld [ %l0 + 0x10 ], %g1 40007d70: c2 00 60 28 ld [ %g1 + 0x28 ], %g1 40007d74: 80 a0 60 00 cmp %g1, 0 40007d78: 02 80 00 07 be 40007d94 40007d7c: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( ENOTSUP ); if ( !fs_root_loc->ops->fsunmount_me_h ) 40007d80: c2 04 20 20 ld [ %l0 + 0x20 ], %g1 40007d84: c2 00 60 2c ld [ %g1 + 0x2c ], %g1 40007d88: 80 a0 60 00 cmp %g1, 0 40007d8c: 32 80 00 06 bne,a 40007da4 40007d90: 03 10 00 68 sethi %hi(0x4001a000), %g1 rtems_set_errno_and_return_minus_one( ENOTSUP ); 40007d94: 40 00 27 d5 call 40011ce8 <__errno> <== NOT EXECUTED 40007d98: 01 00 00 00 nop <== NOT EXECUTED 40007d9c: 10 80 00 0a b 40007dc4 <== NOT EXECUTED 40007da0: 82 10 20 86 mov 0x86, %g1 ! 86 <== NOT EXECUTED * 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 ) 40007da4: c2 00 60 b8 ld [ %g1 + 0xb8 ], %g1 40007da8: c2 00 60 10 ld [ %g1 + 0x10 ], %g1 40007dac: 80 a0 40 10 cmp %g1, %l0 40007db0: 12 80 00 08 bne 40007dd0 40007db4: 90 10 00 18 mov %i0, %o0 rtems_set_errno_and_return_minus_one( EBUSY ); 40007db8: 40 00 27 cc call 40011ce8 <__errno> 40007dbc: 01 00 00 00 nop 40007dc0: 82 10 20 10 mov 0x10, %g1 ! 10 40007dc4: c2 22 00 00 st %g1, [ %o0 ] 40007dc8: 81 c7 e0 08 ret 40007dcc: 91 e8 3f ff restore %g0, -1, %o0 /* * Verify there are no file systems below the path specified */ if ( file_systems_below_this_mountpoint( path, fs_root_loc, mt_entry ) != 0 ) 40007dd0: 92 04 20 18 add %l0, 0x18, %o1 40007dd4: 7f ff ff b1 call 40007c98 40007dd8: 94 10 00 10 mov %l0, %o2 40007ddc: 80 a2 20 00 cmp %o0, 0 40007de0: 12 bf ff f6 bne 40007db8 40007de4: 01 00 00 00 nop * 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 ) 40007de8: 7f ff f2 23 call 40004674 40007dec: 90 10 00 10 mov %l0, %o0 40007df0: 80 a2 20 01 cmp %o0, 1 40007df4: 02 bf ff f1 be 40007db8 40007df8: 01 00 00 00 nop * 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 ) 40007dfc: c2 04 20 10 ld [ %l0 + 0x10 ], %g1 40007e00: c2 00 60 28 ld [ %g1 + 0x28 ], %g1 40007e04: 9f c0 40 00 call %g1 40007e08: 90 10 00 10 mov %l0, %o0 40007e0c: 80 a2 20 00 cmp %o0, 0 40007e10: 12 80 00 24 bne 40007ea0 40007e14: 01 00 00 00 nop * 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){ 40007e18: c2 04 20 20 ld [ %l0 + 0x20 ], %g1 40007e1c: c2 00 60 2c ld [ %g1 + 0x2c ], %g1 40007e20: 9f c0 40 00 call %g1 40007e24: 90 10 00 10 mov %l0, %o0 40007e28: 80 a2 20 00 cmp %o0, 0 40007e2c: 02 80 00 0c be 40007e5c 40007e30: 01 00 00 00 nop if (( fs_mount_loc->ops->mount_h )( mt_entry ) != 0 ) 40007e34: c2 04 20 10 ld [ %l0 + 0x10 ], %g1 <== NOT EXECUTED 40007e38: c2 00 60 20 ld [ %g1 + 0x20 ], %g1 <== NOT EXECUTED 40007e3c: 9f c0 40 00 call %g1 <== NOT EXECUTED 40007e40: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED 40007e44: 80 a2 20 00 cmp %o0, 0 <== NOT EXECUTED 40007e48: 02 80 00 16 be 40007ea0 <== NOT EXECUTED 40007e4c: 01 00 00 00 nop <== NOT EXECUTED rtems_fatal_error_occurred( 0 ); 40007e50: 40 00 05 ce call 40009588 <== NOT EXECUTED 40007e54: 90 10 20 00 clr %o0 ! 0 <== NOT EXECUTED 40007e58: 30 bf ff dc b,a 40007dc8 <== NOT EXECUTED /* * Extract the mount table entry from the chain */ Chain_Extract( ( Chain_Node * ) mt_entry ); 40007e5c: 40 00 06 96 call 400098b4 <_Chain_Extract> 40007e60: 90 10 00 10 mov %l0, %o0 /* * 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 ); 40007e64: c2 04 20 10 ld [ %l0 + 0x10 ], %g1 40007e68: 80 a0 60 00 cmp %g1, 0 40007e6c: 02 80 00 09 be 40007e90 40007e70: 90 10 00 10 mov %l0, %o0 40007e74: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 40007e78: 80 a0 60 00 cmp %g1, 0 40007e7c: 02 80 00 05 be 40007e90 40007e80: 01 00 00 00 nop 40007e84: 9f c0 40 00 call %g1 40007e88: 90 04 20 08 add %l0, 8, %o0 free( mt_entry ); 40007e8c: 90 10 00 10 mov %l0, %o0 40007e90: 7f ff f3 14 call 40004ae0 40007e94: b0 10 20 00 clr %i0 40007e98: 81 c7 e0 08 ret 40007e9c: 81 e8 00 00 restore return 0; } 40007ea0: 81 c7 e0 08 ret 40007ea4: 91 e8 3f ff restore %g0, -1, %o0 40009fe0 : int usleep( useconds_t useconds ) { 40009fe0: 9d e3 bf 88 save %sp, -120, %sp <== NOT EXECUTED struct timespec tp; struct timespec tm; unsigned remaining; tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND; 40009fe4: 21 00 03 d0 sethi %hi(0xf4000), %l0 <== NOT EXECUTED 40009fe8: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 40009fec: 7f ff dd e3 call 40001778 <.udiv> <== NOT EXECUTED 40009ff0: 92 14 22 40 or %l0, 0x240, %o1 <== NOT EXECUTED tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000; 40009ff4: 92 14 22 40 or %l0, 0x240, %o1 <== NOT EXECUTED { struct timespec tp; struct timespec tm; unsigned remaining; tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND; 40009ff8: d0 27 bf f0 st %o0, [ %fp + -16 ] <== NOT EXECUTED tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000; 40009ffc: 40 00 5b 6b call 40020da8 <.urem> <== NOT EXECUTED 4000a000: 90 10 00 18 mov %i0, %o0 <== NOT EXECUTED 4000a004: 85 2a 20 02 sll %o0, 2, %g2 <== NOT EXECUTED 4000a008: 83 2a 20 07 sll %o0, 7, %g1 <== NOT EXECUTED 4000a00c: 82 20 40 02 sub %g1, %g2, %g1 <== NOT EXECUTED 4000a010: 82 00 40 08 add %g1, %o0, %g1 <== NOT EXECUTED 4000a014: 83 28 60 03 sll %g1, 3, %g1 <== NOT EXECUTED nanosleep( &tp, &tm ); 4000a018: 92 07 bf e8 add %fp, -24, %o1 <== NOT EXECUTED struct timespec tp; struct timespec tm; unsigned remaining; tp.tv_sec = useconds / TOD_MICROSECONDS_PER_SECOND; tp.tv_nsec = (useconds % TOD_MICROSECONDS_PER_SECOND) * 1000; 4000a01c: c2 27 bf f4 st %g1, [ %fp + -12 ] <== NOT EXECUTED nanosleep( &tp, &tm ); 4000a020: 40 00 24 ac call 400132d0 <== NOT EXECUTED 4000a024: 90 07 bf f0 add %fp, -16, %o0 <== NOT EXECUTED remaining = tm.tv_sec * TOD_MICROSECONDS_PER_SECOND; 4000a028: c4 07 bf e8 ld [ %fp + -24 ], %g2 <== NOT EXECUTED 4000a02c: d0 07 bf ec ld [ %fp + -20 ], %o0 <== NOT EXECUTED 4000a030: 87 28 a0 03 sll %g2, 3, %g3 <== NOT EXECUTED 4000a034: 83 28 a0 08 sll %g2, 8, %g1 <== NOT EXECUTED 4000a038: 82 20 40 03 sub %g1, %g3, %g1 <== NOT EXECUTED 4000a03c: 92 10 23 e8 mov 0x3e8, %o1 <== NOT EXECUTED 4000a040: b1 28 60 06 sll %g1, 6, %i0 <== NOT EXECUTED 4000a044: b0 26 00 01 sub %i0, %g1, %i0 <== NOT EXECUTED 4000a048: 7f ff dd ce call 40001780 <.div> <== NOT EXECUTED 4000a04c: b0 06 00 02 add %i0, %g2, %i0 <== NOT EXECUTED 4000a050: b1 2e 20 06 sll %i0, 6, %i0 <== NOT EXECUTED remaining += tm.tv_nsec / 1000; return remaining; /* seconds remaining */ } 4000a054: 81 c7 e0 08 ret <== NOT EXECUTED 4000a058: 91 ea 00 18 restore %o0, %i0, %o0 <== NOT EXECUTED 40007758 : int utime( const char *path, const struct utimbuf *times ) { 40007758: 9d e3 bf 88 save %sp, -120, %sp rtems_filesystem_location_info_t temp_loc; int result; if ( rtems_filesystem_evaluate_path( path, 0x00, &temp_loc, TRUE ) ) 4000775c: 92 10 20 00 clr %o1 40007760: 90 10 00 18 mov %i0, %o0 40007764: a0 07 bf e8 add %fp, -24, %l0 40007768: 96 10 20 01 mov 1, %o3 4000776c: 94 10 00 10 mov %l0, %o2 40007770: 7f ff f1 55 call 40003cc4 40007774: b0 10 3f ff mov -1, %i0 40007778: 80 a2 20 00 cmp %o0, 0 4000777c: 12 80 00 10 bne 400077bc 40007780: c2 07 bf f0 ld [ %fp + -16 ], %g1 return -1; if ( !temp_loc.ops->utime_h ){ 40007784: c4 00 60 30 ld [ %g1 + 0x30 ], %g2 40007788: 80 a0 a0 00 cmp %g2, 0 4000778c: 32 80 00 0e bne,a 400077c4 40007790: d4 06 60 04 ld [ %i1 + 4 ], %o2 rtems_filesystem_freenode( &temp_loc ); 40007794: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 <== NOT EXECUTED 40007798: 80 a0 60 00 cmp %g1, 0 <== NOT EXECUTED 4000779c: 02 80 00 04 be 400077ac <== NOT EXECUTED 400077a0: 01 00 00 00 nop <== NOT EXECUTED 400077a4: 9f c0 40 00 call %g1 <== NOT EXECUTED 400077a8: 90 10 00 10 mov %l0, %o0 <== NOT EXECUTED rtems_set_errno_and_return_minus_one( ENOTSUP ); 400077ac: 40 00 27 e7 call 40011748 <__errno> <== NOT EXECUTED 400077b0: b0 10 3f ff mov -1, %i0 <== NOT EXECUTED 400077b4: 82 10 20 86 mov 0x86, %g1 <== NOT EXECUTED 400077b8: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 400077bc: 81 c7 e0 08 ret 400077c0: 81 e8 00 00 restore } result = (*temp_loc.ops->utime_h)( &temp_loc, times->actime, times->modtime ); 400077c4: d2 06 40 00 ld [ %i1 ], %o1 400077c8: 9f c0 80 00 call %g2 400077cc: 90 10 00 10 mov %l0, %o0 rtems_filesystem_freenode( &temp_loc ); 400077d0: c2 07 bf f0 ld [ %fp + -16 ], %g1 400077d4: 80 a0 60 00 cmp %g1, 0 400077d8: 02 bf ff f9 be 400077bc 400077dc: b0 10 00 08 mov %o0, %i0 400077e0: c2 00 60 1c ld [ %g1 + 0x1c ], %g1 400077e4: 80 a0 60 00 cmp %g1, 0 400077e8: 02 80 00 04 be 400077f8 400077ec: 01 00 00 00 nop 400077f0: 9f c0 40 00 call %g1 400077f4: 90 10 00 10 mov %l0, %o0 return result; } 400077f8: 81 c7 e0 08 ret 400077fc: 81 e8 00 00 restore 40003b94 : | Arguments: as in printf: fmt - format string, ... - unnamed arguments. | Returns: Nothing. +--------------------------------------------------------------------------*/ void vprintk(const char *fmt, va_list ap) { 40003b94: 9d e3 bf 80 save %sp, -128, %sp 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)])]); 40003b98: 03 10 00 63 sethi %hi(0x40018c00), %g1 printNum(lflag ? va_arg(ap, long int) : (long int)va_arg(ap, int), base, sign, width, lead); } else { BSP_output_char(*fmt); 40003b9c: 2d 10 00 66 sethi %hi(0x40019800), %l6 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)])]); 40003ba0: b4 10 62 68 or %g1, 0x268, %i2 if (maxwidth) maxwidth--; } count = 0; while ((n = num / base) > 0) { toPrint[count++] = (num - (n*base)); 40003ba4: ba 07 bf e4 add %fp, -28, %i5 num = n ; } toPrint[count++] = num; 40003ba8: b6 07 bf f8 add %fp, -8, %i3 for (n=maxwidth ; n > count; n-- ) BSP_output_char(lead); for (n = 0; n < count; n++){ 40003bac: 10 80 00 9f b 40003e28 40003bb0: b8 07 bf e2 add %fp, -30, %i4 lflag = 0; base = 0; sign = 0; width = 0; lead = ' '; if (*fmt == '%') 40003bb4: 12 80 00 9b bne 40003e20 40003bb8: c2 05 a3 14 ld [ %l6 + 0x314 ], %g1 { fmt++; 40003bbc: b0 06 20 01 inc %i0 if (*fmt == '0' ) { 40003bc0: c2 4e 00 00 ldsb [ %i0 ], %g1 40003bc4: 80 a0 60 30 cmp %g1, 0x30 40003bc8: 12 80 00 04 bne 40003bd8 40003bcc: ae 10 20 20 mov 0x20, %l7 lead = '0'; fmt++; 40003bd0: b0 06 20 01 inc %i0 40003bd4: ae 10 20 30 mov 0x30, %l7 40003bd8: 10 80 00 08 b 40003bf8 40003bdc: a0 10 20 00 clr %l0 } while (*fmt >= '0' && *fmt <= '9' ) { width *= 10; width += (*fmt - '0'); 40003be0: 85 38 60 18 sra %g1, 0x18, %g2 fmt++; 40003be4: b0 06 20 01 inc %i0 if (*fmt == '0' ) { lead = '0'; fmt++; } while (*fmt >= '0' && *fmt <= '9' ) { width *= 10; 40003be8: 83 2c 20 01 sll %l0, 1, %g1 width += (*fmt - '0'); 40003bec: 84 00 bf d0 add %g2, -48, %g2 if (*fmt == '0' ) { lead = '0'; fmt++; } while (*fmt >= '0' && *fmt <= '9' ) { width *= 10; 40003bf0: 82 00 40 03 add %g1, %g3, %g1 width += (*fmt - '0'); 40003bf4: a0 00 80 01 add %g2, %g1, %l0 fmt++; if (*fmt == '0' ) { lead = '0'; fmt++; } while (*fmt >= '0' && *fmt <= '9' ) { 40003bf8: d0 0e 00 00 ldub [ %i0 ], %o0 width *= 10; 40003bfc: 87 2c 20 03 sll %l0, 3, %g3 fmt++; if (*fmt == '0' ) { lead = '0'; fmt++; } while (*fmt >= '0' && *fmt <= '9' ) { 40003c00: 82 02 3f d0 add %o0, -48, %g1 40003c04: 82 08 60 ff and %g1, 0xff, %g1 40003c08: 80 a0 60 09 cmp %g1, 9 40003c0c: 08 bf ff f5 bleu 40003be0 40003c10: 83 2a 20 18 sll %o0, 0x18, %g1 width *= 10; width += (*fmt - '0'); fmt++; } if ((c = *fmt) == 'l') 40003c14: 83 38 60 18 sra %g1, 0x18, %g1 40003c18: 80 a0 60 6c cmp %g1, 0x6c 40003c1c: 12 80 00 04 bne 40003c2c 40003c20: aa 10 00 10 mov %l0, %l5 { lflag = 1; c = *++fmt; 40003c24: b0 06 20 01 inc %i0 40003c28: d0 0e 00 00 ldub [ %i0 ], %o0 } switch (c) 40003c2c: 83 2a 20 18 sll %o0, 0x18, %g1 40003c30: 83 38 60 18 sra %g1, 0x18, %g1 40003c34: 80 a0 60 64 cmp %g1, 0x64 40003c38: 02 80 00 2c be 40003ce8 40003c3c: a8 10 20 0a mov 0xa, %l4 40003c40: 14 80 00 16 bg 40003c98 40003c44: 80 a0 60 70 cmp %g1, 0x70 40003c48: 80 a0 60 4f cmp %g1, 0x4f <== NOT EXECUTED 40003c4c: 02 80 00 3e be 40003d44 <== NOT EXECUTED 40003c50: a8 10 20 08 mov 8, %l4 <== NOT EXECUTED 40003c54: 14 80 00 09 bg 40003c78 <== NOT EXECUTED 40003c58: 80 a0 60 58 cmp %g1, 0x58 <== NOT EXECUTED 40003c5c: 80 a0 60 44 cmp %g1, 0x44 <== NOT EXECUTED 40003c60: 02 80 00 21 be 40003ce4 <== NOT EXECUTED 40003c64: 80 a0 60 49 cmp %g1, 0x49 <== NOT EXECUTED 40003c68: 12 80 00 33 bne 40003d34 <== NOT EXECUTED 40003c6c: c2 05 a3 14 ld [ %l6 + 0x314 ], %g1 <== NOT EXECUTED { case 'o': case 'O': base = 8; sign = 0; break; 40003c70: 10 80 00 1e b 40003ce8 <== NOT EXECUTED 40003c74: a8 10 20 0a mov 0xa, %l4 <== NOT EXECUTED if ((c = *fmt) == 'l') { lflag = 1; c = *++fmt; } switch (c) 40003c78: 02 80 00 32 be 40003d40 <== NOT EXECUTED 40003c7c: 80 a0 60 63 cmp %g1, 0x63 <== NOT EXECUTED 40003c80: 02 80 00 29 be 40003d24 <== NOT EXECUTED 40003c84: 80 a0 60 55 cmp %g1, 0x55 <== NOT EXECUTED 40003c88: 12 80 00 2b bne 40003d34 <== NOT EXECUTED 40003c8c: c2 05 a3 14 ld [ %l6 + 0x314 ], %g1 <== NOT EXECUTED { case 'o': case 'O': base = 8; sign = 0; break; case 'i': case 'I': case 'd': case 'D': base = 10; sign = 1; break; 40003c90: 10 80 00 2d b 40003d44 <== NOT EXECUTED 40003c94: a8 10 20 0a mov 0xa, %l4 <== NOT EXECUTED if ((c = *fmt) == 'l') { lflag = 1; c = *++fmt; } switch (c) 40003c98: 02 80 00 2a be 40003d40 40003c9c: 80 a0 60 70 cmp %g1, 0x70 40003ca0: 14 80 00 09 bg 40003cc4 40003ca4: 80 a0 60 75 cmp %g1, 0x75 40003ca8: 80 a0 60 69 cmp %g1, 0x69 <== NOT EXECUTED 40003cac: 02 80 00 0e be 40003ce4 <== NOT EXECUTED 40003cb0: 80 a0 60 6f cmp %g1, 0x6f <== NOT EXECUTED 40003cb4: 12 80 00 20 bne 40003d34 <== NOT EXECUTED 40003cb8: c2 05 a3 14 ld [ %l6 + 0x314 ], %g1 <== NOT EXECUTED 40003cbc: 10 80 00 22 b 40003d44 <== NOT EXECUTED 40003cc0: a8 10 20 08 mov 8, %l4 <== NOT EXECUTED 40003cc4: 02 80 00 0b be 40003cf0 40003cc8: 80 a0 60 78 cmp %g1, 0x78 40003ccc: 02 80 00 1d be 40003d40 40003cd0: 80 a0 60 73 cmp %g1, 0x73 40003cd4: 32 80 00 18 bne,a 40003d34 40003cd8: c2 05 a3 14 ld [ %l6 + 0x314 ], %g1 <== NOT EXECUTED case 'd': case 'D': base = 10; sign = 1; break; case 'u': case 'U': base = 10; sign = 0; break; case 'x': case 'X': base = 16; sign = 0; break; case 'p': base = 16; sign = 0; break; case 's': for (str = va_arg(ap, char *); *str; str++) 40003cdc: 10 80 00 07 b 40003cf8 40003ce0: e0 06 40 00 ld [ %i1 ], %l0 lflag = 1; c = *++fmt; } switch (c) { case 'o': case 'O': base = 8; sign = 0; break; 40003ce4: a8 10 20 0a mov 0xa, %l4 <== NOT EXECUTED 40003ce8: 10 80 00 18 b 40003d48 40003cec: 84 10 20 01 mov 1, %g2 case 'i': case 'I': case 'd': case 'D': base = 10; sign = 1; break; 40003cf0: 10 80 00 15 b 40003d44 <== NOT EXECUTED 40003cf4: a8 10 20 0a mov 0xa, %l4 <== NOT EXECUTED case 'u': case 'U': base = 10; sign = 0; break; case 'x': case 'X': base = 16; sign = 0; break; case 'p': base = 16; sign = 0; break; case 's': for (str = va_arg(ap, char *); *str; str++) 40003cf8: 10 80 00 06 b 40003d10 40003cfc: d0 4c 00 00 ldsb [ %l0 ], %o0 BSP_output_char(*str); 40003d00: c2 05 a3 14 ld [ %l6 + 0x314 ], %g1 40003d04: 9f c0 40 00 call %g1 40003d08: 01 00 00 00 nop case 'd': case 'D': base = 10; sign = 1; break; case 'u': case 'U': base = 10; sign = 0; break; case 'x': case 'X': base = 16; sign = 0; break; case 'p': base = 16; sign = 0; break; case 's': for (str = va_arg(ap, char *); *str; str++) 40003d0c: d0 4c 00 00 ldsb [ %l0 ], %o0 40003d10: 80 a2 20 00 cmp %o0, 0 40003d14: 12 bf ff fb bne 40003d00 40003d18: a0 04 20 01 inc %l0 40003d1c: 10 80 00 49 b 40003e40 40003d20: b2 06 60 04 add %i1, 4, %i1 BSP_output_char(*str); break; case 'c': BSP_output_char(va_arg(ap, int)); 40003d24: d0 4e 60 03 ldsb [ %i1 + 3 ], %o0 <== NOT EXECUTED 40003d28: c2 05 a3 14 ld [ %l6 + 0x314 ], %g1 <== NOT EXECUTED 40003d2c: 10 80 00 3d b 40003e20 <== NOT EXECUTED 40003d30: b2 06 60 04 add %i1, 4, %i1 <== NOT EXECUTED break; default: BSP_output_char(c); 40003d34: 91 2a 20 18 sll %o0, 0x18, %o0 <== NOT EXECUTED 40003d38: 10 80 00 3a b 40003e20 <== NOT EXECUTED 40003d3c: 91 3a 20 18 sra %o0, 0x18, %o0 <== NOT EXECUTED 40003d40: a8 10 20 10 mov 0x10, %l4 40003d44: 84 10 20 00 clr %g2 40003d48: 82 06 60 04 add %i1, 4, %g1 break; } /* switch*/ if (base) printNum(lflag ? va_arg(ap, long int) : (long int)va_arg(ap, int), 40003d4c: e2 06 40 00 ld [ %i1 ], %l1 { long unsigned int n; int count; char toPrint[20]; if ( (sign == 1) && ((long)num < 0) ) { 40003d50: 80 a0 a0 01 cmp %g2, 1 40003d54: 12 80 00 05 bne 40003d68 40003d58: b2 10 00 01 mov %g1, %i1 40003d5c: 80 a4 60 00 cmp %l1, 0 40003d60: 06 80 00 04 bl 40003d70 40003d64: c2 05 a3 14 ld [ %l6 + 0x314 ], %g1 40003d68: 10 80 00 08 b 40003d88 40003d6c: aa 10 00 10 mov %l0, %l5 BSP_output_char('-'); 40003d70: 9f c0 40 00 call %g1 <== NOT EXECUTED 40003d74: 90 10 20 2d mov 0x2d, %o0 <== NOT EXECUTED num = -num; if (maxwidth) maxwidth--; 40003d78: 80 a4 20 00 cmp %l0, 0 <== NOT EXECUTED 40003d7c: 02 80 00 03 be 40003d88 <== NOT EXECUTED 40003d80: a2 20 00 11 neg %l1 <== NOT EXECUTED 40003d84: aa 04 3f ff add %l0, -1, %l5 <== NOT EXECUTED 40003d88: 10 80 00 08 b 40003da8 40003d8c: a6 10 20 00 clr %l3 } count = 0; while ((n = num / base) > 0) { toPrint[count++] = (num - (n*base)); 40003d90: 40 00 48 7a call 40015f78 <.umul> 40003d94: 92 10 00 14 mov %l4, %o1 40003d98: 90 24 40 08 sub %l1, %o0, %o0 40003d9c: a2 10 00 10 mov %l0, %l1 40003da0: d0 2c c0 1d stb %o0, [ %l3 + %i5 ] 40003da4: a6 10 00 12 mov %l2, %l3 num = -num; if (maxwidth) maxwidth--; } count = 0; while ((n = num / base) > 0) { 40003da8: 90 10 00 11 mov %l1, %o0 40003dac: 92 10 00 14 mov %l4, %o1 40003db0: 40 00 48 ac call 40016060 <.udiv> 40003db4: a4 04 e0 01 add %l3, 1, %l2 40003db8: a0 92 20 00 orcc %o0, 0, %l0 40003dbc: 32 bf ff f5 bne,a 40003d90 40003dc0: 90 10 00 10 mov %l0, %o0 toPrint[count++] = (num - (n*base)); num = n ; } toPrint[count++] = num; 40003dc4: 82 06 c0 13 add %i3, %l3, %g1 for (n=maxwidth ; n > count; n-- ) 40003dc8: a0 10 00 15 mov %l5, %l0 count = 0; while ((n = num / base) > 0) { toPrint[count++] = (num - (n*base)); num = n ; } toPrint[count++] = num; 40003dcc: e2 28 7f ec stb %l1, [ %g1 + -20 ] for (n=maxwidth ; n > count; n-- ) BSP_output_char(lead); 40003dd0: 10 80 00 05 b 40003de4 40003dd4: a2 10 00 17 mov %l7, %l1 toPrint[count++] = (num - (n*base)); num = n ; } toPrint[count++] = num; for (n=maxwidth ; n > count; n-- ) 40003dd8: a0 04 3f ff add %l0, -1, %l0 BSP_output_char(lead); 40003ddc: 9f c0 40 00 call %g1 40003de0: 90 10 00 11 mov %l1, %o0 toPrint[count++] = (num - (n*base)); num = n ; } toPrint[count++] = num; for (n=maxwidth ; n > count; n-- ) 40003de4: 80 a4 00 12 cmp %l0, %l2 40003de8: 18 bf ff fc bgu 40003dd8 40003dec: c2 05 a3 14 ld [ %l6 + 0x314 ], %g1 40003df0: 82 04 bf ff add %l2, -1, %g1 40003df4: 10 80 00 05 b 40003e08 40003df8: a0 07 40 01 add %i5, %g1, %l0 BSP_output_char(lead); for (n = 0; n < count; n++){ BSP_output_char("0123456789ABCDEF"[(int)(toPrint[count-(n+1)])]); 40003dfc: c4 05 a3 14 ld [ %l6 + 0x314 ], %g2 40003e00: 9f c0 80 00 call %g2 40003e04: d0 4e 80 01 ldsb [ %i2 + %g1 ], %o0 40003e08: a0 04 3f ff add %l0, -1, %l0 toPrint[count++] = num; for (n=maxwidth ; n > count; n-- ) BSP_output_char(lead); for (n = 0; n < count; n++){ 40003e0c: 80 a4 00 1c cmp %l0, %i4 40003e10: 32 bf ff fb bne,a 40003dfc 40003e14: c2 4c 20 01 ldsb [ %l0 + 1 ], %g1 vprintk(const char *fmt, va_list ap) { char c, *str; int lflag, base, sign, width, lead; for (; *fmt != '\0'; fmt++) 40003e18: 10 80 00 04 b 40003e28 40003e1c: b0 06 20 01 inc %i0 printNum(lflag ? va_arg(ap, long int) : (long int)va_arg(ap, int), base, sign, width, lead); } else { BSP_output_char(*fmt); 40003e20: 9f c0 40 00 call %g1 40003e24: b0 06 20 01 inc %i0 vprintk(const char *fmt, va_list ap) { char c, *str; int lflag, base, sign, width, lead; for (; *fmt != '\0'; fmt++) 40003e28: d0 4e 00 00 ldsb [ %i0 ], %o0 40003e2c: 80 a2 20 00 cmp %o0, 0 40003e30: 12 bf ff 61 bne 40003bb4 40003e34: 80 a2 20 25 cmp %o0, 0x25 40003e38: 81 c7 e0 08 ret 40003e3c: 81 e8 00 00 restore 40003e40: 10 bf ff fa b 40003e28 40003e44: b0 06 20 01 inc %i0 40018698 : ssize_t write( int fd, const void *buffer, size_t count ) { 40018698: 9d e3 bf 98 save %sp, -104, %sp ssize_t rc; rtems_libio_t *iop; rtems_libio_check_fd( fd ); 4001869c: 03 10 00 66 sethi %hi(0x40019800), %g1 400186a0: c2 00 62 1c ld [ %g1 + 0x21c ], %g1 ! 40019a1c ssize_t write( int fd, const void *buffer, size_t count ) { 400186a4: 92 10 00 19 mov %i1, %o1 ssize_t rc; rtems_libio_t *iop; rtems_libio_check_fd( fd ); 400186a8: 80 a6 00 01 cmp %i0, %g1 400186ac: 1a 80 00 0e bcc 400186e4 400186b0: 94 10 00 1a mov %i2, %o2 iop = rtems_libio_iop( fd ); 400186b4: 03 10 00 6b sethi %hi(0x4001ac00), %g1 400186b8: c6 00 60 08 ld [ %g1 + 8 ], %g3 ! 4001ac08 400186bc: 85 2e 20 02 sll %i0, 2, %g2 400186c0: 83 2e 20 04 sll %i0, 4, %g1 400186c4: 82 20 40 02 sub %g1, %g2, %g1 400186c8: 82 00 40 18 add %g1, %i0, %g1 400186cc: 83 28 60 02 sll %g1, 2, %g1 400186d0: b0 00 40 03 add %g1, %g3, %i0 rtems_libio_check_is_open(iop); 400186d4: c2 06 20 0c ld [ %i0 + 0xc ], %g1 400186d8: 80 88 61 00 btst 0x100, %g1 400186dc: 12 80 00 06 bne 400186f4 400186e0: 80 a6 60 00 cmp %i1, 0 400186e4: 7f ff da 36 call 4000efbc <__errno> <== NOT EXECUTED 400186e8: 01 00 00 00 nop <== NOT EXECUTED 400186ec: 10 80 00 14 b 4001873c <== NOT EXECUTED 400186f0: 82 10 20 09 mov 9, %g1 ! 9 <== NOT EXECUTED rtems_libio_check_buffer( buffer ); 400186f4: 02 80 00 07 be 40018710 400186f8: 80 a6 a0 00 cmp %i2, 0 rtems_libio_check_count( count ); 400186fc: 02 80 00 1b be 40018768 40018700: 90 10 20 00 clr %o0 rtems_libio_check_permissions( iop, LIBIO_FLAGS_WRITE ); 40018704: 80 88 60 04 btst 4, %g1 40018708: 32 80 00 06 bne,a 40018720 4001870c: c2 06 20 30 ld [ %i0 + 0x30 ], %g1 40018710: 7f ff da 2b call 4000efbc <__errno> <== NOT EXECUTED 40018714: 01 00 00 00 nop <== NOT EXECUTED 40018718: 10 80 00 09 b 4001873c <== NOT EXECUTED 4001871c: 82 10 20 16 mov 0x16, %g1 ! 16 <== NOT EXECUTED /* * Now process the write() request. */ if ( !iop->handlers->write_h ) 40018720: c2 00 60 0c ld [ %g1 + 0xc ], %g1 40018724: 80 a0 60 00 cmp %g1, 0 40018728: 12 80 00 08 bne 40018748 4001872c: 01 00 00 00 nop rtems_set_errno_and_return_minus_one( ENOTSUP ); 40018730: 7f ff da 23 call 4000efbc <__errno> <== NOT EXECUTED 40018734: 01 00 00 00 nop <== NOT EXECUTED 40018738: 82 10 20 86 mov 0x86, %g1 ! 86 <== NOT EXECUTED 4001873c: c2 22 00 00 st %g1, [ %o0 ] <== NOT EXECUTED 40018740: 10 80 00 0a b 40018768 <== NOT EXECUTED 40018744: 90 10 3f ff mov -1, %o0 <== NOT EXECUTED rc = (*iop->handlers->write_h)( iop, buffer, count ); 40018748: 9f c0 40 00 call %g1 4001874c: 90 10 00 18 mov %i0, %o0 if ( rc > 0 ) 40018750: 80 a2 20 00 cmp %o0, 0 40018754: 04 80 00 05 ble 40018768 40018758: 01 00 00 00 nop iop->offset += rc; 4001875c: c2 06 20 08 ld [ %i0 + 8 ], %g1 40018760: 82 00 40 08 add %g1, %o0, %g1 40018764: c2 26 20 08 st %g1, [ %i0 + 8 ] return rc; } 40018768: 81 c7 e0 08 ret 4001876c: 91 e8 00 08 restore %g0, %o0, %o0